Compiling: typedef char Boolean; typedef unsigned char Char; typedef Char *ScrnPtr; typedef ScrnPtr *ScrnBuf;
typedef struct _WidgetRec *Widget; typedef struct { int foo [1000]; int max_col; int max_row; Widget scrollWidget; int savelines; ScrnBuf visbuf; ScrnBuf allbuf; Char *sbuf_address; } TScreen; typedef struct _XtermWidgetRec { TScreen screen; int num_ptrs; } *XtermWidget; extern ScrnBuf Allocate (int nrow, int ncol, Char **addr); extern XtermWidget term; void VTallocbuf(void) { TScreen *screen = &term->screen; int nrows = screen->max_row + 1; if (screen->scrollWidget) nrows += screen->savelines; screen->allbuf = Allocate(nrows, screen->max_col + 1, &screen->sbuf_address); if (screen->scrollWidget) screen->visbuf = &screen->allbuf[term->num_ptrs * screen->savelines]; else screen->visbuf = screen->allbuf; return; } with 4.0 and 4.1 -march=i686 -O2 generates: (the significant part of the sdiff is shown) movl term, %edx | movl term, %eax movl 4012(%ebx), %eax | movl 4012(%ebx), %ecx imull 4028(%edx), %eax | movl 4028(%eax), %eax leal (%ecx,%eax,4), %eax | imull %ecx, %eax > leal (%edx,%eax,4), %eax note that 4.1 generates an extra movl instruction. This is one of the reasons for 4.1 the code size regression in PR23153. -- Summary: extra move generated on x86 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=23302