------- Comment #2 from christophe dot jaillet at wanadoo dot fr 2006-07-14 21:11 ------- I tried to compile it on my cygwin box and had a strange (and certainly unrelated) behaviour :
gcc -O3 test.c -S Version 3.4.4 (must be the latest version available on cygwin :() Description : the case 1 is tested in two times. First <=2 then == 1. I think that it is useless and that if cmpl $2, %ebx jle L9 was turned into cmpl $1,%ebx je L9 the second test after L9: would be useless. See code below. .file "test.c" .def ___main; .scl 2; .type 32; .endef .text .p2align 4,,15 .globl _main .def _main; .scl 2; .type 32; .endef _main: pushl %ebp movl $16, %eax movl %esp, %ebp pushl %ebx subl $4, %esp andl $-16, %esp call __alloca call ___main cmpl $2, %ebx je L4 cmpl $2, %ebx jle L9 ==> every thing <= 2 cmpl $3, %ebx je L10 L6: movb $13, (%ebx) xorl %eax, %eax movb $13, 1(%ebx) movb $13, 2(%ebx) movb $13, 3(%ebx) movl -4(%ebp), %ebx leave ret .p2align 4,,7 L9: cmpl $1, %ebx ==> Now comparaison against 1 is done ! jne L6 movb $13, (%ebx) xorl %eax, %eax movl -4(%ebp), %ebx leave ret .p2align 4,,7 L4: movb $13, (%ebx) xorl %eax, %eax movb $13, 1(%ebx) movl -4(%ebp), %ebx leave ret .p2align 4,,7 L10: movb $13, (%ebx) xorl %eax, %eax movb $13, 1(%ebx) movb $13, 2(%ebx) movl -4(%ebp), %ebx leave ret -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=11832