Skip to content

Commit 2e6180e

Browse files
committed
[NFC] Templatize some functions for adding transformation passes of multiple operations
This can make such passes take options.
1 parent 2723e8a commit 2e6180e

File tree

4 files changed

+33
-36
lines changed

4 files changed

+33
-36
lines changed

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

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -33,16 +33,16 @@ namespace fir {
3333

3434
using PassConstructor = std::unique_ptr<mlir::Pass>();
3535

36-
template <typename OP>
37-
void addNestedPassToOps(mlir::PassManager &pm, PassConstructor ctor) {
36+
template <typename F, typename OP>
37+
void addNestedPassToOps(mlir::PassManager &pm, F ctor) {
3838
pm.addNestedPass<OP>(ctor());
3939
}
4040

41-
template <typename OP, typename... OPS,
41+
template <typename F, typename OP, typename... OPS,
4242
typename = std::enable_if_t<sizeof...(OPS) != 0>>
43-
void addNestedPassToOps(mlir::PassManager &pm, PassConstructor ctor) {
44-
addNestedPassToOps<OP>(pm, ctor);
45-
addNestedPassToOps<OPS...>(pm, ctor);
43+
void addNestedPassToOps(mlir::PassManager &pm, F ctor) {
44+
addNestedPassToOps<F, OP>(pm, ctor);
45+
addNestedPassToOps<F, OPS...>(pm, ctor);
4646
}
4747

4848
/// Generic for adding a pass to the pass manager if it is not disabled.
@@ -60,11 +60,12 @@ void addNestedPassConditionally(mlir::PassManager &pm,
6060
pm.addNestedPass<OP>(ctor());
6161
}
6262

63-
void addNestedPassToAllTopLevelOperations(mlir::PassManager &pm,
64-
PassConstructor ctor);
63+
template <typename F>
64+
void addNestedPassToAllTopLevelOperations(mlir::PassManager &pm, F ctor);
6565

66+
template <typename F>
6667
void addNestedPassToAllTopLevelOperationsConditionally(
67-
mlir::PassManager &pm, llvm::cl::opt<bool> &disabled, PassConstructor ctor);
68+
mlir::PassManager &pm, llvm::cl::opt<bool> &disabled, F ctor);
6869

6970
/// Add MLIR Canonicalizer pass with region simplification disabled.
7071
/// FIR does not support the promotion of some SSA value to block arguments (or

flang/include/flang/Optimizer/Transforms/Passes.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,6 @@ namespace fir {
6666
std::unique_ptr<mlir::Pass> createAffineDemotionPass();
6767
std::unique_ptr<mlir::Pass>
6868
createArrayValueCopyPass(fir::ArrayValueCopyOptions options = {});
69-
std::unique_ptr<mlir::Pass> createCFGConversionPassWithoutNSW();
7069
std::unique_ptr<mlir::Pass> createMemDataFlowOptPass();
7170
std::unique_ptr<mlir::Pass> createPromoteToAffinePass();
7271
std::unique_ptr<mlir::Pass>

flang/lib/Optimizer/Passes/Pipelines.cpp

Lines changed: 23 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -13,18 +13,18 @@
1313

1414
namespace 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>
2324
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) {
2626
if (!disabled)
27-
addNestedPassToAllTopLevelOperations(pm, ctor);
27+
addNestedPassToAllTopLevelOperations<F>(pm, ctor);
2828
}
2929

3030
void addCanonicalizerPassWithoutRegionSimplification(mlir::OpPassManager &pm) {
@@ -35,12 +35,11 @@ void addCanonicalizerPassWithoutRegionSimplification(mlir::OpPassManager &pm) {
3535

3636
void 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

4645
void 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);

flang/lib/Optimizer/Transforms/ControlFlowConverter.cpp

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -363,9 +363,3 @@ void fir::populateCfgConversionRewrites(mlir::RewritePatternSet &patterns,
363363
patterns.insert<CfgLoopConv, CfgIfConv, CfgIterWhileConv>(
364364
patterns.getContext(), forceLoopToExecuteOnce, setNSW);
365365
}
366-
367-
std::unique_ptr<mlir::Pass> fir::createCFGConversionPassWithoutNSW() {
368-
fir::CFGConversionOptions options;
369-
options.setNSW = false;
370-
return fir::createCFGConversion(options);
371-
}

0 commit comments

Comments
 (0)