http://gcc.gnu.org/bugzilla/show_bug.cgi?id=35964
Index: gcc-4.3.0/gcc/regrename.c
===================================================================
--- gcc-4.3.0.orig/gcc/regrename.c	2008-05-28 08:31:15.000000000 -0700
+++ gcc-4.3.0/gcc/regrename.c	2008-05-28 08:34:00.000000000 -0700
@@ -782,6 +782,10 @@
 	          || (predicated && recog_data.operand_type[i] == OP_OUT))
 		recog_data.operand_type[i] = OP_INOUT;
 	    }
+	  /* Unshare dup_loc RTL */
+	  for (i = 0; i < recog_data.n_dups; i++)
+	    *recog_data.dup_loc[i] = copy_rtx(*recog_data.dup_loc[i]);
+
 
 	  /* Step 1: Close chains for which we have overlapping reads.  */
 	  for (i = 0; i < n_ops; i++)
@@ -813,7 +817,7 @@
 		    OP_IN, 0);
 
 	  for (i = 0; i < recog_data.n_dups; i++)
-	    *recog_data.dup_loc[i] = copy_rtx (old_dups[i]);
+	    *recog_data.dup_loc[i] = old_dups[i];
 	  for (i = 0; i < n_ops; i++)
 	    *recog_data.operand_loc[i] = old_operands[i];
 	  if (recog_data.n_dups)
