diff mbox

Fix PR63445

Message ID alpine.LSU.2.11.1410090951320.20733@zhemvz.fhfr.qr
State New
Headers show

Commit Message

Richard Biener Oct. 9, 2014, 7:58 a.m. UTC
This fixes a bogus strict overflow warning from VRPs 
simplify_cond_using_ranges.  I believe that when optimizing
equality compares from (T) x != CST to x != (T) CST we do
not have to care about the fact whether the computation of x
possibly overflowed.

Besides that it looks odd that we guard the transform by
overflow infinities / strict-overflow behavior - those
should only guard the warning.  Jeff - you added the overflow
checking stuff, can you remember why you did that?  (I didn't
adjust those checks to not apply for equality compares with
this patch)

Bootstrapped and tested on x86_64-unknown-linux-gnu, applied to trunk
(probably latent on the 4.9 branch but the testcase doesn't fail there).

Thanks,
Richard.

2014-10-08  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/63445
	* tree-vrp.c (simplify_cond_using_ranges): Only warn about
	overflow for non-equality compares.

	* gcc.dg/Wstrict-overflow-26.c: New testcase.
diff mbox

Patch

Index: gcc/tree-vrp.c
===================================================================
--- gcc/tree-vrp.c	(revision 215917)
+++ gcc/tree-vrp.c	(working copy)
@@ -9189,8 +9189,9 @@  simplify_cond_using_ranges (gimple stmt)
 	      /* If the range overflowed and the user has asked for warnings
 		 when strict overflow semantics were used to optimize code,
 		 issue an appropriate warning.  */
-	      if ((is_negative_overflow_infinity (vr->min)
-		   || is_positive_overflow_infinity (vr->max))
+	      if (cond_code != EQ_EXPR && cond_code != NE_EXPR
+		  && (is_negative_overflow_infinity (vr->min)
+		      || is_positive_overflow_infinity (vr->max))
 		  && issue_strict_overflow_warning (WARN_STRICT_OVERFLOW_CONDITIONAL))
 		{
 		  location_t location;
Index: gcc/testsuite/gcc.dg/Wstrict-overflow-26.c
===================================================================
--- gcc/testsuite/gcc.dg/Wstrict-overflow-26.c	(revision 0)
+++ gcc/testsuite/gcc.dg/Wstrict-overflow-26.c	(working copy)
@@ -0,0 +1,16 @@ 
+/* { dg-do compile } */
+/* { dg-options "-O2 -Wstrict-overflow" } */
+
+int
+f (int i, int j)
+{
+  unsigned int c = 0;                                                          
+  if (i < j)
+    {
+      unsigned int n = j - i;
+      unsigned int i;
+      for (i = 0; i < n; i++) /* { dg-bogus "signed overflow" } */
+	c++;
+    }
+  return c;
+}