When fusing two ops with the same output operand using FuseIntoContainingOp, the current implementation makes both ops write into a different value pointing to the same tensor. This, in the end, will bufferize into two different buffers, which is sub-optimal. The current patch solves this problem, adding support to reuse the tensor by both consumer and producer. More precisely, before FuseIntoContainingOp is applied, we may have two ops that write into the same output tensor. However, the consumer would be tiled, thus the op would write into the loop iter_args (i.e., it does not write directly into the original tensor). When the producer is fused into the loop, the output tensor of the producer remains the same, so the consumer and producer writes into two different values (consumer writes into the iter_args and producer into the original tensor). The current patch clones the consumer into the loop and checks if the consumer is writing to the same value pointed by the loop inits, in which case, it makes the output point to such tensor.
Multi-Level Intermediate Representation
See https://mlir.llvm.org/ for more information.