* predict.c (predict_loops): Kill RTL variant.

From-SVN: r118694
This commit is contained in:
Jan Hubicka 2006-11-11 17:13:09 +01:00 committed by Jan Hubicka
parent 6039a0c74a
commit 992c31e623
2 changed files with 33 additions and 65 deletions

View File

@ -1,3 +1,7 @@
2006-11-11 Jan Hubicka <jh@suse.cz>
* predict.c (predict_loops): Kill RTL variant.
2006-11-11 Jan Hubicka <jh@suse.cz>
* tree-pass.h (pass_purge_lineno_notes): Remove declaration.
@ -98,7 +102,7 @@
* local-alloc.c (update_equiv_regs): Copy the memory RTX to be used
in REG_EQUIV notes.
* gcse.c (try_replace_reg): Copy the replacement.
* i386.c (emit_i387_cw_initialization): Copy stored_mode
* i386.c (emit_i387_cw_initialization): Copy stored_mode.
(assign_386_stack_local): Always return copied memory expression
* function.c (instantiate_virtual_regs_in_insn): Copy the operand
duplicates.

View File

@ -631,12 +631,11 @@ combine_predictions_for_bb (basic_block bb)
When RTLSIMPLELOOPS is set, attempt to count number of iterations by analyzing
RTL otherwise use tree based approach. */
static void
predict_loops (struct loops *loops_info, bool rtlsimpleloops)
predict_loops (struct loops *loops_info)
{
unsigned i;
if (!rtlsimpleloops)
scev_initialize (loops_info);
scev_initialize (loops_info);
/* Try to predict out blocks in a loop that are not part of a
natural loop. */
@ -646,69 +645,38 @@ predict_loops (struct loops *loops_info, bool rtlsimpleloops)
unsigned j;
unsigned n_exits;
struct loop *loop = loops_info->parray[i];
struct niter_desc desc;
unsigned HOST_WIDE_INT niter;
edge *exits;
struct tree_niter_desc niter_desc;
exits = get_loop_exit_edges (loop, &n_exits);
if (rtlsimpleloops)
for (j = 0; j < n_exits; j++)
{
iv_analysis_loop_init (loop);
find_simple_exit (loop, &desc);
tree niter = NULL;
if (desc.simple_p && desc.const_iter)
if (number_of_iterations_exit (loop, exits[j], &niter_desc, false))
niter = niter_desc.niter;
if (!niter || TREE_CODE (niter_desc.niter) != INTEGER_CST)
niter = loop_niter_by_eval (loop, exits[j]);
if (TREE_CODE (niter) == INTEGER_CST)
{
int prob;
niter = desc.niter + 1;
if (niter == 0) /* We might overflow here. */
niter = desc.niter;
if (niter
> (unsigned int) PARAM_VALUE (PARAM_MAX_PREDICTED_ITERATIONS))
niter = PARAM_VALUE (PARAM_MAX_PREDICTED_ITERATIONS);
prob = (REG_BR_PROB_BASE
- (REG_BR_PROB_BASE + niter /2) / niter);
/* Branch prediction algorithm gives 0 frequency for everything
after the end of loop for loop having 0 probability to finish. */
if (prob == REG_BR_PROB_BASE)
prob = REG_BR_PROB_BASE - 1;
predict_edge (desc.in_edge, PRED_LOOP_ITERATIONS,
prob);
}
}
else
{
struct tree_niter_desc niter_desc;
for (j = 0; j < n_exits; j++)
{
tree niter = NULL;
if (number_of_iterations_exit (loop, exits[j], &niter_desc, false))
niter = niter_desc.niter;
if (!niter || TREE_CODE (niter_desc.niter) != INTEGER_CST)
niter = loop_niter_by_eval (loop, exits[j]);
if (TREE_CODE (niter) == INTEGER_CST)
int probability;
int max = PARAM_VALUE (PARAM_MAX_PREDICTED_ITERATIONS);
if (host_integerp (niter, 1)
&& tree_int_cst_lt (niter,
build_int_cstu (NULL_TREE, max - 1)))
{
int probability;
int max = PARAM_VALUE (PARAM_MAX_PREDICTED_ITERATIONS);
if (host_integerp (niter, 1)
&& tree_int_cst_lt (niter,
build_int_cstu (NULL_TREE, max - 1)))
{
HOST_WIDE_INT nitercst = tree_low_cst (niter, 1) + 1;
probability = ((REG_BR_PROB_BASE + nitercst / 2)
/ nitercst);
}
else
probability = ((REG_BR_PROB_BASE + max / 2) / max);
predict_edge (exits[j], PRED_LOOP_ITERATIONS, probability);
HOST_WIDE_INT nitercst = tree_low_cst (niter, 1) + 1;
probability = ((REG_BR_PROB_BASE + nitercst / 2)
/ nitercst);
}
}
else
probability = ((REG_BR_PROB_BASE + max / 2) / max);
predict_edge (exits[j], PRED_LOOP_ITERATIONS, probability);
}
}
free (exits);
@ -726,8 +694,7 @@ predict_loops (struct loops *loops_info, bool rtlsimpleloops)
statements construct loops via "non-loop" constructs
in the source language and are better to be handled
separately. */
if ((rtlsimpleloops && !can_predict_insn_p (BB_END (bb)))
|| predicted_by_p (bb, PRED_CONTINUE))
if (predicted_by_p (bb, PRED_CONTINUE))
continue;
/* Loop branch heuristics - predict an edge back to a
@ -776,11 +743,8 @@ predict_loops (struct loops *loops_info, bool rtlsimpleloops)
free (bbs);
}
if (!rtlsimpleloops)
{
scev_finalize ();
current_loops = NULL;
}
scev_finalize ();
current_loops = NULL;
}
/* Attempt to predict probabilities of BB outgoing edges using local
@ -1303,7 +1267,7 @@ tree_estimate_probability (void)
tree_bb_level_predictions ();
mark_irreducible_loops (&loops_info);
predict_loops (&loops_info, false);
predict_loops (&loops_info);
FOR_EACH_BB (bb)
{