re PR rtl-optimization/24683 (ICE in in extract_insn, at recog.c:2084)
authorIan Lance Taylor <ian@airs.com>
Mon, 7 Nov 2005 18:52:24 +0000 (18:52 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Mon, 7 Nov 2005 18:52:24 +0000 (18:52 +0000)
./: PR rtl-optimization/24683
* config/i386/i386.c (legitimize_pic_address): If constant operand
to PLUS is too large, put it in a register.
testsuite/:
PR rtl-optimization/24683
* gcc.dg/pr24683.c: New test.

From-SVN: r106601

gcc/ChangeLog
gcc/config/i386/i386.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr24683.c [new file with mode: 0644]

index 57e0f82a744554f369e085c0b5fce04d0128ad6d..80e2f86e5341c2d0665eea18acf501a64ccd0369 100644 (file)
@@ -1,3 +1,9 @@
+2005-11-07  Ian Lance Taylor  <ian@airs.com>
+
+       PR rtl-optimization/24683
+       * config/i386/i386.c (legitimize_pic_address): If constant operand
+       to PLUS is too large, put it in a register.
+
 2005-11-07  Jie Zhang  <jie.zhang@analog.com>
 
        * configure.ac: Enable checking assembler dwarf2 support for bfin
index 26f0299b52bcfe4b52deda803dda428461d81a8c..9a0301f671c98e25afd226b5ed61d2ef9b2f3e2d 100644 (file)
@@ -6178,7 +6178,11 @@ legitimize_pic_address (rtx orig, rtx reg)
                {
                  if (INTVAL (op1) < -16*1024*1024
                      || INTVAL (op1) >= 16*1024*1024)
-                   new = gen_rtx_PLUS (Pmode, force_reg (Pmode, op0), op1);
+                   {
+                     if (!x86_64_immediate_operand (op1, Pmode))
+                       op1 = force_reg (Pmode, op1);
+                     new = gen_rtx_PLUS (Pmode, force_reg (Pmode, op0), op1);
+                   }
                }
            }
          else
index fbe39be9c4c9a90ee83c10db896e79ac0ec3f34a..9b09e7963d42c276237d946774e2d6668d290788 100644 (file)
@@ -1,3 +1,8 @@
+2005-11-07  Ian Lance Taylor  <ian@airs.com>
+
+       PR rtl-optimization/24683
+       * gcc.dg/pr24683.c: New test.
+
 2005-11-07  Uros Bizjak  <uros@kss-loka.si>
 
        * gcc.dg/vect/pr24225.c: Add cleanup-coverage-files.
diff --git a/gcc/testsuite/gcc.dg/pr24683.c b/gcc/testsuite/gcc.dg/pr24683.c
new file mode 100644 (file)
index 0000000..79d3210
--- /dev/null
@@ -0,0 +1,11 @@
+/* { dg-do compile { target fpic } } */
+/* { dg-options "-O2 -fPIC" } */
+int *block;
+void final(unsigned int j)
+{
+  unsigned int i;
+  unsigned char *data = (unsigned char *)"\0";
+  for (i = 0; i < 8; i++)
+    for (; j + 63 < 1; j += 64)
+      block = (int *) &data[j];
+}