[llvm] acb7ddc - [WebAssembly] Remove threadlocal.address when disabling TLS (#88209)
via llvm-commits
llvm-commits at lists.llvm.org
Wed Apr 10 16:24:06 PDT 2024
Author: Matthias Braun
Date: 2024-04-10T16:24:02-07:00
New Revision: acb7ddc5cf2f23416f65dcdc6c7fd08850ad961d
URL: https://github.com/llvm/llvm-project/commit/acb7ddc5cf2f23416f65dcdc6c7fd08850ad961d
DIFF: https://github.com/llvm/llvm-project/commit/acb7ddc5cf2f23416f65dcdc6c7fd08850ad961d.diff
LOG: [WebAssembly] Remove threadlocal.address when disabling TLS (#88209)
Remove `llvm.threadlocal.address` intrinsic usage when disabling TLS.
This fixes errors revealed by the stricter IR verification introduced in
PR #87841.
Added:
Modified:
llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp
llvm/test/CodeGen/WebAssembly/tls-general-dynamic.ll
llvm/test/CodeGen/WebAssembly/tls-local-exec.ll
Removed:
################################################################################
diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp
index 70685b2e3bb2de..769ee765e19078 100644
--- a/llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp
+++ b/llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp
@@ -291,6 +291,17 @@ class CoalesceFeaturesAndStripAtomics final : public ModulePass {
bool Stripped = false;
for (auto &GV : M.globals()) {
if (GV.isThreadLocal()) {
+ // replace `@llvm.threadlocal.address.pX(GV)` with `GV`.
+ for (Use &U : make_early_inc_range(GV.uses())) {
+ if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(U.getUser())) {
+ if (II->getIntrinsicID() == Intrinsic::threadlocal_address &&
+ II->getArgOperand(0) == &GV) {
+ II->replaceAllUsesWith(&GV);
+ II->eraseFromParent();
+ }
+ }
+ }
+
Stripped = true;
GV.setThreadLocal(false);
}
diff --git a/llvm/test/CodeGen/WebAssembly/tls-general-dynamic.ll b/llvm/test/CodeGen/WebAssembly/tls-general-dynamic.ll
index 46ab62dfaaa238..006b73922d2b95 100644
--- a/llvm/test/CodeGen/WebAssembly/tls-general-dynamic.ll
+++ b/llvm/test/CodeGen/WebAssembly/tls-general-dynamic.ll
@@ -14,7 +14,9 @@ define i32 @address_of_tls() {
; NO-TLS-NEXT: i32.const tls
; NO-TLS-NEXT: return
- ret i32 ptrtoint(ptr @tls to i32)
+ %p = call ptr @llvm.threadlocal.address.p0(ptr @tls)
+ %r = ptrtoint ptr %p to i32
+ ret i32 %r
}
; CHECK-LABEL: address_of_tls_external:
@@ -25,7 +27,9 @@ define i32 @address_of_tls_external() {
; NO-TLS-NEXT: i32.const tls_external
; NO-TLS-NEXT: return
- ret i32 ptrtoint(ptr @tls_external to i32)
+ %p = call ptr @llvm.threadlocal.address.p0(ptr @tls_external)
+ %r = ptrtoint ptr %p to i32
+ ret i32 %r
}
; CHECK-LABEL: ptr_to_tls:
@@ -38,7 +42,8 @@ define ptr @ptr_to_tls() {
; NO-TLS-NEXT: i32.const tls
; NO-TLS-NEXT: return
- ret ptr @tls
+ %p = call ptr @llvm.threadlocal.address.p0(ptr @tls)
+ ret ptr %p
}
; CHECK-LABEL: ptr_to_tls_external:
@@ -49,7 +54,8 @@ define ptr @ptr_to_tls_external() {
; NO-TLS-NEXT: i32.const tls_external
; NO-TLS-NEXT: return
- ret ptr @tls_external
+ %p = call ptr @llvm.threadlocal.address.p0(ptr @tls_external)
+ ret ptr %p
}
; CHECK-LABEL: tls_load:
@@ -64,7 +70,8 @@ define i32 @tls_load() {
; NO-TLS-NEXT: i32.const 0
; NO-TLS-NEXT: i32.load tls
; NO-TLS-NEXT: return
- %tmp = load i32, ptr @tls, align 4
+ %p = call ptr @llvm.threadlocal.address.p0(ptr @tls)
+ %tmp = load i32, ptr %p, align 4
ret i32 %tmp
}
@@ -78,7 +85,8 @@ define i32 @tls_load_external() {
; NO-TLS-NEXT: i32.const 0
; NO-TLS-NEXT: i32.load tls_external
; NO-TLS-NEXT: return
- %tmp = load i32, ptr @tls_external, align 4
+ %p = call ptr @llvm.threadlocal.address.p0(ptr @tls_external)
+ %tmp = load i32, ptr %p, align 4
ret i32 %tmp
}
@@ -94,7 +102,8 @@ define void @tls_store(i32 %x) {
; NO-TLS-NEXT: i32.const 0
; NO-TLS-NEXT: i32.store tls
; NO-TLS-NEXT: return
- store i32 %x, ptr @tls, align 4
+ %p = call ptr @llvm.threadlocal.address.p0(ptr @tls)
+ store i32 %x, ptr %p, align 4
ret void
}
@@ -108,7 +117,8 @@ define void @tls_store_external(i32 %x) {
; NO-TLS-NEXT: i32.const 0
; NO-TLS-NEXT: i32.store tls_external
; NO-TLS-NEXT: return
- store i32 %x, ptr @tls_external, align 4
+ %p = call ptr @llvm.threadlocal.address.p0(ptr @tls_external)
+ store i32 %x, ptr %p, align 4
ret void
}
diff --git a/llvm/test/CodeGen/WebAssembly/tls-local-exec.ll b/llvm/test/CodeGen/WebAssembly/tls-local-exec.ll
index 3aa044c34789e6..dc0d40c7973ad5 100644
--- a/llvm/test/CodeGen/WebAssembly/tls-local-exec.ll
+++ b/llvm/test/CodeGen/WebAssembly/tls-local-exec.ll
@@ -20,7 +20,9 @@ define i32 @address_of_tls() {
; NO-TLS-NEXT: i32.const tls
; NO-TLS-NEXT: return
- ret i32 ptrtoint(ptr @tls to i32)
+ %p = call ptr @llvm.threadlocal.address.p0(ptr @tls)
+ %r = ptrtoint ptr %p to i32
+ ret i32 %r
}
; CHECK-LABEL: address_of_tls_external:
@@ -33,7 +35,9 @@ define i32 @address_of_tls_external() {
; NO-TLS-NEXT: i32.const tls_external
; NO-TLS-NEXT: return
- ret i32 ptrtoint(ptr @tls_external to i32)
+ %p = call ptr @llvm.threadlocal.address.p0(ptr @tls_external)
+ %r = ptrtoint ptr %p to i32
+ ret i32 %r
}
; CHECK-LABEL: ptr_to_tls:
@@ -46,7 +50,8 @@ define ptr @ptr_to_tls() {
; NO-TLS-NEXT: i32.const tls
; NO-TLS-NEXT: return
- ret ptr @tls
+ %p = call ptr @llvm.threadlocal.address.p0(ptr @tls)
+ ret ptr %p
}
; CHECK-LABEL: tls_load:
@@ -61,7 +66,8 @@ define i32 @tls_load() {
; NO-TLS-NEXT: i32.const 0
; NO-TLS-NEXT: i32.load tls
; NO-TLS-NEXT: return
- %tmp = load i32, ptr @tls, align 4
+ %p = call ptr @llvm.threadlocal.address.p0(ptr @tls)
+ %tmp = load i32, ptr %p, align 4
ret i32 %tmp
}
@@ -77,7 +83,8 @@ define void @tls_store(i32 %x) {
; NO-TLS-NEXT: i32.const 0
; NO-TLS-NEXT: i32.store tls
; NO-TLS-NEXT: return
- store i32 %x, ptr @tls, align 4
+ %p = call ptr @llvm.threadlocal.address.p0(ptr @tls)
+ store i32 %x, ptr %p, align 4
ret void
}
More information about the llvm-commits
mailing list