[PATCH] D33667: [MC] Fix constant pools with DenseMap sentinel values

Oliver Stannard via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue May 30 02:03:57 PDT 2017


olista01 created this revision.
Herald added a subscriber: javed.absar.

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 or0x7ffffffffffffffe 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.


Repository:
  rL LLVM

https://reviews.llvm.org/D33667

Files:
  include/llvm/MC/ConstantPools.h
  test/MC/AArch64/ldr-pseudo.s


Index: test/MC/AArch64/ldr-pseudo.s
===================================================================
--- test/MC/AArch64/ldr-pseudo.s
+++ test/MC/AArch64/ldr-pseudo.s
@@ -205,6 +205,13 @@
   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 @@
 // CHECK: .p2align 2
 // CHECK: .Ltmp[[TMP25]]
 // CHECK: .word 3276900
+
+// CHECK: .Ltmp[[TMP27]]
+// CHECK: .xword 9223372036854775806
+// CHECK: .Ltmp[[TMP28]]
+// CHECK: .xword 9223372036854775807
Index: include/llvm/MC/ConstantPools.h
===================================================================
--- include/llvm/MC/ConstantPools.h
+++ include/llvm/MC/ConstantPools.h
@@ -19,6 +19,7 @@
 #include "llvm/ADT/SmallVector.h"
 #include "llvm/Support/SMLoc.h"
 #include <cstdint>
+#include <map>
 
 namespace llvm {
 
@@ -44,7 +45,7 @@
 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


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D33667.100671.patch
Type: text/x-patch
Size: 1378 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170530/5d413930/attachment.bin>


More information about the llvm-commits mailing list