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