re PR tree-optimization/25501 (Segfault)
authorKazu Hirata <kazu@codesourcery.com>
Tue, 20 Dec 2005 14:47:07 +0000 (14:47 +0000)
committerKazu Hirata <kazu@gcc.gnu.org>
Tue, 20 Dec 2005 14:47:07 +0000 (14:47 +0000)
gcc/
PR tree-optimization/25501
* tree-cfgcleanup.c (merge_phi_nodes): Check that RESULT is
used in the PHI argument corresponding to the edge from BB to
DEST.

gcc/testsuite/
PR tree-optimization/25501
* testsuite/gcc.dg/tree-ssa/pr25501.c: New.

From-SVN: r108853

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

index 2c9a8072254be80a9c04b2c66241fcabe6fd0a57..021b23a02b3f23372e111816fedda0a831cbb140 100644 (file)
@@ -1,3 +1,10 @@
+2005-12-20  Kazu Hirata  <kazu@codesourcery.com>
+
+       PR tree-optimization/25501
+       * tree-cfgcleanup.c (merge_phi_nodes): Check that RESULT is
+       used in the PHI argument corresponding to the edge from BB to
+       DEST.
+
 2005-12-20  Richard Guenther  <rguenther@suse.de>
 
        Revert
index adcf8a01c0149b52ac96ff8b5cfc65dfb78b241d..3fec3a6f1eba434182df1c5c4ff50a625fbfc497 100644 (file)
@@ -1,3 +1,8 @@
+2005-12-20  Kazu Hirata  <kazu@codesourcery.com>
+
+       PR tree-optimization/25501
+       * testsuite/gcc.dg/tree-ssa/pr25501.c: New.
+
 2005-12-20  Richard Guenther  <rguenther@suse.de>
 
        Revert
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr25501.c b/gcc/testsuite/gcc.dg/tree-ssa/pr25501.c
new file mode 100644 (file)
index 0000000..aa70994
--- /dev/null
@@ -0,0 +1,36 @@
+/* PR tree-optimization/25501
+   The PHI merge pass used to try to merge PHI nodes that cannot
+   actually merged, causing a segfault later.  Make sure that does not
+   happen any more.  */
+
+/* { dg-options "-O1 -fdump-tree-mergephi" } */
+
+int
+foo (int a)
+{
+  int b;
+  int c;
+  int d;
+
+  if (a == 2)
+    b = 3;
+  else
+    b = 5;
+
+  c = 7;
+
+  d = 11;
+
+  for (;;)
+    {
+      if (d == 5)
+       break;
+
+      d = b;
+    }
+
+  return 13;
+}
+
+/* { dg-final { scan-tree-dump-times "Removing basic block" 0 "mergephi"} } */
+/* { dg-final { cleanup-tree-dump "mergephi" } } */
index 6f8b1c05ad3b864227acbe17e504d6a6992717f3..836a14d7772fb90179c5b1bfaca470a8fd389286 100644 (file)
@@ -746,6 +746,7 @@ merge_phi_nodes (void)
       else
        {
          tree phi;
+         unsigned int dest_idx = single_succ_edge (bb)->dest_idx;
 
          /* BB dominates DEST.  There may be many users of the PHI
             nodes in BB.  However, there is still a trivial case we
@@ -767,7 +768,8 @@ merge_phi_nodes (void)
              /* Get the single use of the result of this PHI node.  */
              if (!single_imm_use (result, &imm_use, &use_stmt)
                  || TREE_CODE (use_stmt) != PHI_NODE
-                 || bb_for_stmt (use_stmt) != dest)
+                 || bb_for_stmt (use_stmt) != dest
+                 || PHI_ARG_DEF (use_stmt, dest_idx) != result)
                break;
            }