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; + } + } +}