diff --git a/flang/include/flang/Tools/CLOptions.inc b/flang/include/flang/Tools/CLOptions.inc --- a/flang/include/flang/Tools/CLOptions.inc +++ b/flang/include/flang/Tools/CLOptions.inc @@ -176,6 +176,7 @@ llvm::StringMap pipelines; pm.addPass( mlir::createInlinerPass(pipelines, defaultFlangInlinerOptPipeline)); + pm.addPass(fir::createSimplifyRegionLitePass()); pm.addPass(mlir::createCSEPass()); // convert control flow to CFG form diff --git a/flang/test/Driver/bbc-mlir-pass-pipeline.f90 b/flang/test/Driver/bbc-mlir-pass-pipeline.f90 --- a/flang/test/Driver/bbc-mlir-pass-pipeline.f90 +++ b/flang/test/Driver/bbc-mlir-pass-pipeline.f90 @@ -32,6 +32,7 @@ ! CHECK-NEXT: MemoryAllocationOpt ! CHECK-NEXT: Inliner +! CHECK-NEXT: SimplifyRegionLite ! CHECK-NEXT: CSE ! CHECK-NEXT: (S) 0 num-cse'd - Number of operations CSE'd ! CHECK-NEXT: (S) 0 num-dce'd - Number of operations DCE'd diff --git a/flang/test/Driver/mlir-pass-pipeline.f90 b/flang/test/Driver/mlir-pass-pipeline.f90 --- a/flang/test/Driver/mlir-pass-pipeline.f90 +++ b/flang/test/Driver/mlir-pass-pipeline.f90 @@ -35,6 +35,7 @@ ! ALL-NEXT: MemoryAllocationOpt ! ALL-NEXT: Inliner +! ALL-NEXT: SimplifyRegionLite ! ALL-NEXT: CSE ! ALL-NEXT: (S) 0 num-cse'd - Number of operations CSE'd ! ALL-NEXT: (S) 0 num-dce'd - Number of operations DCE'd diff --git a/flang/test/Fir/basic-program.fir b/flang/test/Fir/basic-program.fir --- a/flang/test/Fir/basic-program.fir +++ b/flang/test/Fir/basic-program.fir @@ -35,6 +35,7 @@ // PASSES-NEXT: MemoryAllocationOpt // PASSES-NEXT: Inliner +// PASSES-NEXT: SimplifyRegionLite // PASSES-NEXT: CSE // PASSES-NEXT: (S) 0 num-cse'd - Number of operations CSE'd // PASSES-NEXT: (S) 0 num-dce'd - Number of operations DCE'd diff --git a/flang/test/Fir/simplify-region-lite-after-inliner.fir b/flang/test/Fir/simplify-region-lite-after-inliner.fir new file mode 100644 --- /dev/null +++ b/flang/test/Fir/simplify-region-lite-after-inliner.fir @@ -0,0 +1,36 @@ +// RUN: tco %s | FileCheck %s + + +// In flang pipeline, the inliner calls createCanonicalizerPass with the region +// simplification disabled. The inliner pass does canonicalization even if +// no inlining happens. After canonicalization, FIR lite region simplification +// must be called to get rid of unreachable regions. +// This code exposes the need to run SimplifyRegionLitePass after the inliner is +// called with FIR pipeline. + + +func.func @repro(%arg0: i8, %arg1: i8) { + %c34_i8 = arith.constant 34 : i8 + %c-1_i8 = arith.constant -1 : i8 + %2 = arith.xori %c34_i8, %c-1_i8 : i8 + %3 = arith.andi %arg0, %c34_i8 : i8 + %4 = arith.andi %arg1, %2 : i8 + %5 = arith.ori %3, %4 : i8 + %c34_i8_0 = arith.constant 34 : i8 + %7 = arith.andi %arg0, %c34_i8_0 : i8 + %c-35_i8 = arith.constant -35 : i8 + %9 = arith.andi %arg1, %c-35_i8 : i8 + %10 = arith.ori %7, %9 : i8 + %11 = arith.cmpi ne, %5, %10 : i8 + cf.cond_br %11, ^bb1, ^bb2 +^bb1: // pred: ^bb0 + %13 = func.call @foo() : () -> none + cf.br ^bb2 +^bb2: // pred: ^bb0, ^bb2 + return +} +func.func private @foo() -> none + + +// CHECK: define void @repro(i8 %0, i8 %1) +// CHECK-NEXT ret void