aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJ"orn Rennecke <amylaar@cygnus.co.uk>1998-09-16 06:49:57 +0000
committerJoern Rennecke <amylaar@gcc.gnu.org>1998-09-16 07:49:57 +0100
commit1a8fca8acca89b7f57c3d855eda0a545d8b3ec42 (patch)
tree0f820d13dd3772f8291d556437e4e4e2191545b3
parent905a3d661512f4255d1cf7da882de7270d25af59 (diff)
downloadgcc-1a8fca8acca89b7f57c3d855eda0a545d8b3ec42.zip
gcc-1a8fca8acca89b7f57c3d855eda0a545d8b3ec42.tar.gz
gcc-1a8fca8acca89b7f57c3d855eda0a545d8b3ec42.tar.bz2
regmove.c (copy_src_to_dest): Don't copy if that requires (a) new register(s).
* regmove.c (copy_src_to_dest): Don't copy if that requires (a) new register(s). From-SVN: r22448
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/regmove.c15
2 files changed, 18 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index ddb36b3..dcd0e88 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+Wed Sep 16 14:47:43 1998 J"orn Rennecke <amylaar@cygnus.co.uk>
+
+ * regmove.c (copy_src_to_dest): Don't copy if that requires
+ (a) new register(s).
+
Wed Sep 16 01:29:12 1998 Bernd Schmidt <crux@pool.informatik.rwth-aachen.de>
* global.c (reg_allocno): Now static.
diff --git a/gcc/regmove.c b/gcc/regmove.c
index 8df75e5..d8dec1f 100644
--- a/gcc/regmove.c
+++ b/gcc/regmove.c
@@ -617,14 +617,25 @@ copy_src_to_dest (insn, src, dest, loop_depth)
&& GET_CODE (dest) == REG
&& REG_LIVE_LENGTH (REGNO (dest)) > 0
&& (set = single_set (insn)) != NULL_RTX
- && !reg_mentioned_p (dest, SET_SRC (set))
- && validate_replace_rtx (src, dest, insn))
+ && !reg_mentioned_p (dest, SET_SRC (set)))
{
+ int old_num_regs = reg_rtx_no;
+
/* Generate the src->dest move. */
start_sequence ();
emit_move_insn (dest, src);
seq = gen_sequence ();
end_sequence ();
+ /* If this sequence uses new registers, we may not use it. */
+ if (old_num_regs != reg_rtx_no
+ || ! validate_replace_rtx (src, dest, insn))
+ {
+ /* We have to restore reg_rtx_no to its old value, lest
+ recompute_reg_usage will try to compute the usage of the
+ new regs, yet reg_n_info is not valid for them. */
+ reg_rtx_no = old_num_regs;
+ return;
+ }
emit_insn_before (seq, insn);
move_insn = PREV_INSN (insn);
p_move_notes = &REG_NOTES (move_insn);