tree-vrp.c (vrp_int_const_binop): Do not set *overflow_p to true when overflow is...
authorRichard Biener <rguenther@suse.de>
Thu, 17 Aug 2017 07:16:30 +0000 (07:16 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Thu, 17 Aug 2017 07:16:30 +0000 (07:16 +0000)
2017-08-17  Richard Biener  <rguenther@suse.de>

* tree-vrp.c (vrp_int_const_binop): Do not set *overflow_p
to true when overflow is undefined and we saturated the
result.

* gcc.dg/tree-ssa/vrp117.c: New testcase.

From-SVN: r251141

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/tree-ssa/vrp117.c [new file with mode: 0644]
gcc/tree-vrp.c

index 658a8e28588afb60cf086dbad3e8c5df81479336..bed451652a7c9c7f937a6833d32c295857dbeff9 100644 (file)
@@ -1,3 +1,9 @@
+2017-08-17  Richard Biener  <rguenther@suse.de>
+
+       * tree-vrp.c (vrp_int_const_binop): Do not set *overflow_p
+       to true when overflow is undefined and we saturated the
+       result.
+
 2017-08-17  Alan Modra  <amodra@gmail.com>
 
        PR target/80938
index c6f729aecf6fe5b94c08df8b36384e73904610fe..2b2183fa576e66d49d1e89d5a0866b137864465c 100644 (file)
@@ -1,3 +1,7 @@
+2017-08-17  Richard Biener  <rguenther@suse.de>
+
+       * gcc.dg/tree-ssa/vrp117.c: New testcase.
+
 2017-08-16  Uros Bizjak  <ubizjak@gmail.com>
 
        * c-c++-common/patchable_function_entry-decl.c (dg-final): Adapt
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/vrp117.c b/gcc/testsuite/gcc.dg/tree-ssa/vrp117.c
new file mode 100644 (file)
index 0000000..d07a672
--- /dev/null
@@ -0,0 +1,16 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-evrp" } */
+
+void link_error (void);
+
+void foo (int i)
+{
+  if (i > __INT_MAX__ - 10)
+    {
+      int j = i * 10;
+      if (j < i)
+       link_error ();
+    }
+}
+
+/* { dg-final { scan-tree-dump-not "link_error" "evrp" } } */
index 657a8d186c868cc68f2f33e80cdbc2313bfb04e9..e3735ff4023a0bed6e193a3af47442dffe274eb3 100644 (file)
@@ -1614,6 +1614,8 @@ vrp_int_const_binop (enum tree_code code, tree val1, tree val2,
   signop sign = TYPE_SIGN (TREE_TYPE (val1));
   wide_int res;
 
+  *overflow_p = false;
+
   switch (code)
     {
     case RSHIFT_EXPR:
@@ -1685,8 +1687,6 @@ vrp_int_const_binop (enum tree_code code, tree val1, tree val2,
       gcc_unreachable ();
     }
 
-  *overflow_p = overflow;
-
   if (overflow
       && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (val1)))
     {
@@ -1730,6 +1730,8 @@ vrp_int_const_binop (enum tree_code code, tree val1, tree val2,
                              TYPE_SIGN (TREE_TYPE (val1)));
     }
 
+  *overflow_p = overflow;
+
   return res;
 }