[nvptx] Factor out populate_offload_attrs
authorTom de Vries <tdevries@suse.de>
Thu, 3 Jan 2019 15:08:25 +0000 (15:08 +0000)
committerTom de Vries <vries@gcc.gnu.org>
Thu, 3 Jan 2019 15:08:25 +0000 (15:08 +0000)
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

gcc/ChangeLog
gcc/config/nvptx/nvptx.c

index fc6c4f0bdf449789887726b095a50ff567c968d1..1b57031801ba30137323aa84bd32f7beabe35102 100644 (file)
@@ -1,3 +1,10 @@
+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
index 009341975882d8a20a05f57f51725d95585d1109..15425337939088444e042ea5907cdd4fe0f22fe4 100644 (file)
@@ -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;
     }