From 1bf7c3241444b26d2b89b7731de198a9139b7d4e Mon Sep 17 00:00:00 2001 From: Jan Hubicka Date: Mon, 15 Dec 2014 00:21:21 +0000 Subject: [PATCH] cgraphunit.c (analyze_functions): Do not analyze extern inline funtions when not optimizing; skip comdat locals. * cgraphunit.c (analyze_functions): Do not analyze extern inline funtions when not optimizing; skip comdat locals. From-SVN: r218726 --- gcc/ChangeLog | 5 +++++ gcc/cgraphunit.c | 29 +++++++++++++++++++++++++---- 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f8484d87f8e..3e9e2c5393f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2014-12-14 Jan HUbicka + + * cgraphunit.c (analyze_functions): Do not analyze extern inline + funtions when not optimizing; skip comdat locals. + 2014-12-14 H.J. Lu PR rtl-optimization/64037 diff --git a/gcc/cgraphunit.c b/gcc/cgraphunit.c index 53abd173fa6..9f24c4d054f 100644 --- a/gcc/cgraphunit.c +++ b/gcc/cgraphunit.c @@ -225,6 +225,7 @@ along with GCC; see the file COPYING3. If not see #include "tree-chkp.h" #include "lto-section-names.h" #include "omp-low.h" +#include "print-tree.h" /* Queue of cgraph nodes scheduled to be added into cgraph. This is a secondary queue used during optimization to accommodate passes that @@ -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 (); } -- 2.30.2