Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 6dfdeaf

Browse filesBrowse files
author
yanming
committed
[flang][fir] Add affine optimization pass pipeline.
1 parent db2d576 commit 6dfdeaf
Copy full SHA for 6dfdeaf

File tree

Expand file treeCollapse file tree

7 files changed

+50
-0
lines changed
Filter options
Expand file treeCollapse file tree

7 files changed

+50
-0
lines changed

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

Copy file name to clipboardExpand all lines: flang/include/flang/Optimizer/Passes/CommandLineOpts.h
+1Lines 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

Copy file name to clipboardExpand all lines: flang/include/flang/Optimizer/Passes/Pipelines.h
+3Lines 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

Copy file name to clipboardExpand all lines: flang/lib/Optimizer/Passes/CMakeLists.txt
+1Lines 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

Copy file name to clipboardExpand all lines: flang/lib/Optimizer/Passes/CommandLineOpts.cpp
+1Lines 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

Copy file name to clipboardExpand all lines: flang/lib/Optimizer/Passes/Pipelines.cpp
+20Lines 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 (like 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

Copy file name to clipboardExpand all lines: flang/test/Driver/mlir-pass-pipeline.f90
+14Lines 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
+10Lines 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 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.