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 PR63445


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.

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


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