diff options
author | Zdenek Dvorak <dvorakz@suse.cz> | 2006-11-17 12:29:17 +0100 |
---|---|---|
committer | Zdenek Dvorak <rakdver@gcc.gnu.org> | 2006-11-17 11:29:17 +0000 |
commit | 598ec7bdbe0e6e2f7c58961fd0f61e0898a3083e (patch) | |
tree | 194dc21664ec5a698ea4824b9350190e2710fce6 /gcc/predict.c | |
parent | 31198773e456d1a8ecabdd576fa3a9d4412cbf07 (diff) | |
download | gcc-598ec7bdbe0e6e2f7c58961fd0f61e0898a3083e.zip gcc-598ec7bdbe0e6e2f7c58961fd0f61e0898a3083e.tar.gz gcc-598ec7bdbe0e6e2f7c58961fd0f61e0898a3083e.tar.bz2 |
tree-vrp.c (execute_vrp): Do not update current_loops.
* tree-vrp.c (execute_vrp): Do not update current_loops.
* loop-unswitch.c (unswitch_loop): Do not use loop_split_edge_with.
* doc/loop.texi: Remove documentation for cancelled functions.
* tree-ssa-loop-im.c (loop_commit_inserts): Removed.
(move_computations, determine_lsm): Use bsi_commit_edge_inserts
instead.
* cfgloopmanip.c (remove_bbs): Do not update loops explicitly.
(remove_path): Ensure that in delete_basic_blocks, the loops
are still allocated.
(add_loop): Work on valid loop structures.
(loopify): Modify call of add_loop.
(mfb_update_loops): Removed.
(create_preheader): Do not update loops explicitly.
(force_single_succ_latches, loop_version): Do not use
loop_split_edge_with.
(loop_split_edge_with): Removed.
* tree-ssa-loop-manip.c (create_iv, determine_exit_conditions):
Do not use bsi_insert_on_edge_immediate_loop.
(split_loop_exit_edge, tree_unroll_loop): Do not use
loop_split_edge_with.
(bsi_insert_on_edge_immediate_loop): Removed.
* tree-ssa-loop-ch.c (copy_loop_headers): Use current_loops. Do not
use loop_split_edge_with.
* cfghooks.c: Include cfgloop.h.
(verify_flow_info): Verify that loop_father is filled iff current_loops
are available.
(redirect_edge_and_branch_force, split_block, delete_basic_block,
split_edge, merge_blocks, make_forwarder_block, duplicate_block):
Update cfg.
* cfgloopanal.c (mark_irreducible_loops): Work if the function contains
no loops.
* modulo-sched.c (generate_prolog_epilog, canon_loop): Do not use
loop_split_edge_with.
(sms_schedule): Use current_loops.
* tree-ssa-dom.c (tree_ssa_dominator_optimize): Use current_loops.
* loop-init.c (loop_optimizer_init, loop_optimizer_finalize): Set
current_loops.
(rtl_loop_init, rtl_loop_done): Do not set current_loops.
* tree-ssa-sink.c (execute_sink_code): Use current_loops.
* ifcvt.c (if_convert): Ditto.
* predict.c (predict_loops): Do not clear current_loops.
(tree_estimate_probability): Use current_loops.
(propagate_freq): Receive head of the region to propagate instead of
loop.
(estimate_loops_at_level): Do not use shared to_visit bitmap.
(estimate_loops): New function. Handle case current_loops == NULL.
(estimate_bb_frequencies): Do not allocate tovisit. Use
estimate_loops.
* tree-ssa-loop.c (current_loops): Removed.
(tree_loop_optimizer_init): Do not return loops.
(tree_ssa_loop_init, tree_ssa_loop_done): Do not set current_loops.
* tree-vectorizer.c (slpeel_update_phi_nodes_for_guard1,
slpeel_update_phi_nodes_for_guard2, slpeel_tree_peel_loop_to_edge):
Do not update loops explicitly.
* function.h (struct function): Add x_current_loops field.
(current_loops): New macro.
* tree-if-conv.c (combine_blocks): Do not update loops explicitly.
* loop-unroll.c (split_edge_and_insert): New function.
(unroll_loop_runtime_iterations, analyze_insns_in_loop): Do not
use loop_split_edge_with.
* loop-doloop.c (add_test, doloop_modify): Ditto.
* tree-ssa-pre.c (init_pre, fini_pre): Do not set current_loops.
* cfglayout.c (copy_bbs): Do not update loops explicitly.
* lambda-code.c (perfect_nestify): Do not use loop_split_edge_with.
* tree-vect-transform.c (vect_transform_loop): Do not update loops
explicitly.
* cfgloop.c (flow_loops_cfg_dump): Do not dump dfs_order and rc_order.
(flow_loops_free): Do not free dfs_order and rc_order.
(flow_loops_find): Do not set dfs_order and rc_order in loops
structure. Do not call loops and flow info verification.
(add_bb_to_loop, remove_bb_from_loops): Check whether the block
already belongs to some loop.
* cfgloop.h (struct loops): Remove struct cfg.
(current_loops, loop_split_edge_with): Declaration removed.
(loop_optimizer_init, loop_optimizer_finalize): Declaration changed.
* tree-flow.h (loop_commit_inserts, bsi_insert_on_edge_immediate_loop):
Declaration removed.
* Makefile.in (cfghooks.o): Add CFGLOOP_H dependency.
* basic-block.h (split_edge_and_insert): Declare.
* tree-cfg.c (remove_bb): Do not update loops explicitly.
From-SVN: r118931
Diffstat (limited to 'gcc/predict.c')
-rw-r--r-- | gcc/predict.c | 67 |
1 files changed, 40 insertions, 27 deletions
diff --git a/gcc/predict.c b/gcc/predict.c index 6b493e2..caf867e 100644 --- a/gcc/predict.c +++ b/gcc/predict.c @@ -74,8 +74,6 @@ static sreal real_zero, real_one, real_almost_one, real_br_prob_base, static void combine_predictions_for_insn (rtx, basic_block); static void dump_prediction (FILE *, enum br_predictor, int, basic_block, int); -static void estimate_loops_at_level (struct loop *, bitmap); -static void propagate_freq (struct loop *, bitmap); static void estimate_bb_frequencies (struct loops *); static void predict_paths_leading_to (basic_block, int *, enum br_predictor, enum prediction); static bool last_basic_block_p (basic_block); @@ -744,7 +742,6 @@ predict_loops (struct loops *loops_info) } scev_finalize (); - current_loops = NULL; } /* Attempt to predict probabilities of BB outgoing edges using local @@ -1252,11 +1249,10 @@ static unsigned int tree_estimate_probability (void) { basic_block bb; - struct loops loops_info; - flow_loops_find (&loops_info); + loop_optimizer_init (0); if (dump_file && (dump_flags & TDF_DETAILS)) - flow_loops_dump (&loops_info, dump_file, NULL, 0); + flow_loops_dump (current_loops, dump_file, NULL, 0); add_noreturn_fake_exit_edges (); connect_infinite_loops_to_exit (); @@ -1265,8 +1261,9 @@ tree_estimate_probability (void) tree_bb_level_predictions (); - mark_irreducible_loops (&loops_info); - predict_loops (&loops_info); + mark_irreducible_loops (current_loops); + if (current_loops) + predict_loops (current_loops); FOR_EACH_BB (bb) { @@ -1328,10 +1325,10 @@ tree_estimate_probability (void) combine_predictions_for_bb (bb); strip_builtin_expect (); - estimate_bb_frequencies (&loops_info); + estimate_bb_frequencies (current_loops); free_dominance_info (CDI_POST_DOMINATORS); remove_fake_exit_edges (); - flow_loops_free (&loops_info); + loop_optimizer_finalize (); if (dump_file && (dump_flags & TDF_DETAILS)) dump_tree_cfg (dump_file, dump_flags); if (profile_status == PROFILE_ABSENT) @@ -1437,12 +1434,12 @@ typedef struct edge_info_def #define EDGE_INFO(E) ((edge_info) (E)->aux) /* Helper function for estimate_bb_frequencies. - Propagate the frequencies for LOOP. */ + Propagate the frequencies in blocks marked in + TOVISIT, starting in HEAD. */ static void -propagate_freq (struct loop *loop, bitmap tovisit) +propagate_freq (basic_block head, bitmap tovisit) { - basic_block head = loop->header; basic_block bb; basic_block last; unsigned i; @@ -1579,7 +1576,7 @@ propagate_freq (struct loop *loop, bitmap tovisit) /* Estimate probabilities of loopback edges in loops at same nest level. */ static void -estimate_loops_at_level (struct loop *first_loop, bitmap tovisit) +estimate_loops_at_level (struct loop *first_loop) { struct loop *loop; @@ -1588,25 +1585,44 @@ estimate_loops_at_level (struct loop *first_loop, bitmap tovisit) edge e; basic_block *bbs; unsigned i; + bitmap tovisit = BITMAP_ALLOC (NULL); - estimate_loops_at_level (loop->inner, tovisit); + estimate_loops_at_level (loop->inner); - /* Do not do this for dummy function loop. */ - if (EDGE_COUNT (loop->latch->succs) > 0) - { - /* Find current loop back edge and mark it. */ - e = loop_latch_edge (loop); - EDGE_INFO (e)->back_edge = 1; - } + /* Find current loop back edge and mark it. */ + e = loop_latch_edge (loop); + EDGE_INFO (e)->back_edge = 1; bbs = get_loop_body (loop); for (i = 0; i < loop->num_nodes; i++) bitmap_set_bit (tovisit, bbs[i]->index); free (bbs); - propagate_freq (loop, tovisit); + propagate_freq (loop->header, tovisit); + BITMAP_FREE (tovisit); } } +/* Propates frequencies through structure of LOOPS. */ + +static void +estimate_loops (struct loops *loops) +{ + bitmap tovisit = BITMAP_ALLOC (NULL); + basic_block bb; + + /* Start by estimating the frequencies in the loops. */ + if (loops) + estimate_loops_at_level (loops->tree_root->inner); + + /* Now propagate the frequencies through all the blocks. */ + FOR_ALL_BB (bb) + { + bitmap_set_bit (tovisit, bb->index); + } + propagate_freq (ENTRY_BLOCK_PTR, tovisit); + BITMAP_FREE (tovisit); +} + /* Convert counts measured by profile driven feedback to frequencies. Return nonzero iff there was any nonzero execution count. */ @@ -1677,7 +1693,6 @@ estimate_bb_frequencies (struct loops *loops) if (!flag_branch_probabilities || !counts_to_freqs ()) { static int real_values_initialized = 0; - bitmap tovisit; if (!real_values_initialized) { @@ -1696,7 +1711,6 @@ estimate_bb_frequencies (struct loops *loops) single_succ_edge (ENTRY_BLOCK_PTR)->probability = REG_BR_PROB_BASE; /* Set up block info for each basic block. */ - tovisit = BITMAP_ALLOC (NULL); alloc_aux_for_blocks (sizeof (struct block_info_def)); alloc_aux_for_edges (sizeof (struct edge_info_def)); FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR, NULL, next_bb) @@ -1715,7 +1729,7 @@ estimate_bb_frequencies (struct loops *loops) /* First compute probabilities locally for each loop from innermost to outermost to examine probabilities for back edges. */ - estimate_loops_at_level (loops->tree_root, tovisit); + estimate_loops (loops); memcpy (&freq_max, &real_zero, sizeof (real_zero)); FOR_EACH_BB (bb) @@ -1734,7 +1748,6 @@ estimate_bb_frequencies (struct loops *loops) free_aux_for_blocks (); free_aux_for_edges (); - BITMAP_FREE (tovisit); } compute_function_frequency (); if (flag_reorder_functions) |