<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/70030>70030</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            [mlir][tensor] Purpose of the `dest` operand is unclear
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            mlir
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          rikhuijzer
      </td>
    </tr>
</table>

<pre>
    Multiple tensor operations have an operand `dest`, but it's not so clear from the documentation of `tensor.pack` and `tensor.unpack` what the purpose of that operand is. The ops don't describe the operand apart from a description of its type. My assumption is that `dest` is mutated by the op because, for example, `tensor.insert` [states](https://mlir.llvm.org/docs/Dialects/TensorOps/#tensorinsert-tensorinsertop):

> The `tensor.insert` op inserts a scalar into a ranked tensor `dest` as specified by the operation’s indices.

That means that `dest` is mutated? This matches some tests that I see where the `dest` variable is returned.

If that's true, then there seems to be a bug with the canonicalizers. They don't assume the operands to be mutated. For example:

`mlir-opt -canonicalize` on the following code

```mlir
func.func @main(%dest : tensor<8x16x8x32xf32>) -> tensor<8x16x8x32xf32> {
  %cst = arith.constant dense<1.000000e-01> : tensor<64x128xf32>
  %0 = tensor.pack %cst outer_dims_perm = [1, 0] inner_dims_pos = [0, 1]
    inner_tiles = [8, 32] into %dest : tensor<64x128xf32> -> tensor<8x16x8x32xf32>
  return %dest : tensor<8x16x8x32xf32>
}
```

returns

```mlir
func.func @main(%arg0: tensor<8x16x8x32xf32>) -> tensor<8x16x8x32xf32> {
  return %arg0 : tensor<8x16x8x32xf32>
}
```
and for 
```mlir
func.func @main(%t: tensor<?xf32>, %idx: index, %f: f32) -> (tensor<?xf32>)
{
  %0 = tensor.insert %f into %t[%idx] : tensor<?xf32>
  return %t : tensor<?xf32>
}
```
it returns
```mlir
func.func @main(%arg0: tensor<?xf32>, %arg1: index, %arg2: f32) -> tensor<?xf32> {
  return %arg0 : tensor<?xf32>
}
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJysVk2P2zgM_TXKhYghy3E-Djk0kwnQQ7F7mHshy0ysji0ZEj2T6a9fSLYTZ5ppd7sNAieiyUfy8VmW9F6fDOKW5TuW72eyo8q6rdPPVae_fUc3K2z5tv3S1aTbGoHQeOvAtugkaWs8VPIFQZreZEpgS16iJ7bkTDxA0RFoYmLlwVgCb0HVKB0cnW2AKoTSqq5BQxEN7DHE90mSVqpntuQwoA7Wzoz210pSxGg711qPIZqCbSxF-wSeKgTbeiitYWJFUKJXThcYA0dH2UpHfU1y8GjHejR5oLcWE_jyBtL7rulvad8nu_YbTE1HkrCE4m1IAAUq2XkMZBytAzzLpq3j8tqTNh5dhGD5zgcEz_I9E-uKqPUs-8TEgYlDU2uX1PVLk1h3YuJQWuWZOOy1rFFR-PsU8f5qfQzIevgefT5d2JaJTcDle8bHa_YY2bpXlm2hX3iQ4JWspQNtyIIEJ80zlqMwJmxID75FpY96ysegG_Yo2JqzzcaDNqVW6JNpLU-B2Qal-RnJLDvAUxXWklSFHrxtgkI9DVGfwSPCa4WuH_cE5UU6LYsaA5xD6pzB8qaCz72WonLJdXFgVKEJF4cBuPFAFgoECUV3gldNVcyipLFGK1nr7-h6Bb5d5BcFdCO-EWVoKoHDRCXvJrTkQQJz2xLMp2niiGJpcLR1bV-1OYGyJb6L7r8BozcdO6OScAG24I3Uhok1E3kgCVj2aRgqyx7W53R5Xp8zcT5mgmWPTGxgHgTzoQew1a5PAsBEriLiHqTTVCXKGk_ShKfReGTZQ5rw-ME5T2PwNPlycU7Fesx8xeQRcbJZjIlsR-i-lrrxX1t0TXRj-S4NM-Qs34M25uJg_Xg_blhpePCGHDA4kq7x4rUOXpnoYcjCXb5uSv4FU2O2Xob38e7HsNX-3Win8-7x_O9JQLoT_4MKuPYWgP9Pb2G7Dvvof22IbnKy7HDp4yGUpctzcNCmxPNgOgZDcBo7ZWJ9F2AzVrz7SJz93hlBL6Kh8MbtE-d7-Ki6H_ijn7t-RJsmuNXD7yvhB-6kO6XvyZPuJN7zdwfh32rk123Oym1WbrKNnOE2XW7W6WKVrdazarsolmIhV8cM-RE3Ks0XIt3ki-UxRYW5Ws70VnCRpVws0jRbpuskVTIvsVgJ5LnI84wtODZS15dX70x73-F2xXnGZ7UssPbx_CREZFOEzWHmtsF9XnQnzxa81p78FYA01fHMFQPyPct3Q6_5Hv6eHmdu3lrXgw10Jh6kZp2rt7enhJOmqisSZRsmDiHj8DNvnf2Gipg4xPrDGSG28E8AAAD__6T0Bos">