aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-ssa-dom.c
diff options
context:
space:
mode:
authorJeff Law <law@redhat.com>2013-09-06 11:41:48 -0600
committerJeff Law <law@gcc.gnu.org>2013-09-06 11:41:48 -0600
commit5e8d9b455910f258929e0af04bc4e75ad8909386 (patch)
treec8d0ffded8d0eba1cb4f38fea3378802437edd37 /gcc/tree-ssa-dom.c
parent3a001aff33dee19c0e93dddd4a31b67b044db267 (diff)
downloadgcc-5e8d9b455910f258929e0af04bc4e75ad8909386.zip
gcc-5e8d9b455910f258929e0af04bc4e75ad8909386.tar.gz
gcc-5e8d9b455910f258929e0af04bc4e75ad8909386.tar.bz2
tree-ssa-dom.c (cprop_into_successor_phis): Also propagate edge implied equivalences into successor phis.
* tree-ssa-dom.c (cprop_into_successor_phis): Also propagate edge implied equivalences into successor phis. From-SVN: r202345
Diffstat (limited to 'gcc/tree-ssa-dom.c')
-rw-r--r--gcc/tree-ssa-dom.c24
1 files changed, 24 insertions, 0 deletions
diff --git a/gcc/tree-ssa-dom.c b/gcc/tree-ssa-dom.c
index 691e6f9..f999a64 100644
--- a/gcc/tree-ssa-dom.c
+++ b/gcc/tree-ssa-dom.c
@@ -1642,6 +1642,28 @@ cprop_into_successor_phis (basic_block bb)
if (gsi_end_p (gsi))
continue;
+ /* We may have an equivalence associated with this edge. While
+ we can not propagate it into non-dominated blocks, we can
+ propagate them into PHIs in non-dominated blocks. */
+
+ /* Push the unwind marker so we can reset the const and copies
+ table back to its original state after processing this edge. */
+ const_and_copies_stack.safe_push (NULL_TREE);
+
+ /* Extract and record any simple NAME = VALUE equivalences.
+
+ Don't bother with [01] = COND equivalences, they're not useful
+ here. */
+ struct edge_info *edge_info = (struct edge_info *) e->aux;
+ if (edge_info)
+ {
+ tree lhs = edge_info->lhs;
+ tree rhs = edge_info->rhs;
+
+ if (lhs && TREE_CODE (lhs) == SSA_NAME)
+ record_const_or_copy (lhs, rhs);
+ }
+
indx = e->dest_idx;
for ( ; !gsi_end_p (gsi); gsi_next (&gsi))
{
@@ -1667,6 +1689,8 @@ cprop_into_successor_phis (basic_block bb)
&& may_propagate_copy (orig_val, new_val))
propagate_value (orig_p, new_val);
}
+
+ restore_vars_to_original_value ();
}
}