aboutsummaryrefslogtreecommitdiff
path: root/gcc/regmove.c
diff options
context:
space:
mode:
authorBernd Schmidt <crux@pool.informatik.rwth-aachen.de>1998-10-01 13:00:52 -0600
committerJeff Law <law@gcc.gnu.org>1998-10-01 13:00:52 -0600
commit961d411902f6869f8539b9c0ef668855af08a100 (patch)
tree6c5b09b31e6a4d39b4498c5e90c9b043bfa812a7 /gcc/regmove.c
parent6f82f64bf664a17bc60f8f9e171212ed5df3a0ab (diff)
downloadgcc-961d411902f6869f8539b9c0ef668855af08a100.zip
gcc-961d411902f6869f8539b9c0ef668855af08a100.tar.gz
gcc-961d411902f6869f8539b9c0ef668855af08a100.tar.bz2
regmove.c (regmove_optimize): Add variable old_max_uid.
* regmove.c (regmove_optimize): Add variable old_max_uid. At the end of the function, update basic_block_end. From-SVN: r22724
Diffstat (limited to 'gcc/regmove.c')
-rw-r--r--gcc/regmove.c18
1 files changed, 16 insertions, 2 deletions
diff --git a/gcc/regmove.c b/gcc/regmove.c
index 7f94be4..41235f1 100644
--- a/gcc/regmove.c
+++ b/gcc/regmove.c
@@ -917,6 +917,7 @@ regmove_optimize (f, nregs, regmove_dump_file)
int nregs;
FILE *regmove_dump_file;
{
+ int old_max_uid = get_max_uid ();
rtx insn;
struct match match;
int pass;
@@ -926,8 +927,8 @@ regmove_optimize (f, nregs, regmove_dump_file)
regno_src_regno = (int *)alloca (sizeof *regno_src_regno * nregs);
for (i = nregs; --i >= 0; ) regno_src_regno[i] = -1;
- regmove_bb_head = (int *)alloca (sizeof (int) * (get_max_uid () + 1));
- for (i = get_max_uid (); i >= 0; i--) regmove_bb_head[i] = -1;
+ regmove_bb_head = (int *)alloca (sizeof (int) * (old_max_uid + 1));
+ for (i = old_max_uid; i >= 0; i--) regmove_bb_head[i] = -1;
for (i = 0; i < n_basic_blocks; i++)
regmove_bb_head[INSN_UID (basic_block_head[i])] = i;
@@ -1384,6 +1385,19 @@ regmove_optimize (f, nregs, regmove_dump_file)
}
}
#endif /* REGISTER_CONSTRAINTS */
+
+ /* In fixup_match_1, some insns may have been inserted after basic block
+ ends. Fix that here. */
+ for (i = 0; i < n_basic_blocks; i++)
+ {
+ rtx end = basic_block_end[i];
+ rtx new = end;
+ rtx next = NEXT_INSN (new);
+ while (next != 0 && INSN_UID (next) >= old_max_uid
+ && (i == n_basic_blocks - 1 || basic_block_head[i + 1] != next))
+ new = next, next = NEXT_INSN (new);
+ basic_block_end[i] = new;
+ }
}
/* Returns the INSN_CODE for INSN if its pattern has matching constraints for