summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>2018-05-15 16:39:43 +0000
committerhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>2018-05-15 16:39:43 +0000
commit0dbcf2c2b2e4e778d17fddc22b6a5c0b500fff50 (patch)
treeac5803ea082a9a4d8e6e8bcfcb37acdbb89b3d40
parentc6e04fcae681df5373fb5630458bca35fd94dd89 (diff)
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
-rw-r--r--gcc/lto/ChangeLog7
-rw-r--r--gcc/lto/lto-partition.c23
2 files changed, 26 insertions, 4 deletions
diff --git a/gcc/lto/ChangeLog b/gcc/lto/ChangeLog
index 77e5915b1632..cd976fa66bb1 100644
--- a/gcc/lto/ChangeLog
+++ b/gcc/lto/ChangeLog
@@ -1,3 +1,10 @@
+2018-05-18 Jan Hubicka <jh@suse.cz>
+
+ 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 <jh@suse.cz>
* lto.c (cmp_partitions_size): Remove.
diff --git a/gcc/lto/lto-partition.c b/gcc/lto/lto-partition.c
index 637e5e24b980..fd796e12a2dc 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 <cgraph_node *> (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;
}