xref: /llvm-project/llvm/test/CodeGen/AMDGPU/tail-call-inreg-arguments.error.ll (revision 11b040192640ef3b1f481124c440f464ed6ec86a)
1428ae0f1SMatt Arsenault; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2428ae0f1SMatt Arsenault; RUN: not llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -verify-machineinstrs=0 2> %t.err < %s | FileCheck %s
3428ae0f1SMatt Arsenault; RUN: FileCheck -check-prefix=ERR %s < %t.err
4428ae0f1SMatt Arsenault; FIXME: These tests cannot be tail called, and should be executed in a waterfall loop.
5428ae0f1SMatt Arsenault
6428ae0f1SMatt Arsenaultdeclare hidden void @void_func_i32_inreg(i32 inreg)
7428ae0f1SMatt Arsenault
8428ae0f1SMatt Arsenault; ERR: error: <unknown>:0:0: in function tail_call_i32_inreg_divergent void (i32): illegal VGPR to SGPR copy
9428ae0f1SMatt Arsenault; ERR: error: <unknown>:0:0: in function indirect_tail_call_i32_inreg_divergent void (i32): illegal VGPR to SGPR copy
10428ae0f1SMatt Arsenault
11428ae0f1SMatt Arsenaultdefine void @tail_call_i32_inreg_divergent(i32 %vgpr) {
12428ae0f1SMatt Arsenault; CHECK-LABEL: tail_call_i32_inreg_divergent:
13428ae0f1SMatt Arsenault; CHECK:       ; %bb.0:
14428ae0f1SMatt Arsenault; CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
15428ae0f1SMatt Arsenault; CHECK-NEXT:    s_mov_b32 s16, s33
16428ae0f1SMatt Arsenault; CHECK-NEXT:    s_mov_b32 s33, s32
17428ae0f1SMatt Arsenault; CHECK-NEXT:    s_or_saveexec_b64 s[18:19], -1
18428ae0f1SMatt Arsenault; CHECK-NEXT:    buffer_store_dword v40, off, s[0:3], s33 ; 4-byte Folded Spill
19428ae0f1SMatt Arsenault; CHECK-NEXT:    s_mov_b64 exec, s[18:19]
20428ae0f1SMatt Arsenault; CHECK-NEXT:    v_writelane_b32 v40, s16, 2
21428ae0f1SMatt Arsenault; CHECK-NEXT:    s_addk_i32 s32, 0x400
22428ae0f1SMatt Arsenault; CHECK-NEXT:    v_writelane_b32 v40, s30, 0
23428ae0f1SMatt Arsenault; CHECK-NEXT:    v_writelane_b32 v40, s31, 1
24428ae0f1SMatt Arsenault; CHECK-NEXT:    s_getpc_b64 s[16:17]
25428ae0f1SMatt Arsenault; CHECK-NEXT:    s_add_u32 s16, s16, void_func_i32_inreg@rel32@lo+4
26428ae0f1SMatt Arsenault; CHECK-NEXT:    s_addc_u32 s17, s17, void_func_i32_inreg@rel32@hi+12
27428ae0f1SMatt Arsenault; CHECK-NEXT:     ; illegal copy v0 to s0
28428ae0f1SMatt Arsenault; CHECK-NEXT:    s_swappc_b64 s[30:31], s[16:17]
29428ae0f1SMatt Arsenault; CHECK-NEXT:    v_readlane_b32 s31, v40, 1
30428ae0f1SMatt Arsenault; CHECK-NEXT:    v_readlane_b32 s30, v40, 0
31*11b04019SAaditya; CHECK-NEXT:    s_mov_b32 s32, s33
32428ae0f1SMatt Arsenault; CHECK-NEXT:    v_readlane_b32 s4, v40, 2
33428ae0f1SMatt Arsenault; CHECK-NEXT:    s_or_saveexec_b64 s[6:7], -1
34428ae0f1SMatt Arsenault; CHECK-NEXT:    buffer_load_dword v40, off, s[0:3], s33 ; 4-byte Folded Reload
35428ae0f1SMatt Arsenault; CHECK-NEXT:    s_mov_b64 exec, s[6:7]
36428ae0f1SMatt Arsenault; CHECK-NEXT:    s_mov_b32 s33, s4
37428ae0f1SMatt Arsenault; CHECK-NEXT:    s_waitcnt vmcnt(0)
38428ae0f1SMatt Arsenault; CHECK-NEXT:    s_setpc_b64 s[30:31]
39428ae0f1SMatt Arsenault  tail call void @void_func_i32_inreg(i32 inreg %vgpr)
40428ae0f1SMatt Arsenault  ret void
41428ae0f1SMatt Arsenault}
42428ae0f1SMatt Arsenault
43428ae0f1SMatt Arsenault@constant = external hidden addrspace(4) constant ptr
44428ae0f1SMatt Arsenault
45428ae0f1SMatt Arsenaultdefine void @indirect_tail_call_i32_inreg_divergent(i32 %vgpr) {
46428ae0f1SMatt Arsenault; CHECK-LABEL: indirect_tail_call_i32_inreg_divergent:
47428ae0f1SMatt Arsenault; CHECK:       ; %bb.0:
48428ae0f1SMatt Arsenault; CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
49428ae0f1SMatt Arsenault; CHECK-NEXT:    s_mov_b32 s16, s33
50428ae0f1SMatt Arsenault; CHECK-NEXT:    s_mov_b32 s33, s32
51428ae0f1SMatt Arsenault; CHECK-NEXT:    s_or_saveexec_b64 s[18:19], -1
52428ae0f1SMatt Arsenault; CHECK-NEXT:    buffer_store_dword v40, off, s[0:3], s33 ; 4-byte Folded Spill
53428ae0f1SMatt Arsenault; CHECK-NEXT:    s_mov_b64 exec, s[18:19]
54428ae0f1SMatt Arsenault; CHECK-NEXT:    s_addk_i32 s32, 0x400
55428ae0f1SMatt Arsenault; CHECK-NEXT:    v_writelane_b32 v40, s16, 2
56428ae0f1SMatt Arsenault; CHECK-NEXT:    s_getpc_b64 s[16:17]
57428ae0f1SMatt Arsenault; CHECK-NEXT:    s_add_u32 s16, s16, constant@rel32@lo+4
58428ae0f1SMatt Arsenault; CHECK-NEXT:    s_addc_u32 s17, s17, constant@rel32@hi+12
59428ae0f1SMatt Arsenault; CHECK-NEXT:    s_load_dwordx2 s[16:17], s[16:17], 0x0
60428ae0f1SMatt Arsenault; CHECK-NEXT:    v_writelane_b32 v40, s30, 0
61428ae0f1SMatt Arsenault; CHECK-NEXT:    v_writelane_b32 v40, s31, 1
62428ae0f1SMatt Arsenault; CHECK-NEXT:     ; illegal copy v0 to s0
63428ae0f1SMatt Arsenault; CHECK-NEXT:    s_waitcnt lgkmcnt(0)
64428ae0f1SMatt Arsenault; CHECK-NEXT:    s_swappc_b64 s[30:31], s[16:17]
65428ae0f1SMatt Arsenault; CHECK-NEXT:    v_readlane_b32 s31, v40, 1
66428ae0f1SMatt Arsenault; CHECK-NEXT:    v_readlane_b32 s30, v40, 0
67*11b04019SAaditya; CHECK-NEXT:    s_mov_b32 s32, s33
68428ae0f1SMatt Arsenault; CHECK-NEXT:    v_readlane_b32 s4, v40, 2
69428ae0f1SMatt Arsenault; CHECK-NEXT:    s_or_saveexec_b64 s[6:7], -1
70428ae0f1SMatt Arsenault; CHECK-NEXT:    buffer_load_dword v40, off, s[0:3], s33 ; 4-byte Folded Reload
71428ae0f1SMatt Arsenault; CHECK-NEXT:    s_mov_b64 exec, s[6:7]
72428ae0f1SMatt Arsenault; CHECK-NEXT:    s_mov_b32 s33, s4
73428ae0f1SMatt Arsenault; CHECK-NEXT:    s_waitcnt vmcnt(0)
74428ae0f1SMatt Arsenault; CHECK-NEXT:    s_setpc_b64 s[30:31]
75428ae0f1SMatt Arsenault  %fptr = load ptr, ptr addrspace(4) @constant, align 8
76428ae0f1SMatt Arsenault  tail call void %fptr(i32 inreg %vgpr)
77428ae0f1SMatt Arsenault  ret void
78428ae0f1SMatt Arsenault}
79