diff options
author | Martin Jambor <mjambor@suse.cz> | 2015-02-13 20:04:32 +0000 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2015-02-13 20:04:32 +0000 |
commit | 4fd94d1e35f1ec4098b4fba19da77d388d76cdf3 (patch) | |
tree | cbd9d2763be56ba7e0493d6c2d5c3a02ae33004d | |
parent | e84abfa41b16b41b40dd39837caca0a7af9abee4 (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/ipa-inline-transform.c | 18 |
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) |