diff options
author | Chris Lattner <sabre@nondot.org> | 2003-12-18 08:11:56 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2003-12-18 08:11:56 +0000 |
commit | 2cffeec014537a5f4d2313a5c21c3aa6fcf33288 (patch) | |
tree | 7ea833c04e386c31b822e7ae698ac94a635f5ada /include | |
parent | 45ab10cb6ebe1e4b7efc5ee6aecc3ebe24829d70 (diff) | |
download | external_llvm-2cffeec014537a5f4d2313a5c21c3aa6fcf33288.zip external_llvm-2cffeec014537a5f4d2313a5c21c3aa6fcf33288.tar.gz external_llvm-2cffeec014537a5f4d2313a5c21c3aa6fcf33288.tar.bz2 |
Add a new AliassetTracker::remove method. Because we need to be able to remove
a pointer from an AliasSet, maintain the pointer values on a doubly linked
list instead of a singly linked list, to permit efficient removal from the
middle of the list.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@10506 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include')
-rw-r--r-- | include/llvm/Analysis/AliasSetTracker.h | 42 |
1 files changed, 33 insertions, 9 deletions
diff --git a/include/llvm/Analysis/AliasSetTracker.h b/include/llvm/Analysis/AliasSetTracker.h index 2195253..77b1720 100644 --- a/include/llvm/Analysis/AliasSetTracker.h +++ b/include/llvm/Analysis/AliasSetTracker.h @@ -37,15 +37,20 @@ class AliasSet { typedef std::pair<Value* const, PointerRec> HashNodePair; class PointerRec { - HashNodePair *NextInList; + HashNodePair **PrevInList, *NextInList; AliasSet *AS; unsigned Size; public: - PointerRec() : NextInList(0), AS(0), Size(0) {} + PointerRec() : PrevInList(0), NextInList(0), AS(0), Size(0) {} HashNodePair *getNext() const { return NextInList; } bool hasAliasSet() const { return AS != 0; } + HashNodePair** setPrevInList(HashNodePair **PIL) { + PrevInList = PIL; + return &NextInList; + } + void updateSize(unsigned NewSize) { if (NewSize > Size) Size = NewSize; } @@ -68,13 +73,14 @@ class AliasSet { assert(AS == 0 && "Already have an alias set!"); AS = as; } - void setTail(HashNodePair *T) { - assert(NextInList == 0 && "Already have tail!"); - NextInList = T; + + void removeFromList() { + if (NextInList) NextInList->second.PrevInList = PrevInList; + *PrevInList = NextInList; } }; - HashNodePair *PtrListHead, *PtrListTail; // Singly linked list of nodes + HashNodePair *PtrList, **PtrListEnd; // Doubly linked list of nodes AliasSet *Forward; // Forwarding pointer AliasSet *Next, *Prev; // Doubly linked list of AliasSets @@ -135,7 +141,7 @@ public: // Alias Set iteration - Allow access to all of the pointer which are part of // this alias set... class iterator; - iterator begin() const { return iterator(PtrListHead); } + iterator begin() const { return iterator(PtrList); } iterator end() const { return iterator(); } void print(std::ostream &OS) const; @@ -175,11 +181,22 @@ public: private: // Can only be created by AliasSetTracker - AliasSet() : PtrListHead(0), PtrListTail(0), Forward(0), RefCount(0), + AliasSet() : PtrList(0), PtrListEnd(&PtrList), Forward(0), RefCount(0), AccessTy(NoModRef), AliasTy(MustAlias), Volatile(false) { } + AliasSet(const AliasSet &AS) { + // AliasSet's only get copy constructed in simple circumstances. In + // particular, they cannot have any pointers in their list. Despite this, + // we have to be sure to update the PtrListEnd to not point to the source + // AliasSet's list. + assert(AS.PtrList == 0 && "AliasSet has pointers in it!"); + PtrList = 0; PtrListEnd = &PtrList; + Forward = AS.Forward; RefCount = AS.RefCount; + AccessTy = AS.AccessTy; AliasTy = AS.AliasTy; Volatile = AS.Volatile; + } + HashNodePair *getSomePointer() const { - return PtrListHead ? PtrListHead : 0; + return PtrList; } /// getForwardedTarget - Return the real alias set this represents. If this @@ -247,6 +264,13 @@ public: void add(BasicBlock &BB); // Add all instructions in basic block void add(const AliasSetTracker &AST); // Add alias relations from another AST + /// remove method - This method is used to remove a pointer value from the + /// AliasSetTracker entirely. It should be used when an instruction is + /// deleted from the program to update the AST. If you don't use this, you + /// would have dangling pointers to deleted instructions. + /// + void remove(Value *PtrVal); + /// getAliasSets - Return the alias sets that are active. const ilist<AliasSet> &getAliasSets() const { return AliasSets; } |