------- Comment #2 from ubizjak at gmail dot com 2007-06-06 08:15 ------- (In reply to comment #0)
> After the addition, which sets the ALU flags, the compiler issues two compare > instructions and conditional branches. This sequence could be replaced by a > conditional branch following the addl, testing one of the flags (overflow? > carry? I forget which) set by it. in config/i386/i386-modes.def, documentation says: Add CCGOC to indicate comparisons against zero that allows unspecified garbage in the Carry and Overflow flag. This mode is used to simulate comparisons of (a-b) and (a+b) against zero using sub/cmp/add operations. addl operates in CCGOCmode, but you are requesting GTU conditional jump that requires Carry flag=0 and Zero flag=0. GTU is incompatible with CCGOCmode due to Carry flag handling. Change one of conditions to "if (sum == 0) abort();" and you will see insn elimination in action. And BTW - wrapping is undefined operation. -- ubizjak at gmail dot com changed: What |Removed |Added ---------------------------------------------------------------------------- Status|UNCONFIRMED |RESOLVED Resolution| |INVALID http://gcc.gnu.org/bugzilla/show_bug.cgi?id=30315