diff options
author | Diego Novillo <dnovillo@redhat.com> | 2004-08-18 18:21:23 +0000 |
---|---|---|
committer | Diego Novillo <dnovillo@gcc.gnu.org> | 2004-08-18 14:21:23 -0400 |
commit | 50dc9a88c1edf862816c804f8ea93443d257180c (patch) | |
tree | 44097e1b0caa8eb28b72d009d6ad0158ac4c06a9 /gcc/tree-ssa-operands.c | |
parent | bb0452b18763a8aa8e082a289ae5848a1753ba3e (diff) | |
download | gcc-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.c | 37 |
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); |