[llvm] [IR][Attribute] Add support for intersecting AttributeLists; NFC (PR #109719)
Nikita Popov via llvm-commits
llvm-commits at lists.llvm.org
Tue Oct 1 07:06:07 PDT 2024
================
@@ -903,6 +956,134 @@ AttributeSet AttributeSet::removeAttributes(LLVMContext &C,
return get(C, B);
}
+std::optional<AttributeSet>
+AttributeSet::intersectWith(LLVMContext &C, AttributeSet Other) const {
+ if (*this == Other)
+ return *this;
+
+ AttrBuilder Intersected(C);
+ // Iterate over both attr sets at once.
+ auto ItBegin0 = begin();
+ auto ItEnd0 = end();
+ auto ItBegin1 = Other.begin();
+ auto ItEnd1 = Other.end();
+
+ while (ItBegin0 != ItEnd0 || ItBegin1 != ItEnd1) {
+ // Loop through all attributes in both this and Other in sorted order. If
+ // the attribute is only present in one of the sets, it will be set in
+ // Attr0. If it is present in both sets both Attr0 and Attr1 will be set.
+ Attribute Attr0, Attr1;
+ if (ItBegin1 == ItEnd1)
+ Attr0 = *ItBegin0++;
+ else if (ItBegin0 == ItEnd0)
+ Attr1 = *ItBegin1++;
+ else {
+ int Cmp = ItBegin0->cmpKind(*ItBegin1);
+ if (Cmp == 0) {
+ Attr0 = *ItBegin0++;
+ Attr1 = *ItBegin1++;
+ } else if (Cmp < 0)
+ Attr0 = *ItBegin0++;
+ else
+ Attr0 = *ItBegin1++;
+ }
+ assert(Attr0.isValid() ||
+ Attr1.isValid() && "Iteration should never yield no valid attrs");
+
+ // If we don't have both attributes, then fail if the attribute is
+ // must-preserve or drop it otherwise.
+ if (!Attr0.isValid() || !Attr1.isValid()) {
----------------
nikic wrote:
```suggestion
assert(Attr0.isValid() && "Iteration should never yield no valid attrs");
// If we don't have both attributes, then fail if the attribute is
// must-preserve or drop it otherwise.
if (!Attr1.isValid()) {
```
https://github.com/llvm/llvm-project/pull/109719
More information about the llvm-commits
mailing list