reload1.c (reload_combine_note_store): Be more careful with STRICT_LOW_PART, ZERO_EXT...
authorJeffrey A Law <law@cygnus.com>
Sat, 6 Feb 1999 09:41:08 +0000 (09:41 +0000)
committerJeff Law <law@gcc.gnu.org>
Sat, 6 Feb 1999 09:41:08 +0000 (02:41 -0700)
        * reload1.c (reload_combine_note_store): Be more careful with
        STRICT_LOW_PART, ZERO_EXTRACT and SIGN_EXTRACT.
        (move2add_note_store): Likewise.

From-SVN: r25055

gcc/ChangeLog
gcc/reload1.c

index a6576cb085f83667676d298c7ab5be83fda64b22..a2439de867ff2e48f4dfa330869748af0828ada3 100644 (file)
@@ -1,3 +1,9 @@
+Sat Feb  6 10:31:35 1999  Jeffrey A Law  (law@cygnus.com)
+
+       * reload1.c (reload_combine_note_store): Be more careful with
+       STRICT_LOW_PART, ZERO_EXTRACT and SIGN_EXTRACT.
+       (move2add_note_store): Likewise.
+
 Sat Feb  6 10:18:01 1999  Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>
 
        * cppfiles.c (read_and_prescan): Cast the result of `xrealloc' to
index cfacc78ac502f44b1ae6b11a0e2efdd397bdd126..f2cb20deeaf919490caee85addc8150b63475d27 100644 (file)
@@ -9732,9 +9732,15 @@ reload_combine_note_store (dst, set)
   if (GET_CODE (dst) != REG)
     return;
   regno += REGNO (dst);
+
   /* note_stores might have stripped a STRICT_LOW_PART, so we have to be
-     careful with registers / register parts that are not full words.  */
-  if (size < (unsigned) UNITS_PER_WORD)
+     careful with registers / register parts that are not full words. 
+
+     Similarly for ZERO_EXTRACT and SIGN_EXTRACT.  */
+  if (GET_CODE (set) != SET
+      || GET_CODE (SET_DEST (set)) == ZERO_EXTRACT
+      || GET_CODE (SET_DEST (set)) == SIGN_EXTRACT
+      || GET_CODE (SET_DEST (set)) == STRICT_LOW_PART)
     {
       reg_state[regno].use_index = -1;
       reg_state[regno].store_ruid = reload_combine_ruid;
@@ -10056,6 +10062,17 @@ move2add_note_store (dst, set)
     {
       rtx src = SET_SRC (set);
 
+      /* Indicate that this register has been recently written to,
+        but the exact contents are not available.  */
+      if (GET_CODE (SET_DEST (set)) == ZERO_EXTRACT
+         || GET_CODE (SET_DEST (set)) == SIGN_EXTRACT
+         || GET_CODE (SET_DEST (set)) == STRICT_LOW_PART)
+       {
+         reg_set_luid[regno] = move2add_luid;
+         reg_offset[regno] = dst;
+         return;
+       }
+
       reg_mode[regno] = mode;
       switch (GET_CODE (src))
        {