re PR tree-optimization/88651 (tree-data-ref.c:3764:26: runtime error: signed integer...
authorRichard Biener <rguenther@suse.de>
Wed, 2 Jan 2019 13:52:03 +0000 (13:52 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Wed, 2 Jan 2019 13:52:03 +0000 (13:52 +0000)
2019-01-02  Richard Biener  <rguenther@suse.de>

PR middle-end/88651
* tree-data-ref.c (analyze_subscript_affine_affine): Use
widest_ints when mangling max_stmt_execution results.

From-SVN: r267512

gcc/ChangeLog
gcc/tree-data-ref.c

index 1c86e22a777b54be76ae4e7543c2b83269244785..b39771c621ba2d1615e72ea664f981b15587b8cc 100644 (file)
@@ -1,3 +1,9 @@
+2019-01-02  Richard Biener  <rguenther@suse.de>
+
+       PR middle-end/88651
+       * tree-data-ref.c (analyze_subscript_affine_affine): Use
+       widest_ints when mangling max_stmt_execution results.
+
 2019-01-02  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/88621
index d9a8d3a7d9d50ad5f0ea916c8f32c1fb5ae6b58f..7d1f03c66af693360ef64d70293848e96ccff656 100644 (file)
@@ -3761,10 +3761,6 @@ analyze_subscript_affine_affine (tree chrec_a,
 
              if (niter > 0)
                {
-                 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_a || y1 >= niter_b)
@@ -3774,8 +3770,20 @@ analyze_subscript_affine_affine (tree chrec_a,
                      *last_conflicts = integer_zero_node;
                      goto end_analyze_subs_aa;
                    }
+
+                 /* max stmt executions can get quite large, avoid
+                    overflows by using wide ints here.  */
+                 widest_int tau2
+                   = wi::smin (wi::sdiv_floor (wi::sub (niter_a, i0), i1),
+                               wi::sdiv_floor (wi::sub (niter_b, j0), j1));
+                 widest_int last_conflict = wi::sub (tau2, (x1 - i0)/i1);
+                 if (wi::min_precision (last_conflict, SIGNED)
+                     <= TYPE_PRECISION (integer_type_node))
+                   *last_conflicts
+                      = build_int_cst (integer_type_node,
+                                       last_conflict.to_shwi ());
                  else
-                   *last_conflicts = build_int_cst (NULL_TREE, last_conflict);
+                   *last_conflicts = chrec_dont_know;
                }
              else
                *last_conflicts = chrec_dont_know;