@@ -209,6 +209,26 @@ void createDefaultFIROptimizerPassPipeline(mlir::PassManager &pm,
209209 if (pc.AliasAnalysis && !disableFirAliasTags && !useOldAliasTags)
210210 pm.addPass (fir::createAddAliasTags ());
211211
212+ // We can first convert the FIR dialect to the Affine dialect, perform
213+ // optimizations on top of it, and then lower it to the FIR dialect.
214+ // TODO: These optimization passes (like PromoteToAffinePass) are currently
215+ // experimental, so it's important to actively identify and address issues.
216+ if (enableAffineOpt && pc.OptLevel .isOptimizingForSpeed ()) {
217+ pm.addPass (fir::createPromoteToAffinePass ());
218+ pm.addPass (mlir::createCSEPass ());
219+ pm.addPass (mlir::affine::createAffineLoopInvariantCodeMotionPass ());
220+ pm.addPass (mlir::affine::createAffineLoopNormalizePass ());
221+ pm.addPass (mlir::affine::createSimplifyAffineStructuresPass ());
222+ pm.addPass (mlir::affine::createAffineParallelize (
223+ mlir::affine::AffineParallelizeOptions{1 , false }));
224+ pm.addPass (fir::createAffineDemotionPass ());
225+ pm.addPass (mlir::createLowerAffinePass ());
226+ if (pc.EnableOpenMP ) {
227+ pm.addPass (mlir::createConvertSCFToOpenMPPass ());
228+ pm.addPass (mlir::createCanonicalizerPass ());
229+ }
230+ }
231+
212232 addNestedPassToAllTopLevelOperations<PassConstructor>(
213233 pm, fir::createStackReclaim);
214234 // convert control flow to CFG form
0 commit comments