1*e4b17023SJohn Marino /* Generic partial redundancy elimination with lazy code motion support.
2*e4b17023SJohn Marino Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008,
3*e4b17023SJohn Marino 2010, 2011 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 /* These routines are meant to be used by various optimization
22*e4b17023SJohn Marino passes which can be modeled as lazy code motion problems.
23*e4b17023SJohn Marino Including, but not limited to:
24*e4b17023SJohn Marino
25*e4b17023SJohn Marino * Traditional partial redundancy elimination.
26*e4b17023SJohn Marino
27*e4b17023SJohn Marino * Placement of caller/caller register save/restores.
28*e4b17023SJohn Marino
29*e4b17023SJohn Marino * Load/store motion.
30*e4b17023SJohn Marino
31*e4b17023SJohn Marino * Copy motion.
32*e4b17023SJohn Marino
33*e4b17023SJohn Marino * Conversion of flat register files to a stacked register
34*e4b17023SJohn Marino model.
35*e4b17023SJohn Marino
36*e4b17023SJohn Marino * Dead load/store elimination.
37*e4b17023SJohn Marino
38*e4b17023SJohn Marino These routines accept as input:
39*e4b17023SJohn Marino
40*e4b17023SJohn Marino * Basic block information (number of blocks, lists of
41*e4b17023SJohn Marino predecessors and successors). Note the granularity
42*e4b17023SJohn Marino does not need to be basic block, they could be statements
43*e4b17023SJohn Marino or functions.
44*e4b17023SJohn Marino
45*e4b17023SJohn Marino * Bitmaps of local properties (computed, transparent and
46*e4b17023SJohn Marino anticipatable expressions).
47*e4b17023SJohn Marino
48*e4b17023SJohn Marino The output of these routines is bitmap of redundant computations
49*e4b17023SJohn Marino and a bitmap of optimal placement points. */
50*e4b17023SJohn Marino
51*e4b17023SJohn Marino
52*e4b17023SJohn Marino #include "config.h"
53*e4b17023SJohn Marino #include "system.h"
54*e4b17023SJohn Marino #include "coretypes.h"
55*e4b17023SJohn Marino #include "tm.h"
56*e4b17023SJohn Marino #include "rtl.h"
57*e4b17023SJohn Marino #include "regs.h"
58*e4b17023SJohn Marino #include "hard-reg-set.h"
59*e4b17023SJohn Marino #include "flags.h"
60*e4b17023SJohn Marino #include "insn-config.h"
61*e4b17023SJohn Marino #include "recog.h"
62*e4b17023SJohn Marino #include "basic-block.h"
63*e4b17023SJohn Marino #include "output.h"
64*e4b17023SJohn Marino #include "tm_p.h"
65*e4b17023SJohn Marino #include "function.h"
66*e4b17023SJohn Marino #include "sbitmap.h"
67*e4b17023SJohn Marino
68*e4b17023SJohn Marino /* We want target macros for the mode switching code to be able to refer
69*e4b17023SJohn Marino to instruction attribute values. */
70*e4b17023SJohn Marino #include "insn-attr.h"
71*e4b17023SJohn Marino
72*e4b17023SJohn Marino /* Edge based LCM routines. */
73*e4b17023SJohn Marino static void compute_antinout_edge (sbitmap *, sbitmap *, sbitmap *, sbitmap *);
74*e4b17023SJohn Marino static void compute_earliest (struct edge_list *, int, sbitmap *, sbitmap *,
75*e4b17023SJohn Marino sbitmap *, sbitmap *, sbitmap *);
76*e4b17023SJohn Marino static void compute_laterin (struct edge_list *, sbitmap *, sbitmap *,
77*e4b17023SJohn Marino sbitmap *, sbitmap *);
78*e4b17023SJohn Marino static void compute_insert_delete (struct edge_list *edge_list, sbitmap *,
79*e4b17023SJohn Marino sbitmap *, sbitmap *, sbitmap *, sbitmap *);
80*e4b17023SJohn Marino
81*e4b17023SJohn Marino /* Edge based LCM routines on a reverse flowgraph. */
82*e4b17023SJohn Marino static void compute_farthest (struct edge_list *, int, sbitmap *, sbitmap *,
83*e4b17023SJohn Marino sbitmap*, sbitmap *, sbitmap *);
84*e4b17023SJohn Marino static void compute_nearerout (struct edge_list *, sbitmap *, sbitmap *,
85*e4b17023SJohn Marino sbitmap *, sbitmap *);
86*e4b17023SJohn Marino static void compute_rev_insert_delete (struct edge_list *edge_list, sbitmap *,
87*e4b17023SJohn Marino sbitmap *, sbitmap *, sbitmap *,
88*e4b17023SJohn Marino sbitmap *);
89*e4b17023SJohn Marino
90*e4b17023SJohn Marino /* Edge based lcm routines. */
91*e4b17023SJohn Marino
92*e4b17023SJohn Marino /* Compute expression anticipatability at entrance and exit of each block.
93*e4b17023SJohn Marino This is done based on the flow graph, and not on the pred-succ lists.
94*e4b17023SJohn Marino Other than that, its pretty much identical to compute_antinout. */
95*e4b17023SJohn Marino
96*e4b17023SJohn Marino static void
compute_antinout_edge(sbitmap * antloc,sbitmap * transp,sbitmap * antin,sbitmap * antout)97*e4b17023SJohn Marino compute_antinout_edge (sbitmap *antloc, sbitmap *transp, sbitmap *antin,
98*e4b17023SJohn Marino sbitmap *antout)
99*e4b17023SJohn Marino {
100*e4b17023SJohn Marino basic_block bb;
101*e4b17023SJohn Marino edge e;
102*e4b17023SJohn Marino basic_block *worklist, *qin, *qout, *qend;
103*e4b17023SJohn Marino unsigned int qlen;
104*e4b17023SJohn Marino edge_iterator ei;
105*e4b17023SJohn Marino
106*e4b17023SJohn Marino /* Allocate a worklist array/queue. Entries are only added to the
107*e4b17023SJohn Marino list if they were not already on the list. So the size is
108*e4b17023SJohn Marino bounded by the number of basic blocks. */
109*e4b17023SJohn Marino qin = qout = worklist = XNEWVEC (basic_block, n_basic_blocks);
110*e4b17023SJohn Marino
111*e4b17023SJohn Marino /* We want a maximal solution, so make an optimistic initialization of
112*e4b17023SJohn Marino ANTIN. */
113*e4b17023SJohn Marino sbitmap_vector_ones (antin, last_basic_block);
114*e4b17023SJohn Marino
115*e4b17023SJohn Marino /* Put every block on the worklist; this is necessary because of the
116*e4b17023SJohn Marino optimistic initialization of ANTIN above. */
117*e4b17023SJohn Marino FOR_EACH_BB_REVERSE (bb)
118*e4b17023SJohn Marino {
119*e4b17023SJohn Marino *qin++ = bb;
120*e4b17023SJohn Marino bb->aux = bb;
121*e4b17023SJohn Marino }
122*e4b17023SJohn Marino
123*e4b17023SJohn Marino qin = worklist;
124*e4b17023SJohn Marino qend = &worklist[n_basic_blocks - NUM_FIXED_BLOCKS];
125*e4b17023SJohn Marino qlen = n_basic_blocks - NUM_FIXED_BLOCKS;
126*e4b17023SJohn Marino
127*e4b17023SJohn Marino /* Mark blocks which are predecessors of the exit block so that we
128*e4b17023SJohn Marino can easily identify them below. */
129*e4b17023SJohn Marino FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
130*e4b17023SJohn Marino e->src->aux = EXIT_BLOCK_PTR;
131*e4b17023SJohn Marino
132*e4b17023SJohn Marino /* Iterate until the worklist is empty. */
133*e4b17023SJohn Marino while (qlen)
134*e4b17023SJohn Marino {
135*e4b17023SJohn Marino /* Take the first entry off the worklist. */
136*e4b17023SJohn Marino bb = *qout++;
137*e4b17023SJohn Marino qlen--;
138*e4b17023SJohn Marino
139*e4b17023SJohn Marino if (qout >= qend)
140*e4b17023SJohn Marino qout = worklist;
141*e4b17023SJohn Marino
142*e4b17023SJohn Marino if (bb->aux == EXIT_BLOCK_PTR)
143*e4b17023SJohn Marino /* Do not clear the aux field for blocks which are predecessors of
144*e4b17023SJohn Marino the EXIT block. That way we never add then to the worklist
145*e4b17023SJohn Marino again. */
146*e4b17023SJohn Marino sbitmap_zero (antout[bb->index]);
147*e4b17023SJohn Marino else
148*e4b17023SJohn Marino {
149*e4b17023SJohn Marino /* Clear the aux field of this block so that it can be added to
150*e4b17023SJohn Marino the worklist again if necessary. */
151*e4b17023SJohn Marino bb->aux = NULL;
152*e4b17023SJohn Marino sbitmap_intersection_of_succs (antout[bb->index], antin, bb->index);
153*e4b17023SJohn Marino }
154*e4b17023SJohn Marino
155*e4b17023SJohn Marino if (sbitmap_a_or_b_and_c_cg (antin[bb->index], antloc[bb->index],
156*e4b17023SJohn Marino transp[bb->index], antout[bb->index]))
157*e4b17023SJohn Marino /* If the in state of this block changed, then we need
158*e4b17023SJohn Marino to add the predecessors of this block to the worklist
159*e4b17023SJohn Marino if they are not already on the worklist. */
160*e4b17023SJohn Marino FOR_EACH_EDGE (e, ei, bb->preds)
161*e4b17023SJohn Marino if (!e->src->aux && e->src != ENTRY_BLOCK_PTR)
162*e4b17023SJohn Marino {
163*e4b17023SJohn Marino *qin++ = e->src;
164*e4b17023SJohn Marino e->src->aux = e;
165*e4b17023SJohn Marino qlen++;
166*e4b17023SJohn Marino if (qin >= qend)
167*e4b17023SJohn Marino qin = worklist;
168*e4b17023SJohn Marino }
169*e4b17023SJohn Marino }
170*e4b17023SJohn Marino
171*e4b17023SJohn Marino clear_aux_for_edges ();
172*e4b17023SJohn Marino clear_aux_for_blocks ();
173*e4b17023SJohn Marino free (worklist);
174*e4b17023SJohn Marino }
175*e4b17023SJohn Marino
176*e4b17023SJohn Marino /* Compute the earliest vector for edge based lcm. */
177*e4b17023SJohn Marino
178*e4b17023SJohn Marino static void
compute_earliest(struct edge_list * edge_list,int n_exprs,sbitmap * antin,sbitmap * antout,sbitmap * avout,sbitmap * kill,sbitmap * earliest)179*e4b17023SJohn Marino compute_earliest (struct edge_list *edge_list, int n_exprs, sbitmap *antin,
180*e4b17023SJohn Marino sbitmap *antout, sbitmap *avout, sbitmap *kill,
181*e4b17023SJohn Marino sbitmap *earliest)
182*e4b17023SJohn Marino {
183*e4b17023SJohn Marino sbitmap difference, temp_bitmap;
184*e4b17023SJohn Marino int x, num_edges;
185*e4b17023SJohn Marino basic_block pred, succ;
186*e4b17023SJohn Marino
187*e4b17023SJohn Marino num_edges = NUM_EDGES (edge_list);
188*e4b17023SJohn Marino
189*e4b17023SJohn Marino difference = sbitmap_alloc (n_exprs);
190*e4b17023SJohn Marino temp_bitmap = sbitmap_alloc (n_exprs);
191*e4b17023SJohn Marino
192*e4b17023SJohn Marino for (x = 0; x < num_edges; x++)
193*e4b17023SJohn Marino {
194*e4b17023SJohn Marino pred = INDEX_EDGE_PRED_BB (edge_list, x);
195*e4b17023SJohn Marino succ = INDEX_EDGE_SUCC_BB (edge_list, x);
196*e4b17023SJohn Marino if (pred == ENTRY_BLOCK_PTR)
197*e4b17023SJohn Marino sbitmap_copy (earliest[x], antin[succ->index]);
198*e4b17023SJohn Marino else
199*e4b17023SJohn Marino {
200*e4b17023SJohn Marino if (succ == EXIT_BLOCK_PTR)
201*e4b17023SJohn Marino sbitmap_zero (earliest[x]);
202*e4b17023SJohn Marino else
203*e4b17023SJohn Marino {
204*e4b17023SJohn Marino sbitmap_difference (difference, antin[succ->index],
205*e4b17023SJohn Marino avout[pred->index]);
206*e4b17023SJohn Marino sbitmap_not (temp_bitmap, antout[pred->index]);
207*e4b17023SJohn Marino sbitmap_a_and_b_or_c (earliest[x], difference,
208*e4b17023SJohn Marino kill[pred->index], temp_bitmap);
209*e4b17023SJohn Marino }
210*e4b17023SJohn Marino }
211*e4b17023SJohn Marino }
212*e4b17023SJohn Marino
213*e4b17023SJohn Marino sbitmap_free (temp_bitmap);
214*e4b17023SJohn Marino sbitmap_free (difference);
215*e4b17023SJohn Marino }
216*e4b17023SJohn Marino
217*e4b17023SJohn Marino /* later(p,s) is dependent on the calculation of laterin(p).
218*e4b17023SJohn Marino laterin(p) is dependent on the calculation of later(p2,p).
219*e4b17023SJohn Marino
220*e4b17023SJohn Marino laterin(ENTRY) is defined as all 0's
221*e4b17023SJohn Marino later(ENTRY, succs(ENTRY)) are defined using laterin(ENTRY)
222*e4b17023SJohn Marino laterin(succs(ENTRY)) is defined by later(ENTRY, succs(ENTRY)).
223*e4b17023SJohn Marino
224*e4b17023SJohn Marino If we progress in this manner, starting with all basic blocks
225*e4b17023SJohn Marino in the work list, anytime we change later(bb), we need to add
226*e4b17023SJohn Marino succs(bb) to the worklist if they are not already on the worklist.
227*e4b17023SJohn Marino
228*e4b17023SJohn Marino Boundary conditions:
229*e4b17023SJohn Marino
230*e4b17023SJohn Marino We prime the worklist all the normal basic blocks. The ENTRY block can
231*e4b17023SJohn Marino never be added to the worklist since it is never the successor of any
232*e4b17023SJohn Marino block. We explicitly prevent the EXIT block from being added to the
233*e4b17023SJohn Marino worklist.
234*e4b17023SJohn Marino
235*e4b17023SJohn Marino We optimistically initialize LATER. That is the only time this routine
236*e4b17023SJohn Marino will compute LATER for an edge out of the entry block since the entry
237*e4b17023SJohn Marino block is never on the worklist. Thus, LATERIN is neither used nor
238*e4b17023SJohn Marino computed for the ENTRY block.
239*e4b17023SJohn Marino
240*e4b17023SJohn Marino Since the EXIT block is never added to the worklist, we will neither
241*e4b17023SJohn Marino use nor compute LATERIN for the exit block. Edges which reach the
242*e4b17023SJohn Marino EXIT block are handled in the normal fashion inside the loop. However,
243*e4b17023SJohn Marino the insertion/deletion computation needs LATERIN(EXIT), so we have
244*e4b17023SJohn Marino to compute it. */
245*e4b17023SJohn Marino
246*e4b17023SJohn Marino static void
compute_laterin(struct edge_list * edge_list,sbitmap * earliest,sbitmap * antloc,sbitmap * later,sbitmap * laterin)247*e4b17023SJohn Marino compute_laterin (struct edge_list *edge_list, sbitmap *earliest,
248*e4b17023SJohn Marino sbitmap *antloc, sbitmap *later, sbitmap *laterin)
249*e4b17023SJohn Marino {
250*e4b17023SJohn Marino int num_edges, i;
251*e4b17023SJohn Marino edge e;
252*e4b17023SJohn Marino basic_block *worklist, *qin, *qout, *qend, bb;
253*e4b17023SJohn Marino unsigned int qlen;
254*e4b17023SJohn Marino edge_iterator ei;
255*e4b17023SJohn Marino
256*e4b17023SJohn Marino num_edges = NUM_EDGES (edge_list);
257*e4b17023SJohn Marino
258*e4b17023SJohn Marino /* Allocate a worklist array/queue. Entries are only added to the
259*e4b17023SJohn Marino list if they were not already on the list. So the size is
260*e4b17023SJohn Marino bounded by the number of basic blocks. */
261*e4b17023SJohn Marino qin = qout = worklist
262*e4b17023SJohn Marino = XNEWVEC (basic_block, n_basic_blocks);
263*e4b17023SJohn Marino
264*e4b17023SJohn Marino /* Initialize a mapping from each edge to its index. */
265*e4b17023SJohn Marino for (i = 0; i < num_edges; i++)
266*e4b17023SJohn Marino INDEX_EDGE (edge_list, i)->aux = (void *) (size_t) i;
267*e4b17023SJohn Marino
268*e4b17023SJohn Marino /* We want a maximal solution, so initially consider LATER true for
269*e4b17023SJohn Marino all edges. This allows propagation through a loop since the incoming
270*e4b17023SJohn Marino loop edge will have LATER set, so if all the other incoming edges
271*e4b17023SJohn Marino to the loop are set, then LATERIN will be set for the head of the
272*e4b17023SJohn Marino loop.
273*e4b17023SJohn Marino
274*e4b17023SJohn Marino If the optimistic setting of LATER on that edge was incorrect (for
275*e4b17023SJohn Marino example the expression is ANTLOC in a block within the loop) then
276*e4b17023SJohn Marino this algorithm will detect it when we process the block at the head
277*e4b17023SJohn Marino of the optimistic edge. That will requeue the affected blocks. */
278*e4b17023SJohn Marino sbitmap_vector_ones (later, num_edges);
279*e4b17023SJohn Marino
280*e4b17023SJohn Marino /* Note that even though we want an optimistic setting of LATER, we
281*e4b17023SJohn Marino do not want to be overly optimistic. Consider an outgoing edge from
282*e4b17023SJohn Marino the entry block. That edge should always have a LATER value the
283*e4b17023SJohn Marino same as EARLIEST for that edge. */
284*e4b17023SJohn Marino FOR_EACH_EDGE (e, ei, ENTRY_BLOCK_PTR->succs)
285*e4b17023SJohn Marino sbitmap_copy (later[(size_t) e->aux], earliest[(size_t) e->aux]);
286*e4b17023SJohn Marino
287*e4b17023SJohn Marino /* Add all the blocks to the worklist. This prevents an early exit from
288*e4b17023SJohn Marino the loop given our optimistic initialization of LATER above. */
289*e4b17023SJohn Marino FOR_EACH_BB (bb)
290*e4b17023SJohn Marino {
291*e4b17023SJohn Marino *qin++ = bb;
292*e4b17023SJohn Marino bb->aux = bb;
293*e4b17023SJohn Marino }
294*e4b17023SJohn Marino
295*e4b17023SJohn Marino /* Note that we do not use the last allocated element for our queue,
296*e4b17023SJohn Marino as EXIT_BLOCK is never inserted into it. */
297*e4b17023SJohn Marino qin = worklist;
298*e4b17023SJohn Marino qend = &worklist[n_basic_blocks - NUM_FIXED_BLOCKS];
299*e4b17023SJohn Marino qlen = n_basic_blocks - NUM_FIXED_BLOCKS;
300*e4b17023SJohn Marino
301*e4b17023SJohn Marino /* Iterate until the worklist is empty. */
302*e4b17023SJohn Marino while (qlen)
303*e4b17023SJohn Marino {
304*e4b17023SJohn Marino /* Take the first entry off the worklist. */
305*e4b17023SJohn Marino bb = *qout++;
306*e4b17023SJohn Marino bb->aux = NULL;
307*e4b17023SJohn Marino qlen--;
308*e4b17023SJohn Marino if (qout >= qend)
309*e4b17023SJohn Marino qout = worklist;
310*e4b17023SJohn Marino
311*e4b17023SJohn Marino /* Compute the intersection of LATERIN for each incoming edge to B. */
312*e4b17023SJohn Marino sbitmap_ones (laterin[bb->index]);
313*e4b17023SJohn Marino FOR_EACH_EDGE (e, ei, bb->preds)
314*e4b17023SJohn Marino sbitmap_a_and_b (laterin[bb->index], laterin[bb->index],
315*e4b17023SJohn Marino later[(size_t)e->aux]);
316*e4b17023SJohn Marino
317*e4b17023SJohn Marino /* Calculate LATER for all outgoing edges. */
318*e4b17023SJohn Marino FOR_EACH_EDGE (e, ei, bb->succs)
319*e4b17023SJohn Marino if (sbitmap_union_of_diff_cg (later[(size_t) e->aux],
320*e4b17023SJohn Marino earliest[(size_t) e->aux],
321*e4b17023SJohn Marino laterin[e->src->index],
322*e4b17023SJohn Marino antloc[e->src->index])
323*e4b17023SJohn Marino /* If LATER for an outgoing edge was changed, then we need
324*e4b17023SJohn Marino to add the target of the outgoing edge to the worklist. */
325*e4b17023SJohn Marino && e->dest != EXIT_BLOCK_PTR && e->dest->aux == 0)
326*e4b17023SJohn Marino {
327*e4b17023SJohn Marino *qin++ = e->dest;
328*e4b17023SJohn Marino e->dest->aux = e;
329*e4b17023SJohn Marino qlen++;
330*e4b17023SJohn Marino if (qin >= qend)
331*e4b17023SJohn Marino qin = worklist;
332*e4b17023SJohn Marino }
333*e4b17023SJohn Marino }
334*e4b17023SJohn Marino
335*e4b17023SJohn Marino /* Computation of insertion and deletion points requires computing LATERIN
336*e4b17023SJohn Marino for the EXIT block. We allocated an extra entry in the LATERIN array
337*e4b17023SJohn Marino for just this purpose. */
338*e4b17023SJohn Marino sbitmap_ones (laterin[last_basic_block]);
339*e4b17023SJohn Marino FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
340*e4b17023SJohn Marino sbitmap_a_and_b (laterin[last_basic_block],
341*e4b17023SJohn Marino laterin[last_basic_block],
342*e4b17023SJohn Marino later[(size_t) e->aux]);
343*e4b17023SJohn Marino
344*e4b17023SJohn Marino clear_aux_for_edges ();
345*e4b17023SJohn Marino free (worklist);
346*e4b17023SJohn Marino }
347*e4b17023SJohn Marino
348*e4b17023SJohn Marino /* Compute the insertion and deletion points for edge based LCM. */
349*e4b17023SJohn Marino
350*e4b17023SJohn Marino static void
compute_insert_delete(struct edge_list * edge_list,sbitmap * antloc,sbitmap * later,sbitmap * laterin,sbitmap * insert,sbitmap * del)351*e4b17023SJohn Marino compute_insert_delete (struct edge_list *edge_list, sbitmap *antloc,
352*e4b17023SJohn Marino sbitmap *later, sbitmap *laterin, sbitmap *insert,
353*e4b17023SJohn Marino sbitmap *del)
354*e4b17023SJohn Marino {
355*e4b17023SJohn Marino int x;
356*e4b17023SJohn Marino basic_block bb;
357*e4b17023SJohn Marino
358*e4b17023SJohn Marino FOR_EACH_BB (bb)
359*e4b17023SJohn Marino sbitmap_difference (del[bb->index], antloc[bb->index],
360*e4b17023SJohn Marino laterin[bb->index]);
361*e4b17023SJohn Marino
362*e4b17023SJohn Marino for (x = 0; x < NUM_EDGES (edge_list); x++)
363*e4b17023SJohn Marino {
364*e4b17023SJohn Marino basic_block b = INDEX_EDGE_SUCC_BB (edge_list, x);
365*e4b17023SJohn Marino
366*e4b17023SJohn Marino if (b == EXIT_BLOCK_PTR)
367*e4b17023SJohn Marino sbitmap_difference (insert[x], later[x], laterin[last_basic_block]);
368*e4b17023SJohn Marino else
369*e4b17023SJohn Marino sbitmap_difference (insert[x], later[x], laterin[b->index]);
370*e4b17023SJohn Marino }
371*e4b17023SJohn Marino }
372*e4b17023SJohn Marino
373*e4b17023SJohn Marino /* Given local properties TRANSP, ANTLOC, AVOUT, KILL return the insert and
374*e4b17023SJohn Marino delete vectors for edge based LCM. Returns an edgelist which is used to
375*e4b17023SJohn Marino map the insert vector to what edge an expression should be inserted on. */
376*e4b17023SJohn Marino
377*e4b17023SJohn Marino struct edge_list *
pre_edge_lcm(int n_exprs,sbitmap * transp,sbitmap * avloc,sbitmap * antloc,sbitmap * kill,sbitmap ** insert,sbitmap ** del)378*e4b17023SJohn Marino pre_edge_lcm (int n_exprs, sbitmap *transp,
379*e4b17023SJohn Marino sbitmap *avloc, sbitmap *antloc, sbitmap *kill,
380*e4b17023SJohn Marino sbitmap **insert, sbitmap **del)
381*e4b17023SJohn Marino {
382*e4b17023SJohn Marino sbitmap *antin, *antout, *earliest;
383*e4b17023SJohn Marino sbitmap *avin, *avout;
384*e4b17023SJohn Marino sbitmap *later, *laterin;
385*e4b17023SJohn Marino struct edge_list *edge_list;
386*e4b17023SJohn Marino int num_edges;
387*e4b17023SJohn Marino
388*e4b17023SJohn Marino edge_list = create_edge_list ();
389*e4b17023SJohn Marino num_edges = NUM_EDGES (edge_list);
390*e4b17023SJohn Marino
391*e4b17023SJohn Marino #ifdef LCM_DEBUG_INFO
392*e4b17023SJohn Marino if (dump_file)
393*e4b17023SJohn Marino {
394*e4b17023SJohn Marino fprintf (dump_file, "Edge List:\n");
395*e4b17023SJohn Marino verify_edge_list (dump_file, edge_list);
396*e4b17023SJohn Marino print_edge_list (dump_file, edge_list);
397*e4b17023SJohn Marino dump_sbitmap_vector (dump_file, "transp", "", transp, last_basic_block);
398*e4b17023SJohn Marino dump_sbitmap_vector (dump_file, "antloc", "", antloc, last_basic_block);
399*e4b17023SJohn Marino dump_sbitmap_vector (dump_file, "avloc", "", avloc, last_basic_block);
400*e4b17023SJohn Marino dump_sbitmap_vector (dump_file, "kill", "", kill, last_basic_block);
401*e4b17023SJohn Marino }
402*e4b17023SJohn Marino #endif
403*e4b17023SJohn Marino
404*e4b17023SJohn Marino /* Compute global availability. */
405*e4b17023SJohn Marino avin = sbitmap_vector_alloc (last_basic_block, n_exprs);
406*e4b17023SJohn Marino avout = sbitmap_vector_alloc (last_basic_block, n_exprs);
407*e4b17023SJohn Marino compute_available (avloc, kill, avout, avin);
408*e4b17023SJohn Marino sbitmap_vector_free (avin);
409*e4b17023SJohn Marino
410*e4b17023SJohn Marino /* Compute global anticipatability. */
411*e4b17023SJohn Marino antin = sbitmap_vector_alloc (last_basic_block, n_exprs);
412*e4b17023SJohn Marino antout = sbitmap_vector_alloc (last_basic_block, n_exprs);
413*e4b17023SJohn Marino compute_antinout_edge (antloc, transp, antin, antout);
414*e4b17023SJohn Marino
415*e4b17023SJohn Marino #ifdef LCM_DEBUG_INFO
416*e4b17023SJohn Marino if (dump_file)
417*e4b17023SJohn Marino {
418*e4b17023SJohn Marino dump_sbitmap_vector (dump_file, "antin", "", antin, last_basic_block);
419*e4b17023SJohn Marino dump_sbitmap_vector (dump_file, "antout", "", antout, last_basic_block);
420*e4b17023SJohn Marino }
421*e4b17023SJohn Marino #endif
422*e4b17023SJohn Marino
423*e4b17023SJohn Marino /* Compute earliestness. */
424*e4b17023SJohn Marino earliest = sbitmap_vector_alloc (num_edges, n_exprs);
425*e4b17023SJohn Marino compute_earliest (edge_list, n_exprs, antin, antout, avout, kill, earliest);
426*e4b17023SJohn Marino
427*e4b17023SJohn Marino #ifdef LCM_DEBUG_INFO
428*e4b17023SJohn Marino if (dump_file)
429*e4b17023SJohn Marino dump_sbitmap_vector (dump_file, "earliest", "", earliest, num_edges);
430*e4b17023SJohn Marino #endif
431*e4b17023SJohn Marino
432*e4b17023SJohn Marino sbitmap_vector_free (antout);
433*e4b17023SJohn Marino sbitmap_vector_free (antin);
434*e4b17023SJohn Marino sbitmap_vector_free (avout);
435*e4b17023SJohn Marino
436*e4b17023SJohn Marino later = sbitmap_vector_alloc (num_edges, n_exprs);
437*e4b17023SJohn Marino
438*e4b17023SJohn Marino /* Allocate an extra element for the exit block in the laterin vector. */
439*e4b17023SJohn Marino laterin = sbitmap_vector_alloc (last_basic_block + 1, n_exprs);
440*e4b17023SJohn Marino compute_laterin (edge_list, earliest, antloc, later, laterin);
441*e4b17023SJohn Marino
442*e4b17023SJohn Marino #ifdef LCM_DEBUG_INFO
443*e4b17023SJohn Marino if (dump_file)
444*e4b17023SJohn Marino {
445*e4b17023SJohn Marino dump_sbitmap_vector (dump_file, "laterin", "", laterin, last_basic_block + 1);
446*e4b17023SJohn Marino dump_sbitmap_vector (dump_file, "later", "", later, num_edges);
447*e4b17023SJohn Marino }
448*e4b17023SJohn Marino #endif
449*e4b17023SJohn Marino
450*e4b17023SJohn Marino sbitmap_vector_free (earliest);
451*e4b17023SJohn Marino
452*e4b17023SJohn Marino *insert = sbitmap_vector_alloc (num_edges, n_exprs);
453*e4b17023SJohn Marino *del = sbitmap_vector_alloc (last_basic_block, n_exprs);
454*e4b17023SJohn Marino sbitmap_vector_zero (*insert, num_edges);
455*e4b17023SJohn Marino sbitmap_vector_zero (*del, last_basic_block);
456*e4b17023SJohn Marino compute_insert_delete (edge_list, antloc, later, laterin, *insert, *del);
457*e4b17023SJohn Marino
458*e4b17023SJohn Marino sbitmap_vector_free (laterin);
459*e4b17023SJohn Marino sbitmap_vector_free (later);
460*e4b17023SJohn Marino
461*e4b17023SJohn Marino #ifdef LCM_DEBUG_INFO
462*e4b17023SJohn Marino if (dump_file)
463*e4b17023SJohn Marino {
464*e4b17023SJohn Marino dump_sbitmap_vector (dump_file, "pre_insert_map", "", *insert, num_edges);
465*e4b17023SJohn Marino dump_sbitmap_vector (dump_file, "pre_delete_map", "", *del,
466*e4b17023SJohn Marino last_basic_block);
467*e4b17023SJohn Marino }
468*e4b17023SJohn Marino #endif
469*e4b17023SJohn Marino
470*e4b17023SJohn Marino return edge_list;
471*e4b17023SJohn Marino }
472*e4b17023SJohn Marino
473*e4b17023SJohn Marino /* Compute the AVIN and AVOUT vectors from the AVLOC and KILL vectors.
474*e4b17023SJohn Marino Return the number of passes we performed to iterate to a solution. */
475*e4b17023SJohn Marino
476*e4b17023SJohn Marino void
compute_available(sbitmap * avloc,sbitmap * kill,sbitmap * avout,sbitmap * avin)477*e4b17023SJohn Marino compute_available (sbitmap *avloc, sbitmap *kill, sbitmap *avout,
478*e4b17023SJohn Marino sbitmap *avin)
479*e4b17023SJohn Marino {
480*e4b17023SJohn Marino edge e;
481*e4b17023SJohn Marino basic_block *worklist, *qin, *qout, *qend, bb;
482*e4b17023SJohn Marino unsigned int qlen;
483*e4b17023SJohn Marino edge_iterator ei;
484*e4b17023SJohn Marino
485*e4b17023SJohn Marino /* Allocate a worklist array/queue. Entries are only added to the
486*e4b17023SJohn Marino list if they were not already on the list. So the size is
487*e4b17023SJohn Marino bounded by the number of basic blocks. */
488*e4b17023SJohn Marino qin = qout = worklist =
489*e4b17023SJohn Marino XNEWVEC (basic_block, n_basic_blocks - NUM_FIXED_BLOCKS);
490*e4b17023SJohn Marino
491*e4b17023SJohn Marino /* We want a maximal solution. */
492*e4b17023SJohn Marino sbitmap_vector_ones (avout, last_basic_block);
493*e4b17023SJohn Marino
494*e4b17023SJohn Marino /* Put every block on the worklist; this is necessary because of the
495*e4b17023SJohn Marino optimistic initialization of AVOUT above. */
496*e4b17023SJohn Marino FOR_EACH_BB (bb)
497*e4b17023SJohn Marino {
498*e4b17023SJohn Marino *qin++ = bb;
499*e4b17023SJohn Marino bb->aux = bb;
500*e4b17023SJohn Marino }
501*e4b17023SJohn Marino
502*e4b17023SJohn Marino qin = worklist;
503*e4b17023SJohn Marino qend = &worklist[n_basic_blocks - NUM_FIXED_BLOCKS];
504*e4b17023SJohn Marino qlen = n_basic_blocks - NUM_FIXED_BLOCKS;
505*e4b17023SJohn Marino
506*e4b17023SJohn Marino /* Mark blocks which are successors of the entry block so that we
507*e4b17023SJohn Marino can easily identify them below. */
508*e4b17023SJohn Marino FOR_EACH_EDGE (e, ei, ENTRY_BLOCK_PTR->succs)
509*e4b17023SJohn Marino e->dest->aux = ENTRY_BLOCK_PTR;
510*e4b17023SJohn Marino
511*e4b17023SJohn Marino /* Iterate until the worklist is empty. */
512*e4b17023SJohn Marino while (qlen)
513*e4b17023SJohn Marino {
514*e4b17023SJohn Marino /* Take the first entry off the worklist. */
515*e4b17023SJohn Marino bb = *qout++;
516*e4b17023SJohn Marino qlen--;
517*e4b17023SJohn Marino
518*e4b17023SJohn Marino if (qout >= qend)
519*e4b17023SJohn Marino qout = worklist;
520*e4b17023SJohn Marino
521*e4b17023SJohn Marino /* If one of the predecessor blocks is the ENTRY block, then the
522*e4b17023SJohn Marino intersection of avouts is the null set. We can identify such blocks
523*e4b17023SJohn Marino by the special value in the AUX field in the block structure. */
524*e4b17023SJohn Marino if (bb->aux == ENTRY_BLOCK_PTR)
525*e4b17023SJohn Marino /* Do not clear the aux field for blocks which are successors of the
526*e4b17023SJohn Marino ENTRY block. That way we never add then to the worklist again. */
527*e4b17023SJohn Marino sbitmap_zero (avin[bb->index]);
528*e4b17023SJohn Marino else
529*e4b17023SJohn Marino {
530*e4b17023SJohn Marino /* Clear the aux field of this block so that it can be added to
531*e4b17023SJohn Marino the worklist again if necessary. */
532*e4b17023SJohn Marino bb->aux = NULL;
533*e4b17023SJohn Marino sbitmap_intersection_of_preds (avin[bb->index], avout, bb->index);
534*e4b17023SJohn Marino }
535*e4b17023SJohn Marino
536*e4b17023SJohn Marino if (sbitmap_union_of_diff_cg (avout[bb->index], avloc[bb->index],
537*e4b17023SJohn Marino avin[bb->index], kill[bb->index]))
538*e4b17023SJohn Marino /* If the out state of this block changed, then we need
539*e4b17023SJohn Marino to add the successors of this block to the worklist
540*e4b17023SJohn Marino if they are not already on the worklist. */
541*e4b17023SJohn Marino FOR_EACH_EDGE (e, ei, bb->succs)
542*e4b17023SJohn Marino if (!e->dest->aux && e->dest != EXIT_BLOCK_PTR)
543*e4b17023SJohn Marino {
544*e4b17023SJohn Marino *qin++ = e->dest;
545*e4b17023SJohn Marino e->dest->aux = e;
546*e4b17023SJohn Marino qlen++;
547*e4b17023SJohn Marino
548*e4b17023SJohn Marino if (qin >= qend)
549*e4b17023SJohn Marino qin = worklist;
550*e4b17023SJohn Marino }
551*e4b17023SJohn Marino }
552*e4b17023SJohn Marino
553*e4b17023SJohn Marino clear_aux_for_edges ();
554*e4b17023SJohn Marino clear_aux_for_blocks ();
555*e4b17023SJohn Marino free (worklist);
556*e4b17023SJohn Marino }
557*e4b17023SJohn Marino
558*e4b17023SJohn Marino /* Compute the farthest vector for edge based lcm. */
559*e4b17023SJohn Marino
560*e4b17023SJohn Marino static void
compute_farthest(struct edge_list * edge_list,int n_exprs,sbitmap * st_avout,sbitmap * st_avin,sbitmap * st_antin,sbitmap * kill,sbitmap * farthest)561*e4b17023SJohn Marino compute_farthest (struct edge_list *edge_list, int n_exprs,
562*e4b17023SJohn Marino sbitmap *st_avout, sbitmap *st_avin, sbitmap *st_antin,
563*e4b17023SJohn Marino sbitmap *kill, sbitmap *farthest)
564*e4b17023SJohn Marino {
565*e4b17023SJohn Marino sbitmap difference, temp_bitmap;
566*e4b17023SJohn Marino int x, num_edges;
567*e4b17023SJohn Marino basic_block pred, succ;
568*e4b17023SJohn Marino
569*e4b17023SJohn Marino num_edges = NUM_EDGES (edge_list);
570*e4b17023SJohn Marino
571*e4b17023SJohn Marino difference = sbitmap_alloc (n_exprs);
572*e4b17023SJohn Marino temp_bitmap = sbitmap_alloc (n_exprs);
573*e4b17023SJohn Marino
574*e4b17023SJohn Marino for (x = 0; x < num_edges; x++)
575*e4b17023SJohn Marino {
576*e4b17023SJohn Marino pred = INDEX_EDGE_PRED_BB (edge_list, x);
577*e4b17023SJohn Marino succ = INDEX_EDGE_SUCC_BB (edge_list, x);
578*e4b17023SJohn Marino if (succ == EXIT_BLOCK_PTR)
579*e4b17023SJohn Marino sbitmap_copy (farthest[x], st_avout[pred->index]);
580*e4b17023SJohn Marino else
581*e4b17023SJohn Marino {
582*e4b17023SJohn Marino if (pred == ENTRY_BLOCK_PTR)
583*e4b17023SJohn Marino sbitmap_zero (farthest[x]);
584*e4b17023SJohn Marino else
585*e4b17023SJohn Marino {
586*e4b17023SJohn Marino sbitmap_difference (difference, st_avout[pred->index],
587*e4b17023SJohn Marino st_antin[succ->index]);
588*e4b17023SJohn Marino sbitmap_not (temp_bitmap, st_avin[succ->index]);
589*e4b17023SJohn Marino sbitmap_a_and_b_or_c (farthest[x], difference,
590*e4b17023SJohn Marino kill[succ->index], temp_bitmap);
591*e4b17023SJohn Marino }
592*e4b17023SJohn Marino }
593*e4b17023SJohn Marino }
594*e4b17023SJohn Marino
595*e4b17023SJohn Marino sbitmap_free (temp_bitmap);
596*e4b17023SJohn Marino sbitmap_free (difference);
597*e4b17023SJohn Marino }
598*e4b17023SJohn Marino
599*e4b17023SJohn Marino /* Compute nearer and nearerout vectors for edge based lcm.
600*e4b17023SJohn Marino
601*e4b17023SJohn Marino This is the mirror of compute_laterin, additional comments on the
602*e4b17023SJohn Marino implementation can be found before compute_laterin. */
603*e4b17023SJohn Marino
604*e4b17023SJohn Marino static void
compute_nearerout(struct edge_list * edge_list,sbitmap * farthest,sbitmap * st_avloc,sbitmap * nearer,sbitmap * nearerout)605*e4b17023SJohn Marino compute_nearerout (struct edge_list *edge_list, sbitmap *farthest,
606*e4b17023SJohn Marino sbitmap *st_avloc, sbitmap *nearer, sbitmap *nearerout)
607*e4b17023SJohn Marino {
608*e4b17023SJohn Marino int num_edges, i;
609*e4b17023SJohn Marino edge e;
610*e4b17023SJohn Marino basic_block *worklist, *tos, bb;
611*e4b17023SJohn Marino edge_iterator ei;
612*e4b17023SJohn Marino
613*e4b17023SJohn Marino num_edges = NUM_EDGES (edge_list);
614*e4b17023SJohn Marino
615*e4b17023SJohn Marino /* Allocate a worklist array/queue. Entries are only added to the
616*e4b17023SJohn Marino list if they were not already on the list. So the size is
617*e4b17023SJohn Marino bounded by the number of basic blocks. */
618*e4b17023SJohn Marino tos = worklist = XNEWVEC (basic_block, n_basic_blocks + 1);
619*e4b17023SJohn Marino
620*e4b17023SJohn Marino /* Initialize NEARER for each edge and build a mapping from an edge to
621*e4b17023SJohn Marino its index. */
622*e4b17023SJohn Marino for (i = 0; i < num_edges; i++)
623*e4b17023SJohn Marino INDEX_EDGE (edge_list, i)->aux = (void *) (size_t) i;
624*e4b17023SJohn Marino
625*e4b17023SJohn Marino /* We want a maximal solution. */
626*e4b17023SJohn Marino sbitmap_vector_ones (nearer, num_edges);
627*e4b17023SJohn Marino
628*e4b17023SJohn Marino /* Note that even though we want an optimistic setting of NEARER, we
629*e4b17023SJohn Marino do not want to be overly optimistic. Consider an incoming edge to
630*e4b17023SJohn Marino the exit block. That edge should always have a NEARER value the
631*e4b17023SJohn Marino same as FARTHEST for that edge. */
632*e4b17023SJohn Marino FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
633*e4b17023SJohn Marino sbitmap_copy (nearer[(size_t)e->aux], farthest[(size_t)e->aux]);
634*e4b17023SJohn Marino
635*e4b17023SJohn Marino /* Add all the blocks to the worklist. This prevents an early exit
636*e4b17023SJohn Marino from the loop given our optimistic initialization of NEARER. */
637*e4b17023SJohn Marino FOR_EACH_BB (bb)
638*e4b17023SJohn Marino {
639*e4b17023SJohn Marino *tos++ = bb;
640*e4b17023SJohn Marino bb->aux = bb;
641*e4b17023SJohn Marino }
642*e4b17023SJohn Marino
643*e4b17023SJohn Marino /* Iterate until the worklist is empty. */
644*e4b17023SJohn Marino while (tos != worklist)
645*e4b17023SJohn Marino {
646*e4b17023SJohn Marino /* Take the first entry off the worklist. */
647*e4b17023SJohn Marino bb = *--tos;
648*e4b17023SJohn Marino bb->aux = NULL;
649*e4b17023SJohn Marino
650*e4b17023SJohn Marino /* Compute the intersection of NEARER for each outgoing edge from B. */
651*e4b17023SJohn Marino sbitmap_ones (nearerout[bb->index]);
652*e4b17023SJohn Marino FOR_EACH_EDGE (e, ei, bb->succs)
653*e4b17023SJohn Marino sbitmap_a_and_b (nearerout[bb->index], nearerout[bb->index],
654*e4b17023SJohn Marino nearer[(size_t) e->aux]);
655*e4b17023SJohn Marino
656*e4b17023SJohn Marino /* Calculate NEARER for all incoming edges. */
657*e4b17023SJohn Marino FOR_EACH_EDGE (e, ei, bb->preds)
658*e4b17023SJohn Marino if (sbitmap_union_of_diff_cg (nearer[(size_t) e->aux],
659*e4b17023SJohn Marino farthest[(size_t) e->aux],
660*e4b17023SJohn Marino nearerout[e->dest->index],
661*e4b17023SJohn Marino st_avloc[e->dest->index])
662*e4b17023SJohn Marino /* If NEARER for an incoming edge was changed, then we need
663*e4b17023SJohn Marino to add the source of the incoming edge to the worklist. */
664*e4b17023SJohn Marino && e->src != ENTRY_BLOCK_PTR && e->src->aux == 0)
665*e4b17023SJohn Marino {
666*e4b17023SJohn Marino *tos++ = e->src;
667*e4b17023SJohn Marino e->src->aux = e;
668*e4b17023SJohn Marino }
669*e4b17023SJohn Marino }
670*e4b17023SJohn Marino
671*e4b17023SJohn Marino /* Computation of insertion and deletion points requires computing NEAREROUT
672*e4b17023SJohn Marino for the ENTRY block. We allocated an extra entry in the NEAREROUT array
673*e4b17023SJohn Marino for just this purpose. */
674*e4b17023SJohn Marino sbitmap_ones (nearerout[last_basic_block]);
675*e4b17023SJohn Marino FOR_EACH_EDGE (e, ei, ENTRY_BLOCK_PTR->succs)
676*e4b17023SJohn Marino sbitmap_a_and_b (nearerout[last_basic_block],
677*e4b17023SJohn Marino nearerout[last_basic_block],
678*e4b17023SJohn Marino nearer[(size_t) e->aux]);
679*e4b17023SJohn Marino
680*e4b17023SJohn Marino clear_aux_for_edges ();
681*e4b17023SJohn Marino free (tos);
682*e4b17023SJohn Marino }
683*e4b17023SJohn Marino
684*e4b17023SJohn Marino /* Compute the insertion and deletion points for edge based LCM. */
685*e4b17023SJohn Marino
686*e4b17023SJohn Marino static void
compute_rev_insert_delete(struct edge_list * edge_list,sbitmap * st_avloc,sbitmap * nearer,sbitmap * nearerout,sbitmap * insert,sbitmap * del)687*e4b17023SJohn Marino compute_rev_insert_delete (struct edge_list *edge_list, sbitmap *st_avloc,
688*e4b17023SJohn Marino sbitmap *nearer, sbitmap *nearerout,
689*e4b17023SJohn Marino sbitmap *insert, sbitmap *del)
690*e4b17023SJohn Marino {
691*e4b17023SJohn Marino int x;
692*e4b17023SJohn Marino basic_block bb;
693*e4b17023SJohn Marino
694*e4b17023SJohn Marino FOR_EACH_BB (bb)
695*e4b17023SJohn Marino sbitmap_difference (del[bb->index], st_avloc[bb->index],
696*e4b17023SJohn Marino nearerout[bb->index]);
697*e4b17023SJohn Marino
698*e4b17023SJohn Marino for (x = 0; x < NUM_EDGES (edge_list); x++)
699*e4b17023SJohn Marino {
700*e4b17023SJohn Marino basic_block b = INDEX_EDGE_PRED_BB (edge_list, x);
701*e4b17023SJohn Marino if (b == ENTRY_BLOCK_PTR)
702*e4b17023SJohn Marino sbitmap_difference (insert[x], nearer[x], nearerout[last_basic_block]);
703*e4b17023SJohn Marino else
704*e4b17023SJohn Marino sbitmap_difference (insert[x], nearer[x], nearerout[b->index]);
705*e4b17023SJohn Marino }
706*e4b17023SJohn Marino }
707*e4b17023SJohn Marino
708*e4b17023SJohn Marino /* Given local properties TRANSP, ST_AVLOC, ST_ANTLOC, KILL return the
709*e4b17023SJohn Marino insert and delete vectors for edge based reverse LCM. Returns an
710*e4b17023SJohn Marino edgelist which is used to map the insert vector to what edge
711*e4b17023SJohn Marino an expression should be inserted on. */
712*e4b17023SJohn Marino
713*e4b17023SJohn Marino struct edge_list *
pre_edge_rev_lcm(int n_exprs,sbitmap * transp,sbitmap * st_avloc,sbitmap * st_antloc,sbitmap * kill,sbitmap ** insert,sbitmap ** del)714*e4b17023SJohn Marino pre_edge_rev_lcm (int n_exprs, sbitmap *transp,
715*e4b17023SJohn Marino sbitmap *st_avloc, sbitmap *st_antloc, sbitmap *kill,
716*e4b17023SJohn Marino sbitmap **insert, sbitmap **del)
717*e4b17023SJohn Marino {
718*e4b17023SJohn Marino sbitmap *st_antin, *st_antout;
719*e4b17023SJohn Marino sbitmap *st_avout, *st_avin, *farthest;
720*e4b17023SJohn Marino sbitmap *nearer, *nearerout;
721*e4b17023SJohn Marino struct edge_list *edge_list;
722*e4b17023SJohn Marino int num_edges;
723*e4b17023SJohn Marino
724*e4b17023SJohn Marino edge_list = create_edge_list ();
725*e4b17023SJohn Marino num_edges = NUM_EDGES (edge_list);
726*e4b17023SJohn Marino
727*e4b17023SJohn Marino st_antin = sbitmap_vector_alloc (last_basic_block, n_exprs);
728*e4b17023SJohn Marino st_antout = sbitmap_vector_alloc (last_basic_block, n_exprs);
729*e4b17023SJohn Marino sbitmap_vector_zero (st_antin, last_basic_block);
730*e4b17023SJohn Marino sbitmap_vector_zero (st_antout, last_basic_block);
731*e4b17023SJohn Marino compute_antinout_edge (st_antloc, transp, st_antin, st_antout);
732*e4b17023SJohn Marino
733*e4b17023SJohn Marino /* Compute global anticipatability. */
734*e4b17023SJohn Marino st_avout = sbitmap_vector_alloc (last_basic_block, n_exprs);
735*e4b17023SJohn Marino st_avin = sbitmap_vector_alloc (last_basic_block, n_exprs);
736*e4b17023SJohn Marino compute_available (st_avloc, kill, st_avout, st_avin);
737*e4b17023SJohn Marino
738*e4b17023SJohn Marino #ifdef LCM_DEBUG_INFO
739*e4b17023SJohn Marino if (dump_file)
740*e4b17023SJohn Marino {
741*e4b17023SJohn Marino fprintf (dump_file, "Edge List:\n");
742*e4b17023SJohn Marino verify_edge_list (dump_file, edge_list);
743*e4b17023SJohn Marino print_edge_list (dump_file, edge_list);
744*e4b17023SJohn Marino dump_sbitmap_vector (dump_file, "transp", "", transp, last_basic_block);
745*e4b17023SJohn Marino dump_sbitmap_vector (dump_file, "st_avloc", "", st_avloc, last_basic_block);
746*e4b17023SJohn Marino dump_sbitmap_vector (dump_file, "st_antloc", "", st_antloc, last_basic_block);
747*e4b17023SJohn Marino dump_sbitmap_vector (dump_file, "st_antin", "", st_antin, last_basic_block);
748*e4b17023SJohn Marino dump_sbitmap_vector (dump_file, "st_antout", "", st_antout, last_basic_block);
749*e4b17023SJohn Marino dump_sbitmap_vector (dump_file, "st_kill", "", kill, last_basic_block);
750*e4b17023SJohn Marino }
751*e4b17023SJohn Marino #endif
752*e4b17023SJohn Marino
753*e4b17023SJohn Marino #ifdef LCM_DEBUG_INFO
754*e4b17023SJohn Marino if (dump_file)
755*e4b17023SJohn Marino {
756*e4b17023SJohn Marino dump_sbitmap_vector (dump_file, "st_avout", "", st_avout, last_basic_block);
757*e4b17023SJohn Marino dump_sbitmap_vector (dump_file, "st_avin", "", st_avin, last_basic_block);
758*e4b17023SJohn Marino }
759*e4b17023SJohn Marino #endif
760*e4b17023SJohn Marino
761*e4b17023SJohn Marino /* Compute farthestness. */
762*e4b17023SJohn Marino farthest = sbitmap_vector_alloc (num_edges, n_exprs);
763*e4b17023SJohn Marino compute_farthest (edge_list, n_exprs, st_avout, st_avin, st_antin,
764*e4b17023SJohn Marino kill, farthest);
765*e4b17023SJohn Marino
766*e4b17023SJohn Marino #ifdef LCM_DEBUG_INFO
767*e4b17023SJohn Marino if (dump_file)
768*e4b17023SJohn Marino dump_sbitmap_vector (dump_file, "farthest", "", farthest, num_edges);
769*e4b17023SJohn Marino #endif
770*e4b17023SJohn Marino
771*e4b17023SJohn Marino sbitmap_vector_free (st_antin);
772*e4b17023SJohn Marino sbitmap_vector_free (st_antout);
773*e4b17023SJohn Marino
774*e4b17023SJohn Marino sbitmap_vector_free (st_avin);
775*e4b17023SJohn Marino sbitmap_vector_free (st_avout);
776*e4b17023SJohn Marino
777*e4b17023SJohn Marino nearer = sbitmap_vector_alloc (num_edges, n_exprs);
778*e4b17023SJohn Marino
779*e4b17023SJohn Marino /* Allocate an extra element for the entry block. */
780*e4b17023SJohn Marino nearerout = sbitmap_vector_alloc (last_basic_block + 1, n_exprs);
781*e4b17023SJohn Marino compute_nearerout (edge_list, farthest, st_avloc, nearer, nearerout);
782*e4b17023SJohn Marino
783*e4b17023SJohn Marino #ifdef LCM_DEBUG_INFO
784*e4b17023SJohn Marino if (dump_file)
785*e4b17023SJohn Marino {
786*e4b17023SJohn Marino dump_sbitmap_vector (dump_file, "nearerout", "", nearerout,
787*e4b17023SJohn Marino last_basic_block + 1);
788*e4b17023SJohn Marino dump_sbitmap_vector (dump_file, "nearer", "", nearer, num_edges);
789*e4b17023SJohn Marino }
790*e4b17023SJohn Marino #endif
791*e4b17023SJohn Marino
792*e4b17023SJohn Marino sbitmap_vector_free (farthest);
793*e4b17023SJohn Marino
794*e4b17023SJohn Marino *insert = sbitmap_vector_alloc (num_edges, n_exprs);
795*e4b17023SJohn Marino *del = sbitmap_vector_alloc (last_basic_block, n_exprs);
796*e4b17023SJohn Marino compute_rev_insert_delete (edge_list, st_avloc, nearer, nearerout,
797*e4b17023SJohn Marino *insert, *del);
798*e4b17023SJohn Marino
799*e4b17023SJohn Marino sbitmap_vector_free (nearerout);
800*e4b17023SJohn Marino sbitmap_vector_free (nearer);
801*e4b17023SJohn Marino
802*e4b17023SJohn Marino #ifdef LCM_DEBUG_INFO
803*e4b17023SJohn Marino if (dump_file)
804*e4b17023SJohn Marino {
805*e4b17023SJohn Marino dump_sbitmap_vector (dump_file, "pre_insert_map", "", *insert, num_edges);
806*e4b17023SJohn Marino dump_sbitmap_vector (dump_file, "pre_delete_map", "", *del,
807*e4b17023SJohn Marino last_basic_block);
808*e4b17023SJohn Marino }
809*e4b17023SJohn Marino #endif
810*e4b17023SJohn Marino return edge_list;
811*e4b17023SJohn Marino }
812*e4b17023SJohn Marino
813