diff options
author | hubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4> | 2015-12-16 17:26:20 +0000 |
---|---|---|
committer | hubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4> | 2015-12-16 17:26:20 +0000 |
commit | c02e93ceebcb1aa1a073797eb4e55744be7a2c16 (patch) | |
tree | fdf0ac7629ddac3966a0a7ce9814ca63b3387581 /gcc/ipa-prop.c | |
parent | b49f1fbb79e540b892774b94d442603bc891a7a4 (diff) | |
download | gcc-c02e93ceebcb1aa1a073797eb4e55744be7a2c16.tar.gz |
* ipa-cp.c (ipa_get_indirect_edge_target_1): Use can_refer; do not
speculate to impossible targets.
* ipa-prop.c (try_make_edge_direct_virtual_call): Likewise.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@231705 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/ipa-prop.c')
-rw-r--r-- | gcc/ipa-prop.c | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/gcc/ipa-prop.c b/gcc/ipa-prop.c index 72c2fed63ff..0ab24274004 100644 --- a/gcc/ipa-prop.c +++ b/gcc/ipa-prop.c @@ -2898,18 +2898,22 @@ try_make_edge_direct_virtual_call (struct cgraph_edge *ie, true); if (t && vtable_pointer_value_to_vtable (t, &vtable, &offset)) { + bool can_refer; t = gimple_get_virt_method_for_vtable (ie->indirect_info->otr_token, - vtable, offset); - if (t) + vtable, offset, &can_refer); + if (can_refer) { - if ((TREE_CODE (TREE_TYPE (t)) == FUNCTION_TYPE - && DECL_FUNCTION_CODE (t) == BUILT_IN_UNREACHABLE) + if (!t + || (TREE_CODE (TREE_TYPE (t)) == FUNCTION_TYPE + && DECL_FUNCTION_CODE (t) == BUILT_IN_UNREACHABLE) || !possible_polymorphic_call_target_p (ie, cgraph_node::get (t))) { /* Do not speculate builtin_unreachable, it is stupid! */ if (!ie->indirect_info->vptr_changed) target = ipa_impossible_devirt_target (ie, target); + else + target = NULL; } else { |