xref: /llvm-project/llvm/test/CodeGen/PowerPC/aix-tls-le-ldst-int.ll (revision 69b056d5638bbe3c8098b5d3a4980eb9929b9bbe)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
2; RUN: llc  -verify-machineinstrs -mcpu=pwr7 -ppc-asm-full-reg-names \
3; RUN:      -mtriple powerpc64-ibm-aix-xcoff < %s | FileCheck %s \
4; RUN:      --check-prefix=SMALL64
5; RUN: llc  -verify-machineinstrs -mcpu=pwr7 -ppc-asm-full-reg-names \
6; RUN:      -mtriple powerpc64-ibm-aix-xcoff --code-model=large < %s \
7; RUN:      | FileCheck %s --check-prefix=LARGE64
8; RUN: llc  -verify-machineinstrs -mcpu=pwr7 -ppc-asm-full-reg-names \
9; RUN:      -mtriple powerpc-ibm-aix-xcoff < %s | FileCheck %s \
10; RUN:      --check-prefix=SMALL32
11; RUN: llc  -verify-machineinstrs -mcpu=pwr7 -ppc-asm-full-reg-names \
12; RUN:      -mtriple powerpc-ibm-aix-xcoff --code-model=large < %s \
13; RUN:      | FileCheck %s --check-prefix=LARGE32
14
15@ThreadLocalVarInit = thread_local(localexec) global i32 1, align 4
16@VarInit = global i32 87, align 4
17@IThreadLocalVarUninit = internal thread_local(localexec) global i32 0, align 4
18@IThreadLocalVarInit = internal thread_local(localexec) global i32 1, align 4
19@ThreadLocalVarUninit = thread_local(localexec) global i32 0, align 4
20declare nonnull ptr @llvm.threadlocal.address.p0(ptr nonnull) #1
21
22define void @storeITLUninit(i32 noundef signext %x) {
23; SMALL64-LABEL: storeITLUninit:
24; SMALL64:       # %bb.0: # %entry
25; SMALL64-NEXT:    ld r4, L..C0(r2) # target-flags(ppc-tprel) @IThreadLocalVarUninit
26; SMALL64-NEXT:    stwx r3, r13, r4
27; SMALL64-NEXT:    blr
28;
29; LARGE64-LABEL: storeITLUninit:
30; LARGE64:       # %bb.0: # %entry
31; LARGE64-NEXT:    addis r4, L..C0@u(r2)
32; LARGE64-NEXT:    ld r4, L..C0@l(r4)
33; LARGE64-NEXT:    stwx r3, r13, r4
34; LARGE64-NEXT:    blr
35;
36; SMALL32-LABEL: storeITLUninit:
37; SMALL32:       # %bb.0: # %entry
38; SMALL32-NEXT:    mflr r0
39; SMALL32-NEXT:    stwu r1, -32(r1)
40; SMALL32-NEXT:    lwz r5, L..C0(r2) # target-flags(ppc-tprel) @IThreadLocalVarUninit
41; SMALL32-NEXT:    mr r4, r3
42; SMALL32-NEXT:    bla .__get_tpointer[PR]
43; SMALL32-NEXT:    stw r0, 40(r1)
44; SMALL32-NEXT:    stwx r4, r3, r5
45; SMALL32-NEXT:    addi r1, r1, 32
46; SMALL32-NEXT:    lwz r0, 8(r1)
47; SMALL32-NEXT:    mtlr r0
48; SMALL32-NEXT:    blr
49;
50; LARGE32-LABEL: storeITLUninit:
51; LARGE32:       # %bb.0: # %entry
52; LARGE32-NEXT:    mflr r0
53; LARGE32-NEXT:    stwu r1, -32(r1)
54; LARGE32-NEXT:    stw r0, 40(r1)
55; LARGE32-NEXT:    mr r4, r3
56; LARGE32-NEXT:    addis r3, L..C0@u(r2)
57; LARGE32-NEXT:    lwz r5, L..C0@l(r3)
58; LARGE32-NEXT:    bla .__get_tpointer[PR]
59; LARGE32-NEXT:    stwx r4, r3, r5
60; LARGE32-NEXT:    addi r1, r1, 32
61; LARGE32-NEXT:    lwz r0, 8(r1)
62; LARGE32-NEXT:    mtlr r0
63; LARGE32-NEXT:    blr
64entry:
65  %0 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @IThreadLocalVarUninit)
66  store i32 %x, ptr %0, align 4
67  ret void
68}
69
70define void @storeITLInit(i32 noundef signext %x) {
71; SMALL64-LABEL: storeITLInit:
72; SMALL64:       # %bb.0: # %entry
73; SMALL64-NEXT:    ld r4, L..C1(r2) # target-flags(ppc-tprel) @IThreadLocalVarInit
74; SMALL64-NEXT:    stwx r3, r13, r4
75; SMALL64-NEXT:    blr
76;
77; LARGE64-LABEL: storeITLInit:
78; LARGE64:       # %bb.0: # %entry
79; LARGE64-NEXT:    addis r4, L..C1@u(r2)
80; LARGE64-NEXT:    ld r4, L..C1@l(r4)
81; LARGE64-NEXT:    stwx r3, r13, r4
82; LARGE64-NEXT:    blr
83;
84; SMALL32-LABEL: storeITLInit:
85; SMALL32:       # %bb.0: # %entry
86; SMALL32-NEXT:    mflr r0
87; SMALL32-NEXT:    stwu r1, -32(r1)
88; SMALL32-NEXT:    lwz r5, L..C1(r2) # target-flags(ppc-tprel) @IThreadLocalVarInit
89; SMALL32-NEXT:    mr r4, r3
90; SMALL32-NEXT:    bla .__get_tpointer[PR]
91; SMALL32-NEXT:    stw r0, 40(r1)
92; SMALL32-NEXT:    stwx r4, r3, r5
93; SMALL32-NEXT:    addi r1, r1, 32
94; SMALL32-NEXT:    lwz r0, 8(r1)
95; SMALL32-NEXT:    mtlr r0
96; SMALL32-NEXT:    blr
97;
98; LARGE32-LABEL: storeITLInit:
99; LARGE32:       # %bb.0: # %entry
100; LARGE32-NEXT:    mflr r0
101; LARGE32-NEXT:    stwu r1, -32(r1)
102; LARGE32-NEXT:    stw r0, 40(r1)
103; LARGE32-NEXT:    mr r4, r3
104; LARGE32-NEXT:    addis r3, L..C1@u(r2)
105; LARGE32-NEXT:    lwz r5, L..C1@l(r3)
106; LARGE32-NEXT:    bla .__get_tpointer[PR]
107; LARGE32-NEXT:    stwx r4, r3, r5
108; LARGE32-NEXT:    addi r1, r1, 32
109; LARGE32-NEXT:    lwz r0, 8(r1)
110; LARGE32-NEXT:    mtlr r0
111; LARGE32-NEXT:    blr
112entry:
113  %0 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @IThreadLocalVarInit)
114  store i32 %x, ptr %0, align 4
115  ret void
116}
117
118define void @storeTLUninit(i32 noundef signext %x) {
119; SMALL64-LABEL: storeTLUninit:
120; SMALL64:       # %bb.0: # %entry
121; SMALL64-NEXT:    ld r4, L..C2(r2) # target-flags(ppc-tprel) @ThreadLocalVarUninit
122; SMALL64-NEXT:    stwx r3, r13, r4
123; SMALL64-NEXT:    blr
124;
125; LARGE64-LABEL: storeTLUninit:
126; LARGE64:       # %bb.0: # %entry
127; LARGE64-NEXT:    addis r4, L..C2@u(r2)
128; LARGE64-NEXT:    ld r4, L..C2@l(r4)
129; LARGE64-NEXT:    stwx r3, r13, r4
130; LARGE64-NEXT:    blr
131;
132; SMALL32-LABEL: storeTLUninit:
133; SMALL32:       # %bb.0: # %entry
134; SMALL32-NEXT:    mflr r0
135; SMALL32-NEXT:    stwu r1, -32(r1)
136; SMALL32-NEXT:    lwz r5, L..C2(r2) # target-flags(ppc-tprel) @ThreadLocalVarUninit
137; SMALL32-NEXT:    mr r4, r3
138; SMALL32-NEXT:    bla .__get_tpointer[PR]
139; SMALL32-NEXT:    stw r0, 40(r1)
140; SMALL32-NEXT:    stwx r4, r3, r5
141; SMALL32-NEXT:    addi r1, r1, 32
142; SMALL32-NEXT:    lwz r0, 8(r1)
143; SMALL32-NEXT:    mtlr r0
144; SMALL32-NEXT:    blr
145;
146; LARGE32-LABEL: storeTLUninit:
147; LARGE32:       # %bb.0: # %entry
148; LARGE32-NEXT:    mflr r0
149; LARGE32-NEXT:    stwu r1, -32(r1)
150; LARGE32-NEXT:    stw r0, 40(r1)
151; LARGE32-NEXT:    mr r4, r3
152; LARGE32-NEXT:    addis r3, L..C2@u(r2)
153; LARGE32-NEXT:    lwz r5, L..C2@l(r3)
154; LARGE32-NEXT:    bla .__get_tpointer[PR]
155; LARGE32-NEXT:    stwx r4, r3, r5
156; LARGE32-NEXT:    addi r1, r1, 32
157; LARGE32-NEXT:    lwz r0, 8(r1)
158; LARGE32-NEXT:    mtlr r0
159; LARGE32-NEXT:    blr
160entry:
161  %0 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @ThreadLocalVarUninit)
162  store i32 %x, ptr %0, align 4
163  ret void
164}
165
166define void @storeTLInit(i32 noundef signext %x) {
167; SMALL64-LABEL: storeTLInit:
168; SMALL64:       # %bb.0: # %entry
169; SMALL64-NEXT:    ld r4, L..C3(r2) # target-flags(ppc-tprel) @ThreadLocalVarInit
170; SMALL64-NEXT:    stwx r3, r13, r4
171; SMALL64-NEXT:    blr
172;
173; LARGE64-LABEL: storeTLInit:
174; LARGE64:       # %bb.0: # %entry
175; LARGE64-NEXT:    addis r4, L..C3@u(r2)
176; LARGE64-NEXT:    ld r4, L..C3@l(r4)
177; LARGE64-NEXT:    stwx r3, r13, r4
178; LARGE64-NEXT:    blr
179;
180; SMALL32-LABEL: storeTLInit:
181; SMALL32:       # %bb.0: # %entry
182; SMALL32-NEXT:    mflr r0
183; SMALL32-NEXT:    stwu r1, -32(r1)
184; SMALL32-NEXT:    lwz r5, L..C3(r2) # target-flags(ppc-tprel) @ThreadLocalVarInit
185; SMALL32-NEXT:    mr r4, r3
186; SMALL32-NEXT:    bla .__get_tpointer[PR]
187; SMALL32-NEXT:    stw r0, 40(r1)
188; SMALL32-NEXT:    stwx r4, r3, r5
189; SMALL32-NEXT:    addi r1, r1, 32
190; SMALL32-NEXT:    lwz r0, 8(r1)
191; SMALL32-NEXT:    mtlr r0
192; SMALL32-NEXT:    blr
193;
194; LARGE32-LABEL: storeTLInit:
195; LARGE32:       # %bb.0: # %entry
196; LARGE32-NEXT:    mflr r0
197; LARGE32-NEXT:    stwu r1, -32(r1)
198; LARGE32-NEXT:    stw r0, 40(r1)
199; LARGE32-NEXT:    mr r4, r3
200; LARGE32-NEXT:    addis r3, L..C3@u(r2)
201; LARGE32-NEXT:    lwz r5, L..C3@l(r3)
202; LARGE32-NEXT:    bla .__get_tpointer[PR]
203; LARGE32-NEXT:    stwx r4, r3, r5
204; LARGE32-NEXT:    addi r1, r1, 32
205; LARGE32-NEXT:    lwz r0, 8(r1)
206; LARGE32-NEXT:    mtlr r0
207; LARGE32-NEXT:    blr
208entry:
209  %0 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @ThreadLocalVarInit)
210  store i32 %x, ptr %0, align 4
211  ret void
212}
213
214define signext i32 @loadITLUninit() {
215; SMALL64-LABEL: loadITLUninit:
216; SMALL64:       # %bb.0: # %entry
217; SMALL64-NEXT:    ld r3, L..C0(r2) # target-flags(ppc-tprel) @IThreadLocalVarUninit
218; SMALL64-NEXT:    lwax r3, r13, r3
219; SMALL64-NEXT:    blr
220;
221; LARGE64-LABEL: loadITLUninit:
222; LARGE64:       # %bb.0: # %entry
223; LARGE64-NEXT:    addis r3, L..C0@u(r2)
224; LARGE64-NEXT:    ld r3, L..C0@l(r3)
225; LARGE64-NEXT:    lwax r3, r13, r3
226; LARGE64-NEXT:    blr
227;
228; SMALL32-LABEL: loadITLUninit:
229; SMALL32:       # %bb.0: # %entry
230; SMALL32-NEXT:    mflr r0
231; SMALL32-NEXT:    stwu r1, -32(r1)
232; SMALL32-NEXT:    lwz r4, L..C0(r2) # target-flags(ppc-tprel) @IThreadLocalVarUninit
233; SMALL32-NEXT:    stw r0, 40(r1)
234; SMALL32-NEXT:    bla .__get_tpointer[PR]
235; SMALL32-NEXT:    lwzx r3, r3, r4
236; SMALL32-NEXT:    addi r1, r1, 32
237; SMALL32-NEXT:    lwz r0, 8(r1)
238; SMALL32-NEXT:    mtlr r0
239; SMALL32-NEXT:    blr
240;
241; LARGE32-LABEL: loadITLUninit:
242; LARGE32:       # %bb.0: # %entry
243; LARGE32-NEXT:    mflr r0
244; LARGE32-NEXT:    stwu r1, -32(r1)
245; LARGE32-NEXT:    stw r0, 40(r1)
246; LARGE32-NEXT:    addis r3, L..C0@u(r2)
247; LARGE32-NEXT:    lwz r4, L..C0@l(r3)
248; LARGE32-NEXT:    bla .__get_tpointer[PR]
249; LARGE32-NEXT:    lwzx r3, r3, r4
250; LARGE32-NEXT:    addi r1, r1, 32
251; LARGE32-NEXT:    lwz r0, 8(r1)
252; LARGE32-NEXT:    mtlr r0
253; LARGE32-NEXT:    blr
254entry:
255  %0 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @IThreadLocalVarUninit)
256  %1 = load i32, ptr %0, align 4
257  ret i32 %1
258}
259
260define signext i32 @loadITLUninit2() {
261; SMALL64-LABEL: loadITLUninit2:
262; SMALL64:       # %bb.0: # %entry
263; SMALL64-NEXT:    ld r3, L..C0(r2) # target-flags(ppc-tprel) @IThreadLocalVarUninit
264; SMALL64-NEXT:    ld r4, L..C4(r2) # @VarInit
265; SMALL64-NEXT:    lwzx r3, r13, r3
266; SMALL64-NEXT:    lwz r4, 0(r4)
267; SMALL64-NEXT:    add r3, r4, r3
268; SMALL64-NEXT:    extsw r3, r3
269; SMALL64-NEXT:    blr
270;
271; LARGE64-LABEL: loadITLUninit2:
272; LARGE64:       # %bb.0: # %entry
273; LARGE64-NEXT:    addis r3, L..C0@u(r2)
274; LARGE64-NEXT:    addis r4, L..C4@u(r2)
275; LARGE64-NEXT:    ld r3, L..C0@l(r3)
276; LARGE64-NEXT:    ld r4, L..C4@l(r4)
277; LARGE64-NEXT:    lwzx r3, r13, r3
278; LARGE64-NEXT:    lwz r4, 0(r4)
279; LARGE64-NEXT:    add r3, r4, r3
280; LARGE64-NEXT:    extsw r3, r3
281; LARGE64-NEXT:    blr
282;
283; SMALL32-LABEL: loadITLUninit2:
284; SMALL32:       # %bb.0: # %entry
285; SMALL32-NEXT:    mflr r0
286; SMALL32-NEXT:    stwu r1, -32(r1)
287; SMALL32-NEXT:    lwz r4, L..C0(r2) # target-flags(ppc-tprel) @IThreadLocalVarUninit
288; SMALL32-NEXT:    stw r0, 40(r1)
289; SMALL32-NEXT:    bla .__get_tpointer[PR]
290; SMALL32-NEXT:    lwzx r3, r3, r4
291; SMALL32-NEXT:    lwz r4, L..C4(r2) # @VarInit
292; SMALL32-NEXT:    lwz r4, 0(r4)
293; SMALL32-NEXT:    add r3, r4, r3
294; SMALL32-NEXT:    addi r1, r1, 32
295; SMALL32-NEXT:    lwz r0, 8(r1)
296; SMALL32-NEXT:    mtlr r0
297; SMALL32-NEXT:    blr
298;
299; LARGE32-LABEL: loadITLUninit2:
300; LARGE32:       # %bb.0: # %entry
301; LARGE32-NEXT:    mflr r0
302; LARGE32-NEXT:    stwu r1, -32(r1)
303; LARGE32-NEXT:    stw r0, 40(r1)
304; LARGE32-NEXT:    addis r3, L..C0@u(r2)
305; LARGE32-NEXT:    lwz r4, L..C0@l(r3)
306; LARGE32-NEXT:    bla .__get_tpointer[PR]
307; LARGE32-NEXT:    lwzx r3, r3, r4
308; LARGE32-NEXT:    addis r4, L..C4@u(r2)
309; LARGE32-NEXT:    lwz r4, L..C4@l(r4)
310; LARGE32-NEXT:    lwz r4, 0(r4)
311; LARGE32-NEXT:    add r3, r4, r3
312; LARGE32-NEXT:    addi r1, r1, 32
313; LARGE32-NEXT:    lwz r0, 8(r1)
314; LARGE32-NEXT:    mtlr r0
315; LARGE32-NEXT:    blr
316entry:
317  %0 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @IThreadLocalVarUninit)
318  %1 = load i32, ptr %0, align 4
319  %2 = load i32, ptr @VarInit, align 4
320  %add = add nsw i32 %2, %1
321  ret i32 %add
322}
323
324define signext i32 @loadITLInit() {
325; SMALL64-LABEL: loadITLInit:
326; SMALL64:       # %bb.0: # %entry
327; SMALL64-NEXT:    ld r3, L..C1(r2) # target-flags(ppc-tprel) @IThreadLocalVarInit
328; SMALL64-NEXT:    lwax r3, r13, r3
329; SMALL64-NEXT:    blr
330;
331; LARGE64-LABEL: loadITLInit:
332; LARGE64:       # %bb.0: # %entry
333; LARGE64-NEXT:    addis r3, L..C1@u(r2)
334; LARGE64-NEXT:    ld r3, L..C1@l(r3)
335; LARGE64-NEXT:    lwax r3, r13, r3
336; LARGE64-NEXT:    blr
337;
338; SMALL32-LABEL: loadITLInit:
339; SMALL32:       # %bb.0: # %entry
340; SMALL32-NEXT:    mflr r0
341; SMALL32-NEXT:    stwu r1, -32(r1)
342; SMALL32-NEXT:    lwz r4, L..C1(r2) # target-flags(ppc-tprel) @IThreadLocalVarInit
343; SMALL32-NEXT:    stw r0, 40(r1)
344; SMALL32-NEXT:    bla .__get_tpointer[PR]
345; SMALL32-NEXT:    lwzx r3, r3, r4
346; SMALL32-NEXT:    addi r1, r1, 32
347; SMALL32-NEXT:    lwz r0, 8(r1)
348; SMALL32-NEXT:    mtlr r0
349; SMALL32-NEXT:    blr
350;
351; LARGE32-LABEL: loadITLInit:
352; LARGE32:       # %bb.0: # %entry
353; LARGE32-NEXT:    mflr r0
354; LARGE32-NEXT:    stwu r1, -32(r1)
355; LARGE32-NEXT:    stw r0, 40(r1)
356; LARGE32-NEXT:    addis r3, L..C1@u(r2)
357; LARGE32-NEXT:    lwz r4, L..C1@l(r3)
358; LARGE32-NEXT:    bla .__get_tpointer[PR]
359; LARGE32-NEXT:    lwzx r3, r3, r4
360; LARGE32-NEXT:    addi r1, r1, 32
361; LARGE32-NEXT:    lwz r0, 8(r1)
362; LARGE32-NEXT:    mtlr r0
363; LARGE32-NEXT:    blr
364entry:
365  %0 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @IThreadLocalVarInit)
366  %1 = load i32, ptr %0, align 4
367  ret i32 %1
368}
369
370define signext i32 @loadITLInit2() {
371; SMALL64-LABEL: loadITLInit2:
372; SMALL64:       # %bb.0: # %entry
373; SMALL64-NEXT:    ld r3, L..C1(r2) # target-flags(ppc-tprel) @IThreadLocalVarInit
374; SMALL64-NEXT:    ld r4, L..C4(r2) # @VarInit
375; SMALL64-NEXT:    lwzx r3, r13, r3
376; SMALL64-NEXT:    lwz r4, 0(r4)
377; SMALL64-NEXT:    add r3, r4, r3
378; SMALL64-NEXT:    extsw r3, r3
379; SMALL64-NEXT:    blr
380;
381; LARGE64-LABEL: loadITLInit2:
382; LARGE64:       # %bb.0: # %entry
383; LARGE64-NEXT:    addis r3, L..C1@u(r2)
384; LARGE64-NEXT:    addis r4, L..C4@u(r2)
385; LARGE64-NEXT:    ld r3, L..C1@l(r3)
386; LARGE64-NEXT:    ld r4, L..C4@l(r4)
387; LARGE64-NEXT:    lwzx r3, r13, r3
388; LARGE64-NEXT:    lwz r4, 0(r4)
389; LARGE64-NEXT:    add r3, r4, r3
390; LARGE64-NEXT:    extsw r3, r3
391; LARGE64-NEXT:    blr
392;
393; SMALL32-LABEL: loadITLInit2:
394; SMALL32:       # %bb.0: # %entry
395; SMALL32-NEXT:    mflr r0
396; SMALL32-NEXT:    stwu r1, -32(r1)
397; SMALL32-NEXT:    lwz r4, L..C1(r2) # target-flags(ppc-tprel) @IThreadLocalVarInit
398; SMALL32-NEXT:    stw r0, 40(r1)
399; SMALL32-NEXT:    bla .__get_tpointer[PR]
400; SMALL32-NEXT:    lwzx r3, r3, r4
401; SMALL32-NEXT:    lwz r4, L..C4(r2) # @VarInit
402; SMALL32-NEXT:    lwz r4, 0(r4)
403; SMALL32-NEXT:    add r3, r4, r3
404; SMALL32-NEXT:    addi r1, r1, 32
405; SMALL32-NEXT:    lwz r0, 8(r1)
406; SMALL32-NEXT:    mtlr r0
407; SMALL32-NEXT:    blr
408;
409; LARGE32-LABEL: loadITLInit2:
410; LARGE32:       # %bb.0: # %entry
411; LARGE32-NEXT:    mflr r0
412; LARGE32-NEXT:    stwu r1, -32(r1)
413; LARGE32-NEXT:    stw r0, 40(r1)
414; LARGE32-NEXT:    addis r3, L..C1@u(r2)
415; LARGE32-NEXT:    lwz r4, L..C1@l(r3)
416; LARGE32-NEXT:    bla .__get_tpointer[PR]
417; LARGE32-NEXT:    lwzx r3, r3, r4
418; LARGE32-NEXT:    addis r4, L..C4@u(r2)
419; LARGE32-NEXT:    lwz r4, L..C4@l(r4)
420; LARGE32-NEXT:    lwz r4, 0(r4)
421; LARGE32-NEXT:    add r3, r4, r3
422; LARGE32-NEXT:    addi r1, r1, 32
423; LARGE32-NEXT:    lwz r0, 8(r1)
424; LARGE32-NEXT:    mtlr r0
425; LARGE32-NEXT:    blr
426entry:
427  %0 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @IThreadLocalVarInit)
428  %1 = load i32, ptr %0, align 4
429  %2 = load i32, ptr @VarInit, align 4
430  %add = add nsw i32 %2, %1
431  ret i32 %add
432}
433
434define signext i32 @loadTLUninit() {
435; SMALL64-LABEL: loadTLUninit:
436; SMALL64:       # %bb.0: # %entry
437; SMALL64-NEXT:    ld r3, L..C2(r2) # target-flags(ppc-tprel) @ThreadLocalVarUninit
438; SMALL64-NEXT:    lwax r3, r13, r3
439; SMALL64-NEXT:    blr
440;
441; LARGE64-LABEL: loadTLUninit:
442; LARGE64:       # %bb.0: # %entry
443; LARGE64-NEXT:    addis r3, L..C2@u(r2)
444; LARGE64-NEXT:    ld r3, L..C2@l(r3)
445; LARGE64-NEXT:    lwax r3, r13, r3
446; LARGE64-NEXT:    blr
447;
448; SMALL32-LABEL: loadTLUninit:
449; SMALL32:       # %bb.0: # %entry
450; SMALL32-NEXT:    mflr r0
451; SMALL32-NEXT:    stwu r1, -32(r1)
452; SMALL32-NEXT:    lwz r4, L..C2(r2) # target-flags(ppc-tprel) @ThreadLocalVarUninit
453; SMALL32-NEXT:    stw r0, 40(r1)
454; SMALL32-NEXT:    bla .__get_tpointer[PR]
455; SMALL32-NEXT:    lwzx r3, r3, r4
456; SMALL32-NEXT:    addi r1, r1, 32
457; SMALL32-NEXT:    lwz r0, 8(r1)
458; SMALL32-NEXT:    mtlr r0
459; SMALL32-NEXT:    blr
460;
461; LARGE32-LABEL: loadTLUninit:
462; LARGE32:       # %bb.0: # %entry
463; LARGE32-NEXT:    mflr r0
464; LARGE32-NEXT:    stwu r1, -32(r1)
465; LARGE32-NEXT:    stw r0, 40(r1)
466; LARGE32-NEXT:    addis r3, L..C2@u(r2)
467; LARGE32-NEXT:    lwz r4, L..C2@l(r3)
468; LARGE32-NEXT:    bla .__get_tpointer[PR]
469; LARGE32-NEXT:    lwzx r3, r3, r4
470; LARGE32-NEXT:    addi r1, r1, 32
471; LARGE32-NEXT:    lwz r0, 8(r1)
472; LARGE32-NEXT:    mtlr r0
473; LARGE32-NEXT:    blr
474entry:
475  %0 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @ThreadLocalVarUninit)
476  %1 = load i32, ptr %0, align 4
477  ret i32 %1
478}
479
480define signext i32 @loadTLUninit2() {
481; SMALL64-LABEL: loadTLUninit2:
482; SMALL64:       # %bb.0: # %entry
483; SMALL64-NEXT:    ld r3, L..C2(r2) # target-flags(ppc-tprel) @ThreadLocalVarUninit
484; SMALL64-NEXT:    ld r4, L..C4(r2) # @VarInit
485; SMALL64-NEXT:    lwzx r3, r13, r3
486; SMALL64-NEXT:    lwz r4, 0(r4)
487; SMALL64-NEXT:    add r3, r4, r3
488; SMALL64-NEXT:    extsw r3, r3
489; SMALL64-NEXT:    blr
490;
491; LARGE64-LABEL: loadTLUninit2:
492; LARGE64:       # %bb.0: # %entry
493; LARGE64-NEXT:    addis r3, L..C2@u(r2)
494; LARGE64-NEXT:    addis r4, L..C4@u(r2)
495; LARGE64-NEXT:    ld r3, L..C2@l(r3)
496; LARGE64-NEXT:    ld r4, L..C4@l(r4)
497; LARGE64-NEXT:    lwzx r3, r13, r3
498; LARGE64-NEXT:    lwz r4, 0(r4)
499; LARGE64-NEXT:    add r3, r4, r3
500; LARGE64-NEXT:    extsw r3, r3
501; LARGE64-NEXT:    blr
502;
503; SMALL32-LABEL: loadTLUninit2:
504; SMALL32:       # %bb.0: # %entry
505; SMALL32-NEXT:    mflr r0
506; SMALL32-NEXT:    stwu r1, -32(r1)
507; SMALL32-NEXT:    lwz r4, L..C2(r2) # target-flags(ppc-tprel) @ThreadLocalVarUninit
508; SMALL32-NEXT:    stw r0, 40(r1)
509; SMALL32-NEXT:    bla .__get_tpointer[PR]
510; SMALL32-NEXT:    lwzx r3, r3, r4
511; SMALL32-NEXT:    lwz r4, L..C4(r2) # @VarInit
512; SMALL32-NEXT:    lwz r4, 0(r4)
513; SMALL32-NEXT:    add r3, r4, r3
514; SMALL32-NEXT:    addi r1, r1, 32
515; SMALL32-NEXT:    lwz r0, 8(r1)
516; SMALL32-NEXT:    mtlr r0
517; SMALL32-NEXT:    blr
518;
519; LARGE32-LABEL: loadTLUninit2:
520; LARGE32:       # %bb.0: # %entry
521; LARGE32-NEXT:    mflr r0
522; LARGE32-NEXT:    stwu r1, -32(r1)
523; LARGE32-NEXT:    stw r0, 40(r1)
524; LARGE32-NEXT:    addis r3, L..C2@u(r2)
525; LARGE32-NEXT:    lwz r4, L..C2@l(r3)
526; LARGE32-NEXT:    bla .__get_tpointer[PR]
527; LARGE32-NEXT:    lwzx r3, r3, r4
528; LARGE32-NEXT:    addis r4, L..C4@u(r2)
529; LARGE32-NEXT:    lwz r4, L..C4@l(r4)
530; LARGE32-NEXT:    lwz r4, 0(r4)
531; LARGE32-NEXT:    add r3, r4, r3
532; LARGE32-NEXT:    addi r1, r1, 32
533; LARGE32-NEXT:    lwz r0, 8(r1)
534; LARGE32-NEXT:    mtlr r0
535; LARGE32-NEXT:    blr
536entry:
537  %0 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @ThreadLocalVarUninit)
538  %1 = load i32, ptr %0, align 4
539  %2 = load i32, ptr @VarInit, align 4
540  %add = add nsw i32 %2, %1
541  ret i32 %add
542}
543
544define signext i32 @loadTLInit() {
545; SMALL64-LABEL: loadTLInit:
546; SMALL64:       # %bb.0: # %entry
547; SMALL64-NEXT:    ld r3, L..C3(r2) # target-flags(ppc-tprel) @ThreadLocalVarInit
548; SMALL64-NEXT:    lwax r3, r13, r3
549; SMALL64-NEXT:    blr
550;
551; LARGE64-LABEL: loadTLInit:
552; LARGE64:       # %bb.0: # %entry
553; LARGE64-NEXT:    addis r3, L..C3@u(r2)
554; LARGE64-NEXT:    ld r3, L..C3@l(r3)
555; LARGE64-NEXT:    lwax r3, r13, r3
556; LARGE64-NEXT:    blr
557;
558; SMALL32-LABEL: loadTLInit:
559; SMALL32:       # %bb.0: # %entry
560; SMALL32-NEXT:    mflr r0
561; SMALL32-NEXT:    stwu r1, -32(r1)
562; SMALL32-NEXT:    lwz r4, L..C3(r2) # target-flags(ppc-tprel) @ThreadLocalVarInit
563; SMALL32-NEXT:    stw r0, 40(r1)
564; SMALL32-NEXT:    bla .__get_tpointer[PR]
565; SMALL32-NEXT:    lwzx r3, r3, r4
566; SMALL32-NEXT:    addi r1, r1, 32
567; SMALL32-NEXT:    lwz r0, 8(r1)
568; SMALL32-NEXT:    mtlr r0
569; SMALL32-NEXT:    blr
570;
571; LARGE32-LABEL: loadTLInit:
572; LARGE32:       # %bb.0: # %entry
573; LARGE32-NEXT:    mflr r0
574; LARGE32-NEXT:    stwu r1, -32(r1)
575; LARGE32-NEXT:    stw r0, 40(r1)
576; LARGE32-NEXT:    addis r3, L..C3@u(r2)
577; LARGE32-NEXT:    lwz r4, L..C3@l(r3)
578; LARGE32-NEXT:    bla .__get_tpointer[PR]
579; LARGE32-NEXT:    lwzx r3, r3, r4
580; LARGE32-NEXT:    addi r1, r1, 32
581; LARGE32-NEXT:    lwz r0, 8(r1)
582; LARGE32-NEXT:    mtlr r0
583; LARGE32-NEXT:    blr
584entry:
585  %0 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @ThreadLocalVarInit)
586  %1 = load i32, ptr %0, align 4
587  ret i32 %1
588}
589
590define signext i32 @loadTLInit2() {
591; SMALL64-LABEL: loadTLInit2:
592; SMALL64:       # %bb.0: # %entry
593; SMALL64-NEXT:    ld r3, L..C3(r2) # target-flags(ppc-tprel) @ThreadLocalVarInit
594; SMALL64-NEXT:    ld r4, L..C4(r2) # @VarInit
595; SMALL64-NEXT:    lwzx r3, r13, r3
596; SMALL64-NEXT:    lwz r4, 0(r4)
597; SMALL64-NEXT:    add r3, r4, r3
598; SMALL64-NEXT:    extsw r3, r3
599; SMALL64-NEXT:    blr
600;
601; LARGE64-LABEL: loadTLInit2:
602; LARGE64:       # %bb.0: # %entry
603; LARGE64-NEXT:    addis r3, L..C3@u(r2)
604; LARGE64-NEXT:    addis r4, L..C4@u(r2)
605; LARGE64-NEXT:    ld r3, L..C3@l(r3)
606; LARGE64-NEXT:    ld r4, L..C4@l(r4)
607; LARGE64-NEXT:    lwzx r3, r13, r3
608; LARGE64-NEXT:    lwz r4, 0(r4)
609; LARGE64-NEXT:    add r3, r4, r3
610; LARGE64-NEXT:    extsw r3, r3
611; LARGE64-NEXT:    blr
612;
613; SMALL32-LABEL: loadTLInit2:
614; SMALL32:       # %bb.0: # %entry
615; SMALL32-NEXT:    mflr r0
616; SMALL32-NEXT:    stwu r1, -32(r1)
617; SMALL32-NEXT:    lwz r4, L..C3(r2) # target-flags(ppc-tprel) @ThreadLocalVarInit
618; SMALL32-NEXT:    stw r0, 40(r1)
619; SMALL32-NEXT:    bla .__get_tpointer[PR]
620; SMALL32-NEXT:    lwzx r3, r3, r4
621; SMALL32-NEXT:    lwz r4, L..C4(r2) # @VarInit
622; SMALL32-NEXT:    lwz r4, 0(r4)
623; SMALL32-NEXT:    add r3, r4, r3
624; SMALL32-NEXT:    addi r1, r1, 32
625; SMALL32-NEXT:    lwz r0, 8(r1)
626; SMALL32-NEXT:    mtlr r0
627; SMALL32-NEXT:    blr
628;
629; LARGE32-LABEL: loadTLInit2:
630; LARGE32:       # %bb.0: # %entry
631; LARGE32-NEXT:    mflr r0
632; LARGE32-NEXT:    stwu r1, -32(r1)
633; LARGE32-NEXT:    stw r0, 40(r1)
634; LARGE32-NEXT:    addis r3, L..C3@u(r2)
635; LARGE32-NEXT:    lwz r4, L..C3@l(r3)
636; LARGE32-NEXT:    bla .__get_tpointer[PR]
637; LARGE32-NEXT:    lwzx r3, r3, r4
638; LARGE32-NEXT:    addis r4, L..C4@u(r2)
639; LARGE32-NEXT:    lwz r4, L..C4@l(r4)
640; LARGE32-NEXT:    lwz r4, 0(r4)
641; LARGE32-NEXT:    add r3, r4, r3
642; LARGE32-NEXT:    addi r1, r1, 32
643; LARGE32-NEXT:    lwz r0, 8(r1)
644; LARGE32-NEXT:    mtlr r0
645; LARGE32-NEXT:    blr
646entry:
647  %0 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @ThreadLocalVarInit)
648  %1 = load i32, ptr %0, align 4
649  %2 = load i32, ptr @VarInit, align 4
650  %add = add nsw i32 %2, %1
651  ret i32 %add
652}
653
654; TOC Entry Checks.
655
656; SMALL64-LABEL: .toc
657; SMALL64-LABEL: L..C0:
658; SMALL64-NEXT: .tc IThreadLocalVarUninit[TC],IThreadLocalVarUninit[UL]@le
659; SMALL64-LABEL: L..C1:
660; SMALL64-NEXT: .tc IThreadLocalVarInit[TC],IThreadLocalVarInit[TL]@le
661; SMALL64-LABEL: L..C2:
662; SMALL64-NEXT: .tc ThreadLocalVarUninit[TC],ThreadLocalVarUninit[TL]@le
663; SMALL64-LABEL: L..C3:
664; SMALL64-NEXT: .tc ThreadLocalVarInit[TC],ThreadLocalVarInit[TL]@le
665; SMALL64-LABEL: L..C4:
666; SMALL64-NEXT: .tc VarInit[TC],VarInit[RW]
667
668; LARGE64-LABEL: .toc
669; LARGE64-LABEL: L..C0:
670; LARGE64-NEXT: .tc IThreadLocalVarUninit[TE],IThreadLocalVarUninit[UL]@le
671; LARGE64-LABEL: L..C1:
672; LARGE64-NEXT: .tc IThreadLocalVarInit[TE],IThreadLocalVarInit[TL]@le
673; LARGE64-LABEL: L..C2:
674; LARGE64-NEXT: .tc ThreadLocalVarUninit[TE],ThreadLocalVarUninit[TL]@le
675; LARGE64-LABEL: L..C3:
676; LARGE64-NEXT: .tc ThreadLocalVarInit[TE],ThreadLocalVarInit[TL]@le
677; LARGE64-LABEL: L..C4:
678; LARGE64-NEXT: .tc VarInit[TE],VarInit[RW]
679
680; SMALL32-LABEL: .toc
681; SMALL32-LABEL: L..C0:
682; SMALL32-NEXT: .tc IThreadLocalVarUninit[TC],IThreadLocalVarUninit[UL]@le
683; SMALL32-LABEL: L..C1:
684; SMALL32-NEXT: .tc IThreadLocalVarInit[TC],IThreadLocalVarInit[TL]@le
685; SMALL32-LABEL: L..C2:
686; SMALL32-NEXT: .tc ThreadLocalVarUninit[TC],ThreadLocalVarUninit[TL]@le
687; SMALL32-LABEL: L..C3:
688; SMALL32-NEXT: .tc ThreadLocalVarInit[TC],ThreadLocalVarInit[TL]@le
689; SMALL32-LABEL: L..C4:
690; SMALL32-NEXT: .tc VarInit[TC],VarInit[RW]
691
692; LARGE32-LABEL: .toc
693; LARGE32-LABEL: L..C0:
694; LARGE32-NEXT: .tc IThreadLocalVarUninit[TE],IThreadLocalVarUninit[UL]@le
695; LARGE32-LABEL: L..C1:
696; LARGE32-NEXT: .tc IThreadLocalVarInit[TE],IThreadLocalVarInit[TL]@le
697; LARGE32-LABEL: L..C2:
698; LARGE32-NEXT: .tc ThreadLocalVarUninit[TE],ThreadLocalVarUninit[TL]@le
699; LARGE32-LABEL: L..C3:
700; LARGE32-NEXT: .tc ThreadLocalVarInit[TE],ThreadLocalVarInit[TL]@le
701; LARGE32-LABEL: L..C4:
702; LARGE32-NEXT: .tc VarInit[TE],VarInit[RW]
703