aboutsummaryrefslogtreecommitdiff
path: root/libgomp/oacc-mem.c
diff options
context:
space:
mode:
authorThomas Schwinge <thomas@codesourcery.com>2020-05-20 10:53:33 +0200
committerThomas Schwinge <thomas@codesourcery.com>2020-06-05 18:04:12 +0200
commit1809628fcff6f512206efd0ae03a3faccc4096f2 (patch)
treec2205aca21ac65bb85bad6604313108cbd728326 /libgomp/oacc-mem.c
parent9643f5bbe237764cbefc975e934d1281f47ee3c2 (diff)
[OpenACC 'exit data'] Simplify 'GOMP_MAP_STRUCT' handling
libgomp/ * oacc-mem.c (goacc_exit_data_internal) <GOMP_MAP_STRUCT>: Simplify. Co-Authored-By: Julian Brown <julian@codesourcery.com>
Diffstat (limited to 'libgomp/oacc-mem.c')
-rw-r--r--libgomp/oacc-mem.c83
1 files changed, 3 insertions, 80 deletions
diff --git a/libgomp/oacc-mem.c b/libgomp/oacc-mem.c
index 11419e692aa..1e3685a073d 100644
--- a/libgomp/oacc-mem.c
+++ b/libgomp/oacc-mem.c
@@ -1180,86 +1180,9 @@ goacc_exit_data_internal (struct gomp_device_descr *acc_dev, size_t mapnum,
break;
case GOMP_MAP_STRUCT:
- {
- int elems = sizes[i];
- for (int j = 1; j <= elems; j++)
- {
- assert (i + j < mapnum);
-
- kind = kinds[i + j] & 0xff;
-
- finalize = false;
- if (kind == GOMP_MAP_FORCE_FROM
- || kind == GOMP_MAP_DELETE
- || kind == GOMP_MAP_FORCE_DETACH)
- finalize = true;
-
- copyfrom = false;
- if (kind == GOMP_MAP_FROM
- || kind == GOMP_MAP_FORCE_FROM
- || kind == GOMP_MAP_ALWAYS_FROM)
- copyfrom = true;
-
- struct splay_tree_key_s k;
- k.host_start = (uintptr_t) hostaddrs[i + j];
- k.host_end = k.host_start + sizes[i + j];
- splay_tree_key str;
- str = splay_tree_lookup (&acc_dev->mem_map, &k);
- if (str)
- {
- if (finalize)
- {
- if (str->refcount != REFCOUNT_INFINITY)
- str->refcount -= str->virtual_refcount;
- str->virtual_refcount = 0;
- }
- if (str->virtual_refcount > 0)
- {
- if (str->refcount != REFCOUNT_INFINITY)
- str->refcount--;
- str->virtual_refcount--;
- }
- else if (str->refcount > 0
- && str->refcount != REFCOUNT_INFINITY)
- str->refcount--;
-
- if (copyfrom
- && (kind != GOMP_MAP_FROM || str->refcount == 0))
- gomp_copy_dev2host (acc_dev, aq, (void *) k.host_start,
- (void *) (str->tgt->tgt_start
- + str->tgt_offset
- + k.host_start
- - str->host_start),
- k.host_end - k.host_start);
-
- if (str->refcount == 0)
- {
- if (aq)
- /* TODO We can't do the 'is_tgt_unmapped' checking --
- see the 'gomp_unref_tgt' comment in
- <http://mid.mail-archive.com/878snl36eu.fsf@euler.schwinge.homeip.net>;
- PR92881. */
- gomp_remove_var_async (acc_dev, str, aq);
- else
- {
- size_t num_mappings = 0;
- /* If the target_mem_desc represents a single data
- mapping, we can check that it is freed when this
- splay tree key's refcount reaches zero.
- Otherwise (e.g. for a 'GOMP_MAP_STRUCT' mapping
- with multiple members), fall back to skipping
- the test. */
- for (size_t l_i = 0; l_i < str->tgt->list_count; ++l_i)
- if (str->tgt->list[l_i].key)
- ++num_mappings;
- bool is_tgt_unmapped = gomp_remove_var (acc_dev, str);
- assert (is_tgt_unmapped || num_mappings > 1);
- }
- }
- }
- }
- i += elems;
- }
+ /* Skip the 'GOMP_MAP_STRUCT' itself, and use the regular processing
+ for all its entries. TODO: don't generate these no-op
+ 'GOMP_MAP_STRUCT's. */
break;
default: