@@ -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