diff options
author | Tom de Vries <tom@codesourcery.com> | 2015-11-17 21:42:09 +0000 |
---|---|---|
committer | Tom de Vries <vries@gcc.gnu.org> | 2015-11-17 21:42:09 +0000 |
commit | 886c388d74901f294841263f2c2400fe8a586eae (patch) | |
tree | 6af2fa8536739693ee356033f1818403b79d8687 /gcc/omp-low.c | |
parent | 211c93053a337e65ef245d933f4804a492ba5c6e (diff) | |
download | gcc-886c388d74901f294841263f2c2400fe8a586eae.zip gcc-886c388d74901f294841263f2c2400fe8a586eae.tar.gz gcc-886c388d74901f294841263f2c2400fe8a586eae.tar.bz2 |
Add in_oacc_kernels_region in struct loop
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
Diffstat (limited to 'gcc/omp-low.c')
-rw-r--r-- | gcc/omp-low.c | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/gcc/omp-low.c b/gcc/omp-low.c index efcc971..830db75 100644 --- a/gcc/omp-low.c +++ b/gcc/omp-low.c @@ -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; |