xref: /dflybsd-src/contrib/gcc-4.7/gcc/lcm.c (revision 04febcfb30580676d3e95f58a16c5137ee478b32)
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