re PR rtl-optimization/47925 (delete_trivially_dead_insns mishandles volatile mems)
authorRichard Sandiford <richard.sandiford@linaro.org>
Wed, 2 Mar 2011 13:25:10 +0000 (13:25 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Wed, 2 Mar 2011 13:25:10 +0000 (13:25 +0000)
gcc/
PR rtl-optimization/47925
* cse.c (count_reg_usage): Don't ignore the SET_DEST of instructions
with side effects.  Remove the more-specific check for volatile asms.

gcc/testsuite/
PR rtl-optimization/47925
* gcc.c-torture/execute/pr47925.c: New test.

From-SVN: r170613

gcc/ChangeLog
gcc/cse.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/execute/pr47925.c [new file with mode: 0644]

index 1bdc9babb338814c1a717886404a74c9c604ee55..3f58172a070534620c3f105b3b703baf6b0b0301 100644 (file)
@@ -1,3 +1,9 @@
+2011-03-02  Richard Sandiford  <richard.sandiford@linaro.org>
+
+       PR rtl-optimization/47925
+       * cse.c (count_reg_usage): Don't ignore the SET_DEST of instructions
+       with side effects.  Remove the more-specific check for volatile asms.
+
 2011-03-02  Alan Modra  <amodra@gmail.com>
 
        PR target/47935
index 3ab6b37a8ea99f51cad920714aa7f161ceff7884..f7b477c60b1fa994f8d76cb0472e63956ffbb805 100644 (file)
--- a/gcc/cse.c
+++ b/gcc/cse.c
@@ -6575,8 +6575,9 @@ check_for_label_ref (rtx *rtl, void *data)
    Don't count a usage of DEST, which is the SET_DEST of a SET which
    contains X in its SET_SRC.  This is because such a SET does not
    modify the liveness of DEST.
-   DEST is set to pc_rtx for a trapping insn, which means that we must count
-   uses of a SET_DEST regardless because the insn can't be deleted here.  */
+   DEST is set to pc_rtx for a trapping insn, or for an insn with side effects.
+   We must then count uses of a SET_DEST regardless, because the insn can't be
+   deleted here.  */
 
 static void
 count_reg_usage (rtx x, int *counts, rtx dest, int incr)
@@ -6629,9 +6630,10 @@ count_reg_usage (rtx x, int *counts, rtx dest, int incr)
     case CALL_INSN:
     case INSN:
     case JUMP_INSN:
-      /* We expect dest to be NULL_RTX here.  If the insn may trap, mark
-         this fact by setting DEST to pc_rtx.  */
-      if (insn_could_throw_p (x))
+      /* We expect dest to be NULL_RTX here.  If the insn may trap,
+        or if it cannot be deleted due to side-effects, mark this fact
+        by setting DEST to pc_rtx.  */
+      if (insn_could_throw_p (x) || side_effects_p (PATTERN (x)))
        dest = pc_rtx;
       if (code == CALL_INSN)
        count_reg_usage (CALL_INSN_FUNCTION_USAGE (x), counts, dest, incr);
@@ -6671,10 +6673,6 @@ count_reg_usage (rtx x, int *counts, rtx dest, int incr)
       return;
 
     case ASM_OPERANDS:
-      /* If the asm is volatile, then this insn cannot be deleted,
-        and so the inputs *must* be live.  */
-      if (MEM_VOLATILE_P (x))
-       dest = NULL_RTX;
       /* Iterate over just the inputs, not the constraints as well.  */
       for (i = ASM_OPERANDS_INPUT_LENGTH (x) - 1; i >= 0; i--)
        count_reg_usage (ASM_OPERANDS_INPUT (x, i), counts, dest, incr);
index 49a1c1df2868cd03fd70a9c21e3769cb232387c3..ebe736c457b1cef08cd6c5dfc99a4aeedfa0d1d4 100644 (file)
@@ -1,3 +1,8 @@
+2011-03-02  Richard Sandiford  <richard.sandiford@linaro.org>
+
+       PR rtl-optimization/47925
+       * gcc.c-torture/execute/pr47925.c: New test.
+
 2011-03-01  Jason Merrill  <jason@redhat.com>
 
        * g++.dg/cpp0x/decltype25.C: New.
diff --git a/gcc/testsuite/gcc.c-torture/execute/pr47925.c b/gcc/testsuite/gcc.c-torture/execute/pr47925.c
new file mode 100644 (file)
index 0000000..89f54c1
--- /dev/null
@@ -0,0 +1,24 @@
+struct s { volatile struct s *next; };
+
+void __attribute__((noinline))
+bar (int ignored, int n)
+{
+  asm volatile ("");
+}
+
+int __attribute__((noinline))
+foo (volatile struct s *ptr, int n)
+{
+  int i;
+
+  bar (0, n);
+  for (i = 0; i < n; i++)
+    ptr = ptr->next;
+}
+
+int main (void)
+{
+  volatile struct s rec = { &rec };
+  foo (&rec, 10);
+  return 0;
+}