PR rtl-optimization/55845
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 8 Jan 2013 18:00:10 +0000 (18:00 +0000)
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 8 Jan 2013 18:00:10 +0000 (18:00 +0000)
* df-problems.c (can_move_insns_across): Stop scanning at
volatile_insn_p source instruction or give up if
across_from .. across_to range contains any volatile_insn_p
instructions.

* gcc.target/i386/pr55845.c: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@195028 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/df-problems.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/pr55845.c [new file with mode: 0644]

index 757ee86..83e0297 100644 (file)
@@ -1,3 +1,12 @@
+2012-01-08  Jakub Jelinek  <jakub@redhat.com>
+           Uros Bizjak  <ubizjak@gmail.com>
+
+       PR rtl-optimization/55845
+       * df-problems.c (can_move_insns_across): Stop scanning at
+       volatile_insn_p source instruction or give up if
+       across_from .. across_to range contains any volatile_insn_p
+       instructions.
+
 2013-01-08  Tejas Belagod  <tejas.belagod@arm.com>
 
        * config/aarch64/aarch64-simd.md (vec_init<mode>): New. 
index 89a6189..0af593d 100644 (file)
@@ -1,6 +1,6 @@
 /* Standard problems for dataflow support routines.
    Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
-   2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
+   2008, 2009, 2010, 2011, 2012, 2013 Free Software Foundation, Inc.
    Originally contributed by Michael P. Hayes
              (m.hayes@elec.canterbury.ac.nz, mhayes@redhat.com)
    Major rewrite contributed by Danny Berlin (dberlin@dberlin.org)
@@ -3858,6 +3858,8 @@ can_move_insns_across (rtx from, rtx to, rtx across_from, rtx across_to,
        }
       if (NONDEBUG_INSN_P (insn))
        {
+         if (volatile_insn_p (PATTERN (insn)))
+           return false;
          memrefs_in_across |= for_each_rtx (&PATTERN (insn), find_memory,
                                             NULL);
          note_stores (PATTERN (insn), find_memory_stores,
@@ -3917,7 +3919,9 @@ can_move_insns_across (rtx from, rtx to, rtx across_from, rtx across_to,
       if (NONDEBUG_INSN_P (insn))
        {
          if (may_trap_or_fault_p (PATTERN (insn))
-             && (trapping_insns_in_across || other_branch_live != NULL))
+             && (trapping_insns_in_across
+                 || other_branch_live != NULL
+                 || volatile_insn_p (PATTERN (insn))))
            break;
 
          /* We cannot move memory stores past each other, or move memory
index eab4c35..d509109 100644 (file)
@@ -1,3 +1,9 @@
+2012-01-08  Uros Bizjak  <ubizjak@gmail.com>
+           Vladimir Yakovlev  <vladimir.b.yakovlev@intel.com>
+
+       PR rtl-optimization/55845
+       * gcc.target/i386/pr55845.c: New test.
+
 2013-01-08  Tejas Belagod  <tejas.belagod@arm.com>
 
        * gcc.target/aarch64/vect-mull-compile.c: Explicitly scan for 
diff --git a/gcc/testsuite/gcc.target/i386/pr55845.c b/gcc/testsuite/gcc.target/i386/pr55845.c
new file mode 100644 (file)
index 0000000..59f7520
--- /dev/null
@@ -0,0 +1,39 @@
+/* { dg-do run } */
+/* { dg-require-effective-target avx } */
+/* { dg-options "-O3 -ffast-math -fschedule-insns -mavx -mvzeroupper" } */
+
+#include "avx-check.h"
+
+#define N 100
+
+double
+__attribute__((noinline))
+foo (int size, double *y, double *x)
+{
+  double sum = 0.0;
+  int i;
+  for (i = 0, sum = 0.; i < size; i++)
+    sum += y[i] * x[i];
+  return sum;
+}
+
+static void
+__attribute__ ((noinline))
+avx_test ()
+{
+  double x[N];
+  double y[N];
+  double s;
+  int i;
+
+  for (i = 0; i < N; i++)
+    {
+      x[i] = i;
+      y[i] = i;
+    }
+
+  s = foo (N, y, x);
+
+  if (s != 328350.0)
+    abort ();
+}