xref: /openbsd/gnu/gcc/gcc/tree-ssa-live.c (revision 404b540a)
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
init_var_map(int size)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
delete_var_map(var_map map)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
var_union(var_map map,tree var1,tree var2)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
compact_var_map(var_map map,int flags)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
change_partition_var(var_map map,tree var,int part)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
mark_all_vars_used_1(tree * tp,int * walk_subtrees,void * data ATTRIBUTE_UNUSED)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
mark_all_vars_used(tree * expr_p)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
remove_unused_locals(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
create_ssa_var_map(int flags)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
new_tree_live_info(var_map map)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
delete_tree_live_info(tree_live_info_p live)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
live_worklist(tree_live_info_p live,int * stack,int i)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
set_if_valid(var_map map,bitmap vec,tree var)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
add_livein_if_notdef(tree_live_info_p live,bitmap def_vec,tree var,basic_block bb)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
calculate_live_on_entry(var_map map)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
calculate_live_on_exit(tree_live_info_p liveinfo)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
tpa_init(var_map map)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
tpa_remove_partition(tpa_p tpa,int tree_index,int partition_index)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
tpa_delete(tpa_p tpa)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
tpa_compact(tpa_p tpa)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
root_var_init(var_map map)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
type_var_init(var_map map)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
create_coalesce_list(var_map map)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
delete_coalesce_list(coalesce_list_p cl)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
find_partition_pair(coalesce_list_p cl,int p1,int p2,bool create)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
coalesce_cost(int frequency,bool hot,bool critical)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
add_coalesce(coalesce_list_p cl,int p1,int p2,int value)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
compare_pairs(const void * p1,const void * p2)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
sort_coalesce_list(coalesce_list_p cl)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
pop_best_coalesce(coalesce_list_p cl,int * p1,int * p2)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
add_conflicts_if_valid(tpa_p tpa,conflict_graph graph,var_map map,bitmap vec,tree var)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
build_tree_conflict_graph(tree_live_info_p liveinfo,tpa_p tpa,coalesce_list_p cl)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
coalesce_tpa_members(tpa_p tpa,conflict_graph graph,var_map map,coalesce_list_p cl,FILE * debug)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
dump_coalesce_list(FILE * f,coalesce_list_p cl)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
tpa_dump(FILE * f,tpa_p tpa)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
dump_var_map(FILE * f,var_map map)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
dump_live_info(FILE * f,tree_live_info_p live,int flag)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
register_ssa_partition_check(tree ssa_var)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
1909