Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions mlir/lib/Dialect/MemRef/Utils/MemRefUtils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,9 @@ static bool resultIsNotRead(Operation *op, std::vector<Operation *> &uses) {
std::vector<Operation *> opUses;
for (OpOperand &use : op->getUses()) {
Operation *useOp = use.getOwner();
// Use escaped the scope
if (useOp->hasTrait<mlir::OpTrait::ReturnLike>())
return false;
if (isa<memref::DeallocOp>(useOp) ||
(useOp->getNumResults() == 0 && useOp->getNumRegions() == 0 &&
!mlir::hasEffect<MemoryEffects::Read>(useOp)) ||
Expand Down
17 changes: 17 additions & 0 deletions mlir/test/Dialect/MemRef/transform-ops.mlir
Original file line number Diff line number Diff line change
Expand Up @@ -306,6 +306,23 @@ module attributes {transform.with_named_sequence} {

// -----

// CHECK-LABEL: func.func @dead_alloc_escaped
func.func @dead_alloc_escaped() -> memref<8x64xf32, 3> {
// CHECK: %{{.+}} = memref.alloc
%0 = memref.alloc() : memref<8x64xf32, 3>
return %0 : memref<8x64xf32, 3>
}

module attributes {transform.with_named_sequence} {
transform.named_sequence @__transform_main(%arg1: !transform.any_op {transform.readonly}) {
%0 = transform.structured.match ops{["func.func"]} in %arg1 : (!transform.any_op) -> !transform.any_op
transform.memref.erase_dead_alloc_and_stores %0 : (!transform.any_op) -> ()
transform.yield
}
}

// -----

// CHECK-LABEL: func.func @dead_alloc
func.func @dead_alloc() {
// CHECK-NOT: %{{.+}} = memref.alloc
Expand Down