X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Fsched-int.h;h=6797397b9bba8e1f538528edb760372929b2e91c;hb=09bcd759d4fe837296ff20dd0eeb0b71e64e06e4;hp=68cfa23ee06af3036b944e50f4e357da5d711f3c;hpb=7fb29e6397a619886134ed1e2840238e10682ef9;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/sched-int.h b/gcc/sched-int.h index 68cfa23ee06..6797397b9bb 100644 --- a/gcc/sched-int.h +++ b/gcc/sched-int.h @@ -39,42 +39,18 @@ enum sched_pass_id_t { SCHED_PASS_UNKNOWN, SCHED_RGN_PASS, SCHED_EBB_PASS, typedef VEC (basic_block, heap) *bb_vec_t; typedef VEC (rtx, heap) *insn_vec_t; -typedef VEC(rtx, heap) *rtx_vec_t; - -struct sched_scan_info_def -{ - /* This hook notifies scheduler frontend to extend its internal per basic - block data structures. This hook should be called once before a series of - calls to bb_init (). */ - void (*extend_bb) (void); - - /* This hook makes scheduler frontend to initialize its internal data - structures for the passed basic block. */ - void (*init_bb) (basic_block); - - /* This hook notifies scheduler frontend to extend its internal per insn data - structures. This hook should be called once before a series of calls to - insn_init (). */ - void (*extend_insn) (void); - - /* This hook makes scheduler frontend to initialize its internal data - structures for the passed insn. */ - void (*init_insn) (rtx); -}; - -extern const struct sched_scan_info_def *sched_scan_info; - -extern void sched_scan (const struct sched_scan_info_def *, - bb_vec_t, basic_block, insn_vec_t, rtx); +typedef VEC (rtx, heap) *rtx_vec_t; extern void sched_init_bbs (void); -extern void sched_init_luids (bb_vec_t, basic_block, insn_vec_t, rtx); +extern void sched_extend_luids (void); +extern void sched_init_insn_luid (rtx); +extern void sched_init_luids (bb_vec_t); extern void sched_finish_luids (void); extern void sched_extend_target (void); -extern void haifa_init_h_i_d (bb_vec_t, basic_block, insn_vec_t, rtx); +extern void haifa_init_h_i_d (bb_vec_t); extern void haifa_finish_h_i_d (void); /* Hooks that are common to all the schedulers. */ @@ -197,7 +173,7 @@ extern struct ready_list ready; extern int max_issue (struct ready_list *, int, state_t, bool, int *); -extern void ebb_compute_jump_reg_dependencies (rtx, regset, regset, regset); +extern void ebb_compute_jump_reg_dependencies (rtx, regset); extern edge find_fallthru_edge_from (basic_block); @@ -239,6 +215,9 @@ struct _dep /* Dependency status. This field holds all dependency types and additional information for speculative dependencies. */ ds_t status; + + /* Cached cost of the dependency. */ + int cost; }; typedef struct _dep dep_def; @@ -248,6 +227,9 @@ typedef dep_def *dep_t; #define DEP_CON(D) ((D)->con) #define DEP_TYPE(D) ((D)->type) #define DEP_STATUS(D) ((D)->status) +#define DEP_COST(D) ((D)->cost) + +#define UNKNOWN_DEP_COST INT_MIN /* Functions to work with dep. */ @@ -514,6 +496,9 @@ struct deps_desc scheduling is done. */ rtx sched_before_next_call; + /* Similarly, a list of insns which should not cross a branch. */ + rtx sched_before_next_jump; + /* Used to keep post-call pseudo/hard reg movements together with the call. */ enum post_call_group in_post_call_group_p; @@ -535,9 +520,6 @@ struct deps_desc in reg_last[N].{uses,sets,clobbers}. */ regset_head reg_last_in_use; - /* Element N is set for each register that is conditionally set. */ - regset_head reg_conditional_sets; - /* Shows the last value of reg_pending_barrier associated with the insn. */ enum reg_pending_barrier_mode last_reg_pending_barrier; @@ -605,10 +587,15 @@ struct haifa_sched_info parameter == 0) or removed (second parameter == 1). */ void (*add_remove_insn) (rtx, int); - /* Called to notify frontend that instruction is being scheduled. - The first parameter - instruction to scheduled, the second parameter - - last scheduled instruction. */ - void (*begin_schedule_ready) (rtx, rtx); + /* Called to notify the frontend that instruction INSN is being + scheduled. */ + void (*begin_schedule_ready) (rtx insn); + + /* Called to notify the frontend that an instruction INSN is about to be + moved to its correct place in the final schedule. This is done for all + insns in order of the schedule. LAST indicates the last scheduled + instruction. */ + void (*begin_move_insn) (rtx insn, rtx last); /* If the second parameter is not NULL, return nonnull value, if the basic block should be advanced. @@ -616,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; @@ -653,9 +647,9 @@ extern struct haifa_sched_info *current_sched_info; up. */ extern bool sched_pressure_p; -/* Map regno -> its cover class. The map defined only when +/* Map regno -> its pressure class. The map defined only when SCHED_PRESSURE_P is true. */ -extern enum reg_class *sched_regno_cover_class; +extern enum reg_class *sched_regno_pressure_class; /* Indexed by INSN_UID, the collection of all data associated with a single instruction. */ @@ -698,6 +692,17 @@ struct _haifa_deps_insn_data search in 'forw_deps'. */ deps_list_t resolved_forw_deps; + /* If the insn is conditional (either through COND_EXEC, or because + it is a conditional branch), this records the condition. NULL + for insns that haven't been seen yet or don't have a condition; + const_true_rtx to mark an insn without a condition, or with a + condition that has been clobbered by a subsequent insn. */ + rtx cond; + + /* True if the condition in 'cond' should be reversed to get the actual + condition. */ + unsigned int reverse_cond : 1; + /* Some insns (e.g. call) are not allowed to move across blocks. */ unsigned int cant_move : 1; }; @@ -707,7 +712,7 @@ struct _haifa_deps_insn_data #define INCREASE_BITS 8 /* The structure describes how the corresponding insn increases the - register pressure for each cover class. */ + register pressure for each pressure class. */ struct reg_pressure_data { /* Pressure increase for given class because of clobber. */ @@ -736,7 +741,7 @@ struct reg_use_data }; /* The following structure describes used sets of registers by insns. - Registers are pseudos whose cover class is not NO_REGS or hard + Registers are pseudos whose pressure class is not NO_REGS or hard registers available for allocations. */ struct reg_set_data { @@ -764,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; @@ -777,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, @@ -804,7 +825,7 @@ struct _haifa_insn_data struct reg_pressure_data *reg_pressure; /* The following array contains maximal reg pressure between last scheduled insn and given insn. There is an element for each - cover class of pseudos referenced in insns. This info updated + pressure class of pseudos referenced in insns. This info updated after scheduling each insn for each insn between the two mentioned insns. */ int *max_reg_pressure; @@ -857,6 +878,8 @@ extern VEC(haifa_deps_insn_data_def, heap) *h_d_i_d; #define INSN_RESOLVED_FORW_DEPS(INSN) (HDID (INSN)->resolved_forw_deps) #define INSN_HARD_BACK_DEPS(INSN) (HDID (INSN)->hard_back_deps) #define INSN_SPEC_BACK_DEPS(INSN) (HDID (INSN)->spec_back_deps) +#define INSN_CACHED_COND(INSN) (HDID (INSN)->cond) +#define INSN_REVERSE_COND(INSN) (HDID (INSN)->reverse_cond) #define CANT_MOVE(INSN) (HDID (INSN)->cant_move) #define CANT_MOVE_BY_LUID(LUID) (VEC_index (haifa_deps_insn_data_def, h_d_i_d, \ LUID)->cant_move) @@ -887,23 +910,6 @@ extern VEC(haifa_deps_insn_data_def, heap) *h_d_i_d; #define IS_SPECULATION_BRANCHY_CHECK_P(INSN) \ (RECOVERY_BLOCK (INSN) != NULL && RECOVERY_BLOCK (INSN) != EXIT_BLOCK_PTR) -/* The unchanging bit tracks whether a debug insn is to be handled - like an insn (i.e., schedule it) or like a note (e.g., it is next - to a basic block boundary. */ -#define DEBUG_INSN_SCHED_P(insn) \ - (RTL_FLAG_CHECK1("DEBUG_INSN_SCHED_P", (insn), DEBUG_INSN)->unchanging) - -/* True if INSN is a debug insn that is next to a basic block - boundary, i.e., it is to be handled by the scheduler like a - note. */ -#define BOUNDARY_DEBUG_INSN_P(insn) \ - (DEBUG_INSN_P (insn) && !DEBUG_INSN_SCHED_P (insn)) -/* True if INSN is a debug insn that is not next to a basic block - boundary, i.e., it is to be handled by the scheduler like an - insn. */ -#define SCHEDULE_DEBUG_INSN_P(insn) \ - (DEBUG_INSN_P (insn) && DEBUG_INSN_SCHED_P (insn)) - /* Dep status (aka ds_t) of the link encapsulates information, that is needed for speculative scheduling. Namely, it is 4 integers in the range [0, MAX_DEP_WEAK] and 3 bits. @@ -1034,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, @@ -1140,7 +1147,7 @@ struct sched_deps_info_def /* Called when computing dependencies for a JUMP_INSN. This function should store the set of registers that must be considered as set by the jump in the regset. */ - void (*compute_jump_reg_dependencies) (rtx, regset, regset, regset); + void (*compute_jump_reg_dependencies) (rtx, regset); /* Start analyzing insn. */ void (*start_insn) (rtx); @@ -1206,6 +1213,7 @@ extern void init_deps_global (void); extern void finish_deps_global (void); extern void deps_analyze_insn (struct deps_desc *, rtx); extern void remove_from_deps (struct deps_desc *, rtx); +extern void init_insn_reg_pressure_info (rtx); extern dw_t get_dep_weak_1 (ds_t, ds_t); extern dw_t get_dep_weak (ds_t, ds_t); @@ -1320,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); @@ -1494,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);