aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBernd Schmidt <bernds@codesourcery.com>2011-07-13 17:47:26 +0000
committerBernd Schmidt <bernds@gcc.gnu.org>2011-07-13 17:47:26 +0000
commit515646845f462707b22e7425f9f2f5917a93085a (patch)
treeafb2987d867364585bdf33bc9a32719ec85eaac6
parentb3fe1584251c039b787e1775ea725bc161cf334c (diff)
downloadgcc-515646845f462707b22e7425f9f2f5917a93085a.zip
gcc-515646845f462707b22e7425f9f2f5917a93085a.tar.gz
gcc-515646845f462707b22e7425f9f2f5917a93085a.tar.bz2
haifa-sched.c (struct sched_block_state): New.
* haifa-sched.c (struct sched_block_state): New. (schedule_block): Move some local variables into such a structure. From-SVN: r176243
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/haifa-sched.c41
2 files changed, 30 insertions, 16 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 881d83f..cd02017 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2011-07-13 Bernd Schmidt <bernds@codesourcery.com>
+
+ * haifa-sched.c (struct sched_block_state): New.
+ (schedule_block): Move some local variables into such a structure.
+
2011-07-13 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
* config/i386/crtprec.c: Move to ../libgcc/config/i386.
diff --git a/gcc/haifa-sched.c b/gcc/haifa-sched.c
index bc36d07..5eba79e 100644
--- a/gcc/haifa-sched.c
+++ b/gcc/haifa-sched.c
@@ -1638,6 +1638,16 @@ sched_setup_bb_reg_pressure_info (basic_block bb, rtx after)
initiate_bb_reg_pressure_info (bb);
setup_insn_max_reg_pressure (after, false);
}
+
+/* A structure that holds local state for the loop in schedule_block. */
+struct sched_block_state
+{
+ /* True if no real insns have been scheduled in the current cycle. */
+ bool first_cycle_insn_p;
+ /* Initialized with the machine's issue rate every cycle, and updated
+ by calls to the variable_issue hook. */
+ int can_issue_more;
+};
/* INSN is the "currently executing insn". Launch each insn which was
waiting on INSN. READY is the ready list which contains the insns
@@ -2924,8 +2934,7 @@ void
schedule_block (basic_block *target_bb)
{
int i;
- bool first_cycle_insn_p;
- int can_issue_more;
+ struct sched_block_state ls;
state_t temp_state = NULL; /* It is used for multipass scheduling. */
int sort_p, advance, start_clock_var;
@@ -3075,9 +3084,9 @@ schedule_block (basic_block *target_bb)
if (ready.n_ready == 0)
continue;
- first_cycle_insn_p = true;
+ ls.first_cycle_insn_p = true;
cycle_issued_insns = 0;
- can_issue_more = issue_rate;
+ ls.can_issue_more = issue_rate;
for (;;)
{
rtx insn;
@@ -3118,7 +3127,7 @@ schedule_block (basic_block *target_bb)
}
}
- if (first_cycle_insn_p && !ready.n_ready)
+ if (ls.first_cycle_insn_p && !ready.n_ready)
break;
/* Allow the target to reorder the list, typically for
@@ -3127,13 +3136,13 @@ schedule_block (basic_block *target_bb)
&& (ready.n_ready == 0
|| !SCHED_GROUP_P (ready_element (&ready, 0))))
{
- if (first_cycle_insn_p && targetm.sched.reorder)
- can_issue_more
+ if (ls.first_cycle_insn_p && targetm.sched.reorder)
+ ls.can_issue_more
= targetm.sched.reorder (sched_dump, sched_verbose,
ready_lastpos (&ready),
&ready.n_ready, clock_var);
- else if (!first_cycle_insn_p && targetm.sched.reorder2)
- can_issue_more
+ else if (!ls.first_cycle_insn_p && targetm.sched.reorder2)
+ ls.can_issue_more
= targetm.sched.reorder2 (sched_dump, sched_verbose,
ready.n_ready
? ready_lastpos (&ready) : NULL,
@@ -3151,7 +3160,7 @@ schedule_block (basic_block *target_bb)
}
if (ready.n_ready == 0
- && can_issue_more
+ && ls.can_issue_more
&& reload_completed)
{
/* Allow scheduling insns directly from the queue in case
@@ -3165,7 +3174,7 @@ schedule_block (basic_block *target_bb)
}
if (ready.n_ready == 0
- || !can_issue_more
+ || !ls.can_issue_more
|| state_dead_lock_p (curr_state)
|| !(*current_sched_info->schedule_more_p) ())
break;
@@ -3176,7 +3185,7 @@ schedule_block (basic_block *target_bb)
int res;
insn = NULL_RTX;
- res = choose_ready (&ready, first_cycle_insn_p, &insn);
+ res = choose_ready (&ready, ls.first_cycle_insn_p, &insn);
if (res < 0)
/* Finish cycle. */
@@ -3256,14 +3265,14 @@ schedule_block (basic_block *target_bb)
|| asm_noperands (PATTERN (insn)) >= 0);
if (targetm.sched.variable_issue)
- can_issue_more =
+ ls.can_issue_more =
targetm.sched.variable_issue (sched_dump, sched_verbose,
- insn, can_issue_more);
+ insn, ls.can_issue_more);
/* A naked CLOBBER or USE generates no instruction, so do
not count them against the issue rate. */
else if (GET_CODE (PATTERN (insn)) != USE
&& GET_CODE (PATTERN (insn)) != CLOBBER)
- can_issue_more--;
+ ls.can_issue_more--;
advance = schedule_insn (insn);
/* After issuing an asm insn we should start a new cycle. */
@@ -3272,7 +3281,7 @@ schedule_block (basic_block *target_bb)
if (advance != 0)
break;
- first_cycle_insn_p = false;
+ ls.first_cycle_insn_p = false;
if (ready.n_ready > 0)
prune_ready_list (temp_state, false);
}