https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97501

Aldy Hernandez <aldyh at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |NEW
     Ever confirmed|0                           |1

--- Comment #2 from Aldy Hernandez <aldyh at gcc dot gnu.org> ---
    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.

Testing the following patch:

    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.

diff --git a/gcc/gimple-range.cc b/gcc/gimple-range.cc
index 999d631c5ee..6ce9e52c691 100644
--- a/gcc/gimple-range.cc
+++ b/gcc/gimple-range.cc
@@ -1140,9 +1140,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);
+  }
+}

Reply via email to