@@ -190,6 +190,117 @@ void l3() {
190190// OGCG: store i32 0, ptr %[[I]], align 4
191191// OGCG: br label %[[FOR_COND]]
192192
193+ void l4 () {
194+ int a[10 ];
195+ for (int n : a)
196+ ;
197+ }
198+
199+ // 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}
201+ // 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>>
215+ // 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
219+ // CIR: cir.condition(%[[CMP]])
220+ // 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>
224+ // CIR: cir.yield
225+ // 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>>
230+ // CIR: cir.yield
231+ // CIR: }
232+ // CIR: }
233+
234+ // 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
240+ // LLVM: br label %[[SETUP:.*]]
241+ // LLVM: [[SETUP]]:
242+ // LLVM: store ptr %[[A_ADDR]], ptr %[[RANGE_ADDR]], align 8
243+ // LLVM: %[[BEGIN:.*]] = load ptr, ptr %[[RANGE_ADDR]], align 8
244+ // 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
247+ // LLVM: %[[RANGE_CAST:.*]] = getelementptr i32, ptr %[[RANGE]], i32 0
248+ // LLVM: %[[END_PTR:.*]] = getelementptr i32, ptr %[[RANGE_CAST]], i64 10
249+ // LLVM: store ptr %[[END_PTR]], ptr %[[END_ADDR]], align 8
250+ // LLVM: br label %[[COND:.*]]
251+ // LLVM: [[COND]]:
252+ // LLVM: %[[BEGIN:.*]] = load ptr, ptr %[[BEGIN_ADDR]], align 8
253+ // LLVM: %[[END:.*]] = load ptr, ptr %[[END_ADDR]], align 8
254+ // LLVM: %[[CMP:.*]] = icmp ne ptr %[[BEGIN]], %[[END]]
255+ // LLVM: br i1 %[[CMP]], label %[[BODY:.*]], label %[[END:.*]]
256+ // 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
260+ // LLVM: br label %[[STEP:.*]]
261+ // LLVM: [[STEP]]:
262+ // LLVM: %[[BEGIN:.*]] = load ptr, ptr %[[BEGIN_ADDR]], align 8
263+ // LLVM: %[[NEXT:.*]] = getelementptr i32, ptr %[[BEGIN]], i64 1
264+ // LLVM: store ptr %[[NEXT]], ptr %[[BEGIN_ADDR]], align 8
265+ // LLVM: br label %[[COND]]
266+ // LLVM: [[END]]:
267+ // LLVM: br label %[[EXIT:.*]]
268+ // LLVM: [[EXIT]]:
269+ // LLVM: ret void
270+
271+ // 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
279+ // 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
282+ // OGCG: %[[RANGE_CAST:.*]] = getelementptr inbounds [10 x i32], ptr %[[RANGE]], i64 0, i64 0
283+ // OGCG: %[[END_PTR:.*]] = getelementptr inbounds i32, ptr %[[RANGE_CAST]], i64 10
284+ // OGCG: store ptr %[[END_PTR]], ptr %[[END_ADDR]], align 8
285+ // OGCG: br label %[[COND:.*]]
286+ // OGCG: [[COND]]:
287+ // OGCG: %[[BEGIN:.*]] = load ptr, ptr %[[BEGIN_ADDR]], align 8
288+ // OGCG: %[[END:.*]] = load ptr, ptr %[[END_ADDR]], align 8
289+ // OGCG: %[[CMP:.*]] = icmp ne ptr %[[BEGIN]], %[[END]]
290+ // OGCG: br i1 %[[CMP]], label %[[BODY:.*]], label %[[END:.*]]
291+ // 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
295+ // OGCG: br label %[[STEP:.*]]
296+ // OGCG: [[STEP]]:
297+ // OGCG: %[[BEGIN:.*]] = load ptr, ptr %[[BEGIN_ADDR]], align 8
298+ // OGCG: %[[NEXT:.*]] = getelementptr inbounds nuw i32, ptr %[[BEGIN]], i32 1
299+ // OGCG: store ptr %[[NEXT]], ptr %[[BEGIN_ADDR]], align 8
300+ // OGCG: br label %[[COND]]
301+ // OGCG: [[END]]:
302+ // OGCG: ret void
303+
193304void test_do_while_false () {
194305 do {
195306 } while (0 );
0 commit comments