re PR target/20928 (ICE: unrecognizable insns with -fPIC -O1)
authorJan Hubicka <jh@suse.cz>
Mon, 31 Oct 2005 18:42:23 +0000 (19:42 +0100)
committerJan Hubicka <hubicka@gcc.gnu.org>
Mon, 31 Oct 2005 18:42:23 +0000 (18:42 +0000)
PR target/20928
* i386.c (legitimize_pic_address): Deal with large immediates.

* gcc.c-torture/compile/pr20928.c: New test.

From-SVN: r106284

gcc/ChangeLog
gcc/config/i386/i386.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/compile/pr20928.c [new file with mode: 0644]

index b31e67c370c7a08857b087e4fe362a34c484398b..7f69964ea4c39c7eb286825db2accde28b6bc175 100644 (file)
@@ -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.
index 5fe9e3f0062503283e90d42c821c2cd64f8d14e2..7b3f8887996abd407387ebe3e6c48f4f915c0000 100644 (file)
@@ -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);
 
index 7b0e3e7064eac427f9affb3e47683cebace86f86..78bee8652c95d33139ec6af21b76dfcc756342e7 100644 (file)
@@ -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 (file)
index 0000000..ea8be9e
--- /dev/null
@@ -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);
+}