2
0
mirror of git://gcc.gnu.org/git/gcc.git synced 2025-01-31 06:09:32 +08:00

re PR ipa/63470 (internal compiler error: in estimate_edge_growth, at ipa-inline.h:308)

PR ipa/63470
	* ipa-inline-analysis.c (inline_edge_duplication_hook): Adjust
	cost when edge becomes direct.
	* ipa-prop.c (make_edge_direct): Do not adjust when speculation
	is resolved or when introducing new speculation.
	* testsuite/g++.dg/ipa/pr63470.C: New testcase.

From-SVN: r219451
This commit is contained in:
Jan Hubicka 2015-01-12 10:24:18 +01:00 committed by Jan Hubicka
parent 0d2dd460fe
commit d8d5aef100
5 changed files with 89 additions and 6 deletions

View File

@ -1,3 +1,11 @@
2015-01-12 Jan Hubicka <hubicka@ucw.cz>
PR ipa/63470
* ipa-inline-analysis.c (inline_edge_duplication_hook): Adjust
cost when edge becomes direct.
* ipa-prop.c (make_edge_direct): Do not adjust when speculation
is resolved or when introducing new speculation.
2015-01-12 Chen Gang <gang.chen.5i5j@gmail.com>
PR ipa/64551

View File

@ -1312,6 +1312,13 @@ inline_edge_duplication_hook (struct cgraph_edge *src,
info->predicate = NULL;
edge_set_predicate (dst, srcinfo->predicate);
info->param = srcinfo->param.copy ();
if (!dst->indirect_unknown_callee && src->indirect_unknown_callee)
{
info->call_stmt_size -= (eni_size_weights.indirect_call_cost
- eni_size_weights.call_cost);
info->call_stmt_time -= (eni_time_weights.indirect_call_cost
- eni_time_weights.call_cost);
}
}

View File

@ -2737,7 +2737,20 @@ ipa_make_edge_direct_to_target (struct cgraph_edge *ie, tree target,
ie->caller->name (), callee->name ());
}
if (!speculative)
ie = ie->make_direct (callee);
{
struct cgraph_edge *orig = ie;
ie = ie->make_direct (callee);
/* If we resolved speculative edge the cost is already up to date
for direct call (adjusted by inline_edge_duplication_hook). */
if (ie == orig)
{
es = inline_edge_summary (ie);
es->call_stmt_size -= (eni_size_weights.indirect_call_cost
- eni_size_weights.call_cost);
es->call_stmt_time -= (eni_time_weights.indirect_call_cost
- eni_time_weights.call_cost);
}
}
else
{
if (!callee->can_be_discarded_p ())
@ -2747,14 +2760,10 @@ ipa_make_edge_direct_to_target (struct cgraph_edge *ie, tree target,
if (alias)
callee = alias;
}
/* make_speculative will update ie's cost to direct call cost. */
ie = ie->make_speculative
(callee, ie->count * 8 / 10, ie->frequency * 8 / 10);
}
es = inline_edge_summary (ie);
es->call_stmt_size -= (eni_size_weights.indirect_call_cost
- eni_size_weights.call_cost);
es->call_stmt_time -= (eni_time_weights.indirect_call_cost
- eni_time_weights.call_cost);
return ie;
}

View File

@ -1,3 +1,8 @@
2015-01-12 Jan Hubicka <hubicka@ucw.cz>
PR ipa/63470
* testsuite/g++.dg/ipa/pr63470.C: New testcase.
2015-01-11 Janus Weil <janus@gcc.gnu.org>
PR fortran/63733

View File

@ -0,0 +1,54 @@
/* PR ipa/63470.C */
/* { dg-do compile } */
/* { dg-options "-O2 -finline-functions" } */
class A
{
public:
virtual bool m_fn1 ();
virtual const char **m_fn2 (int);
virtual int m_fn3 ();
};
class FTjackSupport : A
{
~FTjackSupport ();
bool m_fn1 ();
bool m_fn4 ();
const char **
m_fn2 (int)
{
}
int _inited;
int *_jackClient;
int _activePathCount;
}
* a;
void fn1 (...);
void fn2 (void *);
int fn3 (int *);
FTjackSupport::~FTjackSupport () { m_fn4 (); }
bool
FTjackSupport::m_fn1 ()
{
if (!_jackClient)
return 0;
for (int i=0; _activePathCount; ++i)
if (m_fn2 (i))
fn2 (a);
if (m_fn3 ())
fn2 (a);
if (fn3 (_jackClient))
fn1 (0);
}
bool
FTjackSupport::m_fn4 ()
{
if (_inited && _jackClient)
{
m_fn1 ();
return 0;
}
}