diff options
author | H.J. Lu <hjl@gcc.gnu.org> | 2010-03-18 06:10:49 -0700 |
---|---|---|
committer | H.J. Lu <hjl@gcc.gnu.org> | 2010-03-18 06:10:49 -0700 |
commit | 82fa5f8aa727db4ab9f172ddc454fc25325b82ca (patch) | |
tree | 2e9989fbc201d38d90f3ecc75bcfe7e74cb4b8ef /gcc/loop-invariant.c | |
parent | eb45755f642d26039a0422bfbc457b08c6a3fcde (diff) | |
download | gcc-82fa5f8aa727db4ab9f172ddc454fc25325b82ca.zip gcc-82fa5f8aa727db4ab9f172ddc454fc25325b82ca.tar.gz gcc-82fa5f8aa727db4ab9f172ddc454fc25325b82ca.tar.bz2 |
Remove the REG_EQUAL note if we don't know its invariant status.
gcc/
2010-03-18 Steven Bosscher <steven@gcc.gnu.org>
Eric Botcazou <ebotcazou@adacore.com>
PR rtl-optimization/43360
* loop-invariant.c (move_invariant_reg): Remove the REG_EQUAL
note if we don't know its invariant status.
gcc/testsuite/
2010-03-18 H.J. Lu <hongjiu.lu@intel.com>
PR rtl-optimization/43360
* gcc.dg/torture/pr43360.c: New.
From-SVN: r157539
Diffstat (limited to 'gcc/loop-invariant.c')
-rw-r--r-- | gcc/loop-invariant.c | 18 |
1 files changed, 10 insertions, 8 deletions
diff --git a/gcc/loop-invariant.c b/gcc/loop-invariant.c index 03f0a13..57973c1 100644 --- a/gcc/loop-invariant.c +++ b/gcc/loop-invariant.c @@ -1423,14 +1423,16 @@ move_invariant_reg (struct loop *loop, unsigned invno) emit_insn_after (gen_move_insn (dest, reg), 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 - 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))) + /* If there is a REG_EQUAL note on the insn we just moved, and the + insn is in a basic block that is not always executed or the note + contains something for which we don't know the invariant status, + 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, so it is safe to retain the note even if it contains + register references for which we know the invariant status. */ + if ((note = find_reg_note (inv->insn, REG_EQUAL, NULL_RTX)) + && (!inv->always_executed + || !check_maybe_invariant (XEXP (note, 0)))) remove_note (inv->insn, note); } else |