OSDN Git Service

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