aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Henderson <rth@cygnus.com>1999-06-26 19:39:42 -0700
committerRichard Henderson <rth@gcc.gnu.org>1999-06-26 19:39:42 -0700
commit9da8a3ae97750a437a1197bdafdae642db7471fb (patch)
tree8ef276fb052001318201c67c3e0a143259d26b4a /gcc
parente2b2063128ae9c2302f5a63e6237c17f5b3e79aa (diff)
downloadgcc-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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog4
-rw-r--r--gcc/jump.c57
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.
diff --git a/gcc/jump.c b/gcc/jump.c
index 6b6a90a..295a6c1 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 ();