1 /* Code to analyze doloop loops in order for targets to perform late
2 optimizations converting doloops to other forms of hardware loops.
3 Copyright (C) 2011 Free Software Foundation, Inc.
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 3, or (at your option) any later
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
23 #include "coretypes.h"
28 #include "hard-reg-set.h"
30 #include "basic-block.h"
36 #include "hw-doloop.h"
39 #ifdef HAVE_doloop_end
41 /* Dump information collected in LOOPS. */
43 dump_hwloops (hwloop_info loops
)
47 for (loop
= loops
; loop
; loop
= loop
->next
)
53 fprintf (dump_file
, ";; loop %d: ", loop
->loop_no
);
55 fprintf (dump_file
, "(bad) ");
56 fprintf (dump_file
, "{head:%d, depth:%d, reg:%u}",
57 loop
->head
== NULL
? -1 : loop
->head
->index
,
58 loop
->depth
, REGNO (loop
->iter_reg
));
60 fprintf (dump_file
, " blocks: [ ");
61 for (ix
= 0; VEC_iterate (basic_block
, loop
->blocks
, ix
, b
); ix
++)
62 fprintf (dump_file
, "%d ", b
->index
);
63 fprintf (dump_file
, "] ");
65 fprintf (dump_file
, " inner loops: [ ");
66 for (ix
= 0; VEC_iterate (hwloop_info
, loop
->loops
, ix
, i
); ix
++)
67 fprintf (dump_file
, "%d ", i
->loop_no
);
68 fprintf (dump_file
, "]\n");
70 fprintf (dump_file
, "\n");
73 /* Return true if BB is part of LOOP. */
75 bb_in_loop_p (hwloop_info loop
, basic_block bb
)
77 return bitmap_bit_p (loop
->block_bitmap
, bb
->index
);
80 /* Scan the blocks of LOOP (and its inferiors), and record things such as
81 hard registers set, jumps out of and within the loop. */
83 scan_loop (hwloop_info loop
)
91 if (REGNO_REG_SET_P (df_get_live_in (loop
->successor
),
92 REGNO (loop
->iter_reg
)))
93 loop
->iter_reg_used_outside
= true;
95 for (ix
= 0; VEC_iterate (basic_block
, loop
->blocks
, ix
, bb
); ix
++)
101 if (bb
!= loop
->tail
)
102 FOR_EACH_EDGE (e
, ei
, bb
->succs
)
104 if (bb_in_loop_p (loop
, e
->dest
))
106 if (!(e
->flags
& EDGE_FALLTHRU
))
107 loop
->jumps_within
= true;
111 loop
->jumps_outof
= true;
113 gcc_assert (!REGNO_REG_SET_P (df_get_live_in (e
->dest
),
114 REGNO (loop
->iter_reg
)));
118 for (insn
= BB_HEAD (bb
);
119 insn
!= NEXT_INSN (BB_END (bb
));
120 insn
= NEXT_INSN (insn
))
123 HARD_REG_SET set_this_insn
;
125 if (!NONDEBUG_INSN_P (insn
))
128 if (recog_memoized (insn
) < 0
129 && (GET_CODE (PATTERN (insn
)) == ASM_INPUT
130 || asm_noperands (PATTERN (insn
)) >= 0))
131 loop
->has_asm
= true;
133 CLEAR_HARD_REG_SET (set_this_insn
);
134 for (def_rec
= DF_INSN_DEFS (insn
); *def_rec
; def_rec
++)
136 rtx dreg
= DF_REF_REG (*def_rec
);
141 add_to_hard_reg_set (&set_this_insn
, GET_MODE (dreg
),
145 if (insn
== loop
->loop_end
)
146 CLEAR_HARD_REG_BIT (set_this_insn
, REGNO (loop
->iter_reg
));
147 else if (reg_mentioned_p (loop
->iter_reg
, PATTERN (insn
)))
148 loop
->iter_reg_used
= true;
149 IOR_HARD_REG_SET (loop
->regs_set_in_loop
, set_this_insn
);
154 /* Compute the incoming_dest and incoming_src members of LOOP by
155 identifying the edges that jump into the loop. If there is more
156 than one block that jumps into the loop, incoming_src will be set
157 to NULL; likewise, if there is more than one block in the loop that
158 is the destination of an incoming edge, incoming_dest will be NULL.
160 Return true if either of these two fields is nonnull, false
163 process_incoming_edges (hwloop_info loop
)
169 FOR_EACH_EDGE (e
, ei
, loop
->incoming
)
173 loop
->incoming_src
= e
->src
;
174 loop
->incoming_dest
= e
->dest
;
179 if (e
->dest
!= loop
->incoming_dest
)
180 loop
->incoming_dest
= NULL
;
181 if (e
->src
!= loop
->incoming_src
)
182 loop
->incoming_src
= NULL
;
185 if (loop
->incoming_src
== NULL
&& loop
->incoming_dest
== NULL
)
191 /* Try to identify a forwarder block that jump into LOOP, and add it to
192 the set of blocks in the loop, updating the vector of incoming blocks as
193 well. This transformation gives a second chance to loops we couldn't
194 otherwise handle by increasing the chance that we'll end up with one
196 Return true if we made a change, false otherwise. */
198 add_forwarder_blocks (hwloop_info loop
)
203 FOR_EACH_EDGE (e
, ei
, loop
->incoming
)
205 if (forwarder_block_p (e
->src
))
212 ";; Adding forwarder block %d to loop %d and retrying\n",
213 e
->src
->index
, loop
->loop_no
);
214 VEC_safe_push (basic_block
, heap
, loop
->blocks
, e
->src
);
215 bitmap_set_bit (loop
->block_bitmap
, e
->src
->index
);
216 FOR_EACH_EDGE (e2
, ei2
, e
->src
->preds
)
217 VEC_safe_push (edge
, gc
, loop
->incoming
, e2
);
218 VEC_unordered_remove (edge
, loop
->incoming
, ei
.index
);
225 /* Called from reorg_loops when a potential loop end is found. LOOP is
226 a newly set up structure describing the loop, it is this function's
227 responsibility to fill most of it. TAIL_BB and TAIL_INSN point to the
228 loop_end insn and its enclosing basic block. REG is the loop counter
230 For our purposes, a loop is defined by the set of blocks reachable from
231 the loop head in which the loop counter register is live. This matches
232 the expected use; targets that call into this code usually replace the
233 loop counter with a different special register. */
235 discover_loop (hwloop_info loop
, basic_block tail_bb
, rtx tail_insn
, rtx reg
)
240 VEC (basic_block
,heap
) *works
;
242 loop
->tail
= tail_bb
;
243 loop
->loop_end
= tail_insn
;
244 loop
->iter_reg
= reg
;
245 loop
->incoming
= VEC_alloc (edge
, gc
, 2);
246 loop
->start_label
= JUMP_LABEL (tail_insn
);
248 if (EDGE_COUNT (tail_bb
->succs
) != 2)
253 loop
->head
= BRANCH_EDGE (tail_bb
)->dest
;
254 loop
->successor
= FALLTHRU_EDGE (tail_bb
)->dest
;
256 works
= VEC_alloc (basic_block
, heap
, 20);
257 VEC_safe_push (basic_block
, heap
, works
, loop
->head
);
260 for (dwork
= 0; VEC_iterate (basic_block
, works
, dwork
, bb
); dwork
++)
264 if (bb
== EXIT_BLOCK_PTR
)
266 /* We've reached the exit block. The loop must be bad. */
269 ";; Loop is bad - reached exit block while scanning\n");
274 if (bitmap_bit_p (loop
->block_bitmap
, bb
->index
))
277 /* We've not seen this block before. Add it to the loop's
278 list and then add each successor to the work list. */
280 VEC_safe_push (basic_block
, heap
, loop
->blocks
, bb
);
281 bitmap_set_bit (loop
->block_bitmap
, bb
->index
);
287 FOR_EACH_EDGE (e
, ei
, bb
->succs
)
289 basic_block succ
= EDGE_SUCC (bb
, ei
.index
)->dest
;
290 if (REGNO_REG_SET_P (df_get_live_in (succ
),
291 REGNO (loop
->iter_reg
)))
292 VEC_safe_push (basic_block
, heap
, works
, succ
);
300 /* Find the predecessor, and make sure nothing else jumps into this loop. */
303 FOR_EACH_VEC_ELT (basic_block
, loop
->blocks
, dwork
, bb
)
307 FOR_EACH_EDGE (e
, ei
, bb
->preds
)
309 basic_block pred
= e
->src
;
311 if (!bb_in_loop_p (loop
, pred
))
314 fprintf (dump_file
, ";; Loop %d: incoming edge %d -> %d\n",
315 loop
->loop_no
, pred
->index
,
317 VEC_safe_push (edge
, gc
, loop
->incoming
, e
);
322 if (!process_incoming_edges (loop
))
326 ";; retrying loop %d with forwarder blocks\n",
328 if (!add_forwarder_blocks (loop
))
331 fprintf (dump_file
, ";; No forwarder blocks found\n");
334 else if (!process_incoming_edges (loop
))
338 ";; can't find suitable entry for loop %d\n",
344 VEC_free (basic_block
, heap
, works
);
347 /* Analyze the structure of the loops in the current function. Use
348 LOOP_STACK for bitmap allocations. Returns all the valid candidates for
349 hardware loops found in this function. HOOKS is the argument
350 passed to reorg_loops, used here to find the iteration registers
351 from a loop_end pattern. */
353 discover_loops (bitmap_obstack
*loop_stack
, struct hw_doloop_hooks
*hooks
)
355 hwloop_info loops
= NULL
;
360 /* Find all the possible loop tails. This means searching for every
361 loop_end instruction. For each one found, create a hwloop_info
362 structure and add the head block to the work list. */
365 rtx tail
= BB_END (bb
);
368 while (tail
&& GET_CODE (tail
) == NOTE
&& tail
!= BB_HEAD (bb
))
369 tail
= PREV_INSN (tail
);
371 if (tail
== NULL_RTX
)
376 reg
= hooks
->end_pattern_reg (tail
);
380 /* A possible loop end */
382 /* There's a degenerate case we can handle - an empty loop consisting
383 of only a back branch. Handle that by deleting the branch. */
384 insn
= JUMP_LABEL (tail
);
385 while (insn
&& !NONDEBUG_INSN_P (insn
))
386 insn
= NEXT_INSN (insn
);
389 basic_block succ
= FALLTHRU_EDGE (bb
)->dest
;
392 fprintf (dump_file
, ";; degenerate loop ending at\n");
393 print_rtl_single (dump_file
, tail
);
395 if (!REGNO_REG_SET_P (df_get_live_in (succ
), REGNO (reg
)))
398 fprintf (dump_file
, ";; deleting it\n");
399 delete_insn_and_edges (tail
);
404 loop
= XCNEW (struct hwloop_info_d
);
407 loop
->loop_no
= nloops
++;
408 loop
->blocks
= VEC_alloc (basic_block
, heap
, 20);
409 loop
->block_bitmap
= BITMAP_ALLOC (loop_stack
);
413 fprintf (dump_file
, ";; potential loop %d ending at\n",
415 print_rtl_single (dump_file
, tail
);
418 discover_loop (loop
, bb
, tail
, reg
);
421 /* Compute loop nestings. Given two loops A and B, either the sets
422 of their blocks don't intersect at all, or one is the subset of
423 the other, or the blocks don't form a good nesting structure. */
424 for (loop
= loops
; loop
; loop
= loop
->next
)
431 for (other
= loops
; other
; other
= other
->next
)
436 if (!bitmap_intersect_p (other
->block_bitmap
, loop
->block_bitmap
))
438 if (!bitmap_intersect_compl_p (other
->block_bitmap
,
440 VEC_safe_push (hwloop_info
, heap
, loop
->loops
, other
);
441 else if (!bitmap_intersect_compl_p (loop
->block_bitmap
,
442 other
->block_bitmap
))
443 VEC_safe_push (hwloop_info
, heap
, other
->loops
, loop
);
448 ";; can't find suitable nesting for loops %d and %d\n",
449 loop
->loop_no
, other
->loop_no
);
450 loop
->bad
= other
->bad
= true;
456 dump_hwloops (loops
);
461 /* Free up the loop structures in LOOPS. */
463 free_loops (hwloop_info loops
)
467 hwloop_info loop
= loops
;
469 VEC_free (hwloop_info
, heap
, loop
->loops
);
470 VEC_free (basic_block
, heap
, loop
->blocks
);
471 BITMAP_FREE (loop
->block_bitmap
);
476 #define BB_AUX_INDEX(BB) ((intptr_t) (BB)->aux)
478 /* Initialize the aux fields to give ascending indices to basic blocks. */
480 set_bb_indices (void)
487 bb
->aux
= (void *) index
++;
490 /* The taken-branch edge from the loop end can actually go forward.
491 If the target's hardware loop support requires that the loop end be
492 after the loop start, try to reorder a loop's basic blocks when we
494 This is not very aggressive; it only moves at most one block. It
495 does not introduce new branches into loops; it may remove them, or
496 it may switch fallthru/jump edges. */
498 reorder_loops (hwloop_info loops
)
503 cfg_layout_initialize (0);
507 for (loop
= loops
; loop
; loop
= loop
->next
)
515 if (BB_AUX_INDEX (loop
->head
) <= BB_AUX_INDEX (loop
->tail
))
518 FOR_EACH_EDGE (e
, ei
, loop
->head
->succs
)
520 if (bitmap_bit_p (loop
->block_bitmap
, e
->dest
->index
)
521 && BB_AUX_INDEX (e
->dest
) < BB_AUX_INDEX (loop
->tail
))
523 basic_block start_bb
= e
->dest
;
524 basic_block start_prev_bb
= start_bb
->prev_bb
;
527 fprintf (dump_file
, ";; Moving block %d before block %d\n",
528 loop
->head
->index
, start_bb
->index
);
529 loop
->head
->prev_bb
->next_bb
= loop
->head
->next_bb
;
530 loop
->head
->next_bb
->prev_bb
= loop
->head
->prev_bb
;
532 loop
->head
->prev_bb
= start_prev_bb
;
533 loop
->head
->next_bb
= start_bb
;
534 start_prev_bb
->next_bb
= start_bb
->prev_bb
= loop
->head
;
545 if (bb
->next_bb
!= EXIT_BLOCK_PTR
)
546 bb
->aux
= bb
->next_bb
;
550 cfg_layout_finalize ();
551 clear_aux_for_blocks ();
555 /* Call the OPT function for LOOP and all of its sub-loops. This is
556 done in a depth-first search; innermost loops are visited first.
557 OPTIMIZE and FAIL are the functions passed to reorg_loops by the
558 target's reorg pass. */
560 optimize_loop (hwloop_info loop
, struct hw_doloop_hooks
*hooks
)
574 fprintf (dump_file
, ";; loop %d bad when found\n", loop
->loop_no
);
578 /* Every loop contains in its list of inner loops every loop nested inside
579 it, even if there are intermediate loops. This works because we're doing
580 a depth-first search here and never visit a loop more than once.
581 Recursion depth is effectively limited by the number of available
582 hardware registers. */
583 for (ix
= 0; VEC_iterate (hwloop_info
, loop
->loops
, ix
, inner
); ix
++)
585 optimize_loop (inner
, hooks
);
587 if (!inner
->bad
&& inner_depth
< inner
->depth
)
588 inner_depth
= inner
->depth
;
589 /* The set of registers may be changed while optimizing the inner
591 IOR_HARD_REG_SET (loop
->regs_set_in_loop
, inner
->regs_set_in_loop
);
594 loop
->depth
= inner_depth
+ 1;
596 if (hooks
->opt (loop
))
601 fprintf (dump_file
, ";; loop %d is bad\n", loop
->loop_no
);
607 /* This function can be used from a port's machine_dependent_reorg to
608 find and analyze loops that end in loop_end instructions. It uses
609 a set of function pointers in HOOKS to call back into the
610 target-specific functions to perform the actual machine-specific
613 Such transformations typically involve additional set-up
614 instructions before the loop, to define loop bounds or set up a
615 special loop counter register.
617 DO_REORDER should be set to true if we should try to use the
618 reorder_loops function to ensure the loop end occurs after the loop
619 start. This is for use by targets where the loop hardware requires
622 HOOKS is used to pass in target specific hooks; see
625 reorg_loops (bool do_reorder
, struct hw_doloop_hooks
*hooks
)
627 hwloop_info loops
= NULL
;
629 bitmap_obstack loop_stack
;
631 df_live_add_problem ();
632 df_live_set_all_dirty ();
635 bitmap_obstack_initialize (&loop_stack
);
638 fprintf (dump_file
, ";; Find loops, first pass\n\n");
640 loops
= discover_loops (&loop_stack
, hooks
);
644 reorder_loops (loops
);
648 fprintf (dump_file
, ";; Find loops, second pass\n\n");
650 loops
= discover_loops (&loop_stack
, hooks
);
653 for (loop
= loops
; loop
; loop
= loop
->next
)
656 /* Now apply the optimizations. */
657 for (loop
= loops
; loop
; loop
= loop
->next
)
658 optimize_loop (loop
, hooks
);
662 fprintf (dump_file
, ";; After hardware loops optimization:\n\n");
663 dump_hwloops (loops
);
669 print_rtl (dump_file
, get_insns ());