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