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