diff options
author | Tom de Vries <tdevries@suse.de> | 2019-01-03 15:08:25 +0000 |
---|---|---|
committer | Tom de Vries <vries@gcc.gnu.org> | 2019-01-03 15:08:25 +0000 |
commit | 2498a6abcc83bcad1d33249f9a15b32daade2595 (patch) | |
tree | a02974b3531102b38cb1fd6946dd9484cf4ec424 /gcc | |
parent | 4b1716079db6646bd77967bb383d2da1e375694f (diff) | |
download | gcc-2498a6abcc83bcad1d33249f9a15b32daade2595.zip gcc-2498a6abcc83bcad1d33249f9a15b32daade2595.tar.gz gcc-2498a6abcc83bcad1d33249f9a15b32daade2595.tar.bz2 |
[nvptx] Factor out populate_offload_attrs
Factor out populate_offload_attrs from nvptx_reorg.
2019-01-03 Tom de Vries <tdevries@suse.de>
* config/nvptx/nvptx.c (struct offload_attrs): New.
(populate_offload_attrs): New function. Factor mask extraction out of
nvptx_reorg. Add extraction of dimensions.
(nvptx_reorg): Use populate_offload_attrs.
From-SVN: r267557
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/config/nvptx/nvptx.c | 63 |
2 files changed, 57 insertions, 13 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index fc6c4f0..1b57031 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,12 @@ 2019-01-03 Tom de Vries <tdevries@suse.de> + * config/nvptx/nvptx.c (struct offload_attrs): New. + (populate_offload_attrs): New function. Factor mask extraction out of + nvptx_reorg. Add extraction of dimensions. + (nvptx_reorg): Use populate_offload_attrs. + +2019-01-03 Tom de Vries <tdevries@suse.de> + * config/nvptx/nvptx.c (nvptx_goacc_validate_dims_1): Add early-out cases for oacc_min_dims_p and routine_p. Add asserts for oacc_default_dims_p and offload_region_p. diff --git a/gcc/config/nvptx/nvptx.c b/gcc/config/nvptx/nvptx.c index 0093419..1542533 100644 --- a/gcc/config/nvptx/nvptx.c +++ b/gcc/config/nvptx/nvptx.c @@ -2873,6 +2873,16 @@ nvptx_reorg_uniform_simt () } } +/* Offloading function attributes. */ + +struct offload_attrs +{ + unsigned mask; + int num_gangs; + int num_workers; + int vector_length; +}; + /* Loop structure of the function. The entire function is described as a NULL loop. */ @@ -4576,6 +4586,41 @@ nvptx_neuter_pars (parallel *par, unsigned modes, unsigned outer) nvptx_neuter_pars (par->next, modes, outer); } +static void +populate_offload_attrs (offload_attrs *oa) +{ + tree attr = oacc_get_fn_attrib (current_function_decl); + tree dims = TREE_VALUE (attr); + unsigned ix; + + oa->mask = 0; + + for (ix = 0; ix != GOMP_DIM_MAX; ix++, dims = TREE_CHAIN (dims)) + { + tree t = TREE_VALUE (dims); + int size = (t == NULL_TREE) ? -1 : TREE_INT_CST_LOW (t); + tree allowed = TREE_PURPOSE (dims); + + if (size != 1 && !(allowed && integer_zerop (allowed))) + oa->mask |= GOMP_DIM_MASK (ix); + + switch (ix) + { + case GOMP_DIM_GANG: + oa->num_gangs = size; + break; + + case GOMP_DIM_WORKER: + oa->num_workers = size; + break; + + case GOMP_DIM_VECTOR: + oa->vector_length = size; + break; + } + } +} + #if WORKAROUND_PTXJIT_BUG_2 /* Variant of pc_set that only requires JUMP_P (INSN) if STRICT. This variant is needed in the nvptx target because the branches generated for @@ -4757,27 +4802,19 @@ nvptx_reorg (void) { /* If we determined this mask before RTL expansion, we could elide emission of some levels of forks and joins. */ - unsigned mask = 0; - tree dims = TREE_VALUE (attr); - unsigned ix; + offload_attrs oa; - for (ix = 0; ix != GOMP_DIM_MAX; ix++, dims = TREE_CHAIN (dims)) - { - int size = TREE_INT_CST_LOW (TREE_VALUE (dims)); - tree allowed = TREE_PURPOSE (dims); + populate_offload_attrs (&oa); - if (size != 1 && !(allowed && integer_zerop (allowed))) - mask |= GOMP_DIM_MASK (ix); - } /* If there is worker neutering, there must be vector neutering. Otherwise the hardware will fail. */ - gcc_assert (!(mask & GOMP_DIM_MASK (GOMP_DIM_WORKER)) - || (mask & GOMP_DIM_MASK (GOMP_DIM_VECTOR))); + gcc_assert (!(oa.mask & GOMP_DIM_MASK (GOMP_DIM_WORKER)) + || (oa.mask & GOMP_DIM_MASK (GOMP_DIM_VECTOR))); /* Discover & process partitioned regions. */ parallel *pars = nvptx_discover_pars (&bb_insn_map); nvptx_process_pars (pars); - nvptx_neuter_pars (pars, mask, 0); + nvptx_neuter_pars (pars, oa.mask, 0); delete pars; } |