loop-invariant.c (move_loop_invariants): Fix a thinko in the previous checkin.
authorSteven Bosscher <stevenb@suse.de>
Sat, 12 Nov 2005 00:09:48 +0000 (00:09 +0000)
committerSteven Bosscher <steven@gcc.gnu.org>
Sat, 12 Nov 2005 00:09:48 +0000 (00:09 +0000)
* loop-invariant.c (move_loop_invariants): Fix a thinko in the
previous checkin.

From-SVN: r106809

gcc/ChangeLog
gcc/loop-invariant.c

index 5a7d54f4608ac894a36fa7d2b69c601e4bec97ae..285101584b67018e2289b10bfb10e2150a73a2f2 100644 (file)
@@ -1,3 +1,8 @@
+2005-11-11  Steven Bosscher  <stevenb@suse.de>
+
+       * loop-invariant.c (move_loop_invariants): Fix a thinko in the
+       previous checkin.
+
 2005-11-11  Daniel Jacobowitz  <dan@codesourcery.com>
 
        * tree-ssa-dse.c (struct address_walk_data, memory_ssa_name_same)
index dc35aceed3b3f365b520fd16fbc5efa426e2ecf8..a909e64989d812fb81f6f5e69d60247afd081c2a 100644 (file)
@@ -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