diff options
author | bernds <bernds@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-09-30 14:12:34 +0000 |
---|---|---|
committer | bernds <bernds@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-09-30 14:12:34 +0000 |
commit | b0f8644ae1e21356df6911537e5f0f0a376d963b (patch) | |
tree | 3905474a77b3c873567f246ace29ac115ff8cf60 /gcc/sched-ebb.c | |
parent | ae10d895a48865f2d8065d7e1686c290dbeb2d5a (diff) | |
download | gcc-b0f8644ae1e21356df6911537e5f0f0a376d963b.tar.gz |
* sched-ebb.c (schedule_ebb): No longer static. Remove declaration.
New arg modulo_scheduling. All callers changed. Move note handling
code here from schedule_ebbs.
(schedule_ebbs_finish, schedule_ebbs_init): New functions, broken
out of schedule_ebbs.
(schedule_ebbs): Call them. Remove note handling code moved to
schedule_ebb.
* sched-int.h (schedule_ebb, schedule_ebbs_init,
schedule_ebbs_finish): Declare.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@179385 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/sched-ebb.c')
-rw-r--r-- | gcc/sched-ebb.c | 121 |
1 files changed, 72 insertions, 49 deletions
diff --git a/gcc/sched-ebb.c b/gcc/sched-ebb.c index ca0e1441275..5ec1de017b4 100644 --- a/gcc/sched-ebb.c +++ b/gcc/sched-ebb.c @@ -66,7 +66,6 @@ static int rank (rtx, rtx); static int ebb_contributes_to_priority (rtx, rtx); static basic_block earliest_block_with_similiar_load (basic_block, rtx); static void add_deps_for_risky_insns (rtx, rtx); -static basic_block schedule_ebb (rtx, rtx); static void debug_ebb_dependencies (rtx, rtx); static void ebb_add_remove_insn (rtx, int); @@ -476,14 +475,35 @@ add_deps_for_risky_insns (rtx head, rtx tail) } } -/* Schedule a single extended basic block, defined by the boundaries HEAD - and TAIL. */ +/* Schedule a single extended basic block, defined by the boundaries + HEAD and TAIL. -static basic_block -schedule_ebb (rtx head, rtx tail) + We change our expectations about scheduler behaviour depending on + whether MODULO_SCHEDULING is true. If it is, we expect that the + caller has already called set_modulo_params and created delay pairs + as appropriate. If the modulo schedule failed, we return + NULL_RTX. */ + +basic_block +schedule_ebb (rtx head, rtx tail, bool modulo_scheduling) { basic_block first_bb, target_bb; struct deps_desc tmp_deps; + bool success; + + /* Blah. We should fix the rest of the code not to get confused by + a note or two. */ + while (head != tail) + { + if (NOTE_P (head) || DEBUG_INSN_P (head)) + head = NEXT_INSN (head); + else if (NOTE_P (tail) || DEBUG_INSN_P (tail)) + tail = PREV_INSN (tail); + else if (LABEL_P (head)) + head = NEXT_INSN (head); + else + break; + } first_bb = BLOCK_FOR_INSN (head); last_bb = BLOCK_FOR_INSN (tail); @@ -530,7 +550,9 @@ schedule_ebb (rtx head, rtx tail) /* Make ready list big enough to hold all the instructions from the ebb. */ sched_extend_ready_list (rgn_n_insns); - schedule_block (&target_bb); + success = schedule_block (&target_bb); + gcc_assert (success || modulo_scheduling); + /* Free ready list. */ sched_finish_ready_list (); @@ -538,7 +560,7 @@ schedule_ebb (rtx head, rtx tail) so we may made some of them empty. Can't assert (b == last_bb). */ /* Sanity check: verify that all region insns were scheduled. */ - gcc_assert (sched_rgn_n_insns == rgn_n_insns); + gcc_assert (modulo_scheduling || sched_rgn_n_insns == rgn_n_insns); /* Free dependencies. */ sched_free_deps (current_sched_info->head, current_sched_info->tail, true); @@ -555,29 +577,14 @@ schedule_ebb (rtx head, rtx tail) delete_basic_block (last_bb->next_bb); } - return last_bb; + return success ? last_bb : NULL; } -/* The one entry point in this file. */ - +/* Perform initializations before running schedule_ebbs or a single + schedule_ebb. */ void -schedule_ebbs (void) +schedule_ebbs_init (void) { - basic_block bb; - int probability_cutoff; - rtx tail; - - if (profile_info && flag_branch_probabilities) - probability_cutoff = PARAM_VALUE (TRACER_MIN_BRANCH_PROBABILITY_FEEDBACK); - else - probability_cutoff = PARAM_VALUE (TRACER_MIN_BRANCH_PROBABILITY); - probability_cutoff = REG_BR_PROB_BASE / 100 * probability_cutoff; - - /* Taking care of this degenerate case makes the rest of - this code simpler. */ - if (n_basic_blocks == NUM_FIXED_BLOCKS) - return; - /* Setup infos. */ { memcpy (&ebb_common_sched_info, &haifa_common_sched_info, @@ -599,6 +606,43 @@ schedule_ebbs (void) /* Initialize DONT_CALC_DEPS and ebb-{start, end} markers. */ bitmap_initialize (&dont_calc_deps, 0); bitmap_clear (&dont_calc_deps); +} + +/* Perform cleanups after scheduling using schedules_ebbs or schedule_ebb. */ +void +schedule_ebbs_finish (void) +{ + bitmap_clear (&dont_calc_deps); + + /* Reposition the prologue and epilogue notes in case we moved the + prologue/epilogue insns. */ + if (reload_completed) + reposition_prologue_and_epilogue_notes (); + + haifa_sched_finish (); +} + +/* The main entry point in this file. */ + +void +schedule_ebbs (void) +{ + basic_block bb; + int probability_cutoff; + rtx tail; + + /* Taking care of this degenerate case makes the rest of + this code simpler. */ + if (n_basic_blocks == NUM_FIXED_BLOCKS) + return; + + if (profile_info && flag_branch_probabilities) + probability_cutoff = PARAM_VALUE (TRACER_MIN_BRANCH_PROBABILITY_FEEDBACK); + else + probability_cutoff = PARAM_VALUE (TRACER_MIN_BRANCH_PROBABILITY); + probability_cutoff = REG_BR_PROB_BASE / 100 * probability_cutoff; + + schedule_ebbs_init (); /* Schedule every region in the subroutine. */ FOR_EACH_BB (bb) @@ -625,30 +669,9 @@ schedule_ebbs (void) bb = bb->next_bb; } - /* Blah. We should fix the rest of the code not to get confused by - a note or two. */ - while (head != tail) - { - if (NOTE_P (head) || DEBUG_INSN_P (head)) - head = NEXT_INSN (head); - else if (NOTE_P (tail) || DEBUG_INSN_P (tail)) - tail = PREV_INSN (tail); - else if (LABEL_P (head)) - head = NEXT_INSN (head); - else - break; - } - - bb = schedule_ebb (head, tail); + bb = schedule_ebb (head, tail, false); } - bitmap_clear (&dont_calc_deps); - - /* Reposition the prologue and epilogue notes in case we moved the - prologue/epilogue insns. */ - if (reload_completed) - reposition_prologue_and_epilogue_notes (); - - haifa_sched_finish (); + schedule_ebbs_finish (); } /* INSN has been added to/removed from current ebb. */ |