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