omp-offload.c (oacc_xform_loop): Enable SIMD vectorization on non-SIMT targets in...
authorCesar Philippidis <cesar@codesourcery.com>
Mon, 18 Sep 2017 14:15:37 +0000 (07:15 -0700)
committerCesar Philippidis <cesar@gcc.gnu.org>
Mon, 18 Sep 2017 14:15:37 +0000 (07:15 -0700)
gcc/
* omp-offload.c (oacc_xform_loop): Enable SIMD vectorization on
non-SIMT targets in acc vector loops.

From-SVN: r252928

gcc/ChangeLog
gcc/omp-offload.c

index 39bae5be959f31697e8b00c22ba01dd26cc36e9d..eb028010efa2f7cd99afbd7607b4b9b14085cffc 100644 (file)
@@ -1,3 +1,8 @@
+2017-09-18  Cesar Philippidis  <cesar@codesourcery.com>
+
+       * omp-offload.c (oacc_xform_loop): Enable SIMD vectorization on
+       non-SIMT targets in acc vector loops.
+
 2017-09-18  Claudiu Zissulescu  <claziss@synopsys.com>
 
        * configure.ac: Add arc and check if assembler supports gdwarf2.
index 2d4fd41168054a5894fe346a5c8ea2d12bed9de6..9d5b8bef649cf5193e5a66461a456fe7ba82f71a 100644 (file)
@@ -51,6 +51,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "intl.h"
 #include "stringpool.h"
 #include "attribs.h"
+#include "cfgloop.h"
 
 /* Describe the OpenACC looping structure of a function.  The entire
    function is held in a 'NULL' loop.  */
@@ -370,6 +371,30 @@ oacc_xform_loop (gcall *call)
       break;
 
     case IFN_GOACC_LOOP_OFFSET:
+      /* Enable vectorization on non-SIMT targets.  */
+      if (!targetm.simt.vf
+         && outer_mask == GOMP_DIM_MASK (GOMP_DIM_VECTOR)
+         /* If not -fno-tree-loop-vectorize, hint that we want to vectorize
+            the loop.  */
+         && (flag_tree_loop_vectorize
+             || !global_options_set.x_flag_tree_loop_vectorize))
+       {
+         basic_block bb = gsi_bb (gsi);
+         struct loop *parent = bb->loop_father;
+         struct loop *body = parent->inner;
+
+         parent->force_vectorize = true;
+         parent->safelen = INT_MAX;
+
+         /* "Chunking loops" may have inner loops.  */
+         if (parent->inner)
+           {
+             body->force_vectorize = true;
+             body->safelen = INT_MAX;
+           }
+
+         cfun->has_force_vectorize_loops = true;
+       }
       if (striding)
        {
          r = oacc_thread_numbers (true, mask, &seq);