------- 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