Add in_oacc_kernels_region in struct loop
authorTom de Vries <tom@codesourcery.com>
Tue, 17 Nov 2015 21:42:09 +0000 (21:42 +0000)
committerTom de Vries <vries@gcc.gnu.org>
Tue, 17 Nov 2015 21:42:09 +0000 (21:42 +0000)
2015-11-17  Tom de Vries  <tom@codesourcery.com>

* cfgloop.h (struct loop): Add in_oacc_kernels_region field.
* omp-low.c (mark_loops_in_oacc_kernels_region): New function.
(expand_omp_target): Call mark_loops_in_oacc_kernels_region.

From-SVN: r230502

gcc/ChangeLog
gcc/cfgloop.h
gcc/cfgloopmanip.c
gcc/omp-low.c

index 869685077c8b544fe9c1e80eeb82fc894f598bde..b208b470c0b62fd2e629bd00928a38113e1903b3 100644 (file)
@@ -1,3 +1,9 @@
+2015-11-17  Tom de Vries  <tom@codesourcery.com>
+
+       * cfgloop.h (struct loop): Add in_oacc_kernels_region field.
+       * omp-low.c (mark_loops_in_oacc_kernels_region): New function.
+       (expand_omp_target): Call mark_loops_in_oacc_kernels_region.
+
 2015-11-17  Bernd Schmidt  <bschmidt@redhat.com>
 
        * regrename.c (regrename_find_superclass): New function, code moved
index 6af68939edaded2eb614fb386be7170b8efc79c4..ee73bf994c18fc037e0de94b7b5c879182109893 100644 (file)
@@ -191,6 +191,9 @@ struct GTY ((chain_next ("%h.next"))) loop {
   /* True if we should try harder to vectorize this loop.  */
   bool force_vectorize;
 
+  /* True if the loop is part of an oacc kernels region.  */
+  bool in_oacc_kernels_region;
+
   /* For SIMD loops, this is a unique identifier of the loop, referenced
      by IFN_GOMP_SIMD_VF, IFN_GOMP_SIMD_LANE and IFN_GOMP_SIMD_LAST_LANE
      builtins.  */
index 97df42f28dd6f49a2be6b4e4febcfc8dc215911c..b327abd490d56c75dbd3d6f625c00c2b3419a739 100644 (file)
@@ -1021,6 +1021,7 @@ copy_loop_info (struct loop *loop, struct loop *target)
   target->estimate_state = loop->estimate_state;
   target->warned_aggressive_loop_optimizations
     |= loop->warned_aggressive_loop_optimizations;
+  target->in_oacc_kernels_region = loop->in_oacc_kernels_region;
 }
 
 /* Copies copy of LOOP as subloop of TARGET loop, placing newly
index efcc971b98a384b37ffd8ac68e5e1129660b9bc1..830db75a0e672176ca4dd0c109cd8ac1e53eb04c 100644 (file)
@@ -12426,6 +12426,46 @@ get_oacc_ifn_dim_arg (const gimple *stmt)
   return (int) axis;
 }
 
+/* Mark the loops inside the kernels region starting at REGION_ENTRY and ending
+   at REGION_EXIT.  */
+
+static void
+mark_loops_in_oacc_kernels_region (basic_block region_entry,
+                                  basic_block region_exit)
+{
+  struct loop *outer = region_entry->loop_father;
+  gcc_assert (region_exit == NULL || outer == region_exit->loop_father);
+
+  /* Don't parallelize the kernels region if it contains more than one outer
+     loop.  */
+  unsigned int nr_outer_loops = 0;
+  struct loop *single_outer;
+  for (struct loop *loop = outer->inner; loop != NULL; loop = loop->next)
+    {
+      gcc_assert (loop_outer (loop) == outer);
+
+      if (!dominated_by_p (CDI_DOMINATORS, loop->header, region_entry))
+       continue;
+
+      if (region_exit != NULL
+         && dominated_by_p (CDI_DOMINATORS, loop->header, region_exit))
+       continue;
+
+      nr_outer_loops++;
+      single_outer = loop;
+    }
+  if (nr_outer_loops != 1)
+    return;
+
+  for (struct loop *loop = single_outer->inner; loop != NULL; loop = loop->inner)
+    if (loop->next)
+      return;
+
+  /* Mark the loops in the region.  */
+  for (struct loop *loop = single_outer; loop != NULL; loop = loop->inner)
+    loop->in_oacc_kernels_region = true;
+}
+
 /* Expand the GIMPLE_OMP_TARGET starting at REGION.  */
 
 static void
@@ -12481,6 +12521,9 @@ expand_omp_target (struct omp_region *region)
   entry_bb = region->entry;
   exit_bb = region->exit;
 
+  if (gimple_omp_target_kind (entry_stmt) == GF_OMP_TARGET_KIND_OACC_KERNELS)
+    mark_loops_in_oacc_kernels_region (region->entry, region->exit);
+
   if (offloaded)
     {
       unsigned srcidx, dstidx, num;