diff options
author | Jeff Niu <jeff@modular.com> | 2024-04-01 13:59:53 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-04-01 22:59:53 +0200 |
commit | f2f01f6b03aa81d5bdbf841a88f8853620c6902b (patch) | |
tree | 8befa9d02e2b4ed89396f2ee53d6a19b903c8422 | |
parent | b8cc3ba409dc850776f37e27613bf74f5a80d66a (diff) | |
download | llvm-f2f01f6b03aa81d5bdbf841a88f8853620c6902b.zip llvm-f2f01f6b03aa81d5bdbf841a88f8853620c6902b.tar.gz llvm-f2f01f6b03aa81d5bdbf841a88f8853620c6902b.tar.bz2 |
[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@gmail.com>
-rw-r--r-- | llvm/lib/Support/Unix/Threading.inc | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/llvm/lib/Support/Unix/Threading.inc b/llvm/lib/Support/Unix/Threading.inc index 55e7dcf..839c00c 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()); |