diff options
author | Diego Novillo <dnovillo@redhat.com> | 2004-08-12 14:34:11 +0000 |
---|---|---|
committer | Diego Novillo <dnovillo@gcc.gnu.org> | 2004-08-12 10:34:11 -0400 |
commit | c597ef4eab9a2de9ad0b2187547ac9bac0b53132 (patch) | |
tree | a0fa15664fe5d4dfd7f6bced8b73b4839f33dfcb /gcc/tree-ssa-alias.c | |
parent | ab5c8549a48977b865f8ed8dd4bd4e745b1cec75 (diff) | |
download | gcc-c597ef4eab9a2de9ad0b2187547ac9bac0b53132.tar.gz |
re PR tree-optimization/16867 (Inline array initializer miscompilation at -O)
PR tree-optimization/16867
* tree.c (is_global_var): New function.
(needs_to_live_in_memory): Check for TREE_ADDRESSABLE.
Call is_global_var.
* tree.h (DECL_NEEDS_TO_LIVE_IN_MEMORY_INTERNAL): Remove.
Update all users.
(is_global_var): Declare.
* tree-dfa.c (dump_variable): Display global and addressable
attributes.
(add_referenced_var): Clarify documentation when marking
variables call-clobbered.
* tree-flow-inline.h (is_call_clobbered): Call is_global_var
instead of needs_to_live_in_memory.
(mark_call_clobbered): If the variable is a tag, mark it
DECL_EXTERNAL.
* tree-gimple.c (is_gimple_reg): Don't check for
TREE_ADDRESSABLE.
(is_gimple_non_addressable): Likewise.
* tree-ssa-alias.c (get_nmt_for): Always check whether the tag
needs to be marked call-clobbered.
(setup_pointers_and_addressables): Call is_global_var instead
of needs_to_live_in_memory.
* tree-ssa-dce.c (need_to_preserve_store): Remove.
Update all users with is_global_var.
(mark_stmt_if_obviously_necessary): Fix processing of aliased
stores. Don't check the virtual definitions. Rather, check
whether the store is going into global memory.
(find_obviously_necessary_stmts): Get the symbol from the PHI
result.
* tree-ssa-operands.c (get_call_expr_operands): Do not add
clobbering may-defs if the call does not have side effects.
libjava/ChangeLog
PR tree-optimization/16867
* testsuite/libjava.lang/PR16867.java: New test.
From-SVN: r85874
Diffstat (limited to 'gcc/tree-ssa-alias.c')
-rw-r--r-- | gcc/tree-ssa-alias.c | 23 |
1 files changed, 10 insertions, 13 deletions
diff --git a/gcc/tree-ssa-alias.c b/gcc/tree-ssa-alias.c index 1ec24649204..a344384b426 100644 --- a/gcc/tree-ssa-alias.c +++ b/gcc/tree-ssa-alias.c @@ -390,7 +390,6 @@ init_alias_info (void) EXECUTE_IF_SET_IN_BITMAP (call_clobbered_vars, 0, i, { tree var = referenced_var (i); - DECL_NEEDS_TO_LIVE_IN_MEMORY_INTERNAL (var) = 0; /* Variables that are intrinsically call-clobbered (globals, local statics, etc) will not be marked by the aliasing @@ -1329,7 +1328,7 @@ setup_pointers_and_addressables (struct alias_info *ai) { if (!bitmap_bit_p (ai->addresses_needed, v_ann->uid) && v_ann->mem_tag_kind == NOT_A_TAG - && !needs_to_live_in_memory (var)) + && !is_global_var (var)) { /* The address of VAR is not needed, remove the addressable bit, so that it can be optimized as a @@ -1391,7 +1390,7 @@ setup_pointers_and_addressables (struct alias_info *ai) /* If pointer VAR is a global variable or a PARM_DECL, then its memory tag should be considered a global variable. */ - if (TREE_CODE (var) == PARM_DECL || needs_to_live_in_memory (var)) + if (TREE_CODE (var) == PARM_DECL || is_global_var (var)) mark_call_clobbered (tag); /* All the dereferences of pointer VAR count as @@ -2105,18 +2104,16 @@ get_nmt_for (tree ptr) tree tag = pi->name_mem_tag; if (tag == NULL_TREE) - { - tag = create_memory_tag (TREE_TYPE (TREE_TYPE (ptr)), false); + tag = create_memory_tag (TREE_TYPE (TREE_TYPE (ptr)), false); - /* If PTR is a PARM_DECL, its memory tag should be considered a - global variable. */ - if (TREE_CODE (SSA_NAME_VAR (ptr)) == PARM_DECL) - mark_call_clobbered (tag); + /* If PTR is a PARM_DECL, its memory tag should be considered a global + variable. */ + if (TREE_CODE (SSA_NAME_VAR (ptr)) == PARM_DECL) + mark_call_clobbered (tag); - /* Similarly, if PTR points to malloc, then TAG is a global. */ - if (pi->pt_malloc) - mark_call_clobbered (tag); - } + /* Similarly, if PTR points to malloc, then TAG is a global. */ + if (pi->pt_malloc) + mark_call_clobbered (tag); return tag; } |