Message ID | alpine.LSU.2.11.1603020953460.31547@t29.fhfr.qr |
---|---|
State | New |
Headers | show |
On Wed, Mar 2, 2016 at 9:54 AM, Richard Biener <rguenther@suse.de> wrote: > > The following fix from Uros properly (not) handles XFmode vectors in > type_natural_mode. > > Bootstrapped and tested on x86_64-unknown-linux-gnu by Uros, applied. > > Richard. > > 2016-03-02 Richard Biener <rguenther@suse.de> > Uros Bizjak <ubizjak@gmail.com> > > PR target/67278 > * config/i386/i386.c (type_natural_mode): Handle XFmode vectors. > > * gcc.dg/simd-8.c: New testcase. > > Index: gcc/config/i386/i386.c > =================================================================== > --- gcc/config/i386/i386.c (revision 233897) > +++ gcc/config/i386/i386.c (working copy) > @@ -7794,6 +7794,10 @@ type_natural_mode (const_tree type, cons > { > machine_mode innermode = TYPE_MODE (TREE_TYPE (type)); > > + /* There are no XFmode vector modes. */ > + if (innermode = XFmode) No, not assignment "=" , but comparison "==" here! Uros.
> Index: gcc/config/i386/i386.c > =================================================================== > --- gcc/config/i386/i386.c (revision 233897) > +++ gcc/config/i386/i386.c (working copy) > @@ -7794,6 +7794,10 @@ type_natural_mode (const_tree type, cons > { > machine_mode innermode = TYPE_MODE (TREE_TYPE (type)); > > + /* There are no XFmode vector modes. */ > + if (innermode = XFmode) > + return mode; > + > if (TREE_CODE (TREE_TYPE (type)) == REAL_TYPE) > mode = MIN_MODE_VECTOR_FLOAT; > else You lost one of the '=' though.
Richard Biener <rguenther@suse.de> writes: > Index: gcc/testsuite/gcc.dg/simd-8.c > =================================================================== > --- gcc/testsuite/gcc.dg/simd-8.c (revision 0) > +++ gcc/testsuite/gcc.dg/simd-8.c (working copy) > @@ -0,0 +1,19 @@ > +/* { dg-do compile } */ > + > +#if __SIZEOF_LONG_DOUBLE__ == 16 || __SIZEOF_LONG_DOUBLE__ == 8 > +typedef long double a __attribute__((vector_size (32))); > + > +a __attribute__((noinline)) > +sum (a first, a second) > +{ > + return first + second; > +} > + > +a > +foo (a x, a y, a z) > +{ > + return sum (x, y) + z; > +} > +#else > +int main() {} > +#endif On powerpc: FAIL: gcc.dg/simd-8.c (test for excess errors) Excess errors: /daten/gcc/gcc-20160307/gcc/testsuite/gcc.dg/simd-8.c:8:1: warning: GCC vector returned by reference: non-standard ABI extension with no compatibility guarantee /daten/gcc/gcc-20160307/gcc/testsuite/gcc.dg/simd-8.c:7:1: warning: GCC vector passed by reference: non-standard ABI extension with no compatibility guarantee Andreas.
Index: gcc/config/i386/i386.c =================================================================== --- gcc/config/i386/i386.c (revision 233897) +++ gcc/config/i386/i386.c (working copy) @@ -7794,6 +7794,10 @@ type_natural_mode (const_tree type, cons { machine_mode innermode = TYPE_MODE (TREE_TYPE (type)); + /* There are no XFmode vector modes. */ + if (innermode = XFmode) + return mode; + if (TREE_CODE (TREE_TYPE (type)) == REAL_TYPE) mode = MIN_MODE_VECTOR_FLOAT; else Index: gcc/testsuite/gcc.dg/simd-8.c =================================================================== --- gcc/testsuite/gcc.dg/simd-8.c (revision 0) +++ gcc/testsuite/gcc.dg/simd-8.c (working copy) @@ -0,0 +1,19 @@ +/* { dg-do compile } */ + +#if __SIZEOF_LONG_DOUBLE__ == 16 || __SIZEOF_LONG_DOUBLE__ == 8 +typedef long double a __attribute__((vector_size (32))); + +a __attribute__((noinline)) +sum (a first, a second) +{ + return first + second; +} + +a +foo (a x, a y, a z) +{ + return sum (x, y) + z; +} +#else +int main() {} +#endif