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

    <tr>
        <th>Summary</th>
        <td>
            [mlir] `Operation::clone` doesn't clone properties of unregister ops
        </td>
    </tr>

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

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

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

<pre>
    
@fabianschuiki and I have seen `Operation::clone` drops properties of unregistered ops in downstream projects. This is a reproducer using `test-clone` pass:

```mlir
$ cat test.mlir
"builtin.module"() ({
  "func.func"() <{function_type = () -> (), sym_name = "func"}> ({
 "unregistered.foo" ()<{bar = 1}> : () -> ()
  }) : () -> ()
}) : () -> ()

$ mlir-opt test.mlir --pass-pipeline='builtin.module(func.func(test-clone))' -allow-unregistered-dialect -mlir-print-ir-before-all -mlir-print-ir-after-all
// -----// IR Dump Before (anonymous namespace)::ClonePass (test-clone) //----- //
func.func @func() {
 "unregistered.foo"() <{bar = 1 : i64}> : () -> ()
}

notifyOperationInserted: unregistered.foo
// -----// IR Dump After (anonymous namespace)::ClonePass (test-clone) //----- //
func.func @func() {
  "unregistered.foo"() : () -> ()
}

module {
  func.func @func() {
    "unregistered.foo"() : () -> ()
  }
}

```

I debugged a bit and I think `getPropertiesStorage` in the following code always returns null for unregister ops. I think it's necessary to initialize OperationState's `propertiesAttr` for unregistered ops instead.

https://github.com/llvm/llvm-project/blob/9c90f848fda9992ab6294d33665c1e2eb0613c0a/mlir/lib/IR/Operation.cpp#L735-L736
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJy8VUuP2zYQ_jX0ZSCBot4HHbzrGlggQIOk94CiRjK7NCmQ1C7cX1-QshVn2-yiPcQQrMc8vplvyI_cOTlpxI6UD6Q87PjiT8Z2C2rzvOx6M1w6QvekoCPvJddOnBb5LIHrAZ7gxF8QHKIGUtHfZ7TcS6NJvif5XiijkVQUBmtmB7M1M1ov0YEZYdEWJ-k8WhwgmKWGwbxq5y3yc3D-E4V3Kfxxkg6kAw4WZ2uGRaCFxUk9BUiPzicb0MydC9g0XhVdr7OSNryzAgT3EELS7RvrF6m81OnZDItCwhhhDWEthFv9QOgegDA2Llqk4e_OIX8k9UP4Flr-5i8zAskPcDUnJP_t-kzYI7jL-Zvm55sLu-WqDze_FYwwdk9NOhpDGLslipA9tzFLdgvO9_8GGiuvD2upP_H40L7SFthKzHzHHSRJIDuZ5YxKaiT5gbD6LZfNHW3N3agCJS1hNSRcKfOa3HecDJIrFB6SiDpbqX0ibdLjaCyGgLcWPnq0wRCrPRJ2hCT8rs9PX-CwnGd4iAlCb1wbfTmbxUGYiJu5iCXFRfsYCvzMnYO3JcOaL6a-PhO63zqEsEPWTqPze-P8YQVt44xjkFXx0ViDPY5GGy_Hy7brnrRD63EIgf8AfZeafWDwFzPzETUfNb-usS3bR2j_F2_dQ3e4m6ysr08wYL9MEw7AoZf-qov-JPVzEKgJ_edN-L56Y_kUpUpq8CeE0YQNEMRMmAGBq1d-cWDRL1Y70ItSMBp7N86glekGID1htQONAp3j9gLegNTSS67kXwjb0vjqucfoSir6XYj33ttQzI8QmyA7j3xI1z5P3s9RW-N4J-lPS58KcybsqNTL7ZZcdZuwY69MT9ixFS0dm6IZB962LeN9xdpiyPOqKkWGDHtaZbmgnLBj1GR2VDLEPX0h7LjVn4p5Jiz_VOdl8qnOq93Q5UObt3yHXVaXBWVFWZW7U5cLRutiHAdeiywrRNZU1ZhRUdK6okibnewYZSVtaEbLEJXySgzF2NRlQ2lFG0YKimcuVRr6SY2ddtK5BbuszKqC7hTvUbl4VjK2VszCqWm72H-_TI4UVEnn3fcMXnoVz9cYUB7ePSwNOk1Y7SF--umxGWa0W6zq_vNkYj-OsOO1pZeO_R0AAP__YEJmRg">