* tree-ssa-live.c (create_ssa_var_map): Avoid defined-but-not-used
[official-gcc.git] / gcc / tree-ssa-live.c
blob45df501ee1b5a3826b5c9e77b7062191b22821ac
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)
10 any later version.
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. */
22 #include "config.h"
23 #include "system.h"
24 #include "coretypes.h"
25 #include "tm.h"
26 #include "tree.h"
27 #include "flags.h"
28 #include "basic-block.h"
29 #include "function.h"
30 #include "diagnostic.h"
31 #include "bitmap.h"
32 #include "tree-flow.h"
33 #include "tree-gimple.h"
34 #include "tree-inline.h"
35 #include "varray.h"
36 #include "timevar.h"
37 #include "tree-alias-common.h"
38 #include "hashtab.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,
46 tree, basic_block);
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
53 is tracked.
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. */
66 var_map
67 init_var_map (int size)
69 var_map map;
71 map = (var_map) xmalloc (sizeof (struct _var_map));
72 map->var_partition = partition_new (size);
73 map->partition_to_var
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;
82 return map;
86 /* Free memory associated with MAP. */
88 void
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);
97 if (map->ref_count)
98 free (map->ref_count);
99 free (map);
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)
110 int p1, p2, p3;
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));
120 else
122 p1 = var_to_partition (map, var1);
123 if (map->compact_to_partition)
124 p1 = map->compact_to_partition[p1];
125 root_var = var1;
128 if (TREE_CODE (var2) == SSA_NAME)
129 p2 = partition_find (map->var_partition, SSA_NAME_VERSION (var2));
130 else
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 || is_gimple_tmp_var (root_var))
140 other_var = root_var;
141 root_var = var2;
143 else
144 other_var = var2;
147 if (p1 == NO_PARTITION || p2 == NO_PARTITION)
148 abort ();
150 if (p1 == p2)
151 p3 = p1;
152 else
153 p3 = partition_union (map->var_partition, p1, p2);
155 if (map->partition_to_compact)
156 p3 = map->partition_to_compact[p3];
158 if (root_var)
159 change_partition_var (map, root_var, p3);
160 if (other_var)
161 change_partition_var (map, other_var, p3);
163 return 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. */
184 void
185 compact_var_map (var_map map, int flags)
187 sbitmap used;
188 int x, limit, count, tmp, root, root_i;
189 tree var;
190 root_var_p rv = NULL;
192 limit = map->partition_size;
193 used = sbitmap_alloc (limit);
194 sbitmap_zero (used);
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. */
217 count = 0;
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. */
225 if (rv)
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)
231 continue;
233 SET_BIT (used, tmp);
234 count++;
238 /* Build a compacted partitioning. */
239 if (count != limit)
241 map->compact_to_partition = (int *)xmalloc (count * sizeof (int));
242 count = 0;
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);
251 count++;
254 else
256 free (map->partition_to_compact);
257 map->partition_to_compact = NULL;
260 map->num_partitions = count;
262 if (rv)
263 root_var_delete (rv);
264 sbitmap_free (used);
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. */
272 void
273 change_partition_var (var_map map, tree var, int part)
275 var_ann_t ann;
277 if (TREE_CODE (var) == SSA_NAME)
278 abort();
280 ann = var_ann (var);
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. */
290 static tree
291 mark_all_vars_used_1 (tree *tp, int *walk_subtrees,
292 void *data ATTRIBUTE_UNUSED)
294 tree t = *tp;
296 /* Only need to mark VAR_DECLS; parameters and return results are not
297 eliminated as unused. */
298 if (TREE_CODE (t) == VAR_DECL)
299 set_is_used (t);
301 if (DECL_P (t) || TYPE_P (t))
302 *walk_subtrees = 0;
304 return NULL;
307 /* Mark all VAR_DECLS under *EXPR_P as used, so that they won't be
308 eliminated during the tree->rtl conversion process. */
310 static inline void
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. */
320 var_map
321 create_ssa_var_map (int flags)
323 block_stmt_iterator bsi;
324 basic_block bb;
325 tree dest, use;
326 tree stmt;
327 stmt_ann_t ann;
328 use_optype uses;
329 def_optype defs;
330 unsigned x;
331 var_map map;
332 #ifdef ENABLE_CHECKING
333 sbitmap used_in_real_ops;
334 sbitmap used_in_virtual_ops;
335 vuse_optype vuses;
336 v_may_def_optype v_may_defs;
337 v_must_def_optype v_must_defs;
338 #endif
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);
348 #endif
350 if (flags & SSA_VAR_MAP_REF_COUNT)
352 map->ref_count
353 = (int *)xmalloc (((num_ssa_names + 1) * sizeof (int)));
354 memset (map->ref_count, 0, (num_ssa_names + 1) * sizeof (int));
357 FOR_EACH_BB (bb)
359 tree phi, arg;
360 for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
362 int i;
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);
389 #endif
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);
400 #endif
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
433 unsigned i;
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))));
441 abort ();
444 sbitmap_free (used_in_real_ops);
445 sbitmap_free (used_in_virtual_ops);
446 sbitmap_free (both);
448 #endif
450 return map;
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;
460 int x;
462 live = (tree_live_info_p) xmalloc (sizeof (struct tree_live_info_d));
463 live->map = map;
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;
474 return live;
478 /* Free storage for live range info object LIVE. */
480 void
481 delete_tree_live_info (tree_live_info_p live)
483 int x;
484 if (live->liveout)
486 for (x = live->num_blocks - 1; x >= 0; x--)
487 BITMAP_XFREE (live->liveout[x]);
488 free (live->liveout);
490 if (live->livein)
492 for (x = num_var_partitions (live->map) - 1; x >= 0; x--)
493 BITMAP_XFREE (live->livein[x]);
494 free (live->livein);
496 if (live->global)
497 BITMAP_XFREE (live->global);
499 free (live);
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. */
507 static void
508 live_worklist (tree_live_info_p live, varray_type stack, int i)
510 int b;
511 tree var;
512 basic_block def_bb = NULL;
513 edge e;
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);
528 VARRAY_POP (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)
535 continue;
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. */
548 static inline void
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. */
560 static inline void
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)
566 return;
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. */
578 tree_live_info_p
579 calculate_live_on_entry (var_map map)
581 tree_live_info_p live;
582 int num, i;
583 basic_block bb;
584 bitmap saw_def;
585 tree phi, var, stmt;
586 tree op;
587 edge e;
588 varray_type stack;
589 block_stmt_iterator bsi;
590 use_optype uses;
591 def_optype defs;
592 stmt_ann_t ann;
594 saw_def = BITMAP_XMALLOC ();
596 live = new_tree_live_info (map);
598 FOR_EACH_BB (bb)
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))
608 continue;
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:
622 a_3 = PHI <a_1, a_2>
623 b_3 = PHI <b_1, a_3>
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
666 something wrong. */
668 bb = ENTRY_BLOCK_PTR;
669 num = 0;
670 for (e = bb->succ; e; e = e->succ_next)
672 int entry_block = e->dest->index;
673 if (e->dest == EXIT_BLOCK_PTR)
674 continue;
675 for (i = 0; i < num_var_partitions (map); i++)
677 basic_block tmp;
678 tree d;
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))
688 num++;
689 print_generic_expr (stderr, var, TDF_SLIM);
690 fprintf (stderr, " is defined ");
691 if (tmp)
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",
696 entry_block);
697 fprintf (stderr, " So it appears to have multiple defs.\n");
699 else
701 if (d != var)
703 num++;
704 print_generic_expr (stderr, var, TDF_SLIM);
705 fprintf (stderr, " is live-on-entry to BB%d ",entry_block);
706 if (d)
708 fprintf (stderr, " but is not the default def of ");
709 print_generic_expr (stderr, d, TDF_SLIM);
710 fprintf (stderr, "\n");
712 else
713 fprintf (stderr, " and there is no default def.\n");
717 else
718 if (d == var)
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. */
722 int z, ok = 0;
723 for (phi = phi_nodes (e->dest);
724 phi && !ok;
725 phi = PHI_CHAIN (phi))
727 for (z = 0; z < PHI_NUM_ARGS (phi); z++)
728 if (var == PHI_ARG_DEF (phi, z))
730 ok = 1;
731 break;
734 if (ok)
735 continue;
736 num++;
737 print_generic_expr (stderr, var, TDF_SLIM);
738 fprintf (stderr, " is not marked live-on-entry to entry BB%d ",
739 entry_block);
740 fprintf (stderr, "but it is a default def so it should be.\n");
744 if (num > 0)
745 abort ();
746 #endif
748 BITMAP_XFREE (saw_def);
750 return live;
754 /* Calculate the live on exit vectors based on the entry info in LIVEINFO. */
756 void
757 calculate_live_on_exit (tree_live_info_p liveinfo)
759 unsigned b;
760 int i, x;
761 bitmap *on_exit;
762 basic_block bb;
763 edge e;
764 tree t, phi;
765 bitmap on_entry;
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. */
773 FOR_EACH_BB (bb)
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)
781 continue;
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. */
804 tpa_p
805 tpa_init (var_map map)
807 tpa_p tpa;
808 int num_partitions = num_var_partitions (map);
809 int x;
811 if (num_partitions == 0)
812 return NULL;
814 tpa = (tpa_p) xmalloc (sizeof (struct tree_partition_associator_d));
815 tpa->num_trees = 0;
816 tpa->uncompressed_num = -1;
817 tpa->map = map;
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");
828 return tpa;
833 /* Remove PARTITION_INDEX from TREE_INDEX's list in the tpa structure TPA. */
835 void
836 tpa_remove_partition (tpa_p tpa, int tree_index, int partition_index)
838 int i;
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];
845 else
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];
852 break;
859 /* Free the memory used by tree_partition_associator object TPA. */
861 void
862 tpa_delete (tpa_p tpa)
864 if (!tpa)
865 return;
867 free (tpa->partition_to_tree_map);
868 free (tpa->next_partition);
869 free (tpa);
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. */
877 int
878 tpa_compact (tpa_p tpa)
880 int last, x, y, first, swap_i;
881 tree swap_t;
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)
888 break;
891 x = 0;
892 while (x < last)
894 first = tpa_first_partition (tpa, x);
896 /* If there is not more than one partition, swap with the current end
897 of the tree list. */
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);
915 y != NO_PARTITION;
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. */
920 last--;
921 for (; last > x; last--)
923 first = tpa_first_partition (tpa, last);
924 if (tpa_next_partition (tpa, first) != NO_PARTITION)
925 break;
928 x++;
931 first = tpa_first_partition (tpa, x);
932 if (tpa_next_partition (tpa, first) != NO_PARTITION)
933 x++;
934 tpa->uncompressed_num = tpa->num_trees;
935 tpa->num_trees = x;
936 return last;
940 /* Initialize a root_var object with SSA partitions from MAP which are based
941 on each root variable. */
943 root_var_p
944 root_var_init (var_map map)
946 root_var_p rv;
947 int num_partitions = num_var_partitions (map);
948 int x, p;
949 tree t;
950 var_ann_t ann;
951 sbitmap seen;
953 rv = tpa_init (map);
954 if (!rv)
955 return NULL;
957 seen = sbitmap_alloc (num_partitions);
958 sbitmap_zero (seen);
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. */
967 if (!t)
968 continue;
970 p = var_to_partition (map, t);
972 #ifdef ENABLE_CHECKING
973 if (p == NO_PARTITION)
974 abort ();
975 #endif
977 /* Make sure we only put coalesced partitions into the list once. */
978 if (TEST_BIT (seen, p))
979 continue;
980 SET_BIT (seen, p);
981 if (TREE_CODE (t) == SSA_NAME)
982 t = SSA_NAME_VAR (t);
983 ann = var_ann (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;
990 else
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);
1008 return rv;
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. */
1015 type_var_p
1016 type_var_init (var_map map)
1018 type_var_p tv;
1019 int x, y, p;
1020 int num_partitions = num_var_partitions (map);
1021 tree t;
1022 sbitmap seen;
1024 seen = sbitmap_alloc (num_partitions);
1025 sbitmap_zero (seen);
1027 tv = tpa_init (map);
1028 if (!tv)
1029 return NULL;
1031 for (x = num_partitions - 1; x >= 0; x--)
1033 t = partition_to_var (map, x);
1035 /* Disallow coalescing of these types of variables. */
1036 if (!t
1037 || TREE_THIS_VOLATILE (t)
1038 || TREE_CODE (t) == RESULT_DECL
1039 || TREE_CODE (t) == PARM_DECL
1040 || (DECL_P (t)
1041 && (DECL_REGISTER (t)
1042 || !DECL_ARTIFICIAL (t)
1043 || DECL_RTL_SET_P (t))))
1044 continue;
1046 p = var_to_partition (map, t);
1048 #ifdef ENABLE_CHECKING
1049 if (p == NO_PARTITION)
1050 abort ();
1051 #endif
1053 /* If partitions have been coalesced, only add the representative
1054 for the partition to the list once. */
1055 if (TEST_BIT (seen, p))
1056 continue;
1057 SET_BIT (seen, p);
1058 t = TREE_TYPE (t);
1060 /* Find the list for this type. */
1061 for (y = 0; y < tv->num_trees; y++)
1062 if (t == VARRAY_TREE (tv->trees, y))
1063 break;
1064 if (y == tv->num_trees)
1066 tv->num_trees++;
1067 VARRAY_PUSH_TREE (tv->trees, t);
1068 VARRAY_PUSH_INT (tv->first_partition, p);
1070 else
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);
1078 return tv;
1082 /* Create a new coalesce list object from MAP and return it. */
1084 coalesce_list_p
1085 create_coalesce_list (var_map map)
1087 coalesce_list_p list;
1089 list = (coalesce_list_p) xmalloc (sizeof (struct coalesce_list_d));
1091 list->map = map;
1092 list->add_mode = true;
1093 list->list = (partition_pair_p *) xcalloc (num_var_partitions (map),
1094 sizeof (struct partition_pair_d));
1095 return list;
1099 /* Delete coalesce list CL. */
1101 void
1102 delete_coalesce_list (coalesce_list_p cl)
1104 free (cl->list);
1105 free (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;
1117 int s;
1119 /* Normalize so that p1 is the smaller value. */
1120 if (p2 < p1)
1122 s = p1;
1123 p1 = p2;
1124 p2 = s;
1127 tmp = NULL;
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)
1134 return node;
1135 else
1136 if (node->second_partition > p2)
1137 break;
1138 tmp = node;
1141 if (!create)
1142 return NULL;
1144 node = (partition_pair_p) xmalloc (sizeof (struct partition_pair_d));
1145 node->first_partition = p1;
1146 node->second_partition = p2;
1147 node->cost = 0;
1149 if (tmp != NULL)
1151 node->next = tmp->next;
1152 tmp->next = node;
1154 else
1156 /* This is now the first node in the list. */
1157 node->next = cl->list[p1];
1158 cl->list[p1] = node;
1161 return node;
1165 /* Add a potential coalesce between P1 and P2 in CL with a cost of VALUE. */
1167 void
1168 add_coalesce (coalesce_list_p cl, int p1, int p2, int value)
1170 partition_pair_p node;
1172 #ifdef ENABLE_CHECKING
1173 if (!cl->add_mode)
1174 abort();
1175 #endif
1177 if (p1 == p2)
1178 return;
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. */
1188 static
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. */
1199 void
1200 sort_coalesce_list (coalesce_list_p cl)
1202 int x, num, count;
1203 partition_pair_p chain, p;
1204 partition_pair_p *list;
1206 if (!cl->add_mode)
1207 abort();
1209 cl->add_mode = false;
1211 /* Compact the array of lists to a single list, and count the elements. */
1212 num = 0;
1213 chain = NULL;
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)
1218 num++;
1219 num++;
1220 p->next = chain;
1221 chain = cl->list[x];
1222 cl->list[x] = NULL;
1225 /* Only call qsort if there are more than 2 items. */
1226 if (num > 2)
1228 list = xmalloc (sizeof (partition_pair_p) * num);
1229 count = 0;
1230 for (p = chain; p != NULL; p = p->next)
1231 list[count++] = p;
1233 #ifdef ENABLE_CHECKING
1234 if (count != num)
1235 abort ();
1236 #endif
1238 qsort (list, count, sizeof (partition_pair_p), compare_pairs);
1240 p = list[0];
1241 for (x = 1; x < num; x++)
1243 p->next = list[x];
1244 p = list[x];
1246 p->next = NULL;
1247 cl->list[0] = list[0];
1248 free (list);
1250 else
1252 cl->list[0] = chain;
1253 if (num == 2)
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;
1260 chain->next = NULL;
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. */
1271 int
1272 pop_best_coalesce (coalesce_list_p cl, int *p1, int *p2)
1274 partition_pair_p node;
1275 int ret;
1277 if (cl->add_mode)
1278 abort();
1280 node = cl->list[0];
1281 if (!node)
1282 return NO_BEST_COALESCE;
1284 cl->list[0] = node->next;
1286 *p1 = node->first_partition;
1287 *p2 = node->second_partition;
1288 ret = node->cost;
1289 free (node);
1291 return ret;
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. */
1299 static inline void
1300 add_conflicts_if_valid (tpa_p tpa, conflict_graph graph,
1301 var_map map, bitmap vec, tree var)
1303 int p, y, first;
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)
1311 return;
1312 /* Only add interferences between objects in the same list. */
1313 for (y = tpa_first_partition (tpa, first);
1314 y != TPA_NONE;
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. */
1328 conflict_graph
1329 build_tree_conflict_graph (tree_live_info_p liveinfo, tpa_p tpa,
1330 coalesce_list_p cl)
1332 conflict_graph graph;
1333 var_map map;
1334 bitmap live;
1335 int num, x, y, i;
1336 basic_block bb;
1337 varray_type partition_link, tpa_to_clear, tpa_nodes;
1338 def_optype defs;
1339 use_optype uses;
1340 unsigned l;
1342 map = live_var_map (liveinfo);
1343 graph = conflict_graph_new (num_var_partitions (map));
1345 if (tpa_num_trees (tpa) == 0)
1346 return graph;
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");
1354 FOR_EACH_BB (bb)
1356 block_stmt_iterator bsi;
1357 tree phi;
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);
1366 stmt_ann_t ann;
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);
1385 int p1, p2;
1386 int bit;
1388 if (DECL_P (lhs) || TREE_CODE (lhs) == SSA_NAME)
1389 p1 = var_to_partition (map, lhs);
1390 else
1391 p1 = NO_PARTITION;
1393 if (DECL_P (rhs) || TREE_CODE (rhs) == SSA_NAME)
1394 p2 = var_to_partition (map, rhs);
1395 else
1396 p2 = NO_PARTITION;
1398 if (p1 != NO_PARTITION && p2 != NO_PARTITION)
1400 is_a_copy = true;
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. */
1404 if (bit)
1405 bitmap_clear_bit (live, p2);
1406 add_conflicts_if_valid (tpa, graph, map, live, lhs);
1407 if (bit)
1408 bitmap_set_bit (live, p2);
1409 if (cl)
1410 add_coalesce (cl, p1, p2, 1);
1411 set_if_valid (map, live, rhs);
1415 if (!is_a_copy)
1417 tree var;
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);
1467 if (i != TPA_NONE)
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. */
1472 if (!start)
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);
1490 return graph;
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. */
1500 void
1501 coalesce_tpa_members (tpa_p tpa, conflict_graph graph, var_map map,
1502 coalesce_list_p cl, FILE *debug)
1504 int x, y, z, w;
1505 tree var, tmp;
1507 /* Attempt to coalesce any items in a coalesce list. */
1508 if (cl)
1510 while (pop_best_coalesce (cl, &x, &y) != NO_BEST_COALESCE)
1512 if (debug)
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)
1524 if (debug)
1526 if (w != z)
1527 fprintf (debug, ": Fail, Non-matching TPA's\n");
1528 if (w == TPA_NONE)
1529 fprintf (debug, ": Fail %d non TPA.\n", x);
1530 else
1531 fprintf (debug, ": Fail %d non TPA.\n", y);
1533 continue;
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);
1539 if (debug)
1540 fprintf (debug, " [map: %d, %d] ", x, y);
1541 if (x == y)
1543 if (debug)
1544 fprintf (debug, ": Already Coalesced.\n");
1545 continue;
1547 if (!conflict_graph_conflict_p (graph, x, y))
1549 z = var_union (map, var, tmp);
1550 if (z == NO_PARTITION)
1552 if (debug)
1553 fprintf (debug, ": Unable to perform partition union.\n");
1554 continue;
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. */
1559 if (z == x)
1561 conflict_graph_merge_regs (graph, x, y);
1562 w = tpa_find_tree (tpa, y);
1563 tpa_remove_partition (tpa, w, y);
1565 else
1567 conflict_graph_merge_regs (graph, y, x);
1568 w = tpa_find_tree (tpa, x);
1569 tpa_remove_partition (tpa, w, x);
1572 if (debug)
1573 fprintf (debug, ": Success -> %d\n", z);
1575 else
1576 if (debug)
1577 fprintf (debug, ": Fail due to conflict\n");
1579 /* If using a coalesce list, don't try to coalesce anything else. */
1580 return;
1583 for (x = 0; x < tpa_num_trees (tpa); x++)
1585 while (tpa_first_partition (tpa, x) != TPA_NONE)
1587 int p1, p2;
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);
1597 z != TPA_NONE;
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);
1603 if (debug)
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. */
1613 if (tmp == var)
1615 tpa_remove_partition (tpa, x, z);
1616 if (debug)
1617 fprintf (debug, ": Already coalesced\n");
1619 else
1620 if (!conflict_graph_conflict_p (graph, p1, p2))
1622 int v;
1623 if (tpa_find_tree (tpa, y) == TPA_NONE
1624 || tpa_find_tree (tpa, z) == TPA_NONE)
1626 if (debug)
1627 fprintf (debug, ": Fail non-TPA member\n");
1628 continue;
1630 if ((v = var_union (map, var, tmp)) == NO_PARTITION)
1632 if (debug)
1633 fprintf (debug, ": Fail cannot combine partitions\n");
1634 continue;
1637 tpa_remove_partition (tpa, x, z);
1638 if (v == p1)
1639 conflict_graph_merge_regs (graph, v, z);
1640 else
1642 /* Update the first partition's representative. */
1643 conflict_graph_merge_regs (graph, v, y);
1644 p1 = v;
1647 /* The root variable of the partition may be changed
1648 now. */
1649 var = partition_to_var (map, p1);
1651 if (debug)
1652 fprintf (debug, ": Success -> %d\n", v);
1654 else
1655 if (debug)
1656 fprintf (debug, ": Fail, Conflict\n");
1663 /* Send debug info for coalesce list CL to file F. */
1665 void
1666 dump_coalesce_list (FILE *f, coalesce_list_p cl)
1668 partition_pair_p node;
1669 int x, num;
1670 tree var;
1672 if (cl->add_mode)
1674 fprintf (f, "Coalesce List:\n");
1675 num = num_var_partitions (cl->map);
1676 for (x = 0; x < num; x++)
1678 node = cl->list[x];
1679 if (node)
1681 fprintf (f, "[");
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);
1690 fprintf (f, "\n");
1694 else
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);
1702 fprintf (f, " : ");
1703 var = partition_to_var (cl->map, node->second_partition);
1704 print_generic_expr (f, var, TDF_SLIM);
1705 fprintf (f, "\n");
1711 /* Output tree_partition_associator object TPA to file F.. */
1713 void
1714 tpa_dump (FILE *f, tpa_p tpa)
1716 int x, i;
1718 if (!tpa)
1719 return;
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);
1726 i != TPA_NONE;
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);
1731 fprintf (f, " ");
1733 #ifdef ENABLE_CHECKING
1734 if (tpa_find_tree (tpa, i) != x)
1735 fprintf (f, "**find tree incorrectly set** ");
1736 #endif
1739 fprintf (f, ")\n");
1741 fflush (f);
1745 /* Output partition map MAP to file F. */
1747 void
1748 dump_var_map (FILE *f, var_map map)
1750 int t;
1751 unsigned x, y;
1752 int p;
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];
1760 else
1761 p = x;
1763 if (map->partition_to_var[p] == NULL_TREE)
1764 continue;
1766 t = 0;
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];
1772 if (p == (int)x)
1774 if (t++ == 0)
1776 fprintf(f, "Partition %d (", x);
1777 print_generic_expr (f, partition_to_var (map, p), TDF_SLIM);
1778 fprintf (f, " - ");
1780 fprintf (f, "%d ", y);
1783 if (t != 0)
1784 fprintf (f, ")\n");
1786 fprintf (f, "\n");
1790 /* Output live range info LIVE to file F, controlled by FLAG. */
1792 void
1793 dump_live_info (FILE *f, tree_live_info_p live, int flag)
1795 basic_block bb;
1796 int i;
1797 var_map map = live->map;
1799 if ((flag & LIVEDUMP_ENTRY) && live->livein)
1801 FOR_EACH_BB (bb)
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);
1809 fprintf (f, " ");
1812 fprintf (f, "\n");
1816 if ((flag & LIVEDUMP_EXIT) && live->liveout)
1818 FOR_EACH_BB (bb)
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);
1824 fprintf (f, " ");
1826 fprintf (f, "\n");
1831 /* Register partitions in MAP so that we can take VARS out of SSA form.
1832 This requires a walk over all the PHI nodes and all the statements. */
1834 void
1835 register_ssa_partitions_for_vars (bitmap vars, var_map map)
1837 basic_block bb;
1839 if (bitmap_first_set_bit (vars) >= 0)
1842 /* Find every instance (SSA_NAME) of variables in VARs and
1843 register a new partition for them. This requires examining
1844 every statement and every PHI node once. */
1845 FOR_EACH_BB (bb)
1847 block_stmt_iterator bsi;
1848 tree next;
1849 tree phi;
1851 /* Register partitions for SSA_NAMEs appearing in the PHI
1852 nodes in this basic block.
1854 Note we delete PHI nodes in this loop if they are
1855 associated with virtual vars which are going to be
1856 renamed. */
1857 for (phi = phi_nodes (bb); phi; phi = next)
1859 tree result = SSA_NAME_VAR (PHI_RESULT (phi));
1861 next = PHI_CHAIN (phi);
1862 if (bitmap_bit_p (vars, var_ann (result)->uid))
1864 if (! is_gimple_reg (result))
1865 remove_phi_node (phi, NULL_TREE, bb);
1866 else
1868 int i;
1870 /* Register a partition for the result. */
1871 register_ssa_partition (map, PHI_RESULT (phi), 0);
1873 /* Register a partition for each argument as needed. */
1874 for (i = 0; i < PHI_NUM_ARGS (phi); i++)
1876 tree arg = PHI_ARG_DEF (phi, i);
1878 if (TREE_CODE (arg) != SSA_NAME)
1879 continue;
1880 if (!bitmap_bit_p (vars,
1881 var_ann (SSA_NAME_VAR (arg))->uid))
1882 continue;
1884 register_ssa_partition (map, arg, 1);
1890 /* Now register partitions for SSA_NAMEs appearing in each
1891 statement in this block. */
1892 for (bsi = bsi_start (bb); ! bsi_end_p (bsi); bsi_next (&bsi))
1894 stmt_ann_t ann = stmt_ann (bsi_stmt (bsi));
1895 use_optype uses = USE_OPS (ann);
1896 def_optype defs = DEF_OPS (ann);
1897 unsigned int i;
1899 for (i = 0; i < NUM_USES (uses); i++)
1901 tree op = USE_OP (uses, i);
1903 if (TREE_CODE (op) == SSA_NAME
1904 && bitmap_bit_p (vars, var_ann (SSA_NAME_VAR (op))->uid))
1905 register_ssa_partition (map, op, 1);
1908 for (i = 0; i < NUM_DEFS (defs); i++)
1910 tree op = DEF_OP (defs, i);
1912 if (TREE_CODE (op) == SSA_NAME
1913 && bitmap_bit_p (vars,
1914 var_ann (SSA_NAME_VAR (op))->uid))
1915 register_ssa_partition (map, op, 0);