This removes the code that makes us walk DECL_INITIAL (recursively) on add_referenced_var - one source of compile-time hogs in the past and not strictly necessary. Fallout is fixed by guarding used flag setting in unused-var-removal as all reads of that flag are already.
This is a first patch in a series to make referenced vars tracking cheaper and more robust. Bootstrapped on x86_64-unknown-linux-gnu, testing in progress. Richard. 2012-05-21 Richard Guenther <rguent...@suse.de> * tree-dfa.c (add_referenced_var): Do not walk DECL_INITIAL for more referenced vars. * tree-ssa-live.c (mark_all_vars_used_1): Only set the used flag on variables that have a var-annotation. Index: gcc/tree-dfa.c =================================================================== --- gcc/tree-dfa.c (revision 187708) +++ gcc/tree-dfa.c (working copy) @@ -577,24 +577,16 @@ set_default_def (tree var, tree def) bool add_referenced_var (tree var) { - gcc_assert (DECL_P (var)); + gcc_checking_assert (TREE_CODE (var) == VAR_DECL + || TREE_CODE (var) == PARM_DECL + || TREE_CODE (var) == RESULT_DECL); + if (!*DECL_VAR_ANN_PTR (var)) create_var_ann (var); /* Insert VAR into the referenced_vars hash table if it isn't present. */ if (referenced_var_check_and_insert (var)) - { - /* Scan DECL_INITIAL for pointer variables as they may contain - address arithmetic referencing the address of other - variables. As we are only interested in directly referenced - globals or referenced locals restrict this to initializers - than can refer to local variables. */ - if (DECL_INITIAL (var) - && DECL_CONTEXT (var) == current_function_decl) - walk_tree (&DECL_INITIAL (var), find_vars_r, NULL, 0); - - return true; - } + return true; return false; } Index: gcc/tree-ssa-live.c =================================================================== --- gcc/tree-ssa-live.c (revision 187708) +++ gcc/tree-ssa-live.c (working copy) @@ -377,7 +377,8 @@ mark_all_vars_used_1 (tree *tp, int *wal if (data != NULL && bitmap_clear_bit ((bitmap) data, DECL_UID (t)) && DECL_CONTEXT (t) == current_function_decl) mark_all_vars_used (&DECL_INITIAL (t), data); - set_is_used (t); + if (var_ann (t) != NULL) + set_is_used (t); } /* remove_unused_scope_block_p requires information about labels which are not DECL_IGNORED_P to tell if they might be used in the IL. */