https://github.com/matthias-springer updated https://github.com/llvm/llvm-project/pull/156171
>From fee875b7f60d59174e0913bc64c37450cf846da1 Mon Sep 17 00:00:00 2001 From: Matthias Springer <[email protected]> Date: Sat, 30 Aug 2025 10:35:08 +0000 Subject: [PATCH] [flang] Do not use dialect conversion in `AffineDialectPromotion` --- .../Optimizer/Transforms/AffinePromotion.cpp | 33 +++++++------------ 1 file changed, 11 insertions(+), 22 deletions(-) diff --git a/flang/lib/Optimizer/Transforms/AffinePromotion.cpp b/flang/lib/Optimizer/Transforms/AffinePromotion.cpp index b032767eef6f0..061a7d201edd3 100644 --- a/flang/lib/Optimizer/Transforms/AffinePromotion.cpp +++ b/flang/lib/Optimizer/Transforms/AffinePromotion.cpp @@ -25,7 +25,7 @@ #include "mlir/IR/BuiltinAttributes.h" #include "mlir/IR/IntegerSet.h" #include "mlir/IR/Visitors.h" -#include "mlir/Transforms/DialectConversion.h" +#include "mlir/Transforms/WalkPatternRewriteDriver.h" #include "llvm/ADT/DenseMap.h" #include "llvm/Support/Debug.h" #include <optional> @@ -451,10 +451,10 @@ static void rewriteStore(fir::StoreOp storeOp, } static void rewriteMemoryOps(Block *block, mlir::PatternRewriter &rewriter) { - for (auto &bodyOp : block->getOperations()) { + for (auto &bodyOp : llvm::make_early_inc_range(block->getOperations())) { if (isa<fir::LoadOp>(bodyOp)) rewriteLoad(cast<fir::LoadOp>(bodyOp), rewriter); - if (isa<fir::StoreOp>(bodyOp)) + else if (isa<fir::StoreOp>(bodyOp)) rewriteStore(cast<fir::StoreOp>(bodyOp), rewriter); } } @@ -476,6 +476,8 @@ class AffineLoopConversion : public mlir::OpRewritePattern<fir::DoLoopOp> { loop.dump();); LLVM_ATTRIBUTE_UNUSED auto loopAnalysis = functionAnalysis.getChildLoopAnalysis(loop); + if (!loopAnalysis.canPromoteToAffine()) + return rewriter.notifyMatchFailure(loop, "cannot promote to affine"); auto &loopOps = loop.getBody()->getOperations(); auto resultOp = cast<fir::ResultOp>(loop.getBody()->getTerminator()); auto results = resultOp.getOperands(); @@ -576,12 +578,14 @@ class AffineIfConversion : public mlir::OpRewritePattern<fir::IfOp> { public: using OpRewritePattern::OpRewritePattern; AffineIfConversion(mlir::MLIRContext *context, AffineFunctionAnalysis &afa) - : OpRewritePattern(context) {} + : OpRewritePattern(context), functionAnalysis(afa) {} llvm::LogicalResult matchAndRewrite(fir::IfOp op, mlir::PatternRewriter &rewriter) const override { LLVM_DEBUG(llvm::dbgs() << "AffineIfConversion: rewriting if:\n"; op.dump();); + if (!functionAnalysis.getChildIfAnalysis(op).canPromoteToAffine()) + return rewriter.notifyMatchFailure(op, "cannot promote to affine"); auto &ifOps = op.getThenRegion().front().getOperations(); auto affineCondition = AffineIfCondition(op.getCondition()); if (!affineCondition.hasIntegerSet()) { @@ -611,6 +615,8 @@ class AffineIfConversion : public mlir::OpRewritePattern<fir::IfOp> { rewriter.replaceOp(op, affineIf.getOperation()->getResults()); return success(); } + + AffineFunctionAnalysis &functionAnalysis; }; /// Promote fir.do_loop and fir.if to affine.for and affine.if, in the cases @@ -627,28 +633,11 @@ class AffineDialectPromotion mlir::RewritePatternSet patterns(context); patterns.insert<AffineIfConversion>(context, functionAnalysis); patterns.insert<AffineLoopConversion>(context, functionAnalysis); - mlir::ConversionTarget target = *context; - target.addLegalDialect<mlir::affine::AffineDialect, FIROpsDialect, - mlir::scf::SCFDialect, mlir::arith::ArithDialect, - mlir::func::FuncDialect>(); - target.addDynamicallyLegalOp<IfOp>([&functionAnalysis](fir::IfOp op) { - return !(functionAnalysis.getChildIfAnalysis(op).canPromoteToAffine()); - }); - target.addDynamicallyLegalOp<DoLoopOp>([&functionAnalysis]( - fir::DoLoopOp op) { - return !(functionAnalysis.getChildLoopAnalysis(op).canPromoteToAffine()); - }); - LLVM_DEBUG(llvm::dbgs() << "AffineDialectPromotion: running promotion on: \n"; function.print(llvm::dbgs());); // apply the patterns - if (mlir::failed(mlir::applyPartialConversion(function, target, - std::move(patterns)))) { - mlir::emitError(mlir::UnknownLoc::get(context), - "error in converting to affine dialect\n"); - signalPassFailure(); - } + walkAndApplyPatterns(function, std::move(patterns)); } }; } // namespace _______________________________________________ llvm-branch-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
