Commit 43558bcc by Jan Hubicka Committed by Jan Hubicka

ipa-cp.c (ipcp_compute_node_scale): Work around completely wrong profile updates.

	* ipa-cp.c (ipcp_compute_node_scale): Work around completely
	wrong profile updates.
	* predict.c (counts_to_freqs): Be expected for ENTRY/EXIT block
	having largest frequency.
	* ira-live.c (ira_implicitly_set_insn_hard_regs): Silecne
	used uninitalized warning.
	* tree-optimize.c (execute_fixup_cfg): Rescale entry and exit block
	frequencies.

From-SVN: r154462
parent bf925694
2009-11-23 Jan Hubicka <jh@suse.cz>
* ipa-cp.c (ipcp_compute_node_scale): Work around completely
wrong profile updates.
* predict.c (counts_to_freqs): Be expected for ENTRY/EXIT block
having largest frequency.
* ira-live.c (ira_implicitly_set_insn_hard_regs): Silecne
used uninitalized warning.
* tree-optimize.c (execute_fixup_cfg): Rescale entry and exit block
frequencies.
2009-11-23 Uros Bizjak <ubizjak@gmail.com> 2009-11-23 Uros Bizjak <ubizjak@gmail.com>
* config/alpha/alpha.md (*cmp_sadd_sidi): Use gen_lowpart instead * config/alpha/alpha.md (*cmp_sadd_sidi): Use gen_lowpart instead
...@@ -578,7 +578,13 @@ build_const_val (struct ipcp_lattice *lat, tree tree_type) ...@@ -578,7 +578,13 @@ build_const_val (struct ipcp_lattice *lat, tree tree_type)
/* Compute the proper scale for NODE. It is the ratio between the number of /* Compute the proper scale for NODE. It is the ratio between the number of
direct calls (represented on the incoming cgraph_edges) and sum of all direct calls (represented on the incoming cgraph_edges) and sum of all
invocations of NODE (represented as count in cgraph_node). */ invocations of NODE (represented as count in cgraph_node).
FIXME: This code is wrong. Since the callers can be also clones and
the clones are not scaled yet, the sums gets unrealistically high.
To properly compute the counts, we would need to do propagation across
callgraph (as external call to A might imply call to non-clonned B
if A's clone calls clonned B). */
static void static void
ipcp_compute_node_scale (struct cgraph_node *node) ipcp_compute_node_scale (struct cgraph_node *node)
{ {
...@@ -589,6 +595,12 @@ ipcp_compute_node_scale (struct cgraph_node *node) ...@@ -589,6 +595,12 @@ ipcp_compute_node_scale (struct cgraph_node *node)
/* Compute sum of all counts of callers. */ /* Compute sum of all counts of callers. */
for (cs = node->callers; cs != NULL; cs = cs->next_caller) for (cs = node->callers; cs != NULL; cs = cs->next_caller)
sum += cs->count; sum += cs->count;
/* Work around the unrealistically high sum problem. We just don't want
the non-cloned body to have negative or very low frequency. Since
majority of execution time will be spent in clones anyway, this should
give good enough profile. */
if (sum > node->count * 9 / 10)
sum = node->count * 9 / 10;
if (node->count == 0) if (node->count == 0)
ipcp_set_node_scale (node, 0); ipcp_set_node_scale (node, 0);
else else
......
...@@ -745,7 +745,7 @@ single_reg_operand_class (int op_num) ...@@ -745,7 +745,7 @@ single_reg_operand_class (int op_num)
void void
ira_implicitly_set_insn_hard_regs (HARD_REG_SET *set) ira_implicitly_set_insn_hard_regs (HARD_REG_SET *set)
{ {
int i, c, regno; int i, c, regno = 0;
bool ignore_p; bool ignore_p;
enum reg_class cl; enum reg_class cl;
rtx op; rtx op;
......
...@@ -2020,7 +2020,7 @@ counts_to_freqs (void) ...@@ -2020,7 +2020,7 @@ counts_to_freqs (void)
gcov_type count_max, true_count_max = 0; gcov_type count_max, true_count_max = 0;
basic_block bb; basic_block bb;
FOR_EACH_BB (bb) FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR, NULL, next_bb)
true_count_max = MAX (bb->count, true_count_max); true_count_max = MAX (bb->count, true_count_max);
count_max = MAX (true_count_max, 1); count_max = MAX (true_count_max, 1);
......
...@@ -255,6 +255,10 @@ execute_fixup_cfg (void) ...@@ -255,6 +255,10 @@ execute_fixup_cfg (void)
else else
count_scale = REG_BR_PROB_BASE; count_scale = REG_BR_PROB_BASE;
ENTRY_BLOCK_PTR->count = cgraph_node (current_function_decl)->count;
EXIT_BLOCK_PTR->count = (EXIT_BLOCK_PTR->count * count_scale
+ REG_BR_PROB_BASE / 2) / REG_BR_PROB_BASE;
FOR_EACH_BB (bb) FOR_EACH_BB (bb)
{ {
bb->count = (bb->count * count_scale bb->count = (bb->count * count_scale
......
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