From: Richard Biener Date: Wed, 2 Jan 2019 13:52:03 +0000 (+0000) Subject: re PR tree-optimization/88651 (tree-data-ref.c:3764:26: runtime error: signed integer... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=17067056c18e35885105518a5b5051b5f7b51856;p=gcc.git re PR tree-optimization/88651 (tree-data-ref.c:3764:26: runtime error: signed integer overflow: 9223372036854775802 - -6 cannot be represented in type 'long int') 2019-01-02 Richard Biener PR middle-end/88651 * tree-data-ref.c (analyze_subscript_affine_affine): Use widest_ints when mangling max_stmt_execution results. From-SVN: r267512 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 1c86e22a777..b39771c621b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2019-01-02 Richard Biener + + 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 PR tree-optimization/88621 diff --git a/gcc/tree-data-ref.c b/gcc/tree-data-ref.c index d9a8d3a7d9d..7d1f03c66af 100644 --- a/gcc/tree-data-ref.c +++ b/gcc/tree-data-ref.c @@ -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;