aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMichael Matz <matz@suse.de>2006-11-27 16:34:19 +0000
committerAndreas Krebbel <krebbel@gcc.gnu.org>2006-11-27 16:34:19 +0000
commite064939e4ae577d3e44eca84fc1e16f7f7657817 (patch)
tree3732caa784c5d755960587bdc14c4e9c30c6ba44 /gcc
parent9409c2f5a4d1431e9f0722434c25947ed80c5a5b (diff)
downloadgcc-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/ChangeLog9
-rw-r--r--gcc/config/s390/predicates.md4
-rw-r--r--gcc/config/s390/s390.c7
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/gcc.dg/20061127-1.c28
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;
+}