Message ID | 20140116190552.GV892@tucnak.redhat.com |
---|---|
State | New |
Headers | show |
On Thu, Jan 16, 2014 at 8:05 PM, Jakub Jelinek <jakub@redhat.com> wrote: > As the following testcase shows, if target of a gather intrinsic > is e.g. a MEM, we shouldn't use it as target, because it fails > the output operand predicate. > > Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux, > ok for trunk/4.8? > > 2014-01-16 Jakub Jelinek <jakub@redhat.com> > > PR target/59839 > * config/i386/i386.c (ix86_expand_builtin): If target doesn't > satisfy operand 0 predicate for gathers, use a new pseudo as > subtarget. > > * gcc.target/i386/pr59839.c: New test. OK everywhere. Thanks, Uros.
--- gcc/config/i386/i386.c.jj 2014-01-16 09:41:19.000000000 +0100 +++ gcc/config/i386/i386.c 2014-01-16 14:32:35.796844336 +0100 @@ -35511,7 +35511,9 @@ addcarryx: mode4 = insn_data[icode].operand[5].mode; if (target == NULL_RTX - || GET_MODE (target) != insn_data[icode].operand[0].mode) + || GET_MODE (target) != insn_data[icode].operand[0].mode + || !insn_data[icode].operand[0].predicate (target, + GET_MODE (target))) subtarget = gen_reg_rtx (insn_data[icode].operand[0].mode); else subtarget = target; --- gcc/testsuite/gcc.target/i386/pr59839.c.jj 2014-01-16 14:29:34.936767655 +0100 +++ gcc/testsuite/gcc.target/i386/pr59839.c 2014-01-16 14:29:07.000000000 +0100 @@ -0,0 +1,12 @@ +/* PR target/59839 */ +/* { dg-do compile } */ +/* { dg-options "-O0 -mavx2" } */ + +#include <x86intrin.h> + +void +test (const float *x) +{ + __m256i i = _mm256_set1_epi32 (1); + __m256 d = _mm256_i32gather_ps (x, i, 1); +}