diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index c797248648b159e781b944b8412a8545f24f89e3..f2aedd45b63362bca29976c49d30241b46f2352a 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2007-02-18  Steven Bosscher  <steven@gcc.gnu.org>
+
+	PR rtl-optimization/30773
+	* local-alloc.c (update_equiv_regs): Do not set reg_equiv_init
+	if we fail to attach a REG_EQUIV note.
+
 2007-02-18  David Edelsohn  <edelsohn@gnu.org>
 	    Roger Sayle  <roger@eyesopen.com>
 
diff --git a/gcc/local-alloc.c b/gcc/local-alloc.c
index 6f24968f10c8360c9592478b4c39a8bd3beac6b5..f46b9c98067e24f85a2825ffb3651dfaa93c07f3 100644
--- a/gcc/local-alloc.c
+++ b/gcc/local-alloc.c
@@ -1062,10 +1062,11 @@ update_equiv_regs (void)
 	{
 	  rtx init_insn = XEXP (reg_equiv[regno].init_insns, 0);
 	  if (validate_equiv_mem (init_insn, src, dest)
-	      && ! memref_used_between_p (dest, init_insn, insn))
+	      && ! memref_used_between_p (dest, init_insn, insn)
+	      /* Attaching a REG_EQUIV note will fail if INIT_INSN has
+		 multiple sets.  */
+	      && set_unique_reg_note (init_insn, REG_EQUIV, copy_rtx (dest)))
 	    {
-	      set_unique_reg_note (init_insn, REG_EQUIV, copy_rtx (dest));
-
 	      /* This insn makes the equivalence, not the one initializing
 		 the register.  */
 	      reg_equiv_init[regno]