When two comparisons immediately follow each other that compare same numbers but branch twice based on 3 possible comparison outcomes actual comparison is performed twice in asm code. One comparision suffices.
Also if second branches are strongly disadvantaged even pre-jxx mov for each branch should be moved outside of the main body of the function. Yuri (yuri at ONLYtsoftLOWER CASEcomMATTERS) -- begin code -- int f(int k) { if (k < 300) return (10); if (k > 300) return (-10); return (0); } int main() { f(299); } -- end code -- obtained assembly log: 0: 55 push %ebp 1: 89 e5 mov %esp,%ebp 3: 8b 55 08 mov 0x8(%ebp),%edx 6: 81 fa 2b 01 00 00 cmp $0x12b,%edx c: b8 0a 00 00 00 mov $0xa,%eax 11: 7e 0f jle 22 <_Z1fi+0x22> 13: 81 fa 2c 01 00 00 cmp $0x12c,%edx 19: b8 f6 ff ff ff mov $0xfffffff6,%eax 1e: 7f 02 jg 22 <_Z1fi+0x22> 20: 31 c0 xor %eax,%eax 22: c9 leave 23: c3 ret expected assembly log: : 55 push %ebp : 89 e5 mov %esp,%ebp : 8b 55 08 mov 0x8(%ebp),%edx : 81 fa 2b 01 00 00 cmp $0x12b,%edx : b8 0a 00 00 00 mov $0xa,%eax : 7e 0f jle 22 <_Z1fi+ret> : b8 f6 ff ff ff mov $0xfffffff6,%eax : 7f 02 je 22 <_Z1fi+ret> : 31 c0 xor %eax,%eax ret: c9 leave : c3 ret -- Summary: suboptimal multiple branch comparison code produced Product: gcc Version: 3.4.2 Status: UNCONFIRMED Severity: enhancement Priority: P2 Component: rtl-optimization AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: yuri at tsoft dot com CC: gcc-bugs at gcc dot gnu dot org http://gcc.gnu.org/bugzilla/show_bug.cgi?id=19702