1 ; RUN: llc -verify-machineinstrs -mcpu=pwr7 -mattr=-altivec -mtriple powerpc64-ibm-aix-xcoff \
2 ; RUN: --code-model=small < %s | FileCheck %s --check-prefixes=SMALL64,SMALL
3 ; RUN: llc -verify-machineinstrs -mcpu=pwr7 -mattr=-altivec -mtriple powerpc64-ibm-aix-xcoff \
4 ; RUN: --code-model=large < %s | FileCheck %s --check-prefixes=LARGE64,LARGE
5 ; RUN: llc -verify-machineinstrs -mcpu=pwr7 -mattr=-altivec -mtriple powerpc-ibm-aix-xcoff \
6 ; RUN: --code-model=small < %s | FileCheck %s --check-prefixes=SMALL32,SMALL
7 ; RUN: llc -verify-machineinstrs -mcpu=pwr7 -mattr=-altivec -mtriple powerpc-ibm-aix-xcoff \
8 ; RUN: --code-model=large < %s | FileCheck %s --check-prefixes=LARGE32,LARGE
9 ; RUN: llc -verify-machineinstrs -mcpu=pwr7 -mattr=-altivec -mtriple powerpc64-ibm-aix-xcoff \
10 ; RUN: --code-model=small -O0 < %s | FileCheck %s --check-prefixes=WITHDUP
11 ; RUN: llc -verify-machineinstrs -mcpu=pwr7 -mattr=-altivec -mtriple powerpc64-ibm-aix-xcoff \
12 ; RUN: --code-model=small -O1 < %s | FileCheck %s --check-prefixes=NODUP
14 @TGInit = thread_local(localdynamic) global i32 42, align 4
15 @TGUninit = thread_local(localdynamic) global i32 0, align 4
16 @TIInit = internal thread_local(localdynamic) global i32 42, align 4
17 @TIUninit = internal thread_local(localdynamic) global i32 0, align 4
18 @TWInit = weak thread_local(localdynamic) global i32 42, align 4
19 @TWUninit = weak thread_local(localdynamic) global i32 0, align 4
20 @x = thread_local(localdynamic) global i32 42, align 4
21 @y = thread_local(localdynamic) global i32 42, align 4
23 define i32 @loadTGInit() {
24 ; SMALL-LABEL: loadTGInit:
25 ; SMALL64: ld [[ModuleHandleR:3]], [[ModuleHandleL:L..C[0-9]+]](2)
26 ; SMALL32: lwz [[ModuleHandleR:3]], [[ModuleHandleL:L..C[0-9]+]](2)
27 ; SMALL: bla .__tls_get_mod[PR]
28 ; SMALL64: ld [[OffsetR:[0-9]+]], [[TGInitL:L..C[0-9]+]](2)
29 ; SMALL32: lwz [[OffsetR:[0-9]+]], [[TGInitL:L..C[0-9]+]](2)
30 ; SMALL: lwzx [[TGInitValR:[0-9]+]], [[ModuleHandleR]], [[OffsetR]]
32 ; LARGE-LABEL: loadTGInit:
33 ; LARGE64: addis [[ModuleHandleHR:[0-9]+]], [[ModuleHandleL:L..C[0-9]+]]@u(2)
34 ; LARGE: addis [[OffsetHR:[0-9]+]], [[TGInitL:L..C[0-9]+]]@u(2)
35 ; LARGE32: addis [[ModuleHandleHR:[0-9]+]], [[ModuleHandleL:L..C[0-9]+]]@u(2)
36 ; LARGE64: ld [[ModuleHandleR:3]], [[ModuleHandleL]]@l([[ModuleHandleHR]])
37 ; LARGE32: lwz [[ModuleHandleR:3]], [[ModuleHandleL]]@l([[ModuleHandleHR]])
38 ; LARGE: bla .__tls_get_mod[PR]
39 ; LARGE64: ld [[OffsetR:[0-9]+]], [[TGInitL:L..C[0-9]+]]@l([[OffsetHR]])
40 ; LARGE32: lwz [[OffsetR:[0-9]+]], [[TGInitL:L..C[0-9]+]]@l([[OffsetHR]])
41 ; LARGE: lwzx [[TGInitValR:[0-9]+]], [[ModuleHandleR]], [[OffsetR]]
43 %0 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @TGInit)
44 %1 = load i32, ptr %0, align 4
48 define void @storeTGInit(i32 noundef signext %i) {
49 ; SMALL-LABEL: storeTGInit:
50 ; SMALL64: ld [[ModuleHandleR:3]], [[ModuleHandleL:L..C[0-9]+]](2)
51 ; SMALL32: lwz [[ModuleHandleR:3]], [[ModuleHandleL:L..C[0-9]+]](2)
52 ; SMALL: bla .__tls_get_mod[PR]
53 ; SMALL64: ld [[OffsetR:[0-9]+]], [[TGInitL:L..C[0-9]+]](2)
54 ; SMALL32: lwz [[OffsetR:[0-9]+]], [[TGInitL:L..C[0-9]+]](2)
55 ; SMALL: stwx [[TGInitValR:[0-9]+]], [[ModuleHandleR]], [[OffsetR]]
57 ; LARGE-LABEL: storeTGInit:
58 ; LARGE64: addis [[ModuleHandleHR:[0-9]+]], [[ModuleHandleL:L..C[0-9]+]]@u(2)
59 ; LARGE: addis [[OffsetHR:[0-9]+]], [[TGInitL:L..C[0-9]+]]@u(2)
60 ; LARGE32: addis [[ModuleHandleHR:[0-9]+]], [[ModuleHandleL:L..C[0-9]+]]@u(2)
61 ; LARGE64: ld [[ModuleHandleR:3]], [[ModuleHandleL]]@l([[ModuleHandleHR]])
62 ; LARGE32: lwz [[ModuleHandleR:3]], [[ModuleHandleL]]@l([[ModuleHandleHR]])
63 ; LARGE: bla .__tls_get_mod[PR]
64 ; LARGE64: ld [[OffsetR:[0-9]+]], [[TGInitL:L..C[0-9]+]]@l([[OffsetHR]])
65 ; LARGE32: lwz [[OffsetR:[0-9]+]], [[TGInitL:L..C[0-9]+]]@l([[OffsetHR]])
66 ; LARGE: stwx [[TGInitValR:[0-9]+]], [[ModuleHandleR]], [[OffsetR]]
68 %0 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @TGInit)
69 store i32 %i, ptr %0, align 4
73 define i32 @loadTGUninit() {
74 ; SMALL-LABEL: loadTGUninit:
75 ; SMALL64: ld [[ModuleHandleR:3]], [[ModuleHandleL:L..C[0-9]+]](2)
76 ; SMALL32: lwz [[ModuleHandleR:3]], [[ModuleHandleL:L..C[0-9]+]](2)
77 ; SMALL: bla .__tls_get_mod[PR]
78 ; SMALL64: ld [[OffsetR:[0-9]+]], [[TGUninitL:L..C[0-9]+]](2)
79 ; SMALL32: lwz [[OffsetR:[0-9]+]], [[TGUninitL:L..C[0-9]+]](2)
80 ; SMALL: lwzx [[TGInitValR:[0-9]+]], [[ModuleHandleR]], [[OffsetR]]
82 ; LARGE-LABEL: loadTGUninit:
83 ; LARGE64: addis [[ModuleHandleHR:[0-9]+]], [[ModuleHandleL:L..C[0-9]+]]@u(2)
84 ; LARGE: addis [[OffsetHR:[0-9]+]], [[TGUninitL:L..C[0-9]+]]@u(2)
85 ; LARGE32: addis [[ModuleHandleHR:[0-9]+]], [[ModuleHandleL:L..C[0-9]+]]@u(2)
86 ; LARGE64: ld [[ModuleHandleR:3]], [[ModuleHandleL]]@l([[ModuleHandleHR]])
87 ; LARGE32: lwz [[ModuleHandleR:3]], [[ModuleHandleL]]@l([[ModuleHandleHR]])
88 ; LARGE: bla .__tls_get_mod[PR]
89 ; LARGE64: ld [[OffsetR:[0-9]+]], [[TGUninitL:L..C[0-9]+]]@l([[OffsetHR]])
90 ; LARGE32: lwz [[OffsetR:[0-9]+]], [[TGUninitL:L..C[0-9]+]]@l([[OffsetHR]])
91 ; LARGE: lwzx [[TGUninitValR:[0-9]+]], [[ModuleHandleR]], [[OffsetR]]
93 %0 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @TGUninit)
94 %1 = load i32, ptr %0, align 4
98 define void @storeTGUninit(i32 noundef signext %i) {
99 ; SMALL-LABEL: storeTGUninit:
100 ; SMALL64: ld [[ModuleHandleR:3]], [[ModuleHandleL:L..C[0-9]+]](2)
101 ; SMALL32: lwz [[ModuleHandleR:3]], [[ModuleHandleL:L..C[0-9]+]](2)
102 ; SMALL: bla .__tls_get_mod[PR]
103 ; SMALL64: ld [[OffsetR:[0-9]+]], [[TGUninitL:L..C[0-9]+]](2)
104 ; SMALL32: lwz [[OffsetR:[0-9]+]], [[TGUninitL:L..C[0-9]+]](2)
105 ; SMALL: stwx [[TGUninitValR:[0-9]+]], [[ModuleHandleR]], [[OffsetR]]
107 ; LARGE-LABEL: storeTGUninit:
108 ; LARGE64: addis [[ModuleHandleHR:[0-9]+]], [[ModuleHandleL:L..C[0-9]+]]@u(2)
109 ; LARGE: addis [[OffsetHR:[0-9]+]], [[TGUninitL:L..C[0-9]+]]@u(2)
110 ; LARGE32: addis [[ModuleHandleHR:[0-9]+]], [[ModuleHandleL:L..C[0-9]+]]@u(2)
111 ; LARGE64: ld [[ModuleHandleR:3]], [[ModuleHandleL]]@l([[ModuleHandleHR]])
112 ; LARGE32: lwz [[ModuleHandleR:3]], [[ModuleHandleL]]@l([[ModuleHandleHR]])
113 ; LARGE: bla .__tls_get_mod[PR]
114 ; LARGE64: ld [[OffsetR:[0-9]+]], [[TGUninitL:L..C[0-9]+]]@l([[OffsetHR]])
115 ; LARGE32: lwz [[OffsetR:[0-9]+]], [[TGUninitL:L..C[0-9]+]]@l([[OffsetHR]])
116 ; LARGE: stwx [[TGUninitValR:[0-9]+]], [[ModuleHandleR]], [[OffsetR]]
118 %0 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @TGUninit)
119 store i32 %i, ptr %0, align 4
123 define i32 @loadTIInit() {
124 ; SMALL-LABEL: loadTIInit:
125 ; SMALL64: ld [[ModuleHandleR:3]], [[ModuleHandleL:L..C[0-9]+]](2)
126 ; SMALL32: lwz [[ModuleHandleR:3]], [[ModuleHandleL:L..C[0-9]+]](2)
127 ; SMALL: bla .__tls_get_mod[PR]
128 ; SMALL64: ld [[OffsetR:[0-9]+]], [[TIInitL:L..C[0-9]+]](2)
129 ; SMALL32: lwz [[OffsetR:[0-9]+]], [[TIInitL:L..C[0-9]+]](2)
130 ; SMALL: lwzx [[TIInitValR:[0-9]+]], [[ModuleHandleR]], [[OffsetR]]
132 ; LARGE-LABEL: loadTIInit:
133 ; LARGE64: addis [[ModuleHandleHR:[0-9]+]], [[ModuleHandleL:L..C[0-9]+]]@u(2)
134 ; LARGE: addis [[OffsetHR:[0-9]+]], [[TIInitL:L..C[0-9]+]]@u(2)
135 ; LARGE32: addis [[ModuleHandleHR:[0-9]+]], [[ModuleHandleL:L..C[0-9]+]]@u(2)
136 ; LARGE64: ld [[ModuleHandleR:3]], [[ModuleHandleL]]@l([[ModuleHandleHR]])
137 ; LARGE32: lwz [[ModuleHandleR:3]], [[ModuleHandleL]]@l([[ModuleHandleHR]])
138 ; LARGE: bla .__tls_get_mod[PR]
139 ; LARGE64: ld [[OffsetR:[0-9]+]], [[TIInitL:L..C[0-9]+]]@l([[OffsetHR]])
140 ; LARGE32: lwz [[OffsetR:[0-9]+]], [[TIInitL:L..C[0-9]+]]@l([[OffsetHR]])
141 ; LARGE: lwzx [[TIInitValR:[0-9]+]], [[ModuleHandleR]], [[OffsetR]]
143 %0 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @TIInit)
144 %1 = load i32, ptr %0, align 4
148 define void @storeTIInit(i32 noundef signext %i) {
149 ; SMALL-LABEL: storeTIInit:
150 ; SMALL64: ld [[ModuleHandleR:3]], [[ModuleHandleL:L..C[0-9]+]](2)
151 ; SMALL32: lwz [[ModuleHandleR:3]], [[ModuleHandleL:L..C[0-9]+]](2)
152 ; SMALL: bla .__tls_get_mod[PR]
153 ; SMALL64: ld [[OffsetR:[0-9]+]], [[TIInitL:L..C[0-9]+]](2)
154 ; SMALL32: lwz [[OffsetR:[0-9]+]], [[TIInitL:L..C[0-9]+]](2)
155 ; SMALL: stwx [[TIInitValR:[0-9]+]], [[ModuleHandleR]], [[OffsetR]]
157 ; LARGE-LABEL: storeTIInit:
158 ; LARGE64: addis [[ModuleHandleHR:[0-9]+]], [[ModuleHandleL:L..C[0-9]+]]@u(2)
159 ; LARGE: addis [[OffsetHR:[0-9]+]], [[TIInitL:L..C[0-9]+]]@u(2)
160 ; LARGE32: addis [[ModuleHandleHR:[0-9]+]], [[ModuleHandleL:L..C[0-9]+]]@u(2)
161 ; LARGE64: ld [[ModuleHandleR:3]], [[ModuleHandleL]]@l([[ModuleHandleHR]])
162 ; LARGE32: lwz [[ModuleHandleR:3]], [[ModuleHandleL]]@l([[ModuleHandleHR]])
163 ; LARGE: bla .__tls_get_mod[PR]
164 ; LARGE64: ld [[OffsetR:[0-9]+]], [[TIInitL:L..C[0-9]+]]@l([[OffsetHR]])
165 ; LARGE32: lwz [[OffsetR:[0-9]+]], [[TIInitL:L..C[0-9]+]]@l([[OffsetHR]])
166 ; LARGE: stwx [[TIInitValR:[0-9]+]], [[ModuleHandleR]], [[OffsetR]]
168 %0 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @TIInit)
169 store i32 %i, ptr %0, align 4
173 define i32 @loadTIUninit() {
174 ; SMALL-LABEL: loadTIUninit:
175 ; SMALL64: ld [[ModuleHandleR:3]], [[ModuleHandleL:L..C[0-9]+]](2)
176 ; SMALL32: lwz [[ModuleHandleR:3]], [[ModuleHandleL:L..C[0-9]+]](2)
177 ; SMALL: bla .__tls_get_mod[PR]
178 ; SMALL64: ld [[OffsetR:[0-9]+]], [[TIUninitL:L..C[0-9]+]](2)
179 ; SMALL32: lwz [[OffsetR:[0-9]+]], [[TIUninitL:L..C[0-9]+]](2)
180 ; SMALL: lwzx [[TIUninitValR:[0-9]+]], [[ModuleHandleR]], [[OffsetR]]
182 ; LARGE-LABEL: loadTIUninit:
183 ; LARGE64: addis [[ModuleHandleHR:[0-9]+]], [[ModuleHandleL:L..C[0-9]+]]@u(2)
184 ; LARGE: addis [[OffsetHR:[0-9]+]], [[TIUninitL:L..C[0-9]+]]@u(2)
185 ; LARGE32: addis [[ModuleHandleHR:[0-9]+]], [[ModuleHandleL:L..C[0-9]+]]@u(2)
186 ; LARGE64: ld [[ModuleHandleR:3]], [[ModuleHandleL]]@l([[ModuleHandleHR]])
187 ; LARGE32: lwz [[ModuleHandleR:3]], [[ModuleHandleL]]@l([[ModuleHandleHR]])
188 ; LARGE: bla .__tls_get_mod[PR]
189 ; LARGE64: ld [[OffsetR:[0-9]+]], [[TIUninitL:L..C[0-9]+]]@l([[OffsetHR]])
190 ; LARGE32: lwz [[OffsetR:[0-9]+]], [[TIUninitL:L..C[0-9]+]]@l([[OffsetHR]])
191 ; LARGE: lwzx [[TIUninitValR:[0-9]+]], [[ModuleHandleR]], [[OffsetR]]
193 %0 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @TIUninit)
194 %1 = load i32, ptr %0, align 4
198 define void @storeTIUninit(i32 noundef signext %i) {
199 ; SMALL-LABEL: storeTIUninit:
200 ; SMALL64: ld [[ModuleHandleR:3]], [[ModuleHandleL:L..C[0-9]+]](2)
201 ; SMALL32: lwz [[ModuleHandleR:3]], [[ModuleHandleL:L..C[0-9]+]](2)
202 ; SMALL: bla .__tls_get_mod[PR]
203 ; SMALL64: ld [[OffsetR:[0-9]+]], [[TIUninitL:L..C[0-9]+]](2)
204 ; SMALL32: lwz [[OffsetR:[0-9]+]], [[TIUninitL:L..C[0-9]+]](2)
205 ; SMALL: stwx [[TIUninitValR:[0-9]+]], [[ModuleHandleR]], [[OffsetR]]
207 ; LARGE-LABEL: storeTIUninit:
208 ; LARGE64: addis [[ModuleHandleHR:[0-9]+]], [[ModuleHandleL:L..C[0-9]+]]@u(2)
209 ; LARGE: addis [[OffsetHR:[0-9]+]], [[TIUninitL:L..C[0-9]+]]@u(2)
210 ; LARGE32: addis [[ModuleHandleHR:[0-9]+]], [[ModuleHandleL:L..C[0-9]+]]@u(2)
211 ; LARGE64: ld [[ModuleHandleR:3]], [[ModuleHandleL]]@l([[ModuleHandleHR]])
212 ; LARGE32: lwz [[ModuleHandleR:3]], [[ModuleHandleL]]@l([[ModuleHandleHR]])
213 ; LARGE: bla .__tls_get_mod[PR]
214 ; LARGE64: ld [[OffsetR:[0-9]+]], [[TIUninitL:L..C[0-9]+]]@l([[OffsetHR]])
215 ; LARGE32: lwz [[OffsetR:[0-9]+]], [[TIUninitL:L..C[0-9]+]]@l([[OffsetHR]])
216 ; LARGE: stwx [[TIUninitValR:[0-9]+]], [[ModuleHandleR]], [[OffsetR]]
218 %0 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @TIUninit)
219 store i32 %i, ptr %0, align 4
223 define i32 @loadTWInit() {
224 ; SMALL-LABEL: loadTWInit:
225 ; SMALL64: ld [[ModuleHandleR:3]], [[ModuleHandleL:L..C[0-9]+]](2)
226 ; SMALL32: lwz [[ModuleHandleR:3]], [[ModuleHandleL:L..C[0-9]+]](2)
227 ; SMALL: bla .__tls_get_mod[PR]
228 ; SMALL64: ld [[OffsetR:[0-9]+]], [[TWInitL:L..C[0-9]+]](2)
229 ; SMALL32: lwz [[OffsetR:[0-9]+]], [[TWInitL:L..C[0-9]+]](2)
230 ; SMALL: lwzx [[TWInitValR:[0-9]+]], [[ModuleHandleR]], [[OffsetR]]
232 ; LARGE-LABEL: loadTWInit:
233 ; LARGE64: addis [[ModuleHandleHR:[0-9]+]], [[ModuleHandleL:L..C[0-9]+]]@u(2)
234 ; LARGE: addis [[OffsetHR:[0-9]+]], [[TWInitL:L..C[0-9]+]]@u(2)
235 ; LARGE32: addis [[ModuleHandleHR:[0-9]+]], [[ModuleHandleL:L..C[0-9]+]]@u(2)
236 ; LARGE64: ld [[ModuleHandleR:3]], [[ModuleHandleL]]@l([[ModuleHandleHR]])
237 ; LARGE32: lwz [[ModuleHandleR:3]], [[ModuleHandleL]]@l([[ModuleHandleHR]])
238 ; LARGE: bla .__tls_get_mod[PR]
239 ; LARGE64: ld [[OffsetR:[0-9]+]], [[TWInitL:L..C[0-9]+]]@l([[OffsetHR]])
240 ; LARGE32: lwz [[OffsetR:[0-9]+]], [[TWInitL:L..C[0-9]+]]@l([[OffsetHR]])
241 ; LARGE: lwzx [[TWInitValR:[0-9]+]], [[ModuleHandleR]], [[OffsetR]]
243 %0 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @TWInit)
244 %1 = load i32, ptr %0, align 4
248 define void @storeTWInit(i32 noundef signext %i) {
249 ; SMALL-LABEL: storeTWInit:
250 ; SMALL64: ld [[ModuleHandleR:3]], [[ModuleHandleL:L..C[0-9]+]](2)
251 ; SMALL32: lwz [[ModuleHandleR:3]], [[ModuleHandleL:L..C[0-9]+]](2)
252 ; SMALL: bla .__tls_get_mod[PR]
253 ; SMALL64: ld [[OffsetR:[0-9]+]], [[TWInitL:L..C[0-9]+]](2)
254 ; SMALL32: lwz [[OffsetR:[0-9]+]], [[TWInitL:L..C[0-9]+]](2)
255 ; SMALL: stwx [[TWInitValR:[0-9]+]], [[ModuleHandleR]], [[OffsetR]]
257 ; LARGE-LABEL: storeTWInit:
258 ; LARGE64: addis [[ModuleHandleHR:[0-9]+]], [[ModuleHandleL:L..C[0-9]+]]@u(2)
259 ; LARGE: addis [[OffsetHR:[0-9]+]], [[TWInitL:L..C[0-9]+]]@u(2)
260 ; LARGE32: addis [[ModuleHandleHR:[0-9]+]], [[ModuleHandleL:L..C[0-9]+]]@u(2)
261 ; LARGE64: ld [[ModuleHandleR:3]], [[ModuleHandleL]]@l([[ModuleHandleHR]])
262 ; LARGE32: lwz [[ModuleHandleR:3]], [[ModuleHandleL]]@l([[ModuleHandleHR]])
263 ; LARGE: bla .__tls_get_mod[PR]
264 ; LARGE64: ld [[OffsetR:[0-9]+]], [[TWInitL:L..C[0-9]+]]@l([[OffsetHR]])
265 ; LARGE32: lwz [[OffsetR:[0-9]+]], [[TWInitL:L..C[0-9]+]]@l([[OffsetHR]])
266 ; LARGE: stwx [[TWInitValR:[0-9]+]], [[ModuleHandleR]], [[OffsetR]]
268 %0 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @TWInit)
269 store i32 %i, ptr %0, align 4
273 define i32 @loadTWUninit() {
274 ; SMALL-LABEL: loadTWUninit:
275 ; SMALL64: ld [[ModuleHandleR:3]], [[ModuleHandleL:L..C[0-9]+]](2)
276 ; SMALL32: lwz [[ModuleHandleR:3]], [[ModuleHandleL:L..C[0-9]+]](2)
277 ; SMALL: bla .__tls_get_mod[PR]
278 ; SMALL64: ld [[OffsetR:[0-9]+]], [[TWUninitL:L..C[0-9]+]](2)
279 ; SMALL32: lwz [[OffsetR:[0-9]+]], [[TWUninitL:L..C[0-9]+]](2)
280 ; SMALL: lwzx [[TWUninitValR:[0-9]+]], [[ModuleHandleR]], [[OffsetR]]
282 ; LARGE-LABEL: loadTWUninit:
283 ; LARGE64: addis [[ModuleHandleHR:[0-9]+]], [[ModuleHandleL:L..C[0-9]+]]@u(2)
284 ; LARGE: addis [[OffsetHR:[0-9]+]], [[TWUninitL:L..C[0-9]+]]@u(2)
285 ; LARGE32: addis [[ModuleHandleHR:[0-9]+]], [[ModuleHandleL:L..C[0-9]+]]@u(2)
286 ; LARGE64: ld [[ModuleHandleR:3]], [[ModuleHandleL]]@l([[ModuleHandleHR]])
287 ; LARGE32: lwz [[ModuleHandleR:3]], [[ModuleHandleL]]@l([[ModuleHandleHR]])
288 ; LARGE: bla .__tls_get_mod[PR]
289 ; LARGE64: ld [[OffsetR:[0-9]+]], [[TWUninitL:L..C[0-9]+]]@l([[OffsetHR]])
290 ; LARGE32: lwz [[OffsetR:[0-9]+]], [[TWUninitL:L..C[0-9]+]]@l([[OffsetHR]])
291 ; LARGE: lwzx [[TWUninitValR:[0-9]+]], [[ModuleHandleR]], [[OffsetR]]
293 %0 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @TWUninit)
294 %1 = load i32, ptr %0, align 4
298 define void @storeTWUninit(i32 noundef signext %i) {
299 ; SMALL-LABEL: storeTWUninit:
300 ; SMALL64: ld [[ModuleHandleR:3]], [[ModuleHandleL:L..C[0-9]+]](2)
301 ; SMALL32: lwz [[ModuleHandleR:3]], [[ModuleHandleL:L..C[0-9]+]](2)
302 ; SMALL: bla .__tls_get_mod[PR]
303 ; SMALL64: ld [[OffsetR:[0-9]+]], [[TWUninitL:L..C[0-9]+]](2)
304 ; SMALL32: lwz [[OffsetR:[0-9]+]], [[TWUninitL:L..C[0-9]+]](2)
305 ; SMALL: stwx [[TWUninitValR:[0-9]+]], [[ModuleHandleR]], [[OffsetR]]
307 ; LARGE-LABEL: storeTWUninit:
308 ; LARGE64: addis [[ModuleHandleHR:[0-9]+]], [[ModuleHandleL:L..C[0-9]+]]@u(2)
309 ; LARGE: addis [[OffsetHR:[0-9]+]], [[TWUninitL:L..C[0-9]+]]@u(2)
310 ; LARGE32: addis [[ModuleHandleHR:[0-9]+]], [[ModuleHandleL:L..C[0-9]+]]@u(2)
311 ; LARGE64: ld [[ModuleHandleR:3]], [[ModuleHandleL]]@l([[ModuleHandleHR]])
312 ; LARGE32: lwz [[ModuleHandleR:3]], [[ModuleHandleL]]@l([[ModuleHandleHR]])
313 ; LARGE: bla .__tls_get_mod[PR]
314 ; LARGE64: ld [[OffsetR:[0-9]+]], [[TWUninitL:L..C[0-9]+]]@l([[OffsetHR]])
315 ; LARGE32: lwz [[OffsetR:[0-9]+]], [[TWUninitL:L..C[0-9]+]]@l([[OffsetHR]])
316 ; LARGE: stwx [[TWUninitValR:[0-9]+]], [[ModuleHandleR]], [[OffsetR]]
318 %0 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @TWUninit)
319 store i32 %i, ptr %0, align 4
323 define i32 @DedupTlsGetMod() #0 {
324 ; WITHDUP-LABEL: DedupTlsGetMod:
325 ; WITHDUP: ld [[ModuleHandleR:3]], [[ModuleHandleL:L..C[0-9]+]](2)
326 ; WITHDUP-NEXT: bla .__tls_get_mod[PR]
327 ; WITHDUP-NEXT: ld [[OffsetXR:[0-9]+]], [[X:L..C[0-9]+]](2)
328 ; WITHDUP: ld [[ModuleHandleR:3]], [[ModuleHandleL:L..C[0-9]+]](2)
329 ; WITHDUP-NEXT: bla .__tls_get_mod[PR]
330 ; WITHDUP: ld [[OffsetYR:[0-9]+]], [[Y:L..C[0-9]+]](2)
331 ; WITHDUP-LABEL: L..DedupTlsGetMod0:
333 ; NODUP-LABEL: DedupTlsGetMod:
334 ; NODUP: ld [[ModuleHandleR:3]], [[ModuleHandleL:L..C[0-9]+]](2)
335 ; NODUP-NEXT: bla .__tls_get_mod[PR]
336 ; NODUP-NEXT: ld [[OffsetXR:[0-9]+]], [[X:L..C[0-9]+]](2)
337 ; NODUP-NEXT: ld [[OffsetYR:[0-9]+]], [[Y:L..C[0-9]+]](2)
338 ; NODUP-NEXT: lwzx [[XValR:[0-9]+]], [[ModuleHandleR]], [[OffsetXR]]
339 ; NODUP-NEXT: lwzx [[YValR:[0-9]+]], [[ModuleHandleR]], [[OffsetYR]]
340 ; NODUP-LABEL: L..DedupTlsGetMod0:
342 %retval = alloca i32, align 4
343 store i32 0, ptr %retval, align 4
344 %0 = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @x)
345 %1 = load i32, ptr %0, align 4
346 %2 = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @y)
347 %3 = load i32, ptr %2, align 4
348 %add = add nsw i32 %1, %3
352 ; SMALL: .extern .__tls_get_mod[PR]
353 ; LARGE: .extern .__tls_get_mod[PR]
354 ; SMALL-NOT: .extern _Renamed..5f24__TLSML[TC]
355 ; LARGE-NOT: .extern _Renamed..5f24__TLSML[TC]
357 ; SMALL: [[ModuleHandleL]]:
358 ; SMALL-NEXT: .tc _Renamed..5f24__TLSML[TC],_Renamed..5f24__TLSML[TC]@ml
359 ; SMALL-NEXT: .rename _Renamed..5f24__TLSML[TC],"_$TLSML"
360 ; SMALL: [[TGInitL]]:
361 ; SMALL-NEXT: .tc TGInit[TC],TGInit[TL]@ld
362 ; SMALL: [[TGUninitL]]:
363 ; SMALL-NEXT: .tc TGUninit[TC],TGUninit[TL]@ld
364 ; SMALL: [[TIInitL]]:
365 ; SMALL-NEXT: .tc TIInit[TC],TIInit[TL]@ld
366 ; SMALL: [[TIUninitL]]:
367 ; SMALL-NEXT: .tc TIUninit[TC],TIUninit[UL]@ld
368 ; SMALL: [[TWInitL]]:
369 ; SMALL-NEXT: .tc TWInit[TC],TWInit[TL]@ld
370 ; SMALL: [[TWUninitL]]:
371 ; SMALL-NEXT: .tc TWUninit[TC],TWUninit[TL]@ld
373 ; LARGE64: [[ModuleHandleL]]:
374 ; LARGE64-NEXT: .tc _Renamed..5f24__TLSML[TC],_Renamed..5f24__TLSML[TC]@ml
375 ; LARGE64-NEXT: .rename _Renamed..5f24__TLSML[TC],"_$TLSML"
376 ; LARGE64: [[TGInitL]]:
377 ; LARGE64-NEXT: .tc TGInit[TE],TGInit[TL]@ld
379 ; LARGE32: [[TGInitL]]:
380 ; LARGE32-NEXT: .tc TGInit[TE],TGInit[TL]@ld
381 ; LARGE32: [[ModuleHandleL]]:
382 ; LARGE32-NEXT: .tc _Renamed..5f24__TLSML[TC],_Renamed..5f24__TLSML[TC]@ml
383 ; LARGE32-NEXT: .rename _Renamed..5f24__TLSML[TC],"_$TLSML"
385 ; LARGE: [[TGUninitL]]:
386 ; LARGE-NEXT: .tc TGUninit[TE],TGUninit[TL]@ld
387 ; LARGE: [[TIInitL]]:
388 ; LARGE-NEXT: .tc TIInit[TE],TIInit[TL]@ld
389 ; LARGE: [[TIUninitL]]:
390 ; LARGE-NEXT: .tc TIUninit[TE],TIUninit[UL]@ld
391 ; LARGE: [[TWInitL]]:
392 ; LARGE-NEXT: .tc TWInit[TE],TWInit[TL]@ld
393 ; LARGE: [[TWUninitL]]:
394 ; LARGE-NEXT: .tc TWUninit[TE],TWUninit[TL]@ld
396 declare nonnull ptr @llvm.threadlocal.address.p0(ptr nonnull)