[mlir] fix assertion failure in remove-dead-values (#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.

---------

Co-authored-by: Andrzej Warzyński <andrzej.warzynski@gmail.com>
Co-authored-by: Mehdi Amini <joker.eph@gmail.com>
This commit is contained in:
Menooker
2025-06-22 22:03:36 +08:00
committed by GitHub
parent 96493c514e
commit ee5dcdc275
2 changed files with 26 additions and 2 deletions

View File

@@ -750,8 +750,9 @@ static void cleanUpDeadVals(RDVFinalCleanupList &list) {
}
// 4. Operands
for (auto &o : list.operands) {
o.op->eraseOperands(o.nonLive);
for (OperationToCleanup &o : list.operands) {
if (o.op->getNumOperands() > 0)
o.op->eraseOperands(o.nonLive);
}
// 5. Results

View File

@@ -511,6 +511,28 @@ module {
// 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
// -----
// CHECK-LABEL: func.func @test_atomic_yield
@@ -525,3 +547,4 @@ func.func @test_atomic_yield(%I: memref<10xf32>, %idx : index) {
}
func.return
}