From 4cbf07a7c6eee3cf43597729308772d901b6ebee Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Tue, 27 Sep 2016 12:44:42 +0000 Subject: [PATCH] re PR target/77478 (Incorrect code generated with -O3, m32, -msse2 and -ffast-math) 2016-09-27 Richard Biener 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 | 6 ++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/torture/pr77478.c | 22 ++++++++++++++++++++++ gcc/tree-vect-loop-manip.c | 2 +- 4 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.dg/torture/pr77478.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6ba0ee89947f..9405df9945e0 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2016-09-27 Richard Biener + + 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 Backport from trunk r227496 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a84b42d85d1b..a4bd3ed4856f 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-09-27 Richard Biener + + PR tree-optimization/77478 + * gcc.dg/torture/pr77478.c: New testcase. + 2016-09-27 Senthil Kumar Selvaraj 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 index 000000000000..b5965bf574fd --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr77478.c @@ -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); +} diff --git a/gcc/tree-vect-loop-manip.c b/gcc/tree-vect-loop-manip.c index a344a49948b7..6b0295128fc2 100644 --- a/gcc/tree-vect-loop-manip.c +++ b/gcc/tree-vect-loop-manip.c @@ -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)); -- 2.47.2