OSDN Git Service

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