1 /* Loop optimizer initialization routines and RTL loop optimization passes.
2 Copyright (C) 2002-2014 Free Software Foundation, Inc.
4 This file is part of GCC.
6 GCC is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 3, or (at your option) any later
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3. If not see
18 <http://www.gnu.org/licenses/>. */
22 #include "coretypes.h"
28 #include "basic-block.h"
30 #include "tree-pass.h"
34 #include "tree-ssa-loop-niter.h"
35 #include "loop-unroll.h"
38 /* Apply FLAGS to the loop state. */
41 apply_loop_flags (unsigned flags
)
43 if (flags
& LOOPS_MAY_HAVE_MULTIPLE_LATCHES
)
45 /* If the loops may have multiple latches, we cannot canonicalize
46 them further (and most of the loop manipulation functions will
47 not work). However, we avoid modifying cfg, which some
49 gcc_assert ((flags
& ~(LOOPS_MAY_HAVE_MULTIPLE_LATCHES
50 | LOOPS_HAVE_RECORDED_EXITS
)) == 0);
51 loops_state_set (LOOPS_MAY_HAVE_MULTIPLE_LATCHES
);
54 disambiguate_loops_with_multiple_latches ();
56 /* Create pre-headers. */
57 if (flags
& LOOPS_HAVE_PREHEADERS
)
59 int cp_flags
= CP_SIMPLE_PREHEADERS
;
61 if (flags
& LOOPS_HAVE_FALLTHRU_PREHEADERS
)
62 cp_flags
|= CP_FALLTHRU_PREHEADERS
;
64 create_preheaders (cp_flags
);
67 /* Force all latches to have only single successor. */
68 if (flags
& LOOPS_HAVE_SIMPLE_LATCHES
)
69 force_single_succ_latches ();
71 /* Mark irreducible loops. */
72 if (flags
& LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS
)
73 mark_irreducible_loops ();
75 if (flags
& LOOPS_HAVE_RECORDED_EXITS
)
79 /* Initialize loop structures. This is used by the tree and RTL loop
80 optimizers. FLAGS specify what properties to compute and/or ensure for
84 loop_optimizer_init (unsigned flags
)
86 timevar_push (TV_LOOP_INIT
);
90 gcc_assert (!(cfun
->curr_properties
& PROP_loops
));
93 current_loops
= flow_loops_find (NULL
);
97 bool recorded_exits
= loops_state_satisfies_p (LOOPS_HAVE_RECORDED_EXITS
);
98 bool needs_fixup
= loops_state_satisfies_p (LOOPS_NEED_FIXUP
);
100 gcc_assert (cfun
->curr_properties
& PROP_loops
);
102 /* Ensure that the dominators are computed, like flow_loops_find does. */
103 calculate_dominance_info (CDI_DOMINATORS
);
105 #ifdef ENABLE_CHECKING
107 verify_loop_structure ();
110 /* Clear all flags. */
112 release_recorded_exits ();
113 loops_state_clear (~0U);
117 /* Apply LOOPS_MAY_HAVE_MULTIPLE_LATCHES early as fix_loop_structure
119 loops_state_set (flags
& LOOPS_MAY_HAVE_MULTIPLE_LATCHES
);
120 fix_loop_structure (NULL
);
124 /* Apply flags to loops. */
125 apply_loop_flags (flags
);
128 flow_loops_dump (dump_file
, NULL
, 1);
130 #ifdef ENABLE_CHECKING
131 verify_loop_structure ();
134 timevar_pop (TV_LOOP_INIT
);
137 /* Finalize loop structures. */
140 loop_optimizer_finalize (void)
145 timevar_push (TV_LOOP_FINI
);
147 if (loops_state_satisfies_p (LOOPS_HAVE_RECORDED_EXITS
))
148 release_recorded_exits ();
150 free_numbers_of_iterations_estimates ();
152 /* If we should preserve loop structure, do not free it but clear
153 flags that advanced properties are there as we are not preserving
155 if (cfun
->curr_properties
& PROP_loops
)
157 loops_state_clear (LOOP_CLOSED_SSA
158 | LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS
159 | LOOPS_HAVE_PREHEADERS
160 | LOOPS_HAVE_SIMPLE_LATCHES
161 | LOOPS_HAVE_FALLTHRU_PREHEADERS
);
162 loops_state_set (LOOPS_MAY_HAVE_MULTIPLE_LATCHES
);
166 gcc_assert (current_loops
!= NULL
);
168 FOR_EACH_LOOP (loop
, 0)
169 free_simple_loop_desc (loop
);
172 flow_loops_free (current_loops
);
173 ggc_free (current_loops
);
174 current_loops
= NULL
;
176 FOR_ALL_BB_FN (bb
, cfun
)
178 bb
->loop_father
= NULL
;
182 timevar_pop (TV_LOOP_FINI
);
185 /* The structure of loops might have changed. Some loops might get removed
186 (and their headers and latches were set to NULL), loop exists might get
187 removed (thus the loop nesting may be wrong), and some blocks and edges
188 were changed (so the information about bb --> loop mapping does not have
189 to be correct). But still for the remaining loops the header dominates
190 the latch, and loops did not get new subloops (new loops might possibly
191 get created, but we are not interested in them). Fix up the mess.
193 If CHANGED_BBS is not NULL, basic blocks whose loop depth has changed are
196 Returns the number of new discovered loops. */
199 fix_loop_structure (bitmap changed_bbs
)
202 int record_exits
= 0;
204 unsigned old_nloops
, i
;
206 timevar_push (TV_LOOP_INIT
);
208 /* We need exact and fast dominance info to be available. */
209 gcc_assert (dom_info_state (CDI_DOMINATORS
) == DOM_OK
);
211 if (loops_state_satisfies_p (LOOPS_HAVE_RECORDED_EXITS
))
213 release_recorded_exits ();
214 record_exits
= LOOPS_HAVE_RECORDED_EXITS
;
217 /* Remember the depth of the blocks in the loop hierarchy, so that we can
218 recognize blocks whose loop nesting relationship has changed. */
220 FOR_EACH_BB_FN (bb
, cfun
)
221 bb
->aux
= (void *) (size_t) loop_depth (bb
->loop_father
);
223 /* Remove the dead loops from structures. We start from the innermost
224 loops, so that when we remove the loops, we know that the loops inside
225 are preserved, and do not waste time relinking loops that will be
227 FOR_EACH_LOOP (loop
, LI_FROM_INNERMOST
)
229 /* Detect the case that the loop is no longer present even though
230 it wasn't marked for removal.
231 ??? If we do that we can get away with not marking loops for
232 removal at all. And possibly avoid some spurious removals. */
234 && bb_loop_header_p (loop
->header
))
237 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
238 fprintf (dump_file
, "fix_loop_structure: removing loop %d\n",
243 struct loop
*ploop
= loop
->inner
;
244 flow_loop_tree_node_remove (ploop
);
245 flow_loop_tree_node_add (loop_outer (loop
), ploop
);
248 /* Remove the loop. */
250 loop
->former_header
= loop
->header
;
252 gcc_assert (loop
->former_header
!= NULL
);
254 flow_loop_tree_node_remove (loop
);
257 /* Remember the number of loops so we can return how many new loops
258 flow_loops_find discovered. */
259 old_nloops
= number_of_loops (cfun
);
261 /* Re-compute loop structure in-place. */
262 flow_loops_find (current_loops
);
264 /* Mark the blocks whose loop has changed. */
267 FOR_EACH_BB_FN (bb
, cfun
)
269 if ((void *) (size_t) loop_depth (bb
->loop_father
) != bb
->aux
)
270 bitmap_set_bit (changed_bbs
, bb
->index
);
276 /* Finally free deleted loops. */
277 FOR_EACH_VEC_ELT (*get_loops (cfun
), i
, loop
)
278 if (loop
&& loop
->header
== NULL
)
281 && ((unsigned) loop
->former_header
->index
282 < basic_block_info_for_fn (cfun
)->length ()))
284 basic_block former_header
285 = BASIC_BLOCK_FOR_FN (cfun
, loop
->former_header
->index
);
286 /* If the old header still exists we want to check if the
287 original loop is re-discovered or the old header is now
288 part of a newly discovered loop.
289 In both cases we should have avoided removing the loop. */
290 if (former_header
== loop
->former_header
)
292 if (former_header
->loop_father
->header
== former_header
)
293 fprintf (dump_file
, "fix_loop_structure: rediscovered "
294 "removed loop %d as loop %d with old header %d\n",
295 loop
->num
, former_header
->loop_father
->num
,
296 former_header
->index
);
297 else if ((unsigned) former_header
->loop_father
->num
299 fprintf (dump_file
, "fix_loop_structure: header %d of "
300 "removed loop %d is part of the newly "
301 "discovered loop %d with header %d\n",
302 former_header
->index
, loop
->num
,
303 former_header
->loop_father
->num
,
304 former_header
->loop_father
->header
->index
);
307 (*get_loops (cfun
))[i
] = NULL
;
308 flow_loop_free (loop
);
311 loops_state_clear (LOOPS_NEED_FIXUP
);
313 /* Apply flags to loops. */
314 apply_loop_flags (current_loops
->state
| record_exits
);
316 #ifdef ENABLE_CHECKING
317 verify_loop_structure ();
320 timevar_pop (TV_LOOP_INIT
);
322 return number_of_loops (cfun
) - old_nloops
;
325 /* The RTL loop superpass. The actual passes are subpasses. See passes.c for
330 const pass_data pass_data_loop2
=
334 OPTGROUP_LOOP
, /* optinfo_flags */
336 0, /* properties_required */
337 0, /* properties_provided */
338 0, /* properties_destroyed */
339 0, /* todo_flags_start */
340 0, /* todo_flags_finish */
343 class pass_loop2
: public rtl_opt_pass
346 pass_loop2 (gcc::context
*ctxt
)
347 : rtl_opt_pass (pass_data_loop2
, ctxt
)
350 /* opt_pass methods: */
351 virtual bool gate (function
*);
353 }; // class pass_loop2
356 pass_loop2::gate (function
*fun
)
359 && (flag_move_loop_invariants
360 || flag_unswitch_loops
362 #ifdef HAVE_doloop_end
363 || (flag_branch_on_count_reg
&& HAVE_doloop_end
)
369 /* No longer preserve loops, remove them now. */
370 fun
->curr_properties
&= ~PROP_loops
;
372 loop_optimizer_finalize ();
380 make_pass_loop2 (gcc::context
*ctxt
)
382 return new pass_loop2 (ctxt
);
386 /* Initialization of the RTL loop passes. */
390 gcc_assert (current_ir_type () == IR_RTL_CFGLAYOUT
);
394 dump_reg_info (dump_file
);
395 dump_flow_info (dump_file
, dump_flags
);
398 loop_optimizer_init (LOOPS_NORMAL
);
404 const pass_data pass_data_rtl_loop_init
=
407 "loop2_init", /* name */
408 OPTGROUP_LOOP
, /* optinfo_flags */
410 0, /* properties_required */
411 0, /* properties_provided */
412 0, /* properties_destroyed */
413 0, /* todo_flags_start */
414 0, /* todo_flags_finish */
417 class pass_rtl_loop_init
: public rtl_opt_pass
420 pass_rtl_loop_init (gcc::context
*ctxt
)
421 : rtl_opt_pass (pass_data_rtl_loop_init
, ctxt
)
424 /* opt_pass methods: */
425 virtual unsigned int execute (function
*) { return rtl_loop_init (); }
427 }; // class pass_rtl_loop_init
432 make_pass_rtl_loop_init (gcc::context
*ctxt
)
434 return new pass_rtl_loop_init (ctxt
);
438 /* Finalization of the RTL loop passes. */
442 const pass_data pass_data_rtl_loop_done
=
445 "loop2_done", /* name */
446 OPTGROUP_LOOP
, /* optinfo_flags */
448 0, /* properties_required */
449 0, /* properties_provided */
450 PROP_loops
, /* properties_destroyed */
451 0, /* todo_flags_start */
452 0, /* todo_flags_finish */
455 class pass_rtl_loop_done
: public rtl_opt_pass
458 pass_rtl_loop_done (gcc::context
*ctxt
)
459 : rtl_opt_pass (pass_data_rtl_loop_done
, ctxt
)
462 /* opt_pass methods: */
463 virtual unsigned int execute (function
*);
465 }; // class pass_rtl_loop_done
468 pass_rtl_loop_done::execute (function
*fun
)
470 /* No longer preserve loops, remove them now. */
471 fun
->curr_properties
&= ~PROP_loops
;
472 loop_optimizer_finalize ();
473 free_dominance_info (CDI_DOMINATORS
);
478 dump_reg_info (dump_file
);
479 dump_flow_info (dump_file
, dump_flags
);
488 make_pass_rtl_loop_done (gcc::context
*ctxt
)
490 return new pass_rtl_loop_done (ctxt
);
494 /* Loop invariant code motion. */
498 const pass_data pass_data_rtl_move_loop_invariants
=
501 "loop2_invariant", /* name */
502 OPTGROUP_LOOP
, /* optinfo_flags */
503 TV_LOOP_MOVE_INVARIANTS
, /* tv_id */
504 0, /* properties_required */
505 0, /* properties_provided */
506 0, /* properties_destroyed */
507 0, /* todo_flags_start */
508 ( TODO_df_verify
| TODO_df_finish
), /* todo_flags_finish */
511 class pass_rtl_move_loop_invariants
: public rtl_opt_pass
514 pass_rtl_move_loop_invariants (gcc::context
*ctxt
)
515 : rtl_opt_pass (pass_data_rtl_move_loop_invariants
, ctxt
)
518 /* opt_pass methods: */
519 virtual bool gate (function
*) { return flag_move_loop_invariants
; }
520 virtual unsigned int execute (function
*fun
)
522 if (number_of_loops (fun
) > 1)
523 move_loop_invariants ();
527 }; // class pass_rtl_move_loop_invariants
532 make_pass_rtl_move_loop_invariants (gcc::context
*ctxt
)
534 return new pass_rtl_move_loop_invariants (ctxt
);
540 const pass_data pass_data_rtl_unroll_loops
=
543 "loop2_unroll", /* name */
544 OPTGROUP_LOOP
, /* optinfo_flags */
545 TV_LOOP_UNROLL
, /* tv_id */
546 0, /* properties_required */
547 0, /* properties_provided */
548 0, /* properties_destroyed */
549 0, /* todo_flags_start */
550 0, /* todo_flags_finish */
553 class pass_rtl_unroll_loops
: public rtl_opt_pass
556 pass_rtl_unroll_loops (gcc::context
*ctxt
)
557 : rtl_opt_pass (pass_data_rtl_unroll_loops
, ctxt
)
560 /* opt_pass methods: */
561 virtual bool gate (function
*)
563 return (flag_peel_loops
|| flag_unroll_loops
|| flag_unroll_all_loops
);
566 virtual unsigned int execute (function
*);
568 }; // class pass_rtl_unroll_loops
571 pass_rtl_unroll_loops::execute (function
*fun
)
573 if (number_of_loops (fun
) > 1)
579 if (flag_unroll_loops
)
581 if (flag_unroll_all_loops
)
582 flags
|= UAP_UNROLL_ALL
;
584 unroll_loops (flags
);
592 make_pass_rtl_unroll_loops (gcc::context
*ctxt
)
594 return new pass_rtl_unroll_loops (ctxt
);
600 const pass_data pass_data_rtl_doloop
=
603 "loop2_doloop", /* name */
604 OPTGROUP_LOOP
, /* optinfo_flags */
605 TV_LOOP_DOLOOP
, /* tv_id */
606 0, /* properties_required */
607 0, /* properties_provided */
608 0, /* properties_destroyed */
609 0, /* todo_flags_start */
610 0, /* todo_flags_finish */
613 class pass_rtl_doloop
: public rtl_opt_pass
616 pass_rtl_doloop (gcc::context
*ctxt
)
617 : rtl_opt_pass (pass_data_rtl_doloop
, ctxt
)
620 /* opt_pass methods: */
621 virtual bool gate (function
*);
622 virtual unsigned int execute (function
*);
624 }; // class pass_rtl_doloop
627 pass_rtl_doloop::gate (function
*)
629 #ifdef HAVE_doloop_end
630 return (flag_branch_on_count_reg
&& HAVE_doloop_end
);
637 pass_rtl_doloop::execute (function
*fun ATTRIBUTE_UNUSED
)
639 #ifdef HAVE_doloop_end
640 if (number_of_loops (fun
) > 1)
641 doloop_optimize_loops ();
649 make_pass_rtl_doloop (gcc::context
*ctxt
)
651 return new pass_rtl_doloop (ctxt
);