re PR target/57777 (Python module fails compilation with "-march=core-avx2 -O3")
authorJakub Jelinek <jakub@redhat.com>
Wed, 3 Jul 2013 20:23:38 +0000 (22:23 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Wed, 3 Jul 2013 20:23:38 +0000 (22:23 +0200)
PR target/57777
* config/i386/predicates.md (vsib_address_operand): Disallow
SYMBOL_REF or LABEL_REF in parts.disp if TARGET_64BIT && flag_pic.

* gcc.target/i386/pr57777.c: New test.

From-SVN: r200649

gcc/ChangeLog
gcc/config/i386/predicates.md
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/pr57777.c [new file with mode: 0644]

index 0addb65022dfb8337e48b4c39990d98397b4c1dc..2eef72124a7b02a85ceed85d9906bb7f6ed6d1fc 100644 (file)
@@ -1,3 +1,9 @@
+2013-07-03  Jakub Jelinek  <jakub@redhat.com>
+
+       PR target/57777
+       * config/i386/predicates.md (vsib_address_operand): Disallow
+       SYMBOL_REF or LABEL_REF in parts.disp if TARGET_64BIT && flag_pic.
+
 2013-07-03  Hans-Peter Nilsson  <hp@bitrange.com>
 
        PR middle-end/55030
index 90ab8da1ccba56a87f47c8b0096ef460dfff563c..b64ef6999ee34876d845020b0b8f8fb442da156d 100644 (file)
     return false;
 
   /* VSIB addressing doesn't support (%rip).  */
-  if (parts.disp && GET_CODE (parts.disp) == CONST)
+  if (parts.disp)
     {
-      disp = XEXP (parts.disp, 0);
-      if (GET_CODE (disp) == PLUS)
-       disp = XEXP (disp, 0);
-      if (GET_CODE (disp) == UNSPEC)
-       switch (XINT (disp, 1))
-         {
-         case UNSPEC_GOTPCREL:
-         case UNSPEC_PCREL:
-         case UNSPEC_GOTNTPOFF:
-           return false;
-         }
+      disp = parts.disp;
+      if (GET_CODE (disp) == CONST)
+       {
+         disp = XEXP (disp, 0);
+         if (GET_CODE (disp) == PLUS)
+           disp = XEXP (disp, 0);
+         if (GET_CODE (disp) == UNSPEC)
+           switch (XINT (disp, 1))
+             {
+             case UNSPEC_GOTPCREL:
+             case UNSPEC_PCREL:
+             case UNSPEC_GOTNTPOFF:
+               return false;
+             }
+       }
+      if (TARGET_64BIT
+         && flag_pic
+         && (GET_CODE (disp) == SYMBOL_REF
+             || GET_CODE (disp) == LABEL_REF))
+       return false;
     }
 
   return true;
index 410bc213b23dcea142c654c6b0269871f50c0b3b..0a97f98c8a98c8ee485fc25982ece0d86f286f43 100644 (file)
@@ -1,5 +1,8 @@
 2013-07-03  Jakub Jelinek  <jakub@redhat.com>
 
+       PR target/57777
+       * gcc.target/i386/pr57777.c: New test.
+
        PR c++/57771
        * g++.dg/template/arg9.C: New test.
 
diff --git a/gcc/testsuite/gcc.target/i386/pr57777.c b/gcc/testsuite/gcc.target/i386/pr57777.c
new file mode 100644 (file)
index 0000000..9c1a392
--- /dev/null
@@ -0,0 +1,13 @@
+/* PR target/57777 */
+/* { dg-do assemble { target avx2 } } */
+/* { dg-options "-O3 -mavx2" } */
+/* { dg-additional-options "-fpic" { target fpic } } */
+
+void
+foo (unsigned long *x, int *y)
+{
+  static unsigned long b[2] = { 0x0UL, 0x9908b0dfUL };
+  int c;
+  for (c = 0; c < 512; c++)
+    x[c] = b[x[c] & 1UL];
+}