From d37d06fef83c5f8355fa327d5fa0ff25cd31bb77 Mon Sep 17 00:00:00 2001 From: Diego Novillo Date: Thu, 8 Feb 2007 16:55:43 +0000 Subject: [PATCH] re PR tree-optimization/30562 (remove unused variable is removing a referenced variable (in STORED_SYMS or LOADED_SYMS)) PR 30562 * tree-flow.h (struct var_ann_d): Remove field 'is_used'. Update all users. * tree-ssa-alias.c (compute_is_aliased): Remove. Update all users. (init_alias_info): * tree-ssa-live.c (remove_unused_locals): Do not remove TREE_ADDRESSABLE variables. * tree-ssa-structalias.c (compute_points_to_sets): Tidy. * tree-ssa-operands.c (add_virtual_operand): Remove argument FOR_CLOBBER. Update all users. If VAR has an associated alias set, add a virtual operand for it if no alias is found to conflict with the memory reference. From-SVN: r121715 --- gcc/ChangeLog | 16 +++++++++++++ gcc/tree-dfa.c | 3 --- gcc/tree-flow.h | 3 --- gcc/tree-ssa-alias.c | 44 ----------------------------------- gcc/tree-ssa-live.c | 14 +++++++----- gcc/tree-ssa-operands.c | 47 +++++++++++++++----------------------- gcc/tree-ssa-structalias.c | 1 + gcc/tree-ssa.c | 19 --------------- 8 files changed, 44 insertions(+), 103 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5c7d0c8503e..f4e45dfb25d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,19 @@ +2007-02-08 Diego Novillo + + PR 30562 + * tree-flow.h (struct var_ann_d): Remove field 'is_used'. + Update all users. + * tree-ssa-alias.c (compute_is_aliased): Remove. Update all + users. + (init_alias_info): + * tree-ssa-live.c (remove_unused_locals): Do not remove + TREE_ADDRESSABLE variables. + * tree-ssa-structalias.c (compute_points_to_sets): Tidy. + * tree-ssa-operands.c (add_virtual_operand): Remove argument + FOR_CLOBBER. Update all users. + If VAR has an associated alias set, add a virtual operand for + it if no alias is found to conflict with the memory reference. + 2007-02-07 Jan Hubicka Robert Kidd diff --git a/gcc/tree-dfa.c b/gcc/tree-dfa.c index f49c1adb54d..a1200eb4ebd 100644 --- a/gcc/tree-dfa.c +++ b/gcc/tree-dfa.c @@ -337,9 +337,6 @@ dump_variable (FILE *file, tree var) print_generic_expr (file, ann->symbol_mem_tag, dump_flags); } - if (ann && ann->is_aliased) - fprintf (file, ", is aliased"); - if (TREE_ADDRESSABLE (var)) fprintf (file, ", is addressable"); diff --git a/gcc/tree-flow.h b/gcc/tree-flow.h index 19efacd5ca2..2d661f58af0 100644 --- a/gcc/tree-flow.h +++ b/gcc/tree-flow.h @@ -228,9 +228,6 @@ struct var_ann_d GTY(()) /* Used when building base variable structures in a var_map. */ unsigned base_var_processed : 1; - /* Nonzero if this variable is in the alias set of another variable. */ - unsigned is_aliased : 1; - /* Nonzero if this variable was used after SSA optimizations were applied. We set this when translating out of SSA form. */ unsigned used : 1; diff --git a/gcc/tree-ssa-alias.c b/gcc/tree-ssa-alias.c index e3fe52abb55..5ed2d13adab 100644 --- a/gcc/tree-ssa-alias.c +++ b/gcc/tree-ssa-alias.c @@ -776,43 +776,6 @@ done: timevar_pop (TV_MEMORY_PARTITIONING); } -/* This function computes the value of the is_aliased bit for - variables. is_aliased is true for any variable that is in an - alias bitmap. */ - -static void -compute_is_aliased (void) -{ - referenced_var_iterator rvi; - tree tag; - bitmap aliased_vars = BITMAP_ALLOC (NULL); - bitmap_iterator bi; - unsigned int i; - - /* Add is_aliased for all vars pointed to by the symbol tags. */ - FOR_EACH_REFERENCED_VAR (tag, rvi) - { - bitmap aliases; - if (TREE_CODE (tag) != SYMBOL_MEMORY_TAG - && TREE_CODE (tag) != NAME_MEMORY_TAG) - continue; - aliases = MTAG_ALIASES (tag); - if (!aliases) - continue; - - bitmap_ior_into (aliased_vars, aliases); - } - - EXECUTE_IF_SET_IN_BITMAP (aliased_vars, 0, i, bi) - { - tree var = referenced_var (i); - - var_ann (var)->is_aliased = true; - } - - BITMAP_FREE (aliased_vars); -} - /* Compute may-alias information for every variable referenced in function FNDECL. @@ -980,9 +943,6 @@ compute_may_aliases (void) dump_points_to_info (dump_file); dump_alias_info (dump_file); } - - /* Set up is_aliased flags. */ - compute_is_aliased (); /* Deallocate memory used by aliasing data structures. */ delete_alias_info (ai); @@ -1170,10 +1130,6 @@ init_alias_info (void) /* Clear flow-insensitive alias information from each symbol. */ FOR_EACH_REFERENCED_VAR (var, rvi) { - var_ann_t ann = var_ann (var); - - ann->is_aliased = 0; - if (MTAG_P (var)) MTAG_ALIASES (var) = NULL; diff --git a/gcc/tree-ssa-live.c b/gcc/tree-ssa-live.c index 0113b1b36e7..7e98e2cf8e8 100644 --- a/gcc/tree-ssa-live.c +++ b/gcc/tree-ssa-live.c @@ -502,18 +502,20 @@ remove_unused_locals (void) cell = &TREE_CHAIN (*cell); } - /* Remove unused variables from REFERENCED_VARs. As an special exception - keep the variables that are believed to be aliased. Those can't be - easily removed from the alias sets and and operand caches. - They will be removed shortly after next may_alias pass is performed. */ + /* Remove unused variables from REFERENCED_VARs. As a special + exception keep the variables that are believed to be aliased. + Those can't be easily removed from the alias sets and operand + caches. They will be removed shortly after the next may_alias + pass is performed. */ FOR_EACH_REFERENCED_VAR (t, rvi) if (!is_global_var (t) && !MTAG_P (t) && TREE_CODE (t) != PARM_DECL && TREE_CODE (t) != RESULT_DECL && !(ann = var_ann (t))->used - && !ann->is_aliased && !is_call_clobbered (t) && !ann->symbol_mem_tag) - remove_referenced_var (t); + && !ann->symbol_mem_tag + && !TREE_ADDRESSABLE (t)) + remove_referenced_var (t); } diff --git a/gcc/tree-ssa-operands.c b/gcc/tree-ssa-operands.c index aa56c197a25..c702ed454db 100644 --- a/gcc/tree-ssa-operands.c +++ b/gcc/tree-ssa-operands.c @@ -1433,13 +1433,12 @@ access_can_touch_variable (tree ref, tree alias, HOST_WIDE_INT offset, get_expr_operands. FULL_REF is a tree that contains the entire pointer dereference expression, if available, or NULL otherwise. OFFSET and SIZE come from the memory access expression that - generated this virtual operand. FOR_CLOBBER is true is this is - adding a virtual operand for a call clobber. */ + generated this virtual operand. */ static void add_virtual_operand (tree var, stmt_ann_t s_ann, int flags, tree full_ref, HOST_WIDE_INT offset, - HOST_WIDE_INT size, bool for_clobber) + HOST_WIDE_INT size) { bitmap aliases = NULL; tree sym; @@ -1514,24 +1513,13 @@ add_virtual_operand (tree var, stmt_ann_t s_ann, int flags, append_vdef (al); } - /* If the variable is also an alias tag, add a virtual - operand for it, otherwise we will miss representing - references to the members of the variable's alias set. - This fixes the bug in gcc.c-torture/execute/20020503-1.c. - - It is also necessary to add bare defs on clobbers for - SMT's, so that bare SMT uses caused by pruning all the - aliases will link up properly with calls. In order to - keep the number of these bare defs we add down to the - minimum necessary, we keep track of which SMT's were used - alone in statement vdefs or VUSEs. */ - if (v_ann->is_aliased - || none_added - || (TREE_CODE (var) == SYMBOL_MEMORY_TAG - && for_clobber)) - { - append_vdef (var); - } + /* Even if no aliases have been added, we still need to + establish def-use and use-def chains, lest + transformations think that this is not a memory + reference. For an example of this scenario, see + testsuite/g++.dg/opt/cleanup1.C. */ + if (none_added) + append_vdef (var); } else { @@ -1545,9 +1533,12 @@ add_virtual_operand (tree var, stmt_ann_t s_ann, int flags, append_vuse (al); } - /* Similarly, append a virtual uses for VAR itself, when - it is an alias tag. */ - if (v_ann->is_aliased || none_added) + /* Even if no aliases have been added, we still need to + establish def-use and use-def chains, lest + transformations think that this is not a memory + reference. For an example of this scenario, see + testsuite/g++.dg/opt/cleanup1.C. */ + if (none_added) append_vuse (var); } } @@ -1584,7 +1575,7 @@ add_stmt_operand (tree *var_p, stmt_ann_t s_ann, int flags) append_use (var_p); } else - add_virtual_operand (var, s_ann, flags, NULL_TREE, 0, -1, false); + add_virtual_operand (var, s_ann, flags, NULL_TREE, 0, -1); } @@ -1631,7 +1622,7 @@ get_indirect_ref_operands (tree stmt, tree expr, int flags, { /* PTR has its own memory tag. Use it. */ add_virtual_operand (pi->name_mem_tag, s_ann, flags, - full_ref, offset, size, false); + full_ref, offset, size); } else { @@ -1660,7 +1651,7 @@ get_indirect_ref_operands (tree stmt, tree expr, int flags, if (v_ann->symbol_mem_tag) add_virtual_operand (v_ann->symbol_mem_tag, s_ann, flags, - full_ref, offset, size, false); + full_ref, offset, size); /* Aliasing information is missing; mark statement as volatile so we won't optimize it out too actively. */ else if (s_ann && !gimple_aliases_computed_p (cfun) @@ -1818,7 +1809,7 @@ add_call_clobber_ops (tree stmt, tree callee) clobber_stats.static_read_clobbers_avoided++; } else - add_virtual_operand (var, s_ann, opf_def, NULL, 0, -1, true); + add_virtual_operand (var, s_ann, opf_def, NULL, 0, -1); } } diff --git a/gcc/tree-ssa-structalias.c b/gcc/tree-ssa-structalias.c index 238e7f487c1..e884a658fe8 100644 --- a/gcc/tree-ssa-structalias.c +++ b/gcc/tree-ssa-structalias.c @@ -4663,6 +4663,7 @@ compute_points_to_sets (struct alias_info *ai) if (is_gimple_reg (PHI_RESULT (phi))) { find_func_aliases (phi); + /* Update various related attributes like escaped addresses, pointer dereferences for loads and stores. This is used when creating name tags and alias diff --git a/gcc/tree-ssa.c b/gcc/tree-ssa.c index 6c35fee6308..060f57d9a64 100644 --- a/gcc/tree-ssa.c +++ b/gcc/tree-ssa.c @@ -375,7 +375,6 @@ static void verify_flow_insensitive_alias_info (void) { tree var; - bitmap visited = BITMAP_ALLOC (NULL); referenced_var_iterator rvi; FOR_EACH_REFERENCED_VAR (var, rvi) @@ -393,7 +392,6 @@ verify_flow_insensitive_alias_info (void) EXECUTE_IF_SET_IN_BITMAP (aliases, 0, j, bi) { alias = referenced_var (j); - bitmap_set_bit (visited, j); if (TREE_CODE (alias) != MEMORY_PARTITION_TAG && !may_be_aliased (alias)) @@ -405,23 +403,6 @@ verify_flow_insensitive_alias_info (void) } } - FOR_EACH_REFERENCED_VAR (var, rvi) - { - var_ann_t ann; - ann = var_ann (var); - - if (!MTAG_P (var) - && ann->is_aliased - && memory_partition (var) == NULL_TREE - && !bitmap_bit_p (visited, DECL_UID (var))) - { - error ("addressable variable that is aliased but is not in any " - "alias set"); - goto err; - } - } - - BITMAP_FREE (visited); return; err: