i386-protos.h (x86_emit_floatuns): Declare.
[official-gcc.git] / gcc / cfgloopanal.c
blob1c2a57d182c6e3c9c95c0c5baa17bd176c7ce33c
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 that are part of non-recognized loops; i.e. we throw away
823 all latch edges and mark blocks inside any remaining cycle. Everything
824 is a bit complicated due to fact we do not want to do this for parts of
825 cycles that only "pass" through some loop -- i.e. for each cycle, we want
826 to mark blocks that belong directly to innermost loop containing the whole
827 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 basic_block act;
836 int stack_top, tick, depth;
837 struct loop *cloop;
839 /* The first last_basic_block + 1 entries are for real blocks (including
840 entry); then we have loops->num - 1 fake blocks for loops to that we
841 assign edges leading from loops (fake loop 0 is not interesting). */
842 dfs_in = xmalloc ((last_basic_block + loops->num) * sizeof (int));
843 closed = xmalloc ((last_basic_block + loops->num) * sizeof (int));
844 mr = xmalloc ((last_basic_block + loops->num) * sizeof (int));
845 mri = xmalloc ((last_basic_block + loops->num) * sizeof (int));
846 n_edges = xmalloc ((last_basic_block + loops->num) * sizeof (int));
847 edges = xmalloc ((last_basic_block + loops->num) * sizeof (edge *));
848 stack = xmalloc ((n_basic_blocks + loops->num) * sizeof (int));
850 /* Create the edge lists. */
851 for (i = 0; i < last_basic_block + loops->num; i++)
852 n_edges[i] = 0;
853 FOR_BB_BETWEEN (act, ENTRY_BLOCK_PTR, EXIT_BLOCK_PTR, next_bb)
854 for (e = act->succ; e; e = e->succ_next)
856 /* Ignore edges to exit. */
857 if (e->dest == EXIT_BLOCK_PTR)
858 continue;
859 /* And latch edges. */
860 if (e->dest->loop_father->header == e->dest
861 && e->dest->loop_father->latch == act)
862 continue;
863 /* Edges inside a single loop should be left where they are. Edges
864 to subloop headers should lead to representative of the subloop,
865 but from the same place. */
866 if (act->loop_father == e->dest->loop_father
867 || act->loop_father == e->dest->loop_father->outer)
869 n_edges[act->index + 1]++;
870 continue;
872 /* Edges exiting loops remain. They should lead from representative
873 of the son of nearest common ancestor of the loops in that
874 act lays. */
875 depth = find_common_loop (act->loop_father, e->dest->loop_father)->depth + 1;
876 if (depth == act->loop_father->depth)
877 cloop = act->loop_father;
878 else
879 cloop = act->loop_father->pred[depth];
880 n_edges[cloop->num + last_basic_block]++;
883 for (i = 0; i < last_basic_block + loops->num; i++)
885 edges[i] = xmalloc (n_edges[i] * sizeof (edge));
886 n_edges[i] = 0;
889 FOR_BB_BETWEEN (act, ENTRY_BLOCK_PTR, EXIT_BLOCK_PTR, next_bb)
890 for (e = act->succ; e; e = e->succ_next)
892 if (e->dest == EXIT_BLOCK_PTR)
893 continue;
894 if (e->dest->loop_father->header == e->dest
895 && e->dest->loop_father->latch == act)
896 continue;
897 if (act->loop_father == e->dest->loop_father
898 || act->loop_father == e->dest->loop_father->outer)
900 edges[act->index + 1][n_edges[act->index + 1]++] = e;
901 continue;
903 depth = find_common_loop (act->loop_father, e->dest->loop_father)->depth + 1;
904 if (depth == act->loop_father->depth)
905 cloop = act->loop_father;
906 else
907 cloop = act->loop_father->pred[depth];
908 i = cloop->num + last_basic_block;
909 edges[i][n_edges[i]++] = e;
912 /* Compute dfs numbering, starting from loop headers, and mark found
913 loops.*/
914 tick = 0;
915 for (i = 0; i < last_basic_block + loops->num; i++)
917 dfs_in[i] = -1;
918 closed[i] = 0;
919 mr[i] = last_basic_block + loops->num;
920 mri[i] = -1;
923 stack_top = 0;
924 for (i = 0; i < loops->num; i++)
925 if (loops->parray[i])
926 stack[stack_top++] = loops->parray[i]->header->index + 1;
928 while (stack_top)
930 int idx, sidx;
932 idx = stack[stack_top - 1];
933 if (dfs_in[idx] < 0)
934 dfs_in[idx] = tick++;
936 while (n_edges[idx])
938 e = edges[idx][--n_edges[idx]];
939 sidx = e->dest->loop_father->header == e->dest
940 ? e->dest->loop_father->num + last_basic_block
941 : e->dest->index + 1;
942 if (closed[sidx])
944 if (mr[sidx] < mr[idx] && !closed[mri[sidx]])
946 mr[idx] = mr[sidx];
947 mri[idx] = mri[sidx];
949 continue;
951 if (dfs_in[sidx] < 0)
953 stack[stack_top++] = sidx;
954 goto next;
956 if (dfs_in[sidx] < mr[idx])
958 mr[idx] = dfs_in[sidx];
959 mri[idx] = sidx;
963 /* Return back. */
964 closed[idx] = 1;
965 stack_top--;
966 if (stack_top && dfs_in[stack[stack_top - 1]] >= 0)
968 /* Propagate information back. */
969 sidx = stack[stack_top - 1];
970 if (mr[sidx] > mr[idx])
972 mr[sidx] = mr[idx];
973 mri[sidx] = mri[idx];
976 /* Mark the block if relevant. */
977 if (idx && idx <= last_basic_block && mr[idx] <= dfs_in[idx])
978 BASIC_BLOCK (idx - 1)->flags |= BB_IRREDUCIBLE_LOOP;
979 next:;
982 free (stack);
983 free (dfs_in);
984 free (closed);
985 free (mr);
986 free (mri);
987 for (i = 0; i < last_basic_block + loops->num; i++)
988 free (edges[i]);
989 free (edges);
990 free (n_edges);
991 loops->state |= LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS;
994 /* Counts number of insns inside LOOP. */
996 num_loop_insns (loop)
997 struct loop *loop;
999 basic_block *bbs, bb;
1000 unsigned i, ninsns = 0;
1001 rtx insn;
1003 bbs = get_loop_body (loop);
1004 for (i = 0; i < loop->num_nodes; i++)
1006 bb = bbs[i];
1007 ninsns++;
1008 for (insn = bb->head; insn != bb->end; insn = NEXT_INSN (insn))
1009 ninsns++;
1011 free(bbs);
1013 return ninsns;
1016 /* Counts number of insns executed on average per iteration LOOP. */
1018 average_num_loop_insns (loop)
1019 struct loop *loop;
1021 basic_block *bbs, bb;
1022 unsigned i, binsns, ninsns, ratio;
1023 rtx insn;
1025 ninsns = 0;
1026 bbs = get_loop_body (loop);
1027 for (i = 0; i < loop->num_nodes; i++)
1029 bb = bbs[i];
1031 binsns = 1;
1032 for (insn = bb->head; insn != bb->end; insn = NEXT_INSN (insn))
1033 binsns++;
1035 ratio = loop->header->frequency == 0
1036 ? BB_FREQ_MAX
1037 : (bb->frequency * BB_FREQ_MAX) / loop->header->frequency;
1038 ninsns += binsns * ratio;
1040 free(bbs);
1042 ninsns /= BB_FREQ_MAX;
1043 if (!ninsns)
1044 ninsns = 1; /* To avoid division by zero. */
1046 return ninsns;
1049 /* Returns expected number of LOOP iterations.
1050 Compute upper bound on number of iterations in case they do not fit integer
1051 to help loop peeling heuristics. Use exact counts if at all possible. */
1052 unsigned
1053 expected_loop_iterations (loop)
1054 const struct loop *loop;
1056 edge e;
1058 if (loop->header->count)
1060 gcov_type count_in, count_latch, expected;
1062 count_in = 0;
1063 count_latch = 0;
1065 for (e = loop->header->pred; e; e = e->pred_next)
1066 if (e->src == loop->latch)
1067 count_latch = e->count;
1068 else
1069 count_in += e->count;
1071 if (count_in == 0)
1072 return 0;
1074 expected = (count_latch + count_in - 1) / count_in;
1076 /* Avoid overflows. */
1077 return (expected > REG_BR_PROB_BASE ? REG_BR_PROB_BASE : expected);
1079 else
1081 int freq_in, freq_latch;
1083 freq_in = 0;
1084 freq_latch = 0;
1086 for (e = loop->header->pred; e; e = e->pred_next)
1087 if (e->src == loop->latch)
1088 freq_latch = EDGE_FREQUENCY (e);
1089 else
1090 freq_in += EDGE_FREQUENCY (e);
1092 if (freq_in == 0)
1093 return 0;
1095 return (freq_latch + freq_in - 1) / freq_in;