Commit b6acab32 by Jan Hubicka Committed by Jan Hubicka

Makefile.in (predict.o): Depend on tree-scalar-evolution.h



	* Makefile.in (predict.o): Depend on tree-scalar-evolution.h
	* predict.c: Include tree-scalar-evolution.h and cfgloop.h
	(predict_loops): Use number_of_iterations_exit to predict
	number of iterations on trees.

From-SVN: r87473
parent fa9be75f
2004-09-14 Jan Hubicka <jh@suse.cz>
* Makefile.in (predict.o): Depend on tree-scalar-evolution.h
* predict.c: Include tree-scalar-evolution.h and cfgloop.h
(predict_loops): Use number_of_iterations_exit to predict
number of iterations on trees.
2004-09-13 Dale Johannesen <dalej@apple.com> 2004-09-13 Dale Johannesen <dalej@apple.com>
PR 17408 PR 17408
......
...@@ -2139,7 +2139,7 @@ sreal.o: sreal.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) sreal.h ...@@ -2139,7 +2139,7 @@ sreal.o: sreal.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) sreal.h
predict.o: predict.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) $(TREE_H) \ predict.o: predict.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) $(TREE_H) \
$(FLAGS_H) insn-config.h $(BASIC_BLOCK_H) $(REGS_H) hard-reg-set.h output.h toplev.h \ $(FLAGS_H) insn-config.h $(BASIC_BLOCK_H) $(REGS_H) hard-reg-set.h output.h toplev.h \
$(RECOG_H) function.h except.h $(EXPR_H) $(TM_P_H) $(PREDICT_H) sreal.h \ $(RECOG_H) function.h except.h $(EXPR_H) $(TM_P_H) $(PREDICT_H) sreal.h \
$(PARAMS_H) $(TARGET_H) $(CFGLOOP_H) $(COVERAGE_H) $(PARAMS_H) $(TARGET_H) $(CFGLOOP_H) $(COVERAGE_H) tree-scalar-evolution.h
lists.o: lists.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) toplev.h $(RTL_H) $(GGC_H) lists.o: lists.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) toplev.h $(RTL_H) $(GGC_H)
bb-reorder.o : bb-reorder.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) \ bb-reorder.o : bb-reorder.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) \
$(RTL_H) $(BASIC_BLOCK_H) $(FLAGS_H) $(TIMEVAR_H) output.h $(CFGLAYOUT_H) $(FIBHEAP_H) \ $(RTL_H) $(BASIC_BLOCK_H) $(FLAGS_H) $(TIMEVAR_H) output.h $(CFGLAYOUT_H) $(FIBHEAP_H) \
......
...@@ -58,6 +58,8 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA ...@@ -58,6 +58,8 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "tree-dump.h" #include "tree-dump.h"
#include "tree-pass.h" #include "tree-pass.h"
#include "timevar.h" #include "timevar.h"
#include "tree-scalar-evolution.h"
#include "cfgloop.h"
/* real constants: 0, 1, 1-1/REG_BR_PROB_BASE, REG_BR_PROB_BASE, /* real constants: 0, 1, 1-1/REG_BR_PROB_BASE, REG_BR_PROB_BASE,
1/REG_BR_PROB_BASE, 0.5, BB_FREQ_MAX. */ 1/REG_BR_PROB_BASE, 0.5, BB_FREQ_MAX. */
...@@ -552,13 +554,16 @@ combine_predictions_for_bb (FILE *file, basic_block bb) ...@@ -552,13 +554,16 @@ combine_predictions_for_bb (FILE *file, basic_block bb)
} }
/* Predict edge probabilities by exploiting loop structure. /* Predict edge probabilities by exploiting loop structure.
When SIMPLELOOPS is set, attempt to count number of iterations by analyzing When RTLSIMPLELOOPS is set, attempt to count number of iterations by analyzing
RTL. */ RTL otherwise use tree based approach. */
static void static void
predict_loops (struct loops *loops_info, bool simpleloops) predict_loops (struct loops *loops_info, bool rtlsimpleloops)
{ {
unsigned i; unsigned i;
if (!rtlsimpleloops)
scev_initialize (loops_info);
/* Try to predict out blocks in a loop that are not part of a /* Try to predict out blocks in a loop that are not part of a
natural loop. */ natural loop. */
for (i = 1; i < loops_info->num; i++) for (i = 1; i < loops_info->num; i++)
...@@ -573,7 +578,7 @@ predict_loops (struct loops *loops_info, bool simpleloops) ...@@ -573,7 +578,7 @@ predict_loops (struct loops *loops_info, bool simpleloops)
flow_loop_scan (loop, LOOP_EXIT_EDGES); flow_loop_scan (loop, LOOP_EXIT_EDGES);
exits = loop->num_exits; exits = loop->num_exits;
if (simpleloops) if (rtlsimpleloops)
{ {
iv_analysis_loop_init (loop); iv_analysis_loop_init (loop);
find_simple_exit (loop, &desc); find_simple_exit (loop, &desc);
...@@ -595,6 +600,42 @@ predict_loops (struct loops *loops_info, bool simpleloops) ...@@ -595,6 +600,42 @@ predict_loops (struct loops *loops_info, bool simpleloops)
prob); prob);
} }
} }
else
{
edge *exits;
unsigned j, n_exits;
struct tree_niter_desc niter_desc;
exits = get_loop_exit_edges (loop, &n_exits);
for (j = 0; j < n_exits; j++)
{
tree niter = NULL;
if (number_of_iterations_exit (loop, exits[j], &niter_desc))
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;
if (host_integerp (niter, 1)
&& tree_int_cst_lt (niter,
build_int_cstu (NULL_TREE,
REG_BR_PROB_BASE - 1)))
{
HOST_WIDE_INT nitercst = tree_low_cst (niter, 1) + 1;
probability = (REG_BR_PROB_BASE + nitercst / 2) / nitercst;
}
else
probability = 1;
predict_edge (exits[j], PRED_LOOP_ITERATIONS, probability);
}
}
free (exits);
}
bbs = get_loop_body (loop); bbs = get_loop_body (loop);
...@@ -609,7 +650,7 @@ predict_loops (struct loops *loops_info, bool simpleloops) ...@@ -609,7 +650,7 @@ predict_loops (struct loops *loops_info, bool simpleloops)
statements construct loops via "non-loop" constructs statements construct loops via "non-loop" constructs
in the source language and are better to be handled in the source language and are better to be handled
separately. */ separately. */
if ((simpleloops && !can_predict_insn_p (BB_END (bb))) if ((rtlsimpleloops && !can_predict_insn_p (BB_END (bb)))
|| predicted_by_p (bb, PRED_CONTINUE)) || predicted_by_p (bb, PRED_CONTINUE))
continue; continue;
...@@ -639,6 +680,9 @@ predict_loops (struct loops *loops_info, bool simpleloops) ...@@ -639,6 +680,9 @@ predict_loops (struct loops *loops_info, bool simpleloops)
/* Free basic blocks from get_loop_body. */ /* Free basic blocks from get_loop_body. */
free (bbs); free (bbs);
} }
if (!rtlsimpleloops)
scev_reset ();
} }
/* Attempt to predict probabilities of BB outgoing edges using local /* Attempt to predict probabilities of BB outgoing edges using local
......
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