Skip to content

Commit acb7ddc

Browse files
authored
[WebAssembly] Remove threadlocal.address when disabling TLS (llvm#88209)
Remove `llvm.threadlocal.address` intrinsic usage when disabling TLS. This fixes errors revealed by the stricter IR verification introduced in PR llvm#87841.
1 parent 8136ac1 commit acb7ddc

File tree

3 files changed

+41
-13
lines changed

3 files changed

+41
-13
lines changed

llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -291,6 +291,17 @@ class CoalesceFeaturesAndStripAtomics final : public ModulePass {
291291
bool Stripped = false;
292292
for (auto &GV : M.globals()) {
293293
if (GV.isThreadLocal()) {
294+
// replace `@llvm.threadlocal.address.pX(GV)` with `GV`.
295+
for (Use &U : make_early_inc_range(GV.uses())) {
296+
if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(U.getUser())) {
297+
if (II->getIntrinsicID() == Intrinsic::threadlocal_address &&
298+
II->getArgOperand(0) == &GV) {
299+
II->replaceAllUsesWith(&GV);
300+
II->eraseFromParent();
301+
}
302+
}
303+
}
304+
294305
Stripped = true;
295306
GV.setThreadLocal(false);
296307
}

llvm/test/CodeGen/WebAssembly/tls-general-dynamic.ll

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@ define i32 @address_of_tls() {
1414

1515
; NO-TLS-NEXT: i32.const tls
1616
; NO-TLS-NEXT: return
17-
ret i32 ptrtoint(ptr @tls to i32)
17+
%p = call ptr @llvm.threadlocal.address.p0(ptr @tls)
18+
%r = ptrtoint ptr %p to i32
19+
ret i32 %r
1820
}
1921

2022
; CHECK-LABEL: address_of_tls_external:
@@ -25,7 +27,9 @@ define i32 @address_of_tls_external() {
2527

2628
; NO-TLS-NEXT: i32.const tls_external
2729
; NO-TLS-NEXT: return
28-
ret i32 ptrtoint(ptr @tls_external to i32)
30+
%p = call ptr @llvm.threadlocal.address.p0(ptr @tls_external)
31+
%r = ptrtoint ptr %p to i32
32+
ret i32 %r
2933
}
3034

3135
; CHECK-LABEL: ptr_to_tls:
@@ -38,7 +42,8 @@ define ptr @ptr_to_tls() {
3842

3943
; NO-TLS-NEXT: i32.const tls
4044
; NO-TLS-NEXT: return
41-
ret ptr @tls
45+
%p = call ptr @llvm.threadlocal.address.p0(ptr @tls)
46+
ret ptr %p
4247
}
4348

4449
; CHECK-LABEL: ptr_to_tls_external:
@@ -49,7 +54,8 @@ define ptr @ptr_to_tls_external() {
4954

5055
; NO-TLS-NEXT: i32.const tls_external
5156
; NO-TLS-NEXT: return
52-
ret ptr @tls_external
57+
%p = call ptr @llvm.threadlocal.address.p0(ptr @tls_external)
58+
ret ptr %p
5359
}
5460

5561
; CHECK-LABEL: tls_load:
@@ -64,7 +70,8 @@ define i32 @tls_load() {
6470
; NO-TLS-NEXT: i32.const 0
6571
; NO-TLS-NEXT: i32.load tls
6672
; NO-TLS-NEXT: return
67-
%tmp = load i32, ptr @tls, align 4
73+
%p = call ptr @llvm.threadlocal.address.p0(ptr @tls)
74+
%tmp = load i32, ptr %p, align 4
6875
ret i32 %tmp
6976
}
7077

@@ -78,7 +85,8 @@ define i32 @tls_load_external() {
7885
; NO-TLS-NEXT: i32.const 0
7986
; NO-TLS-NEXT: i32.load tls_external
8087
; NO-TLS-NEXT: return
81-
%tmp = load i32, ptr @tls_external, align 4
88+
%p = call ptr @llvm.threadlocal.address.p0(ptr @tls_external)
89+
%tmp = load i32, ptr %p, align 4
8290
ret i32 %tmp
8391
}
8492

@@ -94,7 +102,8 @@ define void @tls_store(i32 %x) {
94102
; NO-TLS-NEXT: i32.const 0
95103
; NO-TLS-NEXT: i32.store tls
96104
; NO-TLS-NEXT: return
97-
store i32 %x, ptr @tls, align 4
105+
%p = call ptr @llvm.threadlocal.address.p0(ptr @tls)
106+
store i32 %x, ptr %p, align 4
98107
ret void
99108
}
100109

@@ -108,7 +117,8 @@ define void @tls_store_external(i32 %x) {
108117
; NO-TLS-NEXT: i32.const 0
109118
; NO-TLS-NEXT: i32.store tls_external
110119
; NO-TLS-NEXT: return
111-
store i32 %x, ptr @tls_external, align 4
120+
%p = call ptr @llvm.threadlocal.address.p0(ptr @tls_external)
121+
store i32 %x, ptr %p, align 4
112122
ret void
113123
}
114124

llvm/test/CodeGen/WebAssembly/tls-local-exec.ll

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,9 @@ define i32 @address_of_tls() {
2020

2121
; NO-TLS-NEXT: i32.const tls
2222
; NO-TLS-NEXT: return
23-
ret i32 ptrtoint(ptr @tls to i32)
23+
%p = call ptr @llvm.threadlocal.address.p0(ptr @tls)
24+
%r = ptrtoint ptr %p to i32
25+
ret i32 %r
2426
}
2527

2628
; CHECK-LABEL: address_of_tls_external:
@@ -33,7 +35,9 @@ define i32 @address_of_tls_external() {
3335

3436
; NO-TLS-NEXT: i32.const tls_external
3537
; NO-TLS-NEXT: return
36-
ret i32 ptrtoint(ptr @tls_external to i32)
38+
%p = call ptr @llvm.threadlocal.address.p0(ptr @tls_external)
39+
%r = ptrtoint ptr %p to i32
40+
ret i32 %r
3741
}
3842

3943
; CHECK-LABEL: ptr_to_tls:
@@ -46,7 +50,8 @@ define ptr @ptr_to_tls() {
4650

4751
; NO-TLS-NEXT: i32.const tls
4852
; NO-TLS-NEXT: return
49-
ret ptr @tls
53+
%p = call ptr @llvm.threadlocal.address.p0(ptr @tls)
54+
ret ptr %p
5055
}
5156

5257
; CHECK-LABEL: tls_load:
@@ -61,7 +66,8 @@ define i32 @tls_load() {
6166
; NO-TLS-NEXT: i32.const 0
6267
; NO-TLS-NEXT: i32.load tls
6368
; NO-TLS-NEXT: return
64-
%tmp = load i32, ptr @tls, align 4
69+
%p = call ptr @llvm.threadlocal.address.p0(ptr @tls)
70+
%tmp = load i32, ptr %p, align 4
6571
ret i32 %tmp
6672
}
6773

@@ -77,7 +83,8 @@ define void @tls_store(i32 %x) {
7783
; NO-TLS-NEXT: i32.const 0
7884
; NO-TLS-NEXT: i32.store tls
7985
; NO-TLS-NEXT: return
80-
store i32 %x, ptr @tls, align 4
86+
%p = call ptr @llvm.threadlocal.address.p0(ptr @tls)
87+
store i32 %x, ptr %p, align 4
8188
ret void
8289
}
8390

0 commit comments

Comments
 (0)