Skip to content

Commit 49edd4b

Browse files
authored
[CIR] Put loop body in nested scopes (#1221)
This PR puts for-loop body, while-loop body, and do-while-loop body in nested scopes. Allocas in the loop body are now push down to the nested scope. Resolve #1218 .
1 parent 3d50a02 commit 49edd4b

File tree

7 files changed

+138
-109
lines changed

7 files changed

+138
-109
lines changed

clang/lib/CIR/CodeGen/CIRGenStmt.cpp

+7-9
Original file line numberDiff line numberDiff line change
@@ -910,13 +910,9 @@ mlir::LogicalResult CIRGenFunction::emitForStmt(const ForStmt &S) {
910910
},
911911
/*bodyBuilder=*/
912912
[&](mlir::OpBuilder &b, mlir::Location loc) {
913-
// https://en.cppreference.com/w/cpp/language/for
914-
// While in C++, the scope of the init-statement and the scope of
915-
// statement are one and the same, in C the scope of statement is
916-
// nested within the scope of init-statement.
917-
bool useCurrentScope =
918-
CGM.getASTContext().getLangOpts().CPlusPlus ? true : false;
919-
if (emitStmt(S.getBody(), useCurrentScope).failed())
913+
// The scope of the for loop body is nested within the scope of the
914+
// for loop's init-statement and condition.
915+
if (emitStmt(S.getBody(), /*useCurrentScope=*/false).failed())
920916
loopRes = mlir::failure();
921917
emitStopPoint(&S);
922918
},
@@ -973,7 +969,8 @@ mlir::LogicalResult CIRGenFunction::emitDoStmt(const DoStmt &S) {
973969
},
974970
/*bodyBuilder=*/
975971
[&](mlir::OpBuilder &b, mlir::Location loc) {
976-
if (emitStmt(S.getBody(), /*useCurrentScope=*/true).failed())
972+
// The scope of the do-while loop body is a nested scope.
973+
if (emitStmt(S.getBody(), /*useCurrentScope=*/false).failed())
977974
loopRes = mlir::failure();
978975
emitStopPoint(&S);
979976
});
@@ -1028,7 +1025,8 @@ mlir::LogicalResult CIRGenFunction::emitWhileStmt(const WhileStmt &S) {
10281025
},
10291026
/*bodyBuilder=*/
10301027
[&](mlir::OpBuilder &b, mlir::Location loc) {
1031-
if (emitStmt(S.getBody(), /*useCurrentScope=*/true).failed())
1028+
// The scope of the while loop body is a nested scope.
1029+
if (emitStmt(S.getBody(), /*useCurrentScope=*/false).failed())
10321030
loopRes = mlir::failure();
10331031
emitStopPoint(&S);
10341032
});

clang/lib/CIR/Dialect/Transforms/LifetimeCheck.cpp

-7
Original file line numberDiff line numberDiff line change
@@ -967,13 +967,6 @@ void LifetimeCheckPass::classifyAndInitTypeCategories(mlir::Value addr,
967967
mlir::Type t,
968968
mlir::Location loc,
969969
unsigned nestLevel) {
970-
// The same alloca can be hit more than once when checking for dangling
971-
// pointers out of subsequent loop iterations (e.g. second iteraton using
972-
// pointer invalidated in the first run). Since we copy the pmap out to
973-
// start those subsequent checks, make sure sure we skip existing alloca
974-
// tracking.
975-
if (getPmap().count(addr))
976-
return;
977970
getPmap()[addr] = {};
978971

979972
enum TypeCategory {

clang/test/CIR/CodeGen/goto.cpp

+5-1
Original file line numberDiff line numberDiff line change
@@ -171,13 +171,16 @@ int jumpIntoLoop(int* ar) {
171171
// CHECK: ^bb[[#BLK6]]:
172172
// CHECK: cir.br ^bb[[#COND:]]
173173
// CHECK: ^bb[[#COND]]:
174-
// CHECK: cir.brcond {{.*}} ^bb[[#BODY]], ^bb[[#EXIT:]]
174+
// CHECK: cir.brcond {{.*}} ^bb[[#BLK8:]], ^bb[[#EXIT:]]
175+
// CHECK: ^bb[[#BLK8]]:
176+
// CHECK: cir.br ^bb[[#BODY]]
175177
// CHECK: ^bb[[#BODY]]:
176178
// CHECK: cir.br ^bb[[#COND]]
177179
// CHECK: ^bb[[#EXIT]]:
178180
// CHECK: cir.br ^bb[[#BLK7:]]
179181
// CHECK: ^bb[[#BLK7]]:
180182
// CHECK: cir.br ^bb[[#RETURN]]
183+
// CHECK: }
181184

182185

183186

@@ -222,6 +225,7 @@ int jumpFromLoop(int* ar) {
222225
// CHECK: cir.br ^bb[[#RETURN2:]]
223226
// CHECK: ^bb[[#RETURN2]]:
224227
// CHECK: cir.return
228+
// CHECK: }
225229

226230

227231
void flatLoopWithNoTerminatorInFront(int* ptr) {

clang/test/CIR/CodeGen/loop-scope.cpp

+6-3
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,14 @@ void l0(void) {
1212
// CPPSCOPE: cir.func @_Z2l0v()
1313
// CPPSCOPE-NEXT: cir.scope {
1414
// CPPSCOPE-NEXT: %0 = cir.alloca !s32i, !cir.ptr<!s32i>, ["i", init] {alignment = 4 : i64}
15-
// CPPSCOPE-NEXT: %1 = cir.alloca !s32i, !cir.ptr<!s32i>, ["j", init] {alignment = 4 : i64}
16-
// CPPSCOPE-NEXT: %2 = cir.const #cir.int<0> : !s32i
17-
// CPPSCOPE-NEXT: cir.store %2, %0 : !s32i, !cir.ptr<!s32i>
15+
// CPPSCOPE-NEXT: %1 = cir.const #cir.int<0> : !s32i
16+
// CPPSCOPE-NEXT: cir.store %1, %0 : !s32i, !cir.ptr<!s32i>
1817
// CPPSCOPE-NEXT: cir.for : cond {
1918

19+
// CPPSCOPE: } body {
20+
// CPPSCOPE-NEXT: cir.scope {
21+
// CPPSCOPE-NEXT: %2 = cir.alloca !s32i, !cir.ptr<!s32i>, ["j", init] {alignment = 4 : i64}
22+
2023
// CSCOPE: cir.func @l0()
2124
// CSCOPE-NEXT: cir.scope {
2225
// CSCOPE-NEXT: %0 = cir.alloca !s32i, !cir.ptr<!s32i>, ["i", init] {alignment = 4 : i64}

clang/test/CIR/CodeGen/loop.cpp

+77-53
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,12 @@ void l1() {
2525
// CHECK-NEXT: %6 = cir.cmp(lt, %4, %5) : !s32i, !cir.bool
2626
// CHECK-NEXT: cir.condition(%6)
2727
// CHECK-NEXT: } body {
28-
// CHECK-NEXT: %4 = cir.load %0 : !cir.ptr<!s32i>, !s32i
29-
// CHECK-NEXT: %5 = cir.const #cir.int<1> : !s32i
30-
// CHECK-NEXT: %6 = cir.binop(add, %4, %5) nsw : !s32i
31-
// CHECK-NEXT: cir.store %6, %0 : !s32i, !cir.ptr<!s32i>
28+
// CHECK-NEXT: cir.scope {
29+
// CHECK-NEXT: %4 = cir.load %0 : !cir.ptr<!s32i>, !s32i
30+
// CHECK-NEXT: %5 = cir.const #cir.int<1> : !s32i
31+
// CHECK-NEXT: %6 = cir.binop(add, %4, %5) nsw : !s32i
32+
// CHECK-NEXT: cir.store %6, %0 : !s32i, !cir.ptr<!s32i>
33+
// CHECK-NEXT: }
3234
// CHECK-NEXT: cir.yield
3335
// CHECK-NEXT: } step {
3436
// CHECK-NEXT: %4 = cir.load %2 : !cir.ptr<!s32i>, !s32i
@@ -57,10 +59,12 @@ void l2(bool cond) {
5759
// CHECK-NEXT: %3 = cir.load %0 : !cir.ptr<!cir.bool>, !cir.bool
5860
// CHECK-NEXT: cir.condition(%3)
5961
// CHECK-NEXT: } do {
60-
// CHECK-NEXT: %3 = cir.load %1 : !cir.ptr<!s32i>, !s32i
61-
// CHECK-NEXT: %4 = cir.const #cir.int<1> : !s32i
62-
// CHECK-NEXT: %5 = cir.binop(add, %3, %4) nsw : !s32i
63-
// CHECK-NEXT: cir.store %5, %1 : !s32i, !cir.ptr<!s32i>
62+
// CHECK-NEXT: cir.scope {
63+
// CHECK-NEXT: %3 = cir.load %1 : !cir.ptr<!s32i>, !s32i
64+
// CHECK-NEXT: %4 = cir.const #cir.int<1> : !s32i
65+
// CHECK-NEXT: %5 = cir.binop(add, %3, %4) nsw : !s32i
66+
// CHECK-NEXT: cir.store %5, %1 : !s32i, !cir.ptr<!s32i>
67+
// CHECK-NEXT: }
6468
// CHECK-NEXT: cir.yield
6569
// CHECK-NEXT: }
6670
// CHECK-NEXT: }
@@ -69,10 +73,12 @@ void l2(bool cond) {
6973
// CHECK-NEXT: %[[#TRUE:]] = cir.const #true
7074
// CHECK-NEXT: cir.condition(%[[#TRUE]])
7175
// CHECK-NEXT: } do {
72-
// CHECK-NEXT: %3 = cir.load %1 : !cir.ptr<!s32i>, !s32i
73-
// CHECK-NEXT: %4 = cir.const #cir.int<1> : !s32i
74-
// CHECK-NEXT: %5 = cir.binop(add, %3, %4) nsw : !s32i
75-
// CHECK-NEXT: cir.store %5, %1 : !s32i, !cir.ptr<!s32i>
76+
// CHECK-NEXT: cir.scope {
77+
// CHECK-NEXT: %3 = cir.load %1 : !cir.ptr<!s32i>, !s32i
78+
// CHECK-NEXT: %4 = cir.const #cir.int<1> : !s32i
79+
// CHECK-NEXT: %5 = cir.binop(add, %3, %4) nsw : !s32i
80+
// CHECK-NEXT: cir.store %5, %1 : !s32i, !cir.ptr<!s32i>
81+
// CHECK-NEXT: }
7682
// CHECK-NEXT: cir.yield
7783
// CHECK-NEXT: }
7884
// CHECK-NEXT: }
@@ -82,10 +88,12 @@ void l2(bool cond) {
8288
// CHECK-NEXT: %4 = cir.cast(int_to_bool, %3 : !s32i), !cir.bool
8389
// CHECK-NEXT: cir.condition(%4)
8490
// CHECK-NEXT: } do {
85-
// CHECK-NEXT: %3 = cir.load %1 : !cir.ptr<!s32i>, !s32i
86-
// CHECK-NEXT: %4 = cir.const #cir.int<1> : !s32i
87-
// CHECK-NEXT: %5 = cir.binop(add, %3, %4) nsw : !s32i
88-
// CHECK-NEXT: cir.store %5, %1 : !s32i, !cir.ptr<!s32i>
91+
// CHECK-NEXT: cir.scope {
92+
// CHECK-NEXT: %3 = cir.load %1 : !cir.ptr<!s32i>, !s32i
93+
// CHECK-NEXT: %4 = cir.const #cir.int<1> : !s32i
94+
// CHECK-NEXT: %5 = cir.binop(add, %3, %4) nsw : !s32i
95+
// CHECK-NEXT: cir.store %5, %1 : !s32i, !cir.ptr<!s32i>
96+
// CHECK-NEXT: }
8997
// CHECK-NEXT: cir.yield
9098
// CHECK-NEXT: }
9199
// CHECK-NEXT: }
@@ -106,10 +114,12 @@ void l3(bool cond) {
106114
// CHECK: cir.func @_Z2l3b
107115
// CHECK: cir.scope {
108116
// CHECK-NEXT: cir.do {
109-
// CHECK-NEXT: %3 = cir.load %1 : !cir.ptr<!s32i>, !s32i
110-
// CHECK-NEXT: %4 = cir.const #cir.int<1> : !s32i
111-
// CHECK-NEXT: %5 = cir.binop(add, %3, %4) nsw : !s32i
112-
// CHECK-NEXT: cir.store %5, %1 : !s32i, !cir.ptr<!s32i>
117+
// CHECK-NEXT: cir.scope {
118+
// CHECK-NEXT: %3 = cir.load %1 : !cir.ptr<!s32i>, !s32i
119+
// CHECK-NEXT: %4 = cir.const #cir.int<1> : !s32i
120+
// CHECK-NEXT: %5 = cir.binop(add, %3, %4) nsw : !s32i
121+
// CHECK-NEXT: cir.store %5, %1 : !s32i, !cir.ptr<!s32i>
122+
// CHECK-NEXT: }
113123
// CHECK-NEXT: cir.yield
114124
// CHECK-NEXT: } while {
115125
// CHECK-NEXT: %[[#TRUE:]] = cir.load %0 : !cir.ptr<!cir.bool>, !cir.bool
@@ -118,10 +128,12 @@ void l3(bool cond) {
118128
// CHECK-NEXT: }
119129
// CHECK-NEXT: cir.scope {
120130
// CHECK-NEXT: cir.do {
121-
// CHECK-NEXT: %3 = cir.load %1 : !cir.ptr<!s32i>, !s32i
122-
// CHECK-NEXT: %4 = cir.const #cir.int<1> : !s32i
123-
// CHECK-NEXT: %5 = cir.binop(add, %3, %4) nsw : !s32i
124-
// CHECK-NEXT: cir.store %5, %1 : !s32i, !cir.ptr<!s32i>
131+
// CHECK-NEXT: cir.scope {
132+
// CHECK-NEXT: %3 = cir.load %1 : !cir.ptr<!s32i>, !s32i
133+
// CHECK-NEXT: %4 = cir.const #cir.int<1> : !s32i
134+
// CHECK-NEXT: %5 = cir.binop(add, %3, %4) nsw : !s32i
135+
// CHECK-NEXT: cir.store %5, %1 : !s32i, !cir.ptr<!s32i>
136+
// CHECK-NEXT: }
125137
// CHECK-NEXT: cir.yield
126138
// CHECK-NEXT: } while {
127139
// CHECK-NEXT: %[[#TRUE:]] = cir.const #true
@@ -130,10 +142,12 @@ void l3(bool cond) {
130142
// CHECK-NEXT: }
131143
// CHECK-NEXT: cir.scope {
132144
// CHECK-NEXT: cir.do {
133-
// CHECK-NEXT: %3 = cir.load %1 : !cir.ptr<!s32i>, !s32i
134-
// CHECK-NEXT: %4 = cir.const #cir.int<1> : !s32i
135-
// CHECK-NEXT: %5 = cir.binop(add, %3, %4) nsw : !s32i
136-
// CHECK-NEXT: cir.store %5, %1 : !s32i, !cir.ptr<!s32i>
145+
// CHECK-NEXT: cir.scope {
146+
// CHECK-NEXT: %3 = cir.load %1 : !cir.ptr<!s32i>, !s32i
147+
// CHECK-NEXT: %4 = cir.const #cir.int<1> : !s32i
148+
// CHECK-NEXT: %5 = cir.binop(add, %3, %4) nsw : !s32i
149+
// CHECK-NEXT: cir.store %5, %1 : !s32i, !cir.ptr<!s32i>
150+
// CHECK-NEXT: }
137151
// CHECK-NEXT: cir.yield
138152
// CHECK-NEXT: } while {
139153
// CHECK-NEXT: %3 = cir.const #cir.int<1> : !s32i
@@ -157,18 +171,19 @@ void l4() {
157171
// CHECK-NEXT: %[[#TRUE:]] = cir.const #true
158172
// CHECK-NEXT: cir.condition(%[[#TRUE]])
159173
// CHECK-NEXT: } do {
160-
// CHECK-NEXT: %4 = cir.load %0 : !cir.ptr<!s32i>, !s32i
161-
// CHECK-NEXT: %5 = cir.const #cir.int<1> : !s32i
162-
// CHECK-NEXT: %6 = cir.binop(add, %4, %5) nsw : !s32i
163-
// CHECK-NEXT: cir.store %6, %0 : !s32i, !cir.ptr<!s32i>
164174
// CHECK-NEXT: cir.scope {
165-
// CHECK-NEXT: %10 = cir.load %0 : !cir.ptr<!s32i>, !s32i
166-
// CHECK-NEXT: %11 = cir.const #cir.int<10> : !s32i
167-
// CHECK-NEXT: %12 = cir.cmp(lt, %10, %11) : !s32i, !cir.bool
168-
// CHECK-NEXT: cir.if %12 {
169-
// CHECK-NEXT: cir.continue
175+
// CHECK-NEXT: %4 = cir.load %0 : !cir.ptr<!s32i>, !s32i
176+
// CHECK-NEXT: %5 = cir.const #cir.int<1> : !s32i
177+
// CHECK-NEXT: %6 = cir.binop(add, %4, %5) nsw : !s32i
178+
// CHECK-NEXT: cir.store %6, %0 : !s32i, !cir.ptr<!s32i>
179+
// CHECK-NEXT: cir.scope {
180+
// CHECK-NEXT: %10 = cir.load %0 : !cir.ptr<!s32i>, !s32i
181+
// CHECK-NEXT: %11 = cir.const #cir.int<10> : !s32i
182+
// CHECK-NEXT: %12 = cir.cmp(lt, %10, %11) : !s32i, !cir.bool
183+
// CHECK-NEXT: cir.if %12 {
184+
// CHECK-NEXT: cir.continue
185+
// CHECK-NEXT: }
170186
// CHECK-NEXT: }
171-
// CHECK-NEXT: }
172187

173188
void l5() {
174189
do {
@@ -200,7 +215,10 @@ void l6() {
200215
// CHECK-NEXT: %[[#TRUE:]] = cir.const #true
201216
// CHECK-NEXT: cir.condition(%[[#TRUE]])
202217
// CHECK-NEXT: } do {
203-
// CHECK-NEXT: cir.return
218+
// CHECK-NEXT: cir.scope {
219+
// CHECK-NEXT: cir.return
220+
// CHECK-NEXT: }
221+
// CHECK-NEXT: cir.yield
204222
// CHECK-NEXT: }
205223
// CHECK-NEXT: }
206224
// CHECK-NEXT: cir.return
@@ -215,15 +233,18 @@ void unreachable_after_break() {
215233

216234
// CHECK-NEXT: cir.func @_Z23unreachable_after_breakv()
217235
// CHECK-NEXT: cir.scope {
218-
// CHECK-NEXT: %0 = cir.alloca !s32i, !cir.ptr<!s32i>, ["x", init] {alignment = 4 : i64}
219236
// CHECK-NEXT: cir.for : cond {
220-
// CHECK-NEXT: %1 = cir.const #true
221-
// CHECK-NEXT: cir.condition(%1)
237+
// CHECK-NEXT: %0 = cir.const #true
238+
// CHECK-NEXT: cir.condition(%0)
222239
// CHECK-NEXT: } body {
223-
// CHECK-NEXT: cir.break
224-
// CHECK-NEXT: ^bb1: // no predecessors
225-
// CHECK-NEXT: %1 = cir.const #cir.int<1> : !s32i
226-
// CHECK-NEXT: cir.store %1, %0 : !s32i, !cir.ptr<!s32i>
240+
// CHECK-NEXT: cir.scope {
241+
// CHECK-NEXT: %0 = cir.alloca !s32i, !cir.ptr<!s32i>, ["x", init] {alignment = 4 : i64}
242+
// CHECK-NEXT: cir.break
243+
// CHECK-NEXT: ^bb1: // no predecessors
244+
// CHECK-NEXT: %1 = cir.const #cir.int<1> : !s32i
245+
// CHECK-NEXT: cir.store %1, %0 : !s32i, !cir.ptr<!s32i>
246+
// CHECK-NEXT: cir.yield
247+
// CHECK-NEXT: }
227248
// CHECK-NEXT: cir.yield
228249
// CHECK-NEXT: } step {
229250
// CHECK-NEXT: cir.yield
@@ -241,15 +262,18 @@ void unreachable_after_continue() {
241262

242263
// CHECK-NEXT: cir.func @_Z26unreachable_after_continuev()
243264
// CHECK-NEXT: cir.scope {
244-
// CHECK-NEXT: %0 = cir.alloca !s32i, !cir.ptr<!s32i>, ["x", init] {alignment = 4 : i64}
245265
// CHECK-NEXT: cir.for : cond {
246-
// CHECK-NEXT: %1 = cir.const #true
247-
// CHECK-NEXT: cir.condition(%1)
266+
// CHECK-NEXT: %0 = cir.const #true
267+
// CHECK-NEXT: cir.condition(%0)
248268
// CHECK-NEXT: } body {
249-
// CHECK-NEXT: cir.continue
250-
// CHECK-NEXT: ^bb1: // no predecessors
251-
// CHECK-NEXT: %1 = cir.const #cir.int<1> : !s32i
252-
// CHECK-NEXT: cir.store %1, %0 : !s32i, !cir.ptr<!s32i>
269+
// CHECK-NEXT: cir.scope {
270+
// CHECK-NEXT: %0 = cir.alloca !s32i, !cir.ptr<!s32i>, ["x", init] {alignment = 4 : i64}
271+
// CHECK-NEXT: cir.continue
272+
// CHECK-NEXT: ^bb1: // no predecessors
273+
// CHECK-NEXT: %1 = cir.const #cir.int<1> : !s32i
274+
// CHECK-NEXT: cir.store %1, %0 : !s32i, !cir.ptr<!s32i>
275+
// CHECK-NEXT: cir.yield
276+
// CHECK-NEXT: }
253277
// CHECK-NEXT: cir.yield
254278
// CHECK-NEXT: } step {
255279
// CHECK-NEXT: cir.yield

clang/test/CIR/Lowering/ThroughMLIR/doWhile.c

+33-29
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,16 @@ void nestedDoWhile() {
3232
// CHECK: memref.store %[[C0_I32_2]], %[[ALLOC1]][] : memref<i32>
3333
// CHECK: memref.alloca_scope {
3434
// CHECK: scf.while : () -> () {
35-
// CHECK: %[[VAR1:.+]] = memref.load %[[ALLOC1]][] : memref<i32>
36-
// CHECK: %[[VAR2:.+]] = memref.load %[[ALLOC0]][] : memref<i32>
37-
// CHECK: %[[ADD:.+]] = arith.addi %[[VAR2]], %[[VAR1]] : i32
38-
// CHECK: memref.store %[[ADD]], %[[ALLOC0]][] : memref<i32>
39-
// CHECK: %[[VAR3:.+]] = memref.load %[[ALLOC1]][] : memref<i32>
40-
// CHECK: %[[C1_I32:.+]] = arith.constant 1 : i32
41-
// CHECK: %[[ADD1:.+]] = arith.addi %[[VAR3]], %[[C1_I32]] : i32
42-
// CHECK: memref.store %[[ADD1]], %[[ALLOC1]][] : memref<i32>
35+
// CHECK: memref.alloca_scope {
36+
// CHECK: %[[VAR1:.+]] = memref.load %[[ALLOC1]][] : memref<i32>
37+
// CHECK: %[[VAR2:.+]] = memref.load %[[ALLOC0]][] : memref<i32>
38+
// CHECK: %[[ADD:.+]] = arith.addi %[[VAR2]], %[[VAR1]] : i32
39+
// CHECK: memref.store %[[ADD]], %[[ALLOC0]][] : memref<i32>
40+
// CHECK: %[[VAR3:.+]] = memref.load %[[ALLOC1]][] : memref<i32>
41+
// CHECK: %[[C1_I32:.+]] = arith.constant 1 : i32
42+
// CHECK: %[[ADD1:.+]] = arith.addi %[[VAR3]], %[[C1_I32]] : i32
43+
// CHECK: memref.store %[[ADD1]], %[[ALLOC1]][] : memref<i32>
44+
// CHECK: }
4345
// CHECK: %[[VAR4:.+]] = memref.load %[[ALLOC1]][] : memref<i32>
4446
// CHECK: %[[C10_I32:.+]] = arith.constant 10 : i32
4547
// CHECK: %[[CMP:.+]] = arith.cmpi sle, %[[VAR4]], %[[C10_I32]] : i32
@@ -60,28 +62,30 @@ void nestedDoWhile() {
6062
// CHECK: %[[C0_I32:.+]] = arith.constant 0 : i32
6163
// CHECK: memref.store %[[C0_I32]], %[[alloca]][] : memref<i32>
6264
// CHECK: memref.alloca_scope {
63-
// CHECK: %[[alloca_0:.+]] = memref.alloca() {alignment = 4 : i64} : memref<i32>
6465
// CHECK: scf.while : () -> () {
65-
// CHECK: %[[ZERO:.+]] = memref.load %[[alloca]][] : memref<i32>
66-
// CHECK: %[[C1_I32:.+]] = arith.constant 1 : i32
67-
// CHECK: %[[ONE:.+]] = arith.addi %[[ZERO]], %[[C1_I32]] : i32
68-
// CHECK: memref.store %[[ONE]], %[[alloca]][] : memref<i32>
69-
// CHECK: %[[C0_I32_1:.+]] = arith.constant 0 : i32
70-
// CHECK: memref.store %[[C0_I32_1]], %[[alloca_0]][] : memref<i32>
71-
// CHECK: memref.alloca_scope {
72-
// CHECK: scf.while : () -> () {
73-
// CHECK: %[[EIGHT:.+]] = memref.load %[[alloca_0]][] : memref<i32>
74-
// CHECK: %[[C2_I32_3:.+]] = arith.constant 2 : i32
75-
// CHECK: %[[NINE:.+]] = arith.cmpi slt, %[[EIGHT]], %[[C2_I32_3]] : i32
76-
// CHECK: %[[TWELVE:.+]] = arith.extui %[[NINE]] : i1 to i8
77-
// CHECK: %[[THIRTEEN:.+]] = arith.trunci %[[TWELVE]] : i8 to i1
78-
// CHECK: scf.condition(%[[THIRTEEN]])
79-
// CHECK: } do {
80-
// CHECK: %[[EIGHT]] = memref.load %[[alloca_0]][] : memref<i32>
81-
// CHECK: %[[C1_I32_3:.+]] = arith.constant 1 : i32
82-
// CHECK: %[[NINE]] = arith.addi %[[EIGHT]], %[[C1_I32_3]] : i32
83-
// CHECK: memref.store %[[NINE]], %[[alloca_0]][] : memref<i32>
84-
// CHECK: scf.yield
66+
// CHECK: memref.alloca_scope {
67+
// CHECK: %[[alloca_0:.+]] = memref.alloca() {alignment = 4 : i64} : memref<i32>
68+
// CHECK: %[[ZERO:.+]] = memref.load %[[alloca]][] : memref<i32>
69+
// CHECK: %[[C1_I32:.+]] = arith.constant 1 : i32
70+
// CHECK: %[[ONE:.+]] = arith.addi %[[ZERO]], %[[C1_I32]] : i32
71+
// CHECK: memref.store %[[ONE]], %[[alloca]][] : memref<i32>
72+
// CHECK: %[[C0_I32_1:.+]] = arith.constant 0 : i32
73+
// CHECK: memref.store %[[C0_I32_1]], %[[alloca_0]][] : memref<i32>
74+
// CHECK: memref.alloca_scope {
75+
// CHECK: scf.while : () -> () {
76+
// CHECK: %[[EIGHT:.+]] = memref.load %[[alloca_0]][] : memref<i32>
77+
// CHECK: %[[C2_I32_3:.+]] = arith.constant 2 : i32
78+
// CHECK: %[[NINE:.+]] = arith.cmpi slt, %[[EIGHT]], %[[C2_I32_3]] : i32
79+
// CHECK: %[[TWELVE:.+]] = arith.extui %[[NINE]] : i1 to i8
80+
// CHECK: %[[THIRTEEN:.+]] = arith.trunci %[[TWELVE]] : i8 to i1
81+
// CHECK: scf.condition(%[[THIRTEEN]])
82+
// CHECK: } do {
83+
// CHECK: %[[EIGHT]] = memref.load %[[alloca_0]][] : memref<i32>
84+
// CHECK: %[[C1_I32_3:.+]] = arith.constant 1 : i32
85+
// CHECK: %[[NINE]] = arith.addi %[[EIGHT]], %[[C1_I32_3]] : i32
86+
// CHECK: memref.store %[[NINE]], %[[alloca_0]][] : memref<i32>
87+
// CHECK: scf.yield
88+
// CHECK: }
8589
// CHECK: }
8690
// CHECK: }
8791
// CHECK: %[[TWO:.+]] = memref.load %[[alloca]][] : memref<i32>

0 commit comments

Comments
 (0)