Skip to content

Commit 4e6b42c

Browse files
author
yanming
committed
[flang][fir] Add affine optimization pass pipeline.
1 parent db2d576 commit 4e6b42c

File tree

7 files changed

+50
-0
lines changed

7 files changed

+50
-0
lines changed

flang/include/flang/Optimizer/Passes/CommandLineOpts.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ extern llvm::cl::opt<bool> disableCfgConversion;
4242
extern llvm::cl::opt<bool> disableFirAvc;
4343
extern llvm::cl::opt<bool> disableFirMao;
4444

45+
extern llvm::cl::opt<bool> enableAffineOpt;
4546
extern llvm::cl::opt<bool> disableFirAliasTags;
4647
extern llvm::cl::opt<bool> useOldAliasTags;
4748

flang/include/flang/Optimizer/Passes/Pipelines.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,11 @@
1818
#include "flang/Optimizer/Passes/CommandLineOpts.h"
1919
#include "flang/Optimizer/Transforms/Passes.h"
2020
#include "flang/Tools/CrossToolHelpers.h"
21+
#include "mlir/Conversion/AffineToStandard/AffineToStandard.h"
2122
#include "mlir/Conversion/ReconcileUnrealizedCasts/ReconcileUnrealizedCasts.h"
2223
#include "mlir/Conversion/SCFToControlFlow/SCFToControlFlow.h"
24+
#include "mlir/Conversion/SCFToOpenMP/SCFToOpenMP.h"
25+
#include "mlir/Dialect/Affine/Passes.h"
2326
#include "mlir/Dialect/GPU/IR/GPUDialect.h"
2427
#include "mlir/Dialect/LLVMIR/LLVMAttrs.h"
2528
#include "mlir/Pass/PassManager.h"

flang/lib/Optimizer/Passes/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ add_flang_library(flangPasses
2121
MLIRPass
2222
MLIRReconcileUnrealizedCasts
2323
MLIRSCFToControlFlow
24+
MLIRSCFToOpenMP
2425
MLIRSupport
2526
MLIRTransforms
2627
)

flang/lib/Optimizer/Passes/CommandLineOpts.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ cl::opt<bool> useOldAliasTags(
5555
cl::desc("Use a single TBAA tree for all functions and do not use "
5656
"the FIR alias tags pass"),
5757
cl::init(false), cl::Hidden);
58+
EnableOption(AffineOpt, "affine-opt", "affine optimization");
5859

5960
/// CodeGen Passes
6061
DisableOption(CodeGenRewrite, "codegen-rewrite", "rewrite FIR for codegen");

flang/lib/Optimizer/Passes/Pipelines.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,26 @@ void createDefaultFIROptimizerPassPipeline(mlir::PassManager &pm,
209209
if (pc.AliasAnalysis && !disableFirAliasTags && !useOldAliasTags)
210210
pm.addPass(fir::createAddAliasTags());
211211

212+
// We can first convert the FIR dialect to the Affine dialect, perform
213+
// optimizations on top of it, and then lower it to the FIR dialect.
214+
// TODO: These optimization passes (e.g., PromoteToAffinePass) are currently
215+
// experimental, so it's important to actively identify and address issues.
216+
if (enableAffineOpt && pc.OptLevel.isOptimizingForSpeed()) {
217+
pm.addPass(fir::createPromoteToAffinePass());
218+
pm.addPass(mlir::createCSEPass());
219+
pm.addPass(mlir::affine::createAffineLoopInvariantCodeMotionPass());
220+
pm.addPass(mlir::affine::createAffineLoopNormalizePass());
221+
pm.addPass(mlir::affine::createSimplifyAffineStructuresPass());
222+
pm.addPass(mlir::affine::createAffineParallelize(
223+
mlir::affine::AffineParallelizeOptions{1, false}));
224+
pm.addPass(fir::createAffineDemotionPass());
225+
pm.addPass(mlir::createLowerAffinePass());
226+
if (pc.EnableOpenMP) {
227+
pm.addPass(mlir::createConvertSCFToOpenMPPass());
228+
pm.addPass(mlir::createCanonicalizerPass());
229+
}
230+
}
231+
212232
addNestedPassToAllTopLevelOperations<PassConstructor>(
213233
pm, fir::createStackReclaim);
214234
// convert control flow to CFG form

flang/test/Driver/mlir-pass-pipeline.f90

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
! -O0 is the default:
55
! RUN: %flang_fc1 -S -mmlir --mlir-pass-statistics -mmlir --mlir-pass-statistics-display=pipeline %s -O0 -o /dev/null 2>&1 | FileCheck --check-prefixes=ALL %s
66
! RUN: %flang_fc1 -S -mmlir --mlir-pass-statistics -mmlir --mlir-pass-statistics-display=pipeline %s -O2 -o /dev/null 2>&1 | FileCheck --check-prefixes=ALL,O2 %s
7+
! RUN: %flang_fc1 -S -mmlir --mlir-pass-statistics -mmlir --mlir-pass-statistics-display=pipeline -mllvm --enable-affine-opt %s -O2 -o /dev/null 2>&1 | FileCheck --check-prefixes=ALL,O2,AFFINE %s
78

89
! REQUIRES: asserts
910

@@ -105,6 +106,19 @@
105106
! ALL-NEXT: SimplifyFIROperations
106107
! O2-NEXT: AddAliasTags
107108

109+
! AFFINE-NEXT: 'func.func' Pipeline
110+
! AFFINE-NEXT: AffineDialectPromotion
111+
! AFFINE-NEXT: CSE
112+
! AFFINE-NEXT: (S) 0 num-cse'd - Number of operations CSE'd
113+
! AFFINE-NEXT: (S) 0 num-dce'd - Number of operations DCE'd
114+
! AFFINE-NEXT: 'func.func' Pipeline
115+
! AFFINE-NEXT: AffineLoopInvariantCodeMotion
116+
! AFFINE-NEXT: AffineLoopNormalize
117+
! AFFINE-NEXT: SimplifyAffineStructures
118+
! AFFINE-NEXT: AffineParallelize
119+
! AFFINE-NEXT: AffineDialectDemotion
120+
! AFFINE-NEXT: LowerAffinePass
121+
108122
! ALL-NEXT: Pipeline Collection : ['fir.global', 'func.func', 'omp.declare_reduction', 'omp.private']
109123
! ALL-NEXT: 'fir.global' Pipeline
110124
! ALL-NEXT: StackReclaim
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
! RUN: %flang_fc1 -O1 -mllvm --enable-affine-opt -emit-llvm -fopenmp -o - %s \
2+
! RUN: | FileCheck %s
3+
4+
!CHECK-LABEL: define void @foo_(ptr captures(none) %0) {{.*}} {
5+
!CHECK: call void{{.*}}@__kmpc_fork_call{{.*}}@[[OMP_OUTLINED_FN_1:.*]])
6+
7+
subroutine foo(a)
8+
integer, dimension(100, 100), intent(out) :: a
9+
a = 1
10+
end subroutine foo

0 commit comments

Comments
 (0)