aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-data-ref.c
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2019-01-02 13:52:03 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2019-01-02 13:52:03 +0000
commit17067056c18e35885105518a5b5051b5f7b51856 (patch)
tree0f70b8cf5d68726879dd16ea45bcfb1f4d14bc87 /gcc/tree-data-ref.c
parentdcff404e031f2fd18eb7eda0f5edbb996868fd42 (diff)
downloadgcc-17067056c18e35885105518a5b5051b5f7b51856.zip
gcc-17067056c18e35885105518a5b5051b5f7b51856.tar.gz
gcc-17067056c18e35885105518a5b5051b5f7b51856.tar.bz2
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 <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
Diffstat (limited to 'gcc/tree-data-ref.c')
-rw-r--r--gcc/tree-data-ref.c18
1 files changed, 13 insertions, 5 deletions
diff --git a/gcc/tree-data-ref.c b/gcc/tree-data-ref.c
index d9a8d3a..7d1f03c 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;