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

    <tr>
        <th>Summary</th>
        <td>
            MLIR Linalg short form format is used when it should not be
        </td>
    </tr>

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

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

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

<pre>
    Both `linalg.map` and `linalg.reduce` sometimes print using "short" form even though the payload is not in short form. This means that writing the op, and then reading it back, will result in an op that does something completely different from the original operation.

The reason is that [findPayloadOp()](https://github.com/llvm/llvm-project/blob/b0bdbf4288a664179024eead871a5e7b7fae6dda/mlir/lib/Dialect/Linalg/IR/LinalgOps.cpp#L1470) does not verify that the `YieldOp` actually yields the result(s) of the payload operation.

So, the following (nonsensical) `linalg.map` will, incorrectly, print in short form, which, when read back will do something else than the original.

```
$ cat ~/llvm-builds/linalg-map-bug/bug.mlir
"builtin.module"() ({
 "func.func"() <{function_type = (tensor<1x32xf32>, tensor<1x32xf32>) -> tensor<1x32xf32>, sym_name = "map_maximumf"}> ({
  ^bb0(%arg0: tensor<1x32xf32>, %arg1: tensor<1x32xf32>):
    %0 = "tensor.empty"() : () -> tensor<1x32xf32>
    %1 = "linalg.map"(%arg0, %arg1, %0) ({
 ^bb0(%arg2: f32, %arg3: f32):
      %2 = "arith.maximumf"(%arg2, %arg3) <{fastmath = #arith.fastmath<none>}> : (f32, f32) -> f32
      // NOTE: This does not yield the output of arith.maximumf
 "linalg.yield"(%arg2) : (f32) -> ()
    }) : (tensor<1x32xf32>, tensor<1x32xf32>, tensor<1x32xf32>) -> tensor<1x32xf32>
 "func.return"(%1) : (tensor<1x32xf32>) -> ()
  }) : () -> ()
}) : () -> ()
```
The default printing gives the incorrect:
```
$ mlir-opt -- ~/llvm-builds/linalg-map-bug/bug.mlir
module {
  func.func @map_maximumf(%arg0: tensor<1x32xf32>, %arg1: tensor<1x32xf32>) -> tensor<1x32xf32> {
    %0 = tensor.empty() : tensor<1x32xf32>
 %mapped = linalg.map { arith.maximumf } ins(%arg0, %arg1 : tensor<1x32xf32>, tensor<1x32xf32>) outs(%0 : tensor<1x32xf32>)
    return %mapped : tensor<1x32xf32>
  }
}
```
and round-tripping through the default printer does not bring back the original operation:
```
$ mlir-opt -- ~/llvm-builds/linalg-map-bug/bug.mlir | mlir-opt --mlir-print-op-generic
"builtin.module"() ({
  "func.func"() <{function_type = (tensor<1x32xf32>, tensor<1x32xf32>) -> tensor<1x32xf32>, sym_name = "map_maximumf"}> ({
  ^bb0(%arg0: tensor<1x32xf32>, %arg1: tensor<1x32xf32>):
    %0 = "tensor.empty"() : () -> tensor<1x32xf32>
    %1 = "linalg.map"(%arg0, %arg1, %0) ({
 ^bb0(%arg2: f32, %arg3: f32):
      %2 = "arith.maximumf"(%arg2, %arg3) <{fastmath = #arith.fastmath<none>}> : (f32, f32) -> f32
 "linalg.yield"(%2) : (f32) -> ()
    }) : (tensor<1x32xf32>, tensor<1x32xf32>, tensor<1x32xf32>) -> tensor<1x32xf32>
 "func.return"(%1) : (tensor<1x32xf32>) -> ()
  }) : () -> ()
}) : () -> ()
```
Note that the resulting payload block now yields the result of the `arith.maximumf`, which the original operation did not.

The same problem most likely affects `linalg.reduce`, which also [uses](https://github.com/llvm/llvm-project/blob/b0bdbf4288a664179024eead871a5e7b7fae6dda/mlir/lib/Dialect/Linalg/IR/LinalgOps.cpp#L1725) `findPayloadOp()` in the same way.

Also, [the documentation](https://github.com/llvm/llvm-project/blob/b0bdbf4288a664179024eead871a5e7b7fae6dda/mlir/lib/Dialect/Linalg/IR/LinalgOps.cpp#L1466) for `findPayloadOp()` says "If initFirst flag is enabled, we check that init takes the first position in operands of payload." but this does not correspond to what the code does (the code does special things with the first _argument_ of the block and the _last_ operand of the payload operation).

This is llvm-project at:
```
commit 73bebf96bc21dcc01a8eccfb4ece200c1c665931 (HEAD -> main, origin/main, origin/HEAD)
Date:   Mon Nov 25 14:47:50 2024 +0800
```




</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsWElv4zoS_jX0hbAhUZt98MGJE0wDvTy86cucAkoqWZymSIGkkvZlfvugSNmWEjszmeXhHRoIFJmqKtXy1UeWuLXioAC2JLsj2X7BB9dqs_0NzBchawVmUer6uL3TrqUkj6RQXB5WHe9JHlGu6smigXqoANet7sCJDiztjVCODlaoAyWM2VYbRxijjTYdhWdQ1LV6OLTUtUB7fpSa11RYqrSjQlEv74VX9HsrLO2AK0tdyx19McKhWdTUPWH33h3XgqIGeI2PhKMlr37gsxchJTVgB-kNc0V1H-zUGmzwuEWdSne9BAfySGvRNGBAOdoY3YUXGXHAaKnuwXAntFqRaE-iXbh-bwFfbrXCILx5kt01QtW_hdi-9YStCduQbE_YunWutyTZEfZI2ONBuHYoV5XuCHuU8vn0b9kb_XeoHGGPpdQl_ovKumxStl7zPE_jYhOxFIDX6yLmGRRl0XDI65oT9thJYdCOQL294DIY-uxLRtjjp9_Pv771dlX1PWHJ5zgtIsI2ITdYi2cwojmGiDAPJI_-JkBiPIiDyg1cyiM94pr1EiHXhK0tGtLNrMLXs_dXjZVCuUZLqV8CaNZKKwvKiopLNPUGhVhaVBSq0sZA5eQRfwbozUDkgdCKqg03I1I8RgJAaj1BAkgLGLGaVX7mMcmj8S_8ZCmtuKP_OFWuHISsrc8_erzseL8sB8x7ORxWvjajIkNRJ9Sq0_UggTAWgIIJIMVdEMMWagZVrfAyEUnuSXGHa5jSJ3fsgZJkj6oOlNWGJPfxz4T9bBJGkgef5KvrG7okycONh_fUHrsnxbuTcdbx_qnjP0U3dA16U-xRe-YwJdlDWUbe0YybQ0SS3U37QSS-LbLBXhkNUxSPTq4E-RV0vTtOE7Oj4-3twKb24pO9CcJGa8H7iZfhNnpbo3nEDJ3AV51Vk_PKPB7vATt5wI1w7Wqa3ovFialL-bl1HUeW9vpJ0D-tkuReaQUY71ilkJrRseBNSBLez3xCbqJfv31_QB3Pwmda8P0e2mNw_eCwz185fgbumFKv8iqczcyd0Y-RKC_lKfYTyY8B-z8B_LzjDLjBqLPf8b905WoU8xiuCv07InPWwU2nhobj1uZJD8nrIJ4hEPGZFs9gu8JaSEVL3Tu6XH6cvQJl0UnXn0mKkjSa08T_hghu123qxoQj5gRxZod3K591vO-h9voXQsAXvAI51pUKZa8Sxe33vANLPbjRWvSO_qQ7Aj5nTr8bnYfiGXDXYIGnKaMHVS-dEX0fjlrmfFibIQ7MhRNKg6J-T71-Yvo_4JCS4n6q62-9Z0vdLw-gwIjqY1vtr7321177B-61tzbIX7vjf7k7ftUOLnNLmEqQoE6jSCl19YMq_fJ2eDlNLSSPXiEkj86jxA2So7WokQ7fjIcWm7o3upTQ0U5bR6X4gdMmbxqonL02UF9exqXVOFIOFuyffYYsWDbOa9cG4DzC2cydMvLCj7NU7aT10yDJ7vxuo6uhA-XCBvInDzzNcwy80ead4C0_WuyfTw0VSrhHYayjjeQHKiwFxUsJta870KoFv5ly50Wp4z_Gs13jtXpthcecUAGAqraI3RHiK8IYLQdsgOnZ3Z8Kba9VTZ2mL6cOqXQNQQibd7Zge6gEl9SPx5a-CNdOvHji5uBr9HTqm9Ba41cZ-iS5xWfBwZtfBAjbvOoZYTEl02JSfvMwW-muE44WSQlls8nLisV1VUUxX0NVNWUKFbAoquIqz7NNEmOQf3nY7QONdFwozHloZwTA6wWUPTPNnjtAJqL0i1b0q36mLKNxSpJdWpBkl0WURSylhN1F6yi6fuZ5c13U26TeJBu-gG1cJCxjCUuTRbvdrNNiw-I4K_OkKDJW8bKEvE7zskjLTZMtxBZfF8csi9asYMkqW9cpWzfrKovLsk4qkkbQcSFXmMuVNoeFsHaAbRwXGVsvJC9BWv8hkLEAfUay_cJsx1PYwZI0ksI6e7HghJOw_fL50-80NMLkc4u_IGgtHSzU4YuLcCgxyDocFmExGLn9cC97x_FIOPr-vGX_DAAA__-D9hXZ">