The following restores behavior to before my r266557 fix for symbolic
ranges, avoiding the ICE.

Bootstrap & regtest running on x86_64-unknown-linux-gnu.

Richard.

2018-12-10  Richard Biener  <rguent...@suse.de>

        PR tree-optimization/88427
        * vr-values.c (vr_values::extract_range_from_phi_node):
        Handle symbolic ranges conservatively when trying to drop
        to Inf +- 1.

        * gcc.dg/pr88427.c: New testcase.

Index: gcc/vr-values.c
===================================================================
--- gcc/vr-values.c     (revision 266950)
+++ gcc/vr-values.c     (working copy)
@@ -2891,8 +2891,9 @@ vr_values::extract_range_from_phi_node (
       if (cmp_min < 0)
        new_min = lhs_vr->min ();
       else if (cmp_min > 0
-              && tree_int_cst_lt (vrp_val_min (vr_result->type ()),
-                                  vr_result->min ()))
+              && (TREE_CODE (vr_result->min ()) != INTEGER_CST
+                  || tree_int_cst_lt (vrp_val_min (vr_result->type ()),
+                                      vr_result->min ())))
        new_min = int_const_binop (PLUS_EXPR,
                                   vrp_val_min (vr_result->type ()),
                                   build_int_cst (vr_result->type (), 1));
@@ -2901,8 +2902,9 @@ vr_values::extract_range_from_phi_node (
       if (cmp_max > 0)
        new_max = lhs_vr->max ();
       else if (cmp_max < 0
-              && tree_int_cst_lt (vr_result->max (),
-                                  vrp_val_max (vr_result->type ())))
+              && (TREE_CODE (vr_result->max ()) != INTEGER_CST
+                  || tree_int_cst_lt (vr_result->max (),
+                                      vrp_val_max (vr_result->type ()))))
        new_max = int_const_binop (MINUS_EXPR,
                                   vrp_val_max (vr_result->type ()),
                                   build_int_cst (vr_result->type (), 1));
Index: gcc/testsuite/gcc.dg/pr88427.c
===================================================================
--- gcc/testsuite/gcc.dg/pr88427.c      (nonexistent)
+++ gcc/testsuite/gcc.dg/pr88427.c      (working copy)
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fno-tree-dce -fno-tree-fre -Wno-div-by-zero" } */
+
+void
+uj (int eq, int s4)
+{
+  short int tm = 0;
+
+  for (;;)
+    if (eq == s4)
+      {
+       tm += !!s4;
+       if (tm == s4)
+         {
+           eq += tm;
+           for (;;)
+             eq /= 0;
+         }
+      }
+}

Reply via email to