<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=http://email.email.llvm.org/c/eJztWEtv4zYQ_jXyhYhBSZYcH3xwNnERoIdeel5QEmWxoUSBpOxNf32HQ-tlx7vpbottgQCGLc6LHzlDzmdlqnjd7ozpak6eScWOnDDSMmOIrZglB95wzSw3INNMSi6JVKo1hDUFYdZqkXVOaytek5OwFfnlt99JzdpWNIeJQRDvAvoY0F2Q0vPHD6MYjCkJ4kfCylI0_DOMg_hTEN0XNIg-kSIMok2QPBgaJI_kLoifCOrge0dCGq3g4YEYij_eOH6aBg-_FXwSdJxwHiO6GWPuPfrVqugkJyRYP3gBIWXX5CRYUfdrhWrAJ4gSpg8UdofUvNa8hMDp6otb1pcyjlw0QOStwndZRV-12kzxEOeS--3JVWMsayxxwx0RTcG_zO3S1dwQx29a-qTMgnrJm9Z0bkrfsjN5uRzqb9i2eFz1CpcGcbwyp2dVjhmyqpenq17hIDmdsbztteGlcrZZCNej9fu7NF12FPxE-iwmDxNgWK4gwqAYcDrGwe1MOciDKhw1iA9PzFBoA7TwNrTwJ0OLbkOLfiY0KRomD0u85ETu0o2FB1eXO-TGV5TDh_fIGGf2mDy6kbDunlT6s31t-cQz6usWHr3XTALO60cod-NLsK_bcL7Mm2uB0TuMNkR19jxD9N7I19WfPGUZHU5f4uIMfk6SXknWg2TjnkC6hw9pFGk1L3jOjVHaTCfBcon9bVsUJennGichfcyZ1zmTr4LLog9xZQZbPR26WwUdJhcSJAOW3fevPovrh0x10PD8DYMNAbeetZeiViu_KlT4zRZw66yxSL47UPhPBaLTQFh84-I1t51u-vGgGh8uWjd-7wzJWUMyTlRmuD7ywnEBqGg4UkgViDBENfIVvvj5lEDvQ_5wdtS8VuDnwDop8g5wOrlfFwvMVCNyJsWfEFOVKBzaAcxQKCAY4F2pEz-CibAogga7tuSFwwXvPK5JiZ_qxDV39XgUqjOAE-oOwAx85W3Wsj-Xci2FvlOtJXd3U5gz3_86xfnfUJX3UIW_SVXeQX5uko9LxnFJNK7IxQeh-CAUH4TiFqFYXdGHr1GMHyMUq8kk_zah-O4G-6tSL65hiQbKUFgHGRrqiwFsLxxbmuYn7erEN7KW61Lp2lw2Td9wNW8ly_1f9Vn3xH_tjDRwglR77r6W5Jrj337Xkcdmarid9k-YDsOBLzRO71JAlCV5dvNAE894xaCxarcI3jggTAbxfs4gTFe7dZ5fP0AyWe4y6U6fi16JQ-XIBPR2-carCU84oFFN-m9xfkvh1za-hfAkAYnH84xXYAykK6dKSOQDjs3g9lsze5GxXxTbuNjEG7Zgna2U3sJuGpZxvui03FbWtvi6A0vzAAC6bJmrGgZSHvufO6Blf_AckroXsH4HbZ_EySpdVFu2ThNWZuvynpZplmasjBmcs4SleRbe52whYTJptv46cHnDEP70L34cgdhGNIIPjcL7eBPSZUjzLClSmhZllJS0BGLAaybk0sVZKn1Y6C2GzLqDAaUUxppRCRkTh4ZzBAwIrbASB448uRv4qlZdkqG8CjWhcGMKFoh3i2D_Aj5nNfg>53546</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            [mlir] canonicalization passes don't keep attributes
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

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

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

<pre>
    Assume I have a pass that generates parallel loops and attributes them with GPU mapping attributes:
```
#map0 = affine_map<(d0, d1)[s0] -> (d0 * 1024 + s0 + d1)>
#map1 = affine_map<(d0, d1) -> (d0, d1)>
#map2 = affine_map<(d0) -> (d0)>
module  {
  func @function(%arg0: memref<64x1024xf32>, %arg1: memref<64x1024xf32>, %arg2: memref<64x1024xf32>) {
    %c1 = constant 1 : index
    %c64 = constant 64 : index
    %c1024 = constant 1024 : index
    %c0 = constant 0 : index
    scf.parallel (%arg3, %arg4) = (%c0, %c0) to (%c64, %c1024) step (%c1, %c1024) {
      %0 = memref.subview %arg0[%arg3, 0] [1, 1024] [1, 1] : memref<64x1024xf32> to memref<1x1024xf32, #map0>
      %1 = memref.subview %arg1[%arg3, 0] [1, 1024] [1, 1] : memref<64x1024xf32> to memref<1x1024xf32, #map0>
      %2 = memref.subview %arg2[%arg3, 0] [1, 1024] [1, 1] : memref<64x1024xf32> to memref<1x1024xf32, #map0>
      linalg.generic {indexing_maps = [#map1, #map1, #map1], iterator_types = ["parallel", "parallel"]} ins(%0, %1 : memref<1x1024xf32, #map0>, memref<1x1024xf32, #map0>) outs(%2 : memref<1x1024xf32, #map0>) {
      ^bb0(%arg5: f32, %arg6: f32, %arg7: f32):  // no predecessors
        %3 = addf %arg5, %arg6 : f32
        linalg.yield %3 : f32
      }
      scf.yield
    } {mapping = [{bound = #map2, map = #map2, processor = 2 : i64}, {bound = #map2, map = #map2, processor = 1 : i64}, {bound = #map2, map = #map2, processor = 0 : i64}]}
    return
  }
}
```

As can be observed the inner loop is only one iteration and can be removed, and that is what the canonicalizer of the parallel op does, however it doesn't keep the mapping attributes that were previously added:

```
/// mlir-opt --canonicalize

#map0 = affine_map<(d0, d1)[s0] -> (d0 * 1024 + s0 + d1)>
#map1 = affine_map<(d0, d1) -> (d0, d1)>
module  {
  func @function(%arg0: memref<64x1024xf32>, %arg1: memref<64x1024xf32>, %arg2: memref<64x1024xf32>) {
    %c0 = constant 0 : index
    %c64 = constant 64 : index
    %c1 = constant 1 : index
    scf.parallel (%arg3) = (%c0) to (%c64) step (%c1) {
      %0 = memref.subview %arg0[%arg3, 0] [1, 1024] [1, 1] : memref<64x1024xf32> to memref<1x1024xf32, #map0>
      %1 = memref.subview %arg1[%arg3, 0] [1, 1024] [1, 1] : memref<64x1024xf32> to memref<1x1024xf32, #map0>
      %2 = memref.subview %arg2[%arg3, 0] [1, 1024] [1, 1] : memref<64x1024xf32> to memref<1x1024xf32, #map0>
      linalg.generic {indexing_maps = [#map1, #map1, #map1], iterator_types = ["parallel", "parallel"]} ins(%0, %1 : memref<1x1024xf32, #map0>, memref<1x1024xf32, #map0>) outs(%2 : memref<1x1024xf32, #map0>) {
      ^bb0(%arg4: f32, %arg5: f32, %arg6: f32):  // no predecessors
        %3 = addf %arg4, %arg5 : f32
        linalg.yield %3 : f32
      }
      scf.yield
    }
    return
  }
}
```
Looking into it, looks like the rewriter that performs the canonicalization replaces the parallel op with a new op that it creates and doesn't set attributes for the newly created op. Is this behavior intentional?

Assuming I have no access to the higher level pass that generated the uncanonicalized loops with attributes, how can I canonicalize the loop while preserving its attributes?
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJztWEtv4zYQ_jXyhYhBvez44IOziYsAPfTS84KSKIsNJQokZSf99Z0hrZcdb9Nti22BAIIkzuPjkBxyPilTxdt2Z0xXc_JMKnbkhJGWGUNsxSw58IZrZrkBmWZSckmkUq0hrCkIs1aLrEOtrXhNTsJW5KdffiU1a1vRHCYGQbwL6GNAd8GKni_fjGIwpiSIHwkrS9Hwr9AO4i9BdF_QIPpCijCINkH6YGiQPpK7IH4iTgf3HQlplMDLAzHUPbxx_DQFD_8MfAI6djjHiG5izL1Hv1oVneSEBOsHLyCk7JqcBAnFpxWqAZ8gSpk-UJgdUvNa8xKAV8krDuu1jCNEg4i8Vfghq-ibVptpPARdcj89uWqMZY0l2NwR0RT8dW63SuaGrv2upV-UGaiXvGtN56b0PTuTl8sh_4Zpi8dRJ25ogOOVOT2rcrdCVvXyVdIrMCTUGcvbXhteKmeT5cL10fr5XZouOwp-Iv0qpg-TwFy6gsiBOsBp2zVurxSGPKjCUePicztmSLQhtPB2aOEPDi26HVr0I0OTomHysHSHnMhxuV3iwdGFm9z4jML43Dky4sxe00dsCYvnpNJf7VvLJ55Rn7fw6r1mEnBeP0K6G5-Cfd6G82HeHAu0PmC0Iaqz5x6ijyJfZ3_6lGV02H0p4gx-KFldSdaDZINvIN3DRRpFWs0LnnNjlDbTTly6xP60LYqS9H2NnZAec-Z1Xsk3wWXRQ1yZwVRPm3iqOIfJgQSLAcPu61e_iuuHTHVQ8PwJ4wqCm3rWXoparfyonMJPtoBTZ-2S5LuBwn8KiE6BXPKNg9fcdrrp24NqfLko3e6-MyRnDck4UZnh-sgL5AKQ0bClHFUgwhDVyDe48fMugdrn-MPZUfNagR8Gi1LHO8DphE_EAjPViJxJ8TtgqtIJh3IAPRQKCAZ4V-rEj2AirBNBgV1b8sLhgEePa1LiuzpxzTEfj0J1BuKEvINgBr7yPmvZn1O5lkLfqdaSu7tpmDPf_zrF-d9QlY9Qhb9IVT5Afm6Sj0vGcUk0rsjFJ6H4JBSfhOIWoUiu6MO3KMbfIxTJpJN_m1B8d4H9WakXLFiigTQUFkOGgvpiILYX7kqa5ieNeeILWct1qXRtLoumL7iat5Ll_lN9Vj3dVzsjDewg1Z6rryW55u6zHyvyWEwNt9P6Cd05OPCFwuldCkBZkmfsB4p4xisGhVXjIHiDgTAZxPs5gzBdjeM8_36AxWQ5riTuPkSvxKFCMgG1Xb7za8ITDihUk_pbnP9S-LGNfyE8SXDE43nGKxyGoyunSkjHB5DNuOm3ZvYjY78otnGxiTdsYYWVfAvbEmkAniVXs47hwkQVakJGRrBFp-W2srZ1_0dcLh8g4i5b5qqGhpTH_nEHPO43nkMW7AVMGI5ln8ZpslpUW5oW9_k6TbOYRut0k62SlEc8TVlyv4qTMFlIlnFptv78wIV2EP64WIhtRCO4aBTex5uQLkOaZ2mxoquijNKSlsADeM2EXGIcS6UPC711IWXdwYBSCmPNqIQRi0PD3bwgPutspfQWUs5AGHzh-t662P8A_DQe4A">