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. Pushed. gcc/ChangeLog: PR 97501/tree-optimization * 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. --- gcc/gimple-range.cc | 4 ++-- gcc/testsuite/gcc.dg/pr97501.c | 14 ++++++++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/pr97501.c diff --git a/gcc/gimple-range.cc b/gcc/gimple-range.cc index e4864ba60f6..ed9609be68e 100644 --- a/gcc/gimple-range.cc +++ b/gcc/gimple-range.cc @@ -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); } diff --git a/gcc/testsuite/gcc.dg/pr97501.c b/gcc/testsuite/gcc.dg/pr97501.c new file mode 100644 index 00000000000..aedac83962d --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr97501.c @@ -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); + } +} -- 2.26.2