[llvm] 33cc0cf - [X86] Don't affect jump tables under +tagged-globals.

Matt Morehouse via llvm-commits llvm-commits at lists.llvm.org
Fri Oct 29 10:38:05 PDT 2021


Author: Matt Morehouse
Date: 2021-10-29T10:37:43-07:00
New Revision: 33cc0cfd46779d7dcdea20b552f57be429f0547b

URL: https://github.com/llvm/llvm-project/commit/33cc0cfd46779d7dcdea20b552f57be429f0547b
DIFF: https://github.com/llvm/llvm-project/commit/33cc0cfd46779d7dcdea20b552f57be429f0547b.diff

LOG: [X86] Don't affect jump tables under +tagged-globals.

`classifyLocalReference(nullptr)` is called to get the appropriate
relocation type for jump tables.  We should not use @GOTPCREL for this
case.

The new test cases trigger assertions without this patch.

Reviewed By: eugenis

Differential Revision: https://reviews.llvm.org/D112832

Added: 
    

Modified: 
    llvm/lib/Target/X86/X86Subtarget.cpp
    llvm/test/CodeGen/X86/tagged-globals-pic.ll
    llvm/test/CodeGen/X86/tagged-globals-static.ll

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Target/X86/X86Subtarget.cpp b/llvm/lib/Target/X86/X86Subtarget.cpp
index 45732fafdcc2..503bf5a4634a 100644
--- a/llvm/lib/Target/X86/X86Subtarget.cpp
+++ b/llvm/lib/Target/X86/X86Subtarget.cpp
@@ -70,8 +70,8 @@ X86Subtarget::classifyLocalReference(const GlobalValue *GV) const {
   // Tagged globals have non-zero upper bits, which makes direct references
   // require a 64-bit immediate.  On the small code model this causes relocation
   // errors, so we go through the GOT instead.
-  if (AllowTaggedGlobals && TM.getCodeModel() == CodeModel::Small &&
-      !isa_and_nonnull<Function>(GV))
+  if (AllowTaggedGlobals && TM.getCodeModel() == CodeModel::Small && GV &&
+      !isa<Function>(GV))
     return X86II::MO_GOTPCREL;
 
   // If we're not PIC, it's not very interesting.

diff  --git a/llvm/test/CodeGen/X86/tagged-globals-pic.ll b/llvm/test/CodeGen/X86/tagged-globals-pic.ll
index 98bf75a5326a..016cf61e91b9 100644
--- a/llvm/test/CodeGen/X86/tagged-globals-pic.ll
+++ b/llvm/test/CodeGen/X86/tagged-globals-pic.ll
@@ -42,4 +42,27 @@ define void ()* @func_addr() #0 {
   ret void ()* @func
 }
 
+; Jump tables shouldn't go through the GOT.
+define i32 @jump_table(i32 %x) #0 {
+  ; CHECK-LABEL: jump_table:
+  ; CHECK-NOT: @GOT
+
+  switch i32 %x, label %default [
+    i32 0, label %1
+    i32 1, label %2
+    i32 2, label %3
+    i32 3, label %4
+  ]
+1:
+  ret i32 7
+2:
+  ret i32 42
+3:
+  ret i32 3
+4:
+  ret i32 8
+default:
+  ret i32 %x
+}
+
 attributes #0 = { "target-features"="+tagged-globals" }

diff  --git a/llvm/test/CodeGen/X86/tagged-globals-static.ll b/llvm/test/CodeGen/X86/tagged-globals-static.ll
index af2fae227ed4..5cfb2c71c464 100644
--- a/llvm/test/CodeGen/X86/tagged-globals-static.ll
+++ b/llvm/test/CodeGen/X86/tagged-globals-static.ll
@@ -42,4 +42,27 @@ define void ()* @func_addr() #0 {
   ret void ()* @func
 }
 
+; Jump tables shouldn't go through the GOT.
+define i32 @jump_table(i32 %x) #0 {
+  ; CHECK-LABEL: jump_table:
+  ; CHECK-NOT: @GOT
+
+  switch i32 %x, label %default [
+    i32 0, label %1
+    i32 1, label %2
+    i32 2, label %3
+    i32 3, label %4
+  ]
+1:
+  ret i32 7
+2:
+  ret i32 42
+3:
+  ret i32 3
+4:
+  ret i32 8
+default:
+  ret i32 %x
+}
+
 attributes #0 = { "target-features"="+tagged-globals" }


        


More information about the llvm-commits mailing list