]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Remove the REG_EQUAL note if we don't know its invariant status.
authorH.J. Lu <hjl@gcc.gnu.org>
Thu, 18 Mar 2010 13:10:49 +0000 (06:10 -0700)
committerH.J. Lu <hjl@gcc.gnu.org>
Thu, 18 Mar 2010 13:10:49 +0000 (06:10 -0700)
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

gcc/ChangeLog
gcc/loop-invariant.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/pr43360.c [new file with mode: 0644]

index 0e9101d4fea64f4cd61c06128dfd62609f4b59da..a4254a8696955cc0676381fe115c4d05d4a9ab7f 100644 (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
index 03f0a13baa0685bade9fdab51913158c80a6ba97..57973c195233e214b72197f92413d26f847a4b28 100644 (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
index bc56c911ec3de351289d2c85f885abf72ef8cde4..4b69cb7f5799706327612fc65ad7a36bf26d5a10 100644 (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
diff --git a/gcc/testsuite/gcc.dg/torture/pr43360.c b/gcc/testsuite/gcc.dg/torture/pr43360.c
new file mode 100644 (file)
index 0000000..9ed9872
--- /dev/null
@@ -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;
+}