Hi,
this patch implements analogous change I did to ipa.c reachability to remove
extern functions early when not optimizing. These are common in C++ code and
it is not effective to process them until after inliner.
Bootstrapped/regtested x86_64-linux, will commit it shortly.
Honza
* cgraphunit.c (analyze_functions): Do not analyze extern inline
funtions when not optimizing; skip comdat locals.
Index: cgraphunit.c
===
--- cgraphunit.c(revision 218701)
+++ cgraphunit.c(working copy)
@@ -263,7 +264,7 @@ symtab_node::needed_p (void)
if (forced_by_abi TREE_PUBLIC (decl))
return true;
- /* Keep constructors, destructors and virtual functions. */
+ /* Keep constructors, destructors and virtual functions. */
if (TREE_CODE (decl) == FUNCTION_DECL
(DECL_STATIC_CONSTRUCTOR (decl) || DECL_STATIC_DESTRUCTOR (decl)))
return true;
@@ -1000,7 +1001,20 @@ analyze_functions (void)
cnode-analyze ();
for (edge = cnode-callees; edge; edge = edge-next_callee)
- if (edge-callee-definition)
+ if (edge-callee-definition
+(!DECL_EXTERNAL (edge-callee-decl)
+ /* When not optimizing, do not try to analyze extern
+ inline functions. Doing so is pointless. */
+ || opt_for_fn (edge-callee-decl, optimize)
+ /* Weakrefs needs to be preserved. */
+ || edge-callee-alias
+ /* always_inline functions are inlined aven at -O0. */
+ || lookup_attribute
+(always_inline,
+ DECL_ATTRIBUTES (edge-callee-decl))
+ /* Multiversioned functions needs the dispatcher to
+ be produced locally even for extern functions. */
+ || edge-callee-function_version ()))
enqueue_node (edge-callee);
if (opt_for_fn (cnode-decl, optimize)
opt_for_fn (cnode-decl, flag_devirtualize))
@@ -1040,10 +1054,17 @@ analyze_functions (void)
for (next = node-same_comdat_group;
next != node;
next = next-same_comdat_group)
- enqueue_node (next);
+ if (!next-comdat_local_p ())
+ enqueue_node (next);
}
for (i = 0; node-iterate_reference (i, ref); i++)
- if (ref-referred-definition)
+ if (ref-referred-definition
+(!DECL_EXTERNAL (ref-referred-decl)
+ || ((TREE_CODE (ref-referred-decl) != FUNCTION_DECL
+ optimize)
+ || (TREE_CODE (ref-referred-decl) == FUNCTION_DECL
+opt_for_fn (ref-referred-decl, optimize))
+ || ref-referred-alias)))
enqueue_node (ref-referred);
symtab-process_new_functions ();
}