ipa-cp.c (ipcp_need_original_clone_p): Remove.

* ipa-cp.c (ipcp_need_original_clone_p): Remove.
	(ipcp_estimate_growth): New.
	(ipcp_insert_stage): Use ipcp_estimate_growth.
	* profile.c (branch_prob): When reading failed, do not consider
	profile as read.

From-SVN: r139835
This commit is contained in:
Jan Hubicka 2008-08-31 18:45:05 +02:00 committed by Jan Hubicka
parent 079990a2bf
commit a065d52eff
3 changed files with 61 additions and 21 deletions

View File

@ -1,3 +1,11 @@
2008-08-31 Jan Hubicka <jh@suse.cz>
* ipa-cp.c (ipcp_need_original_clone_p): Remove.
(ipcp_estimate_growth): New.
(ipcp_insert_stage): Use ipcp_estimate_growth.
* profile.c (branch_prob): When reading failed, do not consider
profile as read.
2008-08-31 Jan Hubicka <jh@suse.cz>
* tree-ssa-loop-unswitch.c (tree_unswitch_single_loop): Check that

View File

@ -1042,22 +1042,58 @@ ipcp_update_profiling (void)
}
}
/* Return true if original clone needs to be preserved. */
static bool
ipcp_need_original_clone_p (struct cgraph_node *node)
/* If NODE was cloned, how much would program grow? */
static long
ipcp_estimate_growth (struct cgraph_node *node)
{
struct cgraph_edge *e;
struct cgraph_edge *cs;
int redirectable_node_callers = 0;
int removable_args = 0;
bool need_original = node->needed;
struct ipa_node_params *info;
int i, count;
int growth;
if (node->needed)
return true;
for (e = node->callers; e; e = e->next_caller)
if (!bitmap_bit_p (dead_nodes, e->caller->uid)
&& ipcp_need_redirect_p (e))
return true;
for (cs = node->callers; cs != NULL; cs = cs->next_caller)
if (!ipcp_need_redirect_p (cs))
redirectable_node_callers++;
else
need_original = true;
return false;
/* If we will be able to fully replace orignal node, we never increase
program size. */
if (!need_original)
return false;
info = IPA_NODE_REF (node);
count = ipa_get_param_count (info);
for (i = 0; i < count; i++)
{
struct ipcp_lattice *lat = ipcp_get_ith_lattice (info, i);
tree parm_tree = ipa_get_ith_param (info, i);
/* We can proactively remove obviously unused arguments. */
if (is_gimple_reg (parm_tree)
&& !gimple_default_def (DECL_STRUCT_FUNCTION (node->decl),
parm_tree))
removable_args++;
if (lat->type == IPA_CONST_VALUE)
removable_args++;
}
/* We make just very simple estimate of savings for removal of operand from
call site. Precise cost is dificult to get, as our size metric counts
constants and moves as free. Generally we are looking for cases that
small function is called very many times. */
growth = node->local.inline_summary.self_insns
- removable_args * redirectable_node_callers;
if (growth < 0)
return 0;
return growth;
}
/* Estimate cost of cloning NODE. */
static long
ipcp_estimate_cloning_cost (struct cgraph_node *node)
@ -1067,12 +1103,12 @@ ipcp_estimate_cloning_cost (struct cgraph_node *node)
struct cgraph_edge *e;
int cost;
/* When we don't need original clone; we should always propagate. */
if (!ipcp_need_original_clone_p (node))
cost = ipcp_estimate_growth (node) * 1000;
if (!cost)
{
if (dump_file)
fprintf (dump_file, "Function %s can be fully propagated\n",
cgraph_node_name (node));
fprintf (dump_file, "Versioning of %s will save code size\n",
cgraph_node_name (node));
return 0;
}
@ -1084,7 +1120,6 @@ ipcp_estimate_cloning_cost (struct cgraph_node *node)
freq_sum += e->frequency + 1;
}
cost = node->local.inline_summary.self_insns * 1000;
if (max_count)
cost /= count_sum * 1000 / max_count + 1;
else
@ -1185,10 +1220,7 @@ ipcp_insert_stage (void)
fprintf (dump_file, "considering function %s\n",
cgraph_node_name (node));
if (ipcp_need_original_clone_p (node))
growth = node->local.inline_summary.self_insns;
else
bitmap_set_bit (dead_nodes, node->uid);
growth = ipcp_estimate_growth (node);
if (new_insns + growth > max_new_insns)
break;

View File

@ -1154,7 +1154,7 @@ branch_prob (void)
VEC_free (histogram_value, heap, values);
free_edge_list (el);
if (flag_branch_probabilities)
if (flag_branch_probabilities && profile_info)
profile_status = PROFILE_READ;
coverage_end_function ();
}