diff options
author | Andrey Belevantsev <abel@ispras.ru> | 2008-02-27 14:52:30 +0000 |
---|---|---|
committer | Andrey Belevantsev <abel@ispras.ru> | 2008-02-27 14:52:30 +0000 |
commit | da561541101fae297f7588c817938df2a8ec9e27 (patch) | |
tree | bee55fc561471efa561b8d5e0504e6a8241cf29a | |
parent | a147393dc65685dbd9dcc71936a203a5a766f2db (diff) |
* sched-int.h (struct deps): New field last_reg_pending_barrier.
(enum reg_pending_barrier_mode): Move from ...
* sched-deps.c: ... here.
(sched_analyze_insn): Set last_reg_pending_barrier of the context.
(init_deps): Init last_reg_pending_barrier.
* sel-sched-ir.c (has_dependence_p): When last_reg_pending_barrier
is set, mark insn->expr pair as having DEPS_IN_INSN dependency.
git-svn-id: https://gcc.gnu.org/svn/gcc/branches/sel-sched-branch@132715 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ChangeLog.sel-sched | 10 | ||||
-rw-r--r-- | gcc/sched-deps.c | 15 | ||||
-rw-r--r-- | gcc/sched-int.h | 13 | ||||
-rw-r--r-- | gcc/sel-sched-ir.c | 6 |
4 files changed, 31 insertions, 13 deletions
diff --git a/gcc/ChangeLog.sel-sched b/gcc/ChangeLog.sel-sched index 4e3b60dc458..b63268da211 100644 --- a/gcc/ChangeLog.sel-sched +++ b/gcc/ChangeLog.sel-sched @@ -1,5 +1,15 @@ 2008-02-26 Andrey Belevantsev <abel@ispras.ru> + * sched-int.h (struct deps): New field last_reg_pending_barrier. + (enum reg_pending_barrier_mode): Move from ... + * sched-deps.c: ... here. + (sched_analyze_insn): Set last_reg_pending_barrier of the context. + (init_deps): Init last_reg_pending_barrier. + * sel-sched-ir.c (has_dependence_p): When last_reg_pending_barrier + is set, mark insn->expr pair as having DEPS_IN_INSN dependency. + +2008-02-26 Andrey Belevantsev <abel@ispras.ru> + * haifa-sched.c (haifa_init_insn): Extend dependency caches for a new insn. 2008-01-11 Dmitry Melnik <dm@ispras.ru> diff --git a/gcc/sched-deps.c b/gcc/sched-deps.c index 18e427fb73f..53607a72e77 100644 --- a/gcc/sched-deps.c +++ b/gcc/sched-deps.c @@ -396,17 +396,6 @@ clear_deps_list (deps_list_t l) static regset reg_pending_sets; static regset reg_pending_clobbers; static regset reg_pending_uses; - -/* The following enumeration values tell us what dependencies we - should use to implement the barrier. We use true-dependencies for - TRUE_BARRIER and anti-dependencies for MOVE_BARRIER. */ -enum reg_pending_barrier_mode -{ - NOT_A_BARRIER = 0, - MOVE_BARRIER, - TRUE_BARRIER -}; - static enum reg_pending_barrier_mode reg_pending_barrier; /* To speed up the test for duplicate dependency links we keep a @@ -2419,6 +2408,9 @@ sched_analyze_insn (struct deps *deps, rtx x, rtx insn) IOR_REG_SET (&deps->reg_last_in_use, reg_pending_uses); IOR_REG_SET (&deps->reg_last_in_use, reg_pending_clobbers); IOR_REG_SET (&deps->reg_last_in_use, reg_pending_sets); + + /* Set up the pending barrier found. */ + deps->last_reg_pending_barrier = reg_pending_barrier; } CLEAR_REG_SET (reg_pending_uses); @@ -2876,6 +2868,7 @@ init_deps (struct deps *deps) deps->sched_before_next_call = 0; deps->in_post_call_group_p = not_post_call; deps->libcall_block_tail_insn = 0; + deps->last_reg_pending_barrier = NOT_A_BARRIER; deps->readonly = 0; } diff --git a/gcc/sched-int.h b/gcc/sched-int.h index b6c4209fd99..4798ef73893 100644 --- a/gcc/sched-int.h +++ b/gcc/sched-int.h @@ -423,6 +423,16 @@ struct _dep_node #define DEP_NODE_DEP(N) (&(N)->dep) #define DEP_NODE_FORW(N) (&(N)->forw) +/* The following enumeration values tell us what dependencies we + should use to implement the barrier. We use true-dependencies for + TRUE_BARRIER and anti-dependencies for MOVE_BARRIER. */ +enum reg_pending_barrier_mode +{ + NOT_A_BARRIER = 0, + MOVE_BARRIER, + TRUE_BARRIER +}; + /* Describe state of dependencies used during sched_analyze phase. */ struct deps { @@ -518,6 +528,9 @@ struct deps /* 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; + /* True when this context should be treated as a readonly by the analysis. */ BOOL_BITFIELD readonly : 1; diff --git a/gcc/sel-sched-ir.c b/gcc/sel-sched-ir.c index 533703858af..20f10cf2fa1 100644 --- a/gcc/sel-sched-ir.c +++ b/gcc/sel-sched-ir.c @@ -3100,10 +3100,12 @@ has_dependence_p (rhs_t rhs, insn_t pred, ds_t **has_dep_pp) deps_analyze_insn (dc, RHS_INSN (rhs)); has_dependence_data.dc = NULL; + /* When a barrier was found, set DEPS_IN_INSN bits. */ + if (dc->last_reg_pending_barrier == TRUE_BARRIER) + has_dependence_data.has_dep_p[DEPS_IN_INSN] = DEP_TRUE; + *has_dep_pp = has_dependence_data.has_dep_p; - ds = 0; - for (i = 0; i < DEPS_IN_NOWHERE; i++) ds = ds_full_merge (ds, has_dependence_data.has_dep_p[i], NULL_RTX, NULL_RTX); |