diff options
author | Michael Matz <matz@suse.de> | 2006-11-27 16:34:19 +0000 |
---|---|---|
committer | Andreas Krebbel <krebbel@gcc.gnu.org> | 2006-11-27 16:34:19 +0000 |
commit | e064939e4ae577d3e44eca84fc1e16f7f7657817 (patch) | |
tree | 3732caa784c5d755960587bdc14c4e9c30c6ba44 /gcc | |
parent | 9409c2f5a4d1431e9f0722434c25947ed80c5a5b (diff) | |
download | gcc-e064939e4ae577d3e44eca84fc1e16f7f7657817.zip gcc-e064939e4ae577d3e44eca84fc1e16f7f7657817.tar.gz gcc-e064939e4ae577d3e44eca84fc1e16f7f7657817.tar.bz2 |
re PR target/29319 (ICE unrecognizable insn: offset too large for larl (breaks glibc))
2006-11-27 Michael Matz <matz@suse.de>
Andreas Krebbel <krebbel1@de.ibm.com>
PR target/29319
* config/s390/predicates.md (larl_operand): Check addend of larl
operand to be in range of -/+2GB.
* config/s390/s390.c (legitimize_pic_address): Likewise.
Changed type of variable even to HOST_WIDE_INT.
2006-11-27 Michael Matz <matz@suse.de>
Andreas Krebbel <krebbel1@de.ibm.com>
PR target/29319
* gcc.dg/20061127-1.c: New testcase.
Co-Authored-By: Andreas Krebbel <krebbel1@de.ibm.com>
From-SVN: r119256
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/config/s390/predicates.md | 4 | ||||
-rw-r--r-- | gcc/config/s390/s390.c | 7 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/20061127-1.c | 28 |
5 files changed, 50 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5e1c967..fcfffec 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2006-11-27 Michael Matz <matz@suse.de> + Andreas Krebbel <krebbel1@de.ibm.com> + + PR target/29319 + * config/s390/predicates.md (larl_operand): Check addend of larl + operand to be in range of -/+2GB. + * config/s390/s390.c (legitimize_pic_address): Likewise. + Changed type of variable even to HOST_WIDE_INT. + 2006-11-27 Jan Hubicka <jh@suse.cz> * expr.c (emit_block_move_via_libcall): Export. diff --git a/gcc/config/s390/predicates.md b/gcc/config/s390/predicates.md index 5f9e8d4..9f7ea36 100644 --- a/gcc/config/s390/predicates.md +++ b/gcc/config/s390/predicates.md @@ -126,8 +126,8 @@ if (GET_CODE (XEXP (op, 1)) != CONST_INT || (INTVAL (XEXP (op, 1)) & 1) != 0) return false; - if (INTVAL (XEXP (op, 1)) >= (HOST_WIDE_INT)1 << 32 - || INTVAL (XEXP (op, 1)) < -((HOST_WIDE_INT)1 << 32)) + if (INTVAL (XEXP (op, 1)) >= (HOST_WIDE_INT)1 << 31 + || INTVAL (XEXP (op, 1)) < -((HOST_WIDE_INT)1 << 31)) return false; op = XEXP (op, 0); } diff --git a/gcc/config/s390/s390.c b/gcc/config/s390/s390.c index cfe959e..f7a1902 100644 --- a/gcc/config/s390/s390.c +++ b/gcc/config/s390/s390.c @@ -3020,7 +3020,10 @@ legitimize_pic_address (rtx orig, rtx reg) || (GET_CODE (op0) == SYMBOL_REF && SYMBOL_REF_LOCAL_P (op0))) && GET_CODE (op1) == CONST_INT) { - if (TARGET_CPU_ZARCH && larl_operand (op0, VOIDmode)) + if (TARGET_CPU_ZARCH + && larl_operand (op0, VOIDmode) + && INTVAL (op1) < (HOST_WIDE_INT)1 << 31 + && INTVAL (op1) >= -((HOST_WIDE_INT)1 << 31)) { if (INTVAL (op1) & 1) { @@ -3030,7 +3033,7 @@ legitimize_pic_address (rtx orig, rtx reg) if (!DISP_IN_RANGE (INTVAL (op1))) { - int even = INTVAL (op1) - 1; + HOST_WIDE_INT even = INTVAL (op1) - 1; op0 = gen_rtx_PLUS (Pmode, op0, GEN_INT (even)); op0 = gen_rtx_CONST (Pmode, op0); op1 = const1_rtx; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 77ee030..d2b7adf 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2006-11-27 Michael Matz <matz@suse.de> + Andreas Krebbel <krebbel1@de.ibm.com> + + PR target/29319 + * gcc.dg/20061127-1.c: New testcase. + 2006-11-27 Uros Bizjak <ubizjak@gmail.com> * gcc.dg/20061124-1.c: Add exit() function prototype. diff --git a/gcc/testsuite/gcc.dg/20061127-1.c b/gcc/testsuite/gcc.dg/20061127-1.c new file mode 100644 index 0000000..ec94dc8 --- /dev/null +++ b/gcc/testsuite/gcc.dg/20061127-1.c @@ -0,0 +1,28 @@ +/* { dg-do compile { target lp64 } } */ +/* { dg-options "-O1 -fPIC" } */ + +/* PR target/29319 */ + +extern void abort(void); +static char l_info[100]; + +void +bug1 (unsigned long tag) +{ + char *info = l_info; + info[tag - 0x100000000 + 1] = 1; +} + +void +bug2 (unsigned long tag) +{ + char *info = l_info; + info[tag - 0x700000000 + 2] = 2; +} + +void +bug3 (unsigned long tag) +{ + char *info = l_info; + info[tag - 0x100000000 + 1] = 3; +} |