diff options
author | Benjamin Kramer <benny.kra@googlemail.com> | 2014-12-06 00:02:31 +0000 |
---|---|---|
committer | Benjamin Kramer <benny.kra@googlemail.com> | 2014-12-06 00:02:31 +0000 |
commit | 0dc0e54272a542deac32990f2f5759d2517c7b21 (patch) | |
tree | 12a6beb07c3f6523702e1c62073577c4d51a45c7 /llvm/lib/IR/LLVMContextImpl.h | |
parent | 4701521ba06dd4b990c4c74c16b8c927658445a7 (diff) | |
download | bcm5719-llvm-0dc0e54272a542deac32990f2f5759d2517c7b21.tar.gz bcm5719-llvm-0dc0e54272a542deac32990f2f5759d2517c7b21.zip |
Revert "LLVMContext: Store APInt/APFloat directly into the ConstantInt/FP DenseMaps."
Somehow made DenseMap probe on forever on 32 bit machines.
This reverts commit r223478.
llvm-svn: 223546
Diffstat (limited to 'llvm/lib/IR/LLVMContextImpl.h')
-rw-r--r-- | llvm/lib/IR/LLVMContextImpl.h | 61 |
1 files changed, 46 insertions, 15 deletions
diff --git a/llvm/lib/IR/LLVMContextImpl.h b/llvm/lib/IR/LLVMContextImpl.h index 41822f0d106..5fd8683ccaf 100644 --- a/llvm/lib/IR/LLVMContextImpl.h +++ b/llvm/lib/IR/LLVMContextImpl.h @@ -46,26 +46,55 @@ class Type; class Value; struct DenseMapAPIntKeyInfo { - static inline APInt getEmptyKey() { return APInt(nullptr, 0); } - static inline APInt getTombstoneKey() { - return APInt(reinterpret_cast<uint64_t *>(sizeof(uint64_t)), 0); - } - static unsigned getHashValue(const APInt &Key) { + struct KeyTy { + APInt val; + Type* type; + KeyTy(const APInt& V, Type* Ty) : val(V), type(Ty) {} + bool operator==(const KeyTy& that) const { + return type == that.type && this->val == that.val; + } + bool operator!=(const KeyTy& that) const { + return !this->operator==(that); + } + friend hash_code hash_value(const KeyTy &Key) { + return hash_combine(Key.type, Key.val); + } + }; + static inline KeyTy getEmptyKey() { return KeyTy(APInt(1,0), nullptr); } + static inline KeyTy getTombstoneKey() { return KeyTy(APInt(1,1), nullptr); } + static unsigned getHashValue(const KeyTy &Key) { return static_cast<unsigned>(hash_value(Key)); } - static bool isEqual(const APInt &LHS, const APInt &RHS) { - return LHS.getBitWidth() == RHS.getBitWidth() && LHS == RHS; + static bool isEqual(const KeyTy &LHS, const KeyTy &RHS) { + return LHS == RHS; } }; struct DenseMapAPFloatKeyInfo { - static inline APFloat getEmptyKey() { return APFloat(APFloat::Bogus, 1); } - static inline APFloat getTombstoneKey() { return APFloat(APFloat::Bogus, 2); } - static unsigned getHashValue(const APFloat &Key) { + struct KeyTy { + APFloat val; + KeyTy(const APFloat& V) : val(V){} + bool operator==(const KeyTy& that) const { + return this->val.bitwiseIsEqual(that.val); + } + bool operator!=(const KeyTy& that) const { + return !this->operator==(that); + } + friend hash_code hash_value(const KeyTy &Key) { + return hash_combine(Key.val); + } + }; + static inline KeyTy getEmptyKey() { + return KeyTy(APFloat(APFloat::Bogus,1)); + } + static inline KeyTy getTombstoneKey() { + return KeyTy(APFloat(APFloat::Bogus,2)); + } + static unsigned getHashValue(const KeyTy &Key) { return static_cast<unsigned>(hash_value(Key)); } - static bool isEqual(const APFloat &LHS, const APFloat &RHS) { - return LHS.bitwiseIsEqual(RHS); + static bool isEqual(const KeyTy &LHS, const KeyTy &RHS) { + return LHS == RHS; } }; @@ -248,10 +277,12 @@ public: LLVMContext::YieldCallbackTy YieldCallback; void *YieldOpaqueHandle; - typedef DenseMap<APInt, ConstantInt *, DenseMapAPIntKeyInfo> IntMapTy; + typedef DenseMap<DenseMapAPIntKeyInfo::KeyTy, ConstantInt *, + DenseMapAPIntKeyInfo> IntMapTy; IntMapTy IntConstants; - - typedef DenseMap<APFloat, ConstantFP *, DenseMapAPFloatKeyInfo> FPMapTy; + + typedef DenseMap<DenseMapAPFloatKeyInfo::KeyTy, ConstantFP*, + DenseMapAPFloatKeyInfo> FPMapTy; FPMapTy FPConstants; FoldingSet<AttributeImpl> AttrsSet; |