On Mon, Oct 13, 2014 at 5:17 PM, Evgeny Stupachenko <evstu...@gmail.com> wrote: > Patch updated with the comment: > > diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c > index 2a64d2d..5fd6a82 100644 > --- a/gcc/config/i386/i386.c > +++ b/gcc/config/i386/i386.c > @@ -12455,9 +12455,18 @@ ix86_address_cost (rtx x, enum machine_mode, > addr_space_t, bool) > || REGNO (parts.index) >= FIRST_PSEUDO_REGISTER))) > cost++; > > + /* When address base or index is "pic_offset_table_rtx" we don't increase > + address cost. When a memop with "pic_offset_table_rtx" is not invariant > + itself it most likely means that base or index is not invariant. > + Therefore only "pic_offset_table_rtx" could be hoisted out, which is not > + profitable for x86. */ > if (parts.base > + && (!pic_offset_table_rtx > + || REGNO (pic_offset_table_rtx) != REGNO(parts.base)) > && (!REG_P (parts.base) || REGNO (parts.base) >= FIRST_PSEUDO_REGISTER) > && parts.index > + && (!pic_offset_table_rtx > + || REGNO (pic_offset_table_rtx) != REGNO(parts.index)) > && (!REG_P (parts.index) || REGNO (parts.index) >= > FIRST_PSEUDO_REGISTER) > && parts.base != parts.index) > cost++;
LGTM. OK. Thanks, Uros.