diff options
author | Richard Henderson <rth@redhat.com> | 2002-01-08 17:07:13 -0800 |
---|---|---|
committer | Richard Henderson <rth@gcc.gnu.org> | 2002-01-08 17:07:13 -0800 |
commit | 21e16bd6bb7a838a70cad9f4f4c3f0fbdf824052 (patch) | |
tree | 93405ae61022424ac07b96751d7bca9a59637485 /gcc/regrename.c | |
parent | 35484f777f6853b9aeed9a8111a119924a62f408 (diff) | |
download | gcc-21e16bd6bb7a838a70cad9f4f4c3f0fbdf824052.zip gcc-21e16bd6bb7a838a70cad9f4f4c3f0fbdf824052.tar.gz gcc-21e16bd6bb7a838a70cad9f4f4c3f0fbdf824052.tar.bz2 |
* regrename.c (copy_value): Ignore overlapping copies.
From-SVN: r48669
Diffstat (limited to 'gcc/regrename.c')
-rw-r--r-- | gcc/regrename.c | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/gcc/regrename.c b/gcc/regrename.c index 45f5b85..0079dc1 100644 --- a/gcc/regrename.c +++ b/gcc/regrename.c @@ -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. */ |