summaryrefslogtreecommitdiff
path: root/gcc/sched-rgn.c
diff options
context:
space:
mode:
authorrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>2001-01-09 17:45:12 +0000
committerrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>2001-01-09 17:45:12 +0000
commit749c6f584b30dbc81917b4f445f30000fadc5ce6 (patch)
tree1fe02ec542bf787c44dd766982d749861c7780fc /gcc/sched-rgn.c
parent63d882f5c31bae97ab2ee924f980899641e7a2ec (diff)
downloadgcc-749c6f584b30dbc81917b4f445f30000fadc5ce6.tar.gz
* sched-int.h (struct deps): Add max_reg, reg_last_in_use; merge
reg_last_uses, reg_last_sets, reg_last_clobbers into struct deps_reg. * sched-deps.c (sched_analyze_1): Update uses of struct deps. (sched_analyze_2, sched_analyze_insn): Likewise. (sched_analyze, init_deps): Likewise. (free_deps): Likewise. Iterate with EXECUTE_IF_SET_IN_REG_SET. * sched-rgn.c (propagate_deps): Likewise. Remove max_reg argument. (compute_block_backward_dependences): Update propagate_deps call. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@38835 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/sched-rgn.c')
-rw-r--r--gcc/sched-rgn.c96
1 files changed, 31 insertions, 65 deletions
diff --git a/gcc/sched-rgn.c b/gcc/sched-rgn.c
index fa7efcfc771..13c358816b7 100644
--- a/gcc/sched-rgn.c
+++ b/gcc/sched-rgn.c
@@ -304,7 +304,7 @@ void debug_dependencies PARAMS ((void));
static void init_regions PARAMS ((void));
static void schedule_region PARAMS ((int));
-static void propagate_deps PARAMS ((int, struct deps *, int));
+static void propagate_deps PARAMS ((int, struct deps *));
static void free_pending_lists PARAMS ((void));
/* Functions for construction of the control flow graph. */
@@ -2440,13 +2440,11 @@ add_branch_dependences (head, tail)
static struct deps *bb_deps;
/* After computing the dependencies for block BB, propagate the dependencies
- found in TMP_DEPS to the successors of the block. MAX_REG is the number
- of registers. */
+ found in TMP_DEPS to the successors of the block. */
static void
-propagate_deps (bb, tmp_deps, max_reg)
+propagate_deps (bb, tmp_deps)
int bb;
struct deps *tmp_deps;
- int max_reg;
{
int b = BB_TO_BLOCK (bb);
int e, first_edge;
@@ -2481,43 +2479,28 @@ propagate_deps (bb, tmp_deps, max_reg)
continue;
}
- for (reg = 0; reg < max_reg; reg++)
+ /* The reg_last lists are inherited by bb_succ. */
+ EXECUTE_IF_SET_IN_REG_SET (&tmp_deps->reg_last_in_use, 0, reg,
{
- /* reg-last-uses lists are inherited by bb_succ. */
- for (u = tmp_deps->reg_last_uses[reg]; u; u = XEXP (u, 1))
- {
- if (find_insn_list (XEXP (u, 0),
- succ_deps->reg_last_uses[reg]))
- continue;
-
- succ_deps->reg_last_uses[reg]
- = alloc_INSN_LIST (XEXP (u, 0),
- succ_deps->reg_last_uses[reg]);
- }
-
- /* reg-last-defs lists are inherited by bb_succ. */
- for (u = tmp_deps->reg_last_sets[reg]; u; u = XEXP (u, 1))
- {
- if (find_insn_list (XEXP (u, 0),
- succ_deps->reg_last_sets[reg]))
- continue;
-
- succ_deps->reg_last_sets[reg]
- = alloc_INSN_LIST (XEXP (u, 0),
- succ_deps->reg_last_sets[reg]);
- }
-
- for (u = tmp_deps->reg_last_clobbers[reg]; u; u = XEXP (u, 1))
- {
- if (find_insn_list (XEXP (u, 0),
- succ_deps->reg_last_clobbers[reg]))
- continue;
-
- succ_deps->reg_last_clobbers[reg]
- = alloc_INSN_LIST (XEXP (u, 0),
- succ_deps->reg_last_clobbers[reg]);
- }
- }
+ struct deps_reg *tmp_deps_reg = &tmp_deps->reg_last[reg];
+ struct deps_reg *succ_deps_reg = &succ_deps->reg_last[reg];
+
+ for (u = tmp_deps_reg->uses; u; u = XEXP (u, 1))
+ if (! find_insn_list (XEXP (u, 0), succ_deps_reg->uses))
+ succ_deps_reg->uses
+ = alloc_INSN_LIST (XEXP (u, 0), succ_deps_reg->uses);
+
+ for (u = tmp_deps_reg->sets; u; u = XEXP (u, 1))
+ if (! find_insn_list (XEXP (u, 0), succ_deps_reg->sets))
+ succ_deps_reg->sets
+ = alloc_INSN_LIST (XEXP (u, 0), succ_deps_reg->sets);
+
+ for (u = tmp_deps_reg->clobbers; u; u = XEXP (u, 1))
+ if (! find_insn_list (XEXP (u, 0), succ_deps_reg->clobbers))
+ succ_deps_reg->clobbers
+ = alloc_INSN_LIST (XEXP (u, 0), succ_deps_reg->clobbers);
+ });
+ IOR_REG_SET (&succ_deps->reg_last_in_use, &tmp_deps->reg_last_in_use);
/* Mem read/write lists are inherited by bb_succ. */
link_insn = tmp_deps->pending_read_insns;
@@ -2554,27 +2537,17 @@ propagate_deps (bb, tmp_deps, max_reg)
/* last_function_call is inherited by bb_succ. */
for (u = tmp_deps->last_function_call; u; u = XEXP (u, 1))
- {
- if (find_insn_list (XEXP (u, 0),
- succ_deps->last_function_call))
- continue;
-
+ if (! find_insn_list (XEXP (u, 0), succ_deps->last_function_call))
succ_deps->last_function_call
- = alloc_INSN_LIST (XEXP (u, 0),
- succ_deps->last_function_call);
- }
+ = alloc_INSN_LIST (XEXP (u, 0), succ_deps->last_function_call);
/* last_pending_memory_flush is inherited by bb_succ. */
for (u = tmp_deps->last_pending_memory_flush; u; u = XEXP (u, 1))
- {
- if (find_insn_list (XEXP (u, 0),
+ if (! find_insn_list (XEXP (u, 0),
succ_deps->last_pending_memory_flush))
- continue;
-
succ_deps->last_pending_memory_flush
= alloc_INSN_LIST (XEXP (u, 0),
succ_deps->last_pending_memory_flush);
- }
/* sched_before_next_call is inherited by bb_succ. */
x = LOG_LINKS (tmp_deps->sched_before_next_call);
@@ -2594,8 +2567,8 @@ propagate_deps (bb, tmp_deps, max_reg)
Specifically for reg-reg data dependences, the block insns are
scanned by sched_analyze () top-to-bottom. Two lists are
- maintained by sched_analyze (): reg_last_sets[] for register DEFs,
- and reg_last_uses[] for register USEs.
+ maintained by sched_analyze (): reg_last[].sets for register DEFs,
+ and reg_last[].uses for register USEs.
When analysis is completed for bb, we update for its successors:
; - DEFS[succ] = Union (DEFS [succ], DEFS [bb])
@@ -2609,7 +2582,6 @@ compute_block_backward_dependences (bb)
int bb;
{
rtx head, tail;
- int max_reg = max_reg_num ();
struct deps tmp_deps;
tmp_deps = bb_deps[bb];
@@ -2620,18 +2592,12 @@ compute_block_backward_dependences (bb)
add_branch_dependences (head, tail);
if (current_nr_blocks > 1)
- propagate_deps (bb, &tmp_deps, max_reg);
+ propagate_deps (bb, &tmp_deps);
/* Free up the INSN_LISTs. */
free_deps (&tmp_deps);
-
- /* Assert that we won't need bb_reg_last_* for this block anymore.
- The vectors we're zeroing out have just been freed by the call to
- free_deps. */
- bb_deps[bb].reg_last_uses = 0;
- bb_deps[bb].reg_last_sets = 0;
- bb_deps[bb].reg_last_clobbers = 0;
}
+
/* Remove all INSN_LISTs and EXPR_LISTs from the pending lists and add
them to the unused_*_list variables, so that they can be reused. */