xref: /dflybsd-src/contrib/gcc-4.7/gcc/cfgloopmanip.c (revision 04febcfb30580676d3e95f58a16c5137ee478b32)
1*e4b17023SJohn Marino /* Loop manipulation code for GNU compiler.
2*e4b17023SJohn Marino    Copyright (C) 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010, 2011
3*e4b17023SJohn Marino    Free Software Foundation, Inc.
4*e4b17023SJohn Marino 
5*e4b17023SJohn Marino This file is part of GCC.
6*e4b17023SJohn Marino 
7*e4b17023SJohn Marino GCC is free software; you can redistribute it and/or modify it under
8*e4b17023SJohn Marino the terms of the GNU General Public License as published by the Free
9*e4b17023SJohn Marino Software Foundation; either version 3, or (at your option) any later
10*e4b17023SJohn Marino version.
11*e4b17023SJohn Marino 
12*e4b17023SJohn Marino GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13*e4b17023SJohn Marino WARRANTY; without even the implied warranty of MERCHANTABILITY or
14*e4b17023SJohn Marino FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15*e4b17023SJohn Marino for more details.
16*e4b17023SJohn Marino 
17*e4b17023SJohn Marino You should have received a copy of the GNU General Public License
18*e4b17023SJohn Marino along with GCC; see the file COPYING3.  If not see
19*e4b17023SJohn Marino <http://www.gnu.org/licenses/>.  */
20*e4b17023SJohn Marino 
21*e4b17023SJohn Marino #include "config.h"
22*e4b17023SJohn Marino #include "system.h"
23*e4b17023SJohn Marino #include "coretypes.h"
24*e4b17023SJohn Marino #include "tm.h"
25*e4b17023SJohn Marino #include "rtl.h"
26*e4b17023SJohn Marino #include "hard-reg-set.h"
27*e4b17023SJohn Marino #include "obstack.h"
28*e4b17023SJohn Marino #include "basic-block.h"
29*e4b17023SJohn Marino #include "cfgloop.h"
30*e4b17023SJohn Marino #include "cfglayout.h"
31*e4b17023SJohn Marino #include "cfghooks.h"
32*e4b17023SJohn Marino #include "output.h"
33*e4b17023SJohn Marino #include "tree-flow.h"
34*e4b17023SJohn Marino 
35*e4b17023SJohn Marino static void copy_loops_to (struct loop **, int,
36*e4b17023SJohn Marino 			   struct loop *);
37*e4b17023SJohn Marino static void loop_redirect_edge (edge, basic_block);
38*e4b17023SJohn Marino static void remove_bbs (basic_block *, int);
39*e4b17023SJohn Marino static bool rpe_enum_p (const_basic_block, const void *);
40*e4b17023SJohn Marino static int find_path (edge, basic_block **);
41*e4b17023SJohn Marino static void fix_loop_placements (struct loop *, bool *);
42*e4b17023SJohn Marino static bool fix_bb_placement (basic_block);
43*e4b17023SJohn Marino static void fix_bb_placements (basic_block, bool *);
44*e4b17023SJohn Marino static void unloop (struct loop *, bool *);
45*e4b17023SJohn Marino 
46*e4b17023SJohn Marino #define RDIV(X,Y) (((X) + (Y) / 2) / (Y))
47*e4b17023SJohn Marino 
48*e4b17023SJohn Marino /* Checks whether basic block BB is dominated by DATA.  */
49*e4b17023SJohn Marino static bool
rpe_enum_p(const_basic_block bb,const void * data)50*e4b17023SJohn Marino rpe_enum_p (const_basic_block bb, const void *data)
51*e4b17023SJohn Marino {
52*e4b17023SJohn Marino   return dominated_by_p (CDI_DOMINATORS, bb, (const_basic_block) data);
53*e4b17023SJohn Marino }
54*e4b17023SJohn Marino 
55*e4b17023SJohn Marino /* Remove basic blocks BBS.  NBBS is the number of the basic blocks.  */
56*e4b17023SJohn Marino 
57*e4b17023SJohn Marino static void
remove_bbs(basic_block * bbs,int nbbs)58*e4b17023SJohn Marino remove_bbs (basic_block *bbs, int nbbs)
59*e4b17023SJohn Marino {
60*e4b17023SJohn Marino   int i;
61*e4b17023SJohn Marino 
62*e4b17023SJohn Marino   for (i = 0; i < nbbs; i++)
63*e4b17023SJohn Marino     delete_basic_block (bbs[i]);
64*e4b17023SJohn Marino }
65*e4b17023SJohn Marino 
66*e4b17023SJohn Marino /* Find path -- i.e. the basic blocks dominated by edge E and put them
67*e4b17023SJohn Marino    into array BBS, that will be allocated large enough to contain them.
68*e4b17023SJohn Marino    E->dest must have exactly one predecessor for this to work (it is
69*e4b17023SJohn Marino    easy to achieve and we do not put it here because we do not want to
70*e4b17023SJohn Marino    alter anything by this function).  The number of basic blocks in the
71*e4b17023SJohn Marino    path is returned.  */
72*e4b17023SJohn Marino static int
find_path(edge e,basic_block ** bbs)73*e4b17023SJohn Marino find_path (edge e, basic_block **bbs)
74*e4b17023SJohn Marino {
75*e4b17023SJohn Marino   gcc_assert (EDGE_COUNT (e->dest->preds) <= 1);
76*e4b17023SJohn Marino 
77*e4b17023SJohn Marino   /* Find bbs in the path.  */
78*e4b17023SJohn Marino   *bbs = XCNEWVEC (basic_block, n_basic_blocks);
79*e4b17023SJohn Marino   return dfs_enumerate_from (e->dest, 0, rpe_enum_p, *bbs,
80*e4b17023SJohn Marino 			     n_basic_blocks, e->dest);
81*e4b17023SJohn Marino }
82*e4b17023SJohn Marino 
83*e4b17023SJohn Marino /* Fix placement of basic block BB inside loop hierarchy --
84*e4b17023SJohn Marino    Let L be a loop to that BB belongs.  Then every successor of BB must either
85*e4b17023SJohn Marino      1) belong to some superloop of loop L, or
86*e4b17023SJohn Marino      2) be a header of loop K such that K->outer is superloop of L
87*e4b17023SJohn Marino    Returns true if we had to move BB into other loop to enforce this condition,
88*e4b17023SJohn Marino    false if the placement of BB was already correct (provided that placements
89*e4b17023SJohn Marino    of its successors are correct).  */
90*e4b17023SJohn Marino static bool
fix_bb_placement(basic_block bb)91*e4b17023SJohn Marino fix_bb_placement (basic_block bb)
92*e4b17023SJohn Marino {
93*e4b17023SJohn Marino   edge e;
94*e4b17023SJohn Marino   edge_iterator ei;
95*e4b17023SJohn Marino   struct loop *loop = current_loops->tree_root, *act;
96*e4b17023SJohn Marino 
97*e4b17023SJohn Marino   FOR_EACH_EDGE (e, ei, bb->succs)
98*e4b17023SJohn Marino     {
99*e4b17023SJohn Marino       if (e->dest == EXIT_BLOCK_PTR)
100*e4b17023SJohn Marino 	continue;
101*e4b17023SJohn Marino 
102*e4b17023SJohn Marino       act = e->dest->loop_father;
103*e4b17023SJohn Marino       if (act->header == e->dest)
104*e4b17023SJohn Marino 	act = loop_outer (act);
105*e4b17023SJohn Marino 
106*e4b17023SJohn Marino       if (flow_loop_nested_p (loop, act))
107*e4b17023SJohn Marino 	loop = act;
108*e4b17023SJohn Marino     }
109*e4b17023SJohn Marino 
110*e4b17023SJohn Marino   if (loop == bb->loop_father)
111*e4b17023SJohn Marino     return false;
112*e4b17023SJohn Marino 
113*e4b17023SJohn Marino   remove_bb_from_loops (bb);
114*e4b17023SJohn Marino   add_bb_to_loop (bb, loop);
115*e4b17023SJohn Marino 
116*e4b17023SJohn Marino   return true;
117*e4b17023SJohn Marino }
118*e4b17023SJohn Marino 
119*e4b17023SJohn Marino /* Fix placement of LOOP inside loop tree, i.e. find the innermost superloop
120*e4b17023SJohn Marino    of LOOP to that leads at least one exit edge of LOOP, and set it
121*e4b17023SJohn Marino    as the immediate superloop of LOOP.  Return true if the immediate superloop
122*e4b17023SJohn Marino    of LOOP changed.  */
123*e4b17023SJohn Marino 
124*e4b17023SJohn Marino static bool
fix_loop_placement(struct loop * loop)125*e4b17023SJohn Marino fix_loop_placement (struct loop *loop)
126*e4b17023SJohn Marino {
127*e4b17023SJohn Marino   unsigned i;
128*e4b17023SJohn Marino   edge e;
129*e4b17023SJohn Marino   VEC (edge, heap) *exits = get_loop_exit_edges (loop);
130*e4b17023SJohn Marino   struct loop *father = current_loops->tree_root, *act;
131*e4b17023SJohn Marino   bool ret = false;
132*e4b17023SJohn Marino 
133*e4b17023SJohn Marino   FOR_EACH_VEC_ELT (edge, exits, i, e)
134*e4b17023SJohn Marino     {
135*e4b17023SJohn Marino       act = find_common_loop (loop, e->dest->loop_father);
136*e4b17023SJohn Marino       if (flow_loop_nested_p (father, act))
137*e4b17023SJohn Marino 	father = act;
138*e4b17023SJohn Marino     }
139*e4b17023SJohn Marino 
140*e4b17023SJohn Marino   if (father != loop_outer (loop))
141*e4b17023SJohn Marino     {
142*e4b17023SJohn Marino       for (act = loop_outer (loop); act != father; act = loop_outer (act))
143*e4b17023SJohn Marino 	act->num_nodes -= loop->num_nodes;
144*e4b17023SJohn Marino       flow_loop_tree_node_remove (loop);
145*e4b17023SJohn Marino       flow_loop_tree_node_add (father, loop);
146*e4b17023SJohn Marino 
147*e4b17023SJohn Marino       /* The exit edges of LOOP no longer exits its original immediate
148*e4b17023SJohn Marino 	 superloops; remove them from the appropriate exit lists.  */
149*e4b17023SJohn Marino       FOR_EACH_VEC_ELT (edge, exits, i, e)
150*e4b17023SJohn Marino 	rescan_loop_exit (e, false, false);
151*e4b17023SJohn Marino 
152*e4b17023SJohn Marino       ret = true;
153*e4b17023SJohn Marino     }
154*e4b17023SJohn Marino 
155*e4b17023SJohn Marino   VEC_free (edge, heap, exits);
156*e4b17023SJohn Marino   return ret;
157*e4b17023SJohn Marino }
158*e4b17023SJohn Marino 
159*e4b17023SJohn Marino /* Fix placements of basic blocks inside loop hierarchy stored in loops; i.e.
160*e4b17023SJohn Marino    enforce condition condition stated in description of fix_bb_placement. We
161*e4b17023SJohn Marino    start from basic block FROM that had some of its successors removed, so that
162*e4b17023SJohn Marino    his placement no longer has to be correct, and iteratively fix placement of
163*e4b17023SJohn Marino    its predecessors that may change if placement of FROM changed.  Also fix
164*e4b17023SJohn Marino    placement of subloops of FROM->loop_father, that might also be altered due
165*e4b17023SJohn Marino    to this change; the condition for them is similar, except that instead of
166*e4b17023SJohn Marino    successors we consider edges coming out of the loops.
167*e4b17023SJohn Marino 
168*e4b17023SJohn Marino    If the changes may invalidate the information about irreducible regions,
169*e4b17023SJohn Marino    IRRED_INVALIDATED is set to true.  */
170*e4b17023SJohn Marino 
171*e4b17023SJohn Marino static void
fix_bb_placements(basic_block from,bool * irred_invalidated)172*e4b17023SJohn Marino fix_bb_placements (basic_block from,
173*e4b17023SJohn Marino 		   bool *irred_invalidated)
174*e4b17023SJohn Marino {
175*e4b17023SJohn Marino   sbitmap in_queue;
176*e4b17023SJohn Marino   basic_block *queue, *qtop, *qbeg, *qend;
177*e4b17023SJohn Marino   struct loop *base_loop, *target_loop;
178*e4b17023SJohn Marino   edge e;
179*e4b17023SJohn Marino 
180*e4b17023SJohn Marino   /* We pass through blocks back-reachable from FROM, testing whether some
181*e4b17023SJohn Marino      of their successors moved to outer loop.  It may be necessary to
182*e4b17023SJohn Marino      iterate several times, but it is finite, as we stop unless we move
183*e4b17023SJohn Marino      the basic block up the loop structure.  The whole story is a bit
184*e4b17023SJohn Marino      more complicated due to presence of subloops, those are moved using
185*e4b17023SJohn Marino      fix_loop_placement.  */
186*e4b17023SJohn Marino 
187*e4b17023SJohn Marino   base_loop = from->loop_father;
188*e4b17023SJohn Marino   /* If we are already in the outermost loop, the basic blocks cannot be moved
189*e4b17023SJohn Marino      outside of it.  If FROM is the header of the base loop, it cannot be moved
190*e4b17023SJohn Marino      outside of it, either.  In both cases, we can end now.  */
191*e4b17023SJohn Marino   if (base_loop == current_loops->tree_root
192*e4b17023SJohn Marino       || from == base_loop->header)
193*e4b17023SJohn Marino     return;
194*e4b17023SJohn Marino 
195*e4b17023SJohn Marino   in_queue = sbitmap_alloc (last_basic_block);
196*e4b17023SJohn Marino   sbitmap_zero (in_queue);
197*e4b17023SJohn Marino   SET_BIT (in_queue, from->index);
198*e4b17023SJohn Marino   /* Prevent us from going out of the base_loop.  */
199*e4b17023SJohn Marino   SET_BIT (in_queue, base_loop->header->index);
200*e4b17023SJohn Marino 
201*e4b17023SJohn Marino   queue = XNEWVEC (basic_block, base_loop->num_nodes + 1);
202*e4b17023SJohn Marino   qtop = queue + base_loop->num_nodes + 1;
203*e4b17023SJohn Marino   qbeg = queue;
204*e4b17023SJohn Marino   qend = queue + 1;
205*e4b17023SJohn Marino   *qbeg = from;
206*e4b17023SJohn Marino 
207*e4b17023SJohn Marino   while (qbeg != qend)
208*e4b17023SJohn Marino     {
209*e4b17023SJohn Marino       edge_iterator ei;
210*e4b17023SJohn Marino       from = *qbeg;
211*e4b17023SJohn Marino       qbeg++;
212*e4b17023SJohn Marino       if (qbeg == qtop)
213*e4b17023SJohn Marino 	qbeg = queue;
214*e4b17023SJohn Marino       RESET_BIT (in_queue, from->index);
215*e4b17023SJohn Marino 
216*e4b17023SJohn Marino       if (from->loop_father->header == from)
217*e4b17023SJohn Marino 	{
218*e4b17023SJohn Marino 	  /* Subloop header, maybe move the loop upward.  */
219*e4b17023SJohn Marino 	  if (!fix_loop_placement (from->loop_father))
220*e4b17023SJohn Marino 	    continue;
221*e4b17023SJohn Marino 	  target_loop = loop_outer (from->loop_father);
222*e4b17023SJohn Marino 	}
223*e4b17023SJohn Marino       else
224*e4b17023SJohn Marino 	{
225*e4b17023SJohn Marino 	  /* Ordinary basic block.  */
226*e4b17023SJohn Marino 	  if (!fix_bb_placement (from))
227*e4b17023SJohn Marino 	    continue;
228*e4b17023SJohn Marino 	  target_loop = from->loop_father;
229*e4b17023SJohn Marino 	}
230*e4b17023SJohn Marino 
231*e4b17023SJohn Marino       FOR_EACH_EDGE (e, ei, from->succs)
232*e4b17023SJohn Marino 	{
233*e4b17023SJohn Marino 	  if (e->flags & EDGE_IRREDUCIBLE_LOOP)
234*e4b17023SJohn Marino 	    *irred_invalidated = true;
235*e4b17023SJohn Marino 	}
236*e4b17023SJohn Marino 
237*e4b17023SJohn Marino       /* Something has changed, insert predecessors into queue.  */
238*e4b17023SJohn Marino       FOR_EACH_EDGE (e, ei, from->preds)
239*e4b17023SJohn Marino 	{
240*e4b17023SJohn Marino 	  basic_block pred = e->src;
241*e4b17023SJohn Marino 	  struct loop *nca;
242*e4b17023SJohn Marino 
243*e4b17023SJohn Marino 	  if (e->flags & EDGE_IRREDUCIBLE_LOOP)
244*e4b17023SJohn Marino 	    *irred_invalidated = true;
245*e4b17023SJohn Marino 
246*e4b17023SJohn Marino 	  if (TEST_BIT (in_queue, pred->index))
247*e4b17023SJohn Marino 	    continue;
248*e4b17023SJohn Marino 
249*e4b17023SJohn Marino 	  /* If it is subloop, then it either was not moved, or
250*e4b17023SJohn Marino 	     the path up the loop tree from base_loop do not contain
251*e4b17023SJohn Marino 	     it.  */
252*e4b17023SJohn Marino 	  nca = find_common_loop (pred->loop_father, base_loop);
253*e4b17023SJohn Marino 	  if (pred->loop_father != base_loop
254*e4b17023SJohn Marino 	      && (nca == base_loop
255*e4b17023SJohn Marino 		  || nca != pred->loop_father))
256*e4b17023SJohn Marino 	    pred = pred->loop_father->header;
257*e4b17023SJohn Marino 	  else if (!flow_loop_nested_p (target_loop, pred->loop_father))
258*e4b17023SJohn Marino 	    {
259*e4b17023SJohn Marino 	      /* If PRED is already higher in the loop hierarchy than the
260*e4b17023SJohn Marino 		 TARGET_LOOP to that we moved FROM, the change of the position
261*e4b17023SJohn Marino 		 of FROM does not affect the position of PRED, so there is no
262*e4b17023SJohn Marino 		 point in processing it.  */
263*e4b17023SJohn Marino 	      continue;
264*e4b17023SJohn Marino 	    }
265*e4b17023SJohn Marino 
266*e4b17023SJohn Marino 	  if (TEST_BIT (in_queue, pred->index))
267*e4b17023SJohn Marino 	    continue;
268*e4b17023SJohn Marino 
269*e4b17023SJohn Marino 	  /* Schedule the basic block.  */
270*e4b17023SJohn Marino 	  *qend = pred;
271*e4b17023SJohn Marino 	  qend++;
272*e4b17023SJohn Marino 	  if (qend == qtop)
273*e4b17023SJohn Marino 	    qend = queue;
274*e4b17023SJohn Marino 	  SET_BIT (in_queue, pred->index);
275*e4b17023SJohn Marino 	}
276*e4b17023SJohn Marino     }
277*e4b17023SJohn Marino   free (in_queue);
278*e4b17023SJohn Marino   free (queue);
279*e4b17023SJohn Marino }
280*e4b17023SJohn Marino 
281*e4b17023SJohn Marino /* Removes path beginning at edge E, i.e. remove basic blocks dominated by E
282*e4b17023SJohn Marino    and update loop structures and dominators.  Return true if we were able
283*e4b17023SJohn Marino    to remove the path, false otherwise (and nothing is affected then).  */
284*e4b17023SJohn Marino bool
remove_path(edge e)285*e4b17023SJohn Marino remove_path (edge e)
286*e4b17023SJohn Marino {
287*e4b17023SJohn Marino   edge ae;
288*e4b17023SJohn Marino   basic_block *rem_bbs, *bord_bbs, from, bb;
289*e4b17023SJohn Marino   VEC (basic_block, heap) *dom_bbs;
290*e4b17023SJohn Marino   int i, nrem, n_bord_bbs;
291*e4b17023SJohn Marino   sbitmap seen;
292*e4b17023SJohn Marino   bool irred_invalidated = false;
293*e4b17023SJohn Marino   edge_iterator ei;
294*e4b17023SJohn Marino   struct loop *l, *f;
295*e4b17023SJohn Marino 
296*e4b17023SJohn Marino   if (!can_remove_branch_p (e))
297*e4b17023SJohn Marino     return false;
298*e4b17023SJohn Marino 
299*e4b17023SJohn Marino   /* Keep track of whether we need to update information about irreducible
300*e4b17023SJohn Marino      regions.  This is the case if the removed area is a part of the
301*e4b17023SJohn Marino      irreducible region, or if the set of basic blocks that belong to a loop
302*e4b17023SJohn Marino      that is inside an irreducible region is changed, or if such a loop is
303*e4b17023SJohn Marino      removed.  */
304*e4b17023SJohn Marino   if (e->flags & EDGE_IRREDUCIBLE_LOOP)
305*e4b17023SJohn Marino     irred_invalidated = true;
306*e4b17023SJohn Marino 
307*e4b17023SJohn Marino   /* We need to check whether basic blocks are dominated by the edge
308*e4b17023SJohn Marino      e, but we only have basic block dominators.  This is easy to
309*e4b17023SJohn Marino      fix -- when e->dest has exactly one predecessor, this corresponds
310*e4b17023SJohn Marino      to blocks dominated by e->dest, if not, split the edge.  */
311*e4b17023SJohn Marino   if (!single_pred_p (e->dest))
312*e4b17023SJohn Marino     e = single_pred_edge (split_edge (e));
313*e4b17023SJohn Marino 
314*e4b17023SJohn Marino   /* It may happen that by removing path we remove one or more loops
315*e4b17023SJohn Marino      we belong to.  In this case first unloop the loops, then proceed
316*e4b17023SJohn Marino      normally.   We may assume that e->dest is not a header of any loop,
317*e4b17023SJohn Marino      as it now has exactly one predecessor.  */
318*e4b17023SJohn Marino   for (l = e->src->loop_father; loop_outer (l); l = f)
319*e4b17023SJohn Marino     {
320*e4b17023SJohn Marino       f = loop_outer (l);
321*e4b17023SJohn Marino       if (dominated_by_p (CDI_DOMINATORS, l->latch, e->dest))
322*e4b17023SJohn Marino         unloop (l, &irred_invalidated);
323*e4b17023SJohn Marino     }
324*e4b17023SJohn Marino 
325*e4b17023SJohn Marino   /* Identify the path.  */
326*e4b17023SJohn Marino   nrem = find_path (e, &rem_bbs);
327*e4b17023SJohn Marino 
328*e4b17023SJohn Marino   n_bord_bbs = 0;
329*e4b17023SJohn Marino   bord_bbs = XCNEWVEC (basic_block, n_basic_blocks);
330*e4b17023SJohn Marino   seen = sbitmap_alloc (last_basic_block);
331*e4b17023SJohn Marino   sbitmap_zero (seen);
332*e4b17023SJohn Marino 
333*e4b17023SJohn Marino   /* Find "border" hexes -- i.e. those with predecessor in removed path.  */
334*e4b17023SJohn Marino   for (i = 0; i < nrem; i++)
335*e4b17023SJohn Marino     SET_BIT (seen, rem_bbs[i]->index);
336*e4b17023SJohn Marino   if (!irred_invalidated)
337*e4b17023SJohn Marino     FOR_EACH_EDGE (ae, ei, e->src->succs)
338*e4b17023SJohn Marino       if (ae != e && ae->dest != EXIT_BLOCK_PTR && !TEST_BIT (seen, ae->dest->index)
339*e4b17023SJohn Marino 	  && ae->flags & EDGE_IRREDUCIBLE_LOOP)
340*e4b17023SJohn Marino 	irred_invalidated = true;
341*e4b17023SJohn Marino   for (i = 0; i < nrem; i++)
342*e4b17023SJohn Marino     {
343*e4b17023SJohn Marino       bb = rem_bbs[i];
344*e4b17023SJohn Marino       FOR_EACH_EDGE (ae, ei, rem_bbs[i]->succs)
345*e4b17023SJohn Marino 	if (ae->dest != EXIT_BLOCK_PTR && !TEST_BIT (seen, ae->dest->index))
346*e4b17023SJohn Marino 	  {
347*e4b17023SJohn Marino 	    SET_BIT (seen, ae->dest->index);
348*e4b17023SJohn Marino 	    bord_bbs[n_bord_bbs++] = ae->dest;
349*e4b17023SJohn Marino 
350*e4b17023SJohn Marino 	    if (ae->flags & EDGE_IRREDUCIBLE_LOOP)
351*e4b17023SJohn Marino 	      irred_invalidated = true;
352*e4b17023SJohn Marino 	  }
353*e4b17023SJohn Marino     }
354*e4b17023SJohn Marino 
355*e4b17023SJohn Marino   /* Remove the path.  */
356*e4b17023SJohn Marino   from = e->src;
357*e4b17023SJohn Marino   remove_branch (e);
358*e4b17023SJohn Marino   dom_bbs = NULL;
359*e4b17023SJohn Marino 
360*e4b17023SJohn Marino   /* Cancel loops contained in the path.  */
361*e4b17023SJohn Marino   for (i = 0; i < nrem; i++)
362*e4b17023SJohn Marino     if (rem_bbs[i]->loop_father->header == rem_bbs[i])
363*e4b17023SJohn Marino       cancel_loop_tree (rem_bbs[i]->loop_father);
364*e4b17023SJohn Marino 
365*e4b17023SJohn Marino   remove_bbs (rem_bbs, nrem);
366*e4b17023SJohn Marino   free (rem_bbs);
367*e4b17023SJohn Marino 
368*e4b17023SJohn Marino   /* Find blocks whose dominators may be affected.  */
369*e4b17023SJohn Marino   sbitmap_zero (seen);
370*e4b17023SJohn Marino   for (i = 0; i < n_bord_bbs; i++)
371*e4b17023SJohn Marino     {
372*e4b17023SJohn Marino       basic_block ldom;
373*e4b17023SJohn Marino 
374*e4b17023SJohn Marino       bb = get_immediate_dominator (CDI_DOMINATORS, bord_bbs[i]);
375*e4b17023SJohn Marino       if (TEST_BIT (seen, bb->index))
376*e4b17023SJohn Marino 	continue;
377*e4b17023SJohn Marino       SET_BIT (seen, bb->index);
378*e4b17023SJohn Marino 
379*e4b17023SJohn Marino       for (ldom = first_dom_son (CDI_DOMINATORS, bb);
380*e4b17023SJohn Marino 	   ldom;
381*e4b17023SJohn Marino 	   ldom = next_dom_son (CDI_DOMINATORS, ldom))
382*e4b17023SJohn Marino 	if (!dominated_by_p (CDI_DOMINATORS, from, ldom))
383*e4b17023SJohn Marino 	  VEC_safe_push (basic_block, heap, dom_bbs, ldom);
384*e4b17023SJohn Marino     }
385*e4b17023SJohn Marino 
386*e4b17023SJohn Marino   free (seen);
387*e4b17023SJohn Marino 
388*e4b17023SJohn Marino   /* Recount dominators.  */
389*e4b17023SJohn Marino   iterate_fix_dominators (CDI_DOMINATORS, dom_bbs, true);
390*e4b17023SJohn Marino   VEC_free (basic_block, heap, dom_bbs);
391*e4b17023SJohn Marino   free (bord_bbs);
392*e4b17023SJohn Marino 
393*e4b17023SJohn Marino   /* Fix placements of basic blocks inside loops and the placement of
394*e4b17023SJohn Marino      loops in the loop tree.  */
395*e4b17023SJohn Marino   fix_bb_placements (from, &irred_invalidated);
396*e4b17023SJohn Marino   fix_loop_placements (from->loop_father, &irred_invalidated);
397*e4b17023SJohn Marino 
398*e4b17023SJohn Marino   if (irred_invalidated
399*e4b17023SJohn Marino       && loops_state_satisfies_p (LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS))
400*e4b17023SJohn Marino     mark_irreducible_loops ();
401*e4b17023SJohn Marino 
402*e4b17023SJohn Marino   return true;
403*e4b17023SJohn Marino }
404*e4b17023SJohn Marino 
405*e4b17023SJohn Marino /* Creates place for a new LOOP in loops structure.  */
406*e4b17023SJohn Marino 
407*e4b17023SJohn Marino static void
place_new_loop(struct loop * loop)408*e4b17023SJohn Marino place_new_loop (struct loop *loop)
409*e4b17023SJohn Marino {
410*e4b17023SJohn Marino   loop->num = number_of_loops ();
411*e4b17023SJohn Marino   VEC_safe_push (loop_p, gc, current_loops->larray, loop);
412*e4b17023SJohn Marino }
413*e4b17023SJohn Marino 
414*e4b17023SJohn Marino /* Given LOOP structure with filled header and latch, find the body of the
415*e4b17023SJohn Marino    corresponding loop and add it to loops tree.  Insert the LOOP as a son of
416*e4b17023SJohn Marino    outer.  */
417*e4b17023SJohn Marino 
418*e4b17023SJohn Marino void
add_loop(struct loop * loop,struct loop * outer)419*e4b17023SJohn Marino add_loop (struct loop *loop, struct loop *outer)
420*e4b17023SJohn Marino {
421*e4b17023SJohn Marino   basic_block *bbs;
422*e4b17023SJohn Marino   int i, n;
423*e4b17023SJohn Marino   struct loop *subloop;
424*e4b17023SJohn Marino   edge e;
425*e4b17023SJohn Marino   edge_iterator ei;
426*e4b17023SJohn Marino 
427*e4b17023SJohn Marino   /* Add it to loop structure.  */
428*e4b17023SJohn Marino   place_new_loop (loop);
429*e4b17023SJohn Marino   flow_loop_tree_node_add (outer, loop);
430*e4b17023SJohn Marino 
431*e4b17023SJohn Marino   /* Find its nodes.  */
432*e4b17023SJohn Marino   bbs = XNEWVEC (basic_block, n_basic_blocks);
433*e4b17023SJohn Marino   n = get_loop_body_with_size (loop, bbs, n_basic_blocks);
434*e4b17023SJohn Marino 
435*e4b17023SJohn Marino   for (i = 0; i < n; i++)
436*e4b17023SJohn Marino     {
437*e4b17023SJohn Marino       if (bbs[i]->loop_father == outer)
438*e4b17023SJohn Marino 	{
439*e4b17023SJohn Marino 	  remove_bb_from_loops (bbs[i]);
440*e4b17023SJohn Marino 	  add_bb_to_loop (bbs[i], loop);
441*e4b17023SJohn Marino 	  continue;
442*e4b17023SJohn Marino 	}
443*e4b17023SJohn Marino 
444*e4b17023SJohn Marino       loop->num_nodes++;
445*e4b17023SJohn Marino 
446*e4b17023SJohn Marino       /* If we find a direct subloop of OUTER, move it to LOOP.  */
447*e4b17023SJohn Marino       subloop = bbs[i]->loop_father;
448*e4b17023SJohn Marino       if (loop_outer (subloop) == outer
449*e4b17023SJohn Marino 	  && subloop->header == bbs[i])
450*e4b17023SJohn Marino 	{
451*e4b17023SJohn Marino 	  flow_loop_tree_node_remove (subloop);
452*e4b17023SJohn Marino 	  flow_loop_tree_node_add (loop, subloop);
453*e4b17023SJohn Marino 	}
454*e4b17023SJohn Marino     }
455*e4b17023SJohn Marino 
456*e4b17023SJohn Marino   /* Update the information about loop exit edges.  */
457*e4b17023SJohn Marino   for (i = 0; i < n; i++)
458*e4b17023SJohn Marino     {
459*e4b17023SJohn Marino       FOR_EACH_EDGE (e, ei, bbs[i]->succs)
460*e4b17023SJohn Marino 	{
461*e4b17023SJohn Marino 	  rescan_loop_exit (e, false, false);
462*e4b17023SJohn Marino 	}
463*e4b17023SJohn Marino     }
464*e4b17023SJohn Marino 
465*e4b17023SJohn Marino   free (bbs);
466*e4b17023SJohn Marino }
467*e4b17023SJohn Marino 
468*e4b17023SJohn Marino /* Multiply all frequencies in LOOP by NUM/DEN.  */
469*e4b17023SJohn Marino void
scale_loop_frequencies(struct loop * loop,int num,int den)470*e4b17023SJohn Marino scale_loop_frequencies (struct loop *loop, int num, int den)
471*e4b17023SJohn Marino {
472*e4b17023SJohn Marino   basic_block *bbs;
473*e4b17023SJohn Marino 
474*e4b17023SJohn Marino   bbs = get_loop_body (loop);
475*e4b17023SJohn Marino   scale_bbs_frequencies_int (bbs, loop->num_nodes, num, den);
476*e4b17023SJohn Marino   free (bbs);
477*e4b17023SJohn Marino }
478*e4b17023SJohn Marino 
479*e4b17023SJohn Marino /* Recompute dominance information for basic blocks outside LOOP.  */
480*e4b17023SJohn Marino 
481*e4b17023SJohn Marino static void
update_dominators_in_loop(struct loop * loop)482*e4b17023SJohn Marino update_dominators_in_loop (struct loop *loop)
483*e4b17023SJohn Marino {
484*e4b17023SJohn Marino   VEC (basic_block, heap) *dom_bbs = NULL;
485*e4b17023SJohn Marino   sbitmap seen;
486*e4b17023SJohn Marino   basic_block *body;
487*e4b17023SJohn Marino   unsigned i;
488*e4b17023SJohn Marino 
489*e4b17023SJohn Marino   seen = sbitmap_alloc (last_basic_block);
490*e4b17023SJohn Marino   sbitmap_zero (seen);
491*e4b17023SJohn Marino   body = get_loop_body (loop);
492*e4b17023SJohn Marino 
493*e4b17023SJohn Marino   for (i = 0; i < loop->num_nodes; i++)
494*e4b17023SJohn Marino     SET_BIT (seen, body[i]->index);
495*e4b17023SJohn Marino 
496*e4b17023SJohn Marino   for (i = 0; i < loop->num_nodes; i++)
497*e4b17023SJohn Marino     {
498*e4b17023SJohn Marino       basic_block ldom;
499*e4b17023SJohn Marino 
500*e4b17023SJohn Marino       for (ldom = first_dom_son (CDI_DOMINATORS, body[i]);
501*e4b17023SJohn Marino 	   ldom;
502*e4b17023SJohn Marino 	   ldom = next_dom_son (CDI_DOMINATORS, ldom))
503*e4b17023SJohn Marino 	if (!TEST_BIT (seen, ldom->index))
504*e4b17023SJohn Marino 	  {
505*e4b17023SJohn Marino 	    SET_BIT (seen, ldom->index);
506*e4b17023SJohn Marino 	    VEC_safe_push (basic_block, heap, dom_bbs, ldom);
507*e4b17023SJohn Marino 	  }
508*e4b17023SJohn Marino     }
509*e4b17023SJohn Marino 
510*e4b17023SJohn Marino   iterate_fix_dominators (CDI_DOMINATORS, dom_bbs, false);
511*e4b17023SJohn Marino   free (body);
512*e4b17023SJohn Marino   free (seen);
513*e4b17023SJohn Marino   VEC_free (basic_block, heap, dom_bbs);
514*e4b17023SJohn Marino }
515*e4b17023SJohn Marino 
516*e4b17023SJohn Marino /* Creates an if region as shown above. CONDITION is used to create
517*e4b17023SJohn Marino    the test for the if.
518*e4b17023SJohn Marino 
519*e4b17023SJohn Marino    |
520*e4b17023SJohn Marino    |     -------------                 -------------
521*e4b17023SJohn Marino    |     |  pred_bb  |                 |  pred_bb  |
522*e4b17023SJohn Marino    |     -------------                 -------------
523*e4b17023SJohn Marino    |           |                             |
524*e4b17023SJohn Marino    |           |                             | ENTRY_EDGE
525*e4b17023SJohn Marino    |           | ENTRY_EDGE                  V
526*e4b17023SJohn Marino    |           |             ====>     -------------
527*e4b17023SJohn Marino    |           |                       |  cond_bb  |
528*e4b17023SJohn Marino    |           |                       | CONDITION |
529*e4b17023SJohn Marino    |           |                       -------------
530*e4b17023SJohn Marino    |           V                        /         \
531*e4b17023SJohn Marino    |     -------------         e_false /           \ e_true
532*e4b17023SJohn Marino    |     |  succ_bb  |                V             V
533*e4b17023SJohn Marino    |     -------------         -----------       -----------
534*e4b17023SJohn Marino    |                           | false_bb |      | true_bb |
535*e4b17023SJohn Marino    |                           -----------       -----------
536*e4b17023SJohn Marino    |                                   \           /
537*e4b17023SJohn Marino    |                                    \         /
538*e4b17023SJohn Marino    |                                     V       V
539*e4b17023SJohn Marino    |                                   -------------
540*e4b17023SJohn Marino    |                                   |  join_bb  |
541*e4b17023SJohn Marino    |                                   -------------
542*e4b17023SJohn Marino    |                                         | exit_edge (result)
543*e4b17023SJohn Marino    |                                         V
544*e4b17023SJohn Marino    |                                    -----------
545*e4b17023SJohn Marino    |                                    | succ_bb |
546*e4b17023SJohn Marino    |                                    -----------
547*e4b17023SJohn Marino    |
548*e4b17023SJohn Marino  */
549*e4b17023SJohn Marino 
550*e4b17023SJohn Marino edge
create_empty_if_region_on_edge(edge entry_edge,tree condition)551*e4b17023SJohn Marino create_empty_if_region_on_edge (edge entry_edge, tree condition)
552*e4b17023SJohn Marino {
553*e4b17023SJohn Marino 
554*e4b17023SJohn Marino   basic_block cond_bb, true_bb, false_bb, join_bb;
555*e4b17023SJohn Marino   edge e_true, e_false, exit_edge;
556*e4b17023SJohn Marino   gimple cond_stmt;
557*e4b17023SJohn Marino   tree simple_cond;
558*e4b17023SJohn Marino   gimple_stmt_iterator gsi;
559*e4b17023SJohn Marino 
560*e4b17023SJohn Marino   cond_bb = split_edge (entry_edge);
561*e4b17023SJohn Marino 
562*e4b17023SJohn Marino   /* Insert condition in cond_bb.  */
563*e4b17023SJohn Marino   gsi = gsi_last_bb (cond_bb);
564*e4b17023SJohn Marino   simple_cond =
565*e4b17023SJohn Marino     force_gimple_operand_gsi (&gsi, condition, true, NULL,
566*e4b17023SJohn Marino 			      false, GSI_NEW_STMT);
567*e4b17023SJohn Marino   cond_stmt = gimple_build_cond_from_tree (simple_cond, NULL_TREE, NULL_TREE);
568*e4b17023SJohn Marino   gsi = gsi_last_bb (cond_bb);
569*e4b17023SJohn Marino   gsi_insert_after (&gsi, cond_stmt, GSI_NEW_STMT);
570*e4b17023SJohn Marino 
571*e4b17023SJohn Marino   join_bb = split_edge (single_succ_edge (cond_bb));
572*e4b17023SJohn Marino 
573*e4b17023SJohn Marino   e_true = single_succ_edge (cond_bb);
574*e4b17023SJohn Marino   true_bb = split_edge (e_true);
575*e4b17023SJohn Marino 
576*e4b17023SJohn Marino   e_false = make_edge (cond_bb, join_bb, 0);
577*e4b17023SJohn Marino   false_bb = split_edge (e_false);
578*e4b17023SJohn Marino 
579*e4b17023SJohn Marino   e_true->flags &= ~EDGE_FALLTHRU;
580*e4b17023SJohn Marino   e_true->flags |= EDGE_TRUE_VALUE;
581*e4b17023SJohn Marino   e_false->flags &= ~EDGE_FALLTHRU;
582*e4b17023SJohn Marino   e_false->flags |= EDGE_FALSE_VALUE;
583*e4b17023SJohn Marino 
584*e4b17023SJohn Marino   set_immediate_dominator (CDI_DOMINATORS, cond_bb, entry_edge->src);
585*e4b17023SJohn Marino   set_immediate_dominator (CDI_DOMINATORS, true_bb, cond_bb);
586*e4b17023SJohn Marino   set_immediate_dominator (CDI_DOMINATORS, false_bb, cond_bb);
587*e4b17023SJohn Marino   set_immediate_dominator (CDI_DOMINATORS, join_bb, cond_bb);
588*e4b17023SJohn Marino 
589*e4b17023SJohn Marino   exit_edge = single_succ_edge (join_bb);
590*e4b17023SJohn Marino 
591*e4b17023SJohn Marino   if (single_pred_p (exit_edge->dest))
592*e4b17023SJohn Marino     set_immediate_dominator (CDI_DOMINATORS, exit_edge->dest, join_bb);
593*e4b17023SJohn Marino 
594*e4b17023SJohn Marino   return exit_edge;
595*e4b17023SJohn Marino }
596*e4b17023SJohn Marino 
597*e4b17023SJohn Marino /* create_empty_loop_on_edge
598*e4b17023SJohn Marino    |
599*e4b17023SJohn Marino    |    - pred_bb -                   ------ pred_bb ------
600*e4b17023SJohn Marino    |   |           |                 | iv0 = initial_value |
601*e4b17023SJohn Marino    |    -----|-----                   ---------|-----------
602*e4b17023SJohn Marino    |         |                       ______    | entry_edge
603*e4b17023SJohn Marino    |         | entry_edge           /      |   |
604*e4b17023SJohn Marino    |         |             ====>   |      -V---V- loop_header -------------
605*e4b17023SJohn Marino    |         V                     |     | iv_before = phi (iv0, iv_after) |
606*e4b17023SJohn Marino    |    - succ_bb -                |      ---|-----------------------------
607*e4b17023SJohn Marino    |   |           |               |         |
608*e4b17023SJohn Marino    |    -----------                |      ---V--- loop_body ---------------
609*e4b17023SJohn Marino    |                               |     | iv_after = iv_before + stride   |
610*e4b17023SJohn Marino    |                               |     | if (iv_before < upper_bound)    |
611*e4b17023SJohn Marino    |                               |      ---|--------------\--------------
612*e4b17023SJohn Marino    |                               |         |               \ exit_e
613*e4b17023SJohn Marino    |                               |         V                \
614*e4b17023SJohn Marino    |                               |       - loop_latch -      V- succ_bb -
615*e4b17023SJohn Marino    |                               |      |              |     |           |
616*e4b17023SJohn Marino    |                               |       /-------------       -----------
617*e4b17023SJohn Marino    |                                \ ___ /
618*e4b17023SJohn Marino 
619*e4b17023SJohn Marino    Creates an empty loop as shown above, the IV_BEFORE is the SSA_NAME
620*e4b17023SJohn Marino    that is used before the increment of IV. IV_BEFORE should be used for
621*e4b17023SJohn Marino    adding code to the body that uses the IV.  OUTER is the outer loop in
622*e4b17023SJohn Marino    which the new loop should be inserted.
623*e4b17023SJohn Marino 
624*e4b17023SJohn Marino    Both INITIAL_VALUE and UPPER_BOUND expressions are gimplified and
625*e4b17023SJohn Marino    inserted on the loop entry edge.  This implies that this function
626*e4b17023SJohn Marino    should be used only when the UPPER_BOUND expression is a loop
627*e4b17023SJohn Marino    invariant.  */
628*e4b17023SJohn Marino 
629*e4b17023SJohn Marino struct loop *
create_empty_loop_on_edge(edge entry_edge,tree initial_value,tree stride,tree upper_bound,tree iv,tree * iv_before,tree * iv_after,struct loop * outer)630*e4b17023SJohn Marino create_empty_loop_on_edge (edge entry_edge,
631*e4b17023SJohn Marino 			   tree initial_value,
632*e4b17023SJohn Marino 			   tree stride, tree upper_bound,
633*e4b17023SJohn Marino 			   tree iv,
634*e4b17023SJohn Marino 			   tree *iv_before,
635*e4b17023SJohn Marino 			   tree *iv_after,
636*e4b17023SJohn Marino 			   struct loop *outer)
637*e4b17023SJohn Marino {
638*e4b17023SJohn Marino   basic_block loop_header, loop_latch, succ_bb, pred_bb;
639*e4b17023SJohn Marino   struct loop *loop;
640*e4b17023SJohn Marino   gimple_stmt_iterator gsi;
641*e4b17023SJohn Marino   gimple_seq stmts;
642*e4b17023SJohn Marino   gimple cond_expr;
643*e4b17023SJohn Marino   tree exit_test;
644*e4b17023SJohn Marino   edge exit_e;
645*e4b17023SJohn Marino   int prob;
646*e4b17023SJohn Marino 
647*e4b17023SJohn Marino   gcc_assert (entry_edge && initial_value && stride && upper_bound && iv);
648*e4b17023SJohn Marino 
649*e4b17023SJohn Marino   /* Create header, latch and wire up the loop.  */
650*e4b17023SJohn Marino   pred_bb = entry_edge->src;
651*e4b17023SJohn Marino   loop_header = split_edge (entry_edge);
652*e4b17023SJohn Marino   loop_latch = split_edge (single_succ_edge (loop_header));
653*e4b17023SJohn Marino   succ_bb = single_succ (loop_latch);
654*e4b17023SJohn Marino   make_edge (loop_header, succ_bb, 0);
655*e4b17023SJohn Marino   redirect_edge_succ_nodup (single_succ_edge (loop_latch), loop_header);
656*e4b17023SJohn Marino 
657*e4b17023SJohn Marino   /* Set immediate dominator information.  */
658*e4b17023SJohn Marino   set_immediate_dominator (CDI_DOMINATORS, loop_header, pred_bb);
659*e4b17023SJohn Marino   set_immediate_dominator (CDI_DOMINATORS, loop_latch, loop_header);
660*e4b17023SJohn Marino   set_immediate_dominator (CDI_DOMINATORS, succ_bb, loop_header);
661*e4b17023SJohn Marino 
662*e4b17023SJohn Marino   /* Initialize a loop structure and put it in a loop hierarchy.  */
663*e4b17023SJohn Marino   loop = alloc_loop ();
664*e4b17023SJohn Marino   loop->header = loop_header;
665*e4b17023SJohn Marino   loop->latch = loop_latch;
666*e4b17023SJohn Marino   add_loop (loop, outer);
667*e4b17023SJohn Marino 
668*e4b17023SJohn Marino   /* TODO: Fix frequencies and counts.  */
669*e4b17023SJohn Marino   prob = REG_BR_PROB_BASE / 2;
670*e4b17023SJohn Marino 
671*e4b17023SJohn Marino   scale_loop_frequencies (loop, REG_BR_PROB_BASE - prob, REG_BR_PROB_BASE);
672*e4b17023SJohn Marino 
673*e4b17023SJohn Marino   /* Update dominators.  */
674*e4b17023SJohn Marino   update_dominators_in_loop (loop);
675*e4b17023SJohn Marino 
676*e4b17023SJohn Marino   /* Modify edge flags.  */
677*e4b17023SJohn Marino   exit_e = single_exit (loop);
678*e4b17023SJohn Marino   exit_e->flags = EDGE_LOOP_EXIT | EDGE_FALSE_VALUE;
679*e4b17023SJohn Marino   single_pred_edge (loop_latch)->flags = EDGE_TRUE_VALUE;
680*e4b17023SJohn Marino 
681*e4b17023SJohn Marino   /* Construct IV code in loop.  */
682*e4b17023SJohn Marino   initial_value = force_gimple_operand (initial_value, &stmts, true, iv);
683*e4b17023SJohn Marino   if (stmts)
684*e4b17023SJohn Marino     {
685*e4b17023SJohn Marino       gsi_insert_seq_on_edge (loop_preheader_edge (loop), stmts);
686*e4b17023SJohn Marino       gsi_commit_edge_inserts ();
687*e4b17023SJohn Marino     }
688*e4b17023SJohn Marino 
689*e4b17023SJohn Marino   upper_bound = force_gimple_operand (upper_bound, &stmts, true, NULL);
690*e4b17023SJohn Marino   if (stmts)
691*e4b17023SJohn Marino     {
692*e4b17023SJohn Marino       gsi_insert_seq_on_edge (loop_preheader_edge (loop), stmts);
693*e4b17023SJohn Marino       gsi_commit_edge_inserts ();
694*e4b17023SJohn Marino     }
695*e4b17023SJohn Marino 
696*e4b17023SJohn Marino   gsi = gsi_last_bb (loop_header);
697*e4b17023SJohn Marino   create_iv (initial_value, stride, iv, loop, &gsi, false,
698*e4b17023SJohn Marino 	     iv_before, iv_after);
699*e4b17023SJohn Marino 
700*e4b17023SJohn Marino   /* Insert loop exit condition.  */
701*e4b17023SJohn Marino   cond_expr = gimple_build_cond
702*e4b17023SJohn Marino     (LT_EXPR, *iv_before, upper_bound, NULL_TREE, NULL_TREE);
703*e4b17023SJohn Marino 
704*e4b17023SJohn Marino   exit_test = gimple_cond_lhs (cond_expr);
705*e4b17023SJohn Marino   exit_test = force_gimple_operand_gsi (&gsi, exit_test, true, NULL,
706*e4b17023SJohn Marino 					false, GSI_NEW_STMT);
707*e4b17023SJohn Marino   gimple_cond_set_lhs (cond_expr, exit_test);
708*e4b17023SJohn Marino   gsi = gsi_last_bb (exit_e->src);
709*e4b17023SJohn Marino   gsi_insert_after (&gsi, cond_expr, GSI_NEW_STMT);
710*e4b17023SJohn Marino 
711*e4b17023SJohn Marino   split_block_after_labels (loop_header);
712*e4b17023SJohn Marino 
713*e4b17023SJohn Marino   return loop;
714*e4b17023SJohn Marino }
715*e4b17023SJohn Marino 
716*e4b17023SJohn Marino /* Make area between HEADER_EDGE and LATCH_EDGE a loop by connecting
717*e4b17023SJohn Marino    latch to header and update loop tree and dominators
718*e4b17023SJohn Marino    accordingly. Everything between them plus LATCH_EDGE destination must
719*e4b17023SJohn Marino    be dominated by HEADER_EDGE destination, and back-reachable from
720*e4b17023SJohn Marino    LATCH_EDGE source.  HEADER_EDGE is redirected to basic block SWITCH_BB,
721*e4b17023SJohn Marino    FALSE_EDGE of SWITCH_BB to original destination of HEADER_EDGE and
722*e4b17023SJohn Marino    TRUE_EDGE of SWITCH_BB to original destination of LATCH_EDGE.
723*e4b17023SJohn Marino    Returns the newly created loop.  Frequencies and counts in the new loop
724*e4b17023SJohn Marino    are scaled by FALSE_SCALE and in the old one by TRUE_SCALE.  */
725*e4b17023SJohn Marino 
726*e4b17023SJohn Marino struct loop *
loopify(edge latch_edge,edge header_edge,basic_block switch_bb,edge true_edge,edge false_edge,bool redirect_all_edges,unsigned true_scale,unsigned false_scale)727*e4b17023SJohn Marino loopify (edge latch_edge, edge header_edge,
728*e4b17023SJohn Marino 	 basic_block switch_bb, edge true_edge, edge false_edge,
729*e4b17023SJohn Marino 	 bool redirect_all_edges, unsigned true_scale, unsigned false_scale)
730*e4b17023SJohn Marino {
731*e4b17023SJohn Marino   basic_block succ_bb = latch_edge->dest;
732*e4b17023SJohn Marino   basic_block pred_bb = header_edge->src;
733*e4b17023SJohn Marino   struct loop *loop = alloc_loop ();
734*e4b17023SJohn Marino   struct loop *outer = loop_outer (succ_bb->loop_father);
735*e4b17023SJohn Marino   int freq;
736*e4b17023SJohn Marino   gcov_type cnt;
737*e4b17023SJohn Marino   edge e;
738*e4b17023SJohn Marino   edge_iterator ei;
739*e4b17023SJohn Marino 
740*e4b17023SJohn Marino   loop->header = header_edge->dest;
741*e4b17023SJohn Marino   loop->latch = latch_edge->src;
742*e4b17023SJohn Marino 
743*e4b17023SJohn Marino   freq = EDGE_FREQUENCY (header_edge);
744*e4b17023SJohn Marino   cnt = header_edge->count;
745*e4b17023SJohn Marino 
746*e4b17023SJohn Marino   /* Redirect edges.  */
747*e4b17023SJohn Marino   loop_redirect_edge (latch_edge, loop->header);
748*e4b17023SJohn Marino   loop_redirect_edge (true_edge, succ_bb);
749*e4b17023SJohn Marino 
750*e4b17023SJohn Marino   /* During loop versioning, one of the switch_bb edge is already properly
751*e4b17023SJohn Marino      set. Do not redirect it again unless redirect_all_edges is true.  */
752*e4b17023SJohn Marino   if (redirect_all_edges)
753*e4b17023SJohn Marino     {
754*e4b17023SJohn Marino       loop_redirect_edge (header_edge, switch_bb);
755*e4b17023SJohn Marino       loop_redirect_edge (false_edge, loop->header);
756*e4b17023SJohn Marino 
757*e4b17023SJohn Marino       /* Update dominators.  */
758*e4b17023SJohn Marino       set_immediate_dominator (CDI_DOMINATORS, switch_bb, pred_bb);
759*e4b17023SJohn Marino       set_immediate_dominator (CDI_DOMINATORS, loop->header, switch_bb);
760*e4b17023SJohn Marino     }
761*e4b17023SJohn Marino 
762*e4b17023SJohn Marino   set_immediate_dominator (CDI_DOMINATORS, succ_bb, switch_bb);
763*e4b17023SJohn Marino 
764*e4b17023SJohn Marino   /* Compute new loop.  */
765*e4b17023SJohn Marino   add_loop (loop, outer);
766*e4b17023SJohn Marino 
767*e4b17023SJohn Marino   /* Add switch_bb to appropriate loop.  */
768*e4b17023SJohn Marino   if (switch_bb->loop_father)
769*e4b17023SJohn Marino     remove_bb_from_loops (switch_bb);
770*e4b17023SJohn Marino   add_bb_to_loop (switch_bb, outer);
771*e4b17023SJohn Marino 
772*e4b17023SJohn Marino   /* Fix frequencies.  */
773*e4b17023SJohn Marino   if (redirect_all_edges)
774*e4b17023SJohn Marino     {
775*e4b17023SJohn Marino       switch_bb->frequency = freq;
776*e4b17023SJohn Marino       switch_bb->count = cnt;
777*e4b17023SJohn Marino       FOR_EACH_EDGE (e, ei, switch_bb->succs)
778*e4b17023SJohn Marino 	{
779*e4b17023SJohn Marino 	  e->count = (switch_bb->count * e->probability) / REG_BR_PROB_BASE;
780*e4b17023SJohn Marino 	}
781*e4b17023SJohn Marino     }
782*e4b17023SJohn Marino   scale_loop_frequencies (loop, false_scale, REG_BR_PROB_BASE);
783*e4b17023SJohn Marino   scale_loop_frequencies (succ_bb->loop_father, true_scale, REG_BR_PROB_BASE);
784*e4b17023SJohn Marino   update_dominators_in_loop (loop);
785*e4b17023SJohn Marino 
786*e4b17023SJohn Marino   return loop;
787*e4b17023SJohn Marino }
788*e4b17023SJohn Marino 
789*e4b17023SJohn Marino /* Remove the latch edge of a LOOP and update loops to indicate that
790*e4b17023SJohn Marino    the LOOP was removed.  After this function, original loop latch will
791*e4b17023SJohn Marino    have no successor, which caller is expected to fix somehow.
792*e4b17023SJohn Marino 
793*e4b17023SJohn Marino    If this may cause the information about irreducible regions to become
794*e4b17023SJohn Marino    invalid, IRRED_INVALIDATED is set to true.  */
795*e4b17023SJohn Marino 
796*e4b17023SJohn Marino static void
unloop(struct loop * loop,bool * irred_invalidated)797*e4b17023SJohn Marino unloop (struct loop *loop, bool *irred_invalidated)
798*e4b17023SJohn Marino {
799*e4b17023SJohn Marino   basic_block *body;
800*e4b17023SJohn Marino   struct loop *ploop;
801*e4b17023SJohn Marino   unsigned i, n;
802*e4b17023SJohn Marino   basic_block latch = loop->latch;
803*e4b17023SJohn Marino   bool dummy = false;
804*e4b17023SJohn Marino 
805*e4b17023SJohn Marino   if (loop_preheader_edge (loop)->flags & EDGE_IRREDUCIBLE_LOOP)
806*e4b17023SJohn Marino     *irred_invalidated = true;
807*e4b17023SJohn Marino 
808*e4b17023SJohn Marino   /* This is relatively straightforward.  The dominators are unchanged, as
809*e4b17023SJohn Marino      loop header dominates loop latch, so the only thing we have to care of
810*e4b17023SJohn Marino      is the placement of loops and basic blocks inside the loop tree.  We
811*e4b17023SJohn Marino      move them all to the loop->outer, and then let fix_bb_placements do
812*e4b17023SJohn Marino      its work.  */
813*e4b17023SJohn Marino 
814*e4b17023SJohn Marino   body = get_loop_body (loop);
815*e4b17023SJohn Marino   n = loop->num_nodes;
816*e4b17023SJohn Marino   for (i = 0; i < n; i++)
817*e4b17023SJohn Marino     if (body[i]->loop_father == loop)
818*e4b17023SJohn Marino       {
819*e4b17023SJohn Marino 	remove_bb_from_loops (body[i]);
820*e4b17023SJohn Marino 	add_bb_to_loop (body[i], loop_outer (loop));
821*e4b17023SJohn Marino       }
822*e4b17023SJohn Marino   free(body);
823*e4b17023SJohn Marino 
824*e4b17023SJohn Marino   while (loop->inner)
825*e4b17023SJohn Marino     {
826*e4b17023SJohn Marino       ploop = loop->inner;
827*e4b17023SJohn Marino       flow_loop_tree_node_remove (ploop);
828*e4b17023SJohn Marino       flow_loop_tree_node_add (loop_outer (loop), ploop);
829*e4b17023SJohn Marino     }
830*e4b17023SJohn Marino 
831*e4b17023SJohn Marino   /* Remove the loop and free its data.  */
832*e4b17023SJohn Marino   delete_loop (loop);
833*e4b17023SJohn Marino 
834*e4b17023SJohn Marino   remove_edge (single_succ_edge (latch));
835*e4b17023SJohn Marino 
836*e4b17023SJohn Marino   /* We do not pass IRRED_INVALIDATED to fix_bb_placements here, as even if
837*e4b17023SJohn Marino      there is an irreducible region inside the cancelled loop, the flags will
838*e4b17023SJohn Marino      be still correct.  */
839*e4b17023SJohn Marino   fix_bb_placements (latch, &dummy);
840*e4b17023SJohn Marino }
841*e4b17023SJohn Marino 
842*e4b17023SJohn Marino /* Fix placement of superloops of LOOP inside loop tree, i.e. ensure that
843*e4b17023SJohn Marino    condition stated in description of fix_loop_placement holds for them.
844*e4b17023SJohn Marino    It is used in case when we removed some edges coming out of LOOP, which
845*e4b17023SJohn Marino    may cause the right placement of LOOP inside loop tree to change.
846*e4b17023SJohn Marino 
847*e4b17023SJohn Marino    IRRED_INVALIDATED is set to true if a change in the loop structures might
848*e4b17023SJohn Marino    invalidate the information about irreducible regions.  */
849*e4b17023SJohn Marino 
850*e4b17023SJohn Marino static void
fix_loop_placements(struct loop * loop,bool * irred_invalidated)851*e4b17023SJohn Marino fix_loop_placements (struct loop *loop, bool *irred_invalidated)
852*e4b17023SJohn Marino {
853*e4b17023SJohn Marino   struct loop *outer;
854*e4b17023SJohn Marino 
855*e4b17023SJohn Marino   while (loop_outer (loop))
856*e4b17023SJohn Marino     {
857*e4b17023SJohn Marino       outer = loop_outer (loop);
858*e4b17023SJohn Marino       if (!fix_loop_placement (loop))
859*e4b17023SJohn Marino 	break;
860*e4b17023SJohn Marino 
861*e4b17023SJohn Marino       /* Changing the placement of a loop in the loop tree may alter the
862*e4b17023SJohn Marino 	 validity of condition 2) of the description of fix_bb_placement
863*e4b17023SJohn Marino 	 for its preheader, because the successor is the header and belongs
864*e4b17023SJohn Marino 	 to the loop.  So call fix_bb_placements to fix up the placement
865*e4b17023SJohn Marino 	 of the preheader and (possibly) of its predecessors.  */
866*e4b17023SJohn Marino       fix_bb_placements (loop_preheader_edge (loop)->src,
867*e4b17023SJohn Marino 			 irred_invalidated);
868*e4b17023SJohn Marino       loop = outer;
869*e4b17023SJohn Marino     }
870*e4b17023SJohn Marino }
871*e4b17023SJohn Marino 
872*e4b17023SJohn Marino /* Copies copy of LOOP as subloop of TARGET loop, placing newly
873*e4b17023SJohn Marino    created loop into loops structure.  */
874*e4b17023SJohn Marino struct loop *
duplicate_loop(struct loop * loop,struct loop * target)875*e4b17023SJohn Marino duplicate_loop (struct loop *loop, struct loop *target)
876*e4b17023SJohn Marino {
877*e4b17023SJohn Marino   struct loop *cloop;
878*e4b17023SJohn Marino   cloop = alloc_loop ();
879*e4b17023SJohn Marino   place_new_loop (cloop);
880*e4b17023SJohn Marino 
881*e4b17023SJohn Marino   /* Mark the new loop as copy of LOOP.  */
882*e4b17023SJohn Marino   set_loop_copy (loop, cloop);
883*e4b17023SJohn Marino 
884*e4b17023SJohn Marino   /* Add it to target.  */
885*e4b17023SJohn Marino   flow_loop_tree_node_add (target, cloop);
886*e4b17023SJohn Marino 
887*e4b17023SJohn Marino   return cloop;
888*e4b17023SJohn Marino }
889*e4b17023SJohn Marino 
890*e4b17023SJohn Marino /* Copies structure of subloops of LOOP into TARGET loop, placing
891*e4b17023SJohn Marino    newly created loops into loop tree.  */
892*e4b17023SJohn Marino void
duplicate_subloops(struct loop * loop,struct loop * target)893*e4b17023SJohn Marino duplicate_subloops (struct loop *loop, struct loop *target)
894*e4b17023SJohn Marino {
895*e4b17023SJohn Marino   struct loop *aloop, *cloop;
896*e4b17023SJohn Marino 
897*e4b17023SJohn Marino   for (aloop = loop->inner; aloop; aloop = aloop->next)
898*e4b17023SJohn Marino     {
899*e4b17023SJohn Marino       cloop = duplicate_loop (aloop, target);
900*e4b17023SJohn Marino       duplicate_subloops (aloop, cloop);
901*e4b17023SJohn Marino     }
902*e4b17023SJohn Marino }
903*e4b17023SJohn Marino 
904*e4b17023SJohn Marino /* Copies structure of subloops of N loops, stored in array COPIED_LOOPS,
905*e4b17023SJohn Marino    into TARGET loop, placing newly created loops into loop tree.  */
906*e4b17023SJohn Marino static void
copy_loops_to(struct loop ** copied_loops,int n,struct loop * target)907*e4b17023SJohn Marino copy_loops_to (struct loop **copied_loops, int n, struct loop *target)
908*e4b17023SJohn Marino {
909*e4b17023SJohn Marino   struct loop *aloop;
910*e4b17023SJohn Marino   int i;
911*e4b17023SJohn Marino 
912*e4b17023SJohn Marino   for (i = 0; i < n; i++)
913*e4b17023SJohn Marino     {
914*e4b17023SJohn Marino       aloop = duplicate_loop (copied_loops[i], target);
915*e4b17023SJohn Marino       duplicate_subloops (copied_loops[i], aloop);
916*e4b17023SJohn Marino     }
917*e4b17023SJohn Marino }
918*e4b17023SJohn Marino 
919*e4b17023SJohn Marino /* Redirects edge E to basic block DEST.  */
920*e4b17023SJohn Marino static void
loop_redirect_edge(edge e,basic_block dest)921*e4b17023SJohn Marino loop_redirect_edge (edge e, basic_block dest)
922*e4b17023SJohn Marino {
923*e4b17023SJohn Marino   if (e->dest == dest)
924*e4b17023SJohn Marino     return;
925*e4b17023SJohn Marino 
926*e4b17023SJohn Marino   redirect_edge_and_branch_force (e, dest);
927*e4b17023SJohn Marino }
928*e4b17023SJohn Marino 
929*e4b17023SJohn Marino /* Check whether LOOP's body can be duplicated.  */
930*e4b17023SJohn Marino bool
can_duplicate_loop_p(const struct loop * loop)931*e4b17023SJohn Marino can_duplicate_loop_p (const struct loop *loop)
932*e4b17023SJohn Marino {
933*e4b17023SJohn Marino   int ret;
934*e4b17023SJohn Marino   basic_block *bbs = get_loop_body (loop);
935*e4b17023SJohn Marino 
936*e4b17023SJohn Marino   ret = can_copy_bbs_p (bbs, loop->num_nodes);
937*e4b17023SJohn Marino   free (bbs);
938*e4b17023SJohn Marino 
939*e4b17023SJohn Marino   return ret;
940*e4b17023SJohn Marino }
941*e4b17023SJohn Marino 
942*e4b17023SJohn Marino /* Sets probability and count of edge E to zero.  The probability and count
943*e4b17023SJohn Marino    is redistributed evenly to the remaining edges coming from E->src.  */
944*e4b17023SJohn Marino 
945*e4b17023SJohn Marino static void
set_zero_probability(edge e)946*e4b17023SJohn Marino set_zero_probability (edge e)
947*e4b17023SJohn Marino {
948*e4b17023SJohn Marino   basic_block bb = e->src;
949*e4b17023SJohn Marino   edge_iterator ei;
950*e4b17023SJohn Marino   edge ae, last = NULL;
951*e4b17023SJohn Marino   unsigned n = EDGE_COUNT (bb->succs);
952*e4b17023SJohn Marino   gcov_type cnt = e->count, cnt1;
953*e4b17023SJohn Marino   unsigned prob = e->probability, prob1;
954*e4b17023SJohn Marino 
955*e4b17023SJohn Marino   gcc_assert (n > 1);
956*e4b17023SJohn Marino   cnt1 = cnt / (n - 1);
957*e4b17023SJohn Marino   prob1 = prob / (n - 1);
958*e4b17023SJohn Marino 
959*e4b17023SJohn Marino   FOR_EACH_EDGE (ae, ei, bb->succs)
960*e4b17023SJohn Marino     {
961*e4b17023SJohn Marino       if (ae == e)
962*e4b17023SJohn Marino 	continue;
963*e4b17023SJohn Marino 
964*e4b17023SJohn Marino       ae->probability += prob1;
965*e4b17023SJohn Marino       ae->count += cnt1;
966*e4b17023SJohn Marino       last = ae;
967*e4b17023SJohn Marino     }
968*e4b17023SJohn Marino 
969*e4b17023SJohn Marino   /* Move the rest to one of the edges.  */
970*e4b17023SJohn Marino   last->probability += prob % (n - 1);
971*e4b17023SJohn Marino   last->count += cnt % (n - 1);
972*e4b17023SJohn Marino 
973*e4b17023SJohn Marino   e->probability = 0;
974*e4b17023SJohn Marino   e->count = 0;
975*e4b17023SJohn Marino }
976*e4b17023SJohn Marino 
977*e4b17023SJohn Marino /* Duplicates body of LOOP to given edge E NDUPL times.  Takes care of updating
978*e4b17023SJohn Marino    loop structure and dominators.  E's destination must be LOOP header for
979*e4b17023SJohn Marino    this to work, i.e. it must be entry or latch edge of this loop; these are
980*e4b17023SJohn Marino    unique, as the loops must have preheaders for this function to work
981*e4b17023SJohn Marino    correctly (in case E is latch, the function unrolls the loop, if E is entry
982*e4b17023SJohn Marino    edge, it peels the loop).  Store edges created by copying ORIG edge from
983*e4b17023SJohn Marino    copies corresponding to set bits in WONT_EXIT bitmap (bit 0 corresponds to
984*e4b17023SJohn Marino    original LOOP body, the other copies are numbered in order given by control
985*e4b17023SJohn Marino    flow through them) into TO_REMOVE array.  Returns false if duplication is
986*e4b17023SJohn Marino    impossible.  */
987*e4b17023SJohn Marino 
988*e4b17023SJohn Marino bool
duplicate_loop_to_header_edge(struct loop * loop,edge e,unsigned int ndupl,sbitmap wont_exit,edge orig,VEC (edge,heap)** to_remove,int flags)989*e4b17023SJohn Marino duplicate_loop_to_header_edge (struct loop *loop, edge e,
990*e4b17023SJohn Marino 			       unsigned int ndupl, sbitmap wont_exit,
991*e4b17023SJohn Marino 			       edge orig, VEC (edge, heap) **to_remove,
992*e4b17023SJohn Marino 			       int flags)
993*e4b17023SJohn Marino {
994*e4b17023SJohn Marino   struct loop *target, *aloop;
995*e4b17023SJohn Marino   struct loop **orig_loops;
996*e4b17023SJohn Marino   unsigned n_orig_loops;
997*e4b17023SJohn Marino   basic_block header = loop->header, latch = loop->latch;
998*e4b17023SJohn Marino   basic_block *new_bbs, *bbs, *first_active;
999*e4b17023SJohn Marino   basic_block new_bb, bb, first_active_latch = NULL;
1000*e4b17023SJohn Marino   edge ae, latch_edge;
1001*e4b17023SJohn Marino   edge spec_edges[2], new_spec_edges[2];
1002*e4b17023SJohn Marino #define SE_LATCH 0
1003*e4b17023SJohn Marino #define SE_ORIG 1
1004*e4b17023SJohn Marino   unsigned i, j, n;
1005*e4b17023SJohn Marino   int is_latch = (latch == e->src);
1006*e4b17023SJohn Marino   int scale_act = 0, *scale_step = NULL, scale_main = 0;
1007*e4b17023SJohn Marino   int scale_after_exit = 0;
1008*e4b17023SJohn Marino   int p, freq_in, freq_le, freq_out_orig;
1009*e4b17023SJohn Marino   int prob_pass_thru, prob_pass_wont_exit, prob_pass_main;
1010*e4b17023SJohn Marino   int add_irreducible_flag;
1011*e4b17023SJohn Marino   basic_block place_after;
1012*e4b17023SJohn Marino   bitmap bbs_to_scale = NULL;
1013*e4b17023SJohn Marino   bitmap_iterator bi;
1014*e4b17023SJohn Marino 
1015*e4b17023SJohn Marino   gcc_assert (e->dest == loop->header);
1016*e4b17023SJohn Marino   gcc_assert (ndupl > 0);
1017*e4b17023SJohn Marino 
1018*e4b17023SJohn Marino   if (orig)
1019*e4b17023SJohn Marino     {
1020*e4b17023SJohn Marino       /* Orig must be edge out of the loop.  */
1021*e4b17023SJohn Marino       gcc_assert (flow_bb_inside_loop_p (loop, orig->src));
1022*e4b17023SJohn Marino       gcc_assert (!flow_bb_inside_loop_p (loop, orig->dest));
1023*e4b17023SJohn Marino     }
1024*e4b17023SJohn Marino 
1025*e4b17023SJohn Marino   n = loop->num_nodes;
1026*e4b17023SJohn Marino   bbs = get_loop_body_in_dom_order (loop);
1027*e4b17023SJohn Marino   gcc_assert (bbs[0] == loop->header);
1028*e4b17023SJohn Marino   gcc_assert (bbs[n  - 1] == loop->latch);
1029*e4b17023SJohn Marino 
1030*e4b17023SJohn Marino   /* Check whether duplication is possible.  */
1031*e4b17023SJohn Marino   if (!can_copy_bbs_p (bbs, loop->num_nodes))
1032*e4b17023SJohn Marino     {
1033*e4b17023SJohn Marino       free (bbs);
1034*e4b17023SJohn Marino       return false;
1035*e4b17023SJohn Marino     }
1036*e4b17023SJohn Marino   new_bbs = XNEWVEC (basic_block, loop->num_nodes);
1037*e4b17023SJohn Marino 
1038*e4b17023SJohn Marino   /* In case we are doing loop peeling and the loop is in the middle of
1039*e4b17023SJohn Marino      irreducible region, the peeled copies will be inside it too.  */
1040*e4b17023SJohn Marino   add_irreducible_flag = e->flags & EDGE_IRREDUCIBLE_LOOP;
1041*e4b17023SJohn Marino   gcc_assert (!is_latch || !add_irreducible_flag);
1042*e4b17023SJohn Marino 
1043*e4b17023SJohn Marino   /* Find edge from latch.  */
1044*e4b17023SJohn Marino   latch_edge = loop_latch_edge (loop);
1045*e4b17023SJohn Marino 
1046*e4b17023SJohn Marino   if (flags & DLTHE_FLAG_UPDATE_FREQ)
1047*e4b17023SJohn Marino     {
1048*e4b17023SJohn Marino       /* Calculate coefficients by that we have to scale frequencies
1049*e4b17023SJohn Marino 	 of duplicated loop bodies.  */
1050*e4b17023SJohn Marino       freq_in = header->frequency;
1051*e4b17023SJohn Marino       freq_le = EDGE_FREQUENCY (latch_edge);
1052*e4b17023SJohn Marino       if (freq_in == 0)
1053*e4b17023SJohn Marino 	freq_in = 1;
1054*e4b17023SJohn Marino       if (freq_in < freq_le)
1055*e4b17023SJohn Marino 	freq_in = freq_le;
1056*e4b17023SJohn Marino       freq_out_orig = orig ? EDGE_FREQUENCY (orig) : freq_in - freq_le;
1057*e4b17023SJohn Marino       if (freq_out_orig > freq_in - freq_le)
1058*e4b17023SJohn Marino 	freq_out_orig = freq_in - freq_le;
1059*e4b17023SJohn Marino       prob_pass_thru = RDIV (REG_BR_PROB_BASE * freq_le, freq_in);
1060*e4b17023SJohn Marino       prob_pass_wont_exit =
1061*e4b17023SJohn Marino 	      RDIV (REG_BR_PROB_BASE * (freq_le + freq_out_orig), freq_in);
1062*e4b17023SJohn Marino 
1063*e4b17023SJohn Marino       if (orig
1064*e4b17023SJohn Marino 	  && REG_BR_PROB_BASE - orig->probability != 0)
1065*e4b17023SJohn Marino 	{
1066*e4b17023SJohn Marino 	  /* The blocks that are dominated by a removed exit edge ORIG have
1067*e4b17023SJohn Marino 	     frequencies scaled by this.  */
1068*e4b17023SJohn Marino 	  scale_after_exit = RDIV (REG_BR_PROB_BASE * REG_BR_PROB_BASE,
1069*e4b17023SJohn Marino 				   REG_BR_PROB_BASE - orig->probability);
1070*e4b17023SJohn Marino 	  bbs_to_scale = BITMAP_ALLOC (NULL);
1071*e4b17023SJohn Marino 	  for (i = 0; i < n; i++)
1072*e4b17023SJohn Marino 	    {
1073*e4b17023SJohn Marino 	      if (bbs[i] != orig->src
1074*e4b17023SJohn Marino 		  && dominated_by_p (CDI_DOMINATORS, bbs[i], orig->src))
1075*e4b17023SJohn Marino 		bitmap_set_bit (bbs_to_scale, i);
1076*e4b17023SJohn Marino 	    }
1077*e4b17023SJohn Marino 	}
1078*e4b17023SJohn Marino 
1079*e4b17023SJohn Marino       scale_step = XNEWVEC (int, ndupl);
1080*e4b17023SJohn Marino 
1081*e4b17023SJohn Marino       for (i = 1; i <= ndupl; i++)
1082*e4b17023SJohn Marino 	scale_step[i - 1] = TEST_BIT (wont_exit, i)
1083*e4b17023SJohn Marino 				? prob_pass_wont_exit
1084*e4b17023SJohn Marino 				: prob_pass_thru;
1085*e4b17023SJohn Marino 
1086*e4b17023SJohn Marino       /* Complete peeling is special as the probability of exit in last
1087*e4b17023SJohn Marino 	 copy becomes 1.  */
1088*e4b17023SJohn Marino       if (flags & DLTHE_FLAG_COMPLETTE_PEEL)
1089*e4b17023SJohn Marino 	{
1090*e4b17023SJohn Marino 	  int wanted_freq = EDGE_FREQUENCY (e);
1091*e4b17023SJohn Marino 
1092*e4b17023SJohn Marino 	  if (wanted_freq > freq_in)
1093*e4b17023SJohn Marino 	    wanted_freq = freq_in;
1094*e4b17023SJohn Marino 
1095*e4b17023SJohn Marino 	  gcc_assert (!is_latch);
1096*e4b17023SJohn Marino 	  /* First copy has frequency of incoming edge.  Each subsequent
1097*e4b17023SJohn Marino 	     frequency should be reduced by prob_pass_wont_exit.  Caller
1098*e4b17023SJohn Marino 	     should've managed the flags so all except for original loop
1099*e4b17023SJohn Marino 	     has won't exist set.  */
1100*e4b17023SJohn Marino 	  scale_act = RDIV (wanted_freq * REG_BR_PROB_BASE, freq_in);
1101*e4b17023SJohn Marino 	  /* Now simulate the duplication adjustments and compute header
1102*e4b17023SJohn Marino 	     frequency of the last copy.  */
1103*e4b17023SJohn Marino 	  for (i = 0; i < ndupl; i++)
1104*e4b17023SJohn Marino 	    wanted_freq = RDIV (wanted_freq * scale_step[i], REG_BR_PROB_BASE);
1105*e4b17023SJohn Marino 	  scale_main = RDIV (wanted_freq * REG_BR_PROB_BASE, freq_in);
1106*e4b17023SJohn Marino 	}
1107*e4b17023SJohn Marino       else if (is_latch)
1108*e4b17023SJohn Marino 	{
1109*e4b17023SJohn Marino 	  prob_pass_main = TEST_BIT (wont_exit, 0)
1110*e4b17023SJohn Marino 				? prob_pass_wont_exit
1111*e4b17023SJohn Marino 				: prob_pass_thru;
1112*e4b17023SJohn Marino 	  p = prob_pass_main;
1113*e4b17023SJohn Marino 	  scale_main = REG_BR_PROB_BASE;
1114*e4b17023SJohn Marino 	  for (i = 0; i < ndupl; i++)
1115*e4b17023SJohn Marino 	    {
1116*e4b17023SJohn Marino 	      scale_main += p;
1117*e4b17023SJohn Marino 	      p = RDIV (p * scale_step[i], REG_BR_PROB_BASE);
1118*e4b17023SJohn Marino 	    }
1119*e4b17023SJohn Marino 	  scale_main = RDIV (REG_BR_PROB_BASE * REG_BR_PROB_BASE, scale_main);
1120*e4b17023SJohn Marino 	  scale_act = RDIV (scale_main * prob_pass_main, REG_BR_PROB_BASE);
1121*e4b17023SJohn Marino 	}
1122*e4b17023SJohn Marino       else
1123*e4b17023SJohn Marino 	{
1124*e4b17023SJohn Marino 	  scale_main = REG_BR_PROB_BASE;
1125*e4b17023SJohn Marino 	  for (i = 0; i < ndupl; i++)
1126*e4b17023SJohn Marino 	    scale_main = RDIV (scale_main * scale_step[i], REG_BR_PROB_BASE);
1127*e4b17023SJohn Marino 	  scale_act = REG_BR_PROB_BASE - prob_pass_thru;
1128*e4b17023SJohn Marino 	}
1129*e4b17023SJohn Marino       for (i = 0; i < ndupl; i++)
1130*e4b17023SJohn Marino 	gcc_assert (scale_step[i] >= 0 && scale_step[i] <= REG_BR_PROB_BASE);
1131*e4b17023SJohn Marino       gcc_assert (scale_main >= 0 && scale_main <= REG_BR_PROB_BASE
1132*e4b17023SJohn Marino 		  && scale_act >= 0  && scale_act <= REG_BR_PROB_BASE);
1133*e4b17023SJohn Marino     }
1134*e4b17023SJohn Marino 
1135*e4b17023SJohn Marino   /* Loop the new bbs will belong to.  */
1136*e4b17023SJohn Marino   target = e->src->loop_father;
1137*e4b17023SJohn Marino 
1138*e4b17023SJohn Marino   /* Original loops.  */
1139*e4b17023SJohn Marino   n_orig_loops = 0;
1140*e4b17023SJohn Marino   for (aloop = loop->inner; aloop; aloop = aloop->next)
1141*e4b17023SJohn Marino     n_orig_loops++;
1142*e4b17023SJohn Marino   orig_loops = XCNEWVEC (struct loop *, n_orig_loops);
1143*e4b17023SJohn Marino   for (aloop = loop->inner, i = 0; aloop; aloop = aloop->next, i++)
1144*e4b17023SJohn Marino     orig_loops[i] = aloop;
1145*e4b17023SJohn Marino 
1146*e4b17023SJohn Marino   set_loop_copy (loop, target);
1147*e4b17023SJohn Marino 
1148*e4b17023SJohn Marino   first_active = XNEWVEC (basic_block, n);
1149*e4b17023SJohn Marino   if (is_latch)
1150*e4b17023SJohn Marino     {
1151*e4b17023SJohn Marino       memcpy (first_active, bbs, n * sizeof (basic_block));
1152*e4b17023SJohn Marino       first_active_latch = latch;
1153*e4b17023SJohn Marino     }
1154*e4b17023SJohn Marino 
1155*e4b17023SJohn Marino   spec_edges[SE_ORIG] = orig;
1156*e4b17023SJohn Marino   spec_edges[SE_LATCH] = latch_edge;
1157*e4b17023SJohn Marino 
1158*e4b17023SJohn Marino   place_after = e->src;
1159*e4b17023SJohn Marino   for (j = 0; j < ndupl; j++)
1160*e4b17023SJohn Marino     {
1161*e4b17023SJohn Marino       /* Copy loops.  */
1162*e4b17023SJohn Marino       copy_loops_to (orig_loops, n_orig_loops, target);
1163*e4b17023SJohn Marino 
1164*e4b17023SJohn Marino       /* Copy bbs.  */
1165*e4b17023SJohn Marino       copy_bbs (bbs, n, new_bbs, spec_edges, 2, new_spec_edges, loop,
1166*e4b17023SJohn Marino 		place_after);
1167*e4b17023SJohn Marino       place_after = new_spec_edges[SE_LATCH]->src;
1168*e4b17023SJohn Marino 
1169*e4b17023SJohn Marino       if (flags & DLTHE_RECORD_COPY_NUMBER)
1170*e4b17023SJohn Marino 	for (i = 0; i < n; i++)
1171*e4b17023SJohn Marino 	  {
1172*e4b17023SJohn Marino 	    gcc_assert (!new_bbs[i]->aux);
1173*e4b17023SJohn Marino 	    new_bbs[i]->aux = (void *)(size_t)(j + 1);
1174*e4b17023SJohn Marino 	  }
1175*e4b17023SJohn Marino 
1176*e4b17023SJohn Marino       /* Note whether the blocks and edges belong to an irreducible loop.  */
1177*e4b17023SJohn Marino       if (add_irreducible_flag)
1178*e4b17023SJohn Marino 	{
1179*e4b17023SJohn Marino 	  for (i = 0; i < n; i++)
1180*e4b17023SJohn Marino 	    new_bbs[i]->flags |= BB_DUPLICATED;
1181*e4b17023SJohn Marino 	  for (i = 0; i < n; i++)
1182*e4b17023SJohn Marino 	    {
1183*e4b17023SJohn Marino 	      edge_iterator ei;
1184*e4b17023SJohn Marino 	      new_bb = new_bbs[i];
1185*e4b17023SJohn Marino 	      if (new_bb->loop_father == target)
1186*e4b17023SJohn Marino 		new_bb->flags |= BB_IRREDUCIBLE_LOOP;
1187*e4b17023SJohn Marino 
1188*e4b17023SJohn Marino 	      FOR_EACH_EDGE (ae, ei, new_bb->succs)
1189*e4b17023SJohn Marino 		if ((ae->dest->flags & BB_DUPLICATED)
1190*e4b17023SJohn Marino 		    && (ae->src->loop_father == target
1191*e4b17023SJohn Marino 			|| ae->dest->loop_father == target))
1192*e4b17023SJohn Marino 		  ae->flags |= EDGE_IRREDUCIBLE_LOOP;
1193*e4b17023SJohn Marino 	    }
1194*e4b17023SJohn Marino 	  for (i = 0; i < n; i++)
1195*e4b17023SJohn Marino 	    new_bbs[i]->flags &= ~BB_DUPLICATED;
1196*e4b17023SJohn Marino 	}
1197*e4b17023SJohn Marino 
1198*e4b17023SJohn Marino       /* Redirect the special edges.  */
1199*e4b17023SJohn Marino       if (is_latch)
1200*e4b17023SJohn Marino 	{
1201*e4b17023SJohn Marino 	  redirect_edge_and_branch_force (latch_edge, new_bbs[0]);
1202*e4b17023SJohn Marino 	  redirect_edge_and_branch_force (new_spec_edges[SE_LATCH],
1203*e4b17023SJohn Marino 					  loop->header);
1204*e4b17023SJohn Marino 	  set_immediate_dominator (CDI_DOMINATORS, new_bbs[0], latch);
1205*e4b17023SJohn Marino 	  latch = loop->latch = new_bbs[n - 1];
1206*e4b17023SJohn Marino 	  e = latch_edge = new_spec_edges[SE_LATCH];
1207*e4b17023SJohn Marino 	}
1208*e4b17023SJohn Marino       else
1209*e4b17023SJohn Marino 	{
1210*e4b17023SJohn Marino 	  redirect_edge_and_branch_force (new_spec_edges[SE_LATCH],
1211*e4b17023SJohn Marino 					  loop->header);
1212*e4b17023SJohn Marino 	  redirect_edge_and_branch_force (e, new_bbs[0]);
1213*e4b17023SJohn Marino 	  set_immediate_dominator (CDI_DOMINATORS, new_bbs[0], e->src);
1214*e4b17023SJohn Marino 	  e = new_spec_edges[SE_LATCH];
1215*e4b17023SJohn Marino 	}
1216*e4b17023SJohn Marino 
1217*e4b17023SJohn Marino       /* Record exit edge in this copy.  */
1218*e4b17023SJohn Marino       if (orig && TEST_BIT (wont_exit, j + 1))
1219*e4b17023SJohn Marino 	{
1220*e4b17023SJohn Marino 	  if (to_remove)
1221*e4b17023SJohn Marino 	    VEC_safe_push (edge, heap, *to_remove, new_spec_edges[SE_ORIG]);
1222*e4b17023SJohn Marino 	  set_zero_probability (new_spec_edges[SE_ORIG]);
1223*e4b17023SJohn Marino 
1224*e4b17023SJohn Marino 	  /* Scale the frequencies of the blocks dominated by the exit.  */
1225*e4b17023SJohn Marino 	  if (bbs_to_scale)
1226*e4b17023SJohn Marino 	    {
1227*e4b17023SJohn Marino 	      EXECUTE_IF_SET_IN_BITMAP (bbs_to_scale, 0, i, bi)
1228*e4b17023SJohn Marino 		{
1229*e4b17023SJohn Marino 		  scale_bbs_frequencies_int (new_bbs + i, 1, scale_after_exit,
1230*e4b17023SJohn Marino 					     REG_BR_PROB_BASE);
1231*e4b17023SJohn Marino 		}
1232*e4b17023SJohn Marino 	    }
1233*e4b17023SJohn Marino 	}
1234*e4b17023SJohn Marino 
1235*e4b17023SJohn Marino       /* Record the first copy in the control flow order if it is not
1236*e4b17023SJohn Marino 	 the original loop (i.e. in case of peeling).  */
1237*e4b17023SJohn Marino       if (!first_active_latch)
1238*e4b17023SJohn Marino 	{
1239*e4b17023SJohn Marino 	  memcpy (first_active, new_bbs, n * sizeof (basic_block));
1240*e4b17023SJohn Marino 	  first_active_latch = new_bbs[n - 1];
1241*e4b17023SJohn Marino 	}
1242*e4b17023SJohn Marino 
1243*e4b17023SJohn Marino       /* Set counts and frequencies.  */
1244*e4b17023SJohn Marino       if (flags & DLTHE_FLAG_UPDATE_FREQ)
1245*e4b17023SJohn Marino 	{
1246*e4b17023SJohn Marino 	  scale_bbs_frequencies_int (new_bbs, n, scale_act, REG_BR_PROB_BASE);
1247*e4b17023SJohn Marino 	  scale_act = RDIV (scale_act * scale_step[j], REG_BR_PROB_BASE);
1248*e4b17023SJohn Marino 	}
1249*e4b17023SJohn Marino     }
1250*e4b17023SJohn Marino   free (new_bbs);
1251*e4b17023SJohn Marino   free (orig_loops);
1252*e4b17023SJohn Marino 
1253*e4b17023SJohn Marino   /* Record the exit edge in the original loop body, and update the frequencies.  */
1254*e4b17023SJohn Marino   if (orig && TEST_BIT (wont_exit, 0))
1255*e4b17023SJohn Marino     {
1256*e4b17023SJohn Marino       if (to_remove)
1257*e4b17023SJohn Marino 	VEC_safe_push (edge, heap, *to_remove, orig);
1258*e4b17023SJohn Marino       set_zero_probability (orig);
1259*e4b17023SJohn Marino 
1260*e4b17023SJohn Marino       /* Scale the frequencies of the blocks dominated by the exit.  */
1261*e4b17023SJohn Marino       if (bbs_to_scale)
1262*e4b17023SJohn Marino 	{
1263*e4b17023SJohn Marino 	  EXECUTE_IF_SET_IN_BITMAP (bbs_to_scale, 0, i, bi)
1264*e4b17023SJohn Marino 	    {
1265*e4b17023SJohn Marino 	      scale_bbs_frequencies_int (bbs + i, 1, scale_after_exit,
1266*e4b17023SJohn Marino 					 REG_BR_PROB_BASE);
1267*e4b17023SJohn Marino 	    }
1268*e4b17023SJohn Marino 	}
1269*e4b17023SJohn Marino     }
1270*e4b17023SJohn Marino 
1271*e4b17023SJohn Marino   /* Update the original loop.  */
1272*e4b17023SJohn Marino   if (!is_latch)
1273*e4b17023SJohn Marino     set_immediate_dominator (CDI_DOMINATORS, e->dest, e->src);
1274*e4b17023SJohn Marino   if (flags & DLTHE_FLAG_UPDATE_FREQ)
1275*e4b17023SJohn Marino     {
1276*e4b17023SJohn Marino       scale_bbs_frequencies_int (bbs, n, scale_main, REG_BR_PROB_BASE);
1277*e4b17023SJohn Marino       free (scale_step);
1278*e4b17023SJohn Marino     }
1279*e4b17023SJohn Marino 
1280*e4b17023SJohn Marino   /* Update dominators of outer blocks if affected.  */
1281*e4b17023SJohn Marino   for (i = 0; i < n; i++)
1282*e4b17023SJohn Marino     {
1283*e4b17023SJohn Marino       basic_block dominated, dom_bb;
1284*e4b17023SJohn Marino       VEC (basic_block, heap) *dom_bbs;
1285*e4b17023SJohn Marino       unsigned j;
1286*e4b17023SJohn Marino 
1287*e4b17023SJohn Marino       bb = bbs[i];
1288*e4b17023SJohn Marino       bb->aux = 0;
1289*e4b17023SJohn Marino 
1290*e4b17023SJohn Marino       dom_bbs = get_dominated_by (CDI_DOMINATORS, bb);
1291*e4b17023SJohn Marino       FOR_EACH_VEC_ELT (basic_block, dom_bbs, j, dominated)
1292*e4b17023SJohn Marino 	{
1293*e4b17023SJohn Marino 	  if (flow_bb_inside_loop_p (loop, dominated))
1294*e4b17023SJohn Marino 	    continue;
1295*e4b17023SJohn Marino 	  dom_bb = nearest_common_dominator (
1296*e4b17023SJohn Marino 			CDI_DOMINATORS, first_active[i], first_active_latch);
1297*e4b17023SJohn Marino 	  set_immediate_dominator (CDI_DOMINATORS, dominated, dom_bb);
1298*e4b17023SJohn Marino 	}
1299*e4b17023SJohn Marino       VEC_free (basic_block, heap, dom_bbs);
1300*e4b17023SJohn Marino     }
1301*e4b17023SJohn Marino   free (first_active);
1302*e4b17023SJohn Marino 
1303*e4b17023SJohn Marino   free (bbs);
1304*e4b17023SJohn Marino   BITMAP_FREE (bbs_to_scale);
1305*e4b17023SJohn Marino 
1306*e4b17023SJohn Marino   return true;
1307*e4b17023SJohn Marino }
1308*e4b17023SJohn Marino 
1309*e4b17023SJohn Marino /* A callback for make_forwarder block, to redirect all edges except for
1310*e4b17023SJohn Marino    MFB_KJ_EDGE to the entry part.  E is the edge for that we should decide
1311*e4b17023SJohn Marino    whether to redirect it.  */
1312*e4b17023SJohn Marino 
1313*e4b17023SJohn Marino edge mfb_kj_edge;
1314*e4b17023SJohn Marino bool
mfb_keep_just(edge e)1315*e4b17023SJohn Marino mfb_keep_just (edge e)
1316*e4b17023SJohn Marino {
1317*e4b17023SJohn Marino   return e != mfb_kj_edge;
1318*e4b17023SJohn Marino }
1319*e4b17023SJohn Marino 
1320*e4b17023SJohn Marino /* True when a candidate preheader BLOCK has predecessors from LOOP.  */
1321*e4b17023SJohn Marino 
1322*e4b17023SJohn Marino static bool
has_preds_from_loop(basic_block block,struct loop * loop)1323*e4b17023SJohn Marino has_preds_from_loop (basic_block block, struct loop *loop)
1324*e4b17023SJohn Marino {
1325*e4b17023SJohn Marino   edge e;
1326*e4b17023SJohn Marino   edge_iterator ei;
1327*e4b17023SJohn Marino 
1328*e4b17023SJohn Marino   FOR_EACH_EDGE (e, ei, block->preds)
1329*e4b17023SJohn Marino     if (e->src->loop_father == loop)
1330*e4b17023SJohn Marino       return true;
1331*e4b17023SJohn Marino   return false;
1332*e4b17023SJohn Marino }
1333*e4b17023SJohn Marino 
1334*e4b17023SJohn Marino /* Creates a pre-header for a LOOP.  Returns newly created block.  Unless
1335*e4b17023SJohn Marino    CP_SIMPLE_PREHEADERS is set in FLAGS, we only force LOOP to have single
1336*e4b17023SJohn Marino    entry; otherwise we also force preheader block to have only one successor.
1337*e4b17023SJohn Marino    When CP_FALLTHRU_PREHEADERS is set in FLAGS, we force the preheader block
1338*e4b17023SJohn Marino    to be a fallthru predecessor to the loop header and to have only
1339*e4b17023SJohn Marino    predecessors from outside of the loop.
1340*e4b17023SJohn Marino    The function also updates dominators.  */
1341*e4b17023SJohn Marino 
1342*e4b17023SJohn Marino basic_block
create_preheader(struct loop * loop,int flags)1343*e4b17023SJohn Marino create_preheader (struct loop *loop, int flags)
1344*e4b17023SJohn Marino {
1345*e4b17023SJohn Marino   edge e, fallthru;
1346*e4b17023SJohn Marino   basic_block dummy;
1347*e4b17023SJohn Marino   int nentry = 0;
1348*e4b17023SJohn Marino   bool irred = false;
1349*e4b17023SJohn Marino   bool latch_edge_was_fallthru;
1350*e4b17023SJohn Marino   edge one_succ_pred = NULL, single_entry = NULL;
1351*e4b17023SJohn Marino   edge_iterator ei;
1352*e4b17023SJohn Marino 
1353*e4b17023SJohn Marino   FOR_EACH_EDGE (e, ei, loop->header->preds)
1354*e4b17023SJohn Marino     {
1355*e4b17023SJohn Marino       if (e->src == loop->latch)
1356*e4b17023SJohn Marino 	continue;
1357*e4b17023SJohn Marino       irred |= (e->flags & EDGE_IRREDUCIBLE_LOOP) != 0;
1358*e4b17023SJohn Marino       nentry++;
1359*e4b17023SJohn Marino       single_entry = e;
1360*e4b17023SJohn Marino       if (single_succ_p (e->src))
1361*e4b17023SJohn Marino 	one_succ_pred = e;
1362*e4b17023SJohn Marino     }
1363*e4b17023SJohn Marino   gcc_assert (nentry);
1364*e4b17023SJohn Marino   if (nentry == 1)
1365*e4b17023SJohn Marino     {
1366*e4b17023SJohn Marino       bool need_forwarder_block = false;
1367*e4b17023SJohn Marino 
1368*e4b17023SJohn Marino       /* We do not allow entry block to be the loop preheader, since we
1369*e4b17023SJohn Marino 	     cannot emit code there.  */
1370*e4b17023SJohn Marino       if (single_entry->src == ENTRY_BLOCK_PTR)
1371*e4b17023SJohn Marino         need_forwarder_block = true;
1372*e4b17023SJohn Marino       else
1373*e4b17023SJohn Marino         {
1374*e4b17023SJohn Marino           /* If we want simple preheaders, also force the preheader to have
1375*e4b17023SJohn Marino              just a single successor.  */
1376*e4b17023SJohn Marino           if ((flags & CP_SIMPLE_PREHEADERS)
1377*e4b17023SJohn Marino               && !single_succ_p (single_entry->src))
1378*e4b17023SJohn Marino             need_forwarder_block = true;
1379*e4b17023SJohn Marino           /* If we want fallthru preheaders, also create forwarder block when
1380*e4b17023SJohn Marino              preheader ends with a jump or has predecessors from loop.  */
1381*e4b17023SJohn Marino           else if ((flags & CP_FALLTHRU_PREHEADERS)
1382*e4b17023SJohn Marino                    && (JUMP_P (BB_END (single_entry->src))
1383*e4b17023SJohn Marino                        || has_preds_from_loop (single_entry->src, loop)))
1384*e4b17023SJohn Marino             need_forwarder_block = true;
1385*e4b17023SJohn Marino         }
1386*e4b17023SJohn Marino       if (! need_forwarder_block)
1387*e4b17023SJohn Marino 	return NULL;
1388*e4b17023SJohn Marino     }
1389*e4b17023SJohn Marino 
1390*e4b17023SJohn Marino   mfb_kj_edge = loop_latch_edge (loop);
1391*e4b17023SJohn Marino   latch_edge_was_fallthru = (mfb_kj_edge->flags & EDGE_FALLTHRU) != 0;
1392*e4b17023SJohn Marino   fallthru = make_forwarder_block (loop->header, mfb_keep_just, NULL);
1393*e4b17023SJohn Marino   dummy = fallthru->src;
1394*e4b17023SJohn Marino   loop->header = fallthru->dest;
1395*e4b17023SJohn Marino 
1396*e4b17023SJohn Marino   /* Try to be clever in placing the newly created preheader.  The idea is to
1397*e4b17023SJohn Marino      avoid breaking any "fallthruness" relationship between blocks.
1398*e4b17023SJohn Marino 
1399*e4b17023SJohn Marino      The preheader was created just before the header and all incoming edges
1400*e4b17023SJohn Marino      to the header were redirected to the preheader, except the latch edge.
1401*e4b17023SJohn Marino      So the only problematic case is when this latch edge was a fallthru
1402*e4b17023SJohn Marino      edge: it is not anymore after the preheader creation so we have broken
1403*e4b17023SJohn Marino      the fallthruness.  We're therefore going to look for a better place.  */
1404*e4b17023SJohn Marino   if (latch_edge_was_fallthru)
1405*e4b17023SJohn Marino     {
1406*e4b17023SJohn Marino       if (one_succ_pred)
1407*e4b17023SJohn Marino 	e = one_succ_pred;
1408*e4b17023SJohn Marino       else
1409*e4b17023SJohn Marino 	e = EDGE_PRED (dummy, 0);
1410*e4b17023SJohn Marino 
1411*e4b17023SJohn Marino       move_block_after (dummy, e->src);
1412*e4b17023SJohn Marino     }
1413*e4b17023SJohn Marino 
1414*e4b17023SJohn Marino   if (irred)
1415*e4b17023SJohn Marino     {
1416*e4b17023SJohn Marino       dummy->flags |= BB_IRREDUCIBLE_LOOP;
1417*e4b17023SJohn Marino       single_succ_edge (dummy)->flags |= EDGE_IRREDUCIBLE_LOOP;
1418*e4b17023SJohn Marino     }
1419*e4b17023SJohn Marino 
1420*e4b17023SJohn Marino   if (dump_file)
1421*e4b17023SJohn Marino     fprintf (dump_file, "Created preheader block for loop %i\n",
1422*e4b17023SJohn Marino 	     loop->num);
1423*e4b17023SJohn Marino 
1424*e4b17023SJohn Marino   if (flags & CP_FALLTHRU_PREHEADERS)
1425*e4b17023SJohn Marino     gcc_assert ((single_succ_edge (dummy)->flags & EDGE_FALLTHRU)
1426*e4b17023SJohn Marino                 && !JUMP_P (BB_END (dummy)));
1427*e4b17023SJohn Marino 
1428*e4b17023SJohn Marino   return dummy;
1429*e4b17023SJohn Marino }
1430*e4b17023SJohn Marino 
1431*e4b17023SJohn Marino /* Create preheaders for each loop; for meaning of FLAGS see create_preheader.  */
1432*e4b17023SJohn Marino 
1433*e4b17023SJohn Marino void
create_preheaders(int flags)1434*e4b17023SJohn Marino create_preheaders (int flags)
1435*e4b17023SJohn Marino {
1436*e4b17023SJohn Marino   loop_iterator li;
1437*e4b17023SJohn Marino   struct loop *loop;
1438*e4b17023SJohn Marino 
1439*e4b17023SJohn Marino   if (!current_loops)
1440*e4b17023SJohn Marino     return;
1441*e4b17023SJohn Marino 
1442*e4b17023SJohn Marino   FOR_EACH_LOOP (li, loop, 0)
1443*e4b17023SJohn Marino     create_preheader (loop, flags);
1444*e4b17023SJohn Marino   loops_state_set (LOOPS_HAVE_PREHEADERS);
1445*e4b17023SJohn Marino }
1446*e4b17023SJohn Marino 
1447*e4b17023SJohn Marino /* Forces all loop latches to have only single successor.  */
1448*e4b17023SJohn Marino 
1449*e4b17023SJohn Marino void
force_single_succ_latches(void)1450*e4b17023SJohn Marino force_single_succ_latches (void)
1451*e4b17023SJohn Marino {
1452*e4b17023SJohn Marino   loop_iterator li;
1453*e4b17023SJohn Marino   struct loop *loop;
1454*e4b17023SJohn Marino   edge e;
1455*e4b17023SJohn Marino 
1456*e4b17023SJohn Marino   FOR_EACH_LOOP (li, loop, 0)
1457*e4b17023SJohn Marino     {
1458*e4b17023SJohn Marino       if (loop->latch != loop->header && single_succ_p (loop->latch))
1459*e4b17023SJohn Marino 	continue;
1460*e4b17023SJohn Marino 
1461*e4b17023SJohn Marino       e = find_edge (loop->latch, loop->header);
1462*e4b17023SJohn Marino 
1463*e4b17023SJohn Marino       split_edge (e);
1464*e4b17023SJohn Marino     }
1465*e4b17023SJohn Marino   loops_state_set (LOOPS_HAVE_SIMPLE_LATCHES);
1466*e4b17023SJohn Marino }
1467*e4b17023SJohn Marino 
1468*e4b17023SJohn Marino /* This function is called from loop_version.  It splits the entry edge
1469*e4b17023SJohn Marino    of the loop we want to version, adds the versioning condition, and
1470*e4b17023SJohn Marino    adjust the edges to the two versions of the loop appropriately.
1471*e4b17023SJohn Marino    e is an incoming edge. Returns the basic block containing the
1472*e4b17023SJohn Marino    condition.
1473*e4b17023SJohn Marino 
1474*e4b17023SJohn Marino    --- edge e ---- > [second_head]
1475*e4b17023SJohn Marino 
1476*e4b17023SJohn Marino    Split it and insert new conditional expression and adjust edges.
1477*e4b17023SJohn Marino 
1478*e4b17023SJohn Marino     --- edge e ---> [cond expr] ---> [first_head]
1479*e4b17023SJohn Marino 			|
1480*e4b17023SJohn Marino 			+---------> [second_head]
1481*e4b17023SJohn Marino 
1482*e4b17023SJohn Marino   THEN_PROB is the probability of then branch of the condition.  */
1483*e4b17023SJohn Marino 
1484*e4b17023SJohn Marino static basic_block
lv_adjust_loop_entry_edge(basic_block first_head,basic_block second_head,edge e,void * cond_expr,unsigned then_prob)1485*e4b17023SJohn Marino lv_adjust_loop_entry_edge (basic_block first_head, basic_block second_head,
1486*e4b17023SJohn Marino 			   edge e, void *cond_expr, unsigned then_prob)
1487*e4b17023SJohn Marino {
1488*e4b17023SJohn Marino   basic_block new_head = NULL;
1489*e4b17023SJohn Marino   edge e1;
1490*e4b17023SJohn Marino 
1491*e4b17023SJohn Marino   gcc_assert (e->dest == second_head);
1492*e4b17023SJohn Marino 
1493*e4b17023SJohn Marino   /* Split edge 'e'. This will create a new basic block, where we can
1494*e4b17023SJohn Marino      insert conditional expr.  */
1495*e4b17023SJohn Marino   new_head = split_edge (e);
1496*e4b17023SJohn Marino 
1497*e4b17023SJohn Marino   lv_add_condition_to_bb (first_head, second_head, new_head,
1498*e4b17023SJohn Marino 			  cond_expr);
1499*e4b17023SJohn Marino 
1500*e4b17023SJohn Marino   /* Don't set EDGE_TRUE_VALUE in RTL mode, as it's invalid there.  */
1501*e4b17023SJohn Marino   e = single_succ_edge (new_head);
1502*e4b17023SJohn Marino   e1 = make_edge (new_head, first_head,
1503*e4b17023SJohn Marino 		  current_ir_type () == IR_GIMPLE ? EDGE_TRUE_VALUE : 0);
1504*e4b17023SJohn Marino   e1->probability = then_prob;
1505*e4b17023SJohn Marino   e->probability = REG_BR_PROB_BASE - then_prob;
1506*e4b17023SJohn Marino   e1->count = RDIV (e->count * e1->probability, REG_BR_PROB_BASE);
1507*e4b17023SJohn Marino   e->count = RDIV (e->count * e->probability, REG_BR_PROB_BASE);
1508*e4b17023SJohn Marino 
1509*e4b17023SJohn Marino   set_immediate_dominator (CDI_DOMINATORS, first_head, new_head);
1510*e4b17023SJohn Marino   set_immediate_dominator (CDI_DOMINATORS, second_head, new_head);
1511*e4b17023SJohn Marino 
1512*e4b17023SJohn Marino   /* Adjust loop header phi nodes.  */
1513*e4b17023SJohn Marino   lv_adjust_loop_header_phi (first_head, second_head, new_head, e1);
1514*e4b17023SJohn Marino 
1515*e4b17023SJohn Marino   return new_head;
1516*e4b17023SJohn Marino }
1517*e4b17023SJohn Marino 
1518*e4b17023SJohn Marino /* Main entry point for Loop Versioning transformation.
1519*e4b17023SJohn Marino 
1520*e4b17023SJohn Marino    This transformation given a condition and a loop, creates
1521*e4b17023SJohn Marino    -if (condition) { loop_copy1 } else { loop_copy2 },
1522*e4b17023SJohn Marino    where loop_copy1 is the loop transformed in one way, and loop_copy2
1523*e4b17023SJohn Marino    is the loop transformed in another way (or unchanged). 'condition'
1524*e4b17023SJohn Marino    may be a run time test for things that were not resolved by static
1525*e4b17023SJohn Marino    analysis (overlapping ranges (anti-aliasing), alignment, etc.).
1526*e4b17023SJohn Marino 
1527*e4b17023SJohn Marino    THEN_PROB is the probability of the then edge of the if.  THEN_SCALE
1528*e4b17023SJohn Marino    is the ratio by that the frequencies in the original loop should
1529*e4b17023SJohn Marino    be scaled.  ELSE_SCALE is the ratio by that the frequencies in the
1530*e4b17023SJohn Marino    new loop should be scaled.
1531*e4b17023SJohn Marino 
1532*e4b17023SJohn Marino    If PLACE_AFTER is true, we place the new loop after LOOP in the
1533*e4b17023SJohn Marino    instruction stream, otherwise it is placed before LOOP.  */
1534*e4b17023SJohn Marino 
1535*e4b17023SJohn Marino struct loop *
loop_version(struct loop * loop,void * cond_expr,basic_block * condition_bb,unsigned then_prob,unsigned then_scale,unsigned else_scale,bool place_after)1536*e4b17023SJohn Marino loop_version (struct loop *loop,
1537*e4b17023SJohn Marino 	      void *cond_expr, basic_block *condition_bb,
1538*e4b17023SJohn Marino 	      unsigned then_prob, unsigned then_scale, unsigned else_scale,
1539*e4b17023SJohn Marino 	      bool place_after)
1540*e4b17023SJohn Marino {
1541*e4b17023SJohn Marino   basic_block first_head, second_head;
1542*e4b17023SJohn Marino   edge entry, latch_edge, true_edge, false_edge;
1543*e4b17023SJohn Marino   int irred_flag;
1544*e4b17023SJohn Marino   struct loop *nloop;
1545*e4b17023SJohn Marino   basic_block cond_bb;
1546*e4b17023SJohn Marino 
1547*e4b17023SJohn Marino   /* Record entry and latch edges for the loop */
1548*e4b17023SJohn Marino   entry = loop_preheader_edge (loop);
1549*e4b17023SJohn Marino   irred_flag = entry->flags & EDGE_IRREDUCIBLE_LOOP;
1550*e4b17023SJohn Marino   entry->flags &= ~EDGE_IRREDUCIBLE_LOOP;
1551*e4b17023SJohn Marino 
1552*e4b17023SJohn Marino   /* Note down head of loop as first_head.  */
1553*e4b17023SJohn Marino   first_head = entry->dest;
1554*e4b17023SJohn Marino 
1555*e4b17023SJohn Marino   /* Duplicate loop.  */
1556*e4b17023SJohn Marino   if (!cfg_hook_duplicate_loop_to_header_edge (loop, entry, 1,
1557*e4b17023SJohn Marino 					       NULL, NULL, NULL, 0))
1558*e4b17023SJohn Marino     {
1559*e4b17023SJohn Marino       entry->flags |= irred_flag;
1560*e4b17023SJohn Marino       return NULL;
1561*e4b17023SJohn Marino     }
1562*e4b17023SJohn Marino 
1563*e4b17023SJohn Marino   /* After duplication entry edge now points to new loop head block.
1564*e4b17023SJohn Marino      Note down new head as second_head.  */
1565*e4b17023SJohn Marino   second_head = entry->dest;
1566*e4b17023SJohn Marino 
1567*e4b17023SJohn Marino   /* Split loop entry edge and insert new block with cond expr.  */
1568*e4b17023SJohn Marino   cond_bb =  lv_adjust_loop_entry_edge (first_head, second_head,
1569*e4b17023SJohn Marino 					entry, cond_expr, then_prob);
1570*e4b17023SJohn Marino   if (condition_bb)
1571*e4b17023SJohn Marino     *condition_bb = cond_bb;
1572*e4b17023SJohn Marino 
1573*e4b17023SJohn Marino   if (!cond_bb)
1574*e4b17023SJohn Marino     {
1575*e4b17023SJohn Marino       entry->flags |= irred_flag;
1576*e4b17023SJohn Marino       return NULL;
1577*e4b17023SJohn Marino     }
1578*e4b17023SJohn Marino 
1579*e4b17023SJohn Marino   latch_edge = single_succ_edge (get_bb_copy (loop->latch));
1580*e4b17023SJohn Marino 
1581*e4b17023SJohn Marino   extract_cond_bb_edges (cond_bb, &true_edge, &false_edge);
1582*e4b17023SJohn Marino   nloop = loopify (latch_edge,
1583*e4b17023SJohn Marino 		   single_pred_edge (get_bb_copy (loop->header)),
1584*e4b17023SJohn Marino 		   cond_bb, true_edge, false_edge,
1585*e4b17023SJohn Marino 		   false /* Do not redirect all edges.  */,
1586*e4b17023SJohn Marino 		   then_scale, else_scale);
1587*e4b17023SJohn Marino 
1588*e4b17023SJohn Marino   /* loopify redirected latch_edge. Update its PENDING_STMTS.  */
1589*e4b17023SJohn Marino   lv_flush_pending_stmts (latch_edge);
1590*e4b17023SJohn Marino 
1591*e4b17023SJohn Marino   /* loopify redirected condition_bb's succ edge. Update its PENDING_STMTS.  */
1592*e4b17023SJohn Marino   extract_cond_bb_edges (cond_bb, &true_edge, &false_edge);
1593*e4b17023SJohn Marino   lv_flush_pending_stmts (false_edge);
1594*e4b17023SJohn Marino   /* Adjust irreducible flag.  */
1595*e4b17023SJohn Marino   if (irred_flag)
1596*e4b17023SJohn Marino     {
1597*e4b17023SJohn Marino       cond_bb->flags |= BB_IRREDUCIBLE_LOOP;
1598*e4b17023SJohn Marino       loop_preheader_edge (loop)->flags |= EDGE_IRREDUCIBLE_LOOP;
1599*e4b17023SJohn Marino       loop_preheader_edge (nloop)->flags |= EDGE_IRREDUCIBLE_LOOP;
1600*e4b17023SJohn Marino       single_pred_edge (cond_bb)->flags |= EDGE_IRREDUCIBLE_LOOP;
1601*e4b17023SJohn Marino     }
1602*e4b17023SJohn Marino 
1603*e4b17023SJohn Marino   if (place_after)
1604*e4b17023SJohn Marino     {
1605*e4b17023SJohn Marino       basic_block *bbs = get_loop_body_in_dom_order (nloop), after;
1606*e4b17023SJohn Marino       unsigned i;
1607*e4b17023SJohn Marino 
1608*e4b17023SJohn Marino       after = loop->latch;
1609*e4b17023SJohn Marino 
1610*e4b17023SJohn Marino       for (i = 0; i < nloop->num_nodes; i++)
1611*e4b17023SJohn Marino 	{
1612*e4b17023SJohn Marino 	  move_block_after (bbs[i], after);
1613*e4b17023SJohn Marino 	  after = bbs[i];
1614*e4b17023SJohn Marino 	}
1615*e4b17023SJohn Marino       free (bbs);
1616*e4b17023SJohn Marino     }
1617*e4b17023SJohn Marino 
1618*e4b17023SJohn Marino   /* At this point condition_bb is loop preheader with two successors,
1619*e4b17023SJohn Marino      first_head and second_head.   Make sure that loop preheader has only
1620*e4b17023SJohn Marino      one successor.  */
1621*e4b17023SJohn Marino   split_edge (loop_preheader_edge (loop));
1622*e4b17023SJohn Marino   split_edge (loop_preheader_edge (nloop));
1623*e4b17023SJohn Marino 
1624*e4b17023SJohn Marino   return nloop;
1625*e4b17023SJohn Marino }
1626*e4b17023SJohn Marino 
1627*e4b17023SJohn Marino /* The structure of loops might have changed.  Some loops might get removed
1628*e4b17023SJohn Marino    (and their headers and latches were set to NULL), loop exists might get
1629*e4b17023SJohn Marino    removed (thus the loop nesting may be wrong), and some blocks and edges
1630*e4b17023SJohn Marino    were changed (so the information about bb --> loop mapping does not have
1631*e4b17023SJohn Marino    to be correct).  But still for the remaining loops the header dominates
1632*e4b17023SJohn Marino    the latch, and loops did not get new subloops (new loops might possibly
1633*e4b17023SJohn Marino    get created, but we are not interested in them).  Fix up the mess.
1634*e4b17023SJohn Marino 
1635*e4b17023SJohn Marino    If CHANGED_BBS is not NULL, basic blocks whose loop has changed are
1636*e4b17023SJohn Marino    marked in it.  */
1637*e4b17023SJohn Marino 
1638*e4b17023SJohn Marino void
fix_loop_structure(bitmap changed_bbs)1639*e4b17023SJohn Marino fix_loop_structure (bitmap changed_bbs)
1640*e4b17023SJohn Marino {
1641*e4b17023SJohn Marino   basic_block bb;
1642*e4b17023SJohn Marino   struct loop *loop, *ploop;
1643*e4b17023SJohn Marino   loop_iterator li;
1644*e4b17023SJohn Marino   bool record_exits = false;
1645*e4b17023SJohn Marino   struct loop **superloop = XNEWVEC (struct loop *, number_of_loops ());
1646*e4b17023SJohn Marino 
1647*e4b17023SJohn Marino   /* Remove the old bb -> loop mapping.  Remember the depth of the blocks in
1648*e4b17023SJohn Marino      the loop hierarchy, so that we can recognize blocks whose loop nesting
1649*e4b17023SJohn Marino      relationship has changed.  */
1650*e4b17023SJohn Marino   FOR_EACH_BB (bb)
1651*e4b17023SJohn Marino     {
1652*e4b17023SJohn Marino       if (changed_bbs)
1653*e4b17023SJohn Marino 	bb->aux = (void *) (size_t) loop_depth (bb->loop_father);
1654*e4b17023SJohn Marino       bb->loop_father = current_loops->tree_root;
1655*e4b17023SJohn Marino     }
1656*e4b17023SJohn Marino 
1657*e4b17023SJohn Marino   if (loops_state_satisfies_p (LOOPS_HAVE_RECORDED_EXITS))
1658*e4b17023SJohn Marino     {
1659*e4b17023SJohn Marino       release_recorded_exits ();
1660*e4b17023SJohn Marino       record_exits = true;
1661*e4b17023SJohn Marino     }
1662*e4b17023SJohn Marino 
1663*e4b17023SJohn Marino   /* Remove the dead loops from structures.  We start from the innermost
1664*e4b17023SJohn Marino      loops, so that when we remove the loops, we know that the loops inside
1665*e4b17023SJohn Marino      are preserved, and do not waste time relinking loops that will be
1666*e4b17023SJohn Marino      removed later.  */
1667*e4b17023SJohn Marino   FOR_EACH_LOOP (li, loop, LI_FROM_INNERMOST)
1668*e4b17023SJohn Marino     {
1669*e4b17023SJohn Marino       if (loop->header)
1670*e4b17023SJohn Marino 	continue;
1671*e4b17023SJohn Marino 
1672*e4b17023SJohn Marino       while (loop->inner)
1673*e4b17023SJohn Marino 	{
1674*e4b17023SJohn Marino 	  ploop = loop->inner;
1675*e4b17023SJohn Marino 	  flow_loop_tree_node_remove (ploop);
1676*e4b17023SJohn Marino 	  flow_loop_tree_node_add (loop_outer (loop), ploop);
1677*e4b17023SJohn Marino 	}
1678*e4b17023SJohn Marino 
1679*e4b17023SJohn Marino       /* Remove the loop and free its data.  */
1680*e4b17023SJohn Marino       delete_loop (loop);
1681*e4b17023SJohn Marino     }
1682*e4b17023SJohn Marino 
1683*e4b17023SJohn Marino   /* Rescan the bodies of loops, starting from the outermost ones.  We assume
1684*e4b17023SJohn Marino      that no optimization interchanges the order of the loops, i.e., it cannot
1685*e4b17023SJohn Marino      happen that L1 was superloop of L2 before and it is subloop of L2 now
1686*e4b17023SJohn Marino      (without explicitly updating loop information).  At the same time, we also
1687*e4b17023SJohn Marino      determine the new loop structure.  */
1688*e4b17023SJohn Marino   current_loops->tree_root->num_nodes = n_basic_blocks;
1689*e4b17023SJohn Marino   FOR_EACH_LOOP (li, loop, 0)
1690*e4b17023SJohn Marino     {
1691*e4b17023SJohn Marino       superloop[loop->num] = loop->header->loop_father;
1692*e4b17023SJohn Marino       loop->num_nodes = flow_loop_nodes_find (loop->header, loop);
1693*e4b17023SJohn Marino     }
1694*e4b17023SJohn Marino 
1695*e4b17023SJohn Marino   /* Now fix the loop nesting.  */
1696*e4b17023SJohn Marino   FOR_EACH_LOOP (li, loop, 0)
1697*e4b17023SJohn Marino     {
1698*e4b17023SJohn Marino       ploop = superloop[loop->num];
1699*e4b17023SJohn Marino       if (ploop != loop_outer (loop))
1700*e4b17023SJohn Marino 	{
1701*e4b17023SJohn Marino 	  flow_loop_tree_node_remove (loop);
1702*e4b17023SJohn Marino 	  flow_loop_tree_node_add (ploop, loop);
1703*e4b17023SJohn Marino 	}
1704*e4b17023SJohn Marino     }
1705*e4b17023SJohn Marino   free (superloop);
1706*e4b17023SJohn Marino 
1707*e4b17023SJohn Marino   /* Mark the blocks whose loop has changed.  */
1708*e4b17023SJohn Marino   if (changed_bbs)
1709*e4b17023SJohn Marino     {
1710*e4b17023SJohn Marino       FOR_EACH_BB (bb)
1711*e4b17023SJohn Marino 	{
1712*e4b17023SJohn Marino 	  if ((void *) (size_t) loop_depth (bb->loop_father) != bb->aux)
1713*e4b17023SJohn Marino 	    bitmap_set_bit (changed_bbs, bb->index);
1714*e4b17023SJohn Marino 
1715*e4b17023SJohn Marino     	  bb->aux = NULL;
1716*e4b17023SJohn Marino 	}
1717*e4b17023SJohn Marino     }
1718*e4b17023SJohn Marino 
1719*e4b17023SJohn Marino   if (loops_state_satisfies_p (LOOPS_HAVE_PREHEADERS))
1720*e4b17023SJohn Marino     create_preheaders (CP_SIMPLE_PREHEADERS);
1721*e4b17023SJohn Marino 
1722*e4b17023SJohn Marino   if (loops_state_satisfies_p (LOOPS_HAVE_SIMPLE_LATCHES))
1723*e4b17023SJohn Marino     force_single_succ_latches ();
1724*e4b17023SJohn Marino 
1725*e4b17023SJohn Marino   if (loops_state_satisfies_p (LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS))
1726*e4b17023SJohn Marino     mark_irreducible_loops ();
1727*e4b17023SJohn Marino 
1728*e4b17023SJohn Marino   if (record_exits)
1729*e4b17023SJohn Marino     record_loop_exits ();
1730*e4b17023SJohn Marino 
1731*e4b17023SJohn Marino #ifdef ENABLE_CHECKING
1732*e4b17023SJohn Marino   verify_loop_structure ();
1733*e4b17023SJohn Marino #endif
1734*e4b17023SJohn Marino }
1735