re PR tree-optimization/48228 (incorrect signed overflow warning when only 0 and...
authorRichard Guenther <rguenther@suse.de>
Tue, 22 Mar 2011 12:40:09 +0000 (12:40 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Tue, 22 Mar 2011 12:40:09 +0000 (12:40 +0000)
2011-03-22  Richard Guenther  <rguenther@suse.de>

PR tree-optimization/48228
* tree-vrp.c (vrp_visit_phi_node): Do not stop propagating
for single-arg PHIs.

* gcc.dg/Wstrict-overflow-23.c: New testcase.

From-SVN: r171287

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/Wstrict-overflow-23.c [new file with mode: 0644]
gcc/tree-vrp.c

index 6d318e05952ba43c397eed0dcc3bdcaaec680f4f..512e46d93e9d160dbae8e86970edca1553b20b4a 100644 (file)
@@ -1,3 +1,9 @@
+2011-03-22  Richard Guenther  <rguenther@suse.de>
+
+       PR tree-optimization/48228
+       * tree-vrp.c (vrp_visit_phi_node): Do not stop propagating
+       for single-arg PHIs.
+
 2011-03-22  Andrey Belevantsev  <abel@ispras.ru>
 
        PR rtl-optimization/48143
index 2ce6bb73ec7a1e7ccaf680dcbb08f4bf4494a572..a5d78c94ccaab83184f8d7edffeefdecf81483b6 100644 (file)
@@ -1,3 +1,8 @@
+2011-03-22  Richard Guenther  <rguenther@suse.de>
+
+       PR tree-optimization/48228
+       * gcc.dg/Wstrict-overflow-23.c: New testcase.
+
 2011-03-21  Jack Howarth  <howarth@bromo.med.uc.edu>
 
        * lib/prune.exp (prune_gcc_output): Prune "could not create
diff --git a/gcc/testsuite/gcc.dg/Wstrict-overflow-23.c b/gcc/testsuite/gcc.dg/Wstrict-overflow-23.c
new file mode 100644 (file)
index 0000000..16014bb
--- /dev/null
@@ -0,0 +1,31 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -Wstrict-overflow" } */
+
+unsigned int
+do_scrolling (unsigned int window_size, unsigned int writecost)
+{
+  unsigned int i = window_size;
+
+  int terminal_window_p = 0;
+  unsigned int queue = 0;
+
+  for (i = window_size; i; i--)
+    {
+      if (writecost < i)
+    ++queue;
+      else if (writecost & 1)
+    terminal_window_p = 1;
+    }
+
+  if (queue > 0)
+    {
+      if (!terminal_window_p)
+    {
+      terminal_window_p = 1;
+    }
+    }
+
+  if (terminal_window_p)
+    return 100;
+  return 0;
+}
index d2e6551d9928d260f0a453cc58622ef934f69ebd..42ea9104e12e3423123202f02db9299b392dbd73 100644 (file)
@@ -6619,6 +6619,7 @@ vrp_visit_phi_node (gimple phi)
      edge; this helps us avoid an overflow infinity for conditionals
      which are not in a loop.  */
   if (edges > 0
+      && gimple_phi_num_args (phi) > 1
       && edges == old_edges)
     {
       int cmp_min = compare_values (lhs_vr->min, vr_result.min);