From: Thomas Schwinge Date: Wed, 20 May 2020 08:53:33 +0000 (+0200) Subject: [OpenACC 'exit data'] Simplify 'GOMP_MAP_STRUCT' handling X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=1809628fcff6f512206efd0ae03a3faccc4096f2;p=gcc.git [OpenACC 'exit data'] Simplify 'GOMP_MAP_STRUCT' handling libgomp/ * oacc-mem.c (goacc_exit_data_internal) : Simplify. Co-Authored-By: Julian Brown --- 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 - ; - 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: