diff options
author | Ulrich Weigand <uweigand@de.ibm.com> | 2002-10-25 12:26:40 +0000 |
---|---|---|
committer | Ulrich Weigand <uweigand@gcc.gnu.org> | 2002-10-25 12:26:40 +0000 |
commit | 522ec94ec5741cce6fd8cd507a2bb7742b4ab348 (patch) | |
tree | 539cf5805f3ef36b9574279a41b1f9f11a6d68d9 /gcc | |
parent | 0bfd1ad0f8e227f73e5c37331de66396fe32410a (diff) | |
download | gcc-522ec94ec5741cce6fd8cd507a2bb7742b4ab348.zip gcc-522ec94ec5741cce6fd8cd507a2bb7742b4ab348.tar.gz gcc-522ec94ec5741cce6fd8cd507a2bb7742b4ab348.tar.bz2 |
s390.c (s390_decompose_address): Do not range check the displacement if base or index is the argument pointer...
* config/s390/s390.c (s390_decompose_address): Do not range check the
displacement if base or index is the argument pointer register.
From-SVN: r58530
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/config/s390/s390.c | 16 |
2 files changed, 19 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 0e26baf..40518b3 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2002-10-25 Ulrich Weigand <uweigand@de.ibm.com> + + * config/s390/s390.c (s390_decompose_address): Do not range check the + displacement if base or index is the argument pointer register. + 2002-10-24 Hans-Peter Nilsson <hp@bitrange.com> PR other/3337 diff --git a/gcc/config/s390/s390.c b/gcc/config/s390/s390.c index f73f6aa..0f9c5a1 100644 --- a/gcc/config/s390/s390.c +++ b/gcc/config/s390/s390.c @@ -1597,8 +1597,20 @@ s390_decompose_address (addr, out) /* Allow integer constant in range. */ if (GET_CODE (disp) == CONST_INT) { - if (INTVAL (disp) < 0 || INTVAL (disp) >= 4096) - return FALSE; + /* If the argument pointer is involved, the displacement will change + later anyway as the argument pointer gets eliminated. This could + make a valid displacement invalid, but it is more likely to make + an invalid displacement valid, because we sometimes access the + register save area via negative offsets to the arg pointer. + Thus we don't check the displacement for validity here. If after + elimination the displacement turns out to be invalid after all, + this is fixed up by reload in any case. */ + if ((base && REGNO (base) == ARG_POINTER_REGNUM) + || (indx && REGNO (indx) == ARG_POINTER_REGNUM)) + ; + + else if (INTVAL (disp) < 0 || INTVAL (disp) >= 4096) + return FALSE; } /* In the small-PIC case, the linker converts @GOT12 |