OSDN Git Service

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