OSDN Git Service

2009-11-04 Kenneth Zadeck <zadeck@naturalbridge.com>
authorzadeck <zadeck@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 4 Nov 2009 23:17:54 +0000 (23:17 +0000)
committerzadeck <zadeck@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 4 Nov 2009 23:17:54 +0000 (23:17 +0000)
* df-scan.c (df-uses-record): Add case zero_extract of mem.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@153924 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/df-scan.c

index 38a62e2..905978d 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 45df29e..101234b 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 
                  {