[llvm] f2f01f6 - [llvm][Support] Use `thread_local` caching for llvm::get_threadid() query on Apple systems (#87219)

via llvm-commits llvm-commits at lists.llvm.org
Mon Apr 1 13:59:56 PDT 2024


Author: Jeff Niu
Date: 2024-04-01T22:59:53+02:00
New Revision: f2f01f6b03aa81d5bdbf841a88f8853620c6902b

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

LOG: [llvm][Support] Use `thread_local` caching for llvm::get_threadid() query on Apple systems (#87219)

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.

Co-authored-by: Mehdi Amini <joker.eph at gmail.com>

Added: 
    

Modified: 
    llvm/lib/Support/Unix/Threading.inc

Removed: 
    


################################################################################
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());


        


More information about the llvm-commits mailing list