]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR target/77478 (Incorrect code generated with -O3, m32, -msse2 and -ffast-math)
authorRichard Biener <rguenther@suse.de>
Tue, 27 Sep 2016 12:44:42 +0000 (12:44 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Tue, 27 Sep 2016 12:44:42 +0000 (12:44 +0000)
2016-09-27  Richard Biener  <rguenther@suse.de>

PR tree-optimization/77478
* tree-vect-loop-manip.c (vect_gen_niters_for_prolog_loop):
Fix alignment of SSA var used before the alignment prologue.

* gcc.dg/torture/pr77478.c: New testcase.

From-SVN: r240532

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/pr77478.c [new file with mode: 0644]
gcc/tree-vect-loop-manip.c

index 6ba0ee89947f73994344de0d6e9467074982eff3..9405df9945e0f116bc8647a512dbd0324fadac1e 100644 (file)
@@ -1,3 +1,9 @@
+2016-09-27  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/77478
+       * tree-vect-loop-manip.c (vect_gen_niters_for_prolog_loop):
+       Fix alignment of SSA var used before the alignment prologue.
+
 2016-09-27  Senthil Kumar Selvaraj  <senthil_kumar.selvaraj@atmel.com>
 
        Backport from trunk r227496
index a84b42d85d1b9392c19f64b6ec4268c275eb7bcf..a4bd3ed4856feff56f35ae220522fb49ed1a5a39 100644 (file)
@@ -1,3 +1,8 @@
+2016-09-27  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/77478
+       * gcc.dg/torture/pr77478.c: New testcase.
+
 2016-09-27  Senthil Kumar Selvaraj  <senthil_kumar.selvaraj@atmel.com>
 
        Backport from trunk r227496
diff --git a/gcc/testsuite/gcc.dg/torture/pr77478.c b/gcc/testsuite/gcc.dg/torture/pr77478.c
new file mode 100644 (file)
index 0000000..b5965bf
--- /dev/null
@@ -0,0 +1,22 @@
+/* { dg-do run } */
+/* { dg-additional-options "-ffast-math" } */
+
+static const float A[10] = {1};
+
+float
+foo(float *f, int n)
+{
+  int i, j;
+  float a = 0, b = 0;
+  for (i = n/2; i < n; i++)
+    a += f[i]*.1f;
+  for (i = n/2, j = 0; i < n; i++, j++)
+    b += f[i]*A[j]+a*A[j];
+  return b;
+}
+
+int main()
+{
+  float a[21] = {0};
+  return foo(a+1, 20) + foo(a, 20);
+}
index a344a49948b7f7e54b7d9d4c5c45492ebd3f130b..6b0295128fc238422eaed3a642763b1503c92074 100644 (file)
@@ -1886,7 +1886,7 @@ vect_gen_niters_for_prolog_loop (loop_vec_info loop_vinfo, tree loop_niters, int
       gimple_seq new_stmts = NULL;
       bool negative = tree_int_cst_compare (DR_STEP (dr), size_zero_node) < 0;
       tree offset = negative
-         ? size_int (-TYPE_VECTOR_SUBPARTS (vectype) + 1) : NULL_TREE;
+         ? size_int (-TYPE_VECTOR_SUBPARTS (vectype) + 1) : size_zero_node;
       tree start_addr = vect_create_addr_base_for_vector_ref (dr_stmt,
                                                &new_stmts, offset, loop);
       tree type = unsigned_type_for (TREE_TYPE (start_addr));