aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorhubicka <>2005-10-31 18:42:23 +0000
committerhubicka <>2005-10-31 18:42:23 +0000
commit4a8ee263da650096e9d0015e8b8fb7985a3cb330 (patch)
treeffab745ca3bb9c7d53c6bf3467a3082d8905c73a
parentb3c906963c006208dad3b6f9f23fdca3af502331 (diff)
PR target/20928
* i386.c (legitimize_pic_address): Deal with large immediates. * gcc.c-torture/compile/pr20928.c: New test.
-rw-r--r--gcc/ChangeLog3
-rw-r--r--gcc/config/i386/i386.c13
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/pr20928.c10
4 files changed, 30 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index b31e67c370c..7f69964ea4c 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,8 @@
2005-10-31 Jan Hubicka <jh@suse.cz>
+ PR target/20928
+ * i386.c (legitimize_pic_address): Deal with large immediates.
+
PR profile/20815
* coverage.c (coverage_checksum_string): Fix code to stip random seeds
from symbol names while computing checkup.
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index 5fe9e3f0062..7b3f8887996 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -6016,7 +6016,18 @@ legitimize_pic_address (rtx orig, rtx reg)
}
else
{
- if (GET_CODE (addr) == CONST)
+ if (GET_CODE (addr) == CONST_INT
+ && !x86_64_immediate_operand (addr, VOIDmode))
+ {
+ if (reg)
+ {
+ emit_move_insn (reg, addr);
+ new = reg;
+ }
+ else
+ new = force_reg (Pmode, addr);
+ }
+ else if (GET_CODE (addr) == CONST)
{
addr = XEXP (addr, 0);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 7b0e3e7064e..78bee8652c9 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2005-10-31 Jan Hubicka <jh@suse.cz>
+
+ PR target/20928
+ * gcc.c-torture/compile/pr20928.c: New test.
+
2005-10-31 Andrew Pinski <pinskia@physics.uc.edu>
PR middle-end/23492
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr20928.c b/gcc/testsuite/gcc.c-torture/compile/pr20928.c
new file mode 100644
index 00000000000..ea8be9e8757
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/pr20928.c
@@ -0,0 +1,10 @@
+extern struct bar_t bar;
+void *a;
+void
+foo (void)
+{
+ void **p = a;
+ do {
+ *p++ = ((unsigned char *) &bar + ((unsigned long int) 1L << 31));
+ } while (p);
+}