From fe8728354109159d6b79af99eae6e94f2a282027 Mon Sep 17 00:00:00 2001 From: Jeff Law Date: Mon, 13 Dec 2004 13:12:33 -0700 Subject: [PATCH] tree-ssa-dom.c (thread_across_edge): Do not thread jumps if a PHI argument is set from a PHI_RESULT in the same... * tree-ssa-dom.c (thread_across_edge): Do not thread jumps if a PHI argument is set from a PHI_RESULT in the same block and the PHI argument is not the same as the PHI result. Co-Authored-By: Kazu Hirata From-SVN: r92102 --- gcc/ChangeLog | 7 +++++++ gcc/tree-ssa-dom.c | 10 ++++++++++ 2 files changed, 17 insertions(+) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 96a1648fb078..85e7719fc86d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2004-12-13 Jeff Law + Kazu Hirata + + * tree-ssa-dom.c (thread_across_edge): Do not thread jumps if a + PHI argument is set from a PHI_RESULT in the same block and the + PHI argument is not the same as the PHI result. + 2004-12-13 David Edelsohn * xcoffout.c (xcoffout_declare_function): Always strip storage diff --git a/gcc/tree-ssa-dom.c b/gcc/tree-ssa-dom.c index 3a3bdada4d88..81fdb0e8652e 100644 --- a/gcc/tree-ssa-dom.c +++ b/gcc/tree-ssa-dom.c @@ -550,6 +550,16 @@ thread_across_edge (struct dom_walk_data *walk_data, edge e) { tree src = PHI_ARG_DEF_FROM_EDGE (phi, e); tree dst = PHI_RESULT (phi); + + /* If the desired argument is not the same as this PHI's result + and it is set by a PHI in this block, then we can not thread + through this block. */ + if (src != dst + && TREE_CODE (src) == SSA_NAME + && TREE_CODE (SSA_NAME_DEF_STMT (src)) == PHI_NODE + && bb_for_stmt (SSA_NAME_DEF_STMT (src)) == e->dest) + return; + record_const_or_copy (dst, src); register_new_def (dst, &block_defs_stack); }