Commit 4c2b2906 by Eric Christopher

sched-deps.c (set_sched_group_p): Delete.

2004-11-15  Eric Christopher  <echristo@redhat.com>

	* sched-deps.c (set_sched_group_p): Delete.
	(delete_all_dependencies): New function.
	(fixup_sched_groups): Use. New function.
	(sched_analyze_insn): Use.

From-SVN: r90698
parent 37b2f290
2004-11-15 Eric Christopher <echristo@redhat.com>
* sched-deps.c (set_sched_group_p): Delete.
(delete_all_dependencies): New function.
(fixup_sched_groups): Use. New function.
(sched_analyze_insn): Use.
2004-11-15 Joseph S. Myers <joseph@codesourcery.com> 2004-11-15 Joseph S. Myers <joseph@codesourcery.com>
* c-common.c (binary_op_error): Don't allow LROTATE_EXPR, * c-common.c (binary_op_error): Don't allow LROTATE_EXPR,
......
...@@ -94,7 +94,8 @@ static bitmap_head *forward_dependency_cache; ...@@ -94,7 +94,8 @@ static bitmap_head *forward_dependency_cache;
static int deps_may_trap_p (rtx); static int deps_may_trap_p (rtx);
static void add_dependence_list (rtx, rtx, enum reg_note); static void add_dependence_list (rtx, rtx, enum reg_note);
static void add_dependence_list_and_free (rtx, rtx *, enum reg_note); static void add_dependence_list_and_free (rtx, rtx *, enum reg_note);
static void set_sched_group_p (rtx); static void delete_all_dependences (rtx);
static void fixup_sched_groups (rtx);
static void flush_pending_lists (struct deps *, rtx, int, int); static void flush_pending_lists (struct deps *, rtx, int, int);
static void sched_analyze_1 (struct deps *, rtx, rtx); static void sched_analyze_1 (struct deps *, rtx, rtx);
...@@ -369,18 +370,54 @@ add_dependence_list_and_free (rtx insn, rtx *listp, enum reg_note dep_type) ...@@ -369,18 +370,54 @@ add_dependence_list_and_free (rtx insn, rtx *listp, enum reg_note dep_type)
} }
} }
/* Set SCHED_GROUP_P and care for the rest of the bookkeeping that /* Clear all dependencies for an insn. */
goes along with that. */
static void static void
set_sched_group_p (rtx insn) delete_all_dependences (rtx insn)
{ {
rtx prev; /* Clear caches, if they exist, as well as free the dependence. */
SCHED_GROUP_P (insn) = 1; #ifdef INSN_SCHEDULING
if (true_dependency_cache != NULL)
{
bitmap_clear (&true_dependency_cache[INSN_LUID (insn)]);
bitmap_clear (&anti_dependency_cache[INSN_LUID (insn)]);
bitmap_clear (&output_dependency_cache[INSN_LUID (insn)]);
}
#endif
prev = prev_nonnote_insn (insn); free_INSN_LIST_list (&LOG_LINKS (insn));
add_dependence (insn, prev, REG_DEP_ANTI); }
/* All insns in a scheduling group except the first should only have
dependencies on the previous insn in the group. So we find the
first instruction in the scheduling group by walking the dependence
chains backwards. Then we add the dependencies for the group to
the previous nonnote insn. */
static void
fixup_sched_groups (rtx insn)
{
rtx link;
for (link = LOG_LINKS (insn); link ; link = XEXP (link, 1))
{
rtx i = insn;
do
{
i = prev_nonnote_insn (i);
if (XEXP (link, 0) == i)
goto next_link;
} while (SCHED_GROUP_P (i));
add_dependence (i, XEXP (link, 0), REG_NOTE_KIND (link));
next_link:;
}
delete_all_dependences (insn);
if (BLOCK_FOR_INSN (insn) == BLOCK_FOR_INSN (prev_nonnote_insn (insn)))
add_dependence (insn, prev_nonnote_insn (insn), REG_DEP_ANTI);
} }
/* Process an insn's memory dependencies. There are four kinds of /* Process an insn's memory dependencies. There are four kinds of
...@@ -643,7 +680,7 @@ sched_analyze_2 (struct deps *deps, rtx x, rtx insn) ...@@ -643,7 +680,7 @@ sched_analyze_2 (struct deps *deps, rtx x, rtx insn)
#ifdef HAVE_cc0 #ifdef HAVE_cc0
case CC0: case CC0:
/* User of CC0 depends on immediately preceding insn. */ /* User of CC0 depends on immediately preceding insn. */
set_sched_group_p (insn); SCHED_GROUP_P (insn) = 1;
/* Don't move CC0 setter to another block (it can set up the /* Don't move CC0 setter to another block (it can set up the
same flag for previous CC0 users which is safe). */ same flag for previous CC0 users which is safe). */
CANT_MOVE (prev_nonnote_insn (insn)) = 1; CANT_MOVE (prev_nonnote_insn (insn)) = 1;
...@@ -1112,7 +1149,7 @@ sched_analyze_insn (struct deps *deps, rtx x, rtx insn, rtx loop_notes) ...@@ -1112,7 +1149,7 @@ sched_analyze_insn (struct deps *deps, rtx x, rtx insn, rtx loop_notes)
if (deps->libcall_block_tail_insn) if (deps->libcall_block_tail_insn)
{ {
set_sched_group_p (insn); SCHED_GROUP_P (insn) = 1;
CANT_MOVE (insn) = 1; CANT_MOVE (insn) = 1;
} }
...@@ -1158,15 +1195,10 @@ sched_analyze_insn (struct deps *deps, rtx x, rtx insn, rtx loop_notes) ...@@ -1158,15 +1195,10 @@ sched_analyze_insn (struct deps *deps, rtx x, rtx insn, rtx loop_notes)
if (src_regno < FIRST_PSEUDO_REGISTER if (src_regno < FIRST_PSEUDO_REGISTER
|| dest_regno < FIRST_PSEUDO_REGISTER) || dest_regno < FIRST_PSEUDO_REGISTER)
{ {
/* If we are inside a post-call group right at the start of the
scheduling region, we must not add a dependency. */
if (deps->in_post_call_group_p == post_call_initial) if (deps->in_post_call_group_p == post_call_initial)
{
SCHED_GROUP_P (insn) = 1;
deps->in_post_call_group_p = post_call; deps->in_post_call_group_p = post_call;
}
else SCHED_GROUP_P (insn) = 1;
set_sched_group_p (insn);
CANT_MOVE (insn) = 1; CANT_MOVE (insn) = 1;
} }
else else
...@@ -1175,6 +1207,10 @@ sched_analyze_insn (struct deps *deps, rtx x, rtx insn, rtx loop_notes) ...@@ -1175,6 +1207,10 @@ sched_analyze_insn (struct deps *deps, rtx x, rtx insn, rtx loop_notes)
deps->in_post_call_group_p = not_post_call; deps->in_post_call_group_p = not_post_call;
} }
} }
/* Fixup the dependencies in the sched group. */
if (SCHED_GROUP_P (insn))
fixup_sched_groups (insn);
} }
/* Analyze every insn between HEAD and TAIL inclusive, creating LOG_LINKS /* Analyze every insn between HEAD and TAIL inclusive, creating LOG_LINKS
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment