summaryrefslogtreecommitdiff
path: root/gcc/tree-ssa-live.c
diff options
context:
space:
mode:
authorhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>2007-01-14 10:50:43 +0000
committerhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>2007-01-14 10:50:43 +0000
commitfe15b70175fda71e7c4d6d3b7239d7be13497e02 (patch)
tree70f455bf8ee62a2401f9271eecfe9aa1c4a8dac9 /gcc/tree-ssa-live.c
parent836074a5f7891afcccf23cc867c7ce4a9f1bbc5f (diff)
downloadgcc-fe15b70175fda71e7c4d6d3b7239d7be13497e02.tar.gz
* tree-dfa.c (remove_referenced_var): New function.
* tree-ssa-live.c (remove_unused_locals): Walk referenced vars and prune referenced vars list too. * tree-flow.h (remove_referenced_var): Declare. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@120767 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/tree-ssa-live.c')
-rw-r--r--gcc/tree-ssa-live.c25
1 files changed, 17 insertions, 8 deletions
diff --git a/gcc/tree-ssa-live.c b/gcc/tree-ssa-live.c
index eecf6e73bdf..cc4972f54b2 100644
--- a/gcc/tree-ssa-live.c
+++ b/gcc/tree-ssa-live.c
@@ -449,15 +449,12 @@ remove_unused_locals (void)
{
basic_block bb;
tree t, *cell;
+ referenced_var_iterator rvi;
+ var_ann_t ann;
/* Assume all locals are unused. */
- for (t = cfun->unexpanded_var_list; t; t = TREE_CHAIN (t))
- {
- tree var = TREE_VALUE (t);
- if (TREE_CODE (var) != FUNCTION_DECL
- && var_ann (var))
- var_ann (var)->used = false;
- }
+ FOR_EACH_REFERENCED_VAR (t, rvi)
+ var_ann (t)->used = false;
/* Walk the CFG marking all referenced symbols. */
FOR_EACH_BB (bb)
@@ -493,7 +490,6 @@ remove_unused_locals (void)
for (cell = &cfun->unexpanded_var_list; *cell; )
{
tree var = TREE_VALUE (*cell);
- var_ann_t ann;
if (TREE_CODE (var) != FUNCTION_DECL
&& (!(ann = var_ann (var))
@@ -505,6 +501,19 @@ 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
+ easilly removed from the alias sets and and operand caches.
+ They will be removed shortly after 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);
}