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:
parent
0d2dd460fe
commit
d8d5aef100
gcc
@ -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
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
|
54
gcc/testsuite/g++.dg/ipa/pr63470.C
Normal file
54
gcc/testsuite/g++.dg/ipa/pr63470.C
Normal 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;
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user