aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrey Belevantsev <abel@ispras.ru>2008-02-27 14:52:30 +0000
committerAndrey Belevantsev <abel@ispras.ru>2008-02-27 14:52:30 +0000
commitda561541101fae297f7588c817938df2a8ec9e27 (patch)
treebee55fc561471efa561b8d5e0504e6a8241cf29a
parenta147393dc65685dbd9dcc71936a203a5a766f2db (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-sched10
-rw-r--r--gcc/sched-deps.c15
-rw-r--r--gcc/sched-int.h13
-rw-r--r--gcc/sel-sched-ir.c6
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);