On Mon, Nov 16, 2020 at 03:08:36PM +0100, Tobias Burnus wrote:
> as discussed the other day (I think via IRC or in a patch review),
> omp_list_clauses
> did grow quite a bit: it has 26 entries and I am about to add two
> more.
>
> This variable is used as:
> typedef struct gfc_omp_clauses
> {
> ...
> gfc_omp_namelist *lists[OMP_LIST_NUM];
>
> with sizeof(gfc_omp_namelist) = 5*sizeof(void*) + sizeof(locus);
>
> This patch replaces it with a linked list.
>
>
> I am not really sure the new version is that readable and whether
> we move into the right direction or not.
> --- a/gcc/fortran/gfortran.h
> +++ b/gcc/fortran/gfortran.h
> @@ -1240,7 +1240,7 @@ enum gfc_omp_linear_op
> /* For use in OpenMP clauses in case we need extra information
> (aligned clause alignment, linear clause step, etc.). */
>
> -typedef struct gfc_omp_namelist
> +typedef struct gfc_omp_namelist_item
> {
> struct gfc_symbol *sym;
> struct gfc_expr *expr;
> @@ -1254,17 +1254,16 @@ typedef struct gfc_omp_namelist
> bool lastprivate_conditional;
> } u;
> struct gfc_omp_namelist_udr *udr;
> - struct gfc_omp_namelist *next;
> + struct gfc_omp_namelist_item *next;
> locus where;
> }
> -gfc_omp_namelist;
> +gfc_omp_namelist_item;
> +#define gfc_get_omp_namelist_item() XCNEW (gfc_omp_namelist_item)
>
> -#define gfc_get_omp_namelist() XCNEW (gfc_omp_namelist)
> -
> -enum
> +enum omp_list_clauses
> {
> - OMP_LIST_FIRST,
> - OMP_LIST_PRIVATE = OMP_LIST_FIRST,
> + OMP_LIST_UNSET,
> + OMP_LIST_PRIVATE,
> OMP_LIST_FIRSTPRIVATE,
> OMP_LIST_LASTPRIVATE,
> OMP_LIST_COPYPRIVATE,
> @@ -1289,8 +1288,7 @@ enum
> OMP_LIST_IS_DEVICE_PTR,
> OMP_LIST_USE_DEVICE_PTR,
> OMP_LIST_USE_DEVICE_ADDR,
> - OMP_LIST_NONTEMPORAL,
> - OMP_LIST_NUM
> + OMP_LIST_NONTEMPORAL
> };
>
> /* Because a symbol can belong to multiple namelists, they must be
> @@ -1386,12 +1384,22 @@ enum gfc_omp_memorder
> OMP_MEMORDER_RELAXED
> };
>
> +typedef struct gfc_omp_namelist
> +{
> + enum omp_list_clauses clause;
> + gfc_omp_namelist_item *item;
> + struct gfc_omp_namelist *next;
> +}
> +gfc_omp_namelist;
I meant something slightly different, in particular not
this gfc_omp_namelist vs. gfc_omp_namelist_item (i.e. linked list of linked
lists), but just a linked list, i.e. just add
ENUM_BITFIELD (enum omp_list_clauses) clause : 16;
int flags : 16;
into gfc_omp_namelist where the flags could hold various flags for certain
clauses, e.g. for OMP_LIST_LASTPRIVATE it could hold the conditional
modifier, for OMP_LIST_REDUCTION the inscan and task modifiers, etc.
Or do you see any advantages in having the same clauses for different
symbols adjacent in the FE?
Jakub