PATCH: Properly generate X32 IE sequence

Uros Bizjak ubizjak@gmail.com
Tue Mar 13 10:37:00 GMT 2012


On Tue, Mar 13, 2012 at 8:11 AM, Uros Bizjak <ubizjak@gmail.com> wrote:

>>>> 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  <ubizjak@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.

OTOH,  we can improve rejection test a bit to reject only non-word
mode registers.

2012-03-13  Uros Bizjak  <ubizjak@gmail.com>

	* config/i386/i386.c (ix86_decompose_address): Prevent %fs:(%reg)
	addresses only when %reg is not in word mode.

Tested on x86_64-pc-linux-gnu {,-m32}, committed.

Uros.

Index: i386.c
===================================================================
--- i386.c      (revision 185278)
+++ i386.c      (working copy)
@@ -11563,8 +11563,10 @@
        return 0;
     }

-  if (seg != SEG_DEFAULT && (base || index)
-      && !TARGET_TLS_INDIRECT_SEG_REFS)
+/* Address override works only on the (%reg) part of %fs:(%reg).  */
+  if (seg != SEG_DEFAULT
+      && ((base && GET_MODE (base) != word_mode)
+         || (index && GET_MODE (index) != word_mode)))
     return 0;

   /* Extract the integral value of scale.  */



More information about the Gcc-patches mailing list