PR C++/689
[official-gcc.git] / gcc / cfgloopanal.c
blob0843a006acbc080bfe10135b244c307bcc84183d
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
9 version.
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
14 for more details.
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
19 02111-1307, USA. */
21 #include "config.h"
22 #include "system.h"
23 #include "coretypes.h"
24 #include "tm.h"
25 #include "rtl.h"
26 #include "hard-reg-set.h"
27 #include "basic-block.h"
28 #include "cfgloop.h"
29 #include "expr.h"
30 #include "output.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 *,
43 bool *));
44 static bool simple_loop_exit_p PARAMS ((struct loops *, struct loop *,
45 edge, regset, rtx *,
46 struct loop_desc *));
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. */
55 bool
56 just_once_each_iteration_p (loops, loop, bb)
57 struct loops *loops;
58 struct loop *loop;
59 basic_block bb;
61 /* It must be executed at least once each iteration. */
62 if (!dominated_by_p (loops->cfg.dom, loop->latch, bb))
63 return false;
65 /* And just once. */
66 if (bb->loop_father != loop)
67 return false;
69 /* But this was not enough. We might have some irreducible loop here. */
70 if (bb->flags & BB_IRREDUCIBLE_LOOP)
71 return false;
73 return true;
77 /* Unmarks modified registers; helper to blocks_invariant_registers. */
78 static void
79 unmark_altered (what, by, regs)
80 rtx what;
81 rtx by ATTRIBUTE_UNUSED;
82 regset regs;
84 if (GET_CODE (what) == SUBREG)
85 what = SUBREG_REG (what);
86 if (!REG_P (what))
87 return;
88 CLEAR_REGNO_REG_SET (regs, REGNO (what));
91 /* Marks registers that are invariant inside blocks BBS. */
92 static void
93 blocks_invariant_registers (bbs, nbbs, regs)
94 basic_block *bbs;
95 int nbbs;
96 regset regs;
98 rtx insn;
99 int i;
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))
107 if (INSN_P (insn))
108 note_stores (PATTERN (insn),
109 (void (*) PARAMS ((rtx, rtx, void *))) unmark_altered,
110 regs);
113 /* Unmarks modified registers; helper to blocks_single_set_registers. */
114 struct unmark_altered_insn_data
116 rtx *regs;
117 rtx insn;
120 static void
121 unmark_altered_insn (what, by, data)
122 rtx what;
123 rtx by ATTRIBUTE_UNUSED;
124 struct unmark_altered_insn_data *data;
126 int rn;
128 if (GET_CODE (what) == SUBREG)
129 what = SUBREG_REG (what);
130 if (!REG_P (what))
131 return;
132 rn = REGNO (what);
133 if (data->regs[rn] == data->insn)
134 return;
135 data->regs[rn] = NULL;
138 /* Marks registers that have just single simple set in BBS; the relevant
139 insn is returned in REGS. */
140 static void
141 blocks_single_set_registers (bbs, nbbs, regs)
142 basic_block *bbs;
143 int nbbs;
144 rtx *regs;
146 rtx insn;
147 int i;
148 struct unmark_altered_insn_data data;
150 for (i = 0; i < max_reg_num (); i++)
151 regs[i] = NULL;
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);
159 if (!set)
160 continue;
161 if (!REG_P (SET_DEST (set)))
162 continue;
163 regs[REGNO (SET_DEST (set))] = insn;
166 data.regs = regs;
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))
172 if (!INSN_P (insn))
173 continue;
174 data.insn = insn;
175 note_stores (PATTERN (insn),
176 (void (*) PARAMS ((rtx, rtx, void *))) unmark_altered_insn,
177 &data);
181 /* Helper for invariant_rtx_wrto_regs_p. */
182 static int
183 invariant_rtx_wrto_regs_p_helper (expr, invariant_regs)
184 rtx *expr;
185 regset invariant_regs;
187 switch (GET_CODE (*expr))
189 case CC0:
190 case PC:
191 case UNSPEC_VOLATILE:
192 return 1;
194 case CONST_INT:
195 case CONST_DOUBLE:
196 case CONST:
197 case SYMBOL_REF:
198 case LABEL_REF:
199 return 0;
201 case ASM_OPERANDS:
202 return MEM_VOLATILE_P (*expr);
204 case MEM:
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);
209 case REG:
210 return !REGNO_REG_SET_P (invariant_regs, REGNO (*expr));
212 default:
213 return 0;
217 /* Checks that EXPR is invariant provided that INVARIANT_REGS are invariant. */
218 static bool
219 invariant_rtx_wrto_regs_p (expr, invariant_regs)
220 rtx expr;
221 regset invariant_regs;
223 return !for_each_rtx (&expr, (rtx_function) invariant_rtx_wrto_regs_p_helper,
224 invariant_regs);
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. */
230 static bool
231 simple_condition_p (loop, condition, invariant_regs, desc)
232 struct loop *loop ATTRIBUTE_UNUSED;
233 rtx condition;
234 regset invariant_regs;
235 struct loop_desc *desc;
237 rtx op0, op1;
239 /* Check condition. */
240 switch (GET_CODE (condition))
242 case EQ:
243 case NE:
244 case LE:
245 case LT:
246 case GE:
247 case GT:
248 case GEU:
249 case GTU:
250 case LEU:
251 case LTU:
252 break;
253 default:
254 return false;
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)
260 return false;
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. */
270 if (!REG_P (op1))
271 return false;
272 desc->var = op1;
273 desc->lim = op0;
275 desc->cond = swap_condition (GET_CODE (condition));
276 if (desc->cond == UNKNOWN)
277 return false;
278 return true;
281 /* Check the other operand. */
282 if (!invariant_rtx_wrto_regs_p (op1, invariant_regs))
283 return false;
284 if (!REG_P (op0))
285 return false;
287 desc->var = op0;
288 desc->lim = op1;
290 desc->cond = GET_CODE (condition);
292 return true;
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
297 modified. */
298 static basic_block
299 simple_increment (loops, loop, simple_increment_regs, desc)
300 struct loops *loops;
301 struct loop *loop;
302 rtx *simple_increment_regs;
303 struct loop_desc *desc;
305 rtx mod_insn, set, set_src, set_add;
306 basic_block mod_bb;
308 /* Find insn that modifies var. */
309 mod_insn = simple_increment_regs[REGNO (desc->var)];
310 if (!mod_insn)
311 return NULL;
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))
316 return NULL;
318 /* mod_insn must be a simple increment/decrement. */
319 set = single_set (mod_insn);
320 if (!set)
321 abort ();
322 if (!rtx_equal_p (SET_DEST (set), desc->var))
323 abort ();
325 set_src = find_reg_equal_equiv_note (mod_insn);
326 if (!set_src)
327 set_src = SET_SRC (set);
328 if (GET_CODE (set_src) != PLUS)
329 return NULL;
330 if (!rtx_equal_p (XEXP (set_src, 0), desc->var))
331 return NULL;
333 /* Set desc->stride. */
334 set_add = XEXP (set_src, 1);
335 if (CONSTANT_P (set_add))
336 desc->stride = set_add;
337 else
338 return NULL;
340 return mod_bb;
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
345 placed here. */
346 static rtx
347 variable_initial_value (insn, invariant_regs, var, set_insn)
348 rtx insn;
349 regset invariant_regs;
350 rtx var;
351 rtx *set_insn;
353 basic_block bb;
354 rtx set;
356 /* Go back through cfg. */
357 bb = BLOCK_FOR_INSN (insn);
358 while (1)
360 for (; insn != bb->head; insn = PREV_INSN (insn))
362 if (modified_between_p (var, PREV_INSN (insn), NEXT_INSN (insn)))
363 break;
364 if (INSN_P (insn))
365 note_stores (PATTERN (insn),
366 (void (*) PARAMS ((rtx, rtx, void *))) unmark_altered,
367 invariant_regs);
370 if (insn != bb->head)
372 /* We found place where var is set. */
373 rtx set_dest;
374 rtx val;
375 rtx note;
377 set = single_set (insn);
378 if (!set)
379 return NULL;
380 set_dest = SET_DEST (set);
381 if (!rtx_equal_p (set_dest, var))
382 return NULL;
384 note = find_reg_equal_equiv_note (insn);
385 if (note && GET_CODE (XEXP (note, 0)) != EXPR_LIST)
386 val = XEXP (note, 0);
387 else
388 val = SET_SRC (set);
389 if (!invariant_rtx_wrto_regs_p (val, invariant_regs))
390 return NULL;
392 if (set_insn)
393 *set_insn = insn;
394 return val;
398 if (bb->pred->pred_next || bb->pred->src == ENTRY_BLOCK_PTR)
399 return NULL;
401 bb = bb->pred->src;
402 insn = bb->end;
405 return NULL;
408 /* Returns list of definitions of initial value of VAR at Edge. */
409 static rtx
410 variable_initial_values (e, var)
411 edge e;
412 rtx var;
414 rtx set_insn, list;
415 regset invariant_regs;
416 regset_head invariant_regs_head;
417 int i;
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)
426 return list;
428 set_insn = e->src->end;
429 while (REG_P (var)
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);
434 return list;
437 /* Counts constant number of iterations of the loop described by DESC;
438 returns false if impossible. */
439 static bool
440 constant_iterations (desc, niter, may_be_zero)
441 struct loop_desc *desc;
442 unsigned HOST_WIDE_INT *niter;
443 bool *may_be_zero;
445 rtx test, expr;
446 rtx ainit, alim;
448 test = test_for_iteration (desc, 0);
449 if (test == const0_rtx)
451 *niter = 0;
452 *may_be_zero = false;
453 return true;
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)))
464 abort ();
465 if (GET_CODE (expr) == CONST_INT)
467 *niter = INTVAL (expr);
468 return true;
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))))
475 abort ();
476 if (GET_CODE (expr) == CONST_INT)
478 *niter = INTVAL (expr);
479 return true;
483 return false;
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;
501 rtx init;
502 rtx lim;
504 enum rtx_code cond = desc->cond;
505 rtx stride = desc->stride;
506 rtx mod, exp;
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)))
511 return NULL;
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. */
517 if (desc->neg)
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
525 || cond == GTU)
526 return NULL;
527 exp = simplify_gen_binary (MINUS, GET_MODE (desc->var),
528 lim, init);
530 else
532 /* Bypass nonsensical tests. */
533 if (cond == EQ || cond == LE || cond == LT || cond == LEU
534 || cond == LTU)
535 return NULL;
536 exp = simplify_gen_binary (MINUS, GET_MODE (desc->var),
537 init, lim);
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. */
545 if (!desc->postincr)
546 exp = simplify_gen_binary (MINUS, GET_MODE (desc->var),
547 exp, stride);
549 /* Determine delta caused by exit condition. */
550 switch (cond)
552 case NE:
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)
559 != const0_rtx))
560 return NULL;
561 break;
562 case LT:
563 case GT:
564 case LTU:
565 case GTU:
566 break;
567 case LE:
568 case GE:
569 case LEU:
570 case GEU:
571 exp = simplify_gen_binary (PLUS, GET_MODE (desc->var),
572 exp, const1_rtx);
573 break;
574 default:
575 abort ();
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),
595 exp, stridem1);
596 exp = simplify_gen_binary (UDIV, GET_MODE (desc->var), exp, stride);
598 else
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),
603 exp, const1_rtx);
607 if (rtl_dump_file)
609 fprintf (rtl_dump_file, "; Number of iterations: ");
610 print_simple_rtl (rtl_dump_file, exp);
611 fprintf (rtl_dump_file, "\n");
614 return exp;
617 /* Return simplified RTX expression representing the value of test
618 described of DESC at given iteration of loop. */
620 static rtx
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);
627 rtx addval;
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)))
632 return NULL;
634 /* Ensure that we always handle the condition to stay inside loop. */
635 if (desc->neg)
636 cond = reverse_condition (cond);
638 /* Compute the value of induction variable. */
639 addval = simplify_gen_binary (MULT, GET_MODE (desc->var),
640 desc->stride,
641 gen_int_mode (desc->postincr
642 ? iter : iter + 1,
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);
649 if (rtl_dump_file)
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");
657 return exp;
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. */
664 static bool
665 simple_loop_exit_p (loops, loop, exit_edge, invariant_regs, single_set_regs, desc)
666 struct loops *loops;
667 struct loop *loop;
668 edge exit_edge;
669 struct loop_desc *desc;
670 regset invariant_regs;
671 rtx *single_set_regs;
673 basic_block mod_bb, exit_bb;
674 int fallthru_out;
675 rtx condition;
676 edge ei, e;
678 exit_bb = exit_edge->src;
680 fallthru_out = (exit_edge->flags & EDGE_FALLTHRU);
682 if (!exit_bb)
683 return false;
685 /* It must be tested (at least) once during any iteration. */
686 if (!dominated_by_p (loops->cfg.dom, loop->latch, exit_bb))
687 return false;
689 /* It must end in a simple conditional jump. */
690 if (!any_condjump_p (exit_bb->end))
691 return false;
693 ei = exit_bb->succ;
694 if (ei == exit_edge)
695 ei = ei->succ_next;
697 desc->out_edge = exit_edge;
698 desc->in_edge = ei;
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)))
703 return false;
705 if (!simple_condition_p (loop, condition, invariant_regs, desc))
706 return false;
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)))
711 return false;
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))
724 return false;
725 desc->const_iter =
726 constant_iterations (desc, &desc->niter, &desc->may_be_zero);
727 return true;
730 /* Tests whether LOOP is simple for loop. Returns simple loop description
731 in DESC. */
732 bool
733 simple_loop_p (loops, loop, desc)
734 struct loops *loops;
735 struct loop *loop;
736 struct loop_desc *desc;
738 unsigned i;
739 basic_block *body;
740 edge e;
741 struct loop_desc act;
742 bool any = false;
743 regset invariant_regs;
744 regset_head invariant_regs_head;
745 rtx *single_set_regs;
746 int n_branches;
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);
756 n_branches = 0;
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. */
765 if (!any)
766 any = true;
767 else if (!act.const_iter
768 || (desc->const_iter && act.niter >= desc->niter))
769 continue;
770 *desc = act;
773 if (body[i]->succ && body[i]->succ->succ_next)
774 n_branches++;
776 desc->n_branches = n_branches;
778 if (rtl_dump_file && any)
780 fprintf (rtl_dump_file, "; Simple loop %i\n", loop->num);
781 if (desc->postincr)
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:");
806 if (desc->neg)
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);
816 free (body);
817 FREE_REG_SET (invariant_regs);
818 free (single_set_regs);
819 return any;
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. */
828 void
829 mark_irreducible_loops (loops)
830 struct loops *loops;
832 int *dfs_in, *closed, *mr, *mri, *n_edges, *stack;
833 unsigned i;
834 edge **edges, e;
835 edge *estack;
836 basic_block act;
837 int stack_top, tick, depth;
838 struct loop *cloop;
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++)
862 n_edges[i] = 0;
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)
868 continue;
869 /* And latch edges. */
870 if (e->dest->loop_father->header == e->dest
871 && e->dest->loop_father->latch == act)
872 continue;
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]++;
880 continue;
882 /* Edges exiting loops remain. They should lead from representative
883 of the son of nearest common ancestor of the loops in that
884 act lays. */
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;
888 else
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));
896 n_edges[i] = 0;
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)
903 continue;
904 if (e->dest->loop_father->header == e->dest
905 && e->dest->loop_father->latch == act)
906 continue;
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;
911 continue;
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;
916 else
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
923 loops.*/
924 tick = 0;
925 for (i = 0; i < last_basic_block + loops->num; i++)
927 dfs_in[i] = -1;
928 closed[i] = 0;
929 mr[i] = last_basic_block + loops->num;
930 mri[i] = -1;
933 stack_top = 0;
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;
939 stack_top++;
942 while (stack_top)
944 int idx, sidx;
946 idx = stack[stack_top - 1];
947 if (dfs_in[idx] < 0)
948 dfs_in[idx] = tick++;
950 while (n_edges[idx])
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;
956 if (closed[sidx])
958 if (!closed[mri[sidx]])
960 if (mr[sidx] < mr[idx])
962 mr[idx] = mr[sidx];
963 mri[idx] = mri[sidx];
966 if (mr[sidx] <= dfs_in[idx])
967 e->flags |= EDGE_IRREDUCIBLE_LOOP;
969 continue;
971 if (dfs_in[sidx] < 0)
973 stack[stack_top] = sidx;
974 estack[stack_top] = e;
975 stack_top++;
976 goto next;
978 if (dfs_in[sidx] < mr[idx])
980 mr[idx] = dfs_in[sidx];
981 mri[idx] = sidx;
983 e->flags |= EDGE_IRREDUCIBLE_LOOP;
986 /* Return back. */
987 closed[idx] = 1;
988 e = estack[stack_top - 1];
989 stack_top--;
990 if (e)
992 /* Propagate information back. */
993 sidx = stack[stack_top - 1];
994 if (mr[sidx] > mr[idx])
996 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;
1005 next:;
1008 free (stack);
1009 free (estack);
1010 free (dfs_in);
1011 free (closed);
1012 free (mr);
1013 free (mri);
1014 for (i = 0; i < last_basic_block + loops->num; i++)
1015 free (edges[i]);
1016 free (edges);
1017 free (n_edges);
1018 loops->state |= LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS;
1021 /* Counts number of insns inside LOOP. */
1023 num_loop_insns (loop)
1024 struct loop *loop;
1026 basic_block *bbs, bb;
1027 unsigned i, ninsns = 0;
1028 rtx insn;
1030 bbs = get_loop_body (loop);
1031 for (i = 0; i < loop->num_nodes; i++)
1033 bb = bbs[i];
1034 ninsns++;
1035 for (insn = bb->head; insn != bb->end; insn = NEXT_INSN (insn))
1036 ninsns++;
1038 free(bbs);
1040 return ninsns;
1043 /* Counts number of insns executed on average per iteration LOOP. */
1045 average_num_loop_insns (loop)
1046 struct loop *loop;
1048 basic_block *bbs, bb;
1049 unsigned i, binsns, ninsns, ratio;
1050 rtx insn;
1052 ninsns = 0;
1053 bbs = get_loop_body (loop);
1054 for (i = 0; i < loop->num_nodes; i++)
1056 bb = bbs[i];
1058 binsns = 1;
1059 for (insn = bb->head; insn != bb->end; insn = NEXT_INSN (insn))
1060 binsns++;
1062 ratio = loop->header->frequency == 0
1063 ? BB_FREQ_MAX
1064 : (bb->frequency * BB_FREQ_MAX) / loop->header->frequency;
1065 ninsns += binsns * ratio;
1067 free(bbs);
1069 ninsns /= BB_FREQ_MAX;
1070 if (!ninsns)
1071 ninsns = 1; /* To avoid division by zero. */
1073 return ninsns;
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. */
1079 unsigned
1080 expected_loop_iterations (loop)
1081 const struct loop *loop;
1083 edge e;
1085 if (loop->header->count)
1087 gcov_type count_in, count_latch, expected;
1089 count_in = 0;
1090 count_latch = 0;
1092 for (e = loop->header->pred; e; e = e->pred_next)
1093 if (e->src == loop->latch)
1094 count_latch = e->count;
1095 else
1096 count_in += e->count;
1098 if (count_in == 0)
1099 return 0;
1101 expected = (count_latch + count_in - 1) / count_in;
1103 /* Avoid overflows. */
1104 return (expected > REG_BR_PROB_BASE ? REG_BR_PROB_BASE : expected);
1106 else
1108 int freq_in, freq_latch;
1110 freq_in = 0;
1111 freq_latch = 0;
1113 for (e = loop->header->pred; e; e = e->pred_next)
1114 if (e->src == loop->latch)
1115 freq_latch = EDGE_FREQUENCY (e);
1116 else
1117 freq_in += EDGE_FREQUENCY (e);
1119 if (freq_in == 0)
1120 return 0;
1122 return (freq_latch + freq_in - 1) / freq_in;