diff options
author | rth <rth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-07-07 20:16:00 +0000 |
---|---|---|
committer | rth <rth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-07-07 20:16:00 +0000 |
commit | 4f7f73c8d326fe567a23b0d73b92629b2c6b0190 (patch) | |
tree | c942eab68cbe4fd2928d53b1721538ff35b54f5d /gcc/tree-flow-inline.h | |
parent | 9e3bd669b8773461ef05b43e356f2e2214919709 (diff) | |
download | gcc-4f7f73c8d326fe567a23b0d73b92629b2c6b0190.tar.gz |
* tree-flow-inline.h (may_propagate_copy): Move...
* tree-ssa-copy.c (may_propagate_copy): ... here. Fail if we
attempt to copy between types requiring conversion.
* tree-flow.h (may_propagate_copy): Update decl.
* tree-ssa-dom.c (cprop_operand): Tidy redundant tests.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@84225 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/tree-flow-inline.h')
-rw-r--r-- | gcc/tree-flow-inline.h | 91 |
1 files changed, 0 insertions, 91 deletions
diff --git a/gcc/tree-flow-inline.h b/gcc/tree-flow-inline.h index bda65ca7f5c..e68e63eb8ed 100644 --- a/gcc/tree-flow-inline.h +++ b/gcc/tree-flow-inline.h @@ -467,97 +467,6 @@ is_label_stmt (tree t) return false; } -/* Return true if we may propagate ORIG into DEST, false otherwise. */ -static inline bool -may_propagate_copy (tree dest, tree orig) -{ - /* FIXME. GIMPLE is allowing pointer assignments and comparisons of - pointers that have different alias sets. This means that these - pointers will have different memory tags associated to them. - - If we allow copy propagation in these cases, statements de-referencing - the new pointer will now have a reference to a different memory tag - with potentially incorrect SSA information. - - This was showing up in libjava/java/util/zip/ZipFile.java with code - like: - - struct java.io.BufferedInputStream *T.660; - struct java.io.BufferedInputStream *T.647; - struct java.io.InputStream *is; - struct java.io.InputStream *is.662; - [ ... ] - T.660 = T.647; - is = T.660; <-- This ought to be type-casted - is.662 = is; - - Also, f/name.c exposed a similar problem with a COND_EXPR predicate - that was causing DOM to generate and equivalence with two pointers of - alias-incompatible types: - - struct _ffename_space *n; - struct _ffename *ns; - [ ... ] - if (n == ns) - goto lab; - ... - lab: - return n; - - I think that GIMPLE should emit the appropriate type-casts. For the - time being, blocking copy-propagation in these cases is the safe thing - to do. */ - if (TREE_CODE (dest) == SSA_NAME - && TREE_CODE (orig) == SSA_NAME - && POINTER_TYPE_P (TREE_TYPE (dest)) - && POINTER_TYPE_P (TREE_TYPE (orig))) - { - tree mt_dest = var_ann (SSA_NAME_VAR (dest))->type_mem_tag; - tree mt_orig = var_ann (SSA_NAME_VAR (orig))->type_mem_tag; - if (mt_dest && mt_orig && mt_dest != mt_orig) - return false; - } - - /* If the destination is a SSA_NAME for a virtual operand, then we have - some special cases to handle. */ - if (TREE_CODE (dest) == SSA_NAME && !is_gimple_reg (dest)) - { - /* If both operands are SSA_NAMEs referring to virtual operands, then - we can always propagate. */ - if (TREE_CODE (orig) == SSA_NAME) - { - if (!is_gimple_reg (orig)) - return true; - -#ifdef ENABLE_CHECKING - /* If we have one real and one virtual operand, then something has - gone terribly wrong. */ - if (is_gimple_reg (orig)) - abort (); -#endif - } - - /* We have a "copy" from something like a constant into a virtual - operand. Reject these. */ - return false; - } - - /* If ORIG flows in from an abnormal edge, it cannot be propagated. */ - if (TREE_CODE (orig) == SSA_NAME - && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (orig)) - return false; - - /* If DEST is an SSA_NAME that flows from an abnormal edge or if it - represents a hard register, then it cannot be replaced. */ - if (TREE_CODE (dest) == SSA_NAME - && (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (dest) - || DECL_HARD_REGISTER (SSA_NAME_VAR (dest)))) - return false; - - /* Anything else is OK. */ - return true; -} - /* Set the default definition for VAR to DEF. */ static inline void set_default_def (tree var, tree def) |