================
@@ -5994,9 +6010,16 @@ class AliasScopeTracker {
     assert(MDSL->getNumOperands() == 1 &&
            "llvm.experimental.noalias.scope should refer to a single scope");
     auto &MDOperand = MDSL->getOperand(0);
-    if (auto *MD = dyn_cast<MDNode>(MDOperand))
-      return !UsedAliasScopesAndLists.contains(MD) ||
-             !UsedNoAliasScopesAndLists.contains(MD);
+    if (auto *MD = dyn_cast<MDNode>(MDOperand)) {
+      if (!UsedAliasScopesAndLists.contains(MD))
+        return true;
+      // A scope of a domain with disjoint scopes carries an implicit noalias
+      // set, so its declaration matters without a noalias use as long as some
+      // other scope of that domain is used as well.
+      if (UsedDisjointDomains.contains(AliasScopeNode(MD).getDomain()))
+        return false;
+      return !UsedNoAliasScopesAndLists.contains(MD);
----------------
brunodf-gf wrote:

Suggestion to simplify this (or at least stay closer to the original):

```suggestion
      // A scope is relevant if it appears in a alias.scope list, and either it
      // appears in a noalias list, or it belongs to a disjoint-scope domain of
      // which multiple scopes are used.
      return !UsedAliasScopesAndLists.contains(MD) ||
             (!UsedNoAliasScopeAndLists.contains(MD) && 
              !UsedDisjointDomains.contains(AliasScopeNode(MD).getDomain()));
```

https://github.com/llvm/llvm-project/pull/218768
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to