[llvm] [Attributor] Change allocation size and load/store offsets using AAPointerInfo for Alloca instructions and keep track of instructions causing an Access (PR #72029)
Vidush Singhal via llvm-commits
llvm-commits at lists.llvm.org
Thu Nov 27 11:48:11 PST 2025
================
@@ -5858,49 +5866,161 @@ struct AAPointerInfo : public AbstractAttribute {
/// list should be strictly ascending, but we ensure that only when we
/// actually translate the list of offsets to a RangeList.
struct OffsetInfo {
- using VecTy = SmallSet<int64_t, 4>;
+ using VecTy = SmallVector<AA::RangeTy>;
+ // A map to store depth 1 predecessors per offset.
+ using OriginsTy = SmallVector<SmallPtrSet<Value *, 4>>;
using const_iterator = VecTy::const_iterator;
- VecTy Offsets;
+ OriginsTy Origins;
+ VecTy Ranges;
- const_iterator begin() const { return Offsets.begin(); }
- const_iterator end() const { return Offsets.end(); }
+ const_iterator begin() const { return Ranges.begin(); }
+ const_iterator end() const { return Ranges.end(); }
bool operator==(const OffsetInfo &RHS) const {
- return Offsets == RHS.Offsets;
+ return Ranges == RHS.Ranges && Origins == RHS.Origins;
}
bool operator!=(const OffsetInfo &RHS) const { return !(*this == RHS); }
- bool insert(int64_t Offset) { return Offsets.insert(Offset).second; }
- bool isUnassigned() const { return Offsets.size() == 0; }
+ // Insert a new Range and Origin
+ void insert(AA::RangeTy Range, Value &V) {
+ auto *It = std::find(Ranges.begin(), Ranges.end(), Range);
+ // Offset exists in Offsets map
+ if (It != Ranges.end()) {
+ size_t Index = It - Ranges.begin();
+ if (Index < Origins.size())
+ Origins[Index].insert(&V);
+ } else {
+ Ranges.push_back(Range);
+ Origins.emplace_back();
+ Origins.back().insert(&V);
+ }
+ }
+
+ // Set the size of the offset for all ranges.
+ void setSizeAll(uint64_t Size) {
+ for (auto &Range : Ranges)
+ Range.Size = Size;
+ }
+
+ // Helper function to get just the offsets from Ranges.
+ void getOnlyOffsets(SmallVector<int64_t> &Offsets) {
+ for (auto &Range : Ranges)
+ Offsets.push_back(Range.Offset);
+ // ensure unique
+ sort(Offsets.begin(), Offsets.end());
----------------
vidsinghal wrote:
We need sortedness property, I believe SmallSetVector is immutable so we cannot sort in place.
I would therefore, stick with SmallVector
https://github.com/llvm/llvm-project/pull/72029
More information about the llvm-commits
mailing list