This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[gomp4] fork/join target hook


I realized other targets might need to do different things with the openacc fork and join buitins. I created a new target hook and default implementation. The default deletes the internal functions if there is no RTL expander for them.

nathan
2015-08-06  Nathan Sidwell  <nathan@codesourcery.com>

	* doc/tm.texi.in (TARGET_GOACC_FORK_JOIN): New.
	* doc/tm.texi: Regenerate.
	* omp-low.c (execute_oacc_transform): Forward fork and join to
	target hook.
	(default_goacc_fork_join): New.
	* target.def (fork_join): New OpenACC hook.
	* targhooks.h (default_goacc_fork_join): Declare.

Index: doc/tm.texi
===================================================================
--- doc/tm.texi	(revision 226665)
+++ doc/tm.texi	(working copy)
@@ -5741,11 +5741,18 @@ to use it.
 @end deftypefn
 
 @deftypefn {Target Hook} tree TARGET_GOACC_VALIDATE_DIMS (tree, @var{tree})
-This hook should check the launch dimensions provided/ It should fill
+This hook should check the launch dimensions provided.  It should fill
 in default values and verify non-defaults.  The TREE_LIST is unshared
 and may be overwritten.  Diagnostics should be issued as appropriate.
 @end deftypefn
 
+@deftypefn {Target Hook} bool TARGET_GOACC_FORK_JOIN (bool, gimple_stmt_iterator *@var{}, @var{gimple})
+This hook should convert IFN_GOACC_FORK and IFN_GOACC_JOIN function
+calls to target-specific gimple.  It is executed during the oacc_xform
+pass.  It should return true, if the functions should be deleted.  The
+default hook returns true, if there is no RTL expanders for them.
+@end deftypefn
+
 @node Anchored Addresses
 @section Anchored Addresses
 @cindex anchored addresses
Index: doc/tm.texi.in
===================================================================
--- doc/tm.texi.in	(revision 226665)
+++ doc/tm.texi.in	(working copy)
@@ -4247,6 +4247,8 @@ address;  but often a machine-dependent
 
 @hook TARGET_GOACC_VALIDATE_DIMS
 
+@hook TARGET_GOACC_FORK_JOIN
+
 @node Anchored Addresses
 @section Anchored Addresses
 @cindex anchored addresses
Index: omp-low.c
===================================================================
--- omp-low.c	(revision 226665)
+++ omp-low.c	(working copy)
@@ -14638,30 +14638,35 @@ execute_oacc_transform ()
 		oacc_xform_on_device (&gsi, stmt);
 
 	      if (gimple_call_internal_p (stmt))
-		switch (gimple_call_internal_fn (stmt))
-		  {
-		  default: break;
-
-		  case IFN_GOACC_DIM_SIZE:
-		    if (dims)
-		      oacc_xform_dim (&gsi, stmt, dims, false);
-		    break;
-
-		  case IFN_GOACC_DIM_POS:
-		    if (dims)
-		      oacc_xform_dim (&gsi, stmt, dims, true);
-		    break;
-
-#ifndef ACCEL_COMPILER
-		  case IFN_GOACC_FORK:
-		  case IFN_GOACC_JOIN:
-		    /* These are irrelevant on the host.  */
-		    replace_uses_by (gimple_vdef (stmt), gimple_vuse (stmt));
-		    gsi_remove (&gsi, true);
-		    /* Removal will have advanced the iterator.  */
-		    continue;
-#endif
-		  }
+		{
+		  unsigned ifn_code = gimple_call_internal_fn (stmt);
+		  switch (ifn_code)
+		    {
+		    default: break;
+
+		    case IFN_GOACC_DIM_SIZE:
+		      if (dims)
+			oacc_xform_dim (&gsi, stmt, dims, false);
+		      break;
+
+		    case IFN_GOACC_DIM_POS:
+		      if (dims)
+			oacc_xform_dim (&gsi, stmt, dims, true);
+		      break;
+
+		    case IFN_GOACC_FORK:
+		    case IFN_GOACC_JOIN:
+		      if (targetm.goacc.fork_join
+			  (ifn_code == IFN_GOACC_FORK, &gsi, stmt))
+			{
+			  replace_uses_by (gimple_vdef (stmt),
+					   gimple_vuse (stmt));
+			  gsi_remove (&gsi, true);
+			  /* Removal will have advanced the iterator.  */
+			  continue;
+			}
+		    }
+		}
 	    }
 	  gsi_next (&gsi);
 	}
@@ -14670,7 +14675,8 @@ execute_oacc_transform ()
   return 0;
 }
 
-/* Default launch dimension validator.  */
+/* Default launch dimension validator.  Force everything to 1 on the
+   host and default to 1 otherwise.  */
 
 tree
 default_goacc_validate_dims (tree ARG_UNUSED (decl), tree dims)
@@ -14693,6 +14699,30 @@ default_goacc_validate_dims (tree ARG_UN
   return dims;
 }
 
+/* Default fork/join early expander.  Delete the function calls if
+   there is no RTL expander.  */
+
+bool
+default_goacc_fork_join (bool is_fork, gimple_stmt_iterator *ARG_UNUSED (gsi),
+			 gimple ARG_UNUSED (stmt))
+{
+  if (is_fork)
+    {
+#ifdef HAVE_oacc_fork
+      return false;
+#endif
+    }
+  else
+    {
+#ifdef HAVE_oacc_join
+      return false;
+#endif
+    }
+
+  /* We have no expander, so delete the functions now.  */
+  return true;
+}
+
 namespace {
 
 const pass_data pass_data_oacc_transform =
Index: target.def
===================================================================
--- target.def	(revision 226665)
+++ target.def	(working copy)
@@ -1646,12 +1646,21 @@ HOOK_VECTOR (TARGET_GOACC, goacc)
 
 DEFHOOK
 (validate_dims,
-"This hook should check the launch dimensions provided/ It should fill\n\
+"This hook should check the launch dimensions provided.  It should fill\n\
 in default values and verify non-defaults.  The TREE_LIST is unshared\n\
 and may be overwritten.  Diagnostics should be issued as appropriate.",
 tree, (tree, tree),
 default_goacc_validate_dims)
 
+DEFHOOK
+(fork_join,
+"This hook should convert IFN_GOACC_FORK and IFN_GOACC_JOIN function\n\
+calls to target-specific gimple.  It is executed during the oacc_xform\n\
+pass.  It should return true, if the functions should be deleted.  The\n\
+default hook returns true, if there is no RTL expanders for them.",
+bool, (bool, gimple_stmt_iterator *, gimple),
+default_goacc_fork_join)
+
 HOOK_VECTOR_END (goacc)
 
 /* Functions relating to vectorization.  */
Index: targhooks.h
===================================================================
--- targhooks.h	(revision 226665)
+++ targhooks.h	(working copy)
@@ -108,6 +108,7 @@ extern void default_finish_cost (void *,
 extern void default_destroy_cost_data (void *);
 
 extern tree default_goacc_validate_dims (tree, tree);
+extern bool default_goacc_fork_join (bool, gimple_stmt_iterator *, gimple);
 
 /* 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 Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]