================
@@ -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