------- Comment #8 from steven at gcc dot gnu dot org 2008-02-03 12:26 ------- We call try_combine() with the following insns:
i1: (insn 8 7 9 2 t.c:4 (set (reg/v:SI 94 [ i ]) (reg:SI 28 %r28)) 37 {*pa.md:2542} (expr_list:REG_DEAD (reg:SI 28 %r28) (nil))) i2: (insn 31 10 32 2 t.c:5 (set (reg:SI 101) (neg:SI (reg/v:SI 94 [ i ]))) 136 {negsi2} (nil)) i3: (insn 32 31 16 2 t.c:5 (set (reg/v:SI 94 [ i ]) (if_then_else:SI (ge (reg/v:SI 94 [ i ]) (reg:SI 98)) (reg:SI 101) (reg/v:SI 94 [ i ]))) 24 {*pa.md:1388} (expr_list:REG_DEAD (reg:SI 101) (expr_list:REG_DEAD (reg:SI 98) (nil)))) At this point, r98 holds the value -10000. In i1 the returned result of ret1() is loaded into "i". Somehow combine decides that the above sequence is equal to "i = abs(i)", losing the comparison to -10000 as if it is a comparison against zero. -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=34627