mirror of git://gcc.gnu.org/git/gcc.git
ipa-inline-analysis.c (clobber_only_eh_bb_p): New function.
* ipa-inline-analysis.c (clobber_only_eh_bb_p): New function. (estimate_function_body_sizes): Use it. From-SVN: r207287
This commit is contained in:
parent
0429e06465
commit
3100142a95
|
|
@ -1,3 +1,8 @@
|
||||||
|
2014-01-29 Jan Hubicka <jh@suse.cz>
|
||||||
|
|
||||||
|
* ipa-inline-analysis.c (clobber_only_eh_bb_p): New function.
|
||||||
|
(estimate_function_body_sizes): Use it.
|
||||||
|
|
||||||
2014-01-29 Paolo Carlini <paolo.carlini@oracle.com>
|
2014-01-29 Paolo Carlini <paolo.carlini@oracle.com>
|
||||||
|
|
||||||
PR c++/58561
|
PR c++/58561
|
||||||
|
|
|
||||||
|
|
@ -2347,6 +2347,54 @@ find_foldable_builtin_expect (basic_block bb)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Return true when the basic blocks contains only clobbers followed by RESX.
|
||||||
|
Such BBs are kept around to make removal of dead stores possible with
|
||||||
|
presence of EH and will be optimized out by optimize_clobbers later in the
|
||||||
|
game.
|
||||||
|
|
||||||
|
NEED_EH is used to recurse in case the clobber has non-EH predecestors
|
||||||
|
that can be clobber only, too.. When it is false, the RESX is not necessary
|
||||||
|
on the end of basic block. */
|
||||||
|
|
||||||
|
static bool
|
||||||
|
clobber_only_eh_bb_p (basic_block bb, bool need_eh = true)
|
||||||
|
{
|
||||||
|
gimple_stmt_iterator gsi = gsi_last_bb (bb);
|
||||||
|
edge_iterator ei;
|
||||||
|
edge e;
|
||||||
|
|
||||||
|
if (need_eh)
|
||||||
|
{
|
||||||
|
if (gsi_end_p (gsi))
|
||||||
|
return false;
|
||||||
|
if (gimple_code (gsi_stmt (gsi)) != GIMPLE_RESX)
|
||||||
|
return false;
|
||||||
|
gsi_prev (&gsi);
|
||||||
|
}
|
||||||
|
else if (!single_succ_p (bb))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
for (; !gsi_end_p (gsi); gsi_prev (&gsi))
|
||||||
|
{
|
||||||
|
gimple stmt = gsi_stmt (gsi);
|
||||||
|
if (is_gimple_debug (stmt))
|
||||||
|
continue;
|
||||||
|
if (gimple_clobber_p (stmt))
|
||||||
|
continue;
|
||||||
|
if (gimple_code (stmt) == GIMPLE_LABEL)
|
||||||
|
break;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* See if all predecestors are either throws or clobber only BBs. */
|
||||||
|
FOR_EACH_EDGE (e, ei, bb->preds)
|
||||||
|
if (!(e->flags & EDGE_EH)
|
||||||
|
&& !clobber_only_eh_bb_p (e->src, false))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
/* Compute function body size parameters for NODE.
|
/* Compute function body size parameters for NODE.
|
||||||
When EARLY is true, we compute only simple summaries without
|
When EARLY is true, we compute only simple summaries without
|
||||||
non-trivial predicates to drive the early inliner. */
|
non-trivial predicates to drive the early inliner. */
|
||||||
|
|
@ -2410,6 +2458,14 @@ estimate_function_body_sizes (struct cgraph_node *node, bool early)
|
||||||
{
|
{
|
||||||
bb = BASIC_BLOCK_FOR_FN (cfun, order[n]);
|
bb = BASIC_BLOCK_FOR_FN (cfun, order[n]);
|
||||||
freq = compute_call_stmt_bb_frequency (node->decl, bb);
|
freq = compute_call_stmt_bb_frequency (node->decl, bb);
|
||||||
|
if (clobber_only_eh_bb_p (bb))
|
||||||
|
{
|
||||||
|
if (dump_file && (dump_flags & TDF_DETAILS))
|
||||||
|
fprintf (dump_file, "\n Ignoring BB %i;"
|
||||||
|
" it will be optimized away by cleanup_clobbers\n",
|
||||||
|
bb->index);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
/* TODO: Obviously predicates can be propagated down across CFG. */
|
/* TODO: Obviously predicates can be propagated down across CFG. */
|
||||||
if (parms_info)
|
if (parms_info)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue