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
This commit is contained in:
H.J. Lu 2010-03-18 06:10:49 -07:00
parent eb45755f64
commit 82fa5f8aa7
4 changed files with 42 additions and 8 deletions

View File

@ -1,3 +1,10 @@
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.
2010-03-18 Michael Matz <matz@suse.de>
PR tree-optimization/43402

View File

@ -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

View File

@ -1,3 +1,8 @@
2010-03-18 H.J. Lu <hongjiu.lu@intel.com>
PR rtl-optimization/43360
* gcc.dg/torture/pr43360.c: New.
2010-03-18 Michael Matz <matz@suse.de>
PR tree-optimization/43402

View File

@ -0,0 +1,20 @@
/* { dg-do run } */
int l_5_5_2 = 4;
int g_3[1][1];
void func_1 (void)
{
for (g_3[0][0] = 1; g_3[0][0] < 8; g_3[0][0] += 7) {
int *l_6 = &g_3[0][0];
*l_6 = l_5_5_2;
}
}
int main (void)
{
func_1 ();
if (g_3[0][0] != 11)
__builtin_abort ();
return 0;
}