Skip to content

Commit f583610

Browse files
committed
Address review feedback
1 parent 7d5d27e commit f583610

File tree

1 file changed

+191
-58
lines changed

1 file changed

+191
-58
lines changed

clang/test/CIR/CodeGen/loop.cpp

Lines changed: 191 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -197,106 +197,239 @@ void l4() {
197197
}
198198

199199
// CIR: cir.func @_Z2l4v
200-
// CIR: %[[A_ADDR:.*]] = cir.alloca !cir.array<!s32i x 10>, !cir.ptr<!cir.array<!s32i x 10>>, ["a"] {alignment = 16 : i64}
200+
// CIR: %[[A_ADDR:.*]] = cir.alloca {{.*}} ["a"]
201201
// CIR: cir.scope {
202-
// CIR: %[[RANGE_ADDR:.*]] = cir.alloca !cir.ptr<!cir.array<!s32i x 10>>, !cir.ptr<!cir.ptr<!cir.array<!s32i x 10>>>, ["__range1", init, const] {alignment = 8 : i64}
203-
// CIR: %[[BEGIN_ADDR:.*]] = cir.alloca !cir.ptr<!s32i>, !cir.ptr<!cir.ptr<!s32i>>, ["__begin1", init] {alignment = 8 : i64}
204-
// CIR: %[[END_ADDR:.*]] = cir.alloca !cir.ptr<!s32i>, !cir.ptr<!cir.ptr<!s32i>>, ["__end1", init] {alignment = 8 : i64}
205-
// CIR: %[[N_ADDR:.*]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["n", init] {alignment = 4 : i64}
206-
// CIR: cir.store %[[A_ADDR]], %[[RANGE_ADDR]] : !cir.ptr<!cir.array<!s32i x 10>>, !cir.ptr<!cir.ptr<!cir.array<!s32i x 10>>>
207-
// CIR: %[[RANGE_LOAD:.*]] = cir.load %[[RANGE_ADDR]] : !cir.ptr<!cir.ptr<!cir.array<!s32i x 10>>>, !cir.ptr<!cir.array<!s32i x 10>>
208-
// CIR: %[[RANGE_CAST:.*]] = cir.cast(array_to_ptrdecay, %[[RANGE_LOAD]] : !cir.ptr<!cir.array<!s32i x 10>>), !cir.ptr<!s32i>
209-
// CIR: cir.store %[[RANGE_CAST]], %[[BEGIN_ADDR]] : !cir.ptr<!s32i>, !cir.ptr<!cir.ptr<!s32i>>
210-
// CIR: %[[BEGIN:.*]] = cir.load %[[RANGE_ADDR]] : !cir.ptr<!cir.ptr<!cir.array<!s32i x 10>>>, !cir.ptr<!cir.array<!s32i x 10>>
211-
// CIR: %[[BEGIN_CAST:.*]] = cir.cast(array_to_ptrdecay, %[[BEGIN]] : !cir.ptr<!cir.array<!s32i x 10>>), !cir.ptr<!s32i>
212-
// CIR: %[[TEN:.*]] = cir.const #cir.int<10> : !s64i
213-
// CIR: %[[END_PTR:.*]] = cir.ptr_stride(%[[BEGIN_CAST]] : !cir.ptr<!s32i>, %[[TEN]] : !s64i), !cir.ptr<!s32i>
214-
// CIR: cir.store %[[END_PTR]], %[[END_ADDR]] : !cir.ptr<!s32i>, !cir.ptr<!cir.ptr<!s32i>>
202+
// CIR: %[[RANGE_ADDR:.*]] = cir.alloca {{.*}} ["__range1", init, const]
203+
// CIR: %[[BEGIN_ADDR:.*]] = cir.alloca {{.*}} ["__begin1", init]
204+
// CIR: %[[END_ADDR:.*]] = cir.alloca {{.*}} ["__end1", init]
205+
// CIR: %[[N_ADDR:.*]] = cir.alloca {{.*}} ["n", init]
206+
// CIR: cir.store %[[A_ADDR]], %[[RANGE_ADDR]]
207+
// CIR: %[[RANGE_LOAD:.*]] = cir.load %[[RANGE_ADDR]]
208+
// CIR: %[[RANGE_CAST:.*]] = cir.cast(array_to_ptrdecay, %[[RANGE_LOAD]] : {{.*}})
209+
// CIR: cir.store %[[RANGE_CAST]], %[[BEGIN_ADDR]]
210+
// CIR: %[[BEGIN:.*]] = cir.load %[[RANGE_ADDR]]
211+
// CIR: %[[BEGIN_CAST:.*]] = cir.cast(array_to_ptrdecay, %[[BEGIN]] : {{.*}})
212+
// CIR: %[[TEN:.*]] = cir.const #cir.int<10>
213+
// CIR: %[[END_PTR:.*]] = cir.ptr_stride(%[[BEGIN_CAST]] : {{.*}}, %[[TEN]] : {{.*}})
214+
// CIR: cir.store %[[END_PTR]], %[[END_ADDR]]
215215
// CIR: cir.for : cond {
216-
// CIR: %[[CUR:.*]] = cir.load %[[BEGIN_ADDR]] : !cir.ptr<!cir.ptr<!s32i>>, !cir.ptr<!s32i>
217-
// CIR: %[[END:.*]] = cir.load %[[END_ADDR]] : !cir.ptr<!cir.ptr<!s32i>>, !cir.ptr<!s32i>
218-
// CIR: %[[CMP:.*]] = cir.cmp(ne, %[[CUR]], %[[END]]) : !cir.ptr<!s32i>, !cir.bool
216+
// CIR: %[[CUR:.*]] = cir.load %[[BEGIN_ADDR]]
217+
// CIR: %[[END:.*]] = cir.load %[[END_ADDR]]
218+
// CIR: %[[CMP:.*]] = cir.cmp(ne, %[[CUR]], %[[END]])
219219
// CIR: cir.condition(%[[CMP]])
220220
// CIR: } body {
221-
// CIR: %[[CUR:.*]] = cir.load deref %[[BEGIN_ADDR]] : !cir.ptr<!cir.ptr<!s32i>>, !cir.ptr<!s32i>
222-
// CIR: %[[N:.*]] = cir.load %[[CUR]] : !cir.ptr<!s32i>, !s32i
223-
// CIR: cir.store %[[N]], %[[N_ADDR]] : !s32i, !cir.ptr<!s32i>
221+
// CIR: %[[CUR:.*]] = cir.load deref %[[BEGIN_ADDR]]
222+
// CIR: %[[N:.*]] = cir.load %[[CUR]]
223+
// CIR: cir.store %[[N]], %[[N_ADDR]]
224224
// CIR: cir.yield
225225
// CIR: } step {
226-
// CIR: %[[CUR:.*]] = cir.load %[[BEGIN_ADDR]] : !cir.ptr<!cir.ptr<!s32i>>, !cir.ptr<!s32i>
227-
// CIR: %[[ONE:.*]] = cir.const #cir.int<1> : !s32i
228-
// CIR: %[[NEXT:.*]] = cir.ptr_stride(%[[CUR]] : !cir.ptr<!s32i>, %[[ONE]] : !s32i), !cir.ptr<!s32i>
229-
// CIR: cir.store %[[NEXT]], %[[BEGIN_ADDR]] : !cir.ptr<!s32i>, !cir.ptr<!cir.ptr<!s32i>>
226+
// CIR: %[[CUR:.*]] = cir.load %[[BEGIN_ADDR]]
227+
// CIR: %[[ONE:.*]] = cir.const #cir.int<1>
228+
// CIR: %[[NEXT:.*]] = cir.ptr_stride(%[[CUR]] : {{.*}}, %[[ONE]] : {{.*}})
229+
// CIR: cir.store %[[NEXT]], %[[BEGIN_ADDR]]
230230
// CIR: cir.yield
231231
// CIR: }
232232
// CIR: }
233233

234234
// LLVM: define void @_Z2l4v() {
235-
// LLVM: %[[RANGE_ADDR:.*]] = alloca ptr, i64 1, align 8
236-
// LLVM: %[[BEGIN_ADDR:.*]] = alloca ptr, i64 1, align 8
237-
// LLVM: %[[END_ADDR:.*]] = alloca ptr, i64 1, align 8
238-
// LLVM: %[[N_ADDR:.*]] = alloca i32, i64 1, align 4
239-
// LLVM: %[[A_ADDR:.*]] = alloca [10 x i32], i64 1, align 16
235+
// LLVM: %[[RANGE_ADDR:.*]] = alloca ptr
236+
// LLVM: %[[BEGIN_ADDR:.*]] = alloca ptr
237+
// LLVM: %[[END_ADDR:.*]] = alloca ptr
238+
// LLVM: %[[N_ADDR:.*]] = alloca i32
239+
// LLVM: %[[A_ADDR:.*]] = alloca [10 x i32]
240240
// LLVM: br label %[[SETUP:.*]]
241241
// LLVM: [[SETUP]]:
242-
// LLVM: store ptr %[[A_ADDR]], ptr %[[RANGE_ADDR]], align 8
243-
// LLVM: %[[BEGIN:.*]] = load ptr, ptr %[[RANGE_ADDR]], align 8
242+
// LLVM: store ptr %[[A_ADDR]], ptr %[[RANGE_ADDR]]
243+
// LLVM: %[[BEGIN:.*]] = load ptr, ptr %[[RANGE_ADDR]]
244244
// LLVM: %[[BEGIN_CAST:.*]] = getelementptr i32, ptr %[[BEGIN]], i32 0
245-
// LLVM: store ptr %[[BEGIN_CAST]], ptr %[[BEGIN_ADDR]], align 8
246-
// LLVM: %[[RANGE:.*]] = load ptr, ptr %[[RANGE_ADDR]], align 8
245+
// LLVM: store ptr %[[BEGIN_CAST]], ptr %[[BEGIN_ADDR]]
246+
// LLVM: %[[RANGE:.*]] = load ptr, ptr %[[RANGE_ADDR]]
247247
// LLVM: %[[RANGE_CAST:.*]] = getelementptr i32, ptr %[[RANGE]], i32 0
248248
// LLVM: %[[END_PTR:.*]] = getelementptr i32, ptr %[[RANGE_CAST]], i64 10
249-
// LLVM: store ptr %[[END_PTR]], ptr %[[END_ADDR]], align 8
249+
// LLVM: store ptr %[[END_PTR]], ptr %[[END_ADDR]]
250250
// LLVM: br label %[[COND:.*]]
251251
// LLVM: [[COND]]:
252-
// LLVM: %[[BEGIN:.*]] = load ptr, ptr %[[BEGIN_ADDR]], align 8
253-
// LLVM: %[[END:.*]] = load ptr, ptr %[[END_ADDR]], align 8
252+
// LLVM: %[[BEGIN:.*]] = load ptr, ptr %[[BEGIN_ADDR]]
253+
// LLVM: %[[END:.*]] = load ptr, ptr %[[END_ADDR]]
254254
// LLVM: %[[CMP:.*]] = icmp ne ptr %[[BEGIN]], %[[END]]
255255
// LLVM: br i1 %[[CMP]], label %[[BODY:.*]], label %[[END:.*]]
256256
// LLVM: [[BODY]]:
257-
// LLVM: %[[CUR:.*]] = load ptr, ptr %[[BEGIN_ADDR]], align 8
258-
// LLVM: %[[A_CUR:.*]] = load i32, ptr %[[CUR]], align 4
259-
// LLVM: store i32 %[[A_CUR]], ptr %[[N_ADDR]], align 4
257+
// LLVM: %[[CUR:.*]] = load ptr, ptr %[[BEGIN_ADDR]]
258+
// LLVM: %[[A_CUR:.*]] = load i32, ptr %[[CUR]]
259+
// LLVM: store i32 %[[A_CUR]], ptr %[[N_ADDR]]
260260
// LLVM: br label %[[STEP:.*]]
261261
// LLVM: [[STEP]]:
262-
// LLVM: %[[BEGIN:.*]] = load ptr, ptr %[[BEGIN_ADDR]], align 8
262+
// LLVM: %[[BEGIN:.*]] = load ptr, ptr %[[BEGIN_ADDR]]
263263
// LLVM: %[[NEXT:.*]] = getelementptr i32, ptr %[[BEGIN]], i64 1
264-
// LLVM: store ptr %[[NEXT]], ptr %[[BEGIN_ADDR]], align 8
264+
// LLVM: store ptr %[[NEXT]], ptr %[[BEGIN_ADDR]]
265265
// LLVM: br label %[[COND]]
266266
// LLVM: [[END]]:
267267
// LLVM: br label %[[EXIT:.*]]
268268
// LLVM: [[EXIT]]:
269269
// LLVM: ret void
270270

271271
// OGCG: define{{.*}} void @_Z2l4v()
272-
// OGCG: %[[A_ADDR:.*]] = alloca [10 x i32], align 16
273-
// OGCG: %[[RANGE_ADDR:.*]] = alloca ptr, align 8
274-
// OGCG: %[[BEGIN_ADDR:.*]] = alloca ptr, align 8
275-
// OGCG: %[[END_ADDR:.*]] = alloca ptr, align 8
276-
// OGCG: %[[N_ADDR:.*]] = alloca i32, align 4
277-
// OGCG: store ptr %[[A_ADDR]], ptr %[[RANGE_ADDR]], align 8
278-
// OGCG: %[[BEGIN:.*]] = load ptr, ptr %[[RANGE_ADDR]], align 8
272+
// OGCG: %[[A_ADDR:.*]] = alloca [10 x i32]
273+
// OGCG: %[[RANGE_ADDR:.*]] = alloca ptr
274+
// OGCG: %[[BEGIN_ADDR:.*]] = alloca ptr
275+
// OGCG: %[[END_ADDR:.*]] = alloca ptr
276+
// OGCG: %[[N_ADDR:.*]] = alloca i32
277+
// OGCG: store ptr %[[A_ADDR]], ptr %[[RANGE_ADDR]]
278+
// OGCG: %[[BEGIN:.*]] = load ptr, ptr %[[RANGE_ADDR]]
279279
// OGCG: %[[BEGIN_CAST:.*]] = getelementptr inbounds [10 x i32], ptr %[[BEGIN]], i64 0, i64 0
280-
// OGCG: store ptr %[[BEGIN_CAST]], ptr %[[BEGIN_ADDR]], align 8
281-
// OGCG: %[[RANGE:.*]] = load ptr, ptr %[[RANGE_ADDR]], align 8
280+
// OGCG: store ptr %[[BEGIN_CAST]], ptr %[[BEGIN_ADDR]]
281+
// OGCG: %[[RANGE:.*]] = load ptr, ptr %[[RANGE_ADDR]]
282282
// OGCG: %[[RANGE_CAST:.*]] = getelementptr inbounds [10 x i32], ptr %[[RANGE]], i64 0, i64 0
283283
// OGCG: %[[END_PTR:.*]] = getelementptr inbounds i32, ptr %[[RANGE_CAST]], i64 10
284-
// OGCG: store ptr %[[END_PTR]], ptr %[[END_ADDR]], align 8
284+
// OGCG: store ptr %[[END_PTR]], ptr %[[END_ADDR]]
285285
// OGCG: br label %[[COND:.*]]
286286
// OGCG: [[COND]]:
287-
// OGCG: %[[BEGIN:.*]] = load ptr, ptr %[[BEGIN_ADDR]], align 8
288-
// OGCG: %[[END:.*]] = load ptr, ptr %[[END_ADDR]], align 8
287+
// OGCG: %[[BEGIN:.*]] = load ptr, ptr %[[BEGIN_ADDR]]
288+
// OGCG: %[[END:.*]] = load ptr, ptr %[[END_ADDR]]
289289
// OGCG: %[[CMP:.*]] = icmp ne ptr %[[BEGIN]], %[[END]]
290290
// OGCG: br i1 %[[CMP]], label %[[BODY:.*]], label %[[END:.*]]
291291
// OGCG: [[BODY]]:
292-
// OGCG: %[[CUR:.*]] = load ptr, ptr %[[BEGIN_ADDR]], align 8
293-
// OGCG: %[[A_CUR:.*]] = load i32, ptr %[[CUR]], align 4
294-
// OGCG: store i32 %[[A_CUR]], ptr %[[N_ADDR]], align 4
292+
// OGCG: %[[CUR:.*]] = load ptr, ptr %[[BEGIN_ADDR]]
293+
// OGCG: %[[A_CUR:.*]] = load i32, ptr %[[CUR]]
294+
// OGCG: store i32 %[[A_CUR]], ptr %[[N_ADDR]]
295295
// OGCG: br label %[[STEP:.*]]
296296
// OGCG: [[STEP]]:
297-
// OGCG: %[[BEGIN:.*]] = load ptr, ptr %[[BEGIN_ADDR]], align 8
297+
// OGCG: %[[BEGIN:.*]] = load ptr, ptr %[[BEGIN_ADDR]]
298298
// OGCG: %[[NEXT:.*]] = getelementptr inbounds nuw i32, ptr %[[BEGIN]], i32 1
299-
// OGCG: store ptr %[[NEXT]], ptr %[[BEGIN_ADDR]], align 8
299+
// OGCG: store ptr %[[NEXT]], ptr %[[BEGIN_ADDR]]
300+
// OGCG: br label %[[COND]]
301+
// OGCG: [[END]]:
302+
// OGCG: ret void
303+
304+
void l5() {
305+
for (int arr[]{1,2,3,4}; auto x : arr) {}
306+
}
307+
308+
// CIR: cir.func @_Z2l5v
309+
// CIR: cir.scope {
310+
// CIR: %[[ARR_ADDR:.*]] = cir.alloca {{.*}} ["arr", init]
311+
// CIR: %[[RANGE_ADDR:.*]] = cir.alloca {{.*}} ["__range1", init, const]
312+
// CIR: %[[BEGIN_ADDR:.*]] = cir.alloca {{.*}} ["__begin1", init]
313+
// CIR: %[[END_ADDR:.*]] = cir.alloca {{.*}} ["__end1", init]
314+
// CIR: %[[X_ADDR:.*]] = cir.alloca {{.*}} ["x", init]
315+
// CIR: %[[ARR_CAST:.*]] = cir.cast(array_to_ptrdecay, %[[ARR_ADDR]] : {{.*}})
316+
// CIR: %[[ONE:.*]] = cir.const #cir.int<1> : !s32i
317+
// CIR: cir.store %[[ONE]], %[[ARR_CAST]]
318+
// CIR: %[[OFFSET1:.*]] = cir.const #cir.int<1> : !s64i
319+
// CIR: %[[STRIDE:.*]] = cir.ptr_stride(%[[ARR_CAST]] : {{.*}}, %[[OFFSET1]] : {{.*}})
320+
// CIR: %[[TWO:.*]] = cir.const #cir.int<2> : !s32i
321+
// CIR: cir.store %[[TWO]], %[[STRIDE]]
322+
// CIR: %[[OFFSET2:.*]] = cir.const #cir.int<2> : !s64i
323+
// CIR: %[[STRIDE2:.*]] = cir.ptr_stride(%[[ARR_CAST]] : {{.*}}, %[[OFFSET2]] : {{.*}})
324+
// CIR: %[[THREE:.*]] = cir.const #cir.int<3> : !s32i
325+
// CIR: cir.store %[[THREE]], %[[STRIDE2]]
326+
// CIR: %[[OFFSET3:.*]] = cir.const #cir.int<3> : !s64i
327+
// CIR: %[[STRIDE3:.*]] = cir.ptr_stride(%[[ARR_CAST]] : {{.*}}, %[[OFFSET3]] : {{.*}})
328+
// CIR: %[[FOUR:.*]] = cir.const #cir.int<4> : !s32i
329+
// CIR: cir.store %[[FOUR]], %[[STRIDE3]]
330+
// CIR: cir.store %[[ARR_ADDR]], %[[RANGE_ADDR]]
331+
// CIR: %[[RANGE_LOAD:.*]] = cir.load %[[RANGE_ADDR]]
332+
// CIR: %[[RANGE_CAST:.*]] = cir.cast(array_to_ptrdecay, %[[RANGE_LOAD]] : {{.*}})
333+
// CIR: cir.store %[[RANGE_CAST]], %[[BEGIN_ADDR]]
334+
// CIR: %[[BEGIN:.*]] = cir.load %[[RANGE_ADDR]]
335+
// CIR: %[[BEGIN_CAST:.*]] = cir.cast(array_to_ptrdecay, %[[BEGIN]] : {{.*}})
336+
// CIR: %[[FOUR:.*]] = cir.const #cir.int<4> : !s64i
337+
// CIR: %[[END_PTR:.*]] = cir.ptr_stride(%[[BEGIN_CAST]] : {{.*}}, %[[FOUR]] : {{.*}})
338+
// CIR: cir.store %[[END_PTR]], %[[END_ADDR]]
339+
// CIR: cir.for : cond {
340+
// CIR: %[[CUR:.*]] = cir.load %[[BEGIN_ADDR]]
341+
// CIR: %[[END:.*]] = cir.load %[[END_ADDR]]
342+
// CIR: %[[CMP:.*]] = cir.cmp(ne, %[[CUR]], %[[END]])
343+
// CIR: cir.condition(%[[CMP]])
344+
// CIR: } body {
345+
// CIR: %[[CUR:.*]] = cir.load deref %[[BEGIN_ADDR]]
346+
// CIR: %[[X:.*]] = cir.load %[[CUR]]
347+
// CIR: cir.store %[[X]], %[[X_ADDR]]
348+
// CIR: cir.yield
349+
// CIR: } step {
350+
// CIR: %[[CUR:.*]] = cir.load %[[BEGIN_ADDR]]
351+
// CIR: %[[ONE:.*]] = cir.const #cir.int<1>
352+
// CIR: %[[NEXT:.*]] = cir.ptr_stride(%[[CUR]] : {{.*}}, %[[ONE]] : {{.*}})
353+
// CIR: cir.store %[[NEXT]], %[[BEGIN_ADDR]]
354+
// CIR: cir.yield
355+
// CIR: }
356+
// CIR: }
357+
358+
// LLVM: define void @_Z2l5v() {
359+
// LLVM: %[[ARR_ADDR:.*]] = alloca [4 x i32]
360+
// LLVM: %[[RANGE_ADDR:.*]] = alloca ptr
361+
// LLVM: %[[BEGIN_ADDR:.*]] = alloca ptr
362+
// LLVM: %[[END_ADDR:.*]] = alloca ptr
363+
// LLVM: %[[X_ADDR:.*]] = alloca i32
364+
// LLVM: br label %[[SETUP:.*]]
365+
// LLVM: [[SETUP]]:
366+
// LLVM: %[[ARR_0:.*]] = getelementptr i32, ptr %[[ARR_ADDR]], i32 0
367+
// LLVM: store i32 1, ptr %[[ARR_0]]
368+
// LLVM: %[[ARR_1:.*]] = getelementptr i32, ptr %[[ARR_0]], i64 1
369+
// LLVM: store i32 2, ptr %[[ARR_1]]
370+
// LLVM: %[[ARR_2:.*]] = getelementptr i32, ptr %[[ARR_0]], i64 2
371+
// LLVM: store i32 3, ptr %[[ARR_2]]
372+
// LLVM: %[[ARR_3:.*]] = getelementptr i32, ptr %[[ARR_0]], i64 3
373+
// LLVM: store i32 4, ptr %[[ARR_3]]
374+
// LLVM: store ptr %[[ARR_ADDR]], ptr %[[RANGE_ADDR]]
375+
// LLVM: %[[BEGIN:.*]] = load ptr, ptr %[[RANGE_ADDR]]
376+
// LLVM: %[[BEGIN_CAST:.*]] = getelementptr i32, ptr %[[BEGIN]], i32 0
377+
// LLVM: store ptr %[[BEGIN_CAST]], ptr %[[BEGIN_ADDR]]
378+
// LLVM: %[[RANGE:.*]] = load ptr, ptr %[[RANGE_ADDR]]
379+
// LLVM: %[[RANGE_CAST:.*]] = getelementptr i32, ptr %[[RANGE]], i32 0
380+
// LLVM: %[[END_PTR:.*]] = getelementptr i32, ptr %[[RANGE_CAST]], i64 4
381+
// LLVM: store ptr %[[END_PTR]], ptr %[[END_ADDR]]
382+
// LLVM: br label %[[COND:.*]]
383+
// LLVM: [[COND]]:
384+
// LLVM: %[[BEGIN:.*]] = load ptr, ptr %[[BEGIN_ADDR]]
385+
// LLVM: %[[END:.*]] = load ptr, ptr %[[END_ADDR]]
386+
// LLVM: %[[CMP:.*]] = icmp ne ptr %[[BEGIN]], %[[END]]
387+
// LLVM: br i1 %[[CMP]], label %[[BODY:.*]], label %[[END:.*]]
388+
// LLVM: [[BODY]]:
389+
// LLVM: %[[CUR:.*]] = load ptr, ptr %[[BEGIN_ADDR]]
390+
// LLVM: %[[ARR_CUR:.*]] = load i32, ptr %[[CUR]]
391+
// LLVM: store i32 %[[ARR_CUR]], ptr %[[X_ADDR]]
392+
// LLVM: br label %[[STEP:.*]]
393+
// LLVM: [[STEP]]:
394+
// LLVM: %[[BEGIN:.*]] = load ptr, ptr %[[BEGIN_ADDR]]
395+
// LLVM: %[[NEXT:.*]] = getelementptr i32, ptr %[[BEGIN]], i64 1
396+
// LLVM: store ptr %[[NEXT]], ptr %[[BEGIN_ADDR]]
397+
// LLVM: br label %[[COND]]
398+
// LLVM: [[END]]:
399+
// LLVM: br label %[[EXIT:.*]]
400+
// LLVM: [[EXIT]]:
401+
// LLVM: ret void
402+
403+
// OGCG: define{{.*}} void @_Z2l5v()
404+
// OGCG: %[[ARR_ADDR:.*]] = alloca [4 x i32]
405+
// OGCG: %[[RANGE_ADDR:.*]] = alloca ptr
406+
// OGCG: %[[BEGIN_ADDR:.*]] = alloca ptr
407+
// OGCG: %[[END_ADDR:.*]] = alloca ptr
408+
// OGCG: %[[X_ADDR:.*]] = alloca i32
409+
// OGCG: call void @llvm.memcpy.p0.p0.i64
410+
// OGCG: store ptr %[[ARR_ADDR]], ptr %[[RANGE_ADDR]]
411+
// OGCG: %[[BEGIN:.*]] = load ptr, ptr %[[RANGE_ADDR]]
412+
// OGCG: %[[BEGIN_CAST:.*]] = getelementptr inbounds [4 x i32], ptr %[[BEGIN]], i64 0, i64 0
413+
// OGCG: store ptr %[[BEGIN_CAST]], ptr %[[BEGIN_ADDR]]
414+
// OGCG: %[[RANGE:.*]] = load ptr, ptr %[[RANGE_ADDR]]
415+
// OGCG: %[[RANGE_CAST:.*]] = getelementptr inbounds [4 x i32], ptr %[[RANGE]], i64 0, i64 0
416+
// OGCG: %[[END_PTR:.*]] = getelementptr inbounds i32, ptr %[[RANGE_CAST]], i64 4
417+
// OGCG: store ptr %[[END_PTR]], ptr %[[END_ADDR]]
418+
// OGCG: br label %[[COND:.*]]
419+
// OGCG: [[COND]]:
420+
// OGCG: %[[BEGIN:.*]] = load ptr, ptr %[[BEGIN_ADDR]]
421+
// OGCG: %[[END:.*]] = load ptr, ptr %[[END_ADDR]]
422+
// OGCG: %[[CMP:.*]] = icmp ne ptr %[[BEGIN]], %[[END]]
423+
// OGCG: br i1 %[[CMP]], label %[[BODY:.*]], label %[[END:.*]]
424+
// OGCG: [[BODY]]:
425+
// OGCG: %[[CUR:.*]] = load ptr, ptr %[[BEGIN_ADDR]]
426+
// OGCG: %[[ARR_CUR:.*]] = load i32, ptr %[[CUR]]
427+
// OGCG: store i32 %[[ARR_CUR]], ptr %[[X_ADDR]]
428+
// OGCG: br label %[[STEP:.*]]
429+
// OGCG: [[STEP]]:
430+
// OGCG: %[[BEGIN:.*]] = load ptr, ptr %[[BEGIN_ADDR]]
431+
// OGCG: %[[NEXT:.*]] = getelementptr inbounds nuw i32, ptr %[[BEGIN]], i32 1
432+
// OGCG: store ptr %[[NEXT]], ptr %[[BEGIN_ADDR]]
300433
// OGCG: br label %[[COND]]
301434
// OGCG: [[END]]:
302435
// OGCG: ret void

0 commit comments

Comments
 (0)