From: Steven Bosscher Date: Sat, 12 Nov 2005 00:09:48 +0000 (+0000) Subject: loop-invariant.c (move_loop_invariants): Fix a thinko in the previous checkin. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=b644b211443d729df47a7ae2abc7c776b029b094;p=gcc.git loop-invariant.c (move_loop_invariants): Fix a thinko in the previous checkin. * loop-invariant.c (move_loop_invariants): Fix a thinko in the previous checkin. From-SVN: r106809 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5a7d54f4608..285101584b6 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2005-11-11 Steven Bosscher + + * loop-invariant.c (move_loop_invariants): Fix a thinko in the + previous checkin. + 2005-11-11 Daniel Jacobowitz * tree-ssa-dse.c (struct address_walk_data, memory_ssa_name_same) diff --git a/gcc/loop-invariant.c b/gcc/loop-invariant.c index dc35aceed3b..a909e64989d 100644 --- a/gcc/loop-invariant.c +++ b/gcc/loop-invariant.c @@ -796,9 +796,22 @@ move_invariant_reg (struct loop *loop, unsigned invno, struct df *df) reg = gen_reg_rtx (GET_MODE (SET_DEST (set))); df_pattern_emit_after (df, gen_move_insn (SET_DEST (set), reg), BLOCK_FOR_INSN (inv->insn), inv->insn); - df_pattern_emit_after (df, gen_move_insn (reg, SET_SRC (set)), - preheader, BB_END (preheader)); - df_insn_delete (df, BLOCK_FOR_INSN (inv->insn), inv->insn); + + /* If the SET_DEST of the invariant insn is a reg, we can just move + the insn out of the loop. Otherwise, we have to use gen_move_insn + to let emit_move_insn produce a valid instruction stream. */ + if (REG_P (SET_DEST (set))) + { + SET_DEST (set) = reg; + reorder_insns (inv->insn, inv->insn, BB_END (preheader)); + df_insn_modify (df, preheader, inv->insn); + } + else + { + df_pattern_emit_after (df, gen_move_insn (reg, SET_SRC (set)), + preheader, BB_END (preheader)); + df_insn_delete (df, BLOCK_FOR_INSN (inv->insn), inv->insn); + } /* Replace the uses we know to be dominated. It saves work for copy propagation, and also it is necessary so that dependent invariants