diff options
author | Jakub Jelinek <jakub@redhat.com> | 2010-02-23 23:52:20 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2010-02-23 23:52:20 +0100 |
commit | 8f40ad50192495c5ae12d53e5a563ad1b60738b3 (patch) | |
tree | 53b241cf7864323c8b5c0e63099b71ac0761b869 /gcc | |
parent | c6569cd04e1677007aad30c13ed934c34f9ecaac (diff) | |
download | gcc-8f40ad50192495c5ae12d53e5a563ad1b60738b3.zip gcc-8f40ad50192495c5ae12d53e5a563ad1b60738b3.tar.gz gcc-8f40ad50192495c5ae12d53e5a563ad1b60738b3.tar.bz2 |
re PR target/43107 (ICE: SIGSEGV with -O3 -mavx)
PR target/43107
* config/i386/i386.c (avx_vpermilp_parallel): Reject indexes
greater or equal to nelt instead of 2 * nelt.
(expand_vec_perm_1): When op0 and op1 are equal, mask indexes
with nelt - 1.
* gcc.target/i386/pr43107.c: New test.
From-SVN: r157022
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/config/i386/i386.c | 22 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/pr43107.c | 20 |
4 files changed, 47 insertions, 8 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 0361b40..b4e3cab 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2010-02-23 Jakub Jelinek <jakub@redhat.com> + + PR target/43107 + * config/i386/i386.c (avx_vpermilp_parallel): Reject indexes + greater or equal to nelt instead of 2 * nelt. + (expand_vec_perm_1): When op0 and op1 are equal, mask indexes + with nelt - 1. + 2010-02-23 Jason Merrill <jason@redhat.com> PR debug/42800 diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 84f5f53..bb03cba 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -24673,7 +24673,7 @@ avx_vpermilp_parallel (rtx par, enum machine_mode mode) if (!CONST_INT_P (er)) return 0; ei = INTVAL (er); - if (ei >= 2 * nelt) + if (ei >= nelt) return 0; ipar[i] = ei; } @@ -29265,7 +29265,12 @@ expand_vec_perm_1 (struct expand_vec_perm_d *d) input where SEL+CONCAT may not. */ if (d->op0 == d->op1) { - if (expand_vselect (d->target, d->op0, d->perm, nelt)) + int mask = nelt - 1; + + for (i = 0; i < nelt; i++) + perm2[i] = d->perm[i] & mask; + + if (expand_vselect (d->target, d->op0, perm2, nelt)) return true; /* There are plenty of patterns in sse.md that are written for @@ -29276,8 +29281,8 @@ expand_vec_perm_1 (struct expand_vec_perm_d *d) every other permutation operand. */ for (i = 0; i < nelt; i += 2) { - perm2[i] = d->perm[i]; - perm2[i+1] = d->perm[i+1] + nelt; + perm2[i] = d->perm[i] & mask; + perm2[i + 1] = (d->perm[i + 1] & mask) + nelt; } if (expand_vselect_vconcat (d->target, d->op0, d->op0, perm2, nelt)) return true; @@ -29285,11 +29290,12 @@ expand_vec_perm_1 (struct expand_vec_perm_d *d) /* Recognize shufps, which means adding {0, 0, nelt, nelt}. */ if (nelt >= 4) { - memcpy (perm2, d->perm, nelt); - for (i = 2; i < nelt; i += 4) + for (i = 0; i < nelt; i += 4) { - perm2[i+0] += nelt; - perm2[i+1] += nelt; + perm2[i + 0] = d->perm[i + 0] & mask; + perm2[i + 1] = d->perm[i + 1] & mask; + perm2[i + 2] = (d->perm[i + 2] & mask) + nelt; + perm2[i + 3] = (d->perm[i + 3] & mask) + nelt; } if (expand_vselect_vconcat (d->target, d->op0, d->op0, perm2, nelt)) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 5f9fdc0..dc688dd 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-02-23 Jakub Jelinek <jakub@redhat.com> + + PR target/43107 + * gcc.target/i386/pr43107.c: New test. + 2010-02-23 Jason Merrill <jason@redhat.com> PR c++/43143 diff --git a/gcc/testsuite/gcc.target/i386/pr43107.c b/gcc/testsuite/gcc.target/i386/pr43107.c new file mode 100644 index 0000000..8796529 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr43107.c @@ -0,0 +1,20 @@ +/* PR target/43107 */ +/* { dg-do compile } */ +/* { dg-options "-O3 -mavx" } */ + +extern void bar (float b[4][4]); + +void +foo () +{ + float a[4][4], b[4][4]; + int i, j; + for (i = 0; i < 4; i++) + { + for (j = 0; j < 4; j++) + a[i][j] = 0; + for (j = 0; j < 4; j++) + b[i][j] = a[i][j]; + } + bar (b); +} |