diff mbox

[i386] Never fix register for PIC when pseudo PIC reg is used

Message ID 20150129112730.GB58846@msticlxl57.ims.intel.com
State New
Headers show

Commit Message

Ilya Enkovich Jan. 29, 2015, 11:27 a.m. UTC
On 29 Jan 09:50, Uros Bizjak wrote:
> On Thu, Jan 29, 2015 at 9:13 AM, Uros Bizjak <ubizjak@gmail.com> wrote:
> 
> >>> Currently ix86_conditional_register_usage code may mark EBX as a fixed register if it is called
> >>> when pic_offset_table_rtx is NULL even if we are going to use pseudo PIC register.  It already
> >>> caused some problem in combination with another issue (PR jit/64722).  This patch will probably
> >>> help to avoid problems in the future.
> >>>
> >>> BTW if we don't want to support possibility to switch to the fixed PIC register in i386 target then
> >>> this code may be removed at all.
> >>
> >> No, we don't want to switch to fixed PIC register. cpuid asm in
> >> cpuid.h and cmpxchg8b pattern will break. Please do not bring back the
> >> dead and remove this code.
> >
> > Also, if possible, please simplify PIC_OFFSET_TABLE_REGNUM to use
> > TARGET_USE_PSEUDO_PIC_REG, like:
> 
> Ops, better use the attached patch that exports ix86_use_pseudo_pic_reg.
> 
> Uros.

Hello Uros,

Thank you for review!  Here is an updated version with proposed changes.  Bootstrapped and tested on x86_64-unknown-linux-gnu.  OK for trunk?

Thanks,
Ilya
--
2015-01-29  Ilya Enkovich  <ilya.enkovich@intel.com>

	* config/i386/i386-protos.h (ix86_use_pseudo_pic_reg): New.
	* config/i386/i386.h (PIC_OFFSET_TABLE_REGNUM): Simplify by
	using x86_use_pseudo_pic_reg.
	* config/i386/i386.c (ix86_conditional_register_usage): Remove
	support for fixed PIC register.
	(ix86_use_pseudo_pic_reg): Not static any more.

Comments

Jakub Jelinek Jan. 29, 2015, 11:36 a.m. UTC | #1
On Thu, Jan 29, 2015 at 02:27:30PM +0300, Ilya Enkovich wrote:
> Thank you for review!  Here is an updated version with proposed changes.  Bootstrapped and tested on x86_64-unknown-linux-gnu.  OK for trunk?
> 
> Thanks,
> Ilya
> --
> 2015-01-29  Ilya Enkovich  <ilya.enkovich@intel.com>

Perhaps mention Uros as co-author of the patch?

I'll defer the review to Uros or other i?86 maintainers.

	Jakub
Uros Bizjak Jan. 29, 2015, 12:08 p.m. UTC | #2
On Thu, Jan 29, 2015 at 12:27 PM, Ilya Enkovich <enkovich.gnu@gmail.com> wrote:
> On 29 Jan 09:50, Uros Bizjak wrote:
>> On Thu, Jan 29, 2015 at 9:13 AM, Uros Bizjak <ubizjak@gmail.com> wrote:
>>
>> >>> Currently ix86_conditional_register_usage code may mark EBX as a fixed register if it is called
>> >>> when pic_offset_table_rtx is NULL even if we are going to use pseudo PIC register.  It already
>> >>> caused some problem in combination with another issue (PR jit/64722).  This patch will probably
>> >>> help to avoid problems in the future.
>> >>>
>> >>> BTW if we don't want to support possibility to switch to the fixed PIC register in i386 target then
>> >>> this code may be removed at all.
>> >>
>> >> No, we don't want to switch to fixed PIC register. cpuid asm in
>> >> cpuid.h and cmpxchg8b pattern will break. Please do not bring back the
>> >> dead and remove this code.
>> >
>> > Also, if possible, please simplify PIC_OFFSET_TABLE_REGNUM to use
>> > TARGET_USE_PSEUDO_PIC_REG, like:
>>
>> Ops, better use the attached patch that exports ix86_use_pseudo_pic_reg.
>>
>> Uros.
>
> Hello Uros,
>
> Thank you for review!  Here is an updated version with proposed changes.  Bootstrapped and tested on x86_64-unknown-linux-gnu.  OK for trunk?
>
> Thanks,
> Ilya
> --
> 2015-01-29  Ilya Enkovich  <ilya.enkovich@intel.com>
>
>         * config/i386/i386-protos.h (ix86_use_pseudo_pic_reg): New.
>         * config/i386/i386.h (PIC_OFFSET_TABLE_REGNUM): Simplify by
>         using x86_use_pseudo_pic_reg.
>         * config/i386/i386.c (ix86_conditional_register_usage): Remove
>         support for fixed PIC register.
>         (ix86_use_pseudo_pic_reg): Not static any more.

OK.

Thanks,
Uros.
diff mbox

Patch

diff --git a/gcc/config/i386/i386-protos.h b/gcc/config/i386/i386-protos.h
index 17aed5a..3962427 100644
--- a/gcc/config/i386/i386-protos.h
+++ b/gcc/config/i386/i386-protos.h
@@ -40,6 +40,8 @@  extern void ix86_output_addr_diff_elt (FILE *, int, int);
 extern enum calling_abi ix86_cfun_abi (void);
 extern enum calling_abi ix86_function_type_abi (const_tree);
 
+extern bool ix86_use_pseudo_pic_reg (void);
+
 extern void ix86_reset_previous_fndecl (void);
 
 #ifdef RTX_CODE
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index d10d3ff..f912007 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -4384,12 +4384,6 @@  static void
 ix86_conditional_register_usage (void)
 {
   int i, c_mask;
-  unsigned int j;
-
-  /* The PIC register, if it exists, is fixed.  */
-  j = PIC_OFFSET_TABLE_REGNUM;
-  if (j != INVALID_REGNUM)
-    fixed_regs[j] = call_used_regs[j] = 1;
 
   /* For 32-bit targets, squash the REX registers.  */
   if (! TARGET_64BIT)
@@ -6256,7 +6250,7 @@  ix86_maybe_switch_abi (void)
 
 /* Return 1 if pseudo register should be created and used to hold
    GOT address for PIC code.  */
-static bool
+bool
 ix86_use_pseudo_pic_reg (void)
 {
   if ((TARGET_64BIT
diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h
index 395778c..5d1e5e0 100644
--- a/gcc/config/i386/i386.h
+++ b/gcc/config/i386/i386.h
@@ -1256,13 +1256,11 @@  extern const char *host_detect_local_cpu (int argc, const char **argv);
 #define REAL_PIC_OFFSET_TABLE_REGNUM  (TARGET_64BIT ? R15_REG : BX_REG)
 
 #define PIC_OFFSET_TABLE_REGNUM						\
-  ((TARGET_64BIT && (ix86_cmodel == CM_SMALL_PIC			\
-                     || TARGET_PECOFF))					\
-   || !flag_pic								\
-   ? INVALID_REGNUM							\
-   : pic_offset_table_rtx						\
-     ? INVALID_REGNUM							\
-     : REAL_PIC_OFFSET_TABLE_REGNUM)
+  (ix86_use_pseudo_pic_reg ()						\
+   ? (pic_offset_table_rtx						\
+      ? INVALID_REGNUM							\
+      : REAL_PIC_OFFSET_TABLE_REGNUM)					\
+   : INVALID_REGNUM)
 
 #define GOT_SYMBOL_NAME "_GLOBAL_OFFSET_TABLE_"