This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Prune BLOCK_VARs lists in free_lang_data
- From: Jan Hubicka <hubicka at ucw dot cz>
- To: gcc-patches at gcc dot gnu dot org, rguenther at suse dot de
- Date: Fri, 15 Jan 2016 12:08:02 +0100
- Subject: Prune BLOCK_VARs lists in free_lang_data
- Authentication-results: sourceware.org; auth=none
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);