From ad3577dfeaef757ddbb024303a2c741d4f4c94ef Mon Sep 17 00:00:00 2001 From: Jeff Law Date: Thu, 23 Jun 2011 14:26:07 -0600 Subject: [PATCH] re PR middle-end/49465 (Revision 175114 miscompiled 403.gcc in SPEC CPU 2006) PR middle-end/49465 * tree-ssa-threadupate.c (fix_duplicate_block_edges): Fix condition to detect threading through joiner block. If there was already an edge to the new target, then do not change the PHI nodes. *************** fix_duplicate_block_edges (struct redire From-SVN: r175351 --- gcc/ChangeLog | 7 +++++++ gcc/tree-ssa-threadupdate.c | 9 ++++++--- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index fad09669668..d5c6ee59b79 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2011-06-16 Jeff Law + + PR middle-end/49465 + * tree-ssa-threadupate.c (fix_duplicate_block_edges): Fix condition + to detect threading through joiner block. If there was already + an edge to the new target, then do not change the PHI nodes. + 2011-06-23 Jakub Jelinek * tree-vect-data-refs.c (vect_compute_data_ref_alignment): Use diff --git a/gcc/tree-ssa-threadupdate.c b/gcc/tree-ssa-threadupdate.c index e0335dc8c10..0cdf8466ddb 100644 --- a/gcc/tree-ssa-threadupdate.c +++ b/gcc/tree-ssa-threadupdate.c @@ -385,7 +385,7 @@ fix_duplicate_block_edges (struct redirection_data *rd, to keep its control statement and redirect an outgoing edge. Else we want to remove the control statement & edges, then create a new outgoing edge. In both cases we may need to update PHIs. */ - if (THREAD_TARGET2 (rd->incoming_edges->e) == rd->outgoing_edge) + if (THREAD_TARGET2 (rd->incoming_edges->e)) { edge victim; edge e2; @@ -400,8 +400,11 @@ fix_duplicate_block_edges (struct redirection_data *rd, victim = find_edge (rd->dup_block, THREAD_TARGET (e)->dest); e2 = redirect_edge_and_branch (victim, THREAD_TARGET2 (e)->dest); - /* This updates the PHI at the target of the threaded edge. */ - copy_phi_args (e2->dest, THREAD_TARGET2 (e), e2); + /* If we redirected the edge, then we need to copy PHI arguments + at the target. If the edge already existed (e2 != victim case), + then the PHIs in the target already have the correct arguments. */ + if (e2 == victim) + copy_phi_args (e2->dest, THREAD_TARGET2 (e), e2); } else { -- 2.30.2