nvptx.c (nvptx_goacc_validate_dims): New.
authorNathan Sidwell <nathan@codesourcery.com>
Wed, 30 Sep 2015 19:16:29 +0000 (19:16 +0000)
committerNathan Sidwell <nathan@gcc.gnu.org>
Wed, 30 Sep 2015 19:16:29 +0000 (19:16 +0000)
* config/nvptx/nvptx.c (nvptx_goacc_validate_dims): New.
(TARGET_GOACC_VALIDATE_DIMS): Override.
* target.def (TARGET_GOACC): New target hook prefix.
(validate_dims): New hook.
* targhooks.h (default_goacc_validate_dims): New.
* omp-low.c (oacc_validate_dims): New.
(execute_oacc_device_lower): New.
(default_goacc_validate_dims): New.
(pass_data_oacc_device_lower): New.
(pass_oacc_device_lower): New pass.
(make_pass_oacc_device_lower): New.
* tree-pass.h (make_pass_oacc_device_lower): Declare.
* passes.def (pass_oacc_device_lower): Add it.
* doc/tm.texi: Rebuilt.
* doc/tm.texi.in (TARGET_GOACC_VALIDATE_DIMS): Add hook.
* doc/invoke.texi (oaccdevlow): Document tree dump flag.

Co-Authored-By: Cesar Philippidis <cesar@codesourcery.com>
From-SVN: r228304

gcc/ChangeLog
gcc/config/nvptx/nvptx.c
gcc/doc/invoke.texi
gcc/doc/tm.texi
gcc/doc/tm.texi.in
gcc/omp-low.c
gcc/passes.def
gcc/target.def
gcc/targhooks.h
gcc/tree-pass.h

index b60a3e6bd1c40ececb02e62b8c280ff76738f8be..41c3af302f86bb126171274b4a2dfbbc7f3c6637 100644 (file)
@@ -1,3 +1,23 @@
+2015-09-30  Nathan Sidwell  <nathan@codesourcery.com>
+           Cesar Philippidis  <cesar@codesourcery.com>
+
+       * config/nvptx/nvptx.c (nvptx_goacc_validate_dims): New.
+       (TARGET_GOACC_VALIDATE_DIMS): Override.
+       * target.def (TARGET_GOACC): New target hook prefix.
+       (validate_dims): New hook.
+       * targhooks.h (default_goacc_validate_dims): New.
+       * omp-low.c (oacc_validate_dims): New.
+       (execute_oacc_device_lower): New.
+       (default_goacc_validate_dims): New.
+       (pass_data_oacc_device_lower): New.
+       (pass_oacc_device_lower): New pass.
+       (make_pass_oacc_device_lower): New.
+       * tree-pass.h (make_pass_oacc_device_lower): Declare.
+       * passes.def (pass_oacc_device_lower): Add it.
+       * doc/tm.texi: Rebuilt.
+       * doc/tm.texi.in (TARGET_GOACC_VALIDATE_DIMS): Add hook.
+       * doc/invoke.texi (oaccdevlow): Document tree dump flag.
+
 2015-09-30  Bernd Edlinger  <bernd.edlinger@hotmail.de>
 
        PR rtl-optimization/67037
index 0569a199265b8834c801821e50319357a93046c0..a7fdd9221c0cd3c5ad005a8862152a5d786fc117 100644 (file)
@@ -2141,6 +2141,22 @@ nvptx_file_end (void)
   fputs (func_decls.str().c_str(), asm_out_file);
 }
 \f
+/* Validate compute dimensions of an OpenACC offload or routine, fill
+   in non-unity defaults.  FN_LEVEL indicates the level at which a
+   routine might spawn a loop.  It is negative for non-routines.  */
+
+static bool
+nvptx_goacc_validate_dims (tree ARG_UNUSED (decl), int *ARG_UNUSED (dims),
+                          int ARG_UNUSED (fn_level))
+{
+  bool changed = false;
+
+  /* TODO: Leave dimensions unaltered.  Partitioned execution needs
+     porting before filtering dimensions makes sense.  */
+
+  return changed;
+}
+\f
 #undef TARGET_OPTION_OVERRIDE
 #define TARGET_OPTION_OVERRIDE nvptx_option_override
 
@@ -2227,6 +2243,9 @@ nvptx_file_end (void)
 #undef TARGET_VECTOR_ALIGNMENT
 #define TARGET_VECTOR_ALIGNMENT nvptx_vector_alignment
 
+#undef TARGET_GOACC_VALIDATE_DIMS
+#define TARGET_GOACC_VALIDATE_DIMS nvptx_goacc_validate_dims
+
 struct gcc_target targetm = TARGET_INITIALIZER;
 
 #include "gt-nvptx.h"
index 50cc52010ff96c12df6503000331869908880035..c19be78943ae2192da19f78787bf0c708d91b638 100644 (file)
@@ -7247,6 +7247,11 @@ is made by appending @file{.slp} to the source file name.
 Dump each function after Value Range Propagation (VRP).  The file name
 is made by appending @file{.vrp} to the source file name.
 
+@item oaccdevlow
+@opindex fdump-tree-oaccdevlow
+Dump each function after applying device-specific OpenACC transformations.
+The file name is made by appending @file{.oaccdevlow} to the source file name.
+
 @item all
 @opindex fdump-tree-all
 Enable all the available tree dumps with the flags provided in this option.
index eb495a86a7269b4e8cb5f9dfeb1087afff26568c..610d6c1c7b5ee8fa7706b50ce54e7aee429194a4 100644 (file)
@@ -5748,6 +5748,18 @@ usable.  In that case, the smaller the number is, the more desirable it is
 to use it.
 @end deftypefn
 
+@deftypefn {Target Hook} bool TARGET_GOACC_VALIDATE_DIMS (tree @var{decl}, int @var{dims[]}, int @var{fn_level})
+This hook should check the launch dimensions provided for an OpenACC
+compute region, or routine.  Defaulted values are represented as -1
+and non-constant values as 0. The @var{fn_level} is negative for the
+function corresponding to the compute region.  For a routine is is the
+outermost level at which partitioned execution may be spawned.  It
+should fill in anything that needs to default to non-unity and verify
+non-defaults.  Diagnostics should be issued as appropriate.  Return
+true, if changes have been made.  You must override this hook to
+provide dimensions larger than 1.
+@end deftypefn
+
 @node Anchored Addresses
 @section Anchored Addresses
 @cindex anchored addresses
index 92835c19c1e7be880e3b42575db40c671c476d51..2ee0294c25d3e747fc78718a1c855f84f8d392bc 100644 (file)
@@ -4247,6 +4247,8 @@ address;  but often a machine-dependent strategy can generate better code.
 
 @hook TARGET_SIMD_CLONE_USABLE
 
+@hook TARGET_GOACC_VALIDATE_DIMS
+
 @node Anchored Addresses
 @section Anchored Addresses
 @cindex anchored addresses
index 8bcad08eb1b115ba6a03ee7df2fb2c82352d0b21..cdcf9d6d9c8477cef406a5c70c1e07c867f93ec9 100644 (file)
@@ -14020,4 +14020,146 @@ omp_finish_file (void)
     }
 }
 
+/* Validate and update the dimensions for offloaded FN.  ATTRS is the
+   raw attribute.  DIMS is an array of dimensions, which is returned.
+   Returns the function level dimensionality --  the level at which an
+   offload routine wishes to partition a loop.  */
+
+static int
+oacc_validate_dims (tree fn, tree attrs, int *dims)
+{
+  tree purpose[GOMP_DIM_MAX];
+  unsigned ix;
+  tree pos = TREE_VALUE (attrs);
+  int fn_level = -1;
+
+  /* Make sure the attribute creator attached the dimension
+     information.  */
+  gcc_assert (pos);
+
+  for (ix = 0; ix != GOMP_DIM_MAX; ix++)
+    {
+      purpose[ix] = TREE_PURPOSE (pos);
+
+      if (purpose[ix])
+       {
+         if (integer_zerop (purpose[ix]))
+           fn_level = ix + 1;
+         else if (fn_level < 0)
+           fn_level = ix;
+       }
+
+      tree val = TREE_VALUE (pos);
+      dims[ix] = val ? TREE_INT_CST_LOW (val) : -1;
+      pos = TREE_CHAIN (pos);
+    }
+
+  bool changed = targetm.goacc.validate_dims (fn, dims, fn_level);
+
+  /* Default anything left to 1.  */
+  for (ix = 0; ix != GOMP_DIM_MAX; ix++)
+    if (dims[ix] < 0)
+      {
+       dims[ix] = 1;
+       changed = true;
+      }
+
+  if (changed)
+    {
+      /* Replace the attribute with new values.  */
+      pos = NULL_TREE;
+      for (ix = GOMP_DIM_MAX; ix--;)
+       pos = tree_cons (purpose[ix],
+                        build_int_cst (integer_type_node, dims[ix]),
+                        pos);
+      replace_oacc_fn_attrib (fn, pos);
+    }
+
+  return fn_level;
+}
+
+/* Main entry point for oacc transformations which run on the device
+   compiler after LTO, so we know what the target device is at this
+   point (including the host fallback).  */
+
+static unsigned int
+execute_oacc_device_lower ()
+{
+  tree attrs = get_oacc_fn_attrib (current_function_decl);
+  int dims[GOMP_DIM_MAX];
+  
+  if (!attrs)
+    /* Not an offloaded function.  */
+    return 0;
+
+  oacc_validate_dims (current_function_decl, attrs, dims);
+  
+  return 0;
+}
+
+/* Default launch dimension validator.  Force everything to 1.  A
+   backend that wants to provide larger dimensions must override this
+   hook.  */
+
+bool
+default_goacc_validate_dims (tree ARG_UNUSED (decl), int *dims,
+                            int ARG_UNUSED (fn_level))
+{
+  bool changed = false;
+
+  for (unsigned ix = 0; ix != GOMP_DIM_MAX; ix++)
+    {
+      if (dims[ix] != 1)
+       {
+         dims[ix] = 1;
+         changed = true;
+       }
+    }
+
+  return changed;
+}
+
+namespace {
+
+const pass_data pass_data_oacc_device_lower =
+{
+  GIMPLE_PASS, /* type */
+  "oaccdevlow", /* name */
+  OPTGROUP_NONE, /* optinfo_flags */
+  TV_NONE, /* tv_id */
+  PROP_cfg, /* properties_required */
+  0 /* Possibly PROP_gimple_eomp.  */, /* properties_provided */
+  0, /* properties_destroyed */
+  0, /* todo_flags_start */
+  TODO_update_ssa | TODO_cleanup_cfg, /* todo_flags_finish */
+};
+
+class pass_oacc_device_lower : public gimple_opt_pass
+{
+public:
+  pass_oacc_device_lower (gcc::context *ctxt)
+    : gimple_opt_pass (pass_data_oacc_device_lower, ctxt)
+  {}
+
+  /* opt_pass methods: */
+  virtual unsigned int execute (function *)
+    {
+      bool gate = (flag_openacc != 0 && !seen_error ());
+
+      if (!gate)
+       return 0;
+
+      return execute_oacc_device_lower ();
+    }
+
+}; // class pass_oacc_transform
+
+} // anon namespace
+
+gimple_opt_pass *
+make_pass_oacc_device_lower (gcc::context *ctxt)
+{
+  return new pass_oacc_device_lower (ctxt);
+}
+
 #include "gt-omp-low.h"
index 64fc4d9e7892f773cc052f861e1dc86a61c9287b..28dea9e4b10607162795793b882c3fbcd7d8a067 100644 (file)
@@ -148,6 +148,7 @@ along with GCC; see the file COPYING3.  If not see
   INSERT_PASSES_AFTER (all_passes)
   NEXT_PASS (pass_fixup_cfg);
   NEXT_PASS (pass_lower_eh_dispatch);
+  NEXT_PASS (pass_oacc_device_lower);
   NEXT_PASS (pass_all_optimizations);
   PUSH_INSERT_PASSES_WITHIN (pass_all_optimizations)
       NEXT_PASS (pass_remove_cgraph_callee_edges);
index f33070984cba6ba7284f6c304beccf1f173917f1..d29aad5c3f89805c8ee882934b5645c12621fce0 100644 (file)
@@ -1639,6 +1639,27 @@ int, (struct cgraph_node *), NULL)
 
 HOOK_VECTOR_END (simd_clone)
 
+/* Functions relating to openacc.  */
+#undef HOOK_PREFIX
+#define HOOK_PREFIX "TARGET_GOACC_"
+HOOK_VECTOR (TARGET_GOACC, goacc)
+
+DEFHOOK
+(validate_dims,
+"This hook should check the launch dimensions provided for an OpenACC\n\
+compute region, or routine.  Defaulted values are represented as -1\n\
+and non-constant values as 0. The @var{fn_level} is negative for the\n\
+function corresponding to the compute region.  For a routine is is the\n\
+outermost level at which partitioned execution may be spawned.  It\n\
+should fill in anything that needs to default to non-unity and verify\n\
+non-defaults.  Diagnostics should be issued as appropriate.  Return\n\
+true, if changes have been made.  You must override this hook to\n\
+provide dimensions larger than 1.",
+bool, (tree decl, int dims[], int fn_level),
+default_goacc_validate_dims)
+
+HOOK_VECTOR_END (goacc)
+
 /* Functions relating to vectorization.  */
 #undef HOOK_PREFIX
 #define HOOK_PREFIX "TARGET_VECTORIZE_"
index 5ae991d12508ed7c8fae37e971c59fc695f7521f..77c284a1b56107cfa67c82bbab3344be072310cb 100644 (file)
@@ -107,6 +107,9 @@ extern unsigned default_add_stmt_cost (void *, int, enum vect_cost_for_stmt,
 extern void default_finish_cost (void *, unsigned *, unsigned *, unsigned *);
 extern void default_destroy_cost_data (void *);
 
+/* OpenACC hooks.  */
+extern bool default_goacc_validate_dims (tree, int [], int);
+
 /* These are here, and not in hooks.[ch], because not all users of
    hooks.h include tm.h, and thus we don't have CUMULATIVE_ARGS.  */
 
index 3c913ea909ded4111ceeeca1de531b478ab42188..91f63a8d4a64341528139168ffc7fb08a09c1bcc 100644 (file)
@@ -406,6 +406,7 @@ extern gimple_opt_pass *make_pass_lower_omp (gcc::context *ctxt);
 extern gimple_opt_pass *make_pass_diagnose_omp_blocks (gcc::context *ctxt);
 extern gimple_opt_pass *make_pass_expand_omp (gcc::context *ctxt);
 extern gimple_opt_pass *make_pass_expand_omp_ssa (gcc::context *ctxt);
+extern gimple_opt_pass *make_pass_oacc_device_lower (gcc::context *ctxt);
 extern gimple_opt_pass *make_pass_object_sizes (gcc::context *ctxt);
 extern gimple_opt_pass *make_pass_strlen (gcc::context *ctxt);
 extern gimple_opt_pass *make_pass_fold_builtins (gcc::context *ctxt);