xref: /llvm-project/llvm/test/CodeGen/PowerPC/aix-small-local-exec-tls-largeaccess.ll (revision 6bbccd2516c3a843809a8303da48abce58a88855)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 3
2; RUN: llc  -verify-machineinstrs -mcpu=pwr7 -ppc-asm-full-reg-names \
3; RUN:      -mtriple powerpc64-ibm-aix-xcoff -mattr=+aix-small-local-exec-tls < %s \
4; RUN:      | FileCheck %s --check-prefix=SMALL-LOCAL-EXEC-SMALLCM64
5; RUN: llc  -verify-machineinstrs -mcpu=pwr7 -ppc-asm-full-reg-names \
6; RUN:      -mtriple powerpc64-ibm-aix-xcoff --code-model=large \
7; RUN:      -mattr=+aix-small-local-exec-tls < %s | FileCheck %s \
8; RUN:      --check-prefix=SMALL-LOCAL-EXEC-LARGECM64
9
10; Test disassembly of object.
11; RUN: llc -verify-machineinstrs -mcpu=pwr7 -mattr=+aix-small-local-exec-tls \
12; RUN:      -mtriple powerpc64-ibm-aix-xcoff -xcoff-traceback-table=false \
13; RUN:      --code-model=large -filetype=obj -o %t.o < %s
14; RUN: llvm-objdump -D -r --symbol-description %t.o | FileCheck -D#NFA=2 --check-prefix=DIS %s
15
16@mySmallLocalExecTLSv1 = thread_local(localexec) global [8187 x i32] zeroinitializer, align 4
17@mySmallLocalExecTLS2 = thread_local(localexec) global [4000 x i32] zeroinitializer, align 4
18@mySmallLocalExecTLS3 = thread_local(localexec) global [4000 x i32] zeroinitializer, align 4
19@mySmallLocalExecTLS4 = thread_local(localexec) global [4000 x i32] zeroinitializer, align 4
20@mySmallLocalExecTLS5 = thread_local(localexec) global [4000 x i32] zeroinitializer, align 4
21@mySmallLocalExecTLSv2 = thread_local(localexec) global [9000 x i32] zeroinitializer, align 4
22declare nonnull ptr @llvm.threadlocal.address.p0(ptr nonnull) #1
23
24; All accesses use a "faster" local-exec sequence directly off the thread pointer.
25define signext i32 @StoreArrays1() {
26; SMALL-LOCAL-EXEC-SMALLCM64-LABEL: StoreArrays1:
27; SMALL-LOCAL-EXEC-SMALLCM64:       # %bb.0: # %entry
28; SMALL-LOCAL-EXEC-SMALLCM64-NEXT:    li r3, 1
29; SMALL-LOCAL-EXEC-SMALLCM64-NEXT:    li r4, 4
30; SMALL-LOCAL-EXEC-SMALLCM64-NEXT:    stw r3, mySmallLocalExecTLSv1[TL]@le(r13)
31; SMALL-LOCAL-EXEC-SMALLCM64-NEXT:    li r3, 2
32; SMALL-LOCAL-EXEC-SMALLCM64-NEXT:    stw r4, mySmallLocalExecTLSv1[TL]@le+24(r13)
33; SMALL-LOCAL-EXEC-SMALLCM64-NEXT:    stw r4, (mySmallLocalExecTLS4[TL]@le+328)-65536(r13)
34; SMALL-LOCAL-EXEC-SMALLCM64-NEXT:    stw r3, (mySmallLocalExecTLS2[TL]@le+320)-65536(r13)
35; SMALL-LOCAL-EXEC-SMALLCM64-NEXT:    li r3, 3
36; SMALL-LOCAL-EXEC-SMALLCM64-NEXT:    stw r3, (mySmallLocalExecTLS3[TL]@le+324)-65536(r13)
37; SMALL-LOCAL-EXEC-SMALLCM64-NEXT:    li r3, 88
38; SMALL-LOCAL-EXEC-SMALLCM64-NEXT:    stw r3, (mySmallLocalExecTLS5[TL]@le+332)-65536(r13)
39; SMALL-LOCAL-EXEC-SMALLCM64-NEXT:    li r3, 102
40; SMALL-LOCAL-EXEC-SMALLCM64-NEXT:    blr
41;
42; SMALL-LOCAL-EXEC-LARGECM64-LABEL: StoreArrays1:
43; SMALL-LOCAL-EXEC-LARGECM64:       # %bb.0: # %entry
44; SMALL-LOCAL-EXEC-LARGECM64-NEXT:    li r3, 1
45; SMALL-LOCAL-EXEC-LARGECM64-NEXT:    li r4, 4
46; SMALL-LOCAL-EXEC-LARGECM64-NEXT:    stw r3, mySmallLocalExecTLSv1[TL]@le(r13)
47; SMALL-LOCAL-EXEC-LARGECM64-NEXT:    li r3, 2
48; SMALL-LOCAL-EXEC-LARGECM64-NEXT:    stw r4, mySmallLocalExecTLSv1[TL]@le+24(r13)
49; SMALL-LOCAL-EXEC-LARGECM64-NEXT:    stw r4, (mySmallLocalExecTLS4[TL]@le+328)-65536(r13)
50; SMALL-LOCAL-EXEC-LARGECM64-NEXT:    stw r3, (mySmallLocalExecTLS2[TL]@le+320)-65536(r13)
51; SMALL-LOCAL-EXEC-LARGECM64-NEXT:    li r3, 3
52; SMALL-LOCAL-EXEC-LARGECM64-NEXT:    stw r3, (mySmallLocalExecTLS3[TL]@le+324)-65536(r13)
53; SMALL-LOCAL-EXEC-LARGECM64-NEXT:    li r3, 88
54; SMALL-LOCAL-EXEC-LARGECM64-NEXT:    stw r3, (mySmallLocalExecTLS5[TL]@le+332)-65536(r13)
55; SMALL-LOCAL-EXEC-LARGECM64-NEXT:    li r3, 102
56; SMALL-LOCAL-EXEC-LARGECM64-NEXT:    blr
57entry:
58  %0 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @mySmallLocalExecTLSv1)
59  store i32 1, ptr %0, align 4
60  %arrayidx1 = getelementptr inbounds [8187 x i32], ptr %0, i64 0, i64 6
61  store i32 4, ptr %arrayidx1, align 4
62  %1 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @mySmallLocalExecTLS2)
63  %arrayidx2 = getelementptr inbounds [4000 x i32], ptr %1, i64 0, i64 80
64  store i32 2, ptr %arrayidx2, align 4
65  %2 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @mySmallLocalExecTLS3)
66  %arrayidx3 = getelementptr inbounds [4000 x i32], ptr %2, i64 0, i64 81
67  store i32 3, ptr %arrayidx3, align 4
68  %3 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @mySmallLocalExecTLS4)
69  %arrayidx4 = getelementptr inbounds [4000 x i32], ptr %3, i64 0, i64 82
70  store i32 4, ptr %arrayidx4, align 4
71  %4 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @mySmallLocalExecTLS5)
72  %arrayidx5 = getelementptr inbounds [4000 x i32], ptr %4, i64 0, i64 83
73  store i32 88, ptr %arrayidx5, align 4
74  %5 = load i32, ptr %0, align 4
75  %6 = load i32, ptr %arrayidx1, align 4
76  %7 = load i32, ptr %arrayidx2, align 4
77  %8 = load i32, ptr %arrayidx3, align 4
78  %9 = load i32, ptr %arrayidx4, align 4
79  %add = add i32 %5, 88
80  %add9 = add i32 %add, %6
81  %add11 = add i32 %add9, %7
82  %add13 = add i32 %add11, %8
83  %add15 = add i32 %add13, %9
84  ret i32 %add15
85}
86
87; Example of one access using the regular local-exec access from the TOC.
88define signext i32 @StoreArrays2() {
89; SMALL-LOCAL-EXEC-SMALLCM64-LABEL: StoreArrays2:
90; SMALL-LOCAL-EXEC-SMALLCM64:       # %bb.0: # %entry
91; SMALL-LOCAL-EXEC-SMALLCM64-NEXT:    li r4, 2
92; SMALL-LOCAL-EXEC-SMALLCM64-NEXT:    li r3, 1
93; SMALL-LOCAL-EXEC-SMALLCM64-NEXT:    stw r4, (mySmallLocalExecTLS2[TL]@le+320)-65536(r13)
94; SMALL-LOCAL-EXEC-SMALLCM64-NEXT:    li r4, 3
95; SMALL-LOCAL-EXEC-SMALLCM64-NEXT:    stw r4, (mySmallLocalExecTLS3[TL]@le+324)-65536(r13)
96; SMALL-LOCAL-EXEC-SMALLCM64-NEXT:    ld r4, L..C0(r2) # target-flags(ppc-tprel) @mySmallLocalExecTLSv2
97; SMALL-LOCAL-EXEC-SMALLCM64-NEXT:    add r4, r13, r4
98; SMALL-LOCAL-EXEC-SMALLCM64-NEXT:    stw r3, 0(r4)
99; SMALL-LOCAL-EXEC-SMALLCM64-NEXT:    li r3, 4
100; SMALL-LOCAL-EXEC-SMALLCM64-NEXT:    stw r3, 24(r4)
101; SMALL-LOCAL-EXEC-SMALLCM64-NEXT:    li r4, 88
102; SMALL-LOCAL-EXEC-SMALLCM64-NEXT:    stw r3, (mySmallLocalExecTLS4[TL]@le+328)-65536(r13)
103; SMALL-LOCAL-EXEC-SMALLCM64-NEXT:    li r3, 102
104; SMALL-LOCAL-EXEC-SMALLCM64-NEXT:    stw r4, (mySmallLocalExecTLS5[TL]@le+332)-65536(r13)
105; SMALL-LOCAL-EXEC-SMALLCM64-NEXT:    blr
106;
107; SMALL-LOCAL-EXEC-LARGECM64-LABEL: StoreArrays2:
108; SMALL-LOCAL-EXEC-LARGECM64:       # %bb.0: # %entry
109; SMALL-LOCAL-EXEC-LARGECM64-NEXT:    li r3, 2
110; SMALL-LOCAL-EXEC-LARGECM64-NEXT:    li r4, 3
111; SMALL-LOCAL-EXEC-LARGECM64-NEXT:    stw r3, (mySmallLocalExecTLS2[TL]@le+320)-65536(r13)
112; SMALL-LOCAL-EXEC-LARGECM64-NEXT:    addis r3, L..C0@u(r2)
113; SMALL-LOCAL-EXEC-LARGECM64-NEXT:    ld r3, L..C0@l(r3)
114; SMALL-LOCAL-EXEC-LARGECM64-NEXT:    stw r4, (mySmallLocalExecTLS3[TL]@le+324)-65536(r13)
115; SMALL-LOCAL-EXEC-LARGECM64-NEXT:    li r4, 1
116; SMALL-LOCAL-EXEC-LARGECM64-NEXT:    add r3, r13, r3
117; SMALL-LOCAL-EXEC-LARGECM64-NEXT:    stw r4, 0(r3)
118; SMALL-LOCAL-EXEC-LARGECM64-NEXT:    li r4, 4
119; SMALL-LOCAL-EXEC-LARGECM64-NEXT:    stw r4, 24(r3)
120; SMALL-LOCAL-EXEC-LARGECM64-NEXT:    li r3, 88
121; SMALL-LOCAL-EXEC-LARGECM64-NEXT:    stw r4, (mySmallLocalExecTLS4[TL]@le+328)-65536(r13)
122; SMALL-LOCAL-EXEC-LARGECM64-NEXT:    stw r3, (mySmallLocalExecTLS5[TL]@le+332)-65536(r13)
123; SMALL-LOCAL-EXEC-LARGECM64-NEXT:    li r3, 102
124; SMALL-LOCAL-EXEC-LARGECM64-NEXT:    blr
125entry:
126  %0 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @mySmallLocalExecTLSv2)
127  store i32 1, ptr %0, align 4
128  %arrayidx1 = getelementptr inbounds [9000 x i32], ptr %0, i64 0, i64 6
129  store i32 4, ptr %arrayidx1, align 4
130  %1 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @mySmallLocalExecTLS2)
131  %arrayidx2 = getelementptr inbounds [4000 x i32], ptr %1, i64 0, i64 80
132  store i32 2, ptr %arrayidx2, align 4
133  %2 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @mySmallLocalExecTLS3)
134  %arrayidx3 = getelementptr inbounds [4000 x i32], ptr %2, i64 0, i64 81
135  store i32 3, ptr %arrayidx3, align 4
136  %3 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @mySmallLocalExecTLS4)
137  %arrayidx4 = getelementptr inbounds [4000 x i32], ptr %3, i64 0, i64 82
138  store i32 4, ptr %arrayidx4, align 4
139  %4 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @mySmallLocalExecTLS5)
140  %arrayidx5 = getelementptr inbounds [4000 x i32], ptr %4, i64 0, i64 83
141  store i32 88, ptr %arrayidx5, align 4
142  %5 = load i32, ptr %0, align 4
143  %6 = load i32, ptr %arrayidx1, align 4
144  %7 = load i32, ptr %arrayidx2, align 4
145  %8 = load i32, ptr %arrayidx3, align 4
146  %9 = load i32, ptr %arrayidx4, align 4
147  %add = add i32 %5, 88
148  %add9 = add i32 %add, %6
149  %add11 = add i32 %add9, %7
150  %add13 = add i32 %add11, %8
151  %add15 = add i32 %add13, %9
152  ret i32 %add15
153}
154
155; DIS:      file format aix5coff64-rs6000
156; DIS:      Disassembly of section .text:
157; DIS:      0000000000000000 (idx: [[#NFA+3]]) .StoreArrays1:
158; DIS-NEXT: [[#%x, ADDR:]]: {{.*}}                li 3, 1
159; DIS-NEXT: [[#%x, ADDR:]]: {{.*}}                li 4, 4
160; DIS-NEXT: [[#%x, ADDR:]]: {{.*}}                stw 3, 0(13)
161; DIS-NEXT: {{0*}}[[#ADDR + 2]]: R_TLS_LE	(idx: [[#NFA+15]]) mySmallLocalExecTLSv1[TL]
162; DIS-NEXT: [[#%x, ADDR:]]: {{.*}}                li 3, 2
163; DIS-NEXT: [[#%x, ADDR:]]: {{.*}}                stw 4, 24(13)
164; DIS-NEXT: {{0*}}[[#ADDR + 2]]: R_TLS_LE	(idx: [[#NFA+15]]) mySmallLocalExecTLSv1[TL]
165; DIS-NEXT: [[#%x, ADDR:]]: {{.*}}                stw 4, -460(13)
166; DIS-NEXT: {{0*}}[[#ADDR + 2]]: R_TLS_LE	(idx: [[#NFA+21]]) mySmallLocalExecTLS4[TL]
167; DIS-NEXT: [[#%x, ADDR:]]: {{.*}}                stw 3, -32468(13)
168; DIS-NEXT: {{0*}}[[#ADDR + 2]]: R_TLS_LE	(idx: [[#NFA+17]]) mySmallLocalExecTLS2[TL]
169; DIS-NEXT: [[#%x, ADDR:]]: {{.*}}                li 3, 3
170; DIS-NEXT: [[#%x, ADDR:]]: {{.*}}                stw 3, -16464(13)
171; DIS-NEXT: {{0*}}[[#ADDR + 2]]: R_TLS_LE	(idx: [[#NFA+19]]) mySmallLocalExecTLS3[TL]
172; DIS-NEXT: [[#%x, ADDR:]]: {{.*}}                li 3, 88
173; DIS-NEXT: [[#%x, ADDR:]]: {{.*}}                stw 3, 15544(13)
174; DIS-NEXT: {{0*}}[[#ADDR + 2]]: R_TLS_LE	(idx: [[#NFA+23]]) mySmallLocalExecTLS5[TL]
175; DIS-NEXT: [[#%x, ADDR:]]: {{.*}}                li 3, 102
176; DIS-NEXT: [[#%x, ADDR:]]: {{.*}}                blr
177
178; DIS:      0000000000000040 (idx: [[#NFA+5]]) .StoreArrays2:
179; DIS-NEXT: [[#%x, ADDR:]]: {{.*}}                li 3, 2
180; DIS-NEXT: [[#%x, ADDR:]]: {{.*}}                li 4, 3
181; DIS-NEXT: [[#%x, ADDR:]]: {{.*}}                stw 3, -32468(13)
182; DIS-NEXT: {{0*}}[[#ADDR + 2]]: R_TLS_LE	(idx: [[#NFA+17]]) mySmallLocalExecTLS2[TL]
183; DIS-NEXT: [[#%x, ADDR:]]: {{.*}}                addis 3, 2, 0
184; DIS-NEXT: {{0*}}[[#ADDR + 2]]: R_TOCU	(idx: [[#NFA+13]]) mySmallLocalExecTLSv2[TE]
185; DIS-NEXT: [[#%x, ADDR:]]: {{.*}}                ld 3, 0(3)
186; DIS-NEXT: {{0*}}[[#ADDR + 2]]: R_TOCL	(idx: [[#NFA+13]]) mySmallLocalExecTLSv2[TE]
187; DIS-NEXT: [[#%x, ADDR:]]: {{.*}}                stw 4, -16464(13)
188; DIS-NEXT: {{0*}}[[#ADDR + 2]]: R_TLS_LE	(idx: [[#NFA+19]]) mySmallLocalExecTLS3[TL]
189; DIS-NEXT: [[#%x, ADDR:]]: {{.*}}                li 4, 1
190; DIS-NEXT: [[#%x, ADDR:]]: {{.*}}                add 3, 13, 3
191; DIS-NEXT: [[#%x, ADDR:]]: {{.*}}                stw 4, 0(3)
192; DIS-NEXT: [[#%x, ADDR:]]: {{.*}}                li 4, 4
193; DIS-NEXT: [[#%x, ADDR:]]: {{.*}}                stw 4, 24(3)
194; DIS-NEXT: [[#%x, ADDR:]]: {{.*}}                li 3, 88
195; DIS-NEXT: [[#%x, ADDR:]]: {{.*}}                stw 4, -460(13)
196; DIS-NEXT: {{0*}}[[#ADDR + 2]]: R_TLS_LE	(idx: [[#NFA+21]]) mySmallLocalExecTLS4[TL]
197; DIS-NEXT: [[#%x, ADDR:]]: {{.*}}                stw 3, 15544(13)
198; DIS-NEXT: {{0*}}[[#ADDR + 2]]: R_TLS_LE	(idx: [[#NFA+23]]) mySmallLocalExecTLS5[TL]
199; DIS-NEXT: [[#%x, ADDR:]]: {{.*}}                li 3, 102
200; DIS-NEXT: [[#%x, ADDR:]]: {{.*}}                blr
201
202; DIS:      Disassembly of section .data:
203; DIS:      0000000000000080 (idx: [[#NFA+7]]) StoreArrays1[DS]:
204; DIS-NEXT:       80: 00 00 00 00
205; DIS-NEXT: 0000000000000080:  R_POS	(idx: [[#NFA+3]]) .StoreArrays1
206; DIS-NEXT:       84: 00 00 00 00
207; DIS-NEXT:       88: 00 00 00 00
208; DIS-NEXT: 0000000000000088:  R_POS        (idx: [[#NFA+11]]) TOC[TC0]
209; DIS-NEXT:       8c: 00 00 00 b0
210
211; DIS:      0000000000000098 (idx: [[#NFA+9]]) StoreArrays2[DS]:
212; DIS-NEXT:       98: 00 00 00 00
213; DIS-NEXT: 0000000000000098:  R_POS	(idx: [[#NFA+5]]) .StoreArrays2
214; DIS-NEXT:       9c: 00 00 00 40
215; DIS-NEXT:       a0: 00 00 00 00
216; DIS-NEXT: 00000000000000a0:  R_POS        (idx: [[#NFA+11]]) TOC[TC0]
217; DIS-NEXT:       a4: 00 00 00 b0
218
219; DIS:      00000000000000b0 (idx: [[#NFA+13]]) mySmallLocalExecTLSv2[TE]:
220; DIS-NEXT:       b0: 00 00 00 00
221; DIS-NEXT: 00000000000000b0:  R_TLS_LE     (idx: [[#NFA+25]]) mySmallLocalExecTLSv2[TL]
222; DIS-NEXT:       b4: 00 01 79 ec
223
224; DIS:      Disassembly of section .tdata:
225; DIS:      0000000000000000 (idx: [[#NFA+15]]) mySmallLocalExecTLSv1[TL]:
226; DIS:      0000000000007fec (idx: [[#NFA+17]]) mySmallLocalExecTLS2[TL]:
227; DIS:      000000000000be6c (idx: [[#NFA+19]]) mySmallLocalExecTLS3[TL]:
228; DIS:      000000000000fcec (idx: [[#NFA+21]]) mySmallLocalExecTLS4[TL]:
229; DIS:      0000000000013b6c (idx: [[#NFA+23]]) mySmallLocalExecTLS5[TL]:
230; DIS:      00000000000179ec (idx: [[#NFA+25]]) mySmallLocalExecTLSv2[TL]:
231