diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 38a62e2fa0f6a3daf06ecf2ad3fbc2e1344fac14..905978d7bde3ca40e4de7f9b6323d328e645511d 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,7 @@
+2009-11-04  Kenneth Zadeck  <zadeck@naturalbridge.com>
+
+	* df-scan.c (df-uses-record): Add case zero_extract of mem.
+	
 2009-11-04  Eric Botcazou  <ebotcazou@adacore.com>
 
 	PR target/10127
diff --git a/gcc/df-scan.c b/gcc/df-scan.c
index 45df29ecc2b075005b89b49bfeac32ff0a3debb4..101234b55bc37b785794080d253a928e28bcd2d9 100644
--- a/gcc/df-scan.c
+++ b/gcc/df-scan.c
@@ -3248,10 +3248,23 @@ df_uses_record (enum df_ref_class cl, struct df_collection_rec *collection_rec,
 		    width = INTVAL (XEXP (dst, 1));
 		    offset = INTVAL (XEXP (dst, 2));
 		    mode = GET_MODE (dst);
-		    df_uses_record (DF_REF_EXTRACT, collection_rec, &XEXP (dst, 0), 
-				DF_REF_REG_USE, bb, insn_info, 
-				DF_REF_READ_WRITE | DF_REF_ZERO_EXTRACT, 
-				width, offset, mode);
+		    if (GET_CODE (XEXP (dst,0)) == MEM)
+		      {
+			/* Handle the case of zero_extract(mem(...)) in the set dest.
+			   This special case is allowed only if the mem is a single byte and 
+			   is useful to set a bitfield in memory.  */
+			df_uses_record (DF_REF_EXTRACT, collection_rec, &XEXP (XEXP (dst,0), 0),
+					DF_REF_REG_MEM_STORE, bb, insn_info,
+					DF_REF_ZERO_EXTRACT,
+					width, offset, mode);
+		      }
+		    else
+		      {
+			df_uses_record (DF_REF_EXTRACT, collection_rec, &XEXP (dst, 0), 
+					DF_REF_REG_USE, bb, insn_info, 
+					DF_REF_READ_WRITE | DF_REF_ZERO_EXTRACT, 
+					width, offset, mode);
+		      }
 		  }
 		else 
 		  {