On Tue, Oct 20, 2020 at 5:21 PM Aldy Hernandez via Gcc-patches <gcc-patches@gcc.gnu.org> wrote: > > 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.
I don't think TREE_OVERFLOW means what you think it means in the context of bounds_of_var_in_loop - look at its bottom which does /* Even for valid range info, sometimes overflow flag will leak in. As GIMPLE IL should have no constants with TREE_OVERFLOW set, we drop them. */ if (TREE_OVERFLOW_P (*min)) *min = drop_tree_overflow (*min); if (TREE_OVERFLOW_P (*max)) *max = drop_tree_overflow (*max); and the code explicitly checks for overflow, doing range adjustments accordingly. So not sure what you're trying to fix here. Every use of TREE_OVERFLOW in the GIMPLE parts of the ME are a sign of a bug. Richard. > 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 >