PHI argument is set from a PHI_RESULT in the same block and the
PHI argument is not the same as the PHI result.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@92102
138bc75d-0d04-0410-961f-
82ee72b054a4
+2004-12-13 Jeff Law <law@redhat.com>
+ Kazu Hirata <kazu@cs.umass.edu>
+
+ * 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 <edelsohn@gnu.org>
* xcoffout.c (xcoffout_declare_function): Always strip storage
{
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);
}