aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Jambor <mjambor@suse.cz>2015-02-13 20:04:32 +0000
committerJan Hubicka <hubicka@gcc.gnu.org>2015-02-13 20:04:32 +0000
commit4fd94d1e35f1ec4098b4fba19da77d388d76cdf3 (patch)
treecbd9d2763be56ba7e0493d6c2d5c3a02ae33004d
parente84abfa41b16b41b40dd39837caca0a7af9abee4 (diff)
downloadgcc-4fd94d1e35f1ec4098b4fba19da77d388d76cdf3.zip
gcc-4fd94d1e35f1ec4098b4fba19da77d388d76cdf3.tar.gz
gcc-4fd94d1e35f1ec4098b4fba19da77d388d76cdf3.tar.bz2
re PR ipa/65028 (450.soplex in SPEC CPU 2006 is miscompiled)
PR ipa/65028 * ipa-inline-transform.c (mark_all_inlined_calls_cdtor): New function. (inline_call): Use it. From-SVN: r220693
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/ipa-inline-transform.c18
2 files changed, 24 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index d9c58b9..269bcf0 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/ipa-inline-transform.c b/gcc/ipa-inline-transform.c
index 235219d..52493cc 100644
--- a/gcc/ipa-inline-transform.c
+++ b/gcc/ipa-inline-transform.c
@@ -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)