From f9ead664f2dba52bcc3f977d8cadf01de99feb39 Mon Sep 17 00:00:00 2001 From: kazu Date: Tue, 20 Dec 2005 14:47:07 +0000 Subject: [PATCH] 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@108853 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 7 +++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/tree-ssa/pr25501.c | 36 +++++++++++++++++++++++++++++++++ gcc/tree-cfgcleanup.c | 4 +++- 4 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/pr25501.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2c9a8072254..021b23a02b3 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2005-12-20 Kazu Hirata + + 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 Revert diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index adcf8a01c01..3fec3a6f1eb 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2005-12-20 Kazu Hirata + + PR tree-optimization/25501 + * testsuite/gcc.dg/tree-ssa/pr25501.c: New. + 2005-12-20 Richard Guenther 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 00000000000..aa70994756c --- /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 6f8b1c05ad3..836a14d7772 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; } -- 2.11.4.GIT