diff options
author | Jan Hubicka <hubicka@ucw.cz> | 2015-02-13 21:05:39 +0100 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2015-02-13 20:05:39 +0000 |
commit | d05022766b7e692567e24198d44b91253c4a2625 (patch) | |
tree | 72387fa152f3d5f6a062aa6007b096bfc550b5b9 /gcc/ipa-prop.c | |
parent | 4fd94d1e35f1ec4098b4fba19da77d388d76cdf3 (diff) | |
download | gcc-d05022766b7e692567e24198d44b91253c4a2625.zip gcc-d05022766b7e692567e24198d44b91253c4a2625.tar.gz gcc-d05022766b7e692567e24198d44b91253c4a2625.tar.bz2 |
re PR ipa/65028 (450.soplex in SPEC CPU 2006 is miscompiled)
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.
From-SVN: r220694
Diffstat (limited to 'gcc/ipa-prop.c')
-rw-r--r-- | gcc/ipa-prop.c | 24 |
1 files changed, 15 insertions, 9 deletions
diff --git a/gcc/ipa-prop.c b/gcc/ipa-prop.c index 878e94f..908b5ee 100644 --- a/gcc/ipa-prop.c +++ b/gcc/ipa-prop.c @@ -3143,25 +3143,31 @@ update_indirect_edges_after_inlining (struct cgraph_edge *cs, 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_ancestor_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_ancestor_type_preserved (jfunc)) + ici->vptr_changed = true; } } else |