[Bug tree-optimization/41026] New: invariant address load inside loop

rahul at icerasemi dot com gcc-bugzilla@gcc.gnu.org
Mon Aug 10 13:09:00 GMT 2009


gcc --version
gcc (GCC) 4.4.1 20090507 (prerelease)

The following test compiled with
gcc -S -Os

struct struct_t {
  int* data;
};

void testAddr (struct struct_t* sp, int len)
{
    int i;
    for (i = 0; i < len; i++)
      {
        sp->data[i] = 0;
      }
}

generates the following code for x86

testAddr :
        pushl   %ebp
        xorl    %eax, %eax
        movl    %esp, %ebp
        movl    8(%ebp), %ecx
        pushl   %ebx
        movl    12(%ebp), %edx
        jmp     .L2
.L3:
        movl    (%ecx), %ebx          <-- invariant address load
        movl    $0, (%ebx,%eax,4)
        incl    %eax
.L2:
        cmpl    %edx, %eax
        jl      .L3
        popl    %ebx
        popl    %ebp
        ret

Whereas making the intent explicit like so

void testAddr (struct struct_t* sp, int len)
{
    int i;
    int *p = sp->data;
    for (i = 0; i < len; i++)
      {
        p[i] = 0;
      }
}

generates

testAddr :
        pushl   %ebp
        movl    %esp, %ebp
        movl    8(%ebp), %eax
        movl    12(%ebp), %ecx
        movl    (%eax), %edx          <-- now outside the loop
        xorl    %eax, %eax
        jmp     .L2
.L3:
        movl    $0, (%edx,%eax,4)
        incl    %eax
.L2:
        cmpl    %ecx, %eax
        jl      .L3
        popl    %ebp
        ret

Why can't we move the address load outside the loop in the first case?


-- 
           Summary: invariant address load inside loop
           Product: gcc
           Version: 4.4.1
            Status: UNCONFIRMED
          Severity: enhancement
          Priority: P3
         Component: tree-optimization
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: rahul at icerasemi dot com
 GCC build triplet: i686-pc-linux
  GCC host triplet: i686-pc-linux
GCC target triplet: i686-pc-linux


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



More information about the Gcc-bugs mailing list