Home | History | Annotate | Line # | Download | only in gcc
      1 /* General types and functions that are uselful for processing of OpenMP,
      2    OpenACC and similar directivers at various stages of compilation.
      3 
      4    Copyright (C) 2005-2024 Free Software Foundation, Inc.
      5 
      6 This file is part of GCC.
      7 
      8 GCC is free software; you can redistribute it and/or modify it under
      9 the terms of the GNU General Public License as published by the Free
     10 Software Foundation; either version 3, or (at your option) any later
     11 version.
     12 
     13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
     14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
     15 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
     16 for more details.
     17 
     18 You should have received a copy of the GNU General Public License
     19 along with GCC; see the file COPYING3.  If not see
     20 <http://www.gnu.org/licenses/>.  */
     21 
     22 #ifndef GCC_OMP_GENERAL_H
     23 #define GCC_OMP_GENERAL_H
     24 
     25 #include "gomp-constants.h"
     26 #include "omp-api.h"
     27 #include "omp-selectors.h"
     28 
     29 /*  Flags for an OpenACC loop.  */
     30 
     31 enum oacc_loop_flags {
     32   OLF_SEQ	= 1u << 0,  /* Explicitly sequential  */
     33   OLF_AUTO	= 1u << 1,	/* Compiler chooses axes.  */
     34   OLF_INDEPENDENT = 1u << 2,	/* Iterations are known independent.  */
     35   OLF_GANG_STATIC = 1u << 3,	/* Gang partitioning is static (has op). */
     36   OLF_TILE	= 1u << 4,	/* Tiled loop. */
     37   OLF_REDUCTION = 1u << 5,	/* Reduction loop.  */
     38 
     39   /* Explicitly specified loop axes.  */
     40   OLF_DIM_BASE = 6,
     41   OLF_DIM_GANG   = 1u << (OLF_DIM_BASE + GOMP_DIM_GANG),
     42   OLF_DIM_WORKER = 1u << (OLF_DIM_BASE + GOMP_DIM_WORKER),
     43   OLF_DIM_VECTOR = 1u << (OLF_DIM_BASE + GOMP_DIM_VECTOR),
     44 
     45   OLF_MAX = OLF_DIM_BASE + GOMP_DIM_MAX
     46 };
     47 
     48 /* A structure holding the elements of:
     49    for (V = N1; V cond N2; V += STEP) [...]
     50    or for non-rectangular loops:
     51    for (V = M1 * W + N1; V cond M2 * W + N2; V += STEP;
     52    where W is V of the OUTER-th loop (e.g. for OUTER 1 it is the
     53    the index of the immediately surrounding loop).
     54    NON_RECT_REFERENCED is true for loops referenced by loops
     55    with non-NULL M1 or M2.  */
     56 
     57 struct omp_for_data_loop
     58 {
     59   tree v, n1, n2, step, m1, m2;
     60   enum tree_code cond_code;
     61   int outer;
     62   bool non_rect_referenced;
     63 };
     64 
     65 /* A structure describing the main elements of a parallel loop.  */
     66 
     67 struct omp_for_data
     68 {
     69   struct omp_for_data_loop loop;
     70   tree chunk_size;
     71   gomp_for *for_stmt;
     72   tree pre, iter_type;
     73   tree tiling;  /* Tiling values (if non null).  */
     74   int collapse;  /* Collapsed loops, 1 for a non-collapsed loop.  */
     75   int ordered;
     76   int first_nonrect, last_nonrect;
     77   bool have_nowait, have_ordered, simd_schedule, have_reductemp;
     78   bool have_pointer_condtemp, have_scantemp, have_nonctrl_scantemp;
     79   bool non_rect;
     80   int lastprivate_conditional;
     81   unsigned char sched_modifiers;
     82   enum omp_clause_schedule_kind sched_kind;
     83   struct omp_for_data_loop *loops;
     84   /* The following are relevant only for non-rectangular loops
     85      where only a single loop depends on an outer loop iterator.  */
     86   tree first_inner_iterations; /* Number of iterations of the inner
     87 				  loop with the first outer iterator
     88 				  (or adjn1, if that is non-NULL).  */
     89   tree factor; /* (m2 - m1) * outer_step / inner_step.  */
     90   /* Adjusted n1 of the outer loop in such loop nests (if needed).  */
     91   tree adjn1;
     92 };
     93 
     94 #define OACC_FN_ATTRIB "oacc function"
     95 
     96 /* Accessors for OMP context selectors, used by variant directives.
     97    These are represented internally by a multilevel TREE_LIST structure, but
     98    these accessors should be used to avoid confusion.  The grammar is:
     99 
    100    context-set-selector-specification:
    101      trait-set-selector [, trait-set-selector [, ...]]
    102    trait-set-selector:
    103      trait-set-selector-name = { trait-selector [, trait-selector [, ... ]] }
    104    trait-selector:
    105      trait-selector-name [ ( [trait-score: ]
    106 			     trait-property [, trait-property  [, ...]] ) ]
    107 
    108    trait-properties can variously be identifiers, strings, clauses, or
    109    expressions.
    110 
    111    All the lists are chained via TREE_CHAIN.  If a score is present, it is
    112    internally tacked on to the properties with a TREE_PURPOSE of
    113    OMP_TS_SCORE_NODE.  */
    114 
    115 #define OMP_TS_SCORE_NODE integer_minus_one_node
    116 #define OMP_TP_NAMELIST_NODE integer_one_node
    117 
    118 #define OMP_TSS_ID(NODE) \
    119   TREE_PURPOSE (NODE)
    120 #define OMP_TSS_TRAIT_SELECTORS(NODE) \
    121   TREE_VALUE (NODE)
    122 #define OMP_TS_ID(NODE) \
    123   TREE_PURPOSE (NODE)
    124 #define OMP_TS_SCORE(NODE) \
    125   ((TREE_VALUE (NODE)					      \
    126     && TREE_CODE (TREE_VALUE (NODE)) == TREE_LIST	      \
    127     && TREE_PURPOSE (TREE_VALUE (NODE)) == OMP_TS_SCORE_NODE) \
    128    ? TREE_VALUE (TREE_VALUE (NODE)) : NULL_TREE)
    129 #define OMP_TS_PROPERTIES(NODE) \
    130   ((TREE_VALUE (NODE)					      \
    131     && TREE_CODE (TREE_VALUE (NODE)) == TREE_LIST	      \
    132     && TREE_PURPOSE (TREE_VALUE (NODE)) == OMP_TS_SCORE_NODE) \
    133    ? TREE_CHAIN (TREE_VALUE (NODE)) : TREE_VALUE (NODE))
    134 #define OMP_TP_NAME(NODE) \
    135   TREE_PURPOSE (NODE)
    136 #define OMP_TP_VALUE(NODE) \
    137   TREE_VALUE (NODE)
    138 
    139 #define OMP_TSS_CODE(t)						\
    140   ((enum omp_tss_code) TREE_INT_CST_LOW (OMP_TSS_ID (t)))
    141 #define OMP_TSS_NAME(t)			\
    142   (omp_tss_map[OMP_TSS_CODE (t)])
    143 
    144 #define OMP_TS_CODE(t)						\
    145   ((enum omp_ts_code) TREE_INT_CST_LOW (OMP_TS_ID (t)))
    146 #define OMP_TS_NAME(t)			\
    147   (omp_ts_map[OMP_TS_CODE (t)].name)
    148 
    149 extern tree make_trait_set_selector (enum omp_tss_code, tree, tree);
    150 extern tree make_trait_selector (enum omp_ts_code, tree, tree, tree);
    151 extern tree make_trait_property (tree, tree, tree);
    152 
    153 extern tree omp_find_clause (tree clauses, enum omp_clause_code kind);
    154 extern bool omp_is_allocatable_or_ptr (tree decl);
    155 extern tree omp_check_optional_argument (tree decl, bool for_present_check);
    156 extern bool omp_mappable_type (tree type);
    157 extern bool omp_privatize_by_reference (tree decl);
    158 extern void omp_adjust_for_condition (location_t loc, enum tree_code *cond_code,
    159 				      tree *n2, tree v, tree step);
    160 extern tree omp_get_for_step_from_incr (location_t loc, tree incr);
    161 extern void omp_extract_for_data (gomp_for *for_stmt, struct omp_for_data *fd,
    162 				  struct omp_for_data_loop *loops);
    163 extern gimple *omp_build_barrier (tree lhs);
    164 extern tree find_combined_omp_for (tree *, int *, void *);
    165 extern poly_uint64 omp_max_vf (void);
    166 extern int omp_max_simt_vf (void);
    167 extern const char *omp_context_name_list_prop (tree);
    168 extern void omp_construct_traits_to_codes (tree, int, enum tree_code *);
    169 extern tree omp_check_context_selector (location_t loc, tree ctx);
    170 extern void omp_mark_declare_variant (location_t loc, tree variant,
    171 				      tree construct);
    172 extern int omp_context_selector_matches (tree);
    173 extern int omp_context_selector_set_compare (enum omp_tss_code, tree, tree);
    174 extern tree omp_get_context_selector (tree, enum omp_tss_code,
    175 				      enum omp_ts_code);
    176 extern tree omp_get_context_selector_list (tree, enum omp_tss_code);
    177 extern tree omp_resolve_declare_variant (tree);
    178 extern tree oacc_launch_pack (unsigned code, tree device, unsigned op);
    179 extern tree oacc_replace_fn_attrib_attr (tree attribs, tree dims);
    180 extern void oacc_replace_fn_attrib (tree fn, tree dims);
    181 extern void oacc_set_fn_attrib (tree fn, tree clauses, vec<tree> *args);
    182 extern int oacc_verify_routine_clauses (tree, tree *, location_t,
    183 					const char *);
    184 extern tree oacc_build_routine_dims (tree clauses);
    185 extern tree oacc_get_fn_attrib (tree fn);
    186 extern bool offloading_function_p (tree fn);
    187 extern int oacc_get_fn_dim_size (tree fn, int axis);
    188 extern int oacc_get_ifn_dim_arg (const gimple *stmt);
    189 
    190 enum omp_requires {
    191   OMP_REQUIRES_ATOMIC_DEFAULT_MEM_ORDER = 0xf,
    192   OMP_REQUIRES_UNIFIED_ADDRESS = GOMP_REQUIRES_UNIFIED_ADDRESS,
    193   OMP_REQUIRES_UNIFIED_SHARED_MEMORY = GOMP_REQUIRES_UNIFIED_SHARED_MEMORY,
    194   OMP_REQUIRES_DYNAMIC_ALLOCATORS = 0x40,
    195   OMP_REQUIRES_REVERSE_OFFLOAD = GOMP_REQUIRES_REVERSE_OFFLOAD,
    196   OMP_REQUIRES_ATOMIC_DEFAULT_MEM_ORDER_USED = 0x100,
    197   OMP_REQUIRES_TARGET_USED = GOMP_REQUIRES_TARGET_USED,
    198 };
    199 
    200 extern GTY(()) enum omp_requires omp_requires_mask;
    201 
    202 inline dump_flags_t
    203 get_openacc_privatization_dump_flags ()
    204 {
    205   dump_flags_t l_dump_flags = MSG_NOTE;
    206 
    207   /* For '--param=openacc-privatization=quiet', diagnostics only go to dump
    208      files.  */
    209   if (param_openacc_privatization == OPENACC_PRIVATIZATION_QUIET)
    210     l_dump_flags |= MSG_PRIORITY_INTERNALS;
    211 
    212   return l_dump_flags;
    213 }
    214 
    215 extern tree omp_build_component_ref (tree obj, tree field);
    216 
    217 namespace omp_addr_tokenizer {
    218 
    219 /* These are the ways of accessing a variable that have special-case handling
    220    in the middle end (gimplify, omp-lower, etc.).  */
    221 
    222 /* These are the kinds of access that an ACCESS_METHOD token can represent.  */
    223 
    224 enum access_method_kinds
    225 {
    226   ACCESS_DIRECT,
    227   ACCESS_REF,
    228   ACCESS_POINTER,
    229   ACCESS_REF_TO_POINTER,
    230   ACCESS_POINTER_OFFSET,
    231   ACCESS_REF_TO_POINTER_OFFSET,
    232   ACCESS_INDEXED_ARRAY,
    233   ACCESS_INDEXED_REF_TO_ARRAY
    234 };
    235 
    236 /* These are the kinds that a STRUCTURE_BASE or ARRAY_BASE (except
    237    BASE_COMPONENT_EXPR) can represent.  */
    238 
    239 enum structure_base_kinds
    240 {
    241   BASE_DECL,
    242   BASE_COMPONENT_EXPR,
    243   BASE_ARBITRARY_EXPR
    244 };
    245 
    246 /* The coarse type for an address token.  These can have subtypes for
    247    ARRAY_BASE or STRUCTURE_BASE (structure_base_kinds) or ACCESS_METHOD
    248    (access_method_kinds).  */
    249 
    250 enum token_type
    251 {
    252   ARRAY_BASE,
    253   STRUCTURE_BASE,
    254   COMPONENT_SELECTOR,
    255   ACCESS_METHOD
    256 };
    257 
    258 /* The struct that forms a single token of an address expression as parsed by
    259    omp_parse_expr.  These are typically held in a vec after parsing.  */
    260 
    261 struct omp_addr_token
    262 {
    263   enum token_type type;
    264   tree expr;
    265 
    266   union
    267   {
    268     access_method_kinds access_kind;
    269     structure_base_kinds structure_base_kind;
    270   } u;
    271 
    272   omp_addr_token (token_type, tree);
    273   omp_addr_token (access_method_kinds, tree);
    274   omp_addr_token (token_type, structure_base_kinds, tree);
    275 };
    276 
    277 extern bool omp_access_chain_p (vec<omp_addr_token *> &, unsigned);
    278 extern tree omp_accessed_addr (vec<omp_addr_token *> &, unsigned, tree);
    279 
    280 }
    281 
    282 typedef omp_addr_tokenizer::omp_addr_token omp_addr_token;
    283 
    284 extern bool omp_parse_expr (vec<omp_addr_token *> &, tree);
    285 
    286 #endif /* GCC_OMP_GENERAL_H */
    287