This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Fix partitioning ICE


Hi,
this patch silences sanity check that makes sure that everything is in
partition 0 and thus boundary cost is 0 when there is only one partition.
In the testcase there is external initializer which does not get partitioned
and thus we end up with cost 1.  Fixed by not accounting references from
external initializers.

Bootstrapped/regtsted x86_64-linux, will commit it after finishing ltobootstrap.

Honza

	* torture/pr85583.C: New testcase.

	* lto-partition.c (account_reference_p): Do not account
	references from aliases; do not account refernces from
	external initializers.
Index: testsuite/g++.dg/torture/pr85583.C
===================================================================
--- testsuite/g++.dg/torture/pr85583.C	(nonexistent)
+++ testsuite/g++.dg/torture/pr85583.C	(working copy)
@@ -0,0 +1,13 @@
+/* { dg-do link } */
+class b {
+public:
+  virtual ~b();
+};
+template <typename> class c : b {};
+class B {
+  c<char> d;
+};
+extern template class c<char>;
+int
+main(void) { B a; return 0; }
+
Index: lto/lto-partition.c
===================================================================
--- lto/lto-partition.c	(revision 260258)
+++ lto/lto-partition.c	(working copy)
@@ -439,13 +439,28 @@
 {
   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;
 }
 


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]