Skip to content

Commit feaa8f5

Browse files
committed
[NFC] Templatize some functions for adding transformation passes of multiple operations
This can make such passes take options.
1 parent 116ac4b commit feaa8f5

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,9 +13,9 @@
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>(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>
2829
void 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

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

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

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

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)