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 | 0542060b8a18db296f82faeb87fe2d5113fa3bee (patch) | |
tree | d9c4c5b51ec31b29291efef584e36136d6a83abc | |
parent | 9d7de2a155ec21368b259ddebc4f68609faeab6e (diff) | |
download | bcm5719-llvm-0542060b8a18db296f82faeb87fe2d5113fa3bee.tar.gz bcm5719-llvm-0542060b8a18db296f82faeb87fe2d5113fa3bee.zip |
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.
llvm-svn: 77695
-rw-r--r-- | llvm/include/llvm/Support/ValueHandle.h | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/llvm/include/llvm/Support/ValueHandle.h b/llvm/include/llvm/Support/ValueHandle.h index e06f2ea61cd..84745ff2c34 100644 --- a/llvm/include/llvm/Support/ValueHandle.h +++ b/llvm/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); |