GCC Middle and Back End API Reference
omp-general.h
Go to the documentation of this file.
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-2025 Free Software Foundation, Inc.
5
6This file is part of GCC.
7
8GCC is free software; you can redistribute it and/or modify it under
9the terms of the GNU General Public License as published by the Free
10Software Foundation; either version 3, or (at your option) any later
11version.
12
13GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14WARRANTY; without even the implied warranty of MERCHANTABILITY or
15FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16for more details.
17
18You should have received a copy of the GNU General Public License
19along 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
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. */
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
64
65/* A structure describing the main elements of a parallel loop. */
66
68{
73 tree tiling; /* Tiling values (if non null). */
74 int collapse; /* Collapsed loops, 1 for a non-collapsed loop. */
81 unsigned char sched_modifiers;
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). */
92};
93
94/* Needs to be a GC-friendly widest_int variant, but precision is
95 desirable to be the same on all targets. */
96typedef generic_wide_int <fixed_wide_int_storage <1024> > score_wide_int;
97
98/* A structure describing a variant alternative in a metadirective or
99 variant function, used for matching and scoring during resolution. */
100struct GTY(()) omp_variant
101{
102 /* Context selector. This is NULL_TREE for the default. */
104 /* For early resolution of "metadirective", contains the nested directive.
105 For early resolution of "declare variant", contains the function decl
106 for this alternative. For late resolution of both, contains the label
107 that is the branch target for this alternative. */
109 /* Common body, used for metadirective, null otherwise. */
111 /* The score, or the best guess if scorable is false. */
113 /* True if the selector is dynamic. Filled in during resolution. */
115 /* Whether the selector is known to definitely match. */
117 /* Whether the score for the selector is definitely known. */
119};
120
121#define OACC_FN_ATTRIB "oacc function"
122
123/* Accessors for OMP context selectors, used by variant directives.
124 These are represented internally by a multilevel TREE_LIST structure, but
125 these accessors should be used to avoid confusion. The grammar is:
126
127 context-set-selector-specification:
128 trait-set-selector [, trait-set-selector [, ...]]
129 trait-set-selector:
130 trait-set-selector-name = { trait-selector [, trait-selector [, ... ]] }
131 trait-selector:
132 trait-selector-name [ ( [trait-score: ]
133 trait-property [, trait-property [, ...]] ) ]
134
135 trait-properties can variously be identifiers, strings, clauses, or
136 expressions.
137
138 All the lists are chained via TREE_CHAIN. If a score is present, it is
139 internally tacked on to the properties with a TREE_PURPOSE of
140 OMP_TS_SCORE_NODE. */
141
142#define OMP_TS_SCORE_NODE integer_minus_one_node
143#define OMP_TP_NAMELIST_NODE integer_one_node
144
145#define OMP_TSS_ID(NODE) \
146 TREE_PURPOSE (NODE)
147#define OMP_TSS_TRAIT_SELECTORS(NODE) \
148 TREE_VALUE (NODE)
149#define OMP_TS_ID(NODE) \
150 TREE_PURPOSE (NODE)
151#define OMP_TS_SCORE(NODE) \
152 ((TREE_VALUE (NODE) \
153 && TREE_CODE (TREE_VALUE (NODE)) == TREE_LIST \
154 && TREE_PURPOSE (TREE_VALUE (NODE)) == OMP_TS_SCORE_NODE) \
155 ? TREE_VALUE (TREE_VALUE (NODE)) : NULL_TREE)
156#define OMP_TS_PROPERTIES(NODE) \
157 ((TREE_VALUE (NODE) \
158 && TREE_CODE (TREE_VALUE (NODE)) == TREE_LIST \
159 && TREE_PURPOSE (TREE_VALUE (NODE)) == OMP_TS_SCORE_NODE) \
160 ? TREE_CHAIN (TREE_VALUE (NODE)) : TREE_VALUE (NODE))
161#define OMP_TP_NAME(NODE) \
162 TREE_PURPOSE (NODE)
163#define OMP_TP_VALUE(NODE) \
164 TREE_VALUE (NODE)
165
166#define OMP_TSS_CODE(t) \
167 ((enum omp_tss_code) TREE_INT_CST_LOW (OMP_TSS_ID (t)))
168#define OMP_TSS_NAME(t) \
169 (omp_tss_map[OMP_TSS_CODE (t)])
170
171#define OMP_TS_CODE(t) \
172 ((enum omp_ts_code) TREE_INT_CST_LOW (OMP_TS_ID (t)))
173#define OMP_TS_NAME(t) \
174 (omp_ts_map[OMP_TS_CODE (t)].name)
175
179
181
182extern tree omp_find_clause (tree clauses, enum omp_clause_code kind);
184extern tree omp_check_optional_argument (tree decl, bool for_present_check);
185extern bool omp_mappable_type (tree type);
187extern void omp_adjust_for_condition (location_t loc, enum tree_code *cond_code,
188 tree *n2, tree v, tree step);
189extern tree omp_get_for_step_from_incr (location_t loc, tree incr);
190extern void omp_extract_for_data (gomp_for *for_stmt, struct omp_for_data *fd,
191 struct omp_for_data_loop *loops);
192extern gimple *omp_build_barrier (tree lhs);
193extern tree find_combined_omp_for (tree *, int *, void *);
194extern poly_uint64 omp_max_vf (bool);
195extern int omp_max_simt_vf (void);
196extern const char *omp_context_name_list_prop (tree);
197extern tree omp_check_context_selector (location_t loc, tree ctx,
198 bool metadirective_p);
199extern void omp_mark_declare_variant (location_t loc, tree variant,
200 tree construct);
201extern int omp_context_selector_matches (tree, tree, bool);
204 enum omp_ts_code);
213extern tree oacc_launch_pack (unsigned code, tree device, unsigned op);
214extern tree oacc_replace_fn_attrib_attr (tree attribs, tree dims);
215extern void oacc_replace_fn_attrib (tree fn, tree dims);
216extern void oacc_set_fn_attrib (tree fn, tree clauses, vec<tree> *args);
217extern int oacc_verify_routine_clauses (tree, tree *, location_t,
218 const char *);
219extern tree oacc_build_routine_dims (tree clauses);
220extern tree oacc_get_fn_attrib (tree fn);
221extern bool offloading_function_p (tree fn);
222extern int oacc_get_fn_dim_size (tree fn, int axis);
223extern int oacc_get_ifn_dim_arg (const gimple *stmt);
224
227 OMP_REQUIRES_UNIFIED_ADDRESS = GOMP_REQUIRES_UNIFIED_ADDRESS,
228 OMP_REQUIRES_UNIFIED_SHARED_MEMORY = GOMP_REQUIRES_UNIFIED_SHARED_MEMORY,
230 OMP_REQUIRES_REVERSE_OFFLOAD = GOMP_REQUIRES_REVERSE_OFFLOAD,
232 OMP_REQUIRES_TARGET_USED = GOMP_REQUIRES_TARGET_USED,
233 OMP_REQUIRES_SELF_MAPS = GOMP_REQUIRES_SELF_MAPS
234};
235
236extern GTY(()) enum omp_requires omp_requires_mask;
237
238inline dump_flags_t
240{
241 dump_flags_t l_dump_flags = MSG_NOTE;
242
243 /* For '--param=openacc-privatization=quiet', diagnostics only go to dump
244 files. */
245 if (param_openacc_privatization == OPENACC_PRIVATIZATION_QUIET)
246 l_dump_flags |= MSG_PRIORITY_INTERNALS;
247
248 return l_dump_flags;
249}
250
251extern tree omp_build_component_ref (tree obj, tree field);
252
253namespace omp_addr_tokenizer {
254
255/* These are the ways of accessing a variable that have special-case handling
256 in the middle end (gimplify, omp-lower, etc.). */
257
258/* These are the kinds of access that an ACCESS_METHOD token can represent. */
259
271
272/* These are the kinds that a STRUCTURE_BASE or ARRAY_BASE (except
273 BASE_COMPONENT_EXPR) can represent. */
274
275enum structure_base_kinds
276{
280};
281
282/* The coarse type for an address token. These can have subtypes for
283 ARRAY_BASE or STRUCTURE_BASE (structure_base_kinds) or ACCESS_METHOD
284 (access_method_kinds). */
285
293
294/* The struct that forms a single token of an address expression as parsed by
295 omp_parse_expr. These are typically held in a vec after parsing. */
296
312
313extern bool omp_access_chain_p (vec<omp_addr_token *> &, unsigned);
315
316}
317
319
321
323extern void omp_maybe_apply_loop_xforms (tree *, tree);
324
325#endif /* GCC_OMP_GENERAL_H */
#define GTY(x)
Definition coretypes.h:41
union tree_node * tree
Definition coretypes.h:97
@ MSG_PRIORITY_INTERNALS
Definition dumpfile.h:181
@ MSG_NOTE
Definition dumpfile.h:159
enum dump_flag dump_flags_t
Definition dumpfile.h:209
@ OPENACC_PRIVATIZATION_QUIET
Definition flag-types.h:553
tree_code
Definition genmatch.cc:992
Definition omp-general.cc:3997
structure_base_kinds
Definition omp-general.h:276
@ BASE_ARBITRARY_EXPR
Definition omp-general.h:279
@ BASE_COMPONENT_EXPR
Definition omp-general.h:278
@ BASE_DECL
Definition omp-general.h:277
access_method_kinds
Definition omp-general.h:261
@ ACCESS_REF_TO_POINTER
Definition omp-general.h:265
@ ACCESS_POINTER_OFFSET
Definition omp-general.h:266
@ ACCESS_DIRECT
Definition omp-general.h:262
@ ACCESS_INDEXED_REF_TO_ARRAY
Definition omp-general.h:269
@ ACCESS_REF_TO_POINTER_OFFSET
Definition omp-general.h:267
@ ACCESS_POINTER
Definition omp-general.h:264
@ ACCESS_REF
Definition omp-general.h:263
@ ACCESS_INDEXED_ARRAY
Definition omp-general.h:268
bool omp_access_chain_p(vec< omp_addr_token * > &addr_tokens, unsigned i)
Definition omp-general.cc:4298
tree omp_accessed_addr(vec< omp_addr_token * > &addr_tokens, unsigned i, tree expr)
Definition omp-general.cc:4310
token_type
Definition omp-general.h:287
@ STRUCTURE_BASE
Definition omp-general.h:289
@ ARRAY_BASE
Definition omp-general.h:288
@ COMPONENT_SELECTOR
Definition omp-general.h:290
@ ACCESS_METHOD
Definition omp-general.h:291
enum omp_requires omp_requires_mask
Definition omp-general.cc:48
vec< struct omp_variant > omp_get_dynamic_candidates(vec< struct omp_variant > &, tree)
Definition omp-general.cc:3061
tree omp_find_clause(tree clauses, enum omp_clause_code kind)
Definition omp-general.cc:52
tree omp_build_component_ref(tree obj, tree field)
Definition omp-general.cc:3815
gimple * omp_build_barrier(tree lhs)
Definition omp-general.cc:923
bool omp_is_allocatable_or_ptr(tree decl)
Definition omp-general.cc:64
tree omp_check_context_selector(location_t loc, tree ctx, bool metadirective_p)
Definition omp-general.cc:1305
void omp_mark_declare_variant(location_t loc, tree variant, tree construct)
Definition omp-general.cc:1501
tree oacc_build_routine_dims(tree clauses)
Definition omp-general.cc:3731
vec< struct omp_variant > omp_resolve_variant_construct(tree, tree)
Definition omp-general.cc:3437
tree oacc_replace_fn_attrib_attr(tree attribs, tree dims)
Definition omp-general.cc:3494
bool omp_privatize_by_reference(tree decl)
Definition omp-general.cc:98
int omp_context_selector_matches(tree, tree, bool)
Definition omp-general.cc:1670
int oacc_get_fn_dim_size(tree fn, int axis)
Definition omp-general.cc:3781
omp_addr_tokenizer::omp_addr_token omp_addr_token
Definition omp-general.h:318
tree omp_loop_number_of_iterations(tree, int, tree *=NULL)
Definition omp-general.cc:4423
tree make_trait_set_selector(enum omp_tss_code, tree, tree)
Definition omp-general.cc:1533
bool omp_mappable_type(tree type)
Definition omp-general.cc:86
tree make_trait_property(tree, tree, tree)
Definition omp-general.cc:1553
void omp_extract_for_data(gomp_for *for_stmt, struct omp_for_data *fd, struct omp_for_data_loop *loops)
Definition omp-general.cc:206
void oacc_replace_fn_attrib(tree fn, tree dims)
Definition omp-general.cc:3508
void omp_maybe_apply_loop_xforms(tree *, tree)
Definition omp-general.cc:4737
generic_wide_int< fixed_wide_int_storage< 1024 > > score_wide_int
Definition omp-general.h:96
vec< struct omp_variant > omp_metadirective_candidates(tree, tree)
Definition omp-general.cc:3391
tree omp_check_optional_argument(tree decl, bool for_present_check)
Definition omp-general.cc:78
tree find_combined_omp_for(tree *, int *, void *)
Definition omp-general.cc:940
int oacc_get_ifn_dim_arg(const gimple *stmt)
Definition omp-general.cc:3800
tree omp_dynamic_cond(tree, tree)
Definition omp-general.cc:2684
tree omp_get_context_selector_list(tree, enum omp_tss_code)
Definition omp-general.cc:2567
tree make_trait_selector(enum omp_ts_code, tree, tree, tree)
Definition omp-general.cc:1540
oacc_loop_flags
Definition omp-general.h:31
@ OLF_AUTO
Definition omp-general.h:33
@ OLF_DIM_VECTOR
Definition omp-general.h:43
@ OLF_DIM_GANG
Definition omp-general.h:41
@ OLF_REDUCTION
Definition omp-general.h:37
@ OLF_SEQ
Definition omp-general.h:32
@ OLF_TILE
Definition omp-general.h:36
@ OLF_GANG_STATIC
Definition omp-general.h:35
@ OLF_MAX
Definition omp-general.h:45
@ OLF_DIM_BASE
Definition omp-general.h:40
@ OLF_INDEPENDENT
Definition omp-general.h:34
@ OLF_DIM_WORKER
Definition omp-general.h:42
int omp_max_simt_vf(void)
Definition omp-general.cc:1037
tree oacc_launch_pack(unsigned code, tree device, unsigned op)
Definition omp-general.cc:3460
dump_flags_t get_openacc_privatization_dump_flags()
Definition omp-general.h:239
omp_requires
Definition omp-general.h:225
@ OMP_REQUIRES_REVERSE_OFFLOAD
Definition omp-general.h:230
@ OMP_REQUIRES_DYNAMIC_ALLOCATORS
Definition omp-general.h:229
@ OMP_REQUIRES_UNIFIED_ADDRESS
Definition omp-general.h:227
@ OMP_REQUIRES_ATOMIC_DEFAULT_MEM_ORDER_USED
Definition omp-general.h:231
@ OMP_REQUIRES_UNIFIED_SHARED_MEMORY
Definition omp-general.h:228
@ OMP_REQUIRES_SELF_MAPS
Definition omp-general.h:233
@ OMP_REQUIRES_TARGET_USED
Definition omp-general.h:232
@ OMP_REQUIRES_ATOMIC_DEFAULT_MEM_ORDER
Definition omp-general.h:226
int oacc_verify_routine_clauses(tree, tree *, location_t, const char *)
Definition omp-general.cc:3568
tree omp_get_context_selector(tree, enum omp_tss_code, enum omp_ts_code)
Definition omp-general.cc:2554
void oacc_set_fn_attrib(tree fn, tree clauses, vec< tree > *args)
Definition omp-general.cc:3519
tree omp_get_for_step_from_incr(location_t loc, tree incr)
Definition omp-general.cc:181
void omp_adjust_for_condition(location_t loc, enum tree_code *cond_code, tree *n2, tree v, tree step)
Definition omp-general.cc:107
vec< struct omp_variant > omp_declare_variant_candidates(tree, tree)
Definition omp-general.cc:3343
tree resolve_omp_target_device_matches(tree node)
Definition omp-general.cc:2172
const char * omp_context_name_list_prop(tree)
Definition omp-general.cc:1264
bool offloading_function_p(tree fn)
Definition omp-general.cc:3769
vec< struct omp_variant > omp_early_resolve_metadirective(tree)
Definition omp-general.cc:3425
tree oacc_get_fn_attrib(tree fn)
Definition omp-general.cc:3761
tree make_omp_metadirective_variant(tree, tree, tree)
Definition omp-general.cc:1560
bool omp_parse_expr(vec< omp_addr_token * > &, tree)
Definition omp-general.cc:4321
poly_uint64 omp_max_vf(bool)
Definition omp-general.cc:993
omp_tss_code
Definition omp-selectors.h:28
omp_ts_code
Definition omp-selectors.h:39
poly_int< NUM_POLY_INT_COEFFS, unsigned HOST_WIDE_INT > poly_uint64
Definition poly-int-types.h:25
Definition genautomata.cc:499
Definition gimple.h:221
Definition gimple.h:605
Definition cfgloop.h:324
Definition omp-general.h:298
omp_addr_token(token_type, tree)
Definition omp-general.cc:4048
tree expr
Definition omp-general.h:300
union omp_addr_tokenizer::omp_addr_token::@074161226327301316022247300110220316174056265170 u
structure_base_kinds structure_base_kind
Definition omp-general.h:305
enum token_type type
Definition omp-general.h:299
access_method_kinds access_kind
Definition omp-general.h:304
Definition omp-general.h:58
tree n1
Definition omp-general.h:59
tree m2
Definition omp-general.h:59
tree v
Definition omp-general.h:59
tree m1
Definition omp-general.h:59
enum tree_code cond_code
Definition omp-general.h:60
tree step
Definition omp-general.h:59
tree n2
Definition omp-general.h:59
int outer
Definition omp-general.h:61
bool non_rect_referenced
Definition omp-general.h:62
Definition omp-general.h:68
bool have_pointer_condtemp
Definition omp-general.h:78
int collapse
Definition omp-general.h:74
bool non_rect
Definition omp-general.h:79
int lastprivate_conditional
Definition omp-general.h:80
struct omp_for_data_loop loop
Definition omp-general.h:69
gomp_for * for_stmt
Definition omp-general.h:71
bool simd_schedule
Definition omp-general.h:77
int last_nonrect
Definition omp-general.h:76
bool have_nonctrl_scantemp
Definition omp-general.h:78
tree chunk_size
Definition omp-general.h:70
struct omp_for_data_loop * loops
Definition omp-general.h:83
tree first_inner_iterations
Definition omp-general.h:86
int first_nonrect
Definition omp-general.h:76
bool have_nowait
Definition omp-general.h:77
int ordered
Definition omp-general.h:75
bool have_reductemp
Definition omp-general.h:77
tree tiling
Definition omp-general.h:73
tree pre
Definition omp-general.h:72
bool have_ordered
Definition omp-general.h:77
bool have_scantemp
Definition omp-general.h:78
tree adjn1
Definition omp-general.h:91
tree factor
Definition omp-general.h:89
tree iter_type
Definition omp-general.h:72
enum omp_clause_schedule_kind sched_kind
Definition omp-general.h:82
unsigned char sched_modifiers
Definition omp-general.h:81
Definition omp-general.h:101
tree body
Definition omp-general.h:110
bool dynamic_selector
Definition omp-general.h:114
tree selector
Definition omp-general.h:103
score_wide_int score
Definition omp-general.h:112
bool matchable
Definition omp-general.h:116
bool scorable
Definition omp-general.h:118
tree alternative
Definition omp-general.h:108
Definition gengtype.h:252
Definition vec.h:450
#define NULL
Definition system.h:50
omp_clause_code
Definition tree-core.h:250
omp_clause_schedule_kind
Definition tree-core.h:600