[Mlir-commits] [mlir] [mlir] fix assertion failure in remove-dead-values (PR #144849)

llvmlistbot at llvm.org llvmlistbot at llvm.org
Thu Jun 19 00:07:11 PDT 2025


https://github.com/Menooker created https://github.com/llvm/llvm-project/pull/144849

Simple IR patterns will trigger assertion error:

```
  func.func @test_zero_operands(%I: memref<10xindex>, %I2: memref<10xf32>) {
    %v0 = arith.constant 0 : index
    %result = memref.alloca_scope -> index {
      %c = arith.addi %v0, %v0 : index
      memref.store %c, %I[%v0] : memref<10xindex>
      memref.alloca_scope.return %c: index
    }
    func.return
  }
```

with error: `mlir/include/mlir/IR/Operation.h:988: mlir::detail::OperandStorage& mlir::Operation::getOperandStorage(): Assertion `hasOperandStorage && "expected operation to have operand storage"' failed.`

This PR will fix this issue.

>From 8d2e6295d8cc1b9685aafaa60cc6ae4e734d24be Mon Sep 17 00:00:00 2001
From: Menooker <myjisgreat at live.cn>
Date: Wed, 18 Jun 2025 23:58:13 -0700
Subject: [PATCH] [mlir] fix assertion failure in remove-dead-values

---
 mlir/lib/Transforms/RemoveDeadValues.cpp     |  3 ++-
 mlir/test/Transforms/remove-dead-values.mlir | 22 ++++++++++++++++++++
 2 files changed, 24 insertions(+), 1 deletion(-)

diff --git a/mlir/lib/Transforms/RemoveDeadValues.cpp b/mlir/lib/Transforms/RemoveDeadValues.cpp
index 08dfea8eb2648..113d91ab3dc78 100644
--- a/mlir/lib/Transforms/RemoveDeadValues.cpp
+++ b/mlir/lib/Transforms/RemoveDeadValues.cpp
@@ -705,7 +705,8 @@ static void cleanUpDeadVals(RDVFinalCleanupList &list) {
 
   // 4. Operands
   for (auto &o : list.operands) {
-    o.op->eraseOperands(o.nonLive);
+    if (o.nonLive.size() > 0)
+      o.op->eraseOperands(o.nonLive);
   }
 
   // 5. Results
diff --git a/mlir/test/Transforms/remove-dead-values.mlir b/mlir/test/Transforms/remove-dead-values.mlir
index 8c2a1cf7546f3..456fe5d6e6607 100644
--- a/mlir/test/Transforms/remove-dead-values.mlir
+++ b/mlir/test/Transforms/remove-dead-values.mlir
@@ -510,3 +510,25 @@ module {
 // CHECK: %[[yield:.*]] = arith.addf %{{.*}}, %{{.*}} : f32
 // CHECK: linalg.yield %[[yield]] : f32
 // CHECK-NOT: arith.subf
+
+
+// -----
+
+// check that ops with zero operands are correctly handled
+
+module {
+  func.func @test_zero_operands(%I: memref<10xindex>, %I2: memref<10xf32>) {
+    %v0 = arith.constant 0 : index
+    %result = memref.alloca_scope -> index {
+      %c = arith.addi %v0, %v0 : index
+      memref.store %c, %I[%v0] : memref<10xindex>
+      memref.alloca_scope.return %c: index
+    }
+    func.return
+  }
+}
+
+// CHECK-LABEL: func @test_zero_operands
+// CHECK: memref.alloca_scope
+// CHECK: memref.store
+// CHECK-NOT: memref.alloca_scope.return
\ No newline at end of file



More information about the Mlir-commits mailing list