From 5ca0f2c2c1567124c5e21770e299af9e6b65d77d Mon Sep 17 00:00:00 2001
From: rth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Date: Sun, 27 Jun 1999 02:39:42 +0000
Subject: [PATCH] * jump.c (jump_optimize_1): Validate the cmov copy to a
 temporary.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@27788 138bc75d-0d04-0410-961f-82ee72b054a4
---
 gcc/ChangeLog |  4 ++++
 gcc/jump.c    | 57 ++++++++++++++++++++++++++++++++++-----------------
 2 files changed, 42 insertions(+), 19 deletions(-)

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 3261f65daf54..0426f63c87a0 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.
diff --git a/gcc/jump.c b/gcc/jump.c
index 6b6a90ae3a94..295a6c117ba6 100644
--- a/gcc/jump.c
+++ b/gcc/jump.c
@@ -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 ();
-- 
GitLab