aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJim Wilson <wilson@gcc.gnu.org>1994-02-06 13:26:28 -0800
committerJim Wilson <wilson@gcc.gnu.org>1994-02-06 13:26:28 -0800
commit438be795a5e2bc261ca4f9d4b9117052dd1cc9a8 (patch)
tree7cada14ca317ae46ddb838086734083fde4b8ad9
parentcb6c1cf1cffc357b1b0e306eb04bed6377c000c3 (diff)
downloadgcc-438be795a5e2bc261ca4f9d4b9117052dd1cc9a8.zip
gcc-438be795a5e2bc261ca4f9d4b9117052dd1cc9a8.tar.gz
gcc-438be795a5e2bc261ca4f9d4b9117052dd1cc9a8.tar.bz2
(reg_pending_sets, reg_pending_sets_all): New variables.
(sched_analyze_1): Set reg_pending_sets instead of reg_last_sets. (sched_analyze_2): Set reg_pending_sets or reg_pending_sets_all instead of reg_last_sets. (sched_analyze_insn): Use reg_pending_sets and reg_pending_sets_all to set reg_last_sets. Set reg_pending_sets_all instead of reg_last_sets. (schedule_block): Allocate and clear reg_pending_sets. From-SVN: r6492
-rw-r--r--gcc/sched.c39
1 files changed, 34 insertions, 5 deletions
diff --git a/gcc/sched.c b/gcc/sched.c
index ea10959..26b3d30 100644
--- a/gcc/sched.c
+++ b/gcc/sched.c
@@ -142,6 +142,8 @@ static int *sched_reg_live_length;
by splitting insns. */
static rtx *reg_last_uses;
static rtx *reg_last_sets;
+static regset reg_pending_sets;
+static int reg_pending_sets_all;
/* Vector indexed by INSN_UID giving the original ordering of the insns. */
static int *insn_luid;
@@ -1688,7 +1690,8 @@ sched_analyze_1 (x, insn)
if (reg_last_sets[regno + i])
add_dependence (insn, reg_last_sets[regno + i],
REG_DEP_OUTPUT);
- reg_last_sets[regno + i] = insn;
+ reg_pending_sets[(regno + i) / REGSET_ELT_BITS]
+ |= (REGSET_ELT_TYPE) 1 << ((regno + i) % REGSET_ELT_BITS);
if ((call_used_regs[i] || global_regs[i])
&& last_function_call)
/* Function calls clobber all call_used regs. */
@@ -1704,7 +1707,8 @@ sched_analyze_1 (x, insn)
reg_last_uses[regno] = 0;
if (reg_last_sets[regno])
add_dependence (insn, reg_last_sets[regno], REG_DEP_OUTPUT);
- reg_last_sets[regno] = insn;
+ reg_pending_sets[regno / REGSET_ELT_BITS]
+ |= (REGSET_ELT_TYPE) 1 << (regno % REGSET_ELT_BITS);
/* Pseudos that are REG_EQUIV to something may be replaced
by that during reloading. We need only add dependencies for
@@ -1951,8 +1955,8 @@ sched_analyze_2 (x, insn)
reg_last_uses[i] = 0;
if (reg_last_sets[i])
add_dependence (insn, reg_last_sets[i], 0);
- reg_last_sets[i] = insn;
}
+ reg_pending_sets_all = 1;
flush_pending_lists (insn);
}
@@ -2006,6 +2010,8 @@ sched_analyze_insn (x, insn)
{
register RTX_CODE code = GET_CODE (x);
rtx link;
+ int maxreg = max_reg_num ();
+ int i;
if (code == SET || code == CLOBBER)
sched_analyze_1 (x, insn);
@@ -2045,6 +2051,25 @@ sched_analyze_insn (x, insn)
sched_analyze_2 (XEXP (note, 0), insn);
}
+ for (i = 0; i < regset_size; i++)
+ {
+ REGSET_ELT_TYPE sets = reg_pending_sets[i];
+ if (sets)
+ {
+ register int bit;
+ for (bit = 0; bit < REGSET_ELT_BITS; bit++)
+ if (sets & ((REGSET_ELT_TYPE) 1 << bit))
+ reg_last_sets[i * REGSET_ELT_BITS + bit] = insn;
+ reg_pending_sets[i] = 0;
+ }
+ }
+ if (reg_pending_sets_all)
+ {
+ for (i = 0; i < maxreg; i++)
+ reg_last_sets[i] = insn;
+ reg_pending_sets_all = 0;
+ }
+
/* Handle function calls and function returns created by the epilogue
threading code. */
if (GET_CODE (insn) == CALL_INSN || GET_CODE (insn) == JUMP_INSN)
@@ -2132,8 +2157,8 @@ sched_analyze (head, tail)
reg_last_uses[i] = 0;
if (reg_last_sets[i])
add_dependence (insn, reg_last_sets[i], 0);
- reg_last_sets[i] = insn;
}
+ reg_pending_sets_all = 1;
/* Add a fake REG_NOTE which we will later convert
back into a NOTE_INSN_SETJMP note. */
@@ -2150,7 +2175,8 @@ sched_analyze (head, tail)
reg_last_uses[i] = 0;
if (reg_last_sets[i])
add_dependence (insn, reg_last_sets[i], REG_DEP_ANTI);
- reg_last_sets[i] = insn;
+ reg_pending_sets[i / REGSET_ELT_BITS]
+ |= (REGSET_ELT_TYPE) 1 << (i % REGSET_ELT_BITS);
}
}
@@ -3042,6 +3068,9 @@ schedule_block (b, file)
bzero (reg_last_uses, i * sizeof (rtx));
reg_last_sets = (rtx *) alloca (i * sizeof (rtx));
bzero (reg_last_sets, i * sizeof (rtx));
+ reg_pending_sets = (regset) alloca (regset_bytes);
+ bzero (reg_pending_sets, regset_bytes);
+ reg_pending_sets_all = 0;
clear_units ();
/* Remove certain insns at the beginning from scheduling,