Commit d250540a by Martin Jambor Committed by Martin Jambor

re PR middle-end/55078 (FAIL: g++.dg/torture/pr46154.C)

2012-12-07  Martin Jambor  <mjambor@suse.cz>

	PR middle-end/55078
	* ipa-inline-transform.c (inline_call): Turn #if 0 to #ifdef
	ENABLE_CHECKING.
	* ipa-prop.c (try_make_edge_direct_simple_call): Use
	ipa_value_from_jfunc.
	(try_make_edge_direct_virtual_call): Likewise.
	(update_indirect_edges_after_inlining): Lookup new_root_info and pass
	it to the functions above.

From-SVN: r194301
parent 4bd7b70b
2012-12-07 Martin Jambor <mjambor@suse.cz> 2012-12-07 Martin Jambor <mjambor@suse.cz>
PR middle-end/55078
* ipa-inline-transform.c (inline_call): Turn #if 0 to #ifdef
ENABLE_CHECKING.
* ipa-prop.c (try_make_edge_direct_simple_call): Use
ipa_value_from_jfunc.
(try_make_edge_direct_virtual_call): Likewise.
(update_indirect_edges_after_inlining): Lookup new_root_info and pass
it to the functions above.
2012-12-07 Martin Jambor <mjambor@suse.cz>
PR tree-optimization/55590 PR tree-optimization/55590
* tree-sra.c (build_ref_for_offset): Use get_object_alignment_1 to * tree-sra.c (build_ref_for_offset): Use get_object_alignment_1 to
get base alignment. get base alignment.
...@@ -211,8 +211,7 @@ inline_call (struct cgraph_edge *e, bool update_original, ...@@ -211,8 +211,7 @@ inline_call (struct cgraph_edge *e, bool update_original,
struct cgraph_node *callee = cgraph_function_or_thunk_node (e->callee, NULL); struct cgraph_node *callee = cgraph_function_or_thunk_node (e->callee, NULL);
bool new_edges_found = false; bool new_edges_found = false;
/* FIXME: re-enable once ipa-cp problem is fixed. */ #ifdef ENABLE_CHECKING
#if 0
int estimated_growth = estimate_edge_growth (e); int estimated_growth = estimate_edge_growth (e);
bool predicated = inline_edge_summary (e)->predicate != NULL; bool predicated = inline_edge_summary (e)->predicate != NULL;
#endif #endif
...@@ -260,8 +259,8 @@ inline_call (struct cgraph_edge *e, bool update_original, ...@@ -260,8 +259,8 @@ inline_call (struct cgraph_edge *e, bool update_original,
if (update_overall_summary) if (update_overall_summary)
inline_update_overall_summary (to); inline_update_overall_summary (to);
new_size = inline_summary (to)->size; new_size = inline_summary (to)->size;
/* FIXME: re-enable once ipa-cp problem is fixed. */
#if 0 #ifdef ENABLE_CHECKING
/* Verify that estimated growth match real growth. Allow off-by-one /* Verify that estimated growth match real growth. Allow off-by-one
error due to INLINE_SIZE_SCALE roudoff errors. */ error due to INLINE_SIZE_SCALE roudoff errors. */
gcc_assert (!update_overall_summary || !overall_size gcc_assert (!update_overall_summary || !overall_size
...@@ -270,7 +269,7 @@ inline_call (struct cgraph_edge *e, bool update_original, ...@@ -270,7 +269,7 @@ inline_call (struct cgraph_edge *e, bool update_original,
wrong, we should remove them from callgraph. */ wrong, we should remove them from callgraph. */
|| predicated); || predicated);
#endif #endif
/* Account the change of overall unit size; external functions will be /* Account the change of overall unit size; external functions will be
removed and are thus not accounted. */ removed and are thus not accounted. */
if (overall_size if (overall_size
......
...@@ -2187,49 +2187,46 @@ ipa_find_agg_cst_for_param (struct ipa_agg_jump_function *agg, ...@@ -2187,49 +2187,46 @@ ipa_find_agg_cst_for_param (struct ipa_agg_jump_function *agg,
/* Try to find a destination for indirect edge IE that corresponds to a simple /* Try to find a destination for indirect edge IE that corresponds to a simple
call or a call of a member function pointer and where the destination is a call or a call of a member function pointer and where the destination is a
pointer formal parameter described by jump function JFUNC. If it can be pointer formal parameter described by jump function JFUNC. If it can be
determined, return the newly direct edge, otherwise return NULL. */ determined, return the newly direct edge, otherwise return NULL.
NEW_ROOT_INFO is the node info that JFUNC lattices are relative to. */
static struct cgraph_edge * static struct cgraph_edge *
try_make_edge_direct_simple_call (struct cgraph_edge *ie, try_make_edge_direct_simple_call (struct cgraph_edge *ie,
struct ipa_jump_func *jfunc) struct ipa_jump_func *jfunc,
struct ipa_node_params *new_root_info)
{ {
tree target; tree target;
if (ie->indirect_info->agg_contents) if (ie->indirect_info->agg_contents)
{ target = ipa_find_agg_cst_for_param (&jfunc->agg,
target = ipa_find_agg_cst_for_param (&jfunc->agg, ie->indirect_info->offset,
ie->indirect_info->offset, ie->indirect_info->by_ref);
ie->indirect_info->by_ref);
if (!target)
return NULL;
}
else else
{ target = ipa_value_from_jfunc (new_root_info, jfunc);
if (jfunc->type != IPA_JF_CONST) if (!target)
return NULL; return NULL;
target = ipa_get_jf_constant (jfunc);
}
return ipa_make_edge_direct_to_target (ie, target); return ipa_make_edge_direct_to_target (ie, target);
} }
/* Try to find a destination for indirect edge IE that corresponds to a /* Try to find a destination for indirect edge IE that corresponds to a virtual
virtual call based on a formal parameter which is described by jump call based on a formal parameter which is described by jump function JFUNC
function JFUNC and if it can be determined, make it direct and return the and if it can be determined, make it direct and return the direct edge.
direct edge. Otherwise, return NULL. */ Otherwise, return NULL. NEW_ROOT_INFO is the node info that JFUNC lattices
are relative to. */
static struct cgraph_edge * static struct cgraph_edge *
try_make_edge_direct_virtual_call (struct cgraph_edge *ie, try_make_edge_direct_virtual_call (struct cgraph_edge *ie,
struct ipa_jump_func *jfunc) struct ipa_jump_func *jfunc,
struct ipa_node_params *new_root_info)
{ {
tree binfo, target; tree binfo, target;
if (jfunc->type != IPA_JF_KNOWN_TYPE) binfo = ipa_value_from_jfunc (new_root_info, jfunc);
if (!binfo || TREE_CODE (binfo) != TREE_BINFO)
return NULL; return NULL;
binfo = TYPE_BINFO (ipa_get_jf_known_type_base_type (jfunc)); binfo = get_binfo_at_offset (binfo, ie->indirect_info->offset,
gcc_checking_assert (binfo);
binfo = get_binfo_at_offset (binfo, ipa_get_jf_known_type_offset (jfunc)
+ ie->indirect_info->offset,
ie->indirect_info->otr_type); ie->indirect_info->otr_type);
if (binfo) if (binfo)
target = gimple_get_virt_method_for_binfo (ie->indirect_info->otr_token, target = gimple_get_virt_method_for_binfo (ie->indirect_info->otr_token,
...@@ -2256,10 +2253,14 @@ update_indirect_edges_after_inlining (struct cgraph_edge *cs, ...@@ -2256,10 +2253,14 @@ update_indirect_edges_after_inlining (struct cgraph_edge *cs,
{ {
struct ipa_edge_args *top; struct ipa_edge_args *top;
struct cgraph_edge *ie, *next_ie, *new_direct_edge; struct cgraph_edge *ie, *next_ie, *new_direct_edge;
struct ipa_node_params *new_root_info;
bool res = false; bool res = false;
ipa_check_create_edge_args (); ipa_check_create_edge_args ();
top = IPA_EDGE_REF (cs); top = IPA_EDGE_REF (cs);
new_root_info = IPA_NODE_REF (cs->caller->global.inlined_to
? cs->caller->global.inlined_to
: cs->caller);
for (ie = node->indirect_calls; ie; ie = next_ie) for (ie = node->indirect_calls; ie; ie = next_ie)
{ {
...@@ -2309,9 +2310,11 @@ update_indirect_edges_after_inlining (struct cgraph_edge *cs, ...@@ -2309,9 +2310,11 @@ update_indirect_edges_after_inlining (struct cgraph_edge *cs,
continue; continue;
if (ici->polymorphic) if (ici->polymorphic)
new_direct_edge = try_make_edge_direct_virtual_call (ie, jfunc); new_direct_edge = try_make_edge_direct_virtual_call (ie, jfunc,
new_root_info);
else else
new_direct_edge = try_make_edge_direct_simple_call (ie, jfunc); new_direct_edge = try_make_edge_direct_simple_call (ie, jfunc,
new_root_info);
if (new_direct_edge) if (new_direct_edge)
{ {
......
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