diff --git a/llvm/lib/Target/X86/X86Subtarget.cpp b/llvm/lib/Target/X86/X86Subtarget.cpp --- a/llvm/lib/Target/X86/X86Subtarget.cpp +++ b/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(GV)) + if (AllowTaggedGlobals && TM.getCodeModel() == CodeModel::Small && GV && + !isa(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 --- a/llvm/test/CodeGen/X86/tagged-globals-pic.ll +++ b/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" } diff --git a/llvm/test/CodeGen/X86/tagged-globals-static.ll b/llvm/test/CodeGen/X86/tagged-globals-static.ll --- a/llvm/test/CodeGen/X86/tagged-globals-static.ll +++ b/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" }