mirror of
https://github.com/RPCSX/llvm.git
synced 2024-12-03 17:31:50 +00:00
[MC] Fix constant pools with DenseMap sentinel values
The MC ConstantPool class uses a DenseMap to track generated constants, with the int64_t value of the constant as the key. This fails when values of 0x7fffffffffffffff or 0x7ffffffffffffffe are inserted into the constant pool, as these are sentinel values for DenseMap. The fix is to use std::map instead, which doesn't use sentinel values. Differential revision: https://reviews.llvm.org/D33667 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@304199 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
db736ce4a1
commit
94eec101b3
@ -19,6 +19,7 @@
|
||||
#include "llvm/ADT/SmallVector.h"
|
||||
#include "llvm/Support/SMLoc.h"
|
||||
#include <cstdint>
|
||||
#include <map>
|
||||
|
||||
namespace llvm {
|
||||
|
||||
@ -44,7 +45,7 @@ struct ConstantPoolEntry {
|
||||
class ConstantPool {
|
||||
using EntryVecTy = SmallVector<ConstantPoolEntry, 4>;
|
||||
EntryVecTy Entries;
|
||||
DenseMap<int64_t, const MCSymbolRefExpr *> CachedEntries;
|
||||
std::map<int64_t, const MCSymbolRefExpr *> CachedEntries;
|
||||
|
||||
public:
|
||||
// Initialize a new empty constant pool
|
||||
|
@ -205,6 +205,13 @@ f18:
|
||||
ldr x1, =0x320064
|
||||
// CHECK: ldr x1, .Ltmp[[TMP26:[0-9]+]]
|
||||
|
||||
// We previously used a DenseMap with constant values as keys, check that
|
||||
// sentinel values can be used.
|
||||
ldr x0, =0x7ffffffffffffffe
|
||||
// CHECK: ldr x0, .Ltmp[[TMP27:[0-9]+]]
|
||||
ldr x1, =0x7fffffffffffffff
|
||||
// CHECK: ldr x1, .Ltmp[[TMP28:[0-9]+]]
|
||||
|
||||
//
|
||||
// Constant Pools
|
||||
//
|
||||
@ -311,3 +318,8 @@ f18:
|
||||
// CHECK: .p2align 2
|
||||
// CHECK: .Ltmp[[TMP25]]
|
||||
// CHECK: .word 3276900
|
||||
|
||||
// CHECK: .Ltmp[[TMP27]]
|
||||
// CHECK: .xword 9223372036854775806
|
||||
// CHECK: .Ltmp[[TMP28]]
|
||||
// CHECK: .xword 9223372036854775807
|
||||
|
Loading…
Reference in New Issue
Block a user