From 0dbcf2c2b2e4e778d17fddc22b6a5c0b500fff50 Mon Sep 17 00:00:00 2001 From: hubicka Date: Tue, 15 May 2018 16:39:43 +0000 Subject: [PATCH] PR lto/85583 * lto-partition.c (account_reference_p): Do not account references from aliases; do not account refernces from external initializers. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@260266 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/lto/ChangeLog | 7 +++++++ gcc/lto/lto-partition.c | 23 +++++++++++++++++++---- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/gcc/lto/ChangeLog b/gcc/lto/ChangeLog index 77e5915b163..cd976fa66bb 100644 --- a/gcc/lto/ChangeLog +++ b/gcc/lto/ChangeLog @@ -1,3 +1,10 @@ +2018-05-18 Jan Hubicka + + PR lto/85583 + * lto-partition.c (account_reference_p): Do not account + references from aliases; do not account refernces from + external initializers. + 2018-04-30 Jan Hubicka * lto.c (cmp_partitions_size): Remove. diff --git a/gcc/lto/lto-partition.c b/gcc/lto/lto-partition.c index 637e5e24b98..fd796e12a2d 100644 --- a/gcc/lto/lto-partition.c +++ b/gcc/lto/lto-partition.c @@ -439,12 +439,27 @@ account_reference_p (symtab_node *n1, symtab_node *n2) { if (cgraph_node *cnode = dyn_cast (n1)) n1 = cnode; + /* Do not account references from aliases - they are never split across + partitions. */ + if (n1->alias) + return false; /* Do not account recursion - the code below will handle it incorrectly - otherwise. Also do not account references to external symbols. - They will never become local. */ + otherwise. Do not account references to external symbols: they will + never become local. Finally do not account references to duplicated + symbols: they will be always local. */ if (n1 == n2 - || DECL_EXTERNAL (n2->decl) - || !n2->definition) + || !n2->definition + || n2->get_partitioning_class () != SYMBOL_PARTITION) + return false; + /* If referring node is external symbol do not account it to boundary + cost. Those are added into units only to enable possible constant + folding and devirtulization. + + Here we do not know if it will ever be added to some partition + (this is decided by compute_ltrans_boundary) and second it is not + that likely that constant folding will actually use the reference. */ + if (contained_in_symbol (n1) + ->get_partitioning_class () == SYMBOL_EXTERNAL) return false; return true; } -- 2.11.4.GIT