re PR tree-optimization/55823 (ice in inline_call, at ipa-inline-transform.c:270)

PR tree-optimization/55823
	* ipa-prop.c (update_indirect_edges_after_inlining): Fix ordering issue.

From-SVN: r195033
This commit is contained in:
Jan Hubicka 2013-01-08 21:23:05 +01:00 committed by Jan Hubicka
parent 8158c65703
commit 36b7291056
4 changed files with 69 additions and 27 deletions

View file

@ -1,3 +1,8 @@
2013-01-04 Jan Hubicka <jh@suse.cz>
PR tree-optimization/55823
* ipa-prop.c (update_indirect_edges_after_inlining): Fix ordering issue.
2012-01-08 Jakub Jelinek <jakub@redhat.com>
Uros Bizjak <ubizjak@gmail.com>

View file

@ -2264,8 +2264,31 @@ update_indirect_edges_after_inlining (struct cgraph_edge *cs,
param_index = ici->param_index;
jfunc = ipa_get_ith_jump_func (top, param_index);
if (jfunc->type == IPA_JF_PASS_THROUGH
&& ipa_get_jf_pass_through_operation (jfunc) == NOP_EXPR)
if (!flag_indirect_inlining)
new_direct_edge = NULL;
else if (ici->polymorphic)
new_direct_edge = try_make_edge_direct_virtual_call (ie, jfunc,
new_root_info);
else
new_direct_edge = try_make_edge_direct_simple_call (ie, jfunc,
new_root_info);
if (new_direct_edge)
{
new_direct_edge->indirect_inlining_edge = 1;
if (new_direct_edge->call_stmt)
new_direct_edge->call_stmt_cannot_inline_p
= !gimple_check_call_matching_types (new_direct_edge->call_stmt,
new_direct_edge->callee->symbol.decl);
if (new_edges)
{
new_edges->safe_push (new_direct_edge);
top = IPA_EDGE_REF (cs);
res = true;
}
}
else if (jfunc->type == IPA_JF_PASS_THROUGH
&& ipa_get_jf_pass_through_operation (jfunc) == NOP_EXPR)
{
if (ici->agg_contents
&& !ipa_get_jf_pass_through_agg_preserved (jfunc))
@ -2287,31 +2310,6 @@ update_indirect_edges_after_inlining (struct cgraph_edge *cs,
else
/* Either we can find a destination for this edge now or never. */
ici->param_index = -1;
if (!flag_indirect_inlining)
continue;
if (ici->polymorphic)
new_direct_edge = try_make_edge_direct_virtual_call (ie, jfunc,
new_root_info);
else
new_direct_edge = try_make_edge_direct_simple_call (ie, jfunc,
new_root_info);
if (new_direct_edge)
{
new_direct_edge->indirect_inlining_edge = 1;
if (new_direct_edge->call_stmt)
new_direct_edge->call_stmt_cannot_inline_p
= !gimple_check_call_matching_types (new_direct_edge->call_stmt,
new_direct_edge->callee->symbol.decl);
if (new_edges)
{
new_edges->safe_push (new_direct_edge);
top = IPA_EDGE_REF (cs);
res = true;
}
}
}
return res;

View file

@ -1,3 +1,8 @@
2013-01-04 Jan Hubicka <jh@suse.cz>
PR tree-optimization/55823
* g++.dg/ipa/devirt-10.C: New testcase.
2012-01-08 Uros Bizjak <ubizjak@gmail.com>
Vladimir Yakovlev <vladimir.b.yakovlev@intel.com>

View file

@ -0,0 +1,34 @@
/* { dg-do compile } */
/* { dg-options "-O3 -fdump-ipa-inline -fdump-ipa-cp" } */
class wxPaintEvent { };
struct wxDCBase
{
wxDCBase ();
virtual int GetLayoutDirection() const{}
virtual void SetLayoutDirection(int){}
};
struct wxWindowDC : public wxDCBase {};
struct wxBufferedDC : public wxDCBase
{
void Init(wxDCBase*dc) {
InitCommon(dc);
}
void InitCommon(wxDCBase*dc) {
if (dc)
SetLayoutDirection(dc->GetLayoutDirection());
}
};
struct wxBufferedPaintDC : public wxBufferedDC {
wxBufferedPaintDC() {
Init(&m_paintdc);
}
wxWindowDC m_paintdc;
};
void OnPaint(wxPaintEvent & event) {
wxBufferedPaintDC dc;
}
/* IPA-CP should really discover both cases, but for time being the second is handled by inliner. */
/* { dg-final { scan-ipa-dump-times "Discovered a virtual call to a known target" 1 "inline" } } */
/* { dg-final { scan-ipa-dump-times "Discovered a virtual call to a known target" 1 "cp" } } */
/* { dg-final { cleanup-ipa-dump "inline" } } */
/* { dg-final { cleanup-ipa-dump "cp" } } */