1/* Liveness for SSA trees.
2   Copyright (C) 2003, 2004, 2005 Free Software Foundation, Inc.
3   Contributed by Andrew MacLeod <amacleod@redhat.com>
4
5This file is part of GCC.
6
7GCC is free software; you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
9the Free Software Foundation; either version 2, or (at your option)
10any later version.
11
12GCC is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
18along with GCC; see the file COPYING.  If not, write to
19the Free Software Foundation, 51 Franklin Street, Fifth Floor,
20Boston, 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
43static void live_worklist (tree_live_info_p, int *, int);
44static tree_live_info_p new_tree_live_info (var_map);
45static inline void set_if_valid (var_map, bitmap, tree);
46static inline void add_livein_if_notdef (tree_live_info_p, bitmap,
47					 tree, basic_block);
48static inline void register_ssa_partition (var_map, tree, bool);
49static inline void add_conflicts_if_valid (tpa_p, conflict_graph,
50					   var_map, bitmap, tree);
51static 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
67var_map
68init_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
89void
90delete_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
108int
109var_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
185void
186compact_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
276void
277change_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
290static inline void mark_all_vars_used (tree *);
291
292/* Helper function for mark_all_vars_used, called via walk_tree.  */
293
294static tree
295mark_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
328static inline void
329mark_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
337void
338remove_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
404var_map
405create_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
515static tree_live_info_p
516new_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
539void
540delete_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
566static void
567live_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
609static inline void
610set_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
621static inline void
622add_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
639tree_live_info_p
640calculate_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
812void
813calculate_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
863static tpa_p
864tpa_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
894void
895tpa_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
921void
922tpa_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
939int
940tpa_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
1006root_var_p
1007root_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
1075type_var_p
1076type_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
1141coalesce_list_p
1142create_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
1158void
1159delete_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
1170static partition_pair_p
1171find_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.  */
1223int
1224coalesce_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
1242void
1243add_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
1261static
1262int 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
1272void
1273sort_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
1340static int
1341pop_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
1367static inline void
1368add_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
1395conflict_graph
1396build_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
1563void
1564coalesce_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
1728void
1729dump_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
1776void
1777tpa_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
1810void
1811dump_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
1855void
1856dump_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
1896void
1897register_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