[Patch] Fortran: cleanup OpenMP's OMP_LIST_* handling

Jakub Jelinek jakub@redhat.com
Wed Nov 18 11:14:40 GMT 2020


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



More information about the Gcc-patches mailing list