[llvm] [AST] Don't merge memory locations in AliasSetTracker (PR #65731)
Johannes Doerfert via llvm-commits
llvm-commits at lists.llvm.org
Mon Oct 9 13:15:55 PDT 2023
================
@@ -49,99 +49,12 @@ class Value;
class AliasSet : public ilist_node<AliasSet> {
friend class AliasSetTracker;
- class PointerRec {
- Value *Val; // The pointer this record corresponds to.
- PointerRec **PrevInList = nullptr;
- PointerRec *NextInList = nullptr;
- AliasSet *AS = nullptr;
- LocationSize Size = LocationSize::mapEmpty();
- AAMDNodes AAInfo;
-
- // Whether the size for this record has been set at all. This makes no
- // guarantees about the size being known.
- bool isSizeSet() const { return Size != LocationSize::mapEmpty(); }
-
- public:
- PointerRec(Value *V)
- : Val(V), AAInfo(DenseMapInfo<AAMDNodes>::getEmptyKey()) {}
-
- Value *getValue() const { return Val; }
-
- PointerRec *getNext() const { return NextInList; }
- bool hasAliasSet() const { return AS != nullptr; }
-
- PointerRec** setPrevInList(PointerRec **PIL) {
- PrevInList = PIL;
- return &NextInList;
- }
-
- bool updateSizeAndAAInfo(LocationSize NewSize, const AAMDNodes &NewAAInfo) {
- bool SizeChanged = false;
- if (NewSize != Size) {
- LocationSize OldSize = Size;
- Size = isSizeSet() ? Size.unionWith(NewSize) : NewSize;
- SizeChanged = OldSize != Size;
- }
-
- if (AAInfo == DenseMapInfo<AAMDNodes>::getEmptyKey())
- // We don't have a AAInfo yet. Set it to NewAAInfo.
- AAInfo = NewAAInfo;
- else {
- AAMDNodes Intersection(AAInfo.intersect(NewAAInfo));
- SizeChanged |= Intersection != AAInfo;
- AAInfo = Intersection;
- }
- return SizeChanged;
- }
-
- LocationSize getSize() const {
- assert(isSizeSet() && "Getting an unset size!");
- return Size;
- }
-
- /// Return the AAInfo, or null if there is no information or conflicting
- /// information.
- AAMDNodes getAAInfo() const {
- // If we have missing or conflicting AAInfo, return null.
- if (AAInfo == DenseMapInfo<AAMDNodes>::getEmptyKey() ||
- AAInfo == DenseMapInfo<AAMDNodes>::getTombstoneKey())
- return AAMDNodes();
- return AAInfo;
- }
-
- AliasSet *getAliasSet(AliasSetTracker &AST) {
- assert(AS && "No AliasSet yet!");
- if (AS->Forward) {
- AliasSet *OldAS = AS;
- AS = OldAS->getForwardedTarget(AST);
- AS->addRef();
- OldAS->dropRef(AST);
- }
- return AS;
- }
-
- void setAliasSet(AliasSet *as) {
- assert(!AS && "Already have an alias set!");
- AS = as;
- }
-
- void eraseFromList() {
- if (NextInList) NextInList->PrevInList = PrevInList;
- *PrevInList = NextInList;
- if (AS->PtrListEnd == &NextInList) {
- AS->PtrListEnd = PrevInList;
- assert(*AS->PtrListEnd == nullptr && "List not terminated right!");
- }
- delete this;
- }
- };
-
- // Doubly linked list of nodes.
- PointerRec *PtrList = nullptr;
- PointerRec **PtrListEnd;
// Forwarding pointer.
AliasSet *Forward = nullptr;
+ /// Memory locations in this alias set.
+ std::vector<MemoryLocation> MemoryLocs;
----------------
jdoerfert wrote:
Should we use a SetVector to avoid burdening the user with the change?
We can do a compile time check if it would cost us much.
https://github.com/llvm/llvm-project/pull/65731
More information about the llvm-commits
mailing list