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