aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2013-07-03 22:23:38 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2013-07-03 22:23:38 +0200
commitf7bc421d11513d7852e14efe60c107f1a910ec72 (patch)
treeb83e620b3e0a1e1c9f6c333dcde0289983574229
parent2febd8772b4b3edde917141f58fb66ae44457474 (diff)
downloadgcc-f7bc421d11513d7852e14efe60c107f1a910ec72.zip
gcc-f7bc421d11513d7852e14efe60c107f1a910ec72.tar.gz
gcc-f7bc421d11513d7852e14efe60c107f1a910ec72.tar.bz2
re PR target/57777 (Python module fails compilation with "-march=core-avx2 -O3")
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
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/config/i386/predicates.md33
-rw-r--r--gcc/testsuite/ChangeLog3
-rw-r--r--gcc/testsuite/gcc.target/i386/pr57777.c13
4 files changed, 43 insertions, 12 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 0addb65..2eef721 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/config/i386/predicates.md b/gcc/config/i386/predicates.md
index 90ab8da..b64ef69 100644
--- a/gcc/config/i386/predicates.md
+++ b/gcc/config/i386/predicates.md
@@ -880,19 +880,28 @@
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;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 410bc21..0a97f98 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..9c1a392
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr57777.c
@@ -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];
+}