[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
This commit is contained in:
Jean Perier 2022-07-25 19:38:08 +02:00
parent e0af5032f1
commit 244bd7cba7
5 changed files with 40 additions and 0 deletions

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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