* config/i386/i386.c (local_symbolic_operand): Move LABEL_REF test
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 23 Oct 2002 21:20:08 +0000 (21:20 +0000)
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 23 Oct 2002 21:20:08 +0000 (21:20 +0000)
after CONST test.

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

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@58469 138bc75d-0d04-0410-961f-82ee72b054a4

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

index 96011b3..0a33a70 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 f3d5acc..4b13c46 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 d0c5776..e2fa077 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;
+}