]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
df-scan.c (df-uses-record): Add case zero_extract of mem.
authorKenneth Zadeck <zadeck@naturalbridge.com>
Wed, 4 Nov 2009 23:17:54 +0000 (23:17 +0000)
committerKenneth Zadeck <zadeck@gcc.gnu.org>
Wed, 4 Nov 2009 23:17:54 +0000 (23:17 +0000)
2009-11-04  Kenneth Zadeck  <zadeck@naturalbridge.com>

* df-scan.c (df-uses-record): Add case zero_extract of mem.

From-SVN: r153924

gcc/ChangeLog
gcc/df-scan.c

index 38a62e2fa0f6a3daf06ecf2ad3fbc2e1344fac14..905978d7bde3ca40e4de7f9b6323d328e645511d 100644 (file)
@@ -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
index 45df29ecc2b075005b89b49bfeac32ff0a3debb4..101234b55bc37b785794080d253a928e28bcd2d9 100644 (file)
@@ -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 
                  {