Compiling: 

typedef unsigned char Char;
typedef Char *ScrnPtr;
typedef ScrnPtr *ScrnBuf;


typedef struct {
  int foo [1000];
  int savelines;
  ScrnBuf visbuf;
  ScrnBuf allbuf;
} TScreen;

typedef struct _XtermWidgetRec {
  TScreen screen;
  int num_ptrs;
}  *XtermWidget;

extern XtermWidget term;

void
VTallocbuf(void)
{
  TScreen *screen = &term->screen;
  screen->visbuf = &screen->allbuf[term->num_ptrs * screen->savelines];
  return;
}

with 4.0 and 4.1 -march=i686 -O2 generates: (the significant part of the sdiff 
is shown) 

        movl    4012(%eax), %ecx                              |         movl   
4000(%edx), %ecx
        movl    4000(%eax), %edx                              |         movl   
4012(%edx), %eax
        imull   %ecx, %edx                                    |         imull  
%ecx, %eax
        movl    4008(%eax), %ecx                              |         movl   
4008(%edx), %ecx
        leal    (%ecx,%edx,4), %edx                           |         sall   
$2, %eax
        movl    %edx, 4004(%eax)                              |         addl   
%ecx, %eax
                                                              >         movl   
%eax, 4004(%edx)

Note that 4.1 generates sall + addl instead of a single leal instruction.
This might be one of the reasons for 4.1 the code size regression in PR23153.

-- 
           Summary: 4.1 generates sall + addl instead of leal
           Product: gcc
           Version: 4.1.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P2
         Component: rtl-optimization
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: dann at godzilla dot ics dot uci dot edu
                CC: gcc-bugs at gcc dot gnu dot org
 GCC build triplet: i686-pc-linux-gnu
  GCC host triplet: i686-pc-linux-gnu
GCC target triplet: i686-pc-linux-gnu


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=23303

Reply via email to