From: Richard Biener Date: Wed, 24 Oct 2018 06:52:45 +0000 (+0000) Subject: re PR tree-optimization/87665 (gcc HEAD (svn: 265340) breaks elements on resize) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=bf32992748c9849c38c089477d04b546e43ccdd1;p=gcc.git re PR tree-optimization/87665 (gcc HEAD (svn: 265340) breaks elements on resize) 2018-10-24 Richard Biener PR tree-optimization/87665 * tree-vect-data-refs.c (vect_preserves_scalar_order_p): Adjust to reflect reality. * gcc.dg/torture/pr87665.c: New testcase. From-SVN: r265452 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5fe8205a94c..33c906afb09 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2018-10-24 Richard Biener + + PR tree-optimization/87665 + * tree-vect-data-refs.c (vect_preserves_scalar_order_p): Adjust + to reflect reality. + 2018-10-12 Jeff Law * config/h8300/h8300.c (h8300_expand_prologue): Fix stm generation diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1e992733ef1..fd437f58a13 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2018-10-24 Richard Biener + + PR tree-optimization/87665 + * gcc.dg/torture/pr87665.c: New testcase. + 2018-10-23 Jakub Jelinek * g++.dg/cpp2a/lambda-this3.C: Limit dg-bogus directives to c++17_down diff --git a/gcc/testsuite/gcc.dg/torture/pr87665.c b/gcc/testsuite/gcc.dg/torture/pr87665.c new file mode 100644 index 00000000000..6f5e968b628 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr87665.c @@ -0,0 +1,27 @@ +/* { dg-do run } */ + +struct X { long x; long y; }; + +struct X a[1024], b[1024]; + +void foo () +{ + for (int i = 0; i < 1024; ++i) + { + long tem = a[i].x; + a[i].x = 0; + b[i].x = tem; + b[i].y = a[i].y; + } +} + +int main() +{ + for (int i = 0; i < 1024; ++i) + a[i].x = i; + foo (); + for (int i = 0; i < 1024; ++i) + if (b[i].x != i) + __builtin_abort(); + return 0; +} diff --git a/gcc/tree-vect-data-refs.c b/gcc/tree-vect-data-refs.c index 4b3711442e6..a24e1853e03 100644 --- a/gcc/tree-vect-data-refs.c +++ b/gcc/tree-vect-data-refs.c @@ -210,16 +210,26 @@ vect_preserves_scalar_order_p (dr_vec_info *dr_info_a, dr_vec_info *dr_info_b) return true; /* STMT_A and STMT_B belong to overlapping groups. All loads in a - group are emitted at the position of the first scalar load and all + group are emitted at the position of the last scalar load and all stores in a group are emitted at the position of the last scalar store. - Thus writes will happen no earlier than their current position - (but could happen later) while reads will happen no later than their - current position (but could happen earlier). Reordering is therefore - only possible if the first access is a write. */ - stmtinfo_a = vect_orig_stmt (stmtinfo_a); - stmtinfo_b = vect_orig_stmt (stmtinfo_b); - stmt_vec_info earlier_stmt_info = get_earlier_stmt (stmtinfo_a, stmtinfo_b); - return !DR_IS_WRITE (STMT_VINFO_DATA_REF (earlier_stmt_info)); + Compute that position and check whether the resulting order matches + the current one. */ + stmt_vec_info last_a = DR_GROUP_FIRST_ELEMENT (stmtinfo_a); + if (last_a) + for (stmt_vec_info s = DR_GROUP_NEXT_ELEMENT (last_a); s; + s = DR_GROUP_NEXT_ELEMENT (s)) + last_a = get_later_stmt (last_a, s); + else + last_a = stmtinfo_a; + stmt_vec_info last_b = DR_GROUP_FIRST_ELEMENT (stmtinfo_b); + if (last_b) + for (stmt_vec_info s = DR_GROUP_NEXT_ELEMENT (last_b); s; + s = DR_GROUP_NEXT_ELEMENT (s)) + last_b = get_later_stmt (last_b, s); + else + last_b = stmtinfo_b; + return ((get_later_stmt (last_a, last_b) == last_a) + == (get_later_stmt (stmtinfo_a, stmtinfo_b) == stmtinfo_a)); } /* A subroutine of vect_analyze_data_ref_dependence. Handle