OSDN Git Service

* tree-ssa-live.c (build_tree_conflict_graph): Change the type
[pf3gnuchains/gcc-fork.git] / gcc / tree-ssa-live.c
1 /* Liveness for SSA trees.
2    Copyright (C) 2003, 2004, 2005 Free Software Foundation, Inc.
3    Contributed by Andrew MacLeod <amacleod@redhat.com>
4
5 This file is part of GCC.
6
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.
11
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.
16
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.  */
21
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 "hashtab.h"
38 #include "tree-dump.h"
39 #include "tree-ssa-live.h"
40 #include "errors.h"
41
42 static void live_worklist (tree_live_info_p, int *, 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);
51
52 /* This is where the mapping from SSA version number to real storage variable
53    is tracked.  
54
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.
59
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.  */
63
64 /* Create a variable partition map of SIZE, initialize and return it.  */
65
66 var_map
67 init_var_map (int size)
68 {
69   var_map map;
70
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));
76
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;
83 }
84
85
86 /* Free memory associated with MAP.  */
87
88 void
89 delete_var_map (var_map map)
90 {
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);
100 }
101
102
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.  */
106
107 int
108 var_union (var_map map, tree var1, tree var2)
109 {
110   int p1, p2, p3;
111   tree root_var = NULL_TREE;
112   tree other_var = NULL_TREE;
113
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.  */
117
118   if (TREE_CODE (var1) == SSA_NAME)
119     p1 = partition_find (map->var_partition, SSA_NAME_VERSION (var1));
120   else
121     {
122       p1 = var_to_partition (map, var1);
123       if (map->compact_to_partition)
124         p1 = map->compact_to_partition[p1];
125       root_var = var1;
126     }
127   
128   if (TREE_CODE (var2) == SSA_NAME)
129     p2 = partition_find (map->var_partition, SSA_NAME_VERSION (var2));
130   else
131     {
132       p2 = var_to_partition (map, var2);
133       if (map->compact_to_partition)
134         p2 = map->compact_to_partition[p2];
135
136       /* If there is no root_var set, or it's 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)))
139         {
140           other_var = root_var;
141           root_var = var2;
142         }
143       else 
144         other_var = var2;
145     }
146
147   gcc_assert (p1 != NO_PARTITION);
148   gcc_assert (p2 != NO_PARTITION);
149
150   if (p1 == p2)
151     p3 = p1;
152   else
153     p3 = partition_union (map->var_partition, p1, p2);
154
155   if (map->partition_to_compact)
156     p3 = map->partition_to_compact[p3];
157
158   if (root_var)
159     change_partition_var (map, root_var, p3);
160   if (other_var)
161     change_partition_var (map, other_var, p3);
162
163   return p3;
164 }
165
166
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.
172
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.
179
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.  */
183
184 void 
185 compact_var_map (var_map map, int flags)
186 {
187   sbitmap used;
188   int x, limit, count, tmp, root, root_i;
189   tree var;
190   root_var_p rv = NULL;
191
192   limit = map->partition_size;
193   used = sbitmap_alloc (limit);
194   sbitmap_zero (used);
195
196   /* Already compressed? Abandon the old one.  */
197   if (map->partition_to_compact)
198     {
199       free (map->partition_to_compact);
200       map->partition_to_compact = NULL;
201     }
202   if (map->compact_to_partition)
203     {
204       free (map->compact_to_partition);
205       map->compact_to_partition = NULL;
206     }
207
208   map->num_partitions = map->partition_size;
209
210   if (flags & VARMAP_NO_SINGLE_DEFS)
211     rv = root_var_init (map);
212
213   map->partition_to_compact = (int *)xmalloc (limit * sizeof (int));
214   memset (map->partition_to_compact, 0xff, (limit * sizeof (int)));
215
216   /* Find out which partitions are actually referenced.  */
217   count = 0;
218   for (x = 0; x < limit; x++)
219     {
220       tmp = partition_find (map->var_partition, x);
221       if (!TEST_BIT (used, tmp) && map->partition_to_var[tmp] != NULL_TREE)
222         {
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)
226             {
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;
232             }
233           SET_BIT (used, tmp);
234           count++;
235         }
236     }
237
238   /* Build a compacted partitioning.  */
239   if (count != limit)
240     {
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,
245         {
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++;
252         });
253     }
254   else
255     {
256       free (map->partition_to_compact);
257       map->partition_to_compact = NULL;
258     }
259
260   map->num_partitions = count;
261
262   if (rv)
263     root_var_delete (rv);
264   sbitmap_free (used);
265 }
266
267
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.  */
271   
272 void 
273 change_partition_var (var_map map, tree var, int part)
274 {
275   var_ann_t ann;
276
277   gcc_assert (TREE_CODE (var) != SSA_NAME);
278
279   ann = var_ann (var);
280   ann->out_of_ssa_tag = 1;
281   VAR_ANN_PARTITION (ann) = part;
282   if (map->compact_to_partition)
283     map->partition_to_var[map->compact_to_partition[part]] = var;
284 }
285
286
287 /* Helper function for mark_all_vars_used, called via walk_tree.  */
288
289 static tree
290 mark_all_vars_used_1 (tree *tp, int *walk_subtrees,
291                       void *data ATTRIBUTE_UNUSED)
292 {
293   tree t = *tp;
294
295   /* Only need to mark VAR_DECLS; parameters and return results are not
296      eliminated as unused.  */
297   if (TREE_CODE (t) == VAR_DECL)
298     set_is_used (t);
299
300   if (IS_TYPE_OR_DECL_P (t))
301     *walk_subtrees = 0;
302
303   return NULL;
304 }
305
306 /* Mark all VAR_DECLS under *EXPR_P as used, so that they won't be 
307    eliminated during the tree->rtl conversion process.  */
308
309 static inline void
310 mark_all_vars_used (tree *expr_p)
311 {
312   walk_tree (expr_p, mark_all_vars_used_1, NULL, NULL);
313 }
314
315 /* This function looks through the program and uses FLAGS to determine what 
316    SSA versioned variables are given entries in a new partition table.  This
317    new partition map is returned.  */
318
319 var_map
320 create_ssa_var_map (int flags)
321 {
322   block_stmt_iterator bsi;
323   basic_block bb;
324   tree dest, use;
325   tree stmt;
326   var_map map;
327   ssa_op_iter iter;
328 #ifdef ENABLE_CHECKING
329   sbitmap used_in_real_ops;
330   sbitmap used_in_virtual_ops;
331 #endif
332
333   map = init_var_map (num_ssa_names + 1);
334
335 #ifdef ENABLE_CHECKING
336   used_in_real_ops = sbitmap_alloc (num_referenced_vars);
337   sbitmap_zero (used_in_real_ops);
338
339   used_in_virtual_ops = sbitmap_alloc (num_referenced_vars);
340   sbitmap_zero (used_in_virtual_ops);
341 #endif
342
343   if (flags & SSA_VAR_MAP_REF_COUNT)
344     {
345       map->ref_count
346         = (int *)xmalloc (((num_ssa_names + 1) * sizeof (int)));
347       memset (map->ref_count, 0, (num_ssa_names + 1) * sizeof (int));
348     }
349
350   FOR_EACH_BB (bb)
351     {
352       tree phi, arg;
353       for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
354         {
355           int i;
356           register_ssa_partition (map, PHI_RESULT (phi), false);
357           for (i = 0; i < PHI_NUM_ARGS (phi); i++)
358             {
359               arg = PHI_ARG_DEF (phi, i);
360               if (TREE_CODE (arg) == SSA_NAME)
361                 register_ssa_partition (map, arg, true);
362
363               mark_all_vars_used (&PHI_ARG_DEF_TREE (phi, i));
364             }
365         }
366
367       for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
368         {
369           stmt = bsi_stmt (bsi);
370
371           /* Register USE and DEF operands in each statement.  */
372           FOR_EACH_SSA_TREE_OPERAND (use , stmt, iter, SSA_OP_USE)
373             {
374               register_ssa_partition (map, use, true);
375
376 #ifdef ENABLE_CHECKING
377               SET_BIT (used_in_real_ops, var_ann (SSA_NAME_VAR (use))->uid);
378 #endif
379             }
380
381           FOR_EACH_SSA_TREE_OPERAND (dest, stmt, iter, SSA_OP_DEF)
382             {
383               register_ssa_partition (map, dest, false);
384
385 #ifdef ENABLE_CHECKING
386               SET_BIT (used_in_real_ops, var_ann (SSA_NAME_VAR (dest))->uid);
387 #endif
388             }
389
390 #ifdef ENABLE_CHECKING
391           /* Validate that virtual ops don't get used in funny ways.  */
392           FOR_EACH_SSA_TREE_OPERAND (use, stmt, iter, 
393                                      SSA_OP_VIRTUAL_USES | SSA_OP_VMUSTDEF)
394             {
395               SET_BIT (used_in_virtual_ops, var_ann (SSA_NAME_VAR (use))->uid);
396             }
397
398 #endif /* ENABLE_CHECKING */
399
400           mark_all_vars_used (bsi_stmt_ptr (bsi));
401         }
402     }
403
404 #if defined ENABLE_CHECKING
405   {
406     unsigned i;
407     sbitmap both = sbitmap_alloc (num_referenced_vars);
408     sbitmap_a_and_b (both, used_in_real_ops, used_in_virtual_ops);
409     if (sbitmap_first_set_bit (both) >= 0)
410       {
411         EXECUTE_IF_SET_IN_SBITMAP (both, 0, i,
412           fprintf (stderr, "Variable %s used in real and virtual operands\n",
413                    get_name (referenced_var (i))));
414         internal_error ("SSA corruption");
415       }
416
417     sbitmap_free (used_in_real_ops);
418     sbitmap_free (used_in_virtual_ops);
419     sbitmap_free (both);
420   }
421 #endif
422
423   return map;
424 }
425
426
427 /* Allocate and return a new live range information object base on MAP.  */
428
429 static tree_live_info_p
430 new_tree_live_info (var_map map)
431 {
432   tree_live_info_p live;
433   unsigned x;
434
435   live = (tree_live_info_p) xmalloc (sizeof (struct tree_live_info_d));
436   live->map = map;
437   live->num_blocks = last_basic_block;
438
439   live->global = BITMAP_ALLOC (NULL);
440
441   live->livein = (bitmap *)xmalloc (num_var_partitions (map) * sizeof (bitmap));
442   for (x = 0; x < num_var_partitions (map); x++)
443     live->livein[x] = BITMAP_ALLOC (NULL);
444
445   /* liveout is deferred until it is actually requested.  */
446   live->liveout = NULL;
447   return live;
448 }
449
450
451 /* Free storage for live range info object LIVE.  */
452
453 void 
454 delete_tree_live_info (tree_live_info_p live)
455 {
456   int x;
457   if (live->liveout)
458     {
459       for (x = live->num_blocks - 1; x >= 0; x--)
460         BITMAP_FREE (live->liveout[x]);
461       free (live->liveout);
462     }
463   if (live->livein)
464     {
465       for (x = num_var_partitions (live->map) - 1; x >= 0; x--)
466         BITMAP_FREE (live->livein[x]);
467       free (live->livein);
468     }
469   if (live->global)
470     BITMAP_FREE (live->global);
471   
472   free (live);
473 }
474
475
476 /* Using LIVE, fill in all the live-on-entry blocks between the defs and uses 
477    for partition I.  STACK is a varray used for temporary memory which is 
478    passed in rather than being allocated on every call.  */
479
480 static void
481 live_worklist (tree_live_info_p live, int *stack, int i)
482 {
483   unsigned b;
484   tree var;
485   basic_block def_bb = NULL;
486   edge e;
487   var_map map = live->map;
488   edge_iterator ei;
489   bitmap_iterator bi;
490   int *tos = stack;
491
492   var = partition_to_var (map, i);
493   if (SSA_NAME_DEF_STMT (var))
494     def_bb = bb_for_stmt (SSA_NAME_DEF_STMT (var));
495
496   EXECUTE_IF_SET_IN_BITMAP (live->livein[i], 0, b, bi)
497     {
498       *tos++ = b;
499     }
500
501   while (tos != stack)
502     {
503       b = *--tos;
504
505       FOR_EACH_EDGE (e, ei, BASIC_BLOCK (b)->preds)
506         if (e->src != ENTRY_BLOCK_PTR)
507           {
508             /* Its not live on entry to the block its defined in.  */
509             if (e->src == def_bb)
510               continue;
511             if (!bitmap_bit_p (live->livein[i], e->src->index))
512               {
513                 bitmap_set_bit (live->livein[i], e->src->index);
514                 *tos++ = e->src->index;
515               }
516           }
517     }
518 }
519
520
521 /* If VAR is in a partition of MAP, set the bit for that partition in VEC.  */
522
523 static inline void
524 set_if_valid (var_map map, bitmap vec, tree var)
525 {
526   int p = var_to_partition (map, var);
527   if (p != NO_PARTITION)
528     bitmap_set_bit (vec, p);
529 }
530
531
532 /* If VAR is in a partition and it isn't defined in DEF_VEC, set the livein and 
533    global bit for it in the LIVE object.  BB is the block being processed.  */
534
535 static inline void
536 add_livein_if_notdef (tree_live_info_p live, bitmap def_vec,
537                       tree var, basic_block bb)
538 {
539   int p = var_to_partition (live->map, var);
540   if (p == NO_PARTITION || bb == ENTRY_BLOCK_PTR)
541     return;
542   if (!bitmap_bit_p (def_vec, p))
543     {
544       bitmap_set_bit (live->livein[p], bb->index);
545       bitmap_set_bit (live->global, p);
546     }
547 }
548
549
550 /* Given partition map MAP, calculate all the live on entry bitmaps for 
551    each basic block.  Return a live info object.  */
552
553 tree_live_info_p 
554 calculate_live_on_entry (var_map map)
555 {
556   tree_live_info_p live;
557   unsigned i;
558   basic_block bb;
559   bitmap saw_def;
560   tree phi, var, stmt;
561   tree op;
562   edge e;
563   int *stack;
564   block_stmt_iterator bsi;
565   ssa_op_iter iter;
566   bitmap_iterator bi;
567 #ifdef ENABLE_CHECKING
568   int num;
569   edge_iterator ei;
570 #endif
571
572   saw_def = BITMAP_ALLOC (NULL);
573
574   live = new_tree_live_info (map);
575
576   FOR_EACH_BB (bb)
577     {
578       bitmap_clear (saw_def);
579
580       for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
581         {
582           for (i = 0; i < (unsigned)PHI_NUM_ARGS (phi); i++)
583             {
584               var = PHI_ARG_DEF (phi, i);
585               if (!phi_ssa_name_p (var))
586                 continue;
587               stmt = SSA_NAME_DEF_STMT (var);
588               e = EDGE_PRED (bb, i);
589
590               /* Any uses in PHIs which either don't have def's or are not
591                  defined in the block from which the def comes, will be live
592                  on entry to that block.  */
593               if (!stmt || e->src != bb_for_stmt (stmt))
594                 add_livein_if_notdef (live, saw_def, var, e->src);
595             }
596         }
597
598       /* Don't mark PHI results as defined until all the PHI nodes have
599          been processed. If the PHI sequence is:
600             a_3 = PHI <a_1, a_2>
601             b_3 = PHI <b_1, a_3>
602          The a_3 referred to in b_3's PHI node is the one incoming on the
603          edge, *not* the PHI node just seen.  */
604
605       for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
606         {
607           var = PHI_RESULT (phi);
608           set_if_valid (map, saw_def, var);
609         }
610
611       for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
612         {
613           stmt = bsi_stmt (bsi);
614
615           FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_USE)
616             {
617               add_livein_if_notdef (live, saw_def, op, bb);
618             }
619
620           FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_DEF)
621             {
622               set_if_valid (map, saw_def, op);
623             }
624         }
625     }
626
627   stack = xmalloc (sizeof (int) * last_basic_block);
628   EXECUTE_IF_SET_IN_BITMAP (live->global, 0, i, bi)
629     {
630       live_worklist (live, stack, i);
631     }
632   free (stack);
633
634 #ifdef ENABLE_CHECKING
635    /* Check for live on entry partitions and report those with a DEF in
636       the program. This will typically mean an optimization has done
637       something wrong.  */
638
639   bb = ENTRY_BLOCK_PTR;
640   num = 0;
641   FOR_EACH_EDGE (e, ei, bb->succs)
642     {
643       int entry_block = e->dest->index;
644       if (e->dest == EXIT_BLOCK_PTR)
645         continue;
646       for (i = 0; i < (unsigned)num_var_partitions (map); i++)
647         {
648           basic_block tmp;
649           tree d;
650           var = partition_to_var (map, i);
651           stmt = SSA_NAME_DEF_STMT (var);
652           tmp = bb_for_stmt (stmt);
653           d = default_def (SSA_NAME_VAR (var));
654
655           if (bitmap_bit_p (live_entry_blocks (live, i), entry_block))
656             {
657               if (!IS_EMPTY_STMT (stmt))
658                 {
659                   num++;
660                   print_generic_expr (stderr, var, TDF_SLIM);
661                   fprintf (stderr, " is defined ");
662                   if (tmp)
663                     fprintf (stderr, " in BB%d, ", tmp->index);
664                   fprintf (stderr, "by:\n");
665                   print_generic_expr (stderr, stmt, TDF_SLIM);
666                   fprintf (stderr, "\nIt is also live-on-entry to entry BB %d", 
667                            entry_block);
668                   fprintf (stderr, " So it appears to have multiple defs.\n");
669                 }
670               else
671                 {
672                   if (d != var)
673                     {
674                       num++;
675                       print_generic_expr (stderr, var, TDF_SLIM);
676                       fprintf (stderr, " is live-on-entry to BB%d ",entry_block);
677                       if (d)
678                         {
679                           fprintf (stderr, " but is not the default def of ");
680                           print_generic_expr (stderr, d, TDF_SLIM);
681                           fprintf (stderr, "\n");
682                         }
683                       else
684                         fprintf (stderr, " and there is no default def.\n");
685                     }
686                 }
687             }
688           else
689             if (d == var)
690               {
691                 /* The only way this var shouldn't be marked live on entry is 
692                    if it occurs in a PHI argument of the block.  */
693                 int z, ok = 0;
694                 for (phi = phi_nodes (e->dest); 
695                      phi && !ok; 
696                      phi = PHI_CHAIN (phi))
697                   {
698                     for (z = 0; z < PHI_NUM_ARGS (phi); z++)
699                       if (var == PHI_ARG_DEF (phi, z))
700                         {
701                           ok = 1;
702                           break;
703                         }
704                   }
705                 if (ok)
706                   continue;
707                 num++;
708                 print_generic_expr (stderr, var, TDF_SLIM);
709                 fprintf (stderr, " is not marked live-on-entry to entry BB%d ", 
710                          entry_block);
711                 fprintf (stderr, "but it is a default def so it should be.\n");
712               }
713         }
714     }
715   gcc_assert (num <= 0);
716 #endif
717
718   BITMAP_FREE (saw_def);
719
720   return live;
721 }
722
723
724 /* Calculate the live on exit vectors based on the entry info in LIVEINFO.  */
725
726 void
727 calculate_live_on_exit (tree_live_info_p liveinfo)
728 {
729   unsigned b;
730   unsigned i, x;
731   bitmap *on_exit;
732   basic_block bb;
733   edge e;
734   tree t, phi;
735   bitmap on_entry;
736   var_map map = liveinfo->map;
737
738   on_exit = (bitmap *)xmalloc (last_basic_block * sizeof (bitmap));
739   for (x = 0; x < (unsigned)last_basic_block; x++)
740     on_exit[x] = BITMAP_ALLOC (NULL);
741
742   /* Set all the live-on-exit bits for uses in PHIs.  */
743   FOR_EACH_BB (bb)
744     {
745       for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
746         for (i = 0; i < (unsigned)PHI_NUM_ARGS (phi); i++)
747           { 
748             t = PHI_ARG_DEF (phi, i);
749             e = PHI_ARG_EDGE (phi, i);
750             if (!phi_ssa_name_p (t) || e->src == ENTRY_BLOCK_PTR)
751               continue;
752             set_if_valid (map, on_exit[e->src->index], t);
753           }
754     }
755
756   /* Set live on exit for all predecessors of live on entry's.  */
757   for (i = 0; i < num_var_partitions (map); i++)
758     {
759       bitmap_iterator bi;
760
761       on_entry = live_entry_blocks (liveinfo, i);
762       EXECUTE_IF_SET_IN_BITMAP (on_entry, 0, b, bi)
763         {
764           edge_iterator ei;
765           FOR_EACH_EDGE (e, ei, BASIC_BLOCK (b)->preds)
766             if (e->src != ENTRY_BLOCK_PTR)
767               bitmap_set_bit (on_exit[e->src->index], i);
768         }
769     }
770
771   liveinfo->liveout = on_exit;
772 }
773
774
775 /* Initialize a tree_partition_associator object using MAP.  */
776
777 static tpa_p
778 tpa_init (var_map map)
779 {
780   tpa_p tpa;
781   int num_partitions = num_var_partitions (map);
782   int x;
783
784   if (num_partitions == 0)
785     return NULL;
786
787   tpa = (tpa_p) xmalloc (sizeof (struct tree_partition_associator_d));
788   tpa->num_trees = 0;
789   tpa->uncompressed_num = -1;
790   tpa->map = map;
791   tpa->next_partition = (int *)xmalloc (num_partitions * sizeof (int));
792   memset (tpa->next_partition, TPA_NONE, num_partitions * sizeof (int));
793
794   tpa->partition_to_tree_map = (int *)xmalloc (num_partitions * sizeof (int));
795   memset (tpa->partition_to_tree_map, TPA_NONE, num_partitions * sizeof (int));
796
797   x = MAX (40, (num_partitions / 20));
798   VARRAY_TREE_INIT (tpa->trees, x, "trees");
799   VARRAY_INT_INIT (tpa->first_partition, x, "first_partition");
800
801   return tpa;
802
803 }
804
805
806 /* Remove PARTITION_INDEX from TREE_INDEX's list in the tpa structure TPA.  */
807
808 void
809 tpa_remove_partition (tpa_p tpa, int tree_index, int partition_index)
810 {
811   int i;
812
813   i = tpa_first_partition (tpa, tree_index);
814   if (i == partition_index)
815     {
816       VARRAY_INT (tpa->first_partition, tree_index) = tpa->next_partition[i];
817     }
818   else
819     {
820       for ( ; i != TPA_NONE; i = tpa_next_partition (tpa, i))
821         {
822           if (tpa->next_partition[i] == partition_index)
823             {
824               tpa->next_partition[i] = tpa->next_partition[partition_index];
825               break;
826             }
827         }
828     }
829 }
830
831
832 /* Free the memory used by tree_partition_associator object TPA.  */
833
834 void
835 tpa_delete (tpa_p tpa)
836 {
837   if (!tpa)
838     return;
839
840   free (tpa->partition_to_tree_map);
841   free (tpa->next_partition);
842   free (tpa);
843 }
844
845
846 /* This function will remove any tree entries from TPA which have only a single
847    element.  This will help keep the size of the conflict graph down.  The 
848    function returns the number of remaining tree lists.  */
849
850 int 
851 tpa_compact (tpa_p tpa)
852 {
853   int last, x, y, first, swap_i;
854   tree swap_t;
855
856   /* Find the last list which has more than 1 partition.  */
857   for (last = tpa->num_trees - 1; last > 0; last--)
858     {
859       first = tpa_first_partition (tpa, last);
860       if (tpa_next_partition (tpa, first) != NO_PARTITION)
861         break;
862     }
863
864   x = 0;
865   while (x < last)
866     {
867       first = tpa_first_partition (tpa, x);
868
869       /* If there is not more than one partition, swap with the current end
870          of the tree list.  */
871       if (tpa_next_partition (tpa, first) == NO_PARTITION)
872         {
873           swap_t = VARRAY_TREE (tpa->trees, last);
874           swap_i = VARRAY_INT (tpa->first_partition, last);
875
876           /* Update the last entry. Since it is known to only have one
877              partition, there is nothing else to update.  */
878           VARRAY_TREE (tpa->trees, last) = VARRAY_TREE (tpa->trees, x);
879           VARRAY_INT (tpa->first_partition, last) 
880             = VARRAY_INT (tpa->first_partition, x);
881           tpa->partition_to_tree_map[tpa_first_partition (tpa, last)] = last;
882
883           /* Since this list is known to have more than one partition, update
884              the list owner entries.  */
885           VARRAY_TREE (tpa->trees, x) = swap_t;
886           VARRAY_INT (tpa->first_partition, x) = swap_i;
887           for (y = tpa_first_partition (tpa, x); 
888                y != NO_PARTITION; 
889                y = tpa_next_partition (tpa, y))
890             tpa->partition_to_tree_map[y] = x;
891
892           /* Ensure last is a list with more than one partition.  */
893           last--;
894           for (; last > x; last--)
895             {
896               first = tpa_first_partition (tpa, last);
897               if (tpa_next_partition (tpa, first) != NO_PARTITION)
898                 break;
899             }
900         }
901       x++;
902     }
903
904   first = tpa_first_partition (tpa, x);
905   if (tpa_next_partition (tpa, first) != NO_PARTITION)
906     x++;
907   tpa->uncompressed_num = tpa->num_trees;
908   tpa->num_trees = x;
909   return last;
910 }
911
912
913 /* Initialize a root_var object with SSA partitions from MAP which are based 
914    on each root variable.  */
915
916 root_var_p
917 root_var_init (var_map map)
918 {
919   root_var_p rv;
920   int num_partitions = num_var_partitions (map);
921   int x, p;
922   tree t;
923   var_ann_t ann;
924   sbitmap seen;
925
926   rv = tpa_init (map);
927   if (!rv)
928     return NULL;
929
930   seen = sbitmap_alloc (num_partitions);
931   sbitmap_zero (seen);
932
933   /* Start at the end and work towards the front. This will provide a list
934      that is ordered from smallest to largest.  */
935   for (x = num_partitions - 1; x >= 0; x--)
936     {
937       t = partition_to_var (map, x);
938
939       /* The var map may not be compacted yet, so check for NULL.  */
940       if (!t) 
941         continue;
942
943       p = var_to_partition (map, t);
944
945       gcc_assert (p != NO_PARTITION);
946
947       /* Make sure we only put coalesced partitions into the list once.  */
948       if (TEST_BIT (seen, p))
949         continue;
950       SET_BIT (seen, p);
951       if (TREE_CODE (t) == SSA_NAME)
952         t = SSA_NAME_VAR (t);
953       ann = var_ann (t);
954       if (ann->root_var_processed)
955         {
956           rv->next_partition[p] = VARRAY_INT (rv->first_partition, 
957                                               VAR_ANN_ROOT_INDEX (ann));
958           VARRAY_INT (rv->first_partition, VAR_ANN_ROOT_INDEX (ann)) = p;
959         }
960       else
961         {
962           ann->root_var_processed = 1;
963           VAR_ANN_ROOT_INDEX (ann) = rv->num_trees++;
964           VARRAY_PUSH_TREE (rv->trees, t);
965           VARRAY_PUSH_INT (rv->first_partition, p);
966         }
967       rv->partition_to_tree_map[p] = VAR_ANN_ROOT_INDEX (ann);
968     }
969
970   /* Reset the out_of_ssa_tag flag on each variable for later use.  */
971   for (x = 0; x < rv->num_trees; x++)
972     {
973       t = VARRAY_TREE (rv->trees, x);
974       var_ann (t)->root_var_processed = 0;
975     }
976
977   sbitmap_free (seen);
978   return rv;
979 }
980
981
982 /* Initialize a type_var structure which associates all the partitions in MAP 
983    of the same type to the type node's index.  Volatiles are ignored.  */
984
985 type_var_p
986 type_var_init (var_map map)
987 {
988   type_var_p tv;
989   int x, y, p;
990   int num_partitions = num_var_partitions (map);
991   tree t;
992   sbitmap seen;
993
994   seen = sbitmap_alloc (num_partitions);
995   sbitmap_zero (seen);
996
997   tv = tpa_init (map);
998   if (!tv)
999     return NULL;
1000
1001   for (x = num_partitions - 1; x >= 0; x--)
1002     {
1003       t = partition_to_var (map, x);
1004
1005       /* Disallow coalescing of these types of variables.  */
1006       if (!t
1007           || TREE_THIS_VOLATILE (t)
1008           || TREE_CODE (t) == RESULT_DECL
1009           || TREE_CODE (t) == PARM_DECL 
1010           || (DECL_P (t)
1011               && (DECL_REGISTER (t)
1012                   || !DECL_IGNORED_P (t)
1013                   || DECL_RTL_SET_P (t))))
1014         continue;
1015
1016       p = var_to_partition (map, t);
1017
1018       gcc_assert (p != NO_PARTITION);
1019
1020       /* If partitions have been coalesced, only add the representative 
1021          for the partition to the list once.  */
1022       if (TEST_BIT (seen, p))
1023         continue;
1024       SET_BIT (seen, p);
1025       t = TREE_TYPE (t);
1026
1027       /* Find the list for this type.  */
1028       for (y = 0; y < tv->num_trees; y++)
1029         if (t == VARRAY_TREE (tv->trees, y))
1030           break;
1031       if (y == tv->num_trees)
1032         {
1033           tv->num_trees++;
1034           VARRAY_PUSH_TREE (tv->trees, t);
1035           VARRAY_PUSH_INT (tv->first_partition, p);
1036         }
1037       else
1038         {
1039           tv->next_partition[p] = VARRAY_INT (tv->first_partition, y);
1040           VARRAY_INT (tv->first_partition, y) = p;
1041         }
1042       tv->partition_to_tree_map[p] = y;
1043     }
1044   sbitmap_free (seen);
1045   return tv;
1046 }
1047
1048
1049 /* Create a new coalesce list object from MAP and return it.  */
1050
1051 coalesce_list_p 
1052 create_coalesce_list (var_map map)
1053 {
1054   coalesce_list_p list;
1055
1056   list = (coalesce_list_p) xmalloc (sizeof (struct coalesce_list_d));
1057
1058   list->map = map;
1059   list->add_mode = true;
1060   list->list = (partition_pair_p *) xcalloc (num_var_partitions (map),
1061                                              sizeof (struct partition_pair_d));
1062   return list;
1063 }
1064
1065
1066 /* Delete coalesce list CL.  */
1067
1068 void 
1069 delete_coalesce_list (coalesce_list_p cl)
1070 {
1071   free (cl->list);
1072   free (cl);
1073 }
1074
1075
1076 /* Find a matching coalesce pair object in CL for partitions P1 and P2.  If 
1077    one isn't found, return NULL if CREATE is false, otherwise create a new 
1078    coalesce pair object and return it.  */
1079
1080 static partition_pair_p
1081 find_partition_pair (coalesce_list_p cl, int p1, int p2, bool create)
1082 {
1083   partition_pair_p node, tmp;
1084   int s;
1085     
1086   /* Normalize so that p1 is the smaller value.  */
1087   if (p2 < p1)
1088     {
1089       s = p1;
1090       p1 = p2;
1091       p2 = s;
1092     }
1093   
1094   tmp = NULL;
1095
1096   /* The list is sorted such that if we find a value greater than p2,
1097      p2 is not in the list.  */
1098   for (node = cl->list[p1]; node; node = node->next)
1099     {
1100       if (node->second_partition == p2)
1101         return node;
1102       else
1103         if (node->second_partition > p2)
1104           break;
1105      tmp = node;
1106     }
1107
1108   if (!create)
1109     return NULL;
1110
1111   node = (partition_pair_p) xmalloc (sizeof (struct partition_pair_d));
1112   node->first_partition = p1;
1113   node->second_partition = p2;
1114   node->cost = 0;
1115     
1116   if (tmp != NULL)
1117     {
1118       node->next = tmp->next;
1119       tmp->next = node;
1120     }
1121   else
1122     {
1123       /* This is now the first node in the list.  */
1124       node->next = cl->list[p1];
1125       cl->list[p1] = node;
1126     }
1127
1128   return node;
1129 }
1130
1131
1132 /* Add a potential coalesce between P1 and P2 in CL with a cost of VALUE.  */
1133
1134 void 
1135 add_coalesce (coalesce_list_p cl, int p1, int p2, int value)
1136 {
1137   partition_pair_p node;
1138
1139   gcc_assert (cl->add_mode);
1140
1141   if (p1 == p2)
1142     return;
1143
1144   node = find_partition_pair (cl, p1, p2, true);
1145
1146   node->cost += value;
1147 }
1148
1149
1150 /* Comparison function to allow qsort to sort P1 and P2 in descending order.  */
1151
1152 static
1153 int compare_pairs (const void *p1, const void *p2)
1154 {
1155   return (*(partition_pair_p *)p2)->cost - (*(partition_pair_p *)p1)->cost;
1156 }
1157
1158
1159 /* Prepare CL for removal of preferred pairs.  When finished, list element 
1160    0 has all the coalesce pairs, sorted in order from most important coalesce 
1161    to least important.  */
1162
1163 void
1164 sort_coalesce_list (coalesce_list_p cl)
1165 {
1166   unsigned x, num, count;
1167   partition_pair_p chain, p;
1168   partition_pair_p  *list;
1169
1170   gcc_assert (cl->add_mode);
1171
1172   cl->add_mode = false;
1173
1174   /* Compact the array of lists to a single list, and count the elements.  */
1175   num = 0;
1176   chain = NULL;
1177   for (x = 0; x < num_var_partitions (cl->map); x++)
1178     if (cl->list[x] != NULL)
1179       {
1180         for (p = cl->list[x]; p->next != NULL; p = p->next)
1181           num++;
1182         num++;
1183         p->next = chain;
1184         chain = cl->list[x];
1185         cl->list[x] = NULL;
1186       }
1187
1188   /* Only call qsort if there are more than 2 items.  */
1189   if (num > 2)
1190     {
1191       list = xmalloc (sizeof (partition_pair_p) * num);
1192       count = 0;
1193       for (p = chain; p != NULL; p = p->next)
1194         list[count++] = p;
1195
1196       gcc_assert (count == num);
1197         
1198       qsort (list, count, sizeof (partition_pair_p), compare_pairs);
1199
1200       p = list[0];
1201       for (x = 1; x < num; x++)
1202         {
1203           p->next = list[x];
1204           p = list[x];
1205         }
1206       p->next = NULL;
1207       cl->list[0] = list[0];
1208       free (list);
1209     }
1210   else
1211     {
1212       cl->list[0] = chain;
1213       if (num == 2)
1214         {
1215           /* Simply swap the two elements if they are in the wrong order.  */
1216           if (chain->cost < chain->next->cost)
1217             {
1218               cl->list[0] = chain->next;
1219               cl->list[0]->next = chain;
1220               chain->next = NULL;
1221             }
1222         }
1223     }
1224 }
1225
1226
1227 /* Retrieve the best remaining pair to coalesce from CL.  Returns the 2 
1228    partitions via P1 and P2.  Their calculated cost is returned by the function.
1229    NO_BEST_COALESCE is returned if the coalesce list is empty.  */
1230
1231 static int
1232 pop_best_coalesce (coalesce_list_p cl, int *p1, int *p2)
1233 {
1234   partition_pair_p node;
1235   int ret;
1236
1237   gcc_assert (!cl->add_mode);
1238
1239   node = cl->list[0];
1240   if (!node)
1241     return NO_BEST_COALESCE;
1242
1243   cl->list[0] = node->next;
1244
1245   *p1 = node->first_partition;
1246   *p2 = node->second_partition;
1247   ret = node->cost;
1248   free (node);
1249
1250   return ret;
1251 }
1252
1253
1254 /* If variable VAR is in a partition in MAP, add a conflict in GRAPH between 
1255    VAR and any other live partitions in VEC which are associated via TPA.  
1256    Reset the live bit in VEC.  */
1257
1258 static inline void 
1259 add_conflicts_if_valid (tpa_p tpa, conflict_graph graph,
1260                         var_map map, bitmap vec, tree var)
1261
1262   int p, y, first;
1263   p = var_to_partition (map, var);
1264   if (p != NO_PARTITION)
1265     { 
1266       bitmap_clear_bit (vec, p);
1267       first = tpa_find_tree (tpa, p);
1268       /* If find returns nothing, this object isn't interesting.  */
1269       if (first == TPA_NONE)
1270         return;
1271       /* Only add interferences between objects in the same list.  */
1272       for (y = tpa_first_partition (tpa, first);
1273            y != TPA_NONE;
1274            y = tpa_next_partition (tpa, y))
1275         {
1276           if (bitmap_bit_p (vec, y))
1277             conflict_graph_add (graph, p, y);
1278         }
1279     }
1280 }
1281
1282 DEF_VEC_P(int);
1283 DEF_VEC_ALLOC_P(int,heap);
1284
1285 /* Return a conflict graph for the information contained in LIVE_INFO.  Only
1286    conflicts between items in the same TPA list are added.  If optional 
1287    coalesce list CL is passed in, any copies encountered are added.  */
1288
1289 conflict_graph
1290 build_tree_conflict_graph (tree_live_info_p liveinfo, tpa_p tpa, 
1291                            coalesce_list_p cl)
1292 {
1293   conflict_graph graph;
1294   var_map map;
1295   bitmap live;
1296   unsigned x, y, i;
1297   basic_block bb;
1298   int *partition_link, *tpa_nodes;
1299   VEC(int,heap) *tpa_to_clear;
1300   unsigned l;
1301   ssa_op_iter iter;
1302   bitmap_iterator bi;
1303
1304   map = live_var_map (liveinfo);
1305   graph = conflict_graph_new (num_var_partitions (map));
1306
1307   if (tpa_num_trees (tpa) == 0)
1308     return graph;
1309
1310   live = BITMAP_ALLOC (NULL);
1311
1312   partition_link = xcalloc (num_var_partitions (map) + 1, sizeof (int));
1313   tpa_nodes = xcalloc (tpa_num_trees (tpa), sizeof (int));
1314   tpa_to_clear = VEC_alloc (int, heap, 50);
1315
1316   FOR_EACH_BB (bb)
1317     {
1318       block_stmt_iterator bsi;
1319       tree phi;
1320       int idx;
1321
1322       /* Start with live on exit temporaries.  */
1323       bitmap_copy (live, live_on_exit (liveinfo, bb));
1324
1325       for (bsi = bsi_last (bb); !bsi_end_p (bsi); bsi_prev (&bsi))
1326         {
1327           bool is_a_copy = false;
1328           tree stmt = bsi_stmt (bsi);
1329
1330           /* A copy between 2 partitions does not introduce an interference 
1331              by itself.  If they did, you would never be able to coalesce 
1332              two things which are copied.  If the two variables really do 
1333              conflict, they will conflict elsewhere in the program.  
1334              
1335              This is handled specially here since we may also be interested 
1336              in copies between real variables and SSA_NAME variables.  We may
1337              be interested in trying to coalesce SSA_NAME variables with
1338              root variables in some cases.  */
1339
1340           if (TREE_CODE (stmt) == MODIFY_EXPR)
1341             {
1342               tree lhs = TREE_OPERAND (stmt, 0);
1343               tree rhs = TREE_OPERAND (stmt, 1);
1344               int p1, p2;
1345               int bit;
1346
1347               if (DECL_P (lhs) || TREE_CODE (lhs) == SSA_NAME)
1348                 p1 = var_to_partition (map, lhs);
1349               else 
1350                 p1 = NO_PARTITION;
1351
1352               if (DECL_P (rhs) || TREE_CODE (rhs) == SSA_NAME)
1353                 p2 = var_to_partition (map, rhs);
1354               else 
1355                 p2 = NO_PARTITION;
1356
1357               if (p1 != NO_PARTITION && p2 != NO_PARTITION)
1358                 {
1359                   is_a_copy = true;
1360                   bit = bitmap_bit_p (live, p2);
1361                   /* If the RHS is live, make it not live while we add
1362                      the conflicts, then make it live again.  */
1363                   if (bit)
1364                     bitmap_clear_bit (live, p2);
1365                   add_conflicts_if_valid (tpa, graph, map, live, lhs);
1366                   if (bit)
1367                     bitmap_set_bit (live, p2);
1368                   if (cl)
1369                     add_coalesce (cl, p1, p2, 1);
1370                   set_if_valid (map, live, rhs);
1371                 }
1372             }
1373
1374           if (!is_a_copy)
1375             {
1376               tree var;
1377               FOR_EACH_SSA_TREE_OPERAND (var, stmt, iter, SSA_OP_DEF)
1378                 {
1379                   add_conflicts_if_valid (tpa, graph, map, live, var);
1380                 }
1381
1382               FOR_EACH_SSA_TREE_OPERAND (var, stmt, iter, SSA_OP_USE)
1383                 {
1384                   set_if_valid (map, live, var);
1385                 }
1386             }
1387         }
1388
1389       /* If result of a PHI is unused, then the loops over the statements
1390          will not record any conflicts.  However, since the PHI node is 
1391          going to be translated out of SSA form we must record a conflict
1392          between the result of the PHI and any variables with are live. 
1393          Otherwise the out-of-ssa translation may create incorrect code.  */
1394       for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
1395         {
1396           tree result = PHI_RESULT (phi);
1397           int p = var_to_partition (map, result);
1398
1399           if (p != NO_PARTITION && ! bitmap_bit_p (live, p))
1400             add_conflicts_if_valid (tpa, graph, map, live, result);
1401         }
1402
1403       /* Anything which is still live at this point interferes.  
1404          In order to implement this efficiently, only conflicts between
1405          partitions which have the same TPA root need be added.
1406          TPA roots which have been seen are tracked in 'tpa_nodes'.  A nonzero
1407          entry points to an index into 'partition_link', which then indexes 
1408          into itself forming a linked list of partitions sharing a tpa root 
1409          which have been seen as live up to this point.  Since partitions start
1410          at index zero, all entries in partition_link are (partition + 1).
1411
1412          Conflicts are added between the current partition and any already seen.
1413          tpa_clear contains all the tpa_roots processed, and these are the only
1414          entries which need to be zero'd out for a clean restart.  */
1415
1416       EXECUTE_IF_SET_IN_BITMAP (live, 0, x, bi)
1417         {
1418           i = tpa_find_tree (tpa, x);
1419           if (i != (unsigned)TPA_NONE)
1420             {
1421               int start = tpa_nodes[i];
1422               /* If start is 0, a new root reference list is being started.
1423                  Register it to be cleared.  */
1424               if (!start)
1425                 VEC_safe_push (int, heap, tpa_to_clear, i);
1426
1427               /* Add interferences to other tpa members seen.  */
1428               for (y = start; y != 0; y = partition_link[y])
1429                 conflict_graph_add (graph, x, y - 1);
1430               tpa_nodes[i] = x + 1;
1431               partition_link[x + 1] = start;
1432             }
1433         }
1434
1435         /* Now clear the used tpa root references.  */
1436         for (l = 0; VEC_iterate (int, tpa_to_clear, l, idx); l++)
1437           tpa_nodes[idx] = 0;
1438         VEC_truncate (int, tpa_to_clear, 0);
1439     }
1440
1441   free (tpa_nodes);
1442   free (partition_link);
1443   VEC_free (int, heap, tpa_to_clear);
1444   BITMAP_FREE (live);
1445   return graph;
1446 }
1447
1448
1449 /* This routine will attempt to coalesce the elements in TPA subject to the
1450    conflicts found in GRAPH.  If optional coalesce_list CL is provided, 
1451    only coalesces specified within the coalesce list are attempted.  Otherwise 
1452    an attempt is made to coalesce as many partitions within each TPA grouping 
1453    as possible.  If DEBUG is provided, debug output will be sent there.  */
1454
1455 void
1456 coalesce_tpa_members (tpa_p tpa, conflict_graph graph, var_map map, 
1457                       coalesce_list_p cl, FILE *debug)
1458 {
1459   int x, y, z, w;
1460   tree var, tmp;
1461
1462   /* Attempt to coalesce any items in a coalesce list.  */
1463   if (cl)
1464     {
1465       while (pop_best_coalesce (cl, &x, &y) != NO_BEST_COALESCE)
1466         {
1467           if (debug)
1468             {
1469               fprintf (debug, "Coalesce list: (%d)", x);
1470               print_generic_expr (debug, partition_to_var (map, x), TDF_SLIM);
1471               fprintf (debug, " & (%d)", y);
1472               print_generic_expr (debug, partition_to_var (map, y), TDF_SLIM);
1473             }
1474
1475           w = tpa_find_tree (tpa, x);
1476           z = tpa_find_tree (tpa, y);
1477           if (w != z || w == TPA_NONE || z == TPA_NONE)
1478             {
1479               if (debug)
1480                 {
1481                   if (w != z)
1482                     fprintf (debug, ": Fail, Non-matching TPA's\n");
1483                   if (w == TPA_NONE)
1484                     fprintf (debug, ": Fail %d non TPA.\n", x);
1485                   else
1486                     fprintf (debug, ": Fail %d non TPA.\n", y);
1487                 }
1488               continue;
1489             }
1490           var = partition_to_var (map, x);
1491           tmp = partition_to_var (map, y);
1492           x = var_to_partition (map, var);
1493           y = var_to_partition (map, tmp);
1494           if (debug)
1495             fprintf (debug, " [map: %d, %d] ", x, y);
1496           if (x == y)
1497             {
1498               if (debug)
1499                 fprintf (debug, ": Already Coalesced.\n");
1500               continue;
1501             }
1502           if (!conflict_graph_conflict_p (graph, x, y))
1503             {
1504               z = var_union (map, var, tmp);
1505               if (z == NO_PARTITION)
1506                 {
1507                   if (debug)
1508                     fprintf (debug, ": Unable to perform partition union.\n");
1509                   continue;
1510                 }
1511
1512               /* z is the new combined partition. We need to remove the other
1513                  partition from the list. Set x to be that other partition.  */
1514               if (z == x)
1515                 {
1516                   conflict_graph_merge_regs (graph, x, y);
1517                   w = tpa_find_tree (tpa, y);
1518                   tpa_remove_partition (tpa, w, y);
1519                 }
1520               else
1521                 {
1522                   conflict_graph_merge_regs (graph, y, x);
1523                   w = tpa_find_tree (tpa, x);
1524                   tpa_remove_partition (tpa, w, x);
1525                 }
1526
1527               if (debug)
1528                 fprintf (debug, ": Success -> %d\n", z);
1529             }
1530           else
1531             if (debug)
1532               fprintf (debug, ": Fail due to conflict\n");
1533         }
1534       /* If using a coalesce list, don't try to coalesce anything else.  */
1535       return;
1536     }
1537
1538   for (x = 0; x < tpa_num_trees (tpa); x++)
1539     {
1540       while (tpa_first_partition (tpa, x) != TPA_NONE)
1541         {
1542           int p1, p2;
1543           /* Coalesce first partition with anything that doesn't conflict.  */
1544           y = tpa_first_partition (tpa, x);
1545           tpa_remove_partition (tpa, x, y);
1546
1547           var = partition_to_var (map, y);
1548           /* p1 is the partition representative to which y belongs.  */
1549           p1 = var_to_partition (map, var);
1550           
1551           for (z = tpa_next_partition (tpa, y); 
1552                z != TPA_NONE; 
1553                z = tpa_next_partition (tpa, z))
1554             {
1555               tmp = partition_to_var (map, z);
1556               /* p2 is the partition representative to which z belongs.  */
1557               p2 = var_to_partition (map, tmp);
1558               if (debug)
1559                 {
1560                   fprintf (debug, "Coalesce : ");
1561                   print_generic_expr (debug, var, TDF_SLIM);
1562                   fprintf (debug, " &");
1563                   print_generic_expr (debug, tmp, TDF_SLIM);
1564                   fprintf (debug, "  (%d ,%d)", p1, p2);
1565                 }
1566
1567               /* If partitions are already merged, don't check for conflict.  */
1568               if (tmp == var)
1569                 {
1570                   tpa_remove_partition (tpa, x, z);
1571                   if (debug)
1572                     fprintf (debug, ": Already coalesced\n");
1573                 }
1574               else
1575                 if (!conflict_graph_conflict_p (graph, p1, p2))
1576                   {
1577                     int v;
1578                     if (tpa_find_tree (tpa, y) == TPA_NONE 
1579                         || tpa_find_tree (tpa, z) == TPA_NONE)
1580                       {
1581                         if (debug)
1582                           fprintf (debug, ": Fail non-TPA member\n");
1583                         continue;
1584                       }
1585                     if ((v = var_union (map, var, tmp)) == NO_PARTITION)
1586                       {
1587                         if (debug)
1588                           fprintf (debug, ": Fail cannot combine partitions\n");
1589                         continue;
1590                       }
1591
1592                     tpa_remove_partition (tpa, x, z);
1593                     if (v == p1)
1594                       conflict_graph_merge_regs (graph, v, z);
1595                     else
1596                       {
1597                         /* Update the first partition's representative.  */
1598                         conflict_graph_merge_regs (graph, v, y);
1599                         p1 = v;
1600                       }
1601
1602                     /* The root variable of the partition may be changed
1603                        now.  */
1604                     var = partition_to_var (map, p1);
1605
1606                     if (debug)
1607                       fprintf (debug, ": Success -> %d\n", v);
1608                   }
1609                 else
1610                   if (debug)
1611                     fprintf (debug, ": Fail, Conflict\n");
1612             }
1613         }
1614     }
1615 }
1616
1617
1618 /* Send debug info for coalesce list CL to file F.  */
1619
1620 void 
1621 dump_coalesce_list (FILE *f, coalesce_list_p cl)
1622 {
1623   partition_pair_p node;
1624   int x, num;
1625   tree var;
1626
1627   if (cl->add_mode)
1628     {
1629       fprintf (f, "Coalesce List:\n");
1630       num = num_var_partitions (cl->map);
1631       for (x = 0; x < num; x++)
1632         {
1633           node = cl->list[x];
1634           if (node)
1635             {
1636               fprintf (f, "[");
1637               print_generic_expr (f, partition_to_var (cl->map, x), TDF_SLIM);
1638               fprintf (f, "] - ");
1639               for ( ; node; node = node->next)
1640                 {
1641                   var = partition_to_var (cl->map, node->second_partition);
1642                   print_generic_expr (f, var, TDF_SLIM);
1643                   fprintf (f, "(%1d), ", node->cost);
1644                 }
1645               fprintf (f, "\n");
1646             }
1647         }
1648     }
1649   else
1650     {
1651       fprintf (f, "Sorted Coalesce list:\n");
1652       for (node = cl->list[0]; node; node = node->next)
1653         {
1654           fprintf (f, "(%d) ", node->cost);
1655           var = partition_to_var (cl->map, node->first_partition);
1656           print_generic_expr (f, var, TDF_SLIM);
1657           fprintf (f, " : ");
1658           var = partition_to_var (cl->map, node->second_partition);
1659           print_generic_expr (f, var, TDF_SLIM);
1660           fprintf (f, "\n");
1661         }
1662     }
1663 }
1664
1665
1666 /* Output tree_partition_associator object TPA to file F..  */
1667
1668 void
1669 tpa_dump (FILE *f, tpa_p tpa)
1670 {
1671   int x, i;
1672
1673   if (!tpa)
1674     return;
1675
1676   for (x = 0; x < tpa_num_trees (tpa); x++)
1677     {
1678       print_generic_expr (f, tpa_tree (tpa, x), TDF_SLIM);
1679       fprintf (f, " : (");
1680       for (i = tpa_first_partition (tpa, x); 
1681            i != TPA_NONE;
1682            i = tpa_next_partition (tpa, i))
1683         {
1684           fprintf (f, "(%d)",i);
1685           print_generic_expr (f, partition_to_var (tpa->map, i), TDF_SLIM);
1686           fprintf (f, " ");
1687
1688 #ifdef ENABLE_CHECKING
1689           if (tpa_find_tree (tpa, i) != x)
1690             fprintf (f, "**find tree incorrectly set** ");
1691 #endif
1692
1693         }
1694       fprintf (f, ")\n");
1695     }
1696   fflush (f);
1697 }
1698
1699
1700 /* Output partition map MAP to file F.  */
1701
1702 void
1703 dump_var_map (FILE *f, var_map map)
1704 {
1705   int t;
1706   unsigned x, y;
1707   int p;
1708
1709   fprintf (f, "\nPartition map \n\n");
1710
1711   for (x = 0; x < map->num_partitions; x++)
1712     {
1713       if (map->compact_to_partition != NULL)
1714         p = map->compact_to_partition[x];
1715       else
1716         p = x;
1717
1718       if (map->partition_to_var[p] == NULL_TREE)
1719         continue;
1720
1721       t = 0;
1722       for (y = 1; y < num_ssa_names; y++)
1723         {
1724           p = partition_find (map->var_partition, y);
1725           if (map->partition_to_compact)
1726             p = map->partition_to_compact[p];
1727           if (p == (int)x)
1728             {
1729               if (t++ == 0)
1730                 {
1731                   fprintf(f, "Partition %d (", x);
1732                   print_generic_expr (f, partition_to_var (map, p), TDF_SLIM);
1733                   fprintf (f, " - ");
1734                 }
1735               fprintf (f, "%d ", y);
1736             }
1737         }
1738       if (t != 0)
1739         fprintf (f, ")\n");
1740     }
1741   fprintf (f, "\n");
1742 }
1743
1744
1745 /* Output live range info LIVE to file F, controlled by FLAG.  */
1746
1747 void
1748 dump_live_info (FILE *f, tree_live_info_p live, int flag)
1749 {
1750   basic_block bb;
1751   unsigned i;
1752   var_map map = live->map;
1753   bitmap_iterator bi;
1754
1755   if ((flag & LIVEDUMP_ENTRY) && live->livein)
1756     {
1757       FOR_EACH_BB (bb)
1758         {
1759           fprintf (f, "\nLive on entry to BB%d : ", bb->index);
1760           for (i = 0; i < num_var_partitions (map); i++)
1761             {
1762               if (bitmap_bit_p (live_entry_blocks (live, i), bb->index))
1763                 {
1764                   print_generic_expr (f, partition_to_var (map, i), TDF_SLIM);
1765                   fprintf (f, "  ");
1766                 }
1767             }
1768           fprintf (f, "\n");
1769         }
1770     }
1771
1772   if ((flag & LIVEDUMP_EXIT) && live->liveout)
1773     {
1774       FOR_EACH_BB (bb)
1775         {
1776           fprintf (f, "\nLive on exit from BB%d : ", bb->index);
1777           EXECUTE_IF_SET_IN_BITMAP (live->liveout[bb->index], 0, i, bi)
1778             {
1779               print_generic_expr (f, partition_to_var (map, i), TDF_SLIM);
1780               fprintf (f, "  ");
1781             }
1782           fprintf (f, "\n");
1783         }
1784     }
1785 }
1786
1787 #ifdef ENABLE_CHECKING
1788 void
1789 register_ssa_partition_check (tree ssa_var)
1790 {
1791   gcc_assert (TREE_CODE (ssa_var) == SSA_NAME);
1792   if (!is_gimple_reg (SSA_NAME_VAR (ssa_var)))
1793     {
1794       fprintf (stderr, "Illegally registering a virtual SSA name :");
1795       print_generic_expr (stderr, ssa_var, TDF_SLIM);
1796       fprintf (stderr, " in the SSA->Normal phase.\n");
1797       internal_error ("SSA corruption");
1798     }
1799 }
1800 #endif