summaryrefslogtreecommitdiff
path: root/include/llvm/Support/ValueHandle.h
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 /include/llvm/Support/ValueHandle.h
parentb4d31306a4f9e84a7ab6ace99964634adb4bf7e6 (diff)
downloadllvm-29384efb76a85e84f87c9bf898262d7f1069c38c.tar.gz
llvm-29384efb76a85e84f87c9bf898262d7f1069c38c.tar.bz2
llvm-29384efb76a85e84f87c9bf898262d7f1069c38c.tar.xz
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/llvm/Support/ValueHandle.h')
-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);