diff options
author | Bernd Schmidt <bernds@codesourcery.com> | 2011-07-13 23:10:52 +0000 |
---|---|---|
committer | Bernd Schmidt <bernds@gcc.gnu.org> | 2011-07-13 23:10:52 +0000 |
commit | 26965010b951a7bb5cc206fe55078c459a7e64e4 (patch) | |
tree | 4e1e85fd5f8f205e86e0086d2fff6edfa291e8bc /gcc/sched-int.h | |
parent | 13b7a7b9d836ba00445b8c89dfd116e9362c65bd (diff) | |
download | gcc-26965010b951a7bb5cc206fe55078c459a7e64e4.zip gcc-26965010b951a7bb5cc206fe55078c459a7e64e4.tar.gz gcc-26965010b951a7bb5cc206fe55078c459a7e64e4.tar.bz2 |
haifa-sched.c: Include "hashtab.h"
* haifa-sched.c: Include "hashtab.h"
(sched_no_dce): New global variable.
(INSN_EXACT_TICK, INSN_TICK_ESTIMATE, FEEDS_BACKTRACK_INSN,
SHADOW_P): New macros.
(last_clock_var, cycle_issued_insns): Move declarations.
(must_backtrack): New static variable.
(struct delay_pair): New structure.
(delay_htab, delay_htab_i2): New static variables.
(delay_hash_i1, delay_hash_i2, delay_i1_eq, delay_i2_eq,
record_delay_slot_pair, pair_delay, add_delay_dependencies): New
functions.
(dep_cost_1): If delay pairs exist, try to look up the insns and
use the correct pair delay if we find them.
(rank-for_schedule): Tweak priority for insns that must be scheduled
soon to avoid backtracking.
(queue_insn): Detect conditions which force backtracking.
(ready_add): Likewise.
(struct sched_block_state): Add member shadows_only_p.
(struct haifa_save_data): New structure.
(backtrack_queue): New static variable.
(mark_backtrack_feeds, copy_insn_list, save_backtrack_point,
unschedule_insns_until, restore_last_backtrack_point,
free_topmost_backtrack_point, free_backtrack_queue,
estimate_insn_tick, estimate_shadow_tick): New functions.
(prune_ready_list): New arg shadows_only_p. All callers changed.
If true, remove everything that isn't SHADOW_P. Look up delay
pairs and estimate ticks to avoid scheduling the first insn too
early.
(verify_shadows): New function.
(schedule_block): Add machinery to enable backtracking.
(sched_init): Take sched_no_dce into account when setting
DF_LR_RUN_DCE.
(free_delay_pairs): New function.
(init_h_i_d): Initialize INSN_EXACT_TICK.
* Makefile.in (haifa-sched.o): Add $(HASHTAB_H).
* sched-deps.c (sd_unresolve_dep): New function.
* sched-int.h (struct haifa_sched_info): New fields save_state
and restore_state.
(struct _haifa_insn_data): New fields exact_tick, tick_estimate,
feeds_backtrack_insn and shadow_p.
(DO_BACKTRACKING): New value in enum SCHED_FLAGS.
(sched_no_dce): Declare variable.
(record_delay_slot_pair, free_delay_pairs, add_delay_dependencies,
sd_unresolve_dep): Declare functions.
* modulo-sched.c (sms_sched_info): Clear the two new fields.
* sched-rgn.c (rgn_const_sched_info): Likewise.
* sel-sched-ir.c (sched_sel_haifa_sched_info): Likewise.
* sched-ebb.c (save_ebb_state, restore_ebb_state): New functions.
(ebb_sched_info): Add them for the two new fields.
(add_deps_for_risky_insns): Call add_delay_dependencies.
From-SVN: r176255
Diffstat (limited to 'gcc/sched-int.h')
-rw-r--r-- | gcc/sched-int.h | 31 |
1 files changed, 30 insertions, 1 deletions
diff --git a/gcc/sched-int.h b/gcc/sched-int.h index 8b39a22..348a3cc 100644 --- a/gcc/sched-int.h +++ b/gcc/sched-int.h @@ -603,6 +603,13 @@ struct haifa_sched_info The first parameter is the current basic block in EBB. */ basic_block (*advance_target_bb) (basic_block, rtx); + /* Allocate memory, store the frontend scheduler state in it, and + return it. */ + void *(*save_state) (void); + /* Restore frontend scheduler state from the argument, and free the + memory. */ + void (*restore_state) (void *); + /* ??? FIXME: should use straight bitfields inside sched_info instead of this flag field. */ unsigned int flags; @@ -762,10 +769,18 @@ struct _haifa_insn_data used to note timing constraints for the insns in the pending list. */ int tick; + /* For insns that are scheduled at a fixed difference from another, + this records the tick in which they must be ready. */ + int exact_tick; + /* INTER_TICK is used to adjust INSN_TICKs of instructions from the subsequent blocks in a region. */ int inter_tick; + /* Used temporarily to estimate an INSN_TICK value for an insn given + current knowledge. */ + int tick_estimate; + /* See comment on QUEUE_INDEX macro in haifa-sched.c. */ int queue_index; @@ -775,6 +790,14 @@ struct _haifa_insn_data moved load insn and this one. */ unsigned int fed_by_spec_load : 1; unsigned int is_load_insn : 1; + /* Nonzero if this insn has negative-cost forward dependencies against + an already scheduled insn. */ + unsigned int feeds_backtrack_insn : 1; + + /* Nonzero if this insn is a shadow of another, scheduled after a fixed + delay. We only emit shadows at the end of a cycle, with no other + real insns following them. */ + unsigned int shadow_p : 1; /* '> 0' if priority is valid, '== 0' if priority was not yet computed, @@ -1017,7 +1040,8 @@ enum SCHED_FLAGS { Results in generation of data and control speculative dependencies. Requires USE_DEPS_LIST set. */ DO_SPECULATION = USE_DEPS_LIST << 1, - SCHED_RGN = DO_SPECULATION << 1, + DO_BACKTRACKING = DO_SPECULATION << 1, + SCHED_RGN = DO_BACKTRACKING << 1, SCHED_EBB = SCHED_RGN << 1, /* Scheduler can possibly create new basic blocks. Used for assertions. */ NEW_BBS = SCHED_EBB << 1, @@ -1304,7 +1328,11 @@ extern int *ebb_head; extern int current_nr_blocks; extern int current_blocks; extern int target_bb; +extern bool sched_no_dce; +extern void record_delay_slot_pair (rtx, rtx, int); +extern void free_delay_pairs (void); +extern void add_delay_dependencies (rtx); extern bool sched_is_disabled_for_current_region_p (void); extern void sched_rgn_init (bool); extern void sched_rgn_finish (void); @@ -1478,6 +1506,7 @@ extern dep_t sd_find_dep_between (rtx, rtx, bool); extern void sd_add_dep (dep_t, bool); extern enum DEPS_ADJUST_RESULT sd_add_or_update_dep (dep_t, bool); extern void sd_resolve_dep (sd_iterator_def); +extern void sd_unresolve_dep (sd_iterator_def); extern void sd_copy_back_deps (rtx, rtx, bool); extern void sd_delete_dep (sd_iterator_def); extern void sd_debug_lists (rtx, sd_list_types_def); |