diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index e91ab6d48d03cbe572441ddf255e8b9030517614..a7e2290d42ac1012223de08422e71744b4c22021 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2009-10-08  Alexandre Oliva  <aoliva@redhat.com>
+
+	PR debug/41353
+	* regmove.c (regmove_backward_pass): Replace src with dst in the
+	debug insn, and check for dst before rather than after.
+
 2009-10-08  Janis Johnson <janis187@us.ibm.com>
 
 	* config/rs6000/rs6000.c (rs6000_delegitimize_address): Remove.
diff --git a/gcc/regmove.c b/gcc/regmove.c
index ab1a4696d367a48f7d149392f99e9627b3c57493..a411183c55045439b4617e90168171a648293186 100644
--- a/gcc/regmove.c
+++ b/gcc/regmove.c
@@ -1117,23 +1117,28 @@ regmove_backward_pass (void)
 		      break;
 		    }
 
-		  /* We can't make this change if SRC is read or
+		  /* We can't make this change if DST is mentioned at
+		     all in P, since we are going to change its value.
+		     We can't make this change if SRC is read or
 		     partially written in P, since we are going to
-		     eliminate SRC. We can't make this change 
-		     if DST is mentioned at all in P,
-		     since we are going to change its value.  */
-		  if (reg_overlap_mentioned_p (src, PATTERN (p)))
+		     eliminate SRC.  However, if it's a debug insn, we
+		     can't refrain from making the change, for this
+		     would cause codegen differences, so instead we
+		     invalidate debug expressions that reference DST,
+		     and adjust references to SRC in them so that they
+		     become references to DST.  */
+		  if (reg_mentioned_p (dst, PATTERN (p)))
 		    {
 		      if (DEBUG_INSN_P (p))
-			validate_replace_rtx_group (dst, src, insn);
+			validate_change (p, &INSN_VAR_LOCATION_LOC (p),
+					 gen_rtx_UNKNOWN_VAR_LOC (), 1);
 		      else
 			break;
 		    }
-		  if (reg_mentioned_p (dst, PATTERN (p)))
+		  if (reg_overlap_mentioned_p (src, PATTERN (p)))
 		    {
 		      if (DEBUG_INSN_P (p))
-			validate_change (p, &INSN_VAR_LOCATION_LOC (p),
-					 gen_rtx_UNKNOWN_VAR_LOC (), 1);
+			validate_replace_rtx_group (src, dst, p);
 		      else
 			break;
 		    }