aboutsummaryrefslogtreecommitdiff
path: root/gcc/ipa-prop.c
diff options
context:
space:
mode:
authorJan Hubicka <hubicka@ucw.cz>2015-02-13 21:05:39 +0100
committerJan Hubicka <hubicka@gcc.gnu.org>2015-02-13 20:05:39 +0000
commitd05022766b7e692567e24198d44b91253c4a2625 (patch)
tree72387fa152f3d5f6a062aa6007b096bfc550b5b9 /gcc/ipa-prop.c
parent4fd94d1e35f1ec4098b4fba19da77d388d76cdf3 (diff)
downloadgcc-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.c24
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