PR target/16407
[official-gcc.git] / gcc / loop-iv.c
blobe739a852bce6c0f6c0d1e2a087ef26bcc450d002
1 /* Rtl-level induction variable analysis.
2 Copyright (C) 2004 Free Software Foundation, Inc.
4 This file is part of GCC.
6 GCC is free software; you can redistribute it and/or modify it
7 under the terms of the GNU General Public License as published by the
8 Free Software Foundation; either version 2, or (at your option) any
9 later version.
11 GCC is distributed in the hope that it will be useful, but WITHOUT
12 ANY 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 /* This is just a very simplistic analysis of induction variables of the loop.
22 The major use is for determining the number of iterations of a loop for
23 loop unrolling, doloop optimization and branch prediction. For this we
24 are only interested in bivs and a fairly limited set of givs that are
25 needed in the exit condition. We also only compute the iv information on
26 demand.
28 The interesting registers are determined. A register is interesting if
30 -- it is set only in the blocks that dominate the latch of the current loop
31 -- all its sets are simple -- i.e. in the form we understand
33 We also number the insns sequentially in each basic block. For a use of the
34 interesting reg, it is now easy to find a reaching definition (there may be
35 only one).
37 Induction variable is then simply analyzed by walking the use-def
38 chains.
40 Usage:
42 iv_analysis_loop_init (loop);
43 insn = iv_get_reaching_def (where, reg);
44 if (iv_analyze (insn, reg, &iv))
46 ...
48 iv_analysis_done (); */
50 #include "config.h"
51 #include "system.h"
52 #include "coretypes.h"
53 #include "tm.h"
54 #include "rtl.h"
55 #include "hard-reg-set.h"
56 #include "basic-block.h"
57 #include "cfgloop.h"
58 #include "expr.h"
59 #include "output.h"
61 /* The insn information. */
63 struct insn_info
65 /* Id of the insn. */
66 unsigned luid;
68 /* The previous definition of the register defined by the single
69 set in the insn. */
70 rtx prev_def;
72 /* The description of the iv. */
73 struct rtx_iv iv;
76 static struct insn_info *insn_info;
78 /* The last definition of register. */
80 static rtx *last_def;
82 /* The bivs. */
84 static struct rtx_iv *bivs;
86 /* Maximal insn number for that there is place in insn_info array. */
88 static unsigned max_insn_no;
90 /* Maximal register number for that there is place in bivs and last_def
91 arrays. */
93 static unsigned max_reg_no;
95 /* Dumps information about IV to FILE. */
97 extern void dump_iv_info (FILE *, struct rtx_iv *);
98 void
99 dump_iv_info (FILE *file, struct rtx_iv *iv)
101 if (!iv->base)
103 fprintf (file, "not simple");
104 return;
107 if (iv->step == const0_rtx)
109 fprintf (file, "invariant ");
110 print_rtl (file, iv->base);
111 return;
114 print_rtl (file, iv->base);
115 fprintf (file, " + ");
116 print_rtl (file, iv->step);
117 fprintf (file, " * iteration");
118 fprintf (file, " (in %s)", GET_MODE_NAME (iv->mode));
120 if (iv->mode != iv->extend_mode)
121 fprintf (file, " %s to %s",
122 rtx_name[iv->extend],
123 GET_MODE_NAME (iv->extend_mode));
125 if (iv->mult != const1_rtx)
127 fprintf (file, " * ");
128 print_rtl (file, iv->mult);
130 if (iv->delta != const0_rtx)
132 fprintf (file, " + ");
133 print_rtl (file, iv->delta);
135 if (iv->first_special)
136 fprintf (file, " (first special)");
139 /* Assigns luids to insns in basic block BB. */
141 static void
142 assign_luids (basic_block bb)
144 unsigned i = 0, uid;
145 rtx insn;
147 FOR_BB_INSNS (bb, insn)
149 uid = INSN_UID (insn);
150 insn_info[uid].luid = i++;
151 insn_info[uid].prev_def = NULL_RTX;
152 insn_info[uid].iv.analysed = false;
156 /* Generates a subreg to get the least significant part of EXPR (in mode
157 INNER_MODE) to OUTER_MODE. */
159 static rtx
160 lowpart_subreg (enum machine_mode outer_mode, rtx expr,
161 enum machine_mode inner_mode)
163 return simplify_gen_subreg (outer_mode, expr, inner_mode,
164 subreg_lowpart_offset (outer_mode, inner_mode));
167 /* Checks whether REG is a well-behaved register. */
169 static bool
170 simple_reg_p (rtx reg)
172 unsigned r;
174 if (GET_CODE (reg) == SUBREG)
176 if (!subreg_lowpart_p (reg))
177 return false;
178 reg = SUBREG_REG (reg);
181 if (!REG_P (reg))
182 return false;
184 r = REGNO (reg);
185 if (HARD_REGISTER_NUM_P (r))
186 return false;
188 if (GET_MODE_CLASS (GET_MODE (reg)) != MODE_INT)
189 return false;
191 if (last_def[r] == const0_rtx)
192 return false;
194 return true;
197 /* Checks whether assignment LHS = RHS is simple enough for us to process. */
199 static bool
200 simple_set_p (rtx lhs, rtx rhs)
202 rtx op0, op1;
204 if (!REG_P (lhs)
205 || !simple_reg_p (lhs))
206 return false;
208 if (CONSTANT_P (rhs))
209 return true;
211 switch (GET_CODE (rhs))
213 case SUBREG:
214 case REG:
215 return simple_reg_p (rhs);
217 case SIGN_EXTEND:
218 case ZERO_EXTEND:
219 case NEG:
220 return simple_reg_p (XEXP (rhs, 0));
222 case PLUS:
223 case MINUS:
224 case MULT:
225 case ASHIFT:
226 op0 = XEXP (rhs, 0);
227 op1 = XEXP (rhs, 1);
229 if (!simple_reg_p (op0)
230 && !CONSTANT_P (op0))
231 return false;
233 if (!simple_reg_p (op1)
234 && !CONSTANT_P (op1))
235 return false;
237 if (GET_CODE (rhs) == MULT
238 && !CONSTANT_P (op0)
239 && !CONSTANT_P (op1))
240 return false;
242 if (GET_CODE (rhs) == ASHIFT
243 && CONSTANT_P (op0))
244 return false;
246 return true;
248 default:
249 return false;
253 /* Mark single SET in INSN. */
255 static rtx
256 mark_single_set (rtx insn, rtx set)
258 rtx def = SET_DEST (set), src;
259 unsigned regno, uid;
261 src = find_reg_equal_equiv_note (insn);
262 if (src)
263 src = XEXP (src, 0);
264 else
265 src = SET_SRC (set);
267 if (!simple_set_p (SET_DEST (set), src))
268 return NULL_RTX;
270 regno = REGNO (def);
271 uid = INSN_UID (insn);
273 bivs[regno].analysed = false;
274 insn_info[uid].prev_def = last_def[regno];
275 last_def[regno] = insn;
277 return def;
280 /* Invalidate register REG unless it is equal to EXCEPT. */
282 static void
283 kill_sets (rtx reg, rtx by ATTRIBUTE_UNUSED, void *except)
285 if (GET_CODE (reg) == SUBREG)
286 reg = SUBREG_REG (reg);
287 if (!REG_P (reg))
288 return;
289 if (reg == except)
290 return;
292 last_def[REGNO (reg)] = const0_rtx;
295 /* Marks sets in basic block BB. If DOM is true, BB dominates the loop
296 latch. */
298 static void
299 mark_sets (basic_block bb, bool dom)
301 rtx insn, set, def;
303 FOR_BB_INSNS (bb, insn)
305 if (!INSN_P (insn))
306 continue;
308 if (dom
309 && (set = single_set (insn)))
310 def = mark_single_set (insn, set);
311 else
312 def = NULL_RTX;
314 note_stores (PATTERN (insn), kill_sets, def);
318 /* Prepare the data for an induction variable analysis of a LOOP. */
320 void
321 iv_analysis_loop_init (struct loop *loop)
323 basic_block *body = get_loop_body_in_dom_order (loop);
324 unsigned b;
326 if ((unsigned) get_max_uid () >= max_insn_no)
328 /* Add some reserve for insns and registers produced in optimizations. */
329 max_insn_no = get_max_uid () + 100;
330 if (insn_info)
331 free (insn_info);
332 insn_info = xmalloc (max_insn_no * sizeof (struct insn_info));
335 if ((unsigned) max_reg_num () >= max_reg_no)
337 max_reg_no = max_reg_num () + 100;
338 if (last_def)
339 free (last_def);
340 last_def = xmalloc (max_reg_no * sizeof (rtx));
341 if (bivs)
342 free (bivs);
343 bivs = xmalloc (max_reg_no * sizeof (struct rtx_iv));
346 memset (last_def, 0, max_reg_num () * sizeof (rtx));
348 for (b = 0; b < loop->num_nodes; b++)
350 assign_luids (body[b]);
351 mark_sets (body[b], just_once_each_iteration_p (loop, body[b]));
354 free (body);
357 /* Gets definition of REG reaching the INSN. If REG is not simple, const0_rtx
358 is returned. If INSN is before the first def in the loop, NULL_RTX is
359 returned. */
362 iv_get_reaching_def (rtx insn, rtx reg)
364 unsigned regno, luid, auid;
365 rtx ainsn;
366 basic_block bb, abb;
368 if (GET_CODE (reg) == SUBREG)
370 if (!subreg_lowpart_p (reg))
371 return const0_rtx;
372 reg = SUBREG_REG (reg);
374 if (!REG_P (reg))
375 return NULL_RTX;
377 regno = REGNO (reg);
378 if (!last_def[regno]
379 || last_def[regno] == const0_rtx)
380 return last_def[regno];
382 bb = BLOCK_FOR_INSN (insn);
383 luid = insn_info[INSN_UID (insn)].luid;
385 ainsn = last_def[regno];
386 while (1)
388 abb = BLOCK_FOR_INSN (ainsn);
390 if (dominated_by_p (CDI_DOMINATORS, bb, abb))
391 break;
393 auid = INSN_UID (ainsn);
394 ainsn = insn_info[auid].prev_def;
396 if (!ainsn)
397 return NULL_RTX;
400 while (1)
402 abb = BLOCK_FOR_INSN (ainsn);
403 if (abb != bb)
404 return ainsn;
406 auid = INSN_UID (ainsn);
407 if (luid > insn_info[auid].luid)
408 return ainsn;
410 ainsn = insn_info[auid].prev_def;
411 if (!ainsn)
412 return NULL_RTX;
416 /* Sets IV to invariant CST in MODE. Always returns true (just for
417 consistency with other iv manipulation functions that may fail). */
419 static bool
420 iv_constant (struct rtx_iv *iv, rtx cst, enum machine_mode mode)
422 if (mode == VOIDmode)
423 mode = GET_MODE (cst);
425 iv->analysed = true;
426 iv->mode = mode;
427 iv->base = cst;
428 iv->step = const0_rtx;
429 iv->first_special = false;
430 iv->extend = NIL;
431 iv->extend_mode = iv->mode;
432 iv->delta = const0_rtx;
433 iv->mult = const1_rtx;
435 return true;
438 /* Evaluates application of subreg to MODE on IV. */
440 static bool
441 iv_subreg (struct rtx_iv *iv, enum machine_mode mode)
443 if (iv->extend_mode == mode)
444 return true;
446 if (GET_MODE_BITSIZE (mode) > GET_MODE_BITSIZE (iv->mode))
447 return false;
449 iv->extend = NIL;
450 iv->mode = mode;
452 iv->base = simplify_gen_binary (PLUS, iv->extend_mode, iv->delta,
453 simplify_gen_binary (MULT, iv->extend_mode,
454 iv->base, iv->mult));
455 iv->step = simplify_gen_binary (MULT, iv->extend_mode, iv->step, iv->mult);
456 iv->mult = const1_rtx;
457 iv->delta = const0_rtx;
458 iv->first_special = false;
460 return true;
463 /* Evaluates application of EXTEND to MODE on IV. */
465 static bool
466 iv_extend (struct rtx_iv *iv, enum rtx_code extend, enum machine_mode mode)
468 if (mode != iv->extend_mode)
469 return false;
471 if (iv->extend != NIL
472 && iv->extend != extend)
473 return false;
475 iv->extend = extend;
477 return true;
480 /* Evaluates negation of IV. */
482 static bool
483 iv_neg (struct rtx_iv *iv)
485 if (iv->extend == NIL)
487 iv->base = simplify_gen_unary (NEG, iv->extend_mode,
488 iv->base, iv->extend_mode);
489 iv->step = simplify_gen_unary (NEG, iv->extend_mode,
490 iv->step, iv->extend_mode);
492 else
494 iv->delta = simplify_gen_unary (NEG, iv->extend_mode,
495 iv->delta, iv->extend_mode);
496 iv->mult = simplify_gen_unary (NEG, iv->extend_mode,
497 iv->mult, iv->extend_mode);
500 return true;
503 /* Evaluates addition or subtraction (according to OP) of IV1 to IV0. */
505 static bool
506 iv_add (struct rtx_iv *iv0, struct rtx_iv *iv1, enum rtx_code op)
508 enum machine_mode mode;
509 rtx arg;
511 /* Extend the constant to extend_mode of the other operand if necessary. */
512 if (iv0->extend == NIL
513 && iv0->mode == iv0->extend_mode
514 && iv0->step == const0_rtx
515 && GET_MODE_SIZE (iv0->extend_mode) < GET_MODE_SIZE (iv1->extend_mode))
517 iv0->extend_mode = iv1->extend_mode;
518 iv0->base = simplify_gen_unary (ZERO_EXTEND, iv0->extend_mode,
519 iv0->base, iv0->mode);
521 if (iv1->extend == NIL
522 && iv1->mode == iv1->extend_mode
523 && iv1->step == const0_rtx
524 && GET_MODE_SIZE (iv1->extend_mode) < GET_MODE_SIZE (iv0->extend_mode))
526 iv1->extend_mode = iv0->extend_mode;
527 iv1->base = simplify_gen_unary (ZERO_EXTEND, iv1->extend_mode,
528 iv1->base, iv1->mode);
531 mode = iv0->extend_mode;
532 if (mode != iv1->extend_mode)
533 return false;
535 if (iv0->extend == NIL && iv1->extend == NIL)
537 if (iv0->mode != iv1->mode)
538 return false;
540 iv0->base = simplify_gen_binary (op, mode, iv0->base, iv1->base);
541 iv0->step = simplify_gen_binary (op, mode, iv0->step, iv1->step);
543 return true;
546 /* Handle addition of constant. */
547 if (iv1->extend == NIL
548 && iv1->mode == mode
549 && iv1->step == const0_rtx)
551 iv0->delta = simplify_gen_binary (op, mode, iv0->delta, iv1->base);
552 return true;
555 if (iv0->extend == NIL
556 && iv0->mode == mode
557 && iv0->step == const0_rtx)
559 arg = iv0->base;
560 *iv0 = *iv1;
561 if (op == MINUS
562 && !iv_neg (iv0))
563 return false;
565 iv0->delta = simplify_gen_binary (PLUS, mode, iv0->delta, arg);
566 return true;
569 return false;
572 /* Evaluates multiplication of IV by constant CST. */
574 static bool
575 iv_mult (struct rtx_iv *iv, rtx mby)
577 enum machine_mode mode = iv->extend_mode;
579 if (GET_MODE (mby) != VOIDmode
580 && GET_MODE (mby) != mode)
581 return false;
583 if (iv->extend == NIL)
585 iv->base = simplify_gen_binary (MULT, mode, iv->base, mby);
586 iv->step = simplify_gen_binary (MULT, mode, iv->step, mby);
588 else
590 iv->delta = simplify_gen_binary (MULT, mode, iv->delta, mby);
591 iv->mult = simplify_gen_binary (MULT, mode, iv->mult, mby);
594 return true;
597 /* Evaluates shift of IV by constant CST. */
599 static bool
600 iv_shift (struct rtx_iv *iv, rtx mby)
602 enum machine_mode mode = iv->extend_mode;
604 if (GET_MODE (mby) != VOIDmode
605 && GET_MODE (mby) != mode)
606 return false;
608 if (iv->extend == NIL)
610 iv->base = simplify_gen_binary (ASHIFT, mode, iv->base, mby);
611 iv->step = simplify_gen_binary (ASHIFT, mode, iv->step, mby);
613 else
615 iv->delta = simplify_gen_binary (ASHIFT, mode, iv->delta, mby);
616 iv->mult = simplify_gen_binary (ASHIFT, mode, iv->mult, mby);
619 return true;
622 /* The recursive part of get_biv_step. Gets the value of the single value
623 defined in INSN wrto initial value of REG inside loop, in shape described
624 at get_biv_step. */
626 static bool
627 get_biv_step_1 (rtx insn, rtx reg,
628 rtx *inner_step, enum machine_mode *inner_mode,
629 enum rtx_code *extend, enum machine_mode outer_mode,
630 rtx *outer_step)
632 rtx set, lhs, rhs, op0 = NULL_RTX, op1 = NULL_RTX;
633 rtx next, nextr, def_insn, tmp;
634 enum rtx_code code;
636 set = single_set (insn);
637 rhs = find_reg_equal_equiv_note (insn);
638 if (rhs)
639 rhs = XEXP (rhs, 0);
640 else
641 rhs = SET_SRC (set);
642 lhs = SET_DEST (set);
644 code = GET_CODE (rhs);
645 switch (code)
647 case SUBREG:
648 case REG:
649 next = rhs;
650 break;
652 case PLUS:
653 case MINUS:
654 op0 = XEXP (rhs, 0);
655 op1 = XEXP (rhs, 1);
657 if (code == PLUS && CONSTANT_P (op0))
659 tmp = op0; op0 = op1; op1 = tmp;
662 if (!simple_reg_p (op0)
663 || !CONSTANT_P (op1))
664 return false;
666 if (GET_MODE (rhs) != outer_mode)
668 /* ppc64 uses expressions like
670 (set x:SI (plus:SI (subreg:SI y:DI) 1)).
672 this is equivalent to
674 (set x':DI (plus:DI y:DI 1))
675 (set x:SI (subreg:SI (x':DI)). */
676 if (GET_CODE (op0) != SUBREG)
677 return false;
678 if (GET_MODE (SUBREG_REG (op0)) != outer_mode)
679 return false;
682 next = op0;
683 break;
685 case SIGN_EXTEND:
686 case ZERO_EXTEND:
687 if (GET_MODE (rhs) != outer_mode)
688 return false;
690 op0 = XEXP (rhs, 0);
691 if (!simple_reg_p (op0))
692 return false;
694 next = op0;
695 break;
697 default:
698 return false;
701 if (GET_CODE (next) == SUBREG)
703 if (!subreg_lowpart_p (next))
704 return false;
706 nextr = SUBREG_REG (next);
707 if (GET_MODE (nextr) != outer_mode)
708 return false;
710 else
711 nextr = next;
713 def_insn = iv_get_reaching_def (insn, nextr);
714 if (def_insn == const0_rtx)
715 return false;
717 if (!def_insn)
719 if (!rtx_equal_p (nextr, reg))
720 return false;
722 *inner_step = const0_rtx;
723 *extend = NIL;
724 *inner_mode = outer_mode;
725 *outer_step = const0_rtx;
727 else if (!get_biv_step_1 (def_insn, reg,
728 inner_step, inner_mode, extend, outer_mode,
729 outer_step))
730 return false;
732 if (GET_CODE (next) == SUBREG)
734 enum machine_mode amode = GET_MODE (next);
736 if (GET_MODE_SIZE (amode) > GET_MODE_SIZE (*inner_mode))
737 return false;
739 *inner_mode = amode;
740 *inner_step = simplify_gen_binary (PLUS, outer_mode,
741 *inner_step, *outer_step);
742 *outer_step = const0_rtx;
743 *extend = NIL;
746 switch (code)
748 case REG:
749 case SUBREG:
750 break;
752 case PLUS:
753 case MINUS:
754 if (*inner_mode == outer_mode
755 /* See comment in previous switch. */
756 || GET_MODE (rhs) != outer_mode)
757 *inner_step = simplify_gen_binary (code, outer_mode,
758 *inner_step, op1);
759 else
760 *outer_step = simplify_gen_binary (code, outer_mode,
761 *outer_step, op1);
762 break;
764 case SIGN_EXTEND:
765 case ZERO_EXTEND:
766 if (GET_MODE (op0) != *inner_mode
767 || *extend != NIL
768 || *outer_step != const0_rtx)
769 abort ();
771 *extend = code;
772 break;
774 default:
775 abort ();
778 return true;
781 /* Gets the operation on register REG inside loop, in shape
783 OUTER_STEP + EXTEND_{OUTER_MODE} (SUBREG_{INNER_MODE} (REG + INNER_STEP))
785 If the operation cannot be described in this shape, return false. */
787 static bool
788 get_biv_step (rtx reg, rtx *inner_step, enum machine_mode *inner_mode,
789 enum rtx_code *extend, enum machine_mode *outer_mode,
790 rtx *outer_step)
792 *outer_mode = GET_MODE (reg);
794 if (!get_biv_step_1 (last_def[REGNO (reg)], reg,
795 inner_step, inner_mode, extend, *outer_mode,
796 outer_step))
797 return false;
799 if (*inner_mode != *outer_mode
800 && *extend == NIL)
801 abort ();
803 if (*inner_mode == *outer_mode
804 && *extend != NIL)
805 abort ();
807 if (*inner_mode == *outer_mode
808 && *outer_step != const0_rtx)
809 abort ();
811 return true;
814 /* Determines whether DEF is a biv and if so, stores its description
815 to *IV. */
817 static bool
818 iv_analyze_biv (rtx def, struct rtx_iv *iv)
820 unsigned regno;
821 rtx inner_step, outer_step;
822 enum machine_mode inner_mode, outer_mode;
823 enum rtx_code extend;
825 if (dump_file)
827 fprintf (dump_file, "Analysing ");
828 print_rtl (dump_file, def);
829 fprintf (dump_file, " for bivness.\n");
832 if (!REG_P (def))
834 if (!CONSTANT_P (def))
835 return false;
837 return iv_constant (iv, def, VOIDmode);
840 regno = REGNO (def);
841 if (last_def[regno] == const0_rtx)
843 if (dump_file)
844 fprintf (dump_file, " not simple.\n");
845 return false;
848 if (last_def[regno] && bivs[regno].analysed)
850 if (dump_file)
851 fprintf (dump_file, " already analysed.\n");
853 *iv = bivs[regno];
854 return iv->base != NULL_RTX;
857 if (!last_def[regno])
859 iv_constant (iv, def, VOIDmode);
860 goto end;
863 iv->analysed = true;
864 if (!get_biv_step (def, &inner_step, &inner_mode, &extend,
865 &outer_mode, &outer_step))
867 iv->base = NULL_RTX;
868 goto end;
871 /* Loop transforms base to es (base + inner_step) + outer_step,
872 where es means extend of subreg between inner_mode and outer_mode.
873 The corresponding induction variable is
875 es ((base - outer_step) + i * (inner_step + outer_step)) + outer_step */
877 iv->base = simplify_gen_binary (MINUS, outer_mode, def, outer_step);
878 iv->step = simplify_gen_binary (PLUS, outer_mode, inner_step, outer_step);
879 iv->mode = inner_mode;
880 iv->extend_mode = outer_mode;
881 iv->extend = extend;
882 iv->mult = const1_rtx;
883 iv->delta = outer_step;
884 iv->first_special = inner_mode != outer_mode;
886 end:
887 if (dump_file)
889 fprintf (dump_file, " ");
890 dump_iv_info (dump_file, iv);
891 fprintf (dump_file, "\n");
894 bivs[regno] = *iv;
896 return iv->base != NULL_RTX;
899 /* Analyzes operand OP of INSN and stores the result to *IV. */
901 static bool
902 iv_analyze_op (rtx insn, rtx op, struct rtx_iv *iv)
904 rtx def_insn;
905 unsigned regno;
906 bool inv = CONSTANT_P (op);
908 if (dump_file)
910 fprintf (dump_file, "Analysing operand ");
911 print_rtl (dump_file, op);
912 fprintf (dump_file, " of insn ");
913 print_rtl_single (dump_file, insn);
916 if (GET_CODE (op) == SUBREG)
918 if (!subreg_lowpart_p (op))
919 return false;
921 if (!iv_analyze_op (insn, SUBREG_REG (op), iv))
922 return false;
924 return iv_subreg (iv, GET_MODE (op));
927 if (!inv)
929 regno = REGNO (op);
930 if (!last_def[regno])
931 inv = true;
932 else if (last_def[regno] == const0_rtx)
934 if (dump_file)
935 fprintf (dump_file, " not simple.\n");
936 return false;
940 if (inv)
942 iv_constant (iv, op, VOIDmode);
944 if (dump_file)
946 fprintf (dump_file, " ");
947 dump_iv_info (dump_file, iv);
948 fprintf (dump_file, "\n");
950 return true;
953 def_insn = iv_get_reaching_def (insn, op);
954 if (def_insn == const0_rtx)
956 if (dump_file)
957 fprintf (dump_file, " not simple.\n");
958 return false;
961 return iv_analyze (def_insn, op, iv);
964 /* Analyzes iv DEF defined in INSN and stores the result to *IV. */
966 bool
967 iv_analyze (rtx insn, rtx def, struct rtx_iv *iv)
969 unsigned uid;
970 rtx set, rhs, mby = NULL_RTX, tmp;
971 rtx op0 = NULL_RTX, op1 = NULL_RTX;
972 struct rtx_iv iv0, iv1;
973 enum machine_mode amode;
974 enum rtx_code code;
976 if (insn == const0_rtx)
977 return false;
979 if (GET_CODE (def) == SUBREG)
981 if (!subreg_lowpart_p (def))
982 return false;
984 if (!iv_analyze (insn, SUBREG_REG (def), iv))
985 return false;
987 return iv_subreg (iv, GET_MODE (def));
990 if (!insn)
991 return iv_analyze_biv (def, iv);
993 if (dump_file)
995 fprintf (dump_file, "Analysing def of ");
996 print_rtl (dump_file, def);
997 fprintf (dump_file, " in insn ");
998 print_rtl_single (dump_file, insn);
1001 uid = INSN_UID (insn);
1002 if (insn_info[uid].iv.analysed)
1004 if (dump_file)
1005 fprintf (dump_file, " already analysed.\n");
1006 *iv = insn_info[uid].iv;
1007 return iv->base != NULL_RTX;
1010 iv->mode = VOIDmode;
1011 iv->base = NULL_RTX;
1012 iv->step = NULL_RTX;
1014 set = single_set (insn);
1015 rhs = find_reg_equal_equiv_note (insn);
1016 if (rhs)
1017 rhs = XEXP (rhs, 0);
1018 else
1019 rhs = SET_SRC (set);
1020 code = GET_CODE (rhs);
1022 if (CONSTANT_P (rhs))
1024 op0 = rhs;
1025 amode = GET_MODE (def);
1027 else
1029 switch (code)
1031 case SUBREG:
1032 if (!subreg_lowpart_p (rhs))
1033 goto end;
1034 op0 = rhs;
1035 break;
1037 case REG:
1038 op0 = rhs;
1039 break;
1041 case SIGN_EXTEND:
1042 case ZERO_EXTEND:
1043 case NEG:
1044 op0 = XEXP (rhs, 0);
1045 break;
1047 case PLUS:
1048 case MINUS:
1049 op0 = XEXP (rhs, 0);
1050 op1 = XEXP (rhs, 1);
1051 break;
1053 case MULT:
1054 op0 = XEXP (rhs, 0);
1055 mby = XEXP (rhs, 1);
1056 if (!CONSTANT_P (mby))
1058 if (!CONSTANT_P (op0))
1059 abort ();
1060 tmp = op0;
1061 op0 = mby;
1062 mby = tmp;
1064 break;
1066 case ASHIFT:
1067 if (CONSTANT_P (XEXP (rhs, 0)))
1068 abort ();
1069 op0 = XEXP (rhs, 0);
1070 mby = XEXP (rhs, 1);
1071 break;
1073 default:
1074 abort ();
1077 amode = GET_MODE (rhs);
1080 if (op0)
1082 if (!iv_analyze_op (insn, op0, &iv0))
1083 goto end;
1085 if (iv0.mode == VOIDmode)
1087 iv0.mode = amode;
1088 iv0.extend_mode = amode;
1092 if (op1)
1094 if (!iv_analyze_op (insn, op1, &iv1))
1095 goto end;
1097 if (iv1.mode == VOIDmode)
1099 iv1.mode = amode;
1100 iv1.extend_mode = amode;
1104 switch (code)
1106 case SIGN_EXTEND:
1107 case ZERO_EXTEND:
1108 if (!iv_extend (&iv0, code, amode))
1109 goto end;
1110 break;
1112 case NEG:
1113 if (!iv_neg (&iv0))
1114 goto end;
1115 break;
1117 case PLUS:
1118 case MINUS:
1119 if (!iv_add (&iv0, &iv1, code))
1120 goto end;
1121 break;
1123 case MULT:
1124 if (!iv_mult (&iv0, mby))
1125 goto end;
1126 break;
1128 case ASHIFT:
1129 if (!iv_shift (&iv0, mby))
1130 goto end;
1131 break;
1133 default:
1134 break;
1137 *iv = iv0;
1139 end:
1140 iv->analysed = true;
1141 insn_info[uid].iv = *iv;
1143 if (dump_file)
1145 print_rtl (dump_file, def);
1146 fprintf (dump_file, " in insn ");
1147 print_rtl_single (dump_file, insn);
1148 fprintf (dump_file, " is ");
1149 dump_iv_info (dump_file, iv);
1150 fprintf (dump_file, "\n");
1153 return iv->base != NULL_RTX;
1156 /* Calculates value of IV at ITERATION-th iteration. */
1159 get_iv_value (struct rtx_iv *iv, rtx iteration)
1161 rtx val;
1163 /* We would need to generate some if_then_else patterns, and so far
1164 it is not needed anywhere. */
1165 if (iv->first_special)
1166 abort ();
1168 if (iv->step != const0_rtx && iteration != const0_rtx)
1169 val = simplify_gen_binary (PLUS, iv->extend_mode, iv->base,
1170 simplify_gen_binary (MULT, iv->extend_mode,
1171 iv->step, iteration));
1172 else
1173 val = iv->base;
1175 if (iv->extend_mode == iv->mode)
1176 return val;
1178 val = lowpart_subreg (iv->mode, val, iv->extend_mode);
1180 if (iv->extend == NIL)
1181 return val;
1183 val = simplify_gen_unary (iv->extend, iv->extend_mode, val, iv->mode);
1184 val = simplify_gen_binary (PLUS, iv->extend_mode, iv->delta,
1185 simplify_gen_binary (MULT, iv->extend_mode,
1186 iv->mult, val));
1188 return val;
1191 /* Free the data for an induction variable analysis. */
1193 void
1194 iv_analysis_done (void)
1196 max_insn_no = 0;
1197 max_reg_no = 0;
1198 if (insn_info)
1200 free (insn_info);
1201 insn_info = NULL;
1203 if (last_def)
1205 free (last_def);
1206 last_def = NULL;
1208 if (bivs)
1210 free (bivs);
1211 bivs = NULL;
1215 /* Computes inverse to X modulo (1 << MOD). */
1217 static unsigned HOST_WIDEST_INT
1218 inverse (unsigned HOST_WIDEST_INT x, int mod)
1220 unsigned HOST_WIDEST_INT mask =
1221 ((unsigned HOST_WIDEST_INT) 1 << (mod - 1) << 1) - 1;
1222 unsigned HOST_WIDEST_INT rslt = 1;
1223 int i;
1225 for (i = 0; i < mod - 1; i++)
1227 rslt = (rslt * x) & mask;
1228 x = (x * x) & mask;
1231 return rslt;
1234 /* Tries to estimate the maximum number of iterations. */
1236 static unsigned HOST_WIDEST_INT
1237 determine_max_iter (struct niter_desc *desc)
1239 rtx niter = desc->niter_expr;
1240 rtx mmin, mmax, left, right;
1241 unsigned HOST_WIDEST_INT nmax, inc;
1243 if (GET_CODE (niter) == AND
1244 && GET_CODE (XEXP (niter, 0)) == CONST_INT)
1246 nmax = INTVAL (XEXP (niter, 0));
1247 if (!(nmax & (nmax + 1)))
1249 desc->niter_max = nmax;
1250 return nmax;
1254 get_mode_bounds (desc->mode, desc->signed_p, desc->mode, &mmin, &mmax);
1255 nmax = INTVAL (mmax) - INTVAL (mmin);
1257 if (GET_CODE (niter) == UDIV)
1259 if (GET_CODE (XEXP (niter, 1)) != CONST_INT)
1261 desc->niter_max = nmax;
1262 return nmax;
1264 inc = INTVAL (XEXP (niter, 1));
1265 niter = XEXP (niter, 0);
1267 else
1268 inc = 1;
1270 if (GET_CODE (niter) == PLUS)
1272 left = XEXP (niter, 0);
1273 right = XEXP (niter, 0);
1275 if (GET_CODE (right) == CONST_INT)
1276 right = GEN_INT (-INTVAL (right));
1278 else if (GET_CODE (niter) == MINUS)
1280 left = XEXP (niter, 0);
1281 right = XEXP (niter, 0);
1283 else
1285 left = niter;
1286 right = mmin;
1289 if (GET_CODE (left) == CONST_INT)
1290 mmax = left;
1291 if (GET_CODE (right) == CONST_INT)
1292 mmin = right;
1293 nmax = INTVAL (mmax) - INTVAL (mmin);
1295 desc->niter_max = nmax / inc;
1296 return nmax / inc;
1299 /* Checks whether register *REG is in set ALT. Callback for for_each_rtx. */
1301 static int
1302 altered_reg_used (rtx *reg, void *alt)
1304 if (!REG_P (*reg))
1305 return 0;
1307 return REGNO_REG_SET_P (alt, REGNO (*reg));
1310 /* Marks registers altered by EXPR in set ALT. */
1312 static void
1313 mark_altered (rtx expr, rtx by ATTRIBUTE_UNUSED, void *alt)
1315 if (GET_CODE (expr) == SUBREG)
1316 expr = SUBREG_REG (expr);
1317 if (!REG_P (expr))
1318 return;
1320 SET_REGNO_REG_SET (alt, REGNO (expr));
1323 /* Checks whether RHS is simple enough to process. */
1325 static bool
1326 simple_rhs_p (rtx rhs)
1328 rtx op0, op1;
1330 if (CONSTANT_P (rhs)
1331 || REG_P (rhs))
1332 return true;
1334 switch (GET_CODE (rhs))
1336 case PLUS:
1337 case MINUS:
1338 op0 = XEXP (rhs, 0);
1339 op1 = XEXP (rhs, 1);
1340 /* Allow reg + const sets only. */
1341 if (REG_P (op0) && CONSTANT_P (op1))
1342 return true;
1343 if (REG_P (op1) && CONSTANT_P (op0))
1344 return true;
1346 return false;
1348 default:
1349 return false;
1353 /* Simplifies *EXPR using assignment in INSN. ALTERED is the set of registers
1354 altered so far. */
1356 static void
1357 simplify_using_assignment (rtx insn, rtx *expr, regset altered)
1359 rtx set = single_set (insn);
1360 rtx lhs, rhs;
1361 bool ret = false;
1363 if (set)
1365 lhs = SET_DEST (set);
1366 if (!REG_P (lhs)
1367 || altered_reg_used (&lhs, altered))
1368 ret = true;
1370 else
1371 ret = true;
1373 note_stores (PATTERN (insn), mark_altered, altered);
1374 if (GET_CODE (insn) == CALL_INSN)
1376 int i;
1378 /* Kill all call clobbered registers. */
1379 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
1380 if (TEST_HARD_REG_BIT (regs_invalidated_by_call, i))
1381 SET_REGNO_REG_SET (altered, i);
1384 if (ret)
1385 return;
1387 rhs = find_reg_equal_equiv_note (insn);
1388 if (rhs)
1389 rhs = XEXP (rhs, 0);
1390 else
1391 rhs = SET_SRC (set);
1393 if (!simple_rhs_p (rhs))
1394 return;
1396 if (for_each_rtx (&rhs, altered_reg_used, altered))
1397 return;
1399 *expr = simplify_replace_rtx (*expr, lhs, rhs);
1402 /* Checks whether A implies B. */
1404 static bool
1405 implies_p (rtx a, rtx b)
1407 rtx op0, op1, opb0, opb1, r;
1408 enum machine_mode mode;
1410 if (GET_CODE (a) == EQ)
1412 op0 = XEXP (a, 0);
1413 op1 = XEXP (a, 1);
1415 if (REG_P (op0))
1417 r = simplify_replace_rtx (b, op0, op1);
1418 if (r == const_true_rtx)
1419 return true;
1422 if (REG_P (op1))
1424 r = simplify_replace_rtx (b, op1, op0);
1425 if (r == const_true_rtx)
1426 return true;
1430 /* A < B implies A + 1 <= B. */
1431 if ((GET_CODE (a) == GT || GET_CODE (a) == LT)
1432 && (GET_CODE (b) == GE || GET_CODE (b) == LE))
1434 op0 = XEXP (a, 0);
1435 op1 = XEXP (a, 1);
1436 opb0 = XEXP (b, 0);
1437 opb1 = XEXP (b, 1);
1439 if (GET_CODE (a) == GT)
1441 r = op0;
1442 op0 = op1;
1443 op1 = r;
1446 if (GET_CODE (b) == GE)
1448 r = opb0;
1449 opb0 = opb1;
1450 opb1 = r;
1453 mode = GET_MODE (op0);
1454 if (mode != GET_MODE (opb0))
1455 mode = VOIDmode;
1456 else if (mode == VOIDmode)
1458 mode = GET_MODE (op1);
1459 if (mode != GET_MODE (opb1))
1460 mode = VOIDmode;
1463 if (mode != VOIDmode
1464 && rtx_equal_p (op1, opb1)
1465 && simplify_gen_binary (MINUS, mode, opb0, op0) == const1_rtx)
1466 return true;
1469 return false;
1472 /* Canonicalizes COND so that
1474 (1) Ensure that operands are ordered according to
1475 swap_commutative_operands_p.
1476 (2) (LE x const) will be replaced with (LT x <const+1>) and similarly
1477 for GE, GEU, and LEU. */
1480 canon_condition (rtx cond)
1482 rtx tem;
1483 rtx op0, op1;
1484 enum rtx_code code;
1485 enum machine_mode mode;
1487 code = GET_CODE (cond);
1488 op0 = XEXP (cond, 0);
1489 op1 = XEXP (cond, 1);
1491 if (swap_commutative_operands_p (op0, op1))
1493 code = swap_condition (code);
1494 tem = op0;
1495 op0 = op1;
1496 op1 = tem;
1499 mode = GET_MODE (op0);
1500 if (mode == VOIDmode)
1501 mode = GET_MODE (op1);
1502 if (mode == VOIDmode)
1503 abort ();
1505 if (GET_CODE (op1) == CONST_INT
1506 && GET_MODE_CLASS (mode) != MODE_CC
1507 && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
1509 HOST_WIDE_INT const_val = INTVAL (op1);
1510 unsigned HOST_WIDE_INT uconst_val = const_val;
1511 unsigned HOST_WIDE_INT max_val
1512 = (unsigned HOST_WIDE_INT) GET_MODE_MASK (mode);
1514 switch (code)
1516 case LE:
1517 if ((unsigned HOST_WIDE_INT) const_val != max_val >> 1)
1518 code = LT, op1 = gen_int_mode (const_val + 1, GET_MODE (op0));
1519 break;
1521 /* When cross-compiling, const_val might be sign-extended from
1522 BITS_PER_WORD to HOST_BITS_PER_WIDE_INT */
1523 case GE:
1524 if ((HOST_WIDE_INT) (const_val & max_val)
1525 != (((HOST_WIDE_INT) 1
1526 << (GET_MODE_BITSIZE (GET_MODE (op0)) - 1))))
1527 code = GT, op1 = gen_int_mode (const_val - 1, mode);
1528 break;
1530 case LEU:
1531 if (uconst_val < max_val)
1532 code = LTU, op1 = gen_int_mode (uconst_val + 1, mode);
1533 break;
1535 case GEU:
1536 if (uconst_val != 0)
1537 code = GTU, op1 = gen_int_mode (uconst_val - 1, mode);
1538 break;
1540 default:
1541 break;
1545 if (op0 != XEXP (cond, 0)
1546 || op1 != XEXP (cond, 1)
1547 || code != GET_CODE (cond)
1548 || GET_MODE (cond) != SImode)
1549 cond = gen_rtx_fmt_ee (code, SImode, op0, op1);
1551 return cond;
1554 /* Tries to use the fact that COND holds to simplify EXPR. ALTERED is the
1555 set of altered regs. */
1557 void
1558 simplify_using_condition (rtx cond, rtx *expr, regset altered)
1560 rtx rev, reve, exp = *expr;
1562 if (!COMPARISON_P (exp))
1563 return;
1565 /* If some register gets altered later, we do not really speak about its
1566 value at the time of comparison. */
1567 if (altered
1568 && for_each_rtx (&cond, altered_reg_used, altered))
1569 return;
1571 rev = reversed_condition (cond);
1572 reve = reversed_condition (exp);
1574 cond = canon_condition (cond);
1575 exp = canon_condition (exp);
1576 if (rev)
1577 rev = canon_condition (rev);
1578 if (reve)
1579 reve = canon_condition (reve);
1581 if (rtx_equal_p (exp, cond))
1583 *expr = const_true_rtx;
1584 return;
1588 if (rev && rtx_equal_p (exp, rev))
1590 *expr = const0_rtx;
1591 return;
1594 if (implies_p (cond, exp))
1596 *expr = const_true_rtx;
1597 return;
1600 if (reve && implies_p (cond, reve))
1602 *expr = const0_rtx;
1603 return;
1606 /* A proof by contradiction. If *EXPR implies (not cond), *EXPR must
1607 be false. */
1608 if (rev && implies_p (exp, rev))
1610 *expr = const0_rtx;
1611 return;
1614 /* Similarly, If (not *EXPR) implies (not cond), *EXPR must be true. */
1615 if (rev && reve && implies_p (reve, rev))
1617 *expr = const_true_rtx;
1618 return;
1621 /* We would like to have some other tests here. TODO. */
1623 return;
1626 /* Use relationship between A and *B to eventually eliminate *B.
1627 OP is the operation we consider. */
1629 static void
1630 eliminate_implied_condition (enum rtx_code op, rtx a, rtx *b)
1632 if (op == AND)
1634 /* If A implies *B, we may replace *B by true. */
1635 if (implies_p (a, *b))
1636 *b = const_true_rtx;
1638 else if (op == IOR)
1640 /* If *B implies A, we may replace *B by false. */
1641 if (implies_p (*b, a))
1642 *b = const0_rtx;
1644 else
1645 abort ();
1648 /* Eliminates the conditions in TAIL that are implied by HEAD. OP is the
1649 operation we consider. */
1651 static void
1652 eliminate_implied_conditions (enum rtx_code op, rtx *head, rtx tail)
1654 rtx elt;
1656 for (elt = tail; elt; elt = XEXP (elt, 1))
1657 eliminate_implied_condition (op, *head, &XEXP (elt, 0));
1658 for (elt = tail; elt; elt = XEXP (elt, 1))
1659 eliminate_implied_condition (op, XEXP (elt, 0), head);
1662 /* Simplifies *EXPR using initial values at the start of the LOOP. If *EXPR
1663 is a list, its elements are assumed to be combined using OP. */
1665 static void
1666 simplify_using_initial_values (struct loop *loop, enum rtx_code op, rtx *expr)
1668 rtx head, tail, insn;
1669 rtx neutral, aggr;
1670 regset altered;
1671 regset_head altered_head;
1672 edge e;
1674 if (!*expr)
1675 return;
1677 if (CONSTANT_P (*expr))
1678 return;
1680 if (GET_CODE (*expr) == EXPR_LIST)
1682 head = XEXP (*expr, 0);
1683 tail = XEXP (*expr, 1);
1685 eliminate_implied_conditions (op, &head, tail);
1687 if (op == AND)
1689 neutral = const_true_rtx;
1690 aggr = const0_rtx;
1692 else if (op == IOR)
1694 neutral = const0_rtx;
1695 aggr = const_true_rtx;
1697 else
1698 abort ();
1700 simplify_using_initial_values (loop, NIL, &head);
1701 if (head == aggr)
1703 XEXP (*expr, 0) = aggr;
1704 XEXP (*expr, 1) = NULL_RTX;
1705 return;
1707 else if (head == neutral)
1709 *expr = tail;
1710 simplify_using_initial_values (loop, op, expr);
1711 return;
1713 simplify_using_initial_values (loop, op, &tail);
1715 if (tail && XEXP (tail, 0) == aggr)
1717 *expr = tail;
1718 return;
1721 XEXP (*expr, 0) = head;
1722 XEXP (*expr, 1) = tail;
1723 return;
1726 if (op != NIL)
1727 abort ();
1729 e = loop_preheader_edge (loop);
1730 if (e->src == ENTRY_BLOCK_PTR)
1731 return;
1733 altered = INITIALIZE_REG_SET (altered_head);
1735 while (1)
1737 insn = BB_END (e->src);
1738 if (any_condjump_p (insn))
1740 /* FIXME -- slightly wrong -- what if compared register
1741 gets altered between start of the condition and insn? */
1742 rtx cond = get_condition (BB_END (e->src), NULL, false);
1744 if (cond && (e->flags & EDGE_FALLTHRU))
1745 cond = reversed_condition (cond);
1746 if (cond)
1748 simplify_using_condition (cond, expr, altered);
1749 if (CONSTANT_P (*expr))
1751 FREE_REG_SET (altered);
1752 return;
1757 FOR_BB_INSNS_REVERSE (e->src, insn)
1759 if (!INSN_P (insn))
1760 continue;
1762 simplify_using_assignment (insn, expr, altered);
1763 if (CONSTANT_P (*expr))
1765 FREE_REG_SET (altered);
1766 return;
1770 e = e->src->pred;
1771 if (e->pred_next
1772 || e->src == ENTRY_BLOCK_PTR)
1773 break;
1776 FREE_REG_SET (altered);
1779 /* Transforms invariant IV into MODE. Adds assumptions based on the fact
1780 that IV occurs as left operands of comparison COND and its signedness
1781 is SIGNED_P to DESC. */
1783 static void
1784 shorten_into_mode (struct rtx_iv *iv, enum machine_mode mode,
1785 enum rtx_code cond, bool signed_p, struct niter_desc *desc)
1787 rtx mmin, mmax, cond_over, cond_under;
1789 get_mode_bounds (mode, signed_p, iv->extend_mode, &mmin, &mmax);
1790 cond_under = simplify_gen_relational (LT, SImode, iv->extend_mode,
1791 iv->base, mmin);
1792 cond_over = simplify_gen_relational (GT, SImode, iv->extend_mode,
1793 iv->base, mmax);
1795 switch (cond)
1797 case LE:
1798 case LT:
1799 case LEU:
1800 case LTU:
1801 if (cond_under != const0_rtx)
1802 desc->infinite =
1803 alloc_EXPR_LIST (0, cond_under, desc->infinite);
1804 if (cond_over != const0_rtx)
1805 desc->noloop_assumptions =
1806 alloc_EXPR_LIST (0, cond_over, desc->noloop_assumptions);
1807 break;
1809 case GE:
1810 case GT:
1811 case GEU:
1812 case GTU:
1813 if (cond_over != const0_rtx)
1814 desc->infinite =
1815 alloc_EXPR_LIST (0, cond_over, desc->infinite);
1816 if (cond_under != const0_rtx)
1817 desc->noloop_assumptions =
1818 alloc_EXPR_LIST (0, cond_under, desc->noloop_assumptions);
1819 break;
1821 case NE:
1822 if (cond_over != const0_rtx)
1823 desc->infinite =
1824 alloc_EXPR_LIST (0, cond_over, desc->infinite);
1825 if (cond_under != const0_rtx)
1826 desc->infinite =
1827 alloc_EXPR_LIST (0, cond_under, desc->infinite);
1828 break;
1830 default:
1831 abort ();
1834 iv->mode = mode;
1835 iv->extend = signed_p ? SIGN_EXTEND : ZERO_EXTEND;
1838 /* Transforms IV0 and IV1 compared by COND so that they are both compared as
1839 subregs of the same mode if possible (sometimes it is necessary to add
1840 some assumptions to DESC). */
1842 static bool
1843 canonicalize_iv_subregs (struct rtx_iv *iv0, struct rtx_iv *iv1,
1844 enum rtx_code cond, struct niter_desc *desc)
1846 enum machine_mode comp_mode;
1847 bool signed_p;
1849 /* If the ivs behave specially in the first iteration, or are
1850 added/multiplied after extending, we ignore them. */
1851 if (iv0->first_special || iv0->mult != const1_rtx || iv0->delta != const0_rtx)
1852 return false;
1853 if (iv1->first_special || iv1->mult != const1_rtx || iv1->delta != const0_rtx)
1854 return false;
1856 /* If there is some extend, it must match signedness of the comparison. */
1857 switch (cond)
1859 case LE:
1860 case LT:
1861 if (iv0->extend == ZERO_EXTEND
1862 || iv1->extend == ZERO_EXTEND)
1863 return false;
1864 signed_p = true;
1865 break;
1867 case LEU:
1868 case LTU:
1869 if (iv0->extend == SIGN_EXTEND
1870 || iv1->extend == SIGN_EXTEND)
1871 return false;
1872 signed_p = false;
1873 break;
1875 case NE:
1876 if (iv0->extend != NIL
1877 && iv1->extend != NIL
1878 && iv0->extend != iv1->extend)
1879 return false;
1881 signed_p = false;
1882 if (iv0->extend != NIL)
1883 signed_p = iv0->extend == SIGN_EXTEND;
1884 if (iv1->extend != NIL)
1885 signed_p = iv1->extend == SIGN_EXTEND;
1886 break;
1888 default:
1889 abort ();
1892 /* Values of both variables should be computed in the same mode. These
1893 might indeed be different, if we have comparison like
1895 (compare (subreg:SI (iv0)) (subreg:SI (iv1)))
1897 and iv0 and iv1 are both ivs iterating in SI mode, but calculated
1898 in different modes. This does not seem impossible to handle, but
1899 it hardly ever occurs in practice.
1901 The only exception is the case when one of operands is invariant.
1902 For example pentium 3 generates comparisons like
1903 (lt (subreg:HI (reg:SI)) 100). Here we assign HImode to 100, but we
1904 definitely do not want this prevent the optimization. */
1905 comp_mode = iv0->extend_mode;
1906 if (GET_MODE_BITSIZE (comp_mode) < GET_MODE_BITSIZE (iv1->extend_mode))
1907 comp_mode = iv1->extend_mode;
1909 if (iv0->extend_mode != comp_mode)
1911 if (iv0->mode != iv0->extend_mode
1912 || iv0->step != const0_rtx)
1913 return false;
1915 iv0->base = simplify_gen_unary (signed_p ? SIGN_EXTEND : ZERO_EXTEND,
1916 comp_mode, iv0->base, iv0->mode);
1917 iv0->extend_mode = comp_mode;
1920 if (iv1->extend_mode != comp_mode)
1922 if (iv1->mode != iv1->extend_mode
1923 || iv1->step != const0_rtx)
1924 return false;
1926 iv1->base = simplify_gen_unary (signed_p ? SIGN_EXTEND : ZERO_EXTEND,
1927 comp_mode, iv1->base, iv1->mode);
1928 iv1->extend_mode = comp_mode;
1931 /* Check that both ivs belong to a range of a single mode. If one of the
1932 operands is an invariant, we may need to shorten it into the common
1933 mode. */
1934 if (iv0->mode == iv0->extend_mode
1935 && iv0->step == const0_rtx
1936 && iv0->mode != iv1->mode)
1937 shorten_into_mode (iv0, iv1->mode, cond, signed_p, desc);
1939 if (iv1->mode == iv1->extend_mode
1940 && iv1->step == const0_rtx
1941 && iv0->mode != iv1->mode)
1942 shorten_into_mode (iv1, iv0->mode, swap_condition (cond), signed_p, desc);
1944 if (iv0->mode != iv1->mode)
1945 return false;
1947 desc->mode = iv0->mode;
1948 desc->signed_p = signed_p;
1950 return true;
1953 /* Computes number of iterations of the CONDITION in INSN in LOOP and stores
1954 the result into DESC. Very similar to determine_number_of_iterations
1955 (basically its rtl version), complicated by things like subregs. */
1957 void
1958 iv_number_of_iterations (struct loop *loop, rtx insn, rtx condition,
1959 struct niter_desc *desc)
1961 rtx op0, op1, delta, step, bound, may_xform, def_insn, tmp, tmp0, tmp1;
1962 struct rtx_iv iv0, iv1, tmp_iv;
1963 rtx assumption, may_not_xform;
1964 enum rtx_code cond;
1965 enum machine_mode mode, comp_mode;
1966 rtx mmin, mmax, mode_mmin, mode_mmax;
1967 unsigned HOST_WIDEST_INT s, size, d, inv;
1968 HOST_WIDEST_INT up, down, inc;
1969 int was_sharp = false;
1971 /* The meaning of these assumptions is this:
1972 if !assumptions
1973 then the rest of information does not have to be valid
1974 if noloop_assumptions then the loop does not roll
1975 if infinite then this exit is never used */
1977 desc->assumptions = NULL_RTX;
1978 desc->noloop_assumptions = NULL_RTX;
1979 desc->infinite = NULL_RTX;
1980 desc->simple_p = true;
1982 desc->const_iter = false;
1983 desc->niter_expr = NULL_RTX;
1984 desc->niter_max = 0;
1986 cond = GET_CODE (condition);
1987 if (!COMPARISON_P (condition))
1988 abort ();
1990 mode = GET_MODE (XEXP (condition, 0));
1991 if (mode == VOIDmode)
1992 mode = GET_MODE (XEXP (condition, 1));
1993 /* The constant comparisons should be folded. */
1994 if (mode == VOIDmode)
1995 abort ();
1997 /* We only handle integers or pointers. */
1998 if (GET_MODE_CLASS (mode) != MODE_INT
1999 && GET_MODE_CLASS (mode) != MODE_PARTIAL_INT)
2000 goto fail;
2002 op0 = XEXP (condition, 0);
2003 def_insn = iv_get_reaching_def (insn, op0);
2004 if (!iv_analyze (def_insn, op0, &iv0))
2005 goto fail;
2006 if (iv0.extend_mode == VOIDmode)
2007 iv0.mode = iv0.extend_mode = mode;
2009 op1 = XEXP (condition, 1);
2010 def_insn = iv_get_reaching_def (insn, op1);
2011 if (!iv_analyze (def_insn, op1, &iv1))
2012 goto fail;
2013 if (iv1.extend_mode == VOIDmode)
2014 iv1.mode = iv1.extend_mode = mode;
2016 if (GET_MODE_BITSIZE (iv0.extend_mode) > HOST_BITS_PER_WIDE_INT
2017 || GET_MODE_BITSIZE (iv1.extend_mode) > HOST_BITS_PER_WIDE_INT)
2018 goto fail;
2020 /* Check condition and normalize it. */
2022 switch (cond)
2024 case GE:
2025 case GT:
2026 case GEU:
2027 case GTU:
2028 tmp_iv = iv0; iv0 = iv1; iv1 = tmp_iv;
2029 cond = swap_condition (cond);
2030 break;
2031 case NE:
2032 case LE:
2033 case LEU:
2034 case LT:
2035 case LTU:
2036 break;
2037 default:
2038 goto fail;
2041 /* Handle extends. This is relatively nontrivial, so we only try in some
2042 easy cases, when we can canonicalize the ivs (possibly by adding some
2043 assumptions) to shape subreg (base + i * step). This function also fills
2044 in desc->mode and desc->signed_p. */
2046 if (!canonicalize_iv_subregs (&iv0, &iv1, cond, desc))
2047 goto fail;
2049 comp_mode = iv0.extend_mode;
2050 mode = iv0.mode;
2051 size = GET_MODE_BITSIZE (mode);
2052 get_mode_bounds (mode, (cond == LE || cond == LT), comp_mode, &mmin, &mmax);
2053 mode_mmin = lowpart_subreg (mode, mmin, comp_mode);
2054 mode_mmax = lowpart_subreg (mode, mmax, comp_mode);
2056 if (GET_CODE (iv0.step) != CONST_INT || GET_CODE (iv1.step) != CONST_INT)
2057 goto fail;
2059 /* We can take care of the case of two induction variables chasing each other
2060 if the test is NE. I have never seen a loop using it, but still it is
2061 cool. */
2062 if (iv0.step != const0_rtx && iv1.step != const0_rtx)
2064 if (cond != NE)
2065 goto fail;
2067 iv0.step = simplify_gen_binary (MINUS, comp_mode, iv0.step, iv1.step);
2068 iv1.step = const0_rtx;
2071 /* This is either infinite loop or the one that ends immediately, depending
2072 on initial values. Unswitching should remove this kind of conditions. */
2073 if (iv0.step == const0_rtx && iv1.step == const0_rtx)
2074 goto fail;
2076 /* Ignore loops of while (i-- < 10) type. */
2077 if (cond != NE
2078 && (INTVAL (iv0.step) < 0 || INTVAL (iv1.step) > 0))
2079 goto fail;
2081 /* Some more condition normalization. We must record some assumptions
2082 due to overflows. */
2083 switch (cond)
2085 case LT:
2086 case LTU:
2087 /* We want to take care only of non-sharp relationals; this is easy,
2088 as in cases the overflow would make the transformation unsafe
2089 the loop does not roll. Seemingly it would make more sense to want
2090 to take care of sharp relationals instead, as NE is more similar to
2091 them, but the problem is that here the transformation would be more
2092 difficult due to possibly infinite loops. */
2093 if (iv0.step == const0_rtx)
2095 tmp = lowpart_subreg (mode, iv0.base, comp_mode);
2096 assumption = simplify_gen_relational (EQ, SImode, mode, tmp,
2097 mode_mmax);
2098 if (assumption == const_true_rtx)
2099 goto zero_iter;
2100 iv0.base = simplify_gen_binary (PLUS, comp_mode,
2101 iv0.base, const1_rtx);
2103 else
2105 tmp = lowpart_subreg (mode, iv1.base, comp_mode);
2106 assumption = simplify_gen_relational (EQ, SImode, mode, tmp,
2107 mode_mmin);
2108 if (assumption == const_true_rtx)
2109 goto zero_iter;
2110 iv1.base = simplify_gen_binary (PLUS, comp_mode,
2111 iv1.base, constm1_rtx);
2114 if (assumption != const0_rtx)
2115 desc->noloop_assumptions =
2116 alloc_EXPR_LIST (0, assumption, desc->noloop_assumptions);
2117 cond = (cond == LT) ? LE : LEU;
2119 /* It will be useful to be able to tell the difference once more in
2120 LE -> NE reduction. */
2121 was_sharp = true;
2122 break;
2123 default: ;
2126 /* Take care of trivially infinite loops. */
2127 if (cond != NE)
2129 if (iv0.step == const0_rtx)
2131 tmp = lowpart_subreg (mode, iv0.base, comp_mode);
2132 if (rtx_equal_p (tmp, mode_mmin))
2134 desc->infinite =
2135 alloc_EXPR_LIST (0, const_true_rtx, NULL_RTX);
2136 return;
2139 else
2141 tmp = lowpart_subreg (mode, iv1.base, comp_mode);
2142 if (rtx_equal_p (tmp, mode_mmax))
2144 desc->infinite =
2145 alloc_EXPR_LIST (0, const_true_rtx, NULL_RTX);
2146 return;
2151 /* If we can we want to take care of NE conditions instead of size
2152 comparisons, as they are much more friendly (most importantly
2153 this takes care of special handling of loops with step 1). We can
2154 do it if we first check that upper bound is greater or equal to
2155 lower bound, their difference is constant c modulo step and that
2156 there is not an overflow. */
2157 if (cond != NE)
2159 if (iv0.step == const0_rtx)
2160 step = simplify_gen_unary (NEG, comp_mode, iv1.step, comp_mode);
2161 else
2162 step = iv0.step;
2163 delta = simplify_gen_binary (MINUS, comp_mode, iv1.base, iv0.base);
2164 delta = lowpart_subreg (mode, delta, comp_mode);
2165 delta = simplify_gen_binary (UMOD, mode, delta, step);
2166 may_xform = const0_rtx;
2167 may_not_xform = const_true_rtx;
2169 if (GET_CODE (delta) == CONST_INT)
2171 if (was_sharp && INTVAL (delta) == INTVAL (step) - 1)
2173 /* A special case. We have transformed condition of type
2174 for (i = 0; i < 4; i += 4)
2175 into
2176 for (i = 0; i <= 3; i += 4)
2177 obviously if the test for overflow during that transformation
2178 passed, we cannot overflow here. Most importantly any
2179 loop with sharp end condition and step 1 falls into this
2180 category, so handling this case specially is definitely
2181 worth the troubles. */
2182 may_xform = const_true_rtx;
2184 else if (iv0.step == const0_rtx)
2186 bound = simplify_gen_binary (PLUS, comp_mode, mmin, step);
2187 bound = simplify_gen_binary (MINUS, comp_mode, bound, delta);
2188 bound = lowpart_subreg (mode, bound, comp_mode);
2189 tmp = lowpart_subreg (mode, iv0.base, comp_mode);
2190 may_xform = simplify_gen_relational (cond, SImode, mode,
2191 bound, tmp);
2192 may_not_xform = simplify_gen_relational (reverse_condition (cond),
2193 SImode, mode,
2194 bound, tmp);
2196 else
2198 bound = simplify_gen_binary (MINUS, comp_mode, mmax, step);
2199 bound = simplify_gen_binary (PLUS, comp_mode, bound, delta);
2200 bound = lowpart_subreg (mode, bound, comp_mode);
2201 tmp = lowpart_subreg (mode, iv1.base, comp_mode);
2202 may_xform = simplify_gen_relational (cond, SImode, mode,
2203 tmp, bound);
2204 may_not_xform = simplify_gen_relational (reverse_condition (cond),
2205 SImode, mode,
2206 tmp, bound);
2210 if (may_xform != const0_rtx)
2212 /* We perform the transformation always provided that it is not
2213 completely senseless. This is OK, as we would need this assumption
2214 to determine the number of iterations anyway. */
2215 if (may_xform != const_true_rtx)
2217 /* If the step is a power of two and the final value we have
2218 computed overflows, the cycle is infinite. Otherwise it
2219 is nontrivial to compute the number of iterations. */
2220 s = INTVAL (step);
2221 if ((s & (s - 1)) == 0)
2222 desc->infinite = alloc_EXPR_LIST (0, may_not_xform,
2223 desc->infinite);
2224 else
2225 desc->assumptions = alloc_EXPR_LIST (0, may_xform,
2226 desc->assumptions);
2229 /* We are going to lose some information about upper bound on
2230 number of iterations in this step, so record the information
2231 here. */
2232 inc = INTVAL (iv0.step) - INTVAL (iv1.step);
2233 if (GET_CODE (iv1.base) == CONST_INT)
2234 up = INTVAL (iv1.base);
2235 else
2236 up = INTVAL (mode_mmax) - inc;
2237 down = INTVAL (GET_CODE (iv0.base) == CONST_INT
2238 ? iv0.base
2239 : mode_mmin);
2240 desc->niter_max = (up - down) / inc + 1;
2242 if (iv0.step == const0_rtx)
2244 iv0.base = simplify_gen_binary (PLUS, comp_mode, iv0.base, delta);
2245 iv0.base = simplify_gen_binary (MINUS, comp_mode, iv0.base, step);
2247 else
2249 iv1.base = simplify_gen_binary (MINUS, comp_mode, iv1.base, delta);
2250 iv1.base = simplify_gen_binary (PLUS, comp_mode, iv1.base, step);
2253 tmp0 = lowpart_subreg (mode, iv0.base, comp_mode);
2254 tmp1 = lowpart_subreg (mode, iv1.base, comp_mode);
2255 assumption = simplify_gen_relational (reverse_condition (cond),
2256 SImode, mode, tmp0, tmp1);
2257 if (assumption == const_true_rtx)
2258 goto zero_iter;
2259 else if (assumption != const0_rtx)
2260 desc->noloop_assumptions =
2261 alloc_EXPR_LIST (0, assumption, desc->noloop_assumptions);
2262 cond = NE;
2266 /* Count the number of iterations. */
2267 if (cond == NE)
2269 /* Everything we do here is just arithmetics modulo size of mode. This
2270 makes us able to do more involved computations of number of iterations
2271 than in other cases. First transform the condition into shape
2272 s * i <> c, with s positive. */
2273 iv1.base = simplify_gen_binary (MINUS, comp_mode, iv1.base, iv0.base);
2274 iv0.base = const0_rtx;
2275 iv0.step = simplify_gen_binary (MINUS, comp_mode, iv0.step, iv1.step);
2276 iv1.step = const0_rtx;
2277 if (INTVAL (iv0.step) < 0)
2279 iv0.step = simplify_gen_unary (NEG, comp_mode, iv0.step, mode);
2280 iv1.base = simplify_gen_unary (NEG, comp_mode, iv1.base, mode);
2282 iv0.step = lowpart_subreg (mode, iv0.step, comp_mode);
2284 /* Let nsd (s, size of mode) = d. If d does not divide c, the loop
2285 is infinite. Otherwise, the number of iterations is
2286 (inverse(s/d) * (c/d)) mod (size of mode/d). */
2287 s = INTVAL (iv0.step); d = 1;
2288 while (s % 2 != 1)
2290 s /= 2;
2291 d *= 2;
2292 size--;
2294 bound = GEN_INT (((unsigned HOST_WIDEST_INT) 1 << (size - 1 ) << 1) - 1);
2296 tmp1 = lowpart_subreg (mode, iv1.base, comp_mode);
2297 tmp = simplify_gen_binary (UMOD, mode, tmp1, GEN_INT (d));
2298 assumption = simplify_gen_relational (NE, SImode, mode, tmp, const0_rtx);
2299 desc->infinite = alloc_EXPR_LIST (0, assumption, desc->infinite);
2301 tmp = simplify_gen_binary (UDIV, mode, tmp1, GEN_INT (d));
2302 inv = inverse (s, size);
2303 inv = trunc_int_for_mode (inv, mode);
2304 tmp = simplify_gen_binary (MULT, mode, tmp, GEN_INT (inv));
2305 desc->niter_expr = simplify_gen_binary (AND, mode, tmp, bound);
2307 else
2309 if (iv1.step == const0_rtx)
2310 /* Condition in shape a + s * i <= b
2311 We must know that b + s does not overflow and a <= b + s and then we
2312 can compute number of iterations as (b + s - a) / s. (It might
2313 seem that we in fact could be more clever about testing the b + s
2314 overflow condition using some information about b - a mod s,
2315 but it was already taken into account during LE -> NE transform). */
2317 step = iv0.step;
2318 tmp0 = lowpart_subreg (mode, iv0.base, comp_mode);
2319 tmp1 = lowpart_subreg (mode, iv1.base, comp_mode);
2321 bound = simplify_gen_binary (MINUS, mode, mode_mmax,
2322 lowpart_subreg (mode, step, comp_mode));
2323 assumption = simplify_gen_relational (cond, SImode, mode,
2324 tmp1, bound);
2325 desc->assumptions =
2326 alloc_EXPR_LIST (0, assumption, desc->assumptions);
2328 tmp = simplify_gen_binary (PLUS, comp_mode, iv1.base, iv0.step);
2329 tmp = lowpart_subreg (mode, tmp, comp_mode);
2330 assumption = simplify_gen_relational (reverse_condition (cond),
2331 SImode, mode, tmp0, tmp);
2333 delta = simplify_gen_binary (PLUS, mode, tmp1, step);
2334 delta = simplify_gen_binary (MINUS, mode, delta, tmp0);
2336 else
2338 /* Condition in shape a <= b - s * i
2339 We must know that a - s does not overflow and a - s <= b and then
2340 we can again compute number of iterations as (b - (a - s)) / s. */
2341 step = simplify_gen_unary (NEG, mode, iv1.step, mode);
2342 tmp0 = lowpart_subreg (mode, iv0.base, comp_mode);
2343 tmp1 = lowpart_subreg (mode, iv1.base, comp_mode);
2345 bound = simplify_gen_binary (MINUS, mode, mode_mmin,
2346 lowpart_subreg (mode, step, comp_mode));
2347 assumption = simplify_gen_relational (cond, SImode, mode,
2348 bound, tmp0);
2349 desc->assumptions =
2350 alloc_EXPR_LIST (0, assumption, desc->assumptions);
2352 tmp = simplify_gen_binary (PLUS, comp_mode, iv0.base, iv1.step);
2353 tmp = lowpart_subreg (mode, tmp, comp_mode);
2354 assumption = simplify_gen_relational (reverse_condition (cond),
2355 SImode, mode,
2356 tmp, tmp1);
2357 delta = simplify_gen_binary (MINUS, mode, tmp0, step);
2358 delta = simplify_gen_binary (MINUS, mode, tmp1, delta);
2360 if (assumption == const_true_rtx)
2361 goto zero_iter;
2362 else if (assumption != const0_rtx)
2363 desc->noloop_assumptions =
2364 alloc_EXPR_LIST (0, assumption, desc->noloop_assumptions);
2365 delta = simplify_gen_binary (UDIV, mode, delta, step);
2366 desc->niter_expr = delta;
2369 simplify_using_initial_values (loop, AND, &desc->assumptions);
2370 if (desc->assumptions
2371 && XEXP (desc->assumptions, 0) == const0_rtx)
2372 goto fail;
2373 simplify_using_initial_values (loop, IOR, &desc->noloop_assumptions);
2374 simplify_using_initial_values (loop, IOR, &desc->infinite);
2375 simplify_using_initial_values (loop, NIL, &desc->niter_expr);
2377 /* Rerun the simplification. Consider code (created by copying loop headers)
2379 i = 0;
2381 if (0 < n)
2385 i++;
2386 } while (i < n);
2389 The first pass determines that i = 0, the second pass uses it to eliminate
2390 noloop assumption. */
2392 simplify_using_initial_values (loop, AND, &desc->assumptions);
2393 if (desc->assumptions
2394 && XEXP (desc->assumptions, 0) == const0_rtx)
2395 goto fail;
2396 simplify_using_initial_values (loop, IOR, &desc->noloop_assumptions);
2397 simplify_using_initial_values (loop, IOR, &desc->infinite);
2398 simplify_using_initial_values (loop, NIL, &desc->niter_expr);
2400 if (desc->noloop_assumptions
2401 && XEXP (desc->noloop_assumptions, 0) == const_true_rtx)
2402 goto zero_iter;
2404 if (GET_CODE (desc->niter_expr) == CONST_INT)
2406 unsigned HOST_WIDEST_INT val = INTVAL (desc->niter_expr);
2408 desc->const_iter = true;
2409 desc->niter_max = desc->niter = val & GET_MODE_MASK (desc->mode);
2411 else if (!desc->niter_max)
2412 desc->niter_max = determine_max_iter (desc);
2414 return;
2416 fail:
2417 desc->simple_p = false;
2418 return;
2420 zero_iter:
2421 desc->const_iter = true;
2422 desc->niter = 0;
2423 desc->niter_max = 0;
2424 desc->niter_expr = const0_rtx;
2425 return;
2428 /* Checks whether E is a simple exit from LOOP and stores its description
2429 into DESC. */
2431 static void
2432 check_simple_exit (struct loop *loop, edge e, struct niter_desc *desc)
2434 basic_block exit_bb;
2435 rtx condition, at;
2436 edge ei;
2438 exit_bb = e->src;
2439 desc->simple_p = false;
2441 /* It must belong directly to the loop. */
2442 if (exit_bb->loop_father != loop)
2443 return;
2445 /* It must be tested (at least) once during any iteration. */
2446 if (!dominated_by_p (CDI_DOMINATORS, loop->latch, exit_bb))
2447 return;
2449 /* It must end in a simple conditional jump. */
2450 if (!any_condjump_p (BB_END (exit_bb)))
2451 return;
2453 ei = exit_bb->succ;
2454 if (ei == e)
2455 ei = ei->succ_next;
2457 desc->out_edge = e;
2458 desc->in_edge = ei;
2460 /* Test whether the condition is suitable. */
2461 if (!(condition = get_condition (BB_END (ei->src), &at, false)))
2462 return;
2464 if (ei->flags & EDGE_FALLTHRU)
2466 condition = reversed_condition (condition);
2467 if (!condition)
2468 return;
2471 /* Check that we are able to determine number of iterations and fill
2472 in information about it. */
2473 iv_number_of_iterations (loop, at, condition, desc);
2476 /* Finds a simple exit of LOOP and stores its description into DESC. */
2478 void
2479 find_simple_exit (struct loop *loop, struct niter_desc *desc)
2481 unsigned i;
2482 basic_block *body;
2483 edge e;
2484 struct niter_desc act;
2485 bool any = false;
2487 desc->simple_p = false;
2488 body = get_loop_body (loop);
2490 for (i = 0; i < loop->num_nodes; i++)
2492 for (e = body[i]->succ; e; e = e->succ_next)
2494 if (flow_bb_inside_loop_p (loop, e->dest))
2495 continue;
2497 check_simple_exit (loop, e, &act);
2498 if (!act.simple_p)
2499 continue;
2501 /* Prefer constant iterations; the less the better. */
2502 if (!any)
2503 any = true;
2504 else if (!act.const_iter
2505 || (desc->const_iter && act.niter >= desc->niter))
2506 continue;
2507 *desc = act;
2511 if (dump_file)
2513 if (desc->simple_p)
2515 fprintf (dump_file, "Loop %d is simple:\n", loop->num);
2516 fprintf (dump_file, " simple exit %d -> %d\n",
2517 desc->out_edge->src->index,
2518 desc->out_edge->dest->index);
2519 if (desc->assumptions)
2521 fprintf (dump_file, " assumptions: ");
2522 print_rtl (dump_file, desc->assumptions);
2523 fprintf (dump_file, "\n");
2525 if (desc->noloop_assumptions)
2527 fprintf (dump_file, " does not roll if: ");
2528 print_rtl (dump_file, desc->noloop_assumptions);
2529 fprintf (dump_file, "\n");
2531 if (desc->infinite)
2533 fprintf (dump_file, " infinite if: ");
2534 print_rtl (dump_file, desc->infinite);
2535 fprintf (dump_file, "\n");
2538 fprintf (dump_file, " number of iterations: ");
2539 print_rtl (dump_file, desc->niter_expr);
2540 fprintf (dump_file, "\n");
2542 fprintf (dump_file, " upper bound: ");
2543 fprintf (dump_file, HOST_WIDEST_INT_PRINT_DEC, desc->niter_max);
2544 fprintf (dump_file, "\n");
2546 else
2547 fprintf (dump_file, "Loop %d is not simple.\n", loop->num);
2550 free (body);
2553 /* Creates a simple loop description of LOOP if it was not computed
2554 already. */
2556 struct niter_desc *
2557 get_simple_loop_desc (struct loop *loop)
2559 struct niter_desc *desc = simple_loop_desc (loop);
2561 if (desc)
2562 return desc;
2564 desc = xmalloc (sizeof (struct niter_desc));
2565 iv_analysis_loop_init (loop);
2566 find_simple_exit (loop, desc);
2567 loop->aux = desc;
2569 return desc;
2572 /* Releases simple loop description for LOOP. */
2574 void
2575 free_simple_loop_desc (struct loop *loop)
2577 struct niter_desc *desc = simple_loop_desc (loop);
2579 if (!desc)
2580 return;
2582 free (desc);
2583 loop->aux = NULL;