* jump.c (jump_optimize_1): Validate the cmov copy to a temporary.
authorRichard Henderson <rth@cygnus.com>
Sun, 27 Jun 1999 02:39:42 +0000 (19:39 -0700)
committerRichard Henderson <rth@gcc.gnu.org>
Sun, 27 Jun 1999 02:39:42 +0000 (19:39 -0700)
From-SVN: r27788

gcc/ChangeLog
gcc/jump.c

index 3261f65daf54a44d03eb834f124c6c3a7c5d5db0..0426f63c87a022b740e567aeda9935fa1cae948f 100644 (file)
@@ -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.
index 6b6a90ae3a94c92ccfbddf64532d4d7a0c285cfd..295a6c117ba64fad8b18f85b07c13e6547b9a204 100644 (file)
@@ -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 ();