I have a C code:
void f();
void i(unsigned n) {
while (n-- > 0) {
f();
}
}
Which when compiled with -O3 on i586 produces the assembly:
i:
pushl %ebp
movl %esp, %ebp
pushl %esi
movl 8(%ebp), %esi
pushl %ebx
testl %esi, %esi
je .L5
xorl %ebx, %ebx
.p2align 4,,7
.L4:
addl $1, %ebx
call f
cmpl %esi, %ebx
jne .L4
.L5:
popl %ebx
popl %esi
popl %ebp
ret
And obviously shorter assembly with one less instruction in the loop is:
i:
pushl %ebp
movl %esp, %ebp
pushl %esi
movl 8(%ebp), %esi
testl %esi, %esi
je .L5
.p2align 4,,7
.L4:
call f
dec %esi
jl .L4
.L5:
popl %esi
popl %ebp
ret
This is a very short and basic loop occurring in programs many times.
That's why this should be optimized very well.
--
Summary: Simple loop isn't optimized well
Product: gcc
Version: 4.2.1
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: yuri at tsoft dot com
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=35776