Avoid tie-ing input and output for dispatch from `tensor.extract_slice`. (#7478)
Fixes #7467
diff --git a/iree/compiler/Dialect/Flow/Transforms/DispatchLinalgOnTensors.cpp b/iree/compiler/Dialect/Flow/Transforms/DispatchLinalgOnTensors.cpp
index 6ba9c4b..7861e2d 100644
--- a/iree/compiler/Dialect/Flow/Transforms/DispatchLinalgOnTensors.cpp
+++ b/iree/compiler/Dialect/Flow/Transforms/DispatchLinalgOnTensors.cpp
@@ -476,7 +476,8 @@
// block argument. Single use can potentially be relaxed.
auto loadArg =
loadOp.source().template dyn_cast<BlockArgument>();
- if (!loadArg || !loadArg.hasOneUse()) {
+ if (!loadArg || !loadArg.hasOneUse() ||
+ loadArg.use_begin()->get() != storeOp.target()) {
return nullptr;
}
return loadArg;
diff --git a/iree/compiler/Dialect/Flow/Transforms/test/dispatch_linalg_on_tensors.mlir b/iree/compiler/Dialect/Flow/Transforms/test/dispatch_linalg_on_tensors.mlir
index c42e9b3..63fbc2f 100644
--- a/iree/compiler/Dialect/Flow/Transforms/test/dispatch_linalg_on_tensors.mlir
+++ b/iree/compiler/Dialect/Flow/Transforms/test/dispatch_linalg_on_tensors.mlir
@@ -1114,3 +1114,17 @@
// CHECK-SAME: tensor<?x?xi32>{%[[D1]], %[[D2]]}, tensor<?xi32>{%[[D0]]}
// CHECK-NEXT: %[[ARG4:.+]]: !flow.dispatch.tensor<readwrite:?x?xi32>
// CHECK-SAME: %[[ARG5:.+]]: !flow.dispatch.tensor<readonly:?xi32>
+
+// -----
+
+func @extract_slice(%arg0 : tensor<?x?xf32>, %arg1 : index, %arg2 : index,
+ %arg3 : index, %arg4 : index, %arg5 : index, %arg6 : index) -> tensor<?x?xf32> {
+ %0 = tensor.extract_slice %arg0[%arg1, %arg2] [%arg3, %arg4] [%arg5, %arg6] :
+ tensor<?x?xf32> to tensor<?x?xf32>
+ return %0 : tensor<?x?xf32>
+}
+// CHECK: flow.dispatch.workgroups
+// CHECK-NEXT: %[[INPUT:[a-zA-Z0-9]+]]: !flow.dispatch.tensor<readonly:?x?xf32>
+// CHECK-SAME: %[[OUTPUT:[a-zA-Z0-9]+]]: !flow.dispatch.tensor<writeonly:?x?xf32>
+// CHECK: %[[SLICE:.+]] = flow.dispatch.tensor.load %[[INPUT]]
+// CHECK: flow.dispatch.tensor.store %[[SLICE]], %[[OUTPUT]]