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 | |
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')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/ipa-prop.c | 24 |
2 files changed, 21 insertions, 9 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 269bcf0..290d3ac 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2015-02-13 Jan Hubicka <hubicka@ucw.cz> + + 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. + 2015-02-13 Maritn Jambor <mjambor@suse.cz> PR ipa/65028 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 |