diff options
author | Richard Henderson <rth@cygnus.com> | 1999-06-26 19:39:42 -0700 |
---|---|---|
committer | Richard Henderson <rth@gcc.gnu.org> | 1999-06-26 19:39:42 -0700 |
commit | 9da8a3ae97750a437a1197bdafdae642db7471fb (patch) | |
tree | 8ef276fb052001318201c67c3e0a143259d26b4a | |
parent | e2b2063128ae9c2302f5a63e6237c17f5b3e79aa (diff) | |
download | gcc-9da8a3ae97750a437a1197bdafdae642db7471fb.zip gcc-9da8a3ae97750a437a1197bdafdae642db7471fb.tar.gz gcc-9da8a3ae97750a437a1197bdafdae642db7471fb.tar.bz2 |
* jump.c (jump_optimize_1): Validate the cmov copy to a temporary.
From-SVN: r27788
-rw-r--r-- | gcc/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/jump.c | 57 |
2 files changed, 42 insertions, 19 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3261f65..0426f63 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,7 @@ +Sun Jun 27 02:39:08 1999 Richard Henderson <rth@cygnus.com> + + * jump.c (jump_optimize_1): Validate the cmov copy to a temporary. + Sat Jun 26 17:18:18 1999 David Edelsohn <edelsohn@gnu.org> * rs6000.c (print_operand, case 'L'): Use plus_constant_for_output. @@ -970,7 +970,8 @@ jump_optimize_1 (f, cross_jump, noop_moves, after_regscan, mark_labels_only) if (target) { - rtx seq1,seq2,last; + rtx seq1, seq2, last; + int copy_ok; /* Save the conditional move sequence but don't emit it yet. On some machines, like the alpha, it is possible @@ -980,8 +981,9 @@ jump_optimize_1 (f, cross_jump, noop_moves, after_regscan, mark_labels_only) seq2 = get_insns (); end_sequence (); - /* Now that we can't fail, generate the copy insns that - preserve the compared values. */ + /* "Now that we can't fail..." Famous last words. + Generate the copy insns that preserve the compared + values. */ start_sequence (); emit_move_insn (cond0, XEXP (temp4, 0)); if (cond1 != XEXP (temp4, 1)) @@ -989,25 +991,42 @@ jump_optimize_1 (f, cross_jump, noop_moves, after_regscan, mark_labels_only) seq1 = get_insns (); end_sequence (); - emit_insns_before (seq1, temp5); - /* Insert conditional move after insn, to be sure that - the jump and a possible compare won't be separated */ - last = emit_insns_after (seq2, insn); - - /* ??? We can also delete the insn that sets X to A. - Flow will do it too though. */ - delete_insn (temp); - next = NEXT_INSN (insn); - delete_jump (insn); + /* Validate the sequence -- this may be some weird + bit-extract-and-test instruction for which there + exists no complimentary bit-extract insn. */ + copy_ok = 1; + for (last = seq1; last ; last = NEXT_INSN (last)) + if (recog_memoized (last) < 0) + { + copy_ok = 0; + break; + } - if (after_regscan) + if (copy_ok) { - reg_scan_update (seq1, NEXT_INSN (last), old_max_reg); - old_max_reg = max_reg_num (); + emit_insns_before (seq1, temp5); + + /* Insert conditional move after insn, to be sure + that the jump and a possible compare won't be + separated. */ + last = emit_insns_after (seq2, insn); + + /* ??? We can also delete the insn that sets X to A. + Flow will do it too though. */ + delete_insn (temp); + next = NEXT_INSN (insn); + delete_jump (insn); + + if (after_regscan) + { + reg_scan_update (seq1, NEXT_INSN (last), + old_max_reg); + old_max_reg = max_reg_num (); + } + + changed = 1; + continue; } - - changed = 1; - continue; } else end_sequence (); |