aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-ssa-operands.c
diff options
context:
space:
mode:
authorDiego Novillo <dnovillo@redhat.com>2004-08-18 18:21:23 +0000
committerDiego Novillo <dnovillo@gcc.gnu.org>2004-08-18 14:21:23 -0400
commit50dc9a88c1edf862816c804f8ea93443d257180c (patch)
tree44097e1b0caa8eb28b72d009d6ad0158ac4c06a9 /gcc/tree-ssa-operands.c
parentbb0452b18763a8aa8e082a289ae5848a1753ba3e (diff)
downloadgcc-50dc9a88c1edf862816c804f8ea93443d257180c.zip
gcc-50dc9a88c1edf862816c804f8ea93443d257180c.tar.gz
gcc-50dc9a88c1edf862816c804f8ea93443d257180c.tar.bz2
tree-dfa.c (add_referenced_var): Only global variables are call-clobbered.
* tree-dfa.c (add_referenced_var): Only global variables are call-clobbered. * tree-flow.h (struct ptr_info_def): Add field pt_global_mem. * tree-ssa-alias.c (compute_points_to_and_addr_escape): Mark all pointers dereferenced if the statement dereferences them. (create_name_tags): Do not create memory tags for pointers that have PT_ANYTHING set. Also check if PT_VARS is not empty before creating a name tag. (compute_flow_sensitive_aliasing): Don't mark call-clobbered variables that share the same alias set with a pointer that may point anywhere. (add_may_alias): Add FIXME comment to remove clobbering aliased variables and tags. (replace_may_alias): Likewise. (set_pt_anything): Do not clear PT_VARS nor IS_DEREFERENCED. (merge_pointed_to_info): If the original variable has not points-to information, call set_pt_anything. (add_pointed_to_var): Do not prevent adding a pointed-to variable if the pointers is PT_ANYTHING. If the variable is a global, set PT_GLOBAL_MEM. (collect_points_to_info_r): Don't assume that PLUS_EXPRs of pointer type only come in PTR+OFFSET flavours. Always call merge_pointed_to_info on PHI arguments that are SSA_NAMEs. (get_nmt_for): Mark call-clobbered tags whose pointer points to global memory. * tree-ssa-operands.c (opf_kill_def, opf_no_vops): Switch values. (get_indirect_ref_operands): Always clear OPF_KILL_DEF from FLAGS. (add_stmt_operand): Abort if the caller tried to add a killing definition for a memory tag. * tree-ssa.c (verify_flow_sensitive_alias_info): Remove unnecessary checks. From-SVN: r86198
Diffstat (limited to 'gcc/tree-ssa-operands.c')
-rw-r--r--gcc/tree-ssa-operands.c37
1 files changed, 26 insertions, 11 deletions
diff --git a/gcc/tree-ssa-operands.c b/gcc/tree-ssa-operands.c
index 4b899ee..230167f 100644
--- a/gcc/tree-ssa-operands.c
+++ b/gcc/tree-ssa-operands.c
@@ -89,7 +89,7 @@ Boston, MA 02111-1307, USA. */
#define opf_is_def (1 << 0)
/* Operand is the target of an assignment expression. */
-#define opf_kill_def (1 << 2)
+#define opf_kill_def (1 << 1)
/* No virtual operands should be created in the expression. This is used
when traversing ADDR_EXPR nodes which have different semantics than
@@ -97,7 +97,7 @@ Boston, MA 02111-1307, USA. */
need to consider are indices into arrays. For instance, &a.b[i] should
generate a USE of 'i' but it should not generate a VUSE for 'a' nor a
VUSE for 'b'. */
-#define opf_no_vops (1 << 1)
+#define opf_no_vops (1 << 2)
/* Array for building all the def operands. */
static GTY (()) varray_type build_defs;
@@ -1273,6 +1273,8 @@ get_indirect_ref_operands (tree stmt, tree expr, int flags)
tree ptr = *pptr;
stmt_ann_t ann = stmt_ann (stmt);
+ /* Stores into INDIRECT_REF operands are never killing definitions. */
+ flags &= ~opf_kill_def;
if (SSA_VAR_P (ptr))
{
@@ -1456,20 +1458,31 @@ add_stmt_operand (tree *var_p, tree stmt, int flags)
{
if (v_ann->is_alias_tag)
{
- /* Alias tagged vars get regular V_MAY_DEF */
+ /* Alias tagged vars get V_MAY_DEF to avoid breaking
+ def-def chains with the other variables in their
+ alias sets. */
if (s_ann)
s_ann->makes_aliased_stores = 1;
append_v_may_def (var);
}
- else if ((flags & opf_kill_def)
- && v_ann->mem_tag_kind == NOT_A_TAG)
- /* V_MUST_DEF for non-aliased non-GIMPLE register
- variable definitions. Avoid memory tags. */
- append_v_must_def (var);
+ else if (flags & opf_kill_def)
+ {
+#if defined ENABLE_CHECKING
+ /* Only regular variables may get a V_MUST_DEF
+ operand. */
+ if (v_ann->mem_tag_kind != NOT_A_TAG)
+ abort ();
+#endif
+ /* V_MUST_DEF for non-aliased, non-GIMPLE register
+ variable definitions. */
+ append_v_must_def (var);
+ }
else
- /* Call-clobbered variables & memory tags get
- V_MAY_DEF */
- append_v_may_def (var);
+ {
+ /* Add a V_MAY_DEF for call-clobbered variables and
+ memory tags. */
+ append_v_may_def (var);
+ }
}
else
{
@@ -1506,6 +1519,8 @@ add_stmt_operand (tree *var_p, tree stmt, int flags)
}
else
{
+ /* Similarly, append a virtual uses for VAR itself, when
+ it is an alias tag. */
if (v_ann->is_alias_tag)
append_vuse (var);