aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWeverything <rtrieu@google.com>2022-10-04 14:34:10 -0700
committerWeverything <rtrieu@google.com>2022-11-01 16:23:32 -0700
commitcbdb81e60b45e90996541f2661bad99606bfda06 (patch)
treea47959ae3d2dc270dc665aaabe74c91957febbd8
parentf357a412654cf5ae750a14b6f56900aaa029cec2 (diff)
downloadllvm-cbdb81e60b45e90996541f2661bad99606bfda06.zip
llvm-cbdb81e60b45e90996541f2661bad99606bfda06.tar.gz
llvm-cbdb81e60b45e90996541f2661bad99606bfda06.tar.bz2
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
-rw-r--r--llvm/include/llvm/ADT/APInt.h4
-rw-r--r--llvm/unittests/ADT/APIntTest.cpp8
2 files changed, 10 insertions, 2 deletions
diff --git a/llvm/include/llvm/ADT/APInt.h b/llvm/include/llvm/ADT/APInt.h
index d3e645d..2e2f9ef 100644
--- a/llvm/include/llvm/ADT/APInt.h
+++ b/llvm/include/llvm/ADT/APInt.h
@@ -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;
}
diff --git a/llvm/unittests/ADT/APIntTest.cpp b/llvm/unittests/ADT/APIntTest.cpp
index 0af294c..3dba0fa 100644
--- a/llvm/unittests/ADT/APIntTest.cpp
+++ b/llvm/unittests/ADT/APIntTest.cpp
@@ -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