From patchwork Wed Feb 2 06:33:56 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [PR,debug/47106] account used vars only once Date: Tue, 01 Feb 2011 20:33:56 -0000 From: Alexandre Oliva X-Patchwork-Id: 81424 Message-Id: To: Richard Guenther Cc: gcc-patches@gcc.gnu.org, Jan Hubicka On Jan 31, 2011, Richard Guenther wrote: >> 1st: fix duplicate LOCAL_DECLs for inlined result decls > Ok (I think the assert is superfluous, a lot of things would already be > broken if that didn't hold ...) Ok, assert removed, then installed a separate patch when I realized that the removal of the assert made the caller variable unused. > +/* Clear VAR's used flag, so that it may be discarded during rtl > + expansion. */ > + > +static inline void > +clear_is_used (tree var) > I think this should just say "Clear VAR's used flag.". Adjusted. I also adjusted the last remaining direct use of the used field from a dumping function. Here are the patches I installed so far. I got my build machines back, and I've nearly finished the testing of the other patches in my queue, so I'll try copying var_ann->used when duplicating variables. for gcc/ChangeLog from Alexandre Oliva 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. Index: gcc/cfgexpand.c =================================================================== --- gcc/cfgexpand.c.orig 2011-01-31 09:04:28.000000000 -0200 +++ gcc/cfgexpand.c 2011-02-02 03:45:49.306492981 -0200 @@ -1325,7 +1325,7 @@ account_used_vars_for_block (tree block, /* 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. */ Index: gcc/tree-flow-inline.h =================================================================== --- gcc/tree-flow-inline.h.orig 2011-01-31 09:04:28.000000000 -0200 +++ gcc/tree-flow-inline.h 2011-02-02 03:59:32.083138770 -0200 @@ -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. */ Index: gcc/tree-nrv.c =================================================================== --- gcc/tree-nrv.c.orig 2011-01-31 09:04:28.000000000 -0200 +++ gcc/tree-nrv.c 2011-02-02 03:45:49.314492733 -0200 @@ -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; } Index: gcc/tree-ssa-live.c =================================================================== --- gcc/tree-ssa-live.c.orig 2011-01-31 09:04:28.000000000 -0200 +++ gcc/tree-ssa-live.c 2011-02-02 04:10:16.132912744 -0200 @@ -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 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))