Commit 2498a6ab by Tom de Vries Committed by Tom de Vries

[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
parent 4b171607
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.
......
......@@ -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;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment