[llvm] [AliasSetTracker] Use ModRefInfo (NFC) (PR #217917)

via llvm-commits llvm-commits at lists.llvm.org
Fri Aug 21 11:18:56 PDT 2026


llvmorg-github-actions[bot] wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-llvm-analysis

Author: Nikita Popov (nikic)

<details>
<summary>Changes</summary>

Use ModRefInfo instead of an equivalent custom AccessLattice.

I did not bit-pack the value (which would have required adding casts to/from ModRefInfo everywhere) because this doesn't impact the size of the structure on 64-bit hosts anyway.

---
Full diff: https://github.com/llvm/llvm-project/pull/217917.diff


2 Files Affected:

- (modified) llvm/include/llvm/Analysis/AliasSetTracker.h (+10-20) 
- (modified) llvm/lib/Analysis/AliasSetTracker.cpp (+26-30) 


``````````diff
diff --git a/llvm/include/llvm/Analysis/AliasSetTracker.h b/llvm/include/llvm/Analysis/AliasSetTracker.h
index 2f3418217e1b4..cd76ab6bdad79 100644
--- a/llvm/include/llvm/Analysis/AliasSetTracker.h
+++ b/llvm/include/llvm/Analysis/AliasSetTracker.h
@@ -26,6 +26,7 @@
 #include "llvm/IR/PassManager.h"
 #include "llvm/IR/ValueHandle.h"
 #include "llvm/Support/Compiler.h"
+#include "llvm/Support/ModRef.h"
 #include <cassert>
 #include <vector>
 
@@ -41,7 +42,6 @@ class Function;
 class Instruction;
 class StoreInst;
 class LoadInst;
-enum class ModRefInfo : uint8_t;
 class raw_ostream;
 class VAArgInst;
 class Value;
@@ -60,26 +60,12 @@ class AliasSet : public ilist_node<AliasSet> {
 
   /// Number of nodes pointing to this AliasSet plus the number of AliasSets
   /// forwarding to it.
-  unsigned RefCount : 27;
+  unsigned RefCount : 30;
 
   // Signifies that this set should be considered to alias any pointer.
   // Use when the tracker holding this set is saturated.
   unsigned AliasAny : 1;
 
-  /// The kinds of access this alias set models.
-  ///
-  /// We keep track of whether this alias set merely refers to the locations of
-  /// memory (and not any particular access), whether it modifies or references
-  /// the memory, or whether it does both. The lattice goes from "NoAccess" to
-  /// either RefAccess or ModAccess, then to ModRefAccess as necessary.
-  enum AccessLattice {
-    NoAccess = 0,
-    RefAccess = 1,
-    ModAccess = 2,
-    ModRefAccess = RefAccess | ModAccess
-  };
-  unsigned Access : 2;
-
   /// The kind of alias relationship between pointers of the set.
   ///
   /// These represent conservatively correct alias results between any members
@@ -91,6 +77,9 @@ class AliasSet : public ilist_node<AliasSet> {
   };
   unsigned Alias : 1;
 
+  // The kinds of access this alias set models.
+  ModRefInfo Access;
+
   void addRef() { ++RefCount; }
 
   void dropRef(AliasSetTracker &AST) {
@@ -104,8 +93,8 @@ class AliasSet : public ilist_node<AliasSet> {
   AliasSet &operator=(const AliasSet &) = delete;
 
   /// Accessors...
-  bool isRef() const { return Access & RefAccess; }
-  bool isMod() const { return Access & ModAccess; }
+  bool isRef() const { return isRefSet(Access); }
+  bool isMod() const { return isModSet(Access); }
   bool isMustAlias() const { return Alias == SetMustAlias; }
   bool isMayAlias()  const { return Alias == SetMayAlias; }
 
@@ -137,7 +126,8 @@ class AliasSet : public ilist_node<AliasSet> {
 private:
   // Can only be created by AliasSetTracker.
   AliasSet()
-      : RefCount(0), AliasAny(false), Access(NoAccess), Alias(SetMustAlias) {}
+      : RefCount(0), AliasAny(false), Alias(SetMustAlias),
+        Access(ModRefInfo::NoModRef) {}
 
   LLVM_ABI void removeFromTracker(AliasSetTracker &AST);
 
@@ -253,7 +243,7 @@ class AliasSetTracker {
     }
   }
 
-  AliasSet &addMemoryLocation(MemoryLocation Loc, AliasSet::AccessLattice E);
+  AliasSet &addMemoryLocation(MemoryLocation Loc, ModRefInfo MR);
   AliasSet *mergeAliasSetsForMemoryLocation(const MemoryLocation &MemLoc,
                                             AliasSet *PtrAS,
                                             bool &MustAliasAll);
diff --git a/llvm/lib/Analysis/AliasSetTracker.cpp b/llvm/lib/Analysis/AliasSetTracker.cpp
index 1e2f05b60a9a3..7b5f58b827fe1 100644
--- a/llvm/lib/Analysis/AliasSetTracker.cpp
+++ b/llvm/lib/Analysis/AliasSetTracker.cpp
@@ -137,13 +137,13 @@ void AliasSet::addUnknownInst(Instruction *I, BatchAAResults &AA) {
     !(I->use_empty() && match(I, m_Intrinsic<Intrinsic::invariant_start>()));
   if (!MayWriteMemory) {
     Alias = SetMayAlias;
-    Access |= RefAccess;
+    Access |= ModRefInfo::Ref;
     return;
   }
 
   // FIXME: This should use mod/ref information to make this not suck so bad
   Alias = SetMayAlias;
-  Access = ModRefAccess;
+  Access = ModRefInfo::ModRef;
 }
 
 /// aliasesMemoryLocation - If the specified memory location "may" (or must)
@@ -314,32 +314,32 @@ AliasSet &AliasSetTracker::getAliasSetFor(const MemoryLocation &MemLoc) {
 }
 
 void AliasSetTracker::add(const MemoryLocation &Loc) {
-  addMemoryLocation(Loc, AliasSet::NoAccess);
+  addMemoryLocation(Loc, ModRefInfo::NoModRef);
 }
 
 void AliasSetTracker::add(LoadInst *LI) {
   if (isStrongerThanMonotonic(LI->getOrdering()))
     return addUnknown(LI);
-  addMemoryLocation(MemoryLocation::get(LI), AliasSet::RefAccess);
+  addMemoryLocation(MemoryLocation::get(LI), ModRefInfo::Ref);
 }
 
 void AliasSetTracker::add(StoreInst *SI) {
   if (isStrongerThanMonotonic(SI->getOrdering()))
     return addUnknown(SI);
-  addMemoryLocation(MemoryLocation::get(SI), AliasSet::ModAccess);
+  addMemoryLocation(MemoryLocation::get(SI), ModRefInfo::Mod);
 }
 
 void AliasSetTracker::add(VAArgInst *VAAI) {
-  addMemoryLocation(MemoryLocation::get(VAAI), AliasSet::ModRefAccess);
+  addMemoryLocation(MemoryLocation::get(VAAI), ModRefInfo::ModRef);
 }
 
 void AliasSetTracker::add(AnyMemSetInst *MSI) {
-  addMemoryLocation(MemoryLocation::getForDest(MSI), AliasSet::ModAccess);
+  addMemoryLocation(MemoryLocation::getForDest(MSI), ModRefInfo::Mod);
 }
 
 void AliasSetTracker::add(AnyMemTransferInst *MTI) {
-  addMemoryLocation(MemoryLocation::getForDest(MTI), AliasSet::ModAccess);
-  addMemoryLocation(MemoryLocation::getForSource(MTI), AliasSet::RefAccess);
+  addMemoryLocation(MemoryLocation::getForDest(MTI), ModRefInfo::Mod);
+  addMemoryLocation(MemoryLocation::getForSource(MTI), ModRefInfo::Ref);
 }
 
 void AliasSetTracker::addUnknown(Instruction *Inst) {
@@ -386,17 +386,6 @@ void AliasSetTracker::add(Instruction *I) {
   // Handle all calls with known mod/ref sets genericall
   if (auto *Call = dyn_cast<CallBase>(I))
     if (Call->onlyAccessesArgMemory()) {
-      auto getAccessFromModRef = [](ModRefInfo MRI) {
-        if (isRefSet(MRI) && isModSet(MRI))
-          return AliasSet::ModRefAccess;
-        else if (isModSet(MRI))
-          return AliasSet::ModAccess;
-        else if (isRefSet(MRI))
-          return AliasSet::RefAccess;
-        else
-          return AliasSet::NoAccess;
-      };
-
       ModRefInfo CallMask = AA.getMemoryEffects(Call).getModRef();
 
       // Some intrinsics are marked as modifying memory for control flow
@@ -417,7 +406,7 @@ void AliasSetTracker::add(Instruction *I) {
         ModRefInfo ArgMask = AA.getArgModRefInfo(Call, ArgIdx);
         ArgMask &= CallMask;
         if (!isNoModRef(ArgMask))
-          addMemoryLocation(ArgLoc, getAccessFromModRef(ArgMask));
+          addMemoryLocation(ArgLoc, ArgMask);
       }
       return;
     }
@@ -447,7 +436,7 @@ void AliasSetTracker::add(const AliasSetTracker &AST) {
 
     // Loop over all of the memory locations in this alias set.
     for (const MemoryLocation &ASMemLoc : AS.MemoryLocs)
-      addMemoryLocation(ASMemLoc, (AliasSet::AccessLattice)AS.Access);
+      addMemoryLocation(ASMemLoc, AS.Access);
   }
 }
 
@@ -468,7 +457,7 @@ AliasSet &AliasSetTracker::mergeAllAliasSets() {
   AliasSets.push_back(new AliasSet());
   AliasAnyAS = &AliasSets.back();
   AliasAnyAS->Alias = AliasSet::SetMayAlias;
-  AliasAnyAS->Access = AliasSet::ModRefAccess;
+  AliasAnyAS->Access = ModRefInfo::ModRef;
   AliasAnyAS->AliasAny = true;
 
   for (auto *Cur : ASVector) {
@@ -489,9 +478,9 @@ AliasSet &AliasSetTracker::mergeAllAliasSets() {
 }
 
 AliasSet &AliasSetTracker::addMemoryLocation(MemoryLocation Loc,
-                                             AliasSet::AccessLattice E) {
+                                             ModRefInfo MR) {
   AliasSet &AS = getAliasSetFor(Loc);
-  AS.Access |= E;
+  AS.Access |= MR;
 
   if (!AliasAnyAS && (TotalAliasSetSize > SaturationThreshold)) {
     // The AST is now saturated. From here on, we conservatively consider all
@@ -510,11 +499,18 @@ void AliasSet::print(raw_ostream &OS) const {
   OS << "  AliasSet[" << (const void*)this << ", " << RefCount << "] ";
   OS << (Alias == SetMustAlias ? "must" : "may") << " alias, ";
   switch (Access) {
-  case NoAccess:     OS << "No access "; break;
-  case RefAccess:    OS << "Ref       "; break;
-  case ModAccess:    OS << "Mod       "; break;
-  case ModRefAccess: OS << "Mod/Ref   "; break;
-  default: llvm_unreachable("Bad value for Access!");
+  case ModRefInfo::NoModRef:
+    OS << "No access ";
+    break;
+  case ModRefInfo::Ref:
+    OS << "Ref       ";
+    break;
+  case ModRefInfo::Mod:
+    OS << "Mod       ";
+    break;
+  case ModRefInfo::ModRef:
+    OS << "Mod/Ref   ";
+    break;
   }
   if (Forward)
     OS << " forwarding to " << (void*)Forward;

``````````

</details>


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


More information about the llvm-commits mailing list