[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