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

    <tr>
        <th>Summary</th>
        <td>
            [mlir][python] Lifetime issue with nested object references can lead to crash
        </td>
    </tr>

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

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

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

<pre>
    Right now the top-level `PyOperation` will delete the underlying IR object when it's collected, but child `PyOperation`s aren't keeping the parent `PyOperation` alive:
```py
import weakref
import gc
from mlir import ir
from mlir.dialects import builtin

with ir.Context():
 mod_op = builtin.ModuleOp.parse("""
    module {
      func.func @foo() {
        return
      }
    }
  """)
  func_op = mod_op.body.operations[0]
  ret_op = func_op.body.blocks[0].operations[0]

  mod_ref = weakref.ref(mod_op, lambda _: print("module was finalized"))
  func_ref = weakref.ref(func_op, lambda _: print("func was finalized"))
  ret_ref = weakref.ref(ret_op, lambda _: print("return was finalized"))

  # Delete module reference.
  del mod_op; gc.collect()

  # Try accessing child operation.
 print(func_op)
```
output:
```
module was finalized
Segmentation fault (core dumped)
```

Ideally the reference to the nested op should keep parent IR objects alive, or at least the nested `PyOperation` should be set to invalid when its parent is erased.

Seems related to `TODO` comment here:
https://github.com/llvm/llvm-project/blob/5784c47806cf276e8fcc1311201f437cb8169261/mlir/lib/Bindings/Python/IRCore.cpp#L1430-L1432

</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyUVVFvozgQ_jXOy6jIGALkIQ9No0iV9tRVd99XxgzgrbGRbZrL_fqTDSS9tldppciRB8_3zXwzHnPnZKcR92R7INvjhk--N3ZvX_iFS99vatNc9s-y6z1ocwbfI3gz3il8RQWkoN8vTyNa7qXRpKBwlkpBgwo9xrOTbtCqi9QdPD6DqX-j8HDuUYP0hJUOhFEKhceGsAeoJw-il6r5iOyAW9SElR5eEMcAGPDHYPWfBMKVfEWS3RN6JPSeFHT-jZfZIIfRWA9n5C8W2__YOjFvW2sGGJS0sHyQ9t2HpJE8BO_WE_UklZd64YzrWfoepE0ejPb4tyesImx3jQsG0_wyI5DsuDonf5lmUvg0JiO3DqMDW36zD0BwmxQCKQ83G0A7aZGEBUhOW2NmsvenACz6yeq3NlIeb9s3mxs12622QLDGPIefhCZJzCq_I9sDJdsriEW_nl98Z4daGfGyHv4_9xUkMFlsI8pStSRUjlVzDKF9FB_qhsMvkt3DaKWe1WaLWGfuoJWaK_lP6LaY0rusPidYgv6CIWr-NX4Q4XP4WZ4v0OdyfYl_q1cGx_n2LVlbbNGiFpisZxpUS91IdoBOJMsVXFrzA95PewEuBDoXLt18Pa_FWlHXcK9a7d5dvHlrJj9O_uO1nLefFip--YHdgNpHSmj5pDwQVgljEZppGIMenxPO62ODXKlLnBhXQcCbaNDoPIaUwPVmUk2cL-tguQ4tt0wU9gDGAvegkDv_FuDjDFrwagSHPtBJ_cqVbNYB6FYW6QAtd9gkb6P-gTg4sKh4gPcmMPx8Oj4FaGGGIAj0aG9Trvd-dGHHToSdOun7qU6EGQg7KfW6_t2N1vyO9T7VytSEnbZllYu8rGghWlYWWLVCpFmaMpq2eVaKukqLHStSwk5h7AUcGfwOUjdSd46w0_eL740m7PT4_GAsJmIcCcu-pXlG78K6zK5Ns8-aXbbjG9ynRbUr0rwoyk2_r6oCOW1bTkvKOKPltswZx6rdZQUvymwj94yyjJZpmZYsZ0WSYc1YWjLK0oo2eUZyigOXKgk5JsZ2G-nchPsi2zG6UbxG5eIjx1hMIrsfl5hZePfsPmpTT50jOVXSeXdD8tKr-EJGz-2RbA-L8_YI32SLXg4IkQ_iwF97an7vri3nQHAdOieWU1ju-s1k1f6PCxepgu4xu38DAAD__18XZ7s">