[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