diff options
author | Dan Gohman <gohman@apple.com> | 2009-07-31 18:20:18 +0000 |
---|---|---|
committer | Dan Gohman <gohman@apple.com> | 2009-07-31 18:20:18 +0000 |
commit | 29384efb76a85e84f87c9bf898262d7f1069c38c (patch) | |
tree | 31b8ea82dc666e8e68d278ca7cf11062fd40d4b2 /include | |
parent | b4d31306a4f9e84a7ab6ace99964634adb4bf7e6 (diff) | |
download | external_llvm-29384efb76a85e84f87c9bf898262d7f1069c38c.zip external_llvm-29384efb76a85e84f87c9bf898262d7f1069c38c.tar.gz external_llvm-29384efb76a85e84f87c9bf898262d7f1069c38c.tar.bz2 |
Teach ValueHandleBase to treat DenseMap's special Empty and Tombstone
values the same way it treats null pointers. This is needed to allow
CallbackVH to be used as a key in a DenseMap.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@77695 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include')
-rw-r--r-- | include/llvm/Support/ValueHandle.h | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/include/llvm/Support/ValueHandle.h b/include/llvm/Support/ValueHandle.h index e06f2ea..84745ff 100644 --- a/include/llvm/Support/ValueHandle.h +++ b/include/llvm/Support/ValueHandle.h @@ -14,6 +14,7 @@ #ifndef LLVM_SUPPORT_VALUEHANDLE_H #define LLVM_SUPPORT_VALUEHANDLE_H +#include "llvm/ADT/DenseMapInfo.h" #include "llvm/ADT/PointerIntPair.h" #include "llvm/Value.h" @@ -57,32 +58,32 @@ public: : PrevPair(0, Kind), Next(0), VP(0) {} ValueHandleBase(HandleBaseKind Kind, Value *V) : PrevPair(0, Kind), Next(0), VP(V) { - if (V) + if (isValid(VP)) AddToUseList(); } ValueHandleBase(HandleBaseKind Kind, const ValueHandleBase &RHS) : PrevPair(0, Kind), Next(0), VP(RHS.VP) { - if (VP) + if (isValid(VP)) AddToExistingUseList(RHS.getPrevPtr()); } ~ValueHandleBase() { - if (VP) + if (isValid(VP)) RemoveFromUseList(); } Value *operator=(Value *RHS) { if (VP == RHS) return RHS; - if (VP) RemoveFromUseList(); + if (isValid(VP)) RemoveFromUseList(); VP = RHS; - if (VP) AddToUseList(); + if (isValid(VP)) AddToUseList(); return RHS; } Value *operator=(const ValueHandleBase &RHS) { if (VP == RHS.VP) return RHS.VP; - if (VP) RemoveFromUseList(); + if (isValid(VP)) RemoveFromUseList(); VP = RHS.VP; - if (VP) AddToExistingUseList(RHS.getPrevPtr()); + if (isValid(VP)) AddToExistingUseList(RHS.getPrevPtr()); return VP; } @@ -92,6 +93,12 @@ public: protected: Value *getValPtr() const { return VP; } private: + static bool isValid(Value *V) { + return V && + V != DenseMapInfo<Value *>::getEmptyKey() && + V != DenseMapInfo<Value *>::getTombstoneKey(); + } + // Callbacks made from Value. static void ValueIsDeleted(Value *V); static void ValueIsRAUWd(Value *Old, Value *New); |