On Thu, Aug 31, 2017 at 9:32 PM, Uros Bizjak <ubiz...@gmail.com> wrote: > Hello! > > Using following testcase: > > --cut here-- > __thread int a; > > int foo (void) > { > return a; > } > --cut here-- > > Attached patch converts TLS location in the form of: > > (mem/c:SI (plus:DI (unspec:DI [ > (const_int 0 [0]) > ] UNSPEC_TP) > (const:DI (unspec:DI [ > (symbol_ref:DI ("a") [flags 0x2a] > <var_decl 0x7f8c3acd5e10 a>) > ] UNSPEC_NTPOFF))) [1 a+0 S4 A32])) > "thread.c":5 82 {*movsi_internal} > to: > > (mem/c:SI (const:DI (unspec:DI [ > (symbol_ref:DI ("a") [flags 0x2a] <var_decl > 0x7f8c3acd5e10 a>) > ] UNSPEC_NTPOFF)) [1 a+0 S4 A32 AS1])) "thread.c":5 -1 > > avoiding the UNSPEC_TP tag and instead mark the location with AS. > > This way, address space becomes the property of the memory location, > not of the address itself, so we don't need ugly hacks when the > address is moved to a register (LEA ignores segment overrides, c.f. > split_long_move function in i386.c). > > Please note that some instructions (e.g. prefetchX) operate on > prefixed *address*, so we can't just rip out non-AS code from > print_operand. The above amended example: > > --cut here-- > __thread int a; > > int foo (void) > { > __builtin_prefetch (&a, 0); > return a; > } > --cut here-- > > compiles to: > > prefetcht0 %fs:a@tpoff > movl %fs:a@tpoff, %eax > > where prefetch operand remains: > > (insn 7 6 16 2 (prefetch (plus:DI (unspec:DI [ > (const_int 0 [0]) > ] UNSPEC_TP) > (const:DI (unspec:DI [ > (symbol_ref:DI ("a") [flags 0x2a] <var_decl > 0x7fe994a14e10 a>) > ] UNSPEC_NTPOFF))) > (const_int 0 [0]) > (const_int 3 [0x3])) "thread.c":5 1010 {*prefetch_sse} > (nil)) > > 2017-08-31 Uros Bizjak <ubiz...@gmail.com> > > * config/i386/i386-protos.h (ix86_tls_address_pattern_p) New prototype. > (ix86_rewrite_tls_address): Ditto. > * config/i386/i386.c (ix86_tls_address_pattern_p) New function. > (ix86_rewrite_tls_address_1): Ditto. > (ix86_rewrite_tls_address): Ditto. > * config/i386/predicates.md (tls_address_pattern): New predicate. > * config/i386/i386.md (TLS address splitter): New splitter. > > Patch was bootstrapped and regression tested on x86_64-linux-gnu > {,-m32}, all default languages plus go. > > I plan to commit the patch to the mainline early next week.
Committed to mainline SVN. Uros