From 8fd7a2804002808afd8ce61fe8790bd656ec54c5 Mon Sep 17 00:00:00 2001 From: Dor Arad Date: Thu, 11 Sep 2025 16:58:24 +0300 Subject: [PATCH] [mlir][scf] ExecuteRegionOp folders to consider no_inline attribute --- mlir/lib/Dialect/SCF/IR/SCF.cpp | 2 ++ mlir/test/Dialect/SCF/canonicalize.mlir | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/mlir/lib/Dialect/SCF/IR/SCF.cpp b/mlir/lib/Dialect/SCF/IR/SCF.cpp index 84f9777a443fd..c2dfd7a8a4e5f 100644 --- a/mlir/lib/Dialect/SCF/IR/SCF.cpp +++ b/mlir/lib/Dialect/SCF/IR/SCF.cpp @@ -236,6 +236,8 @@ struct MultiBlockExecuteInliner : public OpRewritePattern { LogicalResult matchAndRewrite(ExecuteRegionOp op, PatternRewriter &rewriter) const override { + if (op.getNoInline()) + return failure(); if (!isa(op->getParentOp())) return failure(); diff --git a/mlir/test/Dialect/SCF/canonicalize.mlir b/mlir/test/Dialect/SCF/canonicalize.mlir index 2752c492cb2be..4ad2da8388eb7 100644 --- a/mlir/test/Dialect/SCF/canonicalize.mlir +++ b/mlir/test/Dialect/SCF/canonicalize.mlir @@ -1483,6 +1483,24 @@ func.func @execute_region_no_inline() { // ----- +// CHECK-LABEL: func @execute_region_under_func_no_inline +func.func @execute_region_under_func_no_inline() { + "test.foo"() : () -> () + %v = scf.execute_region -> i64 no_inline { + %x = "test.val"() : () -> i64 + scf.yield %x : i64 + } + "test.bar"(%v) : (i64) -> () + return +} + +// CHECK-NEXT: "test.foo"() : () -> () +// CHECK-NEXT: scf.execute_region +// CHECK-NEXT: %[[VAL:.*]] = "test.val"() : () -> i64 +// CHECK-NEXT: scf.yield %[[VAL]] : i64 + +// ----- + // CHECK-LABEL: func @func_execute_region_inline func.func @func_execute_region_inline() { "test.foo"() : () -> ()