re PR tree-optimization/87665 (gcc HEAD (svn: 265340) breaks elements on resize)
authorRichard Biener <rguenther@suse.de>
Wed, 24 Oct 2018 06:52:45 +0000 (06:52 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Wed, 24 Oct 2018 06:52:45 +0000 (06:52 +0000)
2018-10-24  Richard Biener  <rguenther@suse.de>

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

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/pr87665.c [new file with mode: 0644]
gcc/tree-vect-data-refs.c

index 5fe8205a94cccbf2996e72408ca8c48af8c05e90..33c906afb094c06506b0c744caa3a273d2b3f67f 100644 (file)
@@ -1,3 +1,9 @@
+2018-10-24  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/87665
+       * tree-vect-data-refs.c (vect_preserves_scalar_order_p): Adjust
+       to reflect reality.
+
 2018-10-12  Jeff Law  <law@redhat.com>
 
         * config/h8300/h8300.c (h8300_expand_prologue): Fix stm generation
index 1e992733ef120079678d74d9555e4101be26bab1..fd437f58a13e11a45ece8ccea61d0b5866490ca9 100644 (file)
@@ -1,3 +1,8 @@
+2018-10-24  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/87665
+       * gcc.dg/torture/pr87665.c: New testcase.
+
 2018-10-23  Jakub Jelinek  <jakub@redhat.com>
 
        * 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 (file)
index 0000000..6f5e968
--- /dev/null
@@ -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;
+}
index 4b3711442e680d8aaca37e50f55f3ab7791acd55..a24e1853e038325e35ededa2feb5d9d40d17931f 100644 (file)
@@ -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