Ignore SETs that are anything except REG or MEM, but look inside STRICT_LOW_PART.
authorBernd Schmidt <bernds@redhat.co.uk>
Tue, 28 Nov 2000 16:19:55 +0000 (16:19 +0000)
committerBernd Schmidt <bernds@gcc.gnu.org>
Tue, 28 Nov 2000 16:19:55 +0000 (16:19 +0000)
From-SVN: r37819

gcc/ChangeLog
gcc/simplify-rtx.c

index 506fae68fafef021231ab3574c1d0b104771f4b1..90531dae35b5f04bae777ac2bea6ae3a866cfcd5 100644 (file)
@@ -1,3 +1,8 @@
+2000-11-28  Bernd Schmidt  <bernds@redhat.co.uk>
+
+       * simplify-rtx.c (cselib_record_sets): Ignore sets whose destination
+       is anything but REG or MEM, but look inside STRICT_LOW_PART.
+
 Tue Nov 28 09:53:50 2000  Richard Kenner  <kenner@vlsi1.ultra.nyu.edu>
 
        * system.h (IS_DIR_SEPARATOR): Use uppercase macro name.
index d7b43d1ac9171ccbfd81577a26eac3e20a0b836e..08ceaf7fc106984e77f9d3e2413db20198b3baa4 100644 (file)
@@ -3198,13 +3198,22 @@ cselib_record_sets (insn)
      locations that are written.  */
   for (i = 0; i < n_sets; i++)
     {
-      sets[i].src_elt = cselib_lookup (sets[i].src, GET_MODE (sets[i].dest),
-                                      1);
-      if (GET_CODE (sets[i].dest) == MEM)
-       sets[i].dest_addr_elt = cselib_lookup (XEXP (sets[i].dest, 0), Pmode,
-                                              1);
-      else
-       sets[i].dest_addr_elt = 0;
+      rtx dest = sets[i].dest;
+
+      /* A STRICT_LOW_PART can be ignored; we'll record the equivalence for
+         the low part after invalidating any knowledge about larger modes.  */
+      if (GET_CODE (sets[i].dest) == STRICT_LOW_PART)
+       sets[i].dest = dest = XEXP (dest, 0);
+
+      /* We don't know how to record anything but REG or MEM.  */
+      if (GET_CODE (dest) == REG || GET_CODE (dest) == MEM)
+        {
+         sets[i].src_elt = cselib_lookup (sets[i].src, GET_MODE (dest), 1);
+         if (GET_CODE (dest) == MEM)
+           sets[i].dest_addr_elt = cselib_lookup (XEXP (dest, 0), Pmode, 1);
+         else
+           sets[i].dest_addr_elt = 0;
+       }
     }
 
   /* Invalidate all locations written by this insn.  Note that the elts we
@@ -3214,7 +3223,11 @@ cselib_record_sets (insn)
 
   /* Now enter the equivalences in our tables.  */
   for (i = 0; i < n_sets; i++)
-    cselib_record_set (sets[i].dest, sets[i].src_elt, sets[i].dest_addr_elt);
+    {
+      rtx dest = sets[i].dest;
+      if (GET_CODE (dest) == REG || GET_CODE (dest) == MEM)
+       cselib_record_set (dest, sets[i].src_elt, sets[i].dest_addr_elt);
+    }
 }
 
 /* Record the effects of INSN.  */