[llvm] [WebAssembly] Remove threadlocal.address when disabling TLS (PR #88209)

Matthias Braun via llvm-commits llvm-commits at lists.llvm.org
Tue Apr 9 17:55:24 PDT 2024


https://github.com/MatzeB updated https://github.com/llvm/llvm-project/pull/88209

>From 1894bcc63bd112122c2012de5c43870cddb9031b Mon Sep 17 00:00:00 2001
From: Matthias Braun <matze at braunis.de>
Date: Tue, 9 Apr 2024 15:46:54 -0700
Subject: [PATCH 1/3] WebAssembly: Remove threadlocal_address intrinsics when
 disabling TLS

---
 .../WebAssembly/WebAssemblyTargetMachine.cpp  | 13 +++++++++
 llvm/test/CodeGen/WebAssembly/strip-tls.ll    | 28 +++++++++++++++++++
 2 files changed, 41 insertions(+)
 create mode 100644 llvm/test/CodeGen/WebAssembly/strip-tls.ll

diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp
index 70685b2e3bb2de..27b0bb2501d4ed 100644
--- a/llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp
+++ b/llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp
@@ -289,6 +289,19 @@ class CoalesceFeaturesAndStripAtomics final : public ModulePass {
 
   bool stripThreadLocals(Module &M) {
     bool Stripped = false;
+    for (auto &F : M) {
+      for (auto &B : F) {
+        for (auto &I : make_early_inc_range(B)) {
+          if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(&I)) {
+            if (II->getIntrinsicID() == Intrinsic::threadlocal_address) {
+              II->replaceAllUsesWith(II->getArgOperand(0));
+              II->eraseFromParent();
+              Stripped = true;
+            }
+          }
+        }
+      }
+    }
     for (auto &GV : M.globals()) {
       if (GV.isThreadLocal()) {
         Stripped = true;
diff --git a/llvm/test/CodeGen/WebAssembly/strip-tls.ll b/llvm/test/CodeGen/WebAssembly/strip-tls.ll
new file mode 100644
index 00000000000000..281fe0aee7a497
--- /dev/null
+++ b/llvm/test/CodeGen/WebAssembly/strip-tls.ll
@@ -0,0 +1,28 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 4
+; RUN: llc -o - %s -mattr=-bulk-memory | FileCheck --check-prefix=NOTLS %s
+; RUN: llc -o - %s -mattr=+bulk-memory,+atomics | FileCheck --check-prefix=TLS %s
+
+target triple = "wasm32--"
+
+ at tls = internal thread_local global i32 0
+
+define i32 @func() {
+; NOTLS-LABEL: func:
+; NOTLS:         .functype func () -> (i32)
+; NOTLS-NEXT:  # %bb.0:
+; NOTLS-NEXT:    i32.const 0
+; NOTLS-NEXT:    i32.load tls
+; NOTLS-NEXT:    # fallthrough-return
+;
+; TLS-LABEL: func:
+; TLS:         .functype func () -> (i32)
+; TLS-NEXT:  # %bb.0:
+; TLS-NEXT:    global.get __tls_base
+; TLS-NEXT:    i32.const tls at TLSREL
+; TLS-NEXT:    i32.add
+; TLS-NEXT:    i32.load 0
+; TLS-NEXT:    # fallthrough-return
+  %p = call ptr @llvm.threadlocal.address.p0(ptr @tls)
+  %v = load i32, ptr %p
+  ret i32 %v
+}

>From 37e734c2921549a6f641a3f6325cc8c2967c4b14 Mon Sep 17 00:00:00 2001
From: Matthias Braun <matze at braunis.de>
Date: Tue, 9 Apr 2024 17:42:29 -0700
Subject: [PATCH 2/3] integrate with existing test instead

---
 llvm/test/CodeGen/WebAssembly/strip-tls.ll    | 28 -------------------
 .../WebAssembly/target-features-tls.ll        |  6 ++++
 2 files changed, 6 insertions(+), 28 deletions(-)
 delete mode 100644 llvm/test/CodeGen/WebAssembly/strip-tls.ll

diff --git a/llvm/test/CodeGen/WebAssembly/strip-tls.ll b/llvm/test/CodeGen/WebAssembly/strip-tls.ll
deleted file mode 100644
index 281fe0aee7a497..00000000000000
--- a/llvm/test/CodeGen/WebAssembly/strip-tls.ll
+++ /dev/null
@@ -1,28 +0,0 @@
-; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 4
-; RUN: llc -o - %s -mattr=-bulk-memory | FileCheck --check-prefix=NOTLS %s
-; RUN: llc -o - %s -mattr=+bulk-memory,+atomics | FileCheck --check-prefix=TLS %s
-
-target triple = "wasm32--"
-
- at tls = internal thread_local global i32 0
-
-define i32 @func() {
-; NOTLS-LABEL: func:
-; NOTLS:         .functype func () -> (i32)
-; NOTLS-NEXT:  # %bb.0:
-; NOTLS-NEXT:    i32.const 0
-; NOTLS-NEXT:    i32.load tls
-; NOTLS-NEXT:    # fallthrough-return
-;
-; TLS-LABEL: func:
-; TLS:         .functype func () -> (i32)
-; TLS-NEXT:  # %bb.0:
-; TLS-NEXT:    global.get __tls_base
-; TLS-NEXT:    i32.const tls at TLSREL
-; TLS-NEXT:    i32.add
-; TLS-NEXT:    i32.load 0
-; TLS-NEXT:    # fallthrough-return
-  %p = call ptr @llvm.threadlocal.address.p0(ptr @tls)
-  %v = load i32, ptr %p
-  ret i32 %v
-}
diff --git a/llvm/test/CodeGen/WebAssembly/target-features-tls.ll b/llvm/test/CodeGen/WebAssembly/target-features-tls.ll
index 45bc06b5d5c96f..c8d7a83c693604 100644
--- a/llvm/test/CodeGen/WebAssembly/target-features-tls.ll
+++ b/llvm/test/CodeGen/WebAssembly/target-features-tls.ll
@@ -8,6 +8,12 @@ target triple = "wasm32-unknown-unknown"
 
 @foo = internal thread_local global i32 0
 
+define i32 @func() {
+  %p = call ptr @llvm.threadlocal.address.p0(ptr @foo)
+  %v = load i32, ptr %p
+  ret i32 %v
+}
+
 ; -bulk-memory
 ; NO-BULK-MEM-LABEL: .custom_section.target_features,"",@
 ; NO-BULK-MEM-NEXT: .int8 2

>From cfe1cf95829cd81bb73a60a2f0089166faa39e6e Mon Sep 17 00:00:00 2001
From: Matthias Braun <matze at braunis.de>
Date: Tue, 9 Apr 2024 17:51:20 -0700
Subject: [PATCH 3/3] Just add llvm.threadlocal.address to other tests

---
 .../WebAssembly/target-features-tls.ll        |  6 -----
 .../WebAssembly/tls-general-dynamic.ll        | 26 +++++++++++++------
 .../CodeGen/WebAssembly/tls-local-exec.ll     | 17 ++++++++----
 3 files changed, 30 insertions(+), 19 deletions(-)

diff --git a/llvm/test/CodeGen/WebAssembly/target-features-tls.ll b/llvm/test/CodeGen/WebAssembly/target-features-tls.ll
index c8d7a83c693604..45bc06b5d5c96f 100644
--- a/llvm/test/CodeGen/WebAssembly/target-features-tls.ll
+++ b/llvm/test/CodeGen/WebAssembly/target-features-tls.ll
@@ -8,12 +8,6 @@ target triple = "wasm32-unknown-unknown"
 
 @foo = internal thread_local global i32 0
 
-define i32 @func() {
-  %p = call ptr @llvm.threadlocal.address.p0(ptr @foo)
-  %v = load i32, ptr %p
-  ret i32 %v
-}
-
 ; -bulk-memory
 ; NO-BULK-MEM-LABEL: .custom_section.target_features,"",@
 ; NO-BULK-MEM-NEXT: .int8 2
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