[llvm] 14f4512 - [clang][WeAssembly] Do not override thread model when building without atomics (#225981)

via llvm-commits llvm-commits at lists.llvm.org
Fri Sep 25 08:48:40 PDT 2026


Author: Derek Schuff
Date: 2026-09-25T08:48:31-07:00
New Revision: 14f451262dc753b53f79a103744dd6988894467f

URL: https://github.com/llvm/llvm-project/commit/14f451262dc753b53f79a103744dd6988894467f
DIFF: https://github.com/llvm/llvm-project/commit/14f451262dc753b53f79a103744dd6988894467f.diff

LOG: [clang][WeAssembly] Do not override thread model when building without atomics (#225981)

This change does 2 things. The first is to revert #223917, setting the
Triple's
default thread model back to posix. The second is to stop overriding it
when
atomics are not enabled.

This means that compiles with no thread- or atomics-related flags will
get the default posix thread model, independently of whether they get
_REENTRANT defined or the atomics feature is enabled. Practically this
means that the thread model will always be posix unless explicitly
overridden at the driver command line.

The leftover setting of Opts.POSIXThreads became a no-op when used
with the clang driver because the logic would only activate when
-pthread
was not already used (since the driver has separate logic linking
several
flags together).

This is a safer version of the status quo before the thread-model
module flag was introduced, because atomics are still lowered
in the same way but there is no risk of unsafe initialization
or LICM in such scenarios. We could probably further simplify
the interaction between various thread- and atomics-related
flags and thread agnosticism, but this is a small step
that fixes a known hazard.

Added: 
    

Modified: 
    clang/lib/Basic/Targets/WebAssembly.cpp
    clang/lib/Basic/Targets/WebAssembly.h
    clang/test/CodeGen/thread-model.c
    clang/test/CodeGenCXX/static-init-wasm.cpp
    clang/test/Preprocessor/init.c
    llvm/lib/Target/WebAssembly/WebAssemblyCoalesceFeaturesAndStripAtomics.cpp
    llvm/lib/TargetParser/Triple.cpp

Removed: 
    llvm/test/CodeGen/WebAssembly/coalesce-features-thread-model.ll


################################################################################
diff  --git a/clang/lib/Basic/Targets/WebAssembly.cpp b/clang/lib/Basic/Targets/WebAssembly.cpp
index a483e3d6f9b10..e2b819b1c98a5 100644
--- a/clang/lib/Basic/Targets/WebAssembly.cpp
+++ b/clang/lib/Basic/Targets/WebAssembly.cpp
@@ -418,19 +418,6 @@ WebAssemblyTargetInfo::getTargetBuiltins() const {
   return {{&BuiltinStrings, BuiltinInfos}};
 }
 
-void WebAssemblyTargetInfo::adjust(DiagnosticsEngine &Diags, LangOptions &Opts,
-                                   const TargetInfo *Aux) {
-  TargetInfo::adjust(Diags, Opts, Aux);
-  // Turn off POSIXThreads and ThreadModel so that we don't predefine _REENTRANT
-  // or __STDCPP_THREADS__ if we will eventually end up stripping atomics
-  // because they are unsupported.
-  if ((!HasCooperativeThreading && !HasAtomics) || !HasBulkMemory) {
-    Opts.POSIXThreads = false;
-    Opts.setThreadModel(LangOptions::ThreadModelKind::Single);
-    Opts.ThreadsafeStatics = false;
-  }
-}
-
 void WebAssembly32TargetInfo::getTargetDefines(const LangOptions &Opts,
                                                MacroBuilder &Builder) const {
   WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);

diff  --git a/clang/lib/Basic/Targets/WebAssembly.h b/clang/lib/Basic/Targets/WebAssembly.h
index 630b1a7cd2b36..93dad2442db23 100644
--- a/clang/lib/Basic/Targets/WebAssembly.h
+++ b/clang/lib/Basic/Targets/WebAssembly.h
@@ -171,9 +171,6 @@ class LLVM_LIBRARY_VISIBILITY WebAssemblyTargetInfo : public TargetInfo {
   bool hasBitIntType() const override { return true; }
 
   bool hasProtectedVisibility() const override { return false; }
-
-  void adjust(DiagnosticsEngine &Diags, LangOptions &Opts,
-              const TargetInfo *Aux) override;
 };
 
 class LLVM_LIBRARY_VISIBILITY WebAssembly32TargetInfo

diff  --git a/clang/test/CodeGen/thread-model.c b/clang/test/CodeGen/thread-model.c
index 419615fb40edb..5a84eb829be7f 100644
--- a/clang/test/CodeGen/thread-model.c
+++ b/clang/test/CodeGen/thread-model.c
@@ -5,15 +5,11 @@
 // RUN: %clang_cc1 -triple arm-none-linux-gnueabi -mthread-model posix -emit-llvm %s -o - | FileCheck %s --check-prefix=POSIX
 // RUN: %clang_cc1 -triple arm-none-linux-gnueabi -emit-llvm %s -o - | FileCheck %s --check-prefix=POSIX
 
-// RUN: %clang_cc1 -triple wasm32-unknown-unknown -mthread-model single -emit-llvm %s -o - | FileCheck %s --check-prefix=WASM-SINGLE
-// RUN: %clang_cc1 -triple wasm32-unknown-unknown -target-feature +atomics -target-feature +bulk-memory -mthread-model posix -emit-llvm %s -o - | FileCheck %s --check-prefix=WASM-POSIX
-// RUN: %clang_cc1 -triple wasm32-unknown-unknown -target-feature +atomics -target-feature +bulk-memory -emit-llvm %s -o - | FileCheck %s --check-prefix=WASM-POSIX
-// RUN: %clang_cc1 -triple wasm32-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix=WASM-SINGLE
+// RUN: %clang_cc1 -triple wasm32-unknown-unknown -mthread-model single -emit-llvm %s -o - | FileCheck %s --check-prefix=SINGLE
+// RUN: %clang_cc1 -triple wasm32-unknown-unknown -mthread-model posix -emit-llvm %s -o - | FileCheck %s --check-prefix=POSIX
+// RUN: %clang_cc1 -triple wasm32-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix=POSIX
 
 void f(void) {}
 
 // SINGLE: !{i32 1, !"thread-model", !"single"}
 // POSIX-NOT: "thread-model"
-
-// WASM-SINGLE-NOT: "thread-model"
-// WASM-POSIX: !{i32 1, !"thread-model", !"posix"}

diff  --git a/clang/test/CodeGenCXX/static-init-wasm.cpp b/clang/test/CodeGenCXX/static-init-wasm.cpp
index 1406dcbd5ffc2..8677bf7fd60b9 100644
--- a/clang/test/CodeGenCXX/static-init-wasm.cpp
+++ b/clang/test/CodeGenCXX/static-init-wasm.cpp
@@ -53,30 +53,20 @@ A theA;
 // WEBASSEMBLY64: define internal void @_GLOBAL__sub_I_static_init_wasm.cpp() #3 {
 // WEBASSEMBLY64: call void @__cxx_global_var_init()
 
-// RUN: %clang_cc1 -emit-llvm -triple=wasm32-unknown-unknown -target-feature +bulk-memory -o - %s \
-// RUN:   | FileCheck %s -check-prefix=NOATOMICS
-// RUN: %clang_cc1 -emit-llvm -triple=wasm64-unknown-unknown -target-feature +bulk-memory -o - %s \
-// RUN:   | FileCheck %s -check-prefix=NOATOMICS
-
-// NOATOMICS-LABEL: @_Z1gv()
-// NOATOMICS:       %[[R0:.+]] = load i8, ptr @_ZGVZ1gvE1a, align 1
-// NOATOMICS-NEXT:  %guard.uninitialized = icmp eq i8 %[[R0]], 0
-// NOATOMICS-NEXT:  br i1 %guard.uninitialized, label %[[CHECK:.+]], label %[[END:.+]],
-// NOATOMICS:       [[CHECK]]:
-// NOATOMICS-NOT:   __cxa_guard_acquire
-// NOATOMICS:       [[END]]:
-// NOATOMICS-NEXT:  ret void
-
-// RUN: %clang_cc1 -emit-llvm -triple=wasm32-unknown-unknown -target-feature +atomics -o - %s \
-// RUN:   | FileCheck %s -check-prefix=NOBULKMEM
-// RUN: %clang_cc1 -emit-llvm -triple=wasm64-unknown-unknown -target-feature +atomics -o - %s \
-// RUN:   | FileCheck %s -check-prefix=NOBULKMEM
+// RUN: %clang_cc1 -emit-llvm -triple=wasm32-unknown-unknown -o - %s \
+// RUN:   | FileCheck %s -check-prefix=WEBASSEMBLY32
+// RUN: %clang_cc1 -emit-llvm -triple=wasm64-unknown-unknown -o - %s \
+// RUN:   | FileCheck %s -check-prefix=WEBASSEMBLY64
+// RUN: %clang_cc1 -emit-llvm -triple=wasm32-unknown-unknown -fno-threadsafe-statics -o - %s \
+// RUN:   | FileCheck %s -check-prefix=NOTHREADSAFE
+// RUN: %clang_cc1 -emit-llvm -triple=wasm64-unknown-unknown -fno-threadsafe-statics -o - %s \
+// RUN:   | FileCheck %s -check-prefix=NOTHREADSAFE
 
-// NOBULKMEM-LABEL: @_Z1gv()
-// NOBULKMEM:       %[[R0:.+]] = load i8, ptr @_ZGVZ1gvE1a, align 1
-// NOBULKMEM-NEXT:  %guard.uninitialized = icmp eq i8 %[[R0]], 0
-// NOBULKMEM-NEXT:  br i1 %guard.uninitialized, label %[[CHECK:.+]], label %[[END:.+]],
-// NOBULKMEM:       [[CHECK]]:
-// NOBULKMEM-NOT:   __cxa_guard_acquire
-// NOBULKMEM:       [[END]]:
-// NOBULKMEM-NEXT:  ret void
+// NOTHREADSAFE-LABEL: @_Z1gv()
+// NOTHREADSAFE:       %[[R0:.+]] = load i8, ptr @_ZGVZ1gvE1a, align 1
+// NOTHREADSAFE-NEXT:  %guard.uninitialized = icmp eq i8 %[[R0]], 0
+// NOTHREADSAFE-NEXT:  br i1 %guard.uninitialized, label %[[CHECK:.+]], label %[[END:.+]],
+// NOTHREADSAFE:       [[CHECK]]:
+// NOTHREADSAFE-NOT:   __cxa_guard_acquire
+// NOTHREADSAFE:       [[END]]:
+// NOTHREADSAFE-NEXT:  ret void

diff  --git a/clang/test/Preprocessor/init.c b/clang/test/Preprocessor/init.c
index faeb7861e5d21..c07dc27f0bb4f 100644
--- a/clang/test/Preprocessor/init.c
+++ b/clang/test/Preprocessor/init.c
@@ -2150,7 +2150,7 @@
 // EMSCRIPTEN:#define unix 1
 // WASI-NOT:#define unix 1
 // WEBASSEMBLY-CXX-NOT:_REENTRANT
-// WEBASSEMBLY-CXX-NOT:__STDCPP_THREADS__
+// WEBASSEMBLY-CXX:#define __STDCPP_THREADS__ 1
 // WEBASSEMBLY-CXX-ATOMICS:#define _REENTRANT 1
 // WEBASSEMBLY-CXX-ATOMICS:#define __STDCPP_THREADS__ 1
 

diff  --git a/llvm/lib/Target/WebAssembly/WebAssemblyCoalesceFeaturesAndStripAtomics.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyCoalesceFeaturesAndStripAtomics.cpp
index 2cdd7d908994b..68c8f1087f7a6 100644
--- a/llvm/lib/Target/WebAssembly/WebAssemblyCoalesceFeaturesAndStripAtomics.cpp
+++ b/llvm/lib/Target/WebAssembly/WebAssemblyCoalesceFeaturesAndStripAtomics.cpp
@@ -195,15 +195,7 @@ static bool coalesceFeaturesAndStripAtomics(Module &M,
   else if (StrippedTLS && !StrippedAtomics)
     stripAtomics(M);
 
-  bool Stripped = StrippedAtomics || StrippedTLS;
-  if (!Stripped &&
-      (Features[WebAssembly::FeatureAtomics] ||
-       (CooperativeThreading && Features[WebAssembly::FeatureBulkMemory])) &&
-      !M.getModuleFlag("thread-model")) {
-    M.setThreadModel(ThreadModel::POSIX);
-  }
-
-  recordFeatures(M, ST, Features, Stripped);
+  recordFeatures(M, ST, Features, StrippedAtomics || StrippedTLS);
 
   // Conservatively assume we have made some change
   return true;

diff  --git a/llvm/lib/TargetParser/Triple.cpp b/llvm/lib/TargetParser/Triple.cpp
index 91997355ee414..6f2c867a318d2 100644
--- a/llvm/lib/TargetParser/Triple.cpp
+++ b/llvm/lib/TargetParser/Triple.cpp
@@ -2543,11 +2543,7 @@ FloatABI::ABIType Triple::getDefaultFloatABI() const {
   return FloatABI::Hard;
 }
 
-ThreadModel Triple::getDefaultThreadModel() const {
-  if (isWasm())
-    return ThreadModel::Single;
-  return ThreadModel::POSIX;
-}
+ThreadModel Triple::getDefaultThreadModel() const { return ThreadModel::POSIX; }
 
 LongDoubleFormat Triple::getDefaultLongDoubleFormat() const {
   switch (getArch()) {

diff  --git a/llvm/test/CodeGen/WebAssembly/coalesce-features-thread-model.ll b/llvm/test/CodeGen/WebAssembly/coalesce-features-thread-model.ll
deleted file mode 100644
index 606e48c04b83a..0000000000000
--- a/llvm/test/CodeGen/WebAssembly/coalesce-features-thread-model.ll
+++ /dev/null
@@ -1,44 +0,0 @@
-; RUN: split-file %s %t
-
-; Test that wasm-coalesce-features-and-strip-atomics sets the "thread-model"
-; module flag to "posix" when threading features (+atomics or cooperative
-; multithreading with +bulk-memory) are enabled and atomics/TLS were not
-; stripped, unless an explicit "thread-model" flag is already present.
-
-; RUN: opt -mtriple=wasm32-unknown-unknown -passes=wasm-coalesce-features-and-strip-atomics -S %t/default.ll | FileCheck %s --check-prefix=NO-FLAG
-; RUN: opt -mtriple=wasm32-unknown-unknown -mattr=+atomics -passes=wasm-coalesce-features-and-strip-atomics -S %t/default.ll | FileCheck %s --check-prefix=POSIX
-; RUN: opt -mtriple=wasm32-wasip3 -mattr=+bulk-memory -passes=wasm-coalesce-features-and-strip-atomics -S %t/default.ll | FileCheck %s --check-prefix=POSIX
-; RUN: opt -mtriple=wasm32-wasip3 -mattr=-bulk-memory -passes=wasm-coalesce-features-and-strip-atomics -S %t/default.ll | FileCheck %s --check-prefix=NO-FLAG
-
-; RUN: opt -mtriple=wasm32-unknown-unknown -passes=wasm-coalesce-features-and-strip-atomics -S %t/attr.ll | FileCheck %s --check-prefix=POSIX
-
-; RUN: opt -mtriple=wasm32-unknown-unknown -mattr=+atomics,-bulk-memory -passes=wasm-coalesce-features-and-strip-atomics -S %t/tls.ll | FileCheck %s --check-prefix=NO-FLAG
-; RUN: opt -mtriple=wasm32-unknown-unknown -mattr=+atomics,+bulk-memory -passes=wasm-coalesce-features-and-strip-atomics -S %t/tls.ll | FileCheck %s --check-prefix=POSIX
-
-; RUN: opt -mtriple=wasm32-unknown-unknown -mattr=+atomics -passes=wasm-coalesce-features-and-strip-atomics -S %t/explicit.ll | FileCheck %s --check-prefix=EXPLICIT-SINGLE
-
-; NO-FLAG-NOT: !"thread-model"
-; POSIX: !{i32 1, !"thread-model", !"posix"}
-; EXPLICIT-SINGLE: !{i32 1, !"thread-model", !"single"}
-; EXPLICIT-SINGLE-NOT: !"posix"
-
-;--- default.ll
-define void @foo() {
-  ret void
-}
-
-;--- attr.ll
-define void @foo() "target-features"="+atomics" {
-  ret void
-}
-
-;--- tls.ll
- at tls = thread_local global i32 0
-
-;--- explicit.ll
-define void @foo() {
-  ret void
-}
-
-!llvm.module.flags = !{!0}
-!0 = !{i32 1, !"thread-model", !"single"}


        


More information about the llvm-commits mailing list