diff options
author | Jeff Law <law@redhat.com> | 2011-06-23 14:26:07 -0600 |
---|---|---|
committer | Jeff Law <law@gcc.gnu.org> | 2011-06-23 14:26:07 -0600 |
commit | ad3577dfeaef757ddbb024303a2c741d4f4c94ef (patch) | |
tree | 43f4cd72ef049b0245309c78f7bb9bb20fa57857 /gcc/tree-ssa-threadupdate.c | |
parent | ddc41bb43f12f366996ac4b4edf3248f1a666966 (diff) | |
download | gcc-ad3577dfeaef757ddbb024303a2c741d4f4c94ef.tar.gz |
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
Diffstat (limited to 'gcc/tree-ssa-threadupdate.c')
-rw-r--r-- | gcc/tree-ssa-threadupdate.c | 9 |
1 files changed, 6 insertions, 3 deletions
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 { |