diff --git a/mlir/lib/Transforms/RemoveDeadValues.cpp b/mlir/lib/Transforms/RemoveDeadValues.cpp index 08dfea8eb2648..f269eaa15111a 100644 --- a/mlir/lib/Transforms/RemoveDeadValues.cpp +++ b/mlir/lib/Transforms/RemoveDeadValues.cpp @@ -704,8 +704,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 diff --git a/mlir/test/Transforms/remove-dead-values.mlir b/mlir/test/Transforms/remove-dead-values.mlir index e55a9160f5b34..3af95db3c0e24 100644 --- a/mlir/test/Transforms/remove-dead-values.mlir +++ b/mlir/test/Transforms/remove-dead-values.mlir @@ -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 } +