blob: c0f86da2148ebfbe83f578ec4ad48138670fba84 [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
30; GCN-LABEL: {{^}}void_func_byval_struct_non_leaf:
31; GCN: s_mov_b32 s5, s32
Matt Arsenault3d59e382019-05-24 18:18:51 +000032; GCN: s_add_u32 s32, s32, 0xc00{{$}}
Matt Arsenault8e8f8f42017-08-02 01:52:45 +000033; GCN-DAG: buffer_store_dword v32
34; GCN-DAG: buffer_store_dword v33
Matt Arsenaultecb43ef2017-09-13 23:47:01 +000035; GCN-NOT: v_writelane_b32 v{{[0-9]+}}, s32
Tim Renouf2a99fa22018-02-28 19:10:32 +000036; GCN-DAG: v_writelane_b32
Matt Arsenault34c8b832019-06-05 22:37:50 +000037; GCN-DAG: buffer_load_dword [[LOAD0:v[0-9]+]], off, s[0:3], s5{{$}}
Tim Renouf2a99fa22018-02-28 19:10:32 +000038; GCN-DAG: v_add_{{[iu]}}32_e32 [[ADD0:v[0-9]+]], vcc, 1, [[LOAD0]]
Matt Arsenault34c8b832019-06-05 22:37:50 +000039; GCN-DAG: buffer_store_dword [[ADD0]], off, s[0:3], s5{{$}}
Matt Arsenaultb62a4eb2017-08-01 19:54:18 +000040
Matt Arsenault34c8b832019-06-05 22:37:50 +000041; GCN-DAG: buffer_load_dword [[LOAD1:v[0-9]+]], off, s[0:3], s5 offset:16{{$}}
Tim Renouf2a99fa22018-02-28 19:10:32 +000042; GCN-DAG: v_add_{{[iu]}}32_e32 [[ADD1:v[0-9]+]], vcc, 2, [[LOAD1]]
Matt Arsenaultb62a4eb2017-08-01 19:54:18 +000043
44; GCN: s_swappc_b64
45
Matt Arsenault34c8b832019-06-05 22:37:50 +000046; GCN: buffer_store_dword [[ADD1]], off, s[0:3], s5 offset:16{{$}}
Matt Arsenaultb62a4eb2017-08-01 19:54:18 +000047
48; GCN: v_readlane_b32
Matt Arsenaultecb43ef2017-09-13 23:47:01 +000049; GCN-NOT: v_readlane_b32 s32
Matt Arsenaultdcdf3dd2018-11-26 17:17:07 +000050; GCN-DAG: buffer_load_dword v32,
51; GCN-DAG: buffer_load_dword v33,
Matt Arsenaultffb132e2018-03-29 20:22:04 +000052; GCN: s_sub_u32 s32, s32, 0xc00{{$}}
Matt Arsenaultb62a4eb2017-08-01 19:54:18 +000053; GCN: s_setpc_b64
Yaxun Liu2a22c5d2018-02-02 16:07:16 +000054define 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 +000055entry:
Yaxun Liu2a22c5d2018-02-02 16:07:16 +000056 %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
Matt Arsenaultb62a4eb2017-08-01 19:54:18 +000058 %add = add nsw i32 %tmp, 1
Yaxun Liu2a22c5d2018-02-02 16:07:16 +000059 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
Matt Arsenaultb62a4eb2017-08-01 19:54:18 +000062 %add3 = add nsw i32 %tmp1, 2
63 call void @external_void_func_void()
Yaxun Liu2a22c5d2018-02-02 16:07:16 +000064 store volatile i32 %add3, i32 addrspace(5)* %arrayidx2, align 4
Matt Arsenaultb62a4eb2017-08-01 19:54:18 +000065 store volatile i32 9, i32 addrspace(1)* null, align 4
66 ret void
67}
68
69; GCN-LABEL: {{^}}call_void_func_byval_struct_func:
70; GCN: s_mov_b32 s5, s32
Matt Arsenaultecb43ef2017-09-13 23:47:01 +000071; GCN-DAG: s_add_u32 s32, s32, 0xc00{{$}}
72; GCN-DAG: v_writelane_b32
Matt Arsenaultb62a4eb2017-08-01 19:54:18 +000073
Matt Arsenaultb62a4eb2017-08-01 19:54:18 +000074; GCN-DAG: v_mov_b32_e32 [[NINE:v[0-9]+]], 9
75; GCN-DAG: v_mov_b32_e32 [[THIRTEEN:v[0-9]+]], 13
76
Matt Arsenault34c8b832019-06-05 22:37:50 +000077; GCN-DAG: buffer_store_dword [[NINE]], off, s[0:3], s5{{$}}
78; GCN-DAG: buffer_store_dword [[THIRTEEN]], off, s[0:3], s5 offset:16
Matt Arsenaultb62a4eb2017-08-01 19:54:18 +000079
Matt Arsenault34c8b832019-06-05 22:37:50 +000080; GCN-DAG: buffer_load_dword [[LOAD0:v[0-9]+]], off, s[0:3], s5{{$}}
81; GCN-DAG: buffer_load_dword [[LOAD1:v[0-9]+]], off, s[0:3], s5 offset:4
82; GCN-DAG: buffer_load_dword [[LOAD2:v[0-9]+]], off, s[0:3], s5 offset:8
83; GCN-DAG: buffer_load_dword [[LOAD3:v[0-9]+]], off, s[0:3], s5 offset:12
Matt Arsenault99e6f4d2019-05-16 15:10:27 +000084
85; GCN-NOT: s_add_u32 s32, s32, 0x800
86
87
Matt Arsenault34c8b832019-06-05 22:37:50 +000088; GCN-DAG: buffer_store_dword [[LOAD0]], off, s[0:3], s32{{$}}
89; GCN-DAG: buffer_store_dword [[LOAD1]], off, s[0:3], s32 offset:4
90; GCN-DAG: buffer_store_dword [[LOAD2]], off, s[0:3], s32 offset:8
91; GCN-DAG: buffer_store_dword [[LOAD3]], off, s[0:3], s32 offset:12
Matt Arsenault99e6f4d2019-05-16 15:10:27 +000092
Matt Arsenault34c8b832019-06-05 22:37:50 +000093; GCN: buffer_load_dword [[LOAD4:v[0-9]+]], off, s[0:3], s5 offset:16
94; GCN: buffer_load_dword [[LOAD5:v[0-9]+]], off, s[0:3], s5 offset:20
95; GCN: buffer_load_dword [[LOAD6:v[0-9]+]], off, s[0:3], s5 offset:24
96; GCN: buffer_load_dword [[LOAD7:v[0-9]+]], off, s[0:3], s5 offset:28
Matt Arsenaultf4320112018-09-24 13:18:15 +000097
Matt Arsenault34c8b832019-06-05 22:37:50 +000098; GCN-DAG: buffer_store_dword [[LOAD4]], off, s[0:3], s32 offset:16
99; GCN-DAG: buffer_store_dword [[LOAD5]], off, s[0:3], s32 offset:20
100; GCN-DAG: buffer_store_dword [[LOAD6]], off, s[0:3], s32 offset:24
101; GCN-DAG: buffer_store_dword [[LOAD7]], off, s[0:3], s32 offset:28
Matt Arsenaultf4320112018-09-24 13:18:15 +0000102
Matt Arsenaultb62a4eb2017-08-01 19:54:18 +0000103; GCN: s_swappc_b64
Matt Arsenaultecb43ef2017-09-13 23:47:01 +0000104; GCN-NOT: v_readlane_b32 s32
Matt Arsenaultb62a4eb2017-08-01 19:54:18 +0000105; GCN: v_readlane_b32
Matt Arsenaultecb43ef2017-09-13 23:47:01 +0000106; GCN-NOT: v_readlane_b32 s32
Matt Arsenaultb62a4eb2017-08-01 19:54:18 +0000107
Matt Arsenaultdefe3712017-09-14 17:37:40 +0000108; GCN-NOT: s_sub_u32 s32, s32, 0x800
109
110; GCN: s_sub_u32 s32, s32, 0xc00{{$}}
Matt Arsenaultb62a4eb2017-08-01 19:54:18 +0000111; GCN-NEXT: s_waitcnt
112; GCN-NEXT: s_setpc_b64
Matt Arsenaultbb8e64e2018-08-22 11:09:45 +0000113define void @call_void_func_byval_struct_func() #1 {
Matt Arsenaultb62a4eb2017-08-01 19:54:18 +0000114entry:
Yaxun Liu2a22c5d2018-02-02 16:07:16 +0000115 %arg0 = alloca %struct.ByValStruct, align 4, addrspace(5)
116 %arg1 = alloca %struct.ByValStruct, align 4, addrspace(5)
117 %tmp = bitcast %struct.ByValStruct addrspace(5)* %arg0 to i8 addrspace(5)*
118 call void @llvm.lifetime.start.p5i8(i64 32, i8 addrspace(5)* %tmp)
119 %tmp1 = bitcast %struct.ByValStruct addrspace(5)* %arg1 to i8 addrspace(5)*
120 call void @llvm.lifetime.start.p5i8(i64 32, i8 addrspace(5)* %tmp1)
121 %arrayidx = getelementptr inbounds %struct.ByValStruct, %struct.ByValStruct addrspace(5)* %arg0, i32 0, i32 0, i32 0
122 store volatile i32 9, i32 addrspace(5)* %arrayidx, align 4
123 %arrayidx2 = getelementptr inbounds %struct.ByValStruct, %struct.ByValStruct addrspace(5)* %arg1, i32 0, i32 0, i32 0
124 store volatile i32 13, i32 addrspace(5)* %arrayidx2, align 4
125 call void @void_func_byval_struct(%struct.ByValStruct addrspace(5)* byval nonnull align 4 %arg0, %struct.ByValStruct addrspace(5)* byval nonnull align 4 %arg1)
126 call void @llvm.lifetime.end.p5i8(i64 32, i8 addrspace(5)* %tmp1)
127 call void @llvm.lifetime.end.p5i8(i64 32, i8 addrspace(5)* %tmp)
Matt Arsenaultb62a4eb2017-08-01 19:54:18 +0000128 ret void
129}
130
131; GCN-LABEL: {{^}}call_void_func_byval_struct_kernel:
Geoff Berry4e38e022017-08-17 04:04:11 +0000132; GCN: s_mov_b32 s33, s7
Matt Arsenaultffb132e2018-03-29 20:22:04 +0000133; GCN: s_add_u32 s32, s33, 0xc00{{$}}
Matt Arsenaultb62a4eb2017-08-01 19:54:18 +0000134
135; GCN-DAG: v_mov_b32_e32 [[NINE:v[0-9]+]], 9
136; GCN-DAG: v_mov_b32_e32 [[THIRTEEN:v[0-9]+]], 13
Geoff Berry4e38e022017-08-17 04:04:11 +0000137; GCN-DAG: buffer_store_dword [[NINE]], off, s[0:3], s33 offset:8
138; GCN: buffer_store_dword [[THIRTEEN]], off, s[0:3], s33 offset:24
Matt Arsenaultb62a4eb2017-08-01 19:54:18 +0000139
Matt Arsenaultdefe3712017-09-14 17:37:40 +0000140; GCN-NOT: s_add_u32 s32, s32, 0x800
Matt Arsenaultb62a4eb2017-08-01 19:54:18 +0000141
Geoff Berry4e38e022017-08-17 04:04:11 +0000142; GCN-DAG: buffer_load_dword [[LOAD0:v[0-9]+]], off, s[0:3], s33 offset:8
143; GCN-DAG: buffer_load_dword [[LOAD1:v[0-9]+]], off, s[0:3], s33 offset:12
144; GCN-DAG: buffer_load_dword [[LOAD2:v[0-9]+]], off, s[0:3], s33 offset:16
145; GCN-DAG: buffer_load_dword [[LOAD3:v[0-9]+]], off, s[0:3], s33 offset:20
Matt Arsenaultb62a4eb2017-08-01 19:54:18 +0000146
Matt Arsenault34c8b832019-06-05 22:37:50 +0000147; GCN-DAG: buffer_store_dword [[LOAD0]], off, s[0:3], s32{{$}}
148; GCN-DAG: buffer_store_dword [[LOAD1]], off, s[0:3], s32 offset:4
149; GCN-DAG: buffer_store_dword [[LOAD2]], off, s[0:3], s32 offset:8
150; GCN-DAG: buffer_store_dword [[LOAD3]], off, s[0:3], s32 offset:12
Matt Arsenaultb62a4eb2017-08-01 19:54:18 +0000151
Matt Arsenaultacc5e822017-08-02 00:43:42 +0000152; GCN-DAG: buffer_load_dword [[LOAD4:v[0-9]+]], off, s[0:3], s33 offset:24
153; GCN-DAG: buffer_load_dword [[LOAD5:v[0-9]+]], off, s[0:3], s33 offset:28
154; GCN-DAG: buffer_load_dword [[LOAD6:v[0-9]+]], off, s[0:3], s33 offset:32
155; GCN-DAG: buffer_load_dword [[LOAD7:v[0-9]+]], off, s[0:3], s33 offset:36
Matt Arsenaultb62a4eb2017-08-01 19:54:18 +0000156
Matt Arsenault34c8b832019-06-05 22:37:50 +0000157; GCN-DAG: buffer_store_dword [[LOAD4]], off, s[0:3], s32 offset:16
158; GCN-DAG: buffer_store_dword [[LOAD5]], off, s[0:3], s32 offset:20
159; GCN-DAG: buffer_store_dword [[LOAD6]], off, s[0:3], s32 offset:24
160; GCN-DAG: buffer_store_dword [[LOAD7]], off, s[0:3], s32 offset:28
Matt Arsenaultb62a4eb2017-08-01 19:54:18 +0000161
162
163; GCN: s_swappc_b64
Matt Arsenaultdefe3712017-09-14 17:37:40 +0000164; GCN-NOT: s_sub_u32 s32
165; GCN: s_endpgm
Matt Arsenaultbb8e64e2018-08-22 11:09:45 +0000166define amdgpu_kernel void @call_void_func_byval_struct_kernel() #1 {
Matt Arsenaultb62a4eb2017-08-01 19:54:18 +0000167entry:
Yaxun Liu2a22c5d2018-02-02 16:07:16 +0000168 %arg0 = alloca %struct.ByValStruct, align 4, addrspace(5)
169 %arg1 = alloca %struct.ByValStruct, align 4, addrspace(5)
170 %tmp = bitcast %struct.ByValStruct addrspace(5)* %arg0 to i8 addrspace(5)*
171 call void @llvm.lifetime.start.p5i8(i64 32, i8 addrspace(5)* %tmp)
172 %tmp1 = bitcast %struct.ByValStruct addrspace(5)* %arg1 to i8 addrspace(5)*
173 call void @llvm.lifetime.start.p5i8(i64 32, i8 addrspace(5)* %tmp1)
174 %arrayidx = getelementptr inbounds %struct.ByValStruct, %struct.ByValStruct addrspace(5)* %arg0, i32 0, i32 0, i32 0
175 store volatile i32 9, i32 addrspace(5)* %arrayidx, align 4
176 %arrayidx2 = getelementptr inbounds %struct.ByValStruct, %struct.ByValStruct addrspace(5)* %arg1, i32 0, i32 0, i32 0
177 store volatile i32 13, i32 addrspace(5)* %arrayidx2, align 4
178 call void @void_func_byval_struct(%struct.ByValStruct addrspace(5)* byval nonnull align 4 %arg0, %struct.ByValStruct addrspace(5)* byval nonnull align 4 %arg1)
179 call void @llvm.lifetime.end.p5i8(i64 32, i8 addrspace(5)* %tmp1)
180 call void @llvm.lifetime.end.p5i8(i64 32, i8 addrspace(5)* %tmp)
Matt Arsenaultb62a4eb2017-08-01 19:54:18 +0000181 ret void
182}
183
Matt Arsenaultbb8e64e2018-08-22 11:09:45 +0000184; GCN-LABEL: {{^}}void_func_byval_struct_align8:
Matt Arsenault34c8b832019-06-05 22:37:50 +0000185; GCN: buffer_load_dword [[LOAD0:v[0-9]+]], off, s[0:3], s32{{$}}
Matt Arsenaultbb8e64e2018-08-22 11:09:45 +0000186; GCN-NOT: s32
Matt Arsenault34c8b832019-06-05 22:37:50 +0000187; GCN: buffer_store_dword [[LOAD0]], off, s[0:3], s32{{$}}
Matt Arsenaultbb8e64e2018-08-22 11:09:45 +0000188; GCN-NOT: s32
189
Matt Arsenault34c8b832019-06-05 22:37:50 +0000190; GCN: buffer_load_dword [[LOAD1:v[0-9]+]], off, s[0:3], s32 offset:16{{$}}
Matt Arsenaultbb8e64e2018-08-22 11:09:45 +0000191; GCN-NOT: s32
Matt Arsenault34c8b832019-06-05 22:37:50 +0000192; GCN: buffer_store_dword [[LOAD1]], off, s[0:3], s32 offset:16{{$}}
Matt Arsenaultbb8e64e2018-08-22 11:09:45 +0000193; GCN-NOT: s32
Scott Linderafc24ed2019-02-01 21:23:28 +0000194define 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 +0000195entry:
196 %arrayidx = getelementptr inbounds %struct.ByValStruct, %struct.ByValStruct addrspace(5)* %arg0, i32 0, i32 0, i32 0
197 %tmp = load volatile i32, i32 addrspace(5)* %arrayidx, align 8
198 %add = add nsw i32 %tmp, 1
199 store volatile i32 %add, i32 addrspace(5)* %arrayidx, align 8
200 %arrayidx2 = getelementptr inbounds %struct.ByValStruct, %struct.ByValStruct addrspace(5)* %arg1, i32 0, i32 0, i32 0
201 %tmp1 = load volatile i32, i32 addrspace(5)* %arrayidx2, align 8
202 %add3 = add nsw i32 %tmp1, 2
203 store volatile i32 %add3, i32 addrspace(5)* %arrayidx2, align 8
204 store volatile i32 9, i32 addrspace(1)* null, align 4
205 ret void
206}
207
208; Make sure the byval alignment is respected in the call frame setup
209; GCN-LABEL: {{^}}call_void_func_byval_struct_align8_kernel:
210; GCN: s_mov_b32 s33, s7
211; GCN: s_add_u32 s32, s33, 0xc00{{$}}
212
213; GCN-DAG: v_mov_b32_e32 [[NINE:v[0-9]+]], 9
214; GCN-DAG: v_mov_b32_e32 [[THIRTEEN:v[0-9]+]], 13
215; GCN-DAG: buffer_store_dword [[NINE]], off, s[0:3], s33 offset:8
216; GCN: buffer_store_dword [[THIRTEEN]], off, s[0:3], s33 offset:24
217
218; GCN-NOT: s_add_u32 s32, s32, 0x800
219
220; GCN-DAG: buffer_load_dword [[LOAD0:v[0-9]+]], off, s[0:3], s33 offset:8
221; GCN-DAG: buffer_load_dword [[LOAD1:v[0-9]+]], off, s[0:3], s33 offset:12
222; GCN-DAG: buffer_load_dword [[LOAD2:v[0-9]+]], off, s[0:3], s33 offset:16
223; GCN-DAG: buffer_load_dword [[LOAD3:v[0-9]+]], off, s[0:3], s33 offset:20
224
Matt Arsenault34c8b832019-06-05 22:37:50 +0000225; GCN-DAG: buffer_store_dword [[LOAD0]], off, s[0:3], s32{{$}}
226; GCN-DAG: buffer_store_dword [[LOAD1]], off, s[0:3], s32 offset:4
227; GCN-DAG: buffer_store_dword [[LOAD2]], off, s[0:3], s32 offset:8
228; GCN-DAG: buffer_store_dword [[LOAD3]], off, s[0:3], s32 offset:12
Matt Arsenaultbb8e64e2018-08-22 11:09:45 +0000229
230; GCN-DAG: buffer_load_dword [[LOAD4:v[0-9]+]], off, s[0:3], s33 offset:24
231; GCN-DAG: buffer_load_dword [[LOAD5:v[0-9]+]], off, s[0:3], s33 offset:28
232; GCN-DAG: buffer_load_dword [[LOAD6:v[0-9]+]], off, s[0:3], s33 offset:32
233; GCN-DAG: buffer_load_dword [[LOAD7:v[0-9]+]], off, s[0:3], s33 offset:36
234
Matt Arsenault34c8b832019-06-05 22:37:50 +0000235; GCN-DAG: buffer_store_dword [[LOAD4]], off, s[0:3], s32 offset:16
236; GCN-DAG: buffer_store_dword [[LOAD5]], off, s[0:3], s32 offset:20
237; GCN-DAG: buffer_store_dword [[LOAD6]], off, s[0:3], s32 offset:24
238; GCN-DAG: buffer_store_dword [[LOAD7]], off, s[0:3], s32 offset:28
Matt Arsenaultbb8e64e2018-08-22 11:09:45 +0000239
240
241; GCN: s_swappc_b64
242; GCN-NOT: s_sub_u32 s32
243; GCN: s_endpgm
244define amdgpu_kernel void @call_void_func_byval_struct_align8_kernel() #1 {
245entry:
246 %arg0 = alloca %struct.ByValStruct, align 8, addrspace(5)
247 %arg1 = alloca %struct.ByValStruct, align 8, addrspace(5)
248 %tmp = bitcast %struct.ByValStruct addrspace(5)* %arg0 to i8 addrspace(5)*
249 call void @llvm.lifetime.start.p5i8(i64 32, i8 addrspace(5)* %tmp)
250 %tmp1 = bitcast %struct.ByValStruct addrspace(5)* %arg1 to i8 addrspace(5)*
251 call void @llvm.lifetime.start.p5i8(i64 32, i8 addrspace(5)* %tmp1)
252 %arrayidx = getelementptr inbounds %struct.ByValStruct, %struct.ByValStruct addrspace(5)* %arg0, i32 0, i32 0, i32 0
253 store volatile i32 9, i32 addrspace(5)* %arrayidx, align 8
254 %arrayidx2 = getelementptr inbounds %struct.ByValStruct, %struct.ByValStruct addrspace(5)* %arg1, i32 0, i32 0, i32 0
255 store volatile i32 13, i32 addrspace(5)* %arrayidx2, align 8
256 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)
257 call void @llvm.lifetime.end.p5i8(i64 32, i8 addrspace(5)* %tmp1)
258 call void @llvm.lifetime.end.p5i8(i64 32, i8 addrspace(5)* %tmp)
259 ret void
260}
261
262; GCN-LABEL: {{^}}call_void_func_byval_struct_align8_func:
263; GCN: s_mov_b32 s5, s32
264; GCN-DAG: s_add_u32 s32, s32, 0xc00{{$}}
265; GCN-DAG: v_writelane_b32
266
267; GCN-DAG: v_mov_b32_e32 [[NINE:v[0-9]+]], 9
268; GCN-DAG: v_mov_b32_e32 [[THIRTEEN:v[0-9]+]], 13
269
Matt Arsenault34c8b832019-06-05 22:37:50 +0000270; GCN-DAG: buffer_store_dword [[NINE]], off, s[0:3], s5{{$}}
271; GCN-DAG: buffer_store_dword [[THIRTEEN]], off, s[0:3], s5 offset:16
Matt Arsenaultbb8e64e2018-08-22 11:09:45 +0000272
Matt Arsenault34c8b832019-06-05 22:37:50 +0000273; GCN-DAG: buffer_load_dword [[LOAD0:v[0-9]+]], off, s[0:3], s5{{$}}
274; GCN-DAG: buffer_load_dword [[LOAD1:v[0-9]+]], off, s[0:3], s5 offset:4
275; GCN-DAG: buffer_load_dword [[LOAD2:v[0-9]+]], off, s[0:3], s5 offset:8
276; GCN-DAG: buffer_load_dword [[LOAD3:v[0-9]+]], off, s[0:3], s5 offset:12
Matt Arsenaultbb8e64e2018-08-22 11:09:45 +0000277
278; GCN-NOT: s_add_u32 s32, s32, 0x800
279
Matt Arsenault34c8b832019-06-05 22:37:50 +0000280; GCN-DAG: buffer_store_dword [[LOAD0]], off, s[0:3], s32{{$}}
281; GCN-DAG: buffer_store_dword [[LOAD1]], off, s[0:3], s32 offset:4
282; GCN-DAG: buffer_store_dword [[LOAD2]], off, s[0:3], s32 offset:8
283; GCN-DAG: buffer_store_dword [[LOAD3]], off, s[0:3], s32 offset:12
Matt Arsenaultbb8e64e2018-08-22 11:09:45 +0000284
Matt Arsenault34c8b832019-06-05 22:37:50 +0000285; GCN: buffer_load_dword [[LOAD4:v[0-9]+]], off, s[0:3], s5 offset:16
286; GCN: buffer_load_dword [[LOAD5:v[0-9]+]], off, s[0:3], s5 offset:20
287; GCN: buffer_load_dword [[LOAD6:v[0-9]+]], off, s[0:3], s5 offset:24
288; GCN: buffer_load_dword [[LOAD7:v[0-9]+]], off, s[0:3], s5 offset:28
289; GCN: s_waitcnt vmcnt(0)
290; GCN-DAG: buffer_store_dword [[LOAD4]], off, s[0:3], s32 offset:16
291; GCN-DAG: buffer_store_dword [[LOAD5]], off, s[0:3], s32 offset:20
292; GCN-DAG: buffer_store_dword [[LOAD6]], off, s[0:3], s32 offset:24
293; GCN-DAG: buffer_store_dword [[LOAD7]], off, s[0:3], s32 offset:28
Matt Arsenaultbb8e64e2018-08-22 11:09:45 +0000294
295; GCN: s_swappc_b64
296; GCN-NOT: v_readlane_b32 s32
297; GCN: v_readlane_b32
298; GCN-NOT: v_readlane_b32 s32
299
300; GCN-NOT: s_sub_u32 s32, s32, 0x800
301
302; GCN: s_sub_u32 s32, s32, 0xc00{{$}}
303; GCN-NEXT: s_waitcnt
304; GCN-NEXT: s_setpc_b64
305define void @call_void_func_byval_struct_align8_func() #0 {
306entry:
307 %arg0 = alloca %struct.ByValStruct, align 8, addrspace(5)
308 %arg1 = alloca %struct.ByValStruct, align 8, addrspace(5)
309 %tmp = bitcast %struct.ByValStruct addrspace(5)* %arg0 to i8 addrspace(5)*
310 call void @llvm.lifetime.start.p5i8(i64 32, i8 addrspace(5)* %tmp)
311 %tmp1 = bitcast %struct.ByValStruct addrspace(5)* %arg1 to i8 addrspace(5)*
312 call void @llvm.lifetime.start.p5i8(i64 32, i8 addrspace(5)* %tmp1)
313 %arrayidx = getelementptr inbounds %struct.ByValStruct, %struct.ByValStruct addrspace(5)* %arg0, i32 0, i32 0, i32 0
314 store volatile i32 9, i32 addrspace(5)* %arrayidx, align 8
315 %arrayidx2 = getelementptr inbounds %struct.ByValStruct, %struct.ByValStruct addrspace(5)* %arg1, i32 0, i32 0, i32 0
316 store volatile i32 13, i32 addrspace(5)* %arrayidx2, align 8
317 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)
318 call void @llvm.lifetime.end.p5i8(i64 32, i8 addrspace(5)* %tmp1)
319 call void @llvm.lifetime.end.p5i8(i64 32, i8 addrspace(5)* %tmp)
320 ret void
321}
322
Matt Arsenaultb62a4eb2017-08-01 19:54:18 +0000323; GCN-LABEL: {{^}}call_void_func_byval_struct_kernel_no_frame_pointer_elim:
324define amdgpu_kernel void @call_void_func_byval_struct_kernel_no_frame_pointer_elim() #2 {
325entry:
Yaxun Liu2a22c5d2018-02-02 16:07:16 +0000326 %arg0 = alloca %struct.ByValStruct, align 4, addrspace(5)
327 %arg1 = alloca %struct.ByValStruct, align 4, addrspace(5)
328 %tmp = bitcast %struct.ByValStruct addrspace(5)* %arg0 to i8 addrspace(5)*
329 call void @llvm.lifetime.start.p5i8(i64 32, i8 addrspace(5)* %tmp)
330 %tmp1 = bitcast %struct.ByValStruct addrspace(5)* %arg1 to i8 addrspace(5)*
331 call void @llvm.lifetime.start.p5i8(i64 32, i8 addrspace(5)* %tmp1)
332 %arrayidx = getelementptr inbounds %struct.ByValStruct, %struct.ByValStruct addrspace(5)* %arg0, i32 0, i32 0, i32 0
333 store volatile i32 9, i32 addrspace(5)* %arrayidx, align 4
334 %arrayidx2 = getelementptr inbounds %struct.ByValStruct, %struct.ByValStruct addrspace(5)* %arg1, i32 0, i32 0, i32 0
335 store volatile i32 13, i32 addrspace(5)* %arrayidx2, align 4
336 call void @void_func_byval_struct(%struct.ByValStruct addrspace(5)* byval nonnull align 4 %arg0, %struct.ByValStruct addrspace(5)* byval nonnull align 4 %arg1)
337 call void @llvm.lifetime.end.p5i8(i64 32, i8 addrspace(5)* %tmp1)
338 call void @llvm.lifetime.end.p5i8(i64 32, i8 addrspace(5)* %tmp)
Matt Arsenaultb62a4eb2017-08-01 19:54:18 +0000339 ret void
340}
341
342declare void @external_void_func_void() #0
343
Yaxun Liu2a22c5d2018-02-02 16:07:16 +0000344declare void @llvm.lifetime.start.p5i8(i64, i8 addrspace(5)* nocapture) #3
345declare void @llvm.lifetime.end.p5i8(i64, i8 addrspace(5)* nocapture) #3
Matt Arsenaultb62a4eb2017-08-01 19:54:18 +0000346
347attributes #0 = { nounwind }
348attributes #1 = { noinline norecurse nounwind }
349attributes #2 = { nounwind norecurse "no-frame-pointer-elim"="true" }