re PR middle-end/64922 (runtime error: member call on misaligned address for type 'struct _Rep')

PR middle-end/64922
	* ipa-prop.c (update_indirect_edges_after_inlining): Correctly update
	edges that become speculative.

From-SVN: r220423
This commit is contained in:
Jan Hubicka 2015-02-04 23:59:30 +01:00 committed by Jan Hubicka
parent de3aebffe9
commit 3ff29913b9
2 changed files with 24 additions and 3 deletions

View File

@ -1,3 +1,9 @@
2015-02-04 Jan Hubicka <hubicka@ucw.cz>
PR middle-end/64922
* ipa-prop.c (update_indirect_edges_after_inlining): Correctly update
edges that become speculative.
2015-02-04 Jakub Jelinek <jakub@redhat.com>
* dwarf2out.c (is_fortran): Also return true for DW_LANG_Fortran03

View File

@ -3075,6 +3075,7 @@ update_indirect_edges_after_inlining (struct cgraph_edge *cs,
struct cgraph_indirect_call_info *ici = ie->indirect_info;
struct ipa_jump_func *jfunc;
int param_index;
cgraph_node *spec_target = NULL;
next_ie = ie->next_callee;
@ -3091,6 +3092,14 @@ update_indirect_edges_after_inlining (struct cgraph_edge *cs,
param_index = ici->param_index;
jfunc = ipa_get_ith_jump_func (top, param_index);
if (ie->speculative)
{
struct cgraph_edge *de;
struct ipa_ref *ref;
ie->speculative_call_info (de, ie, ref);
spec_target = de->callee;
}
if (!opt_for_fn (node->decl, flag_indirect_inlining))
new_direct_edge = NULL;
else if (ici->polymorphic)
@ -3103,11 +3112,13 @@ update_indirect_edges_after_inlining (struct cgraph_edge *cs,
new_direct_edge = try_make_edge_direct_simple_call (ie, jfunc,
new_root_info);
/* If speculation was removed, then we need to do nothing. */
if (new_direct_edge && new_direct_edge != ie)
if (new_direct_edge && new_direct_edge != ie
&& new_direct_edge->callee == spec_target)
{
new_direct_edge->indirect_inlining_edge = 1;
top = IPA_EDGE_REF (cs);
res = true;
continue;
}
else if (new_direct_edge)
{
@ -3123,9 +3134,13 @@ update_indirect_edges_after_inlining (struct cgraph_edge *cs,
res = true;
}
top = IPA_EDGE_REF (cs);
/* If speculative edge was introduced we still need to update
call info of the indirect edge. */
if (!new_direct_edge->speculative)
continue;
}
else if (jfunc->type == IPA_JF_PASS_THROUGH
&& ipa_get_jf_pass_through_operation (jfunc) == NOP_EXPR)
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))