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

Matt Morehouse via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri Oct 29 09:57:20 PDT 2021


morehouse created this revision.
morehouse added reviewers: eugenis, pcc, vitalybuka.
Herald added subscribers: pengfei, hiraditya.
morehouse requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.

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


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D112832

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


Index: llvm/test/CodeGen/X86/tagged-globals-static.ll
===================================================================
--- llvm/test/CodeGen/X86/tagged-globals-static.ll
+++ llvm/test/CodeGen/X86/tagged-globals-static.ll
@@ -42,4 +42,27 @@
   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" }
Index: llvm/test/CodeGen/X86/tagged-globals-pic.ll
===================================================================
--- llvm/test/CodeGen/X86/tagged-globals-pic.ll
+++ llvm/test/CodeGen/X86/tagged-globals-pic.ll
@@ -42,4 +42,27 @@
   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" }
Index: llvm/lib/Target/X86/X86Subtarget.cpp
===================================================================
--- llvm/lib/Target/X86/X86Subtarget.cpp
+++ llvm/lib/Target/X86/X86Subtarget.cpp
@@ -70,8 +70,8 @@
   // 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.


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D112832.383407.patch
Type: text/x-patch
Size: 2075 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20211029/66f0e9d9/attachment.bin>


More information about the llvm-commits mailing list