[AArch64,ELF] Restrict MOVZ/MOVK to non-PIC large code model (#70178)
[llvm-project.git] / llvm / test / CodeGen / X86 / tls-local-dynamic.ll
blob95dd434e70b5885e6b70452d3011d7f8636deae7
1 ; RUN: llc < %s -mtriple=x86_64-linux-gnu -relocation-model=pic | FileCheck  %s
3 @x = internal thread_local global i32 0, align 4
4 @y = internal thread_local global i32 0, align 4
6 ; get_x and get_y are here to prevent x and y to be optimized away as 0
8 define ptr @get_x() {
9 entry:
10   ret ptr @x
11 ; FIXME: This function uses a single thread-local variable,
12 ; so we might want to fall back to general-dynamic here.
13 ; CHECK-LABEL:       get_x:
14 ; CHECK:       leaq x@TLSLD(%rip), %rdi
15 ; CHECK-NEXT:  callq __tls_get_addr@PLT
16 ; CHECK:       x@DTPOFF
19 define ptr @get_y() {
20 entry:
21   ret ptr @y
24 define i32 @f(i32 %i) {
25 entry:
26   %cmp = icmp eq i32 %i, 1
27   br i1 %cmp, label %return, label %if.else
28 ; This bb does not access TLS, so should not call __tls_get_addr.
29 ; CHECK-LABEL:       f:
30 ; CHECK-NOT:   __tls_get_addr
31 ; CHECK:       je
34 if.else:
35   %0 = load i32, ptr @x, align 4
36   %cmp1 = icmp eq i32 %i, 2
37   br i1 %cmp1, label %if.then2, label %return
38 ; Now we call __tls_get_addr.
39 ; CHECK:       # %if.else
40 ; CHECK:       leaq x@TLSLD(%rip), %rdi
41 ; CHECK-NEXT:  callq __tls_get_addr@PLT
42 ; CHECK:       x@DTPOFF
45 if.then2:
46   %1 = load i32, ptr @y, align 4
47   %add = add nsw i32 %1, %0
48   br label %return
49 ; This accesses TLS, but is dominated by the previous block,
50 ; so should not have to call __tls_get_addr again.
51 ; CHECK:       # %if.then2
52 ; CHECK-NOT:   __tls_get_addr
53 ; CHECK:       y@DTPOFF
56 return:
57   %retval.0 = phi i32 [ %add, %if.then2 ], [ 5, %entry ], [ %0, %if.else ]
58   ret i32 %retval.0