On 29 Jan 09:50, Uros Bizjak wrote:
> On Thu, Jan 29, 2015 at 9:13 AM, Uros Bizjak <[email protected]> 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  <[email protected]>

        * 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.


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_"
 

Reply via email to