These two values correspond to the 'Empty' and 'Tombstone' special
keys defined by DenseMapInfo<int64_t>, which means that neither one
can be used as a key in DenseMap<int64_t, anything>. Hence, if you try
to use either of those values as an int literal, IntInit::get() fails
an assertion when it tries to insert them into its static cache of
int-literal objects.
Fixed by replacing the DenseMap with a std::map, which doesn't intrude
on the space of legal values of the key type.
Reviewers: nhaehnle, hfinkel, javedabsar, efriedma
Reviewed By: efriedma
Subscribers: fhahn, efriedma, hiraditya, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D59016
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@355900
91177308-0d34-0410-b5e6-
96231b3b80d8
#include <cassert>
#include <cstdint>
#include <memory>
+#include <map>
#include <string>
#include <utility>
#include <vector>
}
IntInit *IntInit::get(int64_t V) {
- static DenseMap<int64_t, IntInit*> ThePool;
+ static std::map<int64_t, IntInit*> ThePool;
IntInit *&I = ThePool[V];
if (!I) I = new(Allocator) IntInit(V);
--- /dev/null
+// RUN: llvm-tblgen %s | FileCheck %s
+
+def TestRecord {
+ // CHECK: int X = 9223372036854775807;
+ int X = 0x7FFFFFFFFFFFFFFF;
+ // CHECK: int Y = 9223372036854775806;
+ int Y = 0x7FFFFFFFFFFFFFFE;
+}