xref: /minix3/external/bsd/llvm/dist/llvm/test/CodeGen/X86/tls-pic.ll (revision f4a2713ac843a11c696ec80c0a5e3e5d80b4d338)
1*f4a2713aSLionel Sambuc; RUN: llc < %s -march=x86 -mtriple=i386-linux-gnu -relocation-model=pic | FileCheck -check-prefix=X32 %s
2*f4a2713aSLionel Sambuc; RUN: llc < %s -march=x86-64 -mtriple=x86_64-linux-gnu -relocation-model=pic | FileCheck -check-prefix=X64 %s
3*f4a2713aSLionel Sambuc
4*f4a2713aSLionel Sambuc@i = thread_local global i32 15
5*f4a2713aSLionel Sambuc@j = internal thread_local global i32 42
6*f4a2713aSLionel Sambuc@k = internal thread_local global i32 42
7*f4a2713aSLionel Sambuc
8*f4a2713aSLionel Sambucdefine i32 @f1() {
9*f4a2713aSLionel Sambucentry:
10*f4a2713aSLionel Sambuc	%tmp1 = load i32* @i
11*f4a2713aSLionel Sambuc	ret i32 %tmp1
12*f4a2713aSLionel Sambuc}
13*f4a2713aSLionel Sambuc
14*f4a2713aSLionel Sambuc; X32-LABEL: f1:
15*f4a2713aSLionel Sambuc; X32:   leal i@TLSGD(,%ebx), %eax
16*f4a2713aSLionel Sambuc; X32:   calll ___tls_get_addr@PLT
17*f4a2713aSLionel Sambuc
18*f4a2713aSLionel Sambuc; X64-LABEL: f1:
19*f4a2713aSLionel Sambuc; X64:   leaq i@TLSGD(%rip), %rdi
20*f4a2713aSLionel Sambuc; X64:   callq __tls_get_addr@PLT
21*f4a2713aSLionel Sambuc
22*f4a2713aSLionel Sambuc
23*f4a2713aSLionel Sambuc@i2 = external thread_local global i32
24*f4a2713aSLionel Sambuc
25*f4a2713aSLionel Sambucdefine i32* @f2() {
26*f4a2713aSLionel Sambucentry:
27*f4a2713aSLionel Sambuc	ret i32* @i
28*f4a2713aSLionel Sambuc}
29*f4a2713aSLionel Sambuc
30*f4a2713aSLionel Sambuc; X32-LABEL: f2:
31*f4a2713aSLionel Sambuc; X32:   leal i@TLSGD(,%ebx), %eax
32*f4a2713aSLionel Sambuc; X32:   calll ___tls_get_addr@PLT
33*f4a2713aSLionel Sambuc
34*f4a2713aSLionel Sambuc; X64-LABEL: f2:
35*f4a2713aSLionel Sambuc; X64:   leaq i@TLSGD(%rip), %rdi
36*f4a2713aSLionel Sambuc; X64:   callq __tls_get_addr@PLT
37*f4a2713aSLionel Sambuc
38*f4a2713aSLionel Sambuc
39*f4a2713aSLionel Sambuc
40*f4a2713aSLionel Sambucdefine i32 @f3() {
41*f4a2713aSLionel Sambucentry:
42*f4a2713aSLionel Sambuc	%tmp1 = load i32* @i		; <i32> [#uses=1]
43*f4a2713aSLionel Sambuc	ret i32 %tmp1
44*f4a2713aSLionel Sambuc}
45*f4a2713aSLionel Sambuc
46*f4a2713aSLionel Sambuc; X32-LABEL: f3:
47*f4a2713aSLionel Sambuc; X32:   leal	i@TLSGD(,%ebx), %eax
48*f4a2713aSLionel Sambuc; X32:   calll ___tls_get_addr@PLT
49*f4a2713aSLionel Sambuc
50*f4a2713aSLionel Sambuc; X64-LABEL: f3:
51*f4a2713aSLionel Sambuc; X64:   leaq i@TLSGD(%rip), %rdi
52*f4a2713aSLionel Sambuc; X64:   callq __tls_get_addr@PLT
53*f4a2713aSLionel Sambuc
54*f4a2713aSLionel Sambuc
55*f4a2713aSLionel Sambucdefine i32* @f4() nounwind {
56*f4a2713aSLionel Sambucentry:
57*f4a2713aSLionel Sambuc	ret i32* @i
58*f4a2713aSLionel Sambuc}
59*f4a2713aSLionel Sambuc
60*f4a2713aSLionel Sambuc; X32-LABEL: f4:
61*f4a2713aSLionel Sambuc; X32:   leal	i@TLSGD(,%ebx), %eax
62*f4a2713aSLionel Sambuc; X32:   calll ___tls_get_addr@PLT
63*f4a2713aSLionel Sambuc
64*f4a2713aSLionel Sambuc; X64-LABEL: f4:
65*f4a2713aSLionel Sambuc; X64:   leaq i@TLSGD(%rip), %rdi
66*f4a2713aSLionel Sambuc; X64:   callq __tls_get_addr@PLT
67*f4a2713aSLionel Sambuc
68*f4a2713aSLionel Sambuc
69*f4a2713aSLionel Sambucdefine i32 @f5() nounwind {
70*f4a2713aSLionel Sambucentry:
71*f4a2713aSLionel Sambuc	%0 = load i32* @j, align 4
72*f4a2713aSLionel Sambuc	%1 = load i32* @k, align 4
73*f4a2713aSLionel Sambuc	%add = add nsw i32 %0, %1
74*f4a2713aSLionel Sambuc	ret i32 %add
75*f4a2713aSLionel Sambuc}
76*f4a2713aSLionel Sambuc
77*f4a2713aSLionel Sambuc; X32-LABEL:    f5:
78*f4a2713aSLionel Sambuc; X32:      leal {{[jk]}}@TLSLDM(%ebx)
79*f4a2713aSLionel Sambuc; X32: calll ___tls_get_addr@PLT
80*f4a2713aSLionel Sambuc; X32: movl {{[jk]}}@DTPOFF(%e
81*f4a2713aSLionel Sambuc; X32: addl {{[jk]}}@DTPOFF(%e
82*f4a2713aSLionel Sambuc
83*f4a2713aSLionel Sambuc; X64-LABEL:    f5:
84*f4a2713aSLionel Sambuc; X64:      leaq {{[jk]}}@TLSLD(%rip), %rdi
85*f4a2713aSLionel Sambuc; X64: callq	__tls_get_addr@PLT
86*f4a2713aSLionel Sambuc; X64: movl {{[jk]}}@DTPOFF(%r
87*f4a2713aSLionel Sambuc; X64: addl {{[jk]}}@DTPOFF(%r
88