re PR ipa/64378 (ICE: in inline_call, at ipa-inline-transform.c:347 with -O3 -fno-ipa-cp)

PR ipa/64378
	* ipa-prop.c (try_make_edge_direct_virtual_call): Clear speculative
	flag correctly.
	* ipa-cp.c (ipa_get_indirect_edge_target_1): Handle speculation.
	* g++.dg/torture/pr64378.C: New testcase.

From-SVN: r219822
This commit is contained in:
Jan Hubicka 2015-01-18 18:31:35 +01:00 committed by Jan Hubicka
parent 257024e31e
commit 33c3b6be4d
5 changed files with 45 additions and 3 deletions

View File

@ -1,3 +1,10 @@
2015-01-18 Jan Hubicka <hubicka@ucw.cz>
PR ipa/64378
* ipa-prop.c (try_make_edge_direct_virtual_call): Clear speculative
flag correctly.
* ipa-cp.c (ipa_get_indirect_edge_target_1): Handle speculation.
2015-01-18 Sandra Loosemore <sandra@codesourcery.com>
* doc/invoke.texi ([-funroll-loops], [-funroll-all-loops]):

View File

@ -1975,8 +1975,13 @@ ipa_get_indirect_edge_target_1 (struct cgraph_edge *ie,
}
}
else if (t)
context = ipa_polymorphic_call_context (t, ie->indirect_info->otr_type,
anc_offset);
{
context = ipa_polymorphic_call_context (t, ie->indirect_info->otr_type,
anc_offset);
if (ie->indirect_info->vptr_changed)
context.possible_dynamic_type_change (ie->in_polymorphic_cdtor,
ie->indirect_info->otr_type);
}
else
return NULL_TREE;

View File

@ -2985,7 +2985,7 @@ try_make_edge_direct_virtual_call (struct cgraph_edge *ie,
|| !possible_polymorphic_call_target_p
(ie, cgraph_node::get (t)))
{
/* Do not speculate builtin_unreachable, it is stpid! */
/* Do not speculate builtin_unreachable, it is stupid! */
if (!ie->indirect_info->vptr_changed)
target = ipa_impossible_devirt_target (ie, target);
}
@ -3013,6 +3013,7 @@ try_make_edge_direct_virtual_call (struct cgraph_edge *ie,
ctx, &final);
if (final && targets.length () <= 1)
{
speculative = false;
if (targets.length () == 1)
target = targets[0]->decl;
else

View File

@ -1,3 +1,8 @@
2015-01-18 Jan Hubicka <hubicka@ucw.cz>
PR ipa/64378
* g++.dg/torture/pr64378.C: New testcase.
2015-01-18 Paul Thomas <pault@gcc.gnu.org>
PR fortran/57959

View File

@ -0,0 +1,24 @@
// { dg-do compile }
// { dg-options "-fno-ipa-cp" }
struct data {
data(int) {}
};
struct top {
virtual int topf() {}
};
struct child1: top {
void childf()
{
data d(topf());
}
};
void test(top *t)
{
child1 *c = static_cast<child1 *>(t);
c->childf();
child1 d;
test(&d);
}