1 /* Natural loop analysis code for GNU compiler.
2 Copyright (C) 2002 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 2, 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 COPYING. If not, write to the Free
18 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
23 #include "coretypes.h"
26 #include "hard-reg-set.h"
27 #include "basic-block.h"
32 struct unmark_altered_insn_data
;
33 static void unmark_altered
PARAMS ((rtx
, rtx
, regset
));
34 static void blocks_invariant_registers
PARAMS ((basic_block
*, int, regset
));
35 static void unmark_altered_insn
PARAMS ((rtx
, rtx
, struct unmark_altered_insn_data
*));
36 static void blocks_single_set_registers
PARAMS ((basic_block
*, int, rtx
*));
37 static int invariant_rtx_wrto_regs_p_helper
PARAMS ((rtx
*, regset
));
38 static bool invariant_rtx_wrto_regs_p
PARAMS ((rtx
, regset
));
39 static rtx test_for_iteration
PARAMS ((struct loop_desc
*desc
,
40 unsigned HOST_WIDE_INT
));
41 static bool constant_iterations
PARAMS ((struct loop_desc
*,
42 unsigned HOST_WIDE_INT
*,
44 static bool simple_loop_exit_p
PARAMS ((struct loops
*, struct loop
*,
47 static rtx variable_initial_value
PARAMS ((rtx
, regset
, rtx
, rtx
*));
48 static rtx variable_initial_values
PARAMS ((edge
, rtx
));
49 static bool simple_condition_p
PARAMS ((struct loop
*, rtx
,
50 regset
, struct loop_desc
*));
51 static basic_block simple_increment
PARAMS ((struct loops
*, struct loop
*,
52 rtx
*, struct loop_desc
*));
54 /* Checks whether BB is executed exactly once in each LOOP iteration. */
56 just_once_each_iteration_p (loops
, loop
, bb
)
61 /* It must be executed at least once each iteration. */
62 if (!dominated_by_p (loops
->cfg
.dom
, loop
->latch
, bb
))
66 if (bb
->loop_father
!= loop
)
69 /* But this was not enough. We might have some irreducible loop here. */
70 if (bb
->flags
& BB_IRREDUCIBLE_LOOP
)
77 /* Unmarks modified registers; helper to blocks_invariant_registers. */
79 unmark_altered (what
, by
, regs
)
81 rtx by ATTRIBUTE_UNUSED
;
84 if (GET_CODE (what
) == SUBREG
)
85 what
= SUBREG_REG (what
);
88 CLEAR_REGNO_REG_SET (regs
, REGNO (what
));
91 /* Marks registers that are invariant inside blocks BBS. */
93 blocks_invariant_registers (bbs
, nbbs
, regs
)
101 for (i
= 0; i
< max_reg_num (); i
++)
102 SET_REGNO_REG_SET (regs
, i
);
103 for (i
= 0; i
< nbbs
; i
++)
104 for (insn
= bbs
[i
]->head
;
105 insn
!= NEXT_INSN (bbs
[i
]->end
);
106 insn
= NEXT_INSN (insn
))
108 note_stores (PATTERN (insn
),
109 (void (*) PARAMS ((rtx
, rtx
, void *))) unmark_altered
,
113 /* Unmarks modified registers; helper to blocks_single_set_registers. */
114 struct unmark_altered_insn_data
121 unmark_altered_insn (what
, by
, data
)
123 rtx by ATTRIBUTE_UNUSED
;
124 struct unmark_altered_insn_data
*data
;
128 if (GET_CODE (what
) == SUBREG
)
129 what
= SUBREG_REG (what
);
133 if (data
->regs
[rn
] == data
->insn
)
135 data
->regs
[rn
] = NULL
;
138 /* Marks registers that have just single simple set in BBS; the relevant
139 insn is returned in REGS. */
141 blocks_single_set_registers (bbs
, nbbs
, regs
)
148 struct unmark_altered_insn_data data
;
150 for (i
= 0; i
< max_reg_num (); i
++)
153 for (i
= 0; i
< nbbs
; i
++)
154 for (insn
= bbs
[i
]->head
;
155 insn
!= NEXT_INSN (bbs
[i
]->end
);
156 insn
= NEXT_INSN (insn
))
158 rtx set
= single_set (insn
);
161 if (!REG_P (SET_DEST (set
)))
163 regs
[REGNO (SET_DEST (set
))] = insn
;
167 for (i
= 0; i
< nbbs
; i
++)
168 for (insn
= bbs
[i
]->head
;
169 insn
!= NEXT_INSN (bbs
[i
]->end
);
170 insn
= NEXT_INSN (insn
))
175 note_stores (PATTERN (insn
),
176 (void (*) PARAMS ((rtx
, rtx
, void *))) unmark_altered_insn
,
181 /* Helper for invariant_rtx_wrto_regs_p. */
183 invariant_rtx_wrto_regs_p_helper (expr
, invariant_regs
)
185 regset invariant_regs
;
187 switch (GET_CODE (*expr
))
191 case UNSPEC_VOLATILE
:
202 return MEM_VOLATILE_P (*expr
);
205 /* If the memory is not constant, assume it is modified. If it is
206 constant, we still have to check the address. */
207 return !RTX_UNCHANGING_P (*expr
);
210 return !REGNO_REG_SET_P (invariant_regs
, REGNO (*expr
));
217 /* Checks that EXPR is invariant provided that INVARIANT_REGS are invariant. */
219 invariant_rtx_wrto_regs_p (expr
, invariant_regs
)
221 regset invariant_regs
;
223 return !for_each_rtx (&expr
, (rtx_function
) invariant_rtx_wrto_regs_p_helper
,
227 /* Checks whether CONDITION is a simple comparison in that one of operands
228 is register and the other one is invariant in the LOOP. Fills var, lim
229 and cond fields in DESC. */
231 simple_condition_p (loop
, condition
, invariant_regs
, desc
)
232 struct loop
*loop ATTRIBUTE_UNUSED
;
234 regset invariant_regs
;
235 struct loop_desc
*desc
;
239 /* Check condition. */
240 switch (GET_CODE (condition
))
257 /* Of integers or pointers. */
258 if (GET_MODE_CLASS (GET_MODE (XEXP (condition
, 0))) != MODE_INT
259 && GET_MODE_CLASS (GET_MODE (XEXP (condition
, 0))) != MODE_PARTIAL_INT
)
262 /* One of operands must be a simple register. */
263 op0
= XEXP (condition
, 0);
264 op1
= XEXP (condition
, 1);
266 /* One of operands must be invariant. */
267 if (invariant_rtx_wrto_regs_p (op0
, invariant_regs
))
269 /* And the other one must be a register. */
275 desc
->cond
= swap_condition (GET_CODE (condition
));
276 if (desc
->cond
== UNKNOWN
)
281 /* Check the other operand. */
282 if (!invariant_rtx_wrto_regs_p (op1
, invariant_regs
))
290 desc
->cond
= GET_CODE (condition
);
295 /* Checks whether DESC->var is incremented/decremented exactly once each
296 iteration. Fills in DESC->stride and returns block in that DESC->var is
299 simple_increment (loops
, loop
, simple_increment_regs
, desc
)
302 rtx
*simple_increment_regs
;
303 struct loop_desc
*desc
;
305 rtx mod_insn
, set
, set_src
, set_add
;
308 /* Find insn that modifies var. */
309 mod_insn
= simple_increment_regs
[REGNO (desc
->var
)];
312 mod_bb
= BLOCK_FOR_INSN (mod_insn
);
314 /* Check that it is executed exactly once each iteration. */
315 if (!just_once_each_iteration_p (loops
, loop
, mod_bb
))
318 /* mod_insn must be a simple increment/decrement. */
319 set
= single_set (mod_insn
);
322 if (!rtx_equal_p (SET_DEST (set
), desc
->var
))
325 set_src
= find_reg_equal_equiv_note (mod_insn
);
327 set_src
= SET_SRC (set
);
328 if (GET_CODE (set_src
) != PLUS
)
330 if (!rtx_equal_p (XEXP (set_src
, 0), desc
->var
))
333 /* Set desc->stride. */
334 set_add
= XEXP (set_src
, 1);
335 if (CONSTANT_P (set_add
))
336 desc
->stride
= set_add
;
343 /* Tries to find initial value of VAR in INSN. This value must be invariant
344 wrto INVARIANT_REGS. If SET_INSN is not NULL, insn in that var is set is
347 variable_initial_value (insn
, invariant_regs
, var
, set_insn
)
349 regset invariant_regs
;
356 /* Go back through cfg. */
357 bb
= BLOCK_FOR_INSN (insn
);
360 for (; insn
!= bb
->head
; insn
= PREV_INSN (insn
))
362 if (modified_between_p (var
, PREV_INSN (insn
), NEXT_INSN (insn
)))
365 note_stores (PATTERN (insn
),
366 (void (*) PARAMS ((rtx
, rtx
, void *))) unmark_altered
,
370 if (insn
!= bb
->head
)
372 /* We found place where var is set. */
377 set
= single_set (insn
);
380 set_dest
= SET_DEST (set
);
381 if (!rtx_equal_p (set_dest
, var
))
384 note
= find_reg_equal_equiv_note (insn
);
385 if (note
&& GET_CODE (XEXP (note
, 0)) != EXPR_LIST
)
386 val
= XEXP (note
, 0);
389 if (!invariant_rtx_wrto_regs_p (val
, invariant_regs
))
398 if (bb
->pred
->pred_next
|| bb
->pred
->src
== ENTRY_BLOCK_PTR
)
408 /* Returns list of definitions of initial value of VAR at Edge. */
410 variable_initial_values (e
, var
)
415 regset invariant_regs
;
416 regset_head invariant_regs_head
;
419 invariant_regs
= INITIALIZE_REG_SET (invariant_regs_head
);
420 for (i
= 0; i
< max_reg_num (); i
++)
421 SET_REGNO_REG_SET (invariant_regs
, i
);
423 list
= alloc_EXPR_LIST (0, copy_rtx (var
), NULL
);
425 if (e
->src
== ENTRY_BLOCK_PTR
)
428 set_insn
= e
->src
->end
;
430 && (var
= variable_initial_value (set_insn
, invariant_regs
, var
, &set_insn
)))
431 list
= alloc_EXPR_LIST (0, copy_rtx (var
), list
);
433 FREE_REG_SET (invariant_regs
);
437 /* Counts constant number of iterations of the loop described by DESC;
438 returns false if impossible. */
440 constant_iterations (desc
, niter
, may_be_zero
)
441 struct loop_desc
*desc
;
442 unsigned HOST_WIDE_INT
*niter
;
448 test
= test_for_iteration (desc
, 0);
449 if (test
== const0_rtx
)
452 *may_be_zero
= false;
456 *may_be_zero
= (test
!= const_true_rtx
);
458 /* It would make a little sense to check every with every when we
459 know that all but the first alternative are simply registers. */
460 for (ainit
= desc
->var_alts
; ainit
; ainit
= XEXP (ainit
, 1))
462 alim
= XEXP (desc
->lim_alts
, 0);
463 if (!(expr
= count_loop_iterations (desc
, XEXP (ainit
, 0), alim
)))
465 if (GET_CODE (expr
) == CONST_INT
)
467 *niter
= INTVAL (expr
);
471 for (alim
= XEXP (desc
->lim_alts
, 1); alim
; alim
= XEXP (alim
, 1))
473 ainit
= XEXP (desc
->var_alts
, 0);
474 if (!(expr
= count_loop_iterations (desc
, ainit
, XEXP (alim
, 0))))
476 if (GET_CODE (expr
) == CONST_INT
)
478 *niter
= INTVAL (expr
);
486 /* Return RTX expression representing number of iterations of loop as bounded
487 by test described by DESC (in the case loop really has multiple exit
488 edges, fewer iterations may happen in the practice).
490 Return NULL if it is unknown. Additionally the value may be invalid for
491 paradoxical loop (lets define paradoxical loops as loops whose test is
492 failing at -1th iteration, for instance "for (i=5;i<1;i++);").
494 These cases needs to be either cared by copying the loop test in the front
495 of loop or keeping the test in first iteration of loop.
497 When INIT/LIM are set, they are used instead of var/lim of DESC. */
499 count_loop_iterations (desc
, init
, lim
)
500 struct loop_desc
*desc
;
504 enum rtx_code cond
= desc
->cond
;
505 rtx stride
= desc
->stride
;
508 /* Give up on floating point modes and friends. It can be possible to do
509 the job for constant loop bounds, but it is probably not worthwhile. */
510 if (!INTEGRAL_MODE_P (GET_MODE (desc
->var
)))
513 init
= copy_rtx (init
? init
: desc
->var
);
514 lim
= copy_rtx (lim
? lim
: desc
->lim
);
516 /* Ensure that we always handle the condition to stay inside loop. */
518 cond
= reverse_condition (cond
);
520 /* Compute absolute value of the difference of initial and final value. */
521 if (INTVAL (stride
) > 0)
523 /* Bypass nonsensical tests. */
524 if (cond
== EQ
|| cond
== GE
|| cond
== GT
|| cond
== GEU
527 exp
= simplify_gen_binary (MINUS
, GET_MODE (desc
->var
),
532 /* Bypass nonsensical tests. */
533 if (cond
== EQ
|| cond
== LE
|| cond
== LT
|| cond
== LEU
536 exp
= simplify_gen_binary (MINUS
, GET_MODE (desc
->var
),
538 stride
= simplify_gen_unary (NEG
, GET_MODE (desc
->var
),
539 stride
, GET_MODE (desc
->var
));
542 /* Normalize difference so the value is always first examined
543 and later incremented. */
546 exp
= simplify_gen_binary (MINUS
, GET_MODE (desc
->var
),
549 /* Determine delta caused by exit condition. */
553 /* For NE tests, make sure that the iteration variable won't miss
554 the final value. If EXP mod STRIDE is not zero, then the
555 iteration variable will overflow before the loop exits, and we
556 can not calculate the number of iterations easily. */
557 if (stride
!= const1_rtx
558 && (simplify_gen_binary (UMOD
, GET_MODE (desc
->var
), exp
, stride
)
571 exp
= simplify_gen_binary (PLUS
, GET_MODE (desc
->var
),
578 if (stride
!= const1_rtx
)
580 /* Number of iterations is now (EXP + STRIDE - 1 / STRIDE),
581 but we need to take care for overflows. */
583 mod
= simplify_gen_binary (UMOD
, GET_MODE (desc
->var
), exp
, stride
);
585 /* This is dirty trick. When we can't compute number of iterations
586 to be constant, we simply ignore the possible overflow, as
587 runtime unroller always use power of 2 amounts and does not
588 care about possible lost bits. */
590 if (GET_CODE (mod
) != CONST_INT
)
592 rtx stridem1
= simplify_gen_binary (PLUS
, GET_MODE (desc
->var
),
593 stride
, constm1_rtx
);
594 exp
= simplify_gen_binary (PLUS
, GET_MODE (desc
->var
),
596 exp
= simplify_gen_binary (UDIV
, GET_MODE (desc
->var
), exp
, stride
);
600 exp
= simplify_gen_binary (UDIV
, GET_MODE (desc
->var
), exp
, stride
);
601 if (mod
!= const0_rtx
)
602 exp
= simplify_gen_binary (PLUS
, GET_MODE (desc
->var
),
609 fprintf (rtl_dump_file
, "; Number of iterations: ");
610 print_simple_rtl (rtl_dump_file
, exp
);
611 fprintf (rtl_dump_file
, "\n");
617 /* Return simplified RTX expression representing the value of test
618 described of DESC at given iteration of loop. */
621 test_for_iteration (desc
, iter
)
622 struct loop_desc
*desc
;
623 unsigned HOST_WIDE_INT iter
;
625 enum rtx_code cond
= desc
->cond
;
626 rtx exp
= XEXP (desc
->var_alts
, 0);
629 /* Give up on floating point modes and friends. It can be possible to do
630 the job for constant loop bounds, but it is probably not worthwhile. */
631 if (!INTEGRAL_MODE_P (GET_MODE (desc
->var
)))
634 /* Ensure that we always handle the condition to stay inside loop. */
636 cond
= reverse_condition (cond
);
638 /* Compute the value of induction variable. */
639 addval
= simplify_gen_binary (MULT
, GET_MODE (desc
->var
),
641 gen_int_mode (desc
->postincr
643 GET_MODE (desc
->var
)));
644 exp
= simplify_gen_binary (PLUS
, GET_MODE (desc
->var
), exp
, addval
);
645 /* Test at given condition. */
646 exp
= simplify_gen_relational (cond
, SImode
,
647 GET_MODE (desc
->var
), exp
, desc
->lim
);
651 fprintf (rtl_dump_file
, "; Conditional to continue loop at ");
652 fprintf (rtl_dump_file
, HOST_WIDE_INT_PRINT_UNSIGNED
, iter
);
653 fprintf (rtl_dump_file
, "th iteration: ");
654 print_simple_rtl (rtl_dump_file
, exp
);
655 fprintf (rtl_dump_file
, "\n");
661 /* Tests whether exit at EXIT_EDGE from LOOP is simple. Returns simple loop
662 description joined to it in in DESC. INVARIANT_REGS and SINGLE_SET_REGS
663 are results of blocks_{invariant,single_set}_regs over BODY. */
665 simple_loop_exit_p (loops
, loop
, exit_edge
, invariant_regs
, single_set_regs
, desc
)
669 struct loop_desc
*desc
;
670 regset invariant_regs
;
671 rtx
*single_set_regs
;
673 basic_block mod_bb
, exit_bb
;
678 exit_bb
= exit_edge
->src
;
680 fallthru_out
= (exit_edge
->flags
& EDGE_FALLTHRU
);
685 /* It must be tested (at least) once during any iteration. */
686 if (!dominated_by_p (loops
->cfg
.dom
, loop
->latch
, exit_bb
))
689 /* It must end in a simple conditional jump. */
690 if (!any_condjump_p (exit_bb
->end
))
697 desc
->out_edge
= exit_edge
;
700 /* Condition must be a simple comparison in that one of operands
701 is register and the other one is invariant. */
702 if (!(condition
= get_condition (exit_bb
->end
, NULL
)))
705 if (!simple_condition_p (loop
, condition
, invariant_regs
, desc
))
708 /* Var must be simply incremented or decremented in exactly one insn that
709 is executed just once every iteration. */
710 if (!(mod_bb
= simple_increment (loops
, loop
, single_set_regs
, desc
)))
713 /* OK, it is simple loop. Now just fill in remaining info. */
714 desc
->postincr
= !dominated_by_p (loops
->cfg
.dom
, exit_bb
, mod_bb
);
715 desc
->neg
= !fallthru_out
;
717 /* Find initial value of var and alternative values for lim. */
718 e
= loop_preheader_edge (loop
);
719 desc
->var_alts
= variable_initial_values (e
, desc
->var
);
720 desc
->lim_alts
= variable_initial_values (e
, desc
->lim
);
722 /* Number of iterations. */
723 if (!count_loop_iterations (desc
, NULL
, NULL
))
726 constant_iterations (desc
, &desc
->niter
, &desc
->may_be_zero
);
730 /* Tests whether LOOP is simple for loop. Returns simple loop description
733 simple_loop_p (loops
, loop
, desc
)
736 struct loop_desc
*desc
;
741 struct loop_desc act
;
743 regset invariant_regs
;
744 regset_head invariant_regs_head
;
745 rtx
*single_set_regs
;
748 body
= get_loop_body (loop
);
750 invariant_regs
= INITIALIZE_REG_SET (invariant_regs_head
);
751 single_set_regs
= xmalloc (max_reg_num () * sizeof (rtx
));
753 blocks_invariant_registers (body
, loop
->num_nodes
, invariant_regs
);
754 blocks_single_set_registers (body
, loop
->num_nodes
, single_set_regs
);
757 for (i
= 0; i
< loop
->num_nodes
; i
++)
759 for (e
= body
[i
]->succ
; e
; e
= e
->succ_next
)
760 if (!flow_bb_inside_loop_p (loop
, e
->dest
)
761 && simple_loop_exit_p (loops
, loop
, e
,
762 invariant_regs
, single_set_regs
, &act
))
764 /* Prefer constant iterations; the less the better. */
767 else if (!act
.const_iter
768 || (desc
->const_iter
&& act
.niter
>= desc
->niter
))
773 if (body
[i
]->succ
&& body
[i
]->succ
->succ_next
)
776 desc
->n_branches
= n_branches
;
778 if (rtl_dump_file
&& any
)
780 fprintf (rtl_dump_file
, "; Simple loop %i\n", loop
->num
);
782 fprintf (rtl_dump_file
,
783 "; does postincrement after loop exit condition\n");
785 fprintf (rtl_dump_file
, "; Induction variable:");
786 print_simple_rtl (rtl_dump_file
, desc
->var
);
787 fputc ('\n', rtl_dump_file
);
789 fprintf (rtl_dump_file
, "; Initial values:");
790 print_simple_rtl (rtl_dump_file
, desc
->var_alts
);
791 fputc ('\n', rtl_dump_file
);
793 fprintf (rtl_dump_file
, "; Stride:");
794 print_simple_rtl (rtl_dump_file
, desc
->stride
);
795 fputc ('\n', rtl_dump_file
);
797 fprintf (rtl_dump_file
, "; Compared with:");
798 print_simple_rtl (rtl_dump_file
, desc
->lim
);
799 fputc ('\n', rtl_dump_file
);
801 fprintf (rtl_dump_file
, "; Alternative values:");
802 print_simple_rtl (rtl_dump_file
, desc
->lim_alts
);
803 fputc ('\n', rtl_dump_file
);
805 fprintf (rtl_dump_file
, "; Exit condition:");
807 fprintf (rtl_dump_file
, "(negated)");
808 fprintf (rtl_dump_file
, "%s\n", GET_RTX_NAME (desc
->cond
));
810 fprintf (rtl_dump_file
, "; Number of branches:");
811 fprintf (rtl_dump_file
, "%d\n", desc
->n_branches
);
813 fputc ('\n', rtl_dump_file
);
817 FREE_REG_SET (invariant_regs
);
818 free (single_set_regs
);
822 /* Marks blocks and edges that are part of non-recognized loops; i.e. we
823 throw away all latch edges and mark blocks inside any remaining cycle.
824 Everything is a bit complicated due to fact we do not want to do this
825 for parts of cycles that only "pass" through some loop -- i.e. for
826 each cycle, we want to mark blocks that belong directly to innermost
827 loop containing the whole cycle. */
829 mark_irreducible_loops (loops
)
832 int *dfs_in
, *closed
, *mr
, *mri
, *n_edges
, *stack
;
837 int stack_top
, tick
, depth
;
840 /* Reset the flags. */
841 FOR_BB_BETWEEN (act
, ENTRY_BLOCK_PTR
, EXIT_BLOCK_PTR
, next_bb
)
843 act
->flags
&= ~BB_IRREDUCIBLE_LOOP
;
844 for (e
= act
->succ
; e
; e
= e
->succ_next
)
845 e
->flags
&= ~EDGE_IRREDUCIBLE_LOOP
;
848 /* The first last_basic_block + 1 entries are for real blocks (including
849 entry); then we have loops->num - 1 fake blocks for loops to that we
850 assign edges leading from loops (fake loop 0 is not interesting). */
851 dfs_in
= xmalloc ((last_basic_block
+ loops
->num
) * sizeof (int));
852 closed
= xmalloc ((last_basic_block
+ loops
->num
) * sizeof (int));
853 mr
= xmalloc ((last_basic_block
+ loops
->num
) * sizeof (int));
854 mri
= xmalloc ((last_basic_block
+ loops
->num
) * sizeof (int));
855 n_edges
= xmalloc ((last_basic_block
+ loops
->num
) * sizeof (int));
856 edges
= xmalloc ((last_basic_block
+ loops
->num
) * sizeof (edge
*));
857 stack
= xmalloc ((n_basic_blocks
+ loops
->num
) * sizeof (int));
858 estack
= xmalloc ((n_basic_blocks
+ loops
->num
) * sizeof (edge
));
860 /* Create the edge lists. */
861 for (i
= 0; i
< last_basic_block
+ loops
->num
; i
++)
863 FOR_BB_BETWEEN (act
, ENTRY_BLOCK_PTR
, EXIT_BLOCK_PTR
, next_bb
)
864 for (e
= act
->succ
; e
; e
= e
->succ_next
)
866 /* Ignore edges to exit. */
867 if (e
->dest
== EXIT_BLOCK_PTR
)
869 /* And latch edges. */
870 if (e
->dest
->loop_father
->header
== e
->dest
871 && e
->dest
->loop_father
->latch
== act
)
873 /* Edges inside a single loop should be left where they are. Edges
874 to subloop headers should lead to representative of the subloop,
875 but from the same place. */
876 if (act
->loop_father
== e
->dest
->loop_father
877 || act
->loop_father
== e
->dest
->loop_father
->outer
)
879 n_edges
[act
->index
+ 1]++;
882 /* Edges exiting loops remain. They should lead from representative
883 of the son of nearest common ancestor of the loops in that
885 depth
= find_common_loop (act
->loop_father
, e
->dest
->loop_father
)->depth
+ 1;
886 if (depth
== act
->loop_father
->depth
)
887 cloop
= act
->loop_father
;
889 cloop
= act
->loop_father
->pred
[depth
];
890 n_edges
[cloop
->num
+ last_basic_block
]++;
893 for (i
= 0; i
< last_basic_block
+ loops
->num
; i
++)
895 edges
[i
] = xmalloc (n_edges
[i
] * sizeof (edge
));
899 FOR_BB_BETWEEN (act
, ENTRY_BLOCK_PTR
, EXIT_BLOCK_PTR
, next_bb
)
900 for (e
= act
->succ
; e
; e
= e
->succ_next
)
902 if (e
->dest
== EXIT_BLOCK_PTR
)
904 if (e
->dest
->loop_father
->header
== e
->dest
905 && e
->dest
->loop_father
->latch
== act
)
907 if (act
->loop_father
== e
->dest
->loop_father
908 || act
->loop_father
== e
->dest
->loop_father
->outer
)
910 edges
[act
->index
+ 1][n_edges
[act
->index
+ 1]++] = e
;
913 depth
= find_common_loop (act
->loop_father
, e
->dest
->loop_father
)->depth
+ 1;
914 if (depth
== act
->loop_father
->depth
)
915 cloop
= act
->loop_father
;
917 cloop
= act
->loop_father
->pred
[depth
];
918 i
= cloop
->num
+ last_basic_block
;
919 edges
[i
][n_edges
[i
]++] = e
;
922 /* Compute dfs numbering, starting from loop headers, and mark found
925 for (i
= 0; i
< last_basic_block
+ loops
->num
; i
++)
929 mr
[i
] = last_basic_block
+ loops
->num
;
934 for (i
= 0; i
< loops
->num
; i
++)
935 if (loops
->parray
[i
])
937 stack
[stack_top
] = loops
->parray
[i
]->header
->index
+ 1;
938 estack
[stack_top
] = NULL
;
946 idx
= stack
[stack_top
- 1];
948 dfs_in
[idx
] = tick
++;
952 e
= edges
[idx
][--n_edges
[idx
]];
953 sidx
= e
->dest
->loop_father
->header
== e
->dest
954 ? e
->dest
->loop_father
->num
+ last_basic_block
955 : e
->dest
->index
+ 1;
958 if (!closed
[mri
[sidx
]])
960 if (mr
[sidx
] < mr
[idx
])
963 mri
[idx
] = mri
[sidx
];
966 if (mr
[sidx
] <= dfs_in
[idx
])
967 e
->flags
|= EDGE_IRREDUCIBLE_LOOP
;
971 if (dfs_in
[sidx
] < 0)
973 stack
[stack_top
] = sidx
;
974 estack
[stack_top
] = e
;
978 if (dfs_in
[sidx
] < mr
[idx
])
980 mr
[idx
] = dfs_in
[sidx
];
983 e
->flags
|= EDGE_IRREDUCIBLE_LOOP
;
988 e
= estack
[stack_top
- 1];
992 /* Propagate information back. */
993 sidx
= stack
[stack_top
- 1];
994 if (mr
[sidx
] > mr
[idx
])
997 mri
[sidx
] = mri
[idx
];
999 if (mr
[idx
] <= dfs_in
[sidx
])
1000 e
->flags
|= EDGE_IRREDUCIBLE_LOOP
;
1002 /* Mark the block if relevant. */
1003 if (idx
&& idx
<= last_basic_block
&& mr
[idx
] <= dfs_in
[idx
])
1004 BASIC_BLOCK (idx
- 1)->flags
|= BB_IRREDUCIBLE_LOOP
;
1014 for (i
= 0; i
< last_basic_block
+ loops
->num
; i
++)
1018 loops
->state
|= LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS
;
1021 /* Counts number of insns inside LOOP. */
1023 num_loop_insns (loop
)
1026 basic_block
*bbs
, bb
;
1027 unsigned i
, ninsns
= 0;
1030 bbs
= get_loop_body (loop
);
1031 for (i
= 0; i
< loop
->num_nodes
; i
++)
1035 for (insn
= bb
->head
; insn
!= bb
->end
; insn
= NEXT_INSN (insn
))
1043 /* Counts number of insns executed on average per iteration LOOP. */
1045 average_num_loop_insns (loop
)
1048 basic_block
*bbs
, bb
;
1049 unsigned i
, binsns
, ninsns
, ratio
;
1053 bbs
= get_loop_body (loop
);
1054 for (i
= 0; i
< loop
->num_nodes
; i
++)
1059 for (insn
= bb
->head
; insn
!= bb
->end
; insn
= NEXT_INSN (insn
))
1062 ratio
= loop
->header
->frequency
== 0
1064 : (bb
->frequency
* BB_FREQ_MAX
) / loop
->header
->frequency
;
1065 ninsns
+= binsns
* ratio
;
1069 ninsns
/= BB_FREQ_MAX
;
1071 ninsns
= 1; /* To avoid division by zero. */
1076 /* Returns expected number of LOOP iterations.
1077 Compute upper bound on number of iterations in case they do not fit integer
1078 to help loop peeling heuristics. Use exact counts if at all possible. */
1080 expected_loop_iterations (loop
)
1081 const struct loop
*loop
;
1085 if (loop
->header
->count
)
1087 gcov_type count_in
, count_latch
, expected
;
1092 for (e
= loop
->header
->pred
; e
; e
= e
->pred_next
)
1093 if (e
->src
== loop
->latch
)
1094 count_latch
= e
->count
;
1096 count_in
+= e
->count
;
1101 expected
= (count_latch
+ count_in
- 1) / count_in
;
1103 /* Avoid overflows. */
1104 return (expected
> REG_BR_PROB_BASE
? REG_BR_PROB_BASE
: expected
);
1108 int freq_in
, freq_latch
;
1113 for (e
= loop
->header
->pred
; e
; e
= e
->pred_next
)
1114 if (e
->src
== loop
->latch
)
1115 freq_latch
= EDGE_FREQUENCY (e
);
1117 freq_in
+= EDGE_FREQUENCY (e
);
1122 return (freq_latch
+ freq_in
- 1) / freq_in
;