• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1; RUN: llc < %s -march=x86 -mtriple=i386-linux-gnu -relocation-model=pic | FileCheck -check-prefix=X32 %s
2; RUN: llc < %s -march=x86-64 -mtriple=x86_64-linux-gnu -relocation-model=pic | FileCheck -check-prefix=X64 %s
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; X32-LABEL: f1:
15; X32:   leal i@TLSGD(,%ebx), %eax
16; X32:   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; X32-LABEL: f2:
31; X32:   leal i@TLSGD(,%ebx), %eax
32; X32:   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; X32-LABEL: f3:
47; X32:   leal	i@TLSGD(,%ebx), %eax
48; X32:   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; X32-LABEL: f4:
61; X32:   leal	i@TLSGD(,%ebx), %eax
62; X32:   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; X32-LABEL:    f5:
78; X32:      leal {{[jk]}}@TLSLDM(%ebx)
79; X32: calll ___tls_get_addr@PLT
80; X32: movl {{[jk]}}@DTPOFF(%e
81; X32: 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