Saturate overflows return from SCEV in ranger.

bounds_of_var_in_loop is returning an overflowed int, which is causing
us to create a range for which we can't compare the bounds causing
an ICE in verify_range.

Overflowed bounds cause compare_values() to return -2, which we
don't handle in verify_range.

We don't represent overflowed ranges in irange, so this patch just
saturates any overflowed end-points to MIN or MAX.

gcc/ChangeLog:

	PR tree-optimization/97501
	* gimple-range.cc (gimple_ranger::range_of_ssa_name_with_loop_info):
	Saturate overflows returned from SCEV.

gcc/testsuite/ChangeLog:

	* gcc.dg/pr97501.c: New test.
This commit is contained in:
Aldy Hernandez 2020-10-20 15:25:20 +02:00
parent dbcc6b1577
commit 5d53ec2701
2 changed files with 16 additions and 2 deletions

View file

@ -1146,9 +1146,9 @@ gimple_ranger::range_of_ssa_name_with_loop_info (irange &r, tree name,
// ?? We could do better here. Since MIN/MAX can only be an
// SSA, SSA +- INTEGER_CST, or INTEGER_CST, we could easily call
// the ranger and solve anything not an integer.
if (TREE_CODE (min) != INTEGER_CST)
if (TREE_CODE (min) != INTEGER_CST || TREE_OVERFLOW (min))
min = vrp_val_min (type);
if (TREE_CODE (max) != INTEGER_CST)
if (TREE_CODE (max) != INTEGER_CST || TREE_OVERFLOW (max))
max = vrp_val_max (type);
r.set (min, max);
}

View file

@ -0,0 +1,14 @@
// { dg-do compile }
// { dg-options "-O2" }
static int c = 0;
int main() {
int b = 0;
if (c) {
for (;; b--)
do
b++;
while (b);
}
}