1*c87b03e5Sespie /* Natural loop discovery code for GNU compiler.
2*c87b03e5Sespie Copyright (C) 2000, 2001 Free Software Foundation, Inc.
3*c87b03e5Sespie
4*c87b03e5Sespie This file is part of GCC.
5*c87b03e5Sespie
6*c87b03e5Sespie GCC is free software; you can redistribute it and/or modify it under
7*c87b03e5Sespie the terms of the GNU General Public License as published by the Free
8*c87b03e5Sespie Software Foundation; either version 2, or (at your option) any later
9*c87b03e5Sespie version.
10*c87b03e5Sespie
11*c87b03e5Sespie GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12*c87b03e5Sespie WARRANTY; without even the implied warranty of MERCHANTABILITY or
13*c87b03e5Sespie FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14*c87b03e5Sespie for more details.
15*c87b03e5Sespie
16*c87b03e5Sespie You should have received a copy of the GNU General Public License
17*c87b03e5Sespie along with GCC; see the file COPYING. If not, write to the Free
18*c87b03e5Sespie Software Foundation, 59 Temple Place - Suite 330, Boston, MA
19*c87b03e5Sespie 02111-1307, USA. */
20*c87b03e5Sespie
21*c87b03e5Sespie #include "config.h"
22*c87b03e5Sespie #include "system.h"
23*c87b03e5Sespie #include "rtl.h"
24*c87b03e5Sespie #include "hard-reg-set.h"
25*c87b03e5Sespie #include "basic-block.h"
26*c87b03e5Sespie #include "toplev.h"
27*c87b03e5Sespie
28*c87b03e5Sespie /* Ratio of frequencies of edges so that one of more latch edges is
29*c87b03e5Sespie considered to belong to inner loop with same header. */
30*c87b03e5Sespie #define HEAVY_EDGE_RATIO 8
31*c87b03e5Sespie
32*c87b03e5Sespie static void flow_loops_cfg_dump PARAMS ((const struct loops *,
33*c87b03e5Sespie FILE *));
34*c87b03e5Sespie static void flow_loop_entry_edges_find PARAMS ((struct loop *));
35*c87b03e5Sespie static void flow_loop_exit_edges_find PARAMS ((struct loop *));
36*c87b03e5Sespie static int flow_loop_nodes_find PARAMS ((basic_block, struct loop *));
37*c87b03e5Sespie static void flow_loop_pre_header_scan PARAMS ((struct loop *));
38*c87b03e5Sespie static basic_block flow_loop_pre_header_find PARAMS ((basic_block,
39*c87b03e5Sespie dominance_info));
40*c87b03e5Sespie static int flow_loop_level_compute PARAMS ((struct loop *));
41*c87b03e5Sespie static int flow_loops_level_compute PARAMS ((struct loops *));
42*c87b03e5Sespie static basic_block make_forwarder_block PARAMS ((basic_block, int, int,
43*c87b03e5Sespie edge, int));
44*c87b03e5Sespie static void canonicalize_loop_headers PARAMS ((void));
45*c87b03e5Sespie static bool glb_enum_p PARAMS ((basic_block, void *));
46*c87b03e5Sespie static void redirect_edge_with_latch_update PARAMS ((edge, basic_block));
47*c87b03e5Sespie static void flow_loop_free PARAMS ((struct loop *));
48*c87b03e5Sespie
49*c87b03e5Sespie /* Dump loop related CFG information. */
50*c87b03e5Sespie
51*c87b03e5Sespie static void
flow_loops_cfg_dump(loops,file)52*c87b03e5Sespie flow_loops_cfg_dump (loops, file)
53*c87b03e5Sespie const struct loops *loops;
54*c87b03e5Sespie FILE *file;
55*c87b03e5Sespie {
56*c87b03e5Sespie int i;
57*c87b03e5Sespie basic_block bb;
58*c87b03e5Sespie
59*c87b03e5Sespie if (! loops->num || ! file || ! loops->cfg.dom)
60*c87b03e5Sespie return;
61*c87b03e5Sespie
62*c87b03e5Sespie FOR_EACH_BB (bb)
63*c87b03e5Sespie {
64*c87b03e5Sespie edge succ;
65*c87b03e5Sespie
66*c87b03e5Sespie fprintf (file, ";; %d succs { ", bb->index);
67*c87b03e5Sespie for (succ = bb->succ; succ; succ = succ->succ_next)
68*c87b03e5Sespie fprintf (file, "%d ", succ->dest->index);
69*c87b03e5Sespie fprintf (file, "}\n");
70*c87b03e5Sespie }
71*c87b03e5Sespie
72*c87b03e5Sespie /* Dump the DFS node order. */
73*c87b03e5Sespie if (loops->cfg.dfs_order)
74*c87b03e5Sespie {
75*c87b03e5Sespie fputs (";; DFS order: ", file);
76*c87b03e5Sespie for (i = 0; i < n_basic_blocks; i++)
77*c87b03e5Sespie fprintf (file, "%d ", loops->cfg.dfs_order[i]);
78*c87b03e5Sespie
79*c87b03e5Sespie fputs ("\n", file);
80*c87b03e5Sespie }
81*c87b03e5Sespie
82*c87b03e5Sespie /* Dump the reverse completion node order. */
83*c87b03e5Sespie if (loops->cfg.rc_order)
84*c87b03e5Sespie {
85*c87b03e5Sespie fputs (";; RC order: ", file);
86*c87b03e5Sespie for (i = 0; i < n_basic_blocks; i++)
87*c87b03e5Sespie fprintf (file, "%d ", loops->cfg.rc_order[i]);
88*c87b03e5Sespie
89*c87b03e5Sespie fputs ("\n", file);
90*c87b03e5Sespie }
91*c87b03e5Sespie }
92*c87b03e5Sespie
93*c87b03e5Sespie /* Return nonzero if the nodes of LOOP are a subset of OUTER. */
94*c87b03e5Sespie
95*c87b03e5Sespie bool
flow_loop_nested_p(outer,loop)96*c87b03e5Sespie flow_loop_nested_p (outer, loop)
97*c87b03e5Sespie const struct loop *outer;
98*c87b03e5Sespie const struct loop *loop;
99*c87b03e5Sespie {
100*c87b03e5Sespie return loop->depth > outer->depth
101*c87b03e5Sespie && loop->pred[outer->depth] == outer;
102*c87b03e5Sespie }
103*c87b03e5Sespie
104*c87b03e5Sespie /* Dump the loop information specified by LOOP to the stream FILE
105*c87b03e5Sespie using auxiliary dump callback function LOOP_DUMP_AUX if non null. */
106*c87b03e5Sespie
107*c87b03e5Sespie void
flow_loop_dump(loop,file,loop_dump_aux,verbose)108*c87b03e5Sespie flow_loop_dump (loop, file, loop_dump_aux, verbose)
109*c87b03e5Sespie const struct loop *loop;
110*c87b03e5Sespie FILE *file;
111*c87b03e5Sespie void (*loop_dump_aux) PARAMS((const struct loop *, FILE *, int));
112*c87b03e5Sespie int verbose;
113*c87b03e5Sespie {
114*c87b03e5Sespie basic_block *bbs;
115*c87b03e5Sespie int i;
116*c87b03e5Sespie
117*c87b03e5Sespie if (! loop || ! loop->header)
118*c87b03e5Sespie return;
119*c87b03e5Sespie
120*c87b03e5Sespie fprintf (file, ";;\n;; Loop %d:%s\n", loop->num,
121*c87b03e5Sespie loop->invalid ? " invalid" : "");
122*c87b03e5Sespie
123*c87b03e5Sespie fprintf (file, ";; header %d, latch %d, pre-header %d\n",
124*c87b03e5Sespie loop->header->index, loop->latch->index,
125*c87b03e5Sespie loop->pre_header ? loop->pre_header->index : -1);
126*c87b03e5Sespie fprintf (file, ";; depth %d, level %d, outer %ld\n",
127*c87b03e5Sespie loop->depth, loop->level,
128*c87b03e5Sespie (long) (loop->outer ? loop->outer->num : -1));
129*c87b03e5Sespie
130*c87b03e5Sespie if (loop->pre_header_edges)
131*c87b03e5Sespie flow_edge_list_print (";; pre-header edges", loop->pre_header_edges,
132*c87b03e5Sespie loop->num_pre_header_edges, file);
133*c87b03e5Sespie
134*c87b03e5Sespie flow_edge_list_print (";; entry edges", loop->entry_edges,
135*c87b03e5Sespie loop->num_entries, file);
136*c87b03e5Sespie fprintf (file, ";; nodes:");
137*c87b03e5Sespie bbs = get_loop_body (loop);
138*c87b03e5Sespie for (i = 0; i < loop->num_nodes; i++)
139*c87b03e5Sespie fprintf (file, " %d", bbs[i]->index);
140*c87b03e5Sespie free (bbs);
141*c87b03e5Sespie fprintf (file, "\n");
142*c87b03e5Sespie flow_edge_list_print (";; exit edges", loop->exit_edges,
143*c87b03e5Sespie loop->num_exits, file);
144*c87b03e5Sespie
145*c87b03e5Sespie if (loop_dump_aux)
146*c87b03e5Sespie loop_dump_aux (loop, file, verbose);
147*c87b03e5Sespie }
148*c87b03e5Sespie
149*c87b03e5Sespie /* Dump the loop information specified by LOOPS to the stream FILE,
150*c87b03e5Sespie using auxiliary dump callback function LOOP_DUMP_AUX if non null. */
151*c87b03e5Sespie
152*c87b03e5Sespie void
flow_loops_dump(loops,file,loop_dump_aux,verbose)153*c87b03e5Sespie flow_loops_dump (loops, file, loop_dump_aux, verbose)
154*c87b03e5Sespie const struct loops *loops;
155*c87b03e5Sespie FILE *file;
156*c87b03e5Sespie void (*loop_dump_aux) PARAMS((const struct loop *, FILE *, int));
157*c87b03e5Sespie int verbose;
158*c87b03e5Sespie {
159*c87b03e5Sespie int i;
160*c87b03e5Sespie int num_loops;
161*c87b03e5Sespie
162*c87b03e5Sespie num_loops = loops->num;
163*c87b03e5Sespie if (! num_loops || ! file)
164*c87b03e5Sespie return;
165*c87b03e5Sespie
166*c87b03e5Sespie fprintf (file, ";; %d loops found, %d levels\n",
167*c87b03e5Sespie num_loops, loops->levels);
168*c87b03e5Sespie
169*c87b03e5Sespie for (i = 0; i < num_loops; i++)
170*c87b03e5Sespie {
171*c87b03e5Sespie struct loop *loop = loops->parray[i];
172*c87b03e5Sespie
173*c87b03e5Sespie if (!loop)
174*c87b03e5Sespie continue;
175*c87b03e5Sespie
176*c87b03e5Sespie flow_loop_dump (loop, file, loop_dump_aux, verbose);
177*c87b03e5Sespie }
178*c87b03e5Sespie
179*c87b03e5Sespie if (verbose)
180*c87b03e5Sespie flow_loops_cfg_dump (loops, file);
181*c87b03e5Sespie }
182*c87b03e5Sespie
183*c87b03e5Sespie /* Free data allocated for LOOP. */
184*c87b03e5Sespie static void
flow_loop_free(loop)185*c87b03e5Sespie flow_loop_free (loop)
186*c87b03e5Sespie struct loop *loop;
187*c87b03e5Sespie {
188*c87b03e5Sespie if (loop->pre_header_edges)
189*c87b03e5Sespie free (loop->pre_header_edges);
190*c87b03e5Sespie if (loop->entry_edges)
191*c87b03e5Sespie free (loop->entry_edges);
192*c87b03e5Sespie if (loop->exit_edges)
193*c87b03e5Sespie free (loop->exit_edges);
194*c87b03e5Sespie if (loop->pred)
195*c87b03e5Sespie free (loop->pred);
196*c87b03e5Sespie free (loop);
197*c87b03e5Sespie }
198*c87b03e5Sespie
199*c87b03e5Sespie /* Free all the memory allocated for LOOPS. */
200*c87b03e5Sespie
201*c87b03e5Sespie void
flow_loops_free(loops)202*c87b03e5Sespie flow_loops_free (loops)
203*c87b03e5Sespie struct loops *loops;
204*c87b03e5Sespie {
205*c87b03e5Sespie if (loops->parray)
206*c87b03e5Sespie {
207*c87b03e5Sespie int i;
208*c87b03e5Sespie
209*c87b03e5Sespie if (! loops->num)
210*c87b03e5Sespie abort ();
211*c87b03e5Sespie
212*c87b03e5Sespie /* Free the loop descriptors. */
213*c87b03e5Sespie for (i = 0; i < loops->num; i++)
214*c87b03e5Sespie {
215*c87b03e5Sespie struct loop *loop = loops->parray[i];
216*c87b03e5Sespie
217*c87b03e5Sespie if (!loop)
218*c87b03e5Sespie continue;
219*c87b03e5Sespie
220*c87b03e5Sespie flow_loop_free (loop);
221*c87b03e5Sespie }
222*c87b03e5Sespie
223*c87b03e5Sespie free (loops->parray);
224*c87b03e5Sespie loops->parray = NULL;
225*c87b03e5Sespie
226*c87b03e5Sespie if (loops->cfg.dom)
227*c87b03e5Sespie free_dominance_info (loops->cfg.dom);
228*c87b03e5Sespie
229*c87b03e5Sespie if (loops->cfg.dfs_order)
230*c87b03e5Sespie free (loops->cfg.dfs_order);
231*c87b03e5Sespie if (loops->cfg.rc_order)
232*c87b03e5Sespie free (loops->cfg.rc_order);
233*c87b03e5Sespie
234*c87b03e5Sespie }
235*c87b03e5Sespie }
236*c87b03e5Sespie
237*c87b03e5Sespie /* Find the entry edges into the LOOP. */
238*c87b03e5Sespie
239*c87b03e5Sespie static void
flow_loop_entry_edges_find(loop)240*c87b03e5Sespie flow_loop_entry_edges_find (loop)
241*c87b03e5Sespie struct loop *loop;
242*c87b03e5Sespie {
243*c87b03e5Sespie edge e;
244*c87b03e5Sespie int num_entries;
245*c87b03e5Sespie
246*c87b03e5Sespie num_entries = 0;
247*c87b03e5Sespie for (e = loop->header->pred; e; e = e->pred_next)
248*c87b03e5Sespie {
249*c87b03e5Sespie if (flow_loop_outside_edge_p (loop, e))
250*c87b03e5Sespie num_entries++;
251*c87b03e5Sespie }
252*c87b03e5Sespie
253*c87b03e5Sespie if (! num_entries)
254*c87b03e5Sespie abort ();
255*c87b03e5Sespie
256*c87b03e5Sespie loop->entry_edges = (edge *) xmalloc (num_entries * sizeof (edge *));
257*c87b03e5Sespie
258*c87b03e5Sespie num_entries = 0;
259*c87b03e5Sespie for (e = loop->header->pred; e; e = e->pred_next)
260*c87b03e5Sespie {
261*c87b03e5Sespie if (flow_loop_outside_edge_p (loop, e))
262*c87b03e5Sespie loop->entry_edges[num_entries++] = e;
263*c87b03e5Sespie }
264*c87b03e5Sespie
265*c87b03e5Sespie loop->num_entries = num_entries;
266*c87b03e5Sespie }
267*c87b03e5Sespie
268*c87b03e5Sespie /* Find the exit edges from the LOOP. */
269*c87b03e5Sespie
270*c87b03e5Sespie static void
flow_loop_exit_edges_find(loop)271*c87b03e5Sespie flow_loop_exit_edges_find (loop)
272*c87b03e5Sespie struct loop *loop;
273*c87b03e5Sespie {
274*c87b03e5Sespie edge e;
275*c87b03e5Sespie basic_block node, *bbs;
276*c87b03e5Sespie int num_exits, i;
277*c87b03e5Sespie
278*c87b03e5Sespie loop->exit_edges = NULL;
279*c87b03e5Sespie loop->num_exits = 0;
280*c87b03e5Sespie
281*c87b03e5Sespie /* Check all nodes within the loop to see if there are any
282*c87b03e5Sespie successors not in the loop. Note that a node may have multiple
283*c87b03e5Sespie exiting edges. */
284*c87b03e5Sespie num_exits = 0;
285*c87b03e5Sespie bbs = get_loop_body (loop);
286*c87b03e5Sespie for (i = 0; i < loop->num_nodes; i++)
287*c87b03e5Sespie {
288*c87b03e5Sespie node = bbs[i];
289*c87b03e5Sespie for (e = node->succ; e; e = e->succ_next)
290*c87b03e5Sespie {
291*c87b03e5Sespie basic_block dest = e->dest;
292*c87b03e5Sespie
293*c87b03e5Sespie if (!flow_bb_inside_loop_p (loop, dest))
294*c87b03e5Sespie num_exits++;
295*c87b03e5Sespie }
296*c87b03e5Sespie }
297*c87b03e5Sespie
298*c87b03e5Sespie if (! num_exits)
299*c87b03e5Sespie {
300*c87b03e5Sespie free (bbs);
301*c87b03e5Sespie return;
302*c87b03e5Sespie }
303*c87b03e5Sespie
304*c87b03e5Sespie loop->exit_edges = (edge *) xmalloc (num_exits * sizeof (edge *));
305*c87b03e5Sespie
306*c87b03e5Sespie /* Store all exiting edges into an array. */
307*c87b03e5Sespie num_exits = 0;
308*c87b03e5Sespie for (i = 0; i < loop->num_nodes; i++)
309*c87b03e5Sespie {
310*c87b03e5Sespie node = bbs[i];
311*c87b03e5Sespie for (e = node->succ; e; e = e->succ_next)
312*c87b03e5Sespie {
313*c87b03e5Sespie basic_block dest = e->dest;
314*c87b03e5Sespie
315*c87b03e5Sespie if (!flow_bb_inside_loop_p (loop, dest))
316*c87b03e5Sespie loop->exit_edges[num_exits++] = e;
317*c87b03e5Sespie }
318*c87b03e5Sespie }
319*c87b03e5Sespie free (bbs);
320*c87b03e5Sespie loop->num_exits = num_exits;
321*c87b03e5Sespie }
322*c87b03e5Sespie
323*c87b03e5Sespie /* Find the nodes contained within the LOOP with header HEADER.
324*c87b03e5Sespie Return the number of nodes within the loop. */
325*c87b03e5Sespie
326*c87b03e5Sespie static int
flow_loop_nodes_find(header,loop)327*c87b03e5Sespie flow_loop_nodes_find (header, loop)
328*c87b03e5Sespie basic_block header;
329*c87b03e5Sespie struct loop *loop;
330*c87b03e5Sespie {
331*c87b03e5Sespie basic_block *stack;
332*c87b03e5Sespie int sp;
333*c87b03e5Sespie int num_nodes = 1;
334*c87b03e5Sespie int findex, lindex;
335*c87b03e5Sespie
336*c87b03e5Sespie header->loop_father = loop;
337*c87b03e5Sespie header->loop_depth = loop->depth;
338*c87b03e5Sespie findex = lindex = header->index;
339*c87b03e5Sespie
340*c87b03e5Sespie if (loop->latch->loop_father != loop)
341*c87b03e5Sespie {
342*c87b03e5Sespie stack = (basic_block *) xmalloc (n_basic_blocks * sizeof (basic_block));
343*c87b03e5Sespie sp = 0;
344*c87b03e5Sespie num_nodes++;
345*c87b03e5Sespie stack[sp++] = loop->latch;
346*c87b03e5Sespie loop->latch->loop_father = loop;
347*c87b03e5Sespie loop->latch->loop_depth = loop->depth;
348*c87b03e5Sespie
349*c87b03e5Sespie while (sp)
350*c87b03e5Sespie {
351*c87b03e5Sespie basic_block node;
352*c87b03e5Sespie edge e;
353*c87b03e5Sespie
354*c87b03e5Sespie node = stack[--sp];
355*c87b03e5Sespie
356*c87b03e5Sespie for (e = node->pred; e; e = e->pred_next)
357*c87b03e5Sespie {
358*c87b03e5Sespie basic_block ancestor = e->src;
359*c87b03e5Sespie
360*c87b03e5Sespie if (ancestor != ENTRY_BLOCK_PTR
361*c87b03e5Sespie && ancestor->loop_father != loop)
362*c87b03e5Sespie {
363*c87b03e5Sespie ancestor->loop_father = loop;
364*c87b03e5Sespie ancestor->loop_depth = loop->depth;
365*c87b03e5Sespie num_nodes++;
366*c87b03e5Sespie stack[sp++] = ancestor;
367*c87b03e5Sespie }
368*c87b03e5Sespie }
369*c87b03e5Sespie }
370*c87b03e5Sespie free (stack);
371*c87b03e5Sespie }
372*c87b03e5Sespie return num_nodes;
373*c87b03e5Sespie }
374*c87b03e5Sespie
375*c87b03e5Sespie /* Find the root node of the loop pre-header extended basic block and
376*c87b03e5Sespie the edges along the trace from the root node to the loop header. */
377*c87b03e5Sespie
378*c87b03e5Sespie static void
flow_loop_pre_header_scan(loop)379*c87b03e5Sespie flow_loop_pre_header_scan (loop)
380*c87b03e5Sespie struct loop *loop;
381*c87b03e5Sespie {
382*c87b03e5Sespie int num;
383*c87b03e5Sespie basic_block ebb;
384*c87b03e5Sespie edge e;
385*c87b03e5Sespie
386*c87b03e5Sespie loop->num_pre_header_edges = 0;
387*c87b03e5Sespie if (loop->num_entries != 1)
388*c87b03e5Sespie return;
389*c87b03e5Sespie
390*c87b03e5Sespie ebb = loop->entry_edges[0]->src;
391*c87b03e5Sespie if (ebb == ENTRY_BLOCK_PTR)
392*c87b03e5Sespie return;
393*c87b03e5Sespie
394*c87b03e5Sespie /* Count number of edges along trace from loop header to
395*c87b03e5Sespie root of pre-header extended basic block. Usually this is
396*c87b03e5Sespie only one or two edges. */
397*c87b03e5Sespie for (num = 1; ebb->pred->src != ENTRY_BLOCK_PTR && ! ebb->pred->pred_next;
398*c87b03e5Sespie num++)
399*c87b03e5Sespie ebb = ebb->pred->src;
400*c87b03e5Sespie
401*c87b03e5Sespie loop->pre_header_edges = (edge *) xmalloc (num * sizeof (edge));
402*c87b03e5Sespie loop->num_pre_header_edges = num;
403*c87b03e5Sespie
404*c87b03e5Sespie /* Store edges in order that they are followed. The source of the first edge
405*c87b03e5Sespie is the root node of the pre-header extended basic block and the
406*c87b03e5Sespie destination of the last last edge is the loop header. */
407*c87b03e5Sespie for (e = loop->entry_edges[0]; num; e = e->src->pred)
408*c87b03e5Sespie loop->pre_header_edges[--num] = e;
409*c87b03e5Sespie }
410*c87b03e5Sespie
411*c87b03e5Sespie /* Return the block for the pre-header of the loop with header
412*c87b03e5Sespie HEADER where DOM specifies the dominator information. Return NULL if
413*c87b03e5Sespie there is no pre-header. */
414*c87b03e5Sespie
415*c87b03e5Sespie static basic_block
flow_loop_pre_header_find(header,dom)416*c87b03e5Sespie flow_loop_pre_header_find (header, dom)
417*c87b03e5Sespie basic_block header;
418*c87b03e5Sespie dominance_info dom;
419*c87b03e5Sespie {
420*c87b03e5Sespie basic_block pre_header;
421*c87b03e5Sespie edge e;
422*c87b03e5Sespie
423*c87b03e5Sespie /* If block p is a predecessor of the header and is the only block
424*c87b03e5Sespie that the header does not dominate, then it is the pre-header. */
425*c87b03e5Sespie pre_header = NULL;
426*c87b03e5Sespie for (e = header->pred; e; e = e->pred_next)
427*c87b03e5Sespie {
428*c87b03e5Sespie basic_block node = e->src;
429*c87b03e5Sespie
430*c87b03e5Sespie if (node != ENTRY_BLOCK_PTR
431*c87b03e5Sespie && ! dominated_by_p (dom, node, header))
432*c87b03e5Sespie {
433*c87b03e5Sespie if (pre_header == NULL)
434*c87b03e5Sespie pre_header = node;
435*c87b03e5Sespie else
436*c87b03e5Sespie {
437*c87b03e5Sespie /* There are multiple edges into the header from outside
438*c87b03e5Sespie the loop so there is no pre-header block. */
439*c87b03e5Sespie pre_header = NULL;
440*c87b03e5Sespie break;
441*c87b03e5Sespie }
442*c87b03e5Sespie }
443*c87b03e5Sespie }
444*c87b03e5Sespie
445*c87b03e5Sespie return pre_header;
446*c87b03e5Sespie }
447*c87b03e5Sespie
448*c87b03e5Sespie /* Add LOOP to the loop hierarchy tree where FATHER is father of the
449*c87b03e5Sespie added loop. */
450*c87b03e5Sespie
451*c87b03e5Sespie void
flow_loop_tree_node_add(father,loop)452*c87b03e5Sespie flow_loop_tree_node_add (father, loop)
453*c87b03e5Sespie struct loop *father;
454*c87b03e5Sespie struct loop *loop;
455*c87b03e5Sespie {
456*c87b03e5Sespie loop->next = father->inner;
457*c87b03e5Sespie father->inner = loop;
458*c87b03e5Sespie loop->outer = father;
459*c87b03e5Sespie
460*c87b03e5Sespie loop->depth = father->depth + 1;
461*c87b03e5Sespie loop->pred = xmalloc (sizeof (struct loop *) * loop->depth);
462*c87b03e5Sespie memcpy (loop->pred, father->pred, sizeof (struct loop *) * father->depth);
463*c87b03e5Sespie loop->pred[father->depth] = father;
464*c87b03e5Sespie }
465*c87b03e5Sespie
466*c87b03e5Sespie /* Remove LOOP from the loop hierarchy tree. */
467*c87b03e5Sespie
468*c87b03e5Sespie void
flow_loop_tree_node_remove(loop)469*c87b03e5Sespie flow_loop_tree_node_remove (loop)
470*c87b03e5Sespie struct loop *loop;
471*c87b03e5Sespie {
472*c87b03e5Sespie struct loop *prev, *father;
473*c87b03e5Sespie
474*c87b03e5Sespie father = loop->outer;
475*c87b03e5Sespie loop->outer = NULL;
476*c87b03e5Sespie
477*c87b03e5Sespie /* Remove loop from the list of sons. */
478*c87b03e5Sespie if (father->inner == loop)
479*c87b03e5Sespie father->inner = loop->next;
480*c87b03e5Sespie else
481*c87b03e5Sespie {
482*c87b03e5Sespie for (prev = father->inner; prev->next != loop; prev = prev->next);
483*c87b03e5Sespie prev->next = loop->next;
484*c87b03e5Sespie }
485*c87b03e5Sespie
486*c87b03e5Sespie loop->depth = -1;
487*c87b03e5Sespie free (loop->pred);
488*c87b03e5Sespie loop->pred = NULL;
489*c87b03e5Sespie }
490*c87b03e5Sespie
491*c87b03e5Sespie /* Helper function to compute loop nesting depth and enclosed loop level
492*c87b03e5Sespie for the natural loop specified by LOOP. Returns the loop level. */
493*c87b03e5Sespie
494*c87b03e5Sespie static int
flow_loop_level_compute(loop)495*c87b03e5Sespie flow_loop_level_compute (loop)
496*c87b03e5Sespie struct loop *loop;
497*c87b03e5Sespie {
498*c87b03e5Sespie struct loop *inner;
499*c87b03e5Sespie int level = 1;
500*c87b03e5Sespie
501*c87b03e5Sespie if (! loop)
502*c87b03e5Sespie return 0;
503*c87b03e5Sespie
504*c87b03e5Sespie /* Traverse loop tree assigning depth and computing level as the
505*c87b03e5Sespie maximum level of all the inner loops of this loop. The loop
506*c87b03e5Sespie level is equivalent to the height of the loop in the loop tree
507*c87b03e5Sespie and corresponds to the number of enclosed loop levels (including
508*c87b03e5Sespie itself). */
509*c87b03e5Sespie for (inner = loop->inner; inner; inner = inner->next)
510*c87b03e5Sespie {
511*c87b03e5Sespie int ilevel = flow_loop_level_compute (inner) + 1;
512*c87b03e5Sespie
513*c87b03e5Sespie if (ilevel > level)
514*c87b03e5Sespie level = ilevel;
515*c87b03e5Sespie }
516*c87b03e5Sespie
517*c87b03e5Sespie loop->level = level;
518*c87b03e5Sespie return level;
519*c87b03e5Sespie }
520*c87b03e5Sespie
521*c87b03e5Sespie /* Compute the loop nesting depth and enclosed loop level for the loop
522*c87b03e5Sespie hierarchy tree specified by LOOPS. Return the maximum enclosed loop
523*c87b03e5Sespie level. */
524*c87b03e5Sespie
525*c87b03e5Sespie static int
flow_loops_level_compute(loops)526*c87b03e5Sespie flow_loops_level_compute (loops)
527*c87b03e5Sespie struct loops *loops;
528*c87b03e5Sespie {
529*c87b03e5Sespie return flow_loop_level_compute (loops->tree_root);
530*c87b03e5Sespie }
531*c87b03e5Sespie
532*c87b03e5Sespie /* Scan a single natural loop specified by LOOP collecting information
533*c87b03e5Sespie about it specified by FLAGS. */
534*c87b03e5Sespie
535*c87b03e5Sespie int
flow_loop_scan(loops,loop,flags)536*c87b03e5Sespie flow_loop_scan (loops, loop, flags)
537*c87b03e5Sespie struct loops *loops;
538*c87b03e5Sespie struct loop *loop;
539*c87b03e5Sespie int flags;
540*c87b03e5Sespie {
541*c87b03e5Sespie if (flags & LOOP_ENTRY_EDGES)
542*c87b03e5Sespie {
543*c87b03e5Sespie /* Find edges which enter the loop header.
544*c87b03e5Sespie Note that the entry edges should only
545*c87b03e5Sespie enter the header of a natural loop. */
546*c87b03e5Sespie flow_loop_entry_edges_find (loop);
547*c87b03e5Sespie }
548*c87b03e5Sespie
549*c87b03e5Sespie if (flags & LOOP_EXIT_EDGES)
550*c87b03e5Sespie {
551*c87b03e5Sespie /* Find edges which exit the loop. */
552*c87b03e5Sespie flow_loop_exit_edges_find (loop);
553*c87b03e5Sespie }
554*c87b03e5Sespie
555*c87b03e5Sespie if (flags & LOOP_PRE_HEADER)
556*c87b03e5Sespie {
557*c87b03e5Sespie /* Look to see if the loop has a pre-header node. */
558*c87b03e5Sespie loop->pre_header
559*c87b03e5Sespie = flow_loop_pre_header_find (loop->header, loops->cfg.dom);
560*c87b03e5Sespie
561*c87b03e5Sespie /* Find the blocks within the extended basic block of
562*c87b03e5Sespie the loop pre-header. */
563*c87b03e5Sespie flow_loop_pre_header_scan (loop);
564*c87b03e5Sespie }
565*c87b03e5Sespie
566*c87b03e5Sespie return 1;
567*c87b03e5Sespie }
568*c87b03e5Sespie
569*c87b03e5Sespie #define HEADER_BLOCK(B) (* (int *) (B)->aux)
570*c87b03e5Sespie #define LATCH_EDGE(E) (*(int *) (E)->aux)
571*c87b03e5Sespie
572*c87b03e5Sespie /* Redirect edge and update latch and header info. */
573*c87b03e5Sespie static void
redirect_edge_with_latch_update(e,to)574*c87b03e5Sespie redirect_edge_with_latch_update (e, to)
575*c87b03e5Sespie edge e;
576*c87b03e5Sespie basic_block to;
577*c87b03e5Sespie {
578*c87b03e5Sespie basic_block jump;
579*c87b03e5Sespie
580*c87b03e5Sespie jump = redirect_edge_and_branch_force (e, to);
581*c87b03e5Sespie if (jump)
582*c87b03e5Sespie {
583*c87b03e5Sespie alloc_aux_for_block (jump, sizeof (int));
584*c87b03e5Sespie HEADER_BLOCK (jump) = 0;
585*c87b03e5Sespie alloc_aux_for_edge (jump->pred, sizeof (int));
586*c87b03e5Sespie LATCH_EDGE (jump->succ) = LATCH_EDGE (e);
587*c87b03e5Sespie LATCH_EDGE (jump->pred) = 0;
588*c87b03e5Sespie }
589*c87b03e5Sespie }
590*c87b03e5Sespie
591*c87b03e5Sespie /* Split BB into entry part and rest; if REDIRECT_LATCH, redirect edges
592*c87b03e5Sespie marked as latch into entry part, analogically for REDIRECT_NONLATCH.
593*c87b03e5Sespie In both of these cases, ignore edge EXCEPT. If CONN_LATCH, set edge
594*c87b03e5Sespie between created entry part and BB as latch one. Return created entry
595*c87b03e5Sespie part. */
596*c87b03e5Sespie
597*c87b03e5Sespie static basic_block
make_forwarder_block(bb,redirect_latch,redirect_nonlatch,except,conn_latch)598*c87b03e5Sespie make_forwarder_block (bb, redirect_latch, redirect_nonlatch, except,
599*c87b03e5Sespie conn_latch)
600*c87b03e5Sespie basic_block bb;
601*c87b03e5Sespie int redirect_latch;
602*c87b03e5Sespie int redirect_nonlatch;
603*c87b03e5Sespie edge except;
604*c87b03e5Sespie int conn_latch;
605*c87b03e5Sespie {
606*c87b03e5Sespie edge e, next_e, fallthru;
607*c87b03e5Sespie basic_block dummy;
608*c87b03e5Sespie rtx insn;
609*c87b03e5Sespie
610*c87b03e5Sespie insn = PREV_INSN (first_insn_after_basic_block_note (bb));
611*c87b03e5Sespie
612*c87b03e5Sespie fallthru = split_block (bb, insn);
613*c87b03e5Sespie dummy = fallthru->src;
614*c87b03e5Sespie bb = fallthru->dest;
615*c87b03e5Sespie
616*c87b03e5Sespie bb->aux = xmalloc (sizeof (int));
617*c87b03e5Sespie HEADER_BLOCK (dummy) = 0;
618*c87b03e5Sespie HEADER_BLOCK (bb) = 1;
619*c87b03e5Sespie
620*c87b03e5Sespie /* Redirect back edges we want to keep. */
621*c87b03e5Sespie for (e = dummy->pred; e; e = next_e)
622*c87b03e5Sespie {
623*c87b03e5Sespie next_e = e->pred_next;
624*c87b03e5Sespie if (e == except
625*c87b03e5Sespie || !((redirect_latch && LATCH_EDGE (e))
626*c87b03e5Sespie || (redirect_nonlatch && !LATCH_EDGE (e))))
627*c87b03e5Sespie {
628*c87b03e5Sespie dummy->frequency -= EDGE_FREQUENCY (e);
629*c87b03e5Sespie dummy->count -= e->count;
630*c87b03e5Sespie if (dummy->frequency < 0)
631*c87b03e5Sespie dummy->frequency = 0;
632*c87b03e5Sespie if (dummy->count < 0)
633*c87b03e5Sespie dummy->count = 0;
634*c87b03e5Sespie redirect_edge_with_latch_update (e, bb);
635*c87b03e5Sespie }
636*c87b03e5Sespie }
637*c87b03e5Sespie
638*c87b03e5Sespie alloc_aux_for_edge (fallthru, sizeof (int));
639*c87b03e5Sespie LATCH_EDGE (fallthru) = conn_latch;
640*c87b03e5Sespie
641*c87b03e5Sespie return dummy;
642*c87b03e5Sespie }
643*c87b03e5Sespie
644*c87b03e5Sespie /* Takes care of merging natural loops with shared headers. */
645*c87b03e5Sespie static void
canonicalize_loop_headers()646*c87b03e5Sespie canonicalize_loop_headers ()
647*c87b03e5Sespie {
648*c87b03e5Sespie dominance_info dom;
649*c87b03e5Sespie basic_block header;
650*c87b03e5Sespie edge e;
651*c87b03e5Sespie
652*c87b03e5Sespie /* Compute the dominators. */
653*c87b03e5Sespie dom = calculate_dominance_info (CDI_DOMINATORS);
654*c87b03e5Sespie
655*c87b03e5Sespie alloc_aux_for_blocks (sizeof (int));
656*c87b03e5Sespie alloc_aux_for_edges (sizeof (int));
657*c87b03e5Sespie
658*c87b03e5Sespie /* Split blocks so that each loop has only single latch. */
659*c87b03e5Sespie FOR_EACH_BB (header)
660*c87b03e5Sespie {
661*c87b03e5Sespie int num_latches = 0;
662*c87b03e5Sespie int have_abnormal_edge = 0;
663*c87b03e5Sespie
664*c87b03e5Sespie for (e = header->pred; e; e = e->pred_next)
665*c87b03e5Sespie {
666*c87b03e5Sespie basic_block latch = e->src;
667*c87b03e5Sespie
668*c87b03e5Sespie if (e->flags & EDGE_ABNORMAL)
669*c87b03e5Sespie have_abnormal_edge = 1;
670*c87b03e5Sespie
671*c87b03e5Sespie if (latch != ENTRY_BLOCK_PTR
672*c87b03e5Sespie && dominated_by_p (dom, latch, header))
673*c87b03e5Sespie {
674*c87b03e5Sespie num_latches++;
675*c87b03e5Sespie LATCH_EDGE (e) = 1;
676*c87b03e5Sespie }
677*c87b03e5Sespie }
678*c87b03e5Sespie if (have_abnormal_edge)
679*c87b03e5Sespie HEADER_BLOCK (header) = 0;
680*c87b03e5Sespie else
681*c87b03e5Sespie HEADER_BLOCK (header) = num_latches;
682*c87b03e5Sespie }
683*c87b03e5Sespie
684*c87b03e5Sespie if (HEADER_BLOCK (ENTRY_BLOCK_PTR->succ->dest))
685*c87b03e5Sespie {
686*c87b03e5Sespie basic_block bb;
687*c87b03e5Sespie
688*c87b03e5Sespie /* We could not redirect edges freely here. On the other hand,
689*c87b03e5Sespie we can simply split the edge from entry block. */
690*c87b03e5Sespie bb = split_edge (ENTRY_BLOCK_PTR->succ);
691*c87b03e5Sespie
692*c87b03e5Sespie alloc_aux_for_edge (bb->succ, sizeof (int));
693*c87b03e5Sespie LATCH_EDGE (bb->succ) = 0;
694*c87b03e5Sespie alloc_aux_for_block (bb, sizeof (int));
695*c87b03e5Sespie HEADER_BLOCK (bb) = 0;
696*c87b03e5Sespie }
697*c87b03e5Sespie
698*c87b03e5Sespie FOR_EACH_BB (header)
699*c87b03e5Sespie {
700*c87b03e5Sespie int num_latch;
701*c87b03e5Sespie int want_join_latch;
702*c87b03e5Sespie int max_freq, is_heavy;
703*c87b03e5Sespie edge heavy;
704*c87b03e5Sespie
705*c87b03e5Sespie if (!HEADER_BLOCK (header))
706*c87b03e5Sespie continue;
707*c87b03e5Sespie
708*c87b03e5Sespie num_latch = HEADER_BLOCK (header);
709*c87b03e5Sespie
710*c87b03e5Sespie want_join_latch = (num_latch > 1);
711*c87b03e5Sespie
712*c87b03e5Sespie if (!want_join_latch)
713*c87b03e5Sespie continue;
714*c87b03e5Sespie
715*c87b03e5Sespie /* Find a heavy edge. */
716*c87b03e5Sespie is_heavy = 1;
717*c87b03e5Sespie heavy = NULL;
718*c87b03e5Sespie max_freq = 0;
719*c87b03e5Sespie for (e = header->pred; e; e = e->pred_next)
720*c87b03e5Sespie if (LATCH_EDGE (e) &&
721*c87b03e5Sespie EDGE_FREQUENCY (e) > max_freq)
722*c87b03e5Sespie max_freq = EDGE_FREQUENCY (e);
723*c87b03e5Sespie for (e = header->pred; e; e = e->pred_next)
724*c87b03e5Sespie if (LATCH_EDGE (e) &&
725*c87b03e5Sespie EDGE_FREQUENCY (e) >= max_freq / HEAVY_EDGE_RATIO)
726*c87b03e5Sespie {
727*c87b03e5Sespie if (heavy)
728*c87b03e5Sespie {
729*c87b03e5Sespie is_heavy = 0;
730*c87b03e5Sespie break;
731*c87b03e5Sespie }
732*c87b03e5Sespie else
733*c87b03e5Sespie heavy = e;
734*c87b03e5Sespie }
735*c87b03e5Sespie
736*c87b03e5Sespie if (is_heavy)
737*c87b03e5Sespie {
738*c87b03e5Sespie basic_block new_header =
739*c87b03e5Sespie make_forwarder_block (header, true, true, heavy, 0);
740*c87b03e5Sespie if (num_latch > 2)
741*c87b03e5Sespie make_forwarder_block (new_header, true, false, NULL, 1);
742*c87b03e5Sespie }
743*c87b03e5Sespie else
744*c87b03e5Sespie make_forwarder_block (header, true, false, NULL, 1);
745*c87b03e5Sespie }
746*c87b03e5Sespie
747*c87b03e5Sespie free_aux_for_blocks ();
748*c87b03e5Sespie free_aux_for_edges ();
749*c87b03e5Sespie free_dominance_info (dom);
750*c87b03e5Sespie }
751*c87b03e5Sespie
752*c87b03e5Sespie /* Find all the natural loops in the function and save in LOOPS structure and
753*c87b03e5Sespie recalculate loop_depth information in basic block structures. FLAGS
754*c87b03e5Sespie controls which loop information is collected. Return the number of natural
755*c87b03e5Sespie loops found. */
756*c87b03e5Sespie
757*c87b03e5Sespie int
flow_loops_find(loops,flags)758*c87b03e5Sespie flow_loops_find (loops, flags)
759*c87b03e5Sespie struct loops *loops;
760*c87b03e5Sespie int flags;
761*c87b03e5Sespie {
762*c87b03e5Sespie int i;
763*c87b03e5Sespie int b;
764*c87b03e5Sespie int num_loops;
765*c87b03e5Sespie edge e;
766*c87b03e5Sespie sbitmap headers;
767*c87b03e5Sespie dominance_info dom;
768*c87b03e5Sespie int *dfs_order;
769*c87b03e5Sespie int *rc_order;
770*c87b03e5Sespie basic_block header;
771*c87b03e5Sespie basic_block bb;
772*c87b03e5Sespie
773*c87b03e5Sespie /* This function cannot be repeatedly called with different
774*c87b03e5Sespie flags to build up the loop information. The loop tree
775*c87b03e5Sespie must always be built if this function is called. */
776*c87b03e5Sespie if (! (flags & LOOP_TREE))
777*c87b03e5Sespie abort ();
778*c87b03e5Sespie
779*c87b03e5Sespie memset (loops, 0, sizeof *loops);
780*c87b03e5Sespie
781*c87b03e5Sespie /* Taking care of this degenerate case makes the rest of
782*c87b03e5Sespie this code simpler. */
783*c87b03e5Sespie if (n_basic_blocks == 0)
784*c87b03e5Sespie return 0;
785*c87b03e5Sespie
786*c87b03e5Sespie dfs_order = NULL;
787*c87b03e5Sespie rc_order = NULL;
788*c87b03e5Sespie
789*c87b03e5Sespie /* Join loops with shared headers. */
790*c87b03e5Sespie canonicalize_loop_headers ();
791*c87b03e5Sespie
792*c87b03e5Sespie /* Compute the dominators. */
793*c87b03e5Sespie dom = loops->cfg.dom = calculate_dominance_info (CDI_DOMINATORS);
794*c87b03e5Sespie
795*c87b03e5Sespie /* Count the number of loop headers. This should be the
796*c87b03e5Sespie same as the number of natural loops. */
797*c87b03e5Sespie headers = sbitmap_alloc (last_basic_block);
798*c87b03e5Sespie sbitmap_zero (headers);
799*c87b03e5Sespie
800*c87b03e5Sespie num_loops = 0;
801*c87b03e5Sespie FOR_EACH_BB (header)
802*c87b03e5Sespie {
803*c87b03e5Sespie int more_latches = 0;
804*c87b03e5Sespie
805*c87b03e5Sespie header->loop_depth = 0;
806*c87b03e5Sespie
807*c87b03e5Sespie /* If we have an abnormal predecessor, do not consider the
808*c87b03e5Sespie loop (not worth the problems). */
809*c87b03e5Sespie for (e = header->pred; e; e = e->pred_next)
810*c87b03e5Sespie if (e->flags & EDGE_ABNORMAL)
811*c87b03e5Sespie break;
812*c87b03e5Sespie if (e)
813*c87b03e5Sespie continue;
814*c87b03e5Sespie
815*c87b03e5Sespie for (e = header->pred; e; e = e->pred_next)
816*c87b03e5Sespie {
817*c87b03e5Sespie basic_block latch = e->src;
818*c87b03e5Sespie
819*c87b03e5Sespie if (e->flags & EDGE_ABNORMAL)
820*c87b03e5Sespie abort ();
821*c87b03e5Sespie
822*c87b03e5Sespie /* Look for back edges where a predecessor is dominated
823*c87b03e5Sespie by this block. A natural loop has a single entry
824*c87b03e5Sespie node (header) that dominates all the nodes in the
825*c87b03e5Sespie loop. It also has single back edge to the header
826*c87b03e5Sespie from a latch node. */
827*c87b03e5Sespie if (latch != ENTRY_BLOCK_PTR && dominated_by_p (dom, latch, header))
828*c87b03e5Sespie {
829*c87b03e5Sespie /* Shared headers should be eliminated by now. */
830*c87b03e5Sespie if (more_latches)
831*c87b03e5Sespie abort ();
832*c87b03e5Sespie more_latches = 1;
833*c87b03e5Sespie SET_BIT (headers, header->index);
834*c87b03e5Sespie num_loops++;
835*c87b03e5Sespie }
836*c87b03e5Sespie }
837*c87b03e5Sespie }
838*c87b03e5Sespie
839*c87b03e5Sespie /* Allocate loop structures. */
840*c87b03e5Sespie loops->parray = (struct loop **) xcalloc (num_loops + 1, sizeof (struct loop *));
841*c87b03e5Sespie
842*c87b03e5Sespie /* Dummy loop containing whole function. */
843*c87b03e5Sespie loops->parray[0] = xcalloc (1, sizeof (struct loop));
844*c87b03e5Sespie loops->parray[0]->next = NULL;
845*c87b03e5Sespie loops->parray[0]->inner = NULL;
846*c87b03e5Sespie loops->parray[0]->outer = NULL;
847*c87b03e5Sespie loops->parray[0]->depth = 0;
848*c87b03e5Sespie loops->parray[0]->pred = NULL;
849*c87b03e5Sespie loops->parray[0]->num_nodes = n_basic_blocks + 2;
850*c87b03e5Sespie loops->parray[0]->latch = EXIT_BLOCK_PTR;
851*c87b03e5Sespie loops->parray[0]->header = ENTRY_BLOCK_PTR;
852*c87b03e5Sespie ENTRY_BLOCK_PTR->loop_father = loops->parray[0];
853*c87b03e5Sespie EXIT_BLOCK_PTR->loop_father = loops->parray[0];
854*c87b03e5Sespie
855*c87b03e5Sespie loops->tree_root = loops->parray[0];
856*c87b03e5Sespie
857*c87b03e5Sespie /* Find and record information about all the natural loops
858*c87b03e5Sespie in the CFG. */
859*c87b03e5Sespie loops->num = 1;
860*c87b03e5Sespie FOR_EACH_BB (bb)
861*c87b03e5Sespie bb->loop_father = loops->tree_root;
862*c87b03e5Sespie
863*c87b03e5Sespie if (num_loops)
864*c87b03e5Sespie {
865*c87b03e5Sespie /* Compute depth first search order of the CFG so that outer
866*c87b03e5Sespie natural loops will be found before inner natural loops. */
867*c87b03e5Sespie dfs_order = (int *) xmalloc (n_basic_blocks * sizeof (int));
868*c87b03e5Sespie rc_order = (int *) xmalloc (n_basic_blocks * sizeof (int));
869*c87b03e5Sespie flow_depth_first_order_compute (dfs_order, rc_order);
870*c87b03e5Sespie
871*c87b03e5Sespie /* Save CFG derived information to avoid recomputing it. */
872*c87b03e5Sespie loops->cfg.dom = dom;
873*c87b03e5Sespie loops->cfg.dfs_order = dfs_order;
874*c87b03e5Sespie loops->cfg.rc_order = rc_order;
875*c87b03e5Sespie
876*c87b03e5Sespie num_loops = 1;
877*c87b03e5Sespie
878*c87b03e5Sespie for (b = 0; b < n_basic_blocks; b++)
879*c87b03e5Sespie {
880*c87b03e5Sespie struct loop *loop;
881*c87b03e5Sespie
882*c87b03e5Sespie /* Search the nodes of the CFG in reverse completion order
883*c87b03e5Sespie so that we can find outer loops first. */
884*c87b03e5Sespie if (!TEST_BIT (headers, rc_order[b]))
885*c87b03e5Sespie continue;
886*c87b03e5Sespie
887*c87b03e5Sespie header = BASIC_BLOCK (rc_order[b]);
888*c87b03e5Sespie
889*c87b03e5Sespie loop = loops->parray[num_loops] = xcalloc (1, sizeof (struct loop));
890*c87b03e5Sespie
891*c87b03e5Sespie loop->header = header;
892*c87b03e5Sespie loop->num = num_loops;
893*c87b03e5Sespie num_loops++;
894*c87b03e5Sespie
895*c87b03e5Sespie /* Look for the latch for this header block. */
896*c87b03e5Sespie for (e = header->pred; e; e = e->pred_next)
897*c87b03e5Sespie {
898*c87b03e5Sespie basic_block latch = e->src;
899*c87b03e5Sespie
900*c87b03e5Sespie if (latch != ENTRY_BLOCK_PTR
901*c87b03e5Sespie && dominated_by_p (dom, latch, header))
902*c87b03e5Sespie {
903*c87b03e5Sespie loop->latch = latch;
904*c87b03e5Sespie break;
905*c87b03e5Sespie }
906*c87b03e5Sespie }
907*c87b03e5Sespie
908*c87b03e5Sespie flow_loop_tree_node_add (header->loop_father, loop);
909*c87b03e5Sespie loop->num_nodes = flow_loop_nodes_find (loop->header, loop);
910*c87b03e5Sespie }
911*c87b03e5Sespie
912*c87b03e5Sespie sbitmap_free (headers);
913*c87b03e5Sespie
914*c87b03e5Sespie /* Assign the loop nesting depth and enclosed loop level for each
915*c87b03e5Sespie loop. */
916*c87b03e5Sespie loops->levels = flow_loops_level_compute (loops);
917*c87b03e5Sespie
918*c87b03e5Sespie /* Scan the loops. */
919*c87b03e5Sespie for (i = 1; i < num_loops; i++)
920*c87b03e5Sespie flow_loop_scan (loops, loops->parray[i], flags);
921*c87b03e5Sespie
922*c87b03e5Sespie loops->num = num_loops;
923*c87b03e5Sespie }
924*c87b03e5Sespie else
925*c87b03e5Sespie {
926*c87b03e5Sespie loops->cfg.dom = NULL;
927*c87b03e5Sespie free_dominance_info (dom);
928*c87b03e5Sespie }
929*c87b03e5Sespie #ifdef ENABLE_CHECKING
930*c87b03e5Sespie verify_flow_info ();
931*c87b03e5Sespie verify_loop_structure (loops, 0);
932*c87b03e5Sespie #endif
933*c87b03e5Sespie
934*c87b03e5Sespie return loops->num;
935*c87b03e5Sespie }
936*c87b03e5Sespie
937*c87b03e5Sespie /* Update the information regarding the loops in the CFG
938*c87b03e5Sespie specified by LOOPS. */
939*c87b03e5Sespie
940*c87b03e5Sespie int
flow_loops_update(loops,flags)941*c87b03e5Sespie flow_loops_update (loops, flags)
942*c87b03e5Sespie struct loops *loops;
943*c87b03e5Sespie int flags;
944*c87b03e5Sespie {
945*c87b03e5Sespie /* One day we may want to update the current loop data. For now
946*c87b03e5Sespie throw away the old stuff and rebuild what we need. */
947*c87b03e5Sespie if (loops->parray)
948*c87b03e5Sespie flow_loops_free (loops);
949*c87b03e5Sespie
950*c87b03e5Sespie return flow_loops_find (loops, flags);
951*c87b03e5Sespie }
952*c87b03e5Sespie
953*c87b03e5Sespie /* Return nonzero if basic block BB belongs to LOOP. */
954*c87b03e5Sespie bool
flow_bb_inside_loop_p(loop,bb)955*c87b03e5Sespie flow_bb_inside_loop_p (loop, bb)
956*c87b03e5Sespie const struct loop *loop;
957*c87b03e5Sespie const basic_block bb;
958*c87b03e5Sespie {
959*c87b03e5Sespie struct loop *source_loop;
960*c87b03e5Sespie
961*c87b03e5Sespie if (bb == ENTRY_BLOCK_PTR || bb == EXIT_BLOCK_PTR)
962*c87b03e5Sespie return 0;
963*c87b03e5Sespie
964*c87b03e5Sespie source_loop = bb->loop_father;
965*c87b03e5Sespie return loop == source_loop || flow_loop_nested_p (loop, source_loop);
966*c87b03e5Sespie }
967*c87b03e5Sespie
968*c87b03e5Sespie /* Return nonzero if edge E enters header of LOOP from outside of LOOP. */
969*c87b03e5Sespie
970*c87b03e5Sespie bool
flow_loop_outside_edge_p(loop,e)971*c87b03e5Sespie flow_loop_outside_edge_p (loop, e)
972*c87b03e5Sespie const struct loop *loop;
973*c87b03e5Sespie edge e;
974*c87b03e5Sespie {
975*c87b03e5Sespie if (e->dest != loop->header)
976*c87b03e5Sespie abort ();
977*c87b03e5Sespie return !flow_bb_inside_loop_p (loop, e->src);
978*c87b03e5Sespie }
979*c87b03e5Sespie
980*c87b03e5Sespie /* Enumeration predicate for get_loop_body. */
981*c87b03e5Sespie static bool
glb_enum_p(bb,glb_header)982*c87b03e5Sespie glb_enum_p (bb, glb_header)
983*c87b03e5Sespie basic_block bb;
984*c87b03e5Sespie void *glb_header;
985*c87b03e5Sespie {
986*c87b03e5Sespie return bb != (basic_block) glb_header;
987*c87b03e5Sespie }
988*c87b03e5Sespie
989*c87b03e5Sespie /* Gets basic blocks of a loop. */
990*c87b03e5Sespie basic_block *
get_loop_body(loop)991*c87b03e5Sespie get_loop_body (loop)
992*c87b03e5Sespie const struct loop *loop;
993*c87b03e5Sespie {
994*c87b03e5Sespie basic_block *tovisit, bb;
995*c87b03e5Sespie int tv = 0;
996*c87b03e5Sespie
997*c87b03e5Sespie if (!loop->num_nodes)
998*c87b03e5Sespie abort ();
999*c87b03e5Sespie
1000*c87b03e5Sespie tovisit = xcalloc (loop->num_nodes, sizeof (basic_block));
1001*c87b03e5Sespie tovisit[tv++] = loop->header;
1002*c87b03e5Sespie
1003*c87b03e5Sespie if (loop->latch == EXIT_BLOCK_PTR)
1004*c87b03e5Sespie {
1005*c87b03e5Sespie /* There may be blocks unreachable from EXIT_BLOCK. */
1006*c87b03e5Sespie if (loop->num_nodes != n_basic_blocks + 2)
1007*c87b03e5Sespie abort ();
1008*c87b03e5Sespie FOR_EACH_BB (bb)
1009*c87b03e5Sespie tovisit[tv++] = bb;
1010*c87b03e5Sespie tovisit[tv++] = EXIT_BLOCK_PTR;
1011*c87b03e5Sespie }
1012*c87b03e5Sespie else if (loop->latch != loop->header)
1013*c87b03e5Sespie {
1014*c87b03e5Sespie tv = dfs_enumerate_from (loop->latch, 1, glb_enum_p,
1015*c87b03e5Sespie tovisit + 1, loop->num_nodes - 1,
1016*c87b03e5Sespie loop->header) + 1;
1017*c87b03e5Sespie }
1018*c87b03e5Sespie
1019*c87b03e5Sespie if (tv != loop->num_nodes)
1020*c87b03e5Sespie abort ();
1021*c87b03e5Sespie return tovisit;
1022*c87b03e5Sespie }
1023*c87b03e5Sespie
1024*c87b03e5Sespie /* Adds basic block BB to LOOP. */
1025*c87b03e5Sespie void
add_bb_to_loop(bb,loop)1026*c87b03e5Sespie add_bb_to_loop (bb, loop)
1027*c87b03e5Sespie basic_block bb;
1028*c87b03e5Sespie struct loop *loop;
1029*c87b03e5Sespie {
1030*c87b03e5Sespie int i;
1031*c87b03e5Sespie
1032*c87b03e5Sespie bb->loop_father = loop;
1033*c87b03e5Sespie bb->loop_depth = loop->depth;
1034*c87b03e5Sespie loop->num_nodes++;
1035*c87b03e5Sespie for (i = 0; i < loop->depth; i++)
1036*c87b03e5Sespie loop->pred[i]->num_nodes++;
1037*c87b03e5Sespie }
1038*c87b03e5Sespie
1039*c87b03e5Sespie /* Remove basic block BB from loops. */
1040*c87b03e5Sespie void
remove_bb_from_loops(bb)1041*c87b03e5Sespie remove_bb_from_loops (bb)
1042*c87b03e5Sespie basic_block bb;
1043*c87b03e5Sespie {
1044*c87b03e5Sespie int i;
1045*c87b03e5Sespie struct loop *loop = bb->loop_father;
1046*c87b03e5Sespie
1047*c87b03e5Sespie loop->num_nodes--;
1048*c87b03e5Sespie for (i = 0; i < loop->depth; i++)
1049*c87b03e5Sespie loop->pred[i]->num_nodes--;
1050*c87b03e5Sespie bb->loop_father = NULL;
1051*c87b03e5Sespie bb->loop_depth = 0;
1052*c87b03e5Sespie }
1053*c87b03e5Sespie
1054*c87b03e5Sespie /* Finds nearest common ancestor in loop tree for given loops. */
1055*c87b03e5Sespie struct loop *
find_common_loop(loop_s,loop_d)1056*c87b03e5Sespie find_common_loop (loop_s, loop_d)
1057*c87b03e5Sespie struct loop *loop_s;
1058*c87b03e5Sespie struct loop *loop_d;
1059*c87b03e5Sespie {
1060*c87b03e5Sespie if (!loop_s) return loop_d;
1061*c87b03e5Sespie if (!loop_d) return loop_s;
1062*c87b03e5Sespie
1063*c87b03e5Sespie if (loop_s->depth < loop_d->depth)
1064*c87b03e5Sespie loop_d = loop_d->pred[loop_s->depth];
1065*c87b03e5Sespie else if (loop_s->depth > loop_d->depth)
1066*c87b03e5Sespie loop_s = loop_s->pred[loop_d->depth];
1067*c87b03e5Sespie
1068*c87b03e5Sespie while (loop_s != loop_d)
1069*c87b03e5Sespie {
1070*c87b03e5Sespie loop_s = loop_s->outer;
1071*c87b03e5Sespie loop_d = loop_d->outer;
1072*c87b03e5Sespie }
1073*c87b03e5Sespie return loop_s;
1074*c87b03e5Sespie }
1075*c87b03e5Sespie
1076*c87b03e5Sespie /* Checks that LOOPS are allright:
1077*c87b03e5Sespie -- sizes of loops are allright
1078*c87b03e5Sespie -- results of get_loop_body really belong to the loop
1079*c87b03e5Sespie -- loop header have just single entry edge and single latch edge
1080*c87b03e5Sespie -- loop latches have only single successor that is header of their loop
1081*c87b03e5Sespie */
1082*c87b03e5Sespie void
verify_loop_structure(loops,flags)1083*c87b03e5Sespie verify_loop_structure (loops, flags)
1084*c87b03e5Sespie struct loops *loops;
1085*c87b03e5Sespie int flags;
1086*c87b03e5Sespie {
1087*c87b03e5Sespie int *sizes, i, j;
1088*c87b03e5Sespie basic_block *bbs, bb;
1089*c87b03e5Sespie struct loop *loop;
1090*c87b03e5Sespie int err = 0;
1091*c87b03e5Sespie
1092*c87b03e5Sespie /* Check sizes. */
1093*c87b03e5Sespie sizes = xcalloc (loops->num, sizeof (int));
1094*c87b03e5Sespie sizes[0] = 2;
1095*c87b03e5Sespie
1096*c87b03e5Sespie FOR_EACH_BB (bb)
1097*c87b03e5Sespie for (loop = bb->loop_father; loop; loop = loop->outer)
1098*c87b03e5Sespie sizes[loop->num]++;
1099*c87b03e5Sespie
1100*c87b03e5Sespie for (i = 0; i < loops->num; i++)
1101*c87b03e5Sespie {
1102*c87b03e5Sespie if (!loops->parray[i])
1103*c87b03e5Sespie continue;
1104*c87b03e5Sespie
1105*c87b03e5Sespie if (loops->parray[i]->num_nodes != sizes[i])
1106*c87b03e5Sespie {
1107*c87b03e5Sespie error ("Size of loop %d should be %d, not %d.",
1108*c87b03e5Sespie i, sizes[i], loops->parray[i]->num_nodes);
1109*c87b03e5Sespie err = 1;
1110*c87b03e5Sespie }
1111*c87b03e5Sespie }
1112*c87b03e5Sespie
1113*c87b03e5Sespie free (sizes);
1114*c87b03e5Sespie
1115*c87b03e5Sespie /* Check get_loop_body. */
1116*c87b03e5Sespie for (i = 1; i < loops->num; i++)
1117*c87b03e5Sespie {
1118*c87b03e5Sespie loop = loops->parray[i];
1119*c87b03e5Sespie if (!loop)
1120*c87b03e5Sespie continue;
1121*c87b03e5Sespie bbs = get_loop_body (loop);
1122*c87b03e5Sespie
1123*c87b03e5Sespie for (j = 0; j < loop->num_nodes; j++)
1124*c87b03e5Sespie if (!flow_bb_inside_loop_p (loop, bbs[j]))
1125*c87b03e5Sespie {
1126*c87b03e5Sespie error ("Bb %d do not belong to loop %d.",
1127*c87b03e5Sespie bbs[j]->index, i);
1128*c87b03e5Sespie err = 1;
1129*c87b03e5Sespie }
1130*c87b03e5Sespie free (bbs);
1131*c87b03e5Sespie }
1132*c87b03e5Sespie
1133*c87b03e5Sespie /* Check headers and latches. */
1134*c87b03e5Sespie for (i = 1; i < loops->num; i++)
1135*c87b03e5Sespie {
1136*c87b03e5Sespie loop = loops->parray[i];
1137*c87b03e5Sespie if (!loop)
1138*c87b03e5Sespie continue;
1139*c87b03e5Sespie
1140*c87b03e5Sespie if ((flags & VLS_EXPECT_PREHEADERS)
1141*c87b03e5Sespie && (!loop->header->pred->pred_next
1142*c87b03e5Sespie || loop->header->pred->pred_next->pred_next))
1143*c87b03e5Sespie {
1144*c87b03e5Sespie error ("Loop %d's header does not have exactly 2 entries.", i);
1145*c87b03e5Sespie err = 1;
1146*c87b03e5Sespie }
1147*c87b03e5Sespie if (flags & VLS_EXPECT_SIMPLE_LATCHES)
1148*c87b03e5Sespie {
1149*c87b03e5Sespie if (!loop->latch->succ
1150*c87b03e5Sespie || loop->latch->succ->succ_next)
1151*c87b03e5Sespie {
1152*c87b03e5Sespie error ("Loop %d's latch does not have exactly 1 successor.", i);
1153*c87b03e5Sespie err = 1;
1154*c87b03e5Sespie }
1155*c87b03e5Sespie if (loop->latch->succ->dest != loop->header)
1156*c87b03e5Sespie {
1157*c87b03e5Sespie error ("Loop %d's latch does not have header as successor.", i);
1158*c87b03e5Sespie err = 1;
1159*c87b03e5Sespie }
1160*c87b03e5Sespie if (loop->latch->loop_father != loop)
1161*c87b03e5Sespie {
1162*c87b03e5Sespie error ("Loop %d's latch does not belong directly to it.", i);
1163*c87b03e5Sespie err = 1;
1164*c87b03e5Sespie }
1165*c87b03e5Sespie }
1166*c87b03e5Sespie if (loop->header->loop_father != loop)
1167*c87b03e5Sespie {
1168*c87b03e5Sespie error ("Loop %d's header does not belong directly to it.", i);
1169*c87b03e5Sespie err = 1;
1170*c87b03e5Sespie }
1171*c87b03e5Sespie }
1172*c87b03e5Sespie
1173*c87b03e5Sespie if (err)
1174*c87b03e5Sespie abort ();
1175*c87b03e5Sespie }
1176*c87b03e5Sespie
1177*c87b03e5Sespie /* Returns latch edge of LOOP. */
1178*c87b03e5Sespie edge
loop_latch_edge(loop)1179*c87b03e5Sespie loop_latch_edge (loop)
1180*c87b03e5Sespie struct loop *loop;
1181*c87b03e5Sespie {
1182*c87b03e5Sespie edge e;
1183*c87b03e5Sespie
1184*c87b03e5Sespie for (e = loop->header->pred; e->src != loop->latch; e = e->pred_next)
1185*c87b03e5Sespie continue;
1186*c87b03e5Sespie
1187*c87b03e5Sespie return e;
1188*c87b03e5Sespie }
1189*c87b03e5Sespie
1190*c87b03e5Sespie /* Returns preheader edge of LOOP. */
1191*c87b03e5Sespie edge
loop_preheader_edge(loop)1192*c87b03e5Sespie loop_preheader_edge (loop)
1193*c87b03e5Sespie struct loop *loop;
1194*c87b03e5Sespie {
1195*c87b03e5Sespie edge e;
1196*c87b03e5Sespie
1197*c87b03e5Sespie for (e = loop->header->pred; e->src == loop->latch; e = e->pred_next)
1198*c87b03e5Sespie continue;
1199*c87b03e5Sespie
1200*c87b03e5Sespie return e;
1201*c87b03e5Sespie }
1202*c87b03e5Sespie
1203