forked from OSchip/llvm-project
Fix DenseMap with APInt keys
The empty key value for APInt was colliding with a valid zero-width APInt. Change the internal value of empty key and tombstone values for APInt to avoid this collision. Fixes: https://github.com/llvm/llvm-project/issues/58013 Differential Revision: https://reviews.llvm.org/D135741
This commit is contained in:
parent
f357a41265
commit
cbdb81e60b
|
@ -2287,13 +2287,13 @@ void LoadIntFromMemory(APInt &IntVal, const uint8_t *Src, unsigned LoadBytes);
|
|||
template <> struct DenseMapInfo<APInt, void> {
|
||||
static inline APInt getEmptyKey() {
|
||||
APInt V(nullptr, 0);
|
||||
V.U.VAL = 0;
|
||||
V.U.VAL = ~0ULL;
|
||||
return V;
|
||||
}
|
||||
|
||||
static inline APInt getTombstoneKey() {
|
||||
APInt V(nullptr, 0);
|
||||
V.U.VAL = 1;
|
||||
V.U.VAL = ~1ULL;
|
||||
return V;
|
||||
}
|
||||
|
||||
|
|
|
@ -8,6 +8,7 @@
|
|||
|
||||
#include "llvm/ADT/APInt.h"
|
||||
#include "llvm/ADT/ArrayRef.h"
|
||||
#include "llvm/ADT/DenseMap.h"
|
||||
#include "llvm/ADT/SmallString.h"
|
||||
#include "llvm/ADT/Twine.h"
|
||||
#include "gtest/gtest.h"
|
||||
|
@ -3126,4 +3127,11 @@ TEST(APIntTest, ScaleBitMask) {
|
|||
EXPECT_EQ(APIntOps::ScaleBitMask(APInt(8, 0xE4), 4, true), APInt(4, 0x08));
|
||||
}
|
||||
|
||||
TEST(APIntTest, DenseMap) {
|
||||
DenseMap<APInt, int> Map;
|
||||
APInt ZeroWidthInt(0, 0, false);
|
||||
Map.insert({ZeroWidthInt, 0});
|
||||
Map.find(ZeroWidthInt);
|
||||
}
|
||||
|
||||
} // end anonymous namespace
|
||||
|
|
Loading…
Reference in New Issue