diff options
Diffstat (limited to 'gcc/regmove.c')
-rw-r--r-- | gcc/regmove.c | 16 |
1 files changed, 8 insertions, 8 deletions
diff --git a/gcc/regmove.c b/gcc/regmove.c index 3c059f44a78..06272e5e770 100644 --- a/gcc/regmove.c +++ b/gcc/regmove.c @@ -471,15 +471,15 @@ optimize_reg_copy_1 (rtx insn, rtx dest, rtx src) if (sregno < FIRST_PSEUDO_REGISTER && reg_mentioned_p (dest, PATTERN (q))) failed = 1; + + /* Attempt to replace all uses. */ + else if (!validate_replace_rtx (src, dest, q)) + failed = 1; - /* Replace all uses and make sure that the register - isn't still present. */ - else if (validate_replace_rtx (src, dest, q) - && (sregno >= FIRST_PSEUDO_REGISTER - || ! reg_overlap_mentioned_p (src, - PATTERN (q)))) - ; - else + /* If this succeeded, but some part of the register + is still present, undo the replacement. */ + else if (sregno < FIRST_PSEUDO_REGISTER + && reg_overlap_mentioned_p (src, PATTERN (q))) { validate_replace_rtx (dest, src, q); failed = 1; |