1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -global-isel -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -verify-machineinstrs -o - %s | FileCheck -enable-var-scope -check-prefix=MUBUF %s
3; RUN: llc -global-isel -amdgpu-enable-flat-scratch -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -verify-machineinstrs -o - %s | FileCheck -enable-var-scope -check-prefix=FLATSCR %s
4
5; Test end-to-end codegen for outgoing arguments passed on the
6; stack. This test is likely redundant when all DAG and GlobalISel
7; tests are unified.
8
9declare hidden void @external_void_func_v16i32_v16i32_v4i32(<16 x i32>, <16 x i32>, <4 x i32>) #0
10declare hidden void @external_void_func_byval([16 x i32] addrspace(5)* byval([16 x i32])) #0
11
12define amdgpu_kernel void @kernel_caller_stack() {
13; MUBUF-LABEL: kernel_caller_stack:
14; MUBUF:       ; %bb.0:
15; MUBUF-NEXT:    s_add_u32 flat_scratch_lo, s4, s7
16; MUBUF-NEXT:    s_addc_u32 flat_scratch_hi, s5, 0
17; MUBUF-NEXT:    s_mov_b32 s32, 0
18; MUBUF-NEXT:    s_add_u32 s0, s0, s7
19; MUBUF-NEXT:    s_addc_u32 s1, s1, 0
20; MUBUF-NEXT:    v_lshrrev_b32_e64 v0, 6, s32
21; MUBUF-NEXT:    v_mov_b32_e32 v1, 9
22; MUBUF-NEXT:    buffer_store_dword v1, v0, s[0:3], 0 offen offset:4
23; MUBUF-NEXT:    v_mov_b32_e32 v1, 10
24; MUBUF-NEXT:    buffer_store_dword v1, v0, s[0:3], 0 offen offset:8
25; MUBUF-NEXT:    v_mov_b32_e32 v1, 11
26; MUBUF-NEXT:    buffer_store_dword v1, v0, s[0:3], 0 offen offset:12
27; MUBUF-NEXT:    v_mov_b32_e32 v1, 12
28; MUBUF-NEXT:    buffer_store_dword v0, v0, s[0:3], 0 offen
29; MUBUF-NEXT:    s_getpc_b64 s[4:5]
30; MUBUF-NEXT:    s_add_u32 s4, s4, external_void_func_v16i32_v16i32_v4i32@rel32@lo+4
31; MUBUF-NEXT:    s_addc_u32 s5, s5, external_void_func_v16i32_v16i32_v4i32@rel32@hi+12
32; MUBUF-NEXT:    buffer_store_dword v1, v0, s[0:3], 0 offen offset:16
33; MUBUF-NEXT:    s_swappc_b64 s[30:31], s[4:5]
34; MUBUF-NEXT:    s_endpgm
35;
36; FLATSCR-LABEL: kernel_caller_stack:
37; FLATSCR:       ; %bb.0:
38; FLATSCR-NEXT:    s_add_u32 flat_scratch_lo, s0, s3
39; FLATSCR-NEXT:    s_mov_b32 s32, 0
40; FLATSCR-NEXT:    s_addc_u32 flat_scratch_hi, s1, 0
41; FLATSCR-NEXT:    scratch_store_dword off, v0, s32
42; FLATSCR-NEXT:    v_mov_b32_e32 v0, 9
43; FLATSCR-NEXT:    scratch_store_dword off, v0, s32 offset:4
44; FLATSCR-NEXT:    v_mov_b32_e32 v0, 10
45; FLATSCR-NEXT:    scratch_store_dword off, v0, s32 offset:8
46; FLATSCR-NEXT:    v_mov_b32_e32 v0, 11
47; FLATSCR-NEXT:    scratch_store_dword off, v0, s32 offset:12
48; FLATSCR-NEXT:    v_mov_b32_e32 v0, 12
49; FLATSCR-NEXT:    s_getpc_b64 s[0:1]
50; FLATSCR-NEXT:    s_add_u32 s0, s0, external_void_func_v16i32_v16i32_v4i32@rel32@lo+4
51; FLATSCR-NEXT:    s_addc_u32 s1, s1, external_void_func_v16i32_v16i32_v4i32@rel32@hi+12
52; FLATSCR-NEXT:    scratch_store_dword off, v0, s32 offset:16
53; FLATSCR-NEXT:    s_swappc_b64 s[30:31], s[0:1]
54; FLATSCR-NEXT:    s_endpgm
55  call void @external_void_func_v16i32_v16i32_v4i32(<16 x i32> undef, <16 x i32> undef, <4 x i32> <i32 9, i32 10, i32 11, i32 12>)
56  ret void
57}
58
59define amdgpu_kernel void @kernel_caller_byval() {
60; MUBUF-LABEL: kernel_caller_byval:
61; MUBUF:       ; %bb.0:
62; MUBUF-NEXT:    s_add_u32 flat_scratch_lo, s4, s7
63; MUBUF-NEXT:    s_addc_u32 flat_scratch_hi, s5, 0
64; MUBUF-NEXT:    s_add_u32 s0, s0, s7
65; MUBUF-NEXT:    s_addc_u32 s1, s1, 0
66; MUBUF-NEXT:    v_mov_b32_e32 v0, 0
67; MUBUF-NEXT:    buffer_store_dword v0, off, s[0:3], 0 offset:8
68; MUBUF-NEXT:    buffer_store_dword v0, off, s[0:3], 0 offset:12
69; MUBUF-NEXT:    buffer_store_dword v0, off, s[0:3], 0 offset:16
70; MUBUF-NEXT:    buffer_store_dword v0, off, s[0:3], 0 offset:20
71; MUBUF-NEXT:    buffer_store_dword v0, off, s[0:3], 0 offset:24
72; MUBUF-NEXT:    buffer_store_dword v0, off, s[0:3], 0 offset:28
73; MUBUF-NEXT:    buffer_store_dword v0, off, s[0:3], 0 offset:32
74; MUBUF-NEXT:    buffer_store_dword v0, off, s[0:3], 0 offset:36
75; MUBUF-NEXT:    buffer_store_dword v0, off, s[0:3], 0 offset:40
76; MUBUF-NEXT:    buffer_store_dword v0, off, s[0:3], 0 offset:44
77; MUBUF-NEXT:    buffer_store_dword v0, off, s[0:3], 0 offset:48
78; MUBUF-NEXT:    buffer_store_dword v0, off, s[0:3], 0 offset:52
79; MUBUF-NEXT:    buffer_store_dword v0, off, s[0:3], 0 offset:56
80; MUBUF-NEXT:    buffer_store_dword v0, off, s[0:3], 0 offset:60
81; MUBUF-NEXT:    buffer_store_dword v0, off, s[0:3], 0 offset:64
82; MUBUF-NEXT:    buffer_store_dword v0, off, s[0:3], 0 offset:68
83; MUBUF-NEXT:    buffer_store_dword v0, off, s[0:3], 0 offset:72
84; MUBUF-NEXT:    buffer_store_dword v0, off, s[0:3], 0 offset:76
85; MUBUF-NEXT:    buffer_store_dword v0, off, s[0:3], 0 offset:80
86; MUBUF-NEXT:    buffer_store_dword v0, off, s[0:3], 0 offset:84
87; MUBUF-NEXT:    buffer_store_dword v0, off, s[0:3], 0 offset:88
88; MUBUF-NEXT:    buffer_store_dword v0, off, s[0:3], 0 offset:92
89; MUBUF-NEXT:    buffer_store_dword v0, off, s[0:3], 0 offset:96
90; MUBUF-NEXT:    buffer_store_dword v0, off, s[0:3], 0 offset:100
91; MUBUF-NEXT:    buffer_store_dword v0, off, s[0:3], 0 offset:104
92; MUBUF-NEXT:    buffer_store_dword v0, off, s[0:3], 0 offset:108
93; MUBUF-NEXT:    buffer_store_dword v0, off, s[0:3], 0 offset:112
94; MUBUF-NEXT:    buffer_store_dword v0, off, s[0:3], 0 offset:116
95; MUBUF-NEXT:    buffer_store_dword v0, off, s[0:3], 0 offset:120
96; MUBUF-NEXT:    buffer_store_dword v0, off, s[0:3], 0 offset:124
97; MUBUF-NEXT:    buffer_store_dword v0, off, s[0:3], 0 offset:128
98; MUBUF-NEXT:    buffer_store_dword v0, off, s[0:3], 0 offset:132
99; MUBUF-NEXT:    buffer_load_dword v0, off, s[0:3], 0 offset:8
100; MUBUF-NEXT:    s_nop 0
101; MUBUF-NEXT:    buffer_load_dword v1, off, s[0:3], 0 offset:12
102; MUBUF-NEXT:    buffer_load_dword v2, off, s[0:3], 0 offset:16
103; MUBUF-NEXT:    buffer_load_dword v3, off, s[0:3], 0 offset:20
104; MUBUF-NEXT:    buffer_load_dword v4, off, s[0:3], 0 offset:24
105; MUBUF-NEXT:    buffer_load_dword v5, off, s[0:3], 0 offset:28
106; MUBUF-NEXT:    buffer_load_dword v6, off, s[0:3], 0 offset:32
107; MUBUF-NEXT:    buffer_load_dword v7, off, s[0:3], 0 offset:36
108; MUBUF-NEXT:    buffer_load_dword v8, off, s[0:3], 0 offset:40
109; MUBUF-NEXT:    buffer_load_dword v9, off, s[0:3], 0 offset:44
110; MUBUF-NEXT:    buffer_load_dword v10, off, s[0:3], 0 offset:48
111; MUBUF-NEXT:    buffer_load_dword v11, off, s[0:3], 0 offset:52
112; MUBUF-NEXT:    buffer_load_dword v12, off, s[0:3], 0 offset:56
113; MUBUF-NEXT:    buffer_load_dword v13, off, s[0:3], 0 offset:60
114; MUBUF-NEXT:    buffer_load_dword v14, off, s[0:3], 0 offset:64
115; MUBUF-NEXT:    buffer_load_dword v15, off, s[0:3], 0 offset:68
116; MUBUF-NEXT:    s_movk_i32 s32, 0x1400
117; MUBUF-NEXT:    v_lshrrev_b32_e64 v16, 6, s32
118; MUBUF-NEXT:    s_getpc_b64 s[4:5]
119; MUBUF-NEXT:    s_add_u32 s4, s4, external_void_func_byval@rel32@lo+4
120; MUBUF-NEXT:    s_addc_u32 s5, s5, external_void_func_byval@rel32@hi+12
121; MUBUF-NEXT:    s_waitcnt vmcnt(15)
122; MUBUF-NEXT:    buffer_store_dword v0, v16, s[0:3], 0 offen
123; MUBUF-NEXT:    s_waitcnt vmcnt(15)
124; MUBUF-NEXT:    buffer_store_dword v1, v16, s[0:3], 0 offen offset:4
125; MUBUF-NEXT:    s_waitcnt vmcnt(15)
126; MUBUF-NEXT:    buffer_store_dword v2, v16, s[0:3], 0 offen offset:8
127; MUBUF-NEXT:    s_waitcnt vmcnt(15)
128; MUBUF-NEXT:    buffer_store_dword v3, v16, s[0:3], 0 offen offset:12
129; MUBUF-NEXT:    s_waitcnt vmcnt(15)
130; MUBUF-NEXT:    buffer_store_dword v4, v16, s[0:3], 0 offen offset:16
131; MUBUF-NEXT:    s_waitcnt vmcnt(15)
132; MUBUF-NEXT:    buffer_store_dword v5, v16, s[0:3], 0 offen offset:20
133; MUBUF-NEXT:    s_waitcnt vmcnt(15)
134; MUBUF-NEXT:    buffer_store_dword v6, v16, s[0:3], 0 offen offset:24
135; MUBUF-NEXT:    s_waitcnt vmcnt(15)
136; MUBUF-NEXT:    buffer_store_dword v7, v16, s[0:3], 0 offen offset:28
137; MUBUF-NEXT:    s_waitcnt vmcnt(15)
138; MUBUF-NEXT:    buffer_store_dword v8, v16, s[0:3], 0 offen offset:32
139; MUBUF-NEXT:    s_waitcnt vmcnt(15)
140; MUBUF-NEXT:    buffer_store_dword v9, v16, s[0:3], 0 offen offset:36
141; MUBUF-NEXT:    s_waitcnt vmcnt(15)
142; MUBUF-NEXT:    buffer_store_dword v10, v16, s[0:3], 0 offen offset:40
143; MUBUF-NEXT:    s_waitcnt vmcnt(15)
144; MUBUF-NEXT:    buffer_store_dword v11, v16, s[0:3], 0 offen offset:44
145; MUBUF-NEXT:    s_waitcnt vmcnt(15)
146; MUBUF-NEXT:    buffer_store_dword v12, v16, s[0:3], 0 offen offset:48
147; MUBUF-NEXT:    s_waitcnt vmcnt(15)
148; MUBUF-NEXT:    buffer_store_dword v13, v16, s[0:3], 0 offen offset:52
149; MUBUF-NEXT:    s_waitcnt vmcnt(15)
150; MUBUF-NEXT:    buffer_store_dword v14, v16, s[0:3], 0 offen offset:56
151; MUBUF-NEXT:    s_waitcnt vmcnt(15)
152; MUBUF-NEXT:    buffer_store_dword v15, v16, s[0:3], 0 offen offset:60
153; MUBUF-NEXT:    s_swappc_b64 s[30:31], s[4:5]
154; MUBUF-NEXT:    s_endpgm
155;
156; FLATSCR-LABEL: kernel_caller_byval:
157; FLATSCR:       ; %bb.0:
158; FLATSCR-NEXT:    s_add_u32 flat_scratch_lo, s0, s3
159; FLATSCR-NEXT:    v_mov_b32_e32 v0, 0
160; FLATSCR-NEXT:    s_addc_u32 flat_scratch_hi, s1, 0
161; FLATSCR-NEXT:    v_mov_b32_e32 v1, 0
162; FLATSCR-NEXT:    s_mov_b32 vcc_hi, 0
163; FLATSCR-NEXT:    s_mov_b32 s33, 0
164; FLATSCR-NEXT:    scratch_store_dwordx2 off, v[0:1], vcc_hi offset:8
165; FLATSCR-NEXT:    s_mov_b32 vcc_hi, 0
166; FLATSCR-NEXT:    scratch_store_dwordx2 off, v[0:1], s33 offset:72
167; FLATSCR-NEXT:    s_mov_b32 s33, 0
168; FLATSCR-NEXT:    scratch_store_dwordx2 off, v[0:1], vcc_hi offset:16
169; FLATSCR-NEXT:    s_mov_b32 vcc_hi, 0
170; FLATSCR-NEXT:    scratch_store_dwordx2 off, v[0:1], s33 offset:80
171; FLATSCR-NEXT:    s_mov_b32 s33, 0
172; FLATSCR-NEXT:    scratch_store_dwordx2 off, v[0:1], vcc_hi offset:24
173; FLATSCR-NEXT:    s_mov_b32 vcc_hi, 0
174; FLATSCR-NEXT:    scratch_store_dwordx2 off, v[0:1], s33 offset:88
175; FLATSCR-NEXT:    s_mov_b32 s33, 0
176; FLATSCR-NEXT:    scratch_store_dwordx2 off, v[0:1], vcc_hi offset:32
177; FLATSCR-NEXT:    s_mov_b32 vcc_hi, 0
178; FLATSCR-NEXT:    scratch_store_dwordx2 off, v[0:1], s33 offset:96
179; FLATSCR-NEXT:    s_mov_b32 s33, 0
180; FLATSCR-NEXT:    scratch_store_dwordx2 off, v[0:1], vcc_hi offset:40
181; FLATSCR-NEXT:    s_mov_b32 vcc_hi, 0
182; FLATSCR-NEXT:    scratch_store_dwordx2 off, v[0:1], s33 offset:104
183; FLATSCR-NEXT:    s_mov_b32 s33, 0
184; FLATSCR-NEXT:    scratch_store_dwordx2 off, v[0:1], vcc_hi offset:48
185; FLATSCR-NEXT:    s_mov_b32 vcc_hi, 0
186; FLATSCR-NEXT:    scratch_store_dwordx2 off, v[0:1], s33 offset:112
187; FLATSCR-NEXT:    s_mov_b32 s33, 0
188; FLATSCR-NEXT:    scratch_store_dwordx2 off, v[0:1], vcc_hi offset:56
189; FLATSCR-NEXT:    s_mov_b32 vcc_hi, 0
190; FLATSCR-NEXT:    scratch_store_dwordx2 off, v[0:1], s33 offset:120
191; FLATSCR-NEXT:    s_mov_b32 s33, 0
192; FLATSCR-NEXT:    scratch_store_dwordx2 off, v[0:1], vcc_hi offset:64
193; FLATSCR-NEXT:    scratch_store_dwordx2 off, v[0:1], s33 offset:128
194; FLATSCR-NEXT:    s_mov_b32 s33, 0
195; FLATSCR-NEXT:    scratch_load_dwordx2 v[0:1], off, s33 offset:8
196; FLATSCR-NEXT:    s_mov_b32 s33, 0
197; FLATSCR-NEXT:    scratch_load_dwordx2 v[2:3], off, s33 offset:16
198; FLATSCR-NEXT:    s_mov_b32 s33, 0
199; FLATSCR-NEXT:    scratch_load_dwordx2 v[4:5], off, s33 offset:24
200; FLATSCR-NEXT:    s_mov_b32 s33, 0
201; FLATSCR-NEXT:    scratch_load_dwordx2 v[6:7], off, s33 offset:32
202; FLATSCR-NEXT:    s_mov_b32 s33, 0
203; FLATSCR-NEXT:    scratch_load_dwordx2 v[8:9], off, s33 offset:40
204; FLATSCR-NEXT:    s_mov_b32 s33, 0
205; FLATSCR-NEXT:    scratch_load_dwordx2 v[10:11], off, s33 offset:48
206; FLATSCR-NEXT:    s_mov_b32 s33, 0
207; FLATSCR-NEXT:    scratch_load_dwordx2 v[12:13], off, s33 offset:56
208; FLATSCR-NEXT:    s_mov_b32 s33, 0
209; FLATSCR-NEXT:    scratch_load_dwordx2 v[14:15], off, s33 offset:64
210; FLATSCR-NEXT:    s_movk_i32 s32, 0x50
211; FLATSCR-NEXT:    s_getpc_b64 s[0:1]
212; FLATSCR-NEXT:    s_add_u32 s0, s0, external_void_func_byval@rel32@lo+4
213; FLATSCR-NEXT:    s_addc_u32 s1, s1, external_void_func_byval@rel32@hi+12
214; FLATSCR-NEXT:    s_waitcnt vmcnt(7)
215; FLATSCR-NEXT:    scratch_store_dwordx2 off, v[0:1], s32
216; FLATSCR-NEXT:    s_waitcnt vmcnt(7)
217; FLATSCR-NEXT:    scratch_store_dwordx2 off, v[2:3], s32 offset:8
218; FLATSCR-NEXT:    s_waitcnt vmcnt(7)
219; FLATSCR-NEXT:    scratch_store_dwordx2 off, v[4:5], s32 offset:16
220; FLATSCR-NEXT:    s_waitcnt vmcnt(7)
221; FLATSCR-NEXT:    scratch_store_dwordx2 off, v[6:7], s32 offset:24
222; FLATSCR-NEXT:    s_waitcnt vmcnt(7)
223; FLATSCR-NEXT:    scratch_store_dwordx2 off, v[8:9], s32 offset:32
224; FLATSCR-NEXT:    s_waitcnt vmcnt(7)
225; FLATSCR-NEXT:    scratch_store_dwordx2 off, v[10:11], s32 offset:40
226; FLATSCR-NEXT:    s_waitcnt vmcnt(7)
227; FLATSCR-NEXT:    scratch_store_dwordx2 off, v[12:13], s32 offset:48
228; FLATSCR-NEXT:    s_waitcnt vmcnt(7)
229; FLATSCR-NEXT:    scratch_store_dwordx2 off, v[14:15], s32 offset:56
230; FLATSCR-NEXT:    s_swappc_b64 s[30:31], s[0:1]
231; FLATSCR-NEXT:    s_endpgm
232  %alloca = alloca [16 x i32], align 4, addrspace(5)
233  %cast = bitcast [16 x i32] addrspace(5)* %alloca to i8 addrspace(5)*
234  call void @llvm.memset.p5i8.i32(i8 addrspace(5)* align 4 %cast, i8 0, i32 128, i1 false)
235  call void @external_void_func_byval([16 x i32] addrspace(5)* byval([16 x i32]) %alloca)
236  ret void
237}
238
239define void @func_caller_stack() {
240; MUBUF-LABEL: func_caller_stack:
241; MUBUF:       ; %bb.0:
242; MUBUF-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
243; MUBUF-NEXT:    s_or_saveexec_b64 s[4:5], -1
244; MUBUF-NEXT:    buffer_store_dword v40, off, s[0:3], s32 ; 4-byte Folded Spill
245; MUBUF-NEXT:    s_mov_b64 exec, s[4:5]
246; MUBUF-NEXT:    v_writelane_b32 v40, s33, 2
247; MUBUF-NEXT:    s_mov_b32 s33, s32
248; MUBUF-NEXT:    s_addk_i32 s32, 0x400
249; MUBUF-NEXT:    v_lshrrev_b32_e64 v0, 6, s32
250; MUBUF-NEXT:    v_mov_b32_e32 v1, 9
251; MUBUF-NEXT:    buffer_store_dword v1, v0, s[0:3], 0 offen offset:4
252; MUBUF-NEXT:    v_mov_b32_e32 v1, 10
253; MUBUF-NEXT:    buffer_store_dword v1, v0, s[0:3], 0 offen offset:8
254; MUBUF-NEXT:    v_mov_b32_e32 v1, 11
255; MUBUF-NEXT:    v_writelane_b32 v40, s30, 0
256; MUBUF-NEXT:    buffer_store_dword v1, v0, s[0:3], 0 offen offset:12
257; MUBUF-NEXT:    v_mov_b32_e32 v1, 12
258; MUBUF-NEXT:    v_writelane_b32 v40, s31, 1
259; MUBUF-NEXT:    buffer_store_dword v0, v0, s[0:3], 0 offen
260; MUBUF-NEXT:    s_getpc_b64 s[4:5]
261; MUBUF-NEXT:    s_add_u32 s4, s4, external_void_func_v16i32_v16i32_v4i32@rel32@lo+4
262; MUBUF-NEXT:    s_addc_u32 s5, s5, external_void_func_v16i32_v16i32_v4i32@rel32@hi+12
263; MUBUF-NEXT:    buffer_store_dword v1, v0, s[0:3], 0 offen offset:16
264; MUBUF-NEXT:    s_swappc_b64 s[30:31], s[4:5]
265; MUBUF-NEXT:    v_readlane_b32 s4, v40, 0
266; MUBUF-NEXT:    v_readlane_b32 s5, v40, 1
267; MUBUF-NEXT:    s_addk_i32 s32, 0xfc00
268; MUBUF-NEXT:    v_readlane_b32 s33, v40, 2
269; MUBUF-NEXT:    s_or_saveexec_b64 s[6:7], -1
270; MUBUF-NEXT:    buffer_load_dword v40, off, s[0:3], s32 ; 4-byte Folded Reload
271; MUBUF-NEXT:    s_mov_b64 exec, s[6:7]
272; MUBUF-NEXT:    s_waitcnt vmcnt(0)
273; MUBUF-NEXT:    s_setpc_b64 s[4:5]
274;
275; FLATSCR-LABEL: func_caller_stack:
276; FLATSCR:       ; %bb.0:
277; FLATSCR-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
278; FLATSCR-NEXT:    s_or_saveexec_b64 s[0:1], -1
279; FLATSCR-NEXT:    scratch_store_dword off, v40, s32 ; 4-byte Folded Spill
280; FLATSCR-NEXT:    s_mov_b64 exec, s[0:1]
281; FLATSCR-NEXT:    v_writelane_b32 v40, s33, 2
282; FLATSCR-NEXT:    s_mov_b32 s33, s32
283; FLATSCR-NEXT:    s_add_i32 s32, s32, 16
284; FLATSCR-NEXT:    scratch_store_dword off, v0, s32
285; FLATSCR-NEXT:    v_mov_b32_e32 v0, 9
286; FLATSCR-NEXT:    scratch_store_dword off, v0, s32 offset:4
287; FLATSCR-NEXT:    v_mov_b32_e32 v0, 10
288; FLATSCR-NEXT:    scratch_store_dword off, v0, s32 offset:8
289; FLATSCR-NEXT:    v_mov_b32_e32 v0, 11
290; FLATSCR-NEXT:    v_writelane_b32 v40, s30, 0
291; FLATSCR-NEXT:    scratch_store_dword off, v0, s32 offset:12
292; FLATSCR-NEXT:    v_mov_b32_e32 v0, 12
293; FLATSCR-NEXT:    v_writelane_b32 v40, s31, 1
294; FLATSCR-NEXT:    s_getpc_b64 s[0:1]
295; FLATSCR-NEXT:    s_add_u32 s0, s0, external_void_func_v16i32_v16i32_v4i32@rel32@lo+4
296; FLATSCR-NEXT:    s_addc_u32 s1, s1, external_void_func_v16i32_v16i32_v4i32@rel32@hi+12
297; FLATSCR-NEXT:    scratch_store_dword off, v0, s32 offset:16
298; FLATSCR-NEXT:    s_swappc_b64 s[30:31], s[0:1]
299; FLATSCR-NEXT:    v_readlane_b32 s0, v40, 0
300; FLATSCR-NEXT:    v_readlane_b32 s1, v40, 1
301; FLATSCR-NEXT:    s_add_i32 s32, s32, -16
302; FLATSCR-NEXT:    v_readlane_b32 s33, v40, 2
303; FLATSCR-NEXT:    s_or_saveexec_b64 s[2:3], -1
304; FLATSCR-NEXT:    scratch_load_dword v40, off, s32 ; 4-byte Folded Reload
305; FLATSCR-NEXT:    s_mov_b64 exec, s[2:3]
306; FLATSCR-NEXT:    s_waitcnt vmcnt(0)
307; FLATSCR-NEXT:    s_setpc_b64 s[0:1]
308  call void @external_void_func_v16i32_v16i32_v4i32(<16 x i32> undef, <16 x i32> undef, <4 x i32> <i32 9, i32 10, i32 11, i32 12>)
309  ret void
310}
311
312define void @func_caller_byval([16 x i32] addrspace(5)* %argptr) {
313; MUBUF-LABEL: func_caller_byval:
314; MUBUF:       ; %bb.0:
315; MUBUF-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
316; MUBUF-NEXT:    s_or_saveexec_b64 s[4:5], -1
317; MUBUF-NEXT:    buffer_store_dword v40, off, s[0:3], s32 ; 4-byte Folded Spill
318; MUBUF-NEXT:    s_mov_b64 exec, s[4:5]
319; MUBUF-NEXT:    buffer_load_dword v1, v0, s[0:3], 0 offen
320; MUBUF-NEXT:    buffer_load_dword v2, v0, s[0:3], 0 offen offset:4
321; MUBUF-NEXT:    v_writelane_b32 v40, s33, 2
322; MUBUF-NEXT:    s_mov_b32 s33, s32
323; MUBUF-NEXT:    s_addk_i32 s32, 0x400
324; MUBUF-NEXT:    v_lshrrev_b32_e64 v3, 6, s32
325; MUBUF-NEXT:    v_writelane_b32 v40, s30, 0
326; MUBUF-NEXT:    v_writelane_b32 v40, s31, 1
327; MUBUF-NEXT:    s_getpc_b64 s[4:5]
328; MUBUF-NEXT:    s_add_u32 s4, s4, external_void_func_byval@rel32@lo+4
329; MUBUF-NEXT:    s_addc_u32 s5, s5, external_void_func_byval@rel32@hi+12
330; MUBUF-NEXT:    s_waitcnt vmcnt(1)
331; MUBUF-NEXT:    buffer_store_dword v1, v3, s[0:3], 0 offen
332; MUBUF-NEXT:    s_waitcnt vmcnt(1)
333; MUBUF-NEXT:    buffer_store_dword v2, v3, s[0:3], 0 offen offset:4
334; MUBUF-NEXT:    buffer_load_dword v1, v0, s[0:3], 0 offen offset:8
335; MUBUF-NEXT:    s_nop 0
336; MUBUF-NEXT:    buffer_load_dword v2, v0, s[0:3], 0 offen offset:12
337; MUBUF-NEXT:    s_waitcnt vmcnt(1)
338; MUBUF-NEXT:    buffer_store_dword v1, v3, s[0:3], 0 offen offset:8
339; MUBUF-NEXT:    s_waitcnt vmcnt(1)
340; MUBUF-NEXT:    buffer_store_dword v2, v3, s[0:3], 0 offen offset:12
341; MUBUF-NEXT:    buffer_load_dword v1, v0, s[0:3], 0 offen offset:16
342; MUBUF-NEXT:    s_nop 0
343; MUBUF-NEXT:    buffer_load_dword v2, v0, s[0:3], 0 offen offset:20
344; MUBUF-NEXT:    s_waitcnt vmcnt(1)
345; MUBUF-NEXT:    buffer_store_dword v1, v3, s[0:3], 0 offen offset:16
346; MUBUF-NEXT:    s_waitcnt vmcnt(1)
347; MUBUF-NEXT:    buffer_store_dword v2, v3, s[0:3], 0 offen offset:20
348; MUBUF-NEXT:    buffer_load_dword v1, v0, s[0:3], 0 offen offset:24
349; MUBUF-NEXT:    s_nop 0
350; MUBUF-NEXT:    buffer_load_dword v2, v0, s[0:3], 0 offen offset:28
351; MUBUF-NEXT:    s_waitcnt vmcnt(1)
352; MUBUF-NEXT:    buffer_store_dword v1, v3, s[0:3], 0 offen offset:24
353; MUBUF-NEXT:    s_waitcnt vmcnt(1)
354; MUBUF-NEXT:    buffer_store_dword v2, v3, s[0:3], 0 offen offset:28
355; MUBUF-NEXT:    buffer_load_dword v1, v0, s[0:3], 0 offen offset:32
356; MUBUF-NEXT:    s_nop 0
357; MUBUF-NEXT:    buffer_load_dword v2, v0, s[0:3], 0 offen offset:36
358; MUBUF-NEXT:    s_waitcnt vmcnt(1)
359; MUBUF-NEXT:    buffer_store_dword v1, v3, s[0:3], 0 offen offset:32
360; MUBUF-NEXT:    s_waitcnt vmcnt(1)
361; MUBUF-NEXT:    buffer_store_dword v2, v3, s[0:3], 0 offen offset:36
362; MUBUF-NEXT:    buffer_load_dword v1, v0, s[0:3], 0 offen offset:40
363; MUBUF-NEXT:    s_nop 0
364; MUBUF-NEXT:    buffer_load_dword v2, v0, s[0:3], 0 offen offset:44
365; MUBUF-NEXT:    s_waitcnt vmcnt(1)
366; MUBUF-NEXT:    buffer_store_dword v1, v3, s[0:3], 0 offen offset:40
367; MUBUF-NEXT:    s_waitcnt vmcnt(1)
368; MUBUF-NEXT:    buffer_store_dword v2, v3, s[0:3], 0 offen offset:44
369; MUBUF-NEXT:    buffer_load_dword v1, v0, s[0:3], 0 offen offset:48
370; MUBUF-NEXT:    s_nop 0
371; MUBUF-NEXT:    buffer_load_dword v2, v0, s[0:3], 0 offen offset:52
372; MUBUF-NEXT:    s_waitcnt vmcnt(1)
373; MUBUF-NEXT:    buffer_store_dword v1, v3, s[0:3], 0 offen offset:48
374; MUBUF-NEXT:    s_waitcnt vmcnt(1)
375; MUBUF-NEXT:    buffer_store_dword v2, v3, s[0:3], 0 offen offset:52
376; MUBUF-NEXT:    buffer_load_dword v1, v0, s[0:3], 0 offen offset:56
377; MUBUF-NEXT:    s_nop 0
378; MUBUF-NEXT:    buffer_load_dword v2, v0, s[0:3], 0 offen offset:60
379; MUBUF-NEXT:    s_waitcnt vmcnt(1)
380; MUBUF-NEXT:    buffer_store_dword v1, v3, s[0:3], 0 offen offset:56
381; MUBUF-NEXT:    s_waitcnt vmcnt(1)
382; MUBUF-NEXT:    buffer_store_dword v2, v3, s[0:3], 0 offen offset:60
383; MUBUF-NEXT:    s_swappc_b64 s[30:31], s[4:5]
384; MUBUF-NEXT:    v_readlane_b32 s4, v40, 0
385; MUBUF-NEXT:    v_readlane_b32 s5, v40, 1
386; MUBUF-NEXT:    s_addk_i32 s32, 0xfc00
387; MUBUF-NEXT:    v_readlane_b32 s33, v40, 2
388; MUBUF-NEXT:    s_or_saveexec_b64 s[6:7], -1
389; MUBUF-NEXT:    buffer_load_dword v40, off, s[0:3], s32 ; 4-byte Folded Reload
390; MUBUF-NEXT:    s_mov_b64 exec, s[6:7]
391; MUBUF-NEXT:    s_waitcnt vmcnt(0)
392; MUBUF-NEXT:    s_setpc_b64 s[4:5]
393;
394; FLATSCR-LABEL: func_caller_byval:
395; FLATSCR:       ; %bb.0:
396; FLATSCR-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
397; FLATSCR-NEXT:    s_or_saveexec_b64 s[0:1], -1
398; FLATSCR-NEXT:    scratch_store_dword off, v40, s32 ; 4-byte Folded Spill
399; FLATSCR-NEXT:    s_mov_b64 exec, s[0:1]
400; FLATSCR-NEXT:    scratch_load_dwordx2 v[1:2], v0, off
401; FLATSCR-NEXT:    v_writelane_b32 v40, s33, 2
402; FLATSCR-NEXT:    s_mov_b32 s33, s32
403; FLATSCR-NEXT:    s_add_i32 s32, s32, 16
404; FLATSCR-NEXT:    v_writelane_b32 v40, s30, 0
405; FLATSCR-NEXT:    v_writelane_b32 v40, s31, 1
406; FLATSCR-NEXT:    s_getpc_b64 s[0:1]
407; FLATSCR-NEXT:    s_add_u32 s0, s0, external_void_func_byval@rel32@lo+4
408; FLATSCR-NEXT:    s_addc_u32 s1, s1, external_void_func_byval@rel32@hi+12
409; FLATSCR-NEXT:    s_waitcnt vmcnt(0)
410; FLATSCR-NEXT:    scratch_store_dwordx2 off, v[1:2], s32
411; FLATSCR-NEXT:    scratch_load_dwordx2 v[1:2], v0, off offset:8
412; FLATSCR-NEXT:    s_waitcnt vmcnt(0)
413; FLATSCR-NEXT:    scratch_store_dwordx2 off, v[1:2], s32 offset:8
414; FLATSCR-NEXT:    scratch_load_dwordx2 v[1:2], v0, off offset:16
415; FLATSCR-NEXT:    s_waitcnt vmcnt(0)
416; FLATSCR-NEXT:    scratch_store_dwordx2 off, v[1:2], s32 offset:16
417; FLATSCR-NEXT:    scratch_load_dwordx2 v[1:2], v0, off offset:24
418; FLATSCR-NEXT:    s_waitcnt vmcnt(0)
419; FLATSCR-NEXT:    scratch_store_dwordx2 off, v[1:2], s32 offset:24
420; FLATSCR-NEXT:    scratch_load_dwordx2 v[1:2], v0, off offset:32
421; FLATSCR-NEXT:    s_waitcnt vmcnt(0)
422; FLATSCR-NEXT:    scratch_store_dwordx2 off, v[1:2], s32 offset:32
423; FLATSCR-NEXT:    scratch_load_dwordx2 v[1:2], v0, off offset:40
424; FLATSCR-NEXT:    s_waitcnt vmcnt(0)
425; FLATSCR-NEXT:    scratch_store_dwordx2 off, v[1:2], s32 offset:40
426; FLATSCR-NEXT:    scratch_load_dwordx2 v[1:2], v0, off offset:48
427; FLATSCR-NEXT:    s_waitcnt vmcnt(0)
428; FLATSCR-NEXT:    scratch_store_dwordx2 off, v[1:2], s32 offset:48
429; FLATSCR-NEXT:    scratch_load_dwordx2 v[0:1], v0, off offset:56
430; FLATSCR-NEXT:    s_waitcnt vmcnt(0)
431; FLATSCR-NEXT:    scratch_store_dwordx2 off, v[0:1], s32 offset:56
432; FLATSCR-NEXT:    s_swappc_b64 s[30:31], s[0:1]
433; FLATSCR-NEXT:    v_readlane_b32 s0, v40, 0
434; FLATSCR-NEXT:    v_readlane_b32 s1, v40, 1
435; FLATSCR-NEXT:    s_add_i32 s32, s32, -16
436; FLATSCR-NEXT:    v_readlane_b32 s33, v40, 2
437; FLATSCR-NEXT:    s_or_saveexec_b64 s[2:3], -1
438; FLATSCR-NEXT:    scratch_load_dword v40, off, s32 ; 4-byte Folded Reload
439; FLATSCR-NEXT:    s_mov_b64 exec, s[2:3]
440; FLATSCR-NEXT:    s_waitcnt vmcnt(0)
441; FLATSCR-NEXT:    s_setpc_b64 s[0:1]
442  %cast = bitcast [16 x i32] addrspace(5)* %argptr to i8 addrspace(5)*
443  call void @external_void_func_byval([16 x i32] addrspace(5)* byval([16 x i32]) %argptr)
444  ret void
445}
446
447declare void @llvm.memset.p5i8.i32(i8 addrspace(5)* nocapture writeonly, i8, i32, i1 immarg) #1
448
449attributes #0 = { nounwind "amdgpu-no-dispatch-id" "amdgpu-no-dispatch-ptr" "amdgpu-no-implicitarg-ptr" "amdgpu-no-queue-ptr" "amdgpu-no-workgroup-id-x" "amdgpu-no-workgroup-id-y" "amdgpu-no-workgroup-id-z" "amdgpu-no-workitem-id-x" "amdgpu-no-workitem-id-y" "amdgpu-no-workitem-id-z" }
450attributes #1 = { argmemonly nofree nounwind willreturn writeonly }
451