[nvptx] Rewrite nvptx_goacc_validate_dims to use predicate vars
authorTom de Vries <tdevries@suse.de>
Mon, 17 Dec 2018 21:26:39 +0000 (21:26 +0000)
committerTom de Vries <vries@gcc.gnu.org>
Mon, 17 Dec 2018 21:26:39 +0000 (21:26 +0000)
The function nvptx_goacc_validate_dims has arguments decl and fn_level which
together describe different situations.

Introduce a predicate var for each situation, and use them, allowing to
understand what the function does in each situation without having to know the
way the situations are encoded in the args.

Build and reg-tested on x86_64 with nvptx accelerator.

2018-12-17  Tom de Vries  <tdevries@suse.de>

* config/nvptx/nvptx.c (nvptx_goacc_validate_dims): Rewrite using
predicate vars.

From-SVN: r267212

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

index 637baa8e75732467b99b36fbb250a8c06af35e19..7281f42d6fd9ce58f951f5695e8ca10b40f24ef2 100644 (file)
@@ -1,3 +1,8 @@
+2018-12-17  Tom de Vries  <tdevries@suse.de>
+
+       * config/nvptx/nvptx.c (nvptx_goacc_validate_dims): Rewrite using
+       predicate vars.
+
 2018-12-17  Steve Ellcey  <sellcey@cavium.com>
 
        * config/aarch64/aarch64-protos.h (aarch64_use_simple_return_insn_p):
index 9903a2738633806efa05e52cbe21e91290eee59a..746d8bfb1004217d418c081780ad7183be179102 100644 (file)
@@ -5187,13 +5187,39 @@ static bool
 nvptx_goacc_validate_dims (tree decl, int dims[], int fn_level)
 {
   bool changed = false;
+  bool oacc_default_dims_p = false;
+  bool oacc_min_dims_p = false;
+  bool offload_region_p = false;
+  bool routine_p = false;
+  bool routine_seq_p = false;
+
+  if (decl == NULL_TREE)
+    {
+      if (fn_level == -1)
+       oacc_default_dims_p = true;
+      else if (fn_level == -2)
+       oacc_min_dims_p = true;
+      else
+       gcc_unreachable ();
+    }
+  else if (fn_level == -1)
+    offload_region_p = true;
+  else if (0 <= fn_level && fn_level <= GOMP_DIM_MAX)
+    {
+      routine_p = true;
+      routine_seq_p = fn_level == GOMP_DIM_MAX;
+    }
+  else
+    gcc_unreachable ();
 
   /* The vector size must be 32, unless this is a SEQ routine.  */
-  if (fn_level <= GOMP_DIM_VECTOR && fn_level >= -1
+  if ((offload_region_p || oacc_default_dims_p
+       || (routine_p && !routine_seq_p))
       && dims[GOMP_DIM_VECTOR] >= 0
       && dims[GOMP_DIM_VECTOR] != PTX_VECTOR_LENGTH)
     {
-      if (fn_level < 0 && dims[GOMP_DIM_VECTOR] >= 0)
+      if ((offload_region_p || oacc_default_dims_p)
+         && dims[GOMP_DIM_VECTOR] >= 0)
        warning_at (decl ? DECL_SOURCE_LOCATION (decl) : UNKNOWN_LOCATION, 0,
                    dims[GOMP_DIM_VECTOR]
                    ? G_("using vector_length (%d), ignoring %d")
@@ -5213,7 +5239,7 @@ nvptx_goacc_validate_dims (tree decl, int dims[], int fn_level)
       changed = true;
     }
 
-  if (!decl)
+  if (oacc_default_dims_p || oacc_min_dims_p)
     {
       dims[GOMP_DIM_VECTOR] = PTX_VECTOR_LENGTH;
       if (dims[GOMP_DIM_WORKER] < 0)