https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113874
Bug ID: 113874 Summary: GNU2 TLS descriptor calls do not follow psABI on x86_64-linux-gnu Product: gcc Version: 13.2.1 Status: UNCONFIRMED Keywords: wrong-code Severity: normal Priority: P3 Component: target Assignee: unassigned at gcc dot gnu.org Reporter: fw at gcc dot gnu.org Target Milestone: --- Target: x86_64-linux-gnu Consider this test case: struct tls { long a, b, c, d; }; extern __thread struct tls tls_var __attribute__ ((visibility ("hidden"))); void apply_tls (struct tls *p) { tls_var = *p; } With “-O2 -fpic -mtls-dialect=gnu2“, it gets compiled to: apply_tls: .LFB0: .cfi_startproc subq $8, %rsp .cfi_def_cfa_offset 16 movdqu (%rdi), %xmm0 leaq tls_var@TLSDESC(%rip), %rax call *tls_var@TLSCALL(%rax) addq %fs:0, %rax movups %xmm0, (%rax) movdqu 16(%rdi), %xmm1 movups %xmm1, 16(%rax) addq $8, %rsp .cfi_def_cfa_offset 8 ret .cfi_endproc Note how %xmm0 is loaded before the descriptor call. The glibc implementation assumes psABI, so %xmm0 is potentially clobbered by the call. Discovered as a crash in the polymake testsuite (/fan/objects/Geometry/PolyhedralFan/properties/Combinatorics/DUAL_GRAPH) if its dependency nauty is compiled with -mtls-dialect=gnu2. (i686-linux-gnu has the same issue with -msse2.)