2012/2/23 Jakub Jelinek <ja...@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