Skip to content

Commit be0215d

Browse files
authored
[CIR] Add transform test for cir-flatten-cfg (llvm#130861)
A previous change added the cir-flatten-cfg transform and tested it by lowering a function with nested scopes to LLVM IR. This change adds support for invoking the cir-flatten-cfg pass from the cir-opt tool and adds a new test to verify that functionality in isolation.
1 parent 62994c3 commit be0215d

File tree

3 files changed

+64
-0
lines changed

3 files changed

+64
-0
lines changed

clang/test/CIR/Transforms/scope.cir

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
// RUN: cir-opt %s -cir-flatten-cfg -o - | FileCheck %s
2+
3+
module {
4+
cir.func @foo() {
5+
cir.scope {
6+
%0 = cir.alloca !cir.int<u, 32>, !cir.ptr<!cir.int<u, 32>>, ["a", init] {alignment = 4 : i64}
7+
%1 = cir.const #cir.int<4> : !cir.int<u, 32>
8+
cir.store %1, %0 : !cir.int<u, 32>, !cir.ptr<!cir.int<u, 32>>
9+
}
10+
cir.return
11+
}
12+
// CHECK: cir.func @foo() {
13+
// CHECK: cir.br ^bb1
14+
// CHECK: ^bb1: // pred: ^bb0
15+
// CHECK: %0 = cir.alloca !cir.int<u, 32>, !cir.ptr<!cir.int<u, 32>>, ["a", init] {alignment = 4 : i64}
16+
// CHECK: %1 = cir.const #cir.int<4> : !cir.int<u, 32>
17+
// CHECK: cir.store %1, %0 : !cir.int<u, 32>, !cir.ptr<!cir.int<u, 32>>
18+
// CHECK: cir.br ^bb2
19+
// CHECK: ^bb2: // pred: ^bb1
20+
// CHECK: cir.return
21+
// CHECK: }
22+
23+
// Should drop empty scopes.
24+
cir.func @empty_scope() {
25+
cir.scope {
26+
}
27+
cir.return
28+
}
29+
// CHECK: cir.func @empty_scope() {
30+
// CHECK: cir.return
31+
// CHECK: }
32+
33+
cir.func @scope_with_return() -> !cir.int<u, 32> {
34+
%0 = cir.alloca !cir.int<u, 32>, !cir.ptr<!cir.int<u, 32>>, ["__retval"] {alignment = 4 : i64}
35+
cir.scope {
36+
%2 = cir.const #cir.int<0> : !cir.int<u, 32>
37+
cir.store %2, %0 : !cir.int<u, 32>, !cir.ptr<!cir.int<u, 32>>
38+
%3 = cir.load %0 : !cir.ptr<!cir.int<u, 32>>, !cir.int<u, 32>
39+
cir.return %3 : !cir.int<u, 32>
40+
}
41+
%1 = cir.load %0 : !cir.ptr<!cir.int<u, 32>>, !cir.int<u, 32>
42+
cir.return %1 : !cir.int<u, 32>
43+
}
44+
45+
// CHECK: cir.func @scope_with_return() -> !cir.int<u, 32> {
46+
// CHECK: %0 = cir.alloca !cir.int<u, 32>, !cir.ptr<!cir.int<u, 32>>, ["__retval"] {alignment = 4 : i64}
47+
// CHECK: cir.br ^bb1
48+
// CHECK: ^bb1: // pred: ^bb0
49+
// CHECK: %1 = cir.const #cir.int<0> : !cir.int<u, 32>
50+
// CHECK: cir.store %1, %0 : !cir.int<u, 32>, !cir.ptr<!cir.int<u, 32>>
51+
// CHECK: %2 = cir.load %0 : !cir.ptr<!cir.int<u, 32>>, !cir.int<u, 32>
52+
// CHECK: cir.return %2 : !cir.int<u, 32>
53+
// CHECK: ^bb2: // no predecessors
54+
// CHECK: %3 = cir.load %0 : !cir.ptr<!cir.int<u, 32>>, !cir.int<u, 32>
55+
// CHECK: cir.return %3 : !cir.int<u, 32>
56+
// CHECK: }
57+
58+
}

clang/tools/cir-opt/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ clang_target_link_libraries(cir-opt
2424
clangCIR
2525
clangCIRLoweringDirectToLLVM
2626
MLIRCIR
27+
MLIRCIRTransforms
2728
)
2829

2930
target_link_libraries(cir-opt

clang/tools/cir-opt/cir-opt.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include "mlir/Pass/PassRegistry.h"
2323
#include "mlir/Tools/mlir-opt/MlirOptMain.h"
2424
#include "clang/CIR/Dialect/IR/CIRDialect.h"
25+
#include "clang/CIR/Dialect/Passes.h"
2526
#include "clang/CIR/Passes.h"
2627

2728
struct CIRToLLVMPipelineOptions
@@ -39,6 +40,10 @@ int main(int argc, char **argv) {
3940
cir::direct::populateCIRToLLVMPasses(pm);
4041
});
4142

43+
::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
44+
return mlir::createCIRFlattenCFGPass();
45+
});
46+
4247
mlir::registerTransformsPasses();
4348

4449
return mlir::asMainReturnCode(MlirOptMain(

0 commit comments

Comments
 (0)