This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Fix ipa-props update of contexts after inlining
- From: Jan Hubicka <hubicka at ucw dot cz>
- To: gcc-patches at gcc dot gnu dot org
- Date: Fri, 13 Feb 2015 21:07:47 +0100
- Subject: Fix ipa-props update of contexts after inlining
- Authentication-results: sourceware.org; auth=none
Hi,
while looking for the soplex miscompilation I run across the following place that
was not updated to polymorphic call contexts. When we do not know if type
is preserved, we only need to note that in the indirect_call_info.
Bootstrapped/regtested x86_64-linux, comitted.
Honza
PR ipa/65028
* ipa-prop.c (update_indirect_edges_after_inlining): Do not drop
polymorphic call info when type is not known to be preserved.
Index: /aux/hubicka/trunk-7/gcc/ipa-prop.c
===================================================================
--- /aux/hubicka/trunk-7/gcc/ipa-prop.c (revision 220632)
+++ /aux/hubicka/trunk-7/gcc/ipa-prop.c (working copy)
@@ -3143,25 +3143,31 @@ update_indirect_edges_after_inlining (st
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))
- || (ici->polymorphic
- && !ipa_get_jf_pass_through_type_preserved (jfunc)))
+ if (ici->agg_contents
+ && !ipa_get_jf_pass_through_agg_preserved (jfunc)
+ && !ici->polymorphic)
ici->param_index = -1;
else
- ici->param_index = ipa_get_jf_pass_through_formal_id (jfunc);
+ {
+ ici->param_index = ipa_get_jf_pass_through_formal_id (jfunc);
+ if (ici->polymorphic
+ && !ipa_get_jf_pass_through_type_preserved (jfunc))
+ ici->vptr_changed = true;
+ }
}
else if (jfunc->type == IPA_JF_ANCESTOR)
{
- if ((ici->agg_contents
- && !ipa_get_jf_ancestor_agg_preserved (jfunc))
- || (ici->polymorphic
- && !ipa_get_jf_ancestor_type_preserved (jfunc)))
+ if (ici->agg_contents
+ && !ipa_get_jf_pass_through_agg_preserved (jfunc)
+ && !ici->polymorphic)
ici->param_index = -1;
else
{
ici->param_index = ipa_get_jf_ancestor_formal_id (jfunc);
ici->offset += ipa_get_jf_ancestor_offset (jfunc);
+ if (ici->polymorphic
+ && !ipa_get_jf_pass_through_type_preserved (jfunc))
+ ici->vptr_changed = true;
}
}
else