[Bug tree-optimization/32949] New: suboptimal address generation for int indices on 64-bit targets

amonakov at gmail dot com gcc-bugzilla@gcc.gnu.org
Tue Jul 31 17:29:00 GMT 2007


When compiling with -O2

void foo(int N, int k, int di, double x[N])
{       
  long i;
  for (i = 0; k; k--, i += di)
    x[i] = 0;   
}

GCC produces for x86_64:

.L9:
        movq    $0, (%rcx)
        addq    %rax, %rcx
        subl    $1, %esi
        jne     .L9

and for ia64:

.L10:
        .mib
        stfd [r35] = f0
        add r35 = r35, r34
        br.cloop.sptk.few .L10
        ;;

However, when `long i' is changed to `int i', generated code is worse:

.L3:
        movslq  %edi,%rax
        addl    %edx, %edi
        subl    $1, %esi
        movq    $0, (%rcx,%rax,8)
        jne     .L3

and for ia64:

.L3:
        .mii
        nop 0
        sxt4 r14 = r15
        add r15 = r15, r34
        ;;
        .mii
        shladd r14 = r14, 3, r35
        nop 0
        ;;
        nop 0
        .mmb
        stfd [r14] = f0
        nop 0
        br.cloop.sptk.few .L3
        ;;

Basically, unadjusted loop index (i) is copied into temporary, which is then
multiplied by sizeof(x[0]), added to base address of array and used for
addressing.  I assume this can be improved on the grounds that signed integer
overflow is undefined.


-- 
           Summary: suboptimal address generation for int indices on 64-bit
                    targets
           Product: gcc
           Version: 4.3.0
            Status: UNCONFIRMED
          Severity: enhancement
          Priority: P3
         Component: tree-optimization
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: amonakov at gmail dot com


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



More information about the Gcc-bugs mailing list