summaryrefslogtreecommitdiff
path: root/gcc/tree-flow-inline.h
diff options
context:
space:
mode:
authorrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>2004-07-07 20:16:00 +0000
committerrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>2004-07-07 20:16:00 +0000
commit4f7f73c8d326fe567a23b0d73b92629b2c6b0190 (patch)
treec942eab68cbe4fd2928d53b1721538ff35b54f5d /gcc/tree-flow-inline.h
parent9e3bd669b8773461ef05b43e356f2e2214919709 (diff)
downloadgcc-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.h91
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)