i386.c (ix86_simd_clone_compute_vecsize_and_simdlen): Bump the upper SIMDLEN limits...
authorJakub Jelinek <jakub@redhat.com>
Tue, 12 Apr 2016 19:37:21 +0000 (21:37 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Tue, 12 Apr 2016 19:37:21 +0000 (21:37 +0200)
* 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

gcc/ChangeLog
gcc/config/i386/i386.c
gcc/testsuite/ChangeLog
gcc/testsuite/c-c++-common/cilk-plus/SE/ef_error2.c

index d132dcf2879407aaf0bc5074af298ff7f2d11457..949ab9e2c6d9f3c78e6b4637159f4e47b101b4ba 100644 (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>
 
        PR target/70680
index acbecbd24e10670fde3ea66b0c35d002c56cd216..1fa007efdc3f8bd8e4db31b891e9cd1f9d570381 100644 (file)
@@ -53761,7 +53761,7 @@ ix86_simd_clone_compute_vecsize_and_simdlen (struct cgraph_node *node,
 
   if (clonei->simdlen
       && (clonei->simdlen < 2
-         || clonei->simdlen > 128
+         || clonei->simdlen > 1024
          || (clonei->simdlen & (clonei->simdlen - 1)) != 0))
     {
       warning_at (DECL_SOURCE_LOCATION (node->decl), 0,
@@ -53867,21 +53867,28 @@ ix86_simd_clone_compute_vecsize_and_simdlen (struct cgraph_node *node,
       clonei->simdlen /= GET_MODE_BITSIZE (TYPE_MODE (base_type));
     }
   else if (clonei->simdlen > 16)
-    switch (clonei->vecsize_int)
-      {
-      case 512:
-       /* For AVX512-F, support VLEN up to 128.  */
-       break;
-      case 256:
-       /* For AVX2, support VLEN up to 32.  */
-       if (clonei->simdlen <= 32)
-         break;
-       /* FALLTHRU */
-      default:
-       /* Otherwise, support VLEN up to 16.  */
-       warning_at (DECL_SOURCE_LOCATION (node->decl), 0,
-                   "unsupported simdlen %d", clonei->simdlen);
-       return 0;
+    {
+      /* For compatibility with ICC, use the same upper bounds
+        for simdlen.  In particular, for CTYPE below, use the return type,
+        unless the function returns void, in that case use the characteristic
+        type.  If it is possible for given SIMDLEN to pass CTYPE value
+        in registers (8 [XYZ]MM* regs for 32-bit code, 16 [XYZ]MM* regs
+        for 64-bit code), accept that SIMDLEN, otherwise warn and don't
+        emit corresponding clone.  */
+      tree ctype = ret_type;
+      if (TREE_CODE (ret_type) == VOID_TYPE)
+       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,
+                     "unsupported simdlen %d", clonei->simdlen);
+         return 0;
+       }
       }
   return ret;
 }
index e4adde84406cfde9f701726525ea3041d2f58bf5..d7964de422f4fff3f260fafc250ce8ce05a53ca3 100644 (file)
@@ -1,5 +1,8 @@
 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
        * g++.dg/ext/pr70571.C: New test.
 
index 518d6407eeb1bc856cfc5394ba818555f5e0af47..89e0c39b02c3bbe4642f42087849c6bbf313959f 100644 (file)
@@ -1,8 +1,8 @@
 /* { dg-do compile { target { i?86-*-* x86_64-*-* } } } */
 /* { dg-options "-fcilkplus -Wall" } */
 
-__attribute__((vector (vectorlength(32)))) 
-//#pragma omp simd simdlen (32)
+__attribute__((vector (vectorlength(128)))) 
+//#pragma omp simd simdlen (128)
 int func2 (int x, int y)  /* { dg-warning "unsupported simdlen" } */
 {
   return (x+y);