Make IPA-SRA follow comdat-local rules (PR 91956)
authorMartin Jambor <mjambor@suse.cz>
Mon, 25 Nov 2019 10:09:42 +0000 (11:09 +0100)
committerMartin Jambor <jamborm@gcc.gnu.org>
Mon, 25 Nov 2019 10:09:42 +0000 (11:09 +0100)
2019-11-25  Martin Jambor  <mjambor@suse.cz>

PR ipa/91956
* ipa-sra.c (process_isra_node_results): Put the new node to the
same comdat group as the original node.

testsuite/
* g++.dg/ipa/pr91956.C: New test.

From-SVN: r278669

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

index 25adf2e..a15cc75 100644 (file)
@@ -1,3 +1,9 @@
+2019-11-25  Martin Jambor  <mjambor@suse.cz>
+
+       PR ipa/91956
+       * ipa-sra.c (process_isra_node_results): Put the new node to the
+       same comdat group as the original node.
+
 2019-11-25  Georg-Johann Lay  <avr@gjlay.de>
 
        Build double32 / long-double32 multilibs if needed.
index 08606ae..c6ed0f4 100644 (file)
@@ -3759,6 +3759,9 @@ process_isra_node_results (cgraph_node *node,
     = node->create_virtual_clone (callers, NULL, new_adjustments, "isra",
                                  suffix_counter);
   suffix_counter++;
+  if (node->same_comdat_group)
+    new_node->add_to_same_comdat_group (node);
+  new_node->calls_comdat_local = node->calls_comdat_local;
 
   if (dump_file)
     fprintf (dump_file, "  Created new node %s\n", new_node->dump_name ());
index 9ff8a95..ce59906 100644 (file)
@@ -1,3 +1,8 @@
+2019-11-25  Martin Jambor  <mjambor@suse.cz>
+
+       PR ipa/91956
+       * g++.dg/ipa/pr91956.C: New test.
+
 2019-11-23  Thomas Koenig  <tkoenig@gcc.gnu.org>
        Harald Anlauf <anlauf@gmx.de>
 
diff --git a/gcc/testsuite/g++.dg/ipa/pr91956.C b/gcc/testsuite/g++.dg/ipa/pr91956.C
new file mode 100644 (file)
index 0000000..6f6edc3
--- /dev/null
@@ -0,0 +1,27 @@
+/* { dg-do compile } */
+/* { dg-options "-Os -std=c++11 -fno-strict-aliasing -fno-tree-fre -fno-tree-vrp"  } */
+
+int count = 0;
+struct VB
+{
+  VB() {++count;}
+};
+
+struct B : virtual VB
+{
+  B() : B(42) {}
+  B(int)  {}
+};
+
+struct D : B
+{
+  D() {}
+  D(int) : D() {}
+};
+
+int main()
+{
+  D d{42};
+  if (count != 1)
+    __builtin_abort();
+}