From 2498a6abcc83bcad1d33249f9a15b32daade2595 Mon Sep 17 00:00:00 2001 From: Tom de Vries Date: Thu, 3 Jan 2019 15:08:25 +0000 Subject: [PATCH] [nvptx] Factor out populate_offload_attrs Factor out populate_offload_attrs from nvptx_reorg. 2019-01-03 Tom de Vries * 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 --- gcc/ChangeLog | 7 +++++ gcc/config/nvptx/nvptx.c | 63 +++++++++++++++++++++++++++++++--------- 2 files changed, 57 insertions(+), 13 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index fc6c4f0bdf4..1b57031801b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2019-01-03 Tom de Vries + + * 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 * config/nvptx/nvptx.c (nvptx_goacc_validate_dims_1): Add early-out diff --git a/gcc/config/nvptx/nvptx.c b/gcc/config/nvptx/nvptx.c index 00934197588..15425337939 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; } -- 2.30.2