[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
Thu Aug 7 18:53:17 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());
----------------
terapines-osc-mlir wrote:

These 2 blocks are simply for grouping the "before" and "after" regions of the `scf::WhileOp` visually.  And it simplifies the variable naming: We can use `args`, `iv` instead of `beforeArgs`, `beforeIv`, `afterArgs`, `afterIv`, etc.

If this has violated the style of LLVM, I will change the code, thanks!

https://github.com/llvm/llvm-project/pull/152439


More information about the flang-commits mailing list