1 /* Generic partial redundancy elimination with lazy code motion support.
2 Copyright (C) 1998-2015 Free Software Foundation, Inc.
4 This file is part of GCC.
6 GCC is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 3, or (at your option) any later
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3. If not see
18 <http://www.gnu.org/licenses/>. */
20 /* These routines are meant to be used by various optimization
21 passes which can be modeled as lazy code motion problems.
22 Including, but not limited to:
24 * Traditional partial redundancy elimination.
26 * Placement of caller/caller register save/restores.
32 * Conversion of flat register files to a stacked register
35 * Dead load/store elimination.
37 These routines accept as input:
39 * Basic block information (number of blocks, lists of
40 predecessors and successors). Note the granularity
41 does not need to be basic block, they could be statements
44 * Bitmaps of local properties (computed, transparent and
45 anticipatable expressions).
47 The output of these routines is bitmap of redundant computations
48 and a bitmap of optimal placement points. */
53 #include "coretypes.h"
57 #include "hard-reg-set.h"
59 #include "insn-config.h"
63 #include "dominance.h"
67 #include "basic-block.h"
72 /* Edge based LCM routines. */
73 static void compute_antinout_edge (sbitmap
*, sbitmap
*, sbitmap
*, sbitmap
*);
74 static void compute_earliest (struct edge_list
*, int, sbitmap
*, sbitmap
*,
75 sbitmap
*, sbitmap
*, sbitmap
*);
76 static void compute_laterin (struct edge_list
*, sbitmap
*, sbitmap
*,
77 sbitmap
*, sbitmap
*);
78 static void compute_insert_delete (struct edge_list
*edge_list
, sbitmap
*,
79 sbitmap
*, sbitmap
*, sbitmap
*, sbitmap
*);
81 /* Edge based LCM routines on a reverse flowgraph. */
82 static void compute_farthest (struct edge_list
*, int, sbitmap
*, sbitmap
*,
83 sbitmap
*, sbitmap
*, sbitmap
*);
84 static void compute_nearerout (struct edge_list
*, sbitmap
*, sbitmap
*,
85 sbitmap
*, sbitmap
*);
86 static void compute_rev_insert_delete (struct edge_list
*edge_list
, sbitmap
*,
87 sbitmap
*, sbitmap
*, sbitmap
*,
90 /* Edge based lcm routines. */
92 /* Compute expression anticipatability at entrance and exit of each block.
93 This is done based on the flow graph, and not on the pred-succ lists.
94 Other than that, its pretty much identical to compute_antinout. */
97 compute_antinout_edge (sbitmap
*antloc
, sbitmap
*transp
, sbitmap
*antin
,
102 basic_block
*worklist
, *qin
, *qout
, *qend
;
106 /* Allocate a worklist array/queue. Entries are only added to the
107 list if they were not already on the list. So the size is
108 bounded by the number of basic blocks. */
109 qin
= qout
= worklist
= XNEWVEC (basic_block
, n_basic_blocks_for_fn (cfun
));
111 /* We want a maximal solution, so make an optimistic initialization of
113 bitmap_vector_ones (antin
, last_basic_block_for_fn (cfun
));
115 /* Put every block on the worklist; this is necessary because of the
116 optimistic initialization of ANTIN above. */
117 int *postorder
= XNEWVEC (int, n_basic_blocks_for_fn (cfun
));
118 int postorder_num
= post_order_compute (postorder
, false, false);
119 for (int i
= 0; i
< postorder_num
; ++i
)
121 bb
= BASIC_BLOCK_FOR_FN (cfun
, postorder
[i
]);
128 qend
= &worklist
[n_basic_blocks_for_fn (cfun
) - NUM_FIXED_BLOCKS
];
129 qlen
= n_basic_blocks_for_fn (cfun
) - NUM_FIXED_BLOCKS
;
131 /* Mark blocks which are predecessors of the exit block so that we
132 can easily identify them below. */
133 FOR_EACH_EDGE (e
, ei
, EXIT_BLOCK_PTR_FOR_FN (cfun
)->preds
)
134 e
->src
->aux
= EXIT_BLOCK_PTR_FOR_FN (cfun
);
136 /* Iterate until the worklist is empty. */
139 /* Take the first entry off the worklist. */
146 if (bb
->aux
== EXIT_BLOCK_PTR_FOR_FN (cfun
))
147 /* Do not clear the aux field for blocks which are predecessors of
148 the EXIT block. That way we never add then to the worklist
150 bitmap_clear (antout
[bb
->index
]);
153 /* Clear the aux field of this block so that it can be added to
154 the worklist again if necessary. */
156 bitmap_intersection_of_succs (antout
[bb
->index
], antin
, bb
);
159 if (bitmap_or_and (antin
[bb
->index
], antloc
[bb
->index
],
160 transp
[bb
->index
], antout
[bb
->index
]))
161 /* If the in state of this block changed, then we need
162 to add the predecessors of this block to the worklist
163 if they are not already on the worklist. */
164 FOR_EACH_EDGE (e
, ei
, bb
->preds
)
165 if (!e
->src
->aux
&& e
->src
!= ENTRY_BLOCK_PTR_FOR_FN (cfun
))
175 clear_aux_for_edges ();
176 clear_aux_for_blocks ();
180 /* Compute the earliest vector for edge based lcm. */
183 compute_earliest (struct edge_list
*edge_list
, int n_exprs
, sbitmap
*antin
,
184 sbitmap
*antout
, sbitmap
*avout
, sbitmap
*kill
,
187 sbitmap difference
, temp_bitmap
;
189 basic_block pred
, succ
;
191 num_edges
= NUM_EDGES (edge_list
);
193 difference
= sbitmap_alloc (n_exprs
);
194 temp_bitmap
= sbitmap_alloc (n_exprs
);
196 for (x
= 0; x
< num_edges
; x
++)
198 pred
= INDEX_EDGE_PRED_BB (edge_list
, x
);
199 succ
= INDEX_EDGE_SUCC_BB (edge_list
, x
);
200 if (pred
== ENTRY_BLOCK_PTR_FOR_FN (cfun
))
201 bitmap_copy (earliest
[x
], antin
[succ
->index
]);
204 if (succ
== EXIT_BLOCK_PTR_FOR_FN (cfun
))
205 bitmap_clear (earliest
[x
]);
208 bitmap_and_compl (difference
, antin
[succ
->index
],
210 bitmap_not (temp_bitmap
, antout
[pred
->index
]);
211 bitmap_and_or (earliest
[x
], difference
,
212 kill
[pred
->index
], temp_bitmap
);
217 sbitmap_free (temp_bitmap
);
218 sbitmap_free (difference
);
221 /* later(p,s) is dependent on the calculation of laterin(p).
222 laterin(p) is dependent on the calculation of later(p2,p).
224 laterin(ENTRY) is defined as all 0's
225 later(ENTRY, succs(ENTRY)) are defined using laterin(ENTRY)
226 laterin(succs(ENTRY)) is defined by later(ENTRY, succs(ENTRY)).
228 If we progress in this manner, starting with all basic blocks
229 in the work list, anytime we change later(bb), we need to add
230 succs(bb) to the worklist if they are not already on the worklist.
234 We prime the worklist all the normal basic blocks. The ENTRY block can
235 never be added to the worklist since it is never the successor of any
236 block. We explicitly prevent the EXIT block from being added to the
239 We optimistically initialize LATER. That is the only time this routine
240 will compute LATER for an edge out of the entry block since the entry
241 block is never on the worklist. Thus, LATERIN is neither used nor
242 computed for the ENTRY block.
244 Since the EXIT block is never added to the worklist, we will neither
245 use nor compute LATERIN for the exit block. Edges which reach the
246 EXIT block are handled in the normal fashion inside the loop. However,
247 the insertion/deletion computation needs LATERIN(EXIT), so we have
251 compute_laterin (struct edge_list
*edge_list
, sbitmap
*earliest
,
252 sbitmap
*antloc
, sbitmap
*later
, sbitmap
*laterin
)
256 basic_block
*worklist
, *qin
, *qout
, *qend
, bb
;
260 num_edges
= NUM_EDGES (edge_list
);
262 /* Allocate a worklist array/queue. Entries are only added to the
263 list if they were not already on the list. So the size is
264 bounded by the number of basic blocks. */
265 qin
= qout
= worklist
266 = XNEWVEC (basic_block
, n_basic_blocks_for_fn (cfun
));
268 /* Initialize a mapping from each edge to its index. */
269 for (i
= 0; i
< num_edges
; i
++)
270 INDEX_EDGE (edge_list
, i
)->aux
= (void *) (size_t) i
;
272 /* We want a maximal solution, so initially consider LATER true for
273 all edges. This allows propagation through a loop since the incoming
274 loop edge will have LATER set, so if all the other incoming edges
275 to the loop are set, then LATERIN will be set for the head of the
278 If the optimistic setting of LATER on that edge was incorrect (for
279 example the expression is ANTLOC in a block within the loop) then
280 this algorithm will detect it when we process the block at the head
281 of the optimistic edge. That will requeue the affected blocks. */
282 bitmap_vector_ones (later
, num_edges
);
284 /* Note that even though we want an optimistic setting of LATER, we
285 do not want to be overly optimistic. Consider an outgoing edge from
286 the entry block. That edge should always have a LATER value the
287 same as EARLIEST for that edge. */
288 FOR_EACH_EDGE (e
, ei
, ENTRY_BLOCK_PTR_FOR_FN (cfun
)->succs
)
289 bitmap_copy (later
[(size_t) e
->aux
], earliest
[(size_t) e
->aux
]);
291 /* Add all the blocks to the worklist. This prevents an early exit from
292 the loop given our optimistic initialization of LATER above. */
293 int *postorder
= XNEWVEC (int, n_basic_blocks_for_fn (cfun
));
294 int postorder_num
= inverted_post_order_compute (postorder
);
295 for (int i
= 0; i
< postorder_num
; ++i
)
297 bb
= BASIC_BLOCK_FOR_FN (cfun
, postorder
[i
]);
298 if (bb
== EXIT_BLOCK_PTR_FOR_FN (cfun
)
299 || bb
== ENTRY_BLOCK_PTR_FOR_FN (cfun
))
306 /* Note that we do not use the last allocated element for our queue,
307 as EXIT_BLOCK is never inserted into it. */
309 qend
= &worklist
[n_basic_blocks_for_fn (cfun
) - NUM_FIXED_BLOCKS
];
310 qlen
= n_basic_blocks_for_fn (cfun
) - NUM_FIXED_BLOCKS
;
312 /* Iterate until the worklist is empty. */
315 /* Take the first entry off the worklist. */
322 /* Compute the intersection of LATERIN for each incoming edge to B. */
323 bitmap_ones (laterin
[bb
->index
]);
324 FOR_EACH_EDGE (e
, ei
, bb
->preds
)
325 bitmap_and (laterin
[bb
->index
], laterin
[bb
->index
],
326 later
[(size_t)e
->aux
]);
328 /* Calculate LATER for all outgoing edges. */
329 FOR_EACH_EDGE (e
, ei
, bb
->succs
)
330 if (bitmap_ior_and_compl (later
[(size_t) e
->aux
],
331 earliest
[(size_t) e
->aux
],
334 /* If LATER for an outgoing edge was changed, then we need
335 to add the target of the outgoing edge to the worklist. */
336 && e
->dest
!= EXIT_BLOCK_PTR_FOR_FN (cfun
) && e
->dest
->aux
== 0)
346 /* Computation of insertion and deletion points requires computing LATERIN
347 for the EXIT block. We allocated an extra entry in the LATERIN array
348 for just this purpose. */
349 bitmap_ones (laterin
[last_basic_block_for_fn (cfun
)]);
350 FOR_EACH_EDGE (e
, ei
, EXIT_BLOCK_PTR_FOR_FN (cfun
)->preds
)
351 bitmap_and (laterin
[last_basic_block_for_fn (cfun
)],
352 laterin
[last_basic_block_for_fn (cfun
)],
353 later
[(size_t) e
->aux
]);
355 clear_aux_for_edges ();
359 /* Compute the insertion and deletion points for edge based LCM. */
362 compute_insert_delete (struct edge_list
*edge_list
, sbitmap
*antloc
,
363 sbitmap
*later
, sbitmap
*laterin
, sbitmap
*insert
,
369 FOR_EACH_BB_FN (bb
, cfun
)
370 bitmap_and_compl (del
[bb
->index
], antloc
[bb
->index
],
373 for (x
= 0; x
< NUM_EDGES (edge_list
); x
++)
375 basic_block b
= INDEX_EDGE_SUCC_BB (edge_list
, x
);
377 if (b
== EXIT_BLOCK_PTR_FOR_FN (cfun
))
378 bitmap_and_compl (insert
[x
], later
[x
],
379 laterin
[last_basic_block_for_fn (cfun
)]);
381 bitmap_and_compl (insert
[x
], later
[x
], laterin
[b
->index
]);
385 /* Given local properties TRANSP, ANTLOC, AVLOC, KILL return the insert and
386 delete vectors for edge based LCM and return the AVIN, AVOUT bitmap.
387 map the insert vector to what edge an expression should be inserted on. */
390 pre_edge_lcm_avs (int n_exprs
, sbitmap
*transp
,
391 sbitmap
*avloc
, sbitmap
*antloc
, sbitmap
*kill
,
392 sbitmap
*avin
, sbitmap
*avout
,
393 sbitmap
**insert
, sbitmap
**del
)
395 sbitmap
*antin
, *antout
, *earliest
;
396 sbitmap
*later
, *laterin
;
397 struct edge_list
*edge_list
;
400 edge_list
= create_edge_list ();
401 num_edges
= NUM_EDGES (edge_list
);
403 #ifdef LCM_DEBUG_INFO
406 fprintf (dump_file
, "Edge List:\n");
407 verify_edge_list (dump_file
, edge_list
);
408 print_edge_list (dump_file
, edge_list
);
409 dump_bitmap_vector (dump_file
, "transp", "", transp
,
410 last_basic_block_for_fn (cfun
));
411 dump_bitmap_vector (dump_file
, "antloc", "", antloc
,
412 last_basic_block_for_fn (cfun
));
413 dump_bitmap_vector (dump_file
, "avloc", "", avloc
,
414 last_basic_block_for_fn (cfun
));
415 dump_bitmap_vector (dump_file
, "kill", "", kill
,
416 last_basic_block_for_fn (cfun
));
420 /* Compute global availability. */
421 compute_available (avloc
, kill
, avout
, avin
);
423 /* Compute global anticipatability. */
424 antin
= sbitmap_vector_alloc (last_basic_block_for_fn (cfun
), n_exprs
);
425 antout
= sbitmap_vector_alloc (last_basic_block_for_fn (cfun
), n_exprs
);
426 compute_antinout_edge (antloc
, transp
, antin
, antout
);
428 #ifdef LCM_DEBUG_INFO
431 dump_bitmap_vector (dump_file
, "antin", "", antin
,
432 last_basic_block_for_fn (cfun
));
433 dump_bitmap_vector (dump_file
, "antout", "", antout
,
434 last_basic_block_for_fn (cfun
));
438 /* Compute earliestness. */
439 earliest
= sbitmap_vector_alloc (num_edges
, n_exprs
);
440 compute_earliest (edge_list
, n_exprs
, antin
, antout
, avout
, kill
, earliest
);
442 #ifdef LCM_DEBUG_INFO
444 dump_bitmap_vector (dump_file
, "earliest", "", earliest
, num_edges
);
447 sbitmap_vector_free (antout
);
448 sbitmap_vector_free (antin
);
450 later
= sbitmap_vector_alloc (num_edges
, n_exprs
);
452 /* Allocate an extra element for the exit block in the laterin vector. */
453 laterin
= sbitmap_vector_alloc (last_basic_block_for_fn (cfun
) + 1,
455 compute_laterin (edge_list
, earliest
, antloc
, later
, laterin
);
457 #ifdef LCM_DEBUG_INFO
460 dump_bitmap_vector (dump_file
, "laterin", "", laterin
,
461 last_basic_block_for_fn (cfun
) + 1);
462 dump_bitmap_vector (dump_file
, "later", "", later
, num_edges
);
466 sbitmap_vector_free (earliest
);
468 *insert
= sbitmap_vector_alloc (num_edges
, n_exprs
);
469 *del
= sbitmap_vector_alloc (last_basic_block_for_fn (cfun
), n_exprs
);
470 bitmap_vector_clear (*insert
, num_edges
);
471 bitmap_vector_clear (*del
, last_basic_block_for_fn (cfun
));
472 compute_insert_delete (edge_list
, antloc
, later
, laterin
, *insert
, *del
);
474 sbitmap_vector_free (laterin
);
475 sbitmap_vector_free (later
);
477 #ifdef LCM_DEBUG_INFO
480 dump_bitmap_vector (dump_file
, "pre_insert_map", "", *insert
, num_edges
);
481 dump_bitmap_vector (dump_file
, "pre_delete_map", "", *del
,
482 last_basic_block_for_fn (cfun
));
489 /* Wrapper to allocate avin/avout and call pre_edge_lcm_avs. */
492 pre_edge_lcm (int n_exprs
, sbitmap
*transp
,
493 sbitmap
*avloc
, sbitmap
*antloc
, sbitmap
*kill
,
494 sbitmap
**insert
, sbitmap
**del
)
496 struct edge_list
*edge_list
;
497 sbitmap
*avin
, *avout
;
499 avin
= sbitmap_vector_alloc (last_basic_block_for_fn (cfun
), n_exprs
);
500 avout
= sbitmap_vector_alloc (last_basic_block_for_fn (cfun
), n_exprs
);
502 edge_list
= pre_edge_lcm_avs (n_exprs
, transp
, avloc
, antloc
, kill
,
503 avin
, avout
, insert
, del
);
505 sbitmap_vector_free (avout
);
506 sbitmap_vector_free (avin
);
511 /* Compute the AVIN and AVOUT vectors from the AVLOC and KILL vectors.
512 Return the number of passes we performed to iterate to a solution. */
515 compute_available (sbitmap
*avloc
, sbitmap
*kill
, sbitmap
*avout
,
519 basic_block
*worklist
, *qin
, *qout
, *qend
, bb
;
523 /* Allocate a worklist array/queue. Entries are only added to the
524 list if they were not already on the list. So the size is
525 bounded by the number of basic blocks. */
526 qin
= qout
= worklist
=
527 XNEWVEC (basic_block
, n_basic_blocks_for_fn (cfun
) - NUM_FIXED_BLOCKS
);
529 /* We want a maximal solution. */
530 bitmap_vector_ones (avout
, last_basic_block_for_fn (cfun
));
532 /* Put every block on the worklist; this is necessary because of the
533 optimistic initialization of AVOUT above. Use inverted postorder
534 to make the dataflow problem require less iterations. */
535 int *postorder
= XNEWVEC (int, n_basic_blocks_for_fn (cfun
));
536 int postorder_num
= inverted_post_order_compute (postorder
);
537 for (int i
= 0; i
< postorder_num
; ++i
)
539 bb
= BASIC_BLOCK_FOR_FN (cfun
, postorder
[i
]);
540 if (bb
== EXIT_BLOCK_PTR_FOR_FN (cfun
)
541 || bb
== ENTRY_BLOCK_PTR_FOR_FN (cfun
))
549 qend
= &worklist
[n_basic_blocks_for_fn (cfun
) - NUM_FIXED_BLOCKS
];
550 qlen
= n_basic_blocks_for_fn (cfun
) - NUM_FIXED_BLOCKS
;
552 /* Mark blocks which are successors of the entry block so that we
553 can easily identify them below. */
554 FOR_EACH_EDGE (e
, ei
, ENTRY_BLOCK_PTR_FOR_FN (cfun
)->succs
)
555 e
->dest
->aux
= ENTRY_BLOCK_PTR_FOR_FN (cfun
);
557 /* Iterate until the worklist is empty. */
560 /* Take the first entry off the worklist. */
567 /* If one of the predecessor blocks is the ENTRY block, then the
568 intersection of avouts is the null set. We can identify such blocks
569 by the special value in the AUX field in the block structure. */
570 if (bb
->aux
== ENTRY_BLOCK_PTR_FOR_FN (cfun
))
571 /* Do not clear the aux field for blocks which are successors of the
572 ENTRY block. That way we never add then to the worklist again. */
573 bitmap_clear (avin
[bb
->index
]);
576 /* Clear the aux field of this block so that it can be added to
577 the worklist again if necessary. */
579 bitmap_intersection_of_preds (avin
[bb
->index
], avout
, bb
);
582 if (bitmap_ior_and_compl (avout
[bb
->index
], avloc
[bb
->index
],
583 avin
[bb
->index
], kill
[bb
->index
]))
584 /* If the out state of this block changed, then we need
585 to add the successors of this block to the worklist
586 if they are not already on the worklist. */
587 FOR_EACH_EDGE (e
, ei
, bb
->succs
)
588 if (!e
->dest
->aux
&& e
->dest
!= EXIT_BLOCK_PTR_FOR_FN (cfun
))
599 clear_aux_for_edges ();
600 clear_aux_for_blocks ();
604 /* Compute the farthest vector for edge based lcm. */
607 compute_farthest (struct edge_list
*edge_list
, int n_exprs
,
608 sbitmap
*st_avout
, sbitmap
*st_avin
, sbitmap
*st_antin
,
609 sbitmap
*kill
, sbitmap
*farthest
)
611 sbitmap difference
, temp_bitmap
;
613 basic_block pred
, succ
;
615 num_edges
= NUM_EDGES (edge_list
);
617 difference
= sbitmap_alloc (n_exprs
);
618 temp_bitmap
= sbitmap_alloc (n_exprs
);
620 for (x
= 0; x
< num_edges
; x
++)
622 pred
= INDEX_EDGE_PRED_BB (edge_list
, x
);
623 succ
= INDEX_EDGE_SUCC_BB (edge_list
, x
);
624 if (succ
== EXIT_BLOCK_PTR_FOR_FN (cfun
))
625 bitmap_copy (farthest
[x
], st_avout
[pred
->index
]);
628 if (pred
== ENTRY_BLOCK_PTR_FOR_FN (cfun
))
629 bitmap_clear (farthest
[x
]);
632 bitmap_and_compl (difference
, st_avout
[pred
->index
],
633 st_antin
[succ
->index
]);
634 bitmap_not (temp_bitmap
, st_avin
[succ
->index
]);
635 bitmap_and_or (farthest
[x
], difference
,
636 kill
[succ
->index
], temp_bitmap
);
641 sbitmap_free (temp_bitmap
);
642 sbitmap_free (difference
);
645 /* Compute nearer and nearerout vectors for edge based lcm.
647 This is the mirror of compute_laterin, additional comments on the
648 implementation can be found before compute_laterin. */
651 compute_nearerout (struct edge_list
*edge_list
, sbitmap
*farthest
,
652 sbitmap
*st_avloc
, sbitmap
*nearer
, sbitmap
*nearerout
)
656 basic_block
*worklist
, *tos
, bb
;
659 num_edges
= NUM_EDGES (edge_list
);
661 /* Allocate a worklist array/queue. Entries are only added to the
662 list if they were not already on the list. So the size is
663 bounded by the number of basic blocks. */
664 tos
= worklist
= XNEWVEC (basic_block
, n_basic_blocks_for_fn (cfun
) + 1);
666 /* Initialize NEARER for each edge and build a mapping from an edge to
668 for (i
= 0; i
< num_edges
; i
++)
669 INDEX_EDGE (edge_list
, i
)->aux
= (void *) (size_t) i
;
671 /* We want a maximal solution. */
672 bitmap_vector_ones (nearer
, num_edges
);
674 /* Note that even though we want an optimistic setting of NEARER, we
675 do not want to be overly optimistic. Consider an incoming edge to
676 the exit block. That edge should always have a NEARER value the
677 same as FARTHEST for that edge. */
678 FOR_EACH_EDGE (e
, ei
, EXIT_BLOCK_PTR_FOR_FN (cfun
)->preds
)
679 bitmap_copy (nearer
[(size_t)e
->aux
], farthest
[(size_t)e
->aux
]);
681 /* Add all the blocks to the worklist. This prevents an early exit
682 from the loop given our optimistic initialization of NEARER. */
683 FOR_EACH_BB_FN (bb
, cfun
)
689 /* Iterate until the worklist is empty. */
690 while (tos
!= worklist
)
692 /* Take the first entry off the worklist. */
696 /* Compute the intersection of NEARER for each outgoing edge from B. */
697 bitmap_ones (nearerout
[bb
->index
]);
698 FOR_EACH_EDGE (e
, ei
, bb
->succs
)
699 bitmap_and (nearerout
[bb
->index
], nearerout
[bb
->index
],
700 nearer
[(size_t) e
->aux
]);
702 /* Calculate NEARER for all incoming edges. */
703 FOR_EACH_EDGE (e
, ei
, bb
->preds
)
704 if (bitmap_ior_and_compl (nearer
[(size_t) e
->aux
],
705 farthest
[(size_t) e
->aux
],
706 nearerout
[e
->dest
->index
],
707 st_avloc
[e
->dest
->index
])
708 /* If NEARER for an incoming edge was changed, then we need
709 to add the source of the incoming edge to the worklist. */
710 && e
->src
!= ENTRY_BLOCK_PTR_FOR_FN (cfun
) && e
->src
->aux
== 0)
717 /* Computation of insertion and deletion points requires computing NEAREROUT
718 for the ENTRY block. We allocated an extra entry in the NEAREROUT array
719 for just this purpose. */
720 bitmap_ones (nearerout
[last_basic_block_for_fn (cfun
)]);
721 FOR_EACH_EDGE (e
, ei
, ENTRY_BLOCK_PTR_FOR_FN (cfun
)->succs
)
722 bitmap_and (nearerout
[last_basic_block_for_fn (cfun
)],
723 nearerout
[last_basic_block_for_fn (cfun
)],
724 nearer
[(size_t) e
->aux
]);
726 clear_aux_for_edges ();
730 /* Compute the insertion and deletion points for edge based LCM. */
733 compute_rev_insert_delete (struct edge_list
*edge_list
, sbitmap
*st_avloc
,
734 sbitmap
*nearer
, sbitmap
*nearerout
,
735 sbitmap
*insert
, sbitmap
*del
)
740 FOR_EACH_BB_FN (bb
, cfun
)
741 bitmap_and_compl (del
[bb
->index
], st_avloc
[bb
->index
],
742 nearerout
[bb
->index
]);
744 for (x
= 0; x
< NUM_EDGES (edge_list
); x
++)
746 basic_block b
= INDEX_EDGE_PRED_BB (edge_list
, x
);
747 if (b
== ENTRY_BLOCK_PTR_FOR_FN (cfun
))
748 bitmap_and_compl (insert
[x
], nearer
[x
],
749 nearerout
[last_basic_block_for_fn (cfun
)]);
751 bitmap_and_compl (insert
[x
], nearer
[x
], nearerout
[b
->index
]);
755 /* Given local properties TRANSP, ST_AVLOC, ST_ANTLOC, KILL return the
756 insert and delete vectors for edge based reverse LCM. Returns an
757 edgelist which is used to map the insert vector to what edge
758 an expression should be inserted on. */
761 pre_edge_rev_lcm (int n_exprs
, sbitmap
*transp
,
762 sbitmap
*st_avloc
, sbitmap
*st_antloc
, sbitmap
*kill
,
763 sbitmap
**insert
, sbitmap
**del
)
765 sbitmap
*st_antin
, *st_antout
;
766 sbitmap
*st_avout
, *st_avin
, *farthest
;
767 sbitmap
*nearer
, *nearerout
;
768 struct edge_list
*edge_list
;
771 edge_list
= create_edge_list ();
772 num_edges
= NUM_EDGES (edge_list
);
774 st_antin
= sbitmap_vector_alloc (last_basic_block_for_fn (cfun
), n_exprs
);
775 st_antout
= sbitmap_vector_alloc (last_basic_block_for_fn (cfun
), n_exprs
);
776 bitmap_vector_clear (st_antin
, last_basic_block_for_fn (cfun
));
777 bitmap_vector_clear (st_antout
, last_basic_block_for_fn (cfun
));
778 compute_antinout_edge (st_antloc
, transp
, st_antin
, st_antout
);
780 /* Compute global anticipatability. */
781 st_avout
= sbitmap_vector_alloc (last_basic_block_for_fn (cfun
), n_exprs
);
782 st_avin
= sbitmap_vector_alloc (last_basic_block_for_fn (cfun
), n_exprs
);
783 compute_available (st_avloc
, kill
, st_avout
, st_avin
);
785 #ifdef LCM_DEBUG_INFO
788 fprintf (dump_file
, "Edge List:\n");
789 verify_edge_list (dump_file
, edge_list
);
790 print_edge_list (dump_file
, edge_list
);
791 dump_bitmap_vector (dump_file
, "transp", "", transp
,
792 last_basic_block_for_fn (cfun
));
793 dump_bitmap_vector (dump_file
, "st_avloc", "", st_avloc
,
794 last_basic_block_for_fn (cfun
));
795 dump_bitmap_vector (dump_file
, "st_antloc", "", st_antloc
,
796 last_basic_block_for_fn (cfun
));
797 dump_bitmap_vector (dump_file
, "st_antin", "", st_antin
,
798 last_basic_block_for_fn (cfun
));
799 dump_bitmap_vector (dump_file
, "st_antout", "", st_antout
,
800 last_basic_block_for_fn (cfun
));
801 dump_bitmap_vector (dump_file
, "st_kill", "", kill
,
802 last_basic_block_for_fn (cfun
));
806 #ifdef LCM_DEBUG_INFO
809 dump_bitmap_vector (dump_file
, "st_avout", "", st_avout
, last_basic_block_for_fn (cfun
));
810 dump_bitmap_vector (dump_file
, "st_avin", "", st_avin
, last_basic_block_for_fn (cfun
));
814 /* Compute farthestness. */
815 farthest
= sbitmap_vector_alloc (num_edges
, n_exprs
);
816 compute_farthest (edge_list
, n_exprs
, st_avout
, st_avin
, st_antin
,
819 #ifdef LCM_DEBUG_INFO
821 dump_bitmap_vector (dump_file
, "farthest", "", farthest
, num_edges
);
824 sbitmap_vector_free (st_antin
);
825 sbitmap_vector_free (st_antout
);
827 sbitmap_vector_free (st_avin
);
828 sbitmap_vector_free (st_avout
);
830 nearer
= sbitmap_vector_alloc (num_edges
, n_exprs
);
832 /* Allocate an extra element for the entry block. */
833 nearerout
= sbitmap_vector_alloc (last_basic_block_for_fn (cfun
) + 1,
835 compute_nearerout (edge_list
, farthest
, st_avloc
, nearer
, nearerout
);
837 #ifdef LCM_DEBUG_INFO
840 dump_bitmap_vector (dump_file
, "nearerout", "", nearerout
,
841 last_basic_block_for_fn (cfun
) + 1);
842 dump_bitmap_vector (dump_file
, "nearer", "", nearer
, num_edges
);
846 sbitmap_vector_free (farthest
);
848 *insert
= sbitmap_vector_alloc (num_edges
, n_exprs
);
849 *del
= sbitmap_vector_alloc (last_basic_block_for_fn (cfun
), n_exprs
);
850 compute_rev_insert_delete (edge_list
, st_avloc
, nearer
, nearerout
,
853 sbitmap_vector_free (nearerout
);
854 sbitmap_vector_free (nearer
);
856 #ifdef LCM_DEBUG_INFO
859 dump_bitmap_vector (dump_file
, "pre_insert_map", "", *insert
, num_edges
);
860 dump_bitmap_vector (dump_file
, "pre_delete_map", "", *del
,
861 last_basic_block_for_fn (cfun
));