re PR debug/47106 (-fcompare-debug failure (length) with -fpartial-inlining -flto -fconserve-stack)

PR debug/47106
PR debug/47402
* tree-flow-inline.h (clear_is_used, is_used_p): New.
* cfgexpand.c (account_used_vars_for_block): Use them.
* tree-nrv.c (tree_nrv): Likewise.
* tree-ssa-live.c (remove_unused_scope_block_p): Likewise.
(dump_scope_block): Likewise.
(remove_unused_locals): Likewise.

From-SVN: r169515
This commit is contained in:
Alexandre Oliva 2011-02-02 06:18:01 +00:00 committed by Alexandre Oliva
parent aaa2ac931e
commit 83d707929b
5 changed files with 40 additions and 14 deletions

View File

@ -1,3 +1,14 @@
2011-02-02 Alexandre Oliva <aoliva@redhat.com>
PR debug/47106
PR debug/47402
* tree-flow-inline.h (clear_is_used, is_used_p): New.
* cfgexpand.c (account_used_vars_for_block): Use them.
* tree-nrv.c (tree_nrv): Likewise.
* tree-ssa-live.c (remove_unused_scope_block_p): Likewise.
(dump_scope_block): Likewise.
(remove_unused_locals): Likewise.
2011-02-02 Alexandre Oliva <aoliva@redhat.com>
PR debug/47106

View File

@ -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 (var_ann (t) && var_ann (t)->used)
if (var_ann (t) && is_used_p (t))
size += expand_one_var (t, toplevel, false);
/* Expand all variables at containing levels. */

View File

@ -569,9 +569,26 @@ static inline void
set_is_used (tree var)
{
var_ann_t ann = get_var_ann (var);
ann->used = 1;
ann->used = true;
}
/* Clear VAR's used flag. */
static inline void
clear_is_used (tree var)
{
var_ann_t ann = var_ann (var);
ann->used = false;
}
/* Return true if VAR is marked as used. */
static inline bool
is_used_p (tree var)
{
var_ann_t ann = var_ann (var);
return ann->used;
}
/* Return true if T (assumed to be a DECL) is a global variable.
A variable is considered global if its storage is not automatic. */

View File

@ -263,7 +263,7 @@ tree_nrv (void)
DECL_HAS_VALUE_EXPR_P (found) = 1;
/* FOUND is no longer used. Ensure it gets removed. */
var_ann (found)->used = 0;
clear_is_used (found);
return 0;
}

View File

@ -468,7 +468,7 @@ remove_unused_scope_block_p (tree scope)
Exception are the scope blocks not containing any instructions
at all so user can't get into the scopes at first place. */
else if ((ann = var_ann (*t)) != NULL
&& ann->used)
&& is_used_p (*t))
unused = false;
else if (TREE_CODE (*t) == LABEL_DECL && TREE_USED (*t))
/* For labels that are still used in the IL, the decision to
@ -633,13 +633,11 @@ dump_scope_block (FILE *file, int indent, tree scope, int flags)
for (var = BLOCK_VARS (scope); var; var = DECL_CHAIN (var))
{
bool used = false;
var_ann_t ann;
if ((ann = var_ann (var))
&& ann->used)
used = true;
if (var_ann (var))
used = is_used_p (var);
fprintf (file, "%*s",indent, "");
fprintf (file, "%*s", indent, "");
print_generic_decl (file, var, flags);
fprintf (file, "%s\n", used ? "" : " (unused)");
}
@ -708,7 +706,7 @@ remove_unused_locals (void)
/* Assume all locals are unused. */
FOR_EACH_REFERENCED_VAR (t, rvi)
var_ann (t)->used = false;
clear_is_used (t);
/* Walk the CFG marking all referenced symbols. */
FOR_EACH_BB (bb)
@ -769,7 +767,7 @@ remove_unused_locals (void)
var = VEC_index (tree, cfun->local_decls, srcidx);
if (TREE_CODE (var) != FUNCTION_DECL
&& (!(ann = var_ann (var))
|| !ann->used))
|| !is_used_p (var)))
{
if (is_global_var (var))
{
@ -801,7 +799,7 @@ remove_unused_locals (void)
if (TREE_CODE (var) == VAR_DECL
&& is_global_var (var)
&& (ann = var_ann (var)) != NULL
&& ann->used)
&& is_used_p (var))
mark_all_vars_used (&DECL_INITIAL (var), global_unused_vars);
num = VEC_length (tree, cfun->local_decls);
@ -827,8 +825,8 @@ remove_unused_locals (void)
if (!is_global_var (t)
&& TREE_CODE (t) != PARM_DECL
&& TREE_CODE (t) != RESULT_DECL
&& !(ann = var_ann (t))->used
&& !ann->is_heapvar)
&& !is_used_p (t)
&& !var_ann (t)->is_heapvar)
remove_referenced_var (t);
remove_unused_scope_block_p (DECL_INITIAL (current_function_decl));
if (dump_file && (dump_flags & TDF_DETAILS))