aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@gcc.gnu.org>2013-01-08 19:00:10 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2013-01-08 19:00:10 +0100
commitc6d851b95a7bd268c9ba8576d77e057fa162b855 (patch)
treefb756f10444e5e6416cb8b94e292ce75b17b24f4
parent4369c11e008025946fee81886a4b4a841c910408 (diff)
downloadgcc-c6d851b95a7bd268c9ba8576d77e057fa162b855.zip
gcc-c6d851b95a7bd268c9ba8576d77e057fa162b855.tar.gz
gcc-c6d851b95a7bd268c9ba8576d77e057fa162b855.tar.bz2
re PR rtl-optimization/55845 (454.calculix miscompares with -march=btver2 -O3 -ffastmath -fschedule-insns -mvzeroupper for test data run)
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. * gcc.target/i386/pr55845.c: New test. From-SVN: r195028
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/df-problems.c8
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/gcc.target/i386/pr55845.c39
4 files changed, 60 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 757ee86..83e0297 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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.
diff --git a/gcc/df-problems.c b/gcc/df-problems.c
index 89a6189..0af593d 100644
--- a/gcc/df-problems.c
+++ b/gcc/df-problems.c
@@ -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
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index eab4c35..d509109 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..59f7520
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr55845.c
@@ -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 ();
+}