aboutsummaryrefslogtreecommitdiff
path: root/gcc/combine.c
diff options
context:
space:
mode:
authorRichard Kenner <kenner@gcc.gnu.org>1992-07-31 08:13:38 -0400
committerRichard Kenner <kenner@gcc.gnu.org>1992-07-31 08:13:38 -0400
commit58c8c59349b32c5f8ced092c74d2918580c218f0 (patch)
tree3157856d1898a840aac68ef6de2bc701b24e3867 /gcc/combine.c
parent510dd77e9569867570a74513c79eb767344370c6 (diff)
downloadgcc-58c8c59349b32c5f8ced092c74d2918580c218f0.zip
gcc-58c8c59349b32c5f8ced092c74d2918580c218f0.tar.gz
gcc-58c8c59349b32c5f8ced092c74d2918580c218f0.tar.bz2
entered into RCS
From-SVN: r1731
Diffstat (limited to 'gcc/combine.c')
-rw-r--r--gcc/combine.c30
1 files changed, 24 insertions, 6 deletions
diff --git a/gcc/combine.c b/gcc/combine.c
index ab9b09d..a2a11a1 100644
--- a/gcc/combine.c
+++ b/gcc/combine.c
@@ -1886,14 +1886,32 @@ try_combine (i3, i2, i1)
distribute_notes (gen_rtx (EXPR_LIST, REG_DEAD, i3dest_killed, NULL_RTX),
NULL_RTX, i3, newi2pat ? i2 : NULL_RTX,
NULL_RTX, NULL_RTX);
+
+ /* For I2 and I1, we have to be careful. If NEWI2PAT exists and sets
+ I2DEST or I1DEST, the death must be somewhere before I2, not I3. If
+ we passed I3 in that case, it might delete I2. */
+
if (i2dest_in_i2src)
- distribute_notes (gen_rtx (EXPR_LIST, REG_DEAD, i2dest, NULL_RTX),
- NULL_RTX, i3, newi2pat ? i2 : NULL_RTX,
- NULL_RTX, NULL_RTX);
+ {
+ if (newi2pat && reg_set_p (i2dest, newi2pat))
+ distribute_notes (gen_rtx (EXPR_LIST, REG_DEAD, i2dest, NULL_RTX),
+ NULL_RTX, i2, NULL_RTX, NULL_RTX, NULL_RTX);
+ else
+ distribute_notes (gen_rtx (EXPR_LIST, REG_DEAD, i2dest, NULL_RTX),
+ NULL_RTX, i3, newi2pat ? i2 : NULL_RTX,
+ NULL_RTX, NULL_RTX);
+ }
+
if (i1dest_in_i1src)
- distribute_notes (gen_rtx (EXPR_LIST, REG_DEAD, i1dest, NULL_RTX),
- NULL_RTX, i3, newi2pat ? i2 : NULL_RTX,
- NULL_RTX, NULL_RTX);
+ {
+ if (newi2pat && reg_set_p (i1dest, newi2pat))
+ distribute_notes (gen_rtx (EXPR_LIST, REG_DEAD, i1dest, NULL_RTX),
+ NULL_RTX, i2, NULL_RTX, NULL_RTX, NULL_RTX);
+ else
+ distribute_notes (gen_rtx (EXPR_LIST, REG_DEAD, i1dest, NULL_RTX),
+ NULL_RTX, i3, newi2pat ? i2 : NULL_RTX,
+ NULL_RTX, NULL_RTX);
+ }
distribute_links (i3links);
distribute_links (i2links);