[compiler-rt] [builtins][FMV][Apple] Use builtin atomic load/store, instead of libdispatch (PR #78807)

Jon Roelofs via llvm-commits llvm-commits at lists.llvm.org
Fri Jan 19 15:35:40 PST 2024


https://github.com/jroelofs created https://github.com/llvm/llvm-project/pull/78807

None

>From 10bc0777f2a9d75febecf8b451ee681ff457002a Mon Sep 17 00:00:00 2001
From: Jon Roelofs <jonathan_roelofs at apple.com>
Date: Fri, 19 Jan 2024 15:19:23 -0800
Subject: [PATCH] [builtins][FMV][Apple] Use builtin atomic load/store, instead
 of libdispatch

---
 .../builtins/cpu_model/aarch64/fmv/apple.inc  | 27 ++++++++++---------
 1 file changed, 14 insertions(+), 13 deletions(-)

diff --git a/compiler-rt/lib/builtins/cpu_model/aarch64/fmv/apple.inc b/compiler-rt/lib/builtins/cpu_model/aarch64/fmv/apple.inc
index 589c3ca72e7b29c..1b56bb04b731689 100644
--- a/compiler-rt/lib/builtins/cpu_model/aarch64/fmv/apple.inc
+++ b/compiler-rt/lib/builtins/cpu_model/aarch64/fmv/apple.inc
@@ -14,19 +14,17 @@ static bool isKnownAndSupported(const char *name) {
 void __init_cpu_features_resolver(void) {
   // On Darwin platforms, this may be called concurrently by multiple threads
   // because the resolvers that use it are called lazily at runtime (unlike on
-  // ELF platforms, where IFuncs are resolved serially at load time).  This
-  // function's effect on __aarch64_cpu_features should be idempotent, but even
-  // so we need dispatch_once to resolve the race condition.  Dispatch is
-  // available through libSystem, which we need anyway for the sysctl, so this
-  // does not add a new dependency.
+  // ELF platforms, where IFuncs are resolved serially at load time). This
+  // function's effect on __aarch64_cpu_features must be idempotent.
+
+  if (!__atomic_load_n(&__aarch64_cpu_features.features, __ATOMIC_RELAXED)) {
+    uint64_t features = 0;
 
-  static dispatch_once_t onceToken = 0;
-  dispatch_once(&onceToken, ^{
     // https://developer.apple.com/documentation/kernel/1387446-sysctlbyname/determining_instruction_set_characteristics
     static const struct {
       const char *sysctl_name;
       enum CPUFeatures feature;
-    } features[] = {
+    } feature_checks[] = {
         {"hw.optional.arm.FEAT_FlagM", FEAT_FLAGM},
         {"hw.optional.arm.FEAT_FlagM2", FEAT_FLAGM2},
         {"hw.optional.arm.FEAT_FHM", FEAT_FP16FML},
@@ -58,12 +56,15 @@ void __init_cpu_features_resolver(void) {
         {"hw.optional.arm.FEAT_BTI", FEAT_BTI},
     };
 
-    for (size_t I = 0, E = sizeof(features) / sizeof(features[0]); I != E; ++I)
-      if (isKnownAndSupported(features[I].sysctl_name))
-        __aarch64_cpu_features.features |= (1ULL << features[I].feature);
+    for (size_t I = 0, E = sizeof(feature_checks) / sizeof(feature_checks[0]);
+         I != E; ++I)
+      if (isKnownAndSupported(feature_checks[I].sysctl_name))
+        features |= (1ULL << feature_checks[I].feature);
+
+    features |= (1ULL << FEAT_INIT);
 
-    __aarch64_cpu_features.features |= (1ULL << FEAT_INIT);
-  });
+    __atomic_store(&__aarch64_cpu_features.features, &features, __ATOMIC_RELAXED);
+  }
 }
 
 #endif // TARGET_OS_OSX || TARGET_OS_IPHONE



More information about the llvm-commits mailing list