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

    <tr>
        <th>Summary</th>
        <td>
            [MLIR] transform.structured.convert_to_loops does not delete target op
        </td>
    </tr>

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

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

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

<pre>
    Minimal example:
```
func.func @gemm(%arg0 : memref<?x?xf32>, %arg1 : memref<?x?xf32>,
  %arg2 : memref<?x?xf32>) {
  linalg.matmul ins(%arg0, %arg1 : memref<?x?xf32>, memref<?x?xf32>)
      outs(%arg2 : memref<?x?xf32>)
  return
}

module attributes {transform.with_named_sequence} {
  transform.named_sequence @__transform_main(%arg1 : !transform.any_op {transform.readonly}) {
 %matmul = transform.structured.match ops{["linalg.matmul"]} in %arg1
 : (!transform.any_op) -> !transform.any_op
 transform.structured.convert_to_loops %matmul : !transform.any_op
 transform.yield
  }
}
```

Via `mlir-opt test.mlir --transform-interpreter` this gets transformed into:
```
func.func @gemm(%arg0: memref<?x?xf32>, %arg1: memref<?x?xf32>, %arg2: memref<?x?xf32>) {
   // constants abbreviated
    scf.for %arg3 = %c0_9 to %dim step %c1_10 {
      // constants abbreviated
      scf.for %arg4 = %c0_11 to %dim_4 step %c1_12 {
        // constants abbreviated
        scf.for %arg5 = %c0_13 to %dim_0 step %c1_14 {
         // constants abbreviated
          %9 = arith.mulf %2, %5 : f32
          %10 = arith.addf %8, %9 : f32
          %11 = affine.apply #map(%arg3, %arg4, %arg5)
          %12 = affine.apply #map2(%arg3, %arg4, %arg5)
 memref.store %10, %arg2[%11, %12] : memref<?x?xf32>
        }
 }
    }
    linalg.matmul ins(%arg0, %arg1 : memref<?x?xf32>, memref<?x?xf32>) outs(%arg2 : memref<?x?xf32>)
 return
}
```

With the (old) target `linalg.matmul` still standing.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy0Vs2O4zYMfhrlIsSQZTtxDj7MbDZAge6lh_ZoyDZtq9CPK9HTzdsXcpw4nkln0wUaJIqskPwo8iMZ4b3sDEBBsleSHTdixN66QvWjUbbfVLY5F9-kkVooCt-FHhSQ5IWwI2EvZMfm9_TYjqaOwkJJyjrQmvCc8Ey4jlGSvFAN2kFLki8kOX0PnzbhJPlK-Bd6EYt_IHaBobM0_1z6QMn-9aqhpBGqi7RAPSoqjV9cex7-E6wrTnjZERfzP3LyqugAR2fmsO6P82ZatW1GBVQgOlmNCD5cDJ0wvrVOR39L7EsjNDSlh79GMDWQ_fH-8ovsWiykqSxvv5ZaSHNz_BIMwuNFW5hzaYc1ugPRWKPOwedVyAnP5miT5Hjngkc31jg6aEI26p7awQet7JVwvkoT4Zxkx3AXaa4ZuhqfXMsfeBec2JLk6yPPZ-WHvtTWvIHDEm2prB38yv-Hcfhg7SxBNTeK3nJ426yL5bL-LgUlO6aVdFs7IEXwGIUnut3eLG-lQXCDAwRHdoxiLz3tAP0CDg2VBu1PVOZzhfmUFH--HinhJ8JPtLbGozDoqagqB29SIDRLMfm6jVrrZvvJRCXCs5qVB4o2bBupqUcYpuO4jNkK5Wmg91DpHVQcL1hlukLj79Gex3uPmN0jJneIbIWYfkT8D5BT6zxMSMJJ7CM9qjac8TmL2cT2kLKPeiG2N0XRNJNiPisePlOML4ptKw1EYhjUmRKeaDHcaJgsLEqXbfaus17t8X-zx583eOFp5NE6uNzunsihG2VxPB_FoRF92sjXFLiW_N1udUz__4H0U1Po8RB61Lf-kNhT7EPkcquaAIjCdYChm627-C4QWCpFAzkbabpo0xRJc0gOYgNFvGeHmLN9xjZ9IVibQ7XLBeS7vahqYCxt0zrdJTmLOUs2suCMp4zzPI7TLGNRfRAVb6p8x3a8FXFDUgZaSBUp9aYj67qN9H6EIk94xjdKVKB8cZk1octeRszGFUF8W42dJylT0qNfDKBENf07-vbrL78FHjw3PxoLnhqLtAEFCNfw2GEzOlX0iIMP3Xoq3U5iP1ZRbTXhpwA8f20HZ_-EGgk_TdfwhJ-mm_wTAAD__y_ryF8">