blob: 2fe58159694401587499cba77956e0e57437a828 [file] [log] [blame]
Matt Arsenault607a7562017-11-28 23:40:12 +00001; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=fiji -enable-ipra=0 -verify-machineinstrs < %s | FileCheck -enable-var-scope -check-prefixes=GCN,VI %s
2; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=hawaii -enable-ipra=0 -verify-machineinstrs < %s | FileCheck -enable-var-scope -check-prefixes=GCN,CI %s
Matt Arsenaultb62a4eb2017-08-01 19:54:18 +00003
4%struct.ByValStruct = type { [4 x i32] }
5
6; GCN-LABEL: {{^}}void_func_byval_struct:
Matt Arsenault34c8b832019-06-05 22:37:50 +00007; GCN: buffer_load_dword [[LOAD0:v[0-9]+]], off, s[0:3], s32{{$}}
Matt Arsenaultb62a4eb2017-08-01 19:54:18 +00008; GCN-NOT: s32
Matt Arsenault34c8b832019-06-05 22:37:50 +00009; GCN: buffer_store_dword [[LOAD0]], off, s[0:3], s32{{$}}
Matt Arsenaultb62a4eb2017-08-01 19:54:18 +000010; GCN-NOT: s32
11
Matt Arsenault34c8b832019-06-05 22:37:50 +000012; GCN: buffer_load_dword [[LOAD1:v[0-9]+]], off, s[0:3], s32 offset:16{{$}}
Matt Arsenaultb62a4eb2017-08-01 19:54:18 +000013; GCN-NOT: s32
Matt Arsenault34c8b832019-06-05 22:37:50 +000014; GCN: buffer_store_dword [[LOAD1]], off, s[0:3], s32 offset:16{{$}}
Matt Arsenaultb62a4eb2017-08-01 19:54:18 +000015; GCN-NOT: s32
Scott Linderafc24ed2019-02-01 21:23:28 +000016define hidden void @void_func_byval_struct(%struct.ByValStruct addrspace(5)* byval noalias nocapture align 4 %arg0, %struct.ByValStruct addrspace(5)* byval noalias nocapture align 4 %arg1) #1 {
Matt Arsenaultb62a4eb2017-08-01 19:54:18 +000017entry:
Yaxun Liu2a22c5d2018-02-02 16:07:16 +000018 %arrayidx = getelementptr inbounds %struct.ByValStruct, %struct.ByValStruct addrspace(5)* %arg0, i32 0, i32 0, i32 0
19 %tmp = load volatile i32, i32 addrspace(5)* %arrayidx, align 4
Matt Arsenaultb62a4eb2017-08-01 19:54:18 +000020 %add = add nsw i32 %tmp, 1
Yaxun Liu2a22c5d2018-02-02 16:07:16 +000021 store volatile i32 %add, i32 addrspace(5)* %arrayidx, align 4
22 %arrayidx2 = getelementptr inbounds %struct.ByValStruct, %struct.ByValStruct addrspace(5)* %arg1, i32 0, i32 0, i32 0
23 %tmp1 = load volatile i32, i32 addrspace(5)* %arrayidx2, align 4
Matt Arsenaultb62a4eb2017-08-01 19:54:18 +000024 %add3 = add nsw i32 %tmp1, 2
Yaxun Liu2a22c5d2018-02-02 16:07:16 +000025 store volatile i32 %add3, i32 addrspace(5)* %arrayidx2, align 4
Matt Arsenaultb62a4eb2017-08-01 19:54:18 +000026 store volatile i32 9, i32 addrspace(1)* null, align 4
27 ret void
28}
29
Matt Arsenault60957cb2019-06-24 14:53:56 +000030; Make sure the offset is folded and function's frame register is used
31; rather than the global scratch wave offset.
32; GCN-LABEL: {{^}}void_func_byval_struct_use_outside_entry_block:
33; GCN-NOT: v_lshrrev_b32
34; GCN-NOT: s_sub_u32
35
36; GCN: s_and_saveexec_b64
37; GCN: s_cbranch_execz [[BB1:BB[0-9]+_[0-9]+]]
38
39; GCN: buffer_load_dword [[LOAD0:v[0-9]+]], off, s[0:3], s32{{$}}
40; GCN-NOT: s32
41; GCN: buffer_store_dword [[LOAD0]], off, s[0:3], s32{{$}}
42; GCN-NOT: s32
43
44; GCN: buffer_load_dword [[LOAD1:v[0-9]+]], off, s[0:3], s32 offset:16{{$}}
45; GCN-NOT: s32
46; GCN: buffer_store_dword [[LOAD1]], off, s[0:3], s32 offset:16{{$}}
47; GCN-NOT: s32
48
49; GCN: [[BB1]]
50; GCN: s_or_b64 exec, exec
51define hidden void @void_func_byval_struct_use_outside_entry_block(%struct.ByValStruct addrspace(5)* byval noalias nocapture align 4 %arg0, %struct.ByValStruct addrspace(5)* byval noalias nocapture align 4 %arg1, i1 %cond) #1 {
52entry:
53 br i1 %cond, label %bb0, label %bb1
54
55bb0:
56 %arrayidx = getelementptr inbounds %struct.ByValStruct, %struct.ByValStruct addrspace(5)* %arg0, i32 0, i32 0, i32 0
57 %tmp = load volatile i32, i32 addrspace(5)* %arrayidx, align 4
58 %add = add nsw i32 %tmp, 1
59 store volatile i32 %add, i32 addrspace(5)* %arrayidx, align 4
60 %arrayidx2 = getelementptr inbounds %struct.ByValStruct, %struct.ByValStruct addrspace(5)* %arg1, i32 0, i32 0, i32 0
61 %tmp1 = load volatile i32, i32 addrspace(5)* %arrayidx2, align 4
62 %add3 = add nsw i32 %tmp1, 2
63 store volatile i32 %add3, i32 addrspace(5)* %arrayidx2, align 4
64 store volatile i32 9, i32 addrspace(1)* null, align 4
65 br label %bb1
66
67bb1:
68 ret void
69}
70
Matt Arsenaultb62a4eb2017-08-01 19:54:18 +000071; GCN-LABEL: {{^}}void_func_byval_struct_non_leaf:
Matt Arsenault71dfb7e2019-07-08 19:03:38 +000072; GCN: buffer_store_dword v33, off, s[0:3], s32 offset:36
73; GCN-DAG: v_writelane_b32 v33, s34,
74; GCN: s_mov_b32 s34, s32
75; GCN-DAG: buffer_load_dword [[LOAD0:v[0-9]+]], off, s[0:3], s34{{$}}
76; GCN-DAG: s_add_u32 s32, s32, 0xc00{{$}}
77; GCN-DAG: buffer_store_dword v32, off, s[0:3], s34 offset:32
Matt Arsenaultecb43ef2017-09-13 23:47:01 +000078; GCN-NOT: v_writelane_b32 v{{[0-9]+}}, s32
Matt Arsenaultb62a4eb2017-08-01 19:54:18 +000079
Matt Arsenault71dfb7e2019-07-08 19:03:38 +000080; GCN-DAG: v_add_{{[iu]}}32_e32 [[ADD0:v[0-9]+]], vcc, 1, [[LOAD0]]
81; GCN: buffer_store_dword [[ADD0]], off, s[0:3], s34{{$}}
82
83; GCN-DAG: buffer_load_dword [[LOAD1:v[0-9]+]], off, s[0:3], s34 offset:16{{$}}
Tim Renouf2a99fa22018-02-28 19:10:32 +000084; GCN-DAG: v_add_{{[iu]}}32_e32 [[ADD1:v[0-9]+]], vcc, 2, [[LOAD1]]
Matt Arsenaultb62a4eb2017-08-01 19:54:18 +000085
86; GCN: s_swappc_b64
87
Matt Arsenault71dfb7e2019-07-08 19:03:38 +000088; GCN: buffer_store_dword [[ADD1]], off, s[0:3], s34 offset:16{{$}}
Matt Arsenaultb62a4eb2017-08-01 19:54:18 +000089
90; GCN: v_readlane_b32
Matt Arsenaultecb43ef2017-09-13 23:47:01 +000091; GCN-NOT: v_readlane_b32 s32
Matt Arsenault71dfb7e2019-07-08 19:03:38 +000092; GCN-DAG: buffer_load_dword v32, off, s[0:3], s34 offset:32
Matt Arsenaultffb132e2018-03-29 20:22:04 +000093; GCN: s_sub_u32 s32, s32, 0xc00{{$}}
Matt Arsenault71dfb7e2019-07-08 19:03:38 +000094; GCN: v_readlane_b32 s34, v33,
95; GCN-DAG: buffer_load_dword v33, off, s[0:3], s32 offset:36 ; 4-byte Folded Reload
Matt Arsenaultb62a4eb2017-08-01 19:54:18 +000096; GCN: s_setpc_b64
Yaxun Liu2a22c5d2018-02-02 16:07:16 +000097define void @void_func_byval_struct_non_leaf(%struct.ByValStruct addrspace(5)* byval noalias nocapture align 4 %arg0, %struct.ByValStruct addrspace(5)* byval noalias nocapture align 4 %arg1) #1 {
Matt Arsenaultb62a4eb2017-08-01 19:54:18 +000098entry:
Yaxun Liu2a22c5d2018-02-02 16:07:16 +000099 %arrayidx = getelementptr inbounds %struct.ByValStruct, %struct.ByValStruct addrspace(5)* %arg0, i32 0, i32 0, i32 0
100 %tmp = load volatile i32, i32 addrspace(5)* %arrayidx, align 4
Matt Arsenaultb62a4eb2017-08-01 19:54:18 +0000101 %add = add nsw i32 %tmp, 1
Yaxun Liu2a22c5d2018-02-02 16:07:16 +0000102 store volatile i32 %add, i32 addrspace(5)* %arrayidx, align 4
103 %arrayidx2 = getelementptr inbounds %struct.ByValStruct, %struct.ByValStruct addrspace(5)* %arg1, i32 0, i32 0, i32 0
104 %tmp1 = load volatile i32, i32 addrspace(5)* %arrayidx2, align 4
Matt Arsenaultb62a4eb2017-08-01 19:54:18 +0000105 %add3 = add nsw i32 %tmp1, 2
106 call void @external_void_func_void()
Yaxun Liu2a22c5d2018-02-02 16:07:16 +0000107 store volatile i32 %add3, i32 addrspace(5)* %arrayidx2, align 4
Matt Arsenaultb62a4eb2017-08-01 19:54:18 +0000108 store volatile i32 9, i32 addrspace(1)* null, align 4
109 ret void
110}
111
112; GCN-LABEL: {{^}}call_void_func_byval_struct_func:
Matt Arsenault71dfb7e2019-07-08 19:03:38 +0000113; GCN: s_mov_b32 s34, s32
Matt Arsenaultecb43ef2017-09-13 23:47:01 +0000114; GCN-DAG: s_add_u32 s32, s32, 0xc00{{$}}
115; GCN-DAG: v_writelane_b32
Matt Arsenaultb62a4eb2017-08-01 19:54:18 +0000116
Matt Arsenaultb62a4eb2017-08-01 19:54:18 +0000117; GCN-DAG: v_mov_b32_e32 [[NINE:v[0-9]+]], 9
118; GCN-DAG: v_mov_b32_e32 [[THIRTEEN:v[0-9]+]], 13
119
Matt Arsenault71dfb7e2019-07-08 19:03:38 +0000120; GCN-DAG: buffer_store_dword [[NINE]], off, s[0:3], s34{{$}}
121; GCN-DAG: buffer_store_dword [[THIRTEEN]], off, s[0:3], s34 offset:16
Matt Arsenaultb62a4eb2017-08-01 19:54:18 +0000122
Matt Arsenault71dfb7e2019-07-08 19:03:38 +0000123; GCN-DAG: buffer_load_dword [[LOAD0:v[0-9]+]], off, s[0:3], s34{{$}}
124; GCN-DAG: buffer_load_dword [[LOAD1:v[0-9]+]], off, s[0:3], s34 offset:4
125; GCN-DAG: buffer_load_dword [[LOAD2:v[0-9]+]], off, s[0:3], s34 offset:8
126; GCN-DAG: buffer_load_dword [[LOAD3:v[0-9]+]], off, s[0:3], s34 offset:12
Matt Arsenault99e6f4d2019-05-16 15:10:27 +0000127
128; GCN-NOT: s_add_u32 s32, s32, 0x800
129
130
Matt Arsenault34c8b832019-06-05 22:37:50 +0000131; GCN-DAG: buffer_store_dword [[LOAD0]], off, s[0:3], s32{{$}}
132; GCN-DAG: buffer_store_dword [[LOAD1]], off, s[0:3], s32 offset:4
133; GCN-DAG: buffer_store_dword [[LOAD2]], off, s[0:3], s32 offset:8
134; GCN-DAG: buffer_store_dword [[LOAD3]], off, s[0:3], s32 offset:12
Matt Arsenault99e6f4d2019-05-16 15:10:27 +0000135
Matt Arsenault71dfb7e2019-07-08 19:03:38 +0000136; GCN: buffer_load_dword [[LOAD5:v[0-9]+]], off, s[0:3], s34 offset:20
137; GCN: buffer_load_dword [[LOAD6:v[0-9]+]], off, s[0:3], s34 offset:24
138; GCN: buffer_load_dword [[LOAD7:v[0-9]+]], off, s[0:3], s34 offset:28
Matt Arsenault60c8b8b2019-09-05 23:54:35 +0000139; GCN: buffer_load_dword [[LOAD4:v[0-9]+]], off, s[0:3], s34 offset:16
Matt Arsenaultf4320112018-09-24 13:18:15 +0000140
Matt Arsenault34c8b832019-06-05 22:37:50 +0000141; GCN-DAG: buffer_store_dword [[LOAD4]], off, s[0:3], s32 offset:16
142; GCN-DAG: buffer_store_dword [[LOAD5]], off, s[0:3], s32 offset:20
143; GCN-DAG: buffer_store_dword [[LOAD6]], off, s[0:3], s32 offset:24
144; GCN-DAG: buffer_store_dword [[LOAD7]], off, s[0:3], s32 offset:28
Matt Arsenaultf4320112018-09-24 13:18:15 +0000145
Matt Arsenaultb62a4eb2017-08-01 19:54:18 +0000146; GCN: s_swappc_b64
Matt Arsenaultecb43ef2017-09-13 23:47:01 +0000147; GCN-NOT: v_readlane_b32 s32
Matt Arsenaultb62a4eb2017-08-01 19:54:18 +0000148; GCN: v_readlane_b32
Matt Arsenaultecb43ef2017-09-13 23:47:01 +0000149; GCN-NOT: v_readlane_b32 s32
Matt Arsenaultb62a4eb2017-08-01 19:54:18 +0000150
Matt Arsenaultdefe3712017-09-14 17:37:40 +0000151; GCN-NOT: s_sub_u32 s32, s32, 0x800
152
153; GCN: s_sub_u32 s32, s32, 0xc00{{$}}
Matt Arsenault71dfb7e2019-07-08 19:03:38 +0000154; GCN: v_readlane_b32 s34, v
155; GCN: s_waitcnt
156; GCN: s_setpc_b64
Matt Arsenaultbb8e64e2018-08-22 11:09:45 +0000157define void @call_void_func_byval_struct_func() #1 {
Matt Arsenaultb62a4eb2017-08-01 19:54:18 +0000158entry:
Yaxun Liu2a22c5d2018-02-02 16:07:16 +0000159 %arg0 = alloca %struct.ByValStruct, align 4, addrspace(5)
160 %arg1 = alloca %struct.ByValStruct, align 4, addrspace(5)
161 %tmp = bitcast %struct.ByValStruct addrspace(5)* %arg0 to i8 addrspace(5)*
162 call void @llvm.lifetime.start.p5i8(i64 32, i8 addrspace(5)* %tmp)
163 %tmp1 = bitcast %struct.ByValStruct addrspace(5)* %arg1 to i8 addrspace(5)*
164 call void @llvm.lifetime.start.p5i8(i64 32, i8 addrspace(5)* %tmp1)
165 %arrayidx = getelementptr inbounds %struct.ByValStruct, %struct.ByValStruct addrspace(5)* %arg0, i32 0, i32 0, i32 0
166 store volatile i32 9, i32 addrspace(5)* %arrayidx, align 4
167 %arrayidx2 = getelementptr inbounds %struct.ByValStruct, %struct.ByValStruct addrspace(5)* %arg1, i32 0, i32 0, i32 0
168 store volatile i32 13, i32 addrspace(5)* %arrayidx2, align 4
169 call void @void_func_byval_struct(%struct.ByValStruct addrspace(5)* byval nonnull align 4 %arg0, %struct.ByValStruct addrspace(5)* byval nonnull align 4 %arg1)
170 call void @llvm.lifetime.end.p5i8(i64 32, i8 addrspace(5)* %tmp1)
171 call void @llvm.lifetime.end.p5i8(i64 32, i8 addrspace(5)* %tmp)
Matt Arsenaultb62a4eb2017-08-01 19:54:18 +0000172 ret void
173}
174
175; GCN-LABEL: {{^}}call_void_func_byval_struct_kernel:
Geoff Berry4e38e022017-08-17 04:04:11 +0000176; GCN: s_mov_b32 s33, s7
Matt Arsenault4f3472d2019-07-03 00:30:47 +0000177; GCN-NOT: s_add_u32 s32, s32, 0x800
Matt Arsenaultb62a4eb2017-08-01 19:54:18 +0000178
Matt Arsenault4f3472d2019-07-03 00:30:47 +0000179; GCN: v_mov_b32_e32 [[NINE:v[0-9]+]], 9
180; GCN: buffer_store_dword [[NINE]], off, s[0:3], s33 offset:8
181; GCN: v_mov_b32_e32 [[THIRTEEN:v[0-9]+]], 13
Geoff Berry4e38e022017-08-17 04:04:11 +0000182; GCN: buffer_store_dword [[THIRTEEN]], off, s[0:3], s33 offset:24
Matt Arsenaultb62a4eb2017-08-01 19:54:18 +0000183
Matt Arsenaultdefe3712017-09-14 17:37:40 +0000184; GCN-NOT: s_add_u32 s32, s32, 0x800
Geoff Berry4e38e022017-08-17 04:04:11 +0000185; GCN-DAG: buffer_load_dword [[LOAD0:v[0-9]+]], off, s[0:3], s33 offset:8
186; GCN-DAG: buffer_load_dword [[LOAD1:v[0-9]+]], off, s[0:3], s33 offset:12
Matt Arsenault4f3472d2019-07-03 00:30:47 +0000187; GCN-DAG: s_add_u32 s32, s33, 0xc00{{$}}
Geoff Berry4e38e022017-08-17 04:04:11 +0000188; GCN-DAG: buffer_load_dword [[LOAD2:v[0-9]+]], off, s[0:3], s33 offset:16
189; GCN-DAG: buffer_load_dword [[LOAD3:v[0-9]+]], off, s[0:3], s33 offset:20
Matt Arsenaultb62a4eb2017-08-01 19:54:18 +0000190
Matt Arsenault4f3472d2019-07-03 00:30:47 +0000191; GCN: s_getpc_b64
192
Matt Arsenault34c8b832019-06-05 22:37:50 +0000193; GCN-DAG: buffer_store_dword [[LOAD0]], off, s[0:3], s32{{$}}
194; GCN-DAG: buffer_store_dword [[LOAD1]], off, s[0:3], s32 offset:4
195; GCN-DAG: buffer_store_dword [[LOAD2]], off, s[0:3], s32 offset:8
196; GCN-DAG: buffer_store_dword [[LOAD3]], off, s[0:3], s32 offset:12
Matt Arsenaultb62a4eb2017-08-01 19:54:18 +0000197
Matt Arsenaultacc5e822017-08-02 00:43:42 +0000198; GCN-DAG: buffer_load_dword [[LOAD4:v[0-9]+]], off, s[0:3], s33 offset:24
199; GCN-DAG: buffer_load_dword [[LOAD5:v[0-9]+]], off, s[0:3], s33 offset:28
200; GCN-DAG: buffer_load_dword [[LOAD6:v[0-9]+]], off, s[0:3], s33 offset:32
201; GCN-DAG: buffer_load_dword [[LOAD7:v[0-9]+]], off, s[0:3], s33 offset:36
Matt Arsenaultb62a4eb2017-08-01 19:54:18 +0000202
Matt Arsenault34c8b832019-06-05 22:37:50 +0000203; GCN-DAG: buffer_store_dword [[LOAD4]], off, s[0:3], s32 offset:16
204; GCN-DAG: buffer_store_dword [[LOAD5]], off, s[0:3], s32 offset:20
205; GCN-DAG: buffer_store_dword [[LOAD6]], off, s[0:3], s32 offset:24
206; GCN-DAG: buffer_store_dword [[LOAD7]], off, s[0:3], s32 offset:28
Matt Arsenaultb62a4eb2017-08-01 19:54:18 +0000207
208
209; GCN: s_swappc_b64
Matt Arsenaultdefe3712017-09-14 17:37:40 +0000210; GCN-NOT: s_sub_u32 s32
211; GCN: s_endpgm
Matt Arsenaultbb8e64e2018-08-22 11:09:45 +0000212define amdgpu_kernel void @call_void_func_byval_struct_kernel() #1 {
Matt Arsenaultb62a4eb2017-08-01 19:54:18 +0000213entry:
Yaxun Liu2a22c5d2018-02-02 16:07:16 +0000214 %arg0 = alloca %struct.ByValStruct, align 4, addrspace(5)
215 %arg1 = alloca %struct.ByValStruct, align 4, addrspace(5)
216 %tmp = bitcast %struct.ByValStruct addrspace(5)* %arg0 to i8 addrspace(5)*
217 call void @llvm.lifetime.start.p5i8(i64 32, i8 addrspace(5)* %tmp)
218 %tmp1 = bitcast %struct.ByValStruct addrspace(5)* %arg1 to i8 addrspace(5)*
219 call void @llvm.lifetime.start.p5i8(i64 32, i8 addrspace(5)* %tmp1)
220 %arrayidx = getelementptr inbounds %struct.ByValStruct, %struct.ByValStruct addrspace(5)* %arg0, i32 0, i32 0, i32 0
221 store volatile i32 9, i32 addrspace(5)* %arrayidx, align 4
222 %arrayidx2 = getelementptr inbounds %struct.ByValStruct, %struct.ByValStruct addrspace(5)* %arg1, i32 0, i32 0, i32 0
223 store volatile i32 13, i32 addrspace(5)* %arrayidx2, align 4
224 call void @void_func_byval_struct(%struct.ByValStruct addrspace(5)* byval nonnull align 4 %arg0, %struct.ByValStruct addrspace(5)* byval nonnull align 4 %arg1)
225 call void @llvm.lifetime.end.p5i8(i64 32, i8 addrspace(5)* %tmp1)
226 call void @llvm.lifetime.end.p5i8(i64 32, i8 addrspace(5)* %tmp)
Matt Arsenaultb62a4eb2017-08-01 19:54:18 +0000227 ret void
228}
229
Matt Arsenaultbb8e64e2018-08-22 11:09:45 +0000230; GCN-LABEL: {{^}}void_func_byval_struct_align8:
Matt Arsenault34c8b832019-06-05 22:37:50 +0000231; GCN: buffer_load_dword [[LOAD0:v[0-9]+]], off, s[0:3], s32{{$}}
Matt Arsenaultbb8e64e2018-08-22 11:09:45 +0000232; GCN-NOT: s32
Matt Arsenault34c8b832019-06-05 22:37:50 +0000233; GCN: buffer_store_dword [[LOAD0]], off, s[0:3], s32{{$}}
Matt Arsenaultbb8e64e2018-08-22 11:09:45 +0000234; GCN-NOT: s32
235
Matt Arsenault34c8b832019-06-05 22:37:50 +0000236; GCN: buffer_load_dword [[LOAD1:v[0-9]+]], off, s[0:3], s32 offset:16{{$}}
Matt Arsenaultbb8e64e2018-08-22 11:09:45 +0000237; GCN-NOT: s32
Matt Arsenault34c8b832019-06-05 22:37:50 +0000238; GCN: buffer_store_dword [[LOAD1]], off, s[0:3], s32 offset:16{{$}}
Matt Arsenaultbb8e64e2018-08-22 11:09:45 +0000239; GCN-NOT: s32
Scott Linderafc24ed2019-02-01 21:23:28 +0000240define hidden void @void_func_byval_struct_align8(%struct.ByValStruct addrspace(5)* byval noalias nocapture align 8 %arg0, %struct.ByValStruct addrspace(5)* byval noalias nocapture align 8 %arg1) #1 {
Matt Arsenaultbb8e64e2018-08-22 11:09:45 +0000241entry:
242 %arrayidx = getelementptr inbounds %struct.ByValStruct, %struct.ByValStruct addrspace(5)* %arg0, i32 0, i32 0, i32 0
243 %tmp = load volatile i32, i32 addrspace(5)* %arrayidx, align 8
244 %add = add nsw i32 %tmp, 1
245 store volatile i32 %add, i32 addrspace(5)* %arrayidx, align 8
246 %arrayidx2 = getelementptr inbounds %struct.ByValStruct, %struct.ByValStruct addrspace(5)* %arg1, i32 0, i32 0, i32 0
247 %tmp1 = load volatile i32, i32 addrspace(5)* %arrayidx2, align 8
248 %add3 = add nsw i32 %tmp1, 2
249 store volatile i32 %add3, i32 addrspace(5)* %arrayidx2, align 8
250 store volatile i32 9, i32 addrspace(1)* null, align 4
251 ret void
252}
253
254; Make sure the byval alignment is respected in the call frame setup
255; GCN-LABEL: {{^}}call_void_func_byval_struct_align8_kernel:
256; GCN: s_mov_b32 s33, s7
Matt Arsenault4f3472d2019-07-03 00:30:47 +0000257; GCN-NOT: s_add_u32 s32, s32, 0x800
Matt Arsenaultbb8e64e2018-08-22 11:09:45 +0000258
Matt Arsenault4f3472d2019-07-03 00:30:47 +0000259; GCN: v_mov_b32_e32 [[NINE:v[0-9]+]], 9
260; GCN: buffer_store_dword [[NINE]], off, s[0:3], s33 offset:8
261; GCN: v_mov_b32_e32 [[THIRTEEN:v[0-9]+]], 13
Matt Arsenaultbb8e64e2018-08-22 11:09:45 +0000262; GCN: buffer_store_dword [[THIRTEEN]], off, s[0:3], s33 offset:24
263
Matt Arsenault4f3472d2019-07-03 00:30:47 +0000264
Matt Arsenaultbb8e64e2018-08-22 11:09:45 +0000265; GCN-NOT: s_add_u32 s32, s32, 0x800
Matt Arsenault60c8b8b2019-09-05 23:54:35 +0000266; GCN-DAG: s_add_u32 s32, s33, 0xc00{{$}}
Matt Arsenaultbb8e64e2018-08-22 11:09:45 +0000267
Matt Arsenault4f3472d2019-07-03 00:30:47 +0000268; GCN: buffer_load_dword [[LOAD0:v[0-9]+]], off, s[0:3], s33 offset:8
269; GCN: buffer_load_dword [[LOAD1:v[0-9]+]], off, s[0:3], s33 offset:12
Matt Arsenault4f3472d2019-07-03 00:30:47 +0000270; GCN: buffer_load_dword [[LOAD2:v[0-9]+]], off, s[0:3], s33 offset:16
271; GCN: buffer_load_dword [[LOAD3:v[0-9]+]], off, s[0:3], s33 offset:20
Matt Arsenaultbb8e64e2018-08-22 11:09:45 +0000272
Matt Arsenault4f3472d2019-07-03 00:30:47 +0000273; GCN: buffer_store_dword [[LOAD3]], off, s[0:3], s32 offset:12
274; GCN: buffer_store_dword [[LOAD2]], off, s[0:3], s32 offset:8
275; GCN: buffer_store_dword [[LOAD1]], off, s[0:3], s32 offset:4
276; GCN: buffer_store_dword [[LOAD0]], off, s[0:3], s32{{$}}
277
Matt Arsenaultbb8e64e2018-08-22 11:09:45 +0000278
279; GCN-DAG: buffer_load_dword [[LOAD4:v[0-9]+]], off, s[0:3], s33 offset:24
280; GCN-DAG: buffer_load_dword [[LOAD5:v[0-9]+]], off, s[0:3], s33 offset:28
281; GCN-DAG: buffer_load_dword [[LOAD6:v[0-9]+]], off, s[0:3], s33 offset:32
282; GCN-DAG: buffer_load_dword [[LOAD7:v[0-9]+]], off, s[0:3], s33 offset:36
283
Matt Arsenault34c8b832019-06-05 22:37:50 +0000284; GCN-DAG: buffer_store_dword [[LOAD4]], off, s[0:3], s32 offset:16
285; GCN-DAG: buffer_store_dword [[LOAD5]], off, s[0:3], s32 offset:20
286; GCN-DAG: buffer_store_dword [[LOAD6]], off, s[0:3], s32 offset:24
287; GCN-DAG: buffer_store_dword [[LOAD7]], off, s[0:3], s32 offset:28
Matt Arsenaultbb8e64e2018-08-22 11:09:45 +0000288
289
290; GCN: s_swappc_b64
291; GCN-NOT: s_sub_u32 s32
292; GCN: s_endpgm
293define amdgpu_kernel void @call_void_func_byval_struct_align8_kernel() #1 {
294entry:
295 %arg0 = alloca %struct.ByValStruct, align 8, addrspace(5)
296 %arg1 = alloca %struct.ByValStruct, align 8, addrspace(5)
297 %tmp = bitcast %struct.ByValStruct addrspace(5)* %arg0 to i8 addrspace(5)*
298 call void @llvm.lifetime.start.p5i8(i64 32, i8 addrspace(5)* %tmp)
299 %tmp1 = bitcast %struct.ByValStruct addrspace(5)* %arg1 to i8 addrspace(5)*
300 call void @llvm.lifetime.start.p5i8(i64 32, i8 addrspace(5)* %tmp1)
301 %arrayidx = getelementptr inbounds %struct.ByValStruct, %struct.ByValStruct addrspace(5)* %arg0, i32 0, i32 0, i32 0
302 store volatile i32 9, i32 addrspace(5)* %arrayidx, align 8
303 %arrayidx2 = getelementptr inbounds %struct.ByValStruct, %struct.ByValStruct addrspace(5)* %arg1, i32 0, i32 0, i32 0
304 store volatile i32 13, i32 addrspace(5)* %arrayidx2, align 8
305 call void @void_func_byval_struct_align8(%struct.ByValStruct addrspace(5)* byval nonnull align 8 %arg0, %struct.ByValStruct addrspace(5)* byval nonnull align 8 %arg1)
306 call void @llvm.lifetime.end.p5i8(i64 32, i8 addrspace(5)* %tmp1)
307 call void @llvm.lifetime.end.p5i8(i64 32, i8 addrspace(5)* %tmp)
308 ret void
309}
310
311; GCN-LABEL: {{^}}call_void_func_byval_struct_align8_func:
Matt Arsenault71dfb7e2019-07-08 19:03:38 +0000312; GCN: s_mov_b32 s34, s32
Matt Arsenaultbb8e64e2018-08-22 11:09:45 +0000313; GCN-DAG: s_add_u32 s32, s32, 0xc00{{$}}
314; GCN-DAG: v_writelane_b32
315
316; GCN-DAG: v_mov_b32_e32 [[NINE:v[0-9]+]], 9
317; GCN-DAG: v_mov_b32_e32 [[THIRTEEN:v[0-9]+]], 13
318
Matt Arsenault71dfb7e2019-07-08 19:03:38 +0000319; GCN-DAG: buffer_store_dword [[NINE]], off, s[0:3], s34{{$}}
320; GCN-DAG: buffer_store_dword [[THIRTEEN]], off, s[0:3], s34 offset:16
Matt Arsenaultbb8e64e2018-08-22 11:09:45 +0000321
Matt Arsenault71dfb7e2019-07-08 19:03:38 +0000322; GCN-DAG: buffer_load_dword [[LOAD0:v[0-9]+]], off, s[0:3], s34{{$}}
323; GCN-DAG: buffer_load_dword [[LOAD1:v[0-9]+]], off, s[0:3], s34 offset:4
324; GCN-DAG: buffer_load_dword [[LOAD2:v[0-9]+]], off, s[0:3], s34 offset:8
325; GCN-DAG: buffer_load_dword [[LOAD3:v[0-9]+]], off, s[0:3], s34 offset:12
Matt Arsenaultbb8e64e2018-08-22 11:09:45 +0000326
327; GCN-NOT: s_add_u32 s32, s32, 0x800
328
Matt Arsenault34c8b832019-06-05 22:37:50 +0000329; GCN-DAG: buffer_store_dword [[LOAD0]], off, s[0:3], s32{{$}}
330; GCN-DAG: buffer_store_dword [[LOAD1]], off, s[0:3], s32 offset:4
331; GCN-DAG: buffer_store_dword [[LOAD2]], off, s[0:3], s32 offset:8
332; GCN-DAG: buffer_store_dword [[LOAD3]], off, s[0:3], s32 offset:12
Matt Arsenaultbb8e64e2018-08-22 11:09:45 +0000333
Matt Arsenault71dfb7e2019-07-08 19:03:38 +0000334; GCN: buffer_load_dword [[LOAD5:v[0-9]+]], off, s[0:3], s34 offset:20
335; GCN: buffer_load_dword [[LOAD6:v[0-9]+]], off, s[0:3], s34 offset:24
336; GCN: buffer_load_dword [[LOAD7:v[0-9]+]], off, s[0:3], s34 offset:28
Matt Arsenault60c8b8b2019-09-05 23:54:35 +0000337; GCN: buffer_load_dword [[LOAD4:v[0-9]+]], off, s[0:3], s34 offset:16
338
Matt Arsenault34c8b832019-06-05 22:37:50 +0000339; GCN: s_waitcnt vmcnt(0)
340; GCN-DAG: buffer_store_dword [[LOAD4]], off, s[0:3], s32 offset:16
341; GCN-DAG: buffer_store_dword [[LOAD5]], off, s[0:3], s32 offset:20
342; GCN-DAG: buffer_store_dword [[LOAD6]], off, s[0:3], s32 offset:24
343; GCN-DAG: buffer_store_dword [[LOAD7]], off, s[0:3], s32 offset:28
Matt Arsenaultbb8e64e2018-08-22 11:09:45 +0000344
345; GCN: s_swappc_b64
346; GCN-NOT: v_readlane_b32 s32
347; GCN: v_readlane_b32
348; GCN-NOT: v_readlane_b32 s32
349
350; GCN-NOT: s_sub_u32 s32, s32, 0x800
351
352; GCN: s_sub_u32 s32, s32, 0xc00{{$}}
Matt Arsenault71dfb7e2019-07-08 19:03:38 +0000353; GCN: v_readlane_b32 s34, v
354; GCN: s_waitcnt
Matt Arsenaultbb8e64e2018-08-22 11:09:45 +0000355; GCN-NEXT: s_setpc_b64
356define void @call_void_func_byval_struct_align8_func() #0 {
357entry:
358 %arg0 = alloca %struct.ByValStruct, align 8, addrspace(5)
359 %arg1 = alloca %struct.ByValStruct, align 8, addrspace(5)
360 %tmp = bitcast %struct.ByValStruct addrspace(5)* %arg0 to i8 addrspace(5)*
361 call void @llvm.lifetime.start.p5i8(i64 32, i8 addrspace(5)* %tmp)
362 %tmp1 = bitcast %struct.ByValStruct addrspace(5)* %arg1 to i8 addrspace(5)*
363 call void @llvm.lifetime.start.p5i8(i64 32, i8 addrspace(5)* %tmp1)
364 %arrayidx = getelementptr inbounds %struct.ByValStruct, %struct.ByValStruct addrspace(5)* %arg0, i32 0, i32 0, i32 0
365 store volatile i32 9, i32 addrspace(5)* %arrayidx, align 8
366 %arrayidx2 = getelementptr inbounds %struct.ByValStruct, %struct.ByValStruct addrspace(5)* %arg1, i32 0, i32 0, i32 0
367 store volatile i32 13, i32 addrspace(5)* %arrayidx2, align 8
368 call void @void_func_byval_struct_align8(%struct.ByValStruct addrspace(5)* byval nonnull align 8 %arg0, %struct.ByValStruct addrspace(5)* byval nonnull align 8 %arg1)
369 call void @llvm.lifetime.end.p5i8(i64 32, i8 addrspace(5)* %tmp1)
370 call void @llvm.lifetime.end.p5i8(i64 32, i8 addrspace(5)* %tmp)
371 ret void
372}
373
Matt Arsenaultb62a4eb2017-08-01 19:54:18 +0000374; GCN-LABEL: {{^}}call_void_func_byval_struct_kernel_no_frame_pointer_elim:
375define amdgpu_kernel void @call_void_func_byval_struct_kernel_no_frame_pointer_elim() #2 {
376entry:
Yaxun Liu2a22c5d2018-02-02 16:07:16 +0000377 %arg0 = alloca %struct.ByValStruct, align 4, addrspace(5)
378 %arg1 = alloca %struct.ByValStruct, align 4, addrspace(5)
379 %tmp = bitcast %struct.ByValStruct addrspace(5)* %arg0 to i8 addrspace(5)*
380 call void @llvm.lifetime.start.p5i8(i64 32, i8 addrspace(5)* %tmp)
381 %tmp1 = bitcast %struct.ByValStruct addrspace(5)* %arg1 to i8 addrspace(5)*
382 call void @llvm.lifetime.start.p5i8(i64 32, i8 addrspace(5)* %tmp1)
383 %arrayidx = getelementptr inbounds %struct.ByValStruct, %struct.ByValStruct addrspace(5)* %arg0, i32 0, i32 0, i32 0
384 store volatile i32 9, i32 addrspace(5)* %arrayidx, align 4
385 %arrayidx2 = getelementptr inbounds %struct.ByValStruct, %struct.ByValStruct addrspace(5)* %arg1, i32 0, i32 0, i32 0
386 store volatile i32 13, i32 addrspace(5)* %arrayidx2, align 4
387 call void @void_func_byval_struct(%struct.ByValStruct addrspace(5)* byval nonnull align 4 %arg0, %struct.ByValStruct addrspace(5)* byval nonnull align 4 %arg1)
388 call void @llvm.lifetime.end.p5i8(i64 32, i8 addrspace(5)* %tmp1)
389 call void @llvm.lifetime.end.p5i8(i64 32, i8 addrspace(5)* %tmp)
Matt Arsenaultb62a4eb2017-08-01 19:54:18 +0000390 ret void
391}
392
Matt Arsenault71dfb7e2019-07-08 19:03:38 +0000393declare hidden void @external_void_func_void() #0
Matt Arsenaultb62a4eb2017-08-01 19:54:18 +0000394
Yaxun Liu2a22c5d2018-02-02 16:07:16 +0000395declare void @llvm.lifetime.start.p5i8(i64, i8 addrspace(5)* nocapture) #3
396declare void @llvm.lifetime.end.p5i8(i64, i8 addrspace(5)* nocapture) #3
Matt Arsenaultb62a4eb2017-08-01 19:54:18 +0000397
398attributes #0 = { nounwind }
399attributes #1 = { noinline norecurse nounwind }
Matt Arsenault5dbe4a92019-06-20 17:03:27 +0000400attributes #2 = { nounwind norecurse "frame-pointer"="all" }