re PR lto/85583 (lto1: internal compiler error: in lto_balanced_map, at lto/lto-parti...
authorJan Hubicka <jh@suse.cz>
Tue, 15 May 2018 16:39:43 +0000 (18:39 +0200)
committerJan Hubicka <hubicka@gcc.gnu.org>
Tue, 15 May 2018 16:39:43 +0000 (16:39 +0000)
PR lto/85583
* lto-partition.c (account_reference_p): Do not account
references from aliases; do not account refernces from
external initializers.

From-SVN: r260266

gcc/lto/ChangeLog
gcc/lto/lto-partition.c

index 77e5915..cd976fa 100644 (file)
@@ -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.
index 637e5e2..fd796e1 100644 (file)
@@ -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;
 }