aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Kenner <kenner@gcc.gnu.org>1995-12-16 18:16:01 -0500
committerRichard Kenner <kenner@gcc.gnu.org>1995-12-16 18:16:01 -0500
commit058e0bb91b0f9ea8e8e2e1bfe536909e88a0c725 (patch)
tree3092f4ddd4dd6afdf38355aed15cf21321dbfca1
parent0c9cabe7d4eec4b2837f89dc5e789be0908ee642 (diff)
downloadgcc-058e0bb91b0f9ea8e8e2e1bfe536909e88a0c725.zip
gcc-058e0bb91b0f9ea8e8e2e1bfe536909e88a0c725.tar.gz
gcc-058e0bb91b0f9ea8e8e2e1bfe536909e88a0c725.tar.bz2
(optimize_reg_copy_2): Don't attempt optimization if destination
register dies. From-SVN: r10780
-rw-r--r--gcc/local-alloc.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/gcc/local-alloc.c b/gcc/local-alloc.c
index 647b2d5..9d941fe 100644
--- a/gcc/local-alloc.c
+++ b/gcc/local-alloc.c
@@ -865,7 +865,7 @@ optimize_reg_copy_1 (insn, dest, src)
In that case, we can replace all uses of DEST, starting with INSN and
ending with the set of SRC to DEST, with SRC. We do not do this
optimization if a CALL_INSN is crossed unless SRC already crosses a
- call.
+ call or if DEST dies before the copy back to SRC.
It is assumed that DEST and SRC are pseudos; it is too complicated to do
this for hard registers since the substitutions we may make might fail. */
@@ -930,6 +930,7 @@ optimize_reg_copy_2 (insn, dest, src)
}
if (reg_set_p (src, p)
+ || find_reg_note (p, REG_DEAD, dest)
|| (GET_CODE (p) == CALL_INSN && reg_n_calls_crossed[sregno] == 0))
break;
}