File: | build/gcc/omp-expand.cc |
Warning: | line 8072, column 3 Value stored to 'loc' is never read |
Press '?' to see keyboard shortcuts
Keyboard shortcuts:
1 | /* Expansion pass for OMP directives. Outlines regions of certain OMP |
2 | directives to separate functions, converts others into explicit calls to the |
3 | runtime library (libgomp) and so forth |
4 | |
5 | Copyright (C) 2005-2023 Free Software Foundation, Inc. |
6 | |
7 | This file is part of GCC. |
8 | |
9 | GCC is free software; you can redistribute it and/or modify it under |
10 | the terms of the GNU General Public License as published by the Free |
11 | Software Foundation; either version 3, or (at your option) any later |
12 | version. |
13 | |
14 | GCC is distributed in the hope that it will be useful, but WITHOUT ANY |
15 | WARRANTY; without even the implied warranty of MERCHANTABILITY or |
16 | FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
17 | for more details. |
18 | |
19 | You should have received a copy of the GNU General Public License |
20 | along with GCC; see the file COPYING3. If not see |
21 | <http://www.gnu.org/licenses/>. */ |
22 | |
23 | #include "config.h" |
24 | #include "system.h" |
25 | #include "coretypes.h" |
26 | #include "memmodel.h" |
27 | #include "backend.h" |
28 | #include "target.h" |
29 | #include "rtl.h" |
30 | #include "tree.h" |
31 | #include "gimple.h" |
32 | #include "cfghooks.h" |
33 | #include "tree-pass.h" |
34 | #include "ssa.h" |
35 | #include "optabs.h" |
36 | #include "cgraph.h" |
37 | #include "pretty-print.h" |
38 | #include "diagnostic-core.h" |
39 | #include "fold-const.h" |
40 | #include "stor-layout.h" |
41 | #include "cfganal.h" |
42 | #include "internal-fn.h" |
43 | #include "gimplify.h" |
44 | #include "gimple-iterator.h" |
45 | #include "gimplify-me.h" |
46 | #include "gimple-walk.h" |
47 | #include "tree-cfg.h" |
48 | #include "tree-into-ssa.h" |
49 | #include "tree-ssa.h" |
50 | #include "splay-tree.h" |
51 | #include "cfgloop.h" |
52 | #include "omp-general.h" |
53 | #include "omp-offload.h" |
54 | #include "tree-cfgcleanup.h" |
55 | #include "alloc-pool.h" |
56 | #include "symbol-summary.h" |
57 | #include "gomp-constants.h" |
58 | #include "gimple-pretty-print.h" |
59 | #include "stringpool.h" |
60 | #include "attribs.h" |
61 | #include "tree-eh.h" |
62 | #include "opts.h" |
63 | |
64 | /* OMP region information. Every parallel and workshare |
65 | directive is enclosed between two markers, the OMP_* directive |
66 | and a corresponding GIMPLE_OMP_RETURN statement. */ |
67 | |
68 | struct omp_region |
69 | { |
70 | /* The enclosing region. */ |
71 | struct omp_region *outer; |
72 | |
73 | /* First child region. */ |
74 | struct omp_region *inner; |
75 | |
76 | /* Next peer region. */ |
77 | struct omp_region *next; |
78 | |
79 | /* Block containing the omp directive as its last stmt. */ |
80 | basic_block entry; |
81 | |
82 | /* Block containing the GIMPLE_OMP_RETURN as its last stmt. */ |
83 | basic_block exit; |
84 | |
85 | /* Block containing the GIMPLE_OMP_CONTINUE as its last stmt. */ |
86 | basic_block cont; |
87 | |
88 | /* If this is a combined parallel+workshare region, this is a list |
89 | of additional arguments needed by the combined parallel+workshare |
90 | library call. */ |
91 | vec<tree, va_gc> *ws_args; |
92 | |
93 | /* The code for the omp directive of this region. */ |
94 | enum gimple_code type; |
95 | |
96 | /* Schedule kind, only used for GIMPLE_OMP_FOR type regions. */ |
97 | enum omp_clause_schedule_kind sched_kind; |
98 | |
99 | /* Schedule modifiers. */ |
100 | unsigned char sched_modifiers; |
101 | |
102 | /* True if this is a combined parallel+workshare region. */ |
103 | bool is_combined_parallel; |
104 | |
105 | /* Copy of fd.lastprivate_conditional != 0. */ |
106 | bool has_lastprivate_conditional; |
107 | |
108 | /* The ordered stmt if type is GIMPLE_OMP_ORDERED and it has |
109 | a depend clause. */ |
110 | gomp_ordered *ord_stmt; |
111 | }; |
112 | |
113 | static struct omp_region *root_omp_region; |
114 | static bool omp_any_child_fn_dumped; |
115 | |
116 | static void expand_omp_build_assign (gimple_stmt_iterator *, tree, tree, |
117 | bool = false); |
118 | static gphi *find_phi_with_arg_on_edge (tree, edge); |
119 | static void expand_omp (struct omp_region *region); |
120 | |
121 | /* Return true if REGION is a combined parallel+workshare region. */ |
122 | |
123 | static inline bool |
124 | is_combined_parallel (struct omp_region *region) |
125 | { |
126 | return region->is_combined_parallel; |
127 | } |
128 | |
129 | /* Given two blocks PAR_ENTRY_BB and WS_ENTRY_BB such that WS_ENTRY_BB |
130 | is the immediate dominator of PAR_ENTRY_BB, return true if there |
131 | are no data dependencies that would prevent expanding the parallel |
132 | directive at PAR_ENTRY_BB as a combined parallel+workshare region. |
133 | |
134 | When expanding a combined parallel+workshare region, the call to |
135 | the child function may need additional arguments in the case of |
136 | GIMPLE_OMP_FOR regions. In some cases, these arguments are |
137 | computed out of variables passed in from the parent to the child |
138 | via 'struct .omp_data_s'. For instance: |
139 | |
140 | #pragma omp parallel for schedule (guided, i * 4) |
141 | for (j ...) |
142 | |
143 | Is lowered into: |
144 | |
145 | # BLOCK 2 (PAR_ENTRY_BB) |
146 | .omp_data_o.i = i; |
147 | #pragma omp parallel [child fn: bar.omp_fn.0 ( ..., D.1598) |
148 | |
149 | # BLOCK 3 (WS_ENTRY_BB) |
150 | .omp_data_i = &.omp_data_o; |
151 | D.1667 = .omp_data_i->i; |
152 | D.1598 = D.1667 * 4; |
153 | #pragma omp for schedule (guided, D.1598) |
154 | |
155 | When we outline the parallel region, the call to the child function |
156 | 'bar.omp_fn.0' will need the value D.1598 in its argument list, but |
157 | that value is computed *after* the call site. So, in principle we |
158 | cannot do the transformation. |
159 | |
160 | To see whether the code in WS_ENTRY_BB blocks the combined |
161 | parallel+workshare call, we collect all the variables used in the |
162 | GIMPLE_OMP_FOR header check whether they appear on the LHS of any |
163 | statement in WS_ENTRY_BB. If so, then we cannot emit the combined |
164 | call. |
165 | |
166 | FIXME. If we had the SSA form built at this point, we could merely |
167 | hoist the code in block 3 into block 2 and be done with it. But at |
168 | this point we don't have dataflow information and though we could |
169 | hack something up here, it is really not worth the aggravation. */ |
170 | |
171 | static bool |
172 | workshare_safe_to_combine_p (basic_block ws_entry_bb) |
173 | { |
174 | struct omp_for_data fd; |
175 | gimple *ws_stmt = last_stmt (ws_entry_bb); |
176 | |
177 | if (gimple_code (ws_stmt) == GIMPLE_OMP_SECTIONS) |
178 | return true; |
179 | |
180 | gcc_assert (gimple_code (ws_stmt) == GIMPLE_OMP_FOR)((void)(!(gimple_code (ws_stmt) == GIMPLE_OMP_FOR) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 180, __FUNCTION__), 0 : 0)); |
181 | if (gimple_omp_for_kind (ws_stmt) != GF_OMP_FOR_KIND_FOR) |
182 | return false; |
183 | |
184 | omp_extract_for_data (as_a <gomp_for *> (ws_stmt), &fd, NULLnullptr); |
185 | |
186 | if (fd.collapse > 1 && TREE_CODE (fd.loop.n2)((enum tree_code) (fd.loop.n2)->base.code) != INTEGER_CST) |
187 | return false; |
188 | if (fd.iter_type != long_integer_type_nodeinteger_types[itk_long]) |
189 | return false; |
190 | |
191 | /* FIXME. We give up too easily here. If any of these arguments |
192 | are not constants, they will likely involve variables that have |
193 | been mapped into fields of .omp_data_s for sharing with the child |
194 | function. With appropriate data flow, it would be possible to |
195 | see through this. */ |
196 | if (!is_gimple_min_invariant (fd.loop.n1) |
197 | || !is_gimple_min_invariant (fd.loop.n2) |
198 | || !is_gimple_min_invariant (fd.loop.step) |
199 | || (fd.chunk_size && !is_gimple_min_invariant (fd.chunk_size))) |
200 | return false; |
201 | |
202 | return true; |
203 | } |
204 | |
205 | /* Adjust CHUNK_SIZE from SCHEDULE clause, depending on simd modifier |
206 | presence (SIMD_SCHEDULE). */ |
207 | |
208 | static tree |
209 | omp_adjust_chunk_size (tree chunk_size, bool simd_schedule) |
210 | { |
211 | if (!simd_schedule || integer_zerop (chunk_size)) |
212 | return chunk_size; |
213 | |
214 | poly_uint64 vf = omp_max_vf (); |
215 | if (known_eq (vf, 1U)(!maybe_ne (vf, 1U))) |
216 | return chunk_size; |
217 | |
218 | tree type = TREE_TYPE (chunk_size)((contains_struct_check ((chunk_size), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 218, __FUNCTION__))->typed.type); |
219 | chunk_size = fold_build2 (PLUS_EXPR, type, chunk_size,fold_build2_loc (((location_t) 0), PLUS_EXPR, type, chunk_size , build_int_cst (type, vf - 1) ) |
220 | build_int_cst (type, vf - 1))fold_build2_loc (((location_t) 0), PLUS_EXPR, type, chunk_size , build_int_cst (type, vf - 1) ); |
221 | return fold_build2 (BIT_AND_EXPR, type, chunk_size,fold_build2_loc (((location_t) 0), BIT_AND_EXPR, type, chunk_size , build_int_cst (type, -vf) ) |
222 | build_int_cst (type, -vf))fold_build2_loc (((location_t) 0), BIT_AND_EXPR, type, chunk_size , build_int_cst (type, -vf) ); |
223 | } |
224 | |
225 | /* Collect additional arguments needed to emit a combined |
226 | parallel+workshare call. WS_STMT is the workshare directive being |
227 | expanded. */ |
228 | |
229 | static vec<tree, va_gc> * |
230 | get_ws_args_for (gimple *par_stmt, gimple *ws_stmt) |
231 | { |
232 | tree t; |
233 | location_t loc = gimple_location (ws_stmt); |
234 | vec<tree, va_gc> *ws_args; |
235 | |
236 | if (gomp_for *for_stmt = dyn_cast <gomp_for *> (ws_stmt)) |
237 | { |
238 | struct omp_for_data fd; |
239 | tree n1, n2; |
240 | |
241 | omp_extract_for_data (for_stmt, &fd, NULLnullptr); |
242 | n1 = fd.loop.n1; |
243 | n2 = fd.loop.n2; |
244 | |
245 | if (gimple_omp_for_combined_into_p (for_stmt)) |
246 | { |
247 | tree innerc |
248 | = omp_find_clause (gimple_omp_parallel_clauses (par_stmt), |
249 | OMP_CLAUSE__LOOPTEMP_); |
250 | gcc_assert (innerc)((void)(!(innerc) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 250, __FUNCTION__), 0 : 0)); |
251 | n1 = OMP_CLAUSE_DECL (innerc)(*(omp_clause_elt_check (((omp_clause_range_check (((tree_check ((innerc), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 251, __FUNCTION__, (OMP_CLAUSE)))), (OMP_CLAUSE_PRIVATE), ( OMP_CLAUSE__SCANTEMP_), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 251, __FUNCTION__))), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 251, __FUNCTION__))); |
252 | innerc = omp_find_clause (OMP_CLAUSE_CHAIN (innerc)((contains_struct_check (((tree_check ((innerc), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 252, __FUNCTION__, (OMP_CLAUSE)))), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 252, __FUNCTION__))->common.chain), |
253 | OMP_CLAUSE__LOOPTEMP_); |
254 | gcc_assert (innerc)((void)(!(innerc) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 254, __FUNCTION__), 0 : 0)); |
255 | n2 = OMP_CLAUSE_DECL (innerc)(*(omp_clause_elt_check (((omp_clause_range_check (((tree_check ((innerc), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 255, __FUNCTION__, (OMP_CLAUSE)))), (OMP_CLAUSE_PRIVATE), ( OMP_CLAUSE__SCANTEMP_), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 255, __FUNCTION__))), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 255, __FUNCTION__))); |
256 | } |
257 | |
258 | vec_alloc (ws_args, 3 + (fd.chunk_size != 0)); |
259 | |
260 | t = fold_convert_loc (loc, long_integer_type_nodeinteger_types[itk_long], n1); |
261 | ws_args->quick_push (t); |
262 | |
263 | t = fold_convert_loc (loc, long_integer_type_nodeinteger_types[itk_long], n2); |
264 | ws_args->quick_push (t); |
265 | |
266 | t = fold_convert_loc (loc, long_integer_type_nodeinteger_types[itk_long], fd.loop.step); |
267 | ws_args->quick_push (t); |
268 | |
269 | if (fd.chunk_size) |
270 | { |
271 | t = fold_convert_loc (loc, long_integer_type_nodeinteger_types[itk_long], fd.chunk_size); |
272 | t = omp_adjust_chunk_size (t, fd.simd_schedule); |
273 | ws_args->quick_push (t); |
274 | } |
275 | |
276 | return ws_args; |
277 | } |
278 | else if (gimple_code (ws_stmt) == GIMPLE_OMP_SECTIONS) |
279 | { |
280 | /* Number of sections is equal to the number of edges from the |
281 | GIMPLE_OMP_SECTIONS_SWITCH statement, except for the one to |
282 | the exit of the sections region. */ |
283 | basic_block bb = single_succ (gimple_bb (ws_stmt)); |
284 | t = build_int_cst (unsigned_type_nodeinteger_types[itk_unsigned_int], EDGE_COUNT (bb->succs)vec_safe_length (bb->succs) - 1); |
285 | vec_alloc (ws_args, 1); |
286 | ws_args->quick_push (t); |
287 | return ws_args; |
288 | } |
289 | |
290 | gcc_unreachable ()(fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 290, __FUNCTION__)); |
291 | } |
292 | |
293 | /* Discover whether REGION is a combined parallel+workshare region. */ |
294 | |
295 | static void |
296 | determine_parallel_type (struct omp_region *region) |
297 | { |
298 | basic_block par_entry_bb, par_exit_bb; |
299 | basic_block ws_entry_bb, ws_exit_bb; |
300 | |
301 | if (region == NULLnullptr || region->inner == NULLnullptr |
302 | || region->exit == NULLnullptr || region->inner->exit == NULLnullptr |
303 | || region->inner->cont == NULLnullptr) |
304 | return; |
305 | |
306 | /* We only support parallel+for and parallel+sections. */ |
307 | if (region->type != GIMPLE_OMP_PARALLEL |
308 | || (region->inner->type != GIMPLE_OMP_FOR |
309 | && region->inner->type != GIMPLE_OMP_SECTIONS)) |
310 | return; |
311 | |
312 | /* Check for perfect nesting PAR_ENTRY_BB -> WS_ENTRY_BB and |
313 | WS_EXIT_BB -> PAR_EXIT_BB. */ |
314 | par_entry_bb = region->entry; |
315 | par_exit_bb = region->exit; |
316 | ws_entry_bb = region->inner->entry; |
317 | ws_exit_bb = region->inner->exit; |
318 | |
319 | /* Give up for task reductions on the parallel, while it is implementable, |
320 | adding another big set of APIs or slowing down the normal paths is |
321 | not acceptable. */ |
322 | tree pclauses = gimple_omp_parallel_clauses (last_stmt (par_entry_bb)); |
323 | if (omp_find_clause (pclauses, OMP_CLAUSE__REDUCTEMP_)) |
324 | return; |
325 | |
326 | if (single_succ (par_entry_bb) == ws_entry_bb |
327 | && single_succ (ws_exit_bb) == par_exit_bb |
328 | && workshare_safe_to_combine_p (ws_entry_bb) |
329 | && (gimple_omp_parallel_combined_p (last_stmt (par_entry_bb)) |
330 | || (last_and_only_stmt (ws_entry_bb) |
331 | && last_and_only_stmt (par_exit_bb)))) |
332 | { |
333 | gimple *par_stmt = last_stmt (par_entry_bb); |
334 | gimple *ws_stmt = last_stmt (ws_entry_bb); |
335 | |
336 | if (region->inner->type == GIMPLE_OMP_FOR) |
337 | { |
338 | /* If this is a combined parallel loop, we need to determine |
339 | whether or not to use the combined library calls. There |
340 | are two cases where we do not apply the transformation: |
341 | static loops and any kind of ordered loop. In the first |
342 | case, we already open code the loop so there is no need |
343 | to do anything else. In the latter case, the combined |
344 | parallel loop call would still need extra synchronization |
345 | to implement ordered semantics, so there would not be any |
346 | gain in using the combined call. */ |
347 | tree clauses = gimple_omp_for_clauses (ws_stmt); |
348 | tree c = omp_find_clause (clauses, OMP_CLAUSE_SCHEDULE); |
349 | if (c == NULLnullptr |
350 | || ((OMP_CLAUSE_SCHEDULE_KIND (c)((omp_clause_subcode_check ((c), (OMP_CLAUSE_SCHEDULE), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 350, __FUNCTION__))->omp_clause.subcode.schedule_kind) & OMP_CLAUSE_SCHEDULE_MASK) |
351 | == OMP_CLAUSE_SCHEDULE_STATIC) |
352 | || omp_find_clause (clauses, OMP_CLAUSE_ORDERED) |
353 | || omp_find_clause (clauses, OMP_CLAUSE__REDUCTEMP_) |
354 | || ((c = omp_find_clause (clauses, OMP_CLAUSE__CONDTEMP_)) |
355 | && POINTER_TYPE_P (TREE_TYPE (OMP_CLAUSE_DECL (c)))(((enum tree_code) (((contains_struct_check (((*(omp_clause_elt_check (((omp_clause_range_check (((tree_check ((c), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 355, __FUNCTION__, (OMP_CLAUSE)))), (OMP_CLAUSE_PRIVATE), ( OMP_CLAUSE__SCANTEMP_), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 355, __FUNCTION__))), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 355, __FUNCTION__)))), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 355, __FUNCTION__))->typed.type))->base.code) == POINTER_TYPE || ((enum tree_code) (((contains_struct_check (((*(omp_clause_elt_check (((omp_clause_range_check (((tree_check ((c), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 355, __FUNCTION__, (OMP_CLAUSE)))), (OMP_CLAUSE_PRIVATE), ( OMP_CLAUSE__SCANTEMP_), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 355, __FUNCTION__))), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 355, __FUNCTION__)))), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 355, __FUNCTION__))->typed.type))->base.code) == REFERENCE_TYPE ))) |
356 | return; |
357 | } |
358 | else if (region->inner->type == GIMPLE_OMP_SECTIONS |
359 | && (omp_find_clause (gimple_omp_sections_clauses (ws_stmt), |
360 | OMP_CLAUSE__REDUCTEMP_) |
361 | || omp_find_clause (gimple_omp_sections_clauses (ws_stmt), |
362 | OMP_CLAUSE__CONDTEMP_))) |
363 | return; |
364 | |
365 | region->is_combined_parallel = true; |
366 | region->inner->is_combined_parallel = true; |
367 | region->ws_args = get_ws_args_for (par_stmt, ws_stmt); |
368 | } |
369 | } |
370 | |
371 | /* Debugging dumps for parallel regions. */ |
372 | void dump_omp_region (FILE *, struct omp_region *, int); |
373 | void debug_omp_region (struct omp_region *); |
374 | void debug_all_omp_regions (void); |
375 | |
376 | /* Dump the parallel region tree rooted at REGION. */ |
377 | |
378 | void |
379 | dump_omp_region (FILE *file, struct omp_region *region, int indent) |
380 | { |
381 | fprintf (file, "%*sbb %d: %s\n", indent, "", region->entry->index, |
382 | gimple_code_name[region->type]); |
383 | |
384 | if (region->inner) |
385 | dump_omp_region (file, region->inner, indent + 4); |
386 | |
387 | if (region->cont) |
388 | { |
389 | fprintf (file, "%*sbb %d: GIMPLE_OMP_CONTINUE\n", indent, "", |
390 | region->cont->index); |
391 | } |
392 | |
393 | if (region->exit) |
394 | fprintf (file, "%*sbb %d: GIMPLE_OMP_RETURN\n", indent, "", |
395 | region->exit->index); |
396 | else |
397 | fprintf (file, "%*s[no exit marker]\n", indent, ""); |
398 | |
399 | if (region->next) |
400 | dump_omp_region (file, region->next, indent); |
401 | } |
402 | |
403 | DEBUG_FUNCTION__attribute__ ((__used__)) void |
404 | debug_omp_region (struct omp_region *region) |
405 | { |
406 | dump_omp_region (stderrstderr, region, 0); |
407 | } |
408 | |
409 | DEBUG_FUNCTION__attribute__ ((__used__)) void |
410 | debug_all_omp_regions (void) |
411 | { |
412 | dump_omp_region (stderrstderr, root_omp_region, 0); |
413 | } |
414 | |
415 | /* Create a new parallel region starting at STMT inside region PARENT. */ |
416 | |
417 | static struct omp_region * |
418 | new_omp_region (basic_block bb, enum gimple_code type, |
419 | struct omp_region *parent) |
420 | { |
421 | struct omp_region *region = XCNEW (struct omp_region)((struct omp_region *) xcalloc (1, sizeof (struct omp_region) )); |
422 | |
423 | region->outer = parent; |
424 | region->entry = bb; |
425 | region->type = type; |
426 | |
427 | if (parent) |
428 | { |
429 | /* This is a nested region. Add it to the list of inner |
430 | regions in PARENT. */ |
431 | region->next = parent->inner; |
432 | parent->inner = region; |
433 | } |
434 | else |
435 | { |
436 | /* This is a toplevel region. Add it to the list of toplevel |
437 | regions in ROOT_OMP_REGION. */ |
438 | region->next = root_omp_region; |
439 | root_omp_region = region; |
440 | } |
441 | |
442 | return region; |
443 | } |
444 | |
445 | /* Release the memory associated with the region tree rooted at REGION. */ |
446 | |
447 | static void |
448 | free_omp_region_1 (struct omp_region *region) |
449 | { |
450 | struct omp_region *i, *n; |
451 | |
452 | for (i = region->inner; i ; i = n) |
453 | { |
454 | n = i->next; |
455 | free_omp_region_1 (i); |
456 | } |
457 | |
458 | free (region); |
459 | } |
460 | |
461 | /* Release the memory for the entire omp region tree. */ |
462 | |
463 | void |
464 | omp_free_regions (void) |
465 | { |
466 | struct omp_region *r, *n; |
467 | for (r = root_omp_region; r ; r = n) |
468 | { |
469 | n = r->next; |
470 | free_omp_region_1 (r); |
471 | } |
472 | root_omp_region = NULLnullptr; |
473 | } |
474 | |
475 | /* A convenience function to build an empty GIMPLE_COND with just the |
476 | condition. */ |
477 | |
478 | static gcond * |
479 | gimple_build_cond_empty (tree cond) |
480 | { |
481 | enum tree_code pred_code; |
482 | tree lhs, rhs; |
483 | |
484 | gimple_cond_get_ops_from_tree (cond, &pred_code, &lhs, &rhs); |
485 | return gimple_build_cond (pred_code, lhs, rhs, NULL_TREE(tree) nullptr, NULL_TREE(tree) nullptr); |
486 | } |
487 | |
488 | /* Change DECL_CONTEXT of CHILD_FNDECL to that of the parent function. |
489 | Add CHILD_FNDECL to decl chain of the supercontext of the block |
490 | ENTRY_BLOCK - this is the block which originally contained the |
491 | code from which CHILD_FNDECL was created. |
492 | |
493 | Together, these actions ensure that the debug info for the outlined |
494 | function will be emitted with the correct lexical scope. */ |
495 | |
496 | static void |
497 | adjust_context_and_scope (struct omp_region *region, tree entry_block, |
498 | tree child_fndecl) |
499 | { |
500 | tree parent_fndecl = NULL_TREE(tree) nullptr; |
501 | gimple *entry_stmt; |
502 | /* OMP expansion expands inner regions before outer ones, so if |
503 | we e.g. have explicit task region nested in parallel region, when |
504 | expanding the task region current_function_decl will be the original |
505 | source function, but we actually want to use as context the child |
506 | function of the parallel. */ |
507 | for (region = region->outer; |
508 | region && parent_fndecl == NULL_TREE(tree) nullptr; region = region->outer) |
509 | switch (region->type) |
510 | { |
511 | case GIMPLE_OMP_PARALLEL: |
512 | case GIMPLE_OMP_TASK: |
513 | case GIMPLE_OMP_TEAMS: |
514 | entry_stmt = last_stmt (region->entry); |
515 | parent_fndecl = gimple_omp_taskreg_child_fn (entry_stmt); |
516 | break; |
517 | case GIMPLE_OMP_TARGET: |
518 | entry_stmt = last_stmt (region->entry); |
519 | parent_fndecl |
520 | = gimple_omp_target_child_fn (as_a <gomp_target *> (entry_stmt)); |
521 | break; |
522 | default: |
523 | break; |
524 | } |
525 | |
526 | if (parent_fndecl == NULL_TREE(tree) nullptr) |
527 | parent_fndecl = current_function_decl; |
528 | DECL_CONTEXT (child_fndecl)((contains_struct_check ((child_fndecl), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 528, __FUNCTION__))->decl_minimal.context) = parent_fndecl; |
529 | |
530 | if (entry_block != NULL_TREE(tree) nullptr && TREE_CODE (entry_block)((enum tree_code) (entry_block)->base.code) == BLOCK) |
531 | { |
532 | tree b = BLOCK_SUPERCONTEXT (entry_block)((tree_check ((entry_block), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 532, __FUNCTION__, (BLOCK)))->block.supercontext); |
533 | if (TREE_CODE (b)((enum tree_code) (b)->base.code) == BLOCK) |
534 | { |
535 | DECL_CHAIN (child_fndecl)(((contains_struct_check (((contains_struct_check ((child_fndecl ), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 535, __FUNCTION__))), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 535, __FUNCTION__))->common.chain)) = BLOCK_VARS (b)((tree_check ((b), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 535, __FUNCTION__, (BLOCK)))->block.vars); |
536 | BLOCK_VARS (b)((tree_check ((b), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 536, __FUNCTION__, (BLOCK)))->block.vars) = child_fndecl; |
537 | } |
538 | } |
539 | } |
540 | |
541 | /* Build the function calls to GOMP_parallel etc to actually |
542 | generate the parallel operation. REGION is the parallel region |
543 | being expanded. BB is the block where to insert the code. WS_ARGS |
544 | will be set if this is a call to a combined parallel+workshare |
545 | construct, it contains the list of additional arguments needed by |
546 | the workshare construct. */ |
547 | |
548 | static void |
549 | expand_parallel_call (struct omp_region *region, basic_block bb, |
550 | gomp_parallel *entry_stmt, |
551 | vec<tree, va_gc> *ws_args) |
552 | { |
553 | tree t, t1, t2, val, cond, c, clauses, flags; |
554 | gimple_stmt_iterator gsi; |
555 | gimple *stmt; |
556 | enum built_in_function start_ix; |
557 | int start_ix2; |
558 | location_t clause_loc; |
559 | vec<tree, va_gc> *args; |
560 | |
561 | clauses = gimple_omp_parallel_clauses (entry_stmt); |
562 | |
563 | /* Determine what flavor of GOMP_parallel we will be |
564 | emitting. */ |
565 | start_ix = BUILT_IN_GOMP_PARALLEL; |
566 | tree rtmp = omp_find_clause (clauses, OMP_CLAUSE__REDUCTEMP_); |
567 | if (rtmp) |
568 | start_ix = BUILT_IN_GOMP_PARALLEL_REDUCTIONS; |
569 | else if (is_combined_parallel (region)) |
570 | { |
571 | switch (region->inner->type) |
572 | { |
573 | case GIMPLE_OMP_FOR: |
574 | gcc_assert (region->inner->sched_kind != OMP_CLAUSE_SCHEDULE_AUTO)((void)(!(region->inner->sched_kind != OMP_CLAUSE_SCHEDULE_AUTO ) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 574, __FUNCTION__), 0 : 0)); |
575 | switch (region->inner->sched_kind) |
576 | { |
577 | case OMP_CLAUSE_SCHEDULE_RUNTIME: |
578 | /* For lastprivate(conditional:), our implementation |
579 | requires monotonic behavior. */ |
580 | if (region->inner->has_lastprivate_conditional != 0) |
581 | start_ix2 = 3; |
582 | else if ((region->inner->sched_modifiers |
583 | & OMP_CLAUSE_SCHEDULE_NONMONOTONIC) != 0) |
584 | start_ix2 = 6; |
585 | else if ((region->inner->sched_modifiers |
586 | & OMP_CLAUSE_SCHEDULE_MONOTONIC) == 0) |
587 | start_ix2 = 7; |
588 | else |
589 | start_ix2 = 3; |
590 | break; |
591 | case OMP_CLAUSE_SCHEDULE_DYNAMIC: |
592 | case OMP_CLAUSE_SCHEDULE_GUIDED: |
593 | if ((region->inner->sched_modifiers |
594 | & OMP_CLAUSE_SCHEDULE_MONOTONIC) == 0 |
595 | && !region->inner->has_lastprivate_conditional) |
596 | { |
597 | start_ix2 = 3 + region->inner->sched_kind; |
598 | break; |
599 | } |
600 | /* FALLTHRU */ |
601 | default: |
602 | start_ix2 = region->inner->sched_kind; |
603 | break; |
604 | } |
605 | start_ix2 += (int) BUILT_IN_GOMP_PARALLEL_LOOP_STATIC; |
606 | start_ix = (enum built_in_function) start_ix2; |
607 | break; |
608 | case GIMPLE_OMP_SECTIONS: |
609 | start_ix = BUILT_IN_GOMP_PARALLEL_SECTIONS; |
610 | break; |
611 | default: |
612 | gcc_unreachable ()(fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 612, __FUNCTION__)); |
613 | } |
614 | } |
615 | |
616 | /* By default, the value of NUM_THREADS is zero (selected at run time) |
617 | and there is no conditional. */ |
618 | cond = NULL_TREE(tree) nullptr; |
619 | val = build_int_cst (unsigned_type_nodeinteger_types[itk_unsigned_int], 0); |
620 | flags = build_int_cst (unsigned_type_nodeinteger_types[itk_unsigned_int], 0); |
621 | |
622 | c = omp_find_clause (clauses, OMP_CLAUSE_IF); |
623 | if (c) |
624 | cond = OMP_CLAUSE_IF_EXPR (c)(*(omp_clause_elt_check (((omp_clause_subcode_check ((c), (OMP_CLAUSE_IF ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 624, __FUNCTION__))), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 624, __FUNCTION__))); |
625 | |
626 | c = omp_find_clause (clauses, OMP_CLAUSE_NUM_THREADS); |
627 | if (c) |
628 | { |
629 | val = OMP_CLAUSE_NUM_THREADS_EXPR (c)(*(omp_clause_elt_check (((omp_clause_subcode_check ((c), (OMP_CLAUSE_NUM_THREADS ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 629, __FUNCTION__))), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 629, __FUNCTION__))); |
630 | clause_loc = OMP_CLAUSE_LOCATION (c)((tree_check ((c), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 630, __FUNCTION__, (OMP_CLAUSE))))->omp_clause.locus; |
631 | } |
632 | else |
633 | clause_loc = gimple_location (entry_stmt); |
634 | |
635 | c = omp_find_clause (clauses, OMP_CLAUSE_PROC_BIND); |
636 | if (c) |
637 | flags = build_int_cst (unsigned_type_nodeinteger_types[itk_unsigned_int], OMP_CLAUSE_PROC_BIND_KIND (c)((omp_clause_subcode_check ((c), (OMP_CLAUSE_PROC_BIND), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 637, __FUNCTION__))->omp_clause.subcode.proc_bind_kind)); |
638 | |
639 | /* Ensure 'val' is of the correct type. */ |
640 | val = fold_convert_loc (clause_loc, unsigned_type_nodeinteger_types[itk_unsigned_int], val); |
641 | |
642 | /* If we found the clause 'if (cond)', build either |
643 | (cond != 0) or (cond ? val : 1u). */ |
644 | if (cond) |
645 | { |
646 | cond = gimple_boolify (cond); |
647 | |
648 | if (integer_zerop (val)) |
649 | val = fold_build2_loc (clause_loc, |
650 | EQ_EXPR, unsigned_type_nodeinteger_types[itk_unsigned_int], cond, |
651 | build_int_cst (TREE_TYPE (cond)((contains_struct_check ((cond), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 651, __FUNCTION__))->typed.type), 0)); |
652 | else |
653 | { |
654 | basic_block cond_bb, then_bb, else_bb; |
655 | edge e, e_then, e_else; |
656 | tree tmp_then, tmp_else, tmp_join, tmp_var; |
657 | |
658 | tmp_var = create_tmp_var (TREE_TYPE (val)((contains_struct_check ((val), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 658, __FUNCTION__))->typed.type)); |
659 | if (gimple_in_ssa_p (cfun(cfun + 0))) |
660 | { |
661 | tmp_then = make_ssa_name (tmp_var); |
662 | tmp_else = make_ssa_name (tmp_var); |
663 | tmp_join = make_ssa_name (tmp_var); |
664 | } |
665 | else |
666 | { |
667 | tmp_then = tmp_var; |
668 | tmp_else = tmp_var; |
669 | tmp_join = tmp_var; |
670 | } |
671 | |
672 | e = split_block_after_labels (bb); |
673 | cond_bb = e->src; |
674 | bb = e->dest; |
675 | remove_edge (e); |
676 | |
677 | then_bb = create_empty_bb (cond_bb); |
678 | else_bb = create_empty_bb (then_bb); |
679 | set_immediate_dominator (CDI_DOMINATORS, then_bb, cond_bb); |
680 | set_immediate_dominator (CDI_DOMINATORS, else_bb, cond_bb); |
681 | |
682 | stmt = gimple_build_cond_empty (cond); |
683 | gsi = gsi_start_bb (cond_bb); |
684 | gsi_insert_after (&gsi, stmt, GSI_CONTINUE_LINKING); |
685 | |
686 | gsi = gsi_start_bb (then_bb); |
687 | expand_omp_build_assign (&gsi, tmp_then, val, true); |
688 | |
689 | gsi = gsi_start_bb (else_bb); |
690 | expand_omp_build_assign (&gsi, tmp_else, |
691 | build_int_cst (unsigned_type_nodeinteger_types[itk_unsigned_int], 1), |
692 | true); |
693 | |
694 | make_edge (cond_bb, then_bb, EDGE_TRUE_VALUE); |
695 | make_edge (cond_bb, else_bb, EDGE_FALSE_VALUE); |
696 | add_bb_to_loop (then_bb, cond_bb->loop_father); |
697 | add_bb_to_loop (else_bb, cond_bb->loop_father); |
698 | e_then = make_edge (then_bb, bb, EDGE_FALLTHRU); |
699 | e_else = make_edge (else_bb, bb, EDGE_FALLTHRU); |
700 | |
701 | if (gimple_in_ssa_p (cfun(cfun + 0))) |
702 | { |
703 | gphi *phi = create_phi_node (tmp_join, bb); |
704 | add_phi_arg (phi, tmp_then, e_then, UNKNOWN_LOCATION((location_t) 0)); |
705 | add_phi_arg (phi, tmp_else, e_else, UNKNOWN_LOCATION((location_t) 0)); |
706 | } |
707 | |
708 | val = tmp_join; |
709 | } |
710 | |
711 | gsi = gsi_start_bb (bb); |
712 | val = force_gimple_operand_gsi (&gsi, val, true, NULL_TREE(tree) nullptr, |
713 | false, GSI_CONTINUE_LINKING); |
714 | } |
715 | |
716 | gsi = gsi_last_nondebug_bb (bb); |
717 | t = gimple_omp_parallel_data_arg (entry_stmt); |
718 | if (t == NULLnullptr) |
719 | t1 = null_pointer_nodeglobal_trees[TI_NULL_POINTER]; |
720 | else |
721 | t1 = build_fold_addr_expr (t)build_fold_addr_expr_loc (((location_t) 0), (t)); |
722 | tree child_fndecl = gimple_omp_parallel_child_fn (entry_stmt); |
723 | t2 = build_fold_addr_expr (child_fndecl)build_fold_addr_expr_loc (((location_t) 0), (child_fndecl)); |
724 | |
725 | vec_alloc (args, 4 + vec_safe_length (ws_args)); |
726 | args->quick_push (t2); |
727 | args->quick_push (t1); |
728 | args->quick_push (val); |
729 | if (ws_args) |
730 | args->splice (*ws_args); |
731 | args->quick_push (flags); |
732 | |
733 | t = build_call_expr_loc_vec (UNKNOWN_LOCATION((location_t) 0), |
734 | builtin_decl_explicit (start_ix), args); |
735 | |
736 | if (rtmp) |
737 | { |
738 | tree type = TREE_TYPE (OMP_CLAUSE_DECL (rtmp))((contains_struct_check (((*(omp_clause_elt_check (((omp_clause_range_check (((tree_check ((rtmp), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 738, __FUNCTION__, (OMP_CLAUSE)))), (OMP_CLAUSE_PRIVATE), ( OMP_CLAUSE__SCANTEMP_), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 738, __FUNCTION__))), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 738, __FUNCTION__)))), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 738, __FUNCTION__))->typed.type); |
739 | t = build2 (MODIFY_EXPR, type, OMP_CLAUSE_DECL (rtmp)(*(omp_clause_elt_check (((omp_clause_range_check (((tree_check ((rtmp), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 739, __FUNCTION__, (OMP_CLAUSE)))), (OMP_CLAUSE_PRIVATE), ( OMP_CLAUSE__SCANTEMP_), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 739, __FUNCTION__))), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 739, __FUNCTION__))), |
740 | fold_convert (type,fold_convert_loc (((location_t) 0), type, fold_convert_loc (( (location_t) 0), global_trees[TI_POINTER_SIZED_TYPE], t)) |
741 | fold_convert (pointer_sized_int_node, t))fold_convert_loc (((location_t) 0), type, fold_convert_loc (( (location_t) 0), global_trees[TI_POINTER_SIZED_TYPE], t))); |
742 | } |
743 | force_gimple_operand_gsi (&gsi, t, true, NULL_TREE(tree) nullptr, |
744 | false, GSI_CONTINUE_LINKING); |
745 | } |
746 | |
747 | /* Build the function call to GOMP_task to actually |
748 | generate the task operation. BB is the block where to insert the code. */ |
749 | |
750 | static void |
751 | expand_task_call (struct omp_region *region, basic_block bb, |
752 | gomp_task *entry_stmt) |
753 | { |
754 | tree t1, t2, t3; |
755 | gimple_stmt_iterator gsi; |
756 | location_t loc = gimple_location (entry_stmt); |
757 | |
758 | tree clauses = gimple_omp_task_clauses (entry_stmt); |
759 | |
760 | tree ifc = omp_find_clause (clauses, OMP_CLAUSE_IF); |
761 | tree untied = omp_find_clause (clauses, OMP_CLAUSE_UNTIED); |
762 | tree mergeable = omp_find_clause (clauses, OMP_CLAUSE_MERGEABLE); |
763 | tree depend = omp_find_clause (clauses, OMP_CLAUSE_DEPEND); |
764 | tree finalc = omp_find_clause (clauses, OMP_CLAUSE_FINAL); |
765 | tree priority = omp_find_clause (clauses, OMP_CLAUSE_PRIORITY); |
766 | tree detach = omp_find_clause (clauses, OMP_CLAUSE_DETACH); |
767 | |
768 | unsigned int iflags |
769 | = (untied ? GOMP_TASK_FLAG_UNTIED(1 << 0) : 0) |
770 | | (mergeable ? GOMP_TASK_FLAG_MERGEABLE(1 << 2) : 0) |
771 | | (depend ? GOMP_TASK_FLAG_DEPEND(1 << 3) : 0); |
772 | |
773 | bool taskloop_p = gimple_omp_task_taskloop_p (entry_stmt); |
774 | tree startvar = NULL_TREE(tree) nullptr, endvar = NULL_TREE(tree) nullptr, step = NULL_TREE(tree) nullptr; |
775 | tree num_tasks = NULL_TREE(tree) nullptr; |
776 | bool ull = false; |
777 | if (taskloop_p) |
778 | { |
779 | gimple *g = last_stmt (region->outer->entry); |
780 | gcc_assert (gimple_code (g) == GIMPLE_OMP_FOR((void)(!(gimple_code (g) == GIMPLE_OMP_FOR && gimple_omp_for_kind (g) == GF_OMP_FOR_KIND_TASKLOOP) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 781, __FUNCTION__), 0 : 0)) |
781 | && gimple_omp_for_kind (g) == GF_OMP_FOR_KIND_TASKLOOP)((void)(!(gimple_code (g) == GIMPLE_OMP_FOR && gimple_omp_for_kind (g) == GF_OMP_FOR_KIND_TASKLOOP) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 781, __FUNCTION__), 0 : 0)); |
782 | struct omp_for_data fd; |
783 | omp_extract_for_data (as_a <gomp_for *> (g), &fd, NULLnullptr); |
784 | startvar = omp_find_clause (clauses, OMP_CLAUSE__LOOPTEMP_); |
785 | endvar = omp_find_clause (OMP_CLAUSE_CHAIN (startvar)((contains_struct_check (((tree_check ((startvar), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 785, __FUNCTION__, (OMP_CLAUSE)))), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 785, __FUNCTION__))->common.chain), |
786 | OMP_CLAUSE__LOOPTEMP_); |
787 | startvar = OMP_CLAUSE_DECL (startvar)(*(omp_clause_elt_check (((omp_clause_range_check (((tree_check ((startvar), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 787, __FUNCTION__, (OMP_CLAUSE)))), (OMP_CLAUSE_PRIVATE), ( OMP_CLAUSE__SCANTEMP_), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 787, __FUNCTION__))), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 787, __FUNCTION__))); |
788 | endvar = OMP_CLAUSE_DECL (endvar)(*(omp_clause_elt_check (((omp_clause_range_check (((tree_check ((endvar), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 788, __FUNCTION__, (OMP_CLAUSE)))), (OMP_CLAUSE_PRIVATE), ( OMP_CLAUSE__SCANTEMP_), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 788, __FUNCTION__))), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 788, __FUNCTION__))); |
789 | step = fold_convert_loc (loc, fd.iter_type, fd.loop.step); |
790 | if (fd.loop.cond_code == LT_EXPR) |
791 | iflags |= GOMP_TASK_FLAG_UP(1 << 8); |
792 | tree tclauses = gimple_omp_for_clauses (g); |
793 | num_tasks = omp_find_clause (tclauses, OMP_CLAUSE_NUM_TASKS); |
794 | if (num_tasks) |
795 | { |
796 | if (OMP_CLAUSE_NUM_TASKS_STRICT (num_tasks)(((omp_clause_subcode_check ((num_tasks), (OMP_CLAUSE_NUM_TASKS ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 796, __FUNCTION__)))->base.private_flag)) |
797 | iflags |= GOMP_TASK_FLAG_STRICT(1 << 14); |
798 | num_tasks = OMP_CLAUSE_NUM_TASKS_EXPR (num_tasks)(*(omp_clause_elt_check (((omp_clause_subcode_check ((num_tasks ), (OMP_CLAUSE_NUM_TASKS), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 798, __FUNCTION__))), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 798, __FUNCTION__))); |
799 | } |
800 | else |
801 | { |
802 | num_tasks = omp_find_clause (tclauses, OMP_CLAUSE_GRAINSIZE); |
803 | if (num_tasks) |
804 | { |
805 | iflags |= GOMP_TASK_FLAG_GRAINSIZE(1 << 9); |
806 | if (OMP_CLAUSE_GRAINSIZE_STRICT (num_tasks)(((omp_clause_subcode_check ((num_tasks), (OMP_CLAUSE_GRAINSIZE ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 806, __FUNCTION__)))->base.private_flag)) |
807 | iflags |= GOMP_TASK_FLAG_STRICT(1 << 14); |
808 | num_tasks = OMP_CLAUSE_GRAINSIZE_EXPR (num_tasks)(*(omp_clause_elt_check (((omp_clause_subcode_check ((num_tasks ), (OMP_CLAUSE_GRAINSIZE), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 808, __FUNCTION__))), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 808, __FUNCTION__))); |
809 | } |
810 | else |
811 | num_tasks = integer_zero_nodeglobal_trees[TI_INTEGER_ZERO]; |
812 | } |
813 | num_tasks = fold_convert_loc (loc, long_integer_type_nodeinteger_types[itk_long], num_tasks); |
814 | if (ifc == NULL_TREE(tree) nullptr) |
815 | iflags |= GOMP_TASK_FLAG_IF(1 << 10); |
816 | if (omp_find_clause (tclauses, OMP_CLAUSE_NOGROUP)) |
817 | iflags |= GOMP_TASK_FLAG_NOGROUP(1 << 11); |
818 | ull = fd.iter_type == long_long_unsigned_type_nodeinteger_types[itk_unsigned_long_long]; |
819 | if (omp_find_clause (clauses, OMP_CLAUSE_REDUCTION)) |
820 | iflags |= GOMP_TASK_FLAG_REDUCTION(1 << 12); |
821 | } |
822 | else |
823 | { |
824 | if (priority) |
825 | iflags |= GOMP_TASK_FLAG_PRIORITY(1 << 4); |
826 | if (detach) |
827 | iflags |= GOMP_TASK_FLAG_DETACH(1 << 13); |
828 | } |
829 | |
830 | tree flags = build_int_cst (unsigned_type_nodeinteger_types[itk_unsigned_int], iflags); |
831 | |
832 | tree cond = boolean_true_nodeglobal_trees[TI_BOOLEAN_TRUE]; |
833 | if (ifc) |
834 | { |
835 | if (taskloop_p) |
836 | { |
837 | tree t = gimple_boolify (OMP_CLAUSE_IF_EXPR (ifc)(*(omp_clause_elt_check (((omp_clause_subcode_check ((ifc), ( OMP_CLAUSE_IF), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 837, __FUNCTION__))), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 837, __FUNCTION__)))); |
838 | t = fold_build3_loc (loc, COND_EXPR, unsigned_type_nodeinteger_types[itk_unsigned_int], t, |
839 | build_int_cst (unsigned_type_nodeinteger_types[itk_unsigned_int], |
840 | GOMP_TASK_FLAG_IF(1 << 10)), |
841 | build_int_cst (unsigned_type_nodeinteger_types[itk_unsigned_int], 0)); |
842 | flags = fold_build2_loc (loc, PLUS_EXPR, unsigned_type_nodeinteger_types[itk_unsigned_int], |
843 | flags, t); |
844 | } |
845 | else |
846 | cond = gimple_boolify (OMP_CLAUSE_IF_EXPR (ifc)(*(omp_clause_elt_check (((omp_clause_subcode_check ((ifc), ( OMP_CLAUSE_IF), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 846, __FUNCTION__))), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 846, __FUNCTION__)))); |
847 | } |
848 | |
849 | if (finalc) |
850 | { |
851 | tree t = gimple_boolify (OMP_CLAUSE_FINAL_EXPR (finalc)(*(omp_clause_elt_check (((omp_clause_subcode_check ((finalc) , (OMP_CLAUSE_FINAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 851, __FUNCTION__))), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 851, __FUNCTION__)))); |
852 | t = fold_build3_loc (loc, COND_EXPR, unsigned_type_nodeinteger_types[itk_unsigned_int], t, |
853 | build_int_cst (unsigned_type_nodeinteger_types[itk_unsigned_int], |
854 | GOMP_TASK_FLAG_FINAL(1 << 1)), |
855 | build_int_cst (unsigned_type_nodeinteger_types[itk_unsigned_int], 0)); |
856 | flags = fold_build2_loc (loc, PLUS_EXPR, unsigned_type_nodeinteger_types[itk_unsigned_int], flags, t); |
857 | } |
858 | if (depend) |
859 | depend = OMP_CLAUSE_DECL (depend)(*(omp_clause_elt_check (((omp_clause_range_check (((tree_check ((depend), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 859, __FUNCTION__, (OMP_CLAUSE)))), (OMP_CLAUSE_PRIVATE), ( OMP_CLAUSE__SCANTEMP_), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 859, __FUNCTION__))), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 859, __FUNCTION__))); |
860 | else |
861 | depend = build_int_cst (ptr_type_nodeglobal_trees[TI_PTR_TYPE], 0); |
862 | if (priority) |
863 | priority = fold_convert (integer_type_node,fold_convert_loc (((location_t) 0), integer_types[itk_int], ( *(omp_clause_elt_check (((omp_clause_subcode_check ((priority ), (OMP_CLAUSE_PRIORITY), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 864, __FUNCTION__))), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 864, __FUNCTION__)))) |
864 | OMP_CLAUSE_PRIORITY_EXPR (priority))fold_convert_loc (((location_t) 0), integer_types[itk_int], ( *(omp_clause_elt_check (((omp_clause_subcode_check ((priority ), (OMP_CLAUSE_PRIORITY), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 864, __FUNCTION__))), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 864, __FUNCTION__)))); |
865 | else |
866 | priority = integer_zero_nodeglobal_trees[TI_INTEGER_ZERO]; |
867 | |
868 | gsi = gsi_last_nondebug_bb (bb); |
869 | |
870 | detach = (detach |
871 | ? build_fold_addr_expr (OMP_CLAUSE_DECL (detach))build_fold_addr_expr_loc (((location_t) 0), ((*(omp_clause_elt_check (((omp_clause_range_check (((tree_check ((detach), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 871, __FUNCTION__, (OMP_CLAUSE)))), (OMP_CLAUSE_PRIVATE), ( OMP_CLAUSE__SCANTEMP_), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 871, __FUNCTION__))), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 871, __FUNCTION__))))) |
872 | : null_pointer_nodeglobal_trees[TI_NULL_POINTER]); |
873 | |
874 | tree t = gimple_omp_task_data_arg (entry_stmt); |
875 | if (t == NULLnullptr) |
876 | t2 = null_pointer_nodeglobal_trees[TI_NULL_POINTER]; |
877 | else |
878 | t2 = build_fold_addr_expr_loc (loc, t); |
879 | t1 = build_fold_addr_expr_loc (loc, gimple_omp_task_child_fn (entry_stmt)); |
880 | t = gimple_omp_task_copy_fn (entry_stmt); |
881 | if (t == NULLnullptr) |
882 | t3 = null_pointer_nodeglobal_trees[TI_NULL_POINTER]; |
883 | else |
884 | t3 = build_fold_addr_expr_loc (loc, t); |
885 | |
886 | if (taskloop_p) |
887 | t = build_call_expr (ull |
888 | ? builtin_decl_explicit (BUILT_IN_GOMP_TASKLOOP_ULL) |
889 | : builtin_decl_explicit (BUILT_IN_GOMP_TASKLOOP), |
890 | 11, t1, t2, t3, |
891 | gimple_omp_task_arg_size (entry_stmt), |
892 | gimple_omp_task_arg_align (entry_stmt), flags, |
893 | num_tasks, priority, startvar, endvar, step); |
894 | else |
895 | t = build_call_expr (builtin_decl_explicit (BUILT_IN_GOMP_TASK), |
896 | 10, t1, t2, t3, |
897 | gimple_omp_task_arg_size (entry_stmt), |
898 | gimple_omp_task_arg_align (entry_stmt), cond, flags, |
899 | depend, priority, detach); |
900 | |
901 | force_gimple_operand_gsi (&gsi, t, true, NULL_TREE(tree) nullptr, |
902 | false, GSI_CONTINUE_LINKING); |
903 | } |
904 | |
905 | /* Build the function call to GOMP_taskwait_depend to actually |
906 | generate the taskwait operation. BB is the block where to insert the |
907 | code. */ |
908 | |
909 | static void |
910 | expand_taskwait_call (basic_block bb, gomp_task *entry_stmt) |
911 | { |
912 | tree clauses = gimple_omp_task_clauses (entry_stmt); |
913 | tree depend = omp_find_clause (clauses, OMP_CLAUSE_DEPEND); |
914 | if (depend == NULL_TREE(tree) nullptr) |
915 | return; |
916 | |
917 | depend = OMP_CLAUSE_DECL (depend)(*(omp_clause_elt_check (((omp_clause_range_check (((tree_check ((depend), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 917, __FUNCTION__, (OMP_CLAUSE)))), (OMP_CLAUSE_PRIVATE), ( OMP_CLAUSE__SCANTEMP_), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 917, __FUNCTION__))), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 917, __FUNCTION__))); |
918 | |
919 | bool nowait = omp_find_clause (clauses, OMP_CLAUSE_NOWAIT) != NULL_TREE(tree) nullptr; |
920 | gimple_stmt_iterator gsi = gsi_last_nondebug_bb (bb); |
921 | enum built_in_function f = (nowait |
922 | ? BUILT_IN_GOMP_TASKWAIT_DEPEND_NOWAIT |
923 | : BUILT_IN_GOMP_TASKWAIT_DEPEND); |
924 | tree t = build_call_expr (builtin_decl_explicit (f), 1, depend); |
925 | |
926 | force_gimple_operand_gsi (&gsi, t, true, NULL_TREE(tree) nullptr, |
927 | false, GSI_CONTINUE_LINKING); |
928 | } |
929 | |
930 | /* Build the function call to GOMP_teams_reg to actually |
931 | generate the host teams operation. REGION is the teams region |
932 | being expanded. BB is the block where to insert the code. */ |
933 | |
934 | static void |
935 | expand_teams_call (basic_block bb, gomp_teams *entry_stmt) |
936 | { |
937 | tree clauses = gimple_omp_teams_clauses (entry_stmt); |
938 | tree num_teams = omp_find_clause (clauses, OMP_CLAUSE_NUM_TEAMS); |
939 | if (num_teams == NULL_TREE(tree) nullptr) |
940 | num_teams = build_int_cst (unsigned_type_nodeinteger_types[itk_unsigned_int], 0); |
941 | else |
942 | { |
943 | num_teams = OMP_CLAUSE_NUM_TEAMS_UPPER_EXPR (num_teams)(*(omp_clause_elt_check (((omp_clause_subcode_check ((num_teams ), (OMP_CLAUSE_NUM_TEAMS), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 943, __FUNCTION__))), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 943, __FUNCTION__))); |
944 | num_teams = fold_convert (unsigned_type_node, num_teams)fold_convert_loc (((location_t) 0), integer_types[itk_unsigned_int ], num_teams); |
945 | } |
946 | tree thread_limit = omp_find_clause (clauses, OMP_CLAUSE_THREAD_LIMIT); |
947 | if (thread_limit == NULL_TREE(tree) nullptr) |
948 | thread_limit = build_int_cst (unsigned_type_nodeinteger_types[itk_unsigned_int], 0); |
949 | else |
950 | { |
951 | thread_limit = OMP_CLAUSE_THREAD_LIMIT_EXPR (thread_limit)(*(omp_clause_elt_check (((omp_clause_subcode_check ((thread_limit ), (OMP_CLAUSE_THREAD_LIMIT), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 951, __FUNCTION__))), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 951, __FUNCTION__))); |
952 | thread_limit = fold_convert (unsigned_type_node, thread_limit)fold_convert_loc (((location_t) 0), integer_types[itk_unsigned_int ], thread_limit); |
953 | } |
954 | |
955 | gimple_stmt_iterator gsi = gsi_last_nondebug_bb (bb); |
956 | tree t = gimple_omp_teams_data_arg (entry_stmt), t1; |
957 | if (t == NULLnullptr) |
958 | t1 = null_pointer_nodeglobal_trees[TI_NULL_POINTER]; |
959 | else |
960 | t1 = build_fold_addr_expr (t)build_fold_addr_expr_loc (((location_t) 0), (t)); |
961 | tree child_fndecl = gimple_omp_teams_child_fn (entry_stmt); |
962 | tree t2 = build_fold_addr_expr (child_fndecl)build_fold_addr_expr_loc (((location_t) 0), (child_fndecl)); |
963 | |
964 | vec<tree, va_gc> *args; |
965 | vec_alloc (args, 5); |
966 | args->quick_push (t2); |
967 | args->quick_push (t1); |
968 | args->quick_push (num_teams); |
969 | args->quick_push (thread_limit); |
970 | /* For future extensibility. */ |
971 | args->quick_push (build_zero_cst (unsigned_type_nodeinteger_types[itk_unsigned_int])); |
972 | |
973 | t = build_call_expr_loc_vec (UNKNOWN_LOCATION((location_t) 0), |
974 | builtin_decl_explicit (BUILT_IN_GOMP_TEAMS_REG), |
975 | args); |
976 | |
977 | force_gimple_operand_gsi (&gsi, t, true, NULL_TREE(tree) nullptr, |
978 | false, GSI_CONTINUE_LINKING); |
979 | } |
980 | |
981 | /* Chain all the DECLs in LIST by their TREE_CHAIN fields. */ |
982 | |
983 | static tree |
984 | vec2chain (vec<tree, va_gc> *v) |
985 | { |
986 | tree chain = NULL_TREE(tree) nullptr, t; |
987 | unsigned ix; |
988 | |
989 | FOR_EACH_VEC_SAFE_ELT_REVERSE (v, ix, t)for (ix = vec_safe_length (v) - 1; vec_safe_iterate ((v), (ix ), &(t)); (ix)--) |
990 | { |
991 | DECL_CHAIN (t)(((contains_struct_check (((contains_struct_check ((t), (TS_DECL_MINIMAL ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 991, __FUNCTION__))), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 991, __FUNCTION__))->common.chain)) = chain; |
992 | chain = t; |
993 | } |
994 | |
995 | return chain; |
996 | } |
997 | |
998 | /* Remove barriers in REGION->EXIT's block. Note that this is only |
999 | valid for GIMPLE_OMP_PARALLEL regions. Since the end of a parallel region |
1000 | is an implicit barrier, any workshare inside the GIMPLE_OMP_PARALLEL that |
1001 | left a barrier at the end of the GIMPLE_OMP_PARALLEL region can now be |
1002 | removed. */ |
1003 | |
1004 | static void |
1005 | remove_exit_barrier (struct omp_region *region) |
1006 | { |
1007 | gimple_stmt_iterator gsi; |
1008 | basic_block exit_bb; |
1009 | edge_iterator ei; |
1010 | edge e; |
1011 | gimple *stmt; |
1012 | int any_addressable_vars = -1; |
1013 | |
1014 | exit_bb = region->exit; |
1015 | |
1016 | /* If the parallel region doesn't return, we don't have REGION->EXIT |
1017 | block at all. */ |
1018 | if (! exit_bb) |
1019 | return; |
1020 | |
1021 | /* The last insn in the block will be the parallel's GIMPLE_OMP_RETURN. The |
1022 | workshare's GIMPLE_OMP_RETURN will be in a preceding block. The kinds of |
1023 | statements that can appear in between are extremely limited -- no |
1024 | memory operations at all. Here, we allow nothing at all, so the |
1025 | only thing we allow to precede this GIMPLE_OMP_RETURN is a label. */ |
1026 | gsi = gsi_last_nondebug_bb (exit_bb); |
1027 | gcc_assert (gimple_code (gsi_stmt (gsi)) == GIMPLE_OMP_RETURN)((void)(!(gimple_code (gsi_stmt (gsi)) == GIMPLE_OMP_RETURN) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1027, __FUNCTION__), 0 : 0)); |
1028 | gsi_prev_nondebug (&gsi); |
1029 | if (!gsi_end_p (gsi) && gimple_code (gsi_stmt (gsi)) != GIMPLE_LABEL) |
1030 | return; |
1031 | |
1032 | FOR_EACH_EDGE (e, ei, exit_bb->preds)for ((ei) = ei_start_1 (&((exit_bb->preds))); ei_cond ( (ei), &(e)); ei_next (&(ei))) |
1033 | { |
1034 | gsi = gsi_last_nondebug_bb (e->src); |
1035 | if (gsi_end_p (gsi)) |
1036 | continue; |
1037 | stmt = gsi_stmt (gsi); |
1038 | if (gimple_code (stmt) == GIMPLE_OMP_RETURN |
1039 | && !gimple_omp_return_nowait_p (stmt)) |
1040 | { |
1041 | /* OpenMP 3.0 tasks unfortunately prevent this optimization |
1042 | in many cases. If there could be tasks queued, the barrier |
1043 | might be needed to let the tasks run before some local |
1044 | variable of the parallel that the task uses as shared |
1045 | runs out of scope. The task can be spawned either |
1046 | from within current function (this would be easy to check) |
1047 | or from some function it calls and gets passed an address |
1048 | of such a variable. */ |
1049 | if (any_addressable_vars < 0) |
1050 | { |
1051 | gomp_parallel *parallel_stmt |
1052 | = as_a <gomp_parallel *> (last_stmt (region->entry)); |
1053 | tree child_fun = gimple_omp_parallel_child_fn (parallel_stmt); |
1054 | tree local_decls, block, decl; |
1055 | unsigned ix; |
1056 | |
1057 | any_addressable_vars = 0; |
1058 | FOR_EACH_LOCAL_DECL (DECL_STRUCT_FUNCTION (child_fun), ix, decl)for (ix = vec_safe_length ((((tree_check ((child_fun), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1058, __FUNCTION__, (FUNCTION_DECL)))->function_decl.f)) ->local_decls) - 1; vec_safe_iterate (((((tree_check ((child_fun ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1058, __FUNCTION__, (FUNCTION_DECL)))->function_decl.f)) ->local_decls), (ix), &(decl)); (ix)--) |
1059 | if (TREE_ADDRESSABLE (decl)((decl)->base.addressable_flag)) |
1060 | { |
1061 | any_addressable_vars = 1; |
1062 | break; |
1063 | } |
1064 | for (block = gimple_block (stmt); |
1065 | !any_addressable_vars |
1066 | && block |
1067 | && TREE_CODE (block)((enum tree_code) (block)->base.code) == BLOCK; |
1068 | block = BLOCK_SUPERCONTEXT (block)((tree_check ((block), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1068, __FUNCTION__, (BLOCK)))->block.supercontext)) |
1069 | { |
1070 | for (local_decls = BLOCK_VARS (block)((tree_check ((block), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1070, __FUNCTION__, (BLOCK)))->block.vars); |
1071 | local_decls; |
1072 | local_decls = DECL_CHAIN (local_decls)(((contains_struct_check (((contains_struct_check ((local_decls ), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1072, __FUNCTION__))), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1072, __FUNCTION__))->common.chain))) |
1073 | if (TREE_ADDRESSABLE (local_decls)((local_decls)->base.addressable_flag)) |
1074 | { |
1075 | any_addressable_vars = 1; |
1076 | break; |
1077 | } |
1078 | if (block == gimple_block (parallel_stmt)) |
1079 | break; |
1080 | } |
1081 | } |
1082 | if (!any_addressable_vars) |
1083 | gimple_omp_return_set_nowait (stmt); |
1084 | } |
1085 | } |
1086 | } |
1087 | |
1088 | static void |
1089 | remove_exit_barriers (struct omp_region *region) |
1090 | { |
1091 | if (region->type == GIMPLE_OMP_PARALLEL) |
1092 | remove_exit_barrier (region); |
1093 | |
1094 | if (region->inner) |
1095 | { |
1096 | region = region->inner; |
1097 | remove_exit_barriers (region); |
1098 | while (region->next) |
1099 | { |
1100 | region = region->next; |
1101 | remove_exit_barriers (region); |
1102 | } |
1103 | } |
1104 | } |
1105 | |
1106 | /* Optimize omp_get_thread_num () and omp_get_num_threads () |
1107 | calls. These can't be declared as const functions, but |
1108 | within one parallel body they are constant, so they can be |
1109 | transformed there into __builtin_omp_get_{thread_num,num_threads} () |
1110 | which are declared const. Similarly for task body, except |
1111 | that in untied task omp_get_thread_num () can change at any task |
1112 | scheduling point. */ |
1113 | |
1114 | static void |
1115 | optimize_omp_library_calls (gimple *entry_stmt) |
1116 | { |
1117 | basic_block bb; |
1118 | gimple_stmt_iterator gsi; |
1119 | tree thr_num_tree = builtin_decl_explicit (BUILT_IN_OMP_GET_THREAD_NUM); |
1120 | tree thr_num_id = DECL_ASSEMBLER_NAME (thr_num_tree)decl_assembler_name (thr_num_tree); |
1121 | tree num_thr_tree = builtin_decl_explicit (BUILT_IN_OMP_GET_NUM_THREADS); |
1122 | tree num_thr_id = DECL_ASSEMBLER_NAME (num_thr_tree)decl_assembler_name (num_thr_tree); |
1123 | bool untied_task = (gimple_code (entry_stmt) == GIMPLE_OMP_TASK |
1124 | && omp_find_clause (gimple_omp_task_clauses (entry_stmt), |
1125 | OMP_CLAUSE_UNTIED) != NULLnullptr); |
1126 | |
1127 | FOR_EACH_BB_FN (bb, cfun)for (bb = ((cfun + 0))->cfg->x_entry_block_ptr->next_bb ; bb != ((cfun + 0))->cfg->x_exit_block_ptr; bb = bb-> next_bb) |
1128 | for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi)) |
1129 | { |
1130 | gimple *call = gsi_stmt (gsi); |
1131 | tree decl; |
1132 | |
1133 | if (is_gimple_call (call) |
1134 | && (decl = gimple_call_fndecl (call)) |
1135 | && DECL_EXTERNAL (decl)((contains_struct_check ((decl), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1135, __FUNCTION__))->decl_common.decl_flag_1) |
1136 | && TREE_PUBLIC (decl)((decl)->base.public_flag) |
1137 | && DECL_INITIAL (decl)((contains_struct_check ((decl), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1137, __FUNCTION__))->decl_common.initial) == NULLnullptr) |
1138 | { |
1139 | tree built_in; |
1140 | |
1141 | if (DECL_NAME (decl)((contains_struct_check ((decl), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1141, __FUNCTION__))->decl_minimal.name) == thr_num_id) |
1142 | { |
1143 | /* In #pragma omp task untied omp_get_thread_num () can change |
1144 | during the execution of the task region. */ |
1145 | if (untied_task) |
1146 | continue; |
1147 | built_in = builtin_decl_explicit (BUILT_IN_OMP_GET_THREAD_NUM); |
1148 | } |
1149 | else if (DECL_NAME (decl)((contains_struct_check ((decl), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1149, __FUNCTION__))->decl_minimal.name) == num_thr_id) |
1150 | built_in = builtin_decl_explicit (BUILT_IN_OMP_GET_NUM_THREADS); |
1151 | else |
1152 | continue; |
1153 | |
1154 | if (DECL_ASSEMBLER_NAME (decl)decl_assembler_name (decl) != DECL_ASSEMBLER_NAME (built_in)decl_assembler_name (built_in) |
1155 | || gimple_call_num_args (call) != 0) |
1156 | continue; |
1157 | |
1158 | if (flag_exceptionsglobal_options.x_flag_exceptions && !TREE_NOTHROW (decl)((decl)->base.nothrow_flag)) |
1159 | continue; |
1160 | |
1161 | if (TREE_CODE (TREE_TYPE (decl))((enum tree_code) (((contains_struct_check ((decl), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1161, __FUNCTION__))->typed.type))->base.code) != FUNCTION_TYPE |
1162 | || !types_compatible_p (TREE_TYPE (TREE_TYPE (decl))((contains_struct_check ((((contains_struct_check ((decl), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1162, __FUNCTION__))->typed.type)), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1162, __FUNCTION__))->typed.type), |
1163 | TREE_TYPE (TREE_TYPE (built_in))((contains_struct_check ((((contains_struct_check ((built_in) , (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1163, __FUNCTION__))->typed.type)), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1163, __FUNCTION__))->typed.type))) |
1164 | continue; |
1165 | |
1166 | gimple_call_set_fndecl (call, built_in); |
1167 | } |
1168 | } |
1169 | } |
1170 | |
1171 | /* Callback for expand_omp_build_assign. Return non-NULL if *tp needs to be |
1172 | regimplified. */ |
1173 | |
1174 | static tree |
1175 | expand_omp_regimplify_p (tree *tp, int *walk_subtrees, void *) |
1176 | { |
1177 | tree t = *tp; |
1178 | |
1179 | /* Any variable with DECL_VALUE_EXPR needs to be regimplified. */ |
1180 | if (VAR_P (t)(((enum tree_code) (t)->base.code) == VAR_DECL) && DECL_HAS_VALUE_EXPR_P (t)((tree_check3 ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1180, __FUNCTION__, (VAR_DECL), (PARM_DECL), (RESULT_DECL)) ) ->decl_common.decl_flag_2)) |
1181 | return t; |
1182 | |
1183 | if (TREE_CODE (t)((enum tree_code) (t)->base.code) == ADDR_EXPR) |
1184 | recompute_tree_invariant_for_addr_expr (t); |
1185 | |
1186 | *walk_subtrees = !TYPE_P (t)(tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code ) (t)->base.code))] == tcc_type) && !DECL_P (t)(tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code ) (t)->base.code))] == tcc_declaration); |
1187 | return NULL_TREE(tree) nullptr; |
1188 | } |
1189 | |
1190 | /* Prepend or append TO = FROM assignment before or after *GSI_P. */ |
1191 | |
1192 | static void |
1193 | expand_omp_build_assign (gimple_stmt_iterator *gsi_p, tree to, tree from, |
1194 | bool after) |
1195 | { |
1196 | bool simple_p = DECL_P (to)(tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code ) (to)->base.code))] == tcc_declaration) && TREE_ADDRESSABLE (to)((to)->base.addressable_flag); |
1197 | from = force_gimple_operand_gsi (gsi_p, from, simple_p, NULL_TREE(tree) nullptr, |
1198 | !after, after ? GSI_CONTINUE_LINKING |
1199 | : GSI_SAME_STMT); |
1200 | gimple *stmt = gimple_build_assign (to, from); |
1201 | if (after) |
1202 | gsi_insert_after (gsi_p, stmt, GSI_CONTINUE_LINKING); |
1203 | else |
1204 | gsi_insert_before (gsi_p, stmt, GSI_SAME_STMT); |
1205 | if (walk_tree (&from, expand_omp_regimplify_p, NULL, NULL)walk_tree_1 (&from, expand_omp_regimplify_p, nullptr, nullptr , nullptr) |
1206 | || walk_tree (&to, expand_omp_regimplify_p, NULL, NULL)walk_tree_1 (&to, expand_omp_regimplify_p, nullptr, nullptr , nullptr)) |
1207 | { |
1208 | gimple_stmt_iterator gsi = gsi_for_stmt (stmt); |
1209 | gimple_regimplify_operands (stmt, &gsi); |
1210 | } |
1211 | } |
1212 | |
1213 | /* Prepend or append LHS CODE RHS condition before or after *GSI_P. */ |
1214 | |
1215 | static gcond * |
1216 | expand_omp_build_cond (gimple_stmt_iterator *gsi_p, enum tree_code code, |
1217 | tree lhs, tree rhs, bool after = false) |
1218 | { |
1219 | gcond *cond_stmt = gimple_build_cond (code, lhs, rhs, NULL_TREE(tree) nullptr, NULL_TREE(tree) nullptr); |
1220 | if (after) |
1221 | gsi_insert_after (gsi_p, cond_stmt, GSI_CONTINUE_LINKING); |
1222 | else |
1223 | gsi_insert_before (gsi_p, cond_stmt, GSI_SAME_STMT); |
1224 | if (walk_tree (gimple_cond_lhs_ptr (cond_stmt), expand_omp_regimplify_p,walk_tree_1 (gimple_cond_lhs_ptr (cond_stmt), expand_omp_regimplify_p , nullptr, nullptr, nullptr) |
1225 | NULL, NULL)walk_tree_1 (gimple_cond_lhs_ptr (cond_stmt), expand_omp_regimplify_p , nullptr, nullptr, nullptr) |
1226 | || walk_tree (gimple_cond_rhs_ptr (cond_stmt), expand_omp_regimplify_p,walk_tree_1 (gimple_cond_rhs_ptr (cond_stmt), expand_omp_regimplify_p , nullptr, nullptr, nullptr) |
1227 | NULL, NULL)walk_tree_1 (gimple_cond_rhs_ptr (cond_stmt), expand_omp_regimplify_p , nullptr, nullptr, nullptr)) |
1228 | { |
1229 | gimple_stmt_iterator gsi = gsi_for_stmt (cond_stmt); |
1230 | gimple_regimplify_operands (cond_stmt, &gsi); |
1231 | } |
1232 | return cond_stmt; |
1233 | } |
1234 | |
1235 | /* Expand the OpenMP parallel or task directive starting at REGION. */ |
1236 | |
1237 | static void |
1238 | expand_omp_taskreg (struct omp_region *region) |
1239 | { |
1240 | basic_block entry_bb, exit_bb, new_bb; |
1241 | struct function *child_cfun; |
1242 | tree child_fn, block, t; |
1243 | gimple_stmt_iterator gsi; |
1244 | gimple *entry_stmt, *stmt; |
1245 | edge e; |
1246 | vec<tree, va_gc> *ws_args; |
1247 | |
1248 | entry_stmt = last_stmt (region->entry); |
1249 | if (gimple_code (entry_stmt) == GIMPLE_OMP_TASK |
1250 | && gimple_omp_task_taskwait_p (entry_stmt)) |
1251 | { |
1252 | new_bb = region->entry; |
1253 | gsi = gsi_last_nondebug_bb (region->entry); |
1254 | gcc_assert (gimple_code (gsi_stmt (gsi)) == GIMPLE_OMP_TASK)((void)(!(gimple_code (gsi_stmt (gsi)) == GIMPLE_OMP_TASK) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1254, __FUNCTION__), 0 : 0)); |
1255 | gsi_remove (&gsi, true); |
1256 | expand_taskwait_call (new_bb, as_a <gomp_task *> (entry_stmt)); |
1257 | return; |
1258 | } |
1259 | |
1260 | child_fn = gimple_omp_taskreg_child_fn (entry_stmt); |
1261 | child_cfun = DECL_STRUCT_FUNCTION (child_fn)((tree_check ((child_fn), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1261, __FUNCTION__, (FUNCTION_DECL)))->function_decl.f); |
1262 | |
1263 | entry_bb = region->entry; |
1264 | if (gimple_code (entry_stmt) == GIMPLE_OMP_TASK) |
1265 | exit_bb = region->cont; |
1266 | else |
1267 | exit_bb = region->exit; |
1268 | |
1269 | if (is_combined_parallel (region)) |
1270 | ws_args = region->ws_args; |
1271 | else |
1272 | ws_args = NULLnullptr; |
1273 | |
1274 | if (child_cfun->cfg) |
1275 | { |
1276 | /* Due to inlining, it may happen that we have already outlined |
1277 | the region, in which case all we need to do is make the |
1278 | sub-graph unreachable and emit the parallel call. */ |
1279 | edge entry_succ_e, exit_succ_e; |
1280 | |
1281 | entry_succ_e = single_succ_edge (entry_bb); |
1282 | |
1283 | gsi = gsi_last_nondebug_bb (entry_bb); |
1284 | gcc_assert (gimple_code (gsi_stmt (gsi)) == GIMPLE_OMP_PARALLEL((void)(!(gimple_code (gsi_stmt (gsi)) == GIMPLE_OMP_PARALLEL || gimple_code (gsi_stmt (gsi)) == GIMPLE_OMP_TASK || gimple_code (gsi_stmt (gsi)) == GIMPLE_OMP_TEAMS) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1286, __FUNCTION__), 0 : 0)) |
1285 | || gimple_code (gsi_stmt (gsi)) == GIMPLE_OMP_TASK((void)(!(gimple_code (gsi_stmt (gsi)) == GIMPLE_OMP_PARALLEL || gimple_code (gsi_stmt (gsi)) == GIMPLE_OMP_TASK || gimple_code (gsi_stmt (gsi)) == GIMPLE_OMP_TEAMS) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1286, __FUNCTION__), 0 : 0)) |
1286 | || gimple_code (gsi_stmt (gsi)) == GIMPLE_OMP_TEAMS)((void)(!(gimple_code (gsi_stmt (gsi)) == GIMPLE_OMP_PARALLEL || gimple_code (gsi_stmt (gsi)) == GIMPLE_OMP_TASK || gimple_code (gsi_stmt (gsi)) == GIMPLE_OMP_TEAMS) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1286, __FUNCTION__), 0 : 0)); |
1287 | gsi_remove (&gsi, true); |
1288 | |
1289 | new_bb = entry_bb; |
1290 | if (exit_bb) |
1291 | { |
1292 | exit_succ_e = single_succ_edge (exit_bb); |
1293 | make_edge (new_bb, exit_succ_e->dest, EDGE_FALLTHRU); |
1294 | } |
1295 | remove_edge_and_dominated_blocks (entry_succ_e); |
1296 | } |
1297 | else |
1298 | { |
1299 | unsigned srcidx, dstidx, num; |
1300 | |
1301 | /* If the parallel region needs data sent from the parent |
1302 | function, then the very first statement (except possible |
1303 | tree profile counter updates) of the parallel body |
1304 | is a copy assignment .OMP_DATA_I = &.OMP_DATA_O. Since |
1305 | &.OMP_DATA_O is passed as an argument to the child function, |
1306 | we need to replace it with the argument as seen by the child |
1307 | function. |
1308 | |
1309 | In most cases, this will end up being the identity assignment |
1310 | .OMP_DATA_I = .OMP_DATA_I. However, if the parallel body had |
1311 | a function call that has been inlined, the original PARM_DECL |
1312 | .OMP_DATA_I may have been converted into a different local |
1313 | variable. In which case, we need to keep the assignment. */ |
1314 | if (gimple_omp_taskreg_data_arg (entry_stmt)) |
1315 | { |
1316 | basic_block entry_succ_bb |
1317 | = single_succ_p (entry_bb) ? single_succ (entry_bb) |
1318 | : FALLTHRU_EDGE (entry_bb)((*((entry_bb))->succs)[(0)]->flags & EDGE_FALLTHRU ? (*((entry_bb))->succs)[(0)] : (*((entry_bb))->succs) [(1)])->dest; |
1319 | tree arg; |
1320 | gimple *parcopy_stmt = NULLnullptr; |
1321 | |
1322 | for (gsi = gsi_start_bb (entry_succ_bb); ; gsi_next (&gsi)) |
1323 | { |
1324 | gimple *stmt; |
1325 | |
1326 | gcc_assert (!gsi_end_p (gsi))((void)(!(!gsi_end_p (gsi)) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1326, __FUNCTION__), 0 : 0)); |
1327 | stmt = gsi_stmt (gsi); |
1328 | if (gimple_code (stmt) != GIMPLE_ASSIGN) |
1329 | continue; |
1330 | |
1331 | if (gimple_num_ops (stmt) == 2) |
1332 | { |
1333 | tree arg = gimple_assign_rhs1 (stmt); |
1334 | |
1335 | /* We're ignore the subcode because we're |
1336 | effectively doing a STRIP_NOPS. */ |
1337 | |
1338 | if (TREE_CODE (arg)((enum tree_code) (arg)->base.code) == ADDR_EXPR |
1339 | && (TREE_OPERAND (arg, 0)(*((const_cast<tree*> (tree_operand_check ((arg), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1339, __FUNCTION__))))) |
1340 | == gimple_omp_taskreg_data_arg (entry_stmt))) |
1341 | { |
1342 | parcopy_stmt = stmt; |
1343 | break; |
1344 | } |
1345 | } |
1346 | } |
1347 | |
1348 | gcc_assert (parcopy_stmt != NULL)((void)(!(parcopy_stmt != nullptr) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1348, __FUNCTION__), 0 : 0)); |
1349 | arg = DECL_ARGUMENTS (child_fn)((tree_check ((child_fn), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1349, __FUNCTION__, (FUNCTION_DECL)))->function_decl.arguments ); |
1350 | |
1351 | if (!gimple_in_ssa_p (cfun(cfun + 0))) |
1352 | { |
1353 | if (gimple_assign_lhs (parcopy_stmt) == arg) |
1354 | gsi_remove (&gsi, true); |
1355 | else |
1356 | { |
1357 | /* ?? Is setting the subcode really necessary ?? */ |
1358 | gimple_omp_set_subcode (parcopy_stmt, TREE_CODE (arg)((enum tree_code) (arg)->base.code)); |
1359 | gimple_assign_set_rhs1 (parcopy_stmt, arg); |
1360 | } |
1361 | } |
1362 | else |
1363 | { |
1364 | tree lhs = gimple_assign_lhs (parcopy_stmt); |
1365 | gcc_assert (SSA_NAME_VAR (lhs) == arg)((void)(!(((tree_check ((lhs), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1365, __FUNCTION__, (SSA_NAME)))->ssa_name.var == (tree) nullptr || ((enum tree_code) ((lhs)->ssa_name.var)->base .code) == IDENTIFIER_NODE ? (tree) nullptr : (lhs)->ssa_name .var) == arg) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1365, __FUNCTION__), 0 : 0)); |
1366 | /* We'd like to set the rhs to the default def in the child_fn, |
1367 | but it's too early to create ssa names in the child_fn. |
1368 | Instead, we set the rhs to the parm. In |
1369 | move_sese_region_to_fn, we introduce a default def for the |
1370 | parm, map the parm to it's default def, and once we encounter |
1371 | this stmt, replace the parm with the default def. */ |
1372 | gimple_assign_set_rhs1 (parcopy_stmt, arg); |
1373 | update_stmt (parcopy_stmt); |
1374 | } |
1375 | } |
1376 | |
1377 | /* Declare local variables needed in CHILD_CFUN. */ |
1378 | block = DECL_INITIAL (child_fn)((contains_struct_check ((child_fn), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1378, __FUNCTION__))->decl_common.initial); |
1379 | BLOCK_VARS (block)((tree_check ((block), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1379, __FUNCTION__, (BLOCK)))->block.vars) = vec2chain (child_cfun->local_decls); |
1380 | /* The gimplifier could record temporaries in parallel/task block |
1381 | rather than in containing function's local_decls chain, |
1382 | which would mean cgraph missed finalizing them. Do it now. */ |
1383 | for (t = BLOCK_VARS (block)((tree_check ((block), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1383, __FUNCTION__, (BLOCK)))->block.vars); t; t = DECL_CHAIN (t)(((contains_struct_check (((contains_struct_check ((t), (TS_DECL_MINIMAL ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1383, __FUNCTION__))), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1383, __FUNCTION__))->common.chain))) |
1384 | if (VAR_P (t)(((enum tree_code) (t)->base.code) == VAR_DECL) && TREE_STATIC (t)((t)->base.static_flag) && !DECL_EXTERNAL (t)((contains_struct_check ((t), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1384, __FUNCTION__))->decl_common.decl_flag_1)) |
1385 | varpool_node::finalize_decl (t); |
1386 | DECL_SAVED_TREE (child_fn)((tree_check ((child_fn), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1386, __FUNCTION__, (FUNCTION_DECL)))->function_decl.saved_tree ) = NULLnullptr; |
1387 | /* We'll create a CFG for child_fn, so no gimple body is needed. */ |
1388 | gimple_set_body (child_fn, NULLnullptr); |
1389 | TREE_USED (block)((block)->base.used_flag) = 1; |
1390 | |
1391 | /* Reset DECL_CONTEXT on function arguments. */ |
1392 | for (t = DECL_ARGUMENTS (child_fn)((tree_check ((child_fn), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1392, __FUNCTION__, (FUNCTION_DECL)))->function_decl.arguments ); t; t = DECL_CHAIN (t)(((contains_struct_check (((contains_struct_check ((t), (TS_DECL_MINIMAL ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1392, __FUNCTION__))), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1392, __FUNCTION__))->common.chain))) |
1393 | DECL_CONTEXT (t)((contains_struct_check ((t), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1393, __FUNCTION__))->decl_minimal.context) = child_fn; |
1394 | |
1395 | /* Split ENTRY_BB at GIMPLE_OMP_PARALLEL or GIMPLE_OMP_TASK, |
1396 | so that it can be moved to the child function. */ |
1397 | gsi = gsi_last_nondebug_bb (entry_bb); |
1398 | stmt = gsi_stmt (gsi); |
1399 | gcc_assert (stmt && (gimple_code (stmt) == GIMPLE_OMP_PARALLEL((void)(!(stmt && (gimple_code (stmt) == GIMPLE_OMP_PARALLEL || gimple_code (stmt) == GIMPLE_OMP_TASK || gimple_code (stmt ) == GIMPLE_OMP_TEAMS)) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1401, __FUNCTION__), 0 : 0)) |
1400 | || gimple_code (stmt) == GIMPLE_OMP_TASK((void)(!(stmt && (gimple_code (stmt) == GIMPLE_OMP_PARALLEL || gimple_code (stmt) == GIMPLE_OMP_TASK || gimple_code (stmt ) == GIMPLE_OMP_TEAMS)) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1401, __FUNCTION__), 0 : 0)) |
1401 | || gimple_code (stmt) == GIMPLE_OMP_TEAMS))((void)(!(stmt && (gimple_code (stmt) == GIMPLE_OMP_PARALLEL || gimple_code (stmt) == GIMPLE_OMP_TASK || gimple_code (stmt ) == GIMPLE_OMP_TEAMS)) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1401, __FUNCTION__), 0 : 0)); |
1402 | e = split_block (entry_bb, stmt); |
1403 | gsi_remove (&gsi, true); |
1404 | entry_bb = e->dest; |
1405 | edge e2 = NULLnullptr; |
1406 | if (gimple_code (entry_stmt) != GIMPLE_OMP_TASK) |
1407 | single_succ_edge (entry_bb)->flags = EDGE_FALLTHRU; |
1408 | else |
1409 | { |
1410 | e2 = make_edge (e->src, BRANCH_EDGE (entry_bb)((*((entry_bb))->succs)[(0)]->flags & EDGE_FALLTHRU ? (*((entry_bb))->succs)[(1)] : (*((entry_bb))->succs) [(0)])->dest, EDGE_ABNORMAL); |
1411 | gcc_assert (e2->dest == region->exit)((void)(!(e2->dest == region->exit) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1411, __FUNCTION__), 0 : 0)); |
1412 | remove_edge (BRANCH_EDGE (entry_bb)((*((entry_bb))->succs)[(0)]->flags & EDGE_FALLTHRU ? (*((entry_bb))->succs)[(1)] : (*((entry_bb))->succs) [(0)])); |
1413 | set_immediate_dominator (CDI_DOMINATORS, e2->dest, e->src); |
1414 | gsi = gsi_last_nondebug_bb (region->exit); |
1415 | gcc_assert (!gsi_end_p (gsi)((void)(!(!gsi_end_p (gsi) && gimple_code (gsi_stmt ( gsi)) == GIMPLE_OMP_RETURN) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1416, __FUNCTION__), 0 : 0)) |
1416 | && gimple_code (gsi_stmt (gsi)) == GIMPLE_OMP_RETURN)((void)(!(!gsi_end_p (gsi) && gimple_code (gsi_stmt ( gsi)) == GIMPLE_OMP_RETURN) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1416, __FUNCTION__), 0 : 0)); |
1417 | gsi_remove (&gsi, true); |
1418 | } |
1419 | |
1420 | /* Convert GIMPLE_OMP_{RETURN,CONTINUE} into a RETURN_EXPR. */ |
1421 | if (exit_bb) |
1422 | { |
1423 | gsi = gsi_last_nondebug_bb (exit_bb); |
1424 | gcc_assert (!gsi_end_p (gsi)((void)(!(!gsi_end_p (gsi) && (gimple_code (gsi_stmt ( gsi)) == (e2 ? GIMPLE_OMP_CONTINUE : GIMPLE_OMP_RETURN))) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1426, __FUNCTION__), 0 : 0)) |
1425 | && (gimple_code (gsi_stmt (gsi))((void)(!(!gsi_end_p (gsi) && (gimple_code (gsi_stmt ( gsi)) == (e2 ? GIMPLE_OMP_CONTINUE : GIMPLE_OMP_RETURN))) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1426, __FUNCTION__), 0 : 0)) |
1426 | == (e2 ? GIMPLE_OMP_CONTINUE : GIMPLE_OMP_RETURN)))((void)(!(!gsi_end_p (gsi) && (gimple_code (gsi_stmt ( gsi)) == (e2 ? GIMPLE_OMP_CONTINUE : GIMPLE_OMP_RETURN))) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1426, __FUNCTION__), 0 : 0)); |
1427 | stmt = gimple_build_return (NULLnullptr); |
1428 | gsi_insert_after (&gsi, stmt, GSI_SAME_STMT); |
1429 | gsi_remove (&gsi, true); |
1430 | } |
1431 | |
1432 | /* Move the parallel region into CHILD_CFUN. */ |
1433 | |
1434 | if (gimple_in_ssa_p (cfun(cfun + 0))) |
1435 | { |
1436 | init_tree_ssa (child_cfun); |
1437 | init_ssa_operands (child_cfun); |
1438 | child_cfun->gimple_df->in_ssa_p = true; |
1439 | block = NULL_TREE(tree) nullptr; |
1440 | } |
1441 | else |
1442 | block = gimple_block (entry_stmt); |
1443 | |
1444 | new_bb = move_sese_region_to_fn (child_cfun, entry_bb, exit_bb, block); |
1445 | if (exit_bb) |
1446 | single_succ_edge (new_bb)->flags = EDGE_FALLTHRU; |
1447 | if (e2) |
1448 | { |
1449 | basic_block dest_bb = e2->dest; |
1450 | if (!exit_bb) |
1451 | make_edge (new_bb, dest_bb, EDGE_FALLTHRU); |
1452 | remove_edge (e2); |
1453 | set_immediate_dominator (CDI_DOMINATORS, dest_bb, new_bb); |
1454 | } |
1455 | /* When the OMP expansion process cannot guarantee an up-to-date |
1456 | loop tree arrange for the child function to fixup loops. */ |
1457 | if (loops_state_satisfies_p (LOOPS_NEED_FIXUP)) |
1458 | child_cfun->x_current_loops->state |= LOOPS_NEED_FIXUP; |
1459 | |
1460 | /* Remove non-local VAR_DECLs from child_cfun->local_decls list. */ |
1461 | num = vec_safe_length (child_cfun->local_decls); |
1462 | for (srcidx = 0, dstidx = 0; srcidx < num; srcidx++) |
1463 | { |
1464 | t = (*child_cfun->local_decls)[srcidx]; |
1465 | if (DECL_CONTEXT (t)((contains_struct_check ((t), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1465, __FUNCTION__))->decl_minimal.context) == cfun(cfun + 0)->decl) |
1466 | continue; |
1467 | if (srcidx != dstidx) |
1468 | (*child_cfun->local_decls)[dstidx] = t; |
1469 | dstidx++; |
1470 | } |
1471 | if (dstidx != num) |
1472 | vec_safe_truncate (child_cfun->local_decls, dstidx); |
1473 | |
1474 | /* Inform the callgraph about the new function. */ |
1475 | child_cfun->curr_properties = cfun(cfun + 0)->curr_properties; |
1476 | child_cfun->has_simduid_loops |= cfun(cfun + 0)->has_simduid_loops; |
1477 | child_cfun->has_force_vectorize_loops |= cfun(cfun + 0)->has_force_vectorize_loops; |
1478 | cgraph_node *node = cgraph_node::get_create (child_fn); |
1479 | node->parallelized_function = 1; |
1480 | cgraph_node::add_new_function (child_fn, true); |
1481 | |
1482 | bool need_asm = DECL_ASSEMBLER_NAME_SET_P (current_function_decl)(((contains_struct_check ((current_function_decl), (TS_DECL_WITH_VIS ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1482, __FUNCTION__))->decl_with_vis.assembler_name) != ( tree) nullptr) |
1483 | && !DECL_ASSEMBLER_NAME_SET_P (child_fn)(((contains_struct_check ((child_fn), (TS_DECL_WITH_VIS), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1483, __FUNCTION__))->decl_with_vis.assembler_name) != ( tree) nullptr); |
1484 | |
1485 | /* Fix the callgraph edges for child_cfun. Those for cfun will be |
1486 | fixed in a following pass. */ |
1487 | push_cfun (child_cfun); |
1488 | if (need_asm) |
1489 | assign_assembler_name_if_needed (child_fn); |
1490 | |
1491 | if (optimizeglobal_options.x_optimize) |
1492 | optimize_omp_library_calls (entry_stmt); |
1493 | update_max_bb_count (); |
1494 | cgraph_edge::rebuild_edges (); |
1495 | |
1496 | /* Some EH regions might become dead, see PR34608. If |
1497 | pass_cleanup_cfg isn't the first pass to happen with the |
1498 | new child, these dead EH edges might cause problems. |
1499 | Clean them up now. */ |
1500 | if (flag_exceptionsglobal_options.x_flag_exceptions) |
1501 | { |
1502 | basic_block bb; |
1503 | bool changed = false; |
1504 | |
1505 | FOR_EACH_BB_FN (bb, cfun)for (bb = ((cfun + 0))->cfg->x_entry_block_ptr->next_bb ; bb != ((cfun + 0))->cfg->x_exit_block_ptr; bb = bb-> next_bb) |
1506 | changed |= gimple_purge_dead_eh_edges (bb); |
1507 | if (changed) |
1508 | cleanup_tree_cfg (); |
1509 | } |
1510 | if (gimple_in_ssa_p (cfun(cfun + 0))) |
1511 | update_ssa (TODO_update_ssa(1 << 11)); |
1512 | if (flag_checkingglobal_options.x_flag_checking && !loops_state_satisfies_p (LOOPS_NEED_FIXUP)) |
1513 | verify_loop_structure (); |
1514 | pop_cfun (); |
1515 | |
1516 | if (dump_file && !gimple_in_ssa_p (cfun(cfun + 0))) |
1517 | { |
1518 | omp_any_child_fn_dumped = true; |
1519 | dump_function_header (dump_file, child_fn, dump_flags); |
1520 | dump_function_to_file (child_fn, dump_file, dump_flags); |
1521 | } |
1522 | } |
1523 | |
1524 | adjust_context_and_scope (region, gimple_block (entry_stmt), child_fn); |
1525 | |
1526 | if (gimple_code (entry_stmt) == GIMPLE_OMP_PARALLEL) |
1527 | expand_parallel_call (region, new_bb, |
1528 | as_a <gomp_parallel *> (entry_stmt), ws_args); |
1529 | else if (gimple_code (entry_stmt) == GIMPLE_OMP_TEAMS) |
1530 | expand_teams_call (new_bb, as_a <gomp_teams *> (entry_stmt)); |
1531 | else |
1532 | expand_task_call (region, new_bb, as_a <gomp_task *> (entry_stmt)); |
1533 | } |
1534 | |
1535 | /* Information about members of an OpenACC collapsed loop nest. */ |
1536 | |
1537 | struct oacc_collapse |
1538 | { |
1539 | tree base; /* Base value. */ |
1540 | tree iters; /* Number of steps. */ |
1541 | tree step; /* Step size. */ |
1542 | tree tile; /* Tile increment (if tiled). */ |
1543 | tree outer; /* Tile iterator var. */ |
1544 | }; |
1545 | |
1546 | /* Helper for expand_oacc_for. Determine collapsed loop information. |
1547 | Fill in COUNTS array. Emit any initialization code before GSI. |
1548 | Return the calculated outer loop bound of BOUND_TYPE. */ |
1549 | |
1550 | static tree |
1551 | expand_oacc_collapse_init (const struct omp_for_data *fd, |
1552 | gimple_stmt_iterator *gsi, |
1553 | oacc_collapse *counts, tree diff_type, |
1554 | tree bound_type, location_t loc) |
1555 | { |
1556 | tree tiling = fd->tiling; |
1557 | tree total = build_int_cst (bound_type, 1); |
1558 | int ix; |
1559 | |
1560 | gcc_assert (integer_onep (fd->loop.step))((void)(!(integer_onep (fd->loop.step)) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1560, __FUNCTION__), 0 : 0)); |
1561 | gcc_assert (integer_zerop (fd->loop.n1))((void)(!(integer_zerop (fd->loop.n1)) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1561, __FUNCTION__), 0 : 0)); |
1562 | |
1563 | /* When tiling, the first operand of the tile clause applies to the |
1564 | innermost loop, and we work outwards from there. Seems |
1565 | backwards, but whatever. */ |
1566 | for (ix = fd->collapse; ix--;) |
1567 | { |
1568 | const omp_for_data_loop *loop = &fd->loops[ix]; |
1569 | |
1570 | tree iter_type = TREE_TYPE (loop->v)((contains_struct_check ((loop->v), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1570, __FUNCTION__))->typed.type); |
1571 | tree plus_type = iter_type; |
1572 | |
1573 | gcc_assert (loop->cond_code == LT_EXPR || loop->cond_code == GT_EXPR)((void)(!(loop->cond_code == LT_EXPR || loop->cond_code == GT_EXPR) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1573, __FUNCTION__), 0 : 0)); |
1574 | |
1575 | if (POINTER_TYPE_P (iter_type)(((enum tree_code) (iter_type)->base.code) == POINTER_TYPE || ((enum tree_code) (iter_type)->base.code) == REFERENCE_TYPE )) |
1576 | plus_type = sizetypesizetype_tab[(int) stk_sizetype]; |
1577 | |
1578 | if (tiling) |
1579 | { |
1580 | tree num = build_int_cst (integer_type_nodeinteger_types[itk_int], fd->collapse); |
1581 | tree loop_no = build_int_cst (integer_type_nodeinteger_types[itk_int], ix); |
1582 | tree tile = TREE_VALUE (tiling)((tree_check ((tiling), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1582, __FUNCTION__, (TREE_LIST)))->list.value); |
1583 | gcall *call |
1584 | = gimple_build_call_internal (IFN_GOACC_TILE, 5, num, loop_no, tile, |
1585 | /* gwv-outer=*/integer_zero_nodeglobal_trees[TI_INTEGER_ZERO], |
1586 | /* gwv-inner=*/integer_zero_nodeglobal_trees[TI_INTEGER_ZERO]); |
1587 | |
1588 | counts[ix].outer = create_tmp_var (iter_type, ".outer"); |
1589 | counts[ix].tile = create_tmp_var (diff_type, ".tile"); |
1590 | gimple_call_set_lhs (call, counts[ix].tile); |
1591 | gimple_set_location (call, loc); |
1592 | gsi_insert_before (gsi, call, GSI_SAME_STMT); |
1593 | |
1594 | tiling = TREE_CHAIN (tiling)((contains_struct_check ((tiling), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1594, __FUNCTION__))->common.chain); |
1595 | } |
1596 | else |
1597 | { |
1598 | counts[ix].tile = NULLnullptr; |
1599 | counts[ix].outer = loop->v; |
1600 | } |
1601 | |
1602 | tree b = loop->n1; |
1603 | tree e = loop->n2; |
1604 | tree s = loop->step; |
1605 | bool up = loop->cond_code == LT_EXPR; |
1606 | tree dir = build_int_cst (diff_type, up ? +1 : -1); |
1607 | bool negating; |
1608 | tree expr; |
1609 | |
1610 | b = force_gimple_operand_gsi (gsi, b, true, NULL_TREE(tree) nullptr, |
1611 | true, GSI_SAME_STMT); |
1612 | e = force_gimple_operand_gsi (gsi, e, true, NULL_TREE(tree) nullptr, |
1613 | true, GSI_SAME_STMT); |
1614 | |
1615 | /* Convert the step, avoiding possible unsigned->signed overflow. */ |
1616 | negating = !up && TYPE_UNSIGNED (TREE_TYPE (s))((tree_class_check ((((contains_struct_check ((s), (TS_TYPED) , "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1616, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1616, __FUNCTION__))->base.u.bits.unsigned_flag); |
1617 | if (negating) |
1618 | s = fold_build1 (NEGATE_EXPR, TREE_TYPE (s), s)fold_build1_loc (((location_t) 0), NEGATE_EXPR, ((contains_struct_check ((s), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1618, __FUNCTION__))->typed.type), s ); |
1619 | s = fold_convert (diff_type, s)fold_convert_loc (((location_t) 0), diff_type, s); |
1620 | if (negating) |
1621 | s = fold_build1 (NEGATE_EXPR, diff_type, s)fold_build1_loc (((location_t) 0), NEGATE_EXPR, diff_type, s ); |
1622 | s = force_gimple_operand_gsi (gsi, s, true, NULL_TREE(tree) nullptr, |
1623 | true, GSI_SAME_STMT); |
1624 | |
1625 | /* Determine the range, avoiding possible unsigned->signed overflow. */ |
1626 | negating = !up && TYPE_UNSIGNED (iter_type)((tree_class_check ((iter_type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1626, __FUNCTION__))->base.u.bits.unsigned_flag); |
1627 | expr = fold_build2 (MINUS_EXPR, plus_type,fold_build2_loc (((location_t) 0), MINUS_EXPR, plus_type, fold_convert_loc (((location_t) 0), plus_type, negating ? b : e), fold_convert_loc (((location_t) 0), plus_type, negating ? e : b) ) |
1628 | fold_convert (plus_type, negating ? b : e),fold_build2_loc (((location_t) 0), MINUS_EXPR, plus_type, fold_convert_loc (((location_t) 0), plus_type, negating ? b : e), fold_convert_loc (((location_t) 0), plus_type, negating ? e : b) ) |
1629 | fold_convert (plus_type, negating ? e : b))fold_build2_loc (((location_t) 0), MINUS_EXPR, plus_type, fold_convert_loc (((location_t) 0), plus_type, negating ? b : e), fold_convert_loc (((location_t) 0), plus_type, negating ? e : b) ); |
1630 | expr = fold_convert (diff_type, expr)fold_convert_loc (((location_t) 0), diff_type, expr); |
1631 | if (negating) |
1632 | expr = fold_build1 (NEGATE_EXPR, diff_type, expr)fold_build1_loc (((location_t) 0), NEGATE_EXPR, diff_type, expr ); |
1633 | tree range = force_gimple_operand_gsi |
1634 | (gsi, expr, true, NULL_TREE(tree) nullptr, true, GSI_SAME_STMT); |
1635 | |
1636 | /* Determine number of iterations. */ |
1637 | expr = fold_build2 (MINUS_EXPR, diff_type, range, dir)fold_build2_loc (((location_t) 0), MINUS_EXPR, diff_type, range , dir ); |
1638 | expr = fold_build2 (PLUS_EXPR, diff_type, expr, s)fold_build2_loc (((location_t) 0), PLUS_EXPR, diff_type, expr , s ); |
1639 | expr = fold_build2 (TRUNC_DIV_EXPR, diff_type, expr, s)fold_build2_loc (((location_t) 0), TRUNC_DIV_EXPR, diff_type, expr, s ); |
1640 | |
1641 | tree iters = force_gimple_operand_gsi (gsi, expr, true, NULL_TREE(tree) nullptr, |
1642 | true, GSI_SAME_STMT); |
1643 | |
1644 | counts[ix].base = b; |
1645 | counts[ix].iters = iters; |
1646 | counts[ix].step = s; |
1647 | |
1648 | total = fold_build2 (MULT_EXPR, bound_type, total,fold_build2_loc (((location_t) 0), MULT_EXPR, bound_type, total , fold_convert_loc (((location_t) 0), bound_type, iters) ) |
1649 | fold_convert (bound_type, iters))fold_build2_loc (((location_t) 0), MULT_EXPR, bound_type, total , fold_convert_loc (((location_t) 0), bound_type, iters) ); |
1650 | } |
1651 | |
1652 | return total; |
1653 | } |
1654 | |
1655 | /* Emit initializers for collapsed loop members. INNER is true if |
1656 | this is for the element loop of a TILE. IVAR is the outer |
1657 | loop iteration variable, from which collapsed loop iteration values |
1658 | are calculated. COUNTS array has been initialized by |
1659 | expand_oacc_collapse_inits. */ |
1660 | |
1661 | static void |
1662 | expand_oacc_collapse_vars (const struct omp_for_data *fd, bool inner, |
1663 | gimple_stmt_iterator *gsi, |
1664 | const oacc_collapse *counts, tree ivar, |
1665 | tree diff_type) |
1666 | { |
1667 | tree ivar_type = TREE_TYPE (ivar)((contains_struct_check ((ivar), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1667, __FUNCTION__))->typed.type); |
1668 | |
1669 | /* The most rapidly changing iteration variable is the innermost |
1670 | one. */ |
1671 | for (int ix = fd->collapse; ix--;) |
1672 | { |
1673 | const omp_for_data_loop *loop = &fd->loops[ix]; |
1674 | const oacc_collapse *collapse = &counts[ix]; |
1675 | tree v = inner ? loop->v : collapse->outer; |
1676 | tree iter_type = TREE_TYPE (v)((contains_struct_check ((v), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1676, __FUNCTION__))->typed.type); |
1677 | tree plus_type = iter_type; |
1678 | enum tree_code plus_code = PLUS_EXPR; |
1679 | tree expr; |
1680 | |
1681 | if (POINTER_TYPE_P (iter_type)(((enum tree_code) (iter_type)->base.code) == POINTER_TYPE || ((enum tree_code) (iter_type)->base.code) == REFERENCE_TYPE )) |
1682 | { |
1683 | plus_code = POINTER_PLUS_EXPR; |
1684 | plus_type = sizetypesizetype_tab[(int) stk_sizetype]; |
1685 | } |
1686 | |
1687 | expr = ivar; |
1688 | if (ix) |
1689 | { |
1690 | tree mod = fold_convert (ivar_type, collapse->iters)fold_convert_loc (((location_t) 0), ivar_type, collapse->iters ); |
1691 | ivar = fold_build2 (TRUNC_DIV_EXPR, ivar_type, expr, mod)fold_build2_loc (((location_t) 0), TRUNC_DIV_EXPR, ivar_type, expr, mod ); |
1692 | expr = fold_build2 (TRUNC_MOD_EXPR, ivar_type, expr, mod)fold_build2_loc (((location_t) 0), TRUNC_MOD_EXPR, ivar_type, expr, mod ); |
1693 | ivar = force_gimple_operand_gsi (gsi, ivar, true, NULL_TREE(tree) nullptr, |
1694 | true, GSI_SAME_STMT); |
1695 | } |
1696 | |
1697 | expr = fold_build2 (MULT_EXPR, diff_type, fold_convert (diff_type, expr),fold_build2_loc (((location_t) 0), MULT_EXPR, diff_type, fold_convert_loc (((location_t) 0), diff_type, expr), fold_convert_loc (((location_t ) 0), diff_type, collapse->step) ) |
1698 | fold_convert (diff_type, collapse->step))fold_build2_loc (((location_t) 0), MULT_EXPR, diff_type, fold_convert_loc (((location_t) 0), diff_type, expr), fold_convert_loc (((location_t ) 0), diff_type, collapse->step) ); |
1699 | expr = fold_build2 (plus_code, iter_type,fold_build2_loc (((location_t) 0), plus_code, iter_type, inner ? collapse->outer : collapse->base, fold_convert_loc ( ((location_t) 0), plus_type, expr) ) |
1700 | inner ? collapse->outer : collapse->base,fold_build2_loc (((location_t) 0), plus_code, iter_type, inner ? collapse->outer : collapse->base, fold_convert_loc ( ((location_t) 0), plus_type, expr) ) |
1701 | fold_convert (plus_type, expr))fold_build2_loc (((location_t) 0), plus_code, iter_type, inner ? collapse->outer : collapse->base, fold_convert_loc ( ((location_t) 0), plus_type, expr) ); |
1702 | expr = force_gimple_operand_gsi (gsi, expr, false, NULL_TREE(tree) nullptr, |
1703 | true, GSI_SAME_STMT); |
1704 | gassign *ass = gimple_build_assign (v, expr); |
1705 | gsi_insert_before (gsi, ass, GSI_SAME_STMT); |
1706 | } |
1707 | } |
1708 | |
1709 | /* Helper function for expand_omp_{for_*,simd}. If this is the outermost |
1710 | of the combined collapse > 1 loop constructs, generate code like: |
1711 | if (__builtin_expect (N32 cond3 N31, 0)) goto ZERO_ITER_BB; |
1712 | if (cond3 is <) |
1713 | adj = STEP3 - 1; |
1714 | else |
1715 | adj = STEP3 + 1; |
1716 | count3 = (adj + N32 - N31) / STEP3; |
1717 | if (__builtin_expect (N22 cond2 N21, 0)) goto ZERO_ITER_BB; |
1718 | if (cond2 is <) |
1719 | adj = STEP2 - 1; |
1720 | else |
1721 | adj = STEP2 + 1; |
1722 | count2 = (adj + N22 - N21) / STEP2; |
1723 | if (__builtin_expect (N12 cond1 N11, 0)) goto ZERO_ITER_BB; |
1724 | if (cond1 is <) |
1725 | adj = STEP1 - 1; |
1726 | else |
1727 | adj = STEP1 + 1; |
1728 | count1 = (adj + N12 - N11) / STEP1; |
1729 | count = count1 * count2 * count3; |
1730 | Furthermore, if ZERO_ITER_BB is NULL, create a BB which does: |
1731 | count = 0; |
1732 | and set ZERO_ITER_BB to that bb. If this isn't the outermost |
1733 | of the combined loop constructs, just initialize COUNTS array |
1734 | from the _looptemp_ clauses. For loop nests with non-rectangular |
1735 | loops, do this only for the rectangular loops. Then pick |
1736 | the loops which reference outer vars in their bound expressions |
1737 | and the loops which they refer to and for this sub-nest compute |
1738 | number of iterations. For triangular loops use Faulhaber's formula, |
1739 | otherwise as a fallback, compute by iterating the loops. |
1740 | If e.g. the sub-nest is |
1741 | for (I = N11; I COND1 N12; I += STEP1) |
1742 | for (J = M21 * I + N21; J COND2 M22 * I + N22; J += STEP2) |
1743 | for (K = M31 * J + N31; K COND3 M32 * J + N32; K += STEP3) |
1744 | do: |
1745 | COUNT = 0; |
1746 | for (tmpi = N11; tmpi COND1 N12; tmpi += STEP1) |
1747 | for (tmpj = M21 * tmpi + N21; |
1748 | tmpj COND2 M22 * tmpi + N22; tmpj += STEP2) |
1749 | { |
1750 | int tmpk1 = M31 * tmpj + N31; |
1751 | int tmpk2 = M32 * tmpj + N32; |
1752 | if (tmpk1 COND3 tmpk2) |
1753 | { |
1754 | if (COND3 is <) |
1755 | adj = STEP3 - 1; |
1756 | else |
1757 | adj = STEP3 + 1; |
1758 | COUNT += (adj + tmpk2 - tmpk1) / STEP3; |
1759 | } |
1760 | } |
1761 | and finally multiply the counts of the rectangular loops not |
1762 | in the sub-nest with COUNT. Also, as counts[fd->last_nonrect] |
1763 | store number of iterations of the loops from fd->first_nonrect |
1764 | to fd->last_nonrect inclusive, i.e. the above COUNT multiplied |
1765 | by the counts of rectangular loops not referenced in any non-rectangular |
1766 | loops sandwitched in between those. */ |
1767 | |
1768 | /* NOTE: It *could* be better to moosh all of the BBs together, |
1769 | creating one larger BB with all the computation and the unexpected |
1770 | jump at the end. I.e. |
1771 | |
1772 | bool zero3, zero2, zero1, zero; |
1773 | |
1774 | zero3 = N32 c3 N31; |
1775 | count3 = (N32 - N31) /[cl] STEP3; |
1776 | zero2 = N22 c2 N21; |
1777 | count2 = (N22 - N21) /[cl] STEP2; |
1778 | zero1 = N12 c1 N11; |
1779 | count1 = (N12 - N11) /[cl] STEP1; |
1780 | zero = zero3 || zero2 || zero1; |
1781 | count = count1 * count2 * count3; |
1782 | if (__builtin_expect(zero, false)) goto zero_iter_bb; |
1783 | |
1784 | After all, we expect the zero=false, and thus we expect to have to |
1785 | evaluate all of the comparison expressions, so short-circuiting |
1786 | oughtn't be a win. Since the condition isn't protecting a |
1787 | denominator, we're not concerned about divide-by-zero, so we can |
1788 | fully evaluate count even if a numerator turned out to be wrong. |
1789 | |
1790 | It seems like putting this all together would create much better |
1791 | scheduling opportunities, and less pressure on the chip's branch |
1792 | predictor. */ |
1793 | |
1794 | static void |
1795 | expand_omp_for_init_counts (struct omp_for_data *fd, gimple_stmt_iterator *gsi, |
1796 | basic_block &entry_bb, tree *counts, |
1797 | basic_block &zero_iter1_bb, int &first_zero_iter1, |
1798 | basic_block &zero_iter2_bb, int &first_zero_iter2, |
1799 | basic_block &l2_dom_bb) |
1800 | { |
1801 | tree t, type = TREE_TYPE (fd->loop.v)((contains_struct_check ((fd->loop.v), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1801, __FUNCTION__))->typed.type); |
1802 | edge e, ne; |
1803 | int i; |
1804 | |
1805 | /* Collapsed loops need work for expansion into SSA form. */ |
1806 | gcc_assert (!gimple_in_ssa_p (cfun))((void)(!(!gimple_in_ssa_p ((cfun + 0))) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1806, __FUNCTION__), 0 : 0)); |
1807 | |
1808 | if (gimple_omp_for_combined_into_p (fd->for_stmt) |
1809 | && TREE_CODE (fd->loop.n2)((enum tree_code) (fd->loop.n2)->base.code) != INTEGER_CST) |
1810 | { |
1811 | gcc_assert (fd->ordered == 0)((void)(!(fd->ordered == 0) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1811, __FUNCTION__), 0 : 0)); |
1812 | /* First two _looptemp_ clauses are for istart/iend, counts[0] |
1813 | isn't supposed to be handled, as the inner loop doesn't |
1814 | use it. */ |
1815 | tree innerc = omp_find_clause (gimple_omp_for_clauses (fd->for_stmt), |
1816 | OMP_CLAUSE__LOOPTEMP_); |
1817 | gcc_assert (innerc)((void)(!(innerc) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1817, __FUNCTION__), 0 : 0)); |
1818 | for (i = 0; i < fd->collapse; i++) |
1819 | { |
1820 | innerc = omp_find_clause (OMP_CLAUSE_CHAIN (innerc)((contains_struct_check (((tree_check ((innerc), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1820, __FUNCTION__, (OMP_CLAUSE)))), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1820, __FUNCTION__))->common.chain), |
1821 | OMP_CLAUSE__LOOPTEMP_); |
1822 | gcc_assert (innerc)((void)(!(innerc) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1822, __FUNCTION__), 0 : 0)); |
1823 | if (i) |
1824 | counts[i] = OMP_CLAUSE_DECL (innerc)(*(omp_clause_elt_check (((omp_clause_range_check (((tree_check ((innerc), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1824, __FUNCTION__, (OMP_CLAUSE)))), (OMP_CLAUSE_PRIVATE), ( OMP_CLAUSE__SCANTEMP_), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1824, __FUNCTION__))), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1824, __FUNCTION__))); |
1825 | else |
1826 | counts[0] = NULL_TREE(tree) nullptr; |
1827 | } |
1828 | if (fd->non_rect |
1829 | && fd->last_nonrect == fd->first_nonrect + 1 |
1830 | && !TYPE_UNSIGNED (TREE_TYPE (fd->loops[fd->last_nonrect].v))((tree_class_check ((((contains_struct_check ((fd->loops[fd ->last_nonrect].v), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1830, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1830, __FUNCTION__))->base.u.bits.unsigned_flag)) |
1831 | { |
1832 | tree c[4]; |
1833 | for (i = 0; i < 4; i++) |
1834 | { |
1835 | innerc = omp_find_clause (OMP_CLAUSE_CHAIN (innerc)((contains_struct_check (((tree_check ((innerc), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1835, __FUNCTION__, (OMP_CLAUSE)))), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1835, __FUNCTION__))->common.chain), |
1836 | OMP_CLAUSE__LOOPTEMP_); |
1837 | gcc_assert (innerc)((void)(!(innerc) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1837, __FUNCTION__), 0 : 0)); |
1838 | c[i] = OMP_CLAUSE_DECL (innerc)(*(omp_clause_elt_check (((omp_clause_range_check (((tree_check ((innerc), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1838, __FUNCTION__, (OMP_CLAUSE)))), (OMP_CLAUSE_PRIVATE), ( OMP_CLAUSE__SCANTEMP_), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1838, __FUNCTION__))), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1838, __FUNCTION__))); |
1839 | } |
1840 | counts[0] = c[0]; |
1841 | fd->first_inner_iterations = c[1]; |
1842 | fd->factor = c[2]; |
1843 | fd->adjn1 = c[3]; |
1844 | } |
1845 | return; |
1846 | } |
1847 | |
1848 | for (i = fd->collapse; i < fd->ordered; i++) |
1849 | { |
1850 | tree itype = TREE_TYPE (fd->loops[i].v)((contains_struct_check ((fd->loops[i].v), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1850, __FUNCTION__))->typed.type); |
1851 | counts[i] = NULL_TREE(tree) nullptr; |
1852 | t = fold_binary (fd->loops[i].cond_code, boolean_type_node,fold_binary_loc (((location_t) 0), fd->loops[i].cond_code, global_trees[TI_BOOLEAN_TYPE], fold_convert_loc (((location_t ) 0), itype, fd->loops[i].n1), fold_convert_loc (((location_t ) 0), itype, fd->loops[i].n2)) |
1853 | fold_convert (itype, fd->loops[i].n1),fold_binary_loc (((location_t) 0), fd->loops[i].cond_code, global_trees[TI_BOOLEAN_TYPE], fold_convert_loc (((location_t ) 0), itype, fd->loops[i].n1), fold_convert_loc (((location_t ) 0), itype, fd->loops[i].n2)) |
1854 | fold_convert (itype, fd->loops[i].n2))fold_binary_loc (((location_t) 0), fd->loops[i].cond_code, global_trees[TI_BOOLEAN_TYPE], fold_convert_loc (((location_t ) 0), itype, fd->loops[i].n1), fold_convert_loc (((location_t ) 0), itype, fd->loops[i].n2)); |
1855 | if (t && integer_zerop (t)) |
1856 | { |
1857 | for (i = fd->collapse; i < fd->ordered; i++) |
1858 | counts[i] = build_int_cst (type, 0); |
1859 | break; |
1860 | } |
1861 | } |
1862 | bool rect_count_seen = false; |
1863 | for (i = 0; i < (fd->ordered ? fd->ordered : fd->collapse); i++) |
1864 | { |
1865 | tree itype = TREE_TYPE (fd->loops[i].v)((contains_struct_check ((fd->loops[i].v), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1865, __FUNCTION__))->typed.type); |
1866 | |
1867 | if (i >= fd->collapse && counts[i]) |
1868 | continue; |
1869 | if (fd->non_rect) |
1870 | { |
1871 | /* Skip loops that use outer iterators in their expressions |
1872 | during this phase. */ |
1873 | if (fd->loops[i].m1 || fd->loops[i].m2) |
1874 | { |
1875 | counts[i] = build_zero_cst (type); |
1876 | continue; |
1877 | } |
1878 | } |
1879 | if ((SSA_VAR_P (fd->loop.n2)(((enum tree_code) (fd->loop.n2)->base.code) == VAR_DECL || ((enum tree_code) (fd->loop.n2)->base.code) == PARM_DECL || ((enum tree_code) (fd->loop.n2)->base.code) == RESULT_DECL || ((enum tree_code) (fd->loop.n2)->base.code) == SSA_NAME ) || i >= fd->collapse) |
1880 | && ((t = fold_binary (fd->loops[i].cond_code, boolean_type_node,fold_binary_loc (((location_t) 0), fd->loops[i].cond_code, global_trees[TI_BOOLEAN_TYPE], fold_convert_loc (((location_t ) 0), itype, fd->loops[i].n1), fold_convert_loc (((location_t ) 0), itype, fd->loops[i].n2)) |
1881 | fold_convert (itype, fd->loops[i].n1),fold_binary_loc (((location_t) 0), fd->loops[i].cond_code, global_trees[TI_BOOLEAN_TYPE], fold_convert_loc (((location_t ) 0), itype, fd->loops[i].n1), fold_convert_loc (((location_t ) 0), itype, fd->loops[i].n2)) |
1882 | fold_convert (itype, fd->loops[i].n2))fold_binary_loc (((location_t) 0), fd->loops[i].cond_code, global_trees[TI_BOOLEAN_TYPE], fold_convert_loc (((location_t ) 0), itype, fd->loops[i].n1), fold_convert_loc (((location_t ) 0), itype, fd->loops[i].n2))) |
1883 | == NULL_TREE(tree) nullptr || !integer_onep (t))) |
1884 | { |
1885 | gcond *cond_stmt; |
1886 | tree n1, n2; |
1887 | n1 = fold_convert (itype, unshare_expr (fd->loops[i].n1))fold_convert_loc (((location_t) 0), itype, unshare_expr (fd-> loops[i].n1)); |
1888 | n1 = force_gimple_operand_gsi (gsi, n1, true, NULL_TREE(tree) nullptr, |
1889 | true, GSI_SAME_STMT); |
1890 | n2 = fold_convert (itype, unshare_expr (fd->loops[i].n2))fold_convert_loc (((location_t) 0), itype, unshare_expr (fd-> loops[i].n2)); |
1891 | n2 = force_gimple_operand_gsi (gsi, n2, true, NULL_TREE(tree) nullptr, |
1892 | true, GSI_SAME_STMT); |
1893 | cond_stmt = expand_omp_build_cond (gsi, fd->loops[i].cond_code, |
1894 | n1, n2); |
1895 | e = split_block (entry_bb, cond_stmt); |
1896 | basic_block &zero_iter_bb |
1897 | = i < fd->collapse ? zero_iter1_bb : zero_iter2_bb; |
1898 | int &first_zero_iter |
1899 | = i < fd->collapse ? first_zero_iter1 : first_zero_iter2; |
1900 | if (zero_iter_bb == NULLnullptr) |
1901 | { |
1902 | gassign *assign_stmt; |
1903 | first_zero_iter = i; |
1904 | zero_iter_bb = create_empty_bb (entry_bb); |
1905 | add_bb_to_loop (zero_iter_bb, entry_bb->loop_father); |
1906 | *gsi = gsi_after_labels (zero_iter_bb); |
1907 | if (i < fd->collapse) |
1908 | assign_stmt = gimple_build_assign (fd->loop.n2, |
1909 | build_zero_cst (type)); |
1910 | else |
1911 | { |
1912 | counts[i] = create_tmp_reg (type, ".count"); |
1913 | assign_stmt |
1914 | = gimple_build_assign (counts[i], build_zero_cst (type)); |
1915 | } |
1916 | gsi_insert_before (gsi, assign_stmt, GSI_SAME_STMT); |
1917 | set_immediate_dominator (CDI_DOMINATORS, zero_iter_bb, |
1918 | entry_bb); |
1919 | } |
1920 | ne = make_edge (entry_bb, zero_iter_bb, EDGE_FALSE_VALUE); |
1921 | ne->probability = profile_probability::very_unlikely (); |
1922 | e->flags = EDGE_TRUE_VALUE; |
1923 | e->probability = ne->probability.invert (); |
1924 | if (l2_dom_bb == NULLnullptr) |
1925 | l2_dom_bb = entry_bb; |
1926 | entry_bb = e->dest; |
1927 | *gsi = gsi_last_nondebug_bb (entry_bb); |
1928 | } |
1929 | |
1930 | if (POINTER_TYPE_P (itype)(((enum tree_code) (itype)->base.code) == POINTER_TYPE || ( (enum tree_code) (itype)->base.code) == REFERENCE_TYPE)) |
1931 | itype = signed_type_for (itype); |
1932 | t = build_int_cst (itype, (fd->loops[i].cond_code == LT_EXPR |
1933 | ? -1 : 1)); |
1934 | t = fold_build2 (PLUS_EXPR, itype,fold_build2_loc (((location_t) 0), PLUS_EXPR, itype, fold_convert_loc (((location_t) 0), itype, fd->loops[i].step), t ) |
1935 | fold_convert (itype, fd->loops[i].step), t)fold_build2_loc (((location_t) 0), PLUS_EXPR, itype, fold_convert_loc (((location_t) 0), itype, fd->loops[i].step), t ); |
1936 | t = fold_build2 (PLUS_EXPR, itype, t,fold_build2_loc (((location_t) 0), PLUS_EXPR, itype, t, fold_convert_loc (((location_t) 0), itype, fd->loops[i].n2) ) |
1937 | fold_convert (itype, fd->loops[i].n2))fold_build2_loc (((location_t) 0), PLUS_EXPR, itype, t, fold_convert_loc (((location_t) 0), itype, fd->loops[i].n2) ); |
1938 | t = fold_build2 (MINUS_EXPR, itype, t,fold_build2_loc (((location_t) 0), MINUS_EXPR, itype, t, fold_convert_loc (((location_t) 0), itype, fd->loops[i].n1) ) |
1939 | fold_convert (itype, fd->loops[i].n1))fold_build2_loc (((location_t) 0), MINUS_EXPR, itype, t, fold_convert_loc (((location_t) 0), itype, fd->loops[i].n1) ); |
1940 | /* ?? We could probably use CEIL_DIV_EXPR instead of |
1941 | TRUNC_DIV_EXPR and adjusting by hand. Unless we can't |
1942 | generate the same code in the end because generically we |
1943 | don't know that the values involved must be negative for |
1944 | GT?? */ |
1945 | if (TYPE_UNSIGNED (itype)((tree_class_check ((itype), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1945, __FUNCTION__))->base.u.bits.unsigned_flag) && fd->loops[i].cond_code == GT_EXPR) |
1946 | t = fold_build2 (TRUNC_DIV_EXPR, itype,fold_build2_loc (((location_t) 0), TRUNC_DIV_EXPR, itype, fold_build1_loc (((location_t) 0), NEGATE_EXPR, itype, t ), fold_build1_loc ( ((location_t) 0), NEGATE_EXPR, itype, fold_convert_loc (((location_t ) 0), itype, fd->loops[i].step) ) ) |
1947 | fold_build1 (NEGATE_EXPR, itype, t),fold_build2_loc (((location_t) 0), TRUNC_DIV_EXPR, itype, fold_build1_loc (((location_t) 0), NEGATE_EXPR, itype, t ), fold_build1_loc ( ((location_t) 0), NEGATE_EXPR, itype, fold_convert_loc (((location_t ) 0), itype, fd->loops[i].step) ) ) |
1948 | fold_build1 (NEGATE_EXPR, itype,fold_build2_loc (((location_t) 0), TRUNC_DIV_EXPR, itype, fold_build1_loc (((location_t) 0), NEGATE_EXPR, itype, t ), fold_build1_loc ( ((location_t) 0), NEGATE_EXPR, itype, fold_convert_loc (((location_t ) 0), itype, fd->loops[i].step) ) ) |
1949 | fold_convert (itype,fold_build2_loc (((location_t) 0), TRUNC_DIV_EXPR, itype, fold_build1_loc (((location_t) 0), NEGATE_EXPR, itype, t ), fold_build1_loc ( ((location_t) 0), NEGATE_EXPR, itype, fold_convert_loc (((location_t ) 0), itype, fd->loops[i].step) ) ) |
1950 | fd->loops[i].step)))fold_build2_loc (((location_t) 0), TRUNC_DIV_EXPR, itype, fold_build1_loc (((location_t) 0), NEGATE_EXPR, itype, t ), fold_build1_loc ( ((location_t) 0), NEGATE_EXPR, itype, fold_convert_loc (((location_t ) 0), itype, fd->loops[i].step) ) ); |
1951 | else |
1952 | t = fold_build2 (TRUNC_DIV_EXPR, itype, t,fold_build2_loc (((location_t) 0), TRUNC_DIV_EXPR, itype, t, fold_convert_loc (((location_t) 0), itype, fd->loops[i].step) ) |
1953 | fold_convert (itype, fd->loops[i].step))fold_build2_loc (((location_t) 0), TRUNC_DIV_EXPR, itype, t, fold_convert_loc (((location_t) 0), itype, fd->loops[i].step) ); |
1954 | t = fold_convert (type, t)fold_convert_loc (((location_t) 0), type, t); |
1955 | if (TREE_CODE (t)((enum tree_code) (t)->base.code) == INTEGER_CST) |
1956 | counts[i] = t; |
1957 | else |
1958 | { |
1959 | if (i < fd->collapse || i != first_zero_iter2) |
1960 | counts[i] = create_tmp_reg (type, ".count"); |
1961 | expand_omp_build_assign (gsi, counts[i], t); |
1962 | } |
1963 | if (SSA_VAR_P (fd->loop.n2)(((enum tree_code) (fd->loop.n2)->base.code) == VAR_DECL || ((enum tree_code) (fd->loop.n2)->base.code) == PARM_DECL || ((enum tree_code) (fd->loop.n2)->base.code) == RESULT_DECL || ((enum tree_code) (fd->loop.n2)->base.code) == SSA_NAME ) && i < fd->collapse) |
1964 | { |
1965 | if (fd->non_rect && i >= fd->first_nonrect && i <= fd->last_nonrect) |
1966 | continue; |
1967 | if (!rect_count_seen) |
1968 | { |
1969 | t = counts[i]; |
1970 | rect_count_seen = true; |
1971 | } |
1972 | else |
1973 | t = fold_build2 (MULT_EXPR, type, fd->loop.n2, counts[i])fold_build2_loc (((location_t) 0), MULT_EXPR, type, fd->loop .n2, counts[i] ); |
1974 | expand_omp_build_assign (gsi, fd->loop.n2, t); |
1975 | } |
1976 | } |
1977 | if (fd->non_rect && SSA_VAR_P (fd->loop.n2)(((enum tree_code) (fd->loop.n2)->base.code) == VAR_DECL || ((enum tree_code) (fd->loop.n2)->base.code) == PARM_DECL || ((enum tree_code) (fd->loop.n2)->base.code) == RESULT_DECL || ((enum tree_code) (fd->loop.n2)->base.code) == SSA_NAME )) |
1978 | { |
1979 | gcc_assert (fd->last_nonrect != -1)((void)(!(fd->last_nonrect != -1) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1979, __FUNCTION__), 0 : 0)); |
1980 | |
1981 | counts[fd->last_nonrect] = create_tmp_reg (type, ".count"); |
1982 | expand_omp_build_assign (gsi, counts[fd->last_nonrect], |
1983 | build_zero_cst (type)); |
1984 | for (i = fd->first_nonrect + 1; i < fd->last_nonrect; i++) |
1985 | if (fd->loops[i].m1 |
1986 | || fd->loops[i].m2 |
1987 | || fd->loops[i].non_rect_referenced) |
1988 | break; |
1989 | if (i == fd->last_nonrect |
1990 | && fd->loops[i].outer == fd->last_nonrect - fd->first_nonrect |
1991 | && !POINTER_TYPE_P (TREE_TYPE (fd->loops[i].v))(((enum tree_code) (((contains_struct_check ((fd->loops[i] .v), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1991, __FUNCTION__))->typed.type))->base.code) == POINTER_TYPE || ((enum tree_code) (((contains_struct_check ((fd->loops [i].v), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1991, __FUNCTION__))->typed.type))->base.code) == REFERENCE_TYPE ) |
1992 | && !TYPE_UNSIGNED (TREE_TYPE (fd->loops[i].v))((tree_class_check ((((contains_struct_check ((fd->loops[i ].v), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1992, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1992, __FUNCTION__))->base.u.bits.unsigned_flag)) |
1993 | { |
1994 | int o = fd->first_nonrect; |
1995 | tree itype = TREE_TYPE (fd->loops[o].v)((contains_struct_check ((fd->loops[o].v), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 1995, __FUNCTION__))->typed.type); |
1996 | tree n1o = create_tmp_reg (itype, ".n1o"); |
1997 | t = fold_convert (itype, unshare_expr (fd->loops[o].n1))fold_convert_loc (((location_t) 0), itype, unshare_expr (fd-> loops[o].n1)); |
1998 | expand_omp_build_assign (gsi, n1o, t); |
1999 | tree n2o = create_tmp_reg (itype, ".n2o"); |
2000 | t = fold_convert (itype, unshare_expr (fd->loops[o].n2))fold_convert_loc (((location_t) 0), itype, unshare_expr (fd-> loops[o].n2)); |
2001 | expand_omp_build_assign (gsi, n2o, t); |
2002 | if (fd->loops[i].m1 && fd->loops[i].m2) |
2003 | t = fold_build2 (MINUS_EXPR, itype, unshare_expr (fd->loops[i].m2),fold_build2_loc (((location_t) 0), MINUS_EXPR, itype, unshare_expr (fd->loops[i].m2), unshare_expr (fd->loops[i].m1) ) |
2004 | unshare_expr (fd->loops[i].m1))fold_build2_loc (((location_t) 0), MINUS_EXPR, itype, unshare_expr (fd->loops[i].m2), unshare_expr (fd->loops[i].m1) ); |
2005 | else if (fd->loops[i].m1) |
2006 | t = fold_build1 (NEGATE_EXPR, itype,fold_build1_loc (((location_t) 0), NEGATE_EXPR, itype, unshare_expr (fd->loops[i].m1) ) |
2007 | unshare_expr (fd->loops[i].m1))fold_build1_loc (((location_t) 0), NEGATE_EXPR, itype, unshare_expr (fd->loops[i].m1) ); |
2008 | else |
2009 | t = unshare_expr (fd->loops[i].m2); |
2010 | tree m2minusm1 |
2011 | = force_gimple_operand_gsi (gsi, t, true, NULL_TREE(tree) nullptr, |
2012 | true, GSI_SAME_STMT); |
2013 | |
2014 | gimple_stmt_iterator gsi2 = *gsi; |
2015 | gsi_prev (&gsi2); |
2016 | e = split_block (entry_bb, gsi_stmt (gsi2)); |
2017 | e = split_block (e->dest, (gimple *) NULLnullptr); |
2018 | basic_block bb1 = e->src; |
2019 | entry_bb = e->dest; |
2020 | *gsi = gsi_after_labels (entry_bb); |
2021 | |
2022 | gsi2 = gsi_after_labels (bb1); |
2023 | tree ostep = fold_convert (itype, fd->loops[o].step)fold_convert_loc (((location_t) 0), itype, fd->loops[o].step ); |
2024 | t = build_int_cst (itype, (fd->loops[o].cond_code |
2025 | == LT_EXPR ? -1 : 1)); |
2026 | t = fold_build2 (PLUS_EXPR, itype, ostep, t)fold_build2_loc (((location_t) 0), PLUS_EXPR, itype, ostep, t ); |
2027 | t = fold_build2 (PLUS_EXPR, itype, t, n2o)fold_build2_loc (((location_t) 0), PLUS_EXPR, itype, t, n2o ); |
2028 | t = fold_build2 (MINUS_EXPR, itype, t, n1o)fold_build2_loc (((location_t) 0), MINUS_EXPR, itype, t, n1o ); |
2029 | if (TYPE_UNSIGNED (itype)((tree_class_check ((itype), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 2029, __FUNCTION__))->base.u.bits.unsigned_flag) |
2030 | && fd->loops[o].cond_code == GT_EXPR) |
2031 | t = fold_build2 (TRUNC_DIV_EXPR, itype,fold_build2_loc (((location_t) 0), TRUNC_DIV_EXPR, itype, fold_build1_loc (((location_t) 0), NEGATE_EXPR, itype, t ), fold_build1_loc ( ((location_t) 0), NEGATE_EXPR, itype, ostep ) ) |
2032 | fold_build1 (NEGATE_EXPR, itype, t),fold_build2_loc (((location_t) 0), TRUNC_DIV_EXPR, itype, fold_build1_loc (((location_t) 0), NEGATE_EXPR, itype, t ), fold_build1_loc ( ((location_t) 0), NEGATE_EXPR, itype, ostep ) ) |
2033 | fold_build1 (NEGATE_EXPR, itype, ostep))fold_build2_loc (((location_t) 0), TRUNC_DIV_EXPR, itype, fold_build1_loc (((location_t) 0), NEGATE_EXPR, itype, t ), fold_build1_loc ( ((location_t) 0), NEGATE_EXPR, itype, ostep ) ); |
2034 | else |
2035 | t = fold_build2 (TRUNC_DIV_EXPR, itype, t, ostep)fold_build2_loc (((location_t) 0), TRUNC_DIV_EXPR, itype, t, ostep ); |
2036 | tree outer_niters |
2037 | = force_gimple_operand_gsi (&gsi2, t, true, NULL_TREE(tree) nullptr, |
2038 | true, GSI_SAME_STMT); |
2039 | t = fold_build2 (MINUS_EXPR, itype, outer_niters,fold_build2_loc (((location_t) 0), MINUS_EXPR, itype, outer_niters , build_one_cst (itype) ) |
2040 | build_one_cst (itype))fold_build2_loc (((location_t) 0), MINUS_EXPR, itype, outer_niters , build_one_cst (itype) ); |
2041 | t = fold_build2 (MULT_EXPR, itype, t, ostep)fold_build2_loc (((location_t) 0), MULT_EXPR, itype, t, ostep ); |
2042 | t = fold_build2 (PLUS_EXPR, itype, n1o, t)fold_build2_loc (((location_t) 0), PLUS_EXPR, itype, n1o, t ); |
2043 | tree last = force_gimple_operand_gsi (&gsi2, t, true, NULL_TREE(tree) nullptr, |
2044 | true, GSI_SAME_STMT); |
2045 | tree n1, n2, n1e, n2e; |
2046 | t = fold_convert (itype, unshare_expr (fd->loops[i].n1))fold_convert_loc (((location_t) 0), itype, unshare_expr (fd-> loops[i].n1)); |
2047 | if (fd->loops[i].m1) |
2048 | { |
2049 | n1 = fold_convert (itype, unshare_expr (fd->loops[i].m1))fold_convert_loc (((location_t) 0), itype, unshare_expr (fd-> loops[i].m1)); |
2050 | n1 = fold_build2 (MULT_EXPR, itype, n1o, n1)fold_build2_loc (((location_t) 0), MULT_EXPR, itype, n1o, n1 ); |
2051 | n1 = fold_build2 (PLUS_EXPR, itype, n1, t)fold_build2_loc (((location_t) 0), PLUS_EXPR, itype, n1, t ); |
2052 | } |
2053 | else |
2054 | n1 = t; |
2055 | n1 = force_gimple_operand_gsi (&gsi2, n1, true, NULL_TREE(tree) nullptr, |
2056 | true, GSI_SAME_STMT); |
2057 | t = fold_convert (itype, unshare_expr (fd->loops[i].n2))fold_convert_loc (((location_t) 0), itype, unshare_expr (fd-> loops[i].n2)); |
2058 | if (fd->loops[i].m2) |
2059 | { |
2060 | n2 = fold_convert (itype, unshare_expr (fd->loops[i].m2))fold_convert_loc (((location_t) 0), itype, unshare_expr (fd-> loops[i].m2)); |
2061 | n2 = fold_build2 (MULT_EXPR, itype, n1o, n2)fold_build2_loc (((location_t) 0), MULT_EXPR, itype, n1o, n2 ); |
2062 | n2 = fold_build2 (PLUS_EXPR, itype, n2, t)fold_build2_loc (((location_t) 0), PLUS_EXPR, itype, n2, t ); |
2063 | } |
2064 | else |
2065 | n2 = t; |
2066 | n2 = force_gimple_operand_gsi (&gsi2, n2, true, NULL_TREE(tree) nullptr, |
2067 | true, GSI_SAME_STMT); |
2068 | t = fold_convert (itype, unshare_expr (fd->loops[i].n1))fold_convert_loc (((location_t) 0), itype, unshare_expr (fd-> loops[i].n1)); |
2069 | if (fd->loops[i].m1) |
2070 | { |
2071 | n1e = fold_convert (itype, unshare_expr (fd->loops[i].m1))fold_convert_loc (((location_t) 0), itype, unshare_expr (fd-> loops[i].m1)); |
2072 | n1e = fold_build2 (MULT_EXPR, itype, last, n1e)fold_build2_loc (((location_t) 0), MULT_EXPR, itype, last, n1e ); |
2073 | n1e = fold_build2 (PLUS_EXPR, itype, n1e, t)fold_build2_loc (((location_t) 0), PLUS_EXPR, itype, n1e, t ); |
2074 | } |
2075 | else |
2076 | n1e = t; |
2077 | n1e = force_gimple_operand_gsi (&gsi2, n1e, true, NULL_TREE(tree) nullptr, |
2078 | true, GSI_SAME_STMT); |
2079 | t = fold_convert (itype, unshare_expr (fd->loops[i].n2))fold_convert_loc (((location_t) 0), itype, unshare_expr (fd-> loops[i].n2)); |
2080 | if (fd->loops[i].m2) |
2081 | { |
2082 | n2e = fold_convert (itype, unshare_expr (fd->loops[i].m2))fold_convert_loc (((location_t) 0), itype, unshare_expr (fd-> loops[i].m2)); |
2083 | n2e = fold_build2 (MULT_EXPR, itype, last, n2e)fold_build2_loc (((location_t) 0), MULT_EXPR, itype, last, n2e ); |
2084 | n2e = fold_build2 (PLUS_EXPR, itype, n2e, t)fold_build2_loc (((location_t) 0), PLUS_EXPR, itype, n2e, t ); |
2085 | } |
2086 | else |
2087 | n2e = t; |
2088 | n2e = force_gimple_operand_gsi (&gsi2, n2e, true, NULL_TREE(tree) nullptr, |
2089 | true, GSI_SAME_STMT); |
2090 | gcond *cond_stmt |
2091 | = expand_omp_build_cond (&gsi2, fd->loops[i].cond_code, |
2092 | n1, n2); |
2093 | e = split_block (bb1, cond_stmt); |
2094 | e->flags = EDGE_TRUE_VALUE; |
2095 | e->probability = profile_probability::likely ().guessed (); |
2096 | basic_block bb2 = e->dest; |
2097 | gsi2 = gsi_after_labels (bb2); |
2098 | |
2099 | cond_stmt = expand_omp_build_cond (&gsi2, fd->loops[i].cond_code, |
2100 | n1e, n2e); |
2101 | e = split_block (bb2, cond_stmt); |
2102 | e->flags = EDGE_TRUE_VALUE; |
2103 | e->probability = profile_probability::likely ().guessed (); |
2104 | gsi2 = gsi_after_labels (e->dest); |
2105 | |
2106 | tree step = fold_convert (itype, fd->loops[i].step)fold_convert_loc (((location_t) 0), itype, fd->loops[i].step ); |
2107 | t = build_int_cst (itype, (fd->loops[i].cond_code |
2108 | == LT_EXPR ? -1 : 1)); |
2109 | t = fold_build2 (PLUS_EXPR, itype, step, t)fold_build2_loc (((location_t) 0), PLUS_EXPR, itype, step, t ); |
2110 | t = fold_build2 (PLUS_EXPR, itype, t, n2)fold_build2_loc (((location_t) 0), PLUS_EXPR, itype, t, n2 ); |
2111 | t = fold_build2 (MINUS_EXPR, itype, t, n1)fold_build2_loc (((location_t) 0), MINUS_EXPR, itype, t, n1 ); |
2112 | if (TYPE_UNSIGNED (itype)((tree_class_check ((itype), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 2112, __FUNCTION__))->base.u.bits.unsigned_flag) |
2113 | && fd->loops[i].cond_code == GT_EXPR) |
2114 | t = fold_build2 (TRUNC_DIV_EXPR, itype,fold_build2_loc (((location_t) 0), TRUNC_DIV_EXPR, itype, fold_build1_loc (((location_t) 0), NEGATE_EXPR, itype, t ), fold_build1_loc ( ((location_t) 0), NEGATE_EXPR, itype, step ) ) |
2115 | fold_build1 (NEGATE_EXPR, itype, t),fold_build2_loc (((location_t) 0), TRUNC_DIV_EXPR, itype, fold_build1_loc (((location_t) 0), NEGATE_EXPR, itype, t ), fold_build1_loc ( ((location_t) 0), NEGATE_EXPR, itype, step ) ) |
2116 | fold_build1 (NEGATE_EXPR, itype, step))fold_build2_loc (((location_t) 0), TRUNC_DIV_EXPR, itype, fold_build1_loc (((location_t) 0), NEGATE_EXPR, itype, t ), fold_build1_loc ( ((location_t) 0), NEGATE_EXPR, itype, step ) ); |
2117 | else |
2118 | t = fold_build2 (TRUNC_DIV_EXPR, itype, t, step)fold_build2_loc (((location_t) 0), TRUNC_DIV_EXPR, itype, t, step ); |
2119 | tree first_inner_iterations |
2120 | = force_gimple_operand_gsi (&gsi2, t, true, NULL_TREE(tree) nullptr, |
2121 | true, GSI_SAME_STMT); |
2122 | t = fold_build2 (MULT_EXPR, itype, m2minusm1, ostep)fold_build2_loc (((location_t) 0), MULT_EXPR, itype, m2minusm1 , ostep ); |
2123 | if (TYPE_UNSIGNED (itype)((tree_class_check ((itype), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 2123, __FUNCTION__))->base.u.bits.unsigned_flag) |
2124 | && fd->loops[i].cond_code == GT_EXPR) |
2125 | t = fold_build2 (TRUNC_DIV_EXPR, itype,fold_build2_loc (((location_t) 0), TRUNC_DIV_EXPR, itype, fold_build1_loc (((location_t) 0), NEGATE_EXPR, itype, t ), fold_build1_loc ( ((location_t) 0), NEGATE_EXPR, itype, step ) ) |
2126 | fold_build1 (NEGATE_EXPR, itype, t),fold_build2_loc (((location_t) 0), TRUNC_DIV_EXPR, itype, fold_build1_loc (((location_t) 0), NEGATE_EXPR, itype, t ), fold_build1_loc ( ((location_t) 0), NEGATE_EXPR, itype, step ) ) |
2127 | fold_build1 (NEGATE_EXPR, itype, step))fold_build2_loc (((location_t) 0), TRUNC_DIV_EXPR, itype, fold_build1_loc (((location_t) 0), NEGATE_EXPR, itype, t ), fold_build1_loc ( ((location_t) 0), NEGATE_EXPR, itype, step ) ); |
2128 | else |
2129 | t = fold_build2 (TRUNC_DIV_EXPR, itype, t, step)fold_build2_loc (((location_t) 0), TRUNC_DIV_EXPR, itype, t, step ); |
2130 | tree factor |
2131 | = force_gimple_operand_gsi (&gsi2, t, true, NULL_TREE(tree) nullptr, |
2132 | true, GSI_SAME_STMT); |
2133 | t = fold_build2 (MINUS_EXPR, itype, outer_niters,fold_build2_loc (((location_t) 0), MINUS_EXPR, itype, outer_niters , build_one_cst (itype) ) |
2134 | build_one_cst (itype))fold_build2_loc (((location_t) 0), MINUS_EXPR, itype, outer_niters , build_one_cst (itype) ); |
2135 | t = fold_build2 (MULT_EXPR, itype, t, outer_niters)fold_build2_loc (((location_t) 0), MULT_EXPR, itype, t, outer_niters ); |
2136 | t = fold_build2 (RSHIFT_EXPR, itype, t, integer_one_node)fold_build2_loc (((location_t) 0), RSHIFT_EXPR, itype, t, global_trees [TI_INTEGER_ONE] ); |
2137 | t = fold_build2 (MULT_EXPR, itype, factor, t)fold_build2_loc (((location_t) 0), MULT_EXPR, itype, factor, t ); |
2138 | t = fold_build2 (PLUS_EXPR, itype,fold_build2_loc (((location_t) 0), PLUS_EXPR, itype, fold_build2_loc (((location_t) 0), MULT_EXPR, itype, outer_niters, first_inner_iterations ), t ) |
2139 | fold_build2 (MULT_EXPR, itype, outer_niters,fold_build2_loc (((location_t) 0), PLUS_EXPR, itype, fold_build2_loc (((location_t) 0), MULT_EXPR, itype, outer_niters, first_inner_iterations ), t ) |
2140 | first_inner_iterations), t)fold_build2_loc (((location_t) 0), PLUS_EXPR, itype, fold_build2_loc (((location_t) 0), MULT_EXPR, itype, outer_niters, first_inner_iterations ), t ); |
2141 | expand_omp_build_assign (&gsi2, counts[fd->last_nonrect], |
2142 | fold_convert (type, t)fold_convert_loc (((location_t) 0), type, t)); |
2143 | |
2144 | basic_block bb3 = create_empty_bb (bb1); |
2145 | add_bb_to_loop (bb3, bb1->loop_father); |
2146 | |
2147 | e = make_edge (bb1, bb3, EDGE_FALSE_VALUE); |
2148 | e->probability = profile_probability::unlikely ().guessed (); |
2149 | |
2150 | gsi2 = gsi_after_labels (bb3); |
2151 | cond_stmt = expand_omp_build_cond (&gsi2, fd->loops[i].cond_code, |
2152 | n1e, n2e); |
2153 | e = split_block (bb3, cond_stmt); |
2154 | e->flags = EDGE_TRUE_VALUE; |
2155 | e->probability = profile_probability::likely ().guessed (); |
2156 | basic_block bb4 = e->dest; |
2157 | |
2158 | ne = make_edge (bb3, entry_bb, EDGE_FALSE_VALUE); |
2159 | ne->probability = e->probability.invert (); |
2160 | |
2161 | basic_block bb5 = create_empty_bb (bb2); |
2162 | add_bb_to_loop (bb5, bb2->loop_father); |
2163 | |
2164 | ne = make_edge (bb2, bb5, EDGE_FALSE_VALUE); |
2165 | ne->probability = profile_probability::unlikely ().guessed (); |
2166 | |
2167 | for (int j = 0; j < 2; j++) |
2168 | { |
2169 | gsi2 = gsi_after_labels (j ? bb5 : bb4); |
2170 | t = fold_build2 (MINUS_EXPR, itype,fold_build2_loc (((location_t) 0), MINUS_EXPR, itype, unshare_expr (fd->loops[i].n1), unshare_expr (fd->loops[i].n2) ) |
2171 | unshare_expr (fd->loops[i].n1),fold_build2_loc (((location_t) 0), MINUS_EXPR, itype, unshare_expr (fd->loops[i].n1), unshare_expr (fd->loops[i].n2) ) |
2172 | unshare_expr (fd->loops[i].n2))fold_build2_loc (((location_t) 0), MINUS_EXPR, itype, unshare_expr (fd->loops[i].n1), unshare_expr (fd->loops[i].n2) ); |
2173 | t = fold_build2 (TRUNC_DIV_EXPR, itype, t, m2minusm1)fold_build2_loc (((location_t) 0), TRUNC_DIV_EXPR, itype, t, m2minusm1 ); |
2174 | tree tem |
2175 | = force_gimple_operand_gsi (&gsi2, t, true, NULL_TREE(tree) nullptr, |
2176 | true, GSI_SAME_STMT); |
2177 | t = fold_build2 (MINUS_EXPR, itype, tem, n1o)fold_build2_loc (((location_t) 0), MINUS_EXPR, itype, tem, n1o ); |
2178 | t = fold_build2 (TRUNC_MOD_EXPR, itype, t, ostep)fold_build2_loc (((location_t) 0), TRUNC_MOD_EXPR, itype, t, ostep ); |
2179 | t = fold_build2 (MINUS_EXPR, itype, tem, t)fold_build2_loc (((location_t) 0), MINUS_EXPR, itype, tem, t ); |
2180 | tem = force_gimple_operand_gsi (&gsi2, t, true, NULL_TREE(tree) nullptr, |
2181 | true, GSI_SAME_STMT); |
2182 | t = fold_convert (itype, unshare_expr (fd->loops[i].n1))fold_convert_loc (((location_t) 0), itype, unshare_expr (fd-> loops[i].n1)); |
2183 | if (fd->loops[i].m1) |
2184 | { |
2185 | n1 = fold_convert (itype, unshare_expr (fd->loops[i].m1))fold_convert_loc (((location_t) 0), itype, unshare_expr (fd-> loops[i].m1)); |
2186 | n1 = fold_build2 (MULT_EXPR, itype, tem, n1)fold_build2_loc (((location_t) 0), MULT_EXPR, itype, tem, n1 ); |
2187 | n1 = fold_build2 (PLUS_EXPR, itype, n1, t)fold_build2_loc (((location_t) 0), PLUS_EXPR, itype, n1, t ); |
2188 | } |
2189 | else |
2190 | n1 = t; |
2191 | n1 = force_gimple_operand_gsi (&gsi2, n1, true, NULL_TREE(tree) nullptr, |
2192 | true, GSI_SAME_STMT); |
2193 | t = fold_convert (itype, unshare_expr (fd->loops[i].n2))fold_convert_loc (((location_t) 0), itype, unshare_expr (fd-> loops[i].n2)); |
2194 | if (fd->loops[i].m2) |
2195 | { |
2196 | n2 = fold_convert (itype, unshare_expr (fd->loops[i].m2))fold_convert_loc (((location_t) 0), itype, unshare_expr (fd-> loops[i].m2)); |
2197 | n2 = fold_build2 (MULT_EXPR, itype, tem, n2)fold_build2_loc (((location_t) 0), MULT_EXPR, itype, tem, n2 ); |
2198 | n2 = fold_build2 (PLUS_EXPR, itype, n2, t)fold_build2_loc (((location_t) 0), PLUS_EXPR, itype, n2, t ); |
2199 | } |
2200 | else |
2201 | n2 = t; |
2202 | n2 = force_gimple_operand_gsi (&gsi2, n2, true, NULL_TREE(tree) nullptr, |
2203 | true, GSI_SAME_STMT); |
2204 | expand_omp_build_assign (&gsi2, j ? n2o : n1o, tem); |
2205 | |
2206 | cond_stmt = expand_omp_build_cond (&gsi2, fd->loops[i].cond_code, |
2207 | n1, n2); |
2208 | e = split_block (gsi_bb (gsi2), cond_stmt); |
2209 | e->flags = j ? EDGE_TRUE_VALUE : EDGE_FALSE_VALUE; |
2210 | e->probability = profile_probability::unlikely ().guessed (); |
2211 | ne = make_edge (e->src, bb1, |
2212 | j ? EDGE_FALSE_VALUE : EDGE_TRUE_VALUE); |
2213 | ne->probability = e->probability.invert (); |
2214 | gsi2 = gsi_after_labels (e->dest); |
2215 | |
2216 | t = fold_build2 (PLUS_EXPR, itype, tem, ostep)fold_build2_loc (((location_t) 0), PLUS_EXPR, itype, tem, ostep ); |
2217 | expand_omp_build_assign (&gsi2, j ? n2o : n1o, t); |
2218 | |
2219 | make_edge (e->dest, bb1, EDGE_FALLTHRU); |
2220 | } |
2221 | |
2222 | set_immediate_dominator (CDI_DOMINATORS, bb3, bb1); |
2223 | set_immediate_dominator (CDI_DOMINATORS, bb5, bb2); |
2224 | set_immediate_dominator (CDI_DOMINATORS, entry_bb, bb1); |
2225 | |
2226 | if (fd->first_nonrect + 1 == fd->last_nonrect) |
2227 | { |
2228 | fd->first_inner_iterations = first_inner_iterations; |
2229 | fd->factor = factor; |
2230 | fd->adjn1 = n1o; |
2231 | } |
2232 | } |
2233 | else |
2234 | { |
2235 | /* Fallback implementation. Evaluate the loops with m1/m2 |
2236 | non-NULL as well as their outer loops at runtime using temporaries |
2237 | instead of the original iteration variables, and in the |
2238 | body just bump the counter. */ |
2239 | gimple_stmt_iterator gsi2 = *gsi; |
2240 | gsi_prev (&gsi2); |
2241 | e = split_block (entry_bb, gsi_stmt (gsi2)); |
2242 | e = split_block (e->dest, (gimple *) NULLnullptr); |
2243 | basic_block cur_bb = e->src; |
2244 | basic_block next_bb = e->dest; |
2245 | entry_bb = e->dest; |
2246 | *gsi = gsi_after_labels (entry_bb); |
2247 | |
2248 | tree *vs = XALLOCAVEC (tree, fd->last_nonrect)((tree *) __builtin_alloca(sizeof (tree) * (fd->last_nonrect ))); |
2249 | memset (vs, 0, fd->last_nonrect * sizeof (tree)); |
2250 | |
2251 | for (i = 0; i <= fd->last_nonrect; i++) |
2252 | { |
2253 | if (fd->loops[i].m1 == NULL_TREE(tree) nullptr |
2254 | && fd->loops[i].m2 == NULL_TREE(tree) nullptr |
2255 | && !fd->loops[i].non_rect_referenced) |
2256 | continue; |
2257 | |
2258 | tree itype = TREE_TYPE (fd->loops[i].v)((contains_struct_check ((fd->loops[i].v), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 2258, __FUNCTION__))->typed.type); |
2259 | |
2260 | gsi2 = gsi_after_labels (cur_bb); |
2261 | tree n1, n2; |
2262 | t = fold_convert (itype, unshare_expr (fd->loops[i].n1))fold_convert_loc (((location_t) 0), itype, unshare_expr (fd-> loops[i].n1)); |
2263 | if (fd->loops[i].m1 == NULL_TREE(tree) nullptr) |
2264 | n1 = t; |
2265 | else if (POINTER_TYPE_P (itype)(((enum tree_code) (itype)->base.code) == POINTER_TYPE || ( (enum tree_code) (itype)->base.code) == REFERENCE_TYPE)) |
2266 | { |
2267 | gcc_assert (integer_onep (fd->loops[i].m1))((void)(!(integer_onep (fd->loops[i].m1)) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 2267, __FUNCTION__), 0 : 0)); |
2268 | t = unshare_expr (fd->loops[i].n1); |
2269 | n1 = fold_build_pointer_plus (vs[i - fd->loops[i].outer], t)fold_build_pointer_plus_loc (((location_t) 0), vs[i - fd-> loops[i].outer], t); |
2270 | } |
2271 | else |
2272 | { |
2273 | n1 = fold_convert (itype, unshare_expr (fd->loops[i].m1))fold_convert_loc (((location_t) 0), itype, unshare_expr (fd-> loops[i].m1)); |
2274 | n1 = fold_build2 (MULT_EXPR, itype,fold_build2_loc (((location_t) 0), MULT_EXPR, itype, vs[i - fd ->loops[i].outer], n1 ) |
2275 | vs[i - fd->loops[i].outer], n1)fold_build2_loc (((location_t) 0), MULT_EXPR, itype, vs[i - fd ->loops[i].outer], n1 ); |
2276 | n1 = fold_build2 (PLUS_EXPR, itype, n1, t)fold_build2_loc (((location_t) 0), PLUS_EXPR, itype, n1, t ); |
2277 | } |
2278 | n1 = force_gimple_operand_gsi (&gsi2, n1, true, NULL_TREE(tree) nullptr, |
2279 | true, GSI_SAME_STMT); |
2280 | if (i < fd->last_nonrect) |
2281 | { |
2282 | vs[i] = create_tmp_reg (itype, ".it"); |
2283 | expand_omp_build_assign (&gsi2, vs[i], n1); |
2284 | } |
2285 | t = fold_convert (itype, unshare_expr (fd->loops[i].n2))fold_convert_loc (((location_t) 0), itype, unshare_expr (fd-> loops[i].n2)); |
2286 | if (fd->loops[i].m2 == NULL_TREE(tree) nullptr) |
2287 | n2 = t; |
2288 | else if (POINTER_TYPE_P (itype)(((enum tree_code) (itype)->base.code) == POINTER_TYPE || ( (enum tree_code) (itype)->base.code) == REFERENCE_TYPE)) |
2289 | { |
2290 | gcc_assert (integer_onep (fd->loops[i].m2))((void)(!(integer_onep (fd->loops[i].m2)) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 2290, __FUNCTION__), 0 : 0)); |
2291 | t = unshare_expr (fd->loops[i].n2); |
2292 | n2 = fold_build_pointer_plus (vs[i - fd->loops[i].outer], t)fold_build_pointer_plus_loc (((location_t) 0), vs[i - fd-> loops[i].outer], t); |
2293 | } |
2294 | else |
2295 | { |
2296 | n2 = fold_convert (itype, unshare_expr (fd->loops[i].m2))fold_convert_loc (((location_t) 0), itype, unshare_expr (fd-> loops[i].m2)); |
2297 | n2 = fold_build2 (MULT_EXPR, itype,fold_build2_loc (((location_t) 0), MULT_EXPR, itype, vs[i - fd ->loops[i].outer], n2 ) |
2298 | vs[i - fd->loops[i].outer], n2)fold_build2_loc (((location_t) 0), MULT_EXPR, itype, vs[i - fd ->loops[i].outer], n2 ); |
2299 | n2 = fold_build2 (PLUS_EXPR, itype, n2, t)fold_build2_loc (((location_t) 0), PLUS_EXPR, itype, n2, t ); |
2300 | } |
2301 | n2 = force_gimple_operand_gsi (&gsi2, n2, true, NULL_TREE(tree) nullptr, |
2302 | true, GSI_SAME_STMT); |
2303 | if (POINTER_TYPE_P (itype)(((enum tree_code) (itype)->base.code) == POINTER_TYPE || ( (enum tree_code) (itype)->base.code) == REFERENCE_TYPE)) |
2304 | itype = signed_type_for (itype); |
2305 | if (i == fd->last_nonrect) |
2306 | { |
2307 | gcond *cond_stmt |
2308 | = expand_omp_build_cond (&gsi2, fd->loops[i].cond_code, |
2309 | n1, n2); |
2310 | e = split_block (cur_bb, cond_stmt); |
2311 | e->flags = EDGE_TRUE_VALUE; |
2312 | ne = make_edge (cur_bb, next_bb, EDGE_FALSE_VALUE); |
2313 | e->probability = profile_probability::likely ().guessed (); |
2314 | ne->probability = e->probability.invert (); |
2315 | gsi2 = gsi_after_labels (e->dest); |
2316 | |
2317 | t = build_int_cst (itype, (fd->loops[i].cond_code == LT_EXPR |
2318 | ? -1 : 1)); |
2319 | t = fold_build2 (PLUS_EXPR, itype,fold_build2_loc (((location_t) 0), PLUS_EXPR, itype, fold_convert_loc (((location_t) 0), itype, fd->loops[i].step), t ) |
2320 | fold_convert (itype, fd->loops[i].step), t)fold_build2_loc (((location_t) 0), PLUS_EXPR, itype, fold_convert_loc (((location_t) 0), itype, fd->loops[i].step), t ); |
2321 | t = fold_build2 (PLUS_EXPR, itype, t,fold_build2_loc (((location_t) 0), PLUS_EXPR, itype, t, fold_convert_loc (((location_t) 0), itype, n2) ) |
2322 | fold_convert (itype, n2))fold_build2_loc (((location_t) 0), PLUS_EXPR, itype, t, fold_convert_loc (((location_t) 0), itype, n2) ); |
2323 | t = fold_build2 (MINUS_EXPR, itype, t,fold_build2_loc (((location_t) 0), MINUS_EXPR, itype, t, fold_convert_loc (((location_t) 0), itype, n1) ) |
2324 | fold_convert (itype, n1))fold_build2_loc (((location_t) 0), MINUS_EXPR, itype, t, fold_convert_loc (((location_t) 0), itype, n1) ); |
2325 | tree step = fold_convert (itype, fd->loops[i].step)fold_convert_loc (((location_t) 0), itype, fd->loops[i].step ); |
2326 | if (TYPE_UNSIGNED (itype)((tree_class_check ((itype), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 2326, __FUNCTION__))->base.u.bits.unsigned_flag) |
2327 | && fd->loops[i].cond_code == GT_EXPR) |
2328 | t = fold_build2 (TRUNC_DIV_EXPR, itype,fold_build2_loc (((location_t) 0), TRUNC_DIV_EXPR, itype, fold_build1_loc (((location_t) 0), NEGATE_EXPR, itype, t ), fold_build1_loc ( ((location_t) 0), NEGATE_EXPR, itype, step ) ) |
2329 | fold_build1 (NEGATE_EXPR, itype, t),fold_build2_loc (((location_t) 0), TRUNC_DIV_EXPR, itype, fold_build1_loc (((location_t) 0), NEGATE_EXPR, itype, t ), fold_build1_loc ( ((location_t) 0), NEGATE_EXPR, itype, step ) ) |
2330 | fold_build1 (NEGATE_EXPR, itype, step))fold_build2_loc (((location_t) 0), TRUNC_DIV_EXPR, itype, fold_build1_loc (((location_t) 0), NEGATE_EXPR, itype, t ), fold_build1_loc ( ((location_t) 0), NEGATE_EXPR, itype, step ) ); |
2331 | else |
2332 | t = fold_build2 (TRUNC_DIV_EXPR, itype, t, step)fold_build2_loc (((location_t) 0), TRUNC_DIV_EXPR, itype, t, step ); |
2333 | t = fold_convert (type, t)fold_convert_loc (((location_t) 0), type, t); |
2334 | t = fold_build2 (PLUS_EXPR, type,fold_build2_loc (((location_t) 0), PLUS_EXPR, type, counts[fd ->last_nonrect], t ) |
2335 | counts[fd->last_nonrect], t)fold_build2_loc (((location_t) 0), PLUS_EXPR, type, counts[fd ->last_nonrect], t ); |
2336 | t = force_gimple_operand_gsi (&gsi2, t, true, NULL_TREE(tree) nullptr, |
2337 | true, GSI_SAME_STMT); |
2338 | expand_omp_build_assign (&gsi2, counts[fd->last_nonrect], t); |
2339 | e = make_edge (e->dest, next_bb, EDGE_FALLTHRU); |
2340 | set_immediate_dominator (CDI_DOMINATORS, next_bb, cur_bb); |
2341 | break; |
2342 | } |
2343 | e = split_block (cur_bb, last_stmt (cur_bb)); |
2344 | |
2345 | basic_block new_cur_bb = create_empty_bb (cur_bb); |
2346 | add_bb_to_loop (new_cur_bb, cur_bb->loop_father); |
2347 | |
2348 | gsi2 = gsi_after_labels (e->dest); |
2349 | tree step = fold_convert (itype,fold_convert_loc (((location_t) 0), itype, unshare_expr (fd-> loops[i].step)) |
2350 | unshare_expr (fd->loops[i].step))fold_convert_loc (((location_t) 0), itype, unshare_expr (fd-> loops[i].step)); |
2351 | if (POINTER_TYPE_P (TREE_TYPE (vs[i]))(((enum tree_code) (((contains_struct_check ((vs[i]), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 2351, __FUNCTION__))->typed.type))->base.code) == POINTER_TYPE || ((enum tree_code) (((contains_struct_check ((vs[i]), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 2351, __FUNCTION__))->typed.type))->base.code) == REFERENCE_TYPE )) |
2352 | t = fold_build_pointer_plus (vs[i], step)fold_build_pointer_plus_loc (((location_t) 0), vs[i], step); |
2353 | else |
2354 | t = fold_build2 (PLUS_EXPR, itype, vs[i], step)fold_build2_loc (((location_t) 0), PLUS_EXPR, itype, vs[i], step ); |
2355 | t = force_gimple_operand_gsi (&gsi2, t, true, NULL_TREE(tree) nullptr, |
2356 | true, GSI_SAME_STMT); |
2357 | expand_omp_build_assign (&gsi2, vs[i], t); |
2358 | |
2359 | ne = split_block (e->dest, last_stmt (e->dest)); |
2360 | gsi2 = gsi_after_labels (ne->dest); |
2361 | |
2362 | expand_omp_build_cond (&gsi2, fd->loops[i].cond_code, vs[i], n2); |
2363 | edge e3, e4; |
2364 | if (next_bb == entry_bb) |
2365 | { |
2366 | e3 = find_edge (ne->dest, next_bb); |
2367 | e3->flags = EDGE_FALSE_VALUE; |
2368 | } |
2369 | else |
2370 | e3 = make_edge (ne->dest, next_bb, EDGE_FALSE_VALUE); |
2371 | e4 = make_edge (ne->dest, new_cur_bb, EDGE_TRUE_VALUE); |
2372 | e4->probability = profile_probability::likely ().guessed (); |
2373 | e3->probability = e4->probability.invert (); |
2374 | basic_block esrc = e->src; |
2375 | make_edge (e->src, ne->dest, EDGE_FALLTHRU); |
2376 | cur_bb = new_cur_bb; |
2377 | basic_block latch_bb = next_bb; |
2378 | next_bb = e->dest; |
2379 | remove_edge (e); |
2380 | set_immediate_dominator (CDI_DOMINATORS, ne->dest, esrc); |
2381 | set_immediate_dominator (CDI_DOMINATORS, latch_bb, ne->dest); |
2382 | set_immediate_dominator (CDI_DOMINATORS, cur_bb, ne->dest); |
2383 | } |
2384 | } |
2385 | t = NULL_TREE(tree) nullptr; |
2386 | for (i = fd->first_nonrect; i < fd->last_nonrect; i++) |
2387 | if (!fd->loops[i].non_rect_referenced |
2388 | && fd->loops[i].m1 == NULL_TREE(tree) nullptr |
2389 | && fd->loops[i].m2 == NULL_TREE(tree) nullptr) |
2390 | { |
2391 | if (t == NULL_TREE(tree) nullptr) |
2392 | t = counts[i]; |
2393 | else |
2394 | t = fold_build2 (MULT_EXPR, type, t, counts[i])fold_build2_loc (((location_t) 0), MULT_EXPR, type, t, counts [i] ); |
2395 | } |
2396 | if (t) |
2397 | { |
2398 | t = fold_build2 (MULT_EXPR, type, counts[fd->last_nonrect], t)fold_build2_loc (((location_t) 0), MULT_EXPR, type, counts[fd ->last_nonrect], t ); |
2399 | expand_omp_build_assign (gsi, counts[fd->last_nonrect], t); |
2400 | } |
2401 | if (!rect_count_seen) |
2402 | t = counts[fd->last_nonrect]; |
2403 | else |
2404 | t = fold_build2 (MULT_EXPR, type, fd->loop.n2,fold_build2_loc (((location_t) 0), MULT_EXPR, type, fd->loop .n2, counts[fd->last_nonrect] ) |
2405 | counts[fd->last_nonrect])fold_build2_loc (((location_t) 0), MULT_EXPR, type, fd->loop .n2, counts[fd->last_nonrect] ); |
2406 | expand_omp_build_assign (gsi, fd->loop.n2, t); |
2407 | } |
2408 | else if (fd->non_rect) |
2409 | { |
2410 | tree t = fd->loop.n2; |
2411 | gcc_assert (TREE_CODE (t) == INTEGER_CST)((void)(!(((enum tree_code) (t)->base.code) == INTEGER_CST ) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 2411, __FUNCTION__), 0 : 0)); |
2412 | int non_rect_referenced = 0, non_rect = 0; |
2413 | for (i = 0; i < fd->collapse; i++) |
2414 | { |
2415 | if ((i < fd->first_nonrect || i > fd->last_nonrect) |
2416 | && !integer_zerop (counts[i])) |
2417 | t = fold_build2 (TRUNC_DIV_EXPR, type, t, counts[i])fold_build2_loc (((location_t) 0), TRUNC_DIV_EXPR, type, t, counts [i] ); |
2418 | if (fd->loops[i].non_rect_referenced) |
2419 | non_rect_referenced++; |
2420 | if (fd->loops[i].m1 || fd->loops[i].m2) |
2421 | non_rect++; |
2422 | } |
2423 | gcc_assert (non_rect == 1 && non_rect_referenced == 1)((void)(!(non_rect == 1 && non_rect_referenced == 1) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 2423, __FUNCTION__), 0 : 0)); |
2424 | counts[fd->last_nonrect] = t; |
2425 | } |
2426 | } |
2427 | |
2428 | /* Helper function for expand_omp_{for_*,simd}. Generate code like: |
2429 | T = V; |
2430 | V3 = N31 + (T % count3) * STEP3; |
2431 | T = T / count3; |
2432 | V2 = N21 + (T % count2) * STEP2; |
2433 | T = T / count2; |
2434 | V1 = N11 + T * STEP1; |
2435 | if this loop doesn't have an inner loop construct combined with it. |
2436 | If it does have an inner loop construct combined with it and the |
2437 | iteration count isn't known constant, store values from counts array |
2438 | into its _looptemp_ temporaries instead. |
2439 | For non-rectangular loops (between fd->first_nonrect and fd->last_nonrect |
2440 | inclusive), use the count of all those loops together, and either |
2441 | find quadratic etc. equation roots, or as a fallback, do: |
2442 | COUNT = 0; |
2443 | for (tmpi = N11; tmpi COND1 N12; tmpi += STEP1) |
2444 | for (tmpj = M21 * tmpi + N21; |
2445 | tmpj COND2 M22 * tmpi + N22; tmpj += STEP2) |
2446 | { |
2447 | int tmpk1 = M31 * tmpj + N31; |
2448 | int tmpk2 = M32 * tmpj + N32; |
2449 | if (tmpk1 COND3 tmpk2) |
2450 | { |
2451 | if (COND3 is <) |
2452 | adj = STEP3 - 1; |
2453 | else |
2454 | adj = STEP3 + 1; |
2455 | int temp = (adj + tmpk2 - tmpk1) / STEP3; |
2456 | if (COUNT + temp > T) |
2457 | { |
2458 | V1 = tmpi; |
2459 | V2 = tmpj; |
2460 | V3 = tmpk1 + (T - COUNT) * STEP3; |
2461 | goto done; |
2462 | } |
2463 | else |
2464 | COUNT += temp; |
2465 | } |
2466 | } |
2467 | done:; |
2468 | but for optional innermost or outermost rectangular loops that aren't |
2469 | referenced by other loop expressions keep doing the division/modulo. */ |
2470 | |
2471 | static void |
2472 | expand_omp_for_init_vars (struct omp_for_data *fd, gimple_stmt_iterator *gsi, |
2473 | tree *counts, tree *nonrect_bounds, |
2474 | gimple *inner_stmt, tree startvar) |
2475 | { |
2476 | int i; |
2477 | if (gimple_omp_for_combined_p (fd->for_stmt)) |
2478 | { |
2479 | /* If fd->loop.n2 is constant, then no propagation of the counts |
2480 | is needed, they are constant. */ |
2481 | if (TREE_CODE (fd->loop.n2)((enum tree_code) (fd->loop.n2)->base.code) == INTEGER_CST) |
2482 | return; |
2483 | |
2484 | tree clauses = gimple_code (inner_stmt) != GIMPLE_OMP_FOR |
2485 | ? gimple_omp_taskreg_clauses (inner_stmt) |
2486 | : gimple_omp_for_clauses (inner_stmt); |
2487 | /* First two _looptemp_ clauses are for istart/iend, counts[0] |
2488 | isn't supposed to be handled, as the inner loop doesn't |
2489 | use it. */ |
2490 | tree innerc = omp_find_clause (clauses, OMP_CLAUSE__LOOPTEMP_); |
2491 | gcc_assert (innerc)((void)(!(innerc) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 2491, __FUNCTION__), 0 : 0)); |
2492 | int count = 0; |
2493 | if (fd->non_rect |
2494 | && fd->last_nonrect == fd->first_nonrect + 1 |
2495 | && !TYPE_UNSIGNED (TREE_TYPE (fd->loops[fd->last_nonrect].v))((tree_class_check ((((contains_struct_check ((fd->loops[fd ->last_nonrect].v), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 2495, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 2495, __FUNCTION__))->base.u.bits.unsigned_flag)) |
2496 | count = 4; |
2497 | for (i = 0; i < fd->collapse + count; i++) |
2498 | { |
2499 | innerc = omp_find_clause (OMP_CLAUSE_CHAIN (innerc)((contains_struct_check (((tree_check ((innerc), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 2499, __FUNCTION__, (OMP_CLAUSE)))), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 2499, __FUNCTION__))->common.chain), |
2500 | OMP_CLAUSE__LOOPTEMP_); |
2501 | gcc_assert (innerc)((void)(!(innerc) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 2501, __FUNCTION__), 0 : 0)); |
2502 | if (i) |
2503 | { |
2504 | tree tem = OMP_CLAUSE_DECL (innerc)(*(omp_clause_elt_check (((omp_clause_range_check (((tree_check ((innerc), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 2504, __FUNCTION__, (OMP_CLAUSE)))), (OMP_CLAUSE_PRIVATE), ( OMP_CLAUSE__SCANTEMP_), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 2504, __FUNCTION__))), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 2504, __FUNCTION__))); |
2505 | tree t; |
2506 | if (i < fd->collapse) |
2507 | t = counts[i]; |
2508 | else |
2509 | switch (i - fd->collapse) |
2510 | { |
2511 | case 0: t = counts[0]; break; |
2512 | case 1: t = fd->first_inner_iterations; break; |
2513 | case 2: t = fd->factor; break; |
2514 | case 3: t = fd->adjn1; break; |
2515 | default: gcc_unreachable ()(fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 2515, __FUNCTION__)); |
2516 | } |
2517 | t = fold_convert (TREE_TYPE (tem), t)fold_convert_loc (((location_t) 0), ((contains_struct_check ( (tem), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 2517, __FUNCTION__))->typed.type), t); |
2518 | t = force_gimple_operand_gsi (gsi, t, false, NULL_TREE(tree) nullptr, |
2519 | false, GSI_CONTINUE_LINKING); |
2520 | gassign *stmt = gimple_build_assign (tem, t); |
2521 | gsi_insert_after (gsi, stmt, GSI_CONTINUE_LINKING); |
2522 | } |
2523 | } |
2524 | return; |
2525 | } |
2526 | |
2527 | tree type = TREE_TYPE (fd->loop.v)((contains_struct_check ((fd->loop.v), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 2527, __FUNCTION__))->typed.type); |
2528 | tree tem = create_tmp_reg (type, ".tem"); |
2529 | gassign *stmt = gimple_build_assign (tem, startvar); |
2530 | gsi_insert_after (gsi, stmt, GSI_CONTINUE_LINKING); |
2531 | |
2532 | for (i = fd->collapse - 1; i >= 0; i--) |
2533 | { |
2534 | tree vtype = TREE_TYPE (fd->loops[i].v)((contains_struct_check ((fd->loops[i].v), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 2534, __FUNCTION__))->typed.type), itype, t; |
2535 | itype = vtype; |
2536 | if (POINTER_TYPE_P (vtype)(((enum tree_code) (vtype)->base.code) == POINTER_TYPE || ( (enum tree_code) (vtype)->base.code) == REFERENCE_TYPE)) |
2537 | itype = signed_type_for (vtype); |
2538 | if (i != 0 && (i != fd->last_nonrect || fd->first_nonrect)) |
2539 | t = fold_build2 (TRUNC_MOD_EXPR, type, tem, counts[i])fold_build2_loc (((location_t) 0), TRUNC_MOD_EXPR, type, tem, counts[i] ); |
2540 | else |
2541 | t = tem; |
2542 | if (i == fd->last_nonrect) |
2543 | { |
2544 | t = force_gimple_operand_gsi (gsi, t, true, NULL_TREE(tree) nullptr, |
2545 | false, GSI_CONTINUE_LINKING); |
2546 | tree stopval = t; |
2547 | tree idx = create_tmp_reg (type, ".count"); |
2548 | expand_omp_build_assign (gsi, idx, |
2549 | build_zero_cst (type), true); |
2550 | basic_block bb_triang = NULLnullptr, bb_triang_dom = NULLnullptr; |
2551 | if (fd->first_nonrect + 1 == fd->last_nonrect |
2552 | && (TREE_CODE (fd->loop.n2)((enum tree_code) (fd->loop.n2)->base.code) == INTEGER_CST |
2553 | || fd->first_inner_iterations) |
2554 | && (optab_handler (sqrt_optab, TYPE_MODE (double_type_node)((((enum tree_code) ((tree_class_check ((global_trees[TI_DOUBLE_TYPE ]), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 2554, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode (global_trees[TI_DOUBLE_TYPE]) : (global_trees[TI_DOUBLE_TYPE ])->type_common.mode)) |
2555 | != CODE_FOR_nothing) |
2556 | && !integer_zerop (fd->loop.n2)) |
2557 | { |
2558 | tree outer_n1 = fd->adjn1 ? fd->adjn1 : fd->loops[i - 1].n1; |
2559 | tree itype = TREE_TYPE (fd->loops[i].v)((contains_struct_check ((fd->loops[i].v), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 2559, __FUNCTION__))->typed.type); |
2560 | tree first_inner_iterations = fd->first_inner_iterations; |
2561 | tree factor = fd->factor; |
2562 | gcond *cond_stmt |
2563 | = expand_omp_build_cond (gsi, NE_EXPR, factor, |
2564 | build_zero_cst (TREE_TYPE (factor)((contains_struct_check ((factor), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 2564, __FUNCTION__))->typed.type))); |
2565 | edge e = split_block (gsi_bb (*gsi), cond_stmt); |
2566 | basic_block bb0 = e->src; |
2567 | e->flags = EDGE_TRUE_VALUE; |
2568 | e->probability = profile_probability::likely (); |
2569 | bb_triang_dom = bb0; |
2570 | *gsi = gsi_after_labels (e->dest); |
2571 | tree slltype = long_long_integer_type_nodeinteger_types[itk_long_long]; |
2572 | tree ulltype = long_long_unsigned_type_nodeinteger_types[itk_unsigned_long_long]; |
2573 | tree stopvalull = fold_convert (ulltype, stopval)fold_convert_loc (((location_t) 0), ulltype, stopval); |
2574 | stopvalull |
2575 | = force_gimple_operand_gsi (gsi, stopvalull, true, NULL_TREE(tree) nullptr, |
2576 | false, GSI_CONTINUE_LINKING); |
2577 | first_inner_iterations |
2578 | = fold_convert (slltype, first_inner_iterations)fold_convert_loc (((location_t) 0), slltype, first_inner_iterations ); |
2579 | first_inner_iterations |
2580 | = force_gimple_operand_gsi (gsi, first_inner_iterations, true, |
2581 | NULL_TREE(tree) nullptr, false, |
2582 | GSI_CONTINUE_LINKING); |
2583 | factor = fold_convert (slltype, factor)fold_convert_loc (((location_t) 0), slltype, factor); |
2584 | factor |
2585 | = force_gimple_operand_gsi (gsi, factor, true, NULL_TREE(tree) nullptr, |
2586 | false, GSI_CONTINUE_LINKING); |
2587 | tree first_inner_iterationsd |
2588 | = fold_build1 (FLOAT_EXPR, double_type_node,fold_build1_loc (((location_t) 0), FLOAT_EXPR, global_trees[TI_DOUBLE_TYPE ], first_inner_iterations ) |
2589 | first_inner_iterations)fold_build1_loc (((location_t) 0), FLOAT_EXPR, global_trees[TI_DOUBLE_TYPE ], first_inner_iterations ); |
2590 | first_inner_iterationsd |
2591 | = force_gimple_operand_gsi (gsi, first_inner_iterationsd, true, |
2592 | NULL_TREE(tree) nullptr, false, |
2593 | GSI_CONTINUE_LINKING); |
2594 | tree factord = fold_build1 (FLOAT_EXPR, double_type_node,fold_build1_loc (((location_t) 0), FLOAT_EXPR, global_trees[TI_DOUBLE_TYPE ], factor ) |
2595 | factor)fold_build1_loc (((location_t) 0), FLOAT_EXPR, global_trees[TI_DOUBLE_TYPE ], factor ); |
2596 | factord = force_gimple_operand_gsi (gsi, factord, true, |
2597 | NULL_TREE(tree) nullptr, false, |
2598 | GSI_CONTINUE_LINKING); |
2599 | tree stopvald = fold_build1 (FLOAT_EXPR, double_type_node,fold_build1_loc (((location_t) 0), FLOAT_EXPR, global_trees[TI_DOUBLE_TYPE ], stopvalull ) |
2600 | stopvalull)fold_build1_loc (((location_t) 0), FLOAT_EXPR, global_trees[TI_DOUBLE_TYPE ], stopvalull ); |
2601 | stopvald = force_gimple_operand_gsi (gsi, stopvald, true, |
2602 | NULL_TREE(tree) nullptr, false, |
2603 | GSI_CONTINUE_LINKING); |
2604 | /* Temporarily disable flag_rounding_math, values will be |
2605 | decimal numbers divided by 2 and worst case imprecisions |
2606 | due to too large values ought to be caught later by the |
2607 | checks for fallback. */ |
2608 | int save_flag_rounding_math = flag_rounding_mathglobal_options.x_flag_rounding_math; |
2609 | flag_rounding_mathglobal_options.x_flag_rounding_math = 0; |
2610 | t = fold_build2 (RDIV_EXPR, double_type_node, factord,fold_build2_loc (((location_t) 0), RDIV_EXPR, global_trees[TI_DOUBLE_TYPE ], factord, build_real (global_trees[TI_DOUBLE_TYPE], dconst2 ) ) |
2611 | build_real (double_type_node, dconst2))fold_build2_loc (((location_t) 0), RDIV_EXPR, global_trees[TI_DOUBLE_TYPE ], factord, build_real (global_trees[TI_DOUBLE_TYPE], dconst2 ) ); |
2612 | tree t3 = fold_build2 (MINUS_EXPR, double_type_node,fold_build2_loc (((location_t) 0), MINUS_EXPR, global_trees[TI_DOUBLE_TYPE ], first_inner_iterationsd, t ) |
2613 | first_inner_iterationsd, t)fold_build2_loc (((location_t) 0), MINUS_EXPR, global_trees[TI_DOUBLE_TYPE ], first_inner_iterationsd, t ); |
2614 | t3 = force_gimple_operand_gsi (gsi, t3, true, NULL_TREE(tree) nullptr, false, |
2615 | GSI_CONTINUE_LINKING); |
2616 | t = fold_build2 (MULT_EXPR, double_type_node, factord,fold_build2_loc (((location_t) 0), MULT_EXPR, global_trees[TI_DOUBLE_TYPE ], factord, build_real (global_trees[TI_DOUBLE_TYPE], dconst2 ) ) |
2617 | build_real (double_type_node, dconst2))fold_build2_loc (((location_t) 0), MULT_EXPR, global_trees[TI_DOUBLE_TYPE ], factord, build_real (global_trees[TI_DOUBLE_TYPE], dconst2 ) ); |
2618 | t = fold_build2 (MULT_EXPR, double_type_node, t, stopvald)fold_build2_loc (((location_t) 0), MULT_EXPR, global_trees[TI_DOUBLE_TYPE ], t, stopvald ); |
2619 | t = fold_build2 (PLUS_EXPR, double_type_node, t,fold_build2_loc (((location_t) 0), PLUS_EXPR, global_trees[TI_DOUBLE_TYPE ], t, fold_build2_loc (((location_t) 0), MULT_EXPR, global_trees [TI_DOUBLE_TYPE], t3, t3 ) ) |
2620 | fold_build2 (MULT_EXPR, double_type_node,fold_build2_loc (((location_t) 0), PLUS_EXPR, global_trees[TI_DOUBLE_TYPE ], t, fold_build2_loc (((location_t) 0), MULT_EXPR, global_trees [TI_DOUBLE_TYPE], t3, t3 ) ) |
2621 | t3, t3))fold_build2_loc (((location_t) 0), PLUS_EXPR, global_trees[TI_DOUBLE_TYPE ], t, fold_build2_loc (((location_t) 0), MULT_EXPR, global_trees [TI_DOUBLE_TYPE], t3, t3 ) ); |
2622 | flag_rounding_mathglobal_options.x_flag_rounding_math = save_flag_rounding_math; |
2623 | t = force_gimple_operand_gsi (gsi, t, true, NULL_TREE(tree) nullptr, false, |
2624 | GSI_CONTINUE_LINKING); |
2625 | if (flag_exceptionsglobal_options.x_flag_exceptions |
2626 | && cfun(cfun + 0)->can_throw_non_call_exceptions |
2627 | && operation_could_trap_p (LT_EXPR, true, false, NULL_TREE(tree) nullptr)) |
2628 | { |
2629 | tree tem = fold_build2 (LT_EXPR, boolean_type_node, t,fold_build2_loc (((location_t) 0), LT_EXPR, global_trees[TI_BOOLEAN_TYPE ], t, build_zero_cst (global_trees[TI_DOUBLE_TYPE]) ) |
2630 | build_zero_cst (double_type_node))fold_build2_loc (((location_t) 0), LT_EXPR, global_trees[TI_BOOLEAN_TYPE ], t, build_zero_cst (global_trees[TI_DOUBLE_TYPE]) ); |
2631 | tem = force_gimple_operand_gsi (gsi, tem, true, NULL_TREE(tree) nullptr, |
2632 | false, GSI_CONTINUE_LINKING); |
2633 | cond_stmt = gimple_build_cond (NE_EXPR, tem, |
2634 | boolean_false_nodeglobal_trees[TI_BOOLEAN_FALSE], |
2635 | NULL_TREE(tree) nullptr, NULL_TREE(tree) nullptr); |
2636 | } |
2637 | else |
2638 | cond_stmt |
2639 | = gimple_build_cond (LT_EXPR, t, |
2640 | build_zero_cst (double_type_nodeglobal_trees[TI_DOUBLE_TYPE]), |
2641 | NULL_TREE(tree) nullptr, NULL_TREE(tree) nullptr); |
2642 | gsi_insert_after (gsi, cond_stmt, GSI_CONTINUE_LINKING); |
2643 | e = split_block (gsi_bb (*gsi), cond_stmt); |
2644 | basic_block bb1 = e->src; |
2645 | e->flags = EDGE_FALSE_VALUE; |
2646 | e->probability = profile_probability::very_likely (); |
2647 | *gsi = gsi_after_labels (e->dest); |
2648 | gcall *call = gimple_build_call_internal (IFN_SQRT, 1, t); |
2649 | tree sqrtr = create_tmp_var (double_type_nodeglobal_trees[TI_DOUBLE_TYPE]); |
2650 | gimple_call_set_lhs (call, sqrtr); |
2651 | gsi_insert_after (gsi, call, GSI_CONTINUE_LINKING); |
2652 | t = fold_build2 (MINUS_EXPR, double_type_node, sqrtr, t3)fold_build2_loc (((location_t) 0), MINUS_EXPR, global_trees[TI_DOUBLE_TYPE ], sqrtr, t3 ); |
2653 | t = fold_build2 (RDIV_EXPR, double_type_node, t, factord)fold_build2_loc (((location_t) 0), RDIV_EXPR, global_trees[TI_DOUBLE_TYPE ], t, factord ); |
2654 | t = fold_build1 (FIX_TRUNC_EXPR, ulltype, t)fold_build1_loc (((location_t) 0), FIX_TRUNC_EXPR, ulltype, t ); |
2655 | tree c = create_tmp_var (ulltype); |
2656 | tree d = create_tmp_var (ulltype); |
2657 | expand_omp_build_assign (gsi, c, t, true); |
2658 | t = fold_build2 (MINUS_EXPR, ulltype, c,fold_build2_loc (((location_t) 0), MINUS_EXPR, ulltype, c, build_one_cst (ulltype) ) |
2659 | build_one_cst (ulltype))fold_build2_loc (((location_t) 0), MINUS_EXPR, ulltype, c, build_one_cst (ulltype) ); |
2660 | t = fold_build2 (MULT_EXPR, ulltype, c, t)fold_build2_loc (((location_t) 0), MULT_EXPR, ulltype, c, t ); |
2661 | t = fold_build2 (RSHIFT_EXPR, ulltype, t, integer_one_node)fold_build2_loc (((location_t) 0), RSHIFT_EXPR, ulltype, t, global_trees [TI_INTEGER_ONE] ); |
2662 | t = fold_build2 (MULT_EXPR, ulltype,fold_build2_loc (((location_t) 0), MULT_EXPR, ulltype, fold_convert_loc (((location_t) 0), ulltype, fd->factor), t ) |
2663 | fold_convert (ulltype, fd->factor), t)fold_build2_loc (((location_t) 0), MULT_EXPR, ulltype, fold_convert_loc (((location_t) 0), ulltype, fd->factor), t ); |
2664 | tree t2 |
2665 | = fold_build2 (MULT_EXPR, ulltype, c,fold_build2_loc (((location_t) 0), MULT_EXPR, ulltype, c, fold_convert_loc (((location_t) 0), ulltype, fd->first_inner_iterations) ) |
2666 | fold_convert (ulltype,fold_build2_loc (((location_t) 0), MULT_EXPR, ulltype, c, fold_convert_loc (((location_t) 0), ulltype, fd->first_inner_iterations) ) |
2667 | fd->first_inner_iterations))fold_build2_loc (((location_t) 0), MULT_EXPR, ulltype, c, fold_convert_loc (((location_t) 0), ulltype, fd->first_inner_iterations) ); |
2668 | t = fold_build2 (PLUS_EXPR, ulltype, t, t2)fold_build2_loc (((location_t) 0), PLUS_EXPR, ulltype, t, t2 ); |
2669 | expand_omp_build_assign (gsi, d, t, true); |
2670 | t = fold_build2 (MULT_EXPR, ulltype,fold_build2_loc (((location_t) 0), MULT_EXPR, ulltype, fold_convert_loc (((location_t) 0), ulltype, fd->factor), c ) |
2671 | fold_convert (ulltype, fd->factor), c)fold_build2_loc (((location_t) 0), MULT_EXPR, ulltype, fold_convert_loc (((location_t) 0), ulltype, fd->factor), c ); |
2672 | t = fold_build2 (PLUS_EXPR, ulltype,fold_build2_loc (((location_t) 0), PLUS_EXPR, ulltype, t, fold_convert_loc (((location_t) 0), ulltype, fd->first_inner_iterations) ) |
2673 | t, fold_convert (ulltype,fold_build2_loc (((location_t) 0), PLUS_EXPR, ulltype, t, fold_convert_loc (((location_t) 0), ulltype, fd->first_inner_iterations) ) |
2674 | fd->first_inner_iterations))fold_build2_loc (((location_t) 0), PLUS_EXPR, ulltype, t, fold_convert_loc (((location_t) 0), ulltype, fd->first_inner_iterations) ); |
2675 | t2 = force_gimple_operand_gsi (gsi, t, true, NULL_TREE(tree) nullptr, false, |
2676 | GSI_CONTINUE_LINKING); |
2677 | cond_stmt = gimple_build_cond (GE_EXPR, stopvalull, d, |
2678 | NULL_TREE(tree) nullptr, NULL_TREE(tree) nullptr); |
2679 | gsi_insert_after (gsi, cond_stmt, GSI_CONTINUE_LINKING); |
2680 | e = split_block (gsi_bb (*gsi), cond_stmt); |
2681 | basic_block bb2 = e->src; |
2682 | e->flags = EDGE_TRUE_VALUE; |
2683 | e->probability = profile_probability::very_likely (); |
2684 | *gsi = gsi_after_labels (e->dest); |
2685 | t = fold_build2 (PLUS_EXPR, ulltype, d, t2)fold_build2_loc (((location_t) 0), PLUS_EXPR, ulltype, d, t2 ); |
2686 | t = force_gimple_operand_gsi (gsi, t, true, NULL_TREE(tree) nullptr, false, |
2687 | GSI_CONTINUE_LINKING); |
2688 | cond_stmt = gimple_build_cond (GE_EXPR, stopvalull, t, |
2689 | NULL_TREE(tree) nullptr, NULL_TREE(tree) nullptr); |
2690 | gsi_insert_after (gsi, cond_stmt, GSI_CONTINUE_LINKING); |
2691 | e = split_block (gsi_bb (*gsi), cond_stmt); |
2692 | basic_block bb3 = e->src; |
2693 | e->flags = EDGE_FALSE_VALUE; |
2694 | e->probability = profile_probability::very_likely (); |
2695 | *gsi = gsi_after_labels (e->dest); |
2696 | t = fold_convert (itype, c)fold_convert_loc (((location_t) 0), itype, c); |
2697 | t = fold_build2 (MULT_EXPR, itype, t, fd->loops[i - 1].step)fold_build2_loc (((location_t) 0), MULT_EXPR, itype, t, fd-> loops[i - 1].step ); |
2698 | t = fold_build2 (PLUS_EXPR, itype, outer_n1, t)fold_build2_loc (((location_t) 0), PLUS_EXPR, itype, outer_n1 , t ); |
2699 | t = force_gimple_operand_gsi (gsi, t, true, NULL_TREE(tree) nullptr, false, |
2700 | GSI_CONTINUE_LINKING); |
2701 | expand_omp_build_assign (gsi, fd->loops[i - 1].v, t, true); |
2702 | t2 = fold_build2 (MINUS_EXPR, ulltype, stopvalull, d)fold_build2_loc (((location_t) 0), MINUS_EXPR, ulltype, stopvalull , d ); |
2703 | t2 = fold_convert (itype, t2)fold_convert_loc (((location_t) 0), itype, t2); |
2704 | t2 = fold_build2 (MULT_EXPR, itype, t2, fd->loops[i].step)fold_build2_loc (((location_t) 0), MULT_EXPR, itype, t2, fd-> loops[i].step ); |
2705 | t2 = fold_build2 (PLUS_EXPR, itype, t2, fd->loops[i].n1)fold_build2_loc (((location_t) 0), PLUS_EXPR, itype, t2, fd-> loops[i].n1 ); |
2706 | if (fd->loops[i].m1) |
2707 | { |
2708 | t = fold_build2 (MULT_EXPR, itype, t, fd->loops[i].m1)fold_build2_loc (((location_t) 0), MULT_EXPR, itype, t, fd-> loops[i].m1 ); |
2709 | t2 = fold_build2 (PLUS_EXPR, itype, t2, t)fold_build2_loc (((location_t) 0), PLUS_EXPR, itype, t2, t ); |
2710 | } |
2711 | expand_omp_build_assign (gsi, fd->loops[i].v, t2, true); |
2712 | e = split_block (gsi_bb (*gsi), gsi_stmt (*gsi)); |
2713 | bb_triang = e->src; |
2714 | *gsi = gsi_after_labels (e->dest); |
2715 | remove_edge (e); |
2716 | e = make_edge (bb1, gsi_bb (*gsi), EDGE_TRUE_VALUE); |
2717 | e->probability = profile_probability::very_unlikely (); |
2718 | e = make_edge (bb2, gsi_bb (*gsi), EDGE_FALSE_VALUE); |
2719 | e->probability = profile_probability::very_unlikely (); |
2720 | e = make_edge (bb3, gsi_bb (*gsi), EDGE_TRUE_VALUE); |
2721 | e->probability = profile_probability::very_unlikely (); |
2722 | |
2723 | basic_block bb4 = create_empty_bb (bb0); |
2724 | add_bb_to_loop (bb4, bb0->loop_father); |
2725 | e = make_edge (bb0, bb4, EDGE_FALSE_VALUE); |
2726 | e->probability = profile_probability::unlikely (); |
2727 | make_edge (bb4, gsi_bb (*gsi), EDGE_FALLTHRU); |
2728 | set_immediate_dominator (CDI_DOMINATORS, bb4, bb0); |
2729 | set_immediate_dominator (CDI_DOMINATORS, gsi_bb (*gsi), bb0); |
2730 | gimple_stmt_iterator gsi2 = gsi_after_labels (bb4); |
2731 | t2 = fold_build2 (TRUNC_DIV_EXPR, type,fold_build2_loc (((location_t) 0), TRUNC_DIV_EXPR, type, counts [i], counts[i - 1] ) |
2732 | counts[i], counts[i - 1])fold_build2_loc (((location_t) 0), TRUNC_DIV_EXPR, type, counts [i], counts[i - 1] ); |
2733 | t2 = force_gimple_operand_gsi (&gsi2, t2, true, NULL_TREE(tree) nullptr, false, |
2734 | GSI_CONTINUE_LINKING); |
2735 | t = fold_build2 (TRUNC_MOD_EXPR, type, stopval, t2)fold_build2_loc (((location_t) 0), TRUNC_MOD_EXPR, type, stopval , t2 ); |
2736 | t2 = fold_build2 (TRUNC_DIV_EXPR, type, stopval, t2)fold_build2_loc (((location_t) 0), TRUNC_DIV_EXPR, type, stopval , t2 ); |
2737 | t = fold_convert (itype, t)fold_convert_loc (((location_t) 0), itype, t); |
2738 | t2 = fold_convert (itype, t2)fold_convert_loc (((location_t) 0), itype, t2); |
2739 | t = fold_build2 (MULT_EXPR, itype, t,fold_build2_loc (((location_t) 0), MULT_EXPR, itype, t, fold_convert_loc (((location_t) 0), itype, fd->loops[i].step) ) |
2740 | fold_convert (itype, fd->loops[i].step))fold_build2_loc (((location_t) 0), MULT_EXPR, itype, t, fold_convert_loc (((location_t) 0), itype, fd->loops[i].step) ); |
2741 | t = fold_build2 (PLUS_EXPR, itype, fd->loops[i].n1, t)fold_build2_loc (((location_t) 0), PLUS_EXPR, itype, fd->loops [i].n1, t ); |
2742 | t2 = fold_build2 (MULT_EXPR, itype, t2,fold_build2_loc (((location_t) 0), MULT_EXPR, itype, t2, fold_convert_loc (((location_t) 0), itype, fd->loops[i - 1].step) ) |
2743 | fold_convert (itype, fd->loops[i - 1].step))fold_build2_loc (((location_t) 0), MULT_EXPR, itype, t2, fold_convert_loc (((location_t) 0), itype, fd->loops[i - 1].step) ); |
2744 | t2 = fold_build2 (PLUS_EXPR, itype, fd->loops[i - 1].n1, t2)fold_build2_loc (((location_t) 0), PLUS_EXPR, itype, fd->loops [i - 1].n1, t2 ); |
2745 | t2 = force_gimple_operand_gsi (&gsi2, t2, false, NULL_TREE(tree) nullptr, |
2746 | false, GSI_CONTINUE_LINKING); |
2747 | stmt = gimple_build_assign (fd->loops[i - 1].v, t2); |
2748 | gsi_insert_after (&gsi2, stmt, GSI_CONTINUE_LINKING); |
2749 | if (fd->loops[i].m1) |
2750 | { |
2751 | t2 = fold_build2 (MULT_EXPR, itype, fd->loops[i].m1,fold_build2_loc (((location_t) 0), MULT_EXPR, itype, fd->loops [i].m1, fd->loops[i - 1].v ) |
2752 | fd->loops[i - 1].v)fold_build2_loc (((location_t) 0), MULT_EXPR, itype, fd->loops [i].m1, fd->loops[i - 1].v ); |
2753 | t = fold_build2 (PLUS_EXPR, itype, t, t2)fold_build2_loc (((location_t) 0), PLUS_EXPR, itype, t, t2 ); |
2754 | } |
2755 | t = force_gimple_operand_gsi (&gsi2, t, false, NULL_TREE(tree) nullptr, |
2756 | false, GSI_CONTINUE_LINKING); |
2757 | stmt = gimple_build_assign (fd->loops[i].v, t); |
2758 | gsi_insert_after (&gsi2, stmt, GSI_CONTINUE_LINKING); |
2759 | } |
2760 | /* Fallback implementation. Evaluate the loops in between |
2761 | (inclusive) fd->first_nonrect and fd->last_nonrect at |
2762 | runtime unsing temporaries instead of the original iteration |
2763 | variables, in the body just bump the counter and compare |
2764 | with the desired value. */ |
2765 | gimple_stmt_iterator gsi2 = *gsi; |
2766 | basic_block entry_bb = gsi_bb (gsi2); |
2767 | edge e = split_block (entry_bb, gsi_stmt (gsi2)); |
2768 | e = split_block (e->dest, (gimple *) NULLnullptr); |
2769 | basic_block dom_bb = NULLnullptr; |
2770 | basic_block cur_bb = e->src; |
2771 | basic_block next_bb = e->dest; |
2772 | entry_bb = e->dest; |
2773 | *gsi = gsi_after_labels (entry_bb); |
2774 | |
2775 | tree *vs = XALLOCAVEC (tree, fd->last_nonrect)((tree *) __builtin_alloca(sizeof (tree) * (fd->last_nonrect ))); |
2776 | tree n1 = NULL_TREE(tree) nullptr, n2 = NULL_TREE(tree) nullptr; |
2777 | memset (vs, 0, fd->last_nonrect * sizeof (tree)); |
2778 | |
2779 | for (int j = fd->first_nonrect; j <= fd->last_nonrect; j++) |
2780 | { |
2781 | tree itype = TREE_TYPE (fd->loops[j].v)((contains_struct_check ((fd->loops[j].v), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 2781, __FUNCTION__))->typed.type); |
2782 | bool rect_p = (fd->loops[j].m1 == NULL_TREE(tree) nullptr |
2783 | && fd->loops[j].m2 == NULL_TREE(tree) nullptr |
2784 | && !fd->loops[j].non_rect_referenced); |
2785 | gsi2 = gsi_after_labels (cur_bb); |
2786 | t = fold_convert (itype, unshare_expr (fd->loops[j].n1))fold_convert_loc (((location_t) 0), itype, unshare_expr (fd-> loops[j].n1)); |
2787 | if (fd->loops[j].m1 == NULL_TREE(tree) nullptr) |
2788 | n1 = rect_p ? build_zero_cst (type) : t; |
2789 | else if (POINTER_TYPE_P (itype)(((enum tree_code) (itype)->base.code) == POINTER_TYPE || ( (enum tree_code) (itype)->base.code) == REFERENCE_TYPE)) |
2790 | { |
2791 | gcc_assert (integer_onep (fd->loops[j].m1))((void)(!(integer_onep (fd->loops[j].m1)) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 2791, __FUNCTION__), 0 : 0)); |
2792 | t = unshare_expr (fd->loops[j].n1); |
2793 | n1 = fold_build_pointer_plus (vs[j - fd->loops[j].outer], t)fold_build_pointer_plus_loc (((location_t) 0), vs[j - fd-> loops[j].outer], t); |
2794 | } |
2795 | else |
2796 | { |
2797 | n1 = fold_convert (itype, unshare_expr (fd->loops[j].m1))fold_convert_loc (((location_t) 0), itype, unshare_expr (fd-> loops[j].m1)); |
2798 | n1 = fold_build2 (MULT_EXPR, itype,fold_build2_loc (((location_t) 0), MULT_EXPR, itype, vs[j - fd ->loops[j].outer], n1 ) |
2799 | vs[j - fd->loops[j].outer], n1)fold_build2_loc (((location_t) 0), MULT_EXPR, itype, vs[j - fd ->loops[j].outer], n1 ); |
2800 | n1 = fold_build2 (PLUS_EXPR, itype, n1, t)fold_build2_loc (((location_t) 0), PLUS_EXPR, itype, n1, t ); |
2801 | } |
2802 | n1 = force_gimple_operand_gsi (&gsi2, n1, true, NULL_TREE(tree) nullptr, |
2803 | true, GSI_SAME_STMT); |
2804 | if (j < fd->last_nonrect) |
2805 | { |
2806 | vs[j] = create_tmp_reg (rect_p ? type : itype, ".it"); |
2807 | expand_omp_build_assign (&gsi2, vs[j], n1); |
2808 | } |
2809 | t = fold_convert (itype, unshare_expr (fd->loops[j].n2))fold_convert_loc (((location_t) 0), itype, unshare_expr (fd-> loops[j].n2)); |
2810 | if (fd->loops[j].m2 == NULL_TREE(tree) nullptr) |
2811 | n2 = rect_p ? counts[j] : t; |
2812 | else if (POINTER_TYPE_P (itype)(((enum tree_code) (itype)->base.code) == POINTER_TYPE || ( (enum tree_code) (itype)->base.code) == REFERENCE_TYPE)) |
2813 | { |
2814 | gcc_assert (integer_onep (fd->loops[j].m2))((void)(!(integer_onep (fd->loops[j].m2)) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 2814, __FUNCTION__), 0 : 0)); |
2815 | t = unshare_expr (fd->loops[j].n2); |
2816 | n2 = fold_build_pointer_plus (vs[j - fd->loops[j].outer], t)fold_build_pointer_plus_loc (((location_t) 0), vs[j - fd-> loops[j].outer], t); |
2817 | } |
2818 | else |
2819 | { |
2820 | n2 = fold_convert (itype, unshare_expr (fd->loops[j].m2))fold_convert_loc (((location_t) 0), itype, unshare_expr (fd-> loops[j].m2)); |
2821 | n2 = fold_build2 (MULT_EXPR, itype,fold_build2_loc (((location_t) 0), MULT_EXPR, itype, vs[j - fd ->loops[j].outer], n2 ) |
2822 | vs[j - fd->loops[j].outer], n2)fold_build2_loc (((location_t) 0), MULT_EXPR, itype, vs[j - fd ->loops[j].outer], n2 ); |
2823 | n2 = fold_build2 (PLUS_EXPR, itype, n2, t)fold_build2_loc (((location_t) 0), PLUS_EXPR, itype, n2, t ); |
2824 | } |
2825 | n2 = force_gimple_operand_gsi (&gsi2, n2, true, NULL_TREE(tree) nullptr, |
2826 | true, GSI_SAME_STMT); |
2827 | if (POINTER_TYPE_P (itype)(((enum tree_code) (itype)->base.code) == POINTER_TYPE || ( (enum tree_code) (itype)->base.code) == REFERENCE_TYPE)) |
2828 | itype = signed_type_for (itype); |
2829 | if (j == fd->last_nonrect) |
2830 | { |
2831 | gcond *cond_stmt |
2832 | = expand_omp_build_cond (&gsi2, fd->loops[i].cond_code, |
2833 | n1, n2); |
2834 | e = split_block (cur_bb, cond_stmt); |
2835 | e->flags = EDGE_TRUE_VALUE; |
2836 | edge ne = make_edge (cur_bb, next_bb, EDGE_FALSE_VALUE); |
2837 | e->probability = profile_probability::likely ().guessed (); |
2838 | ne->probability = e->probability.invert (); |
2839 | gsi2 = gsi_after_labels (e->dest); |
2840 | |
2841 | t = build_int_cst (itype, (fd->loops[j].cond_code == LT_EXPR |
2842 | ? -1 : 1)); |
2843 | t = fold_build2 (PLUS_EXPR, itype,fold_build2_loc (((location_t) 0), PLUS_EXPR, itype, fold_convert_loc (((location_t) 0), itype, fd->loops[j].step), t ) |
2844 | fold_convert (itype, fd->loops[j].step), t)fold_build2_loc (((location_t) 0), PLUS_EXPR, itype, fold_convert_loc (((location_t) 0), itype, fd->loops[j].step), t ); |
2845 | t = fold_build2 (PLUS_EXPR, itype, t,fold_build2_loc (((location_t) 0), PLUS_EXPR, itype, t, fold_convert_loc (((location_t) 0), itype, n2) ) |
2846 | fold_convert (itype, n2))fold_build2_loc (((location_t) 0), PLUS_EXPR, itype, t, fold_convert_loc (((location_t) 0), itype, n2) ); |
2847 | t = fold_build2 (MINUS_EXPR, itype, t,fold_build2_loc (((location_t) 0), MINUS_EXPR, itype, t, fold_convert_loc (((location_t) 0), itype, n1) ) |
2848 | fold_convert (itype, n1))fold_build2_loc (((location_t) 0), MINUS_EXPR, itype, t, fold_convert_loc (((location_t) 0), itype, n1) ); |
2849 | tree step = fold_convert (itype, fd->loops[j].step)fold_convert_loc (((location_t) 0), itype, fd->loops[j].step ); |
2850 | if (TYPE_UNSIGNED (itype)((tree_class_check ((itype), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 2850, __FUNCTION__))->base.u.bits.unsigned_flag) |
2851 | && fd->loops[j].cond_code == GT_EXPR) |
2852 | t = fold_build2 (TRUNC_DIV_EXPR, itype,fold_build2_loc (((location_t) 0), TRUNC_DIV_EXPR, itype, fold_build1_loc (((location_t) 0), NEGATE_EXPR, itype, t ), fold_build1_loc ( ((location_t) 0), NEGATE_EXPR, itype, step ) ) |
2853 | fold_build1 (NEGATE_EXPR, itype, t),fold_build2_loc (((location_t) 0), TRUNC_DIV_EXPR, itype, fold_build1_loc (((location_t) 0), NEGATE_EXPR, itype, t ), fold_build1_loc ( ((location_t) 0), NEGATE_EXPR, itype, step ) ) |
2854 | fold_build1 (NEGATE_EXPR, itype, step))fold_build2_loc (((location_t) 0), TRUNC_DIV_EXPR, itype, fold_build1_loc (((location_t) 0), NEGATE_EXPR, itype, t ), fold_build1_loc ( ((location_t) 0), NEGATE_EXPR, itype, step ) ); |
2855 | else |
2856 | t = fold_build2 (TRUNC_DIV_EXPR, itype, t, step)fold_build2_loc (((location_t) 0), TRUNC_DIV_EXPR, itype, t, step ); |
2857 | t = fold_convert (type, t)fold_convert_loc (((location_t) 0), type, t); |
2858 | t = fold_build2 (PLUS_EXPR, type, idx, t)fold_build2_loc (((location_t) 0), PLUS_EXPR, type, idx, t ); |
2859 | t = force_gimple_operand_gsi (&gsi2, t, true, NULL_TREE(tree) nullptr, |
2860 | true, GSI_SAME_STMT); |
2861 | e = make_edge (e->dest, next_bb, EDGE_FALLTHRU); |
2862 | set_immediate_dominator (CDI_DOMINATORS, next_bb, cur_bb); |
2863 | cond_stmt |
2864 | = gimple_build_cond (LE_EXPR, t, stopval, NULL_TREE(tree) nullptr, |
2865 | NULL_TREE(tree) nullptr); |
2866 | gsi_insert_before (&gsi2, cond_stmt, GSI_SAME_STMT); |
2867 | e = split_block (gsi_bb (gsi2), cond_stmt); |
2868 | e->flags = EDGE_TRUE_VALUE; |
2869 | e->probability = profile_probability::likely ().guessed (); |
2870 | ne = make_edge (e->src, entry_bb, EDGE_FALSE_VALUE); |
2871 | ne->probability = e->probability.invert (); |
2872 | gsi2 = gsi_after_labels (e->dest); |
2873 | expand_omp_build_assign (&gsi2, idx, t); |
2874 | set_immediate_dominator (CDI_DOMINATORS, entry_bb, dom_bb); |
2875 | break; |
2876 | } |
2877 | e = split_block (cur_bb, last_stmt (cur_bb)); |
2878 | |
2879 | basic_block new_cur_bb = create_empty_bb (cur_bb); |
2880 | add_bb_to_loop (new_cur_bb, cur_bb->loop_father); |
2881 | |
2882 | gsi2 = gsi_after_labels (e->dest); |
2883 | if (rect_p) |
2884 | t = fold_build2 (PLUS_EXPR, type, vs[j],fold_build2_loc (((location_t) 0), PLUS_EXPR, type, vs[j], build_one_cst (type) ) |
2885 | build_one_cst (type))fold_build2_loc (((location_t) 0), PLUS_EXPR, type, vs[j], build_one_cst (type) ); |
2886 | else |
2887 | { |
2888 | tree step |
2889 | = fold_convert (itype, unshare_expr (fd->loops[j].step))fold_convert_loc (((location_t) 0), itype, unshare_expr (fd-> loops[j].step)); |
2890 | if (POINTER_TYPE_P (vtype)(((enum tree_code) (vtype)->base.code) == POINTER_TYPE || ( (enum tree_code) (vtype)->base.code) == REFERENCE_TYPE)) |
2891 | t = fold_build_pointer_plus (vs[j], step)fold_build_pointer_plus_loc (((location_t) 0), vs[j], step); |
2892 | else |
2893 | t = fold_build2 (PLUS_EXPR, itype, vs[j], step)fold_build2_loc (((location_t) 0), PLUS_EXPR, itype, vs[j], step ); |
2894 | } |
2895 | t = force_gimple_operand_gsi (&gsi2, t, true, NULL_TREE(tree) nullptr, |
2896 | true, GSI_SAME_STMT); |
2897 | expand_omp_build_assign (&gsi2, vs[j], t); |
2898 | |
2899 | edge ne = split_block (e->dest, last_stmt (e->dest)); |
2900 | gsi2 = gsi_after_labels (ne->dest); |
2901 | |
2902 | gcond *cond_stmt; |
2903 | if (next_bb == entry_bb) |
2904 | /* No need to actually check the outermost condition. */ |
2905 | cond_stmt |
2906 | = gimple_build_cond (EQ_EXPR, boolean_true_nodeglobal_trees[TI_BOOLEAN_TRUE], |
2907 | boolean_true_nodeglobal_trees[TI_BOOLEAN_TRUE], |
2908 | NULL_TREE(tree) nullptr, NULL_TREE(tree) nullptr); |
2909 | else |
2910 | cond_stmt |
2911 | = gimple_build_cond (rect_p ? LT_EXPR |
2912 | : fd->loops[j].cond_code, |
2913 | vs[j], n2, NULL_TREE(tree) nullptr, NULL_TREE(tree) nullptr); |
2914 | gsi_insert_before (&gsi2, cond_stmt, GSI_SAME_STMT); |
2915 | edge e3, e4; |
2916 | if (next_bb == entry_bb) |
2917 | { |
2918 | e3 = find_edge (ne->dest, next_bb); |
2919 | e3->flags = EDGE_FALSE_VALUE; |
2920 | dom_bb = ne->dest; |
2921 | } |
2922 | else |
2923 | e3 = make_edge (ne->dest, next_bb, EDGE_FALSE_VALUE); |
2924 | e4 = make_edge (ne->dest, new_cur_bb, EDGE_TRUE_VALUE); |
2925 | e4->probability = profile_probability::likely ().guessed (); |
2926 | e3->probability = e4->probability.invert (); |
2927 | basic_block esrc = e->src; |
2928 | make_edge (e->src, ne->dest, EDGE_FALLTHRU); |
2929 | cur_bb = new_cur_bb; |
2930 | basic_block latch_bb = next_bb; |
2931 | next_bb = e->dest; |
2932 | remove_edge (e); |
2933 | set_immediate_dominator (CDI_DOMINATORS, ne->dest, esrc); |
2934 | set_immediate_dominator (CDI_DOMINATORS, latch_bb, ne->dest); |
2935 | set_immediate_dominator (CDI_DOMINATORS, cur_bb, ne->dest); |
2936 | } |
2937 | for (int j = fd->last_nonrect; j >= fd->first_nonrect; j--) |
2938 | { |
2939 | tree vtype = TREE_TYPE (fd->loops[j].v)((contains_struct_check ((fd->loops[j].v), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 2939, __FUNCTION__))->typed.type); |
2940 | tree itype = vtype; |
2941 | if (POINTER_TYPE_P (itype)(((enum tree_code) (itype)->base.code) == POINTER_TYPE || ( (enum tree_code) (itype)->base.code) == REFERENCE_TYPE)) |
2942 | itype = signed_type_for (itype); |
2943 | bool rect_p = (fd->loops[j].m1 == NULL_TREE(tree) nullptr |
2944 | && fd->loops[j].m2 == NULL_TREE(tree) nullptr |
2945 | && !fd->loops[j].non_rect_referenced); |
2946 | if (j == fd->last_nonrect) |
2947 | { |
2948 | t = fold_build2 (MINUS_EXPR, type, stopval, idx)fold_build2_loc (((location_t) 0), MINUS_EXPR, type, stopval, idx ); |
2949 | t = fold_convert (itype, t)fold_convert_loc (((location_t) 0), itype, t); |
2950 | tree t2 |
2951 | = fold_convert (itype, unshare_expr (fd->loops[j].step))fold_convert_loc (((location_t) 0), itype, unshare_expr (fd-> loops[j].step)); |
2952 | t = fold_build2 (MULT_EXPR, itype, t, t2)fold_build2_loc (((location_t) 0), MULT_EXPR, itype, t, t2 ); |
2953 | if (POINTER_TYPE_P (vtype)(((enum tree_code) (vtype)->base.code) == POINTER_TYPE || ( (enum tree_code) (vtype)->base.code) == REFERENCE_TYPE)) |
2954 | t = fold_build_pointer_plus (n1, t)fold_build_pointer_plus_loc (((location_t) 0), n1, t); |
2955 | else |
2956 | t = fold_build2 (PLUS_EXPR, itype, n1, t)fold_build2_loc (((location_t) 0), PLUS_EXPR, itype, n1, t ); |
2957 | } |
2958 | else if (rect_p) |
2959 | { |
2960 | t = fold_convert (itype, vs[j])fold_convert_loc (((location_t) 0), itype, vs[j]); |
2961 | t = fold_build2 (MULT_EXPR, itype, t,fold_build2_loc (((location_t) 0), MULT_EXPR, itype, t, fold_convert_loc (((location_t) 0), itype, fd->loops[j].step) ) |
2962 | fold_convert (itype, fd->loops[j].step))fold_build2_loc (((location_t) 0), MULT_EXPR, itype, t, fold_convert_loc (((location_t) 0), itype, fd->loops[j].step) ); |
2963 | if (POINTER_TYPE_P (vtype)(((enum tree_code) (vtype)->base.code) == POINTER_TYPE || ( (enum tree_code) (vtype)->base.code) == REFERENCE_TYPE)) |
2964 | t = fold_build_pointer_plus (fd->loops[j].n1, t)fold_build_pointer_plus_loc (((location_t) 0), fd->loops[j ].n1, t); |
2965 | else |
2966 | t = fold_build2 (PLUS_EXPR, itype, fd->loops[j].n1, t)fold_build2_loc (((location_t) 0), PLUS_EXPR, itype, fd->loops [j].n1, t ); |
2967 | } |
2968 | else |
2969 | t = vs[j]; |
2970 | t = force_gimple_operand_gsi (gsi, t, false, |
2971 | NULL_TREE(tree) nullptr, true, |
2972 | GSI_SAME_STMT); |
2973 | stmt = gimple_build_assign (fd->loops[j].v, t); |
2974 | gsi_insert_before (gsi, stmt, GSI_SAME_STMT); |
2975 | } |
2976 | if (gsi_end_p (*gsi)) |
2977 | *gsi = gsi_last_bb (gsi_bb (*gsi)); |
2978 | else |
2979 | gsi_prev (gsi); |
2980 | if (bb_triang) |
2981 | { |
2982 | e = split_block (gsi_bb (*gsi), gsi_stmt (*gsi)); |
2983 | make_edge (bb_triang, e->dest, EDGE_FALLTHRU); |
2984 | *gsi = gsi_after_labels (e->dest); |
2985 | if (!gsi_end_p (*gsi)) |
2986 | gsi_insert_before (gsi, gimple_build_nop (), GSI_NEW_STMT); |
2987 | set_immediate_dominator (CDI_DOMINATORS, e->dest, bb_triang_dom); |
2988 | } |
2989 | } |
2990 | else |
2991 | { |
2992 | t = fold_convert (itype, t)fold_convert_loc (((location_t) 0), itype, t); |
2993 | t = fold_build2 (MULT_EXPR, itype, t,fold_build2_loc (((location_t) 0), MULT_EXPR, itype, t, fold_convert_loc (((location_t) 0), itype, fd->loops[i].step) ) |
2994 | fold_convert (itype, fd->loops[i].step))fold_build2_loc (((location_t) 0), MULT_EXPR, itype, t, fold_convert_loc (((location_t) 0), itype, fd->loops[i].step) ); |
2995 | if (POINTER_TYPE_P (vtype)(((enum tree_code) (vtype)->base.code) == POINTER_TYPE || ( (enum tree_code) (vtype)->base.code) == REFERENCE_TYPE)) |
2996 | t = fold_build_pointer_plus (fd->loops[i].n1, t)fold_build_pointer_plus_loc (((location_t) 0), fd->loops[i ].n1, t); |
2997 | else |
2998 | t = fold_build2 (PLUS_EXPR, itype, fd->loops[i].n1, t)fold_build2_loc (((location_t) 0), PLUS_EXPR, itype, fd->loops [i].n1, t ); |
2999 | t = force_gimple_operand_gsi (gsi, t, |
3000 | DECL_P (fd->loops[i].v)(tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code ) (fd->loops[i].v)->base.code))] == tcc_declaration) |
3001 | && TREE_ADDRESSABLE (fd->loops[i].v)((fd->loops[i].v)->base.addressable_flag), |
3002 | NULL_TREE(tree) nullptr, false, |
3003 | GSI_CONTINUE_LINKING); |
3004 | stmt = gimple_build_assign (fd->loops[i].v, t); |
3005 | gsi_insert_after (gsi, stmt, GSI_CONTINUE_LINKING); |
3006 | } |
3007 | if (i != 0 && (i != fd->last_nonrect || fd->first_nonrect)) |
3008 | { |
3009 | t = fold_build2 (TRUNC_DIV_EXPR, type, tem, counts[i])fold_build2_loc (((location_t) 0), TRUNC_DIV_EXPR, type, tem, counts[i] ); |
3010 | t = force_gimple_operand_gsi (gsi, t, false, NULL_TREE(tree) nullptr, |
3011 | false, GSI_CONTINUE_LINKING); |
3012 | stmt = gimple_build_assign (tem, t); |
3013 | gsi_insert_after (gsi, stmt, GSI_CONTINUE_LINKING); |
3014 | } |
3015 | if (i == fd->last_nonrect) |
3016 | i = fd->first_nonrect; |
3017 | } |
3018 | if (fd->non_rect) |
3019 | for (i = 0; i <= fd->last_nonrect; i++) |
3020 | if (fd->loops[i].m2) |
3021 | { |
3022 | tree itype = TREE_TYPE (fd->loops[i].v)((contains_struct_check ((fd->loops[i].v), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3022, __FUNCTION__))->typed.type); |
3023 | |
3024 | tree t; |
3025 | if (POINTER_TYPE_P (itype)(((enum tree_code) (itype)->base.code) == POINTER_TYPE || ( (enum tree_code) (itype)->base.code) == REFERENCE_TYPE)) |
3026 | { |
3027 | gcc_assert (integer_onep (fd->loops[i].m2))((void)(!(integer_onep (fd->loops[i].m2)) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3027, __FUNCTION__), 0 : 0)); |
3028 | t = fold_build_pointer_plus (fd->loops[i - fd->loops[i].outer].v,fold_build_pointer_plus_loc (((location_t) 0), fd->loops[i - fd->loops[i].outer].v, unshare_expr (fd->loops[i].n2 )) |
3029 | unshare_expr (fd->loops[i].n2))fold_build_pointer_plus_loc (((location_t) 0), fd->loops[i - fd->loops[i].outer].v, unshare_expr (fd->loops[i].n2 )); |
3030 | } |
3031 | else |
3032 | { |
3033 | t = fold_convert (itype, unshare_expr (fd->loops[i].m2))fold_convert_loc (((location_t) 0), itype, unshare_expr (fd-> loops[i].m2)); |
3034 | t = fold_build2 (MULT_EXPR, itype,fold_build2_loc (((location_t) 0), MULT_EXPR, itype, fd->loops [i - fd->loops[i].outer].v, t ) |
3035 | fd->loops[i - fd->loops[i].outer].v, t)fold_build2_loc (((location_t) 0), MULT_EXPR, itype, fd->loops [i - fd->loops[i].outer].v, t ); |
3036 | t = fold_build2 (PLUS_EXPR, itype, t,fold_build2_loc (((location_t) 0), PLUS_EXPR, itype, t, fold_convert_loc (((location_t) 0), itype, unshare_expr (fd->loops[i].n2)) ) |
3037 | fold_convert (itype,fold_build2_loc (((location_t) 0), PLUS_EXPR, itype, t, fold_convert_loc (((location_t) 0), itype, unshare_expr (fd->loops[i].n2)) ) |
3038 | unshare_expr (fd->loops[i].n2)))fold_build2_loc (((location_t) 0), PLUS_EXPR, itype, t, fold_convert_loc (((location_t) 0), itype, unshare_expr (fd->loops[i].n2)) ); |
3039 | } |
3040 | nonrect_bounds[i] = create_tmp_reg (itype, ".bound"); |
3041 | t = force_gimple_operand_gsi (gsi, t, false, |
3042 | NULL_TREE(tree) nullptr, false, |
3043 | GSI_CONTINUE_LINKING); |
3044 | stmt = gimple_build_assign (nonrect_bounds[i], t); |
3045 | gsi_insert_after (gsi, stmt, GSI_CONTINUE_LINKING); |
3046 | } |
3047 | } |
3048 | |
3049 | /* Helper function for expand_omp_for_*. Generate code like: |
3050 | L10: |
3051 | V3 += STEP3; |
3052 | if (V3 cond3 N32) goto BODY_BB; else goto L11; |
3053 | L11: |
3054 | V3 = N31; |
3055 | V2 += STEP2; |
3056 | if (V2 cond2 N22) goto BODY_BB; else goto L12; |
3057 | L12: |
3058 | V2 = N21; |
3059 | V1 += STEP1; |
3060 | goto BODY_BB; |
3061 | For non-rectangular loops, use temporaries stored in nonrect_bounds |
3062 | for the upper bounds if M?2 multiplier is present. Given e.g. |
3063 | for (V1 = N11; V1 cond1 N12; V1 += STEP1) |
3064 | for (V2 = N21; V2 cond2 N22; V2 += STEP2) |
3065 | for (V3 = N31; V3 cond3 N32; V3 += STEP3) |
3066 | for (V4 = N41 + M41 * V2; V4 cond4 N42 + M42 * V2; V4 += STEP4) |
3067 | do: |
3068 | L10: |
3069 | V4 += STEP4; |
3070 | if (V4 cond4 NONRECT_BOUND4) goto BODY_BB; else goto L11; |
3071 | L11: |
3072 | V4 = N41 + M41 * V2; // This can be left out if the loop |
3073 | // refers to the immediate parent loop |
3074 | V3 += STEP3; |
3075 | if (V3 cond3 N32) goto BODY_BB; else goto L12; |
3076 | L12: |
3077 | V3 = N31; |
3078 | V2 += STEP2; |
3079 | if (V2 cond2 N22) goto L120; else goto L13; |
3080 | L120: |
3081 | V4 = N41 + M41 * V2; |
3082 | NONRECT_BOUND4 = N42 + M42 * V2; |
3083 | if (V4 cond4 NONRECT_BOUND4) goto BODY_BB; else goto L12; |
3084 | L13: |
3085 | V2 = N21; |
3086 | V1 += STEP1; |
3087 | goto L120; */ |
3088 | |
3089 | static basic_block |
3090 | extract_omp_for_update_vars (struct omp_for_data *fd, tree *nonrect_bounds, |
3091 | basic_block cont_bb, basic_block body_bb) |
3092 | { |
3093 | basic_block last_bb, bb, collapse_bb = NULLnullptr; |
3094 | int i; |
3095 | gimple_stmt_iterator gsi; |
3096 | edge e; |
3097 | tree t; |
3098 | gimple *stmt; |
3099 | |
3100 | last_bb = cont_bb; |
3101 | for (i = fd->collapse - 1; i >= 0; i--) |
3102 | { |
3103 | tree vtype = TREE_TYPE (fd->loops[i].v)((contains_struct_check ((fd->loops[i].v), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3103, __FUNCTION__))->typed.type); |
3104 | |
3105 | bb = create_empty_bb (last_bb); |
3106 | add_bb_to_loop (bb, last_bb->loop_father); |
3107 | gsi = gsi_start_bb (bb); |
3108 | |
3109 | if (i < fd->collapse - 1) |
3110 | { |
3111 | e = make_edge (last_bb, bb, EDGE_FALSE_VALUE); |
3112 | e->probability = profile_probability::guessed_always () / 8; |
3113 | |
3114 | struct omp_for_data_loop *l = &fd->loops[i + 1]; |
3115 | if (l->m1 == NULL_TREE(tree) nullptr || l->outer != 1) |
3116 | { |
3117 | t = l->n1; |
3118 | if (l->m1) |
3119 | { |
3120 | if (POINTER_TYPE_P (TREE_TYPE (l->v))(((enum tree_code) (((contains_struct_check ((l->v), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3120, __FUNCTION__))->typed.type))->base.code) == POINTER_TYPE || ((enum tree_code) (((contains_struct_check ((l->v), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3120, __FUNCTION__))->typed.type))->base.code) == REFERENCE_TYPE )) |
3121 | t = fold_build_pointer_plus (fd->loops[i + 1 - l->outer].v,fold_build_pointer_plus_loc (((location_t) 0), fd->loops[i + 1 - l->outer].v, t) |
3122 | t)fold_build_pointer_plus_loc (((location_t) 0), fd->loops[i + 1 - l->outer].v, t); |
3123 | else |
3124 | { |
3125 | tree t2 |
3126 | = fold_build2 (MULT_EXPR, TREE_TYPE (t),fold_build2_loc (((location_t) 0), MULT_EXPR, ((contains_struct_check ((t), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3126, __FUNCTION__))->typed.type), fd->loops[i + 1 - l ->outer].v, l->m1 ) |
3127 | fd->loops[i + 1 - l->outer].v, l->m1)fold_build2_loc (((location_t) 0), MULT_EXPR, ((contains_struct_check ((t), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3126, __FUNCTION__))->typed.type), fd->loops[i + 1 - l ->outer].v, l->m1 ); |
3128 | t = fold_build2 (PLUS_EXPR, TREE_TYPE (t), t2, t)fold_build2_loc (((location_t) 0), PLUS_EXPR, ((contains_struct_check ((t), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3128, __FUNCTION__))->typed.type), t2, t ); |
3129 | } |
3130 | } |
3131 | t = force_gimple_operand_gsi (&gsi, t, |
3132 | DECL_P (l->v)(tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code ) (l->v)->base.code))] == tcc_declaration) |
3133 | && TREE_ADDRESSABLE (l->v)((l->v)->base.addressable_flag), |
3134 | NULL_TREE(tree) nullptr, false, |
3135 | GSI_CONTINUE_LINKING); |
3136 | stmt = gimple_build_assign (l->v, t); |
3137 | gsi_insert_after (&gsi, stmt, GSI_CONTINUE_LINKING); |
3138 | } |
3139 | } |
3140 | else |
3141 | collapse_bb = bb; |
3142 | |
3143 | set_immediate_dominator (CDI_DOMINATORS, bb, last_bb); |
3144 | |
3145 | if (POINTER_TYPE_P (vtype)(((enum tree_code) (vtype)->base.code) == POINTER_TYPE || ( (enum tree_code) (vtype)->base.code) == REFERENCE_TYPE)) |
3146 | t = fold_build_pointer_plus (fd->loops[i].v, fd->loops[i].step)fold_build_pointer_plus_loc (((location_t) 0), fd->loops[i ].v, fd->loops[i].step); |
3147 | else |
3148 | t = fold_build2 (PLUS_EXPR, vtype, fd->loops[i].v, fd->loops[i].step)fold_build2_loc (((location_t) 0), PLUS_EXPR, vtype, fd->loops [i].v, fd->loops[i].step ); |
3149 | t = force_gimple_operand_gsi (&gsi, t, |
3150 | DECL_P (fd->loops[i].v)(tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code ) (fd->loops[i].v)->base.code))] == tcc_declaration) |
3151 | && TREE_ADDRESSABLE (fd->loops[i].v)((fd->loops[i].v)->base.addressable_flag), |
3152 | NULL_TREE(tree) nullptr, false, GSI_CONTINUE_LINKING); |
3153 | stmt = gimple_build_assign (fd->loops[i].v, t); |
3154 | gsi_insert_after (&gsi, stmt, GSI_CONTINUE_LINKING); |
3155 | |
3156 | if (fd->loops[i].non_rect_referenced) |
3157 | { |
3158 | basic_block update_bb = NULLnullptr, prev_bb = NULLnullptr; |
3159 | for (int j = i + 1; j <= fd->last_nonrect; j++) |
3160 | if (j - fd->loops[j].outer == i) |
3161 | { |
3162 | tree n1, n2; |
3163 | struct omp_for_data_loop *l = &fd->loops[j]; |
3164 | basic_block this_bb = create_empty_bb (last_bb); |
3165 | add_bb_to_loop (this_bb, last_bb->loop_father); |
3166 | gimple_stmt_iterator gsi2 = gsi_start_bb (this_bb); |
3167 | if (prev_bb) |
3168 | { |
3169 | e = make_edge (prev_bb, this_bb, EDGE_TRUE_VALUE); |
3170 | e->probability |
3171 | = profile_probability::guessed_always ().apply_scale (7, |
3172 | 8); |
3173 | set_immediate_dominator (CDI_DOMINATORS, this_bb, prev_bb); |
3174 | } |
3175 | if (l->m1) |
3176 | { |
3177 | if (POINTER_TYPE_P (TREE_TYPE (l->v))(((enum tree_code) (((contains_struct_check ((l->v), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3177, __FUNCTION__))->typed.type))->base.code) == POINTER_TYPE || ((enum tree_code) (((contains_struct_check ((l->v), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3177, __FUNCTION__))->typed.type))->base.code) == REFERENCE_TYPE )) |
3178 | t = fold_build_pointer_plus (fd->loops[i].v, l->n1)fold_build_pointer_plus_loc (((location_t) 0), fd->loops[i ].v, l->n1); |
3179 | else |
3180 | { |
3181 | t = fold_build2 (MULT_EXPR, TREE_TYPE (l->m1), l->m1,fold_build2_loc (((location_t) 0), MULT_EXPR, ((contains_struct_check ((l->m1), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3181, __FUNCTION__))->typed.type), l->m1, fd->loops [i].v ) |
3182 | fd->loops[i].v)fold_build2_loc (((location_t) 0), MULT_EXPR, ((contains_struct_check ((l->m1), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3181, __FUNCTION__))->typed.type), l->m1, fd->loops [i].v ); |
3183 | t = fold_build2 (PLUS_EXPR, TREE_TYPE (l->v),fold_build2_loc (((location_t) 0), PLUS_EXPR, ((contains_struct_check ((l->v), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3183, __FUNCTION__))->typed.type), t, l->n1 ) |
3184 | t, l->n1)fold_build2_loc (((location_t) 0), PLUS_EXPR, ((contains_struct_check ((l->v), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3183, __FUNCTION__))->typed.type), t, l->n1 ); |
3185 | } |
3186 | n1 = force_gimple_operand_gsi (&gsi2, t, true, NULL_TREE(tree) nullptr, |
3187 | false, |
3188 | GSI_CONTINUE_LINKING); |
3189 | stmt = gimple_build_assign (l->v, n1); |
3190 | gsi_insert_after (&gsi2, stmt, GSI_CONTINUE_LINKING); |
3191 | n1 = l->v; |
3192 | } |
3193 | else |
3194 | n1 = force_gimple_operand_gsi (&gsi2, l->n1, true, |
3195 | NULL_TREE(tree) nullptr, false, |
3196 | GSI_CONTINUE_LINKING); |
3197 | if (l->m2) |
3198 | { |
3199 | if (POINTER_TYPE_P (TREE_TYPE (l->v))(((enum tree_code) (((contains_struct_check ((l->v), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3199, __FUNCTION__))->typed.type))->base.code) == POINTER_TYPE || ((enum tree_code) (((contains_struct_check ((l->v), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3199, __FUNCTION__))->typed.type))->base.code) == REFERENCE_TYPE )) |
3200 | t = fold_build_pointer_plus (fd->loops[i].v, l->n2)fold_build_pointer_plus_loc (((location_t) 0), fd->loops[i ].v, l->n2); |
3201 | else |
3202 | { |
3203 | t = fold_build2 (MULT_EXPR, TREE_TYPE (l->m2), l->m2,fold_build2_loc (((location_t) 0), MULT_EXPR, ((contains_struct_check ((l->m2), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3203, __FUNCTION__))->typed.type), l->m2, fd->loops [i].v ) |
3204 | fd->loops[i].v)fold_build2_loc (((location_t) 0), MULT_EXPR, ((contains_struct_check ((l->m2), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3203, __FUNCTION__))->typed.type), l->m2, fd->loops [i].v ); |
3205 | t = fold_build2 (PLUS_EXPR,fold_build2_loc (((location_t) 0), PLUS_EXPR, ((contains_struct_check ((nonrect_bounds[j]), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3206, __FUNCTION__))->typed.type), t, unshare_expr (l-> n2) ) |
3206 | TREE_TYPE (nonrect_bounds[j]),fold_build2_loc (((location_t) 0), PLUS_EXPR, ((contains_struct_check ((nonrect_bounds[j]), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3206, __FUNCTION__))->typed.type), t, unshare_expr (l-> n2) ) |
3207 | t, unshare_expr (l->n2))fold_build2_loc (((location_t) 0), PLUS_EXPR, ((contains_struct_check ((nonrect_bounds[j]), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3206, __FUNCTION__))->typed.type), t, unshare_expr (l-> n2) ); |
3208 | } |
3209 | n2 = force_gimple_operand_gsi (&gsi2, t, true, NULL_TREE(tree) nullptr, |
3210 | false, |
3211 | GSI_CONTINUE_LINKING); |
3212 | stmt = gimple_build_assign (nonrect_bounds[j], n2); |
3213 | gsi_insert_after (&gsi2, stmt, GSI_CONTINUE_LINKING); |
3214 | n2 = nonrect_bounds[j]; |
3215 | } |
3216 | else |
3217 | n2 = force_gimple_operand_gsi (&gsi2, unshare_expr (l->n2), |
3218 | true, NULL_TREE(tree) nullptr, false, |
3219 | GSI_CONTINUE_LINKING); |
3220 | gcond *cond_stmt |
3221 | = gimple_build_cond (l->cond_code, n1, n2, |
3222 | NULL_TREE(tree) nullptr, NULL_TREE(tree) nullptr); |
3223 | gsi_insert_after (&gsi2, cond_stmt, GSI_CONTINUE_LINKING); |
3224 | if (update_bb == NULLnullptr) |
3225 | update_bb = this_bb; |
3226 | e = make_edge (this_bb, bb, EDGE_FALSE_VALUE); |
3227 | e->probability = profile_probability::guessed_always () / 8; |
3228 | if (prev_bb == NULLnullptr) |
3229 | set_immediate_dominator (CDI_DOMINATORS, this_bb, bb); |
3230 | prev_bb = this_bb; |
3231 | } |
3232 | e = make_edge (prev_bb, body_bb, EDGE_TRUE_VALUE); |
3233 | e->probability |
3234 | = profile_probability::guessed_always ().apply_scale (7, 8); |
3235 | body_bb = update_bb; |
3236 | } |
3237 | |
3238 | if (i > 0) |
3239 | { |
3240 | if (fd->loops[i].m2) |
3241 | t = nonrect_bounds[i]; |
3242 | else |
3243 | t = unshare_expr (fd->loops[i].n2); |
3244 | t = force_gimple_operand_gsi (&gsi, t, true, NULL_TREE(tree) nullptr, |
3245 | false, GSI_CONTINUE_LINKING); |
3246 | tree v = fd->loops[i].v; |
3247 | if (DECL_P (v)(tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code ) (v)->base.code))] == tcc_declaration) && TREE_ADDRESSABLE (v)((v)->base.addressable_flag)) |
3248 | v = force_gimple_operand_gsi (&gsi, v, true, NULL_TREE(tree) nullptr, |
3249 | false, GSI_CONTINUE_LINKING); |
3250 | t = fold_build2 (fd->loops[i].cond_code, boolean_type_node, v, t)fold_build2_loc (((location_t) 0), fd->loops[i].cond_code, global_trees[TI_BOOLEAN_TYPE], v, t ); |
3251 | stmt = gimple_build_cond_empty (t); |
3252 | gsi_insert_after (&gsi, stmt, GSI_CONTINUE_LINKING); |
3253 | if (walk_tree (gimple_cond_lhs_ptr (as_a <gcond *> (stmt)),walk_tree_1 (gimple_cond_lhs_ptr (as_a <gcond *> (stmt) ), expand_omp_regimplify_p, nullptr, nullptr, nullptr) |
3254 | expand_omp_regimplify_p, NULL, NULL)walk_tree_1 (gimple_cond_lhs_ptr (as_a <gcond *> (stmt) ), expand_omp_regimplify_p, nullptr, nullptr, nullptr) |
3255 | || walk_tree (gimple_cond_rhs_ptr (as_a <gcond *> (stmt)),walk_tree_1 (gimple_cond_rhs_ptr (as_a <gcond *> (stmt) ), expand_omp_regimplify_p, nullptr, nullptr, nullptr) |
3256 | expand_omp_regimplify_p, NULL, NULL)walk_tree_1 (gimple_cond_rhs_ptr (as_a <gcond *> (stmt) ), expand_omp_regimplify_p, nullptr, nullptr, nullptr)) |
3257 | gimple_regimplify_operands (stmt, &gsi); |
3258 | e = make_edge (bb, body_bb, EDGE_TRUE_VALUE); |
3259 | e->probability = profile_probability::guessed_always ().apply_scale (7, 8); |
3260 | } |
3261 | else |
3262 | make_edge (bb, body_bb, EDGE_FALLTHRU); |
3263 | set_immediate_dominator (CDI_DOMINATORS, bb, last_bb); |
3264 | last_bb = bb; |
3265 | } |
3266 | |
3267 | return collapse_bb; |
3268 | } |
3269 | |
3270 | /* Expand #pragma omp ordered depend(source). */ |
3271 | |
3272 | static void |
3273 | expand_omp_ordered_source (gimple_stmt_iterator *gsi, struct omp_for_data *fd, |
3274 | tree *counts, location_t loc) |
3275 | { |
3276 | enum built_in_function source_ix |
3277 | = fd->iter_type == long_integer_type_nodeinteger_types[itk_long] |
3278 | ? BUILT_IN_GOMP_DOACROSS_POST : BUILT_IN_GOMP_DOACROSS_ULL_POST; |
3279 | gimple *g |
3280 | = gimple_build_call (builtin_decl_explicit (source_ix), 1, |
3281 | build_fold_addr_expr (counts[fd->ordered])build_fold_addr_expr_loc (((location_t) 0), (counts[fd->ordered ]))); |
3282 | gimple_set_location (g, loc); |
3283 | gsi_insert_before (gsi, g, GSI_SAME_STMT); |
3284 | } |
3285 | |
3286 | /* Expand a single depend from #pragma omp ordered depend(sink:...). */ |
3287 | |
3288 | static void |
3289 | expand_omp_ordered_sink (gimple_stmt_iterator *gsi, struct omp_for_data *fd, |
3290 | tree *counts, tree c, location_t loc, |
3291 | basic_block cont_bb) |
3292 | { |
3293 | auto_vec<tree, 10> args; |
3294 | enum built_in_function sink_ix |
3295 | = fd->iter_type == long_integer_type_nodeinteger_types[itk_long] |
3296 | ? BUILT_IN_GOMP_DOACROSS_WAIT : BUILT_IN_GOMP_DOACROSS_ULL_WAIT; |
3297 | tree t, off, coff = NULL_TREE(tree) nullptr, deps = OMP_CLAUSE_DECL (c)(*(omp_clause_elt_check (((omp_clause_range_check (((tree_check ((c), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3297, __FUNCTION__, (OMP_CLAUSE)))), (OMP_CLAUSE_PRIVATE), ( OMP_CLAUSE__SCANTEMP_), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3297, __FUNCTION__))), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3297, __FUNCTION__))), cond = NULL_TREE(tree) nullptr; |
3298 | int i; |
3299 | gimple_stmt_iterator gsi2 = *gsi; |
3300 | bool warned_step = false; |
3301 | |
3302 | if (deps == NULLnullptr) |
3303 | { |
3304 | /* Handle doacross(sink: omp_cur_iteration - 1). */ |
3305 | gsi_prev (&gsi2); |
3306 | edge e1 = split_block (gsi_bb (gsi2), gsi_stmt (gsi2)); |
3307 | edge e2 = split_block_after_labels (e1->dest); |
3308 | gsi2 = gsi_after_labels (e1->dest); |
3309 | *gsi = gsi_last_bb (e1->src); |
3310 | gimple_stmt_iterator gsi3 = *gsi; |
3311 | |
3312 | if (counts[fd->collapse - 1]) |
3313 | { |
3314 | gcc_assert (fd->collapse == 1)((void)(!(fd->collapse == 1) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3314, __FUNCTION__), 0 : 0)); |
3315 | t = counts[fd->collapse - 1]; |
3316 | } |
3317 | else if (fd->collapse > 1) |
3318 | t = fd->loop.v; |
3319 | else |
3320 | { |
3321 | t = fold_build2 (MINUS_EXPR, TREE_TYPE (fd->loops[0].v),fold_build2_loc (((location_t) 0), MINUS_EXPR, ((contains_struct_check ((fd->loops[0].v), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3321, __FUNCTION__))->typed.type), fd->loops[0].v, fd ->loops[0].n1 ) |
3322 | fd->loops[0].v, fd->loops[0].n1)fold_build2_loc (((location_t) 0), MINUS_EXPR, ((contains_struct_check ((fd->loops[0].v), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3321, __FUNCTION__))->typed.type), fd->loops[0].v, fd ->loops[0].n1 ); |
3323 | t = fold_convert (fd->iter_type, t)fold_convert_loc (((location_t) 0), fd->iter_type, t); |
3324 | } |
3325 | |
3326 | t = force_gimple_operand_gsi (gsi, t, true, NULL_TREE(tree) nullptr, |
3327 | false, GSI_CONTINUE_LINKING); |
3328 | gsi_insert_after (gsi, gimple_build_cond (NE_EXPR, t, |
3329 | build_zero_cst (TREE_TYPE (t)((contains_struct_check ((t), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3329, __FUNCTION__))->typed.type)), |
3330 | NULL_TREE(tree) nullptr, NULL_TREE(tree) nullptr), |
3331 | GSI_NEW_STMT); |
3332 | |
3333 | t = fold_build2 (PLUS_EXPR, TREE_TYPE (t), t,fold_build2_loc (((location_t) 0), PLUS_EXPR, ((contains_struct_check ((t), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3333, __FUNCTION__))->typed.type), t, build_minus_one_cst (((contains_struct_check ((t), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3334, __FUNCTION__))->typed.type)) ) |
3334 | build_minus_one_cst (TREE_TYPE (t)))fold_build2_loc (((location_t) 0), PLUS_EXPR, ((contains_struct_check ((t), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3333, __FUNCTION__))->typed.type), t, build_minus_one_cst (((contains_struct_check ((t), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3334, __FUNCTION__))->typed.type)) ); |
3335 | t = force_gimple_operand_gsi (&gsi2, t, true, NULL_TREE(tree) nullptr, |
3336 | true, GSI_SAME_STMT); |
3337 | args.safe_push (t); |
3338 | for (i = fd->collapse; i < fd->ordered; i++) |
3339 | { |
3340 | t = counts[fd->ordered + 2 + (i - fd->collapse)]; |
3341 | t = fold_build2 (PLUS_EXPR, TREE_TYPE (t), t,fold_build2_loc (((location_t) 0), PLUS_EXPR, ((contains_struct_check ((t), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3341, __FUNCTION__))->typed.type), t, build_minus_one_cst (((contains_struct_check ((t), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3342, __FUNCTION__))->typed.type)) ) |
3342 | build_minus_one_cst (TREE_TYPE (t)))fold_build2_loc (((location_t) 0), PLUS_EXPR, ((contains_struct_check ((t), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3341, __FUNCTION__))->typed.type), t, build_minus_one_cst (((contains_struct_check ((t), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3342, __FUNCTION__))->typed.type)) ); |
3343 | t = fold_convert (fd->iter_type, t)fold_convert_loc (((location_t) 0), fd->iter_type, t); |
3344 | t = force_gimple_operand_gsi (&gsi2, t, true, NULL_TREE(tree) nullptr, |
3345 | true, GSI_SAME_STMT); |
3346 | args.safe_push (t); |
3347 | } |
3348 | |
3349 | gimple *g = gimple_build_call_vec (builtin_decl_explicit (sink_ix), |
3350 | args); |
3351 | gimple_set_location (g, loc); |
3352 | gsi_insert_before (&gsi2, g, GSI_SAME_STMT); |
3353 | |
3354 | edge e3 = make_edge (e1->src, e2->dest, EDGE_FALSE_VALUE); |
3355 | e3->probability = profile_probability::guessed_always () / 8; |
3356 | e1->probability = e3->probability.invert (); |
3357 | e1->flags = EDGE_TRUE_VALUE; |
3358 | set_immediate_dominator (CDI_DOMINATORS, e2->dest, e1->src); |
3359 | |
3360 | if (fd->ordered > fd->collapse && cont_bb) |
3361 | { |
3362 | if (counts[fd->ordered + 1] == NULL_TREE(tree) nullptr) |
3363 | counts[fd->ordered + 1] |
3364 | = create_tmp_var (boolean_type_nodeglobal_trees[TI_BOOLEAN_TYPE], ".first"); |
3365 | |
3366 | edge e4; |
3367 | if (gsi_end_p (gsi3)) |
3368 | e4 = split_block_after_labels (e1->src); |
3369 | else |
3370 | { |
3371 | gsi_prev (&gsi3); |
3372 | e4 = split_block (gsi_bb (gsi3), gsi_stmt (gsi3)); |
3373 | } |
3374 | gsi3 = gsi_last_bb (e4->src); |
3375 | |
3376 | gsi_insert_after (&gsi3, |
3377 | gimple_build_cond (NE_EXPR, |
3378 | counts[fd->ordered + 1], |
3379 | boolean_false_nodeglobal_trees[TI_BOOLEAN_FALSE], |
3380 | NULL_TREE(tree) nullptr, NULL_TREE(tree) nullptr), |
3381 | GSI_NEW_STMT); |
3382 | |
3383 | edge e5 = make_edge (e4->src, e2->dest, EDGE_FALSE_VALUE); |
3384 | e4->probability = profile_probability::guessed_always () / 8; |
3385 | e5->probability = e4->probability.invert (); |
3386 | e4->flags = EDGE_TRUE_VALUE; |
3387 | set_immediate_dominator (CDI_DOMINATORS, e2->dest, e4->src); |
3388 | } |
3389 | |
3390 | *gsi = gsi_after_labels (e2->dest); |
3391 | return; |
3392 | } |
3393 | for (i = 0; i < fd->ordered; i++) |
3394 | { |
3395 | tree step = NULL_TREE(tree) nullptr; |
3396 | off = TREE_PURPOSE (deps)((tree_check ((deps), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3396, __FUNCTION__, (TREE_LIST)))->list.purpose); |
3397 | if (TREE_CODE (off)((enum tree_code) (off)->base.code) == TRUNC_DIV_EXPR) |
3398 | { |
3399 | step = TREE_OPERAND (off, 1)(*((const_cast<tree*> (tree_operand_check ((off), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3399, __FUNCTION__))))); |
3400 | off = TREE_OPERAND (off, 0)(*((const_cast<tree*> (tree_operand_check ((off), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3400, __FUNCTION__))))); |
3401 | } |
3402 | if (!integer_zerop (off)) |
3403 | { |
3404 | gcc_assert (fd->loops[i].cond_code == LT_EXPR((void)(!(fd->loops[i].cond_code == LT_EXPR || fd->loops [i].cond_code == GT_EXPR) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3405, __FUNCTION__), 0 : 0)) |
3405 | || fd->loops[i].cond_code == GT_EXPR)((void)(!(fd->loops[i].cond_code == LT_EXPR || fd->loops [i].cond_code == GT_EXPR) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3405, __FUNCTION__), 0 : 0)); |
3406 | bool forward = fd->loops[i].cond_code == LT_EXPR; |
3407 | if (step) |
3408 | { |
3409 | /* Non-simple Fortran DO loops. If step is variable, |
3410 | we don't know at compile even the direction, so can't |
3411 | warn. */ |
3412 | if (TREE_CODE (step)((enum tree_code) (step)->base.code) != INTEGER_CST) |
3413 | break; |
3414 | forward = tree_int_cst_sgn (step) != -1; |
3415 | } |
3416 | if (forward ^ OMP_CLAUSE_DOACROSS_SINK_NEGATIVE (deps)(((tree_check ((deps), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3416, __FUNCTION__, (TREE_LIST))))->base.public_flag)) |
3417 | warning_at (loc, 0, "%qs clause with %<sink%> modifier " |
3418 | "waiting for lexically later iteration", |
3419 | OMP_CLAUSE_DOACROSS_DEPEND (c)(((omp_clause_subcode_check ((c), (OMP_CLAUSE_DOACROSS), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3419, __FUNCTION__)))->base.protected_flag) |
3420 | ? "depend" : "doacross"); |
3421 | break; |
3422 | } |
3423 | deps = TREE_CHAIN (deps)((contains_struct_check ((deps), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3423, __FUNCTION__))->common.chain); |
3424 | } |
3425 | /* If all offsets corresponding to the collapsed loops are zero, |
3426 | this depend clause can be ignored. FIXME: but there is still a |
3427 | flush needed. We need to emit one __sync_synchronize () for it |
3428 | though (perhaps conditionally)? Solve this together with the |
3429 | conservative dependence folding optimization. |
3430 | if (i >= fd->collapse) |
3431 | return; */ |
3432 | |
3433 | deps = OMP_CLAUSE_DECL (c)(*(omp_clause_elt_check (((omp_clause_range_check (((tree_check ((c), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3433, __FUNCTION__, (OMP_CLAUSE)))), (OMP_CLAUSE_PRIVATE), ( OMP_CLAUSE__SCANTEMP_), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3433, __FUNCTION__))), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3433, __FUNCTION__))); |
3434 | gsi_prev (&gsi2); |
3435 | edge e1 = split_block (gsi_bb (gsi2), gsi_stmt (gsi2)); |
3436 | edge e2 = split_block_after_labels (e1->dest); |
3437 | |
3438 | gsi2 = gsi_after_labels (e1->dest); |
3439 | *gsi = gsi_last_bb (e1->src); |
3440 | for (i = 0; i < fd->ordered; i++) |
3441 | { |
3442 | tree itype = TREE_TYPE (fd->loops[i].v)((contains_struct_check ((fd->loops[i].v), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3442, __FUNCTION__))->typed.type); |
3443 | tree step = NULL_TREE(tree) nullptr; |
3444 | tree orig_off = NULL_TREE(tree) nullptr; |
3445 | if (POINTER_TYPE_P (itype)(((enum tree_code) (itype)->base.code) == POINTER_TYPE || ( (enum tree_code) (itype)->base.code) == REFERENCE_TYPE)) |
3446 | itype = sizetypesizetype_tab[(int) stk_sizetype]; |
3447 | if (i) |
3448 | deps = TREE_CHAIN (deps)((contains_struct_check ((deps), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3448, __FUNCTION__))->common.chain); |
3449 | off = TREE_PURPOSE (deps)((tree_check ((deps), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3449, __FUNCTION__, (TREE_LIST)))->list.purpose); |
3450 | if (TREE_CODE (off)((enum tree_code) (off)->base.code) == TRUNC_DIV_EXPR) |
3451 | { |
3452 | step = TREE_OPERAND (off, 1)(*((const_cast<tree*> (tree_operand_check ((off), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3452, __FUNCTION__))))); |
3453 | off = TREE_OPERAND (off, 0)(*((const_cast<tree*> (tree_operand_check ((off), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3453, __FUNCTION__))))); |
3454 | gcc_assert (fd->loops[i].cond_code == LT_EXPR((void)(!(fd->loops[i].cond_code == LT_EXPR && integer_onep (fd->loops[i].step) && !(((enum tree_code) (((contains_struct_check ((fd->loops[i].v), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3456, __FUNCTION__))->typed.type))->base.code) == POINTER_TYPE || ((enum tree_code) (((contains_struct_check ((fd->loops [i].v), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3456, __FUNCTION__))->typed.type))->base.code) == REFERENCE_TYPE )) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3456, __FUNCTION__), 0 : 0)) |
3455 | && integer_onep (fd->loops[i].step)((void)(!(fd->loops[i].cond_code == LT_EXPR && integer_onep (fd->loops[i].step) && !(((enum tree_code) (((contains_struct_check ((fd->loops[i].v), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3456, __FUNCTION__))->typed.type))->base.code) == POINTER_TYPE || ((enum tree_code) (((contains_struct_check ((fd->loops [i].v), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3456, __FUNCTION__))->typed.type))->base.code) == REFERENCE_TYPE )) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3456, __FUNCTION__), 0 : 0)) |
3456 | && !POINTER_TYPE_P (TREE_TYPE (fd->loops[i].v)))((void)(!(fd->loops[i].cond_code == LT_EXPR && integer_onep (fd->loops[i].step) && !(((enum tree_code) (((contains_struct_check ((fd->loops[i].v), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3456, __FUNCTION__))->typed.type))->base.code) == POINTER_TYPE || ((enum tree_code) (((contains_struct_check ((fd->loops [i].v), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3456, __FUNCTION__))->typed.type))->base.code) == REFERENCE_TYPE )) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3456, __FUNCTION__), 0 : 0)); |
3457 | } |
3458 | tree s = fold_convert_loc (loc, itype, step ? step : fd->loops[i].step); |
3459 | if (step) |
3460 | { |
3461 | off = fold_convert_loc (loc, itype, off); |
3462 | orig_off = off; |
3463 | off = fold_build2_loc (loc, TRUNC_DIV_EXPR, itype, off, s); |
3464 | } |
3465 | |
3466 | if (integer_zerop (off)) |
3467 | t = boolean_true_nodeglobal_trees[TI_BOOLEAN_TRUE]; |
3468 | else |
3469 | { |
3470 | tree a; |
3471 | tree co = fold_convert_loc (loc, itype, off); |
3472 | if (POINTER_TYPE_P (TREE_TYPE (fd->loops[i].v))(((enum tree_code) (((contains_struct_check ((fd->loops[i] .v), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3472, __FUNCTION__))->typed.type))->base.code) == POINTER_TYPE || ((enum tree_code) (((contains_struct_check ((fd->loops [i].v), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3472, __FUNCTION__))->typed.type))->base.code) == REFERENCE_TYPE )) |
3473 | { |
3474 | if (OMP_CLAUSE_DOACROSS_SINK_NEGATIVE (deps)(((tree_check ((deps), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3474, __FUNCTION__, (TREE_LIST))))->base.public_flag)) |
3475 | co = fold_build1_loc (loc, NEGATE_EXPR, itype, co); |
3476 | a = fold_build2_loc (loc, POINTER_PLUS_EXPR, |
3477 | TREE_TYPE (fd->loops[i].v)((contains_struct_check ((fd->loops[i].v), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3477, __FUNCTION__))->typed.type), fd->loops[i].v, |
3478 | co); |
3479 | } |
3480 | else if (OMP_CLAUSE_DOACROSS_SINK_NEGATIVE (deps)(((tree_check ((deps), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3480, __FUNCTION__, (TREE_LIST))))->base.public_flag)) |
3481 | a = fold_build2_loc (loc, MINUS_EXPR, TREE_TYPE (fd->loops[i].v)((contains_struct_check ((fd->loops[i].v), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3481, __FUNCTION__))->typed.type), |
3482 | fd->loops[i].v, co); |
3483 | else |
3484 | a = fold_build2_loc (loc, PLUS_EXPR, TREE_TYPE (fd->loops[i].v)((contains_struct_check ((fd->loops[i].v), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3484, __FUNCTION__))->typed.type), |
3485 | fd->loops[i].v, co); |
3486 | if (step) |
3487 | { |
3488 | tree t1, t2; |
3489 | if (OMP_CLAUSE_DOACROSS_SINK_NEGATIVE (deps)(((tree_check ((deps), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3489, __FUNCTION__, (TREE_LIST))))->base.public_flag)) |
3490 | t1 = fold_build2_loc (loc, GE_EXPR, boolean_type_nodeglobal_trees[TI_BOOLEAN_TYPE], a, |
3491 | fd->loops[i].n1); |
3492 | else |
3493 | t1 = fold_build2_loc (loc, LT_EXPR, boolean_type_nodeglobal_trees[TI_BOOLEAN_TYPE], a, |
3494 | fd->loops[i].n2); |
3495 | if (OMP_CLAUSE_DOACROSS_SINK_NEGATIVE (deps)(((tree_check ((deps), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3495, __FUNCTION__, (TREE_LIST))))->base.public_flag)) |
3496 | t2 = fold_build2_loc (loc, LT_EXPR, boolean_type_nodeglobal_trees[TI_BOOLEAN_TYPE], a, |
3497 | fd->loops[i].n2); |
3498 | else |
3499 | t2 = fold_build2_loc (loc, GE_EXPR, boolean_type_nodeglobal_trees[TI_BOOLEAN_TYPE], a, |
3500 | fd->loops[i].n1); |
3501 | t = fold_build2_loc (loc, LT_EXPR, boolean_type_nodeglobal_trees[TI_BOOLEAN_TYPE], |
3502 | step, build_int_cst (TREE_TYPE (step)((contains_struct_check ((step), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3502, __FUNCTION__))->typed.type), 0)); |
3503 | if (TREE_CODE (step)((enum tree_code) (step)->base.code) != INTEGER_CST) |
3504 | { |
3505 | t1 = unshare_expr (t1); |
3506 | t1 = force_gimple_operand_gsi (gsi, t1, true, NULL_TREE(tree) nullptr, |
3507 | false, GSI_CONTINUE_LINKING); |
3508 | t2 = unshare_expr (t2); |
3509 | t2 = force_gimple_operand_gsi (gsi, t2, true, NULL_TREE(tree) nullptr, |
3510 | false, GSI_CONTINUE_LINKING); |
3511 | } |
3512 | t = fold_build3_loc (loc, COND_EXPR, boolean_type_nodeglobal_trees[TI_BOOLEAN_TYPE], |
3513 | t, t2, t1); |
3514 | } |
3515 | else if (fd->loops[i].cond_code == LT_EXPR) |
3516 | { |
3517 | if (OMP_CLAUSE_DOACROSS_SINK_NEGATIVE (deps)(((tree_check ((deps), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3517, __FUNCTION__, (TREE_LIST))))->base.public_flag)) |
3518 | t = fold_build2_loc (loc, GE_EXPR, boolean_type_nodeglobal_trees[TI_BOOLEAN_TYPE], a, |
3519 | fd->loops[i].n1); |
3520 | else |
3521 | t = fold_build2_loc (loc, LT_EXPR, boolean_type_nodeglobal_trees[TI_BOOLEAN_TYPE], a, |
3522 | fd->loops[i].n2); |
3523 | } |
3524 | else if (OMP_CLAUSE_DOACROSS_SINK_NEGATIVE (deps)(((tree_check ((deps), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3524, __FUNCTION__, (TREE_LIST))))->base.public_flag)) |
3525 | t = fold_build2_loc (loc, GT_EXPR, boolean_type_nodeglobal_trees[TI_BOOLEAN_TYPE], a, |
3526 | fd->loops[i].n2); |
3527 | else |
3528 | t = fold_build2_loc (loc, LE_EXPR, boolean_type_nodeglobal_trees[TI_BOOLEAN_TYPE], a, |
3529 | fd->loops[i].n1); |
3530 | } |
3531 | if (cond) |
3532 | cond = fold_build2_loc (loc, BIT_AND_EXPR, boolean_type_nodeglobal_trees[TI_BOOLEAN_TYPE], cond, t); |
3533 | else |
3534 | cond = t; |
3535 | |
3536 | off = fold_convert_loc (loc, itype, off); |
3537 | |
3538 | if (step |
3539 | || (fd->loops[i].cond_code == LT_EXPR |
3540 | ? !integer_onep (fd->loops[i].step) |
3541 | : !integer_minus_onep (fd->loops[i].step))) |
3542 | { |
3543 | if (step == NULL_TREE(tree) nullptr |
3544 | && TYPE_UNSIGNED (itype)((tree_class_check ((itype), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3544, __FUNCTION__))->base.u.bits.unsigned_flag) |
3545 | && fd->loops[i].cond_code == GT_EXPR) |
3546 | t = fold_build2_loc (loc, TRUNC_MOD_EXPR, itype, off, |
3547 | fold_build1_loc (loc, NEGATE_EXPR, itype, |
3548 | s)); |
3549 | else |
3550 | t = fold_build2_loc (loc, TRUNC_MOD_EXPR, itype, |
3551 | orig_off ? orig_off : off, s); |
3552 | t = fold_build2_loc (loc, EQ_EXPR, boolean_type_nodeglobal_trees[TI_BOOLEAN_TYPE], t, |
3553 | build_int_cst (itype, 0)); |
3554 | if (integer_zerop (t) && !warned_step) |
3555 | { |
3556 | warning_at (loc, 0, "%qs clause with %<sink%> modifier " |
3557 | "refers to iteration never in the iteration " |
3558 | "space", |
3559 | OMP_CLAUSE_DOACROSS_DEPEND (c)(((omp_clause_subcode_check ((c), (OMP_CLAUSE_DOACROSS), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3559, __FUNCTION__)))->base.protected_flag) |
3560 | ? "depend" : "doacross"); |
3561 | warned_step = true; |
3562 | } |
3563 | cond = fold_build2_loc (loc, BIT_AND_EXPR, boolean_type_nodeglobal_trees[TI_BOOLEAN_TYPE], |
3564 | cond, t); |
3565 | } |
3566 | |
3567 | if (i <= fd->collapse - 1 && fd->collapse > 1) |
3568 | t = fd->loop.v; |
3569 | else if (counts[i]) |
3570 | t = counts[i]; |
3571 | else |
3572 | { |
3573 | t = fold_build2_loc (loc, MINUS_EXPR, TREE_TYPE (fd->loops[i].v)((contains_struct_check ((fd->loops[i].v), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3573, __FUNCTION__))->typed.type), |
3574 | fd->loops[i].v, fd->loops[i].n1); |
3575 | t = fold_convert_loc (loc, fd->iter_type, t); |
3576 | } |
3577 | if (step) |
3578 | /* We have divided off by step already earlier. */; |
3579 | else if (TYPE_UNSIGNED (itype)((tree_class_check ((itype), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3579, __FUNCTION__))->base.u.bits.unsigned_flag) && fd->loops[i].cond_code == GT_EXPR) |
3580 | off = fold_build2_loc (loc, TRUNC_DIV_EXPR, itype, off, |
3581 | fold_build1_loc (loc, NEGATE_EXPR, itype, |
3582 | s)); |
3583 | else |
3584 | off = fold_build2_loc (loc, TRUNC_DIV_EXPR, itype, off, s); |
3585 | if (OMP_CLAUSE_DOACROSS_SINK_NEGATIVE (deps)(((tree_check ((deps), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3585, __FUNCTION__, (TREE_LIST))))->base.public_flag)) |
3586 | off = fold_build1_loc (loc, NEGATE_EXPR, itype, off); |
3587 | off = fold_convert_loc (loc, fd->iter_type, off); |
3588 | if (i <= fd->collapse - 1 && fd->collapse > 1) |
3589 | { |
3590 | if (i) |
3591 | off = fold_build2_loc (loc, PLUS_EXPR, fd->iter_type, coff, |
3592 | off); |
3593 | if (i < fd->collapse - 1) |
3594 | { |
3595 | coff = fold_build2_loc (loc, MULT_EXPR, fd->iter_type, off, |
3596 | counts[i]); |
3597 | continue; |
3598 | } |
3599 | } |
3600 | off = unshare_expr (off); |
3601 | t = fold_build2_loc (loc, PLUS_EXPR, fd->iter_type, t, off); |
3602 | t = force_gimple_operand_gsi (&gsi2, t, true, NULL_TREE(tree) nullptr, |
3603 | true, GSI_SAME_STMT); |
3604 | args.safe_push (t); |
3605 | } |
3606 | gimple *g = gimple_build_call_vec (builtin_decl_explicit (sink_ix), args); |
3607 | gimple_set_location (g, loc); |
3608 | gsi_insert_before (&gsi2, g, GSI_SAME_STMT); |
3609 | |
3610 | cond = unshare_expr (cond); |
3611 | cond = force_gimple_operand_gsi (gsi, cond, true, NULL_TREE(tree) nullptr, false, |
3612 | GSI_CONTINUE_LINKING); |
3613 | gsi_insert_after (gsi, gimple_build_cond_empty (cond), GSI_NEW_STMT); |
3614 | edge e3 = make_edge (e1->src, e2->dest, EDGE_FALSE_VALUE); |
3615 | e3->probability = profile_probability::guessed_always () / 8; |
3616 | e1->probability = e3->probability.invert (); |
3617 | e1->flags = EDGE_TRUE_VALUE; |
3618 | set_immediate_dominator (CDI_DOMINATORS, e2->dest, e1->src); |
3619 | |
3620 | *gsi = gsi_after_labels (e2->dest); |
3621 | } |
3622 | |
3623 | /* Expand all #pragma omp ordered depend(source) and |
3624 | #pragma omp ordered depend(sink:...) constructs in the current |
3625 | #pragma omp for ordered(n) region. */ |
3626 | |
3627 | static void |
3628 | expand_omp_ordered_source_sink (struct omp_region *region, |
3629 | struct omp_for_data *fd, tree *counts, |
3630 | basic_block cont_bb) |
3631 | { |
3632 | struct omp_region *inner; |
3633 | int i; |
3634 | for (i = fd->collapse - 1; i < fd->ordered; i++) |
3635 | if (i == fd->collapse - 1 && fd->collapse > 1) |
3636 | counts[i] = NULL_TREE(tree) nullptr; |
3637 | else if (i >= fd->collapse && !cont_bb) |
3638 | counts[i] = build_zero_cst (fd->iter_type); |
3639 | else if (!POINTER_TYPE_P (TREE_TYPE (fd->loops[i].v))(((enum tree_code) (((contains_struct_check ((fd->loops[i] .v), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3639, __FUNCTION__))->typed.type))->base.code) == POINTER_TYPE || ((enum tree_code) (((contains_struct_check ((fd->loops [i].v), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3639, __FUNCTION__))->typed.type))->base.code) == REFERENCE_TYPE ) |
3640 | && integer_onep (fd->loops[i].step)) |
3641 | counts[i] = NULL_TREE(tree) nullptr; |
3642 | else |
3643 | counts[i] = create_tmp_var (fd->iter_type, ".orditer"); |
3644 | tree atype |
3645 | = build_array_type_nelts (fd->iter_type, fd->ordered - fd->collapse + 1); |
3646 | counts[fd->ordered] = create_tmp_var (atype, ".orditera"); |
3647 | TREE_ADDRESSABLE (counts[fd->ordered])((counts[fd->ordered])->base.addressable_flag) = 1; |
3648 | counts[fd->ordered + 1] = NULL_TREE(tree) nullptr; |
3649 | |
3650 | for (inner = region->inner; inner; inner = inner->next) |
3651 | if (inner->type == GIMPLE_OMP_ORDERED) |
3652 | { |
3653 | gomp_ordered *ord_stmt = inner->ord_stmt; |
3654 | gimple_stmt_iterator gsi = gsi_for_stmt (ord_stmt); |
3655 | location_t loc = gimple_location (ord_stmt); |
3656 | tree c; |
3657 | for (c = gimple_omp_ordered_clauses (ord_stmt); |
3658 | c; c = OMP_CLAUSE_CHAIN (c)((contains_struct_check (((tree_check ((c), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3658, __FUNCTION__, (OMP_CLAUSE)))), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3658, __FUNCTION__))->common.chain)) |
3659 | if (OMP_CLAUSE_DOACROSS_KIND (c)((omp_clause_subcode_check ((c), (OMP_CLAUSE_DOACROSS), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3659, __FUNCTION__))->omp_clause.subcode.doacross_kind) == OMP_CLAUSE_DOACROSS_SOURCE) |
3660 | break; |
3661 | if (c) |
3662 | expand_omp_ordered_source (&gsi, fd, counts, loc); |
3663 | for (c = gimple_omp_ordered_clauses (ord_stmt); |
3664 | c; c = OMP_CLAUSE_CHAIN (c)((contains_struct_check (((tree_check ((c), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3664, __FUNCTION__, (OMP_CLAUSE)))), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3664, __FUNCTION__))->common.chain)) |
3665 | if (OMP_CLAUSE_DOACROSS_KIND (c)((omp_clause_subcode_check ((c), (OMP_CLAUSE_DOACROSS), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3665, __FUNCTION__))->omp_clause.subcode.doacross_kind) == OMP_CLAUSE_DOACROSS_SINK) |
3666 | expand_omp_ordered_sink (&gsi, fd, counts, c, loc, cont_bb); |
3667 | gsi_remove (&gsi, true); |
3668 | } |
3669 | } |
3670 | |
3671 | /* Wrap the body into fd->ordered - fd->collapse loops that aren't |
3672 | collapsed. */ |
3673 | |
3674 | static basic_block |
3675 | expand_omp_for_ordered_loops (struct omp_for_data *fd, tree *counts, |
3676 | basic_block cont_bb, basic_block body_bb, |
3677 | basic_block l0_bb, bool ordered_lastprivate) |
3678 | { |
3679 | if (fd->ordered == fd->collapse) |
3680 | return cont_bb; |
3681 | |
3682 | if (!cont_bb) |
3683 | { |
3684 | gimple_stmt_iterator gsi = gsi_after_labels (body_bb); |
3685 | for (int i = fd->collapse; i < fd->ordered; i++) |
3686 | { |
3687 | tree type = TREE_TYPE (fd->loops[i].v)((contains_struct_check ((fd->loops[i].v), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3687, __FUNCTION__))->typed.type); |
3688 | tree n1 = fold_convert (type, fd->loops[i].n1)fold_convert_loc (((location_t) 0), type, fd->loops[i].n1); |
3689 | expand_omp_build_assign (&gsi, fd->loops[i].v, n1); |
3690 | tree aref = build4 (ARRAY_REF, fd->iter_type, counts[fd->ordered], |
3691 | size_int (i - fd->collapse + 1)size_int_kind (i - fd->collapse + 1, stk_sizetype), |
3692 | NULL_TREE(tree) nullptr, NULL_TREE(tree) nullptr); |
3693 | expand_omp_build_assign (&gsi, aref, build_zero_cst (fd->iter_type)); |
3694 | } |
3695 | return NULLnullptr; |
3696 | } |
3697 | |
3698 | for (int i = fd->ordered - 1; i >= fd->collapse; i--) |
3699 | { |
3700 | tree t, type = TREE_TYPE (fd->loops[i].v)((contains_struct_check ((fd->loops[i].v), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3700, __FUNCTION__))->typed.type); |
3701 | gimple_stmt_iterator gsi = gsi_after_labels (body_bb); |
3702 | if (counts[fd->ordered + 1] && i == fd->collapse) |
3703 | expand_omp_build_assign (&gsi, counts[fd->ordered + 1], |
3704 | boolean_true_nodeglobal_trees[TI_BOOLEAN_TRUE]); |
3705 | expand_omp_build_assign (&gsi, fd->loops[i].v, |
3706 | fold_convert (type, fd->loops[i].n1)fold_convert_loc (((location_t) 0), type, fd->loops[i].n1)); |
3707 | if (counts[i]) |
3708 | expand_omp_build_assign (&gsi, counts[i], |
3709 | build_zero_cst (fd->iter_type)); |
3710 | tree aref = build4 (ARRAY_REF, fd->iter_type, counts[fd->ordered], |
3711 | size_int (i - fd->collapse + 1)size_int_kind (i - fd->collapse + 1, stk_sizetype), |
3712 | NULL_TREE(tree) nullptr, NULL_TREE(tree) nullptr); |
3713 | expand_omp_build_assign (&gsi, aref, build_zero_cst (fd->iter_type)); |
3714 | if (!gsi_end_p (gsi)) |
3715 | gsi_prev (&gsi); |
3716 | else |
3717 | gsi = gsi_last_bb (body_bb); |
3718 | edge e1 = split_block (body_bb, gsi_stmt (gsi)); |
3719 | basic_block new_body = e1->dest; |
3720 | if (body_bb == cont_bb) |
3721 | cont_bb = new_body; |
3722 | edge e2 = NULLnullptr; |
3723 | basic_block new_header; |
3724 | if (EDGE_COUNT (cont_bb->preds)vec_safe_length (cont_bb->preds) > 0) |
3725 | { |
3726 | gsi = gsi_last_bb (cont_bb); |
3727 | if (POINTER_TYPE_P (type)(((enum tree_code) (type)->base.code) == POINTER_TYPE || ( (enum tree_code) (type)->base.code) == REFERENCE_TYPE)) |
3728 | t = fold_build_pointer_plus (fd->loops[i].v, fd->loops[i].step)fold_build_pointer_plus_loc (((location_t) 0), fd->loops[i ].v, fd->loops[i].step); |
3729 | else |
3730 | t = fold_build2 (PLUS_EXPR, type, fd->loops[i].v,fold_build2_loc (((location_t) 0), PLUS_EXPR, type, fd->loops [i].v, fold_convert_loc (((location_t) 0), type, fd->loops [i].step) ) |
3731 | fold_convert (type, fd->loops[i].step))fold_build2_loc (((location_t) 0), PLUS_EXPR, type, fd->loops [i].v, fold_convert_loc (((location_t) 0), type, fd->loops [i].step) ); |
3732 | expand_omp_build_assign (&gsi, fd->loops[i].v, t); |
3733 | if (counts[i]) |
3734 | { |
3735 | t = fold_build2 (PLUS_EXPR, fd->iter_type, counts[i],fold_build2_loc (((location_t) 0), PLUS_EXPR, fd->iter_type , counts[i], build_int_cst (fd->iter_type, 1) ) |
3736 | build_int_cst (fd->iter_type, 1))fold_build2_loc (((location_t) 0), PLUS_EXPR, fd->iter_type , counts[i], build_int_cst (fd->iter_type, 1) ); |
3737 | expand_omp_build_assign (&gsi, counts[i], t); |
3738 | t = counts[i]; |
3739 | } |
3740 | else |
3741 | { |
3742 | t = fold_build2 (MINUS_EXPR, TREE_TYPE (fd->loops[i].v),fold_build2_loc (((location_t) 0), MINUS_EXPR, ((contains_struct_check ((fd->loops[i].v), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3742, __FUNCTION__))->typed.type), fd->loops[i].v, fd ->loops[i].n1 ) |
3743 | fd->loops[i].v, fd->loops[i].n1)fold_build2_loc (((location_t) 0), MINUS_EXPR, ((contains_struct_check ((fd->loops[i].v), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3742, __FUNCTION__))->typed.type), fd->loops[i].v, fd ->loops[i].n1 ); |
3744 | t = fold_convert (fd->iter_type, t)fold_convert_loc (((location_t) 0), fd->iter_type, t); |
3745 | t = force_gimple_operand_gsi (&gsi, t, true, NULL_TREE(tree) nullptr, |
3746 | true, GSI_SAME_STMT); |
3747 | } |
3748 | aref = build4 (ARRAY_REF, fd->iter_type, counts[fd->ordered], |
3749 | size_int (i - fd->collapse + 1)size_int_kind (i - fd->collapse + 1, stk_sizetype), |
3750 | NULL_TREE(tree) nullptr, NULL_TREE(tree) nullptr); |
3751 | expand_omp_build_assign (&gsi, aref, t); |
3752 | if (counts[fd->ordered + 1] && i == fd->ordered - 1) |
3753 | expand_omp_build_assign (&gsi, counts[fd->ordered + 1], |
3754 | boolean_false_nodeglobal_trees[TI_BOOLEAN_FALSE]); |
3755 | gsi_prev (&gsi); |
3756 | e2 = split_block (cont_bb, gsi_stmt (gsi)); |
3757 | new_header = e2->dest; |
3758 | } |
3759 | else |
3760 | new_header = cont_bb; |
3761 | gsi = gsi_after_labels (new_header); |
3762 | tree v = force_gimple_operand_gsi (&gsi, fd->loops[i].v, true, NULL_TREE(tree) nullptr, |
3763 | true, GSI_SAME_STMT); |
3764 | tree n2 |
3765 | = force_gimple_operand_gsi (&gsi, fold_convert (type, fd->loops[i].n2)fold_convert_loc (((location_t) 0), type, fd->loops[i].n2), |
3766 | true, NULL_TREE(tree) nullptr, true, GSI_SAME_STMT); |
3767 | t = build2 (fd->loops[i].cond_code, boolean_type_nodeglobal_trees[TI_BOOLEAN_TYPE], v, n2); |
3768 | gsi_insert_before (&gsi, gimple_build_cond_empty (t), GSI_NEW_STMT); |
3769 | edge e3 = split_block (new_header, gsi_stmt (gsi)); |
3770 | cont_bb = e3->dest; |
3771 | remove_edge (e1); |
3772 | make_edge (body_bb, new_header, EDGE_FALLTHRU); |
3773 | e3->flags = EDGE_FALSE_VALUE; |
3774 | e3->probability = profile_probability::guessed_always () / 8; |
3775 | e1 = make_edge (new_header, new_body, EDGE_TRUE_VALUE); |
3776 | e1->probability = e3->probability.invert (); |
3777 | |
3778 | set_immediate_dominator (CDI_DOMINATORS, new_header, body_bb); |
3779 | set_immediate_dominator (CDI_DOMINATORS, new_body, new_header); |
3780 | |
3781 | if (e2) |
3782 | { |
3783 | class loop *loop = alloc_loop (); |
3784 | loop->header = new_header; |
3785 | loop->latch = e2->src; |
3786 | add_loop (loop, l0_bb->loop_father); |
3787 | } |
3788 | } |
3789 | |
3790 | /* If there are any lastprivate clauses and it is possible some loops |
3791 | might have zero iterations, ensure all the decls are initialized, |
3792 | otherwise we could crash evaluating C++ class iterators with lastprivate |
3793 | clauses. */ |
3794 | bool need_inits = false; |
3795 | for (int i = fd->collapse; ordered_lastprivate && i < fd->ordered; i++) |
3796 | if (need_inits) |
3797 | { |
3798 | tree type = TREE_TYPE (fd->loops[i].v)((contains_struct_check ((fd->loops[i].v), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3798, __FUNCTION__))->typed.type); |
3799 | gimple_stmt_iterator gsi = gsi_after_labels (body_bb); |
3800 | expand_omp_build_assign (&gsi, fd->loops[i].v, |
3801 | fold_convert (type, fd->loops[i].n1)fold_convert_loc (((location_t) 0), type, fd->loops[i].n1)); |
3802 | } |
3803 | else |
3804 | { |
3805 | tree type = TREE_TYPE (fd->loops[i].v)((contains_struct_check ((fd->loops[i].v), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3805, __FUNCTION__))->typed.type); |
3806 | tree this_cond = fold_build2 (fd->loops[i].cond_code,fold_build2_loc (((location_t) 0), fd->loops[i].cond_code, global_trees[TI_BOOLEAN_TYPE], fold_convert_loc (((location_t ) 0), type, fd->loops[i].n1), fold_convert_loc (((location_t ) 0), type, fd->loops[i].n2) ) |
3807 | boolean_type_node,fold_build2_loc (((location_t) 0), fd->loops[i].cond_code, global_trees[TI_BOOLEAN_TYPE], fold_convert_loc (((location_t ) 0), type, fd->loops[i].n1), fold_convert_loc (((location_t ) 0), type, fd->loops[i].n2) ) |
3808 | fold_convert (type, fd->loops[i].n1),fold_build2_loc (((location_t) 0), fd->loops[i].cond_code, global_trees[TI_BOOLEAN_TYPE], fold_convert_loc (((location_t ) 0), type, fd->loops[i].n1), fold_convert_loc (((location_t ) 0), type, fd->loops[i].n2) ) |
3809 | fold_convert (type, fd->loops[i].n2))fold_build2_loc (((location_t) 0), fd->loops[i].cond_code, global_trees[TI_BOOLEAN_TYPE], fold_convert_loc (((location_t ) 0), type, fd->loops[i].n1), fold_convert_loc (((location_t ) 0), type, fd->loops[i].n2) ); |
3810 | if (!integer_onep (this_cond)) |
3811 | need_inits = true; |
3812 | } |
3813 | |
3814 | return cont_bb; |
3815 | } |
3816 | |
3817 | /* A subroutine of expand_omp_for. Generate code for a parallel |
3818 | loop with any schedule. Given parameters: |
3819 | |
3820 | for (V = N1; V cond N2; V += STEP) BODY; |
3821 | |
3822 | where COND is "<" or ">", we generate pseudocode |
3823 | |
3824 | more = GOMP_loop_foo_start (N1, N2, STEP, CHUNK, &istart0, &iend0); |
3825 | if (more) goto L0; else goto L3; |
3826 | L0: |
3827 | V = istart0; |
3828 | iend = iend0; |
3829 | L1: |
3830 | BODY; |
3831 | V += STEP; |
3832 | if (V cond iend) goto L1; else goto L2; |
3833 | L2: |
3834 | if (GOMP_loop_foo_next (&istart0, &iend0)) goto L0; else goto L3; |
3835 | L3: |
3836 | |
3837 | If this is a combined omp parallel loop, instead of the call to |
3838 | GOMP_loop_foo_start, we call GOMP_loop_foo_next. |
3839 | If this is gimple_omp_for_combined_p loop, then instead of assigning |
3840 | V and iend in L0 we assign the first two _looptemp_ clause decls of the |
3841 | inner GIMPLE_OMP_FOR and V += STEP; and |
3842 | if (V cond iend) goto L1; else goto L2; are removed. |
3843 | |
3844 | For collapsed loops, given parameters: |
3845 | collapse(3) |
3846 | for (V1 = N11; V1 cond1 N12; V1 += STEP1) |
3847 | for (V2 = N21; V2 cond2 N22; V2 += STEP2) |
3848 | for (V3 = N31; V3 cond3 N32; V3 += STEP3) |
3849 | BODY; |
3850 | |
3851 | we generate pseudocode |
3852 | |
3853 | if (__builtin_expect (N32 cond3 N31, 0)) goto Z0; |
3854 | if (cond3 is <) |
3855 | adj = STEP3 - 1; |
3856 | else |
3857 | adj = STEP3 + 1; |
3858 | count3 = (adj + N32 - N31) / STEP3; |
3859 | if (__builtin_expect (N22 cond2 N21, 0)) goto Z0; |
3860 | if (cond2 is <) |
3861 | adj = STEP2 - 1; |
3862 | else |
3863 | adj = STEP2 + 1; |
3864 | count2 = (adj + N22 - N21) / STEP2; |
3865 | if (__builtin_expect (N12 cond1 N11, 0)) goto Z0; |
3866 | if (cond1 is <) |
3867 | adj = STEP1 - 1; |
3868 | else |
3869 | adj = STEP1 + 1; |
3870 | count1 = (adj + N12 - N11) / STEP1; |
3871 | count = count1 * count2 * count3; |
3872 | goto Z1; |
3873 | Z0: |
3874 | count = 0; |
3875 | Z1: |
3876 | more = GOMP_loop_foo_start (0, count, 1, CHUNK, &istart0, &iend0); |
3877 | if (more) goto L0; else goto L3; |
3878 | L0: |
3879 | V = istart0; |
3880 | T = V; |
3881 | V3 = N31 + (T % count3) * STEP3; |
3882 | T = T / count3; |
3883 | V2 = N21 + (T % count2) * STEP2; |
3884 | T = T / count2; |
3885 | V1 = N11 + T * STEP1; |
3886 | iend = iend0; |
3887 | L1: |
3888 | BODY; |
3889 | V += 1; |
3890 | if (V < iend) goto L10; else goto L2; |
3891 | L10: |
3892 | V3 += STEP3; |
3893 | if (V3 cond3 N32) goto L1; else goto L11; |
3894 | L11: |
3895 | V3 = N31; |
3896 | V2 += STEP2; |
3897 | if (V2 cond2 N22) goto L1; else goto L12; |
3898 | L12: |
3899 | V2 = N21; |
3900 | V1 += STEP1; |
3901 | goto L1; |
3902 | L2: |
3903 | if (GOMP_loop_foo_next (&istart0, &iend0)) goto L0; else goto L3; |
3904 | L3: |
3905 | |
3906 | */ |
3907 | |
3908 | static void |
3909 | expand_omp_for_generic (struct omp_region *region, |
3910 | struct omp_for_data *fd, |
3911 | enum built_in_function start_fn, |
3912 | enum built_in_function next_fn, |
3913 | tree sched_arg, |
3914 | gimple *inner_stmt) |
3915 | { |
3916 | tree type, istart0, iend0, iend; |
3917 | tree t, vmain, vback, bias = NULL_TREE(tree) nullptr; |
3918 | basic_block entry_bb, cont_bb, exit_bb, l0_bb, l1_bb, collapse_bb; |
3919 | basic_block l2_bb = NULLnullptr, l3_bb = NULLnullptr; |
3920 | gimple_stmt_iterator gsi; |
3921 | gassign *assign_stmt; |
3922 | bool in_combined_parallel = is_combined_parallel (region); |
3923 | bool broken_loop = region->cont == NULLnullptr; |
3924 | edge e, ne; |
3925 | tree *counts = NULLnullptr; |
3926 | int i; |
3927 | bool ordered_lastprivate = false; |
3928 | |
3929 | gcc_assert (!broken_loop || !in_combined_parallel)((void)(!(!broken_loop || !in_combined_parallel) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3929, __FUNCTION__), 0 : 0)); |
3930 | gcc_assert (fd->iter_type == long_integer_type_node((void)(!(fd->iter_type == integer_types[itk_long] || !in_combined_parallel ) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3931, __FUNCTION__), 0 : 0)) |
3931 | || !in_combined_parallel)((void)(!(fd->iter_type == integer_types[itk_long] || !in_combined_parallel ) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3931, __FUNCTION__), 0 : 0)); |
3932 | |
3933 | entry_bb = region->entry; |
3934 | cont_bb = region->cont; |
3935 | collapse_bb = NULLnullptr; |
3936 | gcc_assert (EDGE_COUNT (entry_bb->succs) == 2)((void)(!(vec_safe_length (entry_bb->succs) == 2) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3936, __FUNCTION__), 0 : 0)); |
3937 | gcc_assert (broken_loop((void)(!(broken_loop || ((*((entry_bb))->succs)[(0)]-> flags & EDGE_FALLTHRU ? (*((entry_bb))->succs)[(1)] : ( *((entry_bb))->succs)[(0)])->dest == ((*((cont_bb))-> succs)[(0)]->flags & EDGE_FALLTHRU ? (*((cont_bb))-> succs)[(0)] : (*((cont_bb))->succs)[(1)])->dest) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3938, __FUNCTION__), 0 : 0)) |
3938 | || BRANCH_EDGE (entry_bb)->dest == FALLTHRU_EDGE (cont_bb)->dest)((void)(!(broken_loop || ((*((entry_bb))->succs)[(0)]-> flags & EDGE_FALLTHRU ? (*((entry_bb))->succs)[(1)] : ( *((entry_bb))->succs)[(0)])->dest == ((*((cont_bb))-> succs)[(0)]->flags & EDGE_FALLTHRU ? (*((cont_bb))-> succs)[(0)] : (*((cont_bb))->succs)[(1)])->dest) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3938, __FUNCTION__), 0 : 0)); |
3939 | l0_bb = split_edge (FALLTHRU_EDGE (entry_bb)((*((entry_bb))->succs)[(0)]->flags & EDGE_FALLTHRU ? (*((entry_bb))->succs)[(0)] : (*((entry_bb))->succs) [(1)])); |
3940 | l1_bb = single_succ (l0_bb); |
3941 | if (!broken_loop) |
3942 | { |
3943 | l2_bb = create_empty_bb (cont_bb); |
3944 | gcc_assert (BRANCH_EDGE (cont_bb)->dest == l1_bb((void)(!(((*((cont_bb))->succs)[(0)]->flags & EDGE_FALLTHRU ? (*((cont_bb))->succs)[(1)] : (*((cont_bb))->succs)[( 0)])->dest == l1_bb || (single_succ_edge (((*((cont_bb))-> succs)[(0)]->flags & EDGE_FALLTHRU ? (*((cont_bb))-> succs)[(1)] : (*((cont_bb))->succs)[(0)])->dest)->dest == l1_bb)) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3946, __FUNCTION__), 0 : 0)) |
3945 | || (single_succ_edge (BRANCH_EDGE (cont_bb)->dest)->dest((void)(!(((*((cont_bb))->succs)[(0)]->flags & EDGE_FALLTHRU ? (*((cont_bb))->succs)[(1)] : (*((cont_bb))->succs)[( 0)])->dest == l1_bb || (single_succ_edge (((*((cont_bb))-> succs)[(0)]->flags & EDGE_FALLTHRU ? (*((cont_bb))-> succs)[(1)] : (*((cont_bb))->succs)[(0)])->dest)->dest == l1_bb)) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3946, __FUNCTION__), 0 : 0)) |
3946 | == l1_bb))((void)(!(((*((cont_bb))->succs)[(0)]->flags & EDGE_FALLTHRU ? (*((cont_bb))->succs)[(1)] : (*((cont_bb))->succs)[( 0)])->dest == l1_bb || (single_succ_edge (((*((cont_bb))-> succs)[(0)]->flags & EDGE_FALLTHRU ? (*((cont_bb))-> succs)[(1)] : (*((cont_bb))->succs)[(0)])->dest)->dest == l1_bb)) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3946, __FUNCTION__), 0 : 0)); |
3947 | gcc_assert (EDGE_COUNT (cont_bb->succs) == 2)((void)(!(vec_safe_length (cont_bb->succs) == 2) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3947, __FUNCTION__), 0 : 0)); |
3948 | } |
3949 | else |
3950 | l2_bb = NULLnullptr; |
3951 | l3_bb = BRANCH_EDGE (entry_bb)((*((entry_bb))->succs)[(0)]->flags & EDGE_FALLTHRU ? (*((entry_bb))->succs)[(1)] : (*((entry_bb))->succs) [(0)])->dest; |
3952 | exit_bb = region->exit; |
3953 | |
3954 | gsi = gsi_last_nondebug_bb (entry_bb); |
3955 | |
3956 | gcc_assert (gimple_code (gsi_stmt (gsi)) == GIMPLE_OMP_FOR)((void)(!(gimple_code (gsi_stmt (gsi)) == GIMPLE_OMP_FOR) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3956, __FUNCTION__), 0 : 0)); |
3957 | if (fd->ordered |
3958 | && omp_find_clause (gimple_omp_for_clauses (fd->for_stmt), |
3959 | OMP_CLAUSE_LASTPRIVATE)) |
3960 | ordered_lastprivate = false; |
3961 | tree reductions = NULL_TREE(tree) nullptr; |
3962 | tree mem = NULL_TREE(tree) nullptr, cond_var = NULL_TREE(tree) nullptr, condtemp = NULL_TREE(tree) nullptr; |
3963 | tree memv = NULL_TREE(tree) nullptr; |
3964 | if (fd->lastprivate_conditional) |
3965 | { |
3966 | tree c = omp_find_clause (gimple_omp_for_clauses (fd->for_stmt), |
3967 | OMP_CLAUSE__CONDTEMP_); |
3968 | if (fd->have_pointer_condtemp) |
3969 | condtemp = OMP_CLAUSE_DECL (c)(*(omp_clause_elt_check (((omp_clause_range_check (((tree_check ((c), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3969, __FUNCTION__, (OMP_CLAUSE)))), (OMP_CLAUSE_PRIVATE), ( OMP_CLAUSE__SCANTEMP_), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3969, __FUNCTION__))), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3969, __FUNCTION__))); |
3970 | c = omp_find_clause (OMP_CLAUSE_CHAIN (c)((contains_struct_check (((tree_check ((c), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3970, __FUNCTION__, (OMP_CLAUSE)))), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3970, __FUNCTION__))->common.chain), OMP_CLAUSE__CONDTEMP_); |
3971 | cond_var = OMP_CLAUSE_DECL (c)(*(omp_clause_elt_check (((omp_clause_range_check (((tree_check ((c), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3971, __FUNCTION__, (OMP_CLAUSE)))), (OMP_CLAUSE_PRIVATE), ( OMP_CLAUSE__SCANTEMP_), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3971, __FUNCTION__))), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3971, __FUNCTION__))); |
3972 | } |
3973 | if (sched_arg) |
3974 | { |
3975 | if (fd->have_reductemp) |
3976 | { |
3977 | tree c = omp_find_clause (gimple_omp_for_clauses (fd->for_stmt), |
3978 | OMP_CLAUSE__REDUCTEMP_); |
3979 | reductions = OMP_CLAUSE_DECL (c)(*(omp_clause_elt_check (((omp_clause_range_check (((tree_check ((c), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3979, __FUNCTION__, (OMP_CLAUSE)))), (OMP_CLAUSE_PRIVATE), ( OMP_CLAUSE__SCANTEMP_), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3979, __FUNCTION__))), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3979, __FUNCTION__))); |
3980 | gcc_assert (TREE_CODE (reductions) == SSA_NAME)((void)(!(((enum tree_code) (reductions)->base.code) == SSA_NAME ) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3980, __FUNCTION__), 0 : 0)); |
3981 | gimple *g = SSA_NAME_DEF_STMT (reductions)(tree_check ((reductions), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3981, __FUNCTION__, (SSA_NAME)))->ssa_name.def_stmt; |
3982 | reductions = gimple_assign_rhs1 (g); |
3983 | OMP_CLAUSE_DECL (c)(*(omp_clause_elt_check (((omp_clause_range_check (((tree_check ((c), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3983, __FUNCTION__, (OMP_CLAUSE)))), (OMP_CLAUSE_PRIVATE), ( OMP_CLAUSE__SCANTEMP_), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3983, __FUNCTION__))), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3983, __FUNCTION__))) = reductions; |
3984 | entry_bb = gimple_bb (g); |
3985 | edge e = split_block (entry_bb, g); |
3986 | if (region->entry == entry_bb) |
3987 | region->entry = e->dest; |
3988 | gsi = gsi_last_bb (entry_bb); |
3989 | } |
3990 | else |
3991 | reductions = null_pointer_nodeglobal_trees[TI_NULL_POINTER]; |
3992 | if (fd->have_pointer_condtemp) |
3993 | { |
3994 | tree type = TREE_TYPE (condtemp)((contains_struct_check ((condtemp), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3994, __FUNCTION__))->typed.type); |
3995 | memv = create_tmp_var (type); |
3996 | TREE_ADDRESSABLE (memv)((memv)->base.addressable_flag) = 1; |
3997 | unsigned HOST_WIDE_INTlong sz |
3998 | = tree_to_uhwi (TYPE_SIZE_UNIT (TREE_TYPE (type))((tree_class_check ((((contains_struct_check ((type), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3998, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 3998, __FUNCTION__))->type_common.size_unit)); |
3999 | sz *= fd->lastprivate_conditional; |
4000 | expand_omp_build_assign (&gsi, memv, build_int_cst (type, sz), |
4001 | false); |
4002 | mem = build_fold_addr_expr (memv)build_fold_addr_expr_loc (((location_t) 0), (memv)); |
4003 | } |
4004 | else |
4005 | mem = null_pointer_nodeglobal_trees[TI_NULL_POINTER]; |
4006 | } |
4007 | if (fd->collapse > 1 || fd->ordered) |
4008 | { |
4009 | int first_zero_iter1 = -1, first_zero_iter2 = -1; |
4010 | basic_block zero_iter1_bb = NULLnullptr, zero_iter2_bb = NULLnullptr, l2_dom_bb = NULLnullptr; |
4011 | |
4012 | counts = XALLOCAVEC (tree, fd->ordered((tree *) __builtin_alloca(sizeof (tree) * (fd->ordered ? fd ->ordered + 2 + (fd->ordered - fd->collapse) : fd-> collapse))) |
4013 | ? fd->ordered + 2((tree *) __builtin_alloca(sizeof (tree) * (fd->ordered ? fd ->ordered + 2 + (fd->ordered - fd->collapse) : fd-> collapse))) |
4014 | + (fd->ordered - fd->collapse)((tree *) __builtin_alloca(sizeof (tree) * (fd->ordered ? fd ->ordered + 2 + (fd->ordered - fd->collapse) : fd-> collapse))) |
4015 | : fd->collapse)((tree *) __builtin_alloca(sizeof (tree) * (fd->ordered ? fd ->ordered + 2 + (fd->ordered - fd->collapse) : fd-> collapse))); |
4016 | expand_omp_for_init_counts (fd, &gsi, entry_bb, counts, |
4017 | zero_iter1_bb, first_zero_iter1, |
4018 | zero_iter2_bb, first_zero_iter2, l2_dom_bb); |
4019 | |
4020 | if (zero_iter1_bb) |
4021 | { |
4022 | /* Some counts[i] vars might be uninitialized if |
4023 | some loop has zero iterations. But the body shouldn't |
4024 | be executed in that case, so just avoid uninit warnings. */ |
4025 | for (i = first_zero_iter1; |
4026 | i < (fd->ordered ? fd->ordered : fd->collapse); i++) |
4027 | if (SSA_VAR_P (counts[i])(((enum tree_code) (counts[i])->base.code) == VAR_DECL || ( (enum tree_code) (counts[i])->base.code) == PARM_DECL || ( (enum tree_code) (counts[i])->base.code) == RESULT_DECL || ((enum tree_code) (counts[i])->base.code) == SSA_NAME)) |
4028 | suppress_warning (counts[i], OPT_Wuninitialized); |
4029 | gsi_prev (&gsi); |
4030 | e = split_block (entry_bb, gsi_stmt (gsi)); |
4031 | entry_bb = e->dest; |
4032 | make_edge (zero_iter1_bb, entry_bb, EDGE_FALLTHRU); |
4033 | gsi = gsi_last_nondebug_bb (entry_bb); |
4034 | set_immediate_dominator (CDI_DOMINATORS, entry_bb, |
4035 | get_immediate_dominator (CDI_DOMINATORS, |
4036 | zero_iter1_bb)); |
4037 | } |
4038 | if (zero_iter2_bb) |
4039 | { |
4040 | /* Some counts[i] vars might be uninitialized if |
4041 | some loop has zero iterations. But the body shouldn't |
4042 | be executed in that case, so just avoid uninit warnings. */ |
4043 | for (i = first_zero_iter2; i < fd->ordered; i++) |
4044 | if (SSA_VAR_P (counts[i])(((enum tree_code) (counts[i])->base.code) == VAR_DECL || ( (enum tree_code) (counts[i])->base.code) == PARM_DECL || ( (enum tree_code) (counts[i])->base.code) == RESULT_DECL || ((enum tree_code) (counts[i])->base.code) == SSA_NAME)) |
4045 | suppress_warning (counts[i], OPT_Wuninitialized); |
4046 | if (zero_iter1_bb) |
4047 | make_edge (zero_iter2_bb, entry_bb, EDGE_FALLTHRU); |
4048 | else |
4049 | { |
4050 | gsi_prev (&gsi); |
4051 | e = split_block (entry_bb, gsi_stmt (gsi)); |
4052 | entry_bb = e->dest; |
4053 | make_edge (zero_iter2_bb, entry_bb, EDGE_FALLTHRU); |
4054 | gsi = gsi_last_nondebug_bb (entry_bb); |
4055 | set_immediate_dominator (CDI_DOMINATORS, entry_bb, |
4056 | get_immediate_dominator |
4057 | (CDI_DOMINATORS, zero_iter2_bb)); |
4058 | } |
4059 | } |
4060 | if (fd->collapse == 1) |
4061 | { |
4062 | counts[0] = fd->loop.n2; |
4063 | fd->loop = fd->loops[0]; |
4064 | } |
4065 | } |
4066 | |
4067 | type = TREE_TYPE (fd->loop.v)((contains_struct_check ((fd->loop.v), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4067, __FUNCTION__))->typed.type); |
4068 | istart0 = create_tmp_var (fd->iter_type, ".istart0"); |
4069 | iend0 = create_tmp_var (fd->iter_type, ".iend0"); |
4070 | TREE_ADDRESSABLE (istart0)((istart0)->base.addressable_flag) = 1; |
4071 | TREE_ADDRESSABLE (iend0)((iend0)->base.addressable_flag) = 1; |
4072 | |
4073 | /* See if we need to bias by LLONG_MIN. */ |
4074 | if (fd->iter_type == long_long_unsigned_type_nodeinteger_types[itk_unsigned_long_long] |
4075 | && TREE_CODE (type)((enum tree_code) (type)->base.code) == INTEGER_TYPE |
4076 | && !TYPE_UNSIGNED (type)((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4076, __FUNCTION__))->base.u.bits.unsigned_flag) |
4077 | && fd->ordered == 0) |
4078 | { |
4079 | tree n1, n2; |
4080 | |
4081 | if (fd->loop.cond_code == LT_EXPR) |
4082 | { |
4083 | n1 = fd->loop.n1; |
4084 | n2 = fold_build2 (PLUS_EXPR, type, fd->loop.n2, fd->loop.step)fold_build2_loc (((location_t) 0), PLUS_EXPR, type, fd->loop .n2, fd->loop.step ); |
4085 | } |
4086 | else |
4087 | { |
4088 | n1 = fold_build2 (MINUS_EXPR, type, fd->loop.n2, fd->loop.step)fold_build2_loc (((location_t) 0), MINUS_EXPR, type, fd->loop .n2, fd->loop.step ); |
4089 | n2 = fd->loop.n1; |
4090 | } |
4091 | if (TREE_CODE (n1)((enum tree_code) (n1)->base.code) != INTEGER_CST |
4092 | || TREE_CODE (n2)((enum tree_code) (n2)->base.code) != INTEGER_CST |
4093 | || ((tree_int_cst_sgn (n1) < 0) ^ (tree_int_cst_sgn (n2) < 0))) |
4094 | bias = fold_convert (fd->iter_type, TYPE_MIN_VALUE (type))fold_convert_loc (((location_t) 0), fd->iter_type, ((tree_check5 ((type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4094, __FUNCTION__, (INTEGER_TYPE), (ENUMERAL_TYPE), (BOOLEAN_TYPE ), (REAL_TYPE), (FIXED_POINT_TYPE)))->type_non_common.minval )); |
4095 | } |
4096 | |
4097 | gimple_stmt_iterator gsif = gsi; |
4098 | gsi_prev (&gsif); |
4099 | |
4100 | tree arr = NULL_TREE(tree) nullptr; |
4101 | if (in_combined_parallel) |
4102 | { |
4103 | gcc_assert (fd->ordered == 0)((void)(!(fd->ordered == 0) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4103, __FUNCTION__), 0 : 0)); |
4104 | /* In a combined parallel loop, emit a call to |
4105 | GOMP_loop_foo_next. */ |
4106 | t = build_call_expr (builtin_decl_explicit (next_fn), 2, |
4107 | build_fold_addr_expr (istart0)build_fold_addr_expr_loc (((location_t) 0), (istart0)), |
4108 | build_fold_addr_expr (iend0)build_fold_addr_expr_loc (((location_t) 0), (iend0))); |
4109 | } |
4110 | else |
4111 | { |
4112 | tree t0, t1, t2, t3, t4; |
4113 | /* If this is not a combined parallel loop, emit a call to |
4114 | GOMP_loop_foo_start in ENTRY_BB. */ |
4115 | t4 = build_fold_addr_expr (iend0)build_fold_addr_expr_loc (((location_t) 0), (iend0)); |
4116 | t3 = build_fold_addr_expr (istart0)build_fold_addr_expr_loc (((location_t) 0), (istart0)); |
4117 | if (fd->ordered) |
4118 | { |
4119 | t0 = build_int_cst (unsigned_type_nodeinteger_types[itk_unsigned_int], |
4120 | fd->ordered - fd->collapse + 1); |
4121 | arr = create_tmp_var (build_array_type_nelts (fd->iter_type, |
4122 | fd->ordered |
4123 | - fd->collapse + 1), |
4124 | ".omp_counts"); |
4125 | DECL_NAMELESS (arr)((contains_struct_check ((arr), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4125, __FUNCTION__))->base.u.bits.nameless_flag) = 1; |
4126 | TREE_ADDRESSABLE (arr)((arr)->base.addressable_flag) = 1; |
4127 | TREE_STATIC (arr)((arr)->base.static_flag) = 1; |
4128 | vec<constructor_elt, va_gc> *v; |
4129 | vec_alloc (v, fd->ordered - fd->collapse + 1); |
4130 | int idx; |
4131 | |
4132 | for (idx = 0; idx < fd->ordered - fd->collapse + 1; idx++) |
4133 | { |
4134 | tree c; |
4135 | if (idx == 0 && fd->collapse > 1) |
4136 | c = fd->loop.n2; |
4137 | else |
4138 | c = counts[idx + fd->collapse - 1]; |
4139 | tree purpose = size_int (idx)size_int_kind (idx, stk_sizetype); |
4140 | CONSTRUCTOR_APPEND_ELT (v, purpose, c)do { constructor_elt _ce___ = {purpose, c}; vec_safe_push ((v ), _ce___); } while (0); |
4141 | if (TREE_CODE (c)((enum tree_code) (c)->base.code) != INTEGER_CST) |
4142 | TREE_STATIC (arr)((arr)->base.static_flag) = 0; |
4143 | } |
4144 | |
4145 | DECL_INITIAL (arr)((contains_struct_check ((arr), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4145, __FUNCTION__))->decl_common.initial) = build_constructor (TREE_TYPE (arr)((contains_struct_check ((arr), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4145, __FUNCTION__))->typed.type), v); |
4146 | if (!TREE_STATIC (arr)((arr)->base.static_flag)) |
4147 | force_gimple_operand_gsi (&gsi, build1 (DECL_EXPR, |
4148 | void_type_nodeglobal_trees[TI_VOID_TYPE], arr), |
4149 | true, NULL_TREE(tree) nullptr, true, GSI_SAME_STMT); |
4150 | t1 = build_fold_addr_expr (arr)build_fold_addr_expr_loc (((location_t) 0), (arr)); |
4151 | t2 = NULL_TREE(tree) nullptr; |
4152 | } |
4153 | else |
4154 | { |
4155 | t2 = fold_convert (fd->iter_type, fd->loop.step)fold_convert_loc (((location_t) 0), fd->iter_type, fd-> loop.step); |
4156 | t1 = fd->loop.n2; |
4157 | t0 = fd->loop.n1; |
4158 | if (gimple_omp_for_combined_into_p (fd->for_stmt)) |
4159 | { |
4160 | tree innerc |
4161 | = omp_find_clause (gimple_omp_for_clauses (fd->for_stmt), |
4162 | OMP_CLAUSE__LOOPTEMP_); |
4163 | gcc_assert (innerc)((void)(!(innerc) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4163, __FUNCTION__), 0 : 0)); |
4164 | t0 = OMP_CLAUSE_DECL (innerc)(*(omp_clause_elt_check (((omp_clause_range_check (((tree_check ((innerc), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4164, __FUNCTION__, (OMP_CLAUSE)))), (OMP_CLAUSE_PRIVATE), ( OMP_CLAUSE__SCANTEMP_), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4164, __FUNCTION__))), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4164, __FUNCTION__))); |
4165 | innerc = omp_find_clause (OMP_CLAUSE_CHAIN (innerc)((contains_struct_check (((tree_check ((innerc), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4165, __FUNCTION__, (OMP_CLAUSE)))), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4165, __FUNCTION__))->common.chain), |
4166 | OMP_CLAUSE__LOOPTEMP_); |
4167 | gcc_assert (innerc)((void)(!(innerc) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4167, __FUNCTION__), 0 : 0)); |
4168 | t1 = OMP_CLAUSE_DECL (innerc)(*(omp_clause_elt_check (((omp_clause_range_check (((tree_check ((innerc), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4168, __FUNCTION__, (OMP_CLAUSE)))), (OMP_CLAUSE_PRIVATE), ( OMP_CLAUSE__SCANTEMP_), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4168, __FUNCTION__))), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4168, __FUNCTION__))); |
4169 | } |
4170 | if (POINTER_TYPE_P (TREE_TYPE (t0))(((enum tree_code) (((contains_struct_check ((t0), (TS_TYPED) , "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4170, __FUNCTION__))->typed.type))->base.code) == POINTER_TYPE || ((enum tree_code) (((contains_struct_check ((t0), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4170, __FUNCTION__))->typed.type))->base.code) == REFERENCE_TYPE ) |
4171 | && TYPE_PRECISION (TREE_TYPE (t0))((tree_class_check ((((contains_struct_check ((t0), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4171, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4171, __FUNCTION__))->type_common.precision) |
4172 | != TYPE_PRECISION (fd->iter_type)((tree_class_check ((fd->iter_type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4172, __FUNCTION__))->type_common.precision)) |
4173 | { |
4174 | /* Avoid casting pointers to integer of a different size. */ |
4175 | tree itype = signed_type_for (type); |
4176 | t1 = fold_convert (fd->iter_type, fold_convert (itype, t1))fold_convert_loc (((location_t) 0), fd->iter_type, fold_convert_loc (((location_t) 0), itype, t1)); |
4177 | t0 = fold_convert (fd->iter_type, fold_convert (itype, t0))fold_convert_loc (((location_t) 0), fd->iter_type, fold_convert_loc (((location_t) 0), itype, t0)); |
4178 | } |
4179 | else |
4180 | { |
4181 | t1 = fold_convert (fd->iter_type, t1)fold_convert_loc (((location_t) 0), fd->iter_type, t1); |
4182 | t0 = fold_convert (fd->iter_type, t0)fold_convert_loc (((location_t) 0), fd->iter_type, t0); |
4183 | } |
4184 | if (bias) |
4185 | { |
4186 | t1 = fold_build2 (PLUS_EXPR, fd->iter_type, t1, bias)fold_build2_loc (((location_t) 0), PLUS_EXPR, fd->iter_type , t1, bias ); |
4187 | t0 = fold_build2 (PLUS_EXPR, fd->iter_type, t0, bias)fold_build2_loc (((location_t) 0), PLUS_EXPR, fd->iter_type , t0, bias ); |
4188 | } |
4189 | } |
4190 | if (fd->iter_type == long_integer_type_nodeinteger_types[itk_long] || fd->ordered) |
4191 | { |
4192 | if (fd->chunk_size) |
4193 | { |
4194 | t = fold_convert (fd->iter_type, fd->chunk_size)fold_convert_loc (((location_t) 0), fd->iter_type, fd-> chunk_size); |
4195 | t = omp_adjust_chunk_size (t, fd->simd_schedule); |
4196 | if (sched_arg) |
4197 | { |
4198 | if (fd->ordered) |
4199 | t = build_call_expr (builtin_decl_explicit (start_fn), |
4200 | 8, t0, t1, sched_arg, t, t3, t4, |
4201 | reductions, mem); |
4202 | else |
4203 | t = build_call_expr (builtin_decl_explicit (start_fn), |
4204 | 9, t0, t1, t2, sched_arg, t, t3, t4, |
4205 | reductions, mem); |
4206 | } |
4207 | else if (fd->ordered) |
4208 | t = build_call_expr (builtin_decl_explicit (start_fn), |
4209 | 5, t0, t1, t, t3, t4); |
4210 | else |
4211 | t = build_call_expr (builtin_decl_explicit (start_fn), |
4212 | 6, t0, t1, t2, t, t3, t4); |
4213 | } |
4214 | else if (fd->ordered) |
4215 | t = build_call_expr (builtin_decl_explicit (start_fn), |
4216 | 4, t0, t1, t3, t4); |
4217 | else |
4218 | t = build_call_expr (builtin_decl_explicit (start_fn), |
4219 | 5, t0, t1, t2, t3, t4); |
4220 | } |
4221 | else |
4222 | { |
4223 | tree t5; |
4224 | tree c_bool_type; |
4225 | tree bfn_decl; |
4226 | |
4227 | /* The GOMP_loop_ull_*start functions have additional boolean |
4228 | argument, true for < loops and false for > loops. |
4229 | In Fortran, the C bool type can be different from |
4230 | boolean_type_node. */ |
4231 | bfn_decl = builtin_decl_explicit (start_fn); |
4232 | c_bool_type = TREE_TYPE (TREE_TYPE (bfn_decl))((contains_struct_check ((((contains_struct_check ((bfn_decl) , (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4232, __FUNCTION__))->typed.type)), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4232, __FUNCTION__))->typed.type); |
4233 | t5 = build_int_cst (c_bool_type, |
4234 | fd->loop.cond_code == LT_EXPR ? 1 : 0); |
4235 | if (fd->chunk_size) |
4236 | { |
4237 | tree bfn_decl = builtin_decl_explicit (start_fn); |
4238 | t = fold_convert (fd->iter_type, fd->chunk_size)fold_convert_loc (((location_t) 0), fd->iter_type, fd-> chunk_size); |
4239 | t = omp_adjust_chunk_size (t, fd->simd_schedule); |
4240 | if (sched_arg) |
4241 | t = build_call_expr (bfn_decl, 10, t5, t0, t1, t2, sched_arg, |
4242 | t, t3, t4, reductions, mem); |
4243 | else |
4244 | t = build_call_expr (bfn_decl, 7, t5, t0, t1, t2, t, t3, t4); |
4245 | } |
4246 | else |
4247 | t = build_call_expr (builtin_decl_explicit (start_fn), |
4248 | 6, t5, t0, t1, t2, t3, t4); |
4249 | } |
4250 | } |
4251 | if (TREE_TYPE (t)((contains_struct_check ((t), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4251, __FUNCTION__))->typed.type) != boolean_type_nodeglobal_trees[TI_BOOLEAN_TYPE]) |
4252 | t = fold_build2 (NE_EXPR, boolean_type_node,fold_build2_loc (((location_t) 0), NE_EXPR, global_trees[TI_BOOLEAN_TYPE ], t, build_int_cst (((contains_struct_check ((t), (TS_TYPED) , "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4253, __FUNCTION__))->typed.type), 0) ) |
4253 | t, build_int_cst (TREE_TYPE (t), 0))fold_build2_loc (((location_t) 0), NE_EXPR, global_trees[TI_BOOLEAN_TYPE ], t, build_int_cst (((contains_struct_check ((t), (TS_TYPED) , "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4253, __FUNCTION__))->typed.type), 0) ); |
4254 | t = force_gimple_operand_gsi (&gsi, t, true, NULL_TREE(tree) nullptr, |
4255 | true, GSI_SAME_STMT); |
4256 | if (arr && !TREE_STATIC (arr)((arr)->base.static_flag)) |
4257 | { |
4258 | tree clobber = build_clobber (TREE_TYPE (arr)((contains_struct_check ((arr), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4258, __FUNCTION__))->typed.type)); |
4259 | gsi_insert_before (&gsi, gimple_build_assign (arr, clobber), |
4260 | GSI_SAME_STMT); |
4261 | } |
4262 | if (fd->have_pointer_condtemp) |
4263 | expand_omp_build_assign (&gsi, condtemp, memv, false); |
4264 | if (fd->have_reductemp) |
4265 | { |
4266 | gimple *g = gsi_stmt (gsi); |
4267 | gsi_remove (&gsi, true); |
4268 | release_ssa_name (gimple_assign_lhs (g)); |
4269 | |
4270 | entry_bb = region->entry; |
4271 | gsi = gsi_last_nondebug_bb (entry_bb); |
4272 | |
4273 | gcc_assert (gimple_code (gsi_stmt (gsi)) == GIMPLE_OMP_FOR)((void)(!(gimple_code (gsi_stmt (gsi)) == GIMPLE_OMP_FOR) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4273, __FUNCTION__), 0 : 0)); |
4274 | } |
4275 | gsi_insert_after (&gsi, gimple_build_cond_empty (t), GSI_SAME_STMT); |
4276 | |
4277 | /* Remove the GIMPLE_OMP_FOR statement. */ |
4278 | gsi_remove (&gsi, true); |
4279 | |
4280 | if (gsi_end_p (gsif)) |
4281 | gsif = gsi_after_labels (gsi_bb (gsif)); |
4282 | gsi_next (&gsif); |
4283 | |
4284 | /* Iteration setup for sequential loop goes in L0_BB. */ |
4285 | tree startvar = fd->loop.v; |
4286 | tree endvar = NULL_TREE(tree) nullptr; |
4287 | |
4288 | if (gimple_omp_for_combined_p (fd->for_stmt)) |
4289 | { |
4290 | gcc_assert (gimple_code (inner_stmt) == GIMPLE_OMP_FOR((void)(!(gimple_code (inner_stmt) == GIMPLE_OMP_FOR && gimple_omp_for_kind (inner_stmt) == GF_OMP_FOR_KIND_SIMD) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4292, __FUNCTION__), 0 : 0)) |
4291 | && gimple_omp_for_kind (inner_stmt)((void)(!(gimple_code (inner_stmt) == GIMPLE_OMP_FOR && gimple_omp_for_kind (inner_stmt) == GF_OMP_FOR_KIND_SIMD) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4292, __FUNCTION__), 0 : 0)) |
4292 | == GF_OMP_FOR_KIND_SIMD)((void)(!(gimple_code (inner_stmt) == GIMPLE_OMP_FOR && gimple_omp_for_kind (inner_stmt) == GF_OMP_FOR_KIND_SIMD) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4292, __FUNCTION__), 0 : 0)); |
4293 | tree innerc = omp_find_clause (gimple_omp_for_clauses (inner_stmt), |
4294 | OMP_CLAUSE__LOOPTEMP_); |
4295 | gcc_assert (innerc)((void)(!(innerc) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4295, __FUNCTION__), 0 : 0)); |
4296 | startvar = OMP_CLAUSE_DECL (innerc)(*(omp_clause_elt_check (((omp_clause_range_check (((tree_check ((innerc), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4296, __FUNCTION__, (OMP_CLAUSE)))), (OMP_CLAUSE_PRIVATE), ( OMP_CLAUSE__SCANTEMP_), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4296, __FUNCTION__))), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4296, __FUNCTION__))); |
4297 | innerc = omp_find_clause (OMP_CLAUSE_CHAIN (innerc)((contains_struct_check (((tree_check ((innerc), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4297, __FUNCTION__, (OMP_CLAUSE)))), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4297, __FUNCTION__))->common.chain), |
4298 | OMP_CLAUSE__LOOPTEMP_); |
4299 | gcc_assert (innerc)((void)(!(innerc) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4299, __FUNCTION__), 0 : 0)); |
4300 | endvar = OMP_CLAUSE_DECL (innerc)(*(omp_clause_elt_check (((omp_clause_range_check (((tree_check ((innerc), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4300, __FUNCTION__, (OMP_CLAUSE)))), (OMP_CLAUSE_PRIVATE), ( OMP_CLAUSE__SCANTEMP_), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4300, __FUNCTION__))), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4300, __FUNCTION__))); |
4301 | } |
4302 | |
4303 | gsi = gsi_start_bb (l0_bb); |
4304 | t = istart0; |
4305 | if (fd->ordered && fd->collapse == 1) |
4306 | t = fold_build2 (MULT_EXPR, fd->iter_type, t,fold_build2_loc (((location_t) 0), MULT_EXPR, fd->iter_type , t, fold_convert_loc (((location_t) 0), fd->iter_type, fd ->loop.step) ) |
4307 | fold_convert (fd->iter_type, fd->loop.step))fold_build2_loc (((location_t) 0), MULT_EXPR, fd->iter_type , t, fold_convert_loc (((location_t) 0), fd->iter_type, fd ->loop.step) ); |
4308 | else if (bias) |
4309 | t = fold_build2 (MINUS_EXPR, fd->iter_type, t, bias)fold_build2_loc (((location_t) 0), MINUS_EXPR, fd->iter_type , t, bias ); |
4310 | if (fd->ordered && fd->collapse == 1) |
4311 | { |
4312 | if (POINTER_TYPE_P (TREE_TYPE (startvar))(((enum tree_code) (((contains_struct_check ((startvar), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4312, __FUNCTION__))->typed.type))->base.code) == POINTER_TYPE || ((enum tree_code) (((contains_struct_check ((startvar), ( TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4312, __FUNCTION__))->typed.type))->base.code) == REFERENCE_TYPE )) |
4313 | t = fold_build2 (POINTER_PLUS_EXPR, TREE_TYPE (startvar),fold_build2_loc (((location_t) 0), POINTER_PLUS_EXPR, ((contains_struct_check ((startvar), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4313, __FUNCTION__))->typed.type), fd->loop.n1, fold_convert_loc (((location_t) 0), sizetype_tab[(int) stk_sizetype], t) ) |
4314 | fd->loop.n1, fold_convert (sizetype, t))fold_build2_loc (((location_t) 0), POINTER_PLUS_EXPR, ((contains_struct_check ((startvar), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4313, __FUNCTION__))->typed.type), fd->loop.n1, fold_convert_loc (((location_t) 0), sizetype_tab[(int) stk_sizetype], t) ); |
4315 | else |
4316 | { |
4317 | t = fold_convert (TREE_TYPE (startvar), t)fold_convert_loc (((location_t) 0), ((contains_struct_check ( (startvar), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4317, __FUNCTION__))->typed.type), t); |
4318 | t = fold_build2 (PLUS_EXPR, TREE_TYPE (startvar),fold_build2_loc (((location_t) 0), PLUS_EXPR, ((contains_struct_check ((startvar), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4318, __FUNCTION__))->typed.type), fd->loop.n1, t ) |
4319 | fd->loop.n1, t)fold_build2_loc (((location_t) 0), PLUS_EXPR, ((contains_struct_check ((startvar), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4318, __FUNCTION__))->typed.type), fd->loop.n1, t ); |
4320 | } |
4321 | } |
4322 | else |
4323 | { |
4324 | if (POINTER_TYPE_P (TREE_TYPE (startvar))(((enum tree_code) (((contains_struct_check ((startvar), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4324, __FUNCTION__))->typed.type))->base.code) == POINTER_TYPE || ((enum tree_code) (((contains_struct_check ((startvar), ( TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4324, __FUNCTION__))->typed.type))->base.code) == REFERENCE_TYPE )) |
4325 | t = fold_convert (signed_type_for (TREE_TYPE (startvar)), t)fold_convert_loc (((location_t) 0), signed_type_for (((contains_struct_check ((startvar), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4325, __FUNCTION__))->typed.type)), t); |
4326 | t = fold_convert (TREE_TYPE (startvar), t)fold_convert_loc (((location_t) 0), ((contains_struct_check ( (startvar), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4326, __FUNCTION__))->typed.type), t); |
4327 | } |
4328 | t = force_gimple_operand_gsi (&gsi, t, |
4329 | DECL_P (startvar)(tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code ) (startvar)->base.code))] == tcc_declaration) |
4330 | && TREE_ADDRESSABLE (startvar)((startvar)->base.addressable_flag), |
4331 | NULL_TREE(tree) nullptr, false, GSI_CONTINUE_LINKING); |
4332 | assign_stmt = gimple_build_assign (startvar, t); |
4333 | gsi_insert_after (&gsi, assign_stmt, GSI_CONTINUE_LINKING); |
4334 | if (cond_var) |
4335 | { |
4336 | tree itype = TREE_TYPE (cond_var)((contains_struct_check ((cond_var), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4336, __FUNCTION__))->typed.type); |
4337 | /* For lastprivate(conditional:) itervar, we need some iteration |
4338 | counter that starts at unsigned non-zero and increases. |
4339 | Prefer as few IVs as possible, so if we can use startvar |
4340 | itself, use that, or startvar + constant (those would be |
4341 | incremented with step), and as last resort use the s0 + 1 |
4342 | incremented by 1. */ |
4343 | if ((fd->ordered && fd->collapse == 1) |
4344 | || bias |
4345 | || POINTER_TYPE_P (type)(((enum tree_code) (type)->base.code) == POINTER_TYPE || ( (enum tree_code) (type)->base.code) == REFERENCE_TYPE) |
4346 | || TREE_CODE (fd->loop.n1)((enum tree_code) (fd->loop.n1)->base.code) != INTEGER_CST |
4347 | || fd->loop.cond_code != LT_EXPR) |
4348 | t = fold_build2 (PLUS_EXPR, itype, fold_convert (itype, istart0),fold_build2_loc (((location_t) 0), PLUS_EXPR, itype, fold_convert_loc (((location_t) 0), itype, istart0), build_int_cst (itype, 1) ) |
4349 | build_int_cst (itype, 1))fold_build2_loc (((location_t) 0), PLUS_EXPR, itype, fold_convert_loc (((location_t) 0), itype, istart0), build_int_cst (itype, 1) ); |
4350 | else if (tree_int_cst_sgn (fd->loop.n1) == 1) |
4351 | t = fold_convert (itype, t)fold_convert_loc (((location_t) 0), itype, t); |
4352 | else |
4353 | { |
4354 | tree c = fold_convert (itype, fd->loop.n1)fold_convert_loc (((location_t) 0), itype, fd->loop.n1); |
4355 | c = fold_build2 (MINUS_EXPR, itype, build_int_cst (itype, 1), c)fold_build2_loc (((location_t) 0), MINUS_EXPR, itype, build_int_cst (itype, 1), c ); |
4356 | t = fold_build2 (PLUS_EXPR, itype, fold_convert (itype, t), c)fold_build2_loc (((location_t) 0), PLUS_EXPR, itype, fold_convert_loc (((location_t) 0), itype, t), c ); |
4357 | } |
4358 | t = force_gimple_operand_gsi (&gsi, t, false, |
4359 | NULL_TREE(tree) nullptr, false, GSI_CONTINUE_LINKING); |
4360 | assign_stmt = gimple_build_assign (cond_var, t); |
4361 | gsi_insert_after (&gsi, assign_stmt, GSI_CONTINUE_LINKING); |
4362 | } |
4363 | |
4364 | t = iend0; |
4365 | if (fd->ordered && fd->collapse == 1) |
4366 | t = fold_build2 (MULT_EXPR, fd->iter_type, t,fold_build2_loc (((location_t) 0), MULT_EXPR, fd->iter_type , t, fold_convert_loc (((location_t) 0), fd->iter_type, fd ->loop.step) ) |
4367 | fold_convert (fd->iter_type, fd->loop.step))fold_build2_loc (((location_t) 0), MULT_EXPR, fd->iter_type , t, fold_convert_loc (((location_t) 0), fd->iter_type, fd ->loop.step) ); |
4368 | else if (bias) |
4369 | t = fold_build2 (MINUS_EXPR, fd->iter_type, t, bias)fold_build2_loc (((location_t) 0), MINUS_EXPR, fd->iter_type , t, bias ); |
4370 | if (fd->ordered && fd->collapse == 1) |
4371 | { |
4372 | if (POINTER_TYPE_P (TREE_TYPE (startvar))(((enum tree_code) (((contains_struct_check ((startvar), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4372, __FUNCTION__))->typed.type))->base.code) == POINTER_TYPE || ((enum tree_code) (((contains_struct_check ((startvar), ( TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4372, __FUNCTION__))->typed.type))->base.code) == REFERENCE_TYPE )) |
4373 | t = fold_build2 (POINTER_PLUS_EXPR, TREE_TYPE (startvar),fold_build2_loc (((location_t) 0), POINTER_PLUS_EXPR, ((contains_struct_check ((startvar), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4373, __FUNCTION__))->typed.type), fd->loop.n1, fold_convert_loc (((location_t) 0), sizetype_tab[(int) stk_sizetype], t) ) |
4374 | fd->loop.n1, fold_convert (sizetype, t))fold_build2_loc (((location_t) 0), POINTER_PLUS_EXPR, ((contains_struct_check ((startvar), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4373, __FUNCTION__))->typed.type), fd->loop.n1, fold_convert_loc (((location_t) 0), sizetype_tab[(int) stk_sizetype], t) ); |
4375 | else |
4376 | { |
4377 | t = fold_convert (TREE_TYPE (startvar), t)fold_convert_loc (((location_t) 0), ((contains_struct_check ( (startvar), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4377, __FUNCTION__))->typed.type), t); |
4378 | t = fold_build2 (PLUS_EXPR, TREE_TYPE (startvar),fold_build2_loc (((location_t) 0), PLUS_EXPR, ((contains_struct_check ((startvar), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4378, __FUNCTION__))->typed.type), fd->loop.n1, t ) |
4379 | fd->loop.n1, t)fold_build2_loc (((location_t) 0), PLUS_EXPR, ((contains_struct_check ((startvar), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4378, __FUNCTION__))->typed.type), fd->loop.n1, t ); |
4380 | } |
4381 | } |
4382 | else |
4383 | { |
4384 | if (POINTER_TYPE_P (TREE_TYPE (startvar))(((enum tree_code) (((contains_struct_check ((startvar), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4384, __FUNCTION__))->typed.type))->base.code) == POINTER_TYPE || ((enum tree_code) (((contains_struct_check ((startvar), ( TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4384, __FUNCTION__))->typed.type))->base.code) == REFERENCE_TYPE )) |
4385 | t = fold_convert (signed_type_for (TREE_TYPE (startvar)), t)fold_convert_loc (((location_t) 0), signed_type_for (((contains_struct_check ((startvar), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4385, __FUNCTION__))->typed.type)), t); |
4386 | t = fold_convert (TREE_TYPE (startvar), t)fold_convert_loc (((location_t) 0), ((contains_struct_check ( (startvar), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4386, __FUNCTION__))->typed.type), t); |
4387 | } |
4388 | iend = force_gimple_operand_gsi (&gsi, t, true, NULL_TREE(tree) nullptr, |
4389 | false, GSI_CONTINUE_LINKING); |
4390 | if (endvar) |
4391 | { |
4392 | assign_stmt = gimple_build_assign (endvar, iend); |
4393 | gsi_insert_after (&gsi, assign_stmt, GSI_CONTINUE_LINKING); |
4394 | if (useless_type_conversion_p (TREE_TYPE (fd->loop.v)((contains_struct_check ((fd->loop.v), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4394, __FUNCTION__))->typed.type), TREE_TYPE (iend)((contains_struct_check ((iend), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4394, __FUNCTION__))->typed.type))) |
4395 | assign_stmt = gimple_build_assign (fd->loop.v, iend); |
4396 | else |
4397 | assign_stmt = gimple_build_assign (fd->loop.v, NOP_EXPR, iend); |
4398 | gsi_insert_after (&gsi, assign_stmt, GSI_CONTINUE_LINKING); |
4399 | } |
4400 | /* Handle linear clause adjustments. */ |
4401 | tree itercnt = NULL_TREE(tree) nullptr; |
4402 | if (gimple_omp_for_kind (fd->for_stmt) == GF_OMP_FOR_KIND_FOR) |
4403 | for (tree c = gimple_omp_for_clauses (fd->for_stmt); |
4404 | c; c = OMP_CLAUSE_CHAIN (c)((contains_struct_check (((tree_check ((c), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4404, __FUNCTION__, (OMP_CLAUSE)))), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4404, __FUNCTION__))->common.chain)) |
4405 | if (OMP_CLAUSE_CODE (c)((tree_check ((c), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4405, __FUNCTION__, (OMP_CLAUSE))))->omp_clause.code == OMP_CLAUSE_LINEAR |
4406 | && !OMP_CLAUSE_LINEAR_NO_COPYIN (c)((omp_clause_subcode_check ((c), (OMP_CLAUSE_LINEAR), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4406, __FUNCTION__))->base.public_flag)) |
4407 | { |
4408 | tree d = OMP_CLAUSE_DECL (c)(*(omp_clause_elt_check (((omp_clause_range_check (((tree_check ((c), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4408, __FUNCTION__, (OMP_CLAUSE)))), (OMP_CLAUSE_PRIVATE), ( OMP_CLAUSE__SCANTEMP_), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4408, __FUNCTION__))), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4408, __FUNCTION__))); |
4409 | tree t = d, a, dest; |
4410 | if (omp_privatize_by_reference (t)) |
4411 | t = build_simple_mem_ref_loc (OMP_CLAUSE_LOCATION (c)((tree_check ((c), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4411, __FUNCTION__, (OMP_CLAUSE))))->omp_clause.locus, t); |
4412 | tree type = TREE_TYPE (t)((contains_struct_check ((t), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4412, __FUNCTION__))->typed.type); |
4413 | if (POINTER_TYPE_P (type)(((enum tree_code) (type)->base.code) == POINTER_TYPE || ( (enum tree_code) (type)->base.code) == REFERENCE_TYPE)) |
4414 | type = sizetypesizetype_tab[(int) stk_sizetype]; |
4415 | dest = unshare_expr (t); |
4416 | tree v = create_tmp_var (TREE_TYPE (t)((contains_struct_check ((t), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4416, __FUNCTION__))->typed.type), NULLnullptr); |
4417 | expand_omp_build_assign (&gsif, v, t); |
4418 | if (itercnt == NULL_TREE(tree) nullptr) |
4419 | { |
4420 | itercnt = startvar; |
4421 | tree n1 = fd->loop.n1; |
4422 | if (POINTER_TYPE_P (TREE_TYPE (itercnt))(((enum tree_code) (((contains_struct_check ((itercnt), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4422, __FUNCTION__))->typed.type))->base.code) == POINTER_TYPE || ((enum tree_code) (((contains_struct_check ((itercnt), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4422, __FUNCTION__))->typed.type))->base.code) == REFERENCE_TYPE )) |
4423 | { |
4424 | itercnt |
4425 | = fold_convert (signed_type_for (TREE_TYPE (itercnt)),fold_convert_loc (((location_t) 0), signed_type_for (((contains_struct_check ((itercnt), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4425, __FUNCTION__))->typed.type)), itercnt) |
4426 | itercnt)fold_convert_loc (((location_t) 0), signed_type_for (((contains_struct_check ((itercnt), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4425, __FUNCTION__))->typed.type)), itercnt); |
4427 | n1 = fold_convert (TREE_TYPE (itercnt), n1)fold_convert_loc (((location_t) 0), ((contains_struct_check ( (itercnt), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4427, __FUNCTION__))->typed.type), n1); |
4428 | } |
4429 | itercnt = fold_build2 (MINUS_EXPR, TREE_TYPE (itercnt),fold_build2_loc (((location_t) 0), MINUS_EXPR, ((contains_struct_check ((itercnt), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4429, __FUNCTION__))->typed.type), itercnt, n1 ) |
4430 | itercnt, n1)fold_build2_loc (((location_t) 0), MINUS_EXPR, ((contains_struct_check ((itercnt), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4429, __FUNCTION__))->typed.type), itercnt, n1 ); |
4431 | itercnt = fold_build2 (EXACT_DIV_EXPR, TREE_TYPE (itercnt),fold_build2_loc (((location_t) 0), EXACT_DIV_EXPR, ((contains_struct_check ((itercnt), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4431, __FUNCTION__))->typed.type), itercnt, fd->loop. step ) |
4432 | itercnt, fd->loop.step)fold_build2_loc (((location_t) 0), EXACT_DIV_EXPR, ((contains_struct_check ((itercnt), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4431, __FUNCTION__))->typed.type), itercnt, fd->loop. step ); |
4433 | itercnt = force_gimple_operand_gsi (&gsi, itercnt, true, |
4434 | NULL_TREE(tree) nullptr, false, |
4435 | GSI_CONTINUE_LINKING); |
4436 | } |
4437 | a = fold_build2 (MULT_EXPR, type,fold_build2_loc (((location_t) 0), MULT_EXPR, type, fold_convert_loc (((location_t) 0), type, itercnt), fold_convert_loc (((location_t ) 0), type, (*(omp_clause_elt_check (((omp_clause_subcode_check ((c), (OMP_CLAUSE_LINEAR), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4439, __FUNCTION__))), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4439, __FUNCTION__)))) ) |
4438 | fold_convert (type, itercnt),fold_build2_loc (((location_t) 0), MULT_EXPR, type, fold_convert_loc (((location_t) 0), type, itercnt), fold_convert_loc (((location_t ) 0), type, (*(omp_clause_elt_check (((omp_clause_subcode_check ((c), (OMP_CLAUSE_LINEAR), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4439, __FUNCTION__))), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4439, __FUNCTION__)))) ) |
4439 | fold_convert (type, OMP_CLAUSE_LINEAR_STEP (c)))fold_build2_loc (((location_t) 0), MULT_EXPR, type, fold_convert_loc (((location_t) 0), type, itercnt), fold_convert_loc (((location_t ) 0), type, (*(omp_clause_elt_check (((omp_clause_subcode_check ((c), (OMP_CLAUSE_LINEAR), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4439, __FUNCTION__))), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4439, __FUNCTION__)))) ); |
4440 | t = fold_build2 (type == TREE_TYPE (t) ? PLUS_EXPRfold_build2_loc (((location_t) 0), type == ((contains_struct_check ((t), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4440, __FUNCTION__))->typed.type) ? PLUS_EXPR : POINTER_PLUS_EXPR , ((contains_struct_check ((t), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4441, __FUNCTION__))->typed.type), v, a ) |
4441 | : POINTER_PLUS_EXPR, TREE_TYPE (t), v, a)fold_build2_loc (((location_t) 0), type == ((contains_struct_check ((t), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4440, __FUNCTION__))->typed.type) ? PLUS_EXPR : POINTER_PLUS_EXPR , ((contains_struct_check ((t), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4441, __FUNCTION__))->typed.type), v, a ); |
4442 | t = force_gimple_operand_gsi (&gsi, t, true, NULL_TREE(tree) nullptr, |
4443 | false, GSI_CONTINUE_LINKING); |
4444 | expand_omp_build_assign (&gsi, dest, t, true); |
4445 | } |
4446 | if (fd->collapse > 1) |
4447 | expand_omp_for_init_vars (fd, &gsi, counts, NULLnullptr, inner_stmt, startvar); |
4448 | |
4449 | if (fd->ordered) |
4450 | { |
4451 | /* Until now, counts array contained number of iterations or |
4452 | variable containing it for ith loop. From now on, we usually need |
4453 | those counts only for collapsed loops, and only for the 2nd |
4454 | till the last collapsed one. Move those one element earlier, |
4455 | we'll use counts[fd->collapse - 1] for the first source/sink |
4456 | iteration counter and so on and counts[fd->ordered] |
4457 | as the array holding the current counter values for |
4458 | depend(source). For doacross(sink:omp_cur_iteration - 1) we need |
4459 | the counts from fd->collapse to fd->ordered - 1; make a copy of |
4460 | those to counts[fd->ordered + 2] and onwards. |
4461 | counts[fd->ordered + 1] can be a flag whether it is the first |
4462 | iteration with a new collapsed counter (used only if |
4463 | fd->ordered > fd->collapse). */ |
4464 | if (fd->ordered > fd->collapse) |
4465 | memcpy (counts + fd->ordered + 2, counts + fd->collapse, |
4466 | (fd->ordered - fd->collapse) * sizeof (counts[0])); |
4467 | if (fd->collapse > 1) |
4468 | memmove (counts, counts + 1, (fd->collapse - 1) * sizeof (counts[0])); |
4469 | if (broken_loop) |
4470 | { |
4471 | int i; |
4472 | for (i = fd->collapse; i < fd->ordered; i++) |
4473 | { |
4474 | tree type = TREE_TYPE (fd->loops[i].v)((contains_struct_check ((fd->loops[i].v), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4474, __FUNCTION__))->typed.type); |
4475 | tree this_cond |
4476 | = fold_build2 (fd->loops[i].cond_code, boolean_type_node,fold_build2_loc (((location_t) 0), fd->loops[i].cond_code, global_trees[TI_BOOLEAN_TYPE], fold_convert_loc (((location_t ) 0), type, fd->loops[i].n1), fold_convert_loc (((location_t ) 0), type, fd->loops[i].n2) ) |
4477 | fold_convert (type, fd->loops[i].n1),fold_build2_loc (((location_t) 0), fd->loops[i].cond_code, global_trees[TI_BOOLEAN_TYPE], fold_convert_loc (((location_t ) 0), type, fd->loops[i].n1), fold_convert_loc (((location_t ) 0), type, fd->loops[i].n2) ) |
4478 | fold_convert (type, fd->loops[i].n2))fold_build2_loc (((location_t) 0), fd->loops[i].cond_code, global_trees[TI_BOOLEAN_TYPE], fold_convert_loc (((location_t ) 0), type, fd->loops[i].n1), fold_convert_loc (((location_t ) 0), type, fd->loops[i].n2) ); |
4479 | if (!integer_onep (this_cond)) |
4480 | break; |
4481 | } |
4482 | if (i < fd->ordered) |
4483 | { |
4484 | if (entry_bb->loop_father != l0_bb->loop_father) |
4485 | { |
4486 | remove_bb_from_loops (l0_bb); |
4487 | add_bb_to_loop (l0_bb, entry_bb->loop_father); |
4488 | gcc_assert (single_succ (l0_bb) == l1_bb)((void)(!(single_succ (l0_bb) == l1_bb) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4488, __FUNCTION__), 0 : 0)); |
4489 | } |
4490 | cont_bb |
4491 | = create_empty_bb (EXIT_BLOCK_PTR_FOR_FN (cfun)(((cfun + 0))->cfg->x_exit_block_ptr)->prev_bb); |
4492 | add_bb_to_loop (cont_bb, l0_bb->loop_father); |
4493 | gimple_stmt_iterator gsi = gsi_after_labels (cont_bb); |
4494 | gimple *g = gimple_build_omp_continue (fd->loop.v, fd->loop.v); |
4495 | gsi_insert_before (&gsi, g, GSI_SAME_STMT); |
4496 | make_edge (cont_bb, l3_bb, EDGE_FALLTHRU); |
4497 | make_edge (cont_bb, l1_bb, 0); |
4498 | l2_bb = create_empty_bb (cont_bb); |
4499 | broken_loop = false; |
4500 | } |
4501 | } |
4502 | expand_omp_ordered_source_sink (region, fd, counts, cont_bb); |
4503 | cont_bb = expand_omp_for_ordered_loops (fd, counts, cont_bb, l1_bb, |
4504 | l0_bb, ordered_lastprivate); |
4505 | if (counts[fd->collapse - 1]) |
4506 | { |
4507 | gcc_assert (fd->collapse == 1)((void)(!(fd->collapse == 1) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4507, __FUNCTION__), 0 : 0)); |
4508 | gsi = gsi_last_bb (l0_bb); |
4509 | expand_omp_build_assign (&gsi, counts[fd->collapse - 1], |
4510 | istart0, true); |
4511 | if (cont_bb) |
4512 | { |
4513 | gsi = gsi_last_bb (cont_bb); |
4514 | t = fold_build2 (PLUS_EXPR, fd->iter_type,fold_build2_loc (((location_t) 0), PLUS_EXPR, fd->iter_type , counts[fd->collapse - 1], build_int_cst (fd->iter_type , 1) ) |
4515 | counts[fd->collapse - 1],fold_build2_loc (((location_t) 0), PLUS_EXPR, fd->iter_type , counts[fd->collapse - 1], build_int_cst (fd->iter_type , 1) ) |
4516 | build_int_cst (fd->iter_type, 1))fold_build2_loc (((location_t) 0), PLUS_EXPR, fd->iter_type , counts[fd->collapse - 1], build_int_cst (fd->iter_type , 1) ); |
4517 | expand_omp_build_assign (&gsi, counts[fd->collapse - 1], t); |
4518 | tree aref = build4 (ARRAY_REF, fd->iter_type, |
4519 | counts[fd->ordered], size_zero_nodeglobal_trees[TI_SIZE_ZERO], |
4520 | NULL_TREE(tree) nullptr, NULL_TREE(tree) nullptr); |
4521 | expand_omp_build_assign (&gsi, aref, counts[fd->collapse - 1]); |
4522 | } |
4523 | t = counts[fd->collapse - 1]; |
4524 | } |
4525 | else if (fd->collapse > 1) |
4526 | t = fd->loop.v; |
4527 | else |
4528 | { |
4529 | t = fold_build2 (MINUS_EXPR, TREE_TYPE (fd->loops[0].v),fold_build2_loc (((location_t) 0), MINUS_EXPR, ((contains_struct_check ((fd->loops[0].v), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4529, __FUNCTION__))->typed.type), fd->loops[0].v, fd ->loops[0].n1 ) |
4530 | fd->loops[0].v, fd->loops[0].n1)fold_build2_loc (((location_t) 0), MINUS_EXPR, ((contains_struct_check ((fd->loops[0].v), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4529, __FUNCTION__))->typed.type), fd->loops[0].v, fd ->loops[0].n1 ); |
4531 | t = fold_convert (fd->iter_type, t)fold_convert_loc (((location_t) 0), fd->iter_type, t); |
4532 | } |
4533 | gsi = gsi_last_bb (l0_bb); |
4534 | tree aref = build4 (ARRAY_REF, fd->iter_type, counts[fd->ordered], |
4535 | size_zero_nodeglobal_trees[TI_SIZE_ZERO], NULL_TREE(tree) nullptr, NULL_TREE(tree) nullptr); |
4536 | t = force_gimple_operand_gsi (&gsi, t, true, NULL_TREE(tree) nullptr, |
4537 | false, GSI_CONTINUE_LINKING); |
4538 | expand_omp_build_assign (&gsi, aref, t, true); |
4539 | } |
4540 | |
4541 | if (!broken_loop) |
4542 | { |
4543 | /* Code to control the increment and predicate for the sequential |
4544 | loop goes in the CONT_BB. */ |
4545 | gsi = gsi_last_nondebug_bb (cont_bb); |
4546 | gomp_continue *cont_stmt = as_a <gomp_continue *> (gsi_stmt (gsi)); |
4547 | gcc_assert (gimple_code (cont_stmt) == GIMPLE_OMP_CONTINUE)((void)(!(gimple_code (cont_stmt) == GIMPLE_OMP_CONTINUE) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4547, __FUNCTION__), 0 : 0)); |
4548 | vmain = gimple_omp_continue_control_use (cont_stmt); |
4549 | vback = gimple_omp_continue_control_def (cont_stmt); |
4550 | |
4551 | if (cond_var) |
4552 | { |
4553 | tree itype = TREE_TYPE (cond_var)((contains_struct_check ((cond_var), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4553, __FUNCTION__))->typed.type); |
4554 | tree t2; |
4555 | if ((fd->ordered && fd->collapse == 1) |
4556 | || bias |
4557 | || POINTER_TYPE_P (type)(((enum tree_code) (type)->base.code) == POINTER_TYPE || ( (enum tree_code) (type)->base.code) == REFERENCE_TYPE) |
4558 | || TREE_CODE (fd->loop.n1)((enum tree_code) (fd->loop.n1)->base.code) != INTEGER_CST |
4559 | || fd->loop.cond_code != LT_EXPR) |
4560 | t2 = build_int_cst (itype, 1); |
4561 | else |
4562 | t2 = fold_convert (itype, fd->loop.step)fold_convert_loc (((location_t) 0), itype, fd->loop.step); |
4563 | t2 = fold_build2 (PLUS_EXPR, itype, cond_var, t2)fold_build2_loc (((location_t) 0), PLUS_EXPR, itype, cond_var , t2 ); |
4564 | t2 = force_gimple_operand_gsi (&gsi, t2, false, |
4565 | NULL_TREE(tree) nullptr, true, GSI_SAME_STMT); |
4566 | assign_stmt = gimple_build_assign (cond_var, t2); |
4567 | gsi_insert_before (&gsi, assign_stmt, GSI_SAME_STMT); |
4568 | } |
4569 | |
4570 | if (!gimple_omp_for_combined_p (fd->for_stmt)) |
4571 | { |
4572 | if (POINTER_TYPE_P (type)(((enum tree_code) (type)->base.code) == POINTER_TYPE || ( (enum tree_code) (type)->base.code) == REFERENCE_TYPE)) |
4573 | t = fold_build_pointer_plus (vmain, fd->loop.step)fold_build_pointer_plus_loc (((location_t) 0), vmain, fd-> loop.step); |
4574 | else |
4575 | t = fold_build2 (PLUS_EXPR, type, vmain, fd->loop.step)fold_build2_loc (((location_t) 0), PLUS_EXPR, type, vmain, fd ->loop.step ); |
4576 | t = force_gimple_operand_gsi (&gsi, t, |
4577 | DECL_P (vback)(tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code ) (vback)->base.code))] == tcc_declaration) |
4578 | && TREE_ADDRESSABLE (vback)((vback)->base.addressable_flag), |
4579 | NULL_TREE(tree) nullptr, true, GSI_SAME_STMT); |
4580 | assign_stmt = gimple_build_assign (vback, t); |
4581 | gsi_insert_before (&gsi, assign_stmt, GSI_SAME_STMT); |
4582 | |
4583 | if (fd->ordered && counts[fd->collapse - 1] == NULL_TREE(tree) nullptr) |
4584 | { |
4585 | tree tem; |
4586 | if (fd->collapse > 1) |
4587 | tem = fd->loop.v; |
4588 | else |
4589 | { |
4590 | tem = fold_build2 (MINUS_EXPR, TREE_TYPE (fd->loops[0].v),fold_build2_loc (((location_t) 0), MINUS_EXPR, ((contains_struct_check ((fd->loops[0].v), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4590, __FUNCTION__))->typed.type), fd->loops[0].v, fd ->loops[0].n1 ) |
4591 | fd->loops[0].v, fd->loops[0].n1)fold_build2_loc (((location_t) 0), MINUS_EXPR, ((contains_struct_check ((fd->loops[0].v), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4590, __FUNCTION__))->typed.type), fd->loops[0].v, fd ->loops[0].n1 ); |
4592 | tem = fold_convert (fd->iter_type, tem)fold_convert_loc (((location_t) 0), fd->iter_type, tem); |
4593 | } |
4594 | tree aref = build4 (ARRAY_REF, fd->iter_type, |
4595 | counts[fd->ordered], size_zero_nodeglobal_trees[TI_SIZE_ZERO], |
4596 | NULL_TREE(tree) nullptr, NULL_TREE(tree) nullptr); |
4597 | tem = force_gimple_operand_gsi (&gsi, tem, true, NULL_TREE(tree) nullptr, |
4598 | true, GSI_SAME_STMT); |
4599 | expand_omp_build_assign (&gsi, aref, tem); |
4600 | } |
4601 | |
4602 | t = build2 (fd->loop.cond_code, boolean_type_nodeglobal_trees[TI_BOOLEAN_TYPE], |
4603 | DECL_P (vback)(tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code ) (vback)->base.code))] == tcc_declaration) && TREE_ADDRESSABLE (vback)((vback)->base.addressable_flag) ? t : vback, |
4604 | iend); |
4605 | gcond *cond_stmt = gimple_build_cond_empty (t); |
4606 | gsi_insert_before (&gsi, cond_stmt, GSI_SAME_STMT); |
4607 | } |
4608 | |
4609 | /* Remove GIMPLE_OMP_CONTINUE. */ |
4610 | gsi_remove (&gsi, true); |
4611 | |
4612 | if (fd->collapse > 1 && !gimple_omp_for_combined_p (fd->for_stmt)) |
4613 | collapse_bb = extract_omp_for_update_vars (fd, NULLnullptr, cont_bb, l1_bb); |
4614 | |
4615 | /* Emit code to get the next parallel iteration in L2_BB. */ |
4616 | gsi = gsi_start_bb (l2_bb); |
4617 | |
4618 | t = build_call_expr (builtin_decl_explicit (next_fn), 2, |
4619 | build_fold_addr_expr (istart0)build_fold_addr_expr_loc (((location_t) 0), (istart0)), |
4620 | build_fold_addr_expr (iend0)build_fold_addr_expr_loc (((location_t) 0), (iend0))); |
4621 | t = force_gimple_operand_gsi (&gsi, t, true, NULL_TREE(tree) nullptr, |
4622 | false, GSI_CONTINUE_LINKING); |
4623 | if (TREE_TYPE (t)((contains_struct_check ((t), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4623, __FUNCTION__))->typed.type) != boolean_type_nodeglobal_trees[TI_BOOLEAN_TYPE]) |
4624 | t = fold_build2 (NE_EXPR, boolean_type_node,fold_build2_loc (((location_t) 0), NE_EXPR, global_trees[TI_BOOLEAN_TYPE ], t, build_int_cst (((contains_struct_check ((t), (TS_TYPED) , "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4625, __FUNCTION__))->typed.type), 0) ) |
4625 | t, build_int_cst (TREE_TYPE (t), 0))fold_build2_loc (((location_t) 0), NE_EXPR, global_trees[TI_BOOLEAN_TYPE ], t, build_int_cst (((contains_struct_check ((t), (TS_TYPED) , "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4625, __FUNCTION__))->typed.type), 0) ); |
4626 | gcond *cond_stmt = gimple_build_cond_empty (t); |
4627 | gsi_insert_after (&gsi, cond_stmt, GSI_CONTINUE_LINKING); |
4628 | } |
4629 | |
4630 | /* Add the loop cleanup function. */ |
4631 | gsi = gsi_last_nondebug_bb (exit_bb); |
4632 | if (gimple_omp_return_nowait_p (gsi_stmt (gsi))) |
4633 | t = builtin_decl_explicit (BUILT_IN_GOMP_LOOP_END_NOWAIT); |
4634 | else if (gimple_omp_return_lhs (gsi_stmt (gsi))) |
4635 | t = builtin_decl_explicit (BUILT_IN_GOMP_LOOP_END_CANCEL); |
4636 | else |
4637 | t = builtin_decl_explicit (BUILT_IN_GOMP_LOOP_END); |
4638 | gcall *call_stmt = gimple_build_call (t, 0); |
4639 | if (fd->ordered) |
4640 | { |
4641 | tree arr = counts[fd->ordered]; |
4642 | tree clobber = build_clobber (TREE_TYPE (arr)((contains_struct_check ((arr), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4642, __FUNCTION__))->typed.type)); |
4643 | gsi_insert_after (&gsi, gimple_build_assign (arr, clobber), |
4644 | GSI_SAME_STMT); |
4645 | } |
4646 | if (gimple_omp_return_lhs (gsi_stmt (gsi))) |
4647 | { |
4648 | gimple_call_set_lhs (call_stmt, gimple_omp_return_lhs (gsi_stmt (gsi))); |
4649 | if (fd->have_reductemp) |
4650 | { |
4651 | gimple *g = gimple_build_assign (reductions, NOP_EXPR, |
4652 | gimple_call_lhs (call_stmt)); |
4653 | gsi_insert_after (&gsi, g, GSI_SAME_STMT); |
4654 | } |
4655 | } |
4656 | gsi_insert_after (&gsi, call_stmt, GSI_SAME_STMT); |
4657 | gsi_remove (&gsi, true); |
4658 | |
4659 | /* Connect the new blocks. */ |
4660 | find_edge (entry_bb, l0_bb)->flags = EDGE_TRUE_VALUE; |
4661 | find_edge (entry_bb, l3_bb)->flags = EDGE_FALSE_VALUE; |
4662 | |
4663 | if (!broken_loop) |
4664 | { |
4665 | gimple_seq phis; |
4666 | |
4667 | e = find_edge (cont_bb, l3_bb); |
4668 | ne = make_edge (l2_bb, l3_bb, EDGE_FALSE_VALUE); |
4669 | |
4670 | phis = phi_nodes (l3_bb); |
4671 | for (gsi = gsi_start (phis); !gsi_end_p (gsi); gsi_next (&gsi)) |
4672 | { |
4673 | gimple *phi = gsi_stmt (gsi); |
4674 | SET_USE (PHI_ARG_DEF_PTR_FROM_EDGE (phi, ne),set_ssa_use_from_ptr (gimple_phi_arg_imm_use_ptr (((phi)), (( ne)->dest_idx)), gimple_phi_arg_def (((phi)), ((e)->dest_idx ))) |
4675 | PHI_ARG_DEF_FROM_EDGE (phi, e))set_ssa_use_from_ptr (gimple_phi_arg_imm_use_ptr (((phi)), (( ne)->dest_idx)), gimple_phi_arg_def (((phi)), ((e)->dest_idx ))); |
4676 | } |
4677 | remove_edge (e); |
4678 | |
4679 | make_edge (cont_bb, l2_bb, EDGE_FALSE_VALUE); |
4680 | e = find_edge (cont_bb, l1_bb); |
4681 | if (e == NULLnullptr) |
4682 | { |
4683 | e = BRANCH_EDGE (cont_bb)((*((cont_bb))->succs)[(0)]->flags & EDGE_FALLTHRU ? (*((cont_bb))->succs)[(1)] : (*((cont_bb))->succs)[(0) ]); |
4684 | gcc_assert (single_succ (e->dest) == l1_bb)((void)(!(single_succ (e->dest) == l1_bb) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4684, __FUNCTION__), 0 : 0)); |
4685 | } |
4686 | if (gimple_omp_for_combined_p (fd->for_stmt)) |
4687 | { |
4688 | remove_edge (e); |
4689 | e = NULLnullptr; |
4690 | } |
4691 | else if (fd->collapse > 1) |
4692 | { |
4693 | remove_edge (e); |
4694 | e = make_edge (cont_bb, collapse_bb, EDGE_TRUE_VALUE); |
4695 | } |
4696 | else |
4697 | e->flags = EDGE_TRUE_VALUE; |
4698 | if (e) |
4699 | { |
4700 | e->probability = profile_probability::guessed_always ().apply_scale (7, 8); |
4701 | find_edge (cont_bb, l2_bb)->probability = e->probability.invert (); |
4702 | } |
4703 | else |
4704 | { |
4705 | e = find_edge (cont_bb, l2_bb); |
4706 | e->flags = EDGE_FALLTHRU; |
4707 | } |
4708 | make_edge (l2_bb, l0_bb, EDGE_TRUE_VALUE); |
4709 | |
4710 | if (gimple_in_ssa_p (cfun(cfun + 0))) |
4711 | { |
4712 | /* Add phis to the outer loop that connect to the phis in the inner, |
4713 | original loop, and move the loop entry value of the inner phi to |
4714 | the loop entry value of the outer phi. */ |
4715 | gphi_iterator psi; |
4716 | for (psi = gsi_start_phis (l3_bb); !gsi_end_p (psi); gsi_next (&psi)) |
4717 | { |
4718 | location_t locus; |
4719 | gphi *nphi; |
4720 | gphi *exit_phi = psi.phi (); |
4721 | |
4722 | if (virtual_operand_p (gimple_phi_result (exit_phi))) |
4723 | continue; |
4724 | |
4725 | edge l2_to_l3 = find_edge (l2_bb, l3_bb); |
4726 | tree exit_res = PHI_ARG_DEF_FROM_EDGE (exit_phi, l2_to_l3)gimple_phi_arg_def (((exit_phi)), ((l2_to_l3)->dest_idx)); |
4727 | |
4728 | basic_block latch = BRANCH_EDGE (cont_bb)((*((cont_bb))->succs)[(0)]->flags & EDGE_FALLTHRU ? (*((cont_bb))->succs)[(1)] : (*((cont_bb))->succs)[(0) ])->dest; |
4729 | edge latch_to_l1 = find_edge (latch, l1_bb); |
4730 | gphi *inner_phi |
4731 | = find_phi_with_arg_on_edge (exit_res, latch_to_l1); |
4732 | |
4733 | tree t = gimple_phi_result (exit_phi); |
4734 | tree new_res = copy_ssa_name (t, NULLnullptr); |
4735 | nphi = create_phi_node (new_res, l0_bb); |
4736 | |
4737 | edge l0_to_l1 = find_edge (l0_bb, l1_bb); |
4738 | t = PHI_ARG_DEF_FROM_EDGE (inner_phi, l0_to_l1)gimple_phi_arg_def (((inner_phi)), ((l0_to_l1)->dest_idx)); |
4739 | locus = gimple_phi_arg_location_from_edge (inner_phi, l0_to_l1); |
4740 | edge entry_to_l0 = find_edge (entry_bb, l0_bb); |
4741 | add_phi_arg (nphi, t, entry_to_l0, locus); |
4742 | |
4743 | edge l2_to_l0 = find_edge (l2_bb, l0_bb); |
4744 | add_phi_arg (nphi, exit_res, l2_to_l0, UNKNOWN_LOCATION((location_t) 0)); |
4745 | |
4746 | add_phi_arg (inner_phi, new_res, l0_to_l1, UNKNOWN_LOCATION((location_t) 0)); |
4747 | } |
4748 | } |
4749 | |
4750 | set_immediate_dominator (CDI_DOMINATORS, l2_bb, |
4751 | recompute_dominator (CDI_DOMINATORS, l2_bb)); |
4752 | set_immediate_dominator (CDI_DOMINATORS, l3_bb, |
4753 | recompute_dominator (CDI_DOMINATORS, l3_bb)); |
4754 | set_immediate_dominator (CDI_DOMINATORS, l0_bb, |
4755 | recompute_dominator (CDI_DOMINATORS, l0_bb)); |
4756 | set_immediate_dominator (CDI_DOMINATORS, l1_bb, |
4757 | recompute_dominator (CDI_DOMINATORS, l1_bb)); |
4758 | |
4759 | /* We enter expand_omp_for_generic with a loop. This original loop may |
4760 | have its own loop struct, or it may be part of an outer loop struct |
4761 | (which may be the fake loop). */ |
4762 | class loop *outer_loop = entry_bb->loop_father; |
4763 | bool orig_loop_has_loop_struct = l1_bb->loop_father != outer_loop; |
4764 | |
4765 | add_bb_to_loop (l2_bb, outer_loop); |
4766 | |
4767 | /* We've added a new loop around the original loop. Allocate the |
4768 | corresponding loop struct. */ |
4769 | class loop *new_loop = alloc_loop (); |
4770 | new_loop->header = l0_bb; |
4771 | new_loop->latch = l2_bb; |
4772 | add_loop (new_loop, outer_loop); |
4773 | |
4774 | /* Allocate a loop structure for the original loop unless we already |
4775 | had one. */ |
4776 | if (!orig_loop_has_loop_struct |
4777 | && !gimple_omp_for_combined_p (fd->for_stmt)) |
4778 | { |
4779 | class loop *orig_loop = alloc_loop (); |
4780 | orig_loop->header = l1_bb; |
4781 | /* The loop may have multiple latches. */ |
4782 | add_loop (orig_loop, new_loop); |
4783 | } |
4784 | } |
4785 | } |
4786 | |
4787 | /* Helper function for expand_omp_for_static_nochunk. If PTR is NULL, |
4788 | compute needed allocation size. If !ALLOC of team allocations, |
4789 | if ALLOC of thread allocation. SZ is the initial needed size for |
4790 | other purposes, ALLOC_ALIGN guaranteed alignment of allocation in bytes, |
4791 | CNT number of elements of each array, for !ALLOC this is |
4792 | omp_get_num_threads (), for ALLOC number of iterations handled by the |
4793 | current thread. If PTR is non-NULL, it is the start of the allocation |
4794 | and this routine shall assign to OMP_CLAUSE_DECL (c) of those _scantemp_ |
4795 | clauses pointers to the corresponding arrays. */ |
4796 | |
4797 | static tree |
4798 | expand_omp_scantemp_alloc (tree clauses, tree ptr, unsigned HOST_WIDE_INTlong sz, |
4799 | unsigned HOST_WIDE_INTlong alloc_align, tree cnt, |
4800 | gimple_stmt_iterator *gsi, bool alloc) |
4801 | { |
4802 | tree eltsz = NULL_TREE(tree) nullptr; |
4803 | unsigned HOST_WIDE_INTlong preval = 0; |
4804 | if (ptr && sz) |
4805 | ptr = fold_build2 (POINTER_PLUS_EXPR, TREE_TYPE (ptr),fold_build2_loc (((location_t) 0), POINTER_PLUS_EXPR, ((contains_struct_check ((ptr), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4805, __FUNCTION__))->typed.type), ptr, size_int_kind (sz , stk_sizetype) ) |
4806 | ptr, size_int (sz))fold_build2_loc (((location_t) 0), POINTER_PLUS_EXPR, ((contains_struct_check ((ptr), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4805, __FUNCTION__))->typed.type), ptr, size_int_kind (sz , stk_sizetype) ); |
4807 | for (tree c = clauses; c; c = OMP_CLAUSE_CHAIN (c)((contains_struct_check (((tree_check ((c), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4807, __FUNCTION__, (OMP_CLAUSE)))), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4807, __FUNCTION__))->common.chain)) |
4808 | if (OMP_CLAUSE_CODE (c)((tree_check ((c), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4808, __FUNCTION__, (OMP_CLAUSE))))->omp_clause.code == OMP_CLAUSE__SCANTEMP_ |
4809 | && !OMP_CLAUSE__SCANTEMP__CONTROL (c)(((omp_clause_subcode_check ((c), (OMP_CLAUSE__SCANTEMP_), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4809, __FUNCTION__)))->base.private_flag) |
4810 | && (!OMP_CLAUSE__SCANTEMP__ALLOC (c)((omp_clause_subcode_check ((c), (OMP_CLAUSE__SCANTEMP_), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4810, __FUNCTION__))->base.public_flag)) != alloc) |
4811 | { |
4812 | tree pointee_type = TREE_TYPE (TREE_TYPE (OMP_CLAUSE_DECL (c)))((contains_struct_check ((((contains_struct_check (((*(omp_clause_elt_check (((omp_clause_range_check (((tree_check ((c), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4812, __FUNCTION__, (OMP_CLAUSE)))), (OMP_CLAUSE_PRIVATE), ( OMP_CLAUSE__SCANTEMP_), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4812, __FUNCTION__))), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4812, __FUNCTION__)))), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4812, __FUNCTION__))->typed.type)), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4812, __FUNCTION__))->typed.type); |
4813 | unsigned HOST_WIDE_INTlong al = TYPE_ALIGN_UNIT (pointee_type)((((tree_class_check ((pointee_type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4813, __FUNCTION__))->type_common.align) ? ((unsigned)1) << (((tree_class_check ((pointee_type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4813, __FUNCTION__))->type_common.align) - 1) : 0) / (8) ); |
4814 | if (tree_fits_uhwi_p (TYPE_SIZE_UNIT (pointee_type)((tree_class_check ((pointee_type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4814, __FUNCTION__))->type_common.size_unit))) |
4815 | { |
4816 | unsigned HOST_WIDE_INTlong szl |
4817 | = tree_to_uhwi (TYPE_SIZE_UNIT (pointee_type)((tree_class_check ((pointee_type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4817, __FUNCTION__))->type_common.size_unit)); |
4818 | szl = least_bit_hwi (szl); |
4819 | if (szl) |
4820 | al = MIN (al, szl)((al) < (szl) ? (al) : (szl)); |
4821 | } |
4822 | if (ptr == NULL_TREE(tree) nullptr) |
4823 | { |
4824 | if (eltsz == NULL_TREE(tree) nullptr) |
4825 | eltsz = TYPE_SIZE_UNIT (pointee_type)((tree_class_check ((pointee_type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4825, __FUNCTION__))->type_common.size_unit); |
4826 | else |
4827 | eltsz = size_binop (PLUS_EXPR, eltsz,size_binop_loc (((location_t) 0), PLUS_EXPR, eltsz, ((tree_class_check ((pointee_type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4828, __FUNCTION__))->type_common.size_unit)) |
4828 | TYPE_SIZE_UNIT (pointee_type))size_binop_loc (((location_t) 0), PLUS_EXPR, eltsz, ((tree_class_check ((pointee_type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4828, __FUNCTION__))->type_common.size_unit)); |
4829 | } |
4830 | if (preval == 0 && al <= alloc_align) |
4831 | { |
4832 | unsigned HOST_WIDE_INTlong diff = ROUND_UP (sz, al)(((sz) + (al) - 1) & ~((al) - 1)) - sz; |
4833 | sz += diff; |
4834 | if (diff && ptr) |
4835 | ptr = fold_build2 (POINTER_PLUS_EXPR, TREE_TYPE (ptr),fold_build2_loc (((location_t) 0), POINTER_PLUS_EXPR, ((contains_struct_check ((ptr), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4835, __FUNCTION__))->typed.type), ptr, size_int_kind (diff , stk_sizetype) ) |
4836 | ptr, size_int (diff))fold_build2_loc (((location_t) 0), POINTER_PLUS_EXPR, ((contains_struct_check ((ptr), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4835, __FUNCTION__))->typed.type), ptr, size_int_kind (diff , stk_sizetype) ); |
4837 | } |
4838 | else if (al > preval) |
4839 | { |
4840 | if (ptr) |
4841 | { |
4842 | ptr = fold_convert (pointer_sized_int_node, ptr)fold_convert_loc (((location_t) 0), global_trees[TI_POINTER_SIZED_TYPE ], ptr); |
4843 | ptr = fold_build2 (PLUS_EXPR, pointer_sized_int_node, ptr,fold_build2_loc (((location_t) 0), PLUS_EXPR, global_trees[TI_POINTER_SIZED_TYPE ], ptr, build_int_cst (global_trees[TI_POINTER_SIZED_TYPE], al - 1) ) |
4844 | build_int_cst (pointer_sized_int_node,fold_build2_loc (((location_t) 0), PLUS_EXPR, global_trees[TI_POINTER_SIZED_TYPE ], ptr, build_int_cst (global_trees[TI_POINTER_SIZED_TYPE], al - 1) ) |
4845 | al - 1))fold_build2_loc (((location_t) 0), PLUS_EXPR, global_trees[TI_POINTER_SIZED_TYPE ], ptr, build_int_cst (global_trees[TI_POINTER_SIZED_TYPE], al - 1) ); |
4846 | ptr = fold_build2 (BIT_AND_EXPR, pointer_sized_int_node, ptr,fold_build2_loc (((location_t) 0), BIT_AND_EXPR, global_trees [TI_POINTER_SIZED_TYPE], ptr, build_int_cst (global_trees[TI_POINTER_SIZED_TYPE ], -(long) al) ) |
4847 | build_int_cst (pointer_sized_int_node,fold_build2_loc (((location_t) 0), BIT_AND_EXPR, global_trees [TI_POINTER_SIZED_TYPE], ptr, build_int_cst (global_trees[TI_POINTER_SIZED_TYPE ], -(long) al) ) |
4848 | -(HOST_WIDE_INT) al))fold_build2_loc (((location_t) 0), BIT_AND_EXPR, global_trees [TI_POINTER_SIZED_TYPE], ptr, build_int_cst (global_trees[TI_POINTER_SIZED_TYPE ], -(long) al) ); |
4849 | ptr = fold_convert (ptr_type_node, ptr)fold_convert_loc (((location_t) 0), global_trees[TI_PTR_TYPE] , ptr); |
4850 | } |
4851 | else |
4852 | sz += al - 1; |
4853 | } |
4854 | if (tree_fits_uhwi_p (TYPE_SIZE_UNIT (pointee_type)((tree_class_check ((pointee_type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4854, __FUNCTION__))->type_common.size_unit))) |
4855 | preval = al; |
4856 | else |
4857 | preval = 1; |
4858 | if (ptr) |
4859 | { |
4860 | expand_omp_build_assign (gsi, OMP_CLAUSE_DECL (c)(*(omp_clause_elt_check (((omp_clause_range_check (((tree_check ((c), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4860, __FUNCTION__, (OMP_CLAUSE)))), (OMP_CLAUSE_PRIVATE), ( OMP_CLAUSE__SCANTEMP_), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4860, __FUNCTION__))), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4860, __FUNCTION__))), ptr, false); |
4861 | ptr = OMP_CLAUSE_DECL (c)(*(omp_clause_elt_check (((omp_clause_range_check (((tree_check ((c), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4861, __FUNCTION__, (OMP_CLAUSE)))), (OMP_CLAUSE_PRIVATE), ( OMP_CLAUSE__SCANTEMP_), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4861, __FUNCTION__))), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4861, __FUNCTION__))); |
4862 | ptr = fold_build2 (POINTER_PLUS_EXPR, TREE_TYPE (ptr), ptr,fold_build2_loc (((location_t) 0), POINTER_PLUS_EXPR, ((contains_struct_check ((ptr), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4862, __FUNCTION__))->typed.type), ptr, size_binop_loc ( ((location_t) 0), MULT_EXPR, cnt, ((tree_class_check ((pointee_type ), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4864, __FUNCTION__))->type_common.size_unit)) ) |
4863 | size_binop (MULT_EXPR, cnt,fold_build2_loc (((location_t) 0), POINTER_PLUS_EXPR, ((contains_struct_check ((ptr), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4862, __FUNCTION__))->typed.type), ptr, size_binop_loc ( ((location_t) 0), MULT_EXPR, cnt, ((tree_class_check ((pointee_type ), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4864, __FUNCTION__))->type_common.size_unit)) ) |
4864 | TYPE_SIZE_UNIT (pointee_type)))fold_build2_loc (((location_t) 0), POINTER_PLUS_EXPR, ((contains_struct_check ((ptr), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4862, __FUNCTION__))->typed.type), ptr, size_binop_loc ( ((location_t) 0), MULT_EXPR, cnt, ((tree_class_check ((pointee_type ), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4864, __FUNCTION__))->type_common.size_unit)) ); |
4865 | } |
4866 | } |
4867 | |
4868 | if (ptr == NULL_TREE(tree) nullptr) |
4869 | { |
4870 | eltsz = size_binop (MULT_EXPR, eltsz, cnt)size_binop_loc (((location_t) 0), MULT_EXPR, eltsz, cnt); |
4871 | if (sz) |
4872 | eltsz = size_binop (PLUS_EXPR, eltsz, size_int (sz))size_binop_loc (((location_t) 0), PLUS_EXPR, eltsz, size_int_kind (sz, stk_sizetype)); |
4873 | return eltsz; |
4874 | } |
4875 | else |
4876 | return ptr; |
4877 | } |
4878 | |
4879 | /* Return the last _looptemp_ clause if one has been created for |
4880 | lastprivate on distribute parallel for{, simd} or taskloop. |
4881 | FD is the loop data and INNERC should be the second _looptemp_ |
4882 | clause (the one holding the end of the range). |
4883 | This is followed by collapse - 1 _looptemp_ clauses for the |
4884 | counts[1] and up, and for triangular loops followed by 4 |
4885 | further _looptemp_ clauses (one for counts[0], one first_inner_iterations, |
4886 | one factor and one adjn1). After this there is optionally one |
4887 | _looptemp_ clause that this function returns. */ |
4888 | |
4889 | static tree |
4890 | find_lastprivate_looptemp (struct omp_for_data *fd, tree innerc) |
4891 | { |
4892 | gcc_assert (innerc)((void)(!(innerc) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4892, __FUNCTION__), 0 : 0)); |
4893 | int count = fd->collapse - 1; |
4894 | if (fd->non_rect |
4895 | && fd->last_nonrect == fd->first_nonrect + 1 |
4896 | && !TYPE_UNSIGNED (TREE_TYPE (fd->loops[fd->last_nonrect].v))((tree_class_check ((((contains_struct_check ((fd->loops[fd ->last_nonrect].v), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4896, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4896, __FUNCTION__))->base.u.bits.unsigned_flag)) |
4897 | count += 4; |
4898 | for (int i = 0; i < count; i++) |
4899 | { |
4900 | innerc = omp_find_clause (OMP_CLAUSE_CHAIN (innerc)((contains_struct_check (((tree_check ((innerc), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4900, __FUNCTION__, (OMP_CLAUSE)))), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4900, __FUNCTION__))->common.chain), |
4901 | OMP_CLAUSE__LOOPTEMP_); |
4902 | gcc_assert (innerc)((void)(!(innerc) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4902, __FUNCTION__), 0 : 0)); |
4903 | } |
4904 | return omp_find_clause (OMP_CLAUSE_CHAIN (innerc)((contains_struct_check (((tree_check ((innerc), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4904, __FUNCTION__, (OMP_CLAUSE)))), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4904, __FUNCTION__))->common.chain), |
4905 | OMP_CLAUSE__LOOPTEMP_); |
4906 | } |
4907 | |
4908 | /* A subroutine of expand_omp_for. Generate code for a parallel |
4909 | loop with static schedule and no specified chunk size. Given |
4910 | parameters: |
4911 | |
4912 | for (V = N1; V cond N2; V += STEP) BODY; |
4913 | |
4914 | where COND is "<" or ">", we generate pseudocode |
4915 | |
4916 | if ((__typeof (V)) -1 > 0 && N2 cond N1) goto L2; |
4917 | if (cond is <) |
4918 | adj = STEP - 1; |
4919 | else |
4920 | adj = STEP + 1; |
4921 | if ((__typeof (V)) -1 > 0 && cond is >) |
4922 | n = -(adj + N2 - N1) / -STEP; |
4923 | else |
4924 | n = (adj + N2 - N1) / STEP; |
4925 | q = n / nthreads; |
4926 | tt = n % nthreads; |
4927 | if (threadid < tt) goto L3; else goto L4; |
4928 | L3: |
4929 | tt = 0; |
4930 | q = q + 1; |
4931 | L4: |
4932 | s0 = q * threadid + tt; |
4933 | e0 = s0 + q; |
4934 | V = s0 * STEP + N1; |
4935 | if (s0 >= e0) goto L2; else goto L0; |
4936 | L0: |
4937 | e = e0 * STEP + N1; |
4938 | L1: |
4939 | BODY; |
4940 | V += STEP; |
4941 | if (V cond e) goto L1; |
4942 | L2: |
4943 | */ |
4944 | |
4945 | static void |
4946 | expand_omp_for_static_nochunk (struct omp_region *region, |
4947 | struct omp_for_data *fd, |
4948 | gimple *inner_stmt) |
4949 | { |
4950 | tree n, q, s0, e0, e, t, tt, nthreads = NULL_TREE(tree) nullptr, threadid; |
4951 | tree type, itype, vmain, vback; |
4952 | basic_block entry_bb, second_bb, third_bb, exit_bb, seq_start_bb; |
4953 | basic_block body_bb, cont_bb, collapse_bb = NULLnullptr; |
4954 | basic_block fin_bb, fourth_bb = NULLnullptr, fifth_bb = NULLnullptr, sixth_bb = NULLnullptr; |
4955 | basic_block exit1_bb = NULLnullptr, exit2_bb = NULLnullptr, exit3_bb = NULLnullptr; |
4956 | gimple_stmt_iterator gsi, gsip; |
4957 | edge ep; |
4958 | bool broken_loop = region->cont == NULLnullptr; |
4959 | tree *counts = NULLnullptr; |
4960 | tree n1, n2, step; |
4961 | tree reductions = NULL_TREE(tree) nullptr; |
4962 | tree cond_var = NULL_TREE(tree) nullptr, condtemp = NULL_TREE(tree) nullptr; |
4963 | |
4964 | itype = type = TREE_TYPE (fd->loop.v)((contains_struct_check ((fd->loop.v), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4964, __FUNCTION__))->typed.type); |
4965 | if (POINTER_TYPE_P (type)(((enum tree_code) (type)->base.code) == POINTER_TYPE || ( (enum tree_code) (type)->base.code) == REFERENCE_TYPE)) |
4966 | itype = signed_type_for (type); |
4967 | |
4968 | entry_bb = region->entry; |
4969 | cont_bb = region->cont; |
4970 | gcc_assert (EDGE_COUNT (entry_bb->succs) == 2)((void)(!(vec_safe_length (entry_bb->succs) == 2) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4970, __FUNCTION__), 0 : 0)); |
4971 | fin_bb = BRANCH_EDGE (entry_bb)((*((entry_bb))->succs)[(0)]->flags & EDGE_FALLTHRU ? (*((entry_bb))->succs)[(1)] : (*((entry_bb))->succs) [(0)])->dest; |
4972 | gcc_assert (broken_loop((void)(!(broken_loop || (fin_bb == ((*((cont_bb))->succs) [(0)]->flags & EDGE_FALLTHRU ? (*((cont_bb))->succs )[(0)] : (*((cont_bb))->succs)[(1)])->dest)) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4973, __FUNCTION__), 0 : 0)) |
4973 | || (fin_bb == FALLTHRU_EDGE (cont_bb)->dest))((void)(!(broken_loop || (fin_bb == ((*((cont_bb))->succs) [(0)]->flags & EDGE_FALLTHRU ? (*((cont_bb))->succs )[(0)] : (*((cont_bb))->succs)[(1)])->dest)) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4973, __FUNCTION__), 0 : 0)); |
4974 | seq_start_bb = split_edge (FALLTHRU_EDGE (entry_bb)((*((entry_bb))->succs)[(0)]->flags & EDGE_FALLTHRU ? (*((entry_bb))->succs)[(0)] : (*((entry_bb))->succs) [(1)])); |
4975 | body_bb = single_succ (seq_start_bb); |
4976 | if (!broken_loop) |
4977 | { |
4978 | gcc_assert (BRANCH_EDGE (cont_bb)->dest == body_bb((void)(!(((*((cont_bb))->succs)[(0)]->flags & EDGE_FALLTHRU ? (*((cont_bb))->succs)[(1)] : (*((cont_bb))->succs)[( 0)])->dest == body_bb || single_succ (((*((cont_bb))->succs )[(0)]->flags & EDGE_FALLTHRU ? (*((cont_bb))->succs )[(1)] : (*((cont_bb))->succs)[(0)])->dest) == body_bb) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4979, __FUNCTION__), 0 : 0)) |
4979 | || single_succ (BRANCH_EDGE (cont_bb)->dest) == body_bb)((void)(!(((*((cont_bb))->succs)[(0)]->flags & EDGE_FALLTHRU ? (*((cont_bb))->succs)[(1)] : (*((cont_bb))->succs)[( 0)])->dest == body_bb || single_succ (((*((cont_bb))->succs )[(0)]->flags & EDGE_FALLTHRU ? (*((cont_bb))->succs )[(1)] : (*((cont_bb))->succs)[(0)])->dest) == body_bb) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4979, __FUNCTION__), 0 : 0)); |
4980 | gcc_assert (EDGE_COUNT (cont_bb->succs) == 2)((void)(!(vec_safe_length (cont_bb->succs) == 2) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4980, __FUNCTION__), 0 : 0)); |
4981 | } |
4982 | exit_bb = region->exit; |
4983 | |
4984 | /* Iteration space partitioning goes in ENTRY_BB. */ |
4985 | gsi = gsi_last_nondebug_bb (entry_bb); |
4986 | gcc_assert (gimple_code (gsi_stmt (gsi)) == GIMPLE_OMP_FOR)((void)(!(gimple_code (gsi_stmt (gsi)) == GIMPLE_OMP_FOR) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 4986, __FUNCTION__), 0 : 0)); |
4987 | gsip = gsi; |
4988 | gsi_prev (&gsip); |
4989 | |
4990 | if (fd->collapse > 1) |
4991 | { |
4992 | int first_zero_iter = -1, dummy = -1; |
4993 | basic_block l2_dom_bb = NULLnullptr, dummy_bb = NULLnullptr; |
4994 | |
4995 | counts = XALLOCAVEC (tree, fd->collapse)((tree *) __builtin_alloca(sizeof (tree) * (fd->collapse)) ); |
4996 | expand_omp_for_init_counts (fd, &gsi, entry_bb, counts, |
4997 | fin_bb, first_zero_iter, |
4998 | dummy_bb, dummy, l2_dom_bb); |
4999 | t = NULL_TREE(tree) nullptr; |
5000 | } |
5001 | else if (gimple_omp_for_combined_into_p (fd->for_stmt)) |
5002 | t = integer_one_nodeglobal_trees[TI_INTEGER_ONE]; |
5003 | else |
5004 | t = fold_binary (fd->loop.cond_code, boolean_type_node,fold_binary_loc (((location_t) 0), fd->loop.cond_code, global_trees [TI_BOOLEAN_TYPE], fold_convert_loc (((location_t) 0), type, fd ->loop.n1), fold_convert_loc (((location_t) 0), type, fd-> loop.n2)) |
5005 | fold_convert (type, fd->loop.n1),fold_binary_loc (((location_t) 0), fd->loop.cond_code, global_trees [TI_BOOLEAN_TYPE], fold_convert_loc (((location_t) 0), type, fd ->loop.n1), fold_convert_loc (((location_t) 0), type, fd-> loop.n2)) |
5006 | fold_convert (type, fd->loop.n2))fold_binary_loc (((location_t) 0), fd->loop.cond_code, global_trees [TI_BOOLEAN_TYPE], fold_convert_loc (((location_t) 0), type, fd ->loop.n1), fold_convert_loc (((location_t) 0), type, fd-> loop.n2)); |
5007 | if (fd->collapse == 1 |
5008 | && TYPE_UNSIGNED (type)((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 5008, __FUNCTION__))->base.u.bits.unsigned_flag) |
5009 | && (t == NULL_TREE(tree) nullptr || !integer_onep (t))) |
5010 | { |
5011 | n1 = fold_convert (type, unshare_expr (fd->loop.n1))fold_convert_loc (((location_t) 0), type, unshare_expr (fd-> loop.n1)); |
5012 | n1 = force_gimple_operand_gsi (&gsi, n1, true, NULL_TREE(tree) nullptr, |
5013 | true, GSI_SAME_STMT); |
5014 | n2 = fold_convert (type, unshare_expr (fd->loop.n2))fold_convert_loc (((location_t) 0), type, unshare_expr (fd-> loop.n2)); |
5015 | n2 = force_gimple_operand_gsi (&gsi, n2, true, NULL_TREE(tree) nullptr, |
5016 | true, GSI_SAME_STMT); |
5017 | gcond *cond_stmt = expand_omp_build_cond (&gsi, fd->loop.cond_code, |
5018 | n1, n2); |
5019 | ep = split_block (entry_bb, cond_stmt); |
5020 | ep->flags = EDGE_TRUE_VALUE; |
5021 | entry_bb = ep->dest; |
5022 | ep->probability = profile_probability::very_likely (); |
5023 | ep = make_edge (ep->src, fin_bb, EDGE_FALSE_VALUE); |
5024 | ep->probability = profile_probability::very_unlikely (); |
5025 | if (gimple_in_ssa_p (cfun(cfun + 0))) |
5026 | { |
5027 | int dest_idx = find_edge (entry_bb, fin_bb)->dest_idx; |
5028 | for (gphi_iterator gpi = gsi_start_phis (fin_bb); |
5029 | !gsi_end_p (gpi); gsi_next (&gpi)) |
5030 | { |
5031 | gphi *phi = gpi.phi (); |
5032 | add_phi_arg (phi, gimple_phi_arg_def (phi, dest_idx), |
5033 | ep, UNKNOWN_LOCATION((location_t) 0)); |
5034 | } |
5035 | } |
5036 | gsi = gsi_last_bb (entry_bb); |
5037 | } |
5038 | |
5039 | if (fd->lastprivate_conditional) |
5040 | { |
5041 | tree clauses = gimple_omp_for_clauses (fd->for_stmt); |
5042 | tree c = omp_find_clause (clauses, OMP_CLAUSE__CONDTEMP_); |
5043 | if (fd->have_pointer_condtemp) |
5044 | condtemp = OMP_CLAUSE_DECL (c)(*(omp_clause_elt_check (((omp_clause_range_check (((tree_check ((c), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 5044, __FUNCTION__, (OMP_CLAUSE)))), (OMP_CLAUSE_PRIVATE), ( OMP_CLAUSE__SCANTEMP_), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 5044, __FUNCTION__))), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 5044, __FUNCTION__))); |
5045 | c = omp_find_clause (OMP_CLAUSE_CHAIN (c)((contains_struct_check (((tree_check ((c), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 5045, __FUNCTION__, (OMP_CLAUSE)))), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 5045, __FUNCTION__))->common.chain), OMP_CLAUSE__CONDTEMP_); |
5046 | cond_var = OMP_CLAUSE_DECL (c)(*(omp_clause_elt_check (((omp_clause_range_check (((tree_check ((c), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 5046, __FUNCTION__, (OMP_CLAUSE)))), (OMP_CLAUSE_PRIVATE), ( OMP_CLAUSE__SCANTEMP_), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 5046, __FUNCTION__))), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 5046, __FUNCTION__))); |
5047 | } |
5048 | if (fd->have_reductemp |
5049 | /* For scan, we don't want to reinitialize condtemp before the |
5050 | second loop. */ |
5051 | || (fd->have_pointer_condtemp && !fd->have_scantemp) |
5052 | || fd->have_nonctrl_scantemp) |
5053 | { |
5054 | tree t1 = build_int_cst (long_integer_type_nodeinteger_types[itk_long], 0); |
5055 | tree t2 = build_int_cst (long_integer_type_nodeinteger_types[itk_long], 1); |
5056 | tree t3 = build_int_cstu (long_integer_type_nodeinteger_types[itk_long], |
5057 | (HOST_WIDE_INT_1U1UL << 31) + 1); |
5058 | tree clauses = gimple_omp_for_clauses (fd->for_stmt); |
5059 | gimple_stmt_iterator gsi2 = gsi_none (); |
5060 | gimple *g = NULLnullptr; |
5061 | tree mem = null_pointer_nodeglobal_trees[TI_NULL_POINTER], memv = NULL_TREE(tree) nullptr; |
5062 | unsigned HOST_WIDE_INTlong condtemp_sz = 0; |
5063 | unsigned HOST_WIDE_INTlong alloc_align = 0; |
5064 | if (fd->have_reductemp) |
5065 | { |
5066 | gcc_assert (!fd->have_nonctrl_scantemp)((void)(!(!fd->have_nonctrl_scantemp) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 5066, __FUNCTION__), 0 : 0)); |
5067 | tree c = omp_find_clause (clauses, OMP_CLAUSE__REDUCTEMP_); |
5068 | reductions = OMP_CLAUSE_DECL (c)(*(omp_clause_elt_check (((omp_clause_range_check (((tree_check ((c), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 5068, __FUNCTION__, (OMP_CLAUSE)))), (OMP_CLAUSE_PRIVATE), ( OMP_CLAUSE__SCANTEMP_), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 5068, __FUNCTION__))), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 5068, __FUNCTION__))); |
5069 | gcc_assert (TREE_CODE (reductions) == SSA_NAME)((void)(!(((enum tree_code) (reductions)->base.code) == SSA_NAME ) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 5069, __FUNCTION__), 0 : 0)); |
5070 | g = SSA_NAME_DEF_STMT (reductions)(tree_check ((reductions), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 5070, __FUNCTION__, (SSA_NAME)))->ssa_name.def_stmt; |
5071 | reductions = gimple_assign_rhs1 (g); |
5072 | OMP_CLAUSE_DECL (c)(*(omp_clause_elt_check (((omp_clause_range_check (((tree_check ((c), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 5072, __FUNCTION__, (OMP_CLAUSE)))), (OMP_CLAUSE_PRIVATE), ( OMP_CLAUSE__SCANTEMP_), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 5072, __FUNCTION__))), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 5072, __FUNCTION__))) = reductions; |
5073 | gsi2 = gsi_for_stmt (g); |
5074 | } |
5075 | else |
5076 | { |
5077 | if (gsi_end_p (gsip)) |
5078 | gsi2 = gsi_after_labels (region->entry); |
5079 | else |
5080 | gsi2 = gsip; |
5081 | reductions = null_pointer_nodeglobal_trees[TI_NULL_POINTER]; |
5082 | } |
5083 | if (fd->have_pointer_condtemp || fd->have_nonctrl_scantemp) |
5084 | { |
5085 | tree type; |
5086 | if (fd->have_pointer_condtemp) |
5087 | type = TREE_TYPE (condtemp)((contains_struct_check ((condtemp), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 5087, __FUNCTION__))->typed.type); |
5088 | else |
5089 | type = ptr_type_nodeglobal_trees[TI_PTR_TYPE]; |
5090 | memv = create_tmp_var (type); |
5091 | TREE_ADDRESSABLE (memv)((memv)->base.addressable_flag) = 1; |
5092 | unsigned HOST_WIDE_INTlong sz = 0; |
5093 | tree size = NULL_TREE(tree) nullptr; |
5094 | if (fd->have_pointer_condtemp) |
5095 | { |
5096 | sz = tree_to_uhwi (TYPE_SIZE_UNIT (TREE_TYPE (type))((tree_class_check ((((contains_struct_check ((type), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 5096, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 5096, __FUNCTION__))->type_common.size_unit)); |
5097 | sz *= fd->lastprivate_conditional; |
5098 | condtemp_sz = sz; |
5099 | } |
5100 | if (fd->have_nonctrl_scantemp) |
5101 | { |
5102 | nthreads = builtin_decl_explicit (BUILT_IN_OMP_GET_NUM_THREADS); |
5103 | gimple *g = gimple_build_call (nthreads, 0); |
5104 | nthreads = create_tmp_var (integer_type_nodeinteger_types[itk_int]); |
5105 | gimple_call_set_lhs (g, nthreads); |
5106 | gsi_insert_before (&gsi2, g, GSI_SAME_STMT); |
5107 | nthreads = fold_convert (sizetype, nthreads)fold_convert_loc (((location_t) 0), sizetype_tab[(int) stk_sizetype ], nthreads); |
5108 | alloc_align = TYPE_ALIGN_UNIT (long_long_integer_type_node)((((tree_class_check ((integer_types[itk_long_long]), (tcc_type ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 5108, __FUNCTION__))->type_common.align) ? ((unsigned)1) << (((tree_class_check ((integer_types[itk_long_long]) , (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 5108, __FUNCTION__))->type_common.align) - 1) : 0) / (8) ); |
5109 | size = expand_omp_scantemp_alloc (clauses, NULL_TREE(tree) nullptr, sz, |
5110 | alloc_align, nthreads, NULLnullptr, |
5111 | false); |
5112 | size = fold_convert (type, size)fold_convert_loc (((location_t) 0), type, size); |
5113 | } |
5114 | else |
5115 | size = build_int_cst (type, sz); |
5116 | expand_omp_build_assign (&gsi2, memv, size, false); |
5117 | mem = build_fold_addr_expr (memv)build_fold_addr_expr_loc (((location_t) 0), (memv)); |
5118 | } |
5119 | tree t |
5120 | = build_call_expr (builtin_decl_explicit (BUILT_IN_GOMP_LOOP_START), |
5121 | 9, t1, t2, t2, t3, t1, null_pointer_nodeglobal_trees[TI_NULL_POINTER], |
5122 | null_pointer_nodeglobal_trees[TI_NULL_POINTER], reductions, mem); |
5123 | force_gimple_operand_gsi (&gsi2, t, true, NULL_TREE(tree) nullptr, |
5124 | true, GSI_SAME_STMT); |
5125 | if (fd->have_pointer_condtemp) |
5126 | expand_omp_build_assign (&gsi2, condtemp, memv, false); |
5127 | if (fd->have_nonctrl_scantemp) |
5128 | { |
5129 | tree ptr = fd->have_pointer_condtemp ? condtemp : memv; |
5130 | expand_omp_scantemp_alloc (clauses, ptr, condtemp_sz, |
5131 | alloc_align, nthreads, &gsi2, false); |
5132 | } |
5133 | if (fd->have_reductemp) |
5134 | { |
5135 | gsi_remove (&gsi2, true); |
5136 | release_ssa_name (gimple_assign_lhs (g)); |
5137 | } |
5138 | } |
5139 | switch (gimple_omp_for_kind (fd->for_stmt)) |
5140 | { |
5141 | case GF_OMP_FOR_KIND_FOR: |
5142 | nthreads = builtin_decl_explicit (BUILT_IN_OMP_GET_NUM_THREADS); |
5143 | threadid = builtin_decl_explicit (BUILT_IN_OMP_GET_THREAD_NUM); |
5144 | break; |
5145 | case GF_OMP_FOR_KIND_DISTRIBUTE: |
5146 | nthreads = builtin_decl_explicit (BUILT_IN_OMP_GET_NUM_TEAMS); |
5147 | threadid = builtin_decl_explicit (BUILT_IN_OMP_GET_TEAM_NUM); |
5148 | break; |
5149 | default: |
5150 | gcc_unreachable ()(fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 5150, __FUNCTION__)); |
5151 | } |
5152 | nthreads = build_call_expr (nthreads, 0); |
5153 | nthreads = fold_convert (itype, nthreads)fold_convert_loc (((location_t) 0), itype, nthreads); |
5154 | nthreads = force_gimple_operand_gsi (&gsi, nthreads, true, NULL_TREE(tree) nullptr, |
5155 | true, GSI_SAME_STMT); |
5156 | threadid = build_call_expr (threadid, 0); |
5157 | threadid = fold_convert (itype, threadid)fold_convert_loc (((location_t) 0), itype, threadid); |
5158 | threadid = force_gimple_operand_gsi (&gsi, threadid, true, NULL_TREE(tree) nullptr, |
5159 | true, GSI_SAME_STMT); |
5160 | |
5161 | n1 = fd->loop.n1; |
5162 | n2 = fd->loop.n2; |
5163 | step = fd->loop.step; |
5164 | if (gimple_omp_for_combined_into_p (fd->for_stmt)) |
5165 | { |
5166 | tree innerc = omp_find_clause (gimple_omp_for_clauses (fd->for_stmt), |
5167 | OMP_CLAUSE__LOOPTEMP_); |
5168 | gcc_assert (innerc)((void)(!(innerc) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 5168, __FUNCTION__), 0 : 0)); |
5169 | n1 = OMP_CLAUSE_DECL (innerc)(*(omp_clause_elt_check (((omp_clause_range_check (((tree_check ((innerc), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 5169, __FUNCTION__, (OMP_CLAUSE)))), (OMP_CLAUSE_PRIVATE), ( OMP_CLAUSE__SCANTEMP_), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 5169, __FUNCTION__))), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 5169, __FUNCTION__))); |
5170 | innerc = omp_find_clause (OMP_CLAUSE_CHAIN (innerc)((contains_struct_check (((tree_check ((innerc), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 5170, __FUNCTION__, (OMP_CLAUSE)))), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 5170, __FUNCTION__))->common.chain), |
5171 | OMP_CLAUSE__LOOPTEMP_); |
5172 | gcc_assert (innerc)((void)(!(innerc) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 5172, __FUNCTION__), 0 : 0)); |
5173 | n2 = OMP_CLAUSE_DECL (innerc)(*(omp_clause_elt_check (((omp_clause_range_check (((tree_check ((innerc), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 5173, __FUNCTION__, (OMP_CLAUSE)))), (OMP_CLAUSE_PRIVATE), ( OMP_CLAUSE__SCANTEMP_), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 5173, __FUNCTION__))), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/omp-expand.cc" , 5173, __FUNCTION__))); |
5174 | } |
5175 | n1 = force_gimple_operand_gsi (&gsi, fold_convert (type, n1)fold_convert_loc (((location_t) 0), type, n1), |
5176 | true, NULL_TREE(tree) nullptr, true, GSI_SAME_STMT); |
5177 | n2 = force_gimple_operand_gsi (&gsi, fold_convert (itype, n2)fold_convert_loc (((location_t) 0), itype, n2), |
5178 | true, NULL_TREE(tree) nullptr, true, GSI_SAME_STMT); |
5179 | step = force_gimple_operand_gsi (&gsi, fold_convert (itype, step)fold_convert_loc (((location_t) 0), itype, step), |
5180 | true, NULL_TREE(tree) nullptr, true, GSI_SAME_STMT); |
5181 | |
5182 | t = build_int_cst (itype, (fd->loop.cond_code == LT_EXPR ? -1 : 1)); |
5183 | t = fold_build2 (PLUS_EXPR, itype, step, t)fold_build2_loc (((location_t) 0), PLUS_EXPR, itype, step, t ); |
5184 | t = |