[Mlir-commits] [mlir] 1529754 - Revert "[mlir][transform] Update transform.loop.peel (#67482)"
Andrzej Warzynski
llvmlistbot at llvm.org
Wed Sep 27 14:19:23 PDT 2023
Author: Andrzej Warzynski
Date: 2023-09-27T21:19:11Z
New Revision: 1529754c936c63e4baff6f18dcedc901ac7d5b62
URL: https://github.com/llvm/llvm-project/commit/1529754c936c63e4baff6f18dcedc901ac7d5b62
DIFF: https://github.com/llvm/llvm-project/commit/1529754c936c63e4baff6f18dcedc901ac7d5b62.diff
LOG: Revert "[mlir][transform] Update transform.loop.peel (#67482)"
This reverts commit 1d5ccce12167937c83de2b1b82b4adb6f89cc511.
Broken bot:
* https://lab.llvm.org/buildbot/#/builders/220/builds/28440
Added:
Modified:
mlir/include/mlir/Dialect/SCF/TransformOps/SCFTransformOps.td
mlir/lib/Dialect/SCF/TransformOps/SCFTransformOps.cpp
mlir/test/Dialect/Linalg/transform-op-fuse.mlir
mlir/test/Dialect/SCF/transform-ops-invalid.mlir
mlir/test/Dialect/SCF/transform-ops.mlir
Removed:
################################################################################
diff --git a/mlir/include/mlir/Dialect/SCF/TransformOps/SCFTransformOps.td b/mlir/include/mlir/Dialect/SCF/TransformOps/SCFTransformOps.td
index 3adf5f0dc97dd5a..207a004c54ef5af 100644
--- a/mlir/include/mlir/Dialect/SCF/TransformOps/SCFTransformOps.td
+++ b/mlir/include/mlir/Dialect/SCF/TransformOps/SCFTransformOps.td
@@ -142,22 +142,23 @@ def LoopPeelOp : Op<Transform_Dialect, "loop.peel",
This operation ignores non-scf::ForOp ops and drops them in the return.
- This operation returns two scf::ForOp, with the first Op satisfying the
- postcondition: "the loop trip count is divisible by the step". The second
- loop Op contains the remaining iteration. Note that even though the
- Payload IR modification may be performed in-place, this operation consumes
- the operand handle and produces a new one.
+ This operation always succeeds and returns the scf::ForOp with the
+ postcondition: "the loop trip count is divisible by the step".
+ This operation may return the same unmodified loop handle when peeling did
+ not modify the IR (i.e. the loop trip count was already divisible).
- #### Return Modes
+ Note that even though the Payload IR modification may be performed
+ in-place, this operation consumes the operand handle and produces a new
+ one.
- Produces a definite failure if peeling fails.
+ TODO: Return both the peeled loop and the remainder loop.
}];
let arguments =
(ins Transform_ScfForOp:$target,
DefaultValuedAttr<BoolAttr, "false">:$fail_if_already_divisible);
- let results = (outs TransformHandleTypeInterface:$peeled_loop,
- TransformHandleTypeInterface:$remainder_loop);
+ // TODO: Return both the peeled loop and the remainder loop.
+ let results = (outs TransformHandleTypeInterface:$transformed);
let assemblyFormat =
"$target attr-dict `:` functional-type(operands, results)";
diff --git a/mlir/lib/Dialect/SCF/TransformOps/SCFTransformOps.cpp b/mlir/lib/Dialect/SCF/TransformOps/SCFTransformOps.cpp
index 65d503d7c4ad8b8..d7e8c38478ced1a 100644
--- a/mlir/lib/Dialect/SCF/TransformOps/SCFTransformOps.cpp
+++ b/mlir/lib/Dialect/SCF/TransformOps/SCFTransformOps.cpp
@@ -226,16 +226,14 @@ transform::LoopPeelOp::applyToOne(transform::TransformRewriter &rewriter,
transform::ApplyToEachResultList &results,
transform::TransformState &state) {
scf::ForOp result;
+ // This helper returns failure when peeling does not occur (i.e. when the IR
+ // is not modified). This is not a failure for the op as the postcondition:
+ // "the loop trip count is divisible by the step"
+ // is valid.
LogicalResult status =
scf::peelForLoopAndSimplifyBounds(rewriter, target, result);
- if (failed(status)) {
- DiagnosedSilenceableFailure diag = emitSilenceableError()
- << "failed to peel";
- return diag;
- }
- results.push_back(target);
- results.push_back(result);
-
+ // TODO: Return both the peeled loop and the remainder loop.
+ results.push_back(failed(status) ? target : result);
return DiagnosedSilenceableFailure::success();
}
diff --git a/mlir/test/Dialect/Linalg/transform-op-fuse.mlir b/mlir/test/Dialect/Linalg/transform-op-fuse.mlir
index 72c61661b55efd3..d3772e9c04eef52 100644
--- a/mlir/test/Dialect/Linalg/transform-op-fuse.mlir
+++ b/mlir/test/Dialect/Linalg/transform-op-fuse.mlir
@@ -48,7 +48,7 @@ transform.sequence failures(propagate) {
%0 = transform.structured.match ops{["linalg.elemwise_binary"]} in %arg1 : (!transform.any_op) -> !transform.any_op
%1, %loops:2 = transform.structured.fuse %0 {tile_sizes = [32, 32], tile_interchange = [0, 1]}
: (!transform.any_op) -> (!transform.any_op, !transform.op<"scf.for">, !transform.any_op)
- transform.loop.peel %loops#0 : (!transform.op<"scf.for">) -> (!transform.any_op, !transform.any_op)
+ transform.loop.peel %loops#0 : (!transform.op<"scf.for">) -> !transform.any_op
}
// -----
diff --git a/mlir/test/Dialect/SCF/transform-ops-invalid.mlir b/mlir/test/Dialect/SCF/transform-ops-invalid.mlir
index e8212f500e693ad..b69ea0f5975cd80 100644
--- a/mlir/test/Dialect/SCF/transform-ops-invalid.mlir
+++ b/mlir/test/Dialect/SCF/transform-ops-invalid.mlir
@@ -59,23 +59,3 @@ transform.sequence failures(propagate) {
// expected-error @below {{failed to outline}}
transform.loop.outline %0 {func_name = "foo"} : (!transform.any_op) -> (!transform.any_op, !transform.any_op)
}
-
-// -----
-
-func.func @test_loops_do_not_get_peeled() {
- %lb = arith.constant 0 : index
- %ub = arith.constant 40 : index
- %step = arith.constant 5 : index
- scf.for %i = %lb to %ub step %step {
- arith.addi %i, %i : index
- }
- return
-}
-
-transform.sequence failures(propagate) {
-^bb1(%arg1: !transform.any_op):
- %0 = transform.structured.match ops{["arith.addi"]} in %arg1 : (!transform.any_op) -> !transform.any_op
- %1 = transform.loop.get_parent_for %0 : (!transform.any_op) -> !transform.op<"scf.for">
- // expected-error @below {{failed to peel}}
- transform.loop.peel %1 : (!transform.op<"scf.for">) -> (!transform.any_op, !transform.any_op)
-}
diff --git a/mlir/test/Dialect/SCF/transform-ops.mlir b/mlir/test/Dialect/SCF/transform-ops.mlir
index 10b7ab91b8783ba..7718ebcd1fc6ae0 100644
--- a/mlir/test/Dialect/SCF/transform-ops.mlir
+++ b/mlir/test/Dialect/SCF/transform-ops.mlir
@@ -87,18 +87,16 @@ transform.sequence failures(propagate) {
// CHECK-LABEL: @loop_peel_op
func.func @loop_peel_op() {
// CHECK: %[[C0:.+]] = arith.constant 0
- // CHECK: %[[C41:.+]] = arith.constant 41
+ // CHECK: %[[C42:.+]] = arith.constant 42
// CHECK: %[[C5:.+]] = arith.constant 5
// CHECK: %[[C40:.+]] = arith.constant 40
// CHECK: scf.for %{{.+}} = %[[C0]] to %[[C40]] step %[[C5]]
// CHECK: arith.addi
- // CHECK: scf.for %{{.+}} = %[[C40]] to %[[C41]] step %[[C5]]
+ // CHECK: scf.for %{{.+}} = %[[C40]] to %[[C42]] step %[[C5]]
// CHECK: arith.addi
%0 = arith.constant 0 : index
- %1 = arith.constant 41 : index
+ %1 = arith.constant 42 : index
%2 = arith.constant 5 : index
- // expected-remark @below {{main loop}}
- // expected-remark @below {{remainder loop}}
scf.for %i = %0 to %1 step %2 {
arith.addi %i, %i : index
}
@@ -109,10 +107,7 @@ transform.sequence failures(propagate) {
^bb1(%arg1: !transform.any_op):
%0 = transform.structured.match ops{["arith.addi"]} in %arg1 : (!transform.any_op) -> !transform.any_op
%1 = transform.loop.get_parent_for %0 : (!transform.any_op) -> !transform.op<"scf.for">
- %main_loop, %remainder = transform.loop.peel %1 : (!transform.op<"scf.for">) -> (!transform.op<"scf.for">, !transform.op<"scf.for">)
- // Verify that both of the generated loop handles are valid
- transform.test_print_remark_at_operand %main_loop, "main loop" : !transform.op<"scf.for">
- transform.test_print_remark_at_operand %remainder, "remainder loop" : !transform.op<"scf.for">
+ transform.loop.peel %1 : (!transform.op<"scf.for">) -> !transform.any_op
}
// -----
More information about the Mlir-commits
mailing list