i386.c (ix86_simd_clone_compute_vecsize_and_simdlen): Bump the upper SIMDLEN limits...

* config/i386/i386.c (ix86_simd_clone_compute_vecsize_and_simdlen):
	Bump the upper SIMDLEN limits, so that if the return type or
	characteristic type if the return type is void can be passed in
	all available SSE2/AVX/AVX2/AVX512-F registers, the SIMDLEN is
	allowed.

	* c-c++-common/cilk-plus/SE/ef_error2.c (func2): Use vectorlength
	128 instead of 32.

From-SVN: r234913
This commit is contained in:
Jakub Jelinek 2016-04-12 21:37:21 +02:00 committed by Jakub Jelinek
parent 13bd7c2bc5
commit 6512fa6dc0
4 changed files with 36 additions and 18 deletions

View File

@ -1,3 +1,11 @@
2016-04-12 Jakub Jelinek <jakub@redhat.com>
* config/i386/i386.c (ix86_simd_clone_compute_vecsize_and_simdlen):
Bump the upper SIMDLEN limits, so that if the return type or
characteristic type if the return type is void can be passed in
all available SSE2/AVX/AVX2/AVX512-F registers, the SIMDLEN is
allowed.
2016-04-12 Michael Meissner <meissner@linux.vnet.ibm.com> 2016-04-12 Michael Meissner <meissner@linux.vnet.ibm.com>
PR target/70680 PR target/70680

View File

@ -53761,7 +53761,7 @@ ix86_simd_clone_compute_vecsize_and_simdlen (struct cgraph_node *node,
if (clonei->simdlen if (clonei->simdlen
&& (clonei->simdlen < 2 && (clonei->simdlen < 2
|| clonei->simdlen > 128 || clonei->simdlen > 1024
|| (clonei->simdlen & (clonei->simdlen - 1)) != 0)) || (clonei->simdlen & (clonei->simdlen - 1)) != 0))
{ {
warning_at (DECL_SOURCE_LOCATION (node->decl), 0, warning_at (DECL_SOURCE_LOCATION (node->decl), 0,
@ -53867,22 +53867,29 @@ ix86_simd_clone_compute_vecsize_and_simdlen (struct cgraph_node *node,
clonei->simdlen /= GET_MODE_BITSIZE (TYPE_MODE (base_type)); clonei->simdlen /= GET_MODE_BITSIZE (TYPE_MODE (base_type));
} }
else if (clonei->simdlen > 16) else if (clonei->simdlen > 16)
switch (clonei->vecsize_int)
{ {
case 512: /* For compatibility with ICC, use the same upper bounds
/* For AVX512-F, support VLEN up to 128. */ for simdlen. In particular, for CTYPE below, use the return type,
break; unless the function returns void, in that case use the characteristic
case 256: type. If it is possible for given SIMDLEN to pass CTYPE value
/* For AVX2, support VLEN up to 32. */ in registers (8 [XYZ]MM* regs for 32-bit code, 16 [XYZ]MM* regs
if (clonei->simdlen <= 32) for 64-bit code), accept that SIMDLEN, otherwise warn and don't
break; emit corresponding clone. */
/* FALLTHRU */ tree ctype = ret_type;
default: if (TREE_CODE (ret_type) == VOID_TYPE)
/* Otherwise, support VLEN up to 16. */ ctype = base_type;
int cnt = GET_MODE_BITSIZE (TYPE_MODE (ctype)) * clonei->simdlen;
if (SCALAR_INT_MODE_P (TYPE_MODE (ctype)))
cnt /= clonei->vecsize_int;
else
cnt /= clonei->vecsize_float;
if (cnt > (TARGET_64BIT ? 16 : 8))
{
warning_at (DECL_SOURCE_LOCATION (node->decl), 0, warning_at (DECL_SOURCE_LOCATION (node->decl), 0,
"unsupported simdlen %d", clonei->simdlen); "unsupported simdlen %d", clonei->simdlen);
return 0; return 0;
} }
}
return ret; return ret;
} }

View File

@ -1,5 +1,8 @@
2016-04-12 Jakub Jelinek <jakub@redhat.com> 2016-04-12 Jakub Jelinek <jakub@redhat.com>
* c-c++-common/cilk-plus/SE/ef_error2.c (func2): Use vectorlength
128 instead of 32.
PR c++/70571 PR c++/70571
* g++.dg/ext/pr70571.C: New test. * g++.dg/ext/pr70571.C: New test.

View File

@ -1,8 +1,8 @@
/* { dg-do compile { target { i?86-*-* x86_64-*-* } } } */ /* { dg-do compile { target { i?86-*-* x86_64-*-* } } } */
/* { dg-options "-fcilkplus -Wall" } */ /* { dg-options "-fcilkplus -Wall" } */
__attribute__((vector (vectorlength(32)))) __attribute__((vector (vectorlength(128))))
//#pragma omp simd simdlen (32) //#pragma omp simd simdlen (128)
int func2 (int x, int y) /* { dg-warning "unsupported simdlen" } */ int func2 (int x, int y) /* { dg-warning "unsupported simdlen" } */
{ {
return (x+y); return (x+y);