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