From: Aldy Hernandez Date: Tue, 20 Oct 2020 13:25:20 +0000 (+0200) Subject: Saturate overflows return from SCEV in ranger. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=5d53ec27015b916640171e891870adf2c6fdfd4c;p=gcc.git 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. --- 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); + } +}