diff --git a/mlir/lib/Dialect/Linalg/ComprehensiveBufferize/BufferizableOpInterface.cpp b/mlir/lib/Dialect/Linalg/ComprehensiveBufferize/BufferizableOpInterface.cpp --- a/mlir/lib/Dialect/Linalg/ComprehensiveBufferize/BufferizableOpInterface.cpp +++ b/mlir/lib/Dialect/Linalg/ComprehensiveBufferize/BufferizableOpInterface.cpp @@ -406,8 +406,9 @@ if (auto bufferizableOp = options.dynCastBufferizableOp(lastWrite)) if (!bufferizableOp.isMemoryWrite(lastWrite.cast(), *this)) skipCopy = true; - // Do not copy if the copied data is never read. - if (!isValueRead(result)) + // Do not copy if the copied data is never read. (Neither by this ops nor by + // any following op.) + if (!bufferizesToMemoryRead(*opOperand) && !isValueRead(result)) skipCopy = true; // Do not copy if this op does not read the data, but writes it. if (bufferizesToMemoryWrite(*opOperand) &&