diff options
author | Eric Christopher <echristo@gcc.gnu.org> | 2004-11-15 22:23:29 +0000 |
---|---|---|
committer | Eric Christopher <echristo@gcc.gnu.org> | 2004-11-15 22:23:29 +0000 |
commit | 4c2b2906b0c14c2af7abe20f00ec2b4fcf643a4c (patch) | |
tree | 96ada1c0418c242be55dd6a1184854623bd4563d /gcc/sched-deps.c | |
parent | 37b2f2904b3320e3775a2bbd219623c15b6a974e (diff) | |
download | gcc-4c2b2906b0c14c2af7abe20f00ec2b4fcf643a4c.zip gcc-4c2b2906b0c14c2af7abe20f00ec2b4fcf643a4c.tar.gz gcc-4c2b2906b0c14c2af7abe20f00ec2b4fcf643a4c.tar.bz2 |
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
Diffstat (limited to 'gcc/sched-deps.c')
-rw-r--r-- | gcc/sched-deps.c | 72 |
1 files changed, 54 insertions, 18 deletions
diff --git a/gcc/sched-deps.c b/gcc/sched-deps.c index 5dc9205..0d916c6 100644 --- a/gcc/sched-deps.c +++ b/gcc/sched-deps.c @@ -94,7 +94,8 @@ static bitmap_head *forward_dependency_cache; static int deps_may_trap_p (rtx); static void add_dependence_list (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 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) } } -/* Set SCHED_GROUP_P and care for the rest of the bookkeeping that - goes along with that. */ +/* Clear all dependencies for an insn. */ 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 + + free_INSN_LIST_list (&LOG_LINKS (insn)); +} + +/* 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; - prev = prev_nonnote_insn (insn); - add_dependence (insn, prev, REG_DEP_ANTI); + 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 @@ -643,7 +680,7 @@ sched_analyze_2 (struct deps *deps, rtx x, rtx insn) #ifdef HAVE_cc0 case CC0: /* 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 same flag for previous CC0 users which is safe). */ CANT_MOVE (prev_nonnote_insn (insn)) = 1; @@ -1112,7 +1149,7 @@ sched_analyze_insn (struct deps *deps, rtx x, rtx insn, rtx loop_notes) if (deps->libcall_block_tail_insn) { - set_sched_group_p (insn); + SCHED_GROUP_P (insn) = 1; CANT_MOVE (insn) = 1; } @@ -1158,15 +1195,10 @@ sched_analyze_insn (struct deps *deps, rtx x, rtx insn, rtx loop_notes) if (src_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) - { - SCHED_GROUP_P (insn) = 1; - deps->in_post_call_group_p = post_call; - } - else - set_sched_group_p (insn); + deps->in_post_call_group_p = post_call; + + SCHED_GROUP_P (insn) = 1; CANT_MOVE (insn) = 1; } else @@ -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; } } + + /* 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 |