This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] Fix PR88427
- From: Richard Biener <rguenther at suse dot de>
- To: gcc-patches at gcc dot gnu dot org
- Date: Mon, 10 Dec 2018 13:41:56 +0100 (CET)
- Subject: [PATCH] Fix PR88427
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 <rguenther@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;
+ }
+ }
+}