This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [committed, gomp4] Handle sequential code in kernels region patch series
- From: Tom de Vries <Tom_deVries at mentor dot com>
- To: "gcc-patches at gnu dot org" <gcc-patches at gnu dot org>
- Cc: Jakub Jelinek <jakub at redhat dot com>
- Date: Mon, 12 Oct 2015 19:18:23 +0200
- Subject: Re: [committed, gomp4] Handle sequential code in kernels region patch series
- Authentication-results: sourceware.org; auth=none
- References: <561BEA02 dot 6010808 at mentor dot com>
On 12/10/15 19:12, Tom de Vries wrote:
Hi,
I've committed the following patch series.
1 Add get_bbs_in_oacc_kernels_region
2 Handle sequential code in kernels region
3 Handle sequential code in kernels region - Testcases
The patch series adds detection of whether sequential code (that is,
code in the oacc kernels region before and after the loop that is to be
parallelized), is safe to execute in parallel.
Bootstrapped and reg-tested on x86_64.
I'll post the patches individually, in reply to this email.
This patch adds an oacc kernels infrastructure function:
extern vec<basic_block> get_bbs_in_oacc_kernels_region (basic_block,
basic_block);
Thanks,
- Tom
Add get_bbs_in_oacc_kernels_region
2015-10-12 Tom de Vries <tom@codesourcery.com>
* omp-low.c (get_bbs_in_oacc_kernels_region): New function.
* omp-low.h (get_bbs_in_oacc_kernels_region): Declare.
---
gcc/omp-low.c | 40 ++++++++++++++++++++++++++++++++++++++++
gcc/omp-low.h | 2 ++
2 files changed, 42 insertions(+)
diff --git a/gcc/omp-low.c b/gcc/omp-low.c
index 2289486..f6e0247 100644
--- a/gcc/omp-low.c
+++ b/gcc/omp-low.c
@@ -9959,6 +9959,46 @@ mark_loops_in_oacc_kernels_region (basic_block region_entry,
loop->in_oacc_kernels_region = true;
}
+/* Return blocks in oacc kernels region delimited by REGION_ENTRY and
+ REGION_EXIT. */
+
+vec<basic_block>
+get_bbs_in_oacc_kernels_region (basic_block region_entry,
+ basic_block region_exit)
+{
+ bitmap excludes_bitmap = BITMAP_GGC_ALLOC ();
+ unsigned di;
+ basic_block bb;
+
+ bitmap_clear (excludes_bitmap);
+
+ /* Get all the blocks dominated by the region entry. That will include the
+ entire region. */
+ vec<basic_block> dominated
+ = get_all_dominated_blocks (CDI_DOMINATORS, region_entry);
+
+ bitmap_set_bit (excludes_bitmap, region_entry->index);
+
+ /* Exclude all the blocks which are not in the region: the blocks dominated by
+ the region exit. */
+ if (region_exit != NULL)
+ {
+ vec<basic_block> excludes
+ = get_all_dominated_blocks (CDI_DOMINATORS, region_exit);
+ FOR_EACH_VEC_ELT (excludes, di, bb)
+ bitmap_set_bit (excludes_bitmap, bb->index);
+ bitmap_clear_bit (excludes_bitmap, region_exit->index);
+ }
+
+ vec<basic_block> bbs = vNULL;
+
+ FOR_EACH_VEC_ELT (dominated, di, bb)
+ if (!bitmap_bit_p (excludes_bitmap, bb->index))
+ bbs.safe_push (bb);
+
+ return bbs;
+}
+
/* Return the entry basic block of the oacc kernels region containing LOOP. */
basic_block
diff --git a/gcc/omp-low.h b/gcc/omp-low.h
index 62a7d4a..9f09bbc 100644
--- a/gcc/omp-low.h
+++ b/gcc/omp-low.h
@@ -34,6 +34,8 @@ extern tree get_omp_data_i (basic_block);
extern bool oacc_kernels_region_entry_p (basic_block, gomp_target **);
extern basic_block get_oacc_kernels_region_exit (basic_block);
extern basic_block loop_get_oacc_kernels_region_entry (struct loop *);
+extern vec<basic_block> get_bbs_in_oacc_kernels_region (basic_block,
+ basic_block);
extern void replace_oacc_fn_attrib (tree, tree);
extern tree build_oacc_routine_dims (tree);
extern tree get_oacc_fn_attrib (tree);
--
1.9.1