Index: mlir/lib/Dialect/Bufferization/IR/BufferizationOps.cpp =================================================================== --- mlir/lib/Dialect/Bufferization/IR/BufferizationOps.cpp +++ mlir/lib/Dialect/Bufferization/IR/BufferizationOps.cpp @@ -469,7 +469,7 @@ // source op is being checked. Some ops like ReshapeOp are aliases to // allocation ops and could prevent removal of unnecessary allocs. if(!sourceDeallocOp) { - Operation *source_op = cloneOp->getPrevNode(); + Operation *source_op = cloneOp.getInput().getDefiningOp(); while (dyn_cast(source_op)) { llvm::Optional tmpDeallocOp = memref::findDealloc(source_op->getResult(0)); @@ -480,7 +480,9 @@ sourceDeallocOp = tmpOp; break; } - source_op = source_op->getPrevNode(); + if (!source_op->getNumOperands()) + break; + source_op = source_op->getOperand(0).getDefiningOp(); } } Index: mlir/test/Dialect/Bufferization/canonicalize.mlir =================================================================== --- mlir/test/Dialect/Bufferization/canonicalize.mlir +++ mlir/test/Dialect/Bufferization/canonicalize.mlir @@ -267,5 +267,7 @@ memref.dealloc %2 : memref return %4 : memref<*xf32> } +// CHECK-LABEL: @Atanh_platform_elem_type_output_type // CHECK-NOT: bufferization.clone -// CHECK-NOT: memref.dealloc \ No newline at end of file +// CHECK-NOT: memref.dealloc +// CHECK return {{.*}}