]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/cfgloop.h
Implement late-specified return type using 'auto'.
[thirdparty/gcc.git] / gcc / cfgloop.h
CommitLineData
3d436d2a 1/* Natural loop functions
6fb5fa3c 2 Copyright (C) 1987, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
9dcd6f09 3 2005, 2006, 2007 Free Software Foundation, Inc.
3d436d2a
ZD
4
5This file is part of GCC.
6
7GCC is free software; you can redistribute it and/or modify it under
8the terms of the GNU General Public License as published by the Free
9dcd6f09 9Software Foundation; either version 3, or (at your option) any later
3d436d2a
ZD
10version.
11
12GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13WARRANTY; without even the implied warranty of MERCHANTABILITY or
14FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15for more details.
16
17You should have received a copy of the GNU General Public License
9dcd6f09
NC
18along with GCC; see the file COPYING3. If not see
19<http://www.gnu.org/licenses/>. */
3d436d2a 20
59587b18
JQ
21#ifndef GCC_CFGLOOP_H
22#define GCC_CFGLOOP_H
23
24#include "basic-block.h"
25/* For rtx_code. */
26#include "rtl.h"
677cc14d 27#include "vecprim.h"
df582833 28#include "double-int.h"
59587b18 29
3d436d2a
ZD
30/* Structure to hold decision about unrolling/peeling. */
31enum lpt_dec
32{
33 LPT_NONE,
34 LPT_PEEL_COMPLETELY,
35 LPT_PEEL_SIMPLE,
36 LPT_UNROLL_CONSTANT,
37 LPT_UNROLL_RUNTIME,
38 LPT_UNROLL_STUPID
39};
40
9e2f83a5 41struct lpt_decision GTY (())
3d436d2a
ZD
42{
43 enum lpt_dec decision;
44 unsigned times;
45};
46
86df10e3
SP
47/* The structure describing a bound on number of iterations of a loop. */
48
9e2f83a5 49struct nb_iter_bound GTY ((chain_next ("%h.next")))
86df10e3 50{
946e1bc7 51 /* The statement STMT is executed at most ... */
726a989a 52 gimple stmt;
946e1bc7
ZD
53
54 /* ... BOUND + 1 times (BOUND must be an unsigned constant).
55 The + 1 is added for the following reasons:
56
57 a) 0 would otherwise be unused, while we would need to care more about
58 overflows (as MAX + 1 is sometimes produced as the estimate on number
59 of executions of STMT).
60 b) it is consistent with the result of number_of_iterations_exit. */
61 double_int bound;
62
63 /* True if the statement will cause the loop to be leaved the (at most)
64 BOUND + 1-st time it is executed, that is, all the statements after it
65 are executed at most BOUND times. */
66 bool is_exit;
67
946e1bc7 68 /* The next bound in the list. */
86df10e3 69 struct nb_iter_bound *next;
86df10e3
SP
70};
71
6270df4c
ZD
72/* Description of the loop exit. */
73
9e2f83a5 74struct loop_exit GTY (())
6270df4c
ZD
75{
76 /* The exit edge. */
9e2f83a5 77 struct edge_def *e;
6270df4c
ZD
78
79 /* Previous and next exit in the list of the exits of the loop. */
80 struct loop_exit *prev;
81 struct loop_exit *next;
82
83 /* Next element in the list of loops from that E exits. */
84 struct loop_exit *next_e;
85};
86
9ba025a2
ZD
87typedef struct loop *loop_p;
88DEF_VEC_P (loop_p);
89DEF_VEC_ALLOC_P (loop_p, heap);
9e2f83a5 90DEF_VEC_ALLOC_P (loop_p, gc);
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. */
99 EST_AVAILABLE
100};
101
3d436d2a 102/* Structure to hold information for each natural loop. */
9e2f83a5 103struct loop GTY ((chain_next ("%h.next")))
3d436d2a
ZD
104{
105 /* Index into loops array. */
106 int num;
107
108 /* Basic block of loop header. */
9e2f83a5 109 struct basic_block_def *header;
3d436d2a
ZD
110
111 /* Basic block of loop latch. */
9e2f83a5 112 struct basic_block_def *latch;
3d436d2a 113
3d436d2a
ZD
114 /* For loop unrolling/peeling decision. */
115 struct lpt_decision lpt_decision;
116
3d436d2a
ZD
117 /* Number of loop insns. */
118 unsigned ninsns;
119
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. */
9e2f83a5 127 VEC (loop_p, 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
a14865db 138 /* The number of times the latch of the loop is executed.
9baba81b
SP
139 This is an INTEGER_CST or an expression containing symbolic
140 names. Don't access this field directly:
a14865db 141 number_of_latch_executions computes and caches the computed
9baba81b
SP
142 information in this field. */
143 tree nb_iterations;
144
946e1bc7
ZD
145 /* An integer estimation of the number of iterations. Estimate_state
146 describes what is the state of the estimation. */
ae50c0cb 147 enum loop_estimation estimate_state;
9bdb685e
ZD
148
149 /* An integer guaranteed to bound the number of iterations of the loop
150 from above. */
151 bool any_upper_bound;
152 double_int nb_iterations_upper_bound;
153
154 /* An integer giving the expected number of iterations of the loop. */
155 bool any_estimate;
156 double_int nb_iterations_estimate;
86df10e3 157
e9eb809d
ZD
158 /* Upper bound on number of iterations of a loop. */
159 struct nb_iter_bound *bounds;
82b85a85 160
6270df4c 161 /* Head of the cyclic list of the exits of the loop. */
9e2f83a5 162 struct loop_exit *exits;
3d436d2a
ZD
163};
164
165/* Flags for state of loop structure. */
166enum
167{
168 LOOPS_HAVE_PREHEADERS = 1,
169 LOOPS_HAVE_SIMPLE_LATCHES = 2,
82b85a85 170 LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS = 4,
89f8f30f 171 LOOPS_HAVE_RECORDED_EXITS = 8,
c7b852c8 172 LOOPS_MAY_HAVE_MULTIPLE_LATCHES = 16,
592c303d
ZD
173 LOOP_CLOSED_SSA = 32,
174 LOOPS_NEED_FIXUP = 64
3d436d2a
ZD
175};
176
d78f3f78
ZD
177#define LOOPS_NORMAL (LOOPS_HAVE_PREHEADERS | LOOPS_HAVE_SIMPLE_LATCHES \
178 | LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS)
89f8f30f 179#define AVOID_CFG_MODIFICATIONS (LOOPS_MAY_HAVE_MULTIPLE_LATCHES)
d78f3f78 180
3d436d2a 181/* Structure to hold CFG information about natural loops within a function. */
9e2f83a5 182struct loops GTY (())
3d436d2a 183{
0162f155
RG
184 /* State of loops. */
185 int state;
3d436d2a 186
42fd6772 187 /* Array of the loops. */
9e2f83a5 188 VEC (loop_p, gc) *larray;
3d436d2a 189
6270df4c
ZD
190 /* Maps edges to the list of their descriptions as loop exits. Edges
191 whose sources or destinations have loop_father == NULL (which may
192 happen during the cfg manipulations) should not appear in EXITS. */
9e2f83a5 193 htab_t GTY((param_is (struct loop_exit))) exits;
6270df4c 194
3d436d2a
ZD
195 /* Pointer to root of loop hierarchy tree. */
196 struct loop *tree_root;
3d436d2a
ZD
197};
198
3d436d2a 199/* Loop recognition. */
70388d94 200extern int flow_loops_find (struct loops *);
89f8f30f 201extern void disambiguate_loops_with_multiple_latches (void);
d329e058 202extern void flow_loops_free (struct loops *);
d73be268 203extern void flow_loops_dump (FILE *,
d329e058
AJ
204 void (*)(const struct loop *, FILE *, int), int);
205extern void flow_loop_dump (const struct loop *, FILE *,
206 void (*)(const struct loop *, FILE *, int), int);
6270df4c 207struct loop *alloc_loop (void);
d329e058 208extern void flow_loop_free (struct loop *);
2b271002 209int flow_loop_nodes_find (basic_block, struct loop *);
d73be268
ZD
210void fix_loop_structure (bitmap changed_bbs);
211void mark_irreducible_loops (void);
6270df4c
ZD
212void release_recorded_exits (void);
213void record_loop_exits (void);
214void rescan_loop_exit (edge, bool, bool);
3d436d2a 215
4d6922ee 216/* Loop data structure manipulation/querying. */
d329e058
AJ
217extern void flow_loop_tree_node_add (struct loop *, struct loop *);
218extern void flow_loop_tree_node_remove (struct loop *);
89f8f30f 219extern void add_loop (struct loop *, struct loop *);
d329e058 220extern bool flow_loop_nested_p (const struct loop *, const struct loop *);
ed7a4b4b 221extern bool flow_bb_inside_loop_p (const struct loop *, const_basic_block);
d329e058 222extern struct loop * find_common_loop (struct loop *, struct loop *);
a7e5372d 223struct loop *superloop_at_depth (struct loop *, unsigned);
7f9bc51b
ZD
224struct eni_weights_d;
225extern unsigned tree_num_loop_insns (struct loop *, struct eni_weights_d *);
ed7a4b4b
KG
226extern int num_loop_insns (const struct loop *);
227extern int average_num_loop_insns (const struct loop *);
689ba89d 228extern unsigned get_loop_level (const struct loop *);
ed7a4b4b 229extern bool loop_exit_edge_p (const struct loop *, const_edge);
d73be268 230extern void mark_loop_exit_edges (void);
3d436d2a
ZD
231
232/* Loops & cfg manipulation. */
d329e058 233extern basic_block *get_loop_body (const struct loop *);
89f8f30f
ZD
234extern unsigned get_loop_body_with_size (const struct loop *, basic_block *,
235 unsigned);
50654f6c 236extern basic_block *get_loop_body_in_dom_order (const struct loop *);
40923b20 237extern basic_block *get_loop_body_in_bfs_order (const struct loop *);
ca83d385 238extern VEC (edge, heap) *get_loop_exit_edges (const struct loop *);
ac8f6c69 239edge single_exit (const struct loop *);
50654f6c 240extern unsigned num_loop_branches (const struct loop *);
3d436d2a 241
d329e058
AJ
242extern edge loop_preheader_edge (const struct loop *);
243extern edge loop_latch_edge (const struct loop *);
3d436d2a 244
d329e058
AJ
245extern void add_bb_to_loop (basic_block, struct loop *);
246extern void remove_bb_from_loops (basic_block);
3d436d2a 247
d73be268 248extern void cancel_loop_tree (struct loop *);
42fd6772 249extern void delete_loop (struct loop *);
3d436d2a 250
3d436d2a
ZD
251enum
252{
bc35512f 253 CP_SIMPLE_PREHEADERS = 1
3d436d2a
ZD
254};
255
b02b9b53 256basic_block create_preheader (struct loop *, int);
d73be268
ZD
257extern void create_preheaders (int);
258extern void force_single_succ_latches (void);
3d436d2a 259
d73be268 260extern void verify_loop_structure (void);
3d436d2a
ZD
261
262/* Loop analysis. */
ed7a4b4b 263extern bool just_once_each_iteration_p (const struct loop *, const_basic_block);
ac84e05e 264gcov_type expected_loop_iterations_unbounded (const struct loop *);
d329e058 265extern unsigned expected_loop_iterations (const struct loop *);
75c70254 266extern rtx doloop_condition_get (rtx);
617b465c 267
4839cb59
ZD
268void estimate_numbers_of_iterations_loop (struct loop *);
269HOST_WIDE_INT estimated_loop_iterations_int (struct loop *, bool);
ac84e05e 270bool estimated_loop_iterations (struct loop *, bool, double_int *);
4839cb59 271
617b465c 272/* Loop manipulation. */
ed7a4b4b 273extern bool can_duplicate_loop_p (const struct loop *loop);
617b465c
ZD
274
275#define DLTHE_FLAG_UPDATE_FREQ 1 /* Update frequencies in
276 duplicate_loop_to_header_edge. */
7f7b1718
JH
277#define DLTHE_RECORD_COPY_NUMBER 2 /* Record copy number in the aux
278 field of newly create BB. */
178df94f 279#define DLTHE_FLAG_COMPLETTE_PEEL 4 /* Update frequencies expecting
a4d05547 280 a complete peeling. */
617b465c 281
d73be268
ZD
282extern struct loop * duplicate_loop (struct loop *, struct loop *);
283extern bool duplicate_loop_to_header_edge (struct loop *, edge,
ee8c1b05
ZD
284 unsigned, sbitmap, edge,
285 VEC (edge, heap) **, int);
d73be268 286extern struct loop *loopify (edge, edge,
03cb2019
ZD
287 basic_block, edge, edge, bool,
288 unsigned, unsigned);
d73be268 289struct loop * loop_version (struct loop *, void *,
03cb2019 290 basic_block *, unsigned, unsigned, unsigned, bool);
d73be268 291extern bool remove_path (edge);
03cb2019 292void scale_loop_frequencies (struct loop *, int, int);
617b465c 293
50654f6c
ZD
294/* Induction variable analysis. */
295
296/* The description of induction variable. The things are a bit complicated
297 due to need to handle subregs and extends. The value of the object described
298 by it can be obtained as follows (all computations are done in extend_mode):
299
300 Value in i-th iteration is
301 delta + mult * extend_{extend_mode} (subreg_{mode} (base + i * step)).
302
303 If first_special is true, the value in the first iteration is
304 delta + mult * base
c22cacf3 305
f822d252 306 If extend = UNKNOWN, first_special must be false, delta 0, mult 1 and value is
50654f6c
ZD
307 subreg_{mode} (base + i * step)
308
309 The get_iv_value function can be used to obtain these expressions.
310
311 ??? Add a third mode field that would specify the mode in that inner
312 computation is done, which would enable it to be different from the
313 outer one? */
314
315struct rtx_iv
316{
317 /* Its base and step (mode of base and step is supposed to be extend_mode,
318 see the description above). */
319 rtx base, step;
320
f822d252 321 /* The type of extend applied to it (SIGN_EXTEND, ZERO_EXTEND or UNKNOWN). */
50654f6c
ZD
322 enum rtx_code extend;
323
324 /* Operations applied in the extended mode. */
325 rtx delta, mult;
326
327 /* The mode it is extended to. */
328 enum machine_mode extend_mode;
329
330 /* The mode the variable iterates in. */
331 enum machine_mode mode;
332
50654f6c
ZD
333 /* Whether the first iteration needs to be handled specially. */
334 unsigned first_special : 1;
335};
336
f2dca510
ZD
337/* The description of an exit from the loop and of the number of iterations
338 till we take the exit. */
50654f6c
ZD
339
340struct niter_desc
341{
342 /* The edge out of the loop. */
343 edge out_edge;
344
345 /* The other edge leading from the condition. */
346 edge in_edge;
347
348 /* True if we are able to say anything about number of iterations of the
349 loop. */
350 bool simple_p;
351
352 /* True if the loop iterates the constant number of times. */
353 bool const_iter;
354
355 /* Number of iterations if constant. */
356 unsigned HOST_WIDEST_INT niter;
357
358 /* Upper bound on the number of iterations. */
359 unsigned HOST_WIDEST_INT niter_max;
360
361 /* Assumptions under that the rest of the information is valid. */
362 rtx assumptions;
363
364 /* Assumptions under that the loop ends before reaching the latch,
365 even if value of niter_expr says otherwise. */
366 rtx noloop_assumptions;
367
368 /* Condition under that the loop is infinite. */
369 rtx infinite;
370
371 /* Whether the comparison is signed. */
372 bool signed_p;
373
374 /* The mode in that niter_expr should be computed. */
375 enum machine_mode mode;
376
377 /* The number of iterations of the loop. */
378 rtx niter_expr;
379};
380
381extern void iv_analysis_loop_init (struct loop *);
6d4e0ecc 382extern bool iv_analyze (rtx, rtx, struct rtx_iv *);
03fd2215
ZD
383extern bool iv_analyze_result (rtx, rtx, struct rtx_iv *);
384extern bool iv_analyze_expr (rtx, rtx, enum machine_mode, struct rtx_iv *);
50654f6c 385extern rtx get_iv_value (struct rtx_iv *, rtx);
113d659a 386extern bool biv_p (rtx, rtx);
50654f6c 387extern void find_simple_exit (struct loop *, struct niter_desc *);
50654f6c
ZD
388extern void iv_analysis_done (void);
389
390extern struct niter_desc *get_simple_loop_desc (struct loop *loop);
391extern void free_simple_loop_desc (struct loop *loop);
392
393static inline struct niter_desc *
394simple_loop_desc (struct loop *loop)
395{
cceb1885 396 return (struct niter_desc *) loop->aux;
50654f6c
ZD
397}
398
42fd6772
ZD
399/* Accessors for the loop structures. */
400
401/* Returns the loop with index NUM from current_loops. */
402
403static inline struct loop *
404get_loop (unsigned num)
405{
406 return VEC_index (loop_p, current_loops->larray, num);
407}
408
9ba025a2
ZD
409/* Returns the number of superloops of LOOP. */
410
411static inline unsigned
412loop_depth (const struct loop *loop)
413{
414 return VEC_length (loop_p, loop->superloops);
415}
416
417/* Returns the immediate superloop of LOOP, or NULL if LOOP is the outermost
418 loop. */
419
420static inline struct loop *
421loop_outer (const struct loop *loop)
422{
423 unsigned n = VEC_length (loop_p, loop->superloops);
424
425 if (n == 0)
426 return NULL;
427
428 return VEC_index (loop_p, loop->superloops, n - 1);
429}
430
42fd6772
ZD
431/* Returns the list of loops in current_loops. */
432
9e2f83a5 433static inline VEC (loop_p, gc) *
42fd6772
ZD
434get_loops (void)
435{
436 if (!current_loops)
437 return NULL;
438
439 return current_loops->larray;
440}
441
442/* Returns the number of loops in current_loops (including the removed
443 ones and the fake loop that forms the root of the loop tree). */
444
445static inline unsigned
446number_of_loops (void)
447{
448 if (!current_loops)
449 return 0;
450
451 return VEC_length (loop_p, current_loops->larray);
452}
453
f87000d0
ZD
454/* Returns true if state of the loops satisfies all properties
455 described by FLAGS. */
456
457static inline bool
458loops_state_satisfies_p (unsigned flags)
459{
460 return (current_loops->state & flags) == flags;
461}
462
463/* Sets FLAGS to the loops state. */
464
465static inline void
466loops_state_set (unsigned flags)
467{
468 current_loops->state |= flags;
469}
470
471/* Clears FLAGS from the loops state. */
472
473static inline void
474loops_state_clear (unsigned flags)
475{
476 if (!current_loops)
477 return;
478 current_loops->state &= ~flags;
479}
480
42fd6772
ZD
481/* Loop iterators. */
482
483/* Flags for loop iteration. */
484
485enum li_flags
486{
677cc14d
ZD
487 LI_INCLUDE_ROOT = 1, /* Include the fake root of the loop tree. */
488 LI_FROM_INNERMOST = 2, /* Iterate over the loops in the reverse order,
489 starting from innermost ones. */
490 LI_ONLY_INNERMOST = 4 /* Iterate only over innermost loops. */
42fd6772
ZD
491};
492
493/* The iterator for loops. */
494
495typedef struct
496{
677cc14d
ZD
497 /* The list of loops to visit. */
498 VEC(int,heap) *to_visit;
499
500 /* The index of the actual loop. */
501 unsigned idx;
42fd6772
ZD
502} loop_iterator;
503
504static inline void
677cc14d 505fel_next (loop_iterator *li, loop_p *loop)
42fd6772 506{
677cc14d
ZD
507 int anum;
508
509 while (VEC_iterate (int, li->to_visit, li->idx, anum))
42fd6772 510 {
42fd6772 511 li->idx++;
677cc14d
ZD
512 *loop = get_loop (anum);
513 if (*loop)
514 return;
42fd6772
ZD
515 }
516
677cc14d 517 VEC_free (int, heap, li->to_visit);
42fd6772
ZD
518 *loop = NULL;
519}
520
521static inline void
522fel_init (loop_iterator *li, loop_p *loop, unsigned flags)
523{
677cc14d
ZD
524 struct loop *aloop;
525 unsigned i;
526 int mn;
527
528 li->idx = 0;
42fd6772
ZD
529 if (!current_loops)
530 {
677cc14d 531 li->to_visit = NULL;
42fd6772
ZD
532 *loop = NULL;
533 return;
534 }
535
677cc14d
ZD
536 li->to_visit = VEC_alloc (int, heap, number_of_loops ());
537 mn = (flags & LI_INCLUDE_ROOT) ? 0 : 1;
538
539 if (flags & LI_ONLY_INNERMOST)
540 {
541 for (i = 0; VEC_iterate (loop_p, current_loops->larray, i, aloop); i++)
542 if (aloop != NULL
543 && aloop->inner == NULL
544 && aloop->num >= mn)
545 VEC_quick_push (int, li->to_visit, aloop->num);
546 }
547 else if (flags & LI_FROM_INNERMOST)
42fd6772 548 {
677cc14d
ZD
549 /* Push the loops to LI->TO_VISIT in postorder. */
550 for (aloop = current_loops->tree_root;
551 aloop->inner != NULL;
552 aloop = aloop->inner)
553 continue;
554
555 while (1)
556 {
557 if (aloop->num >= mn)
558 VEC_quick_push (int, li->to_visit, aloop->num);
559
560 if (aloop->next)
561 {
562 for (aloop = aloop->next;
563 aloop->inner != NULL;
564 aloop = aloop->inner)
565 continue;
566 }
9ba025a2 567 else if (!loop_outer (aloop))
677cc14d
ZD
568 break;
569 else
9ba025a2 570 aloop = loop_outer (aloop);
677cc14d 571 }
42fd6772
ZD
572 }
573 else
574 {
677cc14d
ZD
575 /* Push the loops to LI->TO_VISIT in preorder. */
576 aloop = current_loops->tree_root;
577 while (1)
578 {
579 if (aloop->num >= mn)
580 VEC_quick_push (int, li->to_visit, aloop->num);
581
582 if (aloop->inner != NULL)
583 aloop = aloop->inner;
584 else
585 {
586 while (aloop != NULL && aloop->next == NULL)
9ba025a2 587 aloop = loop_outer (aloop);
677cc14d
ZD
588 if (aloop == NULL)
589 break;
590 aloop = aloop->next;
591 }
592 }
42fd6772 593 }
677cc14d
ZD
594
595 fel_next (li, loop);
42fd6772
ZD
596}
597
598#define FOR_EACH_LOOP(LI, LOOP, FLAGS) \
599 for (fel_init (&(LI), &(LOOP), FLAGS); \
600 (LOOP); \
677cc14d
ZD
601 fel_next (&(LI), &(LOOP)))
602
603#define FOR_EACH_LOOP_BREAK(LI) \
604 { \
605 VEC_free (int, heap, (LI)->to_visit); \
606 break; \
607 }
42fd6772 608
8b11a64c
ZD
609/* The properties of the target. */
610
a154b43a
ZD
611extern unsigned target_avail_regs;
612extern unsigned target_res_regs;
f40751dd
JH
613extern unsigned target_reg_cost [2];
614extern unsigned target_spill_cost [2];
8b11a64c 615
5e962776
ZD
616/* Register pressure estimation for induction variable optimizations & loop
617 invariant motion. */
f40751dd 618extern unsigned estimate_reg_pressure_cost (unsigned, unsigned, bool);
5e962776
ZD
619extern void init_set_costs (void);
620
617b465c 621/* Loop optimizer initialization. */
598ec7bd
ZD
622extern void loop_optimizer_init (unsigned);
623extern void loop_optimizer_finalize (void);
617b465c
ZD
624
625/* Optimization passes. */
d73be268 626extern void unswitch_loops (void);
617b465c 627
b17d5d7c
ZD
628enum
629{
630 UAP_PEEL = 1, /* Enables loop peeling. */
598ec7bd
ZD
631 UAP_UNROLL = 2, /* Enables unrolling of loops if it seems profitable. */
632 UAP_UNROLL_ALL = 4 /* Enables unrolling of all loops. */
b17d5d7c
ZD
633};
634
d73be268
ZD
635extern void unroll_and_peel_loops (int);
636extern void doloop_optimize_loops (void);
637extern void move_loop_invariants (void);
59587b18
JQ
638
639#endif /* GCC_CFGLOOP_H */