The attached code produces some garbage. With -O3 even worse. Attached source and assembly file.

Fikret Skrgic
int main()
{
        unsigned * a=malloc(100000000*sizeof(unsigned)), * b=a+1, * c=a+2, * 
d=a+3;
        register unsigned x, y, z, w;
        register int i;
        for(i=0;i<6250000;i++)
        {
                x+=*a;
                a+=4;
                y+=*b;
                b+=4;
                z+=*c;
                c+=4;
                w+=*d;
                d+=4;
                x+=*a;
                a+=4;
                y+=*b;
                b+=4;
                z+=*c;
                c+=4;
                w+=*d;
                d+=4;
                x+=*a;
                a+=4;
                y+=*b;
                b+=4;
                z+=*c;
                c+=4;
                w+=*d;
                d+=4;
                x+=*a;
                a+=4;
                y+=*b;
                b+=4;
                z+=*c;
                c+=4;
                w+=*d;
                d+=4;
        }
        x+=(y+z+w);
}
        .file   "bug.c"
        .text
.globl main
        .type   main, @function
main:
        pushl   %ebp
        movl    %esp, %ebp
        subl    $24, %esp
        andl    $-16, %esp
        movl    $0, %eax
        addl    $15, %eax
        addl    $15, %eax
        shrl    $4, %eax
        sall    $4, %eax
        subl    %eax, %esp
        subl    $12, %esp
        pushl   $400000000
        call    malloc
        addl    $16, %esp
        movl    %eax, -4(%ebp)
        movl    -4(%ebp), %eax
        addl    $4, %eax
        movl    %eax, -8(%ebp)
        movl    -4(%ebp), %eax
        addl    $8, %eax
        movl    %eax, -12(%ebp)
        movl    -4(%ebp), %eax
        addl    $12, %eax
        movl    %eax, -16(%ebp)
        movl    $0, -20(%ebp)
.L2:
        cmpl    $6249999, -20(%ebp)
        jg      .L3
        leal    -4(%ebp), %eax
        addl    $16, (%eax)
        leal    -8(%ebp), %eax
        addl    $16, (%eax)
        leal    -12(%ebp), %eax
        addl    $16, (%eax)
        leal    -16(%ebp), %eax
        addl    $16, (%eax)
        leal    -4(%ebp), %eax
        addl    $16, (%eax)
        leal    -8(%ebp), %eax
        addl    $16, (%eax)
        leal    -12(%ebp), %eax
        addl    $16, (%eax)
        leal    -16(%ebp), %eax
        addl    $16, (%eax)
        leal    -4(%ebp), %eax
        addl    $16, (%eax)
        leal    -8(%ebp), %eax
        addl    $16, (%eax)
        leal    -12(%ebp), %eax
        addl    $16, (%eax)
        leal    -16(%ebp), %eax
        addl    $16, (%eax)
        leal    -4(%ebp), %eax
        addl    $16, (%eax)
        leal    -8(%ebp), %eax
        addl    $16, (%eax)
        leal    -12(%ebp), %eax
        addl    $16, (%eax)
        leal    -16(%ebp), %eax
        addl    $16, (%eax)
        incl    -20(%ebp)
        jmp     .L2
.L3:
        leave
        ret
        .size   main, .-main
        .section        .note.GNU-stack,"",@progbits
        .ident  "GCC: (GNU) 3.4.2 20041017 (Red Hat 3.4.2-6.fc3)"
        .file   "bug.c"
        .text
        .p2align 2,,3
.globl main
        .type   main, @function
main:
        pushl   %ebp
        movl    %esp, %ebp
        subl    $8, %esp
        andl    $-16, %esp
        subl    $28, %esp
        pushl   $400000000
        call    malloc
        addl    $16, %esp
        movl    $6249999, %eax
        .p2align 2,,3
.L5:
        decl    %eax
        jns     .L5
        leave
        ret
        .size   main, .-main
        .section        .note.GNU-stack,"",@progbits
        .ident  "GCC: (GNU) 3.4.2 20041017 (Red Hat 3.4.2-6.fc3)"

Reply via email to