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 COMMITTED: Fix SPEC failures caused by VRP changes


When I fixed PR tree-optimization/31034, which corrected the handling
of MINUS_EXPR with overflow infinities, I managed to forget that the
exact same issues applied to PLUS_EXPR.  This patch corrects that, and
also corrects the handling of the *_DIV_EXPR and RSHIFT_EXPR codes.

Bootstrapped and tested on i686-pc-linux-gnu.  Committed.

Ian


2007-03-11  Ian Lance Taylor  <iant@google.com>

	* tree-vrp.c (vrp_int_const_binop): Handle PLUS_EXPR and
	the *_DIV_EXPR codes correctly with overflow infinities.


Index: tree-vrp.c
===================================================================
--- tree-vrp.c	(revision 122819)
+++ tree-vrp.c	(working copy)
@@ -1519,15 +1519,26 @@ vrp_int_const_binop (enum tree_code code
 	  && !supports_overflow_infinity (TREE_TYPE (res)))
 	return NULL_TREE;
 
-      /* We have to punt on subtracting infinities of the same sign,
-	 since we can't tell what the sign of the result should
-	 be.  */
-      if (code == MINUS_EXPR
-	  && sgn1 == sgn2
+      /* We have to punt on adding infinities of different signs,
+	 since we can't tell what the sign of the result should be.
+	 Likewise for subtracting infinities of the same sign.  */
+      if (((code == PLUS_EXPR && sgn1 != sgn2)
+	   || (code == MINUS_EXPR && sgn1 == sgn2))
 	  && is_overflow_infinity (val1)
 	  && is_overflow_infinity (val2))
 	return NULL_TREE;
 
+      /* Don't try to handle division or shifting of infinities.  */
+      if ((code == TRUNC_DIV_EXPR
+	   || code == FLOOR_DIV_EXPR
+	   || code == CEIL_DIV_EXPR
+	   || code == EXACT_DIV_EXPR
+	   || code == ROUND_DIV_EXPR
+	   || code == RSHIFT_EXPR)
+	  && (is_overflow_infinity (val1)
+	      || is_overflow_infinity (val2)))
+	return NULL_TREE;
+
       /* Notice that we only need to handle the restricted set of
 	 operations handled by extract_range_from_binary_expr.
 	 Among them, only multiplication, addition and subtraction
@@ -1541,8 +1552,12 @@ vrp_int_const_binop (enum tree_code code
       if ((code == MULT_EXPR && sgn1 == sgn2)
           /* For addition, the operands must be of the same sign
 	     to yield an overflow.  Its sign is therefore that
-	     of one of the operands, for example the first.  */
-	  || (code == PLUS_EXPR && sgn1 > 0)
+	     of one of the operands, for example the first.  For
+	     infinite operands X + -INF is negative, not positive.  */
+	  || (code == PLUS_EXPR
+	      && (sgn1 >= 0
+		  ? !is_negative_overflow_infinity (val2)
+		  : is_positive_overflow_infinity (val2)))
 	  /* For subtraction, non-infinite operands must be of
 	     different signs to yield an overflow.  Its sign is
 	     therefore that of the first operand or the opposite of


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