diff --git a/llvm/lib/Target/X86/X86InstrCompiler.td b/llvm/lib/Target/X86/X86InstrCompiler.td index c77c77ee4a3eeb..67fb593e391d34 100644 --- a/llvm/lib/Target/X86/X86InstrCompiler.td +++ b/llvm/lib/Target/X86/X86InstrCompiler.td @@ -1267,10 +1267,10 @@ def : Pat<(i64 (X86RecoverFrameAlloc mcsym:$dst)), (MOV64ri mcsym:$dst)>; // tls has some funny stuff here... // This corresponds to movabs $foo@tpoff, %rax def : Pat<(i64 (X86Wrapper tglobaltlsaddr :$dst)), - (MOV64ri32 tglobaltlsaddr :$dst)>; + (MOV64ri32 tglobaltlsaddr :$dst)>, Requires<[NearData]>; // This corresponds to add $foo@tpoff, %rax def : Pat<(add GR64:$src1, (X86Wrapper tglobaltlsaddr :$dst)), - (ADD64ri32 GR64:$src1, tglobaltlsaddr :$dst)>; + (ADD64ri32 GR64:$src1, tglobaltlsaddr :$dst)>, Requires<[NearData]>; // Direct PC relative function call for small code model. 32-bit displacement diff --git a/llvm/test/CodeGen/X86/tls-codemodels.ll b/llvm/test/CodeGen/X86/tls-codemodels.ll new file mode 100644 index 00000000000000..644e07300f3928 --- /dev/null +++ b/llvm/test/CodeGen/X86/tls-codemodels.ll @@ -0,0 +1,36 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 4 +; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -code-model=small | FileCheck %s --check-prefix=CHECK-SMALL +; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -code-model=kernel | FileCheck %s --check-prefix=CHECK-KERNEL +; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -code-model=medium | FileCheck %s --check-prefix=CHECK-MEDIUM +; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -code-model=large | FileCheck %s --check-prefix=CHECK-LARGE + +@x = dso_local thread_local global i32 0, align 4 + +define dso_local void @test() local_unnamed_addr { +; CHECK-SMALL-LABEL: test: +; CHECK-SMALL: # %bb.0: # %entry +; CHECK-SMALL-NEXT: movl $0, %fs:x@TPOFF +; CHECK-SMALL-NEXT: retq +; +; CHECK-KERNEL-LABEL: test: +; CHECK-KERNEL: # %bb.0: # %entry +; CHECK-KERNEL-NEXT: movl $0, %fs:x@TPOFF +; CHECK-KERNEL-NEXT: retq +; +; CHECK-MEDIUM-LABEL: test: +; CHECK-MEDIUM: # %bb.0: # %entry +; CHECK-MEDIUM-NEXT: movl $0, %fs:x@TPOFF +; CHECK-MEDIUM-NEXT: retq +; +; CHECK-LARGE-LABEL: test: +; CHECK-LARGE: # %bb.0: # %entry +; CHECK-LARGE-NEXT: movabsq $x@TPOFF, %rax +; CHECK-LARGE-NEXT: movl $0, %fs:(%rax) +; CHECK-LARGE-NEXT: retq +entry: + %0 = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @x) + store i32 0, ptr %0, align 4 + ret void +} + +declare nonnull ptr @llvm.threadlocal.address.p0(ptr nonnull)