Extend the IL for selecting TLS models (PR9788)
[oota-llvm.git] / test / CodeGen / X86 / tls-models.ll
1 ; RUN: llc < %s -march=x86-64 -mtriple=x86_64-linux-gnu | FileCheck -check-prefix=X64 %s
2 ; RUN: llc < %s -march=x86-64 -mtriple=x86_64-linux-gnu -relocation-model=pic | FileCheck -check-prefix=X64_PIC %s
3 ; RUN: llc < %s -march=x86 -mtriple=i386-linux-gnu | FileCheck -check-prefix=X32 %s
4 ; RUN: llc < %s -march=x86 -mtriple=i386-linux-gnu -relocation-model=pic | FileCheck -check-prefix=X32_PIC %s
5
6 ; Darwin always uses the same model.
7 ; RUN: llc < %s -march=x86-64 -mtriple=x86_64-apple-darwin | FileCheck -check-prefix=DARWIN %s
8
9 @external_gd = external thread_local global i32
10 @internal_gd = internal thread_local global i32 42
11
12 @external_ld = external thread_local(localdynamic) global i32
13 @internal_ld = internal thread_local(localdynamic) global i32 42
14
15 @external_ie = external thread_local(initialexec) global i32
16 @internal_ie = internal thread_local(initialexec) global i32 42
17
18 @external_le = external thread_local(localexec) global i32
19 @internal_le = internal thread_local(localexec) global i32 42
20
21 ; ----- no model specified -----
22
23 define i32* @f1() {
24 entry:
25   ret i32* @external_gd
26
27   ; Non-PIC code can use initial-exec, PIC code has to use general dynamic.
28   ; X64:     f1:
29   ; X64:     external_gd@GOTTPOFF
30   ; X32:     f1:
31   ; X32:     external_gd@INDNTPOFF
32   ; X64_PIC: f1:
33   ; X64_PIC: external_gd@TLSGD
34   ; X32_PIC: f1:
35   ; X32_PIC: external_gd@TLSGD
36   ; DARWIN:  f1:
37   ; DARWIN:  _external_gd@TLVP
38 }
39
40 define i32* @f2() {
41 entry:
42   ret i32* @internal_gd
43
44   ; Non-PIC code can use local exec, PIC code can use local dynamic.
45   ; X64:     f2:
46   ; X64:     internal_gd@TPOFF
47   ; X32:     f2:
48   ; X32:     internal_gd@NTPOFF
49   ; X64_PIC: f2:
50   ; X64_PIC: internal_gd@TLSLD
51   ; X32_PIC: f2:
52   ; X32_PIC: internal_gd@TLSLDM
53   ; DARWIN:  f2:
54   ; DARWIN:  _internal_gd@TLVP
55 }
56
57
58 ; ----- localdynamic specified -----
59
60 define i32* @f3() {
61 entry:
62   ret i32* @external_ld
63
64   ; Non-PIC code can use initial exec, PIC code use local dynamic as specified.
65   ; X64:     f3:
66   ; X64:     external_ld@GOTTPOFF
67   ; X32:     f3:
68   ; X32:     external_ld@INDNTPOFF
69   ; X64_PIC: f3:
70   ; X64_PIC: external_ld@TLSLD
71   ; X32_PIC: f3:
72   ; X32_PIC: external_ld@TLSLDM
73   ; DARWIN:  f3:
74   ; DARWIN:  _external_ld@TLVP
75 }
76
77 define i32* @f4() {
78 entry:
79   ret i32* @internal_ld
80
81   ; Non-PIC code can use local exec, PIC code can use local dynamic.
82   ; X64:     f4:
83   ; X64:     internal_ld@TPOFF
84   ; X32:     f4:
85   ; X32:     internal_ld@NTPOFF
86   ; X64_PIC: f4:
87   ; X64_PIC: internal_ld@TLSLD
88   ; X32_PIC: f4:
89   ; X32_PIC: internal_ld@TLSLDM
90   ; DARWIN:  f4:
91   ; DARWIN:  _internal_ld@TLVP
92 }
93
94
95 ; ----- initialexec specified -----
96
97 define i32* @f5() {
98 entry:
99   ret i32* @external_ie
100
101   ; Non-PIC and PIC code will use initial exec as specified.
102   ; X64:     f5:
103   ; X64:     external_ie@GOTTPOFF
104   ; X32:     f5:
105   ; X32:     external_ie@INDNTPOFF
106   ; X64_PIC: f5:
107   ; X64_PIC: external_ie@GOTTPOFF
108   ; X32_PIC: f5:
109   ; X32_PIC: external_ie@GOTNTPOFF
110   ; DARWIN:  f5:
111   ; DARWIN:  _external_ie@TLVP
112 }
113
114 define i32* @f6() {
115 entry:
116   ret i32* @internal_ie
117
118   ; Non-PIC code can use local exec, PIC code use initial exec as specified.
119   ; X64:     f6:
120   ; X64:     internal_ie@TPOFF
121   ; X32:     f6:
122   ; X32:     internal_ie@NTPOFF
123   ; X64_PIC: f6:
124   ; X64_PIC: internal_ie@GOTTPOFF
125   ; X32_PIC: f6:
126   ; X32_PIC: internal_ie@GOTNTPOFF
127   ; DARWIN:  f6:
128   ; DARWIN:  _internal_ie@TLVP
129 }
130
131
132 ; ----- localexec specified -----
133
134 define i32* @f7() {
135 entry:
136   ret i32* @external_le
137
138   ; Non-PIC and PIC code will use local exec as specified.
139   ; X64:     f7:
140   ; X64:     external_le@TPOFF
141   ; X32:     f7:
142   ; X32:     external_le@NTPOFF
143   ; X64_PIC: f7:
144   ; X64_PIC: external_le@TPOFF
145   ; X32_PIC: f7:
146   ; X32_PIC: external_le@NTPOFF
147   ; DARWIN:  f7:
148   ; DARWIN:  _external_le@TLVP
149 }
150
151 define i32* @f8() {
152 entry:
153   ret i32* @internal_le
154
155   ; Non-PIC and PIC code will use local exec as specified.
156   ; X64:     f8:
157   ; X64:     internal_le@TPOFF
158   ; X32:     f8:
159   ; X32:     internal_le@NTPOFF
160   ; X64_PIC: f8:
161   ; X64_PIC: internal_le@TPOFF
162   ; X32_PIC: f8:
163   ; X32_PIC: internal_le@NTPOFF
164   ; DARWIN:  f8:
165   ; DARWIN:  _internal_le@TLVP
166 }