xref: /llvm-project/llvm/test/CodeGen/X86/tls-function-argument.ll (revision afa23ea03741193e36b05ddd508d38a90a18a8b8)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2; RUN: llc -mtriple=x86_64 -verify-machineinstrs -relocation-model=pic < %s | FileCheck %s
3
4; Passing a pointer to thread-local storage to a function can be problematic
5; since computing such addresses requires a function call that is introduced
6; very late in instruction selection. We need to ensure that we don't introduce
7; nested call sequence markers if this function call happens in a call sequence.
8
9@TLS = internal thread_local global i64 zeroinitializer, align 8
10declare void @bar(ptr)
11define internal void @foo() {
12; CHECK-LABEL: foo:
13; CHECK:       # %bb.0:
14; CHECK-NEXT:    pushq %rbx
15; CHECK-NEXT:    .cfi_def_cfa_offset 16
16; CHECK-NEXT:    .cfi_offset %rbx, -16
17; CHECK-NEXT:    leaq TLS@TLSLD(%rip), %rdi
18; CHECK-NEXT:    callq __tls_get_addr@PLT
19; CHECK-NEXT:    leaq TLS@DTPOFF(%rax), %rbx
20; CHECK-NEXT:    movq %rbx, %rdi
21; CHECK-NEXT:    callq bar@PLT
22; CHECK-NEXT:    movq %rbx, %rdi
23; CHECK-NEXT:    callq bar@PLT
24; CHECK-NEXT:    popq %rbx
25; CHECK-NEXT:    .cfi_def_cfa_offset 8
26; CHECK-NEXT:    retq
27  call void @bar(ptr @TLS)
28  call void @bar(ptr @TLS)
29  ret void
30}
31