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:
Weverything 2022-10-04 14:34:10 -07:00
parent f357a41265
commit cbdb81e60b
2 changed files with 10 additions and 2 deletions

View File

@ -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;
}

View File

@ -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