Chromium Code Reviews| Index: src/IceGlobalContext.cpp |
| diff --git a/src/IceGlobalContext.cpp b/src/IceGlobalContext.cpp |
| index 95378caa870d7951fc7527eadf0e60906b40be09..37b0c1c273439467918bae93bf2995ec03bc94ab 100644 |
| --- a/src/IceGlobalContext.cpp |
| +++ b/src/IceGlobalContext.cpp |
| @@ -14,6 +14,7 @@ |
| #include <ctype.h> // isdigit(), isupper() |
| #include <locale> // locale |
| +#include <unordered_map> |
| #include "IceCfg.h" |
| #include "IceClFlags.h" |
| @@ -25,29 +26,29 @@ |
| #include "IceTimerTree.h" |
| #include "IceTypes.h" |
| +template <> struct std::hash<Ice::RelocatableTuple> { |
| + std::size_t operator()(const Ice::RelocatableTuple &Key) const { |
| + return std::hash<Ice::IceString>()(Key.Name) + |
|
Jim Stichnoth
2014/11/19 18:18:39
Not sure this is the ideal hash function. However
|
| + std::hash<Ice::RelocOffsetT>()(Key.Offset); |
| + } |
| +}; |
| + |
| namespace Ice { |
| // TypePool maps constants of type KeyType (e.g. float) to pointers to |
| -// type ValueType (e.g. ConstantFloat). KeyType values are compared |
| -// using memcmp() because of potential NaN values in KeyType values. |
| -// KeyTypeHasFP indicates whether KeyType is a floating-point type |
| -// whose values need to be compared using memcmp() for NaN |
| -// correctness. TODO: use std::is_floating_point<KeyType> instead of |
| -// KeyTypeHasFP with C++11. |
| -template <typename KeyType, typename ValueType, bool KeyTypeHasFP = false> |
| -class TypePool { |
| +// type ValueType (e.g. ConstantFloat). |
| +template <Type Ty, typename KeyType, typename ValueType> class TypePool { |
| TypePool(const TypePool &) = delete; |
| TypePool &operator=(const TypePool &) = delete; |
| public: |
| TypePool() : NextPoolID(0) {} |
| - ValueType *getOrAdd(GlobalContext *Ctx, Type Ty, KeyType Key) { |
| - TupleType TupleKey = std::make_pair(Ty, Key); |
| - auto Iter = Pool.find(TupleKey); |
| + ValueType *getOrAdd(GlobalContext *Ctx, KeyType Key) { |
| + auto Iter = Pool.find(Key); |
| if (Iter != Pool.end()) |
| return Iter->second; |
| ValueType *Result = ValueType::create(Ctx, Ty, Key, NextPoolID++); |
| - Pool[TupleKey] = Result; |
| + Pool[Key] = Result; |
| return Result; |
| } |
| ConstantList getConstantPool() const { |
| @@ -59,17 +60,7 @@ public: |
| } |
| private: |
| - typedef std::pair<Type, KeyType> TupleType; |
| - struct TupleCompare { |
| - bool operator()(const TupleType &A, const TupleType &B) const { |
| - if (A.first != B.first) |
| - return A.first < B.first; |
| - if (KeyTypeHasFP) |
| - return memcmp(&A.second, &B.second, sizeof(KeyType)) < 0; |
| - return A.second < B.second; |
| - } |
| - }; |
| - typedef std::map<const TupleType, ValueType *, TupleCompare> ContainerType; |
| + typedef std::unordered_map<KeyType, ValueType *> ContainerType; |
| ContainerType Pool; |
| uint32_t NextPoolID; |
| }; |
| @@ -80,21 +71,17 @@ class UndefPool { |
| UndefPool &operator=(const UndefPool &) = delete; |
| public: |
| - UndefPool() : NextPoolID(0) {} |
| + UndefPool() : NextPoolID(0), Pool(IceType_NUM) {} |
| ConstantUndef *getOrAdd(GlobalContext *Ctx, Type Ty) { |
| - auto I = Pool.find(Ty); |
| - if (I != Pool.end()) |
| - return I->second; |
| - ConstantUndef *Undef = ConstantUndef::create(Ctx, Ty, NextPoolID++); |
| - Pool[Ty] = Undef; |
| - return Undef; |
| + if (Pool[Ty] == NULL) |
| + Pool[Ty] = ConstantUndef::create(Ctx, Ty, NextPoolID++); |
| + return Pool[Ty]; |
| } |
| private: |
| uint32_t NextPoolID; |
| - typedef std::map<Type, ConstantUndef *> ContainerType; |
| - ContainerType Pool; |
| + std::vector<ConstantUndef *> Pool; |
| }; |
| // The global constant pool bundles individual pools of each type of |
| @@ -105,11 +92,14 @@ class ConstantPool { |
| public: |
| ConstantPool() {} |
| - TypePool<float, ConstantFloat, true> Floats; |
| - TypePool<double, ConstantDouble, true> Doubles; |
| - TypePool<uint32_t, ConstantInteger32> Integers32; |
| - TypePool<uint64_t, ConstantInteger64> Integers64; |
| - TypePool<RelocatableTuple, ConstantRelocatable> Relocatables; |
| + TypePool<IceType_f32, float, ConstantFloat> Floats; |
| + TypePool<IceType_f64, double, ConstantDouble> Doubles; |
| + TypePool<IceType_i1, int8_t, ConstantInteger32> Integers1; |
| + TypePool<IceType_i8, int8_t, ConstantInteger32> Integers8; |
| + TypePool<IceType_i16, int16_t, ConstantInteger32> Integers16; |
| + TypePool<IceType_i32, int32_t, ConstantInteger32> Integers32; |
| + TypePool<IceType_i64, int64_t, ConstantInteger64> Integers64; |
| + TypePool<IceType_i32, RelocatableTuple, ConstantRelocatable> Relocatables; |
| UndefPool Undefs; |
| }; |
| @@ -294,30 +284,40 @@ GlobalContext::~GlobalContext() { |
| llvm::DeleteContainerPointers(GlobalDeclarations); |
| } |
| -Constant *GlobalContext::getConstantInt64(Type Ty, uint64_t ConstantInt64) { |
| - assert(Ty == IceType_i64); |
| - return ConstPool->Integers64.getOrAdd(this, Ty, ConstantInt64); |
| +Constant *GlobalContext::getConstantInt1(int8_t ConstantInt1) { |
| + ConstantInt1 &= INT8_C(1); |
| + return ConstPool->Integers1.getOrAdd(this, ConstantInt1); |
| +} |
| + |
| +Constant *GlobalContext::getConstantInt8(int8_t ConstantInt8) { |
| + return ConstPool->Integers8.getOrAdd(this, ConstantInt8); |
| +} |
| + |
| +Constant *GlobalContext::getConstantInt16(int16_t ConstantInt16) { |
| + return ConstPool->Integers16.getOrAdd(this, ConstantInt16); |
| +} |
| + |
| +Constant *GlobalContext::getConstantInt32(int32_t ConstantInt32) { |
| + return ConstPool->Integers32.getOrAdd(this, ConstantInt32); |
| } |
| -Constant *GlobalContext::getConstantInt32(Type Ty, uint32_t ConstantInt32) { |
| - if (Ty == IceType_i1) |
| - ConstantInt32 &= UINT32_C(1); |
| - return ConstPool->Integers32.getOrAdd(this, Ty, ConstantInt32); |
| +Constant *GlobalContext::getConstantInt64(int64_t ConstantInt64) { |
| + return ConstPool->Integers64.getOrAdd(this, ConstantInt64); |
| } |
| Constant *GlobalContext::getConstantFloat(float ConstantFloat) { |
| - return ConstPool->Floats.getOrAdd(this, IceType_f32, ConstantFloat); |
| + return ConstPool->Floats.getOrAdd(this, ConstantFloat); |
| } |
| Constant *GlobalContext::getConstantDouble(double ConstantDouble) { |
| - return ConstPool->Doubles.getOrAdd(this, IceType_f64, ConstantDouble); |
| + return ConstPool->Doubles.getOrAdd(this, ConstantDouble); |
| } |
| -Constant *GlobalContext::getConstantSym(Type Ty, RelocOffsetT Offset, |
| +Constant *GlobalContext::getConstantSym(RelocOffsetT Offset, |
| const IceString &Name, |
| bool SuppressMangling) { |
| return ConstPool->Relocatables.getOrAdd( |
| - this, Ty, RelocatableTuple(Offset, Name, SuppressMangling)); |
| + this, RelocatableTuple(Offset, Name, SuppressMangling)); |
| } |
| Constant *GlobalContext::getConstantUndef(Type Ty) { |
| @@ -327,12 +327,15 @@ Constant *GlobalContext::getConstantUndef(Type Ty) { |
| Constant *GlobalContext::getConstantZero(Type Ty) { |
| switch (Ty) { |
| case IceType_i1: |
| + return getConstantInt1(0); |
| case IceType_i8: |
| + return getConstantInt8(0); |
| case IceType_i16: |
| + return getConstantInt16(0); |
| case IceType_i32: |
| - return getConstantInt32(Ty, 0); |
| + return getConstantInt32(0); |
| case IceType_i64: |
| - return getConstantInt64(Ty, 0); |
| + return getConstantInt64(0); |
| case IceType_f32: |
| return getConstantFloat(0); |
| case IceType_f64: |