On Tue, Sep 13, 2022 at 02:03:16PM -0700, Julian Brown wrote:
> @@ -3440,6 +3437,50 @@ gfc_trans_omp_clauses (stmtblock_t *block,
> gfc_omp_clauses *clauses,
> {
> if (pointer || (openacc && allocatable))
> {
> + gfc_omp_namelist *n2
> + = openacc ? NULL : clauses->lists[OMP_LIST_MAP];
> +
> + /* If the last reference is a pointer to a derived
> + type ("foo%dt_ptr"), check if any subcomponents
> + of the same derived type member are being mapped
> + elsewhere in the clause list ("foo%dt_ptr%x",
> + etc.). If we have such subcomponent mappings,
> + we only create an ALLOC node for the pointer
> + itself, and inhibit mapping the whole derived
> + type. */
> +
> + for (; n2 != NULL; n2 = n2->next)
> + {
> + if (n == n2 || !n2->expr)
> + continue;
> +
> + int dep
> + = gfc_dep_resolver (n->expr->ref, n2->expr->ref,
> + NULL, true);
> + if (dep == 0)
> + continue;
Isn't this and the other loop quadratic compile time in number of clauses?
Could it be done linearly through some perhaps lazily built hash table or
something similar?
Jakub