This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH, i386] Never fix register for PIC when pseudo PIC reg is used
- From: Ilya Enkovich <enkovich dot gnu at gmail dot com>
- To: Uros Bizjak <ubizjak at gmail dot com>
- Cc: "gcc-patches at gcc dot gnu dot org" <gcc-patches at gcc dot gnu dot org>
- Date: Thu, 29 Jan 2015 14:27:30 +0300
- Subject: Re: [PATCH, i386] Never fix register for PIC when pseudo PIC reg is used
- Authentication-results: sourceware.org; auth=none
- References: <CAFULd4YGJizzNi1arB443PoGMwVVx2jy7eoeJpWVp9nbMrvWTA at mail dot gmail dot com> <CAFULd4ZPaBEDHzcvqg_GePZAv65cE3imPheLuAJF5Ei6ZiqR=Q at mail dot gmail dot com> <CAFULd4b1UHxySX_W9ZZ=4x-98Mps1Ow+VekBNUfVQ37shZaQgA at mail dot gmail dot com>
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.
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_"