[Mlir-commits] [mlir] [MLIR][LLVM] Support Recursive DITypes (PR #80251)

Billy Zhu llvmlistbot at llvm.org
Fri Mar 22 16:50:20 PDT 2024


================
@@ -289,7 +316,19 @@ DINodeAttr DebugImporter::translate(llvm::DINode *node) {
     return nullptr;
   };
   if (DINodeAttr attr = translateNode(node)) {
-    nodeToAttr.insert({node, attr});
+    // If this node was marked as recursive, set its recId.
+    if (auto recType = dyn_cast<DIRecursiveTypeAttrInterface>(attr)) {
+      if (DistinctAttr recId = translationStack.lookup(node)) {
+        attr = cast<DINodeAttr>(recType.withRecId(recId));
+        // Remove the unbound recursive ID from the set of unbound self
+        // references in the translation stack.
+        unboundRecursiveSelfRefs.back().erase(recId);
+      }
+    }
+
+    // Only cache fully self-contained nodes.
+    if (unboundRecursiveSelfRefs.back().empty())
----------------
zyx-billy wrote:

Oh I suppose in the above case, D also has to contain another cycle (perhaps D <-> E), this way D is not simply deduplicated by MLIR. So something like
```
// LLVM
+---> B ----+
|           v
A <-------- D <--> E
|           ^
+---> C ----+

// MLIR
A -> B -> D0 -> A'
|         + --> E0 --> D0'
|
+--> C -> D1 -> A'
          + --> E1 --> D1'
```
D0 & D1 cannot be cached because they contain an unbound A', but also are not identical because they have distinct recIds.

https://github.com/llvm/llvm-project/pull/80251


More information about the Mlir-commits mailing list