Remove `hal.interface.binding.subspan` ops that are only used `memref.assume_alignment_ops`. (#12269)
diff --git a/compiler/src/iree/compiler/Codegen/Common/CleanupBufferAllocViewPass.cpp b/compiler/src/iree/compiler/Codegen/Common/CleanupBufferAllocViewPass.cpp
index cd2a5fc..f34deac 100644
--- a/compiler/src/iree/compiler/Codegen/Common/CleanupBufferAllocViewPass.cpp
+++ b/compiler/src/iree/compiler/Codegen/Common/CleanupBufferAllocViewPass.cpp
@@ -112,7 +112,18 @@
if (!memEffect || !memEffect.hasEffect<MemoryEffects::Allocate>()) {
return failure();
}
- if (!op->use_empty()) return failure();
+ SmallVector<Operation *> deadUsers;
+ for (OpOperand &use : op->getUses()) {
+ if (auto user = dyn_cast<memref::AssumeAlignmentOp>(use.getOwner())) {
+ deadUsers.push_back(user);
+ continue;
+ }
+ // For any other use, return failure;
+ return failure();
+ }
+ for (auto user : deadUsers) {
+ rewriter.eraseOp(user);
+ }
rewriter.eraseOp(op);
return success();
}
diff --git a/compiler/src/iree/compiler/Codegen/Common/test/remove_dead_allocs.mlir b/compiler/src/iree/compiler/Codegen/Common/test/remove_dead_allocs.mlir
index 146d3d0..50040b1 100644
--- a/compiler/src/iree/compiler/Codegen/Common/test/remove_dead_allocs.mlir
+++ b/compiler/src/iree/compiler/Codegen/Common/test/remove_dead_allocs.mlir
@@ -16,3 +16,13 @@
// CHECK-LABEL: func.func @alloc_keep
// CHECK-NEXT: %[[ALLOC:.+]] = memref.alloc
// CHECK-NEXT: return %[[ALLOC]]
+
+// -----
+
+func.func @cleanup_only_assume_alignment_uses() {
+ %0 = hal.interface.binding.subspan set(0) binding(0) type(storage_buffer) : memref<42xf32>
+ memref.assume_alignment %0, 64 : memref<42xf32>
+ return
+}
+// CHECK-LABEL: func.func @cleanup_only_assume_alignment_uses()
+// CHECK-NEXT: return