------- Comment #6 from kazu at gcc dot gnu dot org 2006-05-10 15:00 ------- The combiner seems to be doing something strange:
(insn 13 12 16 2 (set (reg:HI 21) (eq:HI (cc0) (const_int 0 [0x0]))) 237 {*bstzhireg} (nil) (nil)) (insn 16 13 17 2 (set (cc0) (reg:HI 21)) 114 {tsthi} (insn_list:REG_DEP_TRUE 13 (nil)) (nil)) (jump_insn 17 16 19 2 (set (pc) (if_then_else (eq (cc0) (const_int 0 [0x0])) (label_ref:SI 39) (pc))) 181 {branch_true} (nil) (expr_list:REG_BR_PROB (const_int 5347 [0x14e3]) (nil))) is transformed to (insn 16 13 17 2 (set (pc) (if_then_else (ne (cc0) (const_int 0 [0x0])) (label_ref:SI 39) (pc))) 181 {branch_true} (nil) (nil)) (jump_insn 17 16 19 2 (set (reg:HI 21) (eq:HI (cc0) (const_int 0 [0x0]))) 237 {*bstzhireg} (nil) (expr_list:REG_BR_PROB (const_int 5347 [0x14e3]) (nil))) Note that the combiner puts a branch instruction one insn before the last insn in the basic block. -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=27477