1313
1414namespace fir {
1515
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,
1919 mlir::omp::PrivateClauseOp, fir::GlobalOp,
2020 mlir::gpu::GPUModuleOp>(pm, ctor);
2121}
2222
23+ template <typename F>
2324void addNestedPassToAllTopLevelOperationsConditionally (
24- mlir::PassManager &pm, llvm::cl::opt<bool > &disabled,
25- PassConstructor ctor) {
25+ mlir::PassManager &pm, llvm::cl::opt<bool > &disabled, F ctor) {
2626 if (!disabled)
27- addNestedPassToAllTopLevelOperations (pm, ctor);
27+ addNestedPassToAllTopLevelOperations<F> (pm, ctor);
2828}
2929
3030void addCanonicalizerPassWithoutRegionSimplification (mlir::OpPassManager &pm) {
@@ -35,12 +35,11 @@ void addCanonicalizerPassWithoutRegionSimplification(mlir::OpPassManager &pm) {
3535
3636void addCfgConversionPass (mlir::PassManager &pm,
3737 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); });
4443}
4544
4645void addAVC (mlir::PassManager &pm, const llvm::OptimizationLevel &optLevel) {
@@ -161,7 +160,8 @@ void createDefaultFIROptimizerPassPipeline(mlir::PassManager &pm,
161160 config.enableRegionSimplification = mlir::GreedySimplifyRegionLevel::Disabled;
162161 pm.addPass (mlir::createCSEPass ());
163162 fir::addAVC (pm, pc.OptLevel );
164- addNestedPassToAllTopLevelOperations (pm, fir::createCharacterConversion);
163+ addNestedPassToAllTopLevelOperations<PassConstructor>(
164+ pm, fir::createCharacterConversion);
165165 pm.addPass (mlir::createCanonicalizerPass (config));
166166 pm.addPass (fir::createSimplifyRegionLite ());
167167 if (pc.OptLevel .isOptimizingForSpeed ()) {
@@ -195,7 +195,8 @@ void createDefaultFIROptimizerPassPipeline(mlir::PassManager &pm,
195195 if (pc.AliasAnalysis && !disableFirAliasTags && !useOldAliasTags)
196196 pm.addPass (fir::createAddAliasTags ());
197197
198- addNestedPassToAllTopLevelOperations (pm, fir::createStackReclaim);
198+ addNestedPassToAllTopLevelOperations<PassConstructor>(
199+ pm, fir::createStackReclaim);
199200 // convert control flow to CFG form
200201 fir::addCfgConversionPass (pm, pc);
201202 pm.addPass (mlir::createConvertSCFToCFPass ());
@@ -217,15 +218,16 @@ void createHLFIRToFIRPassPipeline(mlir::PassManager &pm, bool enableOpenMP,
217218 llvm::OptimizationLevel optLevel) {
218219 if (optLevel.isOptimizingForSpeed ()) {
219220 addCanonicalizerPassWithoutRegionSimplification (pm);
220- addNestedPassToAllTopLevelOperations (pm,
221- hlfir::createSimplifyHLFIRIntrinsics);
221+ addNestedPassToAllTopLevelOperations<PassConstructor>(
222+ pm, hlfir::createSimplifyHLFIRIntrinsics);
222223 }
223- addNestedPassToAllTopLevelOperations (pm, hlfir::createInlineElementals);
224+ addNestedPassToAllTopLevelOperations<PassConstructor>(
225+ pm, hlfir::createInlineElementals);
224226 if (optLevel.isOptimizingForSpeed ()) {
225227 addCanonicalizerPassWithoutRegionSimplification (pm);
226228 pm.addPass (mlir::createCSEPass ());
227- addNestedPassToAllTopLevelOperations (pm,
228- hlfir::createOptimizedBufferization);
229+ addNestedPassToAllTopLevelOperations<PassConstructor>(
230+ pm, hlfir::createOptimizedBufferization);
229231 }
230232 pm.addPass (hlfir::createLowerHLFIROrderedAssignments ());
231233 pm.addPass (hlfir::createLowerHLFIRIntrinsics ());
@@ -265,7 +267,8 @@ void createDefaultFIRCodeGenPassPipeline(mlir::PassManager &pm,
265267 MLIRToLLVMPassPipelineConfig config,
266268 llvm::StringRef inputFilename) {
267269 fir::addBoxedProcedurePass (pm);
268- addNestedPassToAllTopLevelOperations (pm, fir::createAbstractResultOpt);
270+ addNestedPassToAllTopLevelOperations<PassConstructor>(
271+ pm, fir::createAbstractResultOpt);
269272 fir::addCodeGenRewritePass (
270273 pm, (config.DebugInfo != llvm::codegenoptions::NoDebugInfo));
271274 fir::addExternalNameConversionPass (pm, config.Underscoring );
0 commit comments