diff --git a/mlir/lib/Dialect/Linalg/Transforms/Bufferize.cpp b/mlir/lib/Dialect/Linalg/Transforms/Bufferize.cpp --- a/mlir/lib/Dialect/Linalg/Transforms/Bufferize.cpp +++ b/mlir/lib/Dialect/Linalg/Transforms/Bufferize.cpp @@ -59,10 +59,12 @@ continue; } + // Clone all explicitly allocated output buffers. if (auto alloc = resultTensor.getDefiningOp()) { - resultBuffers.push_back(resultTensor); + resultBuffers.push_back(cloneMemref(loc, resultTensor, b)); continue; } + // Allocate buffers for statically-shaped results. if (memrefType.hasStaticShape()) { resultBuffers.push_back(b.create(loc, memrefType)); diff --git a/mlir/test/Dialect/Linalg/bufferize.mlir b/mlir/test/Dialect/Linalg/bufferize.mlir --- a/mlir/test/Dialect/Linalg/bufferize.mlir +++ b/mlir/test/Dialect/Linalg/bufferize.mlir @@ -45,11 +45,13 @@ // CHECK: #map = affine_map<(d0) -> (d0)> // CHECK-LABEL: func @init_tensor( // CHECK-SAME: %[[IN:.*]]: tensor, %[[SIZE:.*]]: index) -// CHECK: %[[OUT_BUF:.*]] = memref.alloc(%[[SIZE]]) : memref +// CHECK: %[[OUT_BUF0:.*]] = memref.alloc(%[[SIZE]]) : memref // CHECK: %[[MEMREF:.*]] = memref.buffer_cast %[[IN]] : memref +// CHECK: %[[OUT_BUF1:.*]] = memref.alloc(%[[SIZE]]) : memref +// CHECK: linalg.copy(%[[OUT_BUF0]], %[[OUT_BUF1]]) // CHECK: linalg.generic // CHECK-SAME: ins(%[[MEMREF]] : memref) -// CHECK-SAME: outs(%[[OUT_BUF]] : memref) { +// CHECK-SAME: outs(%[[OUT_BUF1]] : memref) { func @init_tensor(%in : tensor, %size: index) -> tensor { %init = linalg.init_tensor [%size] : tensor %0 = linalg.generic {