This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]