aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/regmove.c8
2 files changed, 14 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 9d9bbe1..29440f5 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2001-08-10 Roman Zippel <zippel@linux-m68k.org>
+ Richard Henderson <rth@redhat.com>
+
+ * regmove.c (regmove_optimize): Avoid setting a register twice in
+ a parallel set.
+
2001-08-10 Richard Henderson <rth@redhat.com>
* doc/extend.texi (Arrays and pointers implementation): Document
diff --git a/gcc/regmove.c b/gcc/regmove.c
index 587acea..ac1675e 100644
--- a/gcc/regmove.c
+++ b/gcc/regmove.c
@@ -1319,6 +1319,14 @@ regmove_optimize (f, nregs, regmove_dump_file)
if (! set)
continue;
+ /* Note that single_set ignores parts of a parallel set for
+ which one of the destinations is REG_UNUSED. We can't
+ handle that here, since we can wind up rewriting things
+ such that a single register is set twice within a single
+ parallel. */
+ if (reg_set_p (src, insn))
+ continue;
+
/* match_no/dst must be a write-only operand, and
operand_operand/src must be a read-only operand. */
if (match.use[op_no] != READ