From: Nathan Sidwell <nathan@acm.org>
To: Jakub Jelinek <jakub@redhat.com>
Cc: Cesar Philippidis <cesar@codesourcery.com>,
GCC Patches <gcc-patches@gcc.gnu.org>
Subject: Re: New post-LTO OpenACC pass
Date: Tue, 22 Sep 2015 15:22:00 -0000 [thread overview]
Message-ID: <560170CB.3040603@acm.org> (raw)
In-Reply-To: <56006B13.1060004@acm.org>
[-- Attachment #1: Type: text/plain, Size: 788 bytes --]
On 09/21/15 16:39, Nathan Sidwell wrote:
> On 09/21/15 16:30, Cesar Philippidis wrote:
>> On 09/21/2015 09:30 AM, Nathan Sidwell wrote:
>>
>>> +const pass_data pass_data_oacc_transform =
>>> +{
>>> + GIMPLE_PASS, /* type */
>>> + "fold_oacc_transform", /* name */
>>
>> Want to rename the tree dump file to oacc_xforms like I'm did in the
>> attached patch? Regardless, I think we need to document this flag in
>> invoke.texi.
>
> Thanks for noticing the missing doc. I'm not attached to any particular name.
> 'fold_oacc_transform' is rather generic, and a bit of a mouthful. Perhaps
> 'oacclower', 'oaccdevlower' or something (I see there's 'lateomplower' for
> guidance)
this updated patch includes Cesar's doc patch. Also change the name of the pass
to 'oaccdevlow'.
nathan
[-- Attachment #2: trunk-ondev-2.patch --]
[-- Type: text/x-patch, Size: 6847 bytes --]
2015-09-22 Nathan Sidwell <nathan@codesourcery.com>
Cesar Philippidis <cesar@codesourcery.com>
* omp-low.h (get_oacc_fn_attrib): Declare.
* omp-low.c (get_oacc_fn_attrib): New.
(oacc_xform_on_device): New.
(execute_oacc_device_lower): New pass.
(pass_data_oacc_device_lower): New.
(pass_oacc_device_lower): New.
(make_pass_oacc_device_lower): New.
* tree-pass.h (make_pass_oacc_device_lower): Declare.
* passes.def: Add pass_oacc_transform.
* doc/invoke.texi: Document -fdump-tree-oaccdevlow.
Index: tree-pass.h
===================================================================
--- tree-pass.h (revision 227968)
+++ tree-pass.h (working copy)
@@ -406,6 +406,7 @@ extern gimple_opt_pass *make_pass_lower_
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);
Index: passes.def
===================================================================
--- passes.def (revision 227968)
+++ passes.def (working copy)
@@ -148,6 +148,7 @@ along with GCC; see the file COPYING3.
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: doc/invoke.texi
===================================================================
--- doc/invoke.texi (revision 227968)
+++ doc/invoke.texi (working copy)
@@ -7179,6 +7179,11 @@ is made by appending @file{.slp} to the
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: omp-low.c
===================================================================
--- omp-low.c (revision 227968)
+++ omp-low.c (working copy)
@@ -8860,6 +8860,16 @@ expand_omp_atomic (struct omp_region *re
expand_omp_atomic_mutex (load_bb, store_bb, addr, loaded_val, stored_val);
}
+#define OACC_FN_ATTRIB "oacc function"
+
+/* Retrieve the oacc function attrib and return it. Non-oacc
+ functions will return NULL. */
+
+tree
+get_oacc_fn_attrib (tree fn)
+{
+ return lookup_attribute (OACC_FN_ATTRIB, DECL_ATTRIBUTES (fn));
+}
/* Expand the GIMPLE_OMP_TARGET starting at REGION. */
@@ -13909,4 +13919,131 @@ omp_finish_file (void)
}
}
+/* Transform an acc_on_device call. OpenACC 2.0a requires this folded at
+ compile time for constant operands. We always fold it. In an
+ offloaded function we're never 'none'. */
+
+static void
+oacc_xform_on_device (gimple *call)
+{
+ tree arg = gimple_call_arg (call, 0);
+ unsigned val = GOMP_DEVICE_HOST;
+
+#ifdef ACCEL_COMPILER
+ val = GOMP_DEVICE_NOT_HOST;
+#endif
+ tree result = build2 (EQ_EXPR, boolean_type_node, arg,
+ build_int_cst (integer_type_node, val));
+#ifdef ACCEL_COMPILER
+ {
+ tree dev = build2 (EQ_EXPR, boolean_type_node, arg,
+ build_int_cst (integer_type_node,
+ ACCEL_COMPILER_acc_device));
+ result = build2 (TRUTH_OR_EXPR, boolean_type_node, result, dev);
+ }
+#endif
+ result = fold_convert (integer_type_node, result);
+ tree lhs = gimple_call_lhs (call);
+ gimple_seq seq = NULL;
+
+ push_gimplify_context (true);
+ gimplify_assign (lhs, result, &seq);
+ pop_gimplify_context (NULL);
+
+ gimple_stmt_iterator gsi = gsi_for_stmt (call);
+ gsi_replace_with_seq (&gsi, seq, false);
+}
+
+/* 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);
+
+ if (!attrs)
+ /* Not an offloaded function. */
+ return 0;
+
+ basic_block bb;
+ FOR_ALL_BB_FN (bb, cfun)
+ for (gimple_stmt_iterator gsi = gsi_start_bb (bb);
+ !gsi_end_p (gsi); gsi_next (&gsi))
+ {
+ gimple *stmt = gsi_stmt (gsi);
+ bool rescan = false;
+
+ if (!is_gimple_call (stmt))
+ continue;
+
+ /* Rewind to allow rescan. */
+ gsi_prev (&gsi);
+
+ gcall *call = as_a <gcall *> (stmt);
+
+ if (gimple_call_builtin_p (call, BUILT_IN_ACC_ON_DEVICE))
+ /* acc_on_device must be evaluated at compile time for
+ constant arguments. */
+ {
+ oacc_xform_on_device (call);
+ rescan = true;
+ }
+
+ if (gsi_end_p (gsi))
+ /* We rewound past the beginning of the BB. */
+ gsi = gsi_start_bb (bb);
+
+ if (!rescan)
+ /* Undo the rewind, so we don't get stuck infinitely. */
+ gsi_next (&gsi);
+ }
+
+ return 0;
+}
+
+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: omp-low.h
===================================================================
--- omp-low.h (revision 227968)
+++ omp-low.h (working copy)
@@ -28,6 +28,7 @@ extern void free_omp_regions (void);
extern tree omp_reduction_init (tree, tree);
extern bool make_gimple_omp_edges (basic_block, struct omp_region **, int *);
extern void omp_finish_file (void);
+extern tree get_oacc_fn_attrib (tree);
extern GTY(()) vec<tree, va_gc> *offload_funcs;
extern GTY(()) vec<tree, va_gc> *offload_vars;
next prev parent reply other threads:[~2015-09-22 15:16 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-09-21 16:39 Nathan Sidwell
2015-09-21 21:03 ` Cesar Philippidis
2015-09-21 21:15 ` Nathan Sidwell
2015-09-22 15:22 ` Nathan Sidwell [this message]
2015-09-23 11:10 ` Bernd Schmidt
2015-09-23 12:40 ` Nathan Sidwell
2015-09-23 13:19 ` Bernd Schmidt
2015-09-23 18:45 ` Nathan Sidwell
2015-09-23 18:58 ` Bernd Schmidt
2015-09-23 20:08 ` Nathan Sidwell
2015-09-25 0:15 ` Nathan Sidwell
2015-09-25 11:06 ` Bernd Schmidt
2015-09-25 11:13 ` Nathan Sidwell
2015-09-25 13:03 ` Bernd Schmidt
2015-09-25 13:20 ` Bernd Schmidt
2015-09-25 13:42 ` Bernd Schmidt
2015-09-28 13:26 ` Nathan Sidwell
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=560170CB.3040603@acm.org \
--to=nathan@acm.org \
--cc=cesar@codesourcery.com \
--cc=gcc-patches@gcc.gnu.org \
--cc=jakub@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).