GNU C version 4.0.0 20050120 (experimental) (alphaev68-unknown-linux-gnu) Test case:
void fbSolidFillmmx(int w, unsigned char *d) { while (w >= 64) { *(unsigned long long *) (d + 0) = 0; *(unsigned long long *) (d + 8) = 0; *(unsigned long long *) (d + 16) = 0; *(unsigned long long *) (d + 24) = 0; *(unsigned long long *) (d + 32) = 0; *(unsigned long long *) (d + 40) = 0; *(unsigned long long *) (d + 48) = 0; *(unsigned long long *) (d + 56) = 0; w -= 64; d += 64; } } gives fbSolidFillmmx: cmple $16,63,$1 bne $1,$L5 lda $8,8($17) lda $7,16($17) lda $6,24($17) lda $5,32($17) lda $4,40($17) lda $3,48($17) lda $2,56($17) mov $31,$22 .align 4 $L4: stq $31,0($17) lda $22,64($22) lda $17,64($17) stq $31,0($8) subl $16,$22,$1 lda $8,64($8) stq $31,0($7) cmple $1,63,$1 lda $7,64($7) stq $31,0($6) lda $6,64($6) stq $31,0($5) lda $5,64($5) stq $31,0($4) lda $4,64($4) stq $31,0($3) lda $3,64($3) stq $31,0($2) lda $2,64($2) beq $1,$L4 $L5: ret $31,($26),1 gcc-3.4 generates reasonable code: fbSolidFillmmx: cmple $16,63,$1 bne $1,$L6 .align 4 $L11: subl $16,64,$16 stq $31,0($17) stq $31,8($17) cmple $16,63,$1 stq $31,16($17) stq $31,24($17) stq $31,32($17) stq $31,40($17) stq $31,48($17) stq $31,56($17) lda $17,64($17) beq $1,$L11 $L6: ret $31,($26),1 -- Summary: [4.0 regression] Way too many IVs Product: gcc Version: 4.0.0 Status: UNCONFIRMED Severity: normal Priority: P2 Component: tree-optimization AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: falk at debian dot org CC: gcc-bugs at gcc dot gnu dot org GCC build triplet: alphaev68-unknown-linux-gnu GCC host triplet: alphaev68-unknown-linux-gnu GCC target triplet: alphaev68-unknown-linux-gnu http://gcc.gnu.org/bugzilla/show_bug.cgi?id=19701