From 244bd7cba7cba6abf889d594cc94355d958a9308 Mon Sep 17 00:00:00 2001 From: Jean Perier Date: Mon, 25 Jul 2022 19:38:08 +0200 Subject: [PATCH] [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 --- flang/include/flang/Tools/CLOptions.inc | 1 + flang/test/Driver/bbc-mlir-pass-pipeline.f90 | 1 + flang/test/Driver/mlir-pass-pipeline.f90 | 1 + flang/test/Fir/basic-program.fir | 1 + .../Fir/simplify-region-lite-after-inliner.fir | 36 ++++++++++++++++++++++ 5 files changed, 40 insertions(+) create mode 100644 flang/test/Fir/simplify-region-lite-after-inliner.fir diff --git a/flang/include/flang/Tools/CLOptions.inc b/flang/include/flang/Tools/CLOptions.inc index 6d5ed9c..5cf89d7 100644 --- a/flang/include/flang/Tools/CLOptions.inc +++ b/flang/include/flang/Tools/CLOptions.inc @@ -176,6 +176,7 @@ inline void createDefaultFIROptimizerPassPipeline( 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 index 45ff3eb..388cc05 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 7810428..5d9f0ce 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 8d1aab1..29efa84 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 0000000..c09612b --- /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 -- 2.7.4