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"() : () -> ()