Commit e757da5e by Jeff Law

recog.c (validate_replace_rtx_group): New function.

�
        * recog.c (validate_replace_rtx_group): New function.
        * recog.h (validate_replace_rtx_group): Declare it.
        * regmove.c (optimize_reg_copy_3): If any substitution fails, then undo
        the entire group of substitutions.

From-SVN: r21910
parent edfac33e
...@@ -32,6 +32,7 @@ extern int constrain_operands PROTO((int, int)); ...@@ -32,6 +32,7 @@ extern int constrain_operands PROTO((int, int));
extern int memory_address_p PROTO((enum machine_mode, rtx)); extern int memory_address_p PROTO((enum machine_mode, rtx));
extern int strict_memory_address_p PROTO((enum machine_mode, rtx)); extern int strict_memory_address_p PROTO((enum machine_mode, rtx));
extern int validate_replace_rtx PROTO((rtx, rtx, rtx)); extern int validate_replace_rtx PROTO((rtx, rtx, rtx));
extern void validate_replace_rtx_group PROTO((rtx, rtx, rtx));
extern int validate_replace_src PROTO((rtx, rtx, rtx)); extern int validate_replace_src PROTO((rtx, rtx, rtx));
extern int reg_fits_class_p PROTO((rtx, enum reg_class, int, extern int reg_fits_class_p PROTO((rtx, enum reg_class, int,
enum machine_mode)); enum machine_mode));
......
...@@ -549,23 +549,32 @@ optimize_reg_copy_3 (insn, dest, src) ...@@ -549,23 +549,32 @@ optimize_reg_copy_3 (insn, dest, src)
old_mode = GET_MODE (src_reg); old_mode = GET_MODE (src_reg);
PUT_MODE (src_reg, GET_MODE (src)); PUT_MODE (src_reg, GET_MODE (src));
XEXP (src, 0) = SET_SRC (set); XEXP (src, 0) = SET_SRC (set);
if (! validate_change (p, &SET_SRC (set), src, 0))
{ /* Include this change in the group so that it's easily undone if
PUT_MODE (src_reg, old_mode); one of the changes in the group is invalid. */
XEXP (src, 0) = src_reg; validate_change (p, &SET_SRC (set), src, 1);
return;
} /* Now walk forward making additional replacements. We want to be able
to undo all the changes if a later substitution fails. */
subreg = gen_rtx_SUBREG (old_mode, src_reg, 0); subreg = gen_rtx_SUBREG (old_mode, src_reg, 0);
while (p = NEXT_INSN (p), p != insn) while (p = NEXT_INSN (p), p != insn)
{ {
if (GET_RTX_CLASS (GET_CODE (p)) != 'i') if (GET_RTX_CLASS (GET_CODE (p)) != 'i')
continue; continue;
/* If we can not perform the replacement, then abort now
to make debugging easier. */ /* Make a tenative change. */
if (! validate_replace_rtx (src_reg, subreg, p)) validate_replace_rtx_group (src_reg, subreg, p);
abort (); }
validate_replace_rtx_group (src, src_reg, insn);
/* Now see if all the changes are valid. */
if (! apply_change_group ())
{
/* One or more changes were no good. Back out everything. */
PUT_MODE (src_reg, old_mode);
XEXP (src, 0) = src_reg;
} }
validate_replace_rtx (src, src_reg, insn);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment