diff options
author | bstarynk <bstarynk@138bc75d-0d04-0410-961f-82ee72b054a4> | 2010-04-05 17:41:56 +0000 |
---|---|---|
committer | bstarynk <bstarynk@138bc75d-0d04-0410-961f-82ee72b054a4> | 2010-04-05 17:41:56 +0000 |
commit | c452411be99a3dd64572e605b7ce6f8ab3c7489d (patch) | |
tree | de53c0af57b416089c977887a63fcfd302a9ca6d /gcc/tree-ssa-copy.c | |
parent | 30da32a1db8fade012e59aef1144c2aab9ea9d21 (diff) | |
download | gcc-c452411be99a3dd64572e605b7ce6f8ab3c7489d.tar.gz |
2010-04-05 Basile Starynkevitch <basile@starynkevitch.net>
MELT branch merged with trunk rev 157965
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/melt-branch@157967 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/tree-ssa-copy.c')
-rw-r--r-- | gcc/tree-ssa-copy.c | 23 |
1 files changed, 16 insertions, 7 deletions
diff --git a/gcc/tree-ssa-copy.c b/gcc/tree-ssa-copy.c index 4b8d0b9660b..5c738f2e76b 100644 --- a/gcc/tree-ssa-copy.c +++ b/gcc/tree-ssa-copy.c @@ -1,5 +1,6 @@ /* Copy propagation and SSA_NAME replacement support routines. - Copyright (C) 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. + Copyright (C) 2004, 2005, 2006, 2007, 2008, 2010 + Free Software Foundation, Inc. This file is part of GCC. @@ -749,6 +750,7 @@ init_copy_prop (void) { gimple_stmt_iterator si; int depth = bb->loop_depth; + bool loop_exit_p = false; for (si = gsi_start_bb (bb); !gsi_end_p (si); gsi_next (&si)) { @@ -786,6 +788,18 @@ init_copy_prop (void) cached_last_copy_of[SSA_NAME_VERSION (def)] = def; } + /* In loop-closed SSA form do not copy-propagate through + PHI nodes in blocks with a loop exit edge predecessor. */ + if (current_loops + && loops_state_satisfies_p (LOOP_CLOSED_SSA)) + { + edge_iterator ei; + edge e; + FOR_EACH_EDGE (e, ei, bb->preds) + if (loop_exit_edge_p (e->src->loop_father, e)) + loop_exit_p = true; + } + for (si = gsi_start_phis (bb); !gsi_end_p (si); gsi_next (&si)) { gimple phi = gsi_stmt (si); @@ -793,12 +807,7 @@ init_copy_prop (void) def = gimple_phi_result (phi); if (!is_gimple_reg (def) - /* In loop-closed SSA form do not copy-propagate through - PHI nodes. Technically this is only needed for loop - exit PHIs, but this is difficult to query. */ - || (current_loops - && gimple_phi_num_args (phi) == 1 - && loops_state_satisfies_p (LOOP_CLOSED_SSA))) + || loop_exit_p) prop_set_simulate_again (phi, false); else prop_set_simulate_again (phi, true); |