annotate gcc/omp-general.c @ 158:494b0b89df80 default tip

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 18:13:55 +0900
parents 1830386684a0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 /* General types and functions that are uselful for processing of OpenMP,
kono
parents:
diff changeset
2 OpenACC and similar directivers at various stages of compilation.
kono
parents:
diff changeset
3
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
4 Copyright (C) 2005-2020 Free Software Foundation, Inc.
111
kono
parents:
diff changeset
5
kono
parents:
diff changeset
6 This file is part of GCC.
kono
parents:
diff changeset
7
kono
parents:
diff changeset
8 GCC is free software; you can redistribute it and/or modify it under
kono
parents:
diff changeset
9 the terms of the GNU General Public License as published by the Free
kono
parents:
diff changeset
10 Software Foundation; either version 3, or (at your option) any later
kono
parents:
diff changeset
11 version.
kono
parents:
diff changeset
12
kono
parents:
diff changeset
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
kono
parents:
diff changeset
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
kono
parents:
diff changeset
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
kono
parents:
diff changeset
16 for more details.
kono
parents:
diff changeset
17
kono
parents:
diff changeset
18 You should have received a copy of the GNU General Public License
kono
parents:
diff changeset
19 along with GCC; see the file COPYING3. If not see
kono
parents:
diff changeset
20 <http://www.gnu.org/licenses/>. */
kono
parents:
diff changeset
21
kono
parents:
diff changeset
22 /* Find an OMP clause of type KIND within CLAUSES. */
kono
parents:
diff changeset
23
kono
parents:
diff changeset
24 #include "config.h"
kono
parents:
diff changeset
25 #include "system.h"
kono
parents:
diff changeset
26 #include "coretypes.h"
kono
parents:
diff changeset
27 #include "backend.h"
kono
parents:
diff changeset
28 #include "target.h"
kono
parents:
diff changeset
29 #include "tree.h"
kono
parents:
diff changeset
30 #include "gimple.h"
kono
parents:
diff changeset
31 #include "ssa.h"
kono
parents:
diff changeset
32 #include "diagnostic-core.h"
kono
parents:
diff changeset
33 #include "fold-const.h"
kono
parents:
diff changeset
34 #include "langhooks.h"
kono
parents:
diff changeset
35 #include "omp-general.h"
kono
parents:
diff changeset
36 #include "stringpool.h"
kono
parents:
diff changeset
37 #include "attribs.h"
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
38 #include "gimplify.h"
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
39 #include "cgraph.h"
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
40 #include "alloc-pool.h"
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
41 #include "symbol-summary.h"
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
42 #include "hsa-common.h"
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
43 #include "tree-pass.h"
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
44 #include "omp-device-properties.h"
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
45
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
46 enum omp_requires omp_requires_mask;
111
kono
parents:
diff changeset
47
kono
parents:
diff changeset
48 tree
kono
parents:
diff changeset
49 omp_find_clause (tree clauses, enum omp_clause_code kind)
kono
parents:
diff changeset
50 {
kono
parents:
diff changeset
51 for (; clauses ; clauses = OMP_CLAUSE_CHAIN (clauses))
kono
parents:
diff changeset
52 if (OMP_CLAUSE_CODE (clauses) == kind)
kono
parents:
diff changeset
53 return clauses;
kono
parents:
diff changeset
54
kono
parents:
diff changeset
55 return NULL_TREE;
kono
parents:
diff changeset
56 }
kono
parents:
diff changeset
57
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
58 /* True if OpenMP should regard this DECL as being a scalar which has Fortran's
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
59 allocatable or pointer attribute. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
60 bool
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
61 omp_is_allocatable_or_ptr (tree decl)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
62 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
63 return lang_hooks.decls.omp_is_allocatable_or_ptr (decl);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
64 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
65
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
66 /* Check whether this DECL belongs to a Fortran optional argument.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
67 With 'for_present_check' set to false, decls which are optional parameters
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
68 themselve are returned as tree - or a NULL_TREE otherwise. Those decls are
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
69 always pointers. With 'for_present_check' set to true, the decl for checking
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
70 whether an argument is present is returned; for arguments with value
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
71 attribute this is the hidden argument and of BOOLEAN_TYPE. If the decl is
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
72 unrelated to optional arguments, NULL_TREE is returned. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
73
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
74 tree
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
75 omp_check_optional_argument (tree decl, bool for_present_check)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
76 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
77 return lang_hooks.decls.omp_check_optional_argument (decl, for_present_check);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
78 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
79
111
kono
parents:
diff changeset
80 /* Return true if DECL is a reference type. */
kono
parents:
diff changeset
81
kono
parents:
diff changeset
82 bool
kono
parents:
diff changeset
83 omp_is_reference (tree decl)
kono
parents:
diff changeset
84 {
kono
parents:
diff changeset
85 return lang_hooks.decls.omp_privatize_by_reference (decl);
kono
parents:
diff changeset
86 }
kono
parents:
diff changeset
87
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
88 /* Adjust *COND_CODE and *N2 so that the former is either LT_EXPR or GT_EXPR,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
89 given that V is the loop index variable and STEP is loop step. */
111
kono
parents:
diff changeset
90
kono
parents:
diff changeset
91 void
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
92 omp_adjust_for_condition (location_t loc, enum tree_code *cond_code, tree *n2,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
93 tree v, tree step)
111
kono
parents:
diff changeset
94 {
kono
parents:
diff changeset
95 switch (*cond_code)
kono
parents:
diff changeset
96 {
kono
parents:
diff changeset
97 case LT_EXPR:
kono
parents:
diff changeset
98 case GT_EXPR:
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
99 break;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
100
111
kono
parents:
diff changeset
101 case NE_EXPR:
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
102 gcc_assert (TREE_CODE (step) == INTEGER_CST);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
103 if (TREE_CODE (TREE_TYPE (v)) == INTEGER_TYPE)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
104 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
105 if (integer_onep (step))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
106 *cond_code = LT_EXPR;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
107 else
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
108 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
109 gcc_assert (integer_minus_onep (step));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
110 *cond_code = GT_EXPR;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
111 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
112 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
113 else
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
114 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
115 tree unit = TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (v)));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
116 gcc_assert (TREE_CODE (unit) == INTEGER_CST);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
117 if (tree_int_cst_equal (unit, step))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
118 *cond_code = LT_EXPR;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
119 else
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
120 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
121 gcc_assert (wi::neg (wi::to_widest (unit))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
122 == wi::to_widest (step));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
123 *cond_code = GT_EXPR;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
124 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
125 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
126
111
kono
parents:
diff changeset
127 break;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
128
111
kono
parents:
diff changeset
129 case LE_EXPR:
kono
parents:
diff changeset
130 if (POINTER_TYPE_P (TREE_TYPE (*n2)))
kono
parents:
diff changeset
131 *n2 = fold_build_pointer_plus_hwi_loc (loc, *n2, 1);
kono
parents:
diff changeset
132 else
kono
parents:
diff changeset
133 *n2 = fold_build2_loc (loc, PLUS_EXPR, TREE_TYPE (*n2), *n2,
kono
parents:
diff changeset
134 build_int_cst (TREE_TYPE (*n2), 1));
kono
parents:
diff changeset
135 *cond_code = LT_EXPR;
kono
parents:
diff changeset
136 break;
kono
parents:
diff changeset
137 case GE_EXPR:
kono
parents:
diff changeset
138 if (POINTER_TYPE_P (TREE_TYPE (*n2)))
kono
parents:
diff changeset
139 *n2 = fold_build_pointer_plus_hwi_loc (loc, *n2, -1);
kono
parents:
diff changeset
140 else
kono
parents:
diff changeset
141 *n2 = fold_build2_loc (loc, MINUS_EXPR, TREE_TYPE (*n2), *n2,
kono
parents:
diff changeset
142 build_int_cst (TREE_TYPE (*n2), 1));
kono
parents:
diff changeset
143 *cond_code = GT_EXPR;
kono
parents:
diff changeset
144 break;
kono
parents:
diff changeset
145 default:
kono
parents:
diff changeset
146 gcc_unreachable ();
kono
parents:
diff changeset
147 }
kono
parents:
diff changeset
148 }
kono
parents:
diff changeset
149
kono
parents:
diff changeset
150 /* Return the looping step from INCR, extracted from the step of a gimple omp
kono
parents:
diff changeset
151 for statement. */
kono
parents:
diff changeset
152
kono
parents:
diff changeset
153 tree
kono
parents:
diff changeset
154 omp_get_for_step_from_incr (location_t loc, tree incr)
kono
parents:
diff changeset
155 {
kono
parents:
diff changeset
156 tree step;
kono
parents:
diff changeset
157 switch (TREE_CODE (incr))
kono
parents:
diff changeset
158 {
kono
parents:
diff changeset
159 case PLUS_EXPR:
kono
parents:
diff changeset
160 step = TREE_OPERAND (incr, 1);
kono
parents:
diff changeset
161 break;
kono
parents:
diff changeset
162 case POINTER_PLUS_EXPR:
kono
parents:
diff changeset
163 step = fold_convert (ssizetype, TREE_OPERAND (incr, 1));
kono
parents:
diff changeset
164 break;
kono
parents:
diff changeset
165 case MINUS_EXPR:
kono
parents:
diff changeset
166 step = TREE_OPERAND (incr, 1);
kono
parents:
diff changeset
167 step = fold_build1_loc (loc, NEGATE_EXPR, TREE_TYPE (step), step);
kono
parents:
diff changeset
168 break;
kono
parents:
diff changeset
169 default:
kono
parents:
diff changeset
170 gcc_unreachable ();
kono
parents:
diff changeset
171 }
kono
parents:
diff changeset
172 return step;
kono
parents:
diff changeset
173 }
kono
parents:
diff changeset
174
kono
parents:
diff changeset
175 /* Extract the header elements of parallel loop FOR_STMT and store
kono
parents:
diff changeset
176 them into *FD. */
kono
parents:
diff changeset
177
kono
parents:
diff changeset
178 void
kono
parents:
diff changeset
179 omp_extract_for_data (gomp_for *for_stmt, struct omp_for_data *fd,
kono
parents:
diff changeset
180 struct omp_for_data_loop *loops)
kono
parents:
diff changeset
181 {
kono
parents:
diff changeset
182 tree t, var, *collapse_iter, *collapse_count;
kono
parents:
diff changeset
183 tree count = NULL_TREE, iter_type = long_integer_type_node;
kono
parents:
diff changeset
184 struct omp_for_data_loop *loop;
kono
parents:
diff changeset
185 int i;
kono
parents:
diff changeset
186 struct omp_for_data_loop dummy_loop;
kono
parents:
diff changeset
187 location_t loc = gimple_location (for_stmt);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
188 bool simd = gimple_omp_for_kind (for_stmt) == GF_OMP_FOR_KIND_SIMD;
111
kono
parents:
diff changeset
189 bool distribute = gimple_omp_for_kind (for_stmt)
kono
parents:
diff changeset
190 == GF_OMP_FOR_KIND_DISTRIBUTE;
kono
parents:
diff changeset
191 bool taskloop = gimple_omp_for_kind (for_stmt)
kono
parents:
diff changeset
192 == GF_OMP_FOR_KIND_TASKLOOP;
kono
parents:
diff changeset
193 tree iterv, countv;
kono
parents:
diff changeset
194
kono
parents:
diff changeset
195 fd->for_stmt = for_stmt;
kono
parents:
diff changeset
196 fd->pre = NULL;
kono
parents:
diff changeset
197 fd->have_nowait = distribute || simd;
kono
parents:
diff changeset
198 fd->have_ordered = false;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
199 fd->have_reductemp = false;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
200 fd->have_pointer_condtemp = false;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
201 fd->have_scantemp = false;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
202 fd->have_nonctrl_scantemp = false;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
203 fd->lastprivate_conditional = 0;
111
kono
parents:
diff changeset
204 fd->tiling = NULL_TREE;
kono
parents:
diff changeset
205 fd->collapse = 1;
kono
parents:
diff changeset
206 fd->ordered = 0;
kono
parents:
diff changeset
207 fd->sched_kind = OMP_CLAUSE_SCHEDULE_STATIC;
kono
parents:
diff changeset
208 fd->sched_modifiers = 0;
kono
parents:
diff changeset
209 fd->chunk_size = NULL_TREE;
kono
parents:
diff changeset
210 fd->simd_schedule = false;
kono
parents:
diff changeset
211 collapse_iter = NULL;
kono
parents:
diff changeset
212 collapse_count = NULL;
kono
parents:
diff changeset
213
kono
parents:
diff changeset
214 for (t = gimple_omp_for_clauses (for_stmt); t ; t = OMP_CLAUSE_CHAIN (t))
kono
parents:
diff changeset
215 switch (OMP_CLAUSE_CODE (t))
kono
parents:
diff changeset
216 {
kono
parents:
diff changeset
217 case OMP_CLAUSE_NOWAIT:
kono
parents:
diff changeset
218 fd->have_nowait = true;
kono
parents:
diff changeset
219 break;
kono
parents:
diff changeset
220 case OMP_CLAUSE_ORDERED:
kono
parents:
diff changeset
221 fd->have_ordered = true;
kono
parents:
diff changeset
222 if (OMP_CLAUSE_ORDERED_EXPR (t))
kono
parents:
diff changeset
223 fd->ordered = tree_to_shwi (OMP_CLAUSE_ORDERED_EXPR (t));
kono
parents:
diff changeset
224 break;
kono
parents:
diff changeset
225 case OMP_CLAUSE_SCHEDULE:
kono
parents:
diff changeset
226 gcc_assert (!distribute && !taskloop);
kono
parents:
diff changeset
227 fd->sched_kind
kono
parents:
diff changeset
228 = (enum omp_clause_schedule_kind)
kono
parents:
diff changeset
229 (OMP_CLAUSE_SCHEDULE_KIND (t) & OMP_CLAUSE_SCHEDULE_MASK);
kono
parents:
diff changeset
230 fd->sched_modifiers = (OMP_CLAUSE_SCHEDULE_KIND (t)
kono
parents:
diff changeset
231 & ~OMP_CLAUSE_SCHEDULE_MASK);
kono
parents:
diff changeset
232 fd->chunk_size = OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (t);
kono
parents:
diff changeset
233 fd->simd_schedule = OMP_CLAUSE_SCHEDULE_SIMD (t);
kono
parents:
diff changeset
234 break;
kono
parents:
diff changeset
235 case OMP_CLAUSE_DIST_SCHEDULE:
kono
parents:
diff changeset
236 gcc_assert (distribute);
kono
parents:
diff changeset
237 fd->chunk_size = OMP_CLAUSE_DIST_SCHEDULE_CHUNK_EXPR (t);
kono
parents:
diff changeset
238 break;
kono
parents:
diff changeset
239 case OMP_CLAUSE_COLLAPSE:
kono
parents:
diff changeset
240 fd->collapse = tree_to_shwi (OMP_CLAUSE_COLLAPSE_EXPR (t));
kono
parents:
diff changeset
241 if (fd->collapse > 1)
kono
parents:
diff changeset
242 {
kono
parents:
diff changeset
243 collapse_iter = &OMP_CLAUSE_COLLAPSE_ITERVAR (t);
kono
parents:
diff changeset
244 collapse_count = &OMP_CLAUSE_COLLAPSE_COUNT (t);
kono
parents:
diff changeset
245 }
kono
parents:
diff changeset
246 break;
kono
parents:
diff changeset
247 case OMP_CLAUSE_TILE:
kono
parents:
diff changeset
248 fd->tiling = OMP_CLAUSE_TILE_LIST (t);
kono
parents:
diff changeset
249 fd->collapse = list_length (fd->tiling);
kono
parents:
diff changeset
250 gcc_assert (fd->collapse);
kono
parents:
diff changeset
251 collapse_iter = &OMP_CLAUSE_TILE_ITERVAR (t);
kono
parents:
diff changeset
252 collapse_count = &OMP_CLAUSE_TILE_COUNT (t);
kono
parents:
diff changeset
253 break;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
254 case OMP_CLAUSE__REDUCTEMP_:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
255 fd->have_reductemp = true;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
256 break;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
257 case OMP_CLAUSE_LASTPRIVATE:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
258 if (OMP_CLAUSE_LASTPRIVATE_CONDITIONAL (t))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
259 fd->lastprivate_conditional++;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
260 break;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
261 case OMP_CLAUSE__CONDTEMP_:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
262 if (POINTER_TYPE_P (TREE_TYPE (OMP_CLAUSE_DECL (t))))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
263 fd->have_pointer_condtemp = true;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
264 break;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
265 case OMP_CLAUSE__SCANTEMP_:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
266 fd->have_scantemp = true;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
267 if (!OMP_CLAUSE__SCANTEMP__ALLOC (t)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
268 && !OMP_CLAUSE__SCANTEMP__CONTROL (t))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
269 fd->have_nonctrl_scantemp = true;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
270 break;
111
kono
parents:
diff changeset
271 default:
kono
parents:
diff changeset
272 break;
kono
parents:
diff changeset
273 }
kono
parents:
diff changeset
274
kono
parents:
diff changeset
275 if (fd->collapse > 1 || fd->tiling)
kono
parents:
diff changeset
276 fd->loops = loops;
kono
parents:
diff changeset
277 else
kono
parents:
diff changeset
278 fd->loops = &fd->loop;
kono
parents:
diff changeset
279
kono
parents:
diff changeset
280 if (fd->ordered && fd->collapse == 1 && loops != NULL)
kono
parents:
diff changeset
281 {
kono
parents:
diff changeset
282 fd->loops = loops;
kono
parents:
diff changeset
283 iterv = NULL_TREE;
kono
parents:
diff changeset
284 countv = NULL_TREE;
kono
parents:
diff changeset
285 collapse_iter = &iterv;
kono
parents:
diff changeset
286 collapse_count = &countv;
kono
parents:
diff changeset
287 }
kono
parents:
diff changeset
288
kono
parents:
diff changeset
289 /* FIXME: for now map schedule(auto) to schedule(static).
kono
parents:
diff changeset
290 There should be analysis to determine whether all iterations
kono
parents:
diff changeset
291 are approximately the same amount of work (then schedule(static)
kono
parents:
diff changeset
292 is best) or if it varies (then schedule(dynamic,N) is better). */
kono
parents:
diff changeset
293 if (fd->sched_kind == OMP_CLAUSE_SCHEDULE_AUTO)
kono
parents:
diff changeset
294 {
kono
parents:
diff changeset
295 fd->sched_kind = OMP_CLAUSE_SCHEDULE_STATIC;
kono
parents:
diff changeset
296 gcc_assert (fd->chunk_size == NULL);
kono
parents:
diff changeset
297 }
kono
parents:
diff changeset
298 gcc_assert ((fd->collapse == 1 && !fd->tiling) || collapse_iter != NULL);
kono
parents:
diff changeset
299 if (taskloop)
kono
parents:
diff changeset
300 fd->sched_kind = OMP_CLAUSE_SCHEDULE_RUNTIME;
kono
parents:
diff changeset
301 if (fd->sched_kind == OMP_CLAUSE_SCHEDULE_RUNTIME)
kono
parents:
diff changeset
302 gcc_assert (fd->chunk_size == NULL);
kono
parents:
diff changeset
303 else if (fd->chunk_size == NULL)
kono
parents:
diff changeset
304 {
kono
parents:
diff changeset
305 /* We only need to compute a default chunk size for ordered
kono
parents:
diff changeset
306 static loops and dynamic loops. */
kono
parents:
diff changeset
307 if (fd->sched_kind != OMP_CLAUSE_SCHEDULE_STATIC
kono
parents:
diff changeset
308 || fd->have_ordered)
kono
parents:
diff changeset
309 fd->chunk_size = (fd->sched_kind == OMP_CLAUSE_SCHEDULE_STATIC)
kono
parents:
diff changeset
310 ? integer_zero_node : integer_one_node;
kono
parents:
diff changeset
311 }
kono
parents:
diff changeset
312
kono
parents:
diff changeset
313 int cnt = fd->ordered ? fd->ordered : fd->collapse;
kono
parents:
diff changeset
314 for (i = 0; i < cnt; i++)
kono
parents:
diff changeset
315 {
kono
parents:
diff changeset
316 if (i == 0
kono
parents:
diff changeset
317 && fd->collapse == 1
kono
parents:
diff changeset
318 && !fd->tiling
kono
parents:
diff changeset
319 && (fd->ordered == 0 || loops == NULL))
kono
parents:
diff changeset
320 loop = &fd->loop;
kono
parents:
diff changeset
321 else if (loops != NULL)
kono
parents:
diff changeset
322 loop = loops + i;
kono
parents:
diff changeset
323 else
kono
parents:
diff changeset
324 loop = &dummy_loop;
kono
parents:
diff changeset
325
kono
parents:
diff changeset
326 loop->v = gimple_omp_for_index (for_stmt, i);
kono
parents:
diff changeset
327 gcc_assert (SSA_VAR_P (loop->v));
kono
parents:
diff changeset
328 gcc_assert (TREE_CODE (TREE_TYPE (loop->v)) == INTEGER_TYPE
kono
parents:
diff changeset
329 || TREE_CODE (TREE_TYPE (loop->v)) == POINTER_TYPE);
kono
parents:
diff changeset
330 var = TREE_CODE (loop->v) == SSA_NAME ? SSA_NAME_VAR (loop->v) : loop->v;
kono
parents:
diff changeset
331 loop->n1 = gimple_omp_for_initial (for_stmt, i);
kono
parents:
diff changeset
332
kono
parents:
diff changeset
333 loop->cond_code = gimple_omp_for_cond (for_stmt, i);
kono
parents:
diff changeset
334 loop->n2 = gimple_omp_for_final (for_stmt, i);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
335 gcc_assert (loop->cond_code != NE_EXPR
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
336 || (gimple_omp_for_kind (for_stmt)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
337 != GF_OMP_FOR_KIND_OACC_LOOP));
111
kono
parents:
diff changeset
338
kono
parents:
diff changeset
339 t = gimple_omp_for_incr (for_stmt, i);
kono
parents:
diff changeset
340 gcc_assert (TREE_OPERAND (t, 0) == var);
kono
parents:
diff changeset
341 loop->step = omp_get_for_step_from_incr (loc, t);
kono
parents:
diff changeset
342
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
343 omp_adjust_for_condition (loc, &loop->cond_code, &loop->n2, loop->v,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
344 loop->step);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
345
111
kono
parents:
diff changeset
346 if (simd
kono
parents:
diff changeset
347 || (fd->sched_kind == OMP_CLAUSE_SCHEDULE_STATIC
kono
parents:
diff changeset
348 && !fd->have_ordered))
kono
parents:
diff changeset
349 {
kono
parents:
diff changeset
350 if (fd->collapse == 1 && !fd->tiling)
kono
parents:
diff changeset
351 iter_type = TREE_TYPE (loop->v);
kono
parents:
diff changeset
352 else if (i == 0
kono
parents:
diff changeset
353 || TYPE_PRECISION (iter_type)
kono
parents:
diff changeset
354 < TYPE_PRECISION (TREE_TYPE (loop->v)))
kono
parents:
diff changeset
355 iter_type
kono
parents:
diff changeset
356 = build_nonstandard_integer_type
kono
parents:
diff changeset
357 (TYPE_PRECISION (TREE_TYPE (loop->v)), 1);
kono
parents:
diff changeset
358 }
kono
parents:
diff changeset
359 else if (iter_type != long_long_unsigned_type_node)
kono
parents:
diff changeset
360 {
kono
parents:
diff changeset
361 if (POINTER_TYPE_P (TREE_TYPE (loop->v)))
kono
parents:
diff changeset
362 iter_type = long_long_unsigned_type_node;
kono
parents:
diff changeset
363 else if (TYPE_UNSIGNED (TREE_TYPE (loop->v))
kono
parents:
diff changeset
364 && TYPE_PRECISION (TREE_TYPE (loop->v))
kono
parents:
diff changeset
365 >= TYPE_PRECISION (iter_type))
kono
parents:
diff changeset
366 {
kono
parents:
diff changeset
367 tree n;
kono
parents:
diff changeset
368
kono
parents:
diff changeset
369 if (loop->cond_code == LT_EXPR)
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
370 n = fold_build2_loc (loc, PLUS_EXPR, TREE_TYPE (loop->v),
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
371 loop->n2, loop->step);
111
kono
parents:
diff changeset
372 else
kono
parents:
diff changeset
373 n = loop->n1;
kono
parents:
diff changeset
374 if (TREE_CODE (n) != INTEGER_CST
kono
parents:
diff changeset
375 || tree_int_cst_lt (TYPE_MAX_VALUE (iter_type), n))
kono
parents:
diff changeset
376 iter_type = long_long_unsigned_type_node;
kono
parents:
diff changeset
377 }
kono
parents:
diff changeset
378 else if (TYPE_PRECISION (TREE_TYPE (loop->v))
kono
parents:
diff changeset
379 > TYPE_PRECISION (iter_type))
kono
parents:
diff changeset
380 {
kono
parents:
diff changeset
381 tree n1, n2;
kono
parents:
diff changeset
382
kono
parents:
diff changeset
383 if (loop->cond_code == LT_EXPR)
kono
parents:
diff changeset
384 {
kono
parents:
diff changeset
385 n1 = loop->n1;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
386 n2 = fold_build2_loc (loc, PLUS_EXPR, TREE_TYPE (loop->v),
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
387 loop->n2, loop->step);
111
kono
parents:
diff changeset
388 }
kono
parents:
diff changeset
389 else
kono
parents:
diff changeset
390 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
391 n1 = fold_build2_loc (loc, MINUS_EXPR, TREE_TYPE (loop->v),
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
392 loop->n2, loop->step);
111
kono
parents:
diff changeset
393 n2 = loop->n1;
kono
parents:
diff changeset
394 }
kono
parents:
diff changeset
395 if (TREE_CODE (n1) != INTEGER_CST
kono
parents:
diff changeset
396 || TREE_CODE (n2) != INTEGER_CST
kono
parents:
diff changeset
397 || !tree_int_cst_lt (TYPE_MIN_VALUE (iter_type), n1)
kono
parents:
diff changeset
398 || !tree_int_cst_lt (n2, TYPE_MAX_VALUE (iter_type)))
kono
parents:
diff changeset
399 iter_type = long_long_unsigned_type_node;
kono
parents:
diff changeset
400 }
kono
parents:
diff changeset
401 }
kono
parents:
diff changeset
402
kono
parents:
diff changeset
403 if (i >= fd->collapse)
kono
parents:
diff changeset
404 continue;
kono
parents:
diff changeset
405
kono
parents:
diff changeset
406 if (collapse_count && *collapse_count == NULL)
kono
parents:
diff changeset
407 {
kono
parents:
diff changeset
408 t = fold_binary (loop->cond_code, boolean_type_node,
kono
parents:
diff changeset
409 fold_convert (TREE_TYPE (loop->v), loop->n1),
kono
parents:
diff changeset
410 fold_convert (TREE_TYPE (loop->v), loop->n2));
kono
parents:
diff changeset
411 if (t && integer_zerop (t))
kono
parents:
diff changeset
412 count = build_zero_cst (long_long_unsigned_type_node);
kono
parents:
diff changeset
413 else if ((i == 0 || count != NULL_TREE)
kono
parents:
diff changeset
414 && TREE_CODE (TREE_TYPE (loop->v)) == INTEGER_TYPE
kono
parents:
diff changeset
415 && TREE_CONSTANT (loop->n1)
kono
parents:
diff changeset
416 && TREE_CONSTANT (loop->n2)
kono
parents:
diff changeset
417 && TREE_CODE (loop->step) == INTEGER_CST)
kono
parents:
diff changeset
418 {
kono
parents:
diff changeset
419 tree itype = TREE_TYPE (loop->v);
kono
parents:
diff changeset
420
kono
parents:
diff changeset
421 if (POINTER_TYPE_P (itype))
kono
parents:
diff changeset
422 itype = signed_type_for (itype);
kono
parents:
diff changeset
423 t = build_int_cst (itype, (loop->cond_code == LT_EXPR ? -1 : 1));
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
424 t = fold_build2_loc (loc, PLUS_EXPR, itype,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
425 fold_convert_loc (loc, itype, loop->step),
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
426 t);
111
kono
parents:
diff changeset
427 t = fold_build2_loc (loc, PLUS_EXPR, itype, t,
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
428 fold_convert_loc (loc, itype, loop->n2));
111
kono
parents:
diff changeset
429 t = fold_build2_loc (loc, MINUS_EXPR, itype, t,
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
430 fold_convert_loc (loc, itype, loop->n1));
111
kono
parents:
diff changeset
431 if (TYPE_UNSIGNED (itype) && loop->cond_code == GT_EXPR)
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
432 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
433 tree step = fold_convert_loc (loc, itype, loop->step);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
434 t = fold_build2_loc (loc, TRUNC_DIV_EXPR, itype,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
435 fold_build1_loc (loc, NEGATE_EXPR,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
436 itype, t),
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
437 fold_build1_loc (loc, NEGATE_EXPR,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
438 itype, step));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
439 }
111
kono
parents:
diff changeset
440 else
kono
parents:
diff changeset
441 t = fold_build2_loc (loc, TRUNC_DIV_EXPR, itype, t,
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
442 fold_convert_loc (loc, itype,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
443 loop->step));
111
kono
parents:
diff changeset
444 t = fold_convert_loc (loc, long_long_unsigned_type_node, t);
kono
parents:
diff changeset
445 if (count != NULL_TREE)
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
446 count = fold_build2_loc (loc, MULT_EXPR,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
447 long_long_unsigned_type_node,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
448 count, t);
111
kono
parents:
diff changeset
449 else
kono
parents:
diff changeset
450 count = t;
kono
parents:
diff changeset
451 if (TREE_CODE (count) != INTEGER_CST)
kono
parents:
diff changeset
452 count = NULL_TREE;
kono
parents:
diff changeset
453 }
kono
parents:
diff changeset
454 else if (count && !integer_zerop (count))
kono
parents:
diff changeset
455 count = NULL_TREE;
kono
parents:
diff changeset
456 }
kono
parents:
diff changeset
457 }
kono
parents:
diff changeset
458
kono
parents:
diff changeset
459 if (count
kono
parents:
diff changeset
460 && !simd
kono
parents:
diff changeset
461 && (fd->sched_kind != OMP_CLAUSE_SCHEDULE_STATIC
kono
parents:
diff changeset
462 || fd->have_ordered))
kono
parents:
diff changeset
463 {
kono
parents:
diff changeset
464 if (!tree_int_cst_lt (count, TYPE_MAX_VALUE (long_integer_type_node)))
kono
parents:
diff changeset
465 iter_type = long_long_unsigned_type_node;
kono
parents:
diff changeset
466 else
kono
parents:
diff changeset
467 iter_type = long_integer_type_node;
kono
parents:
diff changeset
468 }
kono
parents:
diff changeset
469 else if (collapse_iter && *collapse_iter != NULL)
kono
parents:
diff changeset
470 iter_type = TREE_TYPE (*collapse_iter);
kono
parents:
diff changeset
471 fd->iter_type = iter_type;
kono
parents:
diff changeset
472 if (collapse_iter && *collapse_iter == NULL)
kono
parents:
diff changeset
473 *collapse_iter = create_tmp_var (iter_type, ".iter");
kono
parents:
diff changeset
474 if (collapse_count && *collapse_count == NULL)
kono
parents:
diff changeset
475 {
kono
parents:
diff changeset
476 if (count)
kono
parents:
diff changeset
477 *collapse_count = fold_convert_loc (loc, iter_type, count);
kono
parents:
diff changeset
478 else
kono
parents:
diff changeset
479 *collapse_count = create_tmp_var (iter_type, ".count");
kono
parents:
diff changeset
480 }
kono
parents:
diff changeset
481
kono
parents:
diff changeset
482 if (fd->collapse > 1 || fd->tiling || (fd->ordered && loops))
kono
parents:
diff changeset
483 {
kono
parents:
diff changeset
484 fd->loop.v = *collapse_iter;
kono
parents:
diff changeset
485 fd->loop.n1 = build_int_cst (TREE_TYPE (fd->loop.v), 0);
kono
parents:
diff changeset
486 fd->loop.n2 = *collapse_count;
kono
parents:
diff changeset
487 fd->loop.step = build_int_cst (TREE_TYPE (fd->loop.v), 1);
kono
parents:
diff changeset
488 fd->loop.cond_code = LT_EXPR;
kono
parents:
diff changeset
489 }
kono
parents:
diff changeset
490 else if (loops)
kono
parents:
diff changeset
491 loops[0] = fd->loop;
kono
parents:
diff changeset
492 }
kono
parents:
diff changeset
493
kono
parents:
diff changeset
494 /* Build a call to GOMP_barrier. */
kono
parents:
diff changeset
495
kono
parents:
diff changeset
496 gimple *
kono
parents:
diff changeset
497 omp_build_barrier (tree lhs)
kono
parents:
diff changeset
498 {
kono
parents:
diff changeset
499 tree fndecl = builtin_decl_explicit (lhs ? BUILT_IN_GOMP_BARRIER_CANCEL
kono
parents:
diff changeset
500 : BUILT_IN_GOMP_BARRIER);
kono
parents:
diff changeset
501 gcall *g = gimple_build_call (fndecl, 0);
kono
parents:
diff changeset
502 if (lhs)
kono
parents:
diff changeset
503 gimple_call_set_lhs (g, lhs);
kono
parents:
diff changeset
504 return g;
kono
parents:
diff changeset
505 }
kono
parents:
diff changeset
506
kono
parents:
diff changeset
507 /* Return maximum possible vectorization factor for the target. */
kono
parents:
diff changeset
508
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
509 poly_uint64
111
kono
parents:
diff changeset
510 omp_max_vf (void)
kono
parents:
diff changeset
511 {
kono
parents:
diff changeset
512 if (!optimize
kono
parents:
diff changeset
513 || optimize_debug
kono
parents:
diff changeset
514 || !flag_tree_loop_optimize
kono
parents:
diff changeset
515 || (!flag_tree_loop_vectorize
kono
parents:
diff changeset
516 && global_options_set.x_flag_tree_loop_vectorize))
kono
parents:
diff changeset
517 return 1;
kono
parents:
diff changeset
518
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
519 auto_vector_modes modes;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
520 targetm.vectorize.autovectorize_vector_modes (&modes, true);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
521 if (!modes.is_empty ())
111
kono
parents:
diff changeset
522 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
523 poly_uint64 vf = 0;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
524 for (unsigned int i = 0; i < modes.length (); ++i)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
525 /* The returned modes use the smallest element size (and thus
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
526 the largest nunits) for the vectorization approach that they
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
527 represent. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
528 vf = ordered_max (vf, GET_MODE_NUNITS (modes[i]));
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
529 return vf;
111
kono
parents:
diff changeset
530 }
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
531
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
532 machine_mode vqimode = targetm.vectorize.preferred_simd_mode (QImode);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
533 if (GET_MODE_CLASS (vqimode) == MODE_VECTOR_INT)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
534 return GET_MODE_NUNITS (vqimode);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
535
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
536 return 1;
111
kono
parents:
diff changeset
537 }
kono
parents:
diff changeset
538
kono
parents:
diff changeset
539 /* Return maximum SIMT width if offloading may target SIMT hardware. */
kono
parents:
diff changeset
540
kono
parents:
diff changeset
541 int
kono
parents:
diff changeset
542 omp_max_simt_vf (void)
kono
parents:
diff changeset
543 {
kono
parents:
diff changeset
544 if (!optimize)
kono
parents:
diff changeset
545 return 0;
kono
parents:
diff changeset
546 if (ENABLE_OFFLOADING)
kono
parents:
diff changeset
547 for (const char *c = getenv ("OFFLOAD_TARGET_NAMES"); c;)
kono
parents:
diff changeset
548 {
kono
parents:
diff changeset
549 if (!strncmp (c, "nvptx", strlen ("nvptx")))
kono
parents:
diff changeset
550 return 32;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
551 else if ((c = strchr (c, ':')))
111
kono
parents:
diff changeset
552 c++;
kono
parents:
diff changeset
553 }
kono
parents:
diff changeset
554 return 0;
kono
parents:
diff changeset
555 }
kono
parents:
diff changeset
556
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
557 /* Store the construct selectors as tree codes from last to first,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
558 return their number. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
559
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
560 int
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
561 omp_constructor_traits_to_codes (tree ctx, enum tree_code *constructs)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
562 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
563 int nconstructs = list_length (ctx);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
564 int i = nconstructs - 1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
565 for (tree t2 = ctx; t2; t2 = TREE_CHAIN (t2), i--)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
566 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
567 const char *sel = IDENTIFIER_POINTER (TREE_PURPOSE (t2));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
568 if (!strcmp (sel, "target"))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
569 constructs[i] = OMP_TARGET;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
570 else if (!strcmp (sel, "teams"))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
571 constructs[i] = OMP_TEAMS;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
572 else if (!strcmp (sel, "parallel"))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
573 constructs[i] = OMP_PARALLEL;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
574 else if (!strcmp (sel, "for") || !strcmp (sel, "do"))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
575 constructs[i] = OMP_FOR;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
576 else if (!strcmp (sel, "simd"))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
577 constructs[i] = OMP_SIMD;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
578 else
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
579 gcc_unreachable ();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
580 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
581 gcc_assert (i == -1);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
582 return nconstructs;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
583 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
584
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
585 /* Return true if PROP is possibly present in one of the offloading target's
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
586 OpenMP contexts. The format of PROPS string is always offloading target's
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
587 name terminated by '\0', followed by properties for that offloading
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
588 target separated by '\0' and terminated by another '\0'. The strings
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
589 are created from omp-device-properties installed files of all configured
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
590 offloading targets. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
591
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
592 static bool
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
593 omp_offload_device_kind_arch_isa (const char *props, const char *prop)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
594 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
595 const char *names = getenv ("OFFLOAD_TARGET_NAMES");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
596 if (names == NULL || *names == '\0')
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
597 return false;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
598 while (*props != '\0')
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
599 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
600 size_t name_len = strlen (props);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
601 bool matches = false;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
602 for (const char *c = names; c; )
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
603 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
604 if (strncmp (props, c, name_len) == 0
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
605 && (c[name_len] == '\0'
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
606 || c[name_len] == ':'
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
607 || c[name_len] == '='))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
608 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
609 matches = true;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
610 break;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
611 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
612 else if ((c = strchr (c, ':')))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
613 c++;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
614 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
615 props = props + name_len + 1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
616 while (*props != '\0')
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
617 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
618 if (matches && strcmp (props, prop) == 0)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
619 return true;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
620 props = strchr (props, '\0') + 1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
621 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
622 props++;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
623 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
624 return false;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
625 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
626
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
627 /* Return true if the current code location is or might be offloaded.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
628 Return true in declare target functions, or when nested in a target
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
629 region or when unsure, return false otherwise. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
630
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
631 static bool
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
632 omp_maybe_offloaded (void)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
633 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
634 if (!hsa_gen_requested_p ())
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
635 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
636 if (!ENABLE_OFFLOADING)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
637 return false;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
638 const char *names = getenv ("OFFLOAD_TARGET_NAMES");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
639 if (names == NULL || *names == '\0')
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
640 return false;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
641 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
642 if (symtab->state == PARSING)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
643 /* Maybe. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
644 return true;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
645 if (current_function_decl
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
646 && lookup_attribute ("omp declare target",
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
647 DECL_ATTRIBUTES (current_function_decl)))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
648 return true;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
649 if (cfun && (cfun->curr_properties & PROP_gimple_any) == 0)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
650 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
651 enum tree_code construct = OMP_TARGET;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
652 if (omp_construct_selector_matches (&construct, 1, NULL))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
653 return true;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
654 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
655 return false;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
656 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
657
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
658 /* Return a name from PROP, a property in selectors accepting
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
659 name lists. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
660
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
661 static const char *
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
662 omp_context_name_list_prop (tree prop)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
663 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
664 if (TREE_PURPOSE (prop))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
665 return IDENTIFIER_POINTER (TREE_PURPOSE (prop));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
666 else
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
667 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
668 const char *ret = TREE_STRING_POINTER (TREE_VALUE (prop));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
669 if ((size_t) TREE_STRING_LENGTH (TREE_VALUE (prop)) == strlen (ret) + 1)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
670 return ret;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
671 return NULL;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
672 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
673 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
674
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
675 /* Return 1 if context selector matches the current OpenMP context, 0
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
676 if it does not and -1 if it is unknown and need to be determined later.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
677 Some properties can be checked right away during parsing (this routine),
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
678 others need to wait until the whole TU is parsed, others need to wait until
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
679 IPA, others until vectorization. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
680
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
681 int
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
682 omp_context_selector_matches (tree ctx)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
683 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
684 int ret = 1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
685 for (tree t1 = ctx; t1; t1 = TREE_CHAIN (t1))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
686 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
687 char set = IDENTIFIER_POINTER (TREE_PURPOSE (t1))[0];
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
688 if (set == 'c')
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
689 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
690 /* For now, ignore the construct set. While something can be
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
691 determined already during parsing, we don't know until end of TU
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
692 whether additional constructs aren't added through declare variant
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
693 unless "omp declare variant variant" attribute exists already
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
694 (so in most of the cases), and we'd need to maintain set of
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
695 surrounding OpenMP constructs, which is better handled during
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
696 gimplification. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
697 if (symtab->state == PARSING
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
698 || (cfun->curr_properties & PROP_gimple_any) != 0)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
699 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
700 ret = -1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
701 continue;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
702 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
703
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
704 enum tree_code constructs[5];
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
705 int nconstructs
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
706 = omp_constructor_traits_to_codes (TREE_VALUE (t1), constructs);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
707 int r = omp_construct_selector_matches (constructs, nconstructs,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
708 NULL);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
709 if (r == 0)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
710 return 0;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
711 if (r == -1)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
712 ret = -1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
713 continue;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
714 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
715 for (tree t2 = TREE_VALUE (t1); t2; t2 = TREE_CHAIN (t2))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
716 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
717 const char *sel = IDENTIFIER_POINTER (TREE_PURPOSE (t2));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
718 switch (*sel)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
719 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
720 case 'v':
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
721 if (set == 'i' && !strcmp (sel, "vendor"))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
722 for (tree t3 = TREE_VALUE (t2); t3; t3 = TREE_CHAIN (t3))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
723 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
724 const char *prop = omp_context_name_list_prop (t3);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
725 if (prop == NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
726 return 0;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
727 if ((!strcmp (prop, " score") && TREE_PURPOSE (t3))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
728 || !strcmp (prop, "gnu"))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
729 continue;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
730 return 0;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
731 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
732 break;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
733 case 'e':
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
734 if (set == 'i' && !strcmp (sel, "extension"))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
735 /* We don't support any extensions right now. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
736 return 0;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
737 break;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
738 case 'a':
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
739 if (set == 'i' && !strcmp (sel, "atomic_default_mem_order"))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
740 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
741 enum omp_memory_order omo
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
742 = ((enum omp_memory_order)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
743 (omp_requires_mask
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
744 & OMP_REQUIRES_ATOMIC_DEFAULT_MEM_ORDER));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
745 if (omo == OMP_MEMORY_ORDER_UNSPECIFIED)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
746 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
747 /* We don't know yet, until end of TU. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
748 if (symtab->state == PARSING)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
749 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
750 ret = -1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
751 break;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
752 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
753 else
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
754 omo = OMP_MEMORY_ORDER_RELAXED;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
755 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
756 tree t3 = TREE_VALUE (t2);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
757 const char *prop = IDENTIFIER_POINTER (TREE_PURPOSE (t3));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
758 if (!strcmp (prop, " score"))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
759 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
760 t3 = TREE_CHAIN (t3);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
761 prop = IDENTIFIER_POINTER (TREE_PURPOSE (t3));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
762 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
763 if (!strcmp (prop, "relaxed")
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
764 && omo != OMP_MEMORY_ORDER_RELAXED)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
765 return 0;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
766 else if (!strcmp (prop, "seq_cst")
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
767 && omo != OMP_MEMORY_ORDER_SEQ_CST)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
768 return 0;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
769 else if (!strcmp (prop, "acq_rel")
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
770 && omo != OMP_MEMORY_ORDER_ACQ_REL)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
771 return 0;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
772 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
773 if (set == 'd' && !strcmp (sel, "arch"))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
774 for (tree t3 = TREE_VALUE (t2); t3; t3 = TREE_CHAIN (t3))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
775 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
776 const char *arch = omp_context_name_list_prop (t3);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
777 if (arch == NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
778 return 0;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
779 int r = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
780 if (targetm.omp.device_kind_arch_isa != NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
781 r = targetm.omp.device_kind_arch_isa (omp_device_arch,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
782 arch);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
783 if (r == 0 || (r == -1 && symtab->state != PARSING))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
784 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
785 /* If we are or might be in a target region or
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
786 declare target function, need to take into account
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
787 also offloading values. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
788 if (!omp_maybe_offloaded ())
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
789 return 0;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
790 if (strcmp (arch, "hsa") == 0
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
791 && hsa_gen_requested_p ())
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
792 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
793 ret = -1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
794 continue;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
795 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
796 if (ENABLE_OFFLOADING)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
797 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
798 const char *arches = omp_offload_device_arch;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
799 if (omp_offload_device_kind_arch_isa (arches,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
800 arch))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
801 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
802 ret = -1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
803 continue;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
804 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
805 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
806 return 0;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
807 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
808 else if (r == -1)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
809 ret = -1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
810 /* If arch matches on the host, it still might not match
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
811 in the offloading region. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
812 else if (omp_maybe_offloaded ())
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
813 ret = -1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
814 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
815 break;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
816 case 'u':
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
817 if (set == 'i' && !strcmp (sel, "unified_address"))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
818 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
819 if ((omp_requires_mask & OMP_REQUIRES_UNIFIED_ADDRESS) == 0)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
820 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
821 if (symtab->state == PARSING)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
822 ret = -1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
823 else
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
824 return 0;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
825 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
826 break;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
827 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
828 if (set == 'i' && !strcmp (sel, "unified_shared_memory"))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
829 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
830 if ((omp_requires_mask
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
831 & OMP_REQUIRES_UNIFIED_SHARED_MEMORY) == 0)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
832 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
833 if (symtab->state == PARSING)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
834 ret = -1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
835 else
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
836 return 0;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
837 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
838 break;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
839 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
840 break;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
841 case 'd':
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
842 if (set == 'i' && !strcmp (sel, "dynamic_allocators"))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
843 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
844 if ((omp_requires_mask
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
845 & OMP_REQUIRES_DYNAMIC_ALLOCATORS) == 0)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
846 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
847 if (symtab->state == PARSING)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
848 ret = -1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
849 else
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
850 return 0;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
851 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
852 break;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
853 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
854 break;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
855 case 'r':
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
856 if (set == 'i' && !strcmp (sel, "reverse_offload"))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
857 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
858 if ((omp_requires_mask & OMP_REQUIRES_REVERSE_OFFLOAD) == 0)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
859 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
860 if (symtab->state == PARSING)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
861 ret = -1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
862 else
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
863 return 0;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
864 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
865 break;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
866 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
867 break;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
868 case 'k':
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
869 if (set == 'd' && !strcmp (sel, "kind"))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
870 for (tree t3 = TREE_VALUE (t2); t3; t3 = TREE_CHAIN (t3))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
871 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
872 const char *prop = omp_context_name_list_prop (t3);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
873 if (prop == NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
874 return 0;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
875 if (!strcmp (prop, "any"))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
876 continue;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
877 if (!strcmp (prop, "host"))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
878 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
879 if (omp_maybe_offloaded ())
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
880 ret = -1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
881 continue;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
882 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
883 if (!strcmp (prop, "nohost"))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
884 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
885 if (omp_maybe_offloaded ())
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
886 ret = -1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
887 else
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
888 return 0;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
889 continue;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
890 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
891 int r = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
892 if (targetm.omp.device_kind_arch_isa != NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
893 r = targetm.omp.device_kind_arch_isa (omp_device_kind,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
894 prop);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
895 else
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
896 r = strcmp (prop, "cpu") == 0;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
897 if (r == 0 || (r == -1 && symtab->state != PARSING))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
898 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
899 /* If we are or might be in a target region or
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
900 declare target function, need to take into account
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
901 also offloading values. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
902 if (!omp_maybe_offloaded ())
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
903 return 0;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
904 if (strcmp (prop, "gpu") == 0
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
905 && hsa_gen_requested_p ())
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
906 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
907 ret = -1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
908 continue;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
909 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
910 if (ENABLE_OFFLOADING)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
911 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
912 const char *kinds = omp_offload_device_kind;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
913 if (omp_offload_device_kind_arch_isa (kinds, prop))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
914 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
915 ret = -1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
916 continue;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
917 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
918 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
919 return 0;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
920 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
921 else if (r == -1)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
922 ret = -1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
923 /* If kind matches on the host, it still might not match
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
924 in the offloading region. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
925 else if (omp_maybe_offloaded ())
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
926 ret = -1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
927 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
928 break;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
929 case 'i':
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
930 if (set == 'd' && !strcmp (sel, "isa"))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
931 for (tree t3 = TREE_VALUE (t2); t3; t3 = TREE_CHAIN (t3))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
932 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
933 const char *isa = omp_context_name_list_prop (t3);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
934 if (isa == NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
935 return 0;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
936 int r = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
937 if (targetm.omp.device_kind_arch_isa != NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
938 r = targetm.omp.device_kind_arch_isa (omp_device_isa,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
939 isa);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
940 if (r == 0 || (r == -1 && symtab->state != PARSING))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
941 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
942 /* If isa is valid on the target, but not in the
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
943 current function and current function has
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
944 #pragma omp declare simd on it, some simd clones
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
945 might have the isa added later on. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
946 if (r == -1
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
947 && targetm.simd_clone.compute_vecsize_and_simdlen)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
948 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
949 tree attrs
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
950 = DECL_ATTRIBUTES (current_function_decl);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
951 if (lookup_attribute ("omp declare simd", attrs))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
952 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
953 ret = -1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
954 continue;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
955 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
956 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
957 /* If we are or might be in a target region or
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
958 declare target function, need to take into account
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
959 also offloading values. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
960 if (!omp_maybe_offloaded ())
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
961 return 0;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
962 if (ENABLE_OFFLOADING)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
963 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
964 const char *isas = omp_offload_device_isa;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
965 if (omp_offload_device_kind_arch_isa (isas, isa))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
966 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
967 ret = -1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
968 continue;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
969 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
970 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
971 return 0;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
972 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
973 else if (r == -1)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
974 ret = -1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
975 /* If isa matches on the host, it still might not match
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
976 in the offloading region. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
977 else if (omp_maybe_offloaded ())
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
978 ret = -1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
979 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
980 break;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
981 case 'c':
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
982 if (set == 'u' && !strcmp (sel, "condition"))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
983 for (tree t3 = TREE_VALUE (t2); t3; t3 = TREE_CHAIN (t3))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
984 if (TREE_PURPOSE (t3) == NULL_TREE)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
985 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
986 if (integer_zerop (TREE_VALUE (t3)))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
987 return 0;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
988 if (integer_nonzerop (TREE_VALUE (t3)))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
989 break;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
990 ret = -1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
991 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
992 break;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
993 default:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
994 break;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
995 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
996 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
997 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
998 return ret;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
999 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1000
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1001 /* Compare construct={simd} CLAUSES1 with CLAUSES2, return 0/-1/1/2 as
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1002 in omp_context_selector_set_compare. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1003
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1004 static int
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1005 omp_construct_simd_compare (tree clauses1, tree clauses2)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1006 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1007 if (clauses1 == NULL_TREE)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1008 return clauses2 == NULL_TREE ? 0 : -1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1009 if (clauses2 == NULL_TREE)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1010 return 1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1011
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1012 int r = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1013 struct declare_variant_simd_data {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1014 bool inbranch, notinbranch;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1015 tree simdlen;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1016 auto_vec<tree,16> data_sharing;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1017 auto_vec<tree,16> aligned;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1018 declare_variant_simd_data ()
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1019 : inbranch(false), notinbranch(false), simdlen(NULL_TREE) {}
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1020 } data[2];
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1021 unsigned int i;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1022 for (i = 0; i < 2; i++)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1023 for (tree c = i ? clauses2 : clauses1; c; c = OMP_CLAUSE_CHAIN (c))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1024 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1025 vec<tree> *v;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1026 switch (OMP_CLAUSE_CODE (c))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1027 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1028 case OMP_CLAUSE_INBRANCH:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1029 data[i].inbranch = true;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1030 continue;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1031 case OMP_CLAUSE_NOTINBRANCH:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1032 data[i].notinbranch = true;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1033 continue;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1034 case OMP_CLAUSE_SIMDLEN:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1035 data[i].simdlen = OMP_CLAUSE_SIMDLEN_EXPR (c);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1036 continue;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1037 case OMP_CLAUSE_UNIFORM:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1038 case OMP_CLAUSE_LINEAR:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1039 v = &data[i].data_sharing;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1040 break;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1041 case OMP_CLAUSE_ALIGNED:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1042 v = &data[i].aligned;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1043 break;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1044 default:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1045 gcc_unreachable ();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1046 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1047 unsigned HOST_WIDE_INT argno = tree_to_uhwi (OMP_CLAUSE_DECL (c));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1048 if (argno >= v->length ())
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1049 v->safe_grow_cleared (argno + 1);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1050 (*v)[argno] = c;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1051 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1052 /* Here, r is used as a bitmask, 2 is set if CLAUSES1 has something
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1053 CLAUSES2 doesn't, 1 is set if CLAUSES2 has something CLAUSES1
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1054 doesn't. Thus, r == 3 implies return value 2, r == 1 implies
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1055 -1, r == 2 implies 1 and r == 0 implies 0. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1056 if (data[0].inbranch != data[1].inbranch)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1057 r |= data[0].inbranch ? 2 : 1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1058 if (data[0].notinbranch != data[1].notinbranch)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1059 r |= data[0].notinbranch ? 2 : 1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1060 if (!simple_cst_equal (data[0].simdlen, data[1].simdlen))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1061 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1062 if (data[0].simdlen && data[1].simdlen)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1063 return 2;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1064 r |= data[0].simdlen ? 2 : 1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1065 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1066 if (data[0].data_sharing.length () < data[1].data_sharing.length ()
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1067 || data[0].aligned.length () < data[1].aligned.length ())
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1068 r |= 1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1069 tree c1, c2;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1070 FOR_EACH_VEC_ELT (data[0].data_sharing, i, c1)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1071 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1072 c2 = (i < data[1].data_sharing.length ()
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1073 ? data[1].data_sharing[i] : NULL_TREE);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1074 if ((c1 == NULL_TREE) != (c2 == NULL_TREE))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1075 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1076 r |= c1 != NULL_TREE ? 2 : 1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1077 continue;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1078 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1079 if (c1 == NULL_TREE)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1080 continue;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1081 if (OMP_CLAUSE_CODE (c1) != OMP_CLAUSE_CODE (c2))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1082 return 2;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1083 if (OMP_CLAUSE_CODE (c1) != OMP_CLAUSE_LINEAR)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1084 continue;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1085 if (OMP_CLAUSE_LINEAR_VARIABLE_STRIDE (c1)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1086 != OMP_CLAUSE_LINEAR_VARIABLE_STRIDE (c2))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1087 return 2;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1088 if (OMP_CLAUSE_LINEAR_KIND (c1) != OMP_CLAUSE_LINEAR_KIND (c2))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1089 return 2;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1090 if (!simple_cst_equal (OMP_CLAUSE_LINEAR_STEP (c1),
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1091 OMP_CLAUSE_LINEAR_STEP (c2)))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1092 return 2;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1093 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1094 FOR_EACH_VEC_ELT (data[0].aligned, i, c1)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1095 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1096 c2 = i < data[1].aligned.length () ? data[1].aligned[i] : NULL_TREE;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1097 if ((c1 == NULL_TREE) != (c2 == NULL_TREE))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1098 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1099 r |= c1 != NULL_TREE ? 2 : 1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1100 continue;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1101 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1102 if (c1 == NULL_TREE)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1103 continue;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1104 if (!simple_cst_equal (OMP_CLAUSE_ALIGNED_ALIGNMENT (c1),
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1105 OMP_CLAUSE_ALIGNED_ALIGNMENT (c2)))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1106 return 2;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1107 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1108 switch (r)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1109 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1110 case 0: return 0;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1111 case 1: return -1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1112 case 2: return 1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1113 case 3: return 2;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1114 default: gcc_unreachable ();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1115 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1116 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1117
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1118 /* Compare properties of selectors SEL from SET other than construct.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1119 Return 0/-1/1/2 as in omp_context_selector_set_compare.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1120 Unlike set names or selector names, properties can have duplicates. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1121
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1122 static int
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1123 omp_context_selector_props_compare (const char *set, const char *sel,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1124 tree ctx1, tree ctx2)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1125 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1126 int ret = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1127 for (int pass = 0; pass < 2; pass++)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1128 for (tree t1 = pass ? ctx2 : ctx1; t1; t1 = TREE_CHAIN (t1))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1129 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1130 tree t2;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1131 for (t2 = pass ? ctx1 : ctx2; t2; t2 = TREE_CHAIN (t2))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1132 if (TREE_PURPOSE (t1) == TREE_PURPOSE (t2))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1133 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1134 if (TREE_PURPOSE (t1) == NULL_TREE)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1135 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1136 if (set[0] == 'u' && strcmp (sel, "condition") == 0)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1137 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1138 if (integer_zerop (TREE_VALUE (t1))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1139 != integer_zerop (TREE_VALUE (t2)))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1140 return 2;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1141 break;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1142 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1143 if (simple_cst_equal (TREE_VALUE (t1), TREE_VALUE (t2)))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1144 break;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1145 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1146 else if (strcmp (IDENTIFIER_POINTER (TREE_PURPOSE (t1)),
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1147 " score") == 0)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1148 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1149 if (!simple_cst_equal (TREE_VALUE (t1), TREE_VALUE (t2)))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1150 return 2;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1151 break;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1152 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1153 else
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1154 break;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1155 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1156 else if (TREE_PURPOSE (t1)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1157 && TREE_PURPOSE (t2) == NULL_TREE
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1158 && TREE_CODE (TREE_VALUE (t2)) == STRING_CST)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1159 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1160 const char *p1 = omp_context_name_list_prop (t1);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1161 const char *p2 = omp_context_name_list_prop (t2);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1162 if (p2
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1163 && strcmp (p1, p2) == 0
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1164 && strcmp (p1, " score"))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1165 break;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1166 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1167 else if (TREE_PURPOSE (t1) == NULL_TREE
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1168 && TREE_PURPOSE (t2)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1169 && TREE_CODE (TREE_VALUE (t1)) == STRING_CST)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1170 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1171 const char *p1 = omp_context_name_list_prop (t1);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1172 const char *p2 = omp_context_name_list_prop (t2);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1173 if (p1
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1174 && strcmp (p1, p2) == 0
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1175 && strcmp (p1, " score"))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1176 break;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1177 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1178 if (t2 == NULL_TREE)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1179 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1180 int r = pass ? -1 : 1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1181 if (ret && ret != r)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1182 return 2;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1183 else if (pass)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1184 return r;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1185 else
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1186 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1187 ret = r;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1188 break;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1189 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1190 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1191 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1192 return ret;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1193 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1194
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1195 /* Compare single context selector sets CTX1 and CTX2 with SET name.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1196 Return 0 if CTX1 is equal to CTX2,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1197 -1 if CTX1 is a strict subset of CTX2,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1198 1 if CTX2 is a strict subset of CTX1, or
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1199 2 if neither context is a subset of another one. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1200
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1201 int
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1202 omp_context_selector_set_compare (const char *set, tree ctx1, tree ctx2)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1203 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1204 bool swapped = false;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1205 int ret = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1206 int len1 = list_length (ctx1);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1207 int len2 = list_length (ctx2);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1208 int cnt = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1209 if (len1 < len2)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1210 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1211 swapped = true;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1212 std::swap (ctx1, ctx2);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1213 std::swap (len1, len2);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1214 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1215 if (set[0] == 'c')
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1216 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1217 tree t1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1218 tree t2 = ctx2;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1219 tree simd = get_identifier ("simd");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1220 /* Handle construct set specially. In this case the order
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1221 of the selector matters too. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1222 for (t1 = ctx1; t1; t1 = TREE_CHAIN (t1))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1223 if (TREE_PURPOSE (t1) == TREE_PURPOSE (t2))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1224 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1225 int r = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1226 if (TREE_PURPOSE (t1) == simd)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1227 r = omp_construct_simd_compare (TREE_VALUE (t1),
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1228 TREE_VALUE (t2));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1229 if (r == 2 || (ret && r && (ret < 0) != (r < 0)))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1230 return 2;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1231 if (ret == 0)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1232 ret = r;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1233 t2 = TREE_CHAIN (t2);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1234 if (t2 == NULL_TREE)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1235 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1236 t1 = TREE_CHAIN (t1);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1237 break;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1238 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1239 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1240 else if (ret < 0)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1241 return 2;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1242 else
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1243 ret = 1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1244 if (t2 != NULL_TREE)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1245 return 2;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1246 if (t1 != NULL_TREE)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1247 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1248 if (ret < 0)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1249 return 2;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1250 ret = 1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1251 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1252 if (ret == 0)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1253 return 0;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1254 return swapped ? -ret : ret;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1255 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1256 for (tree t1 = ctx1; t1; t1 = TREE_CHAIN (t1))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1257 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1258 tree t2;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1259 for (t2 = ctx2; t2; t2 = TREE_CHAIN (t2))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1260 if (TREE_PURPOSE (t1) == TREE_PURPOSE (t2))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1261 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1262 const char *sel = IDENTIFIER_POINTER (TREE_PURPOSE (t1));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1263 int r = omp_context_selector_props_compare (set, sel,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1264 TREE_VALUE (t1),
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1265 TREE_VALUE (t2));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1266 if (r == 2 || (ret && r && (ret < 0) != (r < 0)))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1267 return 2;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1268 if (ret == 0)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1269 ret = r;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1270 cnt++;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1271 break;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1272 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1273 if (t2 == NULL_TREE)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1274 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1275 if (ret == -1)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1276 return 2;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1277 ret = 1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1278 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1279 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1280 if (cnt < len2)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1281 return 2;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1282 if (ret == 0)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1283 return 0;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1284 return swapped ? -ret : ret;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1285 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1286
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1287 /* Compare whole context selector specification CTX1 and CTX2.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1288 Return 0 if CTX1 is equal to CTX2,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1289 -1 if CTX1 is a strict subset of CTX2,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1290 1 if CTX2 is a strict subset of CTX1, or
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1291 2 if neither context is a subset of another one. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1292
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1293 static int
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1294 omp_context_selector_compare (tree ctx1, tree ctx2)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1295 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1296 bool swapped = false;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1297 int ret = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1298 int len1 = list_length (ctx1);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1299 int len2 = list_length (ctx2);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1300 int cnt = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1301 if (len1 < len2)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1302 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1303 swapped = true;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1304 std::swap (ctx1, ctx2);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1305 std::swap (len1, len2);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1306 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1307 for (tree t1 = ctx1; t1; t1 = TREE_CHAIN (t1))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1308 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1309 tree t2;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1310 for (t2 = ctx2; t2; t2 = TREE_CHAIN (t2))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1311 if (TREE_PURPOSE (t1) == TREE_PURPOSE (t2))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1312 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1313 const char *set = IDENTIFIER_POINTER (TREE_PURPOSE (t1));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1314 int r = omp_context_selector_set_compare (set, TREE_VALUE (t1),
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1315 TREE_VALUE (t2));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1316 if (r == 2 || (ret && r && (ret < 0) != (r < 0)))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1317 return 2;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1318 if (ret == 0)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1319 ret = r;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1320 cnt++;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1321 break;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1322 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1323 if (t2 == NULL_TREE)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1324 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1325 if (ret == -1)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1326 return 2;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1327 ret = 1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1328 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1329 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1330 if (cnt < len2)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1331 return 2;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1332 if (ret == 0)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1333 return 0;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1334 return swapped ? -ret : ret;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1335 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1336
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1337 /* From context selector CTX, return trait-selector with name SEL in
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1338 trait-selector-set with name SET if any, or NULL_TREE if not found.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1339 If SEL is NULL, return the list of trait-selectors in SET. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1340
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1341 tree
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1342 omp_get_context_selector (tree ctx, const char *set, const char *sel)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1343 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1344 tree setid = get_identifier (set);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1345 tree selid = sel ? get_identifier (sel) : NULL_TREE;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1346 for (tree t1 = ctx; t1; t1 = TREE_CHAIN (t1))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1347 if (TREE_PURPOSE (t1) == setid)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1348 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1349 if (sel == NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1350 return TREE_VALUE (t1);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1351 for (tree t2 = TREE_VALUE (t1); t2; t2 = TREE_CHAIN (t2))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1352 if (TREE_PURPOSE (t2) == selid)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1353 return t2;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1354 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1355 return NULL_TREE;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1356 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1357
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1358 /* Compute *SCORE for context selector CTX. Return true if the score
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1359 would be different depending on whether it is a declare simd clone or
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1360 not. DECLARE_SIMD should be true for the case when it would be
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1361 a declare simd clone. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1362
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1363 static bool
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1364 omp_context_compute_score (tree ctx, widest_int *score, bool declare_simd)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1365 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1366 tree construct = omp_get_context_selector (ctx, "construct", NULL);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1367 bool has_kind = omp_get_context_selector (ctx, "device", "kind");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1368 bool has_arch = omp_get_context_selector (ctx, "device", "arch");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1369 bool has_isa = omp_get_context_selector (ctx, "device", "isa");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1370 bool ret = false;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1371 *score = 1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1372 for (tree t1 = ctx; t1; t1 = TREE_CHAIN (t1))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1373 if (TREE_VALUE (t1) != construct)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1374 for (tree t2 = TREE_VALUE (t1); t2; t2 = TREE_CHAIN (t2))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1375 if (tree t3 = TREE_VALUE (t2))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1376 if (TREE_PURPOSE (t3)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1377 && strcmp (IDENTIFIER_POINTER (TREE_PURPOSE (t3)), " score") == 0
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1378 && TREE_CODE (TREE_VALUE (t3)) == INTEGER_CST)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1379 *score += wi::to_widest (TREE_VALUE (t3));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1380 if (construct || has_kind || has_arch || has_isa)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1381 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1382 int scores[12];
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1383 enum tree_code constructs[5];
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1384 int nconstructs = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1385 if (construct)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1386 nconstructs = omp_constructor_traits_to_codes (construct, constructs);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1387 if (omp_construct_selector_matches (constructs, nconstructs, scores)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1388 == 2)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1389 ret = true;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1390 int b = declare_simd ? nconstructs + 1 : 0;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1391 if (scores[b + nconstructs] + 4U < score->get_precision ())
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1392 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1393 for (int n = 0; n < nconstructs; ++n)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1394 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1395 if (scores[b + n] < 0)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1396 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1397 *score = -1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1398 return ret;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1399 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1400 *score += wi::shifted_mask <widest_int> (scores[b + n], 1, false);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1401 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1402 if (has_kind)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1403 *score += wi::shifted_mask <widest_int> (scores[b + nconstructs],
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1404 1, false);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1405 if (has_arch)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1406 *score += wi::shifted_mask <widest_int> (scores[b + nconstructs] + 1,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1407 1, false);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1408 if (has_isa)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1409 *score += wi::shifted_mask <widest_int> (scores[b + nconstructs] + 2,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1410 1, false);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1411 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1412 else /* FIXME: Implement this. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1413 gcc_unreachable ();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1414 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1415 return ret;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1416 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1417
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1418 /* Try to resolve declare variant, return the variant decl if it should
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1419 be used instead of base, or base otherwise. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1420
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1421 tree
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1422 omp_resolve_declare_variant (tree base)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1423 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1424 tree variant1 = NULL_TREE, variant2 = NULL_TREE;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1425 auto_vec <tree, 16> variants;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1426 auto_vec <bool, 16> defer;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1427 bool any_deferred = false;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1428 for (tree attr = DECL_ATTRIBUTES (base); attr; attr = TREE_CHAIN (attr))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1429 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1430 attr = lookup_attribute ("omp declare variant base", attr);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1431 if (attr == NULL_TREE)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1432 break;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1433 if (TREE_CODE (TREE_PURPOSE (TREE_VALUE (attr))) != FUNCTION_DECL)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1434 continue;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1435 switch (omp_context_selector_matches (TREE_VALUE (TREE_VALUE (attr))))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1436 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1437 case 0:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1438 /* No match, ignore. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1439 break;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1440 case -1:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1441 /* Needs to be deferred. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1442 any_deferred = true;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1443 variants.safe_push (attr);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1444 defer.safe_push (true);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1445 break;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1446 default:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1447 variants.safe_push (attr);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1448 defer.safe_push (false);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1449 break;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1450 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1451 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1452 if (variants.length () == 0)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1453 return base;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1454
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1455 if (any_deferred)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1456 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1457 widest_int max_score1 = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1458 widest_int max_score2 = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1459 bool first = true;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1460 unsigned int i;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1461 tree attr1, attr2;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1462 FOR_EACH_VEC_ELT (variants, i, attr1)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1463 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1464 widest_int score1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1465 widest_int score2;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1466 bool need_two;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1467 tree ctx = TREE_VALUE (TREE_VALUE (attr1));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1468 need_two = omp_context_compute_score (ctx, &score1, false);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1469 if (need_two)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1470 omp_context_compute_score (ctx, &score2, true);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1471 else
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1472 score2 = score1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1473 if (first)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1474 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1475 first = false;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1476 max_score1 = score1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1477 max_score2 = score2;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1478 if (!defer[i])
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1479 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1480 variant1 = attr1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1481 variant2 = attr1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1482 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1483 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1484 else
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1485 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1486 if (max_score1 == score1)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1487 variant1 = NULL_TREE;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1488 else if (score1 > max_score1)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1489 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1490 max_score1 = score1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1491 variant1 = defer[i] ? NULL_TREE : attr1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1492 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1493 if (max_score2 == score2)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1494 variant2 = NULL_TREE;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1495 else if (score2 > max_score2)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1496 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1497 max_score2 = score2;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1498 variant2 = defer[i] ? NULL_TREE : attr1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1499 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1500 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1501 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1502
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1503 /* If there is a clear winner variant with the score which is not
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1504 deferred, verify it is not a strict subset of any other context
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1505 selector and if it is not, it is the best alternative no matter
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1506 whether the others do or don't match. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1507 if (variant1 && variant1 == variant2)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1508 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1509 tree ctx1 = TREE_VALUE (TREE_VALUE (variant1));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1510 FOR_EACH_VEC_ELT (variants, i, attr2)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1511 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1512 if (attr2 == variant1)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1513 continue;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1514 tree ctx2 = TREE_VALUE (TREE_VALUE (attr2));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1515 int r = omp_context_selector_compare (ctx1, ctx2);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1516 if (r == -1)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1517 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1518 /* The winner is a strict subset of ctx2, can't
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1519 decide now. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1520 variant1 = NULL_TREE;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1521 break;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1522 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1523 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1524 if (variant1)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1525 return TREE_PURPOSE (TREE_VALUE (variant1));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1526 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1527
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1528 return base;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1529 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1530
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1531 if (variants.length () == 1)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1532 return TREE_PURPOSE (TREE_VALUE (variants[0]));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1533
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1534 /* A context selector that is a strict subset of another context selector has a score
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1535 of zero. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1536 tree attr1, attr2;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1537 unsigned int i, j;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1538 FOR_EACH_VEC_ELT (variants, i, attr1)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1539 if (attr1)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1540 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1541 tree ctx1 = TREE_VALUE (TREE_VALUE (attr1));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1542 FOR_EACH_VEC_ELT_FROM (variants, j, attr2, i + 1)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1543 if (attr2)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1544 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1545 tree ctx2 = TREE_VALUE (TREE_VALUE (attr2));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1546 int r = omp_context_selector_compare (ctx1, ctx2);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1547 if (r == -1)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1548 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1549 /* ctx1 is a strict subset of ctx2, remove
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1550 attr1 from the vector. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1551 variants[i] = NULL_TREE;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1552 break;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1553 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1554 else if (r == 1)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1555 /* ctx2 is a strict subset of ctx1, remove attr2
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1556 from the vector. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1557 variants[j] = NULL_TREE;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1558 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1559 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1560 widest_int max_score1 = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1561 widest_int max_score2 = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1562 bool first = true;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1563 FOR_EACH_VEC_ELT (variants, i, attr1)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1564 if (attr1)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1565 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1566 if (variant1)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1567 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1568 widest_int score1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1569 widest_int score2;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1570 bool need_two;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1571 tree ctx;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1572 if (first)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1573 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1574 first = false;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1575 ctx = TREE_VALUE (TREE_VALUE (variant1));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1576 need_two = omp_context_compute_score (ctx, &max_score1, false);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1577 if (need_two)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1578 omp_context_compute_score (ctx, &max_score2, true);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1579 else
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1580 max_score2 = max_score1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1581 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1582 ctx = TREE_VALUE (TREE_VALUE (attr1));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1583 need_two = omp_context_compute_score (ctx, &score1, false);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1584 if (need_two)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1585 omp_context_compute_score (ctx, &score2, true);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1586 else
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1587 score2 = score1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1588 if (score1 > max_score1)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1589 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1590 max_score1 = score1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1591 variant1 = attr1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1592 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1593 if (score2 > max_score2)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1594 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1595 max_score2 = score2;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1596 variant2 = attr1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1597 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1598 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1599 else
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1600 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1601 variant1 = attr1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1602 variant2 = attr1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1603 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1604 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1605 /* If there is a disagreement on which variant has the highest score
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1606 depending on whether it will be in a declare simd clone or not,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1607 punt for now and defer until after IPA where we will know that. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1608 return ((variant1 && variant1 == variant2)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1609 ? TREE_PURPOSE (TREE_VALUE (variant1)) : base);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1610 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1611
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1612
111
kono
parents:
diff changeset
1613 /* Encode an oacc launch argument. This matches the GOMP_LAUNCH_PACK
kono
parents:
diff changeset
1614 macro on gomp-constants.h. We do not check for overflow. */
kono
parents:
diff changeset
1615
kono
parents:
diff changeset
1616 tree
kono
parents:
diff changeset
1617 oacc_launch_pack (unsigned code, tree device, unsigned op)
kono
parents:
diff changeset
1618 {
kono
parents:
diff changeset
1619 tree res;
kono
parents:
diff changeset
1620
kono
parents:
diff changeset
1621 res = build_int_cst (unsigned_type_node, GOMP_LAUNCH_PACK (code, 0, op));
kono
parents:
diff changeset
1622 if (device)
kono
parents:
diff changeset
1623 {
kono
parents:
diff changeset
1624 device = fold_build2 (LSHIFT_EXPR, unsigned_type_node,
kono
parents:
diff changeset
1625 device, build_int_cst (unsigned_type_node,
kono
parents:
diff changeset
1626 GOMP_LAUNCH_DEVICE_SHIFT));
kono
parents:
diff changeset
1627 res = fold_build2 (BIT_IOR_EXPR, unsigned_type_node, res, device);
kono
parents:
diff changeset
1628 }
kono
parents:
diff changeset
1629 return res;
kono
parents:
diff changeset
1630 }
kono
parents:
diff changeset
1631
kono
parents:
diff changeset
1632 /* FIXME: What is the following comment for? */
kono
parents:
diff changeset
1633 /* Look for compute grid dimension clauses and convert to an attribute
kono
parents:
diff changeset
1634 attached to FN. This permits the target-side code to (a) massage
kono
parents:
diff changeset
1635 the dimensions, (b) emit that data and (c) optimize. Non-constant
kono
parents:
diff changeset
1636 dimensions are pushed onto ARGS.
kono
parents:
diff changeset
1637
kono
parents:
diff changeset
1638 The attribute value is a TREE_LIST. A set of dimensions is
kono
parents:
diff changeset
1639 represented as a list of INTEGER_CST. Those that are runtime
kono
parents:
diff changeset
1640 exprs are represented as an INTEGER_CST of zero.
kono
parents:
diff changeset
1641
kono
parents:
diff changeset
1642 TODO: Normally the attribute will just contain a single such list. If
kono
parents:
diff changeset
1643 however it contains a list of lists, this will represent the use of
kono
parents:
diff changeset
1644 device_type. Each member of the outer list is an assoc list of
kono
parents:
diff changeset
1645 dimensions, keyed by the device type. The first entry will be the
kono
parents:
diff changeset
1646 default. Well, that's the plan. */
kono
parents:
diff changeset
1647
kono
parents:
diff changeset
1648 /* Replace any existing oacc fn attribute with updated dimensions. */
kono
parents:
diff changeset
1649
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1650 /* Variant working on a list of attributes. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1651
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1652 tree
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1653 oacc_replace_fn_attrib_attr (tree attribs, tree dims)
111
kono
parents:
diff changeset
1654 {
kono
parents:
diff changeset
1655 tree ident = get_identifier (OACC_FN_ATTRIB);
kono
parents:
diff changeset
1656
kono
parents:
diff changeset
1657 /* If we happen to be present as the first attrib, drop it. */
kono
parents:
diff changeset
1658 if (attribs && TREE_PURPOSE (attribs) == ident)
kono
parents:
diff changeset
1659 attribs = TREE_CHAIN (attribs);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1660 return tree_cons (ident, dims, attribs);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1661 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1662
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1663 /* Variant working on a function decl. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1664
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1665 void
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1666 oacc_replace_fn_attrib (tree fn, tree dims)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1667 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1668 DECL_ATTRIBUTES (fn)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1669 = oacc_replace_fn_attrib_attr (DECL_ATTRIBUTES (fn), dims);
111
kono
parents:
diff changeset
1670 }
kono
parents:
diff changeset
1671
kono
parents:
diff changeset
1672 /* Scan CLAUSES for launch dimensions and attach them to the oacc
kono
parents:
diff changeset
1673 function attribute. Push any that are non-constant onto the ARGS
kono
parents:
diff changeset
1674 list, along with an appropriate GOMP_LAUNCH_DIM tag. */
kono
parents:
diff changeset
1675
kono
parents:
diff changeset
1676 void
kono
parents:
diff changeset
1677 oacc_set_fn_attrib (tree fn, tree clauses, vec<tree> *args)
kono
parents:
diff changeset
1678 {
kono
parents:
diff changeset
1679 /* Must match GOMP_DIM ordering. */
kono
parents:
diff changeset
1680 static const omp_clause_code ids[]
kono
parents:
diff changeset
1681 = { OMP_CLAUSE_NUM_GANGS, OMP_CLAUSE_NUM_WORKERS,
kono
parents:
diff changeset
1682 OMP_CLAUSE_VECTOR_LENGTH };
kono
parents:
diff changeset
1683 unsigned ix;
kono
parents:
diff changeset
1684 tree dims[GOMP_DIM_MAX];
kono
parents:
diff changeset
1685
kono
parents:
diff changeset
1686 tree attr = NULL_TREE;
kono
parents:
diff changeset
1687 unsigned non_const = 0;
kono
parents:
diff changeset
1688
kono
parents:
diff changeset
1689 for (ix = GOMP_DIM_MAX; ix--;)
kono
parents:
diff changeset
1690 {
kono
parents:
diff changeset
1691 tree clause = omp_find_clause (clauses, ids[ix]);
kono
parents:
diff changeset
1692 tree dim = NULL_TREE;
kono
parents:
diff changeset
1693
kono
parents:
diff changeset
1694 if (clause)
kono
parents:
diff changeset
1695 dim = OMP_CLAUSE_EXPR (clause, ids[ix]);
kono
parents:
diff changeset
1696 dims[ix] = dim;
kono
parents:
diff changeset
1697 if (dim && TREE_CODE (dim) != INTEGER_CST)
kono
parents:
diff changeset
1698 {
kono
parents:
diff changeset
1699 dim = integer_zero_node;
kono
parents:
diff changeset
1700 non_const |= GOMP_DIM_MASK (ix);
kono
parents:
diff changeset
1701 }
kono
parents:
diff changeset
1702 attr = tree_cons (NULL_TREE, dim, attr);
kono
parents:
diff changeset
1703 }
kono
parents:
diff changeset
1704
kono
parents:
diff changeset
1705 oacc_replace_fn_attrib (fn, attr);
kono
parents:
diff changeset
1706
kono
parents:
diff changeset
1707 if (non_const)
kono
parents:
diff changeset
1708 {
kono
parents:
diff changeset
1709 /* Push a dynamic argument set. */
kono
parents:
diff changeset
1710 args->safe_push (oacc_launch_pack (GOMP_LAUNCH_DIM,
kono
parents:
diff changeset
1711 NULL_TREE, non_const));
kono
parents:
diff changeset
1712 for (unsigned ix = 0; ix != GOMP_DIM_MAX; ix++)
kono
parents:
diff changeset
1713 if (non_const & GOMP_DIM_MASK (ix))
kono
parents:
diff changeset
1714 args->safe_push (dims[ix]);
kono
parents:
diff changeset
1715 }
kono
parents:
diff changeset
1716 }
kono
parents:
diff changeset
1717
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1718 /* Verify OpenACC routine clauses.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1719
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1720 Returns 0 if FNDECL should be marked with an OpenACC 'routine' directive, 1
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1721 if it has already been marked in compatible way, and -1 if incompatible.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1722 Upon returning, the chain of clauses will contain exactly one clause
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1723 specifying the level of parallelism. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1724
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1725 int
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1726 oacc_verify_routine_clauses (tree fndecl, tree *clauses, location_t loc,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1727 const char *routine_str)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1728 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1729 tree c_level = NULL_TREE;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1730 tree c_p = NULL_TREE;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1731 for (tree c = *clauses; c; c_p = c, c = OMP_CLAUSE_CHAIN (c))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1732 switch (OMP_CLAUSE_CODE (c))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1733 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1734 case OMP_CLAUSE_GANG:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1735 case OMP_CLAUSE_WORKER:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1736 case OMP_CLAUSE_VECTOR:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1737 case OMP_CLAUSE_SEQ:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1738 if (c_level == NULL_TREE)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1739 c_level = c;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1740 else if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_CODE (c_level))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1741 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1742 /* This has already been diagnosed in the front ends. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1743 /* Drop the duplicate clause. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1744 gcc_checking_assert (c_p != NULL_TREE);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1745 OMP_CLAUSE_CHAIN (c_p) = OMP_CLAUSE_CHAIN (c);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1746 c = c_p;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1747 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1748 else
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1749 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1750 error_at (OMP_CLAUSE_LOCATION (c),
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1751 "%qs specifies a conflicting level of parallelism",
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1752 omp_clause_code_name[OMP_CLAUSE_CODE (c)]);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1753 inform (OMP_CLAUSE_LOCATION (c_level),
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1754 "... to the previous %qs clause here",
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1755 omp_clause_code_name[OMP_CLAUSE_CODE (c_level)]);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1756 /* Drop the conflicting clause. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1757 gcc_checking_assert (c_p != NULL_TREE);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1758 OMP_CLAUSE_CHAIN (c_p) = OMP_CLAUSE_CHAIN (c);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1759 c = c_p;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1760 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1761 break;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1762 default:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1763 gcc_unreachable ();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1764 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1765 if (c_level == NULL_TREE)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1766 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1767 /* Default to an implicit 'seq' clause. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1768 c_level = build_omp_clause (loc, OMP_CLAUSE_SEQ);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1769 OMP_CLAUSE_CHAIN (c_level) = *clauses;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1770 *clauses = c_level;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1771 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1772 /* In *clauses, we now have exactly one clause specifying the level of
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1773 parallelism. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1774
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1775 tree attr
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1776 = lookup_attribute ("omp declare target", DECL_ATTRIBUTES (fndecl));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1777 if (attr != NULL_TREE)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1778 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1779 /* If a "#pragma acc routine" has already been applied, just verify
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1780 this one for compatibility. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1781 /* Collect previous directive's clauses. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1782 tree c_level_p = NULL_TREE;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1783 for (tree c = TREE_VALUE (attr); c; c = OMP_CLAUSE_CHAIN (c))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1784 switch (OMP_CLAUSE_CODE (c))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1785 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1786 case OMP_CLAUSE_GANG:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1787 case OMP_CLAUSE_WORKER:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1788 case OMP_CLAUSE_VECTOR:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1789 case OMP_CLAUSE_SEQ:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1790 gcc_checking_assert (c_level_p == NULL_TREE);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1791 c_level_p = c;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1792 break;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1793 default:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1794 gcc_unreachable ();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1795 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1796 gcc_checking_assert (c_level_p != NULL_TREE);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1797 /* ..., and compare to current directive's, which we've already collected
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1798 above. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1799 tree c_diag;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1800 tree c_diag_p;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1801 /* Matching level of parallelism? */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1802 if (OMP_CLAUSE_CODE (c_level) != OMP_CLAUSE_CODE (c_level_p))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1803 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1804 c_diag = c_level;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1805 c_diag_p = c_level_p;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1806 goto incompatible;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1807 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1808 /* Compatible. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1809 return 1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1810
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1811 incompatible:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1812 if (c_diag != NULL_TREE)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1813 error_at (OMP_CLAUSE_LOCATION (c_diag),
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1814 "incompatible %qs clause when applying"
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1815 " %<%s%> to %qD, which has already been"
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1816 " marked with an OpenACC 'routine' directive",
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1817 omp_clause_code_name[OMP_CLAUSE_CODE (c_diag)],
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1818 routine_str, fndecl);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1819 else if (c_diag_p != NULL_TREE)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1820 error_at (loc,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1821 "missing %qs clause when applying"
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1822 " %<%s%> to %qD, which has already been"
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1823 " marked with an OpenACC 'routine' directive",
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1824 omp_clause_code_name[OMP_CLAUSE_CODE (c_diag_p)],
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1825 routine_str, fndecl);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1826 else
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1827 gcc_unreachable ();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1828 if (c_diag_p != NULL_TREE)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1829 inform (OMP_CLAUSE_LOCATION (c_diag_p),
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1830 "... with %qs clause here",
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1831 omp_clause_code_name[OMP_CLAUSE_CODE (c_diag_p)]);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1832 else
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1833 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1834 /* In the front ends, we don't preserve location information for the
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1835 OpenACC routine directive itself. However, that of c_level_p
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1836 should be close. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1837 location_t loc_routine = OMP_CLAUSE_LOCATION (c_level_p);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1838 inform (loc_routine, "... without %qs clause near to here",
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1839 omp_clause_code_name[OMP_CLAUSE_CODE (c_diag)]);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1840 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1841 /* Incompatible. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1842 return -1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1843 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1844
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1845 return 0;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1846 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1847
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1848 /* Process the OpenACC 'routine' directive clauses to generate an attribute
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1849 for the level of parallelism. All dimensions have a size of zero
111
kono
parents:
diff changeset
1850 (dynamic). TREE_PURPOSE is set to indicate whether that dimension
kono
parents:
diff changeset
1851 can have a loop partitioned on it. non-zero indicates
kono
parents:
diff changeset
1852 yes, zero indicates no. By construction once a non-zero has been
kono
parents:
diff changeset
1853 reached, further inner dimensions must also be non-zero. We set
kono
parents:
diff changeset
1854 TREE_VALUE to zero for the dimensions that may be partitioned and
kono
parents:
diff changeset
1855 1 for the other ones -- if a loop is (erroneously) spawned at
kono
parents:
diff changeset
1856 an outer level, we don't want to try and partition it. */
kono
parents:
diff changeset
1857
kono
parents:
diff changeset
1858 tree
kono
parents:
diff changeset
1859 oacc_build_routine_dims (tree clauses)
kono
parents:
diff changeset
1860 {
kono
parents:
diff changeset
1861 /* Must match GOMP_DIM ordering. */
kono
parents:
diff changeset
1862 static const omp_clause_code ids[]
kono
parents:
diff changeset
1863 = {OMP_CLAUSE_GANG, OMP_CLAUSE_WORKER, OMP_CLAUSE_VECTOR, OMP_CLAUSE_SEQ};
kono
parents:
diff changeset
1864 int ix;
kono
parents:
diff changeset
1865 int level = -1;
kono
parents:
diff changeset
1866
kono
parents:
diff changeset
1867 for (; clauses; clauses = OMP_CLAUSE_CHAIN (clauses))
kono
parents:
diff changeset
1868 for (ix = GOMP_DIM_MAX + 1; ix--;)
kono
parents:
diff changeset
1869 if (OMP_CLAUSE_CODE (clauses) == ids[ix])
kono
parents:
diff changeset
1870 {
kono
parents:
diff changeset
1871 level = ix;
kono
parents:
diff changeset
1872 break;
kono
parents:
diff changeset
1873 }
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1874 gcc_checking_assert (level >= 0);
111
kono
parents:
diff changeset
1875
kono
parents:
diff changeset
1876 tree dims = NULL_TREE;
kono
parents:
diff changeset
1877
kono
parents:
diff changeset
1878 for (ix = GOMP_DIM_MAX; ix--;)
kono
parents:
diff changeset
1879 dims = tree_cons (build_int_cst (boolean_type_node, ix >= level),
kono
parents:
diff changeset
1880 build_int_cst (integer_type_node, ix < level), dims);
kono
parents:
diff changeset
1881
kono
parents:
diff changeset
1882 return dims;
kono
parents:
diff changeset
1883 }
kono
parents:
diff changeset
1884
kono
parents:
diff changeset
1885 /* Retrieve the oacc function attrib and return it. Non-oacc
kono
parents:
diff changeset
1886 functions will return NULL. */
kono
parents:
diff changeset
1887
kono
parents:
diff changeset
1888 tree
kono
parents:
diff changeset
1889 oacc_get_fn_attrib (tree fn)
kono
parents:
diff changeset
1890 {
kono
parents:
diff changeset
1891 return lookup_attribute (OACC_FN_ATTRIB, DECL_ATTRIBUTES (fn));
kono
parents:
diff changeset
1892 }
kono
parents:
diff changeset
1893
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1894 /* Return true if FN is an OpenMP or OpenACC offloading function. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1895
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1896 bool
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1897 offloading_function_p (tree fn)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1898 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1899 tree attrs = DECL_ATTRIBUTES (fn);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1900 return (lookup_attribute ("omp declare target", attrs)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1901 || lookup_attribute ("omp target entrypoint", attrs));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1902 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1903
111
kono
parents:
diff changeset
1904 /* Extract an oacc execution dimension from FN. FN must be an
kono
parents:
diff changeset
1905 offloaded function or routine that has already had its execution
kono
parents:
diff changeset
1906 dimensions lowered to the target-specific values. */
kono
parents:
diff changeset
1907
kono
parents:
diff changeset
1908 int
kono
parents:
diff changeset
1909 oacc_get_fn_dim_size (tree fn, int axis)
kono
parents:
diff changeset
1910 {
kono
parents:
diff changeset
1911 tree attrs = oacc_get_fn_attrib (fn);
kono
parents:
diff changeset
1912
kono
parents:
diff changeset
1913 gcc_assert (axis < GOMP_DIM_MAX);
kono
parents:
diff changeset
1914
kono
parents:
diff changeset
1915 tree dims = TREE_VALUE (attrs);
kono
parents:
diff changeset
1916 while (axis--)
kono
parents:
diff changeset
1917 dims = TREE_CHAIN (dims);
kono
parents:
diff changeset
1918
kono
parents:
diff changeset
1919 int size = TREE_INT_CST_LOW (TREE_VALUE (dims));
kono
parents:
diff changeset
1920
kono
parents:
diff changeset
1921 return size;
kono
parents:
diff changeset
1922 }
kono
parents:
diff changeset
1923
kono
parents:
diff changeset
1924 /* Extract the dimension axis from an IFN_GOACC_DIM_POS or
kono
parents:
diff changeset
1925 IFN_GOACC_DIM_SIZE call. */
kono
parents:
diff changeset
1926
kono
parents:
diff changeset
1927 int
kono
parents:
diff changeset
1928 oacc_get_ifn_dim_arg (const gimple *stmt)
kono
parents:
diff changeset
1929 {
kono
parents:
diff changeset
1930 gcc_checking_assert (gimple_call_internal_fn (stmt) == IFN_GOACC_DIM_SIZE
kono
parents:
diff changeset
1931 || gimple_call_internal_fn (stmt) == IFN_GOACC_DIM_POS);
kono
parents:
diff changeset
1932 tree arg = gimple_call_arg (stmt, 0);
kono
parents:
diff changeset
1933 HOST_WIDE_INT axis = TREE_INT_CST_LOW (arg);
kono
parents:
diff changeset
1934
kono
parents:
diff changeset
1935 gcc_checking_assert (axis >= 0 && axis < GOMP_DIM_MAX);
kono
parents:
diff changeset
1936 return (int) axis;
kono
parents:
diff changeset
1937 }