Add function part to a same comdat group (PR ipa/80212).
authorMartin Liska <mliska@suse.cz>
Fri, 7 Apr 2017 10:36:21 +0000 (12:36 +0200)
committerMartin Liska <marxin@gcc.gnu.org>
Fri, 7 Apr 2017 10:36:21 +0000 (10:36 +0000)
2017-04-07  Martin Liska  <mliska@suse.cz>

PR ipa/80212
* g++.dg/ipa/pr80212.C: New test.
2017-04-07  Martin Liska  <mliska@suse.cz>

PR ipa/80212
* ipa-split.c (split_function): Add function part to a same comdat
group.

From-SVN: r246759

gcc/ChangeLog
gcc/ipa-split.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/ipa/pr80212.C [new file with mode: 0644]

index e6ad7ce..6237a2c 100644 (file)
@@ -1,3 +1,9 @@
+2017-04-07  Martin Liska  <mliska@suse.cz>
+
+       PR ipa/80212
+       * ipa-split.c (split_function): Add function part to a same comdat
+       group.
+
 2017-04-07  Richard Biener  <rguenther@suse.de>
 
        PR middle-end/80341
index da3c2c6..ae1de6f 100644 (file)
@@ -1363,6 +1363,9 @@ split_function (basic_block return_bb, struct split_point *split_point,
   /* Let's take a time profile for splitted function.  */
   node->tp_first_run = cur_node->tp_first_run + 1;
 
+  if (cur_node->same_comdat_group)
+    node->add_to_same_comdat_group (cur_node);
+
   /* For usual cloning it is enough to clear builtin only when signature
      changes.  For partial inlining we however can not expect the part
      of builtin implementation to have same semantic as the whole.  */
index 565485a..43e7bec 100644 (file)
@@ -1,3 +1,8 @@
+2017-04-07  Martin Liska  <mliska@suse.cz>
+
+       PR ipa/80212
+       * g++.dg/ipa/pr80212.C: New test.
+
 2017-04-07  Thomas Preud'homme  <thomas.preudhomme@arm.com>
 
        * gcc.dg/tree-ssa/pr79800.c: Require c99_runtime.
diff --git a/gcc/testsuite/g++.dg/ipa/pr80212.C b/gcc/testsuite/g++.dg/ipa/pr80212.C
new file mode 100644 (file)
index 0000000..60d3b61
--- /dev/null
@@ -0,0 +1,18 @@
+// PR ipa/80212
+// { dg-options "-O2 --param partial-inlining-entry-probability=403796683 -fno-early-inlining" }
+
+struct b
+{
+  virtual b *c () const;
+};
+struct d : virtual b
+{
+};
+struct e : d
+{
+  e *
+  c () const
+  {
+  }
+};
+main () { e a; }