i386.c (local_symbolic_operand): Move LABEL_REF test after CONST test.
authorJakub Jelinek <jakub@redhat.com>
Wed, 23 Oct 2002 21:20:08 +0000 (23:20 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Wed, 23 Oct 2002 21:20:08 +0000 (23:20 +0200)
* config/i386/i386.c (local_symbolic_operand): Move LABEL_REF test
after CONST test.

* gcc.dg/20021023-1.c: New test.

From-SVN: r58469

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

index 96011b32c4c8612dc70a235154550bb3a6942ac2..0a33a70ef1a252394119fdb67e799c9fd0a885a9 100644 (file)
@@ -1,3 +1,8 @@
+2002-10-23  Jakub Jelinek  <jakub@redhat.com>
+
+       * config/i386/i386.c (local_symbolic_operand): Move LABEL_REF test
+       after CONST test.
+
 2002-10-23  Steve Ellcey  <sje@cup.hp.com>
 
        * config/ia64/ia64.c (hfa_element_mode): Don't allow 128 bit floats
index f3d5acc59b3d54d143d2db1f1e11a6718026d169..4b13c46ec9c6c19781cd3650ada0e658c6993ea9 100644 (file)
@@ -3063,9 +3063,6 @@ local_symbolic_operand (op, mode)
      rtx op;
      enum machine_mode mode ATTRIBUTE_UNUSED;
 {
-  if (GET_CODE (op) == LABEL_REF)
-    return 1;
-
   if (GET_CODE (op) == CONST
       && GET_CODE (XEXP (op, 0)) == PLUS
       && GET_CODE (XEXP (XEXP (op, 0), 1)) == CONST_INT
@@ -3074,6 +3071,9 @@ local_symbolic_operand (op, mode)
              && INTVAL (XEXP (XEXP (op, 0), 1)) < 16*1024*1024)))
     op = XEXP (XEXP (op, 0), 0);
 
+  if (GET_CODE (op) == LABEL_REF)
+    return 1;
+
   if (GET_CODE (op) != SYMBOL_REF)
     return 0;
 
index d0c5776b5eb63320ac52bf82a0275edc2db7cb37..e2fa07709ca6c6a346210202788ff7287c08c4a4 100644 (file)
@@ -1,3 +1,7 @@
+2002-10-23  Jakub Jelinek  <jakub@redhat.com>
+
+       * gcc.dg/20021023-1.c: New test.
+
 2002-10-23  Mark Mitchell  <mark@codesourcery.com>
 
        PR c++/7679
diff --git a/gcc/testsuite/gcc.dg/20021023-1.c b/gcc/testsuite/gcc.dg/20021023-1.c
new file mode 100644 (file)
index 0000000..6fe555a
--- /dev/null
@@ -0,0 +1,24 @@
+/* This testcase ICEd on x86-64 because LABEL_REF + small const was not
+   considered as local_symbolic_operand.  */
+/* { dg-do compile } */
+/* { dg-options "-O2 -fpic" } */
+
+typedef __builtin_va_list va_list;
+
+static unsigned int
+foo (void *a, float b, const char *c, va_list d, void *e)
+{
+  return -1;
+}
+
+unsigned int
+bar (void *a, float b, const char *c, ...)
+{
+  va_list args;
+  unsigned int d;
+
+  __builtin_stdarg_start (args, c);
+  d = foo (a, b, c, args, a);
+  __builtin_va_end (args);
+  return d;
+}