diff options
author | J"orn Rennecke <amylaar@cygnus.co.uk> | 1998-09-16 06:49:57 +0000 |
---|---|---|
committer | Joern Rennecke <amylaar@gcc.gnu.org> | 1998-09-16 07:49:57 +0100 |
commit | 1a8fca8acca89b7f57c3d855eda0a545d8b3ec42 (patch) | |
tree | 0f820d13dd3772f8291d556437e4e4e2191545b3 /gcc | |
parent | 905a3d661512f4255d1cf7da882de7270d25af59 (diff) | |
download | gcc-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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/regmove.c | 15 |
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 = ®_NOTES (move_insn); |