diff options
author | bernds <bernds@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-09-19 19:37:31 +0000 |
---|---|---|
committer | bernds <bernds@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-09-19 19:37:31 +0000 |
commit | d452a16984ecc2f20644649f33c8ee38b246cbf0 (patch) | |
tree | 379bbdd61db7200439ea249c13f2b0c2c5b8fefc /gcc/sched-int.h | |
parent | 77ff7cbfe77156dc41943effa80948572fe383fa (diff) | |
download | gcc-d452a16984ecc2f20644649f33c8ee38b246cbf0.tar.gz |
* dbgcnt.def (sched_breakdep): New counter.
* haifa-sched.c (update_insn_after_change): New static function,
broken out of haifa_change_pattern.
(haifa_change_pattern): Call it.
(dep_t heap vecs): Declare.
(INSN_COST): Define earlier.
(next_cycle_replace_deps, next_cycle_apply): New static
variables.
(apply_replacement): New static function.
(recompute_todo_spec): New argument FOR_BACKTRACK. All callers
changed. Handle DEP_REPLACE deps.
(contributes_to_priority_p): False for replaceable deps.
(must_restore_pattern_p, restore_pattern): New static functions.
(schedule_insn): Use them. Apply replacements for broken deps.
(struct haifa_saved_data): Add new fields to keep track of
replacements.
(save_backtrack_point): Initialize them.
(undo_replacements_for_backtrack): New static function.
(restore_last_backtrack_point, free_topmost_backtrack_point):
Use it and keep track of replacements.
(perform_replacements_new_cycle, undo_all_replacements): New static
functions.
(schedule_block): Call these two as necessary. Call
find_modifiable_mems.
(try_ready): Tweak the assert. Check for DEP_POSTPONED.
* sched-deps.c: Include "emit-rtl.h".
(init_dep_1): Initialize DEP_NONREG, DEP_MULTIPLE and DEP_REPLACE.
(dep_spec_p): True for DEP_REPLACE deps.
(mark_as_hard): New static variable.
(update_dep): Update DEP_NONREG and DEP_MULTIPLE.
(add_dependence_list): New argument hard. All callers changed. Set
and clear mark_as_hard around function body.
(add_dependence_list_and_free): Likewise.
(haifa_note_mem_dep): Set DEP_NONREG.
(haifa_note_dep): Likewise if mark_as_hard is true.
(sched_analyze_insn): Switch loop with if statement testing for
sel_sched_p.
(struct mem_inc_info): New.
(attempt_change, parse_add_or_inc, find_inc, find_mem): New static
functions.
(find_modifiable_mems): New function.
* sched-int.h (struct dep_replacement): New.
(struct _dep): Add replace, nonreg and multiple fields. Make type and
cost bitfields.
(UNKNOWN_DEP_COST): Change to match the bitfield.
(DEP_NONREG, DEP_MULTIPLE, DEP_REPLACE): New macros.
(DEP_POSTPONED): New macro.
(DEP_CANCELLED): Renumber.
(find_modifiable_mems): Declare.
(enum SCHED_FLAGS): Add DONT_BREAK_DEPENDENCIES.
* sched-rgn.c (init_ready_list): Set TODO_SPEC here.
(new_ready): Don't set HARD_DEP, use DEP_POSTPONED.
(debug_dependencies): Dump DEP_NONREG and DEP_MULTIPLE.
* Makefile.in (sched-deps.o): Update dependencies.
* config/c6x/c6x.c (in_hwloop): New static variable.
(c6x_set_sched_flags): If it is true, add DONT_BREAK_DEPENDENCIES.
(hwloop_optimize): Set and clear it around preliminary scheduling
pass.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@191493 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/sched-int.h')
-rw-r--r-- | gcc/sched-int.h | 50 |
1 files changed, 41 insertions, 9 deletions
diff --git a/gcc/sched-int.h b/gcc/sched-int.h index 2e462380bb8..32bdeb42ab9 100644 --- a/gcc/sched-int.h +++ b/gcc/sched-int.h @@ -206,6 +206,18 @@ typedef int dw_t; extern enum reg_note ds_to_dk (ds_t); extern ds_t dk_to_ds (enum reg_note); +/* Describe a dependency that can be broken by making a replacement + in one of the patterns. LOC is the location, ORIG and NEWVAL the + two alternative contents, and INSN the instruction that must be + changed. */ +struct dep_replacement +{ + rtx *loc; + rtx orig; + rtx newval; + rtx insn; +}; + /* Information about the dependency. */ struct _dep { @@ -215,18 +227,30 @@ struct _dep /* Consumer. */ rtx con; - /* Dependency major type. This field is superseded by STATUS below. - Though, it is still in place because some targets use it. */ - enum reg_note type; + /* If nonnull, holds a pointer to information about how to break the + dependency by making a replacement in one of the insns. There is + only one such dependency for each insn that must be modified in + order to break such a dependency. */ + struct dep_replacement *replace; /* Dependency status. This field holds all dependency types and additional information for speculative dependencies. */ ds_t status; - /* Cached cost of the dependency. */ - int cost; + /* Dependency major type. This field is superseded by STATUS above. + Though, it is still in place because some targets use it. */ + ENUM_BITFIELD(reg_note) type:6; + + unsigned nonreg:1; + unsigned multiple:1; + + /* Cached cost of the dependency. Make sure to update UNKNOWN_DEP_COST + when changing the size of this field. */ + int cost:20; }; +#define UNKNOWN_DEP_COST (-1<<19) + typedef struct _dep dep_def; typedef dep_def *dep_t; @@ -235,8 +259,9 @@ typedef dep_def *dep_t; #define DEP_TYPE(D) ((D)->type) #define DEP_STATUS(D) ((D)->status) #define DEP_COST(D) ((D)->cost) - -#define UNKNOWN_DEP_COST INT_MIN +#define DEP_NONREG(D) ((D)->nonreg) +#define DEP_MULTIPLE(D) ((D)->multiple) +#define DEP_REPLACE(D) ((D)->replace) /* Functions to work with dep. */ @@ -1047,7 +1072,11 @@ enum SPEC_TYPES_OFFSETS { Therefore, it can appear only in TODO_SPEC field of an instruction. */ #define HARD_DEP (DEP_CONTROL << 1) -#define DEP_CANCELLED (HARD_DEP << 1) +/* Set in the TODO_SPEC field of an instruction for which new_ready + has decided not to schedule it speculatively. */ +#define DEP_POSTPONED (HARD_DEP << 1) + +#define DEP_CANCELLED (DEP_POSTPONED << 1) /* This represents the results of calling sched-deps.c functions, which modify dependencies. */ @@ -1074,7 +1103,8 @@ enum SCHED_FLAGS { DO_SPECULATION = USE_DEPS_LIST << 1, DO_BACKTRACKING = DO_SPECULATION << 1, DO_PREDICATION = DO_BACKTRACKING << 1, - SCHED_RGN = DO_PREDICATION << 1, + DONT_BREAK_DEPENDENCIES = DO_PREDICATION << 1, + SCHED_RGN = DONT_BREAK_DEPENDENCIES << 1, SCHED_EBB = SCHED_RGN << 1, /* Scheduler can possibly create new basic blocks. Used for assertions. */ NEW_BBS = SCHED_EBB << 1, @@ -1406,6 +1436,8 @@ extern void dump_region_dot_file (const char *, int); extern void haifa_sched_init (void); extern void haifa_sched_finish (void); +extern void find_modifiable_mems (rtx, rtx); + /* sched-deps.c interface to walk, add, search, update, resolve, delete and debug instruction dependencies. */ |