diff options
author | Jan Hubicka <hubicka@ucw.cz> | 2015-02-04 23:59:30 +0100 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2015-02-04 22:59:30 +0000 |
commit | 3ff29913b90557b0364bb6dac4e68952f85d4ee6 (patch) | |
tree | 25a504aefa93ead895d359580afcf291fb1c1d5d /gcc | |
parent | de3aebffe98c425f6368c44d32e72450139176fa (diff) | |
download | gcc-3ff29913b90557b0364bb6dac4e68952f85d4ee6.zip gcc-3ff29913b90557b0364bb6dac4e68952f85d4ee6.tar.gz gcc-3ff29913b90557b0364bb6dac4e68952f85d4ee6.tar.bz2 |
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/ipa-prop.c | 21 |
2 files changed, 24 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b90fc40..ef35c40 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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 diff --git a/gcc/ipa-prop.c b/gcc/ipa-prop.c index 9c8a785..5f8e461 100644 --- a/gcc/ipa-prop.c +++ b/gcc/ipa-prop.c @@ -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)) |