diff options
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/cfgexpand.c | 5 | ||||
-rw-r--r-- | gcc/tree-dfa.c | 3 |
3 files changed, 14 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b5a53f6..36ad66e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2011-01-21 Alexandre Oliva <aoliva@redhat.com> + + PR debug/47106 + * cfgexpand.c (account_used_vars_for_block): Only account vars + that are annotated as used. + (estimated_stack_frame_size): Don't set TREE_USED. + * tree-dfa.c (create_var_ann): Mark variable as used. + 2011-01-21 Richard Guenther <rguenther@suse.de> PR middle-end/47395 diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c index aeb2361..bb60c33 100644 --- a/gcc/cfgexpand.c +++ b/gcc/cfgexpand.c @@ -1325,7 +1325,7 @@ account_used_vars_for_block (tree block, bool toplevel) /* Expand all variables at this level. */ for (t = BLOCK_VARS (block); t ; t = DECL_CHAIN (t)) - if (TREE_USED (t)) + if (var_ann (t) && var_ann (t)->used) size += expand_one_var (t, toplevel, false); /* Expand all variables at containing levels. */ @@ -1389,9 +1389,10 @@ estimated_stack_frame_size (tree decl) FOR_EACH_LOCAL_DECL (cfun, ix, var) { + /* TREE_USED marks local variables that do not appear in lexical + blocks. We don't want to expand those that do twice. */ if (TREE_USED (var)) size += expand_one_var (var, true, false); - TREE_USED (var) = 1; } size += account_used_vars_for_block (outer_block, true); diff --git a/gcc/tree-dfa.c b/gcc/tree-dfa.c index 05a682b..8766744 100644 --- a/gcc/tree-dfa.c +++ b/gcc/tree-dfa.c @@ -137,6 +137,9 @@ create_var_ann (tree t) ann = ggc_alloc_cleared_var_ann_d (); *DECL_VAR_ANN_PTR (t) = ann; + /* Assume the variable is used, at least for now. */ + ann->used = true; + return ann; } |