From aa4b2a1fb06f80585ccfe0fcbbc4ca1095e5da36 Mon Sep 17 00:00:00 2001 From: Ian Wood Date: Thu, 11 Sep 2025 18:58:36 +0000 Subject: [PATCH 1/4] [MLIR] getBackwardSlice: don't bail on ops that are IsolatedFromAbove Signed-off-by: Ian Wood --- mlir/lib/Analysis/SliceAnalysis.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mlir/lib/Analysis/SliceAnalysis.cpp b/mlir/lib/Analysis/SliceAnalysis.cpp index 7037fa644c7be..d0e10626589ce 100644 --- a/mlir/lib/Analysis/SliceAnalysis.cpp +++ b/mlir/lib/Analysis/SliceAnalysis.cpp @@ -109,7 +109,7 @@ static LogicalResult getBackwardSliceImpl(Operation *op, DenseSet &visited, SetVector *backwardSlice, const BackwardSliceOptions &options) { - if (!op || op->hasTrait()) + if (!op) return success(); // Evaluate whether we should keep this def. From fb257b221e57d208103a62b98f30a277ced4450f Mon Sep 17 00:00:00 2001 From: Ian Wood Date: Fri, 12 Sep 2025 20:21:54 +0000 Subject: [PATCH 2/4] Add test Signed-off-by: Ian Wood --- mlir/test/Transforms/move-operation-deps.mlir | 28 +++++++++++++++++++ mlir/test/lib/Dialect/Test/TestOps.td | 3 +- .../Transforms/TestMakeIsolatedFromAbove.cpp | 4 +-- 3 files changed, 32 insertions(+), 3 deletions(-) diff --git a/mlir/test/Transforms/move-operation-deps.mlir b/mlir/test/Transforms/move-operation-deps.mlir index aa7b5dc2a240a..75d8386d520ee 100644 --- a/mlir/test/Transforms/move-operation-deps.mlir +++ b/mlir/test/Transforms/move-operation-deps.mlir @@ -460,3 +460,31 @@ module attributes {transform.with_named_sequence} { transform.yield } } + +// ----- + +func.func @move_isolated_from_above() -> () { + %1 = "before"() : () -> (f32) + %2 = "moved0"() : () -> (f32) + %3 = test.isolated_one_region_op %2 {} : f32 -> f32 + %4 = "moved1"(%3) : (f32) -> (f32) + return +} +// CHECK-LABEL: func @move_isolated_from_above() +// CHECK: %[[MOVED0:.+]] = "moved0" +// CHECK: %[[ISOLATED:.+]] = test.isolated_one_region_op %[[MOVED0]] +// CHECK: %[[MOVED1:.+]] = "moved1"(%[[ISOLATED]]) +// CHECK: %[[BEFORE:.+]] = "before" + +module attributes {transform.with_named_sequence} { + transform.named_sequence @__transform_main(%arg0 : !transform.any_op {transform.readonly}) { + %op1 = transform.structured.match ops{["before"]} in %arg0 + : (!transform.any_op) -> !transform.any_op + %op2 = transform.structured.match ops{["moved1"]} in %arg0 + : (!transform.any_op) -> !transform.any_op + %v1 = transform.get_result %op2[0] : (!transform.any_op) -> !transform.any_value + transform.test.move_value_defns %v1 before %op1 + : (!transform.any_value), !transform.any_op + transform.yield + } +} diff --git a/mlir/test/lib/Dialect/Test/TestOps.td b/mlir/test/lib/Dialect/Test/TestOps.td index 5564264ed8b0b..d9bbb3261febc 100644 --- a/mlir/test/lib/Dialect/Test/TestOps.td +++ b/mlir/test/lib/Dialect/Test/TestOps.td @@ -552,9 +552,10 @@ def OneRegionWithOperandsOp : TEST_Op<"one_region_with_operands_op", []> { def IsolatedOneRegionOp : TEST_Op<"isolated_one_region_op", [IsolatedFromAbove]> { let arguments = (ins Variadic:$operands); + let results = (outs Variadic:$results); let regions = (region AnyRegion:$my_region); let assemblyFormat = [{ - attr-dict-with-keyword $operands $my_region `:` type($operands) + attr-dict-with-keyword $operands $my_region `:` type($operands) `->` type($results) }]; } diff --git a/mlir/test/lib/Transforms/TestMakeIsolatedFromAbove.cpp b/mlir/test/lib/Transforms/TestMakeIsolatedFromAbove.cpp index c1fb70605ab46..f7bde79274e91 100644 --- a/mlir/test/lib/Transforms/TestMakeIsolatedFromAbove.cpp +++ b/mlir/test/lib/Transforms/TestMakeIsolatedFromAbove.cpp @@ -27,8 +27,8 @@ makeIsolatedFromAboveImpl(RewriterBase &rewriter, makeRegionIsolatedFromAbove(rewriter, region, callBack); SmallVector operands = regionOp.getOperands(); operands.append(capturedValues); - auto isolatedRegionOp = - test::IsolatedOneRegionOp::create(rewriter, regionOp.getLoc(), operands); + auto isolatedRegionOp = test::IsolatedOneRegionOp::create( + rewriter, regionOp.getLoc(), TypeRange(), operands); rewriter.inlineRegionBefore(region, isolatedRegionOp.getRegion(), isolatedRegionOp.getRegion().begin()); rewriter.eraseOp(regionOp); From da28f2e49f1c76b14c641a75a27709caa3257d71 Mon Sep 17 00:00:00 2001 From: Ian Wood Date: Wed, 17 Sep 2025 17:34:47 +0000 Subject: [PATCH 3/4] Don't recurse regions if isolated from above Signed-off-by: Ian Wood --- mlir/lib/Analysis/SliceAnalysis.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mlir/lib/Analysis/SliceAnalysis.cpp b/mlir/lib/Analysis/SliceAnalysis.cpp index d0e10626589ce..f362bd49d99cf 100644 --- a/mlir/lib/Analysis/SliceAnalysis.cpp +++ b/mlir/lib/Analysis/SliceAnalysis.cpp @@ -150,7 +150,8 @@ static LogicalResult getBackwardSliceImpl(Operation *op, bool succeeded = true; - if (!options.omitUsesFromAbove) { + if (!options.omitUsesFromAbove && + !op->hasTrait()) { llvm::for_each(op->getRegions(), [&](Region ®ion) { // Walk this region recursively to collect the regions that descend from // this op's nested regions (inclusive). From 6da2def743b87b8edae92b7f2d3bcd11dc28a195 Mon Sep 17 00:00:00 2001 From: Ian Wood Date: Fri, 19 Sep 2025 09:48:36 -0700 Subject: [PATCH 4/4] Don't look at block args for isolatd ops Signed-off-by: Ian Wood --- mlir/lib/Analysis/SliceAnalysis.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mlir/lib/Analysis/SliceAnalysis.cpp b/mlir/lib/Analysis/SliceAnalysis.cpp index f362bd49d99cf..12dff19ed31d3 100644 --- a/mlir/lib/Analysis/SliceAnalysis.cpp +++ b/mlir/lib/Analysis/SliceAnalysis.cpp @@ -136,7 +136,8 @@ static LogicalResult getBackwardSliceImpl(Operation *op, // blocks of parentOp, which are not technically backward unless they flow // into us. For now, just bail. if (parentOp && backwardSlice->count(parentOp) == 0) { - if (parentOp->getNumRegions() == 1 && + if (!parentOp->hasTrait() && + parentOp->getNumRegions() == 1 && parentOp->getRegion(0).hasOneBlock()) { return getBackwardSliceImpl(parentOp, visited, backwardSlice, options);