Hi, this is last of my patches to improve partitionability of programs. This patch compacts BLOCK_VARs lists and trows away TYPE_DECLs for -g0 and redundant TYPE_DECLs on all levels. It does make noticeable difference on firefox, but I managed to erase the numbers (can re-test them if requested)
Bootstrapped/regtested x86_64-linux, OK? * tree.c (needed_in_block_vars_p): New function. (free_lang_data_in_decl): Use it. Index: tree.c =================================================================== --- tree.c (revision 232407) +++ tree.c (working copy) @@ -5343,6 +5343,42 @@ need_assembler_name_p (tree decl) return true; } +/* Return true if DECL should stay in BLOCK_VARs list. */ + +static inline bool +needed_in_block_vars_p (const_tree decl) +{ + if (TREE_CODE (decl) == VAR_DECL && TREE_USED (decl) + && (!TREE_STATIC (decl) || DECL_EXTERNAL (decl))) + return true; + if (TREE_CODE (decl) == RESULT_DECL) + return true; + /* Dwarf2out output non-fortran and non-ada const decls when the + enum is output and it will not consider language to be ada or fortran + in LTO. */ + if (TREE_CODE (decl) == CONST_DECL) + return false; + if (debug_info_level >= DINFO_LEVEL_TERSE) + return false; + /* Strip builtins from the translation-unit BLOCK. We still have targets + without builtin_decl_explicit support and also builtins are shared + nodes and thus we can't use TREE_CHAIN in multiple lists. */ + if (TREE_CODE (decl) == FUNCTION_DECL + && DECL_BUILT_IN (decl)) + return false; + if (DECL_IGNORED_P (decl)) + return false; + if (TREE_CODE (decl) == TYPE_DECL + && is_redundant_typedef (decl)) + return false; + gcc_checking_assert (TREE_CODE (decl) == TYPE_DECL + || TREE_CODE (decl) == VAR_DECL + || TREE_CODE (decl) == FUNCTION_DECL + || TREE_CODE (decl) == LABEL_DECL + || TREE_CODE (decl) == RESULT_DECL); + return true; +} + /* Reset all language specific information still present in symbol DECL. */ @@ -5445,15 +5481,11 @@ free_lang_data_in_decl (tree decl) && DECL_INITIAL (decl) && TREE_CODE (DECL_INITIAL (decl)) == BLOCK) { - /* Strip builtins from the translation-unit BLOCK. We still have targets - without builtin_decl_explicit support and also builtins are shared - nodes and thus we can't use TREE_CHAIN in multiple lists. */ tree *nextp = &BLOCK_VARS (DECL_INITIAL (decl)); while (*nextp) { tree var = *nextp; - if (TREE_CODE (var) == FUNCTION_DECL - && DECL_BUILT_IN (var)) + if (needed_in_block_vars_p (var)) *nextp = TREE_CHAIN (var); else nextp = &TREE_CHAIN (var);