This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: PATCH: Properly generate X32 IE sequence


On Mon, Mar 12, 2012 at 3:35 PM, H.J. Lu <hjl.tools@gmail.com> wrote:
> On Mon, Mar 12, 2012 at 12:39 PM, Uros Bizjak <ubizjak@gmail.com> wrote:
>> On Sun, Mar 11, 2012 at 10:24 PM, H.J. Lu <hjl.tools@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.
>>
>> Uros.
>
> I am testing it.
>

There is no regression.

BTW, this x32 TLS IE optimization:

http://gcc.gnu.org/ml/gcc-patches/2012-03/msg00714.html

is still useful.  For

[hjl@gnu-6 tls]$ cat ie2.i
extern __thread long long int x;

extern long long int y;

void
ie2 (void)
{
  x = y;
}
[hjl@gnu-6 tls]$

my patch turns

ie2:
.LFB0:
	.cfi_startproc
	movq	y(%rip), %rdx	# 6	*movdi_internal_rex64/2	[length = 7]
	movl	%fs:0, %eax	# 5	tls_initial_exec_x32	[length = 16]
	addl	x@gottpoff(%rip), %eax
	movq	%rdx, (%eax)	# 7	*movdi_internal_rex64/4	[length = 3]
	ret	# 14	simple_return_internal	[length = 1]
	.cfi_endproc

into

ie2:
.LFB0:
	.cfi_startproc
	movq	y(%rip), %rax	# 6	*movdi_internal_rex64/2	[length = 7]
	movq	x@gottpoff(%rip), %rdx	# 7	*tls_initial_exec_x32_store	[length = 16]
	movq	%rax, %fs:(%rdx)
	ret	# 14	simple_return_internal	[length = 1]
	.cfi_endproc



-- 
H.J.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]