From: Steven Bosscher Date: Sat, 12 May 2007 18:12:54 +0000 (+0000) Subject: re PR rtl-optimization/31848 (Invalid loop optimization causes bootstrap failure... X-Git-Tag: releases/gcc-4.3.0~5122 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=7f6055d052b5e8407b136322af334a62b2f2719d;p=thirdparty%2Fgcc.git re PR rtl-optimization/31848 (Invalid loop optimization causes bootstrap failure in genautomata) PR rtl-optimization/31848 * loop-invariant.c (move_invariant_reg): If we move an insn with a REG_EQUAL note, and that insn is not always executed, remove the REG_EQUAL note. From-SVN: r124639 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index bc7e921124fc..32fa23943de5 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2007-05-12 Steven Bosscher + + PR rtl-optimization/31848 + * loop-invariant.c (move_invariant_reg): If we move an insn + with a REG_EQUAL note, and that insn is not always executed, + remove the REG_EQUAL note. + 2007-05-12 Richard Guenther PR tree-optimization/31797 diff --git a/gcc/loop-invariant.c b/gcc/loop-invariant.c index 304e424cf2d7..613bfb11e2f8 100644 --- a/gcc/loop-invariant.c +++ b/gcc/loop-invariant.c @@ -1156,9 +1156,21 @@ move_invariant_reg (struct loop *loop, unsigned invno) to let emit_move_insn produce a valid instruction stream. */ if (REG_P (dest) && !HARD_REGISTER_P (dest)) { + rtx note; + emit_insn_after (gen_move_insn (dest, reg), inv->insn); SET_DEST (set) = reg; reorder_insns (inv->insn, inv->insn, BB_END (preheader)); + + /* If there is a REG_EQUAL note on the insn we just moved, and + insn is in a basic block that is not always executed, the note + may no longer be valid after we move the insn. + Note that uses in REG_EQUAL notes are taken into account in + the computation of invariants. Hence it is safe to retain the + note even if the note contains register references. */ + if (! inv->always_executed + && (note = find_reg_note (inv->insn, REG_EQUAL, NULL_RTX))) + remove_note (inv->insn, note); } else {