[llvm] [llvm][Support] `thread_local` threadid on Apple systems (PR #87219)

via llvm-commits llvm-commits at lists.llvm.org
Sun Mar 31 22:05:36 PDT 2024


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-llvm-support

Author: Jeff Niu (Mogball)

<details>
<summary>Changes</summary>

I was profiling our compiler and noticed that `llvm::get_threadid` was at the top of the hotlist, taking up a surprising 5% (7 seconds) in the profile trace. It seems that computing this on MacOS systems is non-trivial, so cache the result in a thread_local.

---
Full diff: https://github.com/llvm/llvm-project/pull/87219.diff


1 Files Affected:

- (modified) llvm/lib/Support/Unix/Threading.inc (+5-2) 


``````````diff
diff --git a/llvm/lib/Support/Unix/Threading.inc b/llvm/lib/Support/Unix/Threading.inc
index 55e7dcfa4678cf..839c00c5ebbf96 100644
--- a/llvm/lib/Support/Unix/Threading.inc
+++ b/llvm/lib/Support/Unix/Threading.inc
@@ -115,8 +115,11 @@ uint64_t llvm::get_threadid() {
   // Calling "mach_thread_self()" bumps the reference count on the thread
   // port, so we need to deallocate it. mach_task_self() doesn't bump the ref
   // count.
-  thread_port_t Self = mach_thread_self();
-  mach_port_deallocate(mach_task_self(), Self);
+  static thread_local thread_port_t Self = [] {
+    thread_port_t InitSelf = mach_thread_self();
+    mach_port_deallocate(mach_task_self(), Self);
+    return InitSelf;
+  }();
   return Self;
 #elif defined(__FreeBSD__)
   return uint64_t(pthread_getthreadid_np());

``````````

</details>


https://github.com/llvm/llvm-project/pull/87219


More information about the llvm-commits mailing list