Commit 975ccf22 by Bernd Schmidt Committed by Bernd Schmidt

sched-int.h (schedule_block): Adjust declaration.

	* sched-int.h (schedule_block): Adjust declaration.
	* sched-rgn.c (bb_state_array, bb_state): New static variables.
	(sched_rgn_init): Initialize them.
	(sched_rgn_free): Free them.
	(schedule_region): Save scheduling state for future blocks, and
	pass such state to schedule_block.
	* params.def (PARAM_SCHED_STATE_EDGE_PROB_CUTOFF): New.
	* doc/invoke.texi (--param): Document it.
	* haifa-sched.c (schedule_block): New arg init_state.  Use it to
	initialize state if nonnull.  All callers changed.
	Call advance_one_cycle after scheduling.

From-SVN: r192203
parent 1e422fff
2012-10-08 Bernd Schmidt <bernds@codesourcery.com>
* sched-int.h (schedule_block): Adjust declaration.
* sched-rgn.c (bb_state_array, bb_state): New static variables.
(sched_rgn_init): Initialize them.
(sched_rgn_free): Free them.
(schedule_region): Save scheduling state for future blocks, and
pass such state to schedule_block.
* params.def (PARAM_SCHED_STATE_EDGE_PROB_CUTOFF): New.
* doc/invoke.texi (--param): Document it.
* haifa-sched.c (schedule_block): New arg init_state. Use it to
initialize state if nonnull. All callers changed.
Call advance_one_cycle after scheduling.
2012-10-08 Georg-Johann Lay <avr@gjlay.de> 2012-10-08 Georg-Johann Lay <avr@gjlay.de>
PR target/54854 PR target/54854
......
...@@ -9242,6 +9242,11 @@ The minimal probability of speculation success (in percents), so that ...@@ -9242,6 +9242,11 @@ The minimal probability of speculation success (in percents), so that
speculative insns are scheduled. speculative insns are scheduled.
The default value is 40. The default value is 40.
@item sched-spec-state-edge-prob-cutoff
The minimum probability an edge must have for the scheduler to save its
state across it.
The default value is 10.
@item sched-mem-true-dep-cost @item sched-mem-true-dep-cost
Minimal distance (in CPU cycles) between store and load targeting same Minimal distance (in CPU cycles) between store and load targeting same
memory locations. The default value is 1. memory locations. The default value is 1.
......
...@@ -5840,7 +5840,7 @@ verify_shadows (void) ...@@ -5840,7 +5840,7 @@ verify_shadows (void)
region. */ region. */
bool bool
schedule_block (basic_block *target_bb) schedule_block (basic_block *target_bb, state_t init_state)
{ {
int i; int i;
bool success = modulo_ii == 0; bool success = modulo_ii == 0;
...@@ -5875,7 +5875,10 @@ schedule_block (basic_block *target_bb) ...@@ -5875,7 +5875,10 @@ schedule_block (basic_block *target_bb)
if (sched_verbose) if (sched_verbose)
dump_new_block_header (0, *target_bb, head, tail); dump_new_block_header (0, *target_bb, head, tail);
state_reset (curr_state); if (init_state == NULL)
state_reset (curr_state);
else
memcpy (curr_state, init_state, dfa_state_size);
/* Clear the ready list. */ /* Clear the ready list. */
ready.first = ready.veclen - 1; ready.first = ready.veclen - 1;
...@@ -6335,6 +6338,7 @@ schedule_block (basic_block *target_bb) ...@@ -6335,6 +6338,7 @@ schedule_block (basic_block *target_bb)
if (ls.modulo_epilogue) if (ls.modulo_epilogue)
success = true; success = true;
end_schedule: end_schedule:
advance_one_cycle ();
perform_replacements_new_cycle (); perform_replacements_new_cycle ();
if (modulo_ii > 0) if (modulo_ii > 0)
{ {
......
...@@ -611,6 +611,11 @@ DEFPARAM(PARAM_SCHED_SPEC_PROB_CUTOFF, ...@@ -611,6 +611,11 @@ DEFPARAM(PARAM_SCHED_SPEC_PROB_CUTOFF,
"The minimal probability of speculation success (in percents), so that speculative insn will be scheduled.", "The minimal probability of speculation success (in percents), so that speculative insn will be scheduled.",
40, 0, 100) 40, 0, 100)
DEFPARAM(PARAM_SCHED_STATE_EDGE_PROB_CUTOFF,
"sched-state-edge-prob-cutoff",
"The minimum probability an edge must have for the scheduler to save its state across it.",
10, 0, 100)
DEFPARAM(PARAM_SELSCHED_MAX_LOOKAHEAD, DEFPARAM(PARAM_SELSCHED_MAX_LOOKAHEAD,
"selsched-max-lookahead", "selsched-max-lookahead",
"The maximum size of the lookahead window of selective scheduling", "The maximum size of the lookahead window of selective scheduling",
......
...@@ -544,7 +544,7 @@ schedule_ebb (rtx head, rtx tail, bool modulo_scheduling) ...@@ -544,7 +544,7 @@ schedule_ebb (rtx head, rtx tail, bool modulo_scheduling)
/* 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);
success = schedule_block (&target_bb); success = schedule_block (&target_bb, NULL);
gcc_assert (success || modulo_scheduling); gcc_assert (success || modulo_scheduling);
/* Free ready list. */ /* Free ready list. */
......
...@@ -1321,7 +1321,7 @@ extern int dep_cost (dep_t); ...@@ -1321,7 +1321,7 @@ extern int dep_cost (dep_t);
extern int set_priorities (rtx, rtx); extern int set_priorities (rtx, rtx);
extern void sched_setup_bb_reg_pressure_info (basic_block, rtx); extern void sched_setup_bb_reg_pressure_info (basic_block, rtx);
extern bool schedule_block (basic_block *); extern bool schedule_block (basic_block *, state_t);
extern int cycle_issued_insns; extern int cycle_issued_insns;
extern int issue_rate; extern int issue_rate;
......
...@@ -124,6 +124,9 @@ int current_blocks; ...@@ -124,6 +124,9 @@ int current_blocks;
static basic_block *bblst_table; static basic_block *bblst_table;
static int bblst_size, bblst_last; static int bblst_size, bblst_last;
static char *bb_state_array;
static state_t *bb_state;
/* Target info declarations. /* Target info declarations.
The block currently being scheduled is referred to as the "target" block, The block currently being scheduled is referred to as the "target" block,
...@@ -2982,9 +2985,21 @@ schedule_region (int rgn) ...@@ -2982,9 +2985,21 @@ schedule_region (int rgn)
curr_bb = first_bb; curr_bb = first_bb;
if (dbg_cnt (sched_block)) if (dbg_cnt (sched_block))
{ {
schedule_block (&curr_bb); edge f;
schedule_block (&curr_bb, bb_state[first_bb->index]);
gcc_assert (EBB_FIRST_BB (bb) == first_bb); gcc_assert (EBB_FIRST_BB (bb) == first_bb);
sched_rgn_n_insns += sched_n_insns; sched_rgn_n_insns += sched_n_insns;
f = find_fallthru_edge (last_bb->succs);
if (f && f->probability * 100 / REG_BR_PROB_BASE >=
PARAM_VALUE (PARAM_SCHED_STATE_EDGE_PROB_CUTOFF))
{
memcpy (bb_state[f->dest->index], curr_state,
dfa_state_size);
if (sched_verbose >= 5)
fprintf (sched_dump, "saving state for edge %d->%d\n",
f->src->index, f->dest->index);
}
} }
else else
{ {
...@@ -3017,6 +3032,8 @@ schedule_region (int rgn) ...@@ -3017,6 +3032,8 @@ schedule_region (int rgn)
void void
sched_rgn_init (bool single_blocks_p) sched_rgn_init (bool single_blocks_p)
{ {
int i;
min_spec_prob = ((PARAM_VALUE (PARAM_MIN_SPEC_PROB) * REG_BR_PROB_BASE) min_spec_prob = ((PARAM_VALUE (PARAM_MIN_SPEC_PROB) * REG_BR_PROB_BASE)
/ 100); / 100);
...@@ -3028,6 +3045,23 @@ sched_rgn_init (bool single_blocks_p) ...@@ -3028,6 +3045,23 @@ sched_rgn_init (bool single_blocks_p)
CONTAINING_RGN (ENTRY_BLOCK) = -1; CONTAINING_RGN (ENTRY_BLOCK) = -1;
CONTAINING_RGN (EXIT_BLOCK) = -1; CONTAINING_RGN (EXIT_BLOCK) = -1;
if (!sel_sched_p ())
{
bb_state_array = (char *) xmalloc (last_basic_block * dfa_state_size);
bb_state = XNEWVEC (state_t, last_basic_block);
for (i = 0; i < last_basic_block; i++)
{
bb_state[i] = (state_t) (bb_state_array + i * dfa_state_size);
state_reset (bb_state[i]);
}
}
else
{
bb_state_array = NULL;
bb_state = NULL;
}
/* Compute regions for scheduling. */ /* Compute regions for scheduling. */
if (single_blocks_p if (single_blocks_p
|| n_basic_blocks == NUM_FIXED_BLOCKS + 1 || n_basic_blocks == NUM_FIXED_BLOCKS + 1
...@@ -3064,6 +3098,9 @@ sched_rgn_init (bool single_blocks_p) ...@@ -3064,6 +3098,9 @@ sched_rgn_init (bool single_blocks_p)
void void
sched_rgn_finish (void) sched_rgn_finish (void)
{ {
free (bb_state_array);
free (bb_state);
/* Reposition the prologue and epilogue notes in case we moved the /* Reposition the prologue and epilogue notes in case we moved the
prologue/epilogue insns. */ prologue/epilogue insns. */
if (reload_completed) if (reload_completed)
......
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