]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/cfgloop.h
Update copyright years.
[thirdparty/gcc.git] / gcc / cfgloop.h
CommitLineData
862be747 1/* Natural loop functions
f1717362 2 Copyright (C) 1987-2016 Free Software Foundation, Inc.
862be747 3
4This file is part of GCC.
5
6GCC is free software; you can redistribute it and/or modify it under
7the terms of the GNU General Public License as published by the Free
8c4c00c1 8Software Foundation; either version 3, or (at your option) any later
862be747 9version.
10
11GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12WARRANTY; without even the implied warranty of MERCHANTABILITY or
13FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14for more details.
15
16You should have received a copy of the GNU General Public License
8c4c00c1 17along with GCC; see the file COPYING3. If not see
18<http://www.gnu.org/licenses/>. */
862be747 19
bcf3c70d 20#ifndef GCC_CFGLOOP_H
21#define GCC_CFGLOOP_H
22
e5a23585 23#include "cfgloopmanip.h"
0f71a633 24
862be747 25/* Structure to hold decision about unrolling/peeling. */
26enum lpt_dec
27{
28 LPT_NONE,
862be747 29 LPT_UNROLL_CONSTANT,
30 LPT_UNROLL_RUNTIME,
31 LPT_UNROLL_STUPID
32};
33
fb1e4f4a 34struct GTY (()) lpt_decision {
862be747 35 enum lpt_dec decision;
36 unsigned times;
37};
38
aedb7bf8 39/* The type of extend applied to an IV. */
40enum iv_extend_code
41{
42 IV_SIGN_EXTEND,
43 IV_ZERO_EXTEND,
44 IV_UNKNOWN_EXTEND
45};
46
bc3c8ad4 47/* The structure describing a bound on number of iterations of a loop. */
48
fb1e4f4a 49struct GTY ((chain_next ("%h.next"))) nb_iter_bound {
faa56cf9 50 /* The statement STMT is executed at most ... */
42acab1c 51 gimple *stmt;
faa56cf9 52
53 /* ... BOUND + 1 times (BOUND must be an unsigned constant).
54 The + 1 is added for the following reasons:
55
56 a) 0 would otherwise be unused, while we would need to care more about
57 overflows (as MAX + 1 is sometimes produced as the estimate on number
58 of executions of STMT).
59 b) it is consistent with the result of number_of_iterations_exit. */
5de9d3ed 60 widest_int bound;
faa56cf9 61
48e1416a 62 /* True if the statement will cause the loop to be leaved the (at most)
faa56cf9 63 BOUND + 1-st time it is executed, that is, all the statements after it
64 are executed at most BOUND times. */
65 bool is_exit;
66
faa56cf9 67 /* The next bound in the list. */
bc3c8ad4 68 struct nb_iter_bound *next;
bc3c8ad4 69};
70
dce58e66 71/* Description of the loop exit. */
72
2ef51f0e 73struct GTY ((for_user)) loop_exit {
dce58e66 74 /* The exit edge. */
161dfa6e 75 edge e;
dce58e66 76
77 /* Previous and next exit in the list of the exits of the loop. */
78 struct loop_exit *prev;
79 struct loop_exit *next;
80
81 /* Next element in the list of loops from that E exits. */
82 struct loop_exit *next_e;
83};
84
b594087e 85struct loop_exit_hasher : ggc_ptr_hash<loop_exit>
2ef51f0e 86{
87 typedef edge compare_type;
88
89 static hashval_t hash (loop_exit *);
90 static bool equal (loop_exit *, edge);
91 static void remove (loop_exit *);
92};
93
9e3536f4 94typedef struct loop *loop_p;
9e3536f4 95
f780cc25 96/* An integer estimation of the number of iterations. Estimate_state
97 describes what is the state of the estimation. */
98enum loop_estimation
99{
100 /* Estimate was not computed yet. */
101 EST_NOT_COMPUTED,
102 /* Estimate is ready. */
7a569539 103 EST_AVAILABLE,
104 EST_LAST
f780cc25 105};
106
05032b10 107/* The structure describing non-overflow control induction variable for
108 loop's exit edge. */
109struct GTY ((chain_next ("%h.next"))) control_iv {
110 tree base;
111 tree step;
112 struct control_iv *next;
113};
114
862be747 115/* Structure to hold information for each natural loop. */
fb1e4f4a 116struct GTY ((chain_next ("%h.next"))) loop {
862be747 117 /* Index into loops array. */
118 int num;
119
0ac758f7 120 /* Number of loop insns. */
121 unsigned ninsns;
122
862be747 123 /* Basic block of loop header. */
161dfa6e 124 basic_block header;
862be747 125
126 /* Basic block of loop latch. */
161dfa6e 127 basic_block latch;
862be747 128
862be747 129 /* For loop unrolling/peeling decision. */
130 struct lpt_decision lpt_decision;
131
862be747 132 /* Average number of executed insns per iteration. */
133 unsigned av_ninsns;
134
862be747 135 /* Number of blocks contained within the loop. */
136 unsigned num_nodes;
137
9e3536f4 138 /* Superloops of the loop, starting with the outermost loop. */
f1f41a6c 139 vec<loop_p, va_gc> *superloops;
862be747 140
141 /* The first inner (child) loop or NULL if innermost loop. */
142 struct loop *inner;
143
144 /* Link to the next (sibling) loop. */
145 struct loop *next;
146
862be747 147 /* Auxiliary info specific to a pass. */
ccae4f9f 148 PTR GTY ((skip (""))) aux;
862be747 149
134c053e 150 /* The number of times the latch of the loop is executed. This can be an
151 INTEGER_CST, or a symbolic expression representing the number of
152 iterations like "N - 1", or a COND_EXPR containing the runtime
153 conditions under which the number of iterations is non zero.
154
155 Don't access this field directly: number_of_latch_executions
156 computes and caches the computed information in this field. */
c2c3fd24 157 tree nb_iterations;
158
8fe79ba5 159 /* An integer guaranteed to be greater or equal to nb_iterations. Only
160 valid if any_upper_bound is true. */
5de9d3ed 161 widest_int nb_iterations_upper_bound;
4b4ab846 162
8fe79ba5 163 /* An integer giving an estimate on nb_iterations. Unlike
164 nb_iterations_upper_bound, there is no guarantee that it is at least
165 nb_iterations. */
5de9d3ed 166 widest_int nb_iterations_estimate;
bc3c8ad4 167
0ac758f7 168 bool any_upper_bound;
169 bool any_estimate;
170
609c710b 171 /* True if the loop can be parallel. */
172 bool can_be_parallel;
173
228bf2b8 174 /* True if -Waggressive-loop-optimizations warned about this loop
175 already. */
176 bool warned_aggressive_loop_optimizations;
177
0ac758f7 178 /* An integer estimation of the number of iterations. Estimate_state
179 describes what is the state of the estimation. */
180 enum loop_estimation estimate_state;
181
3d483a94 182 /* If > 0, an integer, where the user asserted that for any
183 I in [ 0, nb_iterations ) and for any J in
184 [ I, min ( I + safelen, nb_iterations ) ), the Ith and Jth iterations
185 of the loop can be safely evaluated concurrently. */
186 int safelen;
187
c71d3c24 188 /* True if this loop should never be vectorized. */
189 bool dont_vectorize;
190
eb71996d 191 /* True if we should try harder to vectorize this loop. */
192 bool force_vectorize;
193
1a40f20b 194 /* True if the loop is part of an oacc kernels region. */
195 bool in_oacc_kernels_region;
196
3d483a94 197 /* For SIMD loops, this is a unique identifier of the loop, referenced
198 by IFN_GOMP_SIMD_VF, IFN_GOMP_SIMD_LANE and IFN_GOMP_SIMD_LAST_LANE
199 builtins. */
200 tree simduid;
201
b9d73ea6 202 /* Upper bound on number of iterations of a loop. */
203 struct nb_iter_bound *bounds;
bb445479 204
05032b10 205 /* Non-overflow control ivs of a loop. */
206 struct control_iv *control_ivs;
207
dce58e66 208 /* Head of the cyclic list of the exits of the loop. */
ccae4f9f 209 struct loop_exit *exits;
427286b3 210
211 /* Number of iteration analysis data for RTL. */
212 struct niter_desc *simple_loop_desc;
6437689e 213
6437689e 214 /* For sanity checking during loop fixup we record here the former
215 loop header for loops marked for removal. Note that this prevents
216 the basic-block from being collected but its index can still be
217 reused. */
218 basic_block former_header;
862be747 219};
220
221/* Flags for state of loop structure. */
222enum
223{
224 LOOPS_HAVE_PREHEADERS = 1,
225 LOOPS_HAVE_SIMPLE_LATCHES = 2,
bb445479 226 LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS = 4,
4a6f9e19 227 LOOPS_HAVE_RECORDED_EXITS = 8,
d8a0d6b8 228 LOOPS_MAY_HAVE_MULTIPLE_LATCHES = 16,
eb2a640e 229 LOOP_CLOSED_SSA = 32,
e1ab7874 230 LOOPS_NEED_FIXUP = 64,
231 LOOPS_HAVE_FALLTHRU_PREHEADERS = 128
862be747 232};
233
c8d055f6 234#define LOOPS_NORMAL (LOOPS_HAVE_PREHEADERS | LOOPS_HAVE_SIMPLE_LATCHES \
235 | LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS)
4a6f9e19 236#define AVOID_CFG_MODIFICATIONS (LOOPS_MAY_HAVE_MULTIPLE_LATCHES)
c8d055f6 237
862be747 238/* Structure to hold CFG information about natural loops within a function. */
fb1e4f4a 239struct GTY (()) loops {
677144a0 240 /* State of loops. */
241 int state;
862be747 242
17519ba0 243 /* Array of the loops. */
f1f41a6c 244 vec<loop_p, va_gc> *larray;
862be747 245
dce58e66 246 /* Maps edges to the list of their descriptions as loop exits. Edges
247 whose sources or destinations have loop_father == NULL (which may
248 happen during the cfg manipulations) should not appear in EXITS. */
2ef51f0e 249 hash_table<loop_exit_hasher> *GTY(()) exits;
dce58e66 250
862be747 251 /* Pointer to root of loop hierarchy tree. */
252 struct loop *tree_root;
862be747 253};
254
862be747 255/* Loop recognition. */
ff829efa 256bool bb_loop_header_p (basic_block);
7a569539 257void init_loops_structure (struct function *, struct loops *, unsigned);
ff829efa 258extern struct loops *flow_loops_find (struct loops *);
4a6f9e19 259extern void disambiguate_loops_with_multiple_latches (void);
4c9e08a4 260extern void flow_loops_free (struct loops *);
7194de72 261extern void flow_loops_dump (FILE *,
4c9e08a4 262 void (*)(const struct loop *, FILE *, int), int);
263extern void flow_loop_dump (const struct loop *, FILE *,
264 void (*)(const struct loop *, FILE *, int), int);
dce58e66 265struct loop *alloc_loop (void);
4c9e08a4 266extern void flow_loop_free (struct loop *);
053fdd99 267int flow_loop_nodes_find (basic_block, struct loop *);
b6f3c6f1 268unsigned fix_loop_structure (bitmap changed_bbs);
c9263b6a 269bool mark_irreducible_loops (void);
d4f078b5 270void release_recorded_exits (function *);
dce58e66 271void record_loop_exits (void);
272void rescan_loop_exit (edge, bool, bool);
862be747 273
917bbcab 274/* Loop data structure manipulation/querying. */
4c9e08a4 275extern void flow_loop_tree_node_add (struct loop *, struct loop *);
276extern void flow_loop_tree_node_remove (struct loop *);
4c9e08a4 277extern bool flow_loop_nested_p (const struct loop *, const struct loop *);
7ecb5bb2 278extern bool flow_bb_inside_loop_p (const struct loop *, const_basic_block);
4c9e08a4 279extern struct loop * find_common_loop (struct loop *, struct loop *);
7d23383d 280struct loop *superloop_at_depth (struct loop *, unsigned);
6dc50383 281struct eni_weights;
7ecb5bb2 282extern int num_loop_insns (const struct loop *);
283extern int average_num_loop_insns (const struct loop *);
2d49f824 284extern unsigned get_loop_level (const struct loop *);
7ecb5bb2 285extern bool loop_exit_edge_p (const struct loop *, const_edge);
259c0e44 286extern bool loop_exits_to_bb_p (struct loop *, basic_block);
287extern bool loop_exits_from_bb_p (struct loop *, basic_block);
7194de72 288extern void mark_loop_exit_edges (void);
f55775aa 289extern location_t get_loop_location (struct loop *loop);
862be747 290
291/* Loops & cfg manipulation. */
4c9e08a4 292extern basic_block *get_loop_body (const struct loop *);
4a6f9e19 293extern unsigned get_loop_body_with_size (const struct loop *, basic_block *,
294 unsigned);
f9cce2dc 295extern basic_block *get_loop_body_in_dom_order (const struct loop *);
07c03fb0 296extern basic_block *get_loop_body_in_bfs_order (const struct loop *);
48e1416a 297extern basic_block *get_loop_body_in_custom_order (const struct loop *,
e1ab7874 298 int (*) (const void *, const void *));
299
f1f41a6c 300extern vec<edge> get_loop_exit_edges (const struct loop *);
97fc8ad6 301extern edge single_exit (const struct loop *);
302extern edge single_likely_exit (struct loop *loop);
f9cce2dc 303extern unsigned num_loop_branches (const struct loop *);
862be747 304
4c9e08a4 305extern edge loop_preheader_edge (const struct loop *);
306extern edge loop_latch_edge (const struct loop *);
862be747 307
4c9e08a4 308extern void add_bb_to_loop (basic_block, struct loop *);
309extern void remove_bb_from_loops (basic_block);
862be747 310
7194de72 311extern void cancel_loop_tree (struct loop *);
17519ba0 312extern void delete_loop (struct loop *);
862be747 313
862be747 314
7194de72 315extern void verify_loop_structure (void);
862be747 316
382ecba7 317/* Check loop structure invariants, if internal consistency checks are
318 enabled. */
319
320static inline void
321checking_verify_loop_structure (void)
322{
323 if (flag_checking)
324 verify_loop_structure ();
325}
326
862be747 327/* Loop analysis. */
7ecb5bb2 328extern bool just_once_each_iteration_p (const struct loop *, const_basic_block);
d97e22fb 329gcov_type expected_loop_iterations_unbounded (const struct loop *);
4c9e08a4 330extern unsigned expected_loop_iterations (const struct loop *);
fc2abfd3 331extern rtx doloop_condition_get (rtx);
6a606e3c 332
d25159cc 333void mark_loop_for_removal (loop_p);
334
f9cce2dc 335/* Induction variable analysis. */
336
337/* The description of induction variable. The things are a bit complicated
338 due to need to handle subregs and extends. The value of the object described
339 by it can be obtained as follows (all computations are done in extend_mode):
340
341 Value in i-th iteration is
342 delta + mult * extend_{extend_mode} (subreg_{mode} (base + i * step)).
343
344 If first_special is true, the value in the first iteration is
345 delta + mult * base
a0c938f0 346
21f1e711 347 If extend = UNKNOWN, first_special must be false, delta 0, mult 1 and value is
f9cce2dc 348 subreg_{mode} (base + i * step)
349
350 The get_iv_value function can be used to obtain these expressions.
351
352 ??? Add a third mode field that would specify the mode in that inner
353 computation is done, which would enable it to be different from the
354 outer one? */
355
356struct rtx_iv
357{
358 /* Its base and step (mode of base and step is supposed to be extend_mode,
359 see the description above). */
360 rtx base, step;
361
aedb7bf8 362 /* The type of extend applied to it (IV_SIGN_EXTEND, IV_ZERO_EXTEND,
363 or IV_UNKNOWN_EXTEND). */
364 enum iv_extend_code extend;
f9cce2dc 365
366 /* Operations applied in the extended mode. */
367 rtx delta, mult;
368
369 /* The mode it is extended to. */
3754d046 370 machine_mode extend_mode;
f9cce2dc 371
372 /* The mode the variable iterates in. */
3754d046 373 machine_mode mode;
f9cce2dc 374
f9cce2dc 375 /* Whether the first iteration needs to be handled specially. */
376 unsigned first_special : 1;
377};
378
9c1ccc0f 379/* The description of an exit from the loop and of the number of iterations
380 till we take the exit. */
f9cce2dc 381
427286b3 382struct GTY(()) niter_desc
f9cce2dc 383{
384 /* The edge out of the loop. */
385 edge out_edge;
386
387 /* The other edge leading from the condition. */
388 edge in_edge;
389
390 /* True if we are able to say anything about number of iterations of the
391 loop. */
392 bool simple_p;
393
394 /* True if the loop iterates the constant number of times. */
395 bool const_iter;
396
397 /* Number of iterations if constant. */
3a4303e7 398 uint64_t niter;
f9cce2dc 399
f9cce2dc 400 /* Assumptions under that the rest of the information is valid. */
401 rtx assumptions;
402
403 /* Assumptions under that the loop ends before reaching the latch,
404 even if value of niter_expr says otherwise. */
405 rtx noloop_assumptions;
406
407 /* Condition under that the loop is infinite. */
408 rtx infinite;
409
410 /* Whether the comparison is signed. */
411 bool signed_p;
412
413 /* The mode in that niter_expr should be computed. */
3754d046 414 machine_mode mode;
f9cce2dc 415
416 /* The number of iterations of the loop. */
417 rtx niter_expr;
418};
419
420extern void iv_analysis_loop_init (struct loop *);
3eeb4f9a 421extern bool iv_analyze (rtx_insn *, rtx, struct rtx_iv *);
422extern bool iv_analyze_result (rtx_insn *, rtx, struct rtx_iv *);
3754d046 423extern bool iv_analyze_expr (rtx_insn *, rtx, machine_mode,
3eeb4f9a 424 struct rtx_iv *);
f9cce2dc 425extern rtx get_iv_value (struct rtx_iv *, rtx);
3eeb4f9a 426extern bool biv_p (rtx_insn *, rtx);
f9cce2dc 427extern void find_simple_exit (struct loop *, struct niter_desc *);
f9cce2dc 428extern void iv_analysis_done (void);
429
430extern struct niter_desc *get_simple_loop_desc (struct loop *loop);
431extern void free_simple_loop_desc (struct loop *loop);
432
433static inline struct niter_desc *
434simple_loop_desc (struct loop *loop)
435{
427286b3 436 return loop->simple_loop_desc;
f9cce2dc 437}
438
17519ba0 439/* Accessors for the loop structures. */
440
41f75a99 441/* Returns the loop with index NUM from FNs loop tree. */
17519ba0 442
443static inline struct loop *
41f75a99 444get_loop (struct function *fn, unsigned num)
17519ba0 445{
41f75a99 446 return (*loops_for_fn (fn)->larray)[num];
17519ba0 447}
448
9e3536f4 449/* Returns the number of superloops of LOOP. */
450
451static inline unsigned
452loop_depth (const struct loop *loop)
453{
f1f41a6c 454 return vec_safe_length (loop->superloops);
9e3536f4 455}
456
457/* Returns the immediate superloop of LOOP, or NULL if LOOP is the outermost
458 loop. */
459
460static inline struct loop *
461loop_outer (const struct loop *loop)
462{
f1f41a6c 463 unsigned n = vec_safe_length (loop->superloops);
9e3536f4 464
465 if (n == 0)
466 return NULL;
467
f1f41a6c 468 return (*loop->superloops)[n - 1];
9e3536f4 469}
470
a8d6ade3 471/* Returns true if LOOP has at least one exit edge. */
472
473static inline bool
474loop_has_exit_edges (const struct loop *loop)
475{
476 return loop->exits->next->e != NULL;
477}
478
41f75a99 479/* Returns the list of loops in FN. */
17519ba0 480
41f75a99 481inline vec<loop_p, va_gc> *
482get_loops (struct function *fn)
17519ba0 483{
41f75a99 484 struct loops *loops = loops_for_fn (fn);
485 if (!loops)
17519ba0 486 return NULL;
487
41f75a99 488 return loops->larray;
17519ba0 489}
490
41f75a99 491/* Returns the number of loops in FN (including the removed
17519ba0 492 ones and the fake loop that forms the root of the loop tree). */
493
494static inline unsigned
41f75a99 495number_of_loops (struct function *fn)
17519ba0 496{
41f75a99 497 struct loops *loops = loops_for_fn (fn);
de15b4bb 498 if (!loops)
17519ba0 499 return 0;
500
41f75a99 501 return vec_safe_length (loops->larray);
17519ba0 502}
503
f24ec26f 504/* Returns true if state of the loops satisfies all properties
505 described by FLAGS. */
506
d4f078b5 507static inline bool
508loops_state_satisfies_p (function *fn, unsigned flags)
509{
510 return (loops_for_fn (fn)->state & flags) == flags;
511}
512
f24ec26f 513static inline bool
514loops_state_satisfies_p (unsigned flags)
515{
d4f078b5 516 return loops_state_satisfies_p (cfun, flags);
f24ec26f 517}
518
519/* Sets FLAGS to the loops state. */
520
d4f078b5 521static inline void
522loops_state_set (function *fn, unsigned flags)
523{
524 loops_for_fn (fn)->state |= flags;
525}
526
f24ec26f 527static inline void
528loops_state_set (unsigned flags)
529{
d4f078b5 530 loops_state_set (cfun, flags);
f24ec26f 531}
532
533/* Clears FLAGS from the loops state. */
534
d4f078b5 535static inline void
536loops_state_clear (function *fn, unsigned flags)
537{
538 loops_for_fn (fn)->state &= ~flags;
539}
540
f24ec26f 541static inline void
542loops_state_clear (unsigned flags)
543{
544 if (!current_loops)
545 return;
d4f078b5 546 loops_state_clear (cfun, flags);
f24ec26f 547}
548
17519ba0 549/* Loop iterators. */
550
551/* Flags for loop iteration. */
552
553enum li_flags
554{
3bbbcdff 555 LI_INCLUDE_ROOT = 1, /* Include the fake root of the loop tree. */
556 LI_FROM_INNERMOST = 2, /* Iterate over the loops in the reverse order,
557 starting from innermost ones. */
558 LI_ONLY_INNERMOST = 4 /* Iterate only over innermost loops. */
17519ba0 559};
560
561/* The iterator for loops. */
562
f21d4d00 563struct loop_iterator
17519ba0 564{
d4f078b5 565 loop_iterator (function *fn, loop_p *loop, unsigned flags);
f21d4d00 566 ~loop_iterator ();
567
568 inline loop_p next ();
569
d4f078b5 570 /* The function we are visiting. */
571 function *fn;
572
3bbbcdff 573 /* The list of loops to visit. */
f1f41a6c 574 vec<int> to_visit;
3bbbcdff 575
576 /* The index of the actual loop. */
577 unsigned idx;
f21d4d00 578};
17519ba0 579
f21d4d00 580inline loop_p
581loop_iterator::next ()
17519ba0 582{
3bbbcdff 583 int anum;
584
f21d4d00 585 while (this->to_visit.iterate (this->idx, &anum))
17519ba0 586 {
f21d4d00 587 this->idx++;
d4f078b5 588 loop_p loop = get_loop (fn, anum);
f21d4d00 589 if (loop)
590 return loop;
17519ba0 591 }
592
f21d4d00 593 return NULL;
17519ba0 594}
595
f21d4d00 596inline
d4f078b5 597loop_iterator::loop_iterator (function *fn, loop_p *loop, unsigned flags)
17519ba0 598{
3bbbcdff 599 struct loop *aloop;
600 unsigned i;
601 int mn;
602
f21d4d00 603 this->idx = 0;
d4f078b5 604 this->fn = fn;
605 if (!loops_for_fn (fn))
17519ba0 606 {
f21d4d00 607 this->to_visit.create (0);
17519ba0 608 *loop = NULL;
609 return;
610 }
611
d4f078b5 612 this->to_visit.create (number_of_loops (fn));
3bbbcdff 613 mn = (flags & LI_INCLUDE_ROOT) ? 0 : 1;
614
615 if (flags & LI_ONLY_INNERMOST)
616 {
d4f078b5 617 for (i = 0; vec_safe_iterate (loops_for_fn (fn)->larray, i, &aloop); i++)
3bbbcdff 618 if (aloop != NULL
619 && aloop->inner == NULL
620 && aloop->num >= mn)
f21d4d00 621 this->to_visit.quick_push (aloop->num);
3bbbcdff 622 }
623 else if (flags & LI_FROM_INNERMOST)
17519ba0 624 {
3bbbcdff 625 /* Push the loops to LI->TO_VISIT in postorder. */
d4f078b5 626 for (aloop = loops_for_fn (fn)->tree_root;
3bbbcdff 627 aloop->inner != NULL;
628 aloop = aloop->inner)
629 continue;
630
631 while (1)
632 {
633 if (aloop->num >= mn)
f21d4d00 634 this->to_visit.quick_push (aloop->num);
3bbbcdff 635
636 if (aloop->next)
637 {
638 for (aloop = aloop->next;
639 aloop->inner != NULL;
640 aloop = aloop->inner)
641 continue;
642 }
9e3536f4 643 else if (!loop_outer (aloop))
3bbbcdff 644 break;
645 else
9e3536f4 646 aloop = loop_outer (aloop);
3bbbcdff 647 }
17519ba0 648 }
649 else
650 {
3bbbcdff 651 /* Push the loops to LI->TO_VISIT in preorder. */
d4f078b5 652 aloop = loops_for_fn (fn)->tree_root;
3bbbcdff 653 while (1)
654 {
655 if (aloop->num >= mn)
f21d4d00 656 this->to_visit.quick_push (aloop->num);
3bbbcdff 657
658 if (aloop->inner != NULL)
659 aloop = aloop->inner;
660 else
661 {
662 while (aloop != NULL && aloop->next == NULL)
9e3536f4 663 aloop = loop_outer (aloop);
3bbbcdff 664 if (aloop == NULL)
665 break;
666 aloop = aloop->next;
667 }
668 }
17519ba0 669 }
3bbbcdff 670
f21d4d00 671 *loop = this->next ();
17519ba0 672}
673
f21d4d00 674inline
675loop_iterator::~loop_iterator ()
676{
677 this->to_visit.release ();
678}
3bbbcdff 679
f21d4d00 680#define FOR_EACH_LOOP(LOOP, FLAGS) \
d4f078b5 681 for (loop_iterator li(cfun, &(LOOP), FLAGS); \
682 (LOOP); \
683 (LOOP) = li.next ())
684
685#define FOR_EACH_LOOP_FN(FN, LOOP, FLAGS) \
686 for (loop_iterator li(fn, &(LOOP), FLAGS); \
f21d4d00 687 (LOOP); \
688 (LOOP) = li.next ())
17519ba0 689
dec41e98 690/* The properties of the target. */
e8aa5a28 691struct target_cfgloop {
692 /* Number of available registers. */
693 unsigned x_target_avail_regs;
dec41e98 694
e8aa5a28 695 /* Number of available registers that are call-clobbered. */
696 unsigned x_target_clobbered_regs;
697
698 /* Number of registers reserved for temporary expressions. */
699 unsigned x_target_res_regs;
700
701 /* The cost for register when there still is some reserve, but we are
702 approaching the number of available registers. */
703 unsigned x_target_reg_cost[2];
704
705 /* The cost for register when we need to spill. */
706 unsigned x_target_spill_cost[2];
707};
708
709extern struct target_cfgloop default_target_cfgloop;
710#if SWITCHABLE_TARGET
711extern struct target_cfgloop *this_target_cfgloop;
712#else
713#define this_target_cfgloop (&default_target_cfgloop)
714#endif
715
716#define target_avail_regs \
717 (this_target_cfgloop->x_target_avail_regs)
718#define target_clobbered_regs \
719 (this_target_cfgloop->x_target_clobbered_regs)
720#define target_res_regs \
721 (this_target_cfgloop->x_target_res_regs)
722#define target_reg_cost \
723 (this_target_cfgloop->x_target_reg_cost)
724#define target_spill_cost \
725 (this_target_cfgloop->x_target_spill_cost)
dec41e98 726
3a0ecac2 727/* Register pressure estimation for induction variable optimizations & loop
728 invariant motion. */
a6b74a67 729extern unsigned estimate_reg_pressure_cost (unsigned, unsigned, bool, bool);
3a0ecac2 730extern void init_set_costs (void);
731
6a606e3c 732/* Loop optimizer initialization. */
88e6f696 733extern void loop_optimizer_init (unsigned);
d4f078b5 734extern void loop_optimizer_finalize (function *);
735inline void
736loop_optimizer_finalize ()
737{
738 loop_optimizer_finalize (cfun);
739}
6a606e3c 740
741/* Optimization passes. */
ce32fe65 742enum
743{
c836de3f 744 UAP_UNROLL = 1, /* Enables unrolling of loops if it seems profitable. */
745 UAP_UNROLL_ALL = 2 /* Enables unrolling of all loops. */
ce32fe65 746};
747
7194de72 748extern void doloop_optimize_loops (void);
749extern void move_loop_invariants (void);
f1f41a6c 750extern vec<basic_block> get_loop_hot_path (const struct loop *loop);
bcf3c70d 751
7b64e7e0 752/* Returns the outermost loop of the loop nest that contains LOOP.*/
753static inline struct loop *
754loop_outermost (struct loop *loop)
755{
f1f41a6c 756 unsigned n = vec_safe_length (loop->superloops);
7b64e7e0 757
758 if (n <= 1)
759 return loop;
760
f1f41a6c 761 return (*loop->superloops)[1];
7b64e7e0 762}
763
5de9d3ed 764extern void record_niter_bound (struct loop *, const widest_int &, bool, bool);
4e948f5a 765extern HOST_WIDE_INT get_estimated_loop_iterations_int (struct loop *);
766extern HOST_WIDE_INT get_max_loop_iterations_int (struct loop *);
5de9d3ed 767extern bool get_estimated_loop_iterations (struct loop *loop, widest_int *nit);
768extern bool get_max_loop_iterations (struct loop *loop, widest_int *nit);
424a4a92 769extern int bb_loop_depth (const_basic_block);
7b64e7e0 770
5de9d3ed 771/* Converts VAL to widest_int. */
f86b328b 772
5de9d3ed 773static inline widest_int
6b409616 774gcov_type_to_wide_int (gcov_type val)
f86b328b 775{
6b409616 776 HOST_WIDE_INT a[2];
f86b328b 777
6b409616 778 a[0] = (unsigned HOST_WIDE_INT) val;
f86b328b 779 /* If HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_WIDEST_INT, avoid shifting by
780 the size of type. */
781 val >>= HOST_BITS_PER_WIDE_INT - 1;
782 val >>= 1;
6b409616 783 a[1] = (unsigned HOST_WIDE_INT) val;
f86b328b 784
5de9d3ed 785 return widest_int::from_array (a, 2);
f86b328b 786}
bcf3c70d 787#endif /* GCC_CFGLOOP_H */