re PR tree-optimization/77605 (wrong code at -O3 on x86_64-linux-gnu)
authorRichard Biener <rguenther@suse.de>
Mon, 19 Sep 2016 06:55:17 +0000 (06:55 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Mon, 19 Sep 2016 06:55:17 +0000 (06:55 +0000)
2016-09-19  Richard Biener  <rguenther@suse.de>

PR middle-end/77605
* tree-data-ref.c (analyze_subscript_affine_affine): Use the
proper niter to bound the loops.

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

From-SVN: r240227

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/pr77605.c [new file with mode: 0644]
gcc/tree-data-ref.c

index e48f844882402fb1de84a5d53ca23ad2bd140a9d..e29c212303af0083a2ec042031f9def17b1b52e8 100644 (file)
@@ -1,3 +1,9 @@
+2016-09-19  Richard Biener  <rguenther@suse.de>
+
+       PR middle-end/77605
+       * tree-data-ref.c (analyze_subscript_affine_affine): Use the
+       proper niter to bound the loops.
+
 2016-09-19  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/77514
index 5ea3ac554d43ed4e2c0773caf1a530bee2c9ee6b..1077e173e923bfc33fd934193113d3db23b04f48 100644 (file)
@@ -1,3 +1,8 @@
+2016-09-19  Richard Biener  <rguenther@suse.de>
+
+       PR middle-end/77605
+       * gcc.dg/torture/pr77605.c: New testcase.
+
 2016-09-18  Louis Krupp  <louis.krupp@zoho.com>
 
        * gfortran.dg/pr68078.f90: XFAIL run on Darwin
diff --git a/gcc/testsuite/gcc.dg/torture/pr77605.c b/gcc/testsuite/gcc.dg/torture/pr77605.c
new file mode 100644 (file)
index 0000000..3f1a26b
--- /dev/null
@@ -0,0 +1,15 @@
+/* { dg-do run } */
+
+int a, b, c[2][8];
+
+int main ()
+{
+  for (a = 0; a < 8; a++)
+    for (b = 0; b < 2; b++)
+      c[b][a] = c[b][b + 6] ^ 1;
+
+  if (c[0][7] != 0) 
+    __builtin_abort ();
+
+  return 0; 
+}
index 58da248040f2df46bd80b38089bb8b76de28e385..8152da3f180343ad9c4382818515920130144d6e 100644 (file)
@@ -2686,13 +2686,13 @@ analyze_subscript_affine_affine (tree chrec_a,
 
              if (niter > 0)
                {
-                 HOST_WIDE_INT tau2 = MIN (FLOOR_DIV (niter - i0, i1),
-                                           FLOOR_DIV (niter - j0, j1));
+                 HOST_WIDE_INT tau2 = MIN (FLOOR_DIV (niter_a - i0, i1),
+                                           FLOOR_DIV (niter_b - j0, j1));
                  HOST_WIDE_INT last_conflict = tau2 - (x1 - i0)/i1;
 
                  /* If the overlap occurs outside of the bounds of the
                     loop, there is no dependence.  */
-                 if (x1 >= niter || y1 >= niter)
+                 if (x1 >= niter_a || y1 >= niter_b)
                    {
                      *overlaps_a = conflict_fn_no_dependence ();
                      *overlaps_b = conflict_fn_no_dependence ();