aboutsummaryrefslogtreecommitdiff
path: root/flang
diff options
context:
space:
mode:
authorJean Perier <jperier@nvidia.com>2022-07-25 19:38:08 +0200
committerJean Perier <jperier@nvidia.com>2022-07-25 19:38:59 +0200
commit244bd7cba7cba6abf889d594cc94355d958a9308 (patch)
tree9fa5074cc0914c41dad959326b9954eafca8c2ee /flang
parent[mlir] Update Python CMake version requirement. (diff)
downloadllvm-project-244bd7cba7cba6abf889d594cc94355d958a9308.tar.gz
llvm-project-244bd7cba7cba6abf889d594cc94355d958a9308.tar.bz2
llvm-project-244bd7cba7cba6abf889d594cc94355d958a9308.zip
[flang] Runs FIR SimplifyRegionLitePass pass after calling the inliner
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. Differential Revision: https://reviews.llvm.org/D130484
Diffstat (limited to 'flang')
-rw-r--r--flang/include/flang/Tools/CLOptions.inc1
-rw-r--r--flang/test/Driver/bbc-mlir-pass-pipeline.f901
-rw-r--r--flang/test/Driver/mlir-pass-pipeline.f901
-rw-r--r--flang/test/Fir/basic-program.fir1
-rw-r--r--flang/test/Fir/simplify-region-lite-after-inliner.fir36
5 files changed, 40 insertions, 0 deletions
diff --git a/flang/include/flang/Tools/CLOptions.inc b/flang/include/flang/Tools/CLOptions.inc
index 6d5ed9cbee87..5cf89d79ffc8 100644
--- a/flang/include/flang/Tools/CLOptions.inc
+++ b/flang/include/flang/Tools/CLOptions.inc
@@ -176,6 +176,7 @@ inline void createDefaultFIROptimizerPassPipeline(
llvm::StringMap<mlir::OpPassManager> 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
index 45ff3ebfbc22..388cc0574145 100644
--- a/flang/test/Driver/bbc-mlir-pass-pipeline.f90
+++ b/flang/test/Driver/bbc-mlir-pass-pipeline.f90
@@ -32,6 +32,7 @@ end program
! 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
index 78104285db57..5d9f0ce32b79 100644
--- a/flang/test/Driver/mlir-pass-pipeline.f90
+++ b/flang/test/Driver/mlir-pass-pipeline.f90
@@ -35,6 +35,7 @@ end program
! 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
index 8d1aab12c9a0..29efa845fafa 100644
--- a/flang/test/Fir/basic-program.fir
+++ b/flang/test/Fir/basic-program.fir
@@ -35,6 +35,7 @@ func.func @_QQmain() {
// 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
index 000000000000..c09612b5dabe
--- /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