* regrename.c (copy_value): Ignore overlapping copies.
authorRichard Henderson <rth@redhat.com>
Wed, 9 Jan 2002 01:07:13 +0000 (17:07 -0800)
committerRichard Henderson <rth@gcc.gnu.org>
Wed, 9 Jan 2002 01:07:13 +0000 (17:07 -0800)
From-SVN: r48669

gcc/ChangeLog
gcc/regrename.c

index 72e514420a15979de0f3ac23b09584aa4ab666d5..426d2db160c632a29b52a26ccc29e5c15e5b65b7 100644 (file)
@@ -1,3 +1,7 @@
+2002-01-08  Richard Henderson  <rth@redhat.com>
+
+       * regrename.c (copy_value): Ignore overlapping copies.
+
 2002-01-08  Richard Henderson  <rth@redhat.com>
 
        * config/alpha/alpha.c (alpha_split_conditional_move): Call copy_rtx
index 45f5b8552ef692143d13c95af52667f1c3254f2c..0079dc1e3162f00f37dbaf521f7b45733543b740 100644 (file)
@@ -1214,6 +1214,7 @@ copy_value (dest, src, vd)
 {
   unsigned int dr = REGNO (dest);
   unsigned int sr = REGNO (src);
+  unsigned int dn, sn;
   unsigned int i;
 
   /* ??? At present, it's possible to see noop sets.  It'd be nice if
@@ -1230,6 +1231,13 @@ copy_value (dest, src, vd)
   if (frame_pointer_needed && dr == HARD_FRAME_POINTER_REGNUM)
     return;
 
+  /* If SRC and DEST overlap, don't record anything.  */
+  dn = HARD_REGNO_NREGS (dr, GET_MODE (dest));
+  sn = HARD_REGNO_NREGS (sr, GET_MODE (dest));
+  if ((dr > sr && dr < sr + sn)
+      || (sr > dr && sr < dr + dn))
+    return;
+
   /* If SRC had no assigned mode (i.e. we didn't know it was live)
      assign it now and assume the value came from an input argument
      or somesuch.  */