------- Comment #7 from hp at gcc dot gnu dot org  2010-09-09 04:08 -------
Bother, I should have spotted the general area of this bug faster.  It's a
matter of ifcvt.c calling
       emit_insn_before_setloc (seq, if_info->jump,
                               INSN_LOCATOR (if_info->insn_a));
when it should do
      emit_insn_before_setloc (seq, if_info->cond_earliest,
                               INSN_LOCATOR (if_info->insn_a));
(looks like most calls may be wrong)
*and* to handle the case where if_info->cond_earliest (insn 327 above) has
side-effects, since try_redirect_by_replacing_jump (a callee of
redirect_edge_and_branch_force) doesn't remove cc0 setters with side-effects
(while without the if_info->cond_earliest change, it'd see the last of the
emit_store_flag insns instead of the expected cc0 setter).  And last but not
least, decorate the new insn(s) with REG_INC notes as appropriate, as regmove
(the next pass) seems to expect them: note that insn 1223 doesn't have one.



Reply via email to