diff --git a/clang/test/CIR/Transforms/scope.cir b/clang/test/CIR/Transforms/scope.cir new file mode 100644 index 0000000000000..d4fc957884a43 --- /dev/null +++ b/clang/test/CIR/Transforms/scope.cir @@ -0,0 +1,58 @@ +// RUN: cir-opt %s -cir-flatten-cfg -o - | FileCheck %s + +module { + cir.func @foo() { + cir.scope { + %0 = cir.alloca !cir.int, !cir.ptr>, ["a", init] {alignment = 4 : i64} + %1 = cir.const #cir.int<4> : !cir.int + cir.store %1, %0 : !cir.int, !cir.ptr> + } + cir.return + } +// CHECK: cir.func @foo() { +// CHECK: cir.br ^bb1 +// CHECK: ^bb1: // pred: ^bb0 +// CHECK: %0 = cir.alloca !cir.int, !cir.ptr>, ["a", init] {alignment = 4 : i64} +// CHECK: %1 = cir.const #cir.int<4> : !cir.int +// CHECK: cir.store %1, %0 : !cir.int, !cir.ptr> +// CHECK: cir.br ^bb2 +// CHECK: ^bb2: // pred: ^bb1 +// CHECK: cir.return +// CHECK: } + + // Should drop empty scopes. + cir.func @empty_scope() { + cir.scope { + } + cir.return + } +// CHECK: cir.func @empty_scope() { +// CHECK: cir.return +// CHECK: } + + cir.func @scope_with_return() -> !cir.int { + %0 = cir.alloca !cir.int, !cir.ptr>, ["__retval"] {alignment = 4 : i64} + cir.scope { + %2 = cir.const #cir.int<0> : !cir.int + cir.store %2, %0 : !cir.int, !cir.ptr> + %3 = cir.load %0 : !cir.ptr>, !cir.int + cir.return %3 : !cir.int + } + %1 = cir.load %0 : !cir.ptr>, !cir.int + cir.return %1 : !cir.int + } + +// CHECK: cir.func @scope_with_return() -> !cir.int { +// CHECK: %0 = cir.alloca !cir.int, !cir.ptr>, ["__retval"] {alignment = 4 : i64} +// CHECK: cir.br ^bb1 +// CHECK: ^bb1: // pred: ^bb0 +// CHECK: %1 = cir.const #cir.int<0> : !cir.int +// CHECK: cir.store %1, %0 : !cir.int, !cir.ptr> +// CHECK: %2 = cir.load %0 : !cir.ptr>, !cir.int +// CHECK: cir.return %2 : !cir.int +// CHECK: ^bb2: // no predecessors +// CHECK: %3 = cir.load %0 : !cir.ptr>, !cir.int +// CHECK: cir.return %3 : !cir.int +// CHECK: } + +} diff --git a/clang/tools/cir-opt/CMakeLists.txt b/clang/tools/cir-opt/CMakeLists.txt index ca7ee44f6fd75..cae7de6f056a9 100644 --- a/clang/tools/cir-opt/CMakeLists.txt +++ b/clang/tools/cir-opt/CMakeLists.txt @@ -24,6 +24,7 @@ clang_target_link_libraries(cir-opt clangCIR clangCIRLoweringDirectToLLVM MLIRCIR + MLIRCIRTransforms ) target_link_libraries(cir-opt diff --git a/clang/tools/cir-opt/cir-opt.cpp b/clang/tools/cir-opt/cir-opt.cpp index 0c0f6dcd9eecf..8e9311c591a3e 100644 --- a/clang/tools/cir-opt/cir-opt.cpp +++ b/clang/tools/cir-opt/cir-opt.cpp @@ -22,6 +22,7 @@ #include "mlir/Pass/PassRegistry.h" #include "mlir/Tools/mlir-opt/MlirOptMain.h" #include "clang/CIR/Dialect/IR/CIRDialect.h" +#include "clang/CIR/Dialect/Passes.h" #include "clang/CIR/Passes.h" struct CIRToLLVMPipelineOptions @@ -39,6 +40,10 @@ int main(int argc, char **argv) { cir::direct::populateCIRToLLVMPasses(pm); }); + ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> { + return mlir::createCIRFlattenCFGPass(); + }); + mlir::registerTransformsPasses(); return mlir::asMainReturnCode(MlirOptMain(