From: Jan Hubicka Date: Wed, 16 Dec 2015 17:26:20 +0000 (+0100) Subject: ipa-cp.c (ipa_get_indirect_edge_target_1): Use can_refer; do not speculate to impossi... X-Git-Tag: upstream/12.2.0~49926 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=2994ab20f1702205ad1be6ef120d0460b236ae7c;p=platform%2Fupstream%2Fgcc.git ipa-cp.c (ipa_get_indirect_edge_target_1): Use can_refer; do not speculate to impossible targets. * 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. From-SVN: r231705 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ee2af1d..323c8d1 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2015-12-10 Jan Hubicka + + * 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. + 2015-12-16 Aditya Kumar Sebastian Pop diff --git a/gcc/ipa-cp.c b/gcc/ipa-cp.c index 8087f66..782df71 100644 --- a/gcc/ipa-cp.c +++ b/gcc/ipa-cp.c @@ -2077,15 +2077,22 @@ ipa_get_indirect_edge_target_1 (struct cgraph_edge *ie, unsigned HOST_WIDE_INT offset; if (vtable_pointer_value_to_vtable (t, &vtable, &offset)) { + bool can_refer; target = gimple_get_virt_method_for_vtable (ie->indirect_info->otr_token, - vtable, offset); - if (target) + vtable, offset, &can_refer); + if (can_refer) { - if ((TREE_CODE (TREE_TYPE (target)) == FUNCTION_TYPE - && DECL_FUNCTION_CODE (target) == BUILT_IN_UNREACHABLE) + if (!target + || (TREE_CODE (TREE_TYPE (target)) == FUNCTION_TYPE + && DECL_FUNCTION_CODE (target) == BUILT_IN_UNREACHABLE) || !possible_polymorphic_call_target_p (ie, cgraph_node::get (target))) - target = ipa_impossible_devirt_target (ie, target); + { + /* Do not speculate builtin_unreachable, it is stupid! */ + if (ie->indirect_info->vptr_changed) + return NULL; + target = ipa_impossible_devirt_target (ie, target); + } *speculative = ie->indirect_info->vptr_changed; if (!*speculative) return target; @@ -2163,7 +2170,11 @@ ipa_get_indirect_edge_target_1 (struct cgraph_edge *ie, if (target && !possible_polymorphic_call_target_p (ie, cgraph_node::get (target))) - target = ipa_impossible_devirt_target (ie, target); + { + if (*speculative) + return NULL; + target = ipa_impossible_devirt_target (ie, target); + } return target; } diff --git a/gcc/ipa-prop.c b/gcc/ipa-prop.c index 72c2fed..0ab2427 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 {