1 /* Liveness for SSA trees.
2 Copyright (C) 2003 Free Software Foundation, Inc.
3 Contributed by Andrew MacLeod <amacleod@redhat.com>
5 This file is part of GCC.
7 GCC 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)
12 GCC 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.
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING. If not, write to
19 the Free Software Foundation, 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
24 #include "coretypes.h"
28 #include "basic-block.h"
30 #include "diagnostic.h"
32 #include "tree-flow.h"
33 #include "tree-gimple.h"
34 #include "tree-inline.h"
37 #include "tree-alias-common.h"
39 #include "tree-dump.h"
40 #include "tree-ssa-live.h"
42 static void live_worklist (tree_live_info_p
, varray_type
, int);
43 static tree_live_info_p
new_tree_live_info (var_map
);
44 static inline void set_if_valid (var_map
, bitmap
, tree
);
45 static inline void add_livein_if_notdef (tree_live_info_p
, bitmap
,
47 static inline void register_ssa_partition (var_map
, tree
, bool);
48 static inline void add_conflicts_if_valid (tpa_p
, conflict_graph
,
49 var_map
, bitmap
, tree
);
50 static partition_pair_p
find_partition_pair (coalesce_list_p
, int, int, bool);
52 /* This is where the mapping from SSA version number to real storage variable
55 All SSA versions of the same variable may not ultimately be mapped back to
56 the same real variable. In that instance, we need to detect the live
57 range overlap, and give one of the variable new storage. The vector
58 'partition_to_var' tracks which partition maps to which variable.
60 Given a VAR, it is sometimes desirable to know which partition that VAR
61 represents. There is an additional field in the variable annotation to
62 track that information. */
64 /* Create a variable partition map of SIZE, initialize and return it. */
67 init_var_map (int size
)
71 map
= (var_map
) xmalloc (sizeof (struct _var_map
));
72 map
->var_partition
= partition_new (size
);
74 = (tree
*)xmalloc (size
* sizeof (tree
));
75 memset (map
->partition_to_var
, 0, size
* sizeof (tree
));
77 map
->partition_to_compact
= NULL
;
78 map
->compact_to_partition
= NULL
;
79 map
->num_partitions
= size
;
80 map
->partition_size
= size
;
81 map
->ref_count
= NULL
;
86 /* Free memory associated with MAP. */
89 delete_var_map (var_map map
)
91 free (map
->partition_to_var
);
92 partition_delete (map
->var_partition
);
93 if (map
->partition_to_compact
)
94 free (map
->partition_to_compact
);
95 if (map
->compact_to_partition
)
96 free (map
->compact_to_partition
);
98 free (map
->ref_count
);
103 /* This function will combine the partitions in MAP for VAR1 and VAR2. It
104 Returns the partition which represents the new partition. If the two
105 partitions cannot be combined, NO_PARTITION is returned. */
108 var_union (var_map map
, tree var1
, tree var2
)
111 tree root_var
= NULL_TREE
;
112 tree other_var
= NULL_TREE
;
114 /* This is independent of partition_to_compact. If partition_to_compact is
115 on, then whichever one of these partitions is absorbed will never have a
116 dereference into the partition_to_compact array any more. */
118 if (TREE_CODE (var1
) == SSA_NAME
)
119 p1
= partition_find (map
->var_partition
, SSA_NAME_VERSION (var1
));
122 p1
= var_to_partition (map
, var1
);
123 if (map
->compact_to_partition
)
124 p1
= map
->compact_to_partition
[p1
];
128 if (TREE_CODE (var2
) == SSA_NAME
)
129 p2
= partition_find (map
->var_partition
, SSA_NAME_VERSION (var2
));
132 p2
= var_to_partition (map
, var2
);
133 if (map
->compact_to_partition
)
134 p2
= map
->compact_to_partition
[p2
];
136 /* If there is no root_var set, or its not a user variable, set the
137 root_var to this one. */
138 if (!root_var
|| (DECL_P (root_var
) && DECL_IGNORED_P (root_var
)))
140 other_var
= root_var
;
147 if (p1
== NO_PARTITION
|| p2
== NO_PARTITION
)
153 p3
= partition_union (map
->var_partition
, p1
, p2
);
155 if (map
->partition_to_compact
)
156 p3
= map
->partition_to_compact
[p3
];
159 change_partition_var (map
, root_var
, p3
);
161 change_partition_var (map
, other_var
, p3
);
167 /* Compress the partition numbers in MAP such that they fall in the range
168 0..(num_partitions-1) instead of wherever they turned out during
169 the partitioning exercise. This removes any references to unused
170 partitions, thereby allowing bitmaps and other vectors to be much
171 denser. Compression type is controlled by FLAGS.
173 This is implemented such that compaction doesn't affect partitioning.
174 Ie., once partitions are created and possibly merged, running one
175 or more different kind of compaction will not affect the partitions
176 themselves. Their index might change, but all the same variables will
177 still be members of the same partition group. This allows work on reduced
178 sets, and no loss of information when a larger set is later desired.
180 In particular, coalescing can work on partitions which have 2 or more
181 definitions, and then 'recompact' later to include all the single
182 definitions for assignment to program variables. */
185 compact_var_map (var_map map
, int flags
)
188 int x
, limit
, count
, tmp
, root
, root_i
;
190 root_var_p rv
= NULL
;
192 limit
= map
->partition_size
;
193 used
= sbitmap_alloc (limit
);
196 /* Already compressed? Abandon the old one. */
197 if (map
->partition_to_compact
)
199 free (map
->partition_to_compact
);
200 map
->partition_to_compact
= NULL
;
202 if (map
->compact_to_partition
)
204 free (map
->compact_to_partition
);
205 map
->compact_to_partition
= NULL
;
208 map
->num_partitions
= map
->partition_size
;
210 if (flags
& VARMAP_NO_SINGLE_DEFS
)
211 rv
= root_var_init (map
);
213 map
->partition_to_compact
= (int *)xmalloc (limit
* sizeof (int));
214 memset (map
->partition_to_compact
, 0xff, (limit
* sizeof (int)));
216 /* Find out which partitions are actually referenced. */
218 for (x
= 0; x
< limit
; x
++)
220 tmp
= partition_find (map
->var_partition
, x
);
221 if (!TEST_BIT (used
, tmp
) && map
->partition_to_var
[tmp
] != NULL_TREE
)
223 /* It is referenced, check to see if there is more than one version
224 in the root_var table, if one is available. */
227 root
= root_var_find (rv
, tmp
);
228 root_i
= root_var_first_partition (rv
, root
);
229 /* If there is only one, don't include this in the compaction. */
230 if (root_var_next_partition (rv
, root_i
) == ROOT_VAR_NONE
)
238 /* Build a compacted partitioning. */
241 map
->compact_to_partition
= (int *)xmalloc (count
* sizeof (int));
243 /* SSA renaming begins at 1, so skip 0 when compacting. */
244 EXECUTE_IF_SET_IN_SBITMAP (used
, 1, x
,
246 map
->partition_to_compact
[x
] = count
;
247 map
->compact_to_partition
[count
] = x
;
248 var
= map
->partition_to_var
[x
];
249 if (TREE_CODE (var
) != SSA_NAME
)
250 change_partition_var (map
, var
, count
);
256 free (map
->partition_to_compact
);
257 map
->partition_to_compact
= NULL
;
260 map
->num_partitions
= count
;
263 root_var_delete (rv
);
268 /* This function is used to change the representative variable in MAP for VAR's
269 partition from an SSA_NAME variable to a regular variable. This allows
270 partitions to be mapped back to real variables. */
273 change_partition_var (var_map map
, tree var
, int part
)
277 if (TREE_CODE (var
) == SSA_NAME
)
281 ann
->out_of_ssa_tag
= 1;
282 VAR_ANN_PARTITION (ann
) = part
;
283 if (map
->compact_to_partition
)
284 map
->partition_to_var
[map
->compact_to_partition
[part
]] = var
;
288 /* Helper function for mark_all_vars_used, called via walk_tree. */
291 mark_all_vars_used_1 (tree
*tp
, int *walk_subtrees
,
292 void *data ATTRIBUTE_UNUSED
)
296 /* Only need to mark VAR_DECLS; parameters and return results are not
297 eliminated as unused. */
298 if (TREE_CODE (t
) == VAR_DECL
)
301 if (DECL_P (t
) || TYPE_P (t
))
307 /* Mark all VAR_DECLS under *EXPR_P as used, so that they won't be
308 eliminated during the tree->rtl conversion process. */
311 mark_all_vars_used (tree
*expr_p
)
313 walk_tree (expr_p
, mark_all_vars_used_1
, NULL
, NULL
);
316 /* This function looks through the program and uses FLAGS to determine what
317 SSA versioned variables are given entries in a new partition table. This
318 new partition map is returned. */
321 create_ssa_var_map (int flags
)
323 block_stmt_iterator bsi
;
332 #ifdef ENABLE_CHECKING
333 sbitmap used_in_real_ops
;
334 sbitmap used_in_virtual_ops
;
336 v_may_def_optype v_may_defs
;
337 v_must_def_optype v_must_defs
;
340 map
= init_var_map (num_ssa_names
+ 1);
342 #ifdef ENABLE_CHECKING
343 used_in_real_ops
= sbitmap_alloc (num_referenced_vars
);
344 sbitmap_zero (used_in_real_ops
);
346 used_in_virtual_ops
= sbitmap_alloc (num_referenced_vars
);
347 sbitmap_zero (used_in_virtual_ops
);
350 if (flags
& SSA_VAR_MAP_REF_COUNT
)
353 = (int *)xmalloc (((num_ssa_names
+ 1) * sizeof (int)));
354 memset (map
->ref_count
, 0, (num_ssa_names
+ 1) * sizeof (int));
360 for (phi
= phi_nodes (bb
); phi
; phi
= PHI_CHAIN (phi
))
363 register_ssa_partition (map
, PHI_RESULT (phi
), false);
364 for (i
= 0; i
< PHI_NUM_ARGS (phi
); i
++)
366 arg
= PHI_ARG_DEF (phi
, i
);
367 if (TREE_CODE (arg
) == SSA_NAME
)
368 register_ssa_partition (map
, arg
, true);
370 mark_all_vars_used (&PHI_ARG_DEF_TREE (phi
, i
));
374 for (bsi
= bsi_start (bb
); !bsi_end_p (bsi
); bsi_next (&bsi
))
376 stmt
= bsi_stmt (bsi
);
377 get_stmt_operands (stmt
);
378 ann
= stmt_ann (stmt
);
380 /* Register USE and DEF operands in each statement. */
381 uses
= USE_OPS (ann
);
382 for (x
= 0; x
< NUM_USES (uses
); x
++)
384 use
= USE_OP (uses
, x
);
385 register_ssa_partition (map
, use
, true);
387 #ifdef ENABLE_CHECKING
388 SET_BIT (used_in_real_ops
, var_ann (SSA_NAME_VAR (use
))->uid
);
392 defs
= DEF_OPS (ann
);
393 for (x
= 0; x
< NUM_DEFS (defs
); x
++)
395 dest
= DEF_OP (defs
, x
);
396 register_ssa_partition (map
, dest
, false);
398 #ifdef ENABLE_CHECKING
399 SET_BIT (used_in_real_ops
, var_ann (SSA_NAME_VAR (dest
))->uid
);
403 #ifdef ENABLE_CHECKING
404 /* Validate that virtual ops don't get used in funny ways. */
405 vuses
= VUSE_OPS (ann
);
406 for (x
= 0; x
< NUM_VUSES (vuses
); x
++)
408 tree var
= VUSE_OP (vuses
, x
);
409 SET_BIT (used_in_virtual_ops
, var_ann (SSA_NAME_VAR (var
))->uid
);
412 v_may_defs
= V_MAY_DEF_OPS (ann
);
413 for (x
= 0; x
< NUM_V_MAY_DEFS (v_may_defs
); x
++)
415 tree var
= V_MAY_DEF_OP (v_may_defs
, x
);
416 SET_BIT (used_in_virtual_ops
, var_ann (SSA_NAME_VAR (var
))->uid
);
419 v_must_defs
= V_MUST_DEF_OPS (ann
);
420 for (x
= 0; x
< NUM_V_MUST_DEFS (v_must_defs
); x
++)
422 tree var
= V_MUST_DEF_OP (v_must_defs
, x
);
423 SET_BIT (used_in_virtual_ops
, var_ann (SSA_NAME_VAR (var
))->uid
);
425 #endif /* ENABLE_CHECKING */
427 mark_all_vars_used (bsi_stmt_ptr (bsi
));
431 #if defined ENABLE_CHECKING
434 sbitmap both
= sbitmap_alloc (num_referenced_vars
);
435 sbitmap_a_and_b (both
, used_in_real_ops
, used_in_virtual_ops
);
436 if (sbitmap_first_set_bit (both
) >= 0)
438 EXECUTE_IF_SET_IN_SBITMAP (both
, 0, i
,
439 fprintf (stderr
, "Variable %s used in real and virtual operands\n",
440 get_name (referenced_var (i
))));
444 sbitmap_free (used_in_real_ops
);
445 sbitmap_free (used_in_virtual_ops
);
454 /* Allocate and return a new live range information object base on MAP. */
456 static tree_live_info_p
457 new_tree_live_info (var_map map
)
459 tree_live_info_p live
;
462 live
= (tree_live_info_p
) xmalloc (sizeof (struct tree_live_info_d
));
464 live
->num_blocks
= last_basic_block
;
466 live
->global
= BITMAP_XMALLOC ();
468 live
->livein
= (bitmap
*)xmalloc (num_var_partitions (map
) * sizeof (bitmap
));
469 for (x
= 0; x
< num_var_partitions (map
); x
++)
470 live
->livein
[x
] = BITMAP_XMALLOC ();
472 /* liveout is deferred until it is actually requested. */
473 live
->liveout
= NULL
;
478 /* Free storage for live range info object LIVE. */
481 delete_tree_live_info (tree_live_info_p live
)
486 for (x
= live
->num_blocks
- 1; x
>= 0; x
--)
487 BITMAP_XFREE (live
->liveout
[x
]);
488 free (live
->liveout
);
492 for (x
= num_var_partitions (live
->map
) - 1; x
>= 0; x
--)
493 BITMAP_XFREE (live
->livein
[x
]);
497 BITMAP_XFREE (live
->global
);
503 /* Using LIVE, fill in all the live-on-entry blocks between the defs and uses
504 for partition I. STACK is a varray used for temporary memory which is
505 passed in rather than being allocated on every call. */
508 live_worklist (tree_live_info_p live
, varray_type stack
, int i
)
512 basic_block def_bb
= NULL
;
514 var_map map
= live
->map
;
516 var
= partition_to_var (map
, i
);
517 if (SSA_NAME_DEF_STMT (var
))
518 def_bb
= bb_for_stmt (SSA_NAME_DEF_STMT (var
));
520 EXECUTE_IF_SET_IN_BITMAP (live
->livein
[i
], 0, b
,
522 VARRAY_PUSH_INT (stack
, b
);
525 while (VARRAY_ACTIVE_SIZE (stack
) > 0)
527 b
= VARRAY_TOP_INT (stack
);
530 for (e
= BASIC_BLOCK (b
)->pred
; e
; e
= e
->pred_next
)
531 if (e
->src
!= ENTRY_BLOCK_PTR
)
533 /* Its not live on entry to the block its defined in. */
534 if (e
->src
== def_bb
)
536 if (!bitmap_bit_p (live
->livein
[i
], e
->src
->index
))
538 bitmap_set_bit (live
->livein
[i
], e
->src
->index
);
539 VARRAY_PUSH_INT (stack
, e
->src
->index
);
546 /* If VAR is in a partition of MAP, set the bit for that partition in VEC. */
549 set_if_valid (var_map map
, bitmap vec
, tree var
)
551 int p
= var_to_partition (map
, var
);
552 if (p
!= NO_PARTITION
)
553 bitmap_set_bit (vec
, p
);
557 /* If VAR is in a partition and it isn't defined in DEF_VEC, set the livein and
558 global bit for it in the LIVE object. BB is the block being processed. */
561 add_livein_if_notdef (tree_live_info_p live
, bitmap def_vec
,
562 tree var
, basic_block bb
)
564 int p
= var_to_partition (live
->map
, var
);
565 if (p
== NO_PARTITION
|| bb
== ENTRY_BLOCK_PTR
)
567 if (!bitmap_bit_p (def_vec
, p
))
569 bitmap_set_bit (live
->livein
[p
], bb
->index
);
570 bitmap_set_bit (live
->global
, p
);
575 /* Given partition map MAP, calculate all the live on entry bitmaps for
576 each basic block. Return a live info object. */
579 calculate_live_on_entry (var_map map
)
581 tree_live_info_p live
;
589 block_stmt_iterator bsi
;
594 saw_def
= BITMAP_XMALLOC ();
596 live
= new_tree_live_info (map
);
600 bitmap_clear (saw_def
);
602 for (phi
= phi_nodes (bb
); phi
; phi
= PHI_CHAIN (phi
))
604 for (i
= 0; i
< PHI_NUM_ARGS (phi
); i
++)
606 var
= PHI_ARG_DEF (phi
, i
);
607 if (!phi_ssa_name_p (var
))
609 stmt
= SSA_NAME_DEF_STMT (var
);
610 e
= PHI_ARG_EDGE (phi
, i
);
612 /* Any uses in PHIs which either don't have def's or are not
613 defined in the block from which the def comes, will be live
614 on entry to that block. */
615 if (!stmt
|| e
->src
!= bb_for_stmt (stmt
))
616 add_livein_if_notdef (live
, saw_def
, var
, e
->src
);
620 /* Don't mark PHI results as defined until all the PHI nodes have
621 been processed. If the PHI sequence is:
624 The a_3 referred to in b_3's PHI node is the one incoming on the
625 edge, *not* the PHI node just seen. */
627 for (phi
= phi_nodes (bb
); phi
; phi
= PHI_CHAIN (phi
))
629 var
= PHI_RESULT (phi
);
630 set_if_valid (map
, saw_def
, var
);
633 for (bsi
= bsi_start (bb
); !bsi_end_p (bsi
); bsi_next (&bsi
))
635 stmt
= bsi_stmt (bsi
);
636 get_stmt_operands (stmt
);
637 ann
= stmt_ann (stmt
);
639 uses
= USE_OPS (ann
);
640 num
= NUM_USES (uses
);
641 for (i
= 0; i
< num
; i
++)
643 op
= USE_OP (uses
, i
);
644 add_livein_if_notdef (live
, saw_def
, op
, bb
);
647 defs
= DEF_OPS (ann
);
648 num
= NUM_DEFS (defs
);
649 for (i
= 0; i
< num
; i
++)
651 op
= DEF_OP (defs
, i
);
652 set_if_valid (map
, saw_def
, op
);
657 VARRAY_INT_INIT (stack
, last_basic_block
, "stack");
658 EXECUTE_IF_SET_IN_BITMAP (live
->global
, 0, i
,
660 live_worklist (live
, stack
, i
);
663 #ifdef ENABLE_CHECKING
664 /* Check for live on entry partitions and report those with a DEF in
665 the program. This will typically mean an optimization has done
668 bb
= ENTRY_BLOCK_PTR
;
670 for (e
= bb
->succ
; e
; e
= e
->succ_next
)
672 int entry_block
= e
->dest
->index
;
673 if (e
->dest
== EXIT_BLOCK_PTR
)
675 for (i
= 0; i
< num_var_partitions (map
); i
++)
679 var
= partition_to_var (map
, i
);
680 stmt
= SSA_NAME_DEF_STMT (var
);
681 tmp
= bb_for_stmt (stmt
);
682 d
= default_def (SSA_NAME_VAR (var
));
684 if (bitmap_bit_p (live_entry_blocks (live
, i
), entry_block
))
686 if (!IS_EMPTY_STMT (stmt
))
689 print_generic_expr (stderr
, var
, TDF_SLIM
);
690 fprintf (stderr
, " is defined ");
692 fprintf (stderr
, " in BB%d, ", tmp
->index
);
693 fprintf (stderr
, "by:\n");
694 print_generic_expr (stderr
, stmt
, TDF_SLIM
);
695 fprintf (stderr
, "\nIt is also live-on-entry to entry BB %d",
697 fprintf (stderr
, " So it appears to have multiple defs.\n");
704 print_generic_expr (stderr
, var
, TDF_SLIM
);
705 fprintf (stderr
, " is live-on-entry to BB%d ",entry_block
);
708 fprintf (stderr
, " but is not the default def of ");
709 print_generic_expr (stderr
, d
, TDF_SLIM
);
710 fprintf (stderr
, "\n");
713 fprintf (stderr
, " and there is no default def.\n");
720 /* The only way this var shouldn't be marked live on entry is
721 if it occurs in a PHI argument of the block. */
723 for (phi
= phi_nodes (e
->dest
);
725 phi
= PHI_CHAIN (phi
))
727 for (z
= 0; z
< PHI_NUM_ARGS (phi
); z
++)
728 if (var
== PHI_ARG_DEF (phi
, z
))
737 print_generic_expr (stderr
, var
, TDF_SLIM
);
738 fprintf (stderr
, " is not marked live-on-entry to entry BB%d ",
740 fprintf (stderr
, "but it is a default def so it should be.\n");
748 BITMAP_XFREE (saw_def
);
754 /* Calculate the live on exit vectors based on the entry info in LIVEINFO. */
757 calculate_live_on_exit (tree_live_info_p liveinfo
)
766 var_map map
= liveinfo
->map
;
768 on_exit
= (bitmap
*)xmalloc (last_basic_block
* sizeof (bitmap
));
769 for (x
= 0; x
< last_basic_block
; x
++)
770 on_exit
[x
] = BITMAP_XMALLOC ();
772 /* Set all the live-on-exit bits for uses in PHIs. */
775 for (phi
= phi_nodes (bb
); phi
; phi
= PHI_CHAIN (phi
))
776 for (i
= 0; i
< PHI_NUM_ARGS (phi
); i
++)
778 t
= PHI_ARG_DEF (phi
, i
);
779 e
= PHI_ARG_EDGE (phi
, i
);
780 if (!phi_ssa_name_p (t
) || e
->src
== ENTRY_BLOCK_PTR
)
782 set_if_valid (map
, on_exit
[e
->src
->index
], t
);
786 /* Set live on exit for all predecessors of live on entry's. */
787 for (i
= 0; i
< num_var_partitions (map
); i
++)
789 on_entry
= live_entry_blocks (liveinfo
, i
);
790 EXECUTE_IF_SET_IN_BITMAP (on_entry
, 0, b
,
792 for (e
= BASIC_BLOCK(b
)->pred
; e
; e
= e
->pred_next
)
793 if (e
->src
!= ENTRY_BLOCK_PTR
)
794 bitmap_set_bit (on_exit
[e
->src
->index
], i
);
798 liveinfo
->liveout
= on_exit
;
802 /* Initialize a tree_partition_associator object using MAP. */
805 tpa_init (var_map map
)
808 int num_partitions
= num_var_partitions (map
);
811 if (num_partitions
== 0)
814 tpa
= (tpa_p
) xmalloc (sizeof (struct tree_partition_associator_d
));
816 tpa
->uncompressed_num
= -1;
818 tpa
->next_partition
= (int *)xmalloc (num_partitions
* sizeof (int));
819 memset (tpa
->next_partition
, TPA_NONE
, num_partitions
* sizeof (int));
821 tpa
->partition_to_tree_map
= (int *)xmalloc (num_partitions
* sizeof (int));
822 memset (tpa
->partition_to_tree_map
, TPA_NONE
, num_partitions
* sizeof (int));
824 x
= MAX (40, (num_partitions
/ 20));
825 VARRAY_TREE_INIT (tpa
->trees
, x
, "trees");
826 VARRAY_INT_INIT (tpa
->first_partition
, x
, "first_partition");
833 /* Remove PARTITION_INDEX from TREE_INDEX's list in the tpa structure TPA. */
836 tpa_remove_partition (tpa_p tpa
, int tree_index
, int partition_index
)
840 i
= tpa_first_partition (tpa
, tree_index
);
841 if (i
== partition_index
)
843 VARRAY_INT (tpa
->first_partition
, tree_index
) = tpa
->next_partition
[i
];
847 for ( ; i
!= TPA_NONE
; i
= tpa_next_partition (tpa
, i
))
849 if (tpa
->next_partition
[i
] == partition_index
)
851 tpa
->next_partition
[i
] = tpa
->next_partition
[partition_index
];
859 /* Free the memory used by tree_partition_associator object TPA. */
862 tpa_delete (tpa_p tpa
)
867 free (tpa
->partition_to_tree_map
);
868 free (tpa
->next_partition
);
873 /* This function will remove any tree entries from TPA which have only a single
874 element. This will help keep the size of the conflict graph down. The
875 function returns the number of remaining tree lists. */
878 tpa_compact (tpa_p tpa
)
880 int last
, x
, y
, first
, swap_i
;
883 /* Find the last list which has more than 1 partition. */
884 for (last
= tpa
->num_trees
- 1; last
> 0; last
--)
886 first
= tpa_first_partition (tpa
, last
);
887 if (tpa_next_partition (tpa
, first
) != NO_PARTITION
)
894 first
= tpa_first_partition (tpa
, x
);
896 /* If there is not more than one partition, swap with the current end
898 if (tpa_next_partition (tpa
, first
) == NO_PARTITION
)
900 swap_t
= VARRAY_TREE (tpa
->trees
, last
);
901 swap_i
= VARRAY_INT (tpa
->first_partition
, last
);
903 /* Update the last entry. Since it is known to only have one
904 partition, there is nothing else to update. */
905 VARRAY_TREE (tpa
->trees
, last
) = VARRAY_TREE (tpa
->trees
, x
);
906 VARRAY_INT (tpa
->first_partition
, last
)
907 = VARRAY_INT (tpa
->first_partition
, x
);
908 tpa
->partition_to_tree_map
[tpa_first_partition (tpa
, last
)] = last
;
910 /* Since this list is known to have more than one partition, update
911 the list owner entries. */
912 VARRAY_TREE (tpa
->trees
, x
) = swap_t
;
913 VARRAY_INT (tpa
->first_partition
, x
) = swap_i
;
914 for (y
= tpa_first_partition (tpa
, x
);
916 y
= tpa_next_partition (tpa
, y
))
917 tpa
->partition_to_tree_map
[y
] = x
;
919 /* Ensure last is a list with more than one partition. */
921 for (; last
> x
; last
--)
923 first
= tpa_first_partition (tpa
, last
);
924 if (tpa_next_partition (tpa
, first
) != NO_PARTITION
)
931 first
= tpa_first_partition (tpa
, x
);
932 if (tpa_next_partition (tpa
, first
) != NO_PARTITION
)
934 tpa
->uncompressed_num
= tpa
->num_trees
;
940 /* Initialize a root_var object with SSA partitions from MAP which are based
941 on each root variable. */
944 root_var_init (var_map map
)
947 int num_partitions
= num_var_partitions (map
);
957 seen
= sbitmap_alloc (num_partitions
);
960 /* Start at the end and work towards the front. This will provide a list
961 that is ordered from smallest to largest. */
962 for (x
= num_partitions
- 1; x
>= 0; x
--)
964 t
= partition_to_var (map
, x
);
966 /* The var map may not be compacted yet, so check for NULL. */
970 p
= var_to_partition (map
, t
);
972 #ifdef ENABLE_CHECKING
973 if (p
== NO_PARTITION
)
977 /* Make sure we only put coalesced partitions into the list once. */
978 if (TEST_BIT (seen
, p
))
981 if (TREE_CODE (t
) == SSA_NAME
)
982 t
= SSA_NAME_VAR (t
);
984 if (ann
->root_var_processed
)
986 rv
->next_partition
[p
] = VARRAY_INT (rv
->first_partition
,
987 VAR_ANN_ROOT_INDEX (ann
));
988 VARRAY_INT (rv
->first_partition
, VAR_ANN_ROOT_INDEX (ann
)) = p
;
992 ann
->root_var_processed
= 1;
993 VAR_ANN_ROOT_INDEX (ann
) = rv
->num_trees
++;
994 VARRAY_PUSH_TREE (rv
->trees
, t
);
995 VARRAY_PUSH_INT (rv
->first_partition
, p
);
997 rv
->partition_to_tree_map
[p
] = VAR_ANN_ROOT_INDEX (ann
);
1000 /* Reset the out_of_ssa_tag flag on each variable for later use. */
1001 for (x
= 0; x
< rv
->num_trees
; x
++)
1003 t
= VARRAY_TREE (rv
->trees
, x
);
1004 var_ann (t
)->root_var_processed
= 0;
1007 sbitmap_free (seen
);
1012 /* Initialize a type_var structure which associates all the partitions in MAP
1013 of the same type to the type node's index. Volatiles are ignored. */
1016 type_var_init (var_map map
)
1020 int num_partitions
= num_var_partitions (map
);
1024 seen
= sbitmap_alloc (num_partitions
);
1025 sbitmap_zero (seen
);
1027 tv
= tpa_init (map
);
1031 for (x
= num_partitions
- 1; x
>= 0; x
--)
1033 t
= partition_to_var (map
, x
);
1035 /* Disallow coalescing of these types of variables. */
1037 || TREE_THIS_VOLATILE (t
)
1038 || TREE_CODE (t
) == RESULT_DECL
1039 || TREE_CODE (t
) == PARM_DECL
1041 && (DECL_REGISTER (t
)
1042 || !DECL_IGNORED_P (t
)
1043 || DECL_RTL_SET_P (t
))))
1046 p
= var_to_partition (map
, t
);
1048 #ifdef ENABLE_CHECKING
1049 if (p
== NO_PARTITION
)
1053 /* If partitions have been coalesced, only add the representative
1054 for the partition to the list once. */
1055 if (TEST_BIT (seen
, p
))
1060 /* Find the list for this type. */
1061 for (y
= 0; y
< tv
->num_trees
; y
++)
1062 if (t
== VARRAY_TREE (tv
->trees
, y
))
1064 if (y
== tv
->num_trees
)
1067 VARRAY_PUSH_TREE (tv
->trees
, t
);
1068 VARRAY_PUSH_INT (tv
->first_partition
, p
);
1072 tv
->next_partition
[p
] = VARRAY_INT (tv
->first_partition
, y
);
1073 VARRAY_INT (tv
->first_partition
, y
) = p
;
1075 tv
->partition_to_tree_map
[p
] = y
;
1077 sbitmap_free (seen
);
1082 /* Create a new coalesce list object from MAP and return it. */
1085 create_coalesce_list (var_map map
)
1087 coalesce_list_p list
;
1089 list
= (coalesce_list_p
) xmalloc (sizeof (struct coalesce_list_d
));
1092 list
->add_mode
= true;
1093 list
->list
= (partition_pair_p
*) xcalloc (num_var_partitions (map
),
1094 sizeof (struct partition_pair_d
));
1099 /* Delete coalesce list CL. */
1102 delete_coalesce_list (coalesce_list_p cl
)
1109 /* Find a matching coalesce pair object in CL for partitions P1 and P2. If
1110 one isn't found, return NULL if CREATE is false, otherwise create a new
1111 coalesce pair object and return it. */
1113 static partition_pair_p
1114 find_partition_pair (coalesce_list_p cl
, int p1
, int p2
, bool create
)
1116 partition_pair_p node
, tmp
;
1119 /* Normalize so that p1 is the smaller value. */
1129 /* The list is sorted such that if we find a value greater than p2,
1130 p2 is not in the list. */
1131 for (node
= cl
->list
[p1
]; node
; node
= node
->next
)
1133 if (node
->second_partition
== p2
)
1136 if (node
->second_partition
> p2
)
1144 node
= (partition_pair_p
) xmalloc (sizeof (struct partition_pair_d
));
1145 node
->first_partition
= p1
;
1146 node
->second_partition
= p2
;
1151 node
->next
= tmp
->next
;
1156 /* This is now the first node in the list. */
1157 node
->next
= cl
->list
[p1
];
1158 cl
->list
[p1
] = node
;
1165 /* Add a potential coalesce between P1 and P2 in CL with a cost of VALUE. */
1168 add_coalesce (coalesce_list_p cl
, int p1
, int p2
, int value
)
1170 partition_pair_p node
;
1172 #ifdef ENABLE_CHECKING
1180 node
= find_partition_pair (cl
, p1
, p2
, true);
1182 node
->cost
+= value
;
1186 /* Comparison function to allow qsort to sort P1 and P2 in descending order. */
1189 int compare_pairs (const void *p1
, const void *p2
)
1191 return (*(partition_pair_p
*)p2
)->cost
- (*(partition_pair_p
*)p1
)->cost
;
1195 /* Prepare CL for removal of preferred pairs. When finished, list element
1196 0 has all the coalesce pairs, sorted in order from most important coalesce
1197 to least important. */
1200 sort_coalesce_list (coalesce_list_p cl
)
1203 partition_pair_p chain
, p
;
1204 partition_pair_p
*list
;
1209 cl
->add_mode
= false;
1211 /* Compact the array of lists to a single list, and count the elements. */
1214 for (x
= 0; x
< num_var_partitions (cl
->map
); x
++)
1215 if (cl
->list
[x
] != NULL
)
1217 for (p
= cl
->list
[x
]; p
->next
!= NULL
; p
= p
->next
)
1221 chain
= cl
->list
[x
];
1225 /* Only call qsort if there are more than 2 items. */
1228 list
= xmalloc (sizeof (partition_pair_p
) * num
);
1230 for (p
= chain
; p
!= NULL
; p
= p
->next
)
1233 #ifdef ENABLE_CHECKING
1238 qsort (list
, count
, sizeof (partition_pair_p
), compare_pairs
);
1241 for (x
= 1; x
< num
; x
++)
1247 cl
->list
[0] = list
[0];
1252 cl
->list
[0] = chain
;
1255 /* Simply swap the two elements if they are in the wrong order. */
1256 if (chain
->cost
< chain
->next
->cost
)
1258 cl
->list
[0] = chain
->next
;
1259 cl
->list
[0]->next
= chain
;
1267 /* Retrieve the best remaining pair to coalesce from CL. Returns the 2
1268 partitions via P1 and P2. Their calculated cost is returned by the function.
1269 NO_BEST_COALESCE is returned if the coalesce list is empty. */
1272 pop_best_coalesce (coalesce_list_p cl
, int *p1
, int *p2
)
1274 partition_pair_p node
;
1282 return NO_BEST_COALESCE
;
1284 cl
->list
[0] = node
->next
;
1286 *p1
= node
->first_partition
;
1287 *p2
= node
->second_partition
;
1295 /* If variable VAR is in a partition in MAP, add a conflict in GRAPH between
1296 VAR and any other live partitions in VEC which are associated via TPA.
1297 Reset the live bit in VEC. */
1300 add_conflicts_if_valid (tpa_p tpa
, conflict_graph graph
,
1301 var_map map
, bitmap vec
, tree var
)
1304 p
= var_to_partition (map
, var
);
1305 if (p
!= NO_PARTITION
)
1307 bitmap_clear_bit (vec
, p
);
1308 first
= tpa_find_tree (tpa
, p
);
1309 /* If find returns nothing, this object isn't interesting. */
1310 if (first
== TPA_NONE
)
1312 /* Only add interferences between objects in the same list. */
1313 for (y
= tpa_first_partition (tpa
, first
);
1315 y
= tpa_next_partition (tpa
, y
))
1317 if (bitmap_bit_p (vec
, y
))
1318 conflict_graph_add (graph
, p
, y
);
1324 /* Return a conflict graph for the information contained in LIVE_INFO. Only
1325 conflicts between items in the same TPA list are added. If optional
1326 coalesce list CL is passed in, any copies encountered are added. */
1329 build_tree_conflict_graph (tree_live_info_p liveinfo
, tpa_p tpa
,
1332 conflict_graph graph
;
1337 varray_type partition_link
, tpa_to_clear
, tpa_nodes
;
1342 map
= live_var_map (liveinfo
);
1343 graph
= conflict_graph_new (num_var_partitions (map
));
1345 if (tpa_num_trees (tpa
) == 0)
1348 live
= BITMAP_XMALLOC ();
1350 VARRAY_INT_INIT (partition_link
, num_var_partitions (map
) + 1, "part_link");
1351 VARRAY_INT_INIT (tpa_nodes
, tpa_num_trees (tpa
), "tpa nodes");
1352 VARRAY_INT_INIT (tpa_to_clear
, 50, "tpa to clear");
1356 block_stmt_iterator bsi
;
1359 /* Start with live on exit temporaries. */
1360 bitmap_copy (live
, live_on_exit (liveinfo
, bb
));
1362 for (bsi
= bsi_last (bb
); !bsi_end_p (bsi
); bsi_prev (&bsi
))
1364 bool is_a_copy
= false;
1365 tree stmt
= bsi_stmt (bsi
);
1368 get_stmt_operands (stmt
);
1369 ann
= stmt_ann (stmt
);
1371 /* A copy between 2 partitions does not introduce an interference
1372 by itself. If they did, you would never be able to coalesce
1373 two things which are copied. If the two variables really do
1374 conflict, they will conflict elsewhere in the program.
1376 This is handled specially here since we may also be interested
1377 in copies between real variables and SSA_NAME variables. We may
1378 be interested in trying to coalesce SSA_NAME variables with
1379 root variables in some cases. */
1381 if (TREE_CODE (stmt
) == MODIFY_EXPR
)
1383 tree lhs
= TREE_OPERAND (stmt
, 0);
1384 tree rhs
= TREE_OPERAND (stmt
, 1);
1388 if (DECL_P (lhs
) || TREE_CODE (lhs
) == SSA_NAME
)
1389 p1
= var_to_partition (map
, lhs
);
1393 if (DECL_P (rhs
) || TREE_CODE (rhs
) == SSA_NAME
)
1394 p2
= var_to_partition (map
, rhs
);
1398 if (p1
!= NO_PARTITION
&& p2
!= NO_PARTITION
)
1401 bit
= bitmap_bit_p (live
, p2
);
1402 /* If the RHS is live, make it not live while we add
1403 the conflicts, then make it live again. */
1405 bitmap_clear_bit (live
, p2
);
1406 add_conflicts_if_valid (tpa
, graph
, map
, live
, lhs
);
1408 bitmap_set_bit (live
, p2
);
1410 add_coalesce (cl
, p1
, p2
, 1);
1411 set_if_valid (map
, live
, rhs
);
1419 defs
= DEF_OPS (ann
);
1420 num
= NUM_DEFS (defs
);
1421 for (x
= 0; x
< num
; x
++)
1423 var
= DEF_OP (defs
, x
);
1424 add_conflicts_if_valid (tpa
, graph
, map
, live
, var
);
1427 uses
= USE_OPS (ann
);
1428 num
= NUM_USES (uses
);
1429 for (x
= 0; x
< num
; x
++)
1431 var
= USE_OP (uses
, x
);
1432 set_if_valid (map
, live
, var
);
1437 /* If result of a PHI is unused, then the loops over the statements
1438 will not record any conflicts. However, since the PHI node is
1439 going to be translated out of SSA form we must record a conflict
1440 between the result of the PHI and any variables with are live.
1441 Otherwise the out-of-ssa translation may create incorrect code. */
1442 for (phi
= phi_nodes (bb
); phi
; phi
= PHI_CHAIN (phi
))
1444 tree result
= PHI_RESULT (phi
);
1445 int p
= var_to_partition (map
, result
);
1447 if (p
!= NO_PARTITION
&& ! bitmap_bit_p (live
, p
))
1448 add_conflicts_if_valid (tpa
, graph
, map
, live
, result
);
1451 /* Anything which is still live at this point interferes.
1452 In order to implement this efficiently, only conflicts between
1453 partitions which have the same TPA root need be added.
1454 TPA roots which have been seen are tracked in 'tpa_nodes'. A nonzero
1455 entry points to an index into 'partition_link', which then indexes
1456 into itself forming a linked list of partitions sharing a tpa root
1457 which have been seen as live up to this point. Since partitions start
1458 at index zero, all entries in partition_link are (partition + 1).
1460 Conflicts are added between the current partition and any already seen.
1461 tpa_clear contains all the tpa_roots processed, and these are the only
1462 entries which need to be zero'd out for a clean restart. */
1464 EXECUTE_IF_SET_IN_BITMAP (live
, 0, x
,
1466 i
= tpa_find_tree (tpa
, x
);
1469 int start
= VARRAY_INT (tpa_nodes
, i
);
1470 /* If start is 0, a new root reference list is being started.
1471 Register it to be cleared. */
1473 VARRAY_PUSH_INT (tpa_to_clear
, i
);
1475 /* Add interferences to other tpa members seen. */
1476 for (y
= start
; y
!= 0; y
= VARRAY_INT (partition_link
, y
))
1477 conflict_graph_add (graph
, x
, y
- 1);
1478 VARRAY_INT (tpa_nodes
, i
) = x
+ 1;
1479 VARRAY_INT (partition_link
, x
+ 1) = start
;
1483 /* Now clear the used tpa root references. */
1484 for (l
= 0; l
< VARRAY_ACTIVE_SIZE (tpa_to_clear
); l
++)
1485 VARRAY_INT (tpa_nodes
, VARRAY_INT (tpa_to_clear
, l
)) = 0;
1486 VARRAY_POP_ALL (tpa_to_clear
);
1489 BITMAP_XFREE (live
);
1494 /* This routine will attempt to coalesce the elements in TPA subject to the
1495 conflicts found in GRAPH. If optional coalesce_list CL is provided,
1496 only coalesces specified within the coalesce list are attempted. Otherwise
1497 an attempt is made to coalesce as many partitions within each TPA grouping
1498 as possible. If DEBUG is provided, debug output will be sent there. */
1501 coalesce_tpa_members (tpa_p tpa
, conflict_graph graph
, var_map map
,
1502 coalesce_list_p cl
, FILE *debug
)
1507 /* Attempt to coalesce any items in a coalesce list. */
1510 while (pop_best_coalesce (cl
, &x
, &y
) != NO_BEST_COALESCE
)
1514 fprintf (debug
, "Coalesce list: (%d)", x
);
1515 print_generic_expr (debug
, partition_to_var (map
, x
), TDF_SLIM
);
1516 fprintf (debug
, " & (%d)", y
);
1517 print_generic_expr (debug
, partition_to_var (map
, y
), TDF_SLIM
);
1520 w
= tpa_find_tree (tpa
, x
);
1521 z
= tpa_find_tree (tpa
, y
);
1522 if (w
!= z
|| w
== TPA_NONE
|| z
== TPA_NONE
)
1527 fprintf (debug
, ": Fail, Non-matching TPA's\n");
1529 fprintf (debug
, ": Fail %d non TPA.\n", x
);
1531 fprintf (debug
, ": Fail %d non TPA.\n", y
);
1535 var
= partition_to_var (map
, x
);
1536 tmp
= partition_to_var (map
, y
);
1537 x
= var_to_partition (map
, var
);
1538 y
= var_to_partition (map
, tmp
);
1540 fprintf (debug
, " [map: %d, %d] ", x
, y
);
1544 fprintf (debug
, ": Already Coalesced.\n");
1547 if (!conflict_graph_conflict_p (graph
, x
, y
))
1549 z
= var_union (map
, var
, tmp
);
1550 if (z
== NO_PARTITION
)
1553 fprintf (debug
, ": Unable to perform partition union.\n");
1557 /* z is the new combined partition. We need to remove the other
1558 partition from the list. Set x to be that other partition. */
1561 conflict_graph_merge_regs (graph
, x
, y
);
1562 w
= tpa_find_tree (tpa
, y
);
1563 tpa_remove_partition (tpa
, w
, y
);
1567 conflict_graph_merge_regs (graph
, y
, x
);
1568 w
= tpa_find_tree (tpa
, x
);
1569 tpa_remove_partition (tpa
, w
, x
);
1573 fprintf (debug
, ": Success -> %d\n", z
);
1577 fprintf (debug
, ": Fail due to conflict\n");
1579 /* If using a coalesce list, don't try to coalesce anything else. */
1583 for (x
= 0; x
< tpa_num_trees (tpa
); x
++)
1585 while (tpa_first_partition (tpa
, x
) != TPA_NONE
)
1588 /* Coalesce first partition with anything that doesn't conflict. */
1589 y
= tpa_first_partition (tpa
, x
);
1590 tpa_remove_partition (tpa
, x
, y
);
1592 var
= partition_to_var (map
, y
);
1593 /* p1 is the partition representative to which y belongs. */
1594 p1
= var_to_partition (map
, var
);
1596 for (z
= tpa_next_partition (tpa
, y
);
1598 z
= tpa_next_partition (tpa
, z
))
1600 tmp
= partition_to_var (map
, z
);
1601 /* p2 is the partition representative to which z belongs. */
1602 p2
= var_to_partition (map
, tmp
);
1605 fprintf (debug
, "Coalesce : ");
1606 print_generic_expr (debug
, var
, TDF_SLIM
);
1607 fprintf (debug
, " &");
1608 print_generic_expr (debug
, tmp
, TDF_SLIM
);
1609 fprintf (debug
, " (%d ,%d)", p1
, p2
);
1612 /* If partitions are already merged, don't check for conflict. */
1615 tpa_remove_partition (tpa
, x
, z
);
1617 fprintf (debug
, ": Already coalesced\n");
1620 if (!conflict_graph_conflict_p (graph
, p1
, p2
))
1623 if (tpa_find_tree (tpa
, y
) == TPA_NONE
1624 || tpa_find_tree (tpa
, z
) == TPA_NONE
)
1627 fprintf (debug
, ": Fail non-TPA member\n");
1630 if ((v
= var_union (map
, var
, tmp
)) == NO_PARTITION
)
1633 fprintf (debug
, ": Fail cannot combine partitions\n");
1637 tpa_remove_partition (tpa
, x
, z
);
1639 conflict_graph_merge_regs (graph
, v
, z
);
1642 /* Update the first partition's representative. */
1643 conflict_graph_merge_regs (graph
, v
, y
);
1647 /* The root variable of the partition may be changed
1649 var
= partition_to_var (map
, p1
);
1652 fprintf (debug
, ": Success -> %d\n", v
);
1656 fprintf (debug
, ": Fail, Conflict\n");
1663 /* Send debug info for coalesce list CL to file F. */
1666 dump_coalesce_list (FILE *f
, coalesce_list_p cl
)
1668 partition_pair_p node
;
1674 fprintf (f
, "Coalesce List:\n");
1675 num
= num_var_partitions (cl
->map
);
1676 for (x
= 0; x
< num
; x
++)
1682 print_generic_expr (f
, partition_to_var (cl
->map
, x
), TDF_SLIM
);
1683 fprintf (f
, "] - ");
1684 for ( ; node
; node
= node
->next
)
1686 var
= partition_to_var (cl
->map
, node
->second_partition
);
1687 print_generic_expr (f
, var
, TDF_SLIM
);
1688 fprintf (f
, "(%1d), ", node
->cost
);
1696 fprintf (f
, "Sorted Coalesce list:\n");
1697 for (node
= cl
->list
[0]; node
; node
= node
->next
)
1699 fprintf (f
, "(%d) ", node
->cost
);
1700 var
= partition_to_var (cl
->map
, node
->first_partition
);
1701 print_generic_expr (f
, var
, TDF_SLIM
);
1703 var
= partition_to_var (cl
->map
, node
->second_partition
);
1704 print_generic_expr (f
, var
, TDF_SLIM
);
1711 /* Output tree_partition_associator object TPA to file F.. */
1714 tpa_dump (FILE *f
, tpa_p tpa
)
1721 for (x
= 0; x
< tpa_num_trees (tpa
); x
++)
1723 print_generic_expr (f
, tpa_tree (tpa
, x
), TDF_SLIM
);
1724 fprintf (f
, " : (");
1725 for (i
= tpa_first_partition (tpa
, x
);
1727 i
= tpa_next_partition (tpa
, i
))
1729 fprintf (f
, "(%d)",i
);
1730 print_generic_expr (f
, partition_to_var (tpa
->map
, i
), TDF_SLIM
);
1733 #ifdef ENABLE_CHECKING
1734 if (tpa_find_tree (tpa
, i
) != x
)
1735 fprintf (f
, "**find tree incorrectly set** ");
1745 /* Output partition map MAP to file F. */
1748 dump_var_map (FILE *f
, var_map map
)
1754 fprintf (f
, "\nPartition map \n\n");
1756 for (x
= 0; x
< map
->num_partitions
; x
++)
1758 if (map
->compact_to_partition
!= NULL
)
1759 p
= map
->compact_to_partition
[x
];
1763 if (map
->partition_to_var
[p
] == NULL_TREE
)
1767 for (y
= 1; y
< num_ssa_names
; y
++)
1769 p
= partition_find (map
->var_partition
, y
);
1770 if (map
->partition_to_compact
)
1771 p
= map
->partition_to_compact
[p
];
1776 fprintf(f
, "Partition %d (", x
);
1777 print_generic_expr (f
, partition_to_var (map
, p
), TDF_SLIM
);
1780 fprintf (f
, "%d ", y
);
1790 /* Output live range info LIVE to file F, controlled by FLAG. */
1793 dump_live_info (FILE *f
, tree_live_info_p live
, int flag
)
1797 var_map map
= live
->map
;
1799 if ((flag
& LIVEDUMP_ENTRY
) && live
->livein
)
1803 fprintf (f
, "\nLive on entry to BB%d : ", bb
->index
);
1804 for (i
= 0; i
< num_var_partitions (map
); i
++)
1806 if (bitmap_bit_p (live_entry_blocks (live
, i
), bb
->index
))
1808 print_generic_expr (f
, partition_to_var (map
, i
), TDF_SLIM
);
1816 if ((flag
& LIVEDUMP_EXIT
) && live
->liveout
)
1820 fprintf (f
, "\nLive on exit from BB%d : ", bb
->index
);
1821 EXECUTE_IF_SET_IN_BITMAP (live
->liveout
[bb
->index
], 0, i
,
1823 print_generic_expr (f
, partition_to_var (map
, i
), TDF_SLIM
);