On Tue, Mar 13, 2012 at 2:20 AM, H.J. Lu <hjl.to...@gmail.com> wrote:
>>>> Here is the patch which is equivalent to clearing MASK_TLS_DIRECT_SEG_REFS >>>> when Pmode != word_mode. We need to keep >>>> >>>> else if (Pmode == SImode) >>>> { >>>> /* Always generate >>>> movl %fs:0, %reg32 >>>> addl xgottpoff(%rip), %reg32 >>>> to support linker IE->LE optimization and avoid >>>> fs:(%reg32) as memory operand. */ >>>> dest = gen_reg_rtx (Pmode); >>>> emit_insn (gen_tls_initial_exec_x32 (dest, x)); >>>> return dest; >>>> } >>>> >>>> to support linker IE->LE optimization. TARGET_TLS_DIRECT_SEG_REFS only >>>> affects >>>> TLS LE access and fs:(%reg) is only generated by combine. >>>> >>>> So the main impact of disabling TARGET_TLS_DIRECT_SEG_REFS is to disable >>>> fs:immediate memory operand for TLS LE access, which doesn't have any >>>> problems >>>> to begin with. >>>> >>>> I would prefer to keep TARGET_TLS_DIRECT_SEG_REFS and disable only >>>> fs:(%reg), which is generated by combine. >>> >>> Please try attached patch. It introduces TARGET_TLS_INDIRECT_SEG_REFS >>> to block only indirect seg references. > > There is no regression. Thanks, committed to mainline SVN with following ChangeLog: 2012-03-13 Uros Bizjak <ubiz...@gmail.com> * config/i386/i386.h (TARGET_TLS_INDIRECT_SEG_REFS): New. * config/i386/i386.c (ix86_decompose_address): Use TARGET_TLS_INDIRECT_SEG_REFS to prevent %fs:(%reg) addresses. (legitimize_tls_address): Use TARGET_TLS_INDIRECT_SEG_REFS to load thread pointer to a register. Tested on x86_64-pc-linux-gnu {,-m32}. > BTW, this x32 TLS IE optimization: > movq %rax, %fs:(%rdx) This is just looking for troubles. If we said these addresses are invalid, then we shouldn't generate them. Uros.