[flang-commits] [flang] [Flang] Add opt-in affine loop optimization pipeline (PR #191854)
Tom Eccles via flang-commits
flang-commits at lists.llvm.org
Mon Apr 27 04:22:15 PDT 2026
================
@@ -202,6 +204,51 @@ void createDefaultFIROptimizerPassPipeline(mlir::PassManager &pm,
config.setRegionSimplificationLevel(
mlir::GreedySimplifyRegionLevel::Disabled);
pm.addPass(mlir::createCSEPass());
+
+ // Affine loop optimization pipeline (opt-in via --enable-affine-loop-opt).
+ if (enableAffineLoopOpt) {
+ pm.addPass(mlir::createCanonicalizerPass(config));
+ pm.addPass(mlir::createCSEPass());
+
+ pm.addPass(mlir::createLoopInvariantCodeMotionPass());
+ pm.addPass(fir::createLoopInvariantCodeMotion());
+
+ addNestedPassToAllTopLevelOperations<PassConstructor>(
+ pm, fir::createSimplifyDoLoopPass);
+
+ pm.addPass(mlir::createCanonicalizerPass(config));
+ pm.addPass(mlir::createCSEPass());
+
+ pm.addPass(fir::createPromoteToAffinePass());
+
+ // Use remove-dead-values instead of canonicalize between promotion and
+ // demotion to avoid folding fir.convert chains. Canonicalize can merge
+ // a linearisation convert (ref<NxM> -> ref<N*M>) with the promotion
+ // convert (ref<N*M> -> memref<N*M>) into a single ref<NxM> -> memref<N*M>,
+ // which would cause a rank mismatch in AffineDemotion.
+ pm.addPass(mlir::createRemoveDeadValuesPass());
+ pm.addPass(mlir::createCSEPass());
+
+ if (affineLoopOptTileSize > 0) {
+ mlir::affine::registerAffineLoopTiling();
+ std::string pipeline = "func.func(affine-loop-tile{tile-size=" +
+ std::to_string(affineLoopOptTileSize) + "})";
+ (void)mlir::parsePassPipeline(pipeline, pm);
----------------
tblah wrote:
nit: should we generate an error for parse failure?
https://github.com/llvm/llvm-project/pull/191854
More information about the flang-commits
mailing list