Message ID | CAEwic4YWD-zow7f6_djO0XazbLiZH4LFnOgJzJBg1w193HCYrw@mail.gmail.com |
---|---|
State | New |
Headers | show |
On Thu, Feb 23, 2012 at 05:38:37PM +0100, Kai Tietz wrote: > --- config/i386/i386.c (revision 184486) > +++ config/i386/i386.c (working copy) > @@ -13241,6 +13241,22 @@ > > if (TARGET_64BIT) > { > + if (GET_CODE (x) == CONST > + && GET_CODE (XEXP (x, 0)) == PLUS > + && GET_MODE (XEXP (x, 0)) == Pmode > + && CONST_INT_P (XEXP (XEXP (x, 0), 1)) > + && GET_CODE (XEXP (XEXP (x, 0), 0)) == UNSPEC > + && XINT (XEXP (XEXP (x, 0), 0), 1) == UNSPEC_PCREL) > + { > + rtx x2 = XVECEXP (XEXP (XEXP (x, 0), 0), 0, 0); > + x = gen_rtx_PLUS (Pmode, XEXP (XEXP (x, 0), 1), x2); > + if (MEM_P (orig_x)) > + x = replace_equiv_address_nv (orig_x, x); > + return x; > + } > + if (GET_CODE (x) == UNSPEC > + && XINT (x, 1) == UNSPEC_PCREL) > + return XVECEXP (x, 0, 0); Here you don't need the MEM_P (orig_x) handling? That's strange. > if (GET_CODE (x) != CONST > || GET_CODE (XEXP (x, 0)) != UNSPEC > || (XINT (XEXP (x, 0), 1) != UNSPEC_GOTPCREL Jakub
2012/2/23 Jakub Jelinek <jakub@redhat.com>: > On Thu, Feb 23, 2012 at 05:38:37PM +0100, Kai Tietz wrote: >> --- config/i386/i386.c (revision 184486) >> +++ config/i386/i386.c (working copy) >> @@ -13241,6 +13241,22 @@ >> >> if (TARGET_64BIT) >> { >> + if (GET_CODE (x) == CONST >> + && GET_CODE (XEXP (x, 0)) == PLUS >> + && GET_MODE (XEXP (x, 0)) == Pmode >> + && CONST_INT_P (XEXP (XEXP (x, 0), 1)) >> + && GET_CODE (XEXP (XEXP (x, 0), 0)) == UNSPEC >> + && XINT (XEXP (XEXP (x, 0), 0), 1) == UNSPEC_PCREL) >> + { >> + rtx x2 = XVECEXP (XEXP (XEXP (x, 0), 0), 0, 0); >> + x = gen_rtx_PLUS (Pmode, XEXP (XEXP (x, 0), 1), x2); >> + if (MEM_P (orig_x)) >> + x = replace_equiv_address_nv (orig_x, x); >> + return x; >> + } >> + if (GET_CODE (x) == UNSPEC >> + && XINT (x, 1) == UNSPEC_PCREL) >> + return XVECEXP (x, 0, 0); > > Here you don't need the MEM_P (orig_x) handling? > That's strange. > >> if (GET_CODE (x) != CONST >> || GET_CODE (XEXP (x, 0)) != UNSPEC >> || (XINT (XEXP (x, 0), 1) != UNSPEC_GOTPCREL > > Jakub Hmm, those three lines are not necessary. Sorry, I missed to remove them from my patch. >> + if (GET_CODE (x) == UNSPEC >> + && XINT (x, 1) == UNSPEC_PCREL) >> + return XVECEXP (x, 0, 0); But indeed the mem-case isn't necessary here, as this pattern never matches. I will retest without those three-lines and post updated patch then. Regards, Kai
Index: config/i386/i386.c =================================================================== --- config/i386/i386.c (revision 184486) +++ config/i386/i386.c (working copy) @@ -13241,6 +13241,22 @@ if (TARGET_64BIT) { + if (GET_CODE (x) == CONST + && GET_CODE (XEXP (x, 0)) == PLUS + && GET_MODE (XEXP (x, 0)) == Pmode + && CONST_INT_P (XEXP (XEXP (x, 0), 1)) + && GET_CODE (XEXP (XEXP (x, 0), 0)) == UNSPEC + && XINT (XEXP (XEXP (x, 0), 0), 1) == UNSPEC_PCREL) + { + rtx x2 = XVECEXP (XEXP (XEXP (x, 0), 0), 0, 0); + x = gen_rtx_PLUS (Pmode, XEXP (XEXP (x, 0), 1), x2); + if (MEM_P (orig_x)) + x = replace_equiv_address_nv (orig_x, x); + return x; + } + if (GET_CODE (x) == UNSPEC + && XINT (x, 1) == UNSPEC_PCREL) + return XVECEXP (x, 0, 0); if (GET_CODE (x) != CONST || GET_CODE (XEXP (x, 0)) != UNSPEC || (XINT (XEXP (x, 0), 1) != UNSPEC_GOTPCREL