aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Gohman <gohman@apple.com>2009-07-31 18:20:18 +0000
committerDan Gohman <gohman@apple.com>2009-07-31 18:20:18 +0000
commit29384efb76a85e84f87c9bf898262d7f1069c38c (patch)
tree31b8ea82dc666e8e68d278ca7cf11062fd40d4b2
parentb4d31306a4f9e84a7ab6ace99964634adb4bf7e6 (diff)
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
-rw-r--r--include/llvm/Support/ValueHandle.h21
1 files changed, 14 insertions, 7 deletions
diff --git a/include/llvm/Support/ValueHandle.h b/include/llvm/Support/ValueHandle.h
index e06f2ea61c..84745ff2c3 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);