OSDN Git Service

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