Commit 6e4da084 by Jan Hubicka Committed by Jan Hubicka

gimple-fold.c (gimple_fold_obj_type_ref_known_binfo): Check that function is…

gimple-fold.c (gimple_fold_obj_type_ref_known_binfo): Check that function is still available to fold into.

	* gimple-fold.c (gimple_fold_obj_type_ref_known_binfo): Check that
	function is still available to fold into.

From-SVN: r161866
parent ebeb2c24
2010-07-05 Jan Hubicka <jh@suse.cz>
* gimple-fold.c (gimple_fold_obj_type_ref_known_binfo): Check that
function is still available to fold into.
2010-07-05 Nathan Froyd <froydnj@codesourcery.com>
* vec.h (FOR_EACH_VEC_ELT_REVERSE): New macro.
......
......@@ -1156,7 +1156,7 @@ gimple_fold_builtin (gimple stmt)
fold_convert (TREE_TYPE (gimple_call_lhs (stmt)), val[0]);
/* If the result is not a valid gimple value, or not a cast
of a valid gimple value, then we can not use the result. */
of a valid gimple value, then we cannot use the result. */
if (is_gimple_val (new_val)
|| (is_gimple_cast (new_val)
&& is_gimple_val (TREE_OPERAND (new_val, 0))))
......@@ -1351,6 +1351,7 @@ gimple_fold_obj_type_ref_known_binfo (HOST_WIDE_INT token, tree known_binfo)
{
HOST_WIDE_INT i;
tree v, fndecl;
struct cgraph_node *node;
v = BINFO_VIRTUALS (known_binfo);
i = 0;
......@@ -1362,6 +1363,14 @@ gimple_fold_obj_type_ref_known_binfo (HOST_WIDE_INT token, tree known_binfo)
}
fndecl = TREE_VALUE (v);
node = cgraph_get_node (fndecl);
/* When cgraph node is missing and function is not public, we cannot
devirtualize. This can happen in WHOPR when the actual method
ends up in other partition, because we found devirtualization
possibility too late. */
if ((!node || !node->analyzed)
&& (!TREE_PUBLIC (fndecl) || DECL_COMDAT (fndecl)))
return NULL;
return build_fold_addr_expr (fndecl);
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment