aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKazu Hirata <kazu@codesourcery.com>2005-12-20 14:47:07 +0000
committerKazu Hirata <kazu@gcc.gnu.org>2005-12-20 14:47:07 +0000
commit338b5886eaf654b03dd59f66c888f1cf6f9f47db (patch)
treef4ca00ba23ba711cd266b66efd44af31919b3ed3
parentbd989e4c102a3e390825e8256f45ac56c5262650 (diff)
downloadgcc-338b5886eaf654b03dd59f66c888f1cf6f9f47db.zip
gcc-338b5886eaf654b03dd59f66c888f1cf6f9f47db.tar.gz
gcc-338b5886eaf654b03dd59f66c888f1cf6f9f47db.tar.bz2
re PR tree-optimization/25501 (Segfault)
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
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/pr25501.c36
-rw-r--r--gcc/tree-cfgcleanup.c4
4 files changed, 51 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 2c9a807..021b23a 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index adcf8a0..3fec3a6 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..aa70994
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr25501.c
@@ -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" } } */
diff --git a/gcc/tree-cfgcleanup.c b/gcc/tree-cfgcleanup.c
index 6f8b1c0..836a14d 100644
--- a/gcc/tree-cfgcleanup.c
+++ b/gcc/tree-cfgcleanup.c
@@ -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;
}