diff options
author | Bernd Schmidt <bernds@codesourcery.com> | 2011-07-13 17:47:26 +0000 |
---|---|---|
committer | Bernd Schmidt <bernds@gcc.gnu.org> | 2011-07-13 17:47:26 +0000 |
commit | 515646845f462707b22e7425f9f2f5917a93085a (patch) | |
tree | afb2987d867364585bdf33bc9a32719ec85eaac6 | |
parent | b3fe1584251c039b787e1775ea725bc161cf334c (diff) | |
download | gcc-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/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/haifa-sched.c | 41 |
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); } |