[flang-commits] [flang] [flang][fir]: Add conversion of `fir.iterate_while` to `scf.while`. (PR #152439)
Terapines MLIR via flang-commits
flang-commits at lists.llvm.org
Fri Aug 8 03:08:00 PDT 2025
================
@@ -88,6 +88,91 @@ struct DoLoopConversion : public OpRewritePattern<fir::DoLoopOp> {
}
};
+struct IterWhileConversion : public OpRewritePattern<fir::IterWhileOp> {
+ using OpRewritePattern<fir::IterWhileOp>::OpRewritePattern;
+
+ LogicalResult matchAndRewrite(fir::IterWhileOp iterWhileOp,
+ PatternRewriter &rewriter) const override {
+
+ Location loc = iterWhileOp.getLoc();
+ Value lowerBound = iterWhileOp.getLowerBound();
+ Value upperBound = iterWhileOp.getUpperBound();
+ Value step = iterWhileOp.getStep();
+
+ Value okInit = iterWhileOp.getIterateIn();
+ ValueRange iterArgs = iterWhileOp.getInitArgs();
+
+ SmallVector<Value> initVals;
+ initVals.push_back(lowerBound);
+ initVals.push_back(okInit);
+ initVals.append(iterArgs.begin(), iterArgs.end());
+
+ SmallVector<Type> loopTypes;
+ loopTypes.push_back(lowerBound.getType());
+ loopTypes.push_back(okInit.getType());
+ for (auto val : iterArgs)
+ loopTypes.push_back(val.getType());
+
+ auto scfWhileOp = scf::WhileOp::create(rewriter, loc, loopTypes, initVals);
+ rewriter.createBlock(&scfWhileOp.getBefore(), scfWhileOp.getBefore().end(),
+ loopTypes,
+ SmallVector<Location>(loopTypes.size(), loc));
+
+ rewriter.createBlock(&scfWhileOp.getAfter(), scfWhileOp.getAfter().end(),
+ loopTypes,
+ SmallVector<Location>(loopTypes.size(), loc));
+
+ {
+ rewriter.setInsertionPointToStart(&scfWhileOp.getBefore().front());
+ auto args = scfWhileOp.getBefore().getArguments();
+ auto iv = args[0];
+ auto ok = args[1];
+
+ Value inductionCmp = mlir::arith::CmpIOp::create(
+ rewriter, loc, mlir::arith::CmpIPredicate::sle, iv, upperBound);
+ Value cmp = mlir::arith::AndIOp::create(rewriter, loc, inductionCmp, ok);
+
+ mlir::scf::ConditionOp::create(rewriter, loc, cmp, args);
+ }
+
+ {
+ rewriter.setInsertionPointToStart(&scfWhileOp.getAfter().front());
+ auto args = scfWhileOp.getAfter().getArguments();
+ auto iv = args[0];
+
+ mlir::IRMapping mapping;
+ for (auto [oldArg, newVal] :
+ llvm::zip(iterWhileOp.getBody()->getArguments(), args))
+ mapping.map(oldArg, newVal);
+
+ for (auto &op : iterWhileOp.getBody()->without_terminator())
+ rewriter.clone(op, mapping);
----------------
terapines-osc-mlir wrote:
Thanks for the suggestion. Code got refactored to use `rewriter.inlineBlockBefore`. :handshake:
https://github.com/llvm/llvm-project/pull/152439
More information about the flang-commits
mailing list