re PR ipa/65028 (450.soplex in SPEC CPU 2006 is miscompiled)
authorMartin Jambor <mjambor@suse.cz>
Fri, 13 Feb 2015 20:04:32 +0000 (20:04 +0000)
committerJan Hubicka <hubicka@gcc.gnu.org>
Fri, 13 Feb 2015 20:04:32 +0000 (20:04 +0000)
PR ipa/65028
* ipa-inline-transform.c (mark_all_inlined_calls_cdtor): New function.
(inline_call): Use it.

From-SVN: r220693

gcc/ChangeLog
gcc/ipa-inline-transform.c

index d9c58b90b02ecbb01dc897055932cf98ea030599..269bcf025c9b4b726987efc425da76cf5623e053 100644 (file)
@@ -1,3 +1,9 @@
+2015-02-13  Maritn Jambor  <mjambor@suse.cz>
+
+       PR ipa/65028
+       * ipa-inline-transform.c (mark_all_inlined_calls_cdtor): New function.
+       (inline_call): Use it.
+       
 2015-02-13  Thomas Schwinge  <thomas@codesourcery.com>
 
        * config/nvptx/offload.h (ACCEL_COMPILER_acc_device): Define to
index 235219dd82e4bd49d5d7ff38f4fc23f81bb6ff7a..52493cc4d0017f782a7ce24913e0d80a5b973b38 100644 (file)
@@ -261,6 +261,22 @@ clone_inlined_nodes (struct cgraph_edge *e, bool duplicate,
     }
 }
 
+/* Mark all call graph edges coming out of NODE and all nodes that have been
+   inlined to it as in_polymorphic_cdtor.  */
+
+static void
+mark_all_inlined_calls_cdtor (cgraph_node *node)
+{
+  for (cgraph_edge *cs = node->callees; cs; cs = cs->next_callee)
+    {
+      cs->in_polymorphic_cdtor = true;
+      if (!cs->inline_failed)
+    mark_all_inlined_calls_cdtor (cs->callee);
+    }
+  for (cgraph_edge *cs = node->indirect_calls; cs; cs = cs->next_callee)
+    cs->in_polymorphic_cdtor = true;
+}
+
 
 /* Mark edge E as inlined and update callgraph accordingly.  UPDATE_ORIGINAL
    specify whether profile of original function should be updated.  If any new
@@ -332,6 +348,8 @@ inline_call (struct cgraph_edge *e, bool update_original,
 
   old_size = inline_summaries->get (to)->size;
   inline_merge_summary (e);
+  if (e->in_polymorphic_cdtor)
+    mark_all_inlined_calls_cdtor (e->callee);
   if (opt_for_fn (e->caller->decl, optimize))
     new_edges_found = ipa_propagate_indirect_call_infos (curr, new_edges);
   if (update_overall_summary)