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>(pm, ctor);
2020}
2121
@@ -25,11 +25,11 @@ void addPassToGPUModuleOperations(mlir::PassManager &pm, PassConstructor ctor) {
2525 nestPM.addNestedPass <mlir::gpu::GPUFuncOp>(ctor ());
2626}
2727
28+ template <typename F>
2829void addNestedPassToAllTopLevelOperationsConditionally (
29- mlir::PassManager &pm, llvm::cl::opt<bool > &disabled,
30- PassConstructor ctor) {
30+ mlir::PassManager &pm, llvm::cl::opt<bool > &disabled, F ctor) {
3131 if (!disabled)
32- addNestedPassToAllTopLevelOperations (pm, ctor);
32+ addNestedPassToAllTopLevelOperations<F> (pm, ctor);
3333}
3434
3535void addCanonicalizerPassWithoutRegionSimplification (mlir::OpPassManager &pm) {
@@ -40,12 +40,11 @@ void addCanonicalizerPassWithoutRegionSimplification(mlir::OpPassManager &pm) {
4040
4141void addCfgConversionPass (mlir::PassManager &pm,
4242 const MLIRToLLVMPassPipelineConfig &config) {
43- if (config.NSWOnLoopVarInc )
44- addNestedPassToAllTopLevelOperationsConditionally (pm, disableCfgConversion,
45- fir::createCFGConversion);
46- else
47- addNestedPassToAllTopLevelOperationsConditionally (
48- pm, disableCfgConversion, fir::createCFGConversionPassWithoutNSW);
43+ fir::CFGConversionOptions options;
44+ if (!config.NSWOnLoopVarInc )
45+ options.setNSW = false ;
46+ addNestedPassToAllTopLevelOperationsConditionally (
47+ pm, disableCfgConversion, [&]() { return createCFGConversion (options); });
4948}
5049
5150void addAVC (mlir::PassManager &pm, const llvm::OptimizationLevel &optLevel) {
@@ -166,7 +165,8 @@ void createDefaultFIROptimizerPassPipeline(mlir::PassManager &pm,
166165 config.enableRegionSimplification = mlir::GreedySimplifyRegionLevel::Disabled;
167166 pm.addPass (mlir::createCSEPass ());
168167 fir::addAVC (pm, pc.OptLevel );
169- addNestedPassToAllTopLevelOperations (pm, fir::createCharacterConversion);
168+ addNestedPassToAllTopLevelOperations<PassConstructor>(
169+ pm, fir::createCharacterConversion);
170170 pm.addPass (mlir::createCanonicalizerPass (config));
171171 pm.addPass (fir::createSimplifyRegionLite ());
172172 if (pc.OptLevel .isOptimizingForSpeed ()) {
@@ -200,7 +200,8 @@ void createDefaultFIROptimizerPassPipeline(mlir::PassManager &pm,
200200 if (pc.AliasAnalysis && !disableFirAliasTags && !useOldAliasTags)
201201 pm.addPass (fir::createAddAliasTags ());
202202
203- addNestedPassToAllTopLevelOperations (pm, fir::createStackReclaim);
203+ addNestedPassToAllTopLevelOperations<PassConstructor>(
204+ pm, fir::createStackReclaim);
204205 // convert control flow to CFG form
205206 fir::addCfgConversionPass (pm, pc);
206207 pm.addPass (mlir::createConvertSCFToCFPass ());
@@ -222,15 +223,16 @@ void createHLFIRToFIRPassPipeline(mlir::PassManager &pm, bool enableOpenMP,
222223 llvm::OptimizationLevel optLevel) {
223224 if (optLevel.isOptimizingForSpeed ()) {
224225 addCanonicalizerPassWithoutRegionSimplification (pm);
225- addNestedPassToAllTopLevelOperations (pm,
226- hlfir::createSimplifyHLFIRIntrinsics);
226+ addNestedPassToAllTopLevelOperations<PassConstructor>(
227+ pm, hlfir::createSimplifyHLFIRIntrinsics);
227228 }
228- addNestedPassToAllTopLevelOperations (pm, hlfir::createInlineElementals);
229+ addNestedPassToAllTopLevelOperations<PassConstructor>(
230+ pm, hlfir::createInlineElementals);
229231 if (optLevel.isOptimizingForSpeed ()) {
230232 addCanonicalizerPassWithoutRegionSimplification (pm);
231233 pm.addPass (mlir::createCSEPass ());
232- addNestedPassToAllTopLevelOperations (pm,
233- hlfir::createOptimizedBufferization);
234+ addNestedPassToAllTopLevelOperations<PassConstructor>(
235+ pm, hlfir::createOptimizedBufferization);
234236 }
235237 pm.addPass (hlfir::createLowerHLFIROrderedAssignments ());
236238 pm.addPass (hlfir::createLowerHLFIRIntrinsics ());
@@ -270,7 +272,8 @@ void createDefaultFIRCodeGenPassPipeline(mlir::PassManager &pm,
270272 MLIRToLLVMPassPipelineConfig config,
271273 llvm::StringRef inputFilename) {
272274 fir::addBoxedProcedurePass (pm);
273- addNestedPassToAllTopLevelOperations (pm, fir::createAbstractResultOpt);
275+ addNestedPassToAllTopLevelOperations<PassConstructor>(
276+ pm, fir::createAbstractResultOpt);
274277 addPassToGPUModuleOperations (pm, fir::createAbstractResultOpt);
275278 fir::addCodeGenRewritePass (
276279 pm, (config.DebugInfo != llvm::codegenoptions::NoDebugInfo));
0 commit comments