Skip to content

Commit 5c5d584

Browse files
authored
[CIR][NFC] Conform if/else lowering order to match clang's output (#1107)
Before the commit, when flattening if/else clauses - the else body came before the "then" body, as opposed to clang's output order. This commit reverses this and hopefully allows easier comparisson between clang's output and cir's.
1 parent a18a580 commit 5c5d584

File tree

5 files changed

+28
-28
lines changed

5 files changed

+28
-28
lines changed

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ struct CIRIfFlattening : public OpRewritePattern<IfOp> {
9191
if (!emptyElse) {
9292
elseBeforeBody = &ifOp.getElseRegion().front();
9393
elseAfterBody = &ifOp.getElseRegion().back();
94-
rewriter.inlineRegionBefore(ifOp.getElseRegion(), thenAfterBody);
94+
rewriter.inlineRegionBefore(ifOp.getElseRegion(), continueBlock);
9595
} else {
9696
elseBeforeBody = elseAfterBody = continueBlock;
9797
}

clang/test/CIR/CodeGen/abstract-cond.c

+3-3
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,11 @@ int f6(int a0, struct s6 a1, struct s6 a2) {
2727
// LLVM: %[[LOAD_A0:.*]] = load i32, ptr {{.*}}
2828
// LLVM: %[[COND:.*]] = icmp ne i32 %[[LOAD_A0]], 0
2929
// LLVM: br i1 %[[COND]], label %[[A1_PATH:.*]], label %[[A2_PATH:.*]],
30-
// LLVM: [[A2_PATH]]:
30+
// LLVM: [[A1_PATH]]:
3131
// LLVM: call void @llvm.memcpy.p0.p0.i32(ptr %[[TMP:.*]], ptr {{.*}}, i32 4, i1 false)
3232
// LLVM: br label %[[EXIT:[a-z0-9]+]]
33-
// LLVM: [[A1_PATH]]:
33+
// LLVM: [[A2_PATH]]:
3434
// LLVM: call void @llvm.memcpy.p0.p0.i32(ptr %[[TMP]], ptr {{.*}}, i32 4, i1 false)
3535
// LLVM: br label %[[EXIT]]
3636
// LLVM: [[EXIT]]:
37-
// LLVM: getelementptr {{.*}}, ptr %[[TMP]], i32 0, i32 0
37+
// LLVM: getelementptr {{.*}}, ptr %[[TMP]], i32 0, i32 0

clang/test/CIR/Lowering/if.cir

+9-9
Original file line numberDiff line numberDiff line change
@@ -18,26 +18,26 @@ module {
1818
// MLIR: llvm.func @foo(%arg0: i32) -> i32
1919
// MLIR-NEXT: %0 = llvm.mlir.constant(0 : i32) : i32
2020
// MLIR-NEXT: %1 = llvm.icmp "ne" %arg0, %0 : i32
21-
// MLIR-NEXT: llvm.cond_br %1, ^bb2, ^bb1
21+
// MLIR-NEXT: llvm.cond_br %1, ^bb1, ^bb2
2222
// MLIR-NEXT: ^bb1: // pred: ^bb0
23-
// MLIR-NEXT: %2 = llvm.mlir.constant(0 : i32) : i32
23+
// MLIR-NEXT: %2 = llvm.mlir.constant(1 : i32) : i32
2424
// MLIR-NEXT: llvm.return %2 : i32
2525
// MLIR-NEXT: ^bb2: // pred: ^bb0
26-
// MLIR-NEXT: %3 = llvm.mlir.constant(1 : i32) : i32
26+
// MLIR-NEXT: %3 = llvm.mlir.constant(0 : i32) : i32
2727
// MLIR-NEXT: llvm.return %3 : i32
2828
// MLIR-NEXT: ^bb3: // no predecessors
2929
// MLIR-NEXT: llvm.return %arg0 : i32
3030
// MLIR-NEXT: }
3131

3232
// LLVM: define i32 @foo(i32 %0)
3333
// LLVM-NEXT: %2 = icmp ne i32 %0, 0
34-
// LLVM-NEXT: br i1 %2, label %4, label %3
34+
// LLVM-NEXT: br i1 %2, label %3, label %4
3535
// LLVM-EMPTY:
3636
// LLVM-NEXT: 3:
37-
// LLVM-NEXT: ret i32 0
37+
// LLVM-NEXT: ret i32 1
3838
// LLVM-EMPTY:
3939
// LLVM-NEXT: 4:
40-
// LLVM-NEXT: ret i32 1
40+
// LLVM-NEXT: ret i32 0
4141
// LLVM-EMPTY:
4242
// LLVM-NEXT: 5:
4343
// LLVM-NEXT: ret i32 %0
@@ -85,12 +85,12 @@ module {
8585
%4 = cir.cast(int_to_bool, %arg0 : !s32i), !cir.bool
8686
// MLIR: llvm.cond_br {{%.*}}, ^[[T:.*]], ^[[F:.*]]
8787
cir.if %4 {
88+
// MLIR-NEXT: ^[[T]]:
89+
// MLIR-NEXT: llvm.br ^[[PHI:.*]]
8890
} else {
89-
}
9091
// MLIR-NEXT: ^[[F]]:
91-
// MLIR-NEXT: llvm.br ^[[PHI:.*]]
92-
// MLIR-NEXT: ^[[T]]:
9392
// MLIR-NEXT: llvm.br ^[[PHI]]
93+
}
9494
// MLIR-NEXT: ^[[PHI]]:
9595
// MLIR-NEXT: llvm.return
9696
cir.return %arg0 : !s32i

clang/test/CIR/Transforms/if.cir

+4-4
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,12 @@ module {
1616
}
1717
// CHECK: cir.func @foo(%arg0: !s32i) -> !s32i {
1818
// CHECK-NEXT: %0 = cir.cast(int_to_bool, %arg0 : !s32i), !cir.bool
19-
// CHECK-NEXT: cir.brcond %0 ^bb2, ^bb1
19+
// CHECK-NEXT: cir.brcond %0 ^bb1, ^bb2
2020
// CHECK-NEXT: ^bb1: // pred: ^bb0
21-
// CHECK-NEXT: %1 = cir.const #cir.int<0> : !s32i
21+
// CHECK-NEXT: %1 = cir.const #cir.int<1> : !s32i
2222
// CHECK-NEXT: cir.return %1 : !s32i
2323
// CHECK-NEXT: ^bb2: // pred: ^bb0
24-
// CHECK-NEXT: %2 = cir.const #cir.int<1> : !s32i
24+
// CHECK-NEXT: %2 = cir.const #cir.int<0> : !s32i
2525
// CHECK-NEXT: cir.return %2 : !s32i
2626
// CHECK-NEXT: ^bb3: // no predecessors
2727
// CHECK-NEXT: cir.return %arg0 : !s32i
@@ -45,4 +45,4 @@ module {
4545
// CHECK-NEXT: cir.return %arg0 : !s32i
4646
// CHECK-NEXT: }
4747

48-
}
48+
}

clang/test/CIR/Transforms/mem2reg.c

+11-11
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
1-
// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fclangir -emit-cir %s -o %t.cir
1+
// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fclangir -emit-cir %s -o %t.cir
22
// RUN: FileCheck --input-file=%t.cir %s -check-prefix=BEFORE
3-
// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fclangir -emit-cir -fclangir-mem2reg %s -o %t.cir
3+
// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fclangir -emit-cir -fclangir-mem2reg %s -o %t.cir
44
// RUN: FileCheck --input-file=%t.cir %s -check-prefix=MEM2REG
55

66
int return_42() {
77
int y = 42;
8-
return y;
8+
return y;
99
}
1010

1111
// BEFORE: cir.func {{.*@return_42}}
1212
// BEFORE: %0 = cir.alloca !s32i, !cir.ptr<!s32i>, ["__retval"] {alignment = 4 : i64}
1313
// BEFORE: %1 = cir.alloca !s32i, !cir.ptr<!s32i>, ["y", init] {alignment = 4 : i64}
1414
// BEFORE: %2 = cir.const #cir.int<42> : !s32i
15-
// BEFORE: cir.store %2, %1 : !s32i, !cir.ptr<!s32i>
15+
// BEFORE: cir.store %2, %1 : !s32i, !cir.ptr<!s32i>
1616
// BEFORE: %3 = cir.load %1 : !cir.ptr<!s32i>, !s32i
1717
// BEFORE: cir.store %3, %0 : !s32i, !cir.ptr<!s32i>
1818
// BEFORE: %4 = cir.load %0 : !cir.ptr<!s32i>, !s32i
@@ -63,7 +63,7 @@ void alloca_in_loop(int* ar, int n) {
6363
// BEFORE: cir.yield
6464
// BEFORE: }
6565
// BEFORE: }
66-
// BEFORE: cir.return
66+
// BEFORE: cir.return
6767

6868
// MEM2REG: cir.func {{.*@alloca_in_loop}}
6969
// MEM2REG: cir.br ^bb1
@@ -152,13 +152,13 @@ int alloca_in_ifelse(int x) {
152152
// MEM2REG: %1 = cir.const #cir.int<42> : !s32i
153153
// MEM2REG: %2 = cir.cmp(gt, %arg0, %1) : !s32i, !s32i
154154
// MEM2REG: %3 = cir.cast(int_to_bool, %2 : !s32i), !cir.bool
155-
// MEM2REG: cir.brcond %3 ^bb3, ^bb2
155+
// MEM2REG: cir.brcond %3 ^bb2, ^bb3
156156
// MEM2REG: ^bb2: // pred: ^bb1
157-
// MEM2REG: %4 = cir.const #cir.int<3> : !s32i
157+
// MEM2REG: %4 = cir.const #cir.int<2> : !s32i
158158
// MEM2REG: %5 = cir.binop(mul, %arg0, %4) nsw : !s32i
159159
// MEM2REG: cir.br ^bb4(%5 : !s32i)
160160
// MEM2REG: ^bb3: // pred: ^bb1
161-
// MEM2REG: %6 = cir.const #cir.int<2> : !s32i
161+
// MEM2REG: %6 = cir.const #cir.int<3> : !s32i
162162
// MEM2REG: %7 = cir.binop(mul, %arg0, %6) nsw : !s32i
163163
// MEM2REG: cir.br ^bb4(%7 : !s32i)
164164
// MEM2REG: ^bb4(%8: !s32i{{.*}}): // 2 preds: ^bb2, ^bb3
@@ -174,7 +174,7 @@ int alloca_in_ifelse(int x) {
174174

175175
typedef __SIZE_TYPE__ size_t;
176176
void *alloca(size_t size);
177-
177+
178178
void test_bitcast(size_t n) {
179179
int *c1 = alloca(n);
180180
}
@@ -189,7 +189,7 @@ void test_bitcast(size_t n) {
189189
// BEFORE: %5 = cir.cast(bitcast, %4 : !cir.ptr<!void>), !cir.ptr<!s32i>
190190
// BEFORE: cir.store %5, %1 : !cir.ptr<!s32i>, !cir.ptr<!cir.ptr<!s32i>>
191191
// BEFORE: cir.return
192-
192+
193193
// MEM2REG: cir.func {{.*@test_bitcast}}
194194
// MEM2REG: cir.return
195-
// MEM2REG: }
195+
// MEM2REG: }

0 commit comments

Comments
 (0)