[nvptx] Verify dimension limits after applying defaults
authorTom de Vries <tdevries@suse.de>
Sat, 12 Jan 2019 10:27:12 +0000 (10:27 +0000)
committerTom de Vries <vries@gcc.gnu.org>
Sat, 12 Jan 2019 10:27:12 +0000 (10:27 +0000)
There's a problem in oacc_validate_dims that when f.i. the worker dimension
is set using -fopenacc-dim=:32, and the vector_length is set using a
"vector_length (128)" clause, the compiler combines, accepts and emits the
values, while the combination of the two is invalid.

The reason for this is that while oacc_validate_dims validates the dimensions
using targetm.goacc.validate_dims before applying default or minimum values,
it does not do so afterwards.

Work around this in the nvptx port by applying the defaults from
oacc_default_dims at the end of nvptx_goacc_validate_dims_1, as
oacc_validate_dims would do it, and then apply the dimensions limits.

2019-01-12  Tom de Vries  <tdevries@suse.de>

PR middle-end/88703
* config/nvptx/nvptx.c (nvptx_goacc_validate_dims_1): Apply defaults
from oacc_default_dims, as oacc_validate_dims would do it, and apply
dimensions limits.

From-SVN: r267877

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

index d2f3751910109a65d53febfa06f860dd19cfd11a..80c3bf25fe071a582a38dd21ce7671ad3c58bebc 100644 (file)
@@ -1,3 +1,10 @@
+2019-01-12  Tom de Vries  <tdevries@suse.de>
+
+       PR middle-end/88703
+       * config/nvptx/nvptx.c (nvptx_goacc_validate_dims_1): Apply defaults
+       from oacc_default_dims, as oacc_validate_dims would do it, and apply
+       dimensions limits.
+
 2019-01-12  Tom de Vries  <tdevries@suse.de>
 
        * config/nvptx/nvptx.c (nvptx_goacc_validate_dims_1)
index 89f0e560910bb492db0b962791e743d99cda5133..a4c79532a1d180990fd78fa5bca1ba1b272e5be8 100644 (file)
@@ -5703,6 +5703,23 @@ nvptx_goacc_validate_dims_1 (tree decl, int dims[], int fn_level, unsigned used)
        dims[GOMP_DIM_GANG] = PTX_DEFAULT_RUNTIME_DIM;
       nvptx_apply_dim_limits (dims);
     }
+
+  if (offload_region_p)
+    {
+      for (i = 0; i < GOMP_DIM_MAX; i++)
+       {
+         if (!(dims[i] < 0))
+           continue;
+
+         if ((used & GOMP_DIM_MASK (i)) == 0)
+           /* Function oacc_validate_dims will apply the minimal dimension.  */
+           continue;
+
+         dims[i] = oacc_get_default_dim (i);
+       }
+
+      nvptx_apply_dim_limits (dims);
+    }
 }
 
 /* Validate compute dimensions of an OpenACC offload or routine, fill