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:
parent
8158c65703
commit
36b7291056
4 changed files with 69 additions and 27 deletions
|
@ -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>
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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>
|
||||
|
||||
|
|
34
gcc/testsuite/g++.dg/ipa/devirt-10.C
Normal file
34
gcc/testsuite/g++.dg/ipa/devirt-10.C
Normal 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" } } */
|
Loading…
Add table
Reference in a new issue