[flang-commits] [flang] [flang][fir] Add fir.if -> scf.if and add filecheck test file (PR #142965)

via flang-commits flang-commits at lists.llvm.org
Sun Jun 8 23:31:28 PDT 2025


================
@@ -87,13 +87,59 @@ struct DoLoopConversion : public OpRewritePattern<fir::DoLoopOp> {
     return success();
   }
 };
+
+struct IfConversion : public OpRewritePattern<fir::IfOp> {
+  using OpRewritePattern<fir::IfOp>::OpRewritePattern;
+  LogicalResult matchAndRewrite(fir::IfOp ifOp,
+                                PatternRewriter &rewriter) const override {
+    mlir::Location loc = ifOp.getLoc();
+    mlir::detail::TypedValue<mlir::IntegerType> condition = ifOp.getCondition();
+    ValueTypeRange<ResultRange> resultTypes = ifOp.getResultTypes();
+    bool hasResult = !resultTypes.empty();
+    mlir::scf::IfOp scfIfOp = rewriter.create<scf::IfOp>(
+        loc, resultTypes, condition, !ifOp.getElseRegion().empty());
+    // then region
+    scfIfOp.getThenRegion().takeBody(ifOp.getThenRegion());
+    Block &scfthenBlock = scfIfOp.getThenRegion().front();
+    Operation *scfthenTerminator = scfthenBlock.getTerminator();
+    // fir.result->scf.yield
+    rewriter.setInsertionPointToEnd(&scfthenBlock);
+    if (hasResult) {
+      rewriter.create<scf::YieldOp>(scfthenTerminator->getLoc(),
+                                    scfthenTerminator->getOperands());
+    } else {
+      rewriter.create<scf::YieldOp>(scfthenBlock.getTerminator()->getLoc());
+    }
+    scfthenTerminator->erase();
+
+    // else region
+    if (!ifOp.getElseRegion().empty()) {
+      scfIfOp.getElseRegion().takeBody(ifOp.getElseRegion());
+      mlir::Block &elseBlock = scfIfOp.getElseRegion().front();
+      mlir::Operation *elseTerminator = elseBlock.getTerminator();
+
+      rewriter.setInsertionPointToEnd(&elseBlock);
+      if (hasResult) {
+        rewriter.create<scf::YieldOp>(elseTerminator->getLoc(),
+                                      elseTerminator->getOperands());
+      } else {
+        rewriter.create<scf::YieldOp>(elseBlock.getTerminator()->getLoc());
+      }
+      elseTerminator->erase();
----------------
NexMing wrote:

Same as above

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


More information about the flang-commits mailing list