xref: /openbsd/gnu/gcc/gcc/cfgloopmanip.c (revision 404b540a)
1 /* Loop manipulation code for GNU compiler.
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 "cfghooks.h"
32 #include "output.h"
33 
34 static void duplicate_subloops (struct loops *, struct loop *, struct loop *);
35 static void copy_loops_to (struct loops *, struct loop **, int,
36 			   struct loop *);
37 static void loop_redirect_edge (edge, basic_block);
38 static bool loop_delete_branch_edge (edge, int);
39 static void remove_bbs (basic_block *, int);
40 static bool rpe_enum_p (basic_block, void *);
41 static int find_path (edge, basic_block **);
42 static bool alp_enum_p (basic_block, void *);
43 static void add_loop (struct loops *, struct loop *);
44 static void fix_loop_placements (struct loops *, struct loop *, bool *);
45 static bool fix_bb_placement (struct loops *, basic_block);
46 static void fix_bb_placements (struct loops *, basic_block, bool *);
47 static void place_new_loop (struct loops *, struct loop *);
48 static void scale_loop_frequencies (struct loop *, int, int);
49 static basic_block create_preheader (struct loop *, int);
50 static void unloop (struct loops *, struct loop *, bool *);
51 
52 #define RDIV(X,Y) (((X) + (Y) / 2) / (Y))
53 
54 /* Checks whether basic block BB is dominated by DATA.  */
55 static bool
rpe_enum_p(basic_block bb,void * data)56 rpe_enum_p (basic_block bb, void *data)
57 {
58   return dominated_by_p (CDI_DOMINATORS, bb, data);
59 }
60 
61 /* Remove basic blocks BBS from loop structure and dominance info,
62    and delete them afterwards.  */
63 static void
remove_bbs(basic_block * bbs,int nbbs)64 remove_bbs (basic_block *bbs, int nbbs)
65 {
66   int i;
67 
68   for (i = 0; i < nbbs; i++)
69     {
70       remove_bb_from_loops (bbs[i]);
71       delete_basic_block (bbs[i]);
72     }
73 }
74 
75 /* Find path -- i.e. the basic blocks dominated by edge E and put them
76    into array BBS, that will be allocated large enough to contain them.
77    E->dest must have exactly one predecessor for this to work (it is
78    easy to achieve and we do not put it here because we do not want to
79    alter anything by this function).  The number of basic blocks in the
80    path is returned.  */
81 static int
find_path(edge e,basic_block ** bbs)82 find_path (edge e, basic_block **bbs)
83 {
84   gcc_assert (EDGE_COUNT (e->dest->preds) <= 1);
85 
86   /* Find bbs in the path.  */
87   *bbs = XCNEWVEC (basic_block, n_basic_blocks);
88   return dfs_enumerate_from (e->dest, 0, rpe_enum_p, *bbs,
89 			     n_basic_blocks, e->dest);
90 }
91 
92 /* Fix placement of basic block BB inside loop hierarchy stored in LOOPS --
93    Let L be a loop to that BB belongs.  Then every successor of BB must either
94      1) belong to some superloop of loop L, or
95      2) be a header of loop K such that K->outer is superloop of L
96    Returns true if we had to move BB into other loop to enforce this condition,
97    false if the placement of BB was already correct (provided that placements
98    of its successors are correct).  */
99 static bool
fix_bb_placement(struct loops * loops,basic_block bb)100 fix_bb_placement (struct loops *loops, basic_block bb)
101 {
102   edge e;
103   edge_iterator ei;
104   struct loop *loop = loops->tree_root, *act;
105 
106   FOR_EACH_EDGE (e, ei, bb->succs)
107     {
108       if (e->dest == EXIT_BLOCK_PTR)
109 	continue;
110 
111       act = e->dest->loop_father;
112       if (act->header == e->dest)
113 	act = act->outer;
114 
115       if (flow_loop_nested_p (loop, act))
116 	loop = act;
117     }
118 
119   if (loop == bb->loop_father)
120     return false;
121 
122   remove_bb_from_loops (bb);
123   add_bb_to_loop (bb, loop);
124 
125   return true;
126 }
127 
128 /* Fix placements of basic blocks inside loop hierarchy stored in loops; i.e.
129    enforce condition condition stated in description of fix_bb_placement. We
130    start from basic block FROM that had some of its successors removed, so that
131    his placement no longer has to be correct, and iteratively fix placement of
132    its predecessors that may change if placement of FROM changed.  Also fix
133    placement of subloops of FROM->loop_father, that might also be altered due
134    to this change; the condition for them is similar, except that instead of
135    successors we consider edges coming out of the loops.
136 
137    If the changes may invalidate the information about irreducible regions,
138    IRRED_INVALIDATED is set to true.  */
139 
140 static void
fix_bb_placements(struct loops * loops,basic_block from,bool * irred_invalidated)141 fix_bb_placements (struct loops *loops, basic_block from,
142 		   bool *irred_invalidated)
143 {
144   sbitmap in_queue;
145   basic_block *queue, *qtop, *qbeg, *qend;
146   struct loop *base_loop;
147   edge e;
148 
149   /* We pass through blocks back-reachable from FROM, testing whether some
150      of their successors moved to outer loop.  It may be necessary to
151      iterate several times, but it is finite, as we stop unless we move
152      the basic block up the loop structure.  The whole story is a bit
153      more complicated due to presence of subloops, those are moved using
154      fix_loop_placement.  */
155 
156   base_loop = from->loop_father;
157   if (base_loop == loops->tree_root)
158     return;
159 
160   in_queue = sbitmap_alloc (last_basic_block);
161   sbitmap_zero (in_queue);
162   SET_BIT (in_queue, from->index);
163   /* Prevent us from going out of the base_loop.  */
164   SET_BIT (in_queue, base_loop->header->index);
165 
166   queue = XNEWVEC (basic_block, base_loop->num_nodes + 1);
167   qtop = queue + base_loop->num_nodes + 1;
168   qbeg = queue;
169   qend = queue + 1;
170   *qbeg = from;
171 
172   while (qbeg != qend)
173     {
174       edge_iterator ei;
175       from = *qbeg;
176       qbeg++;
177       if (qbeg == qtop)
178 	qbeg = queue;
179       RESET_BIT (in_queue, from->index);
180 
181       if (from->loop_father->header == from)
182 	{
183 	  /* Subloop header, maybe move the loop upward.  */
184 	  if (!fix_loop_placement (from->loop_father))
185 	    continue;
186 	}
187       else
188 	{
189 	  /* Ordinary basic block.  */
190 	  if (!fix_bb_placement (loops, from))
191 	    continue;
192 	}
193 
194       FOR_EACH_EDGE (e, ei, from->succs)
195 	{
196 	  if (e->flags & EDGE_IRREDUCIBLE_LOOP)
197 	    *irred_invalidated = true;
198 	}
199 
200       /* Something has changed, insert predecessors into queue.  */
201       FOR_EACH_EDGE (e, ei, from->preds)
202 	{
203 	  basic_block pred = e->src;
204 	  struct loop *nca;
205 
206 	  if (e->flags & EDGE_IRREDUCIBLE_LOOP)
207 	    *irred_invalidated = true;
208 
209 	  if (TEST_BIT (in_queue, pred->index))
210 	    continue;
211 
212 	  /* If it is subloop, then it either was not moved, or
213 	     the path up the loop tree from base_loop do not contain
214 	     it.  */
215 	  nca = find_common_loop (pred->loop_father, base_loop);
216 	  if (pred->loop_father != base_loop
217 	      && (nca == base_loop
218 		  || nca != pred->loop_father))
219 	    pred = pred->loop_father->header;
220 	  else if (!flow_loop_nested_p (from->loop_father, pred->loop_father))
221 	    {
222 	      /* No point in processing it.  */
223 	      continue;
224 	    }
225 
226 	  if (TEST_BIT (in_queue, pred->index))
227 	    continue;
228 
229 	  /* Schedule the basic block.  */
230 	  *qend = pred;
231 	  qend++;
232 	  if (qend == qtop)
233 	    qend = queue;
234 	  SET_BIT (in_queue, pred->index);
235 	}
236     }
237   free (in_queue);
238   free (queue);
239 }
240 
241 /* Removes path beginning at edge E, i.e. remove basic blocks dominated by E
242    and update loop structure stored in LOOPS and dominators.  Return true if
243    we were able to remove the path, false otherwise (and nothing is affected
244    then).  */
245 bool
remove_path(struct loops * loops,edge e)246 remove_path (struct loops *loops, edge e)
247 {
248   edge ae;
249   basic_block *rem_bbs, *bord_bbs, *dom_bbs, from, bb;
250   int i, nrem, n_bord_bbs, n_dom_bbs;
251   sbitmap seen;
252   bool deleted, irred_invalidated = false;
253 
254   if (!loop_delete_branch_edge (e, 0))
255     return false;
256 
257   /* Keep track of whether we need to update information about irreducible
258      regions.  This is the case if the removed area is a part of the
259      irreducible region, or if the set of basic blocks that belong to a loop
260      that is inside an irreducible region is changed, or if such a loop is
261      removed.  */
262   if (e->flags & EDGE_IRREDUCIBLE_LOOP)
263     irred_invalidated = true;
264 
265   /* We need to check whether basic blocks are dominated by the edge
266      e, but we only have basic block dominators.  This is easy to
267      fix -- when e->dest has exactly one predecessor, this corresponds
268      to blocks dominated by e->dest, if not, split the edge.  */
269   if (!single_pred_p (e->dest))
270     e = single_pred_edge (loop_split_edge_with (e, NULL_RTX));
271 
272   /* It may happen that by removing path we remove one or more loops
273      we belong to.  In this case first unloop the loops, then proceed
274      normally.   We may assume that e->dest is not a header of any loop,
275      as it now has exactly one predecessor.  */
276   while (e->src->loop_father->outer
277 	 && dominated_by_p (CDI_DOMINATORS,
278 			    e->src->loop_father->latch, e->dest))
279     unloop (loops, e->src->loop_father, &irred_invalidated);
280 
281   /* Identify the path.  */
282   nrem = find_path (e, &rem_bbs);
283 
284   n_bord_bbs = 0;
285   bord_bbs = XCNEWVEC (basic_block, n_basic_blocks);
286   seen = sbitmap_alloc (last_basic_block);
287   sbitmap_zero (seen);
288 
289   /* Find "border" hexes -- i.e. those with predecessor in removed path.  */
290   for (i = 0; i < nrem; i++)
291     SET_BIT (seen, rem_bbs[i]->index);
292   for (i = 0; i < nrem; i++)
293     {
294       edge_iterator ei;
295       bb = rem_bbs[i];
296       FOR_EACH_EDGE (ae, ei, rem_bbs[i]->succs)
297 	if (ae->dest != EXIT_BLOCK_PTR && !TEST_BIT (seen, ae->dest->index))
298 	  {
299 	    SET_BIT (seen, ae->dest->index);
300 	    bord_bbs[n_bord_bbs++] = ae->dest;
301 
302 	    if (ae->flags & EDGE_IRREDUCIBLE_LOOP)
303 	      irred_invalidated = true;
304 	  }
305     }
306 
307   /* Remove the path.  */
308   from = e->src;
309   deleted = loop_delete_branch_edge (e, 1);
310   gcc_assert (deleted);
311   dom_bbs = XCNEWVEC (basic_block, n_basic_blocks);
312 
313   /* Cancel loops contained in the path.  */
314   for (i = 0; i < nrem; i++)
315     if (rem_bbs[i]->loop_father->header == rem_bbs[i])
316       cancel_loop_tree (loops, rem_bbs[i]->loop_father);
317 
318   remove_bbs (rem_bbs, nrem);
319   free (rem_bbs);
320 
321   /* Find blocks whose dominators may be affected.  */
322   n_dom_bbs = 0;
323   sbitmap_zero (seen);
324   for (i = 0; i < n_bord_bbs; i++)
325     {
326       basic_block ldom;
327 
328       bb = get_immediate_dominator (CDI_DOMINATORS, bord_bbs[i]);
329       if (TEST_BIT (seen, bb->index))
330 	continue;
331       SET_BIT (seen, bb->index);
332 
333       for (ldom = first_dom_son (CDI_DOMINATORS, bb);
334 	   ldom;
335 	   ldom = next_dom_son (CDI_DOMINATORS, ldom))
336 	if (!dominated_by_p (CDI_DOMINATORS, from, ldom))
337 	  dom_bbs[n_dom_bbs++] = ldom;
338     }
339 
340   free (seen);
341 
342   /* Recount dominators.  */
343   iterate_fix_dominators (CDI_DOMINATORS, dom_bbs, n_dom_bbs);
344   free (dom_bbs);
345   free (bord_bbs);
346 
347   /* Fix placements of basic blocks inside loops and the placement of
348      loops in the loop tree.  */
349   fix_bb_placements (loops, from, &irred_invalidated);
350   fix_loop_placements (loops, from->loop_father, &irred_invalidated);
351 
352   if (irred_invalidated
353       && (loops->state & LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS) != 0)
354     mark_irreducible_loops (loops);
355 
356   return true;
357 }
358 
359 /* Predicate for enumeration in add_loop.  */
360 static bool
alp_enum_p(basic_block bb,void * alp_header)361 alp_enum_p (basic_block bb, void *alp_header)
362 {
363   return bb != (basic_block) alp_header;
364 }
365 
366 /* Given LOOP structure with filled header and latch, find the body of the
367    corresponding loop and add it to LOOPS tree.  */
368 static void
add_loop(struct loops * loops,struct loop * loop)369 add_loop (struct loops *loops, struct loop *loop)
370 {
371   basic_block *bbs;
372   int i, n;
373 
374   /* Add it to loop structure.  */
375   place_new_loop (loops, loop);
376   loop->level = 1;
377 
378   /* Find its nodes.  */
379   bbs = XCNEWVEC (basic_block, n_basic_blocks);
380   n = dfs_enumerate_from (loop->latch, 1, alp_enum_p,
381 			  bbs, n_basic_blocks, loop->header);
382 
383   for (i = 0; i < n; i++)
384     add_bb_to_loop (bbs[i], loop);
385   add_bb_to_loop (loop->header, loop);
386 
387   free (bbs);
388 }
389 
390 /* Multiply all frequencies in LOOP by NUM/DEN.  */
391 static void
scale_loop_frequencies(struct loop * loop,int num,int den)392 scale_loop_frequencies (struct loop *loop, int num, int den)
393 {
394   basic_block *bbs;
395 
396   bbs = get_loop_body (loop);
397   scale_bbs_frequencies_int (bbs, loop->num_nodes, num, den);
398   free (bbs);
399 }
400 
401 /* Make area between HEADER_EDGE and LATCH_EDGE a loop by connecting
402    latch to header and update loop tree stored in LOOPS and dominators
403    accordingly. Everything between them plus LATCH_EDGE destination must
404    be dominated by HEADER_EDGE destination, and back-reachable from
405    LATCH_EDGE source.  HEADER_EDGE is redirected to basic block SWITCH_BB,
406    FALSE_EDGE of SWITCH_BB to original destination of HEADER_EDGE and
407    TRUE_EDGE of SWITCH_BB to original destination of LATCH_EDGE.
408    Returns newly created loop.  */
409 
410 struct loop *
loopify(struct loops * loops,edge latch_edge,edge header_edge,basic_block switch_bb,edge true_edge,edge false_edge,bool redirect_all_edges)411 loopify (struct loops *loops, edge latch_edge, edge header_edge,
412 	 basic_block switch_bb, edge true_edge, edge false_edge,
413 	 bool redirect_all_edges)
414 {
415   basic_block succ_bb = latch_edge->dest;
416   basic_block pred_bb = header_edge->src;
417   basic_block *dom_bbs, *body;
418   unsigned n_dom_bbs, i;
419   sbitmap seen;
420   struct loop *loop = XCNEW (struct loop);
421   struct loop *outer = succ_bb->loop_father->outer;
422   int freq, prob, tot_prob;
423   gcov_type cnt;
424   edge e;
425   edge_iterator ei;
426 
427   loop->header = header_edge->dest;
428   loop->latch = latch_edge->src;
429 
430   freq = EDGE_FREQUENCY (header_edge);
431   cnt = header_edge->count;
432   prob = EDGE_SUCC (switch_bb, 0)->probability;
433   tot_prob = prob + EDGE_SUCC (switch_bb, 1)->probability;
434   if (tot_prob == 0)
435     tot_prob = 1;
436 
437   /* Redirect edges.  */
438   loop_redirect_edge (latch_edge, loop->header);
439   loop_redirect_edge (true_edge, succ_bb);
440 
441   /* During loop versioning, one of the switch_bb edge is already properly
442      set. Do not redirect it again unless redirect_all_edges is true.  */
443   if (redirect_all_edges)
444     {
445       loop_redirect_edge (header_edge, switch_bb);
446       loop_redirect_edge (false_edge, loop->header);
447 
448       /* Update dominators.  */
449       set_immediate_dominator (CDI_DOMINATORS, switch_bb, pred_bb);
450       set_immediate_dominator (CDI_DOMINATORS, loop->header, switch_bb);
451     }
452 
453   set_immediate_dominator (CDI_DOMINATORS, succ_bb, switch_bb);
454 
455   /* Compute new loop.  */
456   add_loop (loops, loop);
457   flow_loop_tree_node_add (outer, loop);
458 
459   /* Add switch_bb to appropriate loop.  */
460   add_bb_to_loop (switch_bb, outer);
461 
462   /* Fix frequencies.  */
463   switch_bb->frequency = freq;
464   switch_bb->count = cnt;
465   FOR_EACH_EDGE (e, ei, switch_bb->succs)
466     e->count = (switch_bb->count * e->probability) / REG_BR_PROB_BASE;
467   scale_loop_frequencies (loop, prob, tot_prob);
468   scale_loop_frequencies (succ_bb->loop_father, tot_prob - prob, tot_prob);
469 
470   /* Update dominators of blocks outside of LOOP.  */
471   dom_bbs = XCNEWVEC (basic_block, n_basic_blocks);
472   n_dom_bbs = 0;
473   seen = sbitmap_alloc (last_basic_block);
474   sbitmap_zero (seen);
475   body = get_loop_body (loop);
476 
477   for (i = 0; i < loop->num_nodes; i++)
478     SET_BIT (seen, body[i]->index);
479 
480   for (i = 0; i < loop->num_nodes; i++)
481     {
482       basic_block ldom;
483 
484       for (ldom = first_dom_son (CDI_DOMINATORS, body[i]);
485 	   ldom;
486 	   ldom = next_dom_son (CDI_DOMINATORS, ldom))
487 	if (!TEST_BIT (seen, ldom->index))
488 	  {
489 	    SET_BIT (seen, ldom->index);
490 	    dom_bbs[n_dom_bbs++] = ldom;
491 	  }
492     }
493 
494   iterate_fix_dominators (CDI_DOMINATORS, dom_bbs, n_dom_bbs);
495 
496   free (body);
497   free (seen);
498   free (dom_bbs);
499 
500   return loop;
501 }
502 
503 /* Remove the latch edge of a LOOP and update LOOPS tree to indicate that
504    the LOOP was removed.  After this function, original loop latch will
505    have no successor, which caller is expected to fix somehow.
506 
507    If this may cause the information about irreducible regions to become
508    invalid, IRRED_INVALIDATED is set to true.  */
509 
510 static void
unloop(struct loops * loops,struct loop * loop,bool * irred_invalidated)511 unloop (struct loops *loops, struct loop *loop, bool *irred_invalidated)
512 {
513   basic_block *body;
514   struct loop *ploop;
515   unsigned i, n;
516   basic_block latch = loop->latch;
517   bool dummy = false;
518 
519   if (loop_preheader_edge (loop)->flags & EDGE_IRREDUCIBLE_LOOP)
520     *irred_invalidated = true;
521 
522   /* This is relatively straightforward.  The dominators are unchanged, as
523      loop header dominates loop latch, so the only thing we have to care of
524      is the placement of loops and basic blocks inside the loop tree.  We
525      move them all to the loop->outer, and then let fix_bb_placements do
526      its work.  */
527 
528   body = get_loop_body (loop);
529   n = loop->num_nodes;
530   for (i = 0; i < n; i++)
531     if (body[i]->loop_father == loop)
532       {
533 	remove_bb_from_loops (body[i]);
534 	add_bb_to_loop (body[i], loop->outer);
535       }
536   free(body);
537 
538   while (loop->inner)
539     {
540       ploop = loop->inner;
541       flow_loop_tree_node_remove (ploop);
542       flow_loop_tree_node_add (loop->outer, ploop);
543     }
544 
545   /* Remove the loop and free its data.  */
546   flow_loop_tree_node_remove (loop);
547   loops->parray[loop->num] = NULL;
548   flow_loop_free (loop);
549 
550   remove_edge (single_succ_edge (latch));
551 
552   /* We do not pass IRRED_INVALIDATED to fix_bb_placements here, as even if
553      there is an irreducible region inside the cancelled loop, the flags will
554      be still correct.  */
555   fix_bb_placements (loops, latch, &dummy);
556 }
557 
558 /* Fix placement of LOOP inside loop tree, i.e. find the innermost superloop
559    FATHER of LOOP such that all of the edges coming out of LOOP belong to
560    FATHER, and set it as outer loop of LOOP.  Return true if placement of
561    LOOP changed.  */
562 
563 int
fix_loop_placement(struct loop * loop)564 fix_loop_placement (struct loop *loop)
565 {
566   basic_block *body;
567   unsigned i;
568   edge e;
569   edge_iterator ei;
570   struct loop *father = loop->pred[0], *act;
571 
572   body = get_loop_body (loop);
573   for (i = 0; i < loop->num_nodes; i++)
574     FOR_EACH_EDGE (e, ei, body[i]->succs)
575       if (!flow_bb_inside_loop_p (loop, e->dest))
576 	{
577 	  act = find_common_loop (loop, e->dest->loop_father);
578 	  if (flow_loop_nested_p (father, act))
579 	    father = act;
580 	}
581   free (body);
582 
583   if (father != loop->outer)
584     {
585       for (act = loop->outer; act != father; act = act->outer)
586 	act->num_nodes -= loop->num_nodes;
587       flow_loop_tree_node_remove (loop);
588       flow_loop_tree_node_add (father, loop);
589       return 1;
590     }
591   return 0;
592 }
593 
594 /* Fix placement of superloops of LOOP inside loop tree, i.e. ensure that
595    condition stated in description of fix_loop_placement holds for them.
596    It is used in case when we removed some edges coming out of LOOP, which
597    may cause the right placement of LOOP inside loop tree to change.
598 
599    IRRED_INVALIDATED is set to true if a change in the loop structures might
600    invalidate the information about irreducible regions.  */
601 
602 static void
fix_loop_placements(struct loops * loops,struct loop * loop,bool * irred_invalidated)603 fix_loop_placements (struct loops *loops, struct loop *loop,
604 		     bool *irred_invalidated)
605 {
606   struct loop *outer;
607 
608   while (loop->outer)
609     {
610       outer = loop->outer;
611       if (!fix_loop_placement (loop))
612 	break;
613 
614       /* Changing the placement of a loop in the loop tree may alter the
615 	 validity of condition 2) of the description of fix_bb_placement
616 	 for its preheader, because the successor is the header and belongs
617 	 to the loop.  So call fix_bb_placements to fix up the placement
618 	 of the preheader and (possibly) of its predecessors.  */
619       fix_bb_placements (loops, loop_preheader_edge (loop)->src,
620 			 irred_invalidated);
621       loop = outer;
622     }
623 }
624 
625 /* Creates place for a new LOOP in LOOPS structure.  */
626 static void
place_new_loop(struct loops * loops,struct loop * loop)627 place_new_loop (struct loops *loops, struct loop *loop)
628 {
629   loops->parray =
630     xrealloc (loops->parray, (loops->num + 1) * sizeof (struct loop *));
631   loops->parray[loops->num] = loop;
632 
633   loop->num = loops->num++;
634 }
635 
636 /* Copies copy of LOOP as subloop of TARGET loop, placing newly
637    created loop into LOOPS structure.  */
638 struct loop *
duplicate_loop(struct loops * loops,struct loop * loop,struct loop * target)639 duplicate_loop (struct loops *loops, struct loop *loop, struct loop *target)
640 {
641   struct loop *cloop;
642   cloop = XCNEW (struct loop);
643   place_new_loop (loops, cloop);
644 
645   /* Initialize copied loop.  */
646   cloop->level = loop->level;
647 
648   /* Set it as copy of loop.  */
649   loop->copy = cloop;
650 
651   /* Add it to target.  */
652   flow_loop_tree_node_add (target, cloop);
653 
654   return cloop;
655 }
656 
657 /* Copies structure of subloops of LOOP into TARGET loop, placing
658    newly created loops into loop tree stored in LOOPS.  */
659 static void
duplicate_subloops(struct loops * loops,struct loop * loop,struct loop * target)660 duplicate_subloops (struct loops *loops, struct loop *loop, struct loop *target)
661 {
662   struct loop *aloop, *cloop;
663 
664   for (aloop = loop->inner; aloop; aloop = aloop->next)
665     {
666       cloop = duplicate_loop (loops, aloop, target);
667       duplicate_subloops (loops, aloop, cloop);
668     }
669 }
670 
671 /* Copies structure of subloops of N loops, stored in array COPIED_LOOPS,
672    into TARGET loop, placing newly created loops into loop tree LOOPS.  */
673 static void
copy_loops_to(struct loops * loops,struct loop ** copied_loops,int n,struct loop * target)674 copy_loops_to (struct loops *loops, struct loop **copied_loops, int n, struct loop *target)
675 {
676   struct loop *aloop;
677   int i;
678 
679   for (i = 0; i < n; i++)
680     {
681       aloop = duplicate_loop (loops, copied_loops[i], target);
682       duplicate_subloops (loops, copied_loops[i], aloop);
683     }
684 }
685 
686 /* Redirects edge E to basic block DEST.  */
687 static void
loop_redirect_edge(edge e,basic_block dest)688 loop_redirect_edge (edge e, basic_block dest)
689 {
690   if (e->dest == dest)
691     return;
692 
693   redirect_edge_and_branch_force (e, dest);
694 }
695 
696 /* Deletes edge E from a branch if possible.  Unless REALLY_DELETE is set,
697    just test whether it is possible to remove the edge.  */
698 static bool
loop_delete_branch_edge(edge e,int really_delete)699 loop_delete_branch_edge (edge e, int really_delete)
700 {
701   basic_block src = e->src;
702   basic_block newdest;
703   int irr;
704   edge snd;
705 
706   gcc_assert (EDGE_COUNT (src->succs) > 1);
707 
708   /* Cannot handle more than two exit edges.  */
709   if (EDGE_COUNT (src->succs) > 2)
710     return false;
711   /* And it must be just a simple branch.  */
712   if (!any_condjump_p (BB_END (src)))
713     return false;
714 
715   snd = e == EDGE_SUCC (src, 0) ? EDGE_SUCC (src, 1) : EDGE_SUCC (src, 0);
716   newdest = snd->dest;
717   if (newdest == EXIT_BLOCK_PTR)
718     return false;
719 
720   /* Hopefully the above conditions should suffice.  */
721   if (!really_delete)
722     return true;
723 
724   /* Redirecting behaves wrongly wrto this flag.  */
725   irr = snd->flags & EDGE_IRREDUCIBLE_LOOP;
726 
727   if (!redirect_edge_and_branch (e, newdest))
728     return false;
729   single_succ_edge (src)->flags &= ~EDGE_IRREDUCIBLE_LOOP;
730   single_succ_edge (src)->flags |= irr;
731 
732   return true;
733 }
734 
735 /* Check whether LOOP's body can be duplicated.  */
736 bool
can_duplicate_loop_p(struct loop * loop)737 can_duplicate_loop_p (struct loop *loop)
738 {
739   int ret;
740   basic_block *bbs = get_loop_body (loop);
741 
742   ret = can_copy_bbs_p (bbs, loop->num_nodes);
743   free (bbs);
744 
745   return ret;
746 }
747 
748 /* The NBBS blocks in BBS will get duplicated and the copies will be placed
749    to LOOP.  Update the single_exit information in superloops of LOOP.  */
750 
751 static void
update_single_exits_after_duplication(basic_block * bbs,unsigned nbbs,struct loop * loop)752 update_single_exits_after_duplication (basic_block *bbs, unsigned nbbs,
753 				       struct loop *loop)
754 {
755   unsigned i;
756 
757   for (i = 0; i < nbbs; i++)
758     bbs[i]->flags |= BB_DUPLICATED;
759 
760   for (; loop->outer; loop = loop->outer)
761     {
762       if (!loop->single_exit)
763 	continue;
764 
765       if (loop->single_exit->src->flags & BB_DUPLICATED)
766 	loop->single_exit = NULL;
767     }
768 
769   for (i = 0; i < nbbs; i++)
770     bbs[i]->flags &= ~BB_DUPLICATED;
771 }
772 
773 /* Duplicates body of LOOP to given edge E NDUPL times.  Takes care of updating
774    LOOPS structure and dominators.  E's destination must be LOOP header for
775    this to work, i.e. it must be entry or latch edge of this loop; these are
776    unique, as the loops must have preheaders for this function to work
777    correctly (in case E is latch, the function unrolls the loop, if E is entry
778    edge, it peels the loop).  Store edges created by copying ORIG edge from
779    copies corresponding to set bits in WONT_EXIT bitmap (bit 0 corresponds to
780    original LOOP body, the other copies are numbered in order given by control
781    flow through them) into TO_REMOVE array.  Returns false if duplication is
782    impossible.  */
783 bool
duplicate_loop_to_header_edge(struct loop * loop,edge e,struct loops * loops,unsigned int ndupl,sbitmap wont_exit,edge orig,edge * to_remove,unsigned int * n_to_remove,int flags)784 duplicate_loop_to_header_edge (struct loop *loop, edge e, struct loops *loops,
785 			       unsigned int ndupl, sbitmap wont_exit,
786 			       edge orig, edge *to_remove,
787 			       unsigned int *n_to_remove, int flags)
788 {
789   struct loop *target, *aloop;
790   struct loop **orig_loops;
791   unsigned n_orig_loops;
792   basic_block header = loop->header, latch = loop->latch;
793   basic_block *new_bbs, *bbs, *first_active;
794   basic_block new_bb, bb, first_active_latch = NULL;
795   edge ae, latch_edge;
796   edge spec_edges[2], new_spec_edges[2];
797 #define SE_LATCH 0
798 #define SE_ORIG 1
799   unsigned i, j, n;
800   int is_latch = (latch == e->src);
801   int scale_act = 0, *scale_step = NULL, scale_main = 0;
802   int p, freq_in, freq_le, freq_out_orig;
803   int prob_pass_thru, prob_pass_wont_exit, prob_pass_main;
804   int add_irreducible_flag;
805   basic_block place_after;
806 
807   gcc_assert (e->dest == loop->header);
808   gcc_assert (ndupl > 0);
809 
810   if (orig)
811     {
812       /* Orig must be edge out of the loop.  */
813       gcc_assert (flow_bb_inside_loop_p (loop, orig->src));
814       gcc_assert (!flow_bb_inside_loop_p (loop, orig->dest));
815     }
816 
817   n = loop->num_nodes;
818   bbs = get_loop_body_in_dom_order (loop);
819   gcc_assert (bbs[0] == loop->header);
820   gcc_assert (bbs[n  - 1] == loop->latch);
821 
822   /* Check whether duplication is possible.  */
823   if (!can_copy_bbs_p (bbs, loop->num_nodes))
824     {
825       free (bbs);
826       return false;
827     }
828   new_bbs = XNEWVEC (basic_block, loop->num_nodes);
829 
830   /* In case we are doing loop peeling and the loop is in the middle of
831      irreducible region, the peeled copies will be inside it too.  */
832   add_irreducible_flag = e->flags & EDGE_IRREDUCIBLE_LOOP;
833   gcc_assert (!is_latch || !add_irreducible_flag);
834 
835   /* Find edge from latch.  */
836   latch_edge = loop_latch_edge (loop);
837 
838   if (flags & DLTHE_FLAG_UPDATE_FREQ)
839     {
840       /* Calculate coefficients by that we have to scale frequencies
841 	 of duplicated loop bodies.  */
842       freq_in = header->frequency;
843       freq_le = EDGE_FREQUENCY (latch_edge);
844       if (freq_in == 0)
845 	freq_in = 1;
846       if (freq_in < freq_le)
847 	freq_in = freq_le;
848       freq_out_orig = orig ? EDGE_FREQUENCY (orig) : freq_in - freq_le;
849       if (freq_out_orig > freq_in - freq_le)
850 	freq_out_orig = freq_in - freq_le;
851       prob_pass_thru = RDIV (REG_BR_PROB_BASE * freq_le, freq_in);
852       prob_pass_wont_exit =
853 	      RDIV (REG_BR_PROB_BASE * (freq_le + freq_out_orig), freq_in);
854 
855       scale_step = XNEWVEC (int, ndupl);
856 
857 	for (i = 1; i <= ndupl; i++)
858 	  scale_step[i - 1] = TEST_BIT (wont_exit, i)
859 				? prob_pass_wont_exit
860 				: prob_pass_thru;
861 
862       /* Complete peeling is special as the probability of exit in last
863 	 copy becomes 1.  */
864       if (flags & DLTHE_FLAG_COMPLETTE_PEEL)
865 	{
866 	  int wanted_freq = EDGE_FREQUENCY (e);
867 
868 	  if (wanted_freq > freq_in)
869 	    wanted_freq = freq_in;
870 
871 	  gcc_assert (!is_latch);
872 	  /* First copy has frequency of incoming edge.  Each subsequent
873 	     frequency should be reduced by prob_pass_wont_exit.  Caller
874 	     should've managed the flags so all except for original loop
875 	     has won't exist set.  */
876 	  scale_act = RDIV (wanted_freq * REG_BR_PROB_BASE, freq_in);
877 	  /* Now simulate the duplication adjustments and compute header
878 	     frequency of the last copy.  */
879 	  for (i = 0; i < ndupl; i++)
880 	    wanted_freq = RDIV (wanted_freq * scale_step[i], REG_BR_PROB_BASE);
881 	  scale_main = RDIV (wanted_freq * REG_BR_PROB_BASE, freq_in);
882 	}
883       else if (is_latch)
884 	{
885 	  prob_pass_main = TEST_BIT (wont_exit, 0)
886 				? prob_pass_wont_exit
887 				: prob_pass_thru;
888 	  p = prob_pass_main;
889 	  scale_main = REG_BR_PROB_BASE;
890 	  for (i = 0; i < ndupl; i++)
891 	    {
892 	      scale_main += p;
893 	      p = RDIV (p * scale_step[i], REG_BR_PROB_BASE);
894 	    }
895 	  scale_main = RDIV (REG_BR_PROB_BASE * REG_BR_PROB_BASE, scale_main);
896 	  scale_act = RDIV (scale_main * prob_pass_main, REG_BR_PROB_BASE);
897 	}
898       else
899 	{
900 	  scale_main = REG_BR_PROB_BASE;
901 	  for (i = 0; i < ndupl; i++)
902 	    scale_main = RDIV (scale_main * scale_step[i], REG_BR_PROB_BASE);
903 	  scale_act = REG_BR_PROB_BASE - prob_pass_thru;
904 	}
905       for (i = 0; i < ndupl; i++)
906 	gcc_assert (scale_step[i] >= 0 && scale_step[i] <= REG_BR_PROB_BASE);
907       gcc_assert (scale_main >= 0 && scale_main <= REG_BR_PROB_BASE
908 		  && scale_act >= 0  && scale_act <= REG_BR_PROB_BASE);
909     }
910 
911   /* Loop the new bbs will belong to.  */
912   target = e->src->loop_father;
913 
914   /* Original loops.  */
915   n_orig_loops = 0;
916   for (aloop = loop->inner; aloop; aloop = aloop->next)
917     n_orig_loops++;
918   orig_loops = XCNEWVEC (struct loop *, n_orig_loops);
919   for (aloop = loop->inner, i = 0; aloop; aloop = aloop->next, i++)
920     orig_loops[i] = aloop;
921 
922   loop->copy = target;
923 
924   first_active = XNEWVEC (basic_block, n);
925   if (is_latch)
926     {
927       memcpy (first_active, bbs, n * sizeof (basic_block));
928       first_active_latch = latch;
929     }
930 
931   /* Update the information about single exits.  */
932   if (loops->state & LOOPS_HAVE_MARKED_SINGLE_EXITS)
933     update_single_exits_after_duplication (bbs, n, target);
934 
935   /* Record exit edge in original loop body.  */
936   if (orig && TEST_BIT (wont_exit, 0))
937     to_remove[(*n_to_remove)++] = orig;
938 
939   spec_edges[SE_ORIG] = orig;
940   spec_edges[SE_LATCH] = latch_edge;
941 
942   place_after = e->src;
943   for (j = 0; j < ndupl; j++)
944     {
945       /* Copy loops.  */
946       copy_loops_to (loops, orig_loops, n_orig_loops, target);
947 
948       /* Copy bbs.  */
949       copy_bbs (bbs, n, new_bbs, spec_edges, 2, new_spec_edges, loop,
950 		place_after);
951       place_after = new_spec_edges[SE_LATCH]->src;
952 
953       if (flags & DLTHE_RECORD_COPY_NUMBER)
954 	for (i = 0; i < n; i++)
955 	  {
956 	    gcc_assert (!new_bbs[i]->aux);
957 	    new_bbs[i]->aux = (void *)(size_t)(j + 1);
958 	  }
959 
960       /* Note whether the blocks and edges belong to an irreducible loop.  */
961       if (add_irreducible_flag)
962 	{
963 	  for (i = 0; i < n; i++)
964 	    new_bbs[i]->flags |= BB_DUPLICATED;
965 	  for (i = 0; i < n; i++)
966 	    {
967 	      edge_iterator ei;
968 	      new_bb = new_bbs[i];
969 	      if (new_bb->loop_father == target)
970 		new_bb->flags |= BB_IRREDUCIBLE_LOOP;
971 
972 	      FOR_EACH_EDGE (ae, ei, new_bb->succs)
973 		if ((ae->dest->flags & BB_DUPLICATED)
974 		    && (ae->src->loop_father == target
975 			|| ae->dest->loop_father == target))
976 		  ae->flags |= EDGE_IRREDUCIBLE_LOOP;
977 	    }
978 	  for (i = 0; i < n; i++)
979 	    new_bbs[i]->flags &= ~BB_DUPLICATED;
980 	}
981 
982       /* Redirect the special edges.  */
983       if (is_latch)
984 	{
985 	  redirect_edge_and_branch_force (latch_edge, new_bbs[0]);
986 	  redirect_edge_and_branch_force (new_spec_edges[SE_LATCH],
987 					  loop->header);
988 	  set_immediate_dominator (CDI_DOMINATORS, new_bbs[0], latch);
989 	  latch = loop->latch = new_bbs[n - 1];
990 	  e = latch_edge = new_spec_edges[SE_LATCH];
991 	}
992       else
993 	{
994 	  redirect_edge_and_branch_force (new_spec_edges[SE_LATCH],
995 					  loop->header);
996 	  redirect_edge_and_branch_force (e, new_bbs[0]);
997 	  set_immediate_dominator (CDI_DOMINATORS, new_bbs[0], e->src);
998 	  e = new_spec_edges[SE_LATCH];
999 	}
1000 
1001       /* Record exit edge in this copy.  */
1002       if (orig && TEST_BIT (wont_exit, j + 1))
1003 	to_remove[(*n_to_remove)++] = new_spec_edges[SE_ORIG];
1004 
1005       /* Record the first copy in the control flow order if it is not
1006 	 the original loop (i.e. in case of peeling).  */
1007       if (!first_active_latch)
1008 	{
1009 	  memcpy (first_active, new_bbs, n * sizeof (basic_block));
1010 	  first_active_latch = new_bbs[n - 1];
1011 	}
1012 
1013       /* Set counts and frequencies.  */
1014       if (flags & DLTHE_FLAG_UPDATE_FREQ)
1015 	{
1016 	  scale_bbs_frequencies_int (new_bbs, n, scale_act, REG_BR_PROB_BASE);
1017 	  scale_act = RDIV (scale_act * scale_step[j], REG_BR_PROB_BASE);
1018 	}
1019     }
1020   free (new_bbs);
1021   free (orig_loops);
1022 
1023   /* Update the original loop.  */
1024   if (!is_latch)
1025     set_immediate_dominator (CDI_DOMINATORS, e->dest, e->src);
1026   if (flags & DLTHE_FLAG_UPDATE_FREQ)
1027     {
1028       scale_bbs_frequencies_int (bbs, n, scale_main, REG_BR_PROB_BASE);
1029       free (scale_step);
1030     }
1031 
1032   /* Update dominators of outer blocks if affected.  */
1033   for (i = 0; i < n; i++)
1034     {
1035       basic_block dominated, dom_bb, *dom_bbs;
1036       int n_dom_bbs,j;
1037 
1038       bb = bbs[i];
1039       bb->aux = 0;
1040 
1041       n_dom_bbs = get_dominated_by (CDI_DOMINATORS, bb, &dom_bbs);
1042       for (j = 0; j < n_dom_bbs; j++)
1043 	{
1044 	  dominated = dom_bbs[j];
1045 	  if (flow_bb_inside_loop_p (loop, dominated))
1046 	    continue;
1047 	  dom_bb = nearest_common_dominator (
1048 			CDI_DOMINATORS, first_active[i], first_active_latch);
1049 	  set_immediate_dominator (CDI_DOMINATORS, dominated, dom_bb);
1050 	}
1051       free (dom_bbs);
1052     }
1053   free (first_active);
1054 
1055   free (bbs);
1056 
1057   return true;
1058 }
1059 
1060 /* A callback for make_forwarder block, to redirect all edges except for
1061    MFB_KJ_EDGE to the entry part.  E is the edge for that we should decide
1062    whether to redirect it.  */
1063 
1064 static edge mfb_kj_edge;
1065 static bool
mfb_keep_just(edge e)1066 mfb_keep_just (edge e)
1067 {
1068   return e != mfb_kj_edge;
1069 }
1070 
1071 /* A callback for make_forwarder block, to update data structures for a basic
1072    block JUMP created by redirecting an edge (only the latch edge is being
1073    redirected).  */
1074 
1075 static void
mfb_update_loops(basic_block jump)1076 mfb_update_loops (basic_block jump)
1077 {
1078   struct loop *loop = single_succ (jump)->loop_father;
1079 
1080   if (dom_computed[CDI_DOMINATORS])
1081     set_immediate_dominator (CDI_DOMINATORS, jump, single_pred (jump));
1082   add_bb_to_loop (jump, loop);
1083   loop->latch = jump;
1084 }
1085 
1086 /* Creates a pre-header for a LOOP.  Returns newly created block.  Unless
1087    CP_SIMPLE_PREHEADERS is set in FLAGS, we only force LOOP to have single
1088    entry; otherwise we also force preheader block to have only one successor.
1089    The function also updates dominators.  */
1090 
1091 static basic_block
create_preheader(struct loop * loop,int flags)1092 create_preheader (struct loop *loop, int flags)
1093 {
1094   edge e, fallthru;
1095   basic_block dummy;
1096   struct loop *cloop, *ploop;
1097   int nentry = 0;
1098   bool irred = false;
1099   bool latch_edge_was_fallthru;
1100   edge one_succ_pred = 0;
1101   edge_iterator ei;
1102 
1103   cloop = loop->outer;
1104 
1105   FOR_EACH_EDGE (e, ei, loop->header->preds)
1106     {
1107       if (e->src == loop->latch)
1108 	continue;
1109       irred |= (e->flags & EDGE_IRREDUCIBLE_LOOP) != 0;
1110       nentry++;
1111       if (single_succ_p (e->src))
1112 	one_succ_pred = e;
1113     }
1114   gcc_assert (nentry);
1115   if (nentry == 1)
1116     {
1117       /* Get an edge that is different from the one from loop->latch
1118 	 to loop->header.  */
1119       e = EDGE_PRED (loop->header,
1120 		     EDGE_PRED (loop->header, 0)->src == loop->latch);
1121 
1122       if (!(flags & CP_SIMPLE_PREHEADERS) || single_succ_p (e->src))
1123 	return NULL;
1124     }
1125 
1126   mfb_kj_edge = loop_latch_edge (loop);
1127   latch_edge_was_fallthru = (mfb_kj_edge->flags & EDGE_FALLTHRU) != 0;
1128   fallthru = make_forwarder_block (loop->header, mfb_keep_just,
1129 				   mfb_update_loops);
1130   dummy = fallthru->src;
1131   loop->header = fallthru->dest;
1132 
1133   /* The header could be a latch of some superloop(s); due to design of
1134      split_block, it would now move to fallthru->dest.  */
1135   for (ploop = loop; ploop; ploop = ploop->outer)
1136     if (ploop->latch == dummy)
1137       ploop->latch = fallthru->dest;
1138 
1139   /* Try to be clever in placing the newly created preheader.  The idea is to
1140      avoid breaking any "fallthruness" relationship between blocks.
1141 
1142      The preheader was created just before the header and all incoming edges
1143      to the header were redirected to the preheader, except the latch edge.
1144      So the only problematic case is when this latch edge was a fallthru
1145      edge: it is not anymore after the preheader creation so we have broken
1146      the fallthruness.  We're therefore going to look for a better place.  */
1147   if (latch_edge_was_fallthru)
1148     {
1149       if (one_succ_pred)
1150 	e = one_succ_pred;
1151       else
1152 	e = EDGE_PRED (dummy, 0);
1153 
1154       move_block_after (dummy, e->src);
1155     }
1156 
1157   loop->header->loop_father = loop;
1158   add_bb_to_loop (dummy, cloop);
1159 
1160   if (irred)
1161     {
1162       dummy->flags |= BB_IRREDUCIBLE_LOOP;
1163       single_succ_edge (dummy)->flags |= EDGE_IRREDUCIBLE_LOOP;
1164     }
1165 
1166   if (dump_file)
1167     fprintf (dump_file, "Created preheader block for loop %i\n",
1168 	     loop->num);
1169 
1170   return dummy;
1171 }
1172 
1173 /* Create preheaders for each loop from loop tree stored in LOOPS; for meaning
1174    of FLAGS see create_preheader.  */
1175 void
create_preheaders(struct loops * loops,int flags)1176 create_preheaders (struct loops *loops, int flags)
1177 {
1178   unsigned i;
1179   for (i = 1; i < loops->num; i++)
1180     create_preheader (loops->parray[i], flags);
1181   loops->state |= LOOPS_HAVE_PREHEADERS;
1182 }
1183 
1184 /* Forces all loop latches of loops from loop tree LOOPS to have only single
1185    successor.  */
1186 void
force_single_succ_latches(struct loops * loops)1187 force_single_succ_latches (struct loops *loops)
1188 {
1189   unsigned i;
1190   struct loop *loop;
1191   edge e;
1192 
1193   for (i = 1; i < loops->num; i++)
1194     {
1195       loop = loops->parray[i];
1196       if (loop->latch != loop->header && single_succ_p (loop->latch))
1197 	continue;
1198 
1199       e = find_edge (loop->latch, loop->header);
1200 
1201       loop_split_edge_with (e, NULL_RTX);
1202     }
1203   loops->state |= LOOPS_HAVE_SIMPLE_LATCHES;
1204 }
1205 
1206 /* A quite stupid function to put INSNS on edge E. They are supposed to form
1207    just one basic block.  Jumps in INSNS are not handled, so cfg do not have to
1208    be ok after this function.  The created block is placed on correct place
1209    in LOOPS structure and its dominator is set.  */
1210 basic_block
loop_split_edge_with(edge e,rtx insns)1211 loop_split_edge_with (edge e, rtx insns)
1212 {
1213   basic_block src, dest, new_bb;
1214   struct loop *loop_c;
1215 
1216   src = e->src;
1217   dest = e->dest;
1218 
1219   loop_c = find_common_loop (src->loop_father, dest->loop_father);
1220 
1221   /* Create basic block for it.  */
1222 
1223   new_bb = split_edge (e);
1224   add_bb_to_loop (new_bb, loop_c);
1225   new_bb->flags |= (insns ? BB_SUPERBLOCK : 0);
1226 
1227   if (insns)
1228     emit_insn_after (insns, BB_END (new_bb));
1229 
1230   if (dest->loop_father->latch == src)
1231     dest->loop_father->latch = new_bb;
1232 
1233   return new_bb;
1234 }
1235 
1236 /* This function is called from loop_version.  It splits the entry edge
1237    of the loop we want to version, adds the versioning condition, and
1238    adjust the edges to the two versions of the loop appropriately.
1239    e is an incoming edge. Returns the basic block containing the
1240    condition.
1241 
1242    --- edge e ---- > [second_head]
1243 
1244    Split it and insert new conditional expression and adjust edges.
1245 
1246     --- edge e ---> [cond expr] ---> [first_head]
1247 			|
1248 			+---------> [second_head]
1249 */
1250 
1251 static basic_block
lv_adjust_loop_entry_edge(basic_block first_head,basic_block second_head,edge e,void * cond_expr)1252 lv_adjust_loop_entry_edge (basic_block first_head,
1253 			   basic_block second_head,
1254 			   edge e,
1255 			   void *cond_expr)
1256 {
1257   basic_block new_head = NULL;
1258   edge e1;
1259 
1260   gcc_assert (e->dest == second_head);
1261 
1262   /* Split edge 'e'. This will create a new basic block, where we can
1263      insert conditional expr.  */
1264   new_head = split_edge (e);
1265 
1266 
1267   lv_add_condition_to_bb (first_head, second_head, new_head,
1268 			  cond_expr);
1269 
1270   /* Don't set EDGE_TRUE_VALUE in RTL mode, as it's invalid there.  */
1271   e1 = make_edge (new_head, first_head, ir_type () ? EDGE_TRUE_VALUE : 0);
1272   set_immediate_dominator (CDI_DOMINATORS, first_head, new_head);
1273   set_immediate_dominator (CDI_DOMINATORS, second_head, new_head);
1274 
1275   /* Adjust loop header phi nodes.  */
1276   lv_adjust_loop_header_phi (first_head, second_head, new_head, e1);
1277 
1278   return new_head;
1279 }
1280 
1281 /* Main entry point for Loop Versioning transformation.
1282 
1283    This transformation given a condition and a loop, creates
1284    -if (condition) { loop_copy1 } else { loop_copy2 },
1285    where loop_copy1 is the loop transformed in one way, and loop_copy2
1286    is the loop transformed in another way (or unchanged). 'condition'
1287    may be a run time test for things that were not resolved by static
1288    analysis (overlapping ranges (anti-aliasing), alignment, etc.).
1289 
1290    If PLACE_AFTER is true, we place the new loop after LOOP in the
1291    instruction stream, otherwise it is placed before LOOP.  */
1292 
1293 struct loop *
loop_version(struct loops * loops,struct loop * loop,void * cond_expr,basic_block * condition_bb,bool place_after)1294 loop_version (struct loops *loops, struct loop * loop,
1295 	      void *cond_expr, basic_block *condition_bb,
1296 	      bool place_after)
1297 {
1298   basic_block first_head, second_head;
1299   edge entry, latch_edge, exit, true_edge, false_edge;
1300   int irred_flag;
1301   struct loop *nloop;
1302   basic_block cond_bb;
1303 
1304   /* CHECKME: Loop versioning does not handle nested loop at this point.  */
1305   if (loop->inner)
1306     return NULL;
1307 
1308   /* Record entry and latch edges for the loop */
1309   entry = loop_preheader_edge (loop);
1310   irred_flag = entry->flags & EDGE_IRREDUCIBLE_LOOP;
1311   entry->flags &= ~EDGE_IRREDUCIBLE_LOOP;
1312 
1313   /* Note down head of loop as first_head.  */
1314   first_head = entry->dest;
1315 
1316   /* Duplicate loop.  */
1317   if (!cfg_hook_duplicate_loop_to_header_edge (loop, entry, loops, 1,
1318 					       NULL, NULL, NULL, NULL, 0))
1319     return NULL;
1320 
1321   /* After duplication entry edge now points to new loop head block.
1322      Note down new head as second_head.  */
1323   second_head = entry->dest;
1324 
1325   /* Split loop entry edge and insert new block with cond expr.  */
1326   cond_bb =  lv_adjust_loop_entry_edge (first_head, second_head,
1327 					entry, cond_expr);
1328   if (condition_bb)
1329     *condition_bb = cond_bb;
1330 
1331   if (!cond_bb)
1332     {
1333       entry->flags |= irred_flag;
1334       return NULL;
1335     }
1336 
1337   latch_edge = single_succ_edge (get_bb_copy (loop->latch));
1338 
1339   extract_cond_bb_edges (cond_bb, &true_edge, &false_edge);
1340   nloop = loopify (loops,
1341 		   latch_edge,
1342 		   single_pred_edge (get_bb_copy (loop->header)),
1343 		   cond_bb, true_edge, false_edge,
1344 		   false /* Do not redirect all edges.  */);
1345 
1346   exit = loop->single_exit;
1347   if (exit)
1348     nloop->single_exit = find_edge (get_bb_copy (exit->src), exit->dest);
1349 
1350   /* loopify redirected latch_edge. Update its PENDING_STMTS.  */
1351   lv_flush_pending_stmts (latch_edge);
1352 
1353   /* loopify redirected condition_bb's succ edge. Update its PENDING_STMTS.  */
1354   extract_cond_bb_edges (cond_bb, &true_edge, &false_edge);
1355   lv_flush_pending_stmts (false_edge);
1356   /* Adjust irreducible flag.  */
1357   if (irred_flag)
1358     {
1359       cond_bb->flags |= BB_IRREDUCIBLE_LOOP;
1360       loop_preheader_edge (loop)->flags |= EDGE_IRREDUCIBLE_LOOP;
1361       loop_preheader_edge (nloop)->flags |= EDGE_IRREDUCIBLE_LOOP;
1362       single_pred_edge (cond_bb)->flags |= EDGE_IRREDUCIBLE_LOOP;
1363     }
1364 
1365   if (place_after)
1366     {
1367       basic_block *bbs = get_loop_body_in_dom_order (nloop), after;
1368       unsigned i;
1369 
1370       after = loop->latch;
1371 
1372       for (i = 0; i < nloop->num_nodes; i++)
1373 	{
1374 	  move_block_after (bbs[i], after);
1375 	  after = bbs[i];
1376 	}
1377       free (bbs);
1378     }
1379 
1380   /* At this point condition_bb is loop predheader with two successors,
1381      first_head and second_head.   Make sure that loop predheader has only
1382      one successor.  */
1383   loop_split_edge_with (loop_preheader_edge (loop), NULL);
1384   loop_split_edge_with (loop_preheader_edge (nloop), NULL);
1385 
1386   return nloop;
1387 }
1388 
1389 /* The structure of LOOPS might have changed.  Some loops might get removed
1390    (and their headers and latches were set to NULL), loop exists might get
1391    removed (thus the loop nesting may be wrong), and some blocks and edges
1392    were changed (so the information about bb --> loop mapping does not have
1393    to be correct).  But still for the remaining loops the header dominates
1394    the latch, and loops did not get new subloobs (new loops might possibly
1395    get created, but we are not interested in them).  Fix up the mess.
1396 
1397    If CHANGED_BBS is not NULL, basic blocks whose loop has changed are
1398    marked in it.  */
1399 
1400 void
fix_loop_structure(struct loops * loops,bitmap changed_bbs)1401 fix_loop_structure (struct loops *loops, bitmap changed_bbs)
1402 {
1403   basic_block bb;
1404   struct loop *loop, *ploop;
1405   unsigned i;
1406 
1407   /* Remove the old bb -> loop mapping.  */
1408   FOR_EACH_BB (bb)
1409     {
1410       bb->aux = (void *) (size_t) bb->loop_father->depth;
1411       bb->loop_father = loops->tree_root;
1412     }
1413 
1414   /* Remove the dead loops from structures.  */
1415   loops->tree_root->num_nodes = n_basic_blocks;
1416   for (i = 1; i < loops->num; i++)
1417     {
1418       loop = loops->parray[i];
1419       if (!loop)
1420 	continue;
1421 
1422       loop->num_nodes = 0;
1423       if (loop->header)
1424 	continue;
1425 
1426       while (loop->inner)
1427 	{
1428 	  ploop = loop->inner;
1429 	  flow_loop_tree_node_remove (ploop);
1430 	  flow_loop_tree_node_add (loop->outer, ploop);
1431 	}
1432 
1433       /* Remove the loop and free its data.  */
1434       flow_loop_tree_node_remove (loop);
1435       loops->parray[loop->num] = NULL;
1436       flow_loop_free (loop);
1437     }
1438 
1439   /* Rescan the bodies of loops, starting from the outermost.  */
1440   loop = loops->tree_root;
1441   while (1)
1442     {
1443       if (loop->inner)
1444 	loop = loop->inner;
1445       else
1446 	{
1447 	  while (!loop->next
1448 		 && loop != loops->tree_root)
1449 	    loop = loop->outer;
1450 	  if (loop == loops->tree_root)
1451 	    break;
1452 
1453 	  loop = loop->next;
1454 	}
1455 
1456       loop->num_nodes = flow_loop_nodes_find (loop->header, loop);
1457     }
1458 
1459   /* Now fix the loop nesting.  */
1460   for (i = 1; i < loops->num; i++)
1461     {
1462       loop = loops->parray[i];
1463       if (!loop)
1464 	continue;
1465 
1466       bb = loop_preheader_edge (loop)->src;
1467       if (bb->loop_father != loop->outer)
1468 	{
1469 	  flow_loop_tree_node_remove (loop);
1470 	  flow_loop_tree_node_add (bb->loop_father, loop);
1471 	}
1472     }
1473 
1474   /* Mark the blocks whose loop has changed.  */
1475   FOR_EACH_BB (bb)
1476     {
1477       if (changed_bbs
1478 	  && (void *) (size_t) bb->loop_father->depth != bb->aux)
1479 	bitmap_set_bit (changed_bbs, bb->index);
1480 
1481       bb->aux = NULL;
1482     }
1483 
1484   if (loops->state & LOOPS_HAVE_MARKED_SINGLE_EXITS)
1485     mark_single_exit_loops (loops);
1486   if (loops->state & LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS)
1487     mark_irreducible_loops (loops);
1488 }
1489