forked from OSchip/llvm-project
[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:
parent
e0af5032f1
commit
244bd7cba7
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
Loading…
Reference in New Issue