aboutsummaryrefslogtreecommitdiff
path: root/gcc/gimple-fold.c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2011-04-18 23:58:51 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2011-04-18 23:58:51 +0200
commit848257079a98c2fa9c7d5a8cc666f7c0798e5ec0 (patch)
tree9c65ab447ce980a3d0817af30fab2a1d53ba99f8 /gcc/gimple-fold.c
parent37a8ccfcdcfe73378717101f82767760ae35f5a5 (diff)
downloadgcc-848257079a98c2fa9c7d5a8cc666f7c0798e5ec0.zip
gcc-848257079a98c2fa9c7d5a8cc666f7c0798e5ec0.tar.gz
gcc-848257079a98c2fa9c7d5a8cc666f7c0798e5ec0.tar.bz2
re PR middle-end/48661 (wrong-code regression with devirtualization)
PR middle-end/48661 * gimple-fold.c (gimple_get_virt_method_for_binfo): Return NULL if TREE_TYPE (v) is non-NULL. * gimple-fold.c (gimple_get_virt_method_for_binfo): Renamed from gimple_get_virt_mehtod_for_binfo. * gimple.h (gimple_get_virt_method_for_binfo): Likewise. * ipa-cp.c (ipcp_process_devirtualization_opportunities): Adjust callers. * ipa-prop.c (try_make_edge_direct_virtual_call): Likewise. * g++.dg/torture/pr48661.C: New test. From-SVN: r172677
Diffstat (limited to 'gcc/gimple-fold.c')
-rw-r--r--gcc/gimple-fold.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/gcc/gimple-fold.c b/gcc/gimple-fold.c
index 9047f67..a6e326b 100644
--- a/gcc/gimple-fold.c
+++ b/gcc/gimple-fold.c
@@ -1372,7 +1372,7 @@ gimple_fold_builtin (gimple stmt)
is a thunk (other than a this adjustment which is dealt with by DELTA). */
tree
-gimple_get_virt_mehtod_for_binfo (HOST_WIDE_INT token, tree known_binfo,
+gimple_get_virt_method_for_binfo (HOST_WIDE_INT token, tree known_binfo,
tree *delta, bool refuse_thunks)
{
HOST_WIDE_INT i;
@@ -1391,6 +1391,10 @@ gimple_get_virt_mehtod_for_binfo (HOST_WIDE_INT token, tree known_binfo,
v = TREE_CHAIN (v);
}
+ /* If BV_VCALL_INDEX is non-NULL, give up. */
+ if (TREE_TYPE (v))
+ return NULL_TREE;
+
fndecl = TREE_VALUE (v);
node = cgraph_get_node_or_alias (fndecl);
if (refuse_thunks