diff options
author | Nathan Sidwell <nathan@codesourcery.com> | 2015-10-27 23:46:39 +0000 |
---|---|---|
committer | Nathan Sidwell <nathan@gcc.gnu.org> | 2015-10-27 23:46:39 +0000 |
commit | 9bd46bc97ef88578526adfcba806c9ecd2f9a605 (patch) | |
tree | 735ed3e643e6b1a554e7891e978d7b69a5d66821 /gcc/internal-fn.c | |
parent | 6e91acf8bbf95ec5f19c7b93ddf10b61e5cc37e6 (diff) | |
download | gcc-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.c | 72 |
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: |