diff options
author | rakdver <rakdver@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-01-24 20:27:02 +0000 |
---|---|---|
committer | rakdver <rakdver@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-01-24 20:27:02 +0000 |
commit | 862be7479682d06ddaaef2a0439cff0783f0c32e (patch) | |
tree | dcedb00430c0c7c8dca147fb1c6499d017c95537 /gcc/predict.c | |
parent | 8cb0536d25508acaffb368dc075c5038eaa4e068 (diff) | |
download | gcc-862be7479682d06ddaaef2a0439cff0783f0c32e.tar.gz |
* cfgloopanal.c: New file.
* cfgloopmanip.c: New file.
* Makefile.in (cfgloopanal.o, cfgloopmanip.o): New.
(toplev.o, loop.o, doloop.o, unroll.o, cfgloop.o, predict.o,
cfglayout.o): Add dependency on cfgloop.h.
(cfgloop.o): Add flags.h dependency.
* basic-block.h (BB_IRREDUCIBLE_LOOP, BB_SUPERBLOCK): New flags.
(VLS_EXPECT_PREHEADERS, VLS_EXPECT_SIMPLE_LATCHES): Removed.
(struct loop, struct loops, flow_loops_find, flow_loops_update,
flow_loops_free, flow_loops_dump, flow_loop_dump,
flow_loop_scan, flow_loop_tree_node_add, flow_loop_tree_node_remove,
LOOP_TREE,,LOOP_PRE_HEADER, LOOP_ENTRY_EDGES, LOOP_EXIT_EDGES,
LOOP_ALL, flow_loop_outside_edge_p, flow_loop_nested_p,
flow_bb_inside_loop_p, get_loop_body, loop_preheader_edge,
loop_latch_edge, add_bb_to_loop, remove_bb_from_loops,
find_common_loop, verify_loop_structure): Declarations moved to ...
* cfgloop.h: New file.
* bb-reorder.c (reorder_basic_blocks): Modified.
* cfglayout.c: Include cfgloop.h.
(cleanup_unconditional_jumps, cfg_layout_redirect_edge,
cfg_layout_duplicate_bb, cfg_layout_initialize): Update loop structure.
(break_superblocks): New static function.
(cfg_layout_finalize): Use it.
(cfg_layout_split_block): New function.
* cfglayout.h (struct reorder_block_def): Add copy and duplicated
fields.
(cfg_layout_initialize, cfg_layout_redirect_edge): Declaration
changed.
(cfg_layout_split_block): Declare.
* cfgloop.c: Include cfgloop.h and flags.h.
(flow_loop_dump, flow_loops_free, flow_loop_exit_edges_find,
get_loop_body): Avoid signed versus unsigned comparison warnings.
(make_forwarder_block, flow_loops_find, loop_preheader_edge,
loop_latch_edge): Modified.
(verify_loop_structure): Modified to use flags stored in loop structure;
check irreducible loops.
(cancel_loop, cancel_loop_tree): New functions.
(estimate_probability): Use loop analysis code for predictions.
(estimate_loops_at_level): Avoid signed versus unsigned comparison
warnings.
* doloop.c: Include cfgloop.h.
* loop.c: Include cfgloop.h.
* predict.c: Include cfgloop.h.
* toplev.c: Include cfgloop.h.
* unroll.c: Include cfgloop.h.
* tracer.c (tracer): Modified.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@61730 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/predict.c')
-rw-r--r-- | gcc/predict.c | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/gcc/predict.c b/gcc/predict.c index 71009faafdb..09bc562e6c1 100644 --- a/gcc/predict.c +++ b/gcc/predict.c @@ -52,6 +52,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA #include "params.h" #include "target.h" #include "loop.h" +#include "cfgloop.h" /* real constants: 0, 1, 1-1/REG_BR_PROB_BASE, REG_BR_PROB_BASE, 1/REG_BR_PROB_BASE, 0.5, BB_FREQ_MAX. */ @@ -425,7 +426,7 @@ estimate_probability (loops_info) { dominance_info dominators, post_dominators; basic_block bb; - int i; + unsigned i; connect_infinite_loops_to_exit (); dominators = calculate_dominance_info (CDI_DOMINATORS); @@ -436,13 +437,28 @@ estimate_probability (loops_info) for (i = 1; i < loops_info->num; i++) { basic_block bb, *bbs; - int j; + unsigned j; int exits; struct loop *loop = loops_info->parray[i]; + struct loop_desc desc; + unsigned HOST_WIDE_INT niter; flow_loop_scan (loops_info, loop, LOOP_EXIT_EDGES); exits = loop->num_exits; + if (simple_loop_p (loops_info, loop, &desc) + && desc.const_iter) + { + niter = desc.niter + 1; + if (niter == 0) /* We might overflow here. */ + niter = desc.niter; + + predict_edge (desc.in_edge, PRED_LOOP_ITERATIONS, + REG_BR_PROB_BASE + - (REG_BR_PROB_BASE + niter /2) + / niter); + } + bbs = get_loop_body (loop); for (j = 0; j < loop->num_nodes; j++) { @@ -1060,7 +1076,7 @@ estimate_loops_at_level (first_loop) { edge e; basic_block *bbs; - int i; + unsigned i; estimate_loops_at_level (loop->inner); |