re PR tree-optimization/66772 (ICE at -O2 and -O3 on x86_64-linux-gnu)
authorRichard Biener <rguenther@suse.de>
Mon, 6 Jul 2015 14:41:22 +0000 (14:41 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Mon, 6 Jul 2015 14:41:22 +0000 (14:41 +0000)
2015-07-06  Richard Biener  <rguenther@suse.de>

PR tree-optimization/66772
* tree-ssa-ccp.c (ccp_visit_phi_node): Make sure that copy
values are available in the PHI node BB when there are
still unexecutable edges.

* gcc.dg/torture/pr66772-1.c: New testcase.
* gcc.dg/torture/pr66772-2.c: Likewise.

From-SVN: r225459

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/pr66733-1.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/torture/pr66733-2.c [new file with mode: 0644]
gcc/tree-ssa-ccp.c

index 7c43598..d3929fa 100644 (file)
@@ -1,5 +1,12 @@
 2015-07-06  Richard Biener  <rguenther@suse.de>
 
+       PR tree-optimization/66772
+       * tree-ssa-ccp.c (ccp_visit_phi_node): Make sure that copy
+       values are available in the PHI node BB when there are
+       still unexecutable edges.
+
+2015-07-06  Richard Biener  <rguenther@suse.de>
+
        PR tree-optimization/66767
        * tree-vect-loop-manip.c (vect_create_cond_for_align_checks):
        Make sure to build the alignment test on a SSA name without
index 32959d5..f7f15dd 100644 (file)
@@ -1,3 +1,9 @@
+2015-07-06  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/66772
+       * gcc.dg/torture/pr66772-1.c: New testcase.
+       * gcc.dg/torture/pr66772-2.c: Likewise.
+
 2015-07-06  Andrew Bennett  <andrew.bennett@imgtec.com>
 
        * gcc.target/mips/near-far-3.c: Allow the call to near_func to use
diff --git a/gcc/testsuite/gcc.dg/torture/pr66733-1.c b/gcc/testsuite/gcc.dg/torture/pr66733-1.c
new file mode 100644 (file)
index 0000000..cb6e87c
--- /dev/null
@@ -0,0 +1,28 @@
+/* { dg-do compile } */
+
+int a;
+
+int
+fn1 ()
+{
+  return 1;
+}
+
+void
+fn2 ()
+{
+  int b, j;
+  for (;;)
+    {
+      int c = 1;
+      if (j)
+       {
+         if (c)
+           break;
+       }
+      else
+       b = a;
+      fn1 () && b;
+      j = fn1 ();
+    }
+}
diff --git a/gcc/testsuite/gcc.dg/torture/pr66733-2.c b/gcc/testsuite/gcc.dg/torture/pr66733-2.c
new file mode 100644 (file)
index 0000000..6687bd0
--- /dev/null
@@ -0,0 +1,46 @@
+/* { dg-do compile } */
+
+int a, b, c, e, f;
+
+void fn1 (int p) { }
+
+int
+fn2 (int p)
+{
+  return a ? p % a : 0; 
+}
+
+short
+fn3 (int p)
+{
+  return (1 >> p) < 1 ? 1 : p;
+}
+
+int
+fn4 ()
+{
+  int g = 0, h = 1;
+  if (b)
+    goto lbl;
+  fn2 (0);
+  if (fn3 (1))
+    fn1 (e && c);
+  if (h)
+    {
+      int i = 1;
+lbl:
+      if (i)
+       return 0;
+      for (; g < 1; g++)
+       ;
+    }
+  for (;;)
+    f || g > 0;
+}
+
+int
+main ()
+{
+  fn4 (); 
+  return 0;
+}
index 496d840..05a3e57 100644 (file)
@@ -1081,6 +1081,7 @@ ccp_visit_phi_node (gphi *phi)
   new_val.mask = 0;
 
   bool first = true;
+  bool non_exec_edge = false;
   for (i = 0; i < gimple_phi_num_args (phi); i++)
     {
       /* Compute the meet operator over all the PHI arguments flowing
@@ -1121,6 +1122,22 @@ ccp_visit_phi_node (gphi *phi)
          if (new_val.lattice_val == VARYING)
            break;
        }
+      else
+       non_exec_edge = true;
+    }
+
+  /* In case there were non-executable edges and the value is a copy
+     make sure its definition dominates the PHI node.  */
+  if (non_exec_edge
+      && new_val.lattice_val == CONSTANT
+      && TREE_CODE (new_val.value) == SSA_NAME
+      && ! SSA_NAME_IS_DEFAULT_DEF (new_val.value)
+      && ! dominated_by_p (CDI_DOMINATORS, gimple_bb (phi),
+                          gimple_bb (SSA_NAME_DEF_STMT (new_val.value))))
+    {
+      new_val.lattice_val = VARYING;
+      new_val.value = NULL_TREE;
+      new_val.mask = -1;
     }
 
   if (dump_file && (dump_flags & TDF_DETAILS))