13
13
14
14
namespace fir {
15
15
16
- void addNestedPassToAllTopLevelOperations (mlir::PassManager &pm,
17
- PassConstructor ctor) {
18
- addNestedPassToOps<mlir::func::FuncOp, mlir::omp::DeclareReductionOp,
16
+ template < typename F>
17
+ void addNestedPassToAllTopLevelOperations (mlir::PassManager &pm, F ctor) {
18
+ addNestedPassToOps<F, mlir::func::FuncOp, mlir::omp::DeclareReductionOp,
19
19
mlir::omp::PrivateClauseOp, fir::GlobalOp,
20
20
mlir::gpu::GPUModuleOp>(pm, ctor);
21
21
}
22
22
23
+ template <typename F>
23
24
void addNestedPassToAllTopLevelOperationsConditionally (
24
- mlir::PassManager &pm, llvm::cl::opt<bool > &disabled,
25
- PassConstructor ctor) {
25
+ mlir::PassManager &pm, llvm::cl::opt<bool > &disabled, F ctor) {
26
26
if (!disabled)
27
- addNestedPassToAllTopLevelOperations (pm, ctor);
27
+ addNestedPassToAllTopLevelOperations<F> (pm, ctor);
28
28
}
29
29
30
30
void addCanonicalizerPassWithoutRegionSimplification (mlir::OpPassManager &pm) {
@@ -35,12 +35,11 @@ void addCanonicalizerPassWithoutRegionSimplification(mlir::OpPassManager &pm) {
35
35
36
36
void addCfgConversionPass (mlir::PassManager &pm,
37
37
const MLIRToLLVMPassPipelineConfig &config) {
38
- if (config.NSWOnLoopVarInc )
39
- addNestedPassToAllTopLevelOperationsConditionally (pm, disableCfgConversion,
40
- fir::createCFGConversion);
41
- else
42
- addNestedPassToAllTopLevelOperationsConditionally (
43
- pm, disableCfgConversion, fir::createCFGConversionPassWithoutNSW);
38
+ fir::CFGConversionOptions options;
39
+ if (!config.NSWOnLoopVarInc )
40
+ options.setNSW = false ;
41
+ addNestedPassToAllTopLevelOperationsConditionally (
42
+ pm, disableCfgConversion, [&]() { return createCFGConversion (options); });
44
43
}
45
44
46
45
void addAVC (mlir::PassManager &pm, const llvm::OptimizationLevel &optLevel) {
@@ -161,7 +160,8 @@ void createDefaultFIROptimizerPassPipeline(mlir::PassManager &pm,
161
160
config.enableRegionSimplification = mlir::GreedySimplifyRegionLevel::Disabled;
162
161
pm.addPass (mlir::createCSEPass ());
163
162
fir::addAVC (pm, pc.OptLevel );
164
- addNestedPassToAllTopLevelOperations (pm, fir::createCharacterConversion);
163
+ addNestedPassToAllTopLevelOperations<PassConstructor>(
164
+ pm, fir::createCharacterConversion);
165
165
pm.addPass (mlir::createCanonicalizerPass (config));
166
166
pm.addPass (fir::createSimplifyRegionLite ());
167
167
if (pc.OptLevel .isOptimizingForSpeed ()) {
@@ -195,7 +195,8 @@ void createDefaultFIROptimizerPassPipeline(mlir::PassManager &pm,
195
195
if (pc.AliasAnalysis && !disableFirAliasTags && !useOldAliasTags)
196
196
pm.addPass (fir::createAddAliasTags ());
197
197
198
- addNestedPassToAllTopLevelOperations (pm, fir::createStackReclaim);
198
+ addNestedPassToAllTopLevelOperations<PassConstructor>(
199
+ pm, fir::createStackReclaim);
199
200
// convert control flow to CFG form
200
201
fir::addCfgConversionPass (pm, pc);
201
202
pm.addPass (mlir::createConvertSCFToCFPass ());
@@ -217,15 +218,16 @@ void createHLFIRToFIRPassPipeline(mlir::PassManager &pm, bool enableOpenMP,
217
218
llvm::OptimizationLevel optLevel) {
218
219
if (optLevel.isOptimizingForSpeed ()) {
219
220
addCanonicalizerPassWithoutRegionSimplification (pm);
220
- addNestedPassToAllTopLevelOperations (pm,
221
- hlfir::createSimplifyHLFIRIntrinsics);
221
+ addNestedPassToAllTopLevelOperations<PassConstructor>(
222
+ pm, hlfir::createSimplifyHLFIRIntrinsics);
222
223
}
223
- addNestedPassToAllTopLevelOperations (pm, hlfir::createInlineElementals);
224
+ addNestedPassToAllTopLevelOperations<PassConstructor>(
225
+ pm, hlfir::createInlineElementals);
224
226
if (optLevel.isOptimizingForSpeed ()) {
225
227
addCanonicalizerPassWithoutRegionSimplification (pm);
226
228
pm.addPass (mlir::createCSEPass ());
227
- addNestedPassToAllTopLevelOperations (pm,
228
- hlfir::createOptimizedBufferization);
229
+ addNestedPassToAllTopLevelOperations<PassConstructor>(
230
+ pm, hlfir::createOptimizedBufferization);
229
231
}
230
232
pm.addPass (hlfir::createLowerHLFIROrderedAssignments ());
231
233
pm.addPass (hlfir::createLowerHLFIRIntrinsics ());
@@ -265,7 +267,8 @@ void createDefaultFIRCodeGenPassPipeline(mlir::PassManager &pm,
265
267
MLIRToLLVMPassPipelineConfig config,
266
268
llvm::StringRef inputFilename) {
267
269
fir::addBoxedProcedurePass (pm);
268
- addNestedPassToAllTopLevelOperations (pm, fir::createAbstractResultOpt);
270
+ addNestedPassToAllTopLevelOperations<PassConstructor>(
271
+ pm, fir::createAbstractResultOpt);
269
272
fir::addCodeGenRewritePass (
270
273
pm, (config.DebugInfo != llvm::codegenoptions::NoDebugInfo));
271
274
fir::addExternalNameConversionPass (pm, config.Underscoring );
0 commit comments