OSDN Git Service

* config/darwin.h (LINK_COMMAND_SPEC): Add .cxx/.cp for dsymutil
[pf3gnuchains/gcc-fork.git] / gcc / loop-unroll.c
1 /* Loop unrolling and peeling.
2    Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
3
4 This file is part of GCC.
5
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.
10
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.
15
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, 51 Franklin Street, Fifth Floor, Boston, MA
19 02110-1301, USA.  */
20
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 "obstack.h"
28 #include "basic-block.h"
29 #include "cfgloop.h"
30 #include "cfglayout.h"
31 #include "params.h"
32 #include "output.h"
33 #include "expr.h"
34 #include "hashtab.h"
35 #include "recog.h"    
36
37 /* This pass performs loop unrolling and peeling.  We only perform these
38    optimizations on innermost loops (with single exception) because
39    the impact on performance is greatest here, and we want to avoid
40    unnecessary code size growth.  The gain is caused by greater sequentiality
41    of code, better code to optimize for further passes and in some cases
42    by fewer testings of exit conditions.  The main problem is code growth,
43    that impacts performance negatively due to effect of caches.
44
45    What we do:
46
47    -- complete peeling of once-rolling loops; this is the above mentioned
48       exception, as this causes loop to be cancelled completely and
49       does not cause code growth
50    -- complete peeling of loops that roll (small) constant times.
51    -- simple peeling of first iterations of loops that do not roll much
52       (according to profile feedback)
53    -- unrolling of loops that roll constant times; this is almost always
54       win, as we get rid of exit condition tests.
55    -- unrolling of loops that roll number of times that we can compute
56       in runtime; we also get rid of exit condition tests here, but there
57       is the extra expense for calculating the number of iterations
58    -- simple unrolling of remaining loops; this is performed only if we
59       are asked to, as the gain is questionable in this case and often
60       it may even slow down the code
61    For more detailed descriptions of each of those, see comments at
62    appropriate function below.
63
64    There is a lot of parameters (defined and described in params.def) that
65    control how much we unroll/peel.
66
67    ??? A great problem is that we don't have a good way how to determine
68    how many times we should unroll the loop; the experiments I have made
69    showed that this choice may affect performance in order of several %.
70    */
71
72 /* Information about induction variables to split.  */
73
74 struct iv_to_split
75 {
76   rtx insn;             /* The insn in that the induction variable occurs.  */
77   rtx base_var;         /* The variable on that the values in the further
78                            iterations are based.  */
79   rtx step;             /* Step of the induction variable.  */
80   unsigned n_loc;
81   unsigned loc[3];      /* Location where the definition of the induction
82                            variable occurs in the insn.  For example if
83                            N_LOC is 2, the expression is located at
84                            XEXP (XEXP (single_set, loc[0]), loc[1]).  */ 
85 };
86
87 /* Information about accumulators to expand.  */
88
89 struct var_to_expand
90 {
91   rtx insn;                        /* The insn in that the variable expansion occurs.  */
92   rtx reg;                         /* The accumulator which is expanded.  */
93   VEC(rtx,heap) *var_expansions;   /* The copies of the accumulator which is expanded.  */ 
94   enum rtx_code op;                /* The type of the accumulation - addition, subtraction 
95                                       or multiplication.  */
96   int expansion_count;             /* Count the number of expansions generated so far.  */
97   int reuse_expansion;             /* The expansion we intend to reuse to expand
98                                       the accumulator.  If REUSE_EXPANSION is 0 reuse 
99                                       the original accumulator.  Else use 
100                                       var_expansions[REUSE_EXPANSION - 1].  */
101   unsigned accum_pos;              /* The position in which the accumulator is placed in
102                                       the insn src.  For example in x = x + something
103                                       accum_pos is 0 while in x = something + x accum_pos
104                                       is 1.  */
105 };
106
107 /* Information about optimization applied in
108    the unrolled loop.  */
109
110 struct opt_info
111 {
112   htab_t insns_to_split;           /* A hashtable of insns to split.  */
113   htab_t insns_with_var_to_expand; /* A hashtable of insns with accumulators
114                                       to expand.  */
115   unsigned first_new_block;        /* The first basic block that was
116                                       duplicated.  */
117   basic_block loop_exit;           /* The loop exit basic block.  */
118   basic_block loop_preheader;      /* The loop preheader basic block.  */
119 };
120
121 static void decide_unrolling_and_peeling (int);
122 static void peel_loops_completely (int);
123 static void decide_peel_simple (struct loop *, int);
124 static void decide_peel_once_rolling (struct loop *, int);
125 static void decide_peel_completely (struct loop *, int);
126 static void decide_unroll_stupid (struct loop *, int);
127 static void decide_unroll_constant_iterations (struct loop *, int);
128 static void decide_unroll_runtime_iterations (struct loop *, int);
129 static void peel_loop_simple (struct loop *);
130 static void peel_loop_completely (struct loop *);
131 static void unroll_loop_stupid (struct loop *);
132 static void unroll_loop_constant_iterations (struct loop *);
133 static void unroll_loop_runtime_iterations (struct loop *);
134 static struct opt_info *analyze_insns_in_loop (struct loop *);
135 static void opt_info_start_duplication (struct opt_info *);
136 static void apply_opt_in_copies (struct opt_info *, unsigned, bool, bool);
137 static void free_opt_info (struct opt_info *);
138 static struct var_to_expand *analyze_insn_to_expand_var (struct loop*, rtx);
139 static bool referenced_in_one_insn_in_loop_p (struct loop *, rtx);
140 static struct iv_to_split *analyze_iv_to_split_insn (rtx);
141 static void expand_var_during_unrolling (struct var_to_expand *, rtx);
142 static int insert_var_expansion_initialization (void **, void *);
143 static int combine_var_copies_in_loop_exit (void **, void *);
144 static int release_var_copies (void **, void *);
145 static rtx get_expansion (struct var_to_expand *);
146
147 /* Unroll and/or peel (depending on FLAGS) LOOPS.  */
148 void
149 unroll_and_peel_loops (int flags)
150 {
151   struct loop *loop;
152   bool check;
153   loop_iterator li;
154
155   /* First perform complete loop peeling (it is almost surely a win,
156      and affects parameters for further decision a lot).  */
157   peel_loops_completely (flags);
158
159   /* Now decide rest of unrolling and peeling.  */
160   decide_unrolling_and_peeling (flags);
161
162   /* Scan the loops, inner ones first.  */
163   FOR_EACH_LOOP (li, loop, LI_FROM_INNERMOST)
164     {
165       check = true;
166       /* And perform the appropriate transformations.  */
167       switch (loop->lpt_decision.decision)
168         {
169         case LPT_PEEL_COMPLETELY:
170           /* Already done.  */
171           gcc_unreachable ();
172         case LPT_PEEL_SIMPLE:
173           peel_loop_simple (loop);
174           break;
175         case LPT_UNROLL_CONSTANT:
176           unroll_loop_constant_iterations (loop);
177           break;
178         case LPT_UNROLL_RUNTIME:
179           unroll_loop_runtime_iterations (loop);
180           break;
181         case LPT_UNROLL_STUPID:
182           unroll_loop_stupid (loop);
183           break;
184         case LPT_NONE:
185           check = false;
186           break;
187         default:
188           gcc_unreachable ();
189         }
190       if (check)
191         {
192 #ifdef ENABLE_CHECKING
193           verify_dominators (CDI_DOMINATORS);
194           verify_loop_structure ();
195 #endif
196         }
197     }
198
199   iv_analysis_done ();
200 }
201
202 /* Check whether exit of the LOOP is at the end of loop body.  */
203
204 static bool
205 loop_exit_at_end_p (struct loop *loop)
206 {
207   struct niter_desc *desc = get_simple_loop_desc (loop);
208   rtx insn;
209
210   if (desc->in_edge->dest != loop->latch)
211     return false;
212
213   /* Check that the latch is empty.  */
214   FOR_BB_INSNS (loop->latch, insn)
215     {
216       if (INSN_P (insn))
217         return false;
218     }
219
220   return true;
221 }
222
223 /* Depending on FLAGS, check whether to peel loops completely and do so.  */
224 static void
225 peel_loops_completely (int flags)
226 {
227   struct loop *loop;
228   loop_iterator li;
229
230   /* Scan the loops, the inner ones first.  */
231   FOR_EACH_LOOP (li, loop, LI_FROM_INNERMOST)
232     {
233       loop->lpt_decision.decision = LPT_NONE;
234
235       if (dump_file)
236         fprintf (dump_file,
237                  "\n;; *** Considering loop %d for complete peeling ***\n",
238                  loop->num);
239
240       loop->ninsns = num_loop_insns (loop);
241
242       decide_peel_once_rolling (loop, flags);
243       if (loop->lpt_decision.decision == LPT_NONE)
244         decide_peel_completely (loop, flags);
245
246       if (loop->lpt_decision.decision == LPT_PEEL_COMPLETELY)
247         {
248           peel_loop_completely (loop);
249 #ifdef ENABLE_CHECKING
250           verify_dominators (CDI_DOMINATORS);
251           verify_loop_structure ();
252 #endif
253         }
254     }
255 }
256
257 /* Decide whether unroll or peel loops (depending on FLAGS) and how much.  */
258 static void
259 decide_unrolling_and_peeling (int flags)
260 {
261   struct loop *loop;
262   loop_iterator li;
263
264   /* Scan the loops, inner ones first.  */
265   FOR_EACH_LOOP (li, loop, LI_FROM_INNERMOST)
266     {
267       loop->lpt_decision.decision = LPT_NONE;
268
269       if (dump_file)
270         fprintf (dump_file, "\n;; *** Considering loop %d ***\n", loop->num);
271
272       /* Do not peel cold areas.  */
273       if (!maybe_hot_bb_p (loop->header))
274         {
275           if (dump_file)
276             fprintf (dump_file, ";; Not considering loop, cold area\n");
277           continue;
278         }
279
280       /* Can the loop be manipulated?  */
281       if (!can_duplicate_loop_p (loop))
282         {
283           if (dump_file)
284             fprintf (dump_file,
285                      ";; Not considering loop, cannot duplicate\n");
286           continue;
287         }
288
289       /* Skip non-innermost loops.  */
290       if (loop->inner)
291         {
292           if (dump_file)
293             fprintf (dump_file, ";; Not considering loop, is not innermost\n");
294           continue;
295         }
296
297       loop->ninsns = num_loop_insns (loop);
298       loop->av_ninsns = average_num_loop_insns (loop);
299
300       /* Try transformations one by one in decreasing order of
301          priority.  */
302
303       decide_unroll_constant_iterations (loop, flags);
304       if (loop->lpt_decision.decision == LPT_NONE)
305         decide_unroll_runtime_iterations (loop, flags);
306       if (loop->lpt_decision.decision == LPT_NONE)
307         decide_unroll_stupid (loop, flags);
308       if (loop->lpt_decision.decision == LPT_NONE)
309         decide_peel_simple (loop, flags);
310     }
311 }
312
313 /* Decide whether the LOOP is once rolling and suitable for complete
314    peeling.  */
315 static void
316 decide_peel_once_rolling (struct loop *loop, int flags ATTRIBUTE_UNUSED)
317 {
318   struct niter_desc *desc;
319
320   if (dump_file)
321     fprintf (dump_file, "\n;; Considering peeling once rolling loop\n");
322
323   /* Is the loop small enough?  */
324   if ((unsigned) PARAM_VALUE (PARAM_MAX_ONCE_PEELED_INSNS) < loop->ninsns)
325     {
326       if (dump_file)
327         fprintf (dump_file, ";; Not considering loop, is too big\n");
328       return;
329     }
330
331   /* Check for simple loops.  */
332   desc = get_simple_loop_desc (loop);
333
334   /* Check number of iterations.  */
335   if (!desc->simple_p
336       || desc->assumptions
337       || desc->infinite
338       || !desc->const_iter
339       || desc->niter != 0)
340     {
341       if (dump_file)
342         fprintf (dump_file,
343                  ";; Unable to prove that the loop rolls exactly once\n");
344       return;
345     }
346
347   /* Success.  */
348   if (dump_file)
349     fprintf (dump_file, ";; Decided to peel exactly once rolling loop\n");
350   loop->lpt_decision.decision = LPT_PEEL_COMPLETELY;
351 }
352
353 /* Decide whether the LOOP is suitable for complete peeling.  */
354 static void
355 decide_peel_completely (struct loop *loop, int flags ATTRIBUTE_UNUSED)
356 {
357   unsigned npeel;
358   struct niter_desc *desc;
359
360   if (dump_file)
361     fprintf (dump_file, "\n;; Considering peeling completely\n");
362
363   /* Skip non-innermost loops.  */
364   if (loop->inner)
365     {
366       if (dump_file)
367         fprintf (dump_file, ";; Not considering loop, is not innermost\n");
368       return;
369     }
370
371   /* Do not peel cold areas.  */
372   if (!maybe_hot_bb_p (loop->header))
373     {
374       if (dump_file)
375         fprintf (dump_file, ";; Not considering loop, cold area\n");
376       return;
377     }
378
379   /* Can the loop be manipulated?  */
380   if (!can_duplicate_loop_p (loop))
381     {
382       if (dump_file)
383         fprintf (dump_file,
384                  ";; Not considering loop, cannot duplicate\n");
385       return;
386     }
387
388   /* npeel = number of iterations to peel.  */
389   npeel = PARAM_VALUE (PARAM_MAX_COMPLETELY_PEELED_INSNS) / loop->ninsns;
390   if (npeel > (unsigned) PARAM_VALUE (PARAM_MAX_COMPLETELY_PEEL_TIMES))
391     npeel = PARAM_VALUE (PARAM_MAX_COMPLETELY_PEEL_TIMES);
392
393   /* Is the loop small enough?  */
394   if (!npeel)
395     {
396       if (dump_file)
397         fprintf (dump_file, ";; Not considering loop, is too big\n");
398       return;
399     }
400
401   /* Check for simple loops.  */
402   desc = get_simple_loop_desc (loop);
403
404   /* Check number of iterations.  */
405   if (!desc->simple_p
406       || desc->assumptions
407       || !desc->const_iter
408       || desc->infinite)
409     {
410       if (dump_file)
411         fprintf (dump_file,
412                  ";; Unable to prove that the loop iterates constant times\n");
413       return;
414     }
415
416   if (desc->niter > npeel - 1)
417     {
418       if (dump_file)
419         {
420           fprintf (dump_file,
421                    ";; Not peeling loop completely, rolls too much (");
422           fprintf (dump_file, HOST_WIDEST_INT_PRINT_DEC, desc->niter);
423           fprintf (dump_file, " iterations > %d [maximum peelings])\n", npeel);
424         }
425       return;
426     }
427
428   /* Success.  */
429   if (dump_file)
430     fprintf (dump_file, ";; Decided to peel loop completely\n");
431   loop->lpt_decision.decision = LPT_PEEL_COMPLETELY;
432 }
433
434 /* Peel all iterations of LOOP, remove exit edges and cancel the loop
435    completely.  The transformation done:
436
437    for (i = 0; i < 4; i++)
438      body;
439
440    ==>
441
442    i = 0;
443    body; i++;
444    body; i++;
445    body; i++;
446    body; i++;
447    */
448 static void
449 peel_loop_completely (struct loop *loop)
450 {
451   sbitmap wont_exit;
452   unsigned HOST_WIDE_INT npeel;
453   unsigned i;
454   VEC (edge, heap) *remove_edges;
455   edge ein;
456   struct niter_desc *desc = get_simple_loop_desc (loop);
457   struct opt_info *opt_info = NULL;
458   
459   npeel = desc->niter;
460
461   if (npeel)
462     {
463       bool ok;
464       
465       wont_exit = sbitmap_alloc (npeel + 1);
466       sbitmap_ones (wont_exit);
467       RESET_BIT (wont_exit, 0);
468       if (desc->noloop_assumptions)
469         RESET_BIT (wont_exit, 1);
470
471       remove_edges = NULL;
472
473       if (flag_split_ivs_in_unroller)
474         opt_info = analyze_insns_in_loop (loop);
475       
476       opt_info_start_duplication (opt_info);
477       ok = duplicate_loop_to_header_edge (loop, loop_preheader_edge (loop),
478                                           npeel,
479                                           wont_exit, desc->out_edge,
480                                           &remove_edges,
481                                           DLTHE_FLAG_UPDATE_FREQ
482                                           | DLTHE_FLAG_COMPLETTE_PEEL
483                                           | (opt_info
484                                              ? DLTHE_RECORD_COPY_NUMBER : 0));
485       gcc_assert (ok);
486
487       free (wont_exit);
488       
489       if (opt_info)
490         {
491           apply_opt_in_copies (opt_info, npeel, false, true);
492           free_opt_info (opt_info);
493         }
494
495       /* Remove the exit edges.  */
496       for (i = 0; VEC_iterate (edge, remove_edges, i, ein); i++)
497         remove_path (ein);
498       VEC_free (edge, heap, remove_edges);
499     }
500
501   ein = desc->in_edge;
502   free_simple_loop_desc (loop);
503
504   /* Now remove the unreachable part of the last iteration and cancel
505      the loop.  */
506   remove_path (ein);
507
508   if (dump_file)
509     fprintf (dump_file, ";; Peeled loop completely, %d times\n", (int) npeel);
510 }
511
512 /* Decide whether to unroll LOOP iterating constant number of times
513    and how much.  */
514
515 static void
516 decide_unroll_constant_iterations (struct loop *loop, int flags)
517 {
518   unsigned nunroll, nunroll_by_av, best_copies, best_unroll = 0, n_copies, i;
519   struct niter_desc *desc;
520
521   if (!(flags & UAP_UNROLL))
522     {
523       /* We were not asked to, just return back silently.  */
524       return;
525     }
526
527   if (dump_file)
528     fprintf (dump_file,
529              "\n;; Considering unrolling loop with constant "
530              "number of iterations\n");
531
532   /* nunroll = total number of copies of the original loop body in
533      unrolled loop (i.e. if it is 2, we have to duplicate loop body once.  */
534   nunroll = PARAM_VALUE (PARAM_MAX_UNROLLED_INSNS) / loop->ninsns;
535   nunroll_by_av
536     = PARAM_VALUE (PARAM_MAX_AVERAGE_UNROLLED_INSNS) / loop->av_ninsns;
537   if (nunroll > nunroll_by_av)
538     nunroll = nunroll_by_av;
539   if (nunroll > (unsigned) PARAM_VALUE (PARAM_MAX_UNROLL_TIMES))
540     nunroll = PARAM_VALUE (PARAM_MAX_UNROLL_TIMES);
541
542   /* Skip big loops.  */
543   if (nunroll <= 1)
544     {
545       if (dump_file)
546         fprintf (dump_file, ";; Not considering loop, is too big\n");
547       return;
548     }
549
550   /* Check for simple loops.  */
551   desc = get_simple_loop_desc (loop);
552
553   /* Check number of iterations.  */
554   if (!desc->simple_p || !desc->const_iter || desc->assumptions)
555     {
556       if (dump_file)
557         fprintf (dump_file,
558                  ";; Unable to prove that the loop iterates constant times\n");
559       return;
560     }
561
562   /* Check whether the loop rolls enough to consider.  */
563   if (desc->niter < 2 * nunroll)
564     {
565       if (dump_file)
566         fprintf (dump_file, ";; Not unrolling loop, doesn't roll\n");
567       return;
568     }
569
570   /* Success; now compute number of iterations to unroll.  We alter
571      nunroll so that as few as possible copies of loop body are
572      necessary, while still not decreasing the number of unrollings
573      too much (at most by 1).  */
574   best_copies = 2 * nunroll + 10;
575
576   i = 2 * nunroll + 2;
577   if (i - 1 >= desc->niter)
578     i = desc->niter - 2;
579
580   for (; i >= nunroll - 1; i--)
581     {
582       unsigned exit_mod = desc->niter % (i + 1);
583
584       if (!loop_exit_at_end_p (loop))
585         n_copies = exit_mod + i + 1;
586       else if (exit_mod != (unsigned) i
587                || desc->noloop_assumptions != NULL_RTX)
588         n_copies = exit_mod + i + 2;
589       else
590         n_copies = i + 1;
591
592       if (n_copies < best_copies)
593         {
594           best_copies = n_copies;
595           best_unroll = i;
596         }
597     }
598
599   if (dump_file)
600     fprintf (dump_file, ";; max_unroll %d (%d copies, initial %d).\n",
601              best_unroll + 1, best_copies, nunroll);
602
603   loop->lpt_decision.decision = LPT_UNROLL_CONSTANT;
604   loop->lpt_decision.times = best_unroll;
605   
606   if (dump_file)
607     fprintf (dump_file,
608              ";; Decided to unroll the constant times rolling loop, %d times.\n",
609              loop->lpt_decision.times);
610 }
611
612 /* Unroll LOOP with constant number of iterations LOOP->LPT_DECISION.TIMES + 1
613    times.  The transformation does this:
614
615    for (i = 0; i < 102; i++)
616      body;
617
618    ==>
619
620    i = 0;
621    body; i++;
622    body; i++;
623    while (i < 102)
624      {
625        body; i++;
626        body; i++;
627        body; i++;
628        body; i++;
629      }
630   */
631 static void
632 unroll_loop_constant_iterations (struct loop *loop)
633 {
634   unsigned HOST_WIDE_INT niter;
635   unsigned exit_mod;
636   sbitmap wont_exit;
637   unsigned i;
638   VEC (edge, heap) *remove_edges;
639   edge e;
640   unsigned max_unroll = loop->lpt_decision.times;
641   struct niter_desc *desc = get_simple_loop_desc (loop);
642   bool exit_at_end = loop_exit_at_end_p (loop);
643   struct opt_info *opt_info = NULL;
644   bool ok;
645   
646   niter = desc->niter;
647
648   /* Should not get here (such loop should be peeled instead).  */
649   gcc_assert (niter > max_unroll + 1);
650
651   exit_mod = niter % (max_unroll + 1);
652
653   wont_exit = sbitmap_alloc (max_unroll + 1);
654   sbitmap_ones (wont_exit);
655
656   remove_edges = NULL;
657   if (flag_split_ivs_in_unroller 
658       || flag_variable_expansion_in_unroller)
659     opt_info = analyze_insns_in_loop (loop);
660   
661   if (!exit_at_end)
662     {
663       /* The exit is not at the end of the loop; leave exit test
664          in the first copy, so that the loops that start with test
665          of exit condition have continuous body after unrolling.  */
666
667       if (dump_file)
668         fprintf (dump_file, ";; Condition on beginning of loop.\n");
669
670       /* Peel exit_mod iterations.  */
671       RESET_BIT (wont_exit, 0);
672       if (desc->noloop_assumptions)
673         RESET_BIT (wont_exit, 1);
674
675       if (exit_mod)
676         {
677           opt_info_start_duplication (opt_info);
678           ok = duplicate_loop_to_header_edge (loop, loop_preheader_edge (loop),
679                                               exit_mod,
680                                               wont_exit, desc->out_edge,
681                                               &remove_edges,
682                                               DLTHE_FLAG_UPDATE_FREQ
683                                               | (opt_info && exit_mod > 1
684                                                  ? DLTHE_RECORD_COPY_NUMBER
685                                                    : 0));
686           gcc_assert (ok);
687
688           if (opt_info && exit_mod > 1)
689             apply_opt_in_copies (opt_info, exit_mod, false, false); 
690           
691           desc->noloop_assumptions = NULL_RTX;
692           desc->niter -= exit_mod;
693           desc->niter_max -= exit_mod;
694         }
695
696       SET_BIT (wont_exit, 1);
697     }
698   else
699     {
700       /* Leave exit test in last copy, for the same reason as above if
701          the loop tests the condition at the end of loop body.  */
702
703       if (dump_file)
704         fprintf (dump_file, ";; Condition on end of loop.\n");
705
706       /* We know that niter >= max_unroll + 2; so we do not need to care of
707          case when we would exit before reaching the loop.  So just peel
708          exit_mod + 1 iterations.  */
709       if (exit_mod != max_unroll
710           || desc->noloop_assumptions)
711         {
712           RESET_BIT (wont_exit, 0);
713           if (desc->noloop_assumptions)
714             RESET_BIT (wont_exit, 1);
715          
716           opt_info_start_duplication (opt_info);
717           ok = duplicate_loop_to_header_edge (loop, loop_preheader_edge (loop),
718                                               exit_mod + 1,
719                                               wont_exit, desc->out_edge,
720                                               &remove_edges,
721                                               DLTHE_FLAG_UPDATE_FREQ
722                                               | (opt_info && exit_mod > 0
723                                                  ? DLTHE_RECORD_COPY_NUMBER
724                                                    : 0));
725           gcc_assert (ok);
726  
727           if (opt_info && exit_mod > 0)
728             apply_opt_in_copies (opt_info, exit_mod + 1, false, false);
729
730           desc->niter -= exit_mod + 1;
731           desc->niter_max -= exit_mod + 1;
732           desc->noloop_assumptions = NULL_RTX;
733
734           SET_BIT (wont_exit, 0);
735           SET_BIT (wont_exit, 1);
736         }
737
738       RESET_BIT (wont_exit, max_unroll);
739     }
740
741   /* Now unroll the loop.  */
742   
743   opt_info_start_duplication (opt_info);
744   ok = duplicate_loop_to_header_edge (loop, loop_latch_edge (loop),
745                                       max_unroll,
746                                       wont_exit, desc->out_edge,
747                                       &remove_edges,
748                                       DLTHE_FLAG_UPDATE_FREQ
749                                       | (opt_info
750                                          ? DLTHE_RECORD_COPY_NUMBER
751                                            : 0));
752   gcc_assert (ok);
753
754   if (opt_info)
755     {
756       apply_opt_in_copies (opt_info, max_unroll, true, true);
757       free_opt_info (opt_info);
758     }
759
760   free (wont_exit);
761
762   if (exit_at_end)
763     {
764       basic_block exit_block = get_bb_copy (desc->in_edge->src);
765       /* Find a new in and out edge; they are in the last copy we have made.  */
766       
767       if (EDGE_SUCC (exit_block, 0)->dest == desc->out_edge->dest)
768         {
769           desc->out_edge = EDGE_SUCC (exit_block, 0);
770           desc->in_edge = EDGE_SUCC (exit_block, 1);
771         }
772       else
773         {
774           desc->out_edge = EDGE_SUCC (exit_block, 1);
775           desc->in_edge = EDGE_SUCC (exit_block, 0);
776         }
777     }
778
779   desc->niter /= max_unroll + 1;
780   desc->niter_max /= max_unroll + 1;
781   desc->niter_expr = GEN_INT (desc->niter);
782
783   /* Remove the edges.  */
784   for (i = 0; VEC_iterate (edge, remove_edges, i, e); i++)
785     remove_path (e);
786   VEC_free (edge, heap, remove_edges);
787
788   if (dump_file)
789     fprintf (dump_file,
790              ";; Unrolled loop %d times, constant # of iterations %i insns\n",
791              max_unroll, num_loop_insns (loop));
792 }
793
794 /* Decide whether to unroll LOOP iterating runtime computable number of times
795    and how much.  */
796 static void
797 decide_unroll_runtime_iterations (struct loop *loop, int flags)
798 {
799   unsigned nunroll, nunroll_by_av, i;
800   struct niter_desc *desc;
801
802   if (!(flags & UAP_UNROLL))
803     {
804       /* We were not asked to, just return back silently.  */
805       return;
806     }
807
808   if (dump_file)
809     fprintf (dump_file,
810              "\n;; Considering unrolling loop with runtime "
811              "computable number of iterations\n");
812
813   /* nunroll = total number of copies of the original loop body in
814      unrolled loop (i.e. if it is 2, we have to duplicate loop body once.  */
815   nunroll = PARAM_VALUE (PARAM_MAX_UNROLLED_INSNS) / loop->ninsns;
816   nunroll_by_av = PARAM_VALUE (PARAM_MAX_AVERAGE_UNROLLED_INSNS) / loop->av_ninsns;
817   if (nunroll > nunroll_by_av)
818     nunroll = nunroll_by_av;
819   if (nunroll > (unsigned) PARAM_VALUE (PARAM_MAX_UNROLL_TIMES))
820     nunroll = PARAM_VALUE (PARAM_MAX_UNROLL_TIMES);
821
822   /* Skip big loops.  */
823   if (nunroll <= 1)
824     {
825       if (dump_file)
826         fprintf (dump_file, ";; Not considering loop, is too big\n");
827       return;
828     }
829
830   /* Check for simple loops.  */
831   desc = get_simple_loop_desc (loop);
832
833   /* Check simpleness.  */
834   if (!desc->simple_p || desc->assumptions)
835     {
836       if (dump_file)
837         fprintf (dump_file,
838                  ";; Unable to prove that the number of iterations "
839                  "can be counted in runtime\n");
840       return;
841     }
842
843   if (desc->const_iter)
844     {
845       if (dump_file)
846         fprintf (dump_file, ";; Loop iterates constant times\n");
847       return;
848     }
849
850   /* If we have profile feedback, check whether the loop rolls.  */
851   if (loop->header->count && expected_loop_iterations (loop) < 2 * nunroll)
852     {
853       if (dump_file)
854         fprintf (dump_file, ";; Not unrolling loop, doesn't roll\n");
855       return;
856     }
857
858   /* Success; now force nunroll to be power of 2, as we are unable to
859      cope with overflows in computation of number of iterations.  */
860   for (i = 1; 2 * i <= nunroll; i *= 2)
861     continue;
862
863   loop->lpt_decision.decision = LPT_UNROLL_RUNTIME;
864   loop->lpt_decision.times = i - 1;
865   
866   if (dump_file)
867     fprintf (dump_file,
868              ";; Decided to unroll the runtime computable "
869              "times rolling loop, %d times.\n",
870              loop->lpt_decision.times);
871 }
872
873 /* Splits edge E and inserts the sequence of instructions INSNS on it, and
874    returns the newly created block.  If INSNS is NULL_RTX, nothing is changed
875    and NULL is returned instead.  */
876
877 basic_block
878 split_edge_and_insert (edge e, rtx insns)
879 {
880   basic_block bb;
881
882   if (!insns)
883     return NULL;
884   bb = split_edge (e); 
885   emit_insn_after (insns, BB_END (bb));
886
887   /* ??? We used to assume that INSNS can contain control flow insns, and
888      that we had to try to find sub basic blocks in BB to maintain a valid
889      CFG.  For this purpose we used to set the BB_SUPERBLOCK flag on BB
890      and call break_superblocks when going out of cfglayout mode.  But it
891      turns out that this never happens; and that if it does ever happen,
892      the verify_flow_info call in loop_optimizer_finalize would fail.
893
894      There are two reasons why we expected we could have control flow insns
895      in INSNS.  The first is when a comparison has to be done in parts, and
896      the second is when the number of iterations is computed for loops with
897      the number of iterations known at runtime.  In both cases, test cases
898      to get control flow in INSNS appear to be impossible to construct:
899
900       * If do_compare_rtx_and_jump needs several branches to do comparison
901         in a mode that needs comparison by parts, we cannot analyze the
902         number of iterations of the loop, and we never get to unrolling it.
903
904       * The code in expand_divmod that was suspected to cause creation of
905         branching code seems to be only accessed for signed division.  The
906         divisions used by # of iterations analysis are always unsigned.
907         Problems might arise on architectures that emits branching code
908         for some operations that may appear in the unroller (especially
909         for division), but we have no such architectures.
910
911      Considering all this, it was decided that we should for now assume
912      that INSNS can in theory contain control flow insns, but in practice
913      it never does.  So we don't handle the theoretical case, and should
914      a real failure ever show up, we have a pretty good clue for how to
915      fix it.  */
916
917   return bb;
918 }
919
920 /* Unroll LOOP for that we are able to count number of iterations in runtime
921    LOOP->LPT_DECISION.TIMES + 1 times.  The transformation does this (with some
922    extra care for case n < 0):
923
924    for (i = 0; i < n; i++)
925      body;
926
927    ==>
928
929    i = 0;
930    mod = n % 4;
931
932    switch (mod)
933      {
934        case 3:
935          body; i++;
936        case 2:
937          body; i++;
938        case 1:
939          body; i++;
940        case 0: ;
941      }
942
943    while (i < n)
944      {
945        body; i++;
946        body; i++;
947        body; i++;
948        body; i++;
949      }
950    */
951 static void
952 unroll_loop_runtime_iterations (struct loop *loop)
953 {
954   rtx old_niter, niter, init_code, branch_code, tmp;
955   unsigned i, j, p;
956   basic_block preheader, *body, *dom_bbs, swtch, ezc_swtch;
957   unsigned n_dom_bbs;
958   sbitmap wont_exit;
959   int may_exit_copy;
960   unsigned n_peel;
961   VEC (edge, heap) *remove_edges;
962   edge e;
963   bool extra_zero_check, last_may_exit;
964   unsigned max_unroll = loop->lpt_decision.times;
965   struct niter_desc *desc = get_simple_loop_desc (loop);
966   bool exit_at_end = loop_exit_at_end_p (loop);
967   struct opt_info *opt_info = NULL;
968   bool ok;
969   
970   if (flag_split_ivs_in_unroller
971       || flag_variable_expansion_in_unroller)
972     opt_info = analyze_insns_in_loop (loop);
973   
974   /* Remember blocks whose dominators will have to be updated.  */
975   dom_bbs = XCNEWVEC (basic_block, n_basic_blocks);
976   n_dom_bbs = 0;
977
978   body = get_loop_body (loop);
979   for (i = 0; i < loop->num_nodes; i++)
980     {
981       unsigned nldom;
982       basic_block *ldom;
983
984       nldom = get_dominated_by (CDI_DOMINATORS, body[i], &ldom);
985       for (j = 0; j < nldom; j++)
986         if (!flow_bb_inside_loop_p (loop, ldom[j]))
987           dom_bbs[n_dom_bbs++] = ldom[j];
988
989       free (ldom);
990     }
991   free (body);
992
993   if (!exit_at_end)
994     {
995       /* Leave exit in first copy (for explanation why see comment in
996          unroll_loop_constant_iterations).  */
997       may_exit_copy = 0;
998       n_peel = max_unroll - 1;
999       extra_zero_check = true;
1000       last_may_exit = false;
1001     }
1002   else
1003     {
1004       /* Leave exit in last copy (for explanation why see comment in
1005          unroll_loop_constant_iterations).  */
1006       may_exit_copy = max_unroll;
1007       n_peel = max_unroll;
1008       extra_zero_check = false;
1009       last_may_exit = true;
1010     }
1011
1012   /* Get expression for number of iterations.  */
1013   start_sequence ();
1014   old_niter = niter = gen_reg_rtx (desc->mode);
1015   tmp = force_operand (copy_rtx (desc->niter_expr), niter);
1016   if (tmp != niter)
1017     emit_move_insn (niter, tmp);
1018
1019   /* Count modulo by ANDing it with max_unroll; we use the fact that
1020      the number of unrollings is a power of two, and thus this is correct
1021      even if there is overflow in the computation.  */
1022   niter = expand_simple_binop (desc->mode, AND,
1023                                niter,
1024                                GEN_INT (max_unroll),
1025                                NULL_RTX, 0, OPTAB_LIB_WIDEN);
1026
1027   init_code = get_insns ();
1028   end_sequence ();
1029
1030   /* Precondition the loop.  */
1031   split_edge_and_insert (loop_preheader_edge (loop), init_code);
1032
1033   remove_edges = NULL;
1034
1035   wont_exit = sbitmap_alloc (max_unroll + 2);
1036
1037   /* Peel the first copy of loop body (almost always we must leave exit test
1038      here; the only exception is when we have extra zero check and the number
1039      of iterations is reliable.  Also record the place of (possible) extra
1040      zero check.  */
1041   sbitmap_zero (wont_exit);
1042   if (extra_zero_check
1043       && !desc->noloop_assumptions)
1044     SET_BIT (wont_exit, 1);
1045   ezc_swtch = loop_preheader_edge (loop)->src;
1046   ok = duplicate_loop_to_header_edge (loop, loop_preheader_edge (loop),
1047                                       1, wont_exit, desc->out_edge,
1048                                       &remove_edges,
1049                                       DLTHE_FLAG_UPDATE_FREQ);
1050   gcc_assert (ok);
1051
1052   /* Record the place where switch will be built for preconditioning.  */
1053   swtch = split_edge (loop_preheader_edge (loop));
1054
1055   for (i = 0; i < n_peel; i++)
1056     {
1057       /* Peel the copy.  */
1058       sbitmap_zero (wont_exit);
1059       if (i != n_peel - 1 || !last_may_exit)
1060         SET_BIT (wont_exit, 1);
1061       ok = duplicate_loop_to_header_edge (loop, loop_preheader_edge (loop),
1062                                           1, wont_exit, desc->out_edge,
1063                                           &remove_edges,
1064                                           DLTHE_FLAG_UPDATE_FREQ);
1065       gcc_assert (ok);
1066
1067       /* Create item for switch.  */
1068       j = n_peel - i - (extra_zero_check ? 0 : 1);
1069       p = REG_BR_PROB_BASE / (i + 2);
1070
1071       preheader = split_edge (loop_preheader_edge (loop));
1072       branch_code = compare_and_jump_seq (copy_rtx (niter), GEN_INT (j), EQ,
1073                                           block_label (preheader), p,
1074                                           NULL_RTX);
1075
1076       /* We rely on the fact that the compare and jump cannot be optimized out,
1077          and hence the cfg we create is correct.  */
1078       gcc_assert (branch_code != NULL_RTX);
1079
1080       swtch = split_edge_and_insert (single_pred_edge (swtch), branch_code);
1081       set_immediate_dominator (CDI_DOMINATORS, preheader, swtch);
1082       single_pred_edge (swtch)->probability = REG_BR_PROB_BASE - p;
1083       e = make_edge (swtch, preheader,
1084                      single_succ_edge (swtch)->flags & EDGE_IRREDUCIBLE_LOOP);
1085       e->probability = p;
1086     }
1087
1088   if (extra_zero_check)
1089     {
1090       /* Add branch for zero iterations.  */
1091       p = REG_BR_PROB_BASE / (max_unroll + 1);
1092       swtch = ezc_swtch;
1093       preheader = split_edge (loop_preheader_edge (loop));
1094       branch_code = compare_and_jump_seq (copy_rtx (niter), const0_rtx, EQ,
1095                                           block_label (preheader), p,
1096                                           NULL_RTX);
1097       gcc_assert (branch_code != NULL_RTX);
1098
1099       swtch = split_edge_and_insert (single_succ_edge (swtch), branch_code);
1100       set_immediate_dominator (CDI_DOMINATORS, preheader, swtch);
1101       single_succ_edge (swtch)->probability = REG_BR_PROB_BASE - p;
1102       e = make_edge (swtch, preheader,
1103                      single_succ_edge (swtch)->flags & EDGE_IRREDUCIBLE_LOOP);
1104       e->probability = p;
1105     }
1106
1107   /* Recount dominators for outer blocks.  */
1108   iterate_fix_dominators (CDI_DOMINATORS, dom_bbs, n_dom_bbs);
1109
1110   /* And unroll loop.  */
1111
1112   sbitmap_ones (wont_exit);
1113   RESET_BIT (wont_exit, may_exit_copy);
1114   opt_info_start_duplication (opt_info);
1115   
1116   ok = duplicate_loop_to_header_edge (loop, loop_latch_edge (loop),
1117                                       max_unroll,
1118                                       wont_exit, desc->out_edge,
1119                                       &remove_edges,
1120                                       DLTHE_FLAG_UPDATE_FREQ
1121                                       | (opt_info
1122                                          ? DLTHE_RECORD_COPY_NUMBER
1123                                            : 0));
1124   gcc_assert (ok);
1125   
1126   if (opt_info)
1127     {
1128       apply_opt_in_copies (opt_info, max_unroll, true, true);
1129       free_opt_info (opt_info);
1130     }
1131
1132   free (wont_exit);
1133
1134   if (exit_at_end)
1135     {
1136       basic_block exit_block = get_bb_copy (desc->in_edge->src);
1137       /* Find a new in and out edge; they are in the last copy we have
1138          made.  */
1139       
1140       if (EDGE_SUCC (exit_block, 0)->dest == desc->out_edge->dest)
1141         {
1142           desc->out_edge = EDGE_SUCC (exit_block, 0);
1143           desc->in_edge = EDGE_SUCC (exit_block, 1);
1144         }
1145       else
1146         {
1147           desc->out_edge = EDGE_SUCC (exit_block, 1);
1148           desc->in_edge = EDGE_SUCC (exit_block, 0);
1149         }
1150     }
1151
1152   /* Remove the edges.  */
1153   for (i = 0; VEC_iterate (edge, remove_edges, i, e); i++)
1154     remove_path (e);
1155   VEC_free (edge, heap, remove_edges);
1156
1157   /* We must be careful when updating the number of iterations due to
1158      preconditioning and the fact that the value must be valid at entry
1159      of the loop.  After passing through the above code, we see that
1160      the correct new number of iterations is this:  */
1161   gcc_assert (!desc->const_iter);
1162   desc->niter_expr =
1163     simplify_gen_binary (UDIV, desc->mode, old_niter,
1164                          GEN_INT (max_unroll + 1));
1165   desc->niter_max /= max_unroll + 1;
1166   if (exit_at_end)
1167     {
1168       desc->niter_expr =
1169         simplify_gen_binary (MINUS, desc->mode, desc->niter_expr, const1_rtx);
1170       desc->noloop_assumptions = NULL_RTX;
1171       desc->niter_max--;
1172     }
1173
1174   if (dump_file)
1175     fprintf (dump_file,
1176              ";; Unrolled loop %d times, counting # of iterations "
1177              "in runtime, %i insns\n",
1178              max_unroll, num_loop_insns (loop));
1179
1180   if (dom_bbs)
1181     free (dom_bbs);
1182 }
1183
1184 /* Decide whether to simply peel LOOP and how much.  */
1185 static void
1186 decide_peel_simple (struct loop *loop, int flags)
1187 {
1188   unsigned npeel;
1189   struct niter_desc *desc;
1190
1191   if (!(flags & UAP_PEEL))
1192     {
1193       /* We were not asked to, just return back silently.  */
1194       return;
1195     }
1196
1197   if (dump_file)
1198     fprintf (dump_file, "\n;; Considering simply peeling loop\n");
1199
1200   /* npeel = number of iterations to peel.  */
1201   npeel = PARAM_VALUE (PARAM_MAX_PEELED_INSNS) / loop->ninsns;
1202   if (npeel > (unsigned) PARAM_VALUE (PARAM_MAX_PEEL_TIMES))
1203     npeel = PARAM_VALUE (PARAM_MAX_PEEL_TIMES);
1204
1205   /* Skip big loops.  */
1206   if (!npeel)
1207     {
1208       if (dump_file)
1209         fprintf (dump_file, ";; Not considering loop, is too big\n");
1210       return;
1211     }
1212
1213   /* Check for simple loops.  */
1214   desc = get_simple_loop_desc (loop);
1215
1216   /* Check number of iterations.  */
1217   if (desc->simple_p && !desc->assumptions && desc->const_iter)
1218     {
1219       if (dump_file)
1220         fprintf (dump_file, ";; Loop iterates constant times\n");
1221       return;
1222     }
1223
1224   /* Do not simply peel loops with branches inside -- it increases number
1225      of mispredicts.  */
1226   if (num_loop_branches (loop) > 1)
1227     {
1228       if (dump_file)
1229         fprintf (dump_file, ";; Not peeling, contains branches\n");
1230       return;
1231     }
1232
1233   if (loop->header->count)
1234     {
1235       unsigned niter = expected_loop_iterations (loop);
1236       if (niter + 1 > npeel)
1237         {
1238           if (dump_file)
1239             {
1240               fprintf (dump_file, ";; Not peeling loop, rolls too much (");
1241               fprintf (dump_file, HOST_WIDEST_INT_PRINT_DEC,
1242                        (HOST_WIDEST_INT) (niter + 1));
1243               fprintf (dump_file, " iterations > %d [maximum peelings])\n",
1244                        npeel);
1245             }
1246           return;
1247         }
1248       npeel = niter + 1;
1249     }
1250   else
1251     {
1252       /* For now we have no good heuristics to decide whether loop peeling
1253          will be effective, so disable it.  */
1254       if (dump_file)
1255         fprintf (dump_file,
1256                  ";; Not peeling loop, no evidence it will be profitable\n");
1257       return;
1258     }
1259
1260   /* Success.  */
1261   loop->lpt_decision.decision = LPT_PEEL_SIMPLE;
1262   loop->lpt_decision.times = npeel;
1263       
1264   if (dump_file)
1265     fprintf (dump_file, ";; Decided to simply peel the loop, %d times.\n",
1266              loop->lpt_decision.times);
1267 }
1268
1269 /* Peel a LOOP LOOP->LPT_DECISION.TIMES times.  The transformation:
1270    while (cond)
1271      body;
1272
1273    ==>
1274
1275    if (!cond) goto end;
1276    body;
1277    if (!cond) goto end;
1278    body;
1279    while (cond)
1280      body;
1281    end: ;
1282    */
1283 static void
1284 peel_loop_simple (struct loop *loop)
1285 {
1286   sbitmap wont_exit;
1287   unsigned npeel = loop->lpt_decision.times;
1288   struct niter_desc *desc = get_simple_loop_desc (loop);
1289   struct opt_info *opt_info = NULL;
1290   bool ok;
1291   
1292   if (flag_split_ivs_in_unroller && npeel > 1)
1293     opt_info = analyze_insns_in_loop (loop);
1294   
1295   wont_exit = sbitmap_alloc (npeel + 1);
1296   sbitmap_zero (wont_exit);
1297   
1298   opt_info_start_duplication (opt_info);
1299   
1300   ok = duplicate_loop_to_header_edge (loop, loop_preheader_edge (loop),
1301                                       npeel, wont_exit, NULL,
1302                                       NULL, DLTHE_FLAG_UPDATE_FREQ
1303                                       | (opt_info
1304                                          ? DLTHE_RECORD_COPY_NUMBER
1305                                            : 0));
1306   gcc_assert (ok);
1307
1308   free (wont_exit);
1309   
1310   if (opt_info)
1311     {
1312       apply_opt_in_copies (opt_info, npeel, false, false);
1313       free_opt_info (opt_info);
1314     }
1315
1316   if (desc->simple_p)
1317     {
1318       if (desc->const_iter)
1319         {
1320           desc->niter -= npeel;
1321           desc->niter_expr = GEN_INT (desc->niter);
1322           desc->noloop_assumptions = NULL_RTX;
1323         }
1324       else
1325         {
1326           /* We cannot just update niter_expr, as its value might be clobbered
1327              inside loop.  We could handle this by counting the number into
1328              temporary just like we do in runtime unrolling, but it does not
1329              seem worthwhile.  */
1330           free_simple_loop_desc (loop);
1331         }
1332     }
1333   if (dump_file)
1334     fprintf (dump_file, ";; Peeling loop %d times\n", npeel);
1335 }
1336
1337 /* Decide whether to unroll LOOP stupidly and how much.  */
1338 static void
1339 decide_unroll_stupid (struct loop *loop, int flags)
1340 {
1341   unsigned nunroll, nunroll_by_av, i;
1342   struct niter_desc *desc;
1343
1344   if (!(flags & UAP_UNROLL_ALL))
1345     {
1346       /* We were not asked to, just return back silently.  */
1347       return;
1348     }
1349
1350   if (dump_file)
1351     fprintf (dump_file, "\n;; Considering unrolling loop stupidly\n");
1352
1353   /* nunroll = total number of copies of the original loop body in
1354      unrolled loop (i.e. if it is 2, we have to duplicate loop body once.  */
1355   nunroll = PARAM_VALUE (PARAM_MAX_UNROLLED_INSNS) / loop->ninsns;
1356   nunroll_by_av
1357     = PARAM_VALUE (PARAM_MAX_AVERAGE_UNROLLED_INSNS) / loop->av_ninsns;
1358   if (nunroll > nunroll_by_av)
1359     nunroll = nunroll_by_av;
1360   if (nunroll > (unsigned) PARAM_VALUE (PARAM_MAX_UNROLL_TIMES))
1361     nunroll = PARAM_VALUE (PARAM_MAX_UNROLL_TIMES);
1362
1363   /* Skip big loops.  */
1364   if (nunroll <= 1)
1365     {
1366       if (dump_file)
1367         fprintf (dump_file, ";; Not considering loop, is too big\n");
1368       return;
1369     }
1370
1371   /* Check for simple loops.  */
1372   desc = get_simple_loop_desc (loop);
1373
1374   /* Check simpleness.  */
1375   if (desc->simple_p && !desc->assumptions)
1376     {
1377       if (dump_file)
1378         fprintf (dump_file, ";; The loop is simple\n");
1379       return;
1380     }
1381
1382   /* Do not unroll loops with branches inside -- it increases number
1383      of mispredicts.  */
1384   if (num_loop_branches (loop) > 1)
1385     {
1386       if (dump_file)
1387         fprintf (dump_file, ";; Not unrolling, contains branches\n");
1388       return;
1389     }
1390
1391   /* If we have profile feedback, check whether the loop rolls.  */
1392   if (loop->header->count
1393       && expected_loop_iterations (loop) < 2 * nunroll)
1394     {
1395       if (dump_file)
1396         fprintf (dump_file, ";; Not unrolling loop, doesn't roll\n");
1397       return;
1398     }
1399
1400   /* Success.  Now force nunroll to be power of 2, as it seems that this
1401      improves results (partially because of better alignments, partially
1402      because of some dark magic).  */
1403   for (i = 1; 2 * i <= nunroll; i *= 2)
1404     continue;
1405
1406   loop->lpt_decision.decision = LPT_UNROLL_STUPID;
1407   loop->lpt_decision.times = i - 1;
1408       
1409   if (dump_file)
1410     fprintf (dump_file,
1411              ";; Decided to unroll the loop stupidly, %d times.\n",
1412              loop->lpt_decision.times);
1413 }
1414
1415 /* Unroll a LOOP LOOP->LPT_DECISION.TIMES times.  The transformation:
1416    while (cond)
1417      body;
1418
1419    ==>
1420
1421    while (cond)
1422      {
1423        body;
1424        if (!cond) break;
1425        body;
1426        if (!cond) break;
1427        body;
1428        if (!cond) break;
1429        body;
1430      }
1431    */
1432 static void
1433 unroll_loop_stupid (struct loop *loop)
1434 {
1435   sbitmap wont_exit;
1436   unsigned nunroll = loop->lpt_decision.times;
1437   struct niter_desc *desc = get_simple_loop_desc (loop);
1438   struct opt_info *opt_info = NULL;
1439   bool ok;
1440   
1441   if (flag_split_ivs_in_unroller
1442       || flag_variable_expansion_in_unroller)
1443     opt_info = analyze_insns_in_loop (loop);
1444   
1445   
1446   wont_exit = sbitmap_alloc (nunroll + 1);
1447   sbitmap_zero (wont_exit);
1448   opt_info_start_duplication (opt_info);
1449   
1450   ok = duplicate_loop_to_header_edge (loop, loop_latch_edge (loop),
1451                                       nunroll, wont_exit,
1452                                       NULL, NULL,
1453                                       DLTHE_FLAG_UPDATE_FREQ
1454                                       | (opt_info
1455                                          ? DLTHE_RECORD_COPY_NUMBER
1456                                            : 0));
1457   gcc_assert (ok);
1458   
1459   if (opt_info)
1460     {
1461       apply_opt_in_copies (opt_info, nunroll, true, true);
1462       free_opt_info (opt_info);
1463     }
1464
1465   free (wont_exit);
1466
1467   if (desc->simple_p)
1468     {
1469       /* We indeed may get here provided that there are nontrivial assumptions
1470          for a loop to be really simple.  We could update the counts, but the
1471          problem is that we are unable to decide which exit will be taken
1472          (not really true in case the number of iterations is constant,
1473          but noone will do anything with this information, so we do not
1474          worry about it).  */
1475       desc->simple_p = false;
1476     }
1477
1478   if (dump_file)
1479     fprintf (dump_file, ";; Unrolled loop %d times, %i insns\n",
1480              nunroll, num_loop_insns (loop));
1481 }
1482
1483 /* A hash function for information about insns to split.  */
1484
1485 static hashval_t
1486 si_info_hash (const void *ivts)
1487 {
1488   return (hashval_t) INSN_UID (((struct iv_to_split *) ivts)->insn);
1489 }
1490
1491 /* An equality functions for information about insns to split.  */
1492
1493 static int
1494 si_info_eq (const void *ivts1, const void *ivts2)
1495 {
1496   const struct iv_to_split *i1 = ivts1;
1497   const struct iv_to_split *i2 = ivts2;
1498
1499   return i1->insn == i2->insn;
1500 }
1501
1502 /* Return a hash for VES, which is really a "var_to_expand *".  */
1503
1504 static hashval_t
1505 ve_info_hash (const void *ves)
1506 {
1507   return (hashval_t) INSN_UID (((struct var_to_expand *) ves)->insn);
1508 }
1509
1510 /* Return true if IVTS1 and IVTS2 (which are really both of type 
1511    "var_to_expand *") refer to the same instruction.  */
1512
1513 static int
1514 ve_info_eq (const void *ivts1, const void *ivts2)
1515 {
1516   const struct var_to_expand *i1 = ivts1;
1517   const struct var_to_expand *i2 = ivts2;
1518   
1519   return i1->insn == i2->insn;
1520 }
1521
1522 /* Returns true if REG is referenced in one insn in LOOP.  */
1523
1524 bool
1525 referenced_in_one_insn_in_loop_p (struct loop *loop, rtx reg)
1526 {
1527   basic_block *body, bb;
1528   unsigned i;
1529   int count_ref = 0;
1530   rtx insn;
1531   
1532   body = get_loop_body (loop); 
1533   for (i = 0; i < loop->num_nodes; i++)
1534     {
1535       bb = body[i];
1536       
1537       FOR_BB_INSNS (bb, insn)
1538       {
1539         if (rtx_referenced_p (reg, insn))
1540           count_ref++;
1541       }
1542     }
1543   return (count_ref  == 1);
1544 }
1545
1546 /* Determine whether INSN contains an accumulator
1547    which can be expanded into separate copies, 
1548    one for each copy of the LOOP body.
1549    
1550    for (i = 0 ; i < n; i++)
1551      sum += a[i];
1552    
1553    ==>
1554      
1555    sum += a[i]
1556    ....
1557    i = i+1;
1558    sum1 += a[i]
1559    ....
1560    i = i+1
1561    sum2 += a[i];
1562    ....
1563
1564    Return NULL if INSN contains no opportunity for expansion of accumulator.  
1565    Otherwise, allocate a VAR_TO_EXPAND structure, fill it with the relevant 
1566    information and return a pointer to it.
1567 */
1568
1569 static struct var_to_expand *
1570 analyze_insn_to_expand_var (struct loop *loop, rtx insn)
1571 {
1572   rtx set, dest, src, op1, op2, something;
1573   struct var_to_expand *ves;
1574   enum machine_mode mode1, mode2;
1575   unsigned accum_pos;
1576
1577   set = single_set (insn);
1578   if (!set)
1579     return NULL;
1580   
1581   dest = SET_DEST (set);
1582   src = SET_SRC (set);
1583   
1584   if (GET_CODE (src) != PLUS
1585       && GET_CODE (src) != MINUS
1586       && GET_CODE (src) != MULT)
1587     return NULL;
1588
1589   /* Hmm, this is a bit paradoxical.  We know that INSN is a valid insn
1590      in MD.  But if there is no optab to generate the insn, we can not
1591      perform the variable expansion.  This can happen if an MD provides
1592      an insn but not a named pattern to generate it, for example to avoid
1593      producing code that needs additional mode switches like for x87/mmx.
1594
1595      So we check have_insn_for which looks for an optab for the operation
1596      in SRC.  If it doesn't exist, we can't perform the expansion even
1597      though INSN is valid.  */
1598   if (!have_insn_for (GET_CODE (src), GET_MODE (src)))
1599     return NULL;
1600
1601   op1 = XEXP (src, 0);
1602   op2 = XEXP (src, 1);
1603   
1604   if (!REG_P (dest)
1605       && !(GET_CODE (dest) == SUBREG
1606            && REG_P (SUBREG_REG (dest))))
1607     return NULL;
1608   
1609   if (rtx_equal_p (dest, op1))
1610     accum_pos = 0;
1611   else if (rtx_equal_p (dest, op2))
1612     accum_pos = 1;
1613   else
1614     return NULL;
1615
1616   /* The method of expansion that we are using; which includes
1617      the initialization of the expansions with zero and the summation of
1618      the expansions at the end of the computation will yield wrong results
1619      for (x = something - x) thus avoid using it in that case.  */
1620   if (accum_pos == 1  
1621     && GET_CODE (src) == MINUS)
1622    return NULL;
1623
1624   something = (accum_pos == 0)? op2 : op1;
1625
1626   if (!referenced_in_one_insn_in_loop_p (loop, dest))
1627     return NULL;
1628   
1629   if (rtx_referenced_p (dest, something))
1630     return NULL;
1631   
1632   mode1 = GET_MODE (dest); 
1633   mode2 = GET_MODE (something);
1634   if ((FLOAT_MODE_P (mode1) 
1635        || FLOAT_MODE_P (mode2)) 
1636       && !flag_unsafe_math_optimizations) 
1637     return NULL;
1638
1639   if (dump_file)
1640   {
1641     fprintf (dump_file,
1642     "\n;; Expanding Accumulator ");
1643     print_rtl (dump_file, dest);
1644     fprintf (dump_file, "\n");
1645   }
1646
1647   /* Record the accumulator to expand.  */
1648   ves = XNEW (struct var_to_expand);
1649   ves->insn = insn;
1650   ves->var_expansions = VEC_alloc (rtx, heap, 1);
1651   ves->reg = copy_rtx (dest);
1652   ves->op = GET_CODE (src);
1653   ves->expansion_count = 0;
1654   ves->reuse_expansion = 0;
1655   ves->accum_pos = accum_pos;
1656   return ves; 
1657 }
1658
1659 /* Determine whether there is an induction variable in INSN that
1660    we would like to split during unrolling.  
1661
1662    I.e. replace
1663
1664    i = i + 1;
1665    ...
1666    i = i + 1;
1667    ...
1668    i = i + 1;
1669    ...
1670
1671    type chains by
1672
1673    i0 = i + 1
1674    ...
1675    i = i0 + 1
1676    ...
1677    i = i0 + 2
1678    ...
1679
1680    Return NULL if INSN contains no interesting IVs.  Otherwise, allocate 
1681    an IV_TO_SPLIT structure, fill it with the relevant information and return a
1682    pointer to it.  */
1683
1684 static struct iv_to_split *
1685 analyze_iv_to_split_insn (rtx insn)
1686 {
1687   rtx set, dest;
1688   struct rtx_iv iv;
1689   struct iv_to_split *ivts;
1690   bool ok;
1691
1692   /* For now we just split the basic induction variables.  Later this may be
1693      extended for example by selecting also addresses of memory references.  */
1694   set = single_set (insn);
1695   if (!set)
1696     return NULL;
1697
1698   dest = SET_DEST (set);
1699   if (!REG_P (dest))
1700     return NULL;
1701
1702   if (!biv_p (insn, dest))
1703     return NULL;
1704
1705   ok = iv_analyze_result (insn, dest, &iv);
1706
1707   /* This used to be an assert under the assumption that if biv_p returns
1708      true that iv_analyze_result must also return true.  However, that
1709      assumption is not strictly correct as evidenced by pr25569.
1710
1711      Returning NULL when iv_analyze_result returns false is safe and
1712      avoids the problems in pr25569 until the iv_analyze_* routines
1713      can be fixed, which is apparently hard and time consuming
1714      according to their author.  */
1715   if (! ok)
1716     return NULL;
1717
1718   if (iv.step == const0_rtx
1719       || iv.mode != iv.extend_mode)
1720     return NULL;
1721
1722   /* Record the insn to split.  */
1723   ivts = XNEW (struct iv_to_split);
1724   ivts->insn = insn;
1725   ivts->base_var = NULL_RTX;
1726   ivts->step = iv.step;
1727   ivts->n_loc = 1;
1728   ivts->loc[0] = 1;
1729   
1730   return ivts;
1731 }
1732
1733 /* Determines which of insns in LOOP can be optimized.
1734    Return a OPT_INFO struct with the relevant hash tables filled
1735    with all insns to be optimized.  The FIRST_NEW_BLOCK field
1736    is undefined for the return value.  */
1737
1738 static struct opt_info *
1739 analyze_insns_in_loop (struct loop *loop)
1740 {
1741   basic_block *body, bb;
1742   unsigned i;
1743   struct opt_info *opt_info = XCNEW (struct opt_info);
1744   rtx insn;
1745   struct iv_to_split *ivts = NULL;
1746   struct var_to_expand *ves = NULL;
1747   PTR *slot1;
1748   PTR *slot2;
1749   VEC (edge, heap) *edges = get_loop_exit_edges (loop);
1750   edge exit;
1751   bool can_apply = false;
1752   
1753   iv_analysis_loop_init (loop);
1754
1755   body = get_loop_body (loop);
1756
1757   if (flag_split_ivs_in_unroller)
1758     opt_info->insns_to_split = htab_create (5 * loop->num_nodes,
1759                                             si_info_hash, si_info_eq, free);
1760   
1761   /* Record the loop exit bb and loop preheader before the unrolling.  */
1762   opt_info->loop_preheader = loop_preheader_edge (loop)->src;
1763   
1764   if (VEC_length (edge, edges) == 1)
1765     {
1766       exit = VEC_index (edge, edges, 0);
1767       if (!(exit->flags & EDGE_COMPLEX))
1768         {
1769           opt_info->loop_exit = split_edge (exit);
1770           can_apply = true;
1771         }
1772     }
1773   
1774   if (flag_variable_expansion_in_unroller
1775       && can_apply)
1776     opt_info->insns_with_var_to_expand = htab_create (5 * loop->num_nodes,
1777                                                       ve_info_hash, ve_info_eq, free);
1778   
1779   for (i = 0; i < loop->num_nodes; i++)
1780     {
1781       bb = body[i];
1782       if (!dominated_by_p (CDI_DOMINATORS, loop->latch, bb))
1783         continue;
1784
1785       FOR_BB_INSNS (bb, insn)
1786       {
1787         if (!INSN_P (insn))
1788           continue;
1789         
1790         if (opt_info->insns_to_split)
1791           ivts = analyze_iv_to_split_insn (insn);
1792         
1793         if (ivts)
1794           {
1795             slot1 = htab_find_slot (opt_info->insns_to_split, ivts, INSERT);
1796             *slot1 = ivts;
1797             continue;
1798           }
1799         
1800         if (opt_info->insns_with_var_to_expand)
1801           ves = analyze_insn_to_expand_var (loop, insn);
1802         
1803         if (ves)
1804           {
1805             slot2 = htab_find_slot (opt_info->insns_with_var_to_expand, ves, INSERT);
1806             *slot2 = ves;
1807           }
1808       }
1809     }
1810   
1811   VEC_free (edge, heap, edges);
1812   free (body);
1813   return opt_info;
1814 }
1815
1816 /* Called just before loop duplication.  Records start of duplicated area
1817    to OPT_INFO.  */
1818
1819 static void 
1820 opt_info_start_duplication (struct opt_info *opt_info)
1821 {
1822   if (opt_info)
1823     opt_info->first_new_block = last_basic_block;
1824 }
1825
1826 /* Determine the number of iterations between initialization of the base
1827    variable and the current copy (N_COPY).  N_COPIES is the total number
1828    of newly created copies.  UNROLLING is true if we are unrolling
1829    (not peeling) the loop.  */
1830
1831 static unsigned
1832 determine_split_iv_delta (unsigned n_copy, unsigned n_copies, bool unrolling)
1833 {
1834   if (unrolling)
1835     {
1836       /* If we are unrolling, initialization is done in the original loop
1837          body (number 0).  */
1838       return n_copy;
1839     }
1840   else
1841     {
1842       /* If we are peeling, the copy in that the initialization occurs has
1843          number 1.  The original loop (number 0) is the last.  */
1844       if (n_copy)
1845         return n_copy - 1;
1846       else
1847         return n_copies;
1848     }
1849 }
1850
1851 /* Locate in EXPR the expression corresponding to the location recorded
1852    in IVTS, and return a pointer to the RTX for this location.  */
1853
1854 static rtx *
1855 get_ivts_expr (rtx expr, struct iv_to_split *ivts)
1856 {
1857   unsigned i;
1858   rtx *ret = &expr;
1859
1860   for (i = 0; i < ivts->n_loc; i++)
1861     ret = &XEXP (*ret, ivts->loc[i]);
1862
1863   return ret;
1864 }
1865
1866 /* Allocate basic variable for the induction variable chain.  Callback for
1867    htab_traverse.  */
1868
1869 static int
1870 allocate_basic_variable (void **slot, void *data ATTRIBUTE_UNUSED)
1871 {
1872   struct iv_to_split *ivts = *slot;
1873   rtx expr = *get_ivts_expr (single_set (ivts->insn), ivts);
1874
1875   ivts->base_var = gen_reg_rtx (GET_MODE (expr));
1876
1877   return 1;
1878 }
1879
1880 /* Insert initialization of basic variable of IVTS before INSN, taking
1881    the initial value from INSN.  */
1882
1883 static void
1884 insert_base_initialization (struct iv_to_split *ivts, rtx insn)
1885 {
1886   rtx expr = copy_rtx (*get_ivts_expr (single_set (insn), ivts));
1887   rtx seq;
1888
1889   start_sequence ();
1890   expr = force_operand (expr, ivts->base_var);
1891   if (expr != ivts->base_var)
1892     emit_move_insn (ivts->base_var, expr);
1893   seq = get_insns ();
1894   end_sequence ();
1895
1896   emit_insn_before (seq, insn);
1897 }
1898
1899 /* Replace the use of induction variable described in IVTS in INSN
1900    by base variable + DELTA * step.  */
1901
1902 static void
1903 split_iv (struct iv_to_split *ivts, rtx insn, unsigned delta)
1904 {
1905   rtx expr, *loc, seq, incr, var;
1906   enum machine_mode mode = GET_MODE (ivts->base_var);
1907   rtx src, dest, set;
1908
1909   /* Construct base + DELTA * step.  */
1910   if (!delta)
1911     expr = ivts->base_var;
1912   else
1913     {
1914       incr = simplify_gen_binary (MULT, mode,
1915                                   ivts->step, gen_int_mode (delta, mode));
1916       expr = simplify_gen_binary (PLUS, GET_MODE (ivts->base_var),
1917                                   ivts->base_var, incr);
1918     }
1919
1920   /* Figure out where to do the replacement.  */
1921   loc = get_ivts_expr (single_set (insn), ivts);
1922
1923   /* If we can make the replacement right away, we're done.  */
1924   if (validate_change (insn, loc, expr, 0))
1925     return;
1926
1927   /* Otherwise, force EXPR into a register and try again.  */
1928   start_sequence ();
1929   var = gen_reg_rtx (mode);
1930   expr = force_operand (expr, var);
1931   if (expr != var)
1932     emit_move_insn (var, expr);
1933   seq = get_insns ();
1934   end_sequence ();
1935   emit_insn_before (seq, insn);
1936       
1937   if (validate_change (insn, loc, var, 0))
1938     return;
1939
1940   /* The last chance.  Try recreating the assignment in insn
1941      completely from scratch.  */
1942   set = single_set (insn);
1943   gcc_assert (set);
1944
1945   start_sequence ();
1946   *loc = var;
1947   src = copy_rtx (SET_SRC (set));
1948   dest = copy_rtx (SET_DEST (set));
1949   src = force_operand (src, dest);
1950   if (src != dest)
1951     emit_move_insn (dest, src);
1952   seq = get_insns ();
1953   end_sequence ();
1954      
1955   emit_insn_before (seq, insn);
1956   delete_insn (insn);
1957 }
1958
1959
1960 /* Return one expansion of the accumulator recorded in struct VE.  */
1961
1962 static rtx
1963 get_expansion (struct var_to_expand *ve)
1964 {
1965   rtx reg;
1966   
1967   if (ve->reuse_expansion == 0)
1968     reg = ve->reg;
1969   else
1970     reg = VEC_index (rtx, ve->var_expansions, ve->reuse_expansion - 1);
1971   
1972   if (VEC_length (rtx, ve->var_expansions) == (unsigned) ve->reuse_expansion)
1973     ve->reuse_expansion = 0;
1974   else 
1975     ve->reuse_expansion++;
1976   
1977   return reg;
1978 }
1979
1980
1981 /* Given INSN replace the uses of the accumulator recorded in VE 
1982    with a new register.  */
1983
1984 static void
1985 expand_var_during_unrolling (struct var_to_expand *ve, rtx insn)
1986 {
1987   rtx new_reg, set;
1988   bool really_new_expansion = false;
1989   
1990   set = single_set (insn);
1991   gcc_assert (set);
1992   
1993   /* Generate a new register only if the expansion limit has not been
1994      reached.  Else reuse an already existing expansion.  */
1995   if (PARAM_VALUE (PARAM_MAX_VARIABLE_EXPANSIONS) > ve->expansion_count)
1996     {
1997       really_new_expansion = true;
1998       new_reg = gen_reg_rtx (GET_MODE (ve->reg));
1999     }
2000   else
2001     new_reg = get_expansion (ve);
2002
2003   validate_change (insn, &SET_DEST (set), new_reg, 1);
2004   validate_change (insn, &XEXP (SET_SRC (set), ve->accum_pos), new_reg, 1);
2005   
2006   if (apply_change_group ())
2007     if (really_new_expansion)
2008       {
2009         VEC_safe_push (rtx, heap, ve->var_expansions, new_reg);
2010         ve->expansion_count++;
2011       }
2012 }
2013
2014 /* Initialize the variable expansions in loop preheader.  
2015    Callbacks for htab_traverse.  PLACE_P is the loop-preheader 
2016    basic block where the initialization of the expansions 
2017    should take place.  The expansions are initialized with (-0)
2018    when the operation is plus or minus to honor sign zero.
2019    This way we can prevent cases where the sign of the final result is
2020    effected by the sign of the expansion.
2021    Here is an example to demonstrate this:
2022    
2023    for (i = 0 ; i < n; i++)
2024      sum += something;
2025
2026    ==>
2027
2028    sum += something
2029    ....
2030    i = i+1;
2031    sum1 += something
2032    ....
2033    i = i+1
2034    sum2 += something;
2035    ....
2036    
2037    When SUM is initialized with -zero and SOMETHING is also -zero; the
2038    final result of sum should be -zero thus the expansions sum1 and sum2
2039    should be initialized with -zero as well (otherwise we will get +zero
2040    as the final result).  */
2041
2042 static int
2043 insert_var_expansion_initialization (void **slot, void *place_p)
2044 {
2045   struct var_to_expand *ve = *slot;
2046   basic_block place = (basic_block)place_p;
2047   rtx seq, var, zero_init, insn;
2048   unsigned i;
2049   enum machine_mode mode = GET_MODE (ve->reg);
2050   bool honor_signed_zero_p = HONOR_SIGNED_ZEROS (mode);
2051
2052   if (VEC_length (rtx, ve->var_expansions) == 0)
2053     return 1;
2054   
2055   start_sequence ();
2056   if (ve->op == PLUS || ve->op == MINUS) 
2057     for (i = 0; VEC_iterate (rtx, ve->var_expansions, i, var); i++)
2058       {
2059         if (honor_signed_zero_p)
2060           zero_init = simplify_gen_unary (NEG, mode, CONST0_RTX (mode), mode);
2061         else
2062           zero_init = CONST0_RTX (mode);
2063         
2064         emit_move_insn (var, zero_init);
2065       }
2066   else if (ve->op == MULT)
2067     for (i = 0; VEC_iterate (rtx, ve->var_expansions, i, var); i++)
2068       {
2069         zero_init =  CONST1_RTX (GET_MODE (var));
2070         emit_move_insn (var, zero_init);
2071       }
2072   
2073   seq = get_insns ();
2074   end_sequence ();
2075   
2076   insn = BB_HEAD (place);
2077   while (!NOTE_INSN_BASIC_BLOCK_P (insn))
2078     insn = NEXT_INSN (insn);
2079   
2080   emit_insn_after (seq, insn); 
2081   /* Continue traversing the hash table.  */
2082   return 1;   
2083 }
2084
2085 /*  Combine the variable expansions at the loop exit.  
2086     Callbacks for htab_traverse.  PLACE_P is the loop exit
2087     basic block where the summation of the expansions should 
2088     take place.  */
2089
2090 static int
2091 combine_var_copies_in_loop_exit (void **slot, void *place_p)
2092 {
2093   struct var_to_expand *ve = *slot;
2094   basic_block place = (basic_block)place_p;
2095   rtx sum = ve->reg;
2096   rtx expr, seq, var, insn;
2097   unsigned i;
2098
2099   if (VEC_length (rtx, ve->var_expansions) == 0)
2100     return 1;
2101   
2102   start_sequence ();
2103   if (ve->op == PLUS || ve->op == MINUS)
2104     for (i = 0; VEC_iterate (rtx, ve->var_expansions, i, var); i++)
2105       {
2106         sum = simplify_gen_binary (PLUS, GET_MODE (ve->reg),
2107                                    var, sum);
2108       }
2109   else if (ve->op == MULT)
2110     for (i = 0; VEC_iterate (rtx, ve->var_expansions, i, var); i++)
2111       {
2112         sum = simplify_gen_binary (MULT, GET_MODE (ve->reg),
2113                                    var, sum);
2114       }
2115   
2116   expr = force_operand (sum, ve->reg);
2117   if (expr != ve->reg)
2118     emit_move_insn (ve->reg, expr);
2119   seq = get_insns ();
2120   end_sequence ();
2121   
2122   insn = BB_HEAD (place);
2123   while (!NOTE_INSN_BASIC_BLOCK_P (insn))
2124     insn = NEXT_INSN (insn);
2125
2126   emit_insn_after (seq, insn);
2127   
2128   /* Continue traversing the hash table.  */
2129   return 1;
2130 }
2131
2132 /* Apply loop optimizations in loop copies using the 
2133    data which gathered during the unrolling.  Structure 
2134    OPT_INFO record that data.
2135    
2136    UNROLLING is true if we unrolled (not peeled) the loop.
2137    REWRITE_ORIGINAL_BODY is true if we should also rewrite the original body of
2138    the loop (as it should happen in complete unrolling, but not in ordinary
2139    peeling of the loop).  */
2140
2141 static void
2142 apply_opt_in_copies (struct opt_info *opt_info, 
2143                      unsigned n_copies, bool unrolling, 
2144                      bool rewrite_original_loop)
2145 {
2146   unsigned i, delta;
2147   basic_block bb, orig_bb;
2148   rtx insn, orig_insn, next;
2149   struct iv_to_split ivts_templ, *ivts;
2150   struct var_to_expand ve_templ, *ves;
2151   
2152   /* Sanity check -- we need to put initialization in the original loop
2153      body.  */
2154   gcc_assert (!unrolling || rewrite_original_loop);
2155   
2156   /* Allocate the basic variables (i0).  */
2157   if (opt_info->insns_to_split)
2158     htab_traverse (opt_info->insns_to_split, allocate_basic_variable, NULL);
2159   
2160   for (i = opt_info->first_new_block; i < (unsigned) last_basic_block; i++)
2161     {
2162       bb = BASIC_BLOCK (i);
2163       orig_bb = get_bb_original (bb);
2164       
2165       /* bb->aux holds position in copy sequence initialized by
2166          duplicate_loop_to_header_edge.  */
2167       delta = determine_split_iv_delta ((size_t)bb->aux, n_copies,
2168                                         unrolling);
2169       bb->aux = 0;
2170       orig_insn = BB_HEAD (orig_bb);
2171       for (insn = BB_HEAD (bb); insn != NEXT_INSN (BB_END (bb)); insn = next)
2172         {
2173           next = NEXT_INSN (insn);
2174           if (!INSN_P (insn))
2175             continue;
2176           
2177           while (!INSN_P (orig_insn))
2178             orig_insn = NEXT_INSN (orig_insn);
2179           
2180           ivts_templ.insn = orig_insn;
2181           ve_templ.insn = orig_insn;
2182           
2183           /* Apply splitting iv optimization.  */
2184           if (opt_info->insns_to_split)
2185             {
2186               ivts = htab_find (opt_info->insns_to_split, &ivts_templ);
2187               
2188               if (ivts)
2189                 {
2190                   gcc_assert (GET_CODE (PATTERN (insn))
2191                               == GET_CODE (PATTERN (orig_insn)));
2192                   
2193                   if (!delta)
2194                     insert_base_initialization (ivts, insn);
2195                   split_iv (ivts, insn, delta);
2196                 }
2197             }
2198           /* Apply variable expansion optimization.  */
2199           if (unrolling && opt_info->insns_with_var_to_expand)
2200             {
2201               ves = htab_find (opt_info->insns_with_var_to_expand, &ve_templ);
2202               if (ves)
2203                 { 
2204                   gcc_assert (GET_CODE (PATTERN (insn))
2205                               == GET_CODE (PATTERN (orig_insn)));
2206                   expand_var_during_unrolling (ves, insn);
2207                 }
2208             }
2209           orig_insn = NEXT_INSN (orig_insn);
2210         }
2211     }
2212
2213   if (!rewrite_original_loop)
2214     return;
2215   
2216   /* Initialize the variable expansions in the loop preheader
2217      and take care of combining them at the loop exit.  */ 
2218   if (opt_info->insns_with_var_to_expand)
2219     {
2220       htab_traverse (opt_info->insns_with_var_to_expand, 
2221                      insert_var_expansion_initialization, 
2222                      opt_info->loop_preheader);
2223       htab_traverse (opt_info->insns_with_var_to_expand, 
2224                      combine_var_copies_in_loop_exit, 
2225                      opt_info->loop_exit);
2226     }
2227   
2228   /* Rewrite also the original loop body.  Find them as originals of the blocks
2229      in the last copied iteration, i.e. those that have
2230      get_bb_copy (get_bb_original (bb)) == bb.  */
2231   for (i = opt_info->first_new_block; i < (unsigned) last_basic_block; i++)
2232     {
2233       bb = BASIC_BLOCK (i);
2234       orig_bb = get_bb_original (bb);
2235       if (get_bb_copy (orig_bb) != bb)
2236         continue;
2237       
2238       delta = determine_split_iv_delta (0, n_copies, unrolling);
2239       for (orig_insn = BB_HEAD (orig_bb);
2240            orig_insn != NEXT_INSN (BB_END (bb));
2241            orig_insn = next)
2242         {
2243           next = NEXT_INSN (orig_insn);
2244           
2245           if (!INSN_P (orig_insn))
2246             continue;
2247           
2248           ivts_templ.insn = orig_insn;
2249           if (opt_info->insns_to_split)
2250             {
2251               ivts = htab_find (opt_info->insns_to_split, &ivts_templ);
2252               if (ivts)
2253                 {
2254                   if (!delta)
2255                     insert_base_initialization (ivts, orig_insn);
2256                   split_iv (ivts, orig_insn, delta);
2257                   continue;
2258                 }
2259             }
2260           
2261         }
2262     }
2263 }
2264
2265 /*  Release the data structures used for the variable expansion
2266     optimization.  Callbacks for htab_traverse.  */
2267
2268 static int
2269 release_var_copies (void **slot, void *data ATTRIBUTE_UNUSED)
2270 {
2271   struct var_to_expand *ve = *slot;
2272   
2273   VEC_free (rtx, heap, ve->var_expansions);
2274   
2275   /* Continue traversing the hash table.  */
2276   return 1;
2277 }
2278
2279 /* Release OPT_INFO.  */
2280
2281 static void
2282 free_opt_info (struct opt_info *opt_info)
2283 {
2284   if (opt_info->insns_to_split)
2285     htab_delete (opt_info->insns_to_split);
2286   if (opt_info->insns_with_var_to_expand)
2287     {
2288       htab_traverse (opt_info->insns_with_var_to_expand, 
2289                      release_var_copies, NULL);
2290       htab_delete (opt_info->insns_with_var_to_expand);
2291     }
2292   free (opt_info);
2293 }