Commit 90b1c344 by Zdenek Dvorak Committed by Zdenek Dvorak

re PR rtl-optimization/26449 (ICE in loop invariant motion)

	PR rtl-optimization/26449
	* loop-invariant.c (move_invariant_reg): Do not use force_operand.
	(seq_insns_valid_p): Removed.

From-SVN: r128549
parent 6e872811
2007-09-17 Zdenek Dvorak <ook@ucw.cz>
PR rtl-optimization/26449
* loop-invariant.c (move_invariant_reg): Do not use force_operand.
(seq_insns_valid_p): Removed.
2007-09-17 Eric Botcazou <ebotcazou@adacore.com>
* tree-nomudflap.c (gate_mudflap): New static function.
......@@ -1154,20 +1154,6 @@ find_invariants_to_move (void)
}
}
/* Returns true if all insns in SEQ are valid. */
static bool
seq_insns_valid_p (rtx seq)
{
rtx x;
for (x = seq; x; x = NEXT_INSN (x))
if (insn_invalid_p (x))
return false;
return true;
}
/* Move invariant INVNO out of the LOOP. Returns true if this succeeds, false
otherwise. */
......@@ -1178,7 +1164,7 @@ move_invariant_reg (struct loop *loop, unsigned invno)
struct invariant *repr = VEC_index (invariant_p, invariants, inv->eqto);
unsigned i;
basic_block preheader = loop_preheader_edge (loop)->src;
rtx reg, set, dest, seq, op;
rtx reg, set, dest, note;
struct use *use;
bitmap_iterator bi;
......@@ -1209,16 +1195,12 @@ move_invariant_reg (struct loop *loop, unsigned invno)
dest = SET_DEST (set);
reg = gen_reg_rtx (GET_MODE (dest));
/* If the SET_DEST of the invariant insn is a pseudo, 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 (dest) && !HARD_REGISTER_P (dest))
{
rtx note;
/* Try replacing the destination by a new pseudoregister. */
if (!validate_change (inv->insn, &SET_DEST (set), reg, false))
goto fail;
df_insn_rescan (inv->insn);
emit_insn_after (gen_move_insn (dest, reg), inv->insn);
SET_DEST (set) = reg;
df_insn_rescan (inv->insn);
reorder_insns (inv->insn, inv->insn, BB_END (preheader));
/* If there is a REG_EQUAL note on the insn we just moved, and
......@@ -1233,29 +1215,6 @@ move_invariant_reg (struct loop *loop, unsigned invno)
}
else
{
start_sequence ();
op = force_operand (SET_SRC (set), reg);
if (!op)
{
end_sequence ();
goto fail;
}
if (op != reg)
emit_move_insn (reg, op);
seq = get_insns ();
unshare_all_rtl_in_chain (seq);
end_sequence ();
if (!seq_insns_valid_p (seq))
goto fail;
emit_insn_after (seq, BB_END (preheader));
emit_insn_after (gen_move_insn (dest, reg), inv->insn);
delete_insn (inv->insn);
}
}
else
{
if (!move_invariant_reg (loop, repr->invno))
goto fail;
reg = repr->reg;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment