Skip to content

Commit 6bbccd2

Browse files
authored
GlobalsModRef, ValueTracking: Look through threadlocal.address intrinsic (#88418)
This improves handling of `threadlocal.address` intrinsic in analyses: The thread-id cannot change within a function with the exception of suspend points of pre-split coroutines. This changes `llvm::getUnderlyingObject` to look through `threadlocal.address` in these cases. `GlobalsAAResult::AnalyzeUsesOfPointer` checks whether an address can be traced to simple loads/stores or escapes to other places. Starting the analysis from a thread-local `GlobalValue` the `threadlocal.address` intrinsic is safe to skip here. This improves issue #87437
1 parent 41e6962 commit 6bbccd2

File tree

8 files changed

+135
-62
lines changed

8 files changed

+135
-62
lines changed

llvm/include/llvm/Analysis/ValueTracking.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -690,11 +690,11 @@ inline Value *getArgumentAliasingToReturnedPointer(CallBase *Call,
690690
bool isIntrinsicReturningPointerAliasingArgumentWithoutCapturing(
691691
const CallBase *Call, bool MustPreserveNullness);
692692

693-
/// This method strips off any GEP address adjustments and pointer casts from
694-
/// the specified value, returning the original object being addressed. Note
695-
/// that the returned value has pointer type if the specified value does. If
696-
/// the MaxLookup value is non-zero, it limits the number of instructions to
697-
/// be stripped off.
693+
/// This method strips off any GEP address adjustments, pointer casts
694+
/// or `llvm.threadlocal.address` from the specified value \p V, returning the
695+
/// original object being addressed. Note that the returned value has pointer
696+
/// type if the specified value does. If the \p MaxLookup value is non-zero, it
697+
/// limits the number of instructions to be stripped off.
698698
const Value *getUnderlyingObject(const Value *V, unsigned MaxLookup = 6);
699699
inline Value *getUnderlyingObject(Value *V, unsigned MaxLookup = 6) {
700700
// Force const to avoid infinite recursion.

llvm/lib/Analysis/GlobalsModRef.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -344,6 +344,14 @@ bool GlobalsAAResult::AnalyzeUsesOfPointer(Value *V,
344344
if (AnalyzeUsesOfPointer(I, Readers, Writers, OkayStoreDest))
345345
return true;
346346
} else if (auto *Call = dyn_cast<CallBase>(I)) {
347+
if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(I)) {
348+
if (II->getIntrinsicID() == Intrinsic::threadlocal_address &&
349+
V == II->getArgOperand(0)) {
350+
if (AnalyzeUsesOfPointer(II, Readers, Writers))
351+
return true;
352+
continue;
353+
}
354+
}
347355
// Make sure that this is just the function being called, not that it is
348356
// passing into the function.
349357
if (Call->isDataOperand(&U)) {

llvm/lib/Analysis/ValueTracking.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6255,6 +6255,10 @@ bool llvm::isIntrinsicReturningPointerAliasingArgumentWithoutCapturing(
62556255
return true;
62566256
case Intrinsic::ptrmask:
62576257
return !MustPreserveNullness;
6258+
case Intrinsic::threadlocal_address:
6259+
// The underlying variable changes with thread ID. The Thread ID may change
6260+
// at coroutine suspend points.
6261+
return !Call->getParent()->getParent()->isPresplitCoroutine();
62586262
default:
62596263
return false;
62606264
}

llvm/test/Analysis/GlobalsModRef/nonescaping-noalias.ll

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,67 @@ entry:
2222
ret i32 %v
2323
}
2424

25+
@g1_tls = internal thread_local global i32 0
26+
27+
define i32 @test1_tls(ptr %param) {
28+
; Ensure that we can fold a store to a load of a global across a store to
29+
; a parameter when the global is non-escaping.
30+
;
31+
; CHECK-LABEL: define i32 @test1_tls(
32+
; CHECK-SAME: ptr [[PARAM:%.*]]) {
33+
; CHECK-NEXT: entry:
34+
; CHECK-NEXT: [[P:%.*]] = call ptr @llvm.threadlocal.address.p0(ptr @g1_tls)
35+
; CHECK-NEXT: store i32 42, ptr [[P]], align 4
36+
; CHECK-NEXT: store i32 7, ptr [[PARAM]], align 4
37+
; CHECK-NEXT: ret i32 42
38+
;
39+
entry:
40+
%p = call ptr @llvm.threadlocal.address(ptr @g1_tls)
41+
store i32 42, ptr %p
42+
store i32 7, ptr %param
43+
%p2 = call ptr @llvm.threadlocal.address(ptr @g1_tls)
44+
%v = load i32, ptr %p2
45+
ret i32 %v
46+
}
47+
48+
define ptr @test1_tls_noopt(ptr %coro, ptr %param) presplitcoroutine {
49+
; CHECK-LABEL: define ptr @test1_tls_noopt(
50+
; CHECK-SAME: ptr [[CORO:%.*]], ptr [[PARAM:%.*]]) #[[ATTR0:[0-9]+]] {
51+
; CHECK-NEXT: entry:
52+
; CHECK-NEXT: [[P:%.*]] = call ptr @llvm.threadlocal.address.p0(ptr @g1_tls)
53+
; CHECK-NEXT: store i32 42, ptr [[P]], align 4
54+
; CHECK-NEXT: [[TMP0:%.*]] = call i8 @llvm.coro.suspend(token none, i1 false)
55+
; CHECK-NEXT: switch i8 [[TMP0]], label [[SUSPEND:%.*]] [
56+
; CHECK-NEXT: i8 0, label [[RESUME:%.*]]
57+
; CHECK-NEXT: i8 1, label [[SUSPEND]]
58+
; CHECK-NEXT: ]
59+
; CHECK: resume:
60+
; CHECK-NEXT: [[P2:%.*]] = call ptr @llvm.threadlocal.address.p0(ptr @g1_tls)
61+
; CHECK-NEXT: [[V:%.*]] = load i32, ptr [[P2]], align 4
62+
; CHECK-NEXT: store i32 [[V]], ptr [[PARAM]], align 4
63+
; CHECK-NEXT: ret ptr [[CORO]]
64+
; CHECK: suspend:
65+
; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.coro.end(ptr [[CORO]], i1 false, token none)
66+
; CHECK-NEXT: ret ptr [[CORO]]
67+
;
68+
entry:
69+
%p = call ptr @llvm.threadlocal.address(ptr @g1_tls)
70+
store i32 42, ptr %p
71+
72+
%0 = call i8 @llvm.coro.suspend(token none, i1 false)
73+
switch i8 %0, label %suspend [i8 0, label %resume
74+
i8 1, label %suspend]
75+
resume:
76+
%p2 = call ptr @llvm.threadlocal.address(ptr @g1_tls)
77+
%v = load i32, ptr %p2
78+
store i32 %v, ptr %param, align 4
79+
ret ptr %coro
80+
81+
suspend:
82+
call i1 @llvm.coro.end(ptr %coro, i1 0)
83+
ret ptr %coro
84+
}
85+
2586
declare ptr @f()
2687

2788
define i32 @test2() {

llvm/test/CodeGen/PowerPC/aix-small-local-dynamic-tls-largeaccess.ll

Lines changed: 30 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -229,24 +229,24 @@ define signext i32 @test3() {
229229
; SMALL-LOCAL-DYNAMIC-SMALLCM64-NEXT: mflr r0
230230
; SMALL-LOCAL-DYNAMIC-SMALLCM64-NEXT: stdu r1, -48(r1)
231231
; SMALL-LOCAL-DYNAMIC-SMALLCM64-NEXT: ld r3, L..C0(r2) # target-flags(ppc-tlsldm) @"_$TLSML"
232-
; SMALL-LOCAL-DYNAMIC-SMALLCM64-NEXT: ld r8, L..C3(r2) # target-flags(ppc-tlsld) @ElementIntTLSv2
233232
; SMALL-LOCAL-DYNAMIC-SMALLCM64-NEXT: std r0, 64(r1)
233+
; SMALL-LOCAL-DYNAMIC-SMALLCM64-NEXT: li r6, 2
234234
; SMALL-LOCAL-DYNAMIC-SMALLCM64-NEXT: bla .__tls_get_mod[PR]
235235
; SMALL-LOCAL-DYNAMIC-SMALLCM64-NEXT: li r4, 1
236236
; SMALL-LOCAL-DYNAMIC-SMALLCM64-NEXT: la r5, ElementIntTLS2[TL]@ld(r3)
237-
; SMALL-LOCAL-DYNAMIC-SMALLCM64-NEXT: la r6, ElementIntTLS3[TL]@ld(r3)
238-
; SMALL-LOCAL-DYNAMIC-SMALLCM64-NEXT: la r7, ElementIntTLS4[TL]@ld(r3)
239-
; SMALL-LOCAL-DYNAMIC-SMALLCM64-NEXT: la r9, ElementIntTLS5[TL]@ld(r3)
240-
; SMALL-LOCAL-DYNAMIC-SMALLCM64-NEXT: stwux r4, r3, r8
237+
; SMALL-LOCAL-DYNAMIC-SMALLCM64-NEXT: la r7, ElementIntTLS3[TL]@ld(r3)
238+
; SMALL-LOCAL-DYNAMIC-SMALLCM64-NEXT: stw r6, 320(r5)
239+
; SMALL-LOCAL-DYNAMIC-SMALLCM64-NEXT: li r5, 3
240+
; SMALL-LOCAL-DYNAMIC-SMALLCM64-NEXT: la r6, ElementIntTLS4[TL]@ld(r3)
241+
; SMALL-LOCAL-DYNAMIC-SMALLCM64-NEXT: stw r5, 324(r7)
242+
; SMALL-LOCAL-DYNAMIC-SMALLCM64-NEXT: ld r5, L..C3(r2) # target-flags(ppc-tlsld) @ElementIntTLSv2
243+
; SMALL-LOCAL-DYNAMIC-SMALLCM64-NEXT: la r7, ElementIntTLS5[TL]@ld(r3)
244+
; SMALL-LOCAL-DYNAMIC-SMALLCM64-NEXT: stwux r4, r3, r5
241245
; SMALL-LOCAL-DYNAMIC-SMALLCM64-NEXT: li r4, 4
242246
; SMALL-LOCAL-DYNAMIC-SMALLCM64-NEXT: stw r4, 24(r3)
243-
; SMALL-LOCAL-DYNAMIC-SMALLCM64-NEXT: li r3, 2
244-
; SMALL-LOCAL-DYNAMIC-SMALLCM64-NEXT: stw r3, 320(r5)
245-
; SMALL-LOCAL-DYNAMIC-SMALLCM64-NEXT: li r3, 3
246-
; SMALL-LOCAL-DYNAMIC-SMALLCM64-NEXT: stw r3, 324(r6)
247247
; SMALL-LOCAL-DYNAMIC-SMALLCM64-NEXT: li r3, 88
248-
; SMALL-LOCAL-DYNAMIC-SMALLCM64-NEXT: stw r4, 328(r7)
249-
; SMALL-LOCAL-DYNAMIC-SMALLCM64-NEXT: stw r3, 332(r9)
248+
; SMALL-LOCAL-DYNAMIC-SMALLCM64-NEXT: stw r4, 328(r6)
249+
; SMALL-LOCAL-DYNAMIC-SMALLCM64-NEXT: stw r3, 332(r7)
250250
; SMALL-LOCAL-DYNAMIC-SMALLCM64-NEXT: li r3, 102
251251
; SMALL-LOCAL-DYNAMIC-SMALLCM64-NEXT: addi r1, r1, 48
252252
; SMALL-LOCAL-DYNAMIC-SMALLCM64-NEXT: ld r0, 16(r1)
@@ -258,26 +258,26 @@ define signext i32 @test3() {
258258
; SMALL-LOCAL-DYNAMIC-LARGECM64-NEXT: mflr r0
259259
; SMALL-LOCAL-DYNAMIC-LARGECM64-NEXT: stdu r1, -48(r1)
260260
; SMALL-LOCAL-DYNAMIC-LARGECM64-NEXT: addis r3, L..C0@u(r2)
261-
; SMALL-LOCAL-DYNAMIC-LARGECM64-NEXT: addis r6, L..C3@u(r2)
262261
; SMALL-LOCAL-DYNAMIC-LARGECM64-NEXT: std r0, 64(r1)
262+
; SMALL-LOCAL-DYNAMIC-LARGECM64-NEXT: addis r6, L..C3@u(r2)
263263
; SMALL-LOCAL-DYNAMIC-LARGECM64-NEXT: ld r3, L..C0@l(r3)
264264
; SMALL-LOCAL-DYNAMIC-LARGECM64-NEXT: ld r6, L..C3@l(r6)
265+
; SMALL-LOCAL-DYNAMIC-LARGECM64-NEXT: li r7, 3
265266
; SMALL-LOCAL-DYNAMIC-LARGECM64-NEXT: bla .__tls_get_mod[PR]
267+
; SMALL-LOCAL-DYNAMIC-LARGECM64-NEXT: li r5, 2
268+
; SMALL-LOCAL-DYNAMIC-LARGECM64-NEXT: la r4, ElementIntTLS2[TL]@ld(r3)
269+
; SMALL-LOCAL-DYNAMIC-LARGECM64-NEXT: stw r5, 320(r4)
266270
; SMALL-LOCAL-DYNAMIC-LARGECM64-NEXT: li r4, 1
267-
; SMALL-LOCAL-DYNAMIC-LARGECM64-NEXT: la r5, ElementIntTLS2[TL]@ld(r3)
268-
; SMALL-LOCAL-DYNAMIC-LARGECM64-NEXT: la r7, ElementIntTLS3[TL]@ld(r3)
269-
; SMALL-LOCAL-DYNAMIC-LARGECM64-NEXT: la r8, ElementIntTLS4[TL]@ld(r3)
270-
; SMALL-LOCAL-DYNAMIC-LARGECM64-NEXT: la r9, ElementIntTLS5[TL]@ld(r3)
271+
; SMALL-LOCAL-DYNAMIC-LARGECM64-NEXT: la r5, ElementIntTLS3[TL]@ld(r3)
272+
; SMALL-LOCAL-DYNAMIC-LARGECM64-NEXT: stw r7, 324(r5)
273+
; SMALL-LOCAL-DYNAMIC-LARGECM64-NEXT: la r5, ElementIntTLS4[TL]@ld(r3)
274+
; SMALL-LOCAL-DYNAMIC-LARGECM64-NEXT: la r7, ElementIntTLS5[TL]@ld(r3)
271275
; SMALL-LOCAL-DYNAMIC-LARGECM64-NEXT: stwux r4, r3, r6
272276
; SMALL-LOCAL-DYNAMIC-LARGECM64-NEXT: li r4, 4
273277
; SMALL-LOCAL-DYNAMIC-LARGECM64-NEXT: stw r4, 24(r3)
274-
; SMALL-LOCAL-DYNAMIC-LARGECM64-NEXT: li r3, 2
275-
; SMALL-LOCAL-DYNAMIC-LARGECM64-NEXT: stw r3, 320(r5)
276-
; SMALL-LOCAL-DYNAMIC-LARGECM64-NEXT: li r3, 3
277-
; SMALL-LOCAL-DYNAMIC-LARGECM64-NEXT: stw r3, 324(r7)
278278
; SMALL-LOCAL-DYNAMIC-LARGECM64-NEXT: li r3, 88
279-
; SMALL-LOCAL-DYNAMIC-LARGECM64-NEXT: stw r4, 328(r8)
280-
; SMALL-LOCAL-DYNAMIC-LARGECM64-NEXT: stw r3, 332(r9)
279+
; SMALL-LOCAL-DYNAMIC-LARGECM64-NEXT: stw r4, 328(r5)
280+
; SMALL-LOCAL-DYNAMIC-LARGECM64-NEXT: stw r3, 332(r7)
281281
; SMALL-LOCAL-DYNAMIC-LARGECM64-NEXT: li r3, 102
282282
; SMALL-LOCAL-DYNAMIC-LARGECM64-NEXT: addi r1, r1, 48
283283
; SMALL-LOCAL-DYNAMIC-LARGECM64-NEXT: ld r0, 16(r1)
@@ -351,12 +351,12 @@ entry:
351351
; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} add 9, 3, 9
352352
; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} add 6, 3, 6
353353
; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} stwux 4, 3, 5
354+
; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} li 4, 2
355+
; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} stw 4, 320(6)
356+
; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} li 4, 3
357+
; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} stw 4, 324(7)
354358
; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} li 4, 4
355359
; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} stw 4, 24(3)
356-
; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} li 3, 2
357-
; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} stw 3, 320(6)
358-
; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} li 3, 3
359-
; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} stw 3, 324(7)
360360
; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} li 3, 88
361361
; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} stw 4, 328(8)
362362
; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} stw 3, 332(9)
@@ -466,12 +466,12 @@ entry:
466466
; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} add 9, 3, 9
467467
; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} add 6, 3, 6
468468
; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} stwux 4, 3, 5
469+
; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} li 4, 2
470+
; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} stw 4, 320(6)
471+
; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} li 4, 3
472+
; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} stw 4, 324(7)
469473
; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} li 4, 4
470474
; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} stw 4, 24(3)
471-
; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} li 3, 2
472-
; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} stw 3, 320(6)
473-
; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} li 3, 3
474-
; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} stw 3, 324(7)
475475
; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} li 3, 88
476476
; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} stw 4, 328(8)
477477
; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} stw 3, 332(9)

llvm/test/CodeGen/PowerPC/aix-small-local-exec-tls-largeaccess.ll

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,11 @@ define signext i32 @StoreArrays1() {
3030
; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: stw r3, mySmallLocalExecTLSv1[TL]@le(r13)
3131
; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: li r3, 2
3232
; 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)
3334
; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: stw r3, (mySmallLocalExecTLS2[TL]@le+320)-65536(r13)
3435
; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: li r3, 3
3536
; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: stw r3, (mySmallLocalExecTLS3[TL]@le+324)-65536(r13)
3637
; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: li r3, 88
37-
; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: stw r4, (mySmallLocalExecTLS4[TL]@le+328)-65536(r13)
3838
; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: stw r3, (mySmallLocalExecTLS5[TL]@le+332)-65536(r13)
3939
; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: li r3, 102
4040
; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: blr
@@ -46,11 +46,11 @@ define signext i32 @StoreArrays1() {
4646
; SMALL-LOCAL-EXEC-LARGECM64-NEXT: stw r3, mySmallLocalExecTLSv1[TL]@le(r13)
4747
; SMALL-LOCAL-EXEC-LARGECM64-NEXT: li r3, 2
4848
; 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)
4950
; SMALL-LOCAL-EXEC-LARGECM64-NEXT: stw r3, (mySmallLocalExecTLS2[TL]@le+320)-65536(r13)
5051
; SMALL-LOCAL-EXEC-LARGECM64-NEXT: li r3, 3
5152
; SMALL-LOCAL-EXEC-LARGECM64-NEXT: stw r3, (mySmallLocalExecTLS3[TL]@le+324)-65536(r13)
5253
; SMALL-LOCAL-EXEC-LARGECM64-NEXT: li r3, 88
53-
; SMALL-LOCAL-EXEC-LARGECM64-NEXT: stw r4, (mySmallLocalExecTLS4[TL]@le+328)-65536(r13)
5454
; SMALL-LOCAL-EXEC-LARGECM64-NEXT: stw r3, (mySmallLocalExecTLS5[TL]@le+332)-65536(r13)
5555
; SMALL-LOCAL-EXEC-LARGECM64-NEXT: li r3, 102
5656
; SMALL-LOCAL-EXEC-LARGECM64-NEXT: blr
@@ -88,16 +88,16 @@ entry:
8888
define signext i32 @StoreArrays2() {
8989
; SMALL-LOCAL-EXEC-SMALLCM64-LABEL: StoreArrays2:
9090
; SMALL-LOCAL-EXEC-SMALLCM64: # %bb.0: # %entry
91-
; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: ld r4, L..C0(r2) # target-flags(ppc-tprel) @mySmallLocalExecTLSv2
91+
; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: li r4, 2
9292
; 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
9397
; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: add r4, r13, r4
9498
; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: stw r3, 0(r4)
9599
; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: li r3, 4
96100
; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: stw r3, 24(r4)
97-
; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: li r4, 2
98-
; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: stw r4, (mySmallLocalExecTLS2[TL]@le+320)-65536(r13)
99-
; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: li r4, 3
100-
; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: stw r4, (mySmallLocalExecTLS3[TL]@le+324)-65536(r13)
101101
; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: li r4, 88
102102
; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: stw r3, (mySmallLocalExecTLS4[TL]@le+328)-65536(r13)
103103
; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: li r3, 102
@@ -106,17 +106,17 @@ define signext i32 @StoreArrays2() {
106106
;
107107
; SMALL-LOCAL-EXEC-LARGECM64-LABEL: StoreArrays2:
108108
; 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)
109112
; SMALL-LOCAL-EXEC-LARGECM64-NEXT: addis r3, L..C0@u(r2)
110-
; SMALL-LOCAL-EXEC-LARGECM64-NEXT: li r4, 1
111113
; 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
112116
; SMALL-LOCAL-EXEC-LARGECM64-NEXT: add r3, r13, r3
113117
; SMALL-LOCAL-EXEC-LARGECM64-NEXT: stw r4, 0(r3)
114118
; SMALL-LOCAL-EXEC-LARGECM64-NEXT: li r4, 4
115119
; SMALL-LOCAL-EXEC-LARGECM64-NEXT: stw r4, 24(r3)
116-
; SMALL-LOCAL-EXEC-LARGECM64-NEXT: li r3, 2
117-
; SMALL-LOCAL-EXEC-LARGECM64-NEXT: stw r3, (mySmallLocalExecTLS2[TL]@le+320)-65536(r13)
118-
; SMALL-LOCAL-EXEC-LARGECM64-NEXT: li r3, 3
119-
; SMALL-LOCAL-EXEC-LARGECM64-NEXT: stw r3, (mySmallLocalExecTLS3[TL]@le+324)-65536(r13)
120120
; SMALL-LOCAL-EXEC-LARGECM64-NEXT: li r3, 88
121121
; SMALL-LOCAL-EXEC-LARGECM64-NEXT: stw r4, (mySmallLocalExecTLS4[TL]@le+328)-65536(r13)
122122
; SMALL-LOCAL-EXEC-LARGECM64-NEXT: stw r3, (mySmallLocalExecTLS5[TL]@le+332)-65536(r13)
@@ -162,35 +162,35 @@ entry:
162162
; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} li 3, 2
163163
; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} stw 4, 24(13)
164164
; 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]
165167
; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} stw 3, -32468(13)
166168
; DIS-NEXT: {{0*}}[[#ADDR + 2]]: R_TLS_LE (idx: [[#NFA+17]]) mySmallLocalExecTLS2[TL]
167169
; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} li 3, 3
168170
; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} stw 3, -16464(13)
169171
; DIS-NEXT: {{0*}}[[#ADDR + 2]]: R_TLS_LE (idx: [[#NFA+19]]) mySmallLocalExecTLS3[TL]
170172
; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} li 3, 88
171-
; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} stw 4, -460(13)
172-
; DIS-NEXT: {{0*}}[[#ADDR + 2]]: R_TLS_LE (idx: [[#NFA+21]]) mySmallLocalExecTLS4[TL]
173173
; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} stw 3, 15544(13)
174174
; DIS-NEXT: {{0*}}[[#ADDR + 2]]: R_TLS_LE (idx: [[#NFA+23]]) mySmallLocalExecTLS5[TL]
175175
; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} li 3, 102
176176
; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} blr
177177

178178
; 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]
179183
; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} addis 3, 2, 0
180184
; DIS-NEXT: {{0*}}[[#ADDR + 2]]: R_TOCU (idx: [[#NFA+13]]) mySmallLocalExecTLSv2[TE]
181-
; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} li 4, 1
182185
; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} ld 3, 0(3)
183186
; 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
184190
; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} add 3, 13, 3
185191
; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} stw 4, 0(3)
186192
; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} li 4, 4
187193
; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} stw 4, 24(3)
188-
; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} li 3, 2
189-
; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} stw 3, -32468(13)
190-
; DIS-NEXT: {{0*}}[[#ADDR + 2]]: R_TLS_LE (idx: [[#NFA+17]]) mySmallLocalExecTLS2[TL]
191-
; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} li 3, 3
192-
; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} stw 3, -16464(13)
193-
; DIS-NEXT: {{0*}}[[#ADDR + 2]]: R_TLS_LE (idx: [[#NFA+19]]) mySmallLocalExecTLS3[TL]
194194
; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} li 3, 88
195195
; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} stw 4, -460(13)
196196
; DIS-NEXT: {{0*}}[[#ADDR + 2]]: R_TLS_LE (idx: [[#NFA+21]]) mySmallLocalExecTLS4[TL]
@@ -227,4 +227,4 @@ entry:
227227
; DIS: 000000000000be6c (idx: [[#NFA+19]]) mySmallLocalExecTLS3[TL]:
228228
; DIS: 000000000000fcec (idx: [[#NFA+21]]) mySmallLocalExecTLS4[TL]:
229229
; DIS: 0000000000013b6c (idx: [[#NFA+23]]) mySmallLocalExecTLS5[TL]:
230-
; DIS: 00000000000179ec (idx: [[#NFA+25]]) mySmallLocalExecTLSv2[TL]:
230+
; DIS: 00000000000179ec (idx: [[#NFA+25]]) mySmallLocalExecTLSv2[TL]:

llvm/test/CodeGen/PowerPC/aix-small-tls-globalvarattr-funcattr.ll

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,9 +64,9 @@ define i64 @StoreLargeAccess2() {
6464
; CHECK-SMALLCM64-NEXT: li r3, 55
6565
; CHECK-SMALLCM64-NEXT: li r4, 64
6666
; CHECK-SMALLCM64-NEXT: std r3, mySmallTLS2[TL]@le+696(r13)
67+
; CHECK-SMALLCM64-NEXT: add r3, r13, r5
68+
; CHECK-SMALLCM64-NEXT: std r4, 20000(r3)
6769
; CHECK-SMALLCM64-NEXT: li r3, 142
68-
; CHECK-SMALLCM64-NEXT: add r5, r13, r5
69-
; CHECK-SMALLCM64-NEXT: std r4, 20000(r5)
7070
; CHECK-LARGECM64: addis r3, L..C0@u(r2)
7171
; CHECK-LARGECM64-NEXT: li r4, 0
7272
; CHECK-LARGECM64-NEXT: li r5, 23
@@ -75,8 +75,8 @@ define i64 @StoreLargeAccess2() {
7575
; CHECK-LARGECM64-NEXT: add r3, r13, r3
7676
; CHECK-LARGECM64-NEXT: stdx r5, r3, r4
7777
; CHECK-LARGECM64-NEXT: addis r3, L..C1@u(r2)
78-
; CHECK-LARGECM64-NEXT: li r4, 55
7978
; CHECK-LARGECM64-NEXT: li r5, 64
79+
; CHECK-LARGECM64-NEXT: li r4, 55
8080
; CHECK-LARGECM64-NEXT: ld r3, L..C1@l(r3)
8181
; CHECK-LARGECM64-NEXT: std r4, mySmallTLS2[TL]@le+696(r13)
8282
; CHECK-LARGECM64-NEXT: add r3, r13, r3

0 commit comments

Comments
 (0)