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