Commit a065d52e by Jan Hubicka Committed by Jan Hubicka

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
parent 079990a2
2008-08-31 Jan Hubicka <jh@suse.cz> 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 * tree-ssa-loop-unswitch.c (tree_unswitch_single_loop): Check that
loop is optimized for speed. loop is optimized for speed.
......
...@@ -1042,22 +1042,58 @@ ipcp_update_profiling (void) ...@@ -1042,22 +1042,58 @@ ipcp_update_profiling (void)
} }
} }
/* Return true if original clone needs to be preserved. */ /* If NODE was cloned, how much would program grow? */
static bool static long
ipcp_need_original_clone_p (struct cgraph_node *node) 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) for (cs = node->callers; cs != NULL; cs = cs->next_caller)
return true; if (!ipcp_need_redirect_p (cs))
for (e = node->callers; e; e = e->next_caller) redirectable_node_callers++;
if (!bitmap_bit_p (dead_nodes, e->caller->uid) else
&& ipcp_need_redirect_p (e)) need_original = true;
return true;
/* If we will be able to fully replace orignal node, we never increase
program size. */
if (!need_original)
return false;
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. */ /* Estimate cost of cloning NODE. */
static long static long
ipcp_estimate_cloning_cost (struct cgraph_node *node) ipcp_estimate_cloning_cost (struct cgraph_node *node)
...@@ -1067,12 +1103,12 @@ ipcp_estimate_cloning_cost (struct cgraph_node *node) ...@@ -1067,12 +1103,12 @@ ipcp_estimate_cloning_cost (struct cgraph_node *node)
struct cgraph_edge *e; struct cgraph_edge *e;
int cost; int cost;
/* When we don't need original clone; we should always propagate. */ cost = ipcp_estimate_growth (node) * 1000;
if (!ipcp_need_original_clone_p (node)) if (!cost)
{ {
if (dump_file) if (dump_file)
fprintf (dump_file, "Function %s can be fully propagated\n", fprintf (dump_file, "Versioning of %s will save code size\n",
cgraph_node_name (node)); cgraph_node_name (node));
return 0; return 0;
} }
...@@ -1084,7 +1120,6 @@ ipcp_estimate_cloning_cost (struct cgraph_node *node) ...@@ -1084,7 +1120,6 @@ ipcp_estimate_cloning_cost (struct cgraph_node *node)
freq_sum += e->frequency + 1; freq_sum += e->frequency + 1;
} }
cost = node->local.inline_summary.self_insns * 1000;
if (max_count) if (max_count)
cost /= count_sum * 1000 / max_count + 1; cost /= count_sum * 1000 / max_count + 1;
else else
...@@ -1185,10 +1220,7 @@ ipcp_insert_stage (void) ...@@ -1185,10 +1220,7 @@ ipcp_insert_stage (void)
fprintf (dump_file, "considering function %s\n", fprintf (dump_file, "considering function %s\n",
cgraph_node_name (node)); cgraph_node_name (node));
if (ipcp_need_original_clone_p (node)) growth = ipcp_estimate_growth (node);
growth = node->local.inline_summary.self_insns;
else
bitmap_set_bit (dead_nodes, node->uid);
if (new_insns + growth > max_new_insns) if (new_insns + growth > max_new_insns)
break; break;
......
...@@ -1154,7 +1154,7 @@ branch_prob (void) ...@@ -1154,7 +1154,7 @@ branch_prob (void)
VEC_free (histogram_value, heap, values); VEC_free (histogram_value, heap, values);
free_edge_list (el); free_edge_list (el);
if (flag_branch_probabilities) if (flag_branch_probabilities && profile_info)
profile_status = PROFILE_READ; profile_status = PROFILE_READ;
coverage_end_function (); coverage_end_function ();
} }
......
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