https://bugs.llvm.org/show_bug.cgi?id=41722

            Bug ID: 41722
           Summary: Poor optimization of thread local globals on OSX
           Product: new-bugs
           Version: 8.0
          Hardware: Macintosh
                OS: MacOS X
            Status: NEW
          Severity: enhancement
          Priority: P
         Component: new bugs
          Assignee: unassignedb...@nondot.org
          Reporter: tyler.m.k...@gmail.com
                CC: htmldevelo...@gmail.com, llvm-bugs@lists.llvm.org

Multiple calls to tlv_get_addr are (often) generated per usage of a thread
local variable on OSX. This issue was discovered by looking at the assembly
generated by rustc, and is discussed in more detail here:

https://github.com/rust-lang/rust/pull/60341#issuecomment-487982828

I know very little about llvm - so hopefully this all makes sense. The linked
IR [1] demonstrates the issue. Often, the optimizer spits out IR which
references thread_local globals multiple times when the unoptimized IR only
references them once. Often associated with getelementptr.

In the final assembly the asm does the tlv_get_addr dance twice.

movq    _foo@TLVP(%rip), %rdi
callq   *(%rdi)

For larger structures with multiple members, the problem gets worse, resulting
in many redundant calls to tlv_get_addr. In contrast, when targeting linux,
__tls_get_addr@PLT, is only invoked once.

Maybe there's a good reason the address isn't cached on OSX, but I'm hoping
there isn't :).

[1]: https://gist.github.com/alexcrichton/a9a90412152d04caa7011042aa89b6bf

-- 
You are receiving this mail because:
You are on the CC list for the bug.
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to