Commit 7043b893 by Bernd Schmidt Committed by Bernd Schmidt

sched-ebb.c (schedule_ebb): No longer static.

	* 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.

From-SVN: r179385
parent a912d7d9
...@@ -28,6 +28,16 @@ ...@@ -28,6 +28,16 @@
* params.def (PARAM_MAX_MODULO_BACKTRACK_ATTEMPS): New. * params.def (PARAM_MAX_MODULO_BACKTRACK_ATTEMPS): New.
* doc/invoke.texi (--param): Document it. * doc/invoke.texi (--param): Document it.
* 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.
2011-09-30 Richard Guenther <rguenther@suse.de> 2011-09-30 Richard Guenther <rguenther@suse.de>
PR middle-end/50574 PR middle-end/50574
...@@ -66,7 +66,6 @@ static int rank (rtx, rtx); ...@@ -66,7 +66,6 @@ static int rank (rtx, rtx);
static int ebb_contributes_to_priority (rtx, rtx); static int ebb_contributes_to_priority (rtx, rtx);
static basic_block earliest_block_with_similiar_load (basic_block, rtx); static basic_block earliest_block_with_similiar_load (basic_block, rtx);
static void add_deps_for_risky_insns (rtx, 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 debug_ebb_dependencies (rtx, rtx);
static void ebb_add_remove_insn (rtx, int); static void ebb_add_remove_insn (rtx, int);
...@@ -476,14 +475,35 @@ add_deps_for_risky_insns (rtx head, rtx tail) ...@@ -476,14 +475,35 @@ add_deps_for_risky_insns (rtx head, rtx tail)
} }
} }
/* Schedule a single extended basic block, defined by the boundaries HEAD /* Schedule a single extended basic block, defined by the boundaries
and TAIL. */ HEAD and TAIL.
static basic_block We change our expectations about scheduler behaviour depending on
schedule_ebb (rtx head, rtx tail) 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; basic_block first_bb, target_bb;
struct deps_desc tmp_deps; 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); first_bb = BLOCK_FOR_INSN (head);
last_bb = BLOCK_FOR_INSN (tail); last_bb = BLOCK_FOR_INSN (tail);
...@@ -530,7 +550,9 @@ schedule_ebb (rtx head, rtx tail) ...@@ -530,7 +550,9 @@ schedule_ebb (rtx head, rtx tail)
/* Make ready list big enough to hold all the instructions from the ebb. */ /* Make ready list big enough to hold all the instructions from the ebb. */
sched_extend_ready_list (rgn_n_insns); sched_extend_ready_list (rgn_n_insns);
schedule_block (&target_bb); success = schedule_block (&target_bb);
gcc_assert (success || modulo_scheduling);
/* Free ready list. */ /* Free ready list. */
sched_finish_ready_list (); sched_finish_ready_list ();
...@@ -538,7 +560,7 @@ schedule_ebb (rtx head, rtx tail) ...@@ -538,7 +560,7 @@ schedule_ebb (rtx head, rtx tail)
so we may made some of them empty. Can't assert (b == last_bb). */ so we may made some of them empty. Can't assert (b == last_bb). */
/* Sanity check: verify that all region insns were scheduled. */ /* 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. */ /* Free dependencies. */
sched_free_deps (current_sched_info->head, current_sched_info->tail, true); sched_free_deps (current_sched_info->head, current_sched_info->tail, true);
...@@ -555,29 +577,14 @@ schedule_ebb (rtx head, rtx tail) ...@@ -555,29 +577,14 @@ schedule_ebb (rtx head, rtx tail)
delete_basic_block (last_bb->next_bb); 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 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. */ /* Setup infos. */
{ {
memcpy (&ebb_common_sched_info, &haifa_common_sched_info, memcpy (&ebb_common_sched_info, &haifa_common_sched_info,
...@@ -599,6 +606,43 @@ schedule_ebbs (void) ...@@ -599,6 +606,43 @@ schedule_ebbs (void)
/* Initialize DONT_CALC_DEPS and ebb-{start, end} markers. */ /* Initialize DONT_CALC_DEPS and ebb-{start, end} markers. */
bitmap_initialize (&dont_calc_deps, 0); bitmap_initialize (&dont_calc_deps, 0);
bitmap_clear (&dont_calc_deps); 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. */ /* Schedule every region in the subroutine. */
FOR_EACH_BB (bb) FOR_EACH_BB (bb)
...@@ -625,30 +669,9 @@ schedule_ebbs (void) ...@@ -625,30 +669,9 @@ schedule_ebbs (void)
bb = bb->next_bb; bb = bb->next_bb;
} }
/* Blah. We should fix the rest of the code not to get confused by bb = schedule_ebb (head, tail, false);
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);
} }
bitmap_clear (&dont_calc_deps); schedule_ebbs_finish ();
/* 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 ();
} }
/* INSN has been added to/removed from current ebb. */ /* INSN has been added to/removed from current ebb. */
......
...@@ -1280,6 +1280,11 @@ extern rtx sched_emit_insn (rtx); ...@@ -1280,6 +1280,11 @@ extern rtx sched_emit_insn (rtx);
extern rtx get_ready_element (int); extern rtx get_ready_element (int);
extern int number_in_ready (void); extern int number_in_ready (void);
/* Types and functions in sched-ebb.c. */
extern basic_block schedule_ebb (rtx, rtx, bool);
extern void schedule_ebbs_init (void);
extern void schedule_ebbs_finish (void);
/* Types and functions in sched-rgn.c. */ /* Types and functions in sched-rgn.c. */
......
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