OSDN Git Service

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