From: James Norris <jnorris@codesourcery.com>
To: GCC Patches <gcc-patches@gcc.gnu.org>
Cc: "Joseph S. Myers" <joseph@codesourcery.com>,
Nathan Sidwell <Nathan_Sidwell@mentor.com>,
Jakub Jelinek <jakub@redhat.com>
Subject: [OpenACC 4/7] host_data construct (middle end)
Date: Thu, 22 Oct 2015 19:18:00 -0000 [thread overview]
Message-ID: <5629364E.8020309@codesourcery.com> (raw)
In-Reply-To: <56293476.5020801@codesourcery.com>
[-- Attachment #1: Type: text/plain, Size: 498 bytes --]
gcc/gimplify.c b/gcc/gimplify.c
- Add new enum for use_device clause handling to gimplify_omp_var_data.
- Add new enum for host_data regions to omp_region_type.
- Move handling of use_device clause in gimplify_scan_omp_clauses().
- Add new functions gimplify_host_data() and gimplify_host_data_1().
- Add handling of host_data to gimplify_expr().
gcc/omp-builtins.def b/gcc/omp-builtins.def
- Add builtin for GOACC_deviceptr().
[-- Attachment #2: p4.patch --]
[-- Type: text/x-patch, Size: 5398 bytes --]
diff --git a/gcc/gimplify.c b/gcc/gimplify.c
index ab9e540..0c32219 100644
--- a/gcc/gimplify.c
+++ b/gcc/gimplify.c
@@ -93,6 +93,8 @@ enum gimplify_omp_var_data
GOVD_MAP_0LEN_ARRAY = 32768,
+ GOVD_USE_DEVICE = 65536,
+
GOVD_DATA_SHARE_CLASS = (GOVD_SHARED | GOVD_PRIVATE | GOVD_FIRSTPRIVATE
| GOVD_LASTPRIVATE | GOVD_REDUCTION | GOVD_LINEAR
| GOVD_LOCAL)
@@ -116,7 +118,9 @@ enum omp_region_type
ORT_COMBINED_TARGET = 33,
/* Dummy OpenMP region, used to disable expansion of
DECL_VALUE_EXPRs in taskloop pre body. */
- ORT_NONE = 64
+ ORT_NONE = 64,
+ /* An OpenACC host-data region. */
+ ORT_HOST_DATA = 128
};
/* Gimplify hashtable helper. */
@@ -6338,6 +6342,10 @@ gimplify_scan_omp_clauses (tree *list_p, gimple_seq *pre_p,
decl = TREE_OPERAND (decl, 0);
}
goto do_add_decl;
+ case OMP_CLAUSE_USE_DEVICE:
+ flags = GOVD_USE_DEVICE | GOVD_EXPLICIT;
+ check_non_private = "use_device";
+ goto do_add;
case OMP_CLAUSE_LINEAR:
if (gimplify_expr (&OMP_CLAUSE_LINEAR_STEP (c), pre_p, NULL,
is_gimple_val, fb_rvalue) == GS_ERROR)
@@ -7005,7 +7013,6 @@ gimplify_scan_omp_clauses (tree *list_p, gimple_seq *pre_p,
break;
case OMP_CLAUSE_DEVICE_RESIDENT:
- case OMP_CLAUSE_USE_DEVICE:
case OMP_CLAUSE_INDEPENDENT:
remove = true;
break;
@@ -7529,6 +7536,127 @@ gimplify_oacc_cache (tree *expr_p, gimple_seq *pre_p)
*expr_p = NULL_TREE;
}
+static tree
+gimplify_oacc_host_data_1 (tree *tp, int *walk_subtrees,
+ void *data ATTRIBUTE_UNUSED)
+{
+ splay_tree_node n = NULL;
+ location_t loc = EXPR_LOCATION (*tp);
+
+ switch (TREE_CODE (*tp))
+ {
+ case ADDR_EXPR:
+ {
+ tree decl = TREE_OPERAND (*tp, 0);
+
+ switch (TREE_CODE (decl))
+ {
+ case ARRAY_REF:
+ case ARRAY_RANGE_REF:
+ case COMPONENT_REF:
+ case VIEW_CONVERT_EXPR:
+ case REALPART_EXPR:
+ case IMAGPART_EXPR:
+ if (TREE_CODE (TREE_OPERAND (decl, 0)) == VAR_DECL)
+ n = splay_tree_lookup (gimplify_omp_ctxp->variables,
+ (splay_tree_key) TREE_OPERAND (decl, 0));
+ break;
+
+ case VAR_DECL:
+ n = splay_tree_lookup (gimplify_omp_ctxp->variables,
+ (splay_tree_key) decl);
+ break;
+
+ default:
+ ;
+ }
+
+ if (n != NULL && (n->value & GOVD_USE_DEVICE) != 0)
+ {
+ tree t = builtin_decl_explicit (BUILT_IN_GOACC_DEVICEPTR);
+ *tp = build_call_expr_loc (loc, t, 1, *tp);
+ }
+
+ *walk_subtrees = 0;
+ }
+ break;
+
+ case VAR_DECL:
+ {
+ tree decl = *tp;
+
+ n = splay_tree_lookup (gimplify_omp_ctxp->variables,
+ (splay_tree_key) decl);
+
+ if (n != NULL && (n->value & GOVD_USE_DEVICE) != 0)
+ {
+ if (!POINTER_TYPE_P (TREE_TYPE (decl)))
+ return decl;
+
+ tree t = builtin_decl_explicit (BUILT_IN_GOACC_DEVICEPTR);
+ *tp = build_call_expr_loc (loc, t, 1, *tp);
+ *walk_subtrees = 0;
+ }
+ }
+ break;
+
+ case OACC_PARALLEL:
+ case OACC_KERNELS:
+ case OACC_LOOP:
+ *walk_subtrees = 0;
+ break;
+
+ default:
+ ;
+ }
+
+ return NULL_TREE;
+}
+
+static enum gimplify_status
+gimplify_oacc_host_data (tree *expr_p, gimple_seq *pre_p)
+{
+ tree expr = *expr_p, orig_body;
+ gimple_seq body = NULL;
+
+ gimplify_scan_omp_clauses (&OACC_HOST_DATA_CLAUSES (expr), pre_p,
+ ORT_HOST_DATA, OACC_HOST_DATA);
+
+ orig_body = OACC_HOST_DATA_BODY (expr);
+
+ /* Perform a pre-pass over the host_data region's body, inserting calls to
+ GOACC_deviceptr where appropriate. */
+
+ tree ret = walk_tree_without_duplicates (&orig_body,
+ &gimplify_oacc_host_data_1, 0);
+
+ if (ret)
+ {
+ error_at (EXPR_LOCATION (expr),
+ "undefined use of variable %qE in host_data region",
+ DECL_NAME (ret));
+ gimplify_adjust_omp_clauses (pre_p, &OACC_HOST_DATA_CLAUSES (expr),
+ OACC_HOST_DATA);
+ return GS_ERROR;
+ }
+
+ push_gimplify_context ();
+
+ gimple *g = gimplify_and_return_first (orig_body, &body);
+
+ if (gimple_code (g) == GIMPLE_BIND)
+ pop_gimplify_context (g);
+ else
+ pop_gimplify_context (NULL);
+
+ gimplify_adjust_omp_clauses (pre_p, &OACC_HOST_DATA_CLAUSES (expr),
+ OACC_HOST_DATA);
+
+ gimplify_seq_add_stmt (pre_p, g);
+
+ return GS_ALL_DONE;
+}
+
/* Gimplify the contents of an OMP_PARALLEL statement. This involves
gimplification of the body, as well as scanning the body for used
variables. We need to do this scan now, because variable-sized
@@ -9595,6 +9723,9 @@ gimplify_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
break;
case OACC_HOST_DATA:
+ ret = gimplify_oacc_host_data (expr_p, pre_p);
+ break;
+
case OACC_DECLARE:
sorry ("directive not yet implemented");
ret = GS_ALL_DONE;
diff --git a/gcc/omp-builtins.def b/gcc/omp-builtins.def
index ea9cf0d..9ed075f 100644
--- a/gcc/omp-builtins.def
+++ b/gcc/omp-builtins.def
@@ -47,6 +47,8 @@ DEF_GOACC_BUILTIN (BUILT_IN_GOACC_UPDATE, "GOACC_update",
DEF_GOACC_BUILTIN (BUILT_IN_GOACC_WAIT, "GOACC_wait",
BT_FN_VOID_INT_INT_VAR,
ATTR_NOTHROW_LIST)
+DEF_GOACC_BUILTIN (BUILT_IN_GOACC_DEVICEPTR, "GOACC_deviceptr",
+ BT_FN_PTR_PTR, ATTR_CONST_NOTHROW_LEAF_LIST)
DEF_GOACC_BUILTIN (BUILT_IN_GOACC_GET_THREAD_NUM, "GOACC_get_thread_num",
BT_FN_INT, ATTR_CONST_NOTHROW_LEAF_LIST)
DEF_GOACC_BUILTIN (BUILT_IN_GOACC_GET_NUM_THREADS, "GOACC_get_num_threads",
next prev parent reply other threads:[~2015-10-22 19:17 UTC|newest]
Thread overview: 33+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-10-22 19:14 [OpenACC 0/7] host_data construct James Norris
2015-10-22 19:15 ` [OpenACC 2/7] host_data construct (C FE) James Norris
2015-10-22 19:15 ` [OpenACC 1/7] host_data construct (C/C++ common) James Norris
2015-10-22 19:16 ` [OpenACC 3/7] host_data construct (C front-end) James Norris
2015-10-22 19:18 ` James Norris [this message]
2015-10-22 19:19 ` [OpenACC 5/7] host_data construct (gcc tests) James Norris
2015-10-22 19:20 ` [OpenACC 6/7] host_data construct James Norris
2015-10-22 19:22 ` [OpenACC 7/7] host_data construct (runtime tests) James Norris
2015-10-22 20:42 ` [OpenACC 0/7] host_data construct Joseph Myers
2015-10-22 20:53 ` James Norris
2015-10-23 16:01 ` [Bulk] " James Norris
2015-10-26 18:36 ` Jakub Jelinek
2015-10-27 15:57 ` Cesar Philippidis
2015-11-02 18:33 ` Julian Brown
2015-11-02 19:29 ` Jakub Jelinek
2015-11-12 11:16 ` Julian Brown
2015-11-18 12:48 ` Julian Brown
2015-11-19 13:13 ` Jakub Jelinek
2015-11-19 14:29 ` Julian Brown
2015-11-19 15:57 ` Jakub Jelinek
2015-11-30 19:34 ` Julian Brown
2015-12-01 8:30 ` Jakub Jelinek
2015-12-02 15:27 ` Tom de Vries
2015-12-02 15:59 ` Thomas Schwinge
2015-12-02 19:16 ` Cesar Philippidis
2015-12-02 19:28 ` Steve Kargl
2015-12-02 19:35 ` Jakub Jelinek
2015-12-02 19:54 ` Cesar Philippidis
2015-12-02 22:14 ` [gomp4] " Thomas Schwinge
2016-04-08 13:41 ` Fortran OpenACC host_data construct ICE (was: [gomp4] Re: [OpenACC 0/7] host_data construct) Thomas Schwinge
2016-02-02 13:57 ` [OpenACC 0/7] host_data construct Thomas Schwinge
2015-11-13 15:31 ` [Bulk] " Jakub Jelinek
2015-12-23 11:02 ` Thomas Schwinge
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=5629364E.8020309@codesourcery.com \
--to=jnorris@codesourcery.com \
--cc=Nathan_Sidwell@mentor.com \
--cc=gcc-patches@gcc.gnu.org \
--cc=jakub@redhat.com \
--cc=joseph@codesourcery.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).