aboutsummaryrefslogtreecommitdiff
path: root/gcc/internal-fn.c
diff options
context:
space:
mode:
authorNathan Sidwell <nathan@codesourcery.com>2015-10-27 23:46:39 +0000
committerNathan Sidwell <nathan@gcc.gnu.org>2015-10-27 23:46:39 +0000
commit9bd46bc97ef88578526adfcba806c9ecd2f9a605 (patch)
tree735ed3e643e6b1a554e7891e978d7b69a5d66821 /gcc/internal-fn.c
parent6e91acf8bbf95ec5f19c7b93ddf10b61e5cc37e6 (diff)
downloadgcc-9bd46bc97ef88578526adfcba806c9ecd2f9a605.zip
gcc-9bd46bc97ef88578526adfcba806c9ecd2f9a605.tar.gz
gcc-9bd46bc97ef88578526adfcba806c9ecd2f9a605.tar.bz2
internal-fn.def (IFN_GOACC_DIM_SIZE, [...]): New.
* internal-fn.def (IFN_GOACC_DIM_SIZE, IFN_GOACC_DIM_POS, IFN_GOACC_LOOP): New. * internal-fn.h (enum ifn_unique_kind): Add IFN_UNIQUE_OACC_FORK, IFN_UNIQUE_OACC_JOIN, IFN_UNIQUE_OACC_HEAD_MARK, IFN_UNIQUE_OACC_TAIL_MARK. (enum ifn_goacc_loop_kind): New. * internal-fn.c (expand_UNIQUE): Add IFN_UNIQUE_OACC_FORK, IFN_UNIQUE_OACC_JOIN cases. (expand_GOACC_DIM_SIZE, expand_GOACC_DIM_POS): New. (expand_GOACC_LOOP): New. * target-insns.def (oacc_dim_pos, oacc_dim_size): New. * omp-low.c: Include gimple-pretty-print.h. (struct oacc_loop): New. (enum oacc_loop_flags): New. (oacc_thread_numbers): New. (oacc_xform_loop): New. (new_oacc_loop_raw, new_oacc_loop_outer, new_oacc_loop, new_oacc_loop_routine, finish_oacc_loop, free_oacc_loop): New, (dump_oacc_loop_part, dump_oacc_loop, debug_oacc_loop): New, (oacc_loop_discover_walk, oacc_loop_sibling_nrevers, oacc_loop_discovery): New. (oacc_loop_xform_head_tail, oacc_loop_xform_loop, oacc_loop_process): New. (oacc_loop_fixed_partitions, oacc_loop_partition): New. (execute_oacc_device_lower): Discover & process loops. Process internal fns. * target.def (goacc.fork_join): Change sense of hook, clarify documentation. * doc/tm.texi: Regenerated. From-SVN: r229466
Diffstat (limited to 'gcc/internal-fn.c')
-rw-r--r--gcc/internal-fn.c72
1 files changed, 72 insertions, 0 deletions
diff --git a/gcc/internal-fn.c b/gcc/internal-fn.c
index ff5a90d..cf1ba22 100644
--- a/gcc/internal-fn.c
+++ b/gcc/internal-fn.c
@@ -1976,12 +1976,84 @@ expand_UNIQUE (gcall *stmt)
if (targetm.have_unique ())
pattern = targetm.gen_unique ();
break;
+
+ case IFN_UNIQUE_OACC_FORK:
+ case IFN_UNIQUE_OACC_JOIN:
+ if (targetm.have_oacc_fork () && targetm.have_oacc_join ())
+ {
+ tree lhs = gimple_call_lhs (stmt);
+ rtx target = const0_rtx;
+
+ if (lhs)
+ target = expand_expr (lhs, NULL_RTX, VOIDmode, EXPAND_WRITE);
+
+ rtx data_dep = expand_normal (gimple_call_arg (stmt, 1));
+ rtx axis = expand_normal (gimple_call_arg (stmt, 2));
+
+ if (kind == IFN_UNIQUE_OACC_FORK)
+ pattern = targetm.gen_oacc_fork (target, data_dep, axis);
+ else
+ pattern = targetm.gen_oacc_join (target, data_dep, axis);
+ }
+ else
+ gcc_unreachable ();
+ break;
}
if (pattern)
emit_insn (pattern);
}
+/* The size of an OpenACC compute dimension. */
+
+static void
+expand_GOACC_DIM_SIZE (gcall *stmt)
+{
+ tree lhs = gimple_call_lhs (stmt);
+
+ if (!lhs)
+ return;
+
+ rtx target = expand_expr (lhs, NULL_RTX, VOIDmode, EXPAND_WRITE);
+ if (targetm.have_oacc_dim_size ())
+ {
+ rtx dim = expand_expr (gimple_call_arg (stmt, 0), NULL_RTX,
+ VOIDmode, EXPAND_NORMAL);
+ emit_insn (targetm.gen_oacc_dim_size (target, dim));
+ }
+ else
+ emit_move_insn (target, GEN_INT (1));
+}
+
+/* The position of an OpenACC execution engine along one compute axis. */
+
+static void
+expand_GOACC_DIM_POS (gcall *stmt)
+{
+ tree lhs = gimple_call_lhs (stmt);
+
+ if (!lhs)
+ return;
+
+ rtx target = expand_expr (lhs, NULL_RTX, VOIDmode, EXPAND_WRITE);
+ if (targetm.have_oacc_dim_pos ())
+ {
+ rtx dim = expand_expr (gimple_call_arg (stmt, 0), NULL_RTX,
+ VOIDmode, EXPAND_NORMAL);
+ emit_insn (targetm.gen_oacc_dim_pos (target, dim));
+ }
+ else
+ emit_move_insn (target, const0_rtx);
+}
+
+/* This is expanded by oacc_device_lower pass. */
+
+static void
+expand_GOACC_LOOP (gcall *stmt ATTRIBUTE_UNUSED)
+{
+ gcc_unreachable ();
+}
+
/* Routines to expand each internal function, indexed by function number.
Each routine has the prototype: