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