The following code:

    typedef struct node { struct node **next; } node_t;
    __attribute__((fastcall)) void *f(node_t *n, int i) {
        return n->next[i];
    }

compiled with -O2 generates the following assembly (generated esp/ebp dead code
removed for readability):

    f:
        movl    (%ecx), %eax
        movl    (%eax,%edx,4), %eax
        ret

which seems optimal. However, simply storing the return value in a variable
damages the generated code:

    typedef struct node { struct node **next; } node_t;
    __attribute__((fastcall)) void *f(node_t *n, int i) {
        n = n->next[i];
        return n;
    }

generates:
    f:
        sall    $2, %edx
        addl    (%ecx), %edx
        movl    (%edx), %eax
        ret

which is less optimal than the previous version, for no reason.


-- 
           Summary: -O2 doesn't use movl (A,B,4),C to its full extent to
                    access an array
           Product: gcc
           Version: 4.4.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: jerome dot abela at free dot fr
 GCC build triplet: i386-pc-linux-gnu
  GCC host triplet: i386-pc-linux-gnu
GCC target triplet: i386-pc-linux-gnu


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

Reply via email to