@@ -187,5 +187,75 @@ define void @global_gep_store() {
187
187
ret void
188
188
}
189
189
190
+ @g = local_unnamed_addr addrspace (3 ) global [2 x [2 x float ]] zeroinitializer , align 4
191
+ define void @two_index_gep () {
192
+ ; CHECK-LABEL: define void @two_index_gep(
193
+ ; CHECK: [[THREAD_ID:%.*]] = tail call i32 @llvm.dx.thread.id(i32 0)
194
+ ; CHECK-NEXT: [[MUL:%.*]] = mul i32 [[THREAD_ID]], 2
195
+ ; CHECK-NEXT: [[ADD:%.*]] = add i32 1, [[MUL]]
196
+ ; CHECK-NEXT: [[GEP_PTR:%.*]] = getelementptr inbounds nuw [4 x float], ptr addrspace(3) @g.1dim, i32 0, i32 [[ADD]]
197
+ ; CHECK-NEXT: load float, ptr addrspace(3) [[GEP_PTR]], align 4
198
+ ; CHECK-NEXT: ret void
199
+ %1 = tail call i32 @llvm.dx.thread.id (i32 0 )
200
+ %2 = getelementptr inbounds nuw [2 x [2 x float ]], ptr addrspace (3 ) @g , i32 0 , i32 %1 , i32 1
201
+ %3 = load float , ptr addrspace (3 ) %2 , align 4
202
+ ret void
203
+ }
204
+
205
+ define void @two_index_gep_const () {
206
+ ; CHECK-LABEL: define void @two_index_gep_const(
207
+ ; CHECK-NEXT: [[GEP_PTR:%.*]] = getelementptr inbounds nuw [4 x float], ptr addrspace(3) @g.1dim, i32 0, i32 3
208
+ ; CHECK-NEXT: load float, ptr addrspace(3) [[GEP_PTR]], align 4
209
+ ; CHECK-NEXT: ret void
210
+ %1 = getelementptr inbounds nuw [2 x [2 x float ]], ptr addrspace (3 ) @g , i32 0 , i32 1 , i32 1
211
+ %3 = load float , ptr addrspace (3 ) %1 , align 4
212
+ ret void
213
+ }
214
+
215
+ define void @gep_4d_index_test () {
216
+ ; CHECK-LABEL: gep_4d_index_test
217
+ ; CHECK: [[a:%.*]] = alloca [16 x i32], align 4
218
+ ; CHECK-NEXT: getelementptr inbounds [16 x i32], ptr %.1dim, i32 0, i32 1
219
+ ; CHECK-NEXT: getelementptr inbounds [16 x i32], ptr %.1dim, i32 0, i32 3
220
+ ; CHECK-NEXT: getelementptr inbounds [16 x i32], ptr %.1dim, i32 0, i32 7
221
+ ; CHECK-NEXT: getelementptr inbounds [16 x i32], ptr %.1dim, i32 0, i32 15
222
+ ; CHECK-NEXT: ret void
223
+ %1 = alloca [2x[2 x[2 x [2 x i32 ]]]], align 4
224
+ %2 = getelementptr inbounds [2 x [2 x[2 x [2 x i32 ]]]], [2 x [2 x [2 x [2 x i32 ]]]]* %1 , i32 0 , i32 0 , i32 0 , i32 0 , i32 1
225
+ %3 = getelementptr inbounds [2 x [2 x[2 x [2 x i32 ]]]], [2 x [2 x [2 x [2 x i32 ]]]]* %1 , i32 0 , i32 0 , i32 0 , i32 1 , i32 1
226
+ %4 = getelementptr inbounds [2 x [2 x[2 x [2 x i32 ]]]], [2 x [2 x [2 x [2 x i32 ]]]]* %1 , i32 0 , i32 0 , i32 1 , i32 1 , i32 1
227
+ %5 = getelementptr inbounds [2 x [2 x[2 x [2 x i32 ]]]], [2 x [2 x [2 x [2 x i32 ]]]]* %1 , i32 0 , i32 1 , i32 1 , i32 1 , i32 1
228
+ ret void
229
+ }
230
+
231
+ define void @gep_4d_index_and_gep_chain_mixed () {
232
+ ; CHECK-LABEL: gep_4d_index_and_gep_chain_mixed
233
+ ; CHECK-NEXT: [[ALLOCA:%.*]] = alloca [16 x i32], align 4
234
+ ; CHECK-COUNT-16: getelementptr inbounds [16 x i32], ptr [[ALLOCA]], i32 0, i32 {{[0-9]|1[0-5]}}
235
+ ; CHECK-NEXT: ret void
236
+ %1 = alloca [2x[2 x[2 x [2 x i32 ]]]], align 4
237
+ %a4d0_0 = getelementptr inbounds [2 x [2 x [2 x [2 x i32 ]]]], [2 x [2 x[2 x [2 x i32 ]]]]* %1 , i32 0 , i32 0 , i32 0
238
+ %a2d0_0 = getelementptr inbounds [2 x [2 x i32 ]], [2 x [2 x i32 ]]* %a4d0_0 , i32 0 , i32 0 , i32 0
239
+ %a2d0_1 = getelementptr inbounds [2 x [2 x i32 ]], [2 x [2 x i32 ]]* %a4d0_0 , i32 0 , i32 0 , i32 1
240
+ %a2d1_0 = getelementptr inbounds [2 x [2 x i32 ]], [2 x [2 x i32 ]]* %a4d0_0 , i32 0 , i32 1 , i32 0
241
+ %a2d1_1 = getelementptr inbounds [2 x [2 x i32 ]], [2 x [2 x i32 ]]* %a4d0_0 , i32 0 , i32 1 , i32 1
242
+ %b4d0_1 = getelementptr inbounds [2 x [2 x [2 x [2 x i32 ]]]], [2 x [2 x [2 x [2 x i32 ]]]]* %1 , i32 0 , i32 0 , i32 1
243
+ %b2d0_0 = getelementptr inbounds [2 x [2 x i32 ]], [2 x [2 x i32 ]]* %b4d0_1 , i32 0 , i32 0 , i32 0
244
+ %b2d0_1 = getelementptr inbounds [2 x [2 x i32 ]], [2 x [2 x i32 ]]* %b4d0_1 , i32 0 , i32 0 , i32 1
245
+ %b2d1_0 = getelementptr inbounds [2 x [2 x i32 ]], [2 x [2 x i32 ]]* %b4d0_1 , i32 0 , i32 1 , i32 0
246
+ %b2d1_1 = getelementptr inbounds [2 x [2 x i32 ]], [2 x [2 x i32 ]]* %b4d0_1 , i32 0 , i32 1 , i32 1
247
+ %c4d1_0 = getelementptr inbounds [2 x [2 x [2 x [2 x i32 ]]]], [2 x [2 x [2 x [2 x i32 ]]]]* %1 , i32 0 , i32 1 , i32 0
248
+ %c2d0_0 = getelementptr inbounds [2 x [2 x i32 ]], [2 x [2 x i32 ]]* %c4d1_0 , i32 0 , i32 0 , i32 0
249
+ %c2d0_1 = getelementptr inbounds [2 x [2 x i32 ]], [2 x [2 x i32 ]]* %c4d1_0 , i32 0 , i32 0 , i32 1
250
+ %c2d1_0 = getelementptr inbounds [2 x [2 x i32 ]], [2 x [2 x i32 ]]* %c4d1_0 , i32 0 , i32 1 , i32 0
251
+ %c2d1_1 = getelementptr inbounds [2 x [2 x i32 ]], [2 x [2 x i32 ]]* %c4d1_0 , i32 0 , i32 1 , i32 1
252
+ %g4d1_1 = getelementptr inbounds [2 x [2 x [2 x [2 x i32 ]]]], [2 x [2 x [2 x [2 x i32 ]]]]* %1 , i32 0 , i32 1 , i32 1
253
+ %g2d0_0 = getelementptr inbounds [2 x [2 x i32 ]], [2 x [2 x i32 ]]* %g4d1_1 , i32 0 , i32 0 , i32 0
254
+ %g2d0_1 = getelementptr inbounds [2 x [2 x i32 ]], [2 x [2 x i32 ]]* %g4d1_1 , i32 0 , i32 0 , i32 1
255
+ %g2d1_0 = getelementptr inbounds [2 x [2 x i32 ]], [2 x [2 x i32 ]]* %g4d1_1 , i32 0 , i32 1 , i32 0
256
+ %g2d1_1 = getelementptr inbounds [2 x [2 x i32 ]], [2 x [2 x i32 ]]* %g4d1_1 , i32 0 , i32 1 , i32 1
257
+ ret void
258
+ }
259
+
190
260
; Make sure we don't try to walk the body of a function declaration.
191
261
declare void @opaque_function ()
0 commit comments