]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/cfgloop.h
predict.c (probably_never_executed): Compare frequency-based count to number of train...
[thirdparty/gcc.git] / gcc / cfgloop.h
CommitLineData
3d436d2a 1/* Natural loop functions
d1e082c2 2 Copyright (C) 1987-2013 Free Software Foundation, Inc.
3d436d2a
ZD
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
9dcd6f09 8Software Foundation; either version 3, or (at your option) any later
3d436d2a
ZD
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
9dcd6f09
NC
17along with GCC; see the file COPYING3. If not see
18<http://www.gnu.org/licenses/>. */
3d436d2a 19
59587b18
JQ
20#ifndef GCC_CFGLOOP_H
21#define GCC_CFGLOOP_H
22
23#include "basic-block.h"
df582833 24#include "double-int.h"
59587b18 25
7a8cba34
SB
26#include "bitmap.h"
27#include "sbitmap.h"
28
3d436d2a
ZD
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
d1b38208 40struct GTY (()) lpt_decision {
3d436d2a
ZD
41 enum lpt_dec decision;
42 unsigned times;
43};
44
1c1ad7bb
SB
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
86df10e3
SP
53/* The structure describing a bound on number of iterations of a loop. */
54
d1b38208 55struct GTY ((chain_next ("%h.next"))) nb_iter_bound {
946e1bc7 56 /* The statement STMT is executed at most ... */
726a989a 57 gimple stmt;
946e1bc7
ZD
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. */
66 double_int bound;
67
b8698a0f 68 /* True if the statement will cause the loop to be leaved the (at most)
946e1bc7
ZD
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
946e1bc7 73 /* The next bound in the list. */
86df10e3 74 struct nb_iter_bound *next;
86df10e3
SP
75};
76
6270df4c
ZD
77/* Description of the loop exit. */
78
d1b38208 79struct GTY (()) loop_exit {
6270df4c 80 /* The exit edge. */
b8244d74 81 edge e;
6270df4c
ZD
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
9ba025a2 91typedef struct loop *loop_p;
9ba025a2 92
ae50c0cb
TN
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. */
dd366ec3
RB
100 EST_AVAILABLE,
101 EST_LAST
ae50c0cb
TN
102};
103
3d436d2a 104/* Structure to hold information for each natural loop. */
d1b38208 105struct GTY ((chain_next ("%h.next"))) loop {
3d436d2a
ZD
106 /* Index into loops array. */
107 int num;
108
8f5929e1
JJ
109 /* Number of loop insns. */
110 unsigned ninsns;
111
3d436d2a 112 /* Basic block of loop header. */
b8244d74 113 basic_block header;
3d436d2a
ZD
114
115 /* Basic block of loop latch. */
b8244d74 116 basic_block latch;
3d436d2a 117
3d436d2a
ZD
118 /* For loop unrolling/peeling decision. */
119 struct lpt_decision lpt_decision;
120
3d436d2a
ZD
121 /* Average number of executed insns per iteration. */
122 unsigned av_ninsns;
123
3d436d2a
ZD
124 /* Number of blocks contained within the loop. */
125 unsigned num_nodes;
126
9ba025a2 127 /* Superloops of the loop, starting with the outermost loop. */
9771b263 128 vec<loop_p, va_gc> *superloops;
3d436d2a
ZD
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
3d436d2a 136 /* Auxiliary info specific to a pass. */
9e2f83a5 137 PTR GTY ((skip (""))) aux;
3d436d2a 138
0a74c758
SP
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. */
9baba81b
SP
146 tree nb_iterations;
147
b4a9343c
ZD
148 /* An integer guaranteed to be greater or equal to nb_iterations. Only
149 valid if any_upper_bound is true. */
9bdb685e
ZD
150 double_int nb_iterations_upper_bound;
151
b4a9343c
ZD
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. */
9bdb685e 155 double_int nb_iterations_estimate;
86df10e3 156
8f5929e1
JJ
157 bool any_upper_bound;
158 bool any_estimate;
159
448f65db
NF
160 /* True if the loop can be parallel. */
161 bool can_be_parallel;
162
fbd28bc3
JJ
163 /* True if -Waggressive-loop-optimizations warned about this loop
164 already. */
165 bool warned_aggressive_loop_optimizations;
166
8f5929e1
JJ
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
74bf76ed
JJ
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
177 /* True if we should try harder to vectorize this loop. */
178 bool force_vect;
179
180 /* For SIMD loops, this is a unique identifier of the loop, referenced
181 by IFN_GOMP_SIMD_VF, IFN_GOMP_SIMD_LANE and IFN_GOMP_SIMD_LAST_LANE
182 builtins. */
183 tree simduid;
184
e9eb809d
ZD
185 /* Upper bound on number of iterations of a loop. */
186 struct nb_iter_bound *bounds;
82b85a85 187
6270df4c 188 /* Head of the cyclic list of the exits of the loop. */
9e2f83a5 189 struct loop_exit *exits;
ef23e6a2
RB
190
191 /* Number of iteration analysis data for RTL. */
192 struct niter_desc *simple_loop_desc;
3d436d2a
ZD
193};
194
195/* Flags for state of loop structure. */
196enum
197{
198 LOOPS_HAVE_PREHEADERS = 1,
199 LOOPS_HAVE_SIMPLE_LATCHES = 2,
82b85a85 200 LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS = 4,
89f8f30f 201 LOOPS_HAVE_RECORDED_EXITS = 8,
c7b852c8 202 LOOPS_MAY_HAVE_MULTIPLE_LATCHES = 16,
592c303d 203 LOOP_CLOSED_SSA = 32,
e855c69d
AB
204 LOOPS_NEED_FIXUP = 64,
205 LOOPS_HAVE_FALLTHRU_PREHEADERS = 128
3d436d2a
ZD
206};
207
d78f3f78
ZD
208#define LOOPS_NORMAL (LOOPS_HAVE_PREHEADERS | LOOPS_HAVE_SIMPLE_LATCHES \
209 | LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS)
89f8f30f 210#define AVOID_CFG_MODIFICATIONS (LOOPS_MAY_HAVE_MULTIPLE_LATCHES)
d78f3f78 211
3d436d2a 212/* Structure to hold CFG information about natural loops within a function. */
d1b38208 213struct GTY (()) loops {
0162f155
RG
214 /* State of loops. */
215 int state;
3d436d2a 216
42fd6772 217 /* Array of the loops. */
9771b263 218 vec<loop_p, va_gc> *larray;
3d436d2a 219
6270df4c
ZD
220 /* Maps edges to the list of their descriptions as loop exits. Edges
221 whose sources or destinations have loop_father == NULL (which may
222 happen during the cfg manipulations) should not appear in EXITS. */
9e2f83a5 223 htab_t GTY((param_is (struct loop_exit))) exits;
6270df4c 224
3d436d2a
ZD
225 /* Pointer to root of loop hierarchy tree. */
226 struct loop *tree_root;
3d436d2a
ZD
227};
228
3d436d2a 229/* Loop recognition. */
0375167b 230bool bb_loop_header_p (basic_block);
dd366ec3 231void init_loops_structure (struct function *, struct loops *, unsigned);
0375167b 232extern struct loops *flow_loops_find (struct loops *);
89f8f30f 233extern void disambiguate_loops_with_multiple_latches (void);
d329e058 234extern void flow_loops_free (struct loops *);
d73be268 235extern void flow_loops_dump (FILE *,
d329e058
AJ
236 void (*)(const struct loop *, FILE *, int), int);
237extern void flow_loop_dump (const struct loop *, FILE *,
238 void (*)(const struct loop *, FILE *, int), int);
6270df4c 239struct loop *alloc_loop (void);
d329e058 240extern void flow_loop_free (struct loop *);
2b271002 241int flow_loop_nodes_find (basic_block, struct loop *);
8e89b5b5 242unsigned fix_loop_structure (bitmap changed_bbs);
2de58650 243bool mark_irreducible_loops (void);
6270df4c
ZD
244void release_recorded_exits (void);
245void record_loop_exits (void);
246void rescan_loop_exit (edge, bool, bool);
3d436d2a 247
4d6922ee 248/* Loop data structure manipulation/querying. */
d329e058
AJ
249extern void flow_loop_tree_node_add (struct loop *, struct loop *);
250extern void flow_loop_tree_node_remove (struct loop *);
0fc822d0 251extern void place_new_loop (struct function *, struct loop *);
89f8f30f 252extern void add_loop (struct loop *, struct loop *);
d329e058 253extern bool flow_loop_nested_p (const struct loop *, const struct loop *);
ed7a4b4b 254extern bool flow_bb_inside_loop_p (const struct loop *, const_basic_block);
d329e058 255extern struct loop * find_common_loop (struct loop *, struct loop *);
a7e5372d 256struct loop *superloop_at_depth (struct loop *, unsigned);
7f9bc51b 257struct eni_weights_d;
ed7a4b4b
KG
258extern int num_loop_insns (const struct loop *);
259extern int average_num_loop_insns (const struct loop *);
689ba89d 260extern unsigned get_loop_level (const struct loop *);
ed7a4b4b 261extern bool loop_exit_edge_p (const struct loop *, const_edge);
f4ce375d
VK
262extern bool loop_exits_to_bb_p (struct loop *, basic_block);
263extern bool loop_exits_from_bb_p (struct loop *, basic_block);
d73be268 264extern void mark_loop_exit_edges (void);
e25a6711 265extern location_t get_loop_location (struct loop *loop);
3d436d2a
ZD
266
267/* Loops & cfg manipulation. */
d329e058 268extern basic_block *get_loop_body (const struct loop *);
89f8f30f
ZD
269extern unsigned get_loop_body_with_size (const struct loop *, basic_block *,
270 unsigned);
50654f6c 271extern basic_block *get_loop_body_in_dom_order (const struct loop *);
40923b20 272extern basic_block *get_loop_body_in_bfs_order (const struct loop *);
b8698a0f 273extern basic_block *get_loop_body_in_custom_order (const struct loop *,
e855c69d
AB
274 int (*) (const void *, const void *));
275
9771b263 276extern vec<edge> get_loop_exit_edges (const struct loop *);
6d96bad2
JH
277extern edge single_exit (const struct loop *);
278extern edge single_likely_exit (struct loop *loop);
50654f6c 279extern unsigned num_loop_branches (const struct loop *);
3d436d2a 280
d329e058
AJ
281extern edge loop_preheader_edge (const struct loop *);
282extern edge loop_latch_edge (const struct loop *);
3d436d2a 283
d329e058
AJ
284extern void add_bb_to_loop (basic_block, struct loop *);
285extern void remove_bb_from_loops (basic_block);
3d436d2a 286
d73be268 287extern void cancel_loop_tree (struct loop *);
42fd6772 288extern void delete_loop (struct loop *);
3d436d2a 289
3d436d2a
ZD
290enum
291{
e855c69d
AB
292 CP_SIMPLE_PREHEADERS = 1,
293 CP_FALLTHRU_PREHEADERS = 2
3d436d2a
ZD
294};
295
b02b9b53 296basic_block create_preheader (struct loop *, int);
d73be268
ZD
297extern void create_preheaders (int);
298extern void force_single_succ_latches (void);
3d436d2a 299
d73be268 300extern void verify_loop_structure (void);
3d436d2a
ZD
301
302/* Loop analysis. */
ed7a4b4b 303extern bool just_once_each_iteration_p (const struct loop *, const_basic_block);
ac84e05e 304gcov_type expected_loop_iterations_unbounded (const struct loop *);
d329e058 305extern unsigned expected_loop_iterations (const struct loop *);
75c70254 306extern rtx doloop_condition_get (rtx);
617b465c 307
4839cb59 308
617b465c 309/* Loop manipulation. */
ed7a4b4b 310extern bool can_duplicate_loop_p (const struct loop *loop);
617b465c
ZD
311
312#define DLTHE_FLAG_UPDATE_FREQ 1 /* Update frequencies in
313 duplicate_loop_to_header_edge. */
7f7b1718
JH
314#define DLTHE_RECORD_COPY_NUMBER 2 /* Record copy number in the aux
315 field of newly create BB. */
178df94f 316#define DLTHE_FLAG_COMPLETTE_PEEL 4 /* Update frequencies expecting
a4d05547 317 a complete peeling. */
617b465c 318
f8bf9252
SP
319extern edge create_empty_if_region_on_edge (edge, tree);
320extern struct loop *create_empty_loop_on_edge (edge, tree, tree, tree, tree,
8e74b397 321 tree *, tree *, struct loop *);
d73be268 322extern struct loop * duplicate_loop (struct loop *, struct loop *);
bf45c4c0 323extern void copy_loop_info (struct loop *loop, struct loop *target);
48710229 324extern void duplicate_subloops (struct loop *, struct loop *);
b8698a0f 325extern bool duplicate_loop_to_header_edge (struct loop *, edge,
ee8c1b05 326 unsigned, sbitmap, edge,
9771b263 327 vec<edge> *, int);
d73be268 328extern struct loop *loopify (edge, edge,
03cb2019
ZD
329 basic_block, edge, edge, bool,
330 unsigned, unsigned);
d73be268 331struct loop * loop_version (struct loop *, void *,
03cb2019 332 basic_block *, unsigned, unsigned, unsigned, bool);
d73be268 333extern bool remove_path (edge);
1a7de201 334extern void unloop (struct loop *, bool *, bitmap);
b7442c2f 335extern void scale_loop_frequencies (struct loop *, int, int);
617b465c 336
50654f6c
ZD
337/* Induction variable analysis. */
338
339/* The description of induction variable. The things are a bit complicated
340 due to need to handle subregs and extends. The value of the object described
341 by it can be obtained as follows (all computations are done in extend_mode):
342
343 Value in i-th iteration is
344 delta + mult * extend_{extend_mode} (subreg_{mode} (base + i * step)).
345
346 If first_special is true, the value in the first iteration is
347 delta + mult * base
c22cacf3 348
f822d252 349 If extend = UNKNOWN, first_special must be false, delta 0, mult 1 and value is
50654f6c
ZD
350 subreg_{mode} (base + i * step)
351
352 The get_iv_value function can be used to obtain these expressions.
353
354 ??? Add a third mode field that would specify the mode in that inner
355 computation is done, which would enable it to be different from the
356 outer one? */
357
358struct rtx_iv
359{
360 /* Its base and step (mode of base and step is supposed to be extend_mode,
361 see the description above). */
362 rtx base, step;
363
1c1ad7bb
SB
364 /* The type of extend applied to it (IV_SIGN_EXTEND, IV_ZERO_EXTEND,
365 or IV_UNKNOWN_EXTEND). */
366 enum iv_extend_code extend;
50654f6c
ZD
367
368 /* Operations applied in the extended mode. */
369 rtx delta, mult;
370
371 /* The mode it is extended to. */
372 enum machine_mode extend_mode;
373
374 /* The mode the variable iterates in. */
375 enum machine_mode mode;
376
50654f6c
ZD
377 /* Whether the first iteration needs to be handled specially. */
378 unsigned first_special : 1;
379};
380
f2dca510
ZD
381/* The description of an exit from the loop and of the number of iterations
382 till we take the exit. */
50654f6c 383
ef23e6a2 384struct GTY(()) niter_desc
50654f6c
ZD
385{
386 /* The edge out of the loop. */
387 edge out_edge;
388
389 /* The other edge leading from the condition. */
390 edge in_edge;
391
392 /* True if we are able to say anything about number of iterations of the
393 loop. */
394 bool simple_p;
395
396 /* True if the loop iterates the constant number of times. */
397 bool const_iter;
398
399 /* Number of iterations if constant. */
400 unsigned HOST_WIDEST_INT niter;
401
50654f6c
ZD
402 /* Assumptions under that the rest of the information is valid. */
403 rtx assumptions;
404
405 /* Assumptions under that the loop ends before reaching the latch,
406 even if value of niter_expr says otherwise. */
407 rtx noloop_assumptions;
408
409 /* Condition under that the loop is infinite. */
410 rtx infinite;
411
412 /* Whether the comparison is signed. */
413 bool signed_p;
414
415 /* The mode in that niter_expr should be computed. */
416 enum machine_mode mode;
417
418 /* The number of iterations of the loop. */
419 rtx niter_expr;
420};
421
422extern void iv_analysis_loop_init (struct loop *);
6d4e0ecc 423extern bool iv_analyze (rtx, rtx, struct rtx_iv *);
03fd2215
ZD
424extern bool iv_analyze_result (rtx, rtx, struct rtx_iv *);
425extern bool iv_analyze_expr (rtx, rtx, enum machine_mode, struct rtx_iv *);
50654f6c 426extern rtx get_iv_value (struct rtx_iv *, rtx);
113d659a 427extern bool biv_p (rtx, rtx);
50654f6c 428extern void find_simple_exit (struct loop *, struct niter_desc *);
50654f6c
ZD
429extern void iv_analysis_done (void);
430
431extern struct niter_desc *get_simple_loop_desc (struct loop *loop);
432extern void free_simple_loop_desc (struct loop *loop);
433
434static inline struct niter_desc *
435simple_loop_desc (struct loop *loop)
436{
ef23e6a2 437 return loop->simple_loop_desc;
50654f6c
ZD
438}
439
42fd6772
ZD
440/* Accessors for the loop structures. */
441
0fc822d0 442/* Returns the loop with index NUM from FNs loop tree. */
42fd6772
ZD
443
444static inline struct loop *
0fc822d0 445get_loop (struct function *fn, unsigned num)
42fd6772 446{
0fc822d0 447 return (*loops_for_fn (fn)->larray)[num];
42fd6772
ZD
448}
449
9ba025a2
ZD
450/* Returns the number of superloops of LOOP. */
451
452static inline unsigned
453loop_depth (const struct loop *loop)
454{
9771b263 455 return vec_safe_length (loop->superloops);
9ba025a2
ZD
456}
457
391886c8
RG
458/* Returns the loop depth of the loop BB belongs to. */
459
460static inline int
461bb_loop_depth (const_basic_block bb)
462{
463 return bb->loop_father ? loop_depth (bb->loop_father) : 0;
464}
465
9ba025a2
ZD
466/* Returns the immediate superloop of LOOP, or NULL if LOOP is the outermost
467 loop. */
468
469static inline struct loop *
470loop_outer (const struct loop *loop)
471{
9771b263 472 unsigned n = vec_safe_length (loop->superloops);
9ba025a2
ZD
473
474 if (n == 0)
475 return NULL;
476
9771b263 477 return (*loop->superloops)[n - 1];
9ba025a2
ZD
478}
479
07643d76
AM
480/* Returns true if LOOP has at least one exit edge. */
481
482static inline bool
483loop_has_exit_edges (const struct loop *loop)
484{
485 return loop->exits->next->e != NULL;
486}
487
0fc822d0 488/* Returns the list of loops in FN. */
42fd6772 489
0fc822d0
RB
490inline vec<loop_p, va_gc> *
491get_loops (struct function *fn)
42fd6772 492{
0fc822d0
RB
493 struct loops *loops = loops_for_fn (fn);
494 if (!loops)
42fd6772
ZD
495 return NULL;
496
0fc822d0 497 return loops->larray;
42fd6772
ZD
498}
499
0fc822d0 500/* Returns the number of loops in FN (including the removed
42fd6772
ZD
501 ones and the fake loop that forms the root of the loop tree). */
502
503static inline unsigned
0fc822d0 504number_of_loops (struct function *fn)
42fd6772 505{
0fc822d0 506 struct loops *loops = loops_for_fn (fn);
0d0e2af6 507 if (!loops)
42fd6772
ZD
508 return 0;
509
0fc822d0 510 return vec_safe_length (loops->larray);
42fd6772
ZD
511}
512
f87000d0
ZD
513/* Returns true if state of the loops satisfies all properties
514 described by FLAGS. */
515
516static inline bool
517loops_state_satisfies_p (unsigned flags)
518{
519 return (current_loops->state & flags) == flags;
520}
521
522/* Sets FLAGS to the loops state. */
523
524static inline void
525loops_state_set (unsigned flags)
526{
527 current_loops->state |= flags;
528}
529
530/* Clears FLAGS from the loops state. */
531
532static inline void
533loops_state_clear (unsigned flags)
534{
535 if (!current_loops)
536 return;
537 current_loops->state &= ~flags;
538}
539
42fd6772
ZD
540/* Loop iterators. */
541
542/* Flags for loop iteration. */
543
544enum li_flags
545{
677cc14d
ZD
546 LI_INCLUDE_ROOT = 1, /* Include the fake root of the loop tree. */
547 LI_FROM_INNERMOST = 2, /* Iterate over the loops in the reverse order,
548 starting from innermost ones. */
549 LI_ONLY_INNERMOST = 4 /* Iterate only over innermost loops. */
42fd6772
ZD
550};
551
552/* The iterator for loops. */
553
554typedef struct
555{
677cc14d 556 /* The list of loops to visit. */
9771b263 557 vec<int> to_visit;
677cc14d
ZD
558
559 /* The index of the actual loop. */
560 unsigned idx;
42fd6772
ZD
561} loop_iterator;
562
563static inline void
677cc14d 564fel_next (loop_iterator *li, loop_p *loop)
42fd6772 565{
677cc14d
ZD
566 int anum;
567
9771b263 568 while (li->to_visit.iterate (li->idx, &anum))
42fd6772 569 {
42fd6772 570 li->idx++;
0fc822d0 571 *loop = get_loop (cfun, anum);
677cc14d
ZD
572 if (*loop)
573 return;
42fd6772
ZD
574 }
575
9771b263 576 li->to_visit.release ();
42fd6772
ZD
577 *loop = NULL;
578}
579
580static inline void
581fel_init (loop_iterator *li, loop_p *loop, unsigned flags)
582{
677cc14d
ZD
583 struct loop *aloop;
584 unsigned i;
585 int mn;
586
587 li->idx = 0;
42fd6772
ZD
588 if (!current_loops)
589 {
9771b263 590 li->to_visit.create (0);
42fd6772
ZD
591 *loop = NULL;
592 return;
593 }
594
0fc822d0 595 li->to_visit.create (number_of_loops (cfun));
677cc14d
ZD
596 mn = (flags & LI_INCLUDE_ROOT) ? 0 : 1;
597
598 if (flags & LI_ONLY_INNERMOST)
599 {
9771b263 600 for (i = 0; vec_safe_iterate (current_loops->larray, i, &aloop); i++)
677cc14d
ZD
601 if (aloop != NULL
602 && aloop->inner == NULL
603 && aloop->num >= mn)
9771b263 604 li->to_visit.quick_push (aloop->num);
677cc14d
ZD
605 }
606 else if (flags & LI_FROM_INNERMOST)
42fd6772 607 {
677cc14d
ZD
608 /* Push the loops to LI->TO_VISIT in postorder. */
609 for (aloop = current_loops->tree_root;
610 aloop->inner != NULL;
611 aloop = aloop->inner)
612 continue;
613
614 while (1)
615 {
616 if (aloop->num >= mn)
9771b263 617 li->to_visit.quick_push (aloop->num);
677cc14d
ZD
618
619 if (aloop->next)
620 {
621 for (aloop = aloop->next;
622 aloop->inner != NULL;
623 aloop = aloop->inner)
624 continue;
625 }
9ba025a2 626 else if (!loop_outer (aloop))
677cc14d
ZD
627 break;
628 else
9ba025a2 629 aloop = loop_outer (aloop);
677cc14d 630 }
42fd6772
ZD
631 }
632 else
633 {
677cc14d
ZD
634 /* Push the loops to LI->TO_VISIT in preorder. */
635 aloop = current_loops->tree_root;
636 while (1)
637 {
638 if (aloop->num >= mn)
9771b263 639 li->to_visit.quick_push (aloop->num);
677cc14d
ZD
640
641 if (aloop->inner != NULL)
642 aloop = aloop->inner;
643 else
644 {
645 while (aloop != NULL && aloop->next == NULL)
9ba025a2 646 aloop = loop_outer (aloop);
677cc14d
ZD
647 if (aloop == NULL)
648 break;
649 aloop = aloop->next;
650 }
651 }
42fd6772 652 }
677cc14d
ZD
653
654 fel_next (li, loop);
42fd6772
ZD
655}
656
657#define FOR_EACH_LOOP(LI, LOOP, FLAGS) \
658 for (fel_init (&(LI), &(LOOP), FLAGS); \
659 (LOOP); \
677cc14d
ZD
660 fel_next (&(LI), &(LOOP)))
661
662#define FOR_EACH_LOOP_BREAK(LI) \
663 { \
9771b263 664 (LI).to_visit.release (); \
677cc14d
ZD
665 break; \
666 }
42fd6772 667
8b11a64c 668/* The properties of the target. */
4391924a
RS
669struct target_cfgloop {
670 /* Number of available registers. */
671 unsigned x_target_avail_regs;
8b11a64c 672
4391924a
RS
673 /* Number of available registers that are call-clobbered. */
674 unsigned x_target_clobbered_regs;
675
676 /* Number of registers reserved for temporary expressions. */
677 unsigned x_target_res_regs;
678
679 /* The cost for register when there still is some reserve, but we are
680 approaching the number of available registers. */
681 unsigned x_target_reg_cost[2];
682
683 /* The cost for register when we need to spill. */
684 unsigned x_target_spill_cost[2];
685};
686
687extern struct target_cfgloop default_target_cfgloop;
688#if SWITCHABLE_TARGET
689extern struct target_cfgloop *this_target_cfgloop;
690#else
691#define this_target_cfgloop (&default_target_cfgloop)
692#endif
693
694#define target_avail_regs \
695 (this_target_cfgloop->x_target_avail_regs)
696#define target_clobbered_regs \
697 (this_target_cfgloop->x_target_clobbered_regs)
698#define target_res_regs \
699 (this_target_cfgloop->x_target_res_regs)
700#define target_reg_cost \
701 (this_target_cfgloop->x_target_reg_cost)
702#define target_spill_cost \
703 (this_target_cfgloop->x_target_spill_cost)
8b11a64c 704
5e962776
ZD
705/* Register pressure estimation for induction variable optimizations & loop
706 invariant motion. */
bec922f0 707extern unsigned estimate_reg_pressure_cost (unsigned, unsigned, bool, bool);
5e962776
ZD
708extern void init_set_costs (void);
709
617b465c 710/* Loop optimizer initialization. */
598ec7bd
ZD
711extern void loop_optimizer_init (unsigned);
712extern void loop_optimizer_finalize (void);
617b465c
ZD
713
714/* Optimization passes. */
d73be268 715extern void unswitch_loops (void);
617b465c 716
b17d5d7c
ZD
717enum
718{
719 UAP_PEEL = 1, /* Enables loop peeling. */
598ec7bd
ZD
720 UAP_UNROLL = 2, /* Enables unrolling of loops if it seems profitable. */
721 UAP_UNROLL_ALL = 4 /* Enables unrolling of all loops. */
b17d5d7c
ZD
722};
723
d73be268
ZD
724extern void unroll_and_peel_loops (int);
725extern void doloop_optimize_loops (void);
726extern void move_loop_invariants (void);
7770c9e9 727extern void scale_loop_profile (struct loop *loop, int scale, gcov_type iteration_bound);
9771b263 728extern vec<basic_block> get_loop_hot_path (const struct loop *loop);
59587b18 729
a5497b12
VK
730/* Returns the outermost loop of the loop nest that contains LOOP.*/
731static inline struct loop *
732loop_outermost (struct loop *loop)
733{
9771b263 734 unsigned n = vec_safe_length (loop->superloops);
a5497b12
VK
735
736 if (n <= 1)
737 return loop;
738
9771b263 739 return (*loop->superloops)[1];
a5497b12
VK
740}
741
71343877 742extern void record_niter_bound (struct loop *, double_int, bool, bool);
1ef88893
AM
743extern HOST_WIDE_INT get_estimated_loop_iterations_int (struct loop *);
744extern HOST_WIDE_INT get_max_loop_iterations_int (struct loop *);
71343877
AM
745extern bool get_estimated_loop_iterations (struct loop *loop, double_int *nit);
746extern bool get_max_loop_iterations (struct loop *loop, double_int *nit);
a5497b12 747
71343877
AM
748/* Converts VAL to double_int. */
749
750static inline double_int
751gcov_type_to_double_int (gcov_type val)
752{
753 double_int ret;
754
755 ret.low = (unsigned HOST_WIDE_INT) val;
756 /* If HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_WIDEST_INT, avoid shifting by
757 the size of type. */
758 val >>= HOST_BITS_PER_WIDE_INT - 1;
759 val >>= 1;
760 ret.high = (unsigned HOST_WIDE_INT) val;
761
762 return ret;
763}
59587b18 764#endif /* GCC_CFGLOOP_H */