diff options
author | Jakub Jelinek <jakub@redhat.com> | 2013-07-03 22:23:38 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2013-07-03 22:23:38 +0200 |
commit | f7bc421d11513d7852e14efe60c107f1a910ec72 (patch) | |
tree | b83e620b3e0a1e1c9f6c333dcde0289983574229 | |
parent | 2febd8772b4b3edde917141f58fb66ae44457474 (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/config/i386/predicates.md | 33 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 3 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/pr57777.c | 13 |
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]; +} |