1 /* Liveness for SSA trees.
2    Copyright (C) 2003, 2004, 2005, 2007, 2008, 2009, 2010, 2011
3    Free Software Foundation, Inc.
4    Contributed by Andrew MacLeod <amacleod@redhat.com>
5 
6 This file is part of GCC.
7 
8 GCC is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3, or (at your option)
11 any later version.
12 
13 GCC is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 GNU General Public License for more details.
17 
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3.  If not see
20 <http://www.gnu.org/licenses/>.  */
21 
22 #include "config.h"
23 #include "system.h"
24 #include "coretypes.h"
25 #include "tm.h"
26 #include "tree.h"
27 #include "tree-pretty-print.h"
28 #include "gimple-pretty-print.h"
29 #include "bitmap.h"
30 #include "tree-flow.h"
31 #include "tree-dump.h"
32 #include "tree-ssa-live.h"
33 #include "diagnostic-core.h"
34 #include "debug.h"
35 #include "flags.h"
36 #include "gimple.h"
37 
38 #ifdef ENABLE_CHECKING
39 static void  verify_live_on_entry (tree_live_info_p);
40 #endif
41 
42 
43 /* VARMAP maintains a mapping from SSA version number to real variables.
44 
45    All SSA_NAMES are divided into partitions.  Initially each ssa_name is the
46    only member of it's own partition.  Coalescing will attempt to group any
47    ssa_names which occur in a copy or in a PHI node into the same partition.
48 
49    At the end of out-of-ssa, each partition becomes a "real" variable and is
50    rewritten as a compiler variable.
51 
52    The var_map data structure is used to manage these partitions.  It allows
53    partitions to be combined, and determines which partition belongs to what
54    ssa_name or variable, and vice versa.  */
55 
56 
57 /* This routine will initialize the basevar fields of MAP.  */
58 
59 static void
60 var_map_base_init (var_map map)
61 {
62   int x, num_part, num;
63   tree var;
64   var_ann_t ann;
65 
66   num = 0;
67   num_part = num_var_partitions (map);
68 
69   /* If a base table already exists, clear it, otherwise create it.  */
70   if (map->partition_to_base_index != NULL)
71     {
72       free (map->partition_to_base_index);
73       VEC_truncate (tree, map->basevars, 0);
74     }
75   else
76     map->basevars = VEC_alloc (tree, heap, MAX (40, (num_part / 10)));
77 
78   map->partition_to_base_index = (int *) xmalloc (sizeof (int) * num_part);
79 
80   /* Build the base variable list, and point partitions at their bases.  */
81   for (x = 0; x < num_part; x++)
82     {
83       var = partition_to_var (map, x);
84       if (TREE_CODE (var) == SSA_NAME)
85 	 var = SSA_NAME_VAR (var);
86       ann = var_ann (var);
87       /* If base variable hasn't been seen, set it up.  */
88       if (!ann->base_var_processed)
89         {
90 	  ann->base_var_processed = 1;
91 	  VAR_ANN_BASE_INDEX (ann) = num++;
92 	  VEC_safe_push (tree, heap, map->basevars, var);
93 	}
94       map->partition_to_base_index[x] = VAR_ANN_BASE_INDEX (ann);
95     }
96 
97   map->num_basevars = num;
98 
99   /* Now clear the processed bit.  */
100   for (x = 0; x < num; x++)
101     {
102        var = VEC_index (tree, map->basevars, x);
103        var_ann (var)->base_var_processed = 0;
104     }
105 
106 #ifdef ENABLE_CHECKING
107   for (x = 0; x < num_part; x++)
108     {
109       tree var2;
110       var = SSA_NAME_VAR (partition_to_var (map, x));
111       var2 = VEC_index (tree, map->basevars, basevar_index (map, x));
112       gcc_assert (var == var2);
113     }
114 #endif
115 }
116 
117 
118 /* Remove the base table in MAP.  */
119 
120 static void
121 var_map_base_fini (var_map map)
122 {
123   /* Free the basevar info if it is present.  */
124   if (map->partition_to_base_index != NULL)
125     {
126       VEC_free (tree, heap, map->basevars);
127       free (map->partition_to_base_index);
128       map->partition_to_base_index = NULL;
129       map->num_basevars = 0;
130     }
131 }
132 /* Create a variable partition map of SIZE, initialize and return it.  */
133 
134 var_map
135 init_var_map (int size)
136 {
137   var_map map;
138 
139   map = (var_map) xmalloc (sizeof (struct _var_map));
140   map->var_partition = partition_new (size);
141 
142   map->partition_to_view = NULL;
143   map->view_to_partition = NULL;
144   map->num_partitions = size;
145   map->partition_size = size;
146   map->num_basevars = 0;
147   map->partition_to_base_index = NULL;
148   map->basevars = NULL;
149   return map;
150 }
151 
152 
153 /* Free memory associated with MAP.  */
154 
155 void
156 delete_var_map (var_map map)
157 {
158   var_map_base_fini (map);
159   partition_delete (map->var_partition);
160   free (map->partition_to_view);
161   free (map->view_to_partition);
162   free (map);
163 }
164 
165 
166 /* This function will combine the partitions in MAP for VAR1 and VAR2.  It
167    Returns the partition which represents the new partition.  If the two
168    partitions cannot be combined, NO_PARTITION is returned.  */
169 
170 int
171 var_union (var_map map, tree var1, tree var2)
172 {
173   int p1, p2, p3;
174 
175   gcc_assert (TREE_CODE (var1) == SSA_NAME);
176   gcc_assert (TREE_CODE (var2) == SSA_NAME);
177 
178   /* This is independent of partition_to_view. If partition_to_view is
179      on, then whichever one of these partitions is absorbed will never have a
180      dereference into the partition_to_view array any more.  */
181 
182   p1 = partition_find (map->var_partition, SSA_NAME_VERSION (var1));
183   p2 = partition_find (map->var_partition, SSA_NAME_VERSION (var2));
184 
185   gcc_assert (p1 != NO_PARTITION);
186   gcc_assert (p2 != NO_PARTITION);
187 
188   if (p1 == p2)
189     p3 = p1;
190   else
191     p3 = partition_union (map->var_partition, p1, p2);
192 
193   if (map->partition_to_view)
194     p3 = map->partition_to_view[p3];
195 
196   return p3;
197 }
198 
199 
200 /* Compress the partition numbers in MAP such that they fall in the range
201    0..(num_partitions-1) instead of wherever they turned out during
202    the partitioning exercise.  This removes any references to unused
203    partitions, thereby allowing bitmaps and other vectors to be much
204    denser.
205 
206    This is implemented such that compaction doesn't affect partitioning.
207    Ie., once partitions are created and possibly merged, running one
208    or more different kind of compaction will not affect the partitions
209    themselves.  Their index might change, but all the same variables will
210    still be members of the same partition group.  This allows work on reduced
211    sets, and no loss of information when a larger set is later desired.
212 
213    In particular, coalescing can work on partitions which have 2 or more
214    definitions, and then 'recompact' later to include all the single
215    definitions for assignment to program variables.  */
216 
217 
218 /* Set MAP back to the initial state of having no partition view.  Return a
219    bitmap which has a bit set for each partition number which is in use in the
220    varmap.  */
221 
222 static bitmap
223 partition_view_init (var_map map)
224 {
225   bitmap used;
226   int tmp;
227   unsigned int x;
228 
229   used = BITMAP_ALLOC (NULL);
230 
231   /* Already in a view? Abandon the old one.  */
232   if (map->partition_to_view)
233     {
234       free (map->partition_to_view);
235       map->partition_to_view = NULL;
236     }
237   if (map->view_to_partition)
238     {
239       free (map->view_to_partition);
240       map->view_to_partition = NULL;
241     }
242 
243   /* Find out which partitions are actually referenced.  */
244   for (x = 0; x < map->partition_size; x++)
245     {
246       tmp = partition_find (map->var_partition, x);
247       if (ssa_name (tmp) != NULL_TREE && is_gimple_reg (ssa_name (tmp))
248 	  && (!has_zero_uses (ssa_name (tmp))
249 	      || !SSA_NAME_IS_DEFAULT_DEF (ssa_name (tmp))))
250 	bitmap_set_bit (used, tmp);
251     }
252 
253   map->num_partitions = map->partition_size;
254   return used;
255 }
256 
257 
258 /* This routine will finalize the view data for MAP based on the partitions
259    set in SELECTED.  This is either the same bitmap returned from
260    partition_view_init, or a trimmed down version if some of those partitions
261    were not desired in this view.  SELECTED is freed before returning.  */
262 
263 static void
264 partition_view_fini (var_map map, bitmap selected)
265 {
266   bitmap_iterator bi;
267   unsigned count, i, x, limit;
268 
269   gcc_assert (selected);
270 
271   count = bitmap_count_bits (selected);
272   limit = map->partition_size;
273 
274   /* If its a one-to-one ratio, we don't need any view compaction.  */
275   if (count < limit)
276     {
277       map->partition_to_view = (int *)xmalloc (limit * sizeof (int));
278       memset (map->partition_to_view, 0xff, (limit * sizeof (int)));
279       map->view_to_partition = (int *)xmalloc (count * sizeof (int));
280 
281       i = 0;
282       /* Give each selected partition an index.  */
283       EXECUTE_IF_SET_IN_BITMAP (selected, 0, x, bi)
284 	{
285 	  map->partition_to_view[x] = i;
286 	  map->view_to_partition[i] = x;
287 	  i++;
288 	}
289       gcc_assert (i == count);
290       map->num_partitions = i;
291     }
292 
293   BITMAP_FREE (selected);
294 }
295 
296 
297 /* Create a partition view which includes all the used partitions in MAP.  If
298    WANT_BASES is true, create the base variable map as well.  */
299 
300 extern void
301 partition_view_normal (var_map map, bool want_bases)
302 {
303   bitmap used;
304 
305   used = partition_view_init (map);
306   partition_view_fini (map, used);
307 
308   if (want_bases)
309     var_map_base_init (map);
310   else
311     var_map_base_fini (map);
312 }
313 
314 
315 /* Create a partition view in MAP which includes just partitions which occur in
316    the bitmap ONLY. If WANT_BASES is true, create the base variable map
317    as well.  */
318 
319 extern void
320 partition_view_bitmap (var_map map, bitmap only, bool want_bases)
321 {
322   bitmap used;
323   bitmap new_partitions = BITMAP_ALLOC (NULL);
324   unsigned x, p;
325   bitmap_iterator bi;
326 
327   used = partition_view_init (map);
328   EXECUTE_IF_SET_IN_BITMAP (only, 0, x, bi)
329     {
330       p = partition_find (map->var_partition, x);
331       gcc_assert (bitmap_bit_p (used, p));
332       bitmap_set_bit (new_partitions, p);
333     }
334   partition_view_fini (map, new_partitions);
335 
336   BITMAP_FREE (used);
337   if (want_bases)
338     var_map_base_init (map);
339   else
340     var_map_base_fini (map);
341 }
342 
343 
344 static inline void mark_all_vars_used (tree *, void *data);
345 
346 /* Helper function for mark_all_vars_used, called via walk_tree.  */
347 
348 static tree
349 mark_all_vars_used_1 (tree *tp, int *walk_subtrees, void *data)
350 {
351   tree t = *tp;
352   enum tree_code_class c = TREE_CODE_CLASS (TREE_CODE (t));
353   tree b;
354 
355   if (TREE_CODE (t) == SSA_NAME)
356     t = SSA_NAME_VAR (t);
357 
358   if (IS_EXPR_CODE_CLASS (c)
359       && (b = TREE_BLOCK (t)) != NULL)
360     TREE_USED (b) = true;
361 
362   /* Ignore TMR_OFFSET and TMR_STEP for TARGET_MEM_REFS, as those
363      fields do not contain vars.  */
364   if (TREE_CODE (t) == TARGET_MEM_REF)
365     {
366       mark_all_vars_used (&TMR_BASE (t), data);
367       mark_all_vars_used (&TMR_INDEX (t), data);
368       mark_all_vars_used (&TMR_INDEX2 (t), data);
369       *walk_subtrees = 0;
370       return NULL;
371     }
372 
373   /* Only need to mark VAR_DECLS; parameters and return results are not
374      eliminated as unused.  */
375   if (TREE_CODE (t) == VAR_DECL)
376     {
377       if (data != NULL && bitmap_clear_bit ((bitmap) data, DECL_UID (t))
378 	  && DECL_CONTEXT (t) == current_function_decl)
379 	mark_all_vars_used (&DECL_INITIAL (t), data);
380       set_is_used (t);
381     }
382   /* remove_unused_scope_block_p requires information about labels
383      which are not DECL_IGNORED_P to tell if they might be used in the IL.  */
384   if (TREE_CODE (t) == LABEL_DECL)
385     /* Although the TREE_USED values that the frontend uses would be
386        acceptable (albeit slightly over-conservative) for our purposes,
387        init_vars_expansion clears TREE_USED for LABEL_DECLs too, so we
388        must re-compute it here.  */
389     TREE_USED (t) = 1;
390 
391   if (IS_TYPE_OR_DECL_P (t))
392     *walk_subtrees = 0;
393 
394   return NULL;
395 }
396 
397 /* Mark the scope block SCOPE and its subblocks unused when they can be
398    possibly eliminated if dead.  */
399 
400 static void
401 mark_scope_block_unused (tree scope)
402 {
403   tree t;
404   TREE_USED (scope) = false;
405   if (!(*debug_hooks->ignore_block) (scope))
406     TREE_USED (scope) = true;
407   for (t = BLOCK_SUBBLOCKS (scope); t ; t = BLOCK_CHAIN (t))
408     mark_scope_block_unused (t);
409 }
410 
411 /* Look if the block is dead (by possibly eliminating its dead subblocks)
412    and return true if so.
413    Block is declared dead if:
414      1) No statements are associated with it.
415      2) Declares no live variables
416      3) All subblocks are dead
417 	or there is precisely one subblocks and the block
418 	has same abstract origin as outer block and declares
419 	no variables, so it is pure wrapper.
420    When we are not outputting full debug info, we also eliminate dead variables
421    out of scope blocks to let them to be recycled by GGC and to save copying work
422    done by the inliner.  */
423 
424 static bool
425 remove_unused_scope_block_p (tree scope)
426 {
427   tree *t, *next;
428   bool unused = !TREE_USED (scope);
429   int nsubblocks = 0;
430 
431   for (t = &BLOCK_VARS (scope); *t; t = next)
432     {
433       next = &DECL_CHAIN (*t);
434 
435       /* Debug info of nested function refers to the block of the
436 	 function.  We might stil call it even if all statements
437 	 of function it was nested into was elliminated.
438 
439 	 TODO: We can actually look into cgraph to see if function
440 	 will be output to file.  */
441       if (TREE_CODE (*t) == FUNCTION_DECL)
442 	unused = false;
443 
444       /* If a decl has a value expr, we need to instantiate it
445 	 regardless of debug info generation, to avoid codegen
446 	 differences in memory overlap tests.  update_equiv_regs() may
447 	 indirectly call validate_equiv_mem() to test whether a
448 	 SET_DEST overlaps with others, and if the value expr changes
449 	 by virtual register instantiation, we may get end up with
450 	 different results.  */
451       else if (TREE_CODE (*t) == VAR_DECL && DECL_HAS_VALUE_EXPR_P (*t))
452 	unused = false;
453 
454       /* Remove everything we don't generate debug info for.  */
455       else if (DECL_IGNORED_P (*t))
456 	{
457 	  *t = DECL_CHAIN (*t);
458 	  next = t;
459 	}
460 
461       /* When we are outputting debug info, we usually want to output
462 	 info about optimized-out variables in the scope blocks.
463 	 Exception are the scope blocks not containing any instructions
464 	 at all so user can't get into the scopes at first place.  */
465       else if (var_ann (*t) != NULL && is_used_p (*t))
466 	unused = false;
467       else if (TREE_CODE (*t) == LABEL_DECL && TREE_USED (*t))
468 	/* For labels that are still used in the IL, the decision to
469 	   preserve them must not depend DEBUG_INFO_LEVEL, otherwise we
470 	   risk having different ordering in debug vs.  non-debug builds
471 	   during inlining or versioning.
472 	   A label appearing here (we have already checked DECL_IGNORED_P)
473 	   should not be used in the IL unless it has been explicitly used
474 	   before, so we use TREE_USED as an approximation.  */
475 	/* In principle, we should do the same here as for the debug case
476 	   below, however, when debugging, there might be additional nested
477 	   levels that keep an upper level with a label live, so we have to
478 	   force this block to be considered used, too.  */
479 	unused = false;
480 
481       /* When we are not doing full debug info, we however can keep around
482 	 only the used variables for cfgexpand's memory packing saving quite
483 	 a lot of memory.
484 
485 	 For sake of -g3, we keep around those vars but we don't count this as
486 	 use of block, so innermost block with no used vars and no instructions
487 	 can be considered dead.  We only want to keep around blocks user can
488 	 breakpoint into and ask about value of optimized out variables.
489 
490 	 Similarly we need to keep around types at least until all
491 	 variables of all nested blocks are gone.  We track no
492 	 information on whether given type is used or not, so we have
493 	 to keep them even when not emitting debug information,
494 	 otherwise we may end up remapping variables and their (local)
495 	 types in different orders depending on whether debug
496 	 information is being generated.  */
497 
498       else if (TREE_CODE (*t) == TYPE_DECL
499 	       || debug_info_level == DINFO_LEVEL_NORMAL
500 	       || debug_info_level == DINFO_LEVEL_VERBOSE)
501 	;
502       else
503 	{
504 	  *t = DECL_CHAIN (*t);
505 	  next = t;
506 	}
507     }
508 
509   for (t = &BLOCK_SUBBLOCKS (scope); *t ;)
510     if (remove_unused_scope_block_p (*t))
511       {
512 	if (BLOCK_SUBBLOCKS (*t))
513 	  {
514 	    tree next = BLOCK_CHAIN (*t);
515 	    tree supercontext = BLOCK_SUPERCONTEXT (*t);
516 
517 	    *t = BLOCK_SUBBLOCKS (*t);
518 	    while (BLOCK_CHAIN (*t))
519 	      {
520 	        BLOCK_SUPERCONTEXT (*t) = supercontext;
521 	        t = &BLOCK_CHAIN (*t);
522 	      }
523 	    BLOCK_CHAIN (*t) = next;
524 	    BLOCK_SUPERCONTEXT (*t) = supercontext;
525 	    t = &BLOCK_CHAIN (*t);
526 	    nsubblocks ++;
527 	  }
528 	else
529 	  *t = BLOCK_CHAIN (*t);
530       }
531     else
532       {
533         t = &BLOCK_CHAIN (*t);
534 	nsubblocks ++;
535       }
536 
537 
538    if (!unused)
539      ;
540    /* Outer scope is always used.  */
541    else if (!BLOCK_SUPERCONTEXT (scope)
542             || TREE_CODE (BLOCK_SUPERCONTEXT (scope)) == FUNCTION_DECL)
543      unused = false;
544    /* Innermost blocks with no live variables nor statements can be always
545       eliminated.  */
546    else if (!nsubblocks)
547      ;
548    /* For terse debug info we can eliminate info on unused variables.  */
549    else if (debug_info_level == DINFO_LEVEL_NONE
550 	    || debug_info_level == DINFO_LEVEL_TERSE)
551      {
552        /* Even for -g0/-g1 don't prune outer scopes from artificial
553 	  functions, otherwise diagnostics using tree_nonartificial_location
554 	  will not be emitted properly.  */
555        if (inlined_function_outer_scope_p (scope))
556 	 {
557 	   tree ao = scope;
558 
559 	   while (ao
560 		  && TREE_CODE (ao) == BLOCK
561 		  && BLOCK_ABSTRACT_ORIGIN (ao) != ao)
562 	     ao = BLOCK_ABSTRACT_ORIGIN (ao);
563 	   if (ao
564 	       && TREE_CODE (ao) == FUNCTION_DECL
565 	       && DECL_DECLARED_INLINE_P (ao)
566 	       && lookup_attribute ("artificial", DECL_ATTRIBUTES (ao)))
567 	     unused = false;
568 	 }
569      }
570    else if (BLOCK_VARS (scope) || BLOCK_NUM_NONLOCALIZED_VARS (scope))
571      unused = false;
572    /* See if this block is important for representation of inlined function.
573       Inlined functions are always represented by block with
574       block_ultimate_origin being set to FUNCTION_DECL and DECL_SOURCE_LOCATION
575       set...  */
576    else if (inlined_function_outer_scope_p (scope))
577      unused = false;
578    else
579    /* Verfify that only blocks with source location set
580       are entry points to the inlined functions.  */
581      gcc_assert (BLOCK_SOURCE_LOCATION (scope) == UNKNOWN_LOCATION);
582 
583    TREE_USED (scope) = !unused;
584    return unused;
585 }
586 
587 /* Mark all VAR_DECLS under *EXPR_P as used, so that they won't be
588    eliminated during the tree->rtl conversion process.  */
589 
590 static inline void
591 mark_all_vars_used (tree *expr_p, void *data)
592 {
593   walk_tree (expr_p, mark_all_vars_used_1, data, NULL);
594 }
595 
596 
597 /* Dump scope blocks starting at SCOPE to FILE.  INDENT is the
598    indentation level and FLAGS is as in print_generic_expr.  */
599 
600 static void
601 dump_scope_block (FILE *file, int indent, tree scope, int flags)
602 {
603   tree var, t;
604   unsigned int i;
605 
606   fprintf (file, "\n%*s{ Scope block #%i%s%s",indent, "" , BLOCK_NUMBER (scope),
607   	   TREE_USED (scope) ? "" : " (unused)",
608 	   BLOCK_ABSTRACT (scope) ? " (abstract)": "");
609   if (BLOCK_SOURCE_LOCATION (scope) != UNKNOWN_LOCATION)
610     {
611       expanded_location s = expand_location (BLOCK_SOURCE_LOCATION (scope));
612       fprintf (file, " %s:%i", s.file, s.line);
613     }
614   if (BLOCK_ABSTRACT_ORIGIN (scope))
615     {
616       tree origin = block_ultimate_origin (scope);
617       if (origin)
618 	{
619 	  fprintf (file, " Originating from :");
620 	  if (DECL_P (origin))
621 	    print_generic_decl (file, origin, flags);
622 	  else
623 	    fprintf (file, "#%i", BLOCK_NUMBER (origin));
624 	}
625     }
626   fprintf (file, " \n");
627   for (var = BLOCK_VARS (scope); var; var = DECL_CHAIN (var))
628     {
629       bool used = false;
630 
631       if (var_ann (var))
632 	used = is_used_p (var);
633 
634       fprintf (file, "%*s", indent, "");
635       print_generic_decl (file, var, flags);
636       fprintf (file, "%s\n", used ? "" : " (unused)");
637     }
638   for (i = 0; i < BLOCK_NUM_NONLOCALIZED_VARS (scope); i++)
639     {
640       fprintf (file, "%*s",indent, "");
641       print_generic_decl (file, BLOCK_NONLOCALIZED_VAR (scope, i),
642       			  flags);
643       fprintf (file, " (nonlocalized)\n");
644     }
645   for (t = BLOCK_SUBBLOCKS (scope); t ; t = BLOCK_CHAIN (t))
646     dump_scope_block (file, indent + 2, t, flags);
647   fprintf (file, "\n%*s}\n",indent, "");
648 }
649 
650 /* Dump the tree of lexical scopes starting at SCOPE to stderr.  FLAGS
651    is as in print_generic_expr.  */
652 
653 DEBUG_FUNCTION void
654 debug_scope_block (tree scope, int flags)
655 {
656   dump_scope_block (stderr, 0, scope, flags);
657 }
658 
659 
660 /* Dump the tree of lexical scopes of current_function_decl to FILE.
661    FLAGS is as in print_generic_expr.  */
662 
663 void
664 dump_scope_blocks (FILE *file, int flags)
665 {
666   dump_scope_block (file, 0, DECL_INITIAL (current_function_decl), flags);
667 }
668 
669 
670 /* Dump the tree of lexical scopes of current_function_decl to stderr.
671    FLAGS is as in print_generic_expr.  */
672 
673 DEBUG_FUNCTION void
674 debug_scope_blocks (int flags)
675 {
676   dump_scope_blocks (stderr, flags);
677 }
678 
679 /* Remove local variables that are not referenced in the IL.  */
680 
681 void
682 remove_unused_locals (void)
683 {
684   basic_block bb;
685   tree var, t;
686   referenced_var_iterator rvi;
687   bitmap global_unused_vars = NULL;
688   unsigned srcidx, dstidx, num;
689   bool have_local_clobbers = false;
690 
691   /* Removing declarations from lexical blocks when not optimizing is
692      not only a waste of time, it actually causes differences in stack
693      layout.  */
694   if (!optimize)
695     return;
696 
697   timevar_push (TV_REMOVE_UNUSED);
698 
699   mark_scope_block_unused (DECL_INITIAL (current_function_decl));
700 
701   /* Assume all locals are unused.  */
702   FOR_EACH_REFERENCED_VAR (cfun, t, rvi)
703     clear_is_used (t);
704 
705   /* Walk the CFG marking all referenced symbols.  */
706   FOR_EACH_BB (bb)
707     {
708       gimple_stmt_iterator gsi;
709       size_t i;
710       edge_iterator ei;
711       edge e;
712 
713       /* Walk the statements.  */
714       for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
715 	{
716 	  gimple stmt = gsi_stmt (gsi);
717 	  tree b = gimple_block (stmt);
718 
719 	  if (is_gimple_debug (stmt))
720 	    continue;
721 
722 	  if (gimple_clobber_p (stmt))
723 	    {
724 	      have_local_clobbers = true;
725 	      continue;
726 	    }
727 
728 	  if (b)
729 	    TREE_USED (b) = true;
730 
731 	  for (i = 0; i < gimple_num_ops (stmt); i++)
732 	    mark_all_vars_used (gimple_op_ptr (gsi_stmt (gsi), i), NULL);
733 	}
734 
735       for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
736         {
737           use_operand_p arg_p;
738           ssa_op_iter i;
739 	  tree def;
740 	  gimple phi = gsi_stmt (gsi);
741 
742 	  /* No point processing globals.  */
743 	  if (is_global_var (SSA_NAME_VAR (gimple_phi_result (phi))))
744 	    continue;
745 
746 	  def = gimple_phi_result (phi);
747 	  mark_all_vars_used (&def, NULL);
748 
749           FOR_EACH_PHI_ARG (arg_p, phi, i, SSA_OP_ALL_USES)
750             {
751 	      tree arg = USE_FROM_PTR (arg_p);
752 	      mark_all_vars_used (&arg, NULL);
753             }
754         }
755 
756       FOR_EACH_EDGE (e, ei, bb->succs)
757 	if (e->goto_locus)
758 	  TREE_USED (e->goto_block) = true;
759     }
760 
761   /* We do a two-pass approach about the out-of-scope clobbers.  We want
762      to remove them if they are the only references to a local variable,
763      but we want to retain them when there's any other.  So the first pass
764      ignores them, and the second pass (if there were any) tries to remove
765      them.  */
766   if (have_local_clobbers)
767     FOR_EACH_BB (bb)
768       {
769 	gimple_stmt_iterator gsi;
770 
771 	for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi);)
772 	  {
773 	    gimple stmt = gsi_stmt (gsi);
774 	    tree b = gimple_block (stmt);
775 
776 	    if (gimple_clobber_p (stmt))
777 	      {
778 		tree lhs = gimple_assign_lhs (stmt);
779 		lhs = get_base_address (lhs);
780 		if (TREE_CODE (lhs) == SSA_NAME)
781 		  lhs = SSA_NAME_VAR (lhs);
782 		if (DECL_P (lhs) && (!var_ann (lhs) || !is_used_p (lhs)))
783 		  {
784 		    unlink_stmt_vdef (stmt);
785 		    gsi_remove (&gsi, true);
786 		    release_defs (stmt);
787 		    continue;
788 		  }
789 		if (b)
790 		  TREE_USED (b) = true;
791 	      }
792 	    gsi_next (&gsi);
793 	  }
794       }
795 
796   cfun->has_local_explicit_reg_vars = false;
797 
798   /* Remove unmarked local vars from local_decls.  */
799   num = VEC_length (tree, cfun->local_decls);
800   for (srcidx = 0, dstidx = 0; srcidx < num; srcidx++)
801     {
802       var = VEC_index (tree, cfun->local_decls, srcidx);
803       if (TREE_CODE (var) != FUNCTION_DECL
804 	  && (!var_ann (var)
805 	      || !is_used_p (var)))
806 	{
807 	  if (is_global_var (var))
808 	    {
809 	      if (global_unused_vars == NULL)
810 		global_unused_vars = BITMAP_ALLOC (NULL);
811 	      bitmap_set_bit (global_unused_vars, DECL_UID (var));
812 	    }
813 	  else
814 	    continue;
815 	}
816       else if (TREE_CODE (var) == VAR_DECL
817 	       && DECL_HARD_REGISTER (var)
818 	       && !is_global_var (var))
819 	cfun->has_local_explicit_reg_vars = true;
820 
821       if (srcidx != dstidx)
822 	VEC_replace (tree, cfun->local_decls, dstidx, var);
823       dstidx++;
824     }
825   if (dstidx != num)
826     VEC_truncate (tree, cfun->local_decls, dstidx);
827 
828   /* Remove unmarked global vars from local_decls.  */
829   if (global_unused_vars != NULL)
830     {
831       tree var;
832       unsigned ix;
833       FOR_EACH_LOCAL_DECL (cfun, ix, var)
834 	if (TREE_CODE (var) == VAR_DECL
835 	    && is_global_var (var)
836 	    && var_ann (var) != NULL
837 	    && is_used_p (var)
838 	    && DECL_CONTEXT (var) == current_function_decl)
839 	  mark_all_vars_used (&DECL_INITIAL (var), global_unused_vars);
840 
841       num = VEC_length (tree, cfun->local_decls);
842       for (srcidx = 0, dstidx = 0; srcidx < num; srcidx++)
843 	{
844 	  var = VEC_index (tree, cfun->local_decls, srcidx);
845 	  if (TREE_CODE (var) == VAR_DECL
846 	      && is_global_var (var)
847 	      && bitmap_bit_p (global_unused_vars, DECL_UID (var)))
848 	    continue;
849 
850 	  if (srcidx != dstidx)
851 	    VEC_replace (tree, cfun->local_decls, dstidx, var);
852 	  dstidx++;
853 	}
854       if (dstidx != num)
855 	VEC_truncate (tree, cfun->local_decls, dstidx);
856       BITMAP_FREE (global_unused_vars);
857     }
858 
859   /* Remove unused variables from REFERENCED_VARs.  */
860   FOR_EACH_REFERENCED_VAR (cfun, t, rvi)
861     if (!is_global_var (t)
862 	&& TREE_CODE (t) != PARM_DECL
863 	&& TREE_CODE (t) != RESULT_DECL
864 	&& !is_used_p (t))
865       remove_referenced_var (t);
866   remove_unused_scope_block_p (DECL_INITIAL (current_function_decl));
867   if (dump_file && (dump_flags & TDF_DETAILS))
868     {
869       fprintf (dump_file, "Scope blocks after cleanups:\n");
870       dump_scope_blocks (dump_file, dump_flags);
871     }
872 
873   timevar_pop (TV_REMOVE_UNUSED);
874 }
875 
876 
877 /* Allocate and return a new live range information object base on MAP.  */
878 
879 static tree_live_info_p
880 new_tree_live_info (var_map map)
881 {
882   tree_live_info_p live;
883   unsigned x;
884 
885   live = (tree_live_info_p) xmalloc (sizeof (struct tree_live_info_d));
886   live->map = map;
887   live->num_blocks = last_basic_block;
888 
889   live->livein = (bitmap *)xmalloc (last_basic_block * sizeof (bitmap));
890   for (x = 0; x < (unsigned)last_basic_block; x++)
891     live->livein[x] = BITMAP_ALLOC (NULL);
892 
893   live->liveout = (bitmap *)xmalloc (last_basic_block * sizeof (bitmap));
894   for (x = 0; x < (unsigned)last_basic_block; x++)
895     live->liveout[x] = BITMAP_ALLOC (NULL);
896 
897   live->work_stack = XNEWVEC (int, last_basic_block);
898   live->stack_top = live->work_stack;
899 
900   live->global = BITMAP_ALLOC (NULL);
901   return live;
902 }
903 
904 
905 /* Free storage for live range info object LIVE.  */
906 
907 void
908 delete_tree_live_info (tree_live_info_p live)
909 {
910   int x;
911 
912   BITMAP_FREE (live->global);
913   free (live->work_stack);
914 
915   for (x = live->num_blocks - 1; x >= 0; x--)
916     BITMAP_FREE (live->liveout[x]);
917   free (live->liveout);
918 
919   for (x = live->num_blocks - 1; x >= 0; x--)
920     BITMAP_FREE (live->livein[x]);
921   free (live->livein);
922 
923   free (live);
924 }
925 
926 
927 /* Visit basic block BB and propagate any required live on entry bits from
928    LIVE into the predecessors.  VISITED is the bitmap of visited blocks.
929    TMP is a temporary work bitmap which is passed in to avoid reallocating
930    it each time.  */
931 
932 static void
933 loe_visit_block (tree_live_info_p live, basic_block bb, sbitmap visited,
934 		 bitmap tmp)
935 {
936   edge e;
937   bool change;
938   edge_iterator ei;
939   basic_block pred_bb;
940   bitmap loe;
941   gcc_assert (!TEST_BIT (visited, bb->index));
942 
943   SET_BIT (visited, bb->index);
944   loe = live_on_entry (live, bb);
945 
946   FOR_EACH_EDGE (e, ei, bb->preds)
947     {
948       pred_bb = e->src;
949       if (pred_bb == ENTRY_BLOCK_PTR)
950 	continue;
951       /* TMP is variables live-on-entry from BB that aren't defined in the
952 	 predecessor block.  This should be the live on entry vars to pred.
953 	 Note that liveout is the DEFs in a block while live on entry is
954 	 being calculated.  */
955       bitmap_and_compl (tmp, loe, live->liveout[pred_bb->index]);
956 
957       /* Add these bits to live-on-entry for the pred. if there are any
958 	 changes, and pred_bb has been visited already, add it to the
959 	 revisit stack.  */
960       change = bitmap_ior_into (live_on_entry (live, pred_bb), tmp);
961       if (TEST_BIT (visited, pred_bb->index) && change)
962 	{
963 	  RESET_BIT (visited, pred_bb->index);
964 	  *(live->stack_top)++ = pred_bb->index;
965 	}
966     }
967 }
968 
969 
970 /* Using LIVE, fill in all the live-on-entry blocks between the defs and uses
971    of all the variables.  */
972 
973 static void
974 live_worklist (tree_live_info_p live)
975 {
976   unsigned b;
977   basic_block bb;
978   sbitmap visited = sbitmap_alloc (last_basic_block + 1);
979   bitmap tmp = BITMAP_ALLOC (NULL);
980 
981   sbitmap_zero (visited);
982 
983   /* Visit all the blocks in reverse order and propagate live on entry values
984      into the predecessors blocks.  */
985   FOR_EACH_BB_REVERSE (bb)
986     loe_visit_block (live, bb, visited, tmp);
987 
988   /* Process any blocks which require further iteration.  */
989   while (live->stack_top != live->work_stack)
990     {
991       b = *--(live->stack_top);
992       loe_visit_block (live, BASIC_BLOCK (b), visited, tmp);
993     }
994 
995   BITMAP_FREE (tmp);
996   sbitmap_free (visited);
997 }
998 
999 
1000 /* Calculate the initial live on entry vector for SSA_NAME using immediate_use
1001    links.  Set the live on entry fields in LIVE.  Def's are marked temporarily
1002    in the liveout vector.  */
1003 
1004 static void
1005 set_var_live_on_entry (tree ssa_name, tree_live_info_p live)
1006 {
1007   int p;
1008   gimple stmt;
1009   use_operand_p use;
1010   basic_block def_bb = NULL;
1011   imm_use_iterator imm_iter;
1012   bool global = false;
1013 
1014   p = var_to_partition (live->map, ssa_name);
1015   if (p == NO_PARTITION)
1016     return;
1017 
1018   stmt = SSA_NAME_DEF_STMT (ssa_name);
1019   if (stmt)
1020     {
1021       def_bb = gimple_bb (stmt);
1022       /* Mark defs in liveout bitmap temporarily.  */
1023       if (def_bb)
1024 	bitmap_set_bit (live->liveout[def_bb->index], p);
1025     }
1026   else
1027     def_bb = ENTRY_BLOCK_PTR;
1028 
1029   /* Visit each use of SSA_NAME and if it isn't in the same block as the def,
1030      add it to the list of live on entry blocks.  */
1031   FOR_EACH_IMM_USE_FAST (use, imm_iter, ssa_name)
1032     {
1033       gimple use_stmt = USE_STMT (use);
1034       basic_block add_block = NULL;
1035 
1036       if (gimple_code (use_stmt) == GIMPLE_PHI)
1037         {
1038 	  /* Uses in PHI's are considered to be live at exit of the SRC block
1039 	     as this is where a copy would be inserted.  Check to see if it is
1040 	     defined in that block, or whether its live on entry.  */
1041 	  int index = PHI_ARG_INDEX_FROM_USE (use);
1042 	  edge e = gimple_phi_arg_edge (use_stmt, index);
1043 	  if (e->src != ENTRY_BLOCK_PTR)
1044 	    {
1045 	      if (e->src != def_bb)
1046 		add_block = e->src;
1047 	    }
1048 	}
1049       else if (is_gimple_debug (use_stmt))
1050 	continue;
1051       else
1052         {
1053 	  /* If its not defined in this block, its live on entry.  */
1054 	  basic_block use_bb = gimple_bb (use_stmt);
1055 	  if (use_bb != def_bb)
1056 	    add_block = use_bb;
1057 	}
1058 
1059       /* If there was a live on entry use, set the bit.  */
1060       if (add_block)
1061         {
1062 	  global = true;
1063 	  bitmap_set_bit (live->livein[add_block->index], p);
1064 	}
1065     }
1066 
1067   /* If SSA_NAME is live on entry to at least one block, fill in all the live
1068      on entry blocks between the def and all the uses.  */
1069   if (global)
1070     bitmap_set_bit (live->global, p);
1071 }
1072 
1073 
1074 /* Calculate the live on exit vectors based on the entry info in LIVEINFO.  */
1075 
1076 void
1077 calculate_live_on_exit (tree_live_info_p liveinfo)
1078 {
1079   basic_block bb;
1080   edge e;
1081   edge_iterator ei;
1082 
1083   /* live on entry calculations used liveout vectors for defs, clear them.  */
1084   FOR_EACH_BB (bb)
1085     bitmap_clear (liveinfo->liveout[bb->index]);
1086 
1087   /* Set all the live-on-exit bits for uses in PHIs.  */
1088   FOR_EACH_BB (bb)
1089     {
1090       gimple_stmt_iterator gsi;
1091       size_t i;
1092 
1093       /* Mark the PHI arguments which are live on exit to the pred block.  */
1094       for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1095 	{
1096 	  gimple phi = gsi_stmt (gsi);
1097 	  for (i = 0; i < gimple_phi_num_args (phi); i++)
1098 	    {
1099 	      tree t = PHI_ARG_DEF (phi, i);
1100 	      int p;
1101 
1102 	      if (TREE_CODE (t) != SSA_NAME)
1103 		continue;
1104 
1105 	      p = var_to_partition (liveinfo->map, t);
1106 	      if (p == NO_PARTITION)
1107 		continue;
1108 	      e = gimple_phi_arg_edge (phi, i);
1109 	      if (e->src != ENTRY_BLOCK_PTR)
1110 		bitmap_set_bit (liveinfo->liveout[e->src->index], p);
1111 	    }
1112 	}
1113 
1114       /* Add each successors live on entry to this bock live on exit.  */
1115       FOR_EACH_EDGE (e, ei, bb->succs)
1116         if (e->dest != EXIT_BLOCK_PTR)
1117 	  bitmap_ior_into (liveinfo->liveout[bb->index],
1118 			   live_on_entry (liveinfo, e->dest));
1119     }
1120 }
1121 
1122 
1123 /* Given partition map MAP, calculate all the live on entry bitmaps for
1124    each partition.  Return a new live info object.  */
1125 
1126 tree_live_info_p
1127 calculate_live_ranges (var_map map)
1128 {
1129   tree var;
1130   unsigned i;
1131   tree_live_info_p live;
1132 
1133   live = new_tree_live_info (map);
1134   for (i = 0; i < num_var_partitions (map); i++)
1135     {
1136       var = partition_to_var (map, i);
1137       if (var != NULL_TREE)
1138 	set_var_live_on_entry (var, live);
1139     }
1140 
1141   live_worklist (live);
1142 
1143 #ifdef ENABLE_CHECKING
1144   verify_live_on_entry (live);
1145 #endif
1146 
1147   calculate_live_on_exit (live);
1148   return live;
1149 }
1150 
1151 
1152 /* Output partition map MAP to file F.  */
1153 
1154 void
1155 dump_var_map (FILE *f, var_map map)
1156 {
1157   int t;
1158   unsigned x, y;
1159   int p;
1160 
1161   fprintf (f, "\nPartition map \n\n");
1162 
1163   for (x = 0; x < map->num_partitions; x++)
1164     {
1165       if (map->view_to_partition != NULL)
1166 	p = map->view_to_partition[x];
1167       else
1168 	p = x;
1169 
1170       if (ssa_name (p) == NULL_TREE)
1171         continue;
1172 
1173       t = 0;
1174       for (y = 1; y < num_ssa_names; y++)
1175         {
1176 	  p = partition_find (map->var_partition, y);
1177 	  if (map->partition_to_view)
1178 	    p = map->partition_to_view[p];
1179 	  if (p == (int)x)
1180 	    {
1181 	      if (t++ == 0)
1182 	        {
1183 		  fprintf(f, "Partition %d (", x);
1184 		  print_generic_expr (f, partition_to_var (map, p), TDF_SLIM);
1185 		  fprintf (f, " - ");
1186 		}
1187 	      fprintf (f, "%d ", y);
1188 	    }
1189 	}
1190       if (t != 0)
1191 	fprintf (f, ")\n");
1192     }
1193   fprintf (f, "\n");
1194 }
1195 
1196 
1197 /* Output live range info LIVE to file F, controlled by FLAG.  */
1198 
1199 void
1200 dump_live_info (FILE *f, tree_live_info_p live, int flag)
1201 {
1202   basic_block bb;
1203   unsigned i;
1204   var_map map = live->map;
1205   bitmap_iterator bi;
1206 
1207   if ((flag & LIVEDUMP_ENTRY) && live->livein)
1208     {
1209       FOR_EACH_BB (bb)
1210 	{
1211 	  fprintf (f, "\nLive on entry to BB%d : ", bb->index);
1212 	  EXECUTE_IF_SET_IN_BITMAP (live->livein[bb->index], 0, i, bi)
1213 	    {
1214 	      print_generic_expr (f, partition_to_var (map, i), TDF_SLIM);
1215 	      fprintf (f, "  ");
1216 	    }
1217 	  fprintf (f, "\n");
1218 	}
1219     }
1220 
1221   if ((flag & LIVEDUMP_EXIT) && live->liveout)
1222     {
1223       FOR_EACH_BB (bb)
1224 	{
1225 	  fprintf (f, "\nLive on exit from BB%d : ", bb->index);
1226 	  EXECUTE_IF_SET_IN_BITMAP (live->liveout[bb->index], 0, i, bi)
1227 	    {
1228 	      print_generic_expr (f, partition_to_var (map, i), TDF_SLIM);
1229 	      fprintf (f, "  ");
1230 	    }
1231 	  fprintf (f, "\n");
1232 	}
1233     }
1234 }
1235 
1236 struct GTY(()) numbered_tree_d
1237 {
1238   tree t;
1239   int num;
1240 };
1241 typedef struct numbered_tree_d numbered_tree;
1242 
1243 DEF_VEC_O (numbered_tree);
1244 DEF_VEC_ALLOC_O (numbered_tree, heap);
1245 
1246 /* Compare two declarations references by their DECL_UID / sequence number.
1247    Called via qsort.  */
1248 
1249 static int
1250 compare_decls_by_uid (const void *pa, const void *pb)
1251 {
1252   const numbered_tree *nt_a = ((const numbered_tree *)pa);
1253   const numbered_tree *nt_b = ((const numbered_tree *)pb);
1254 
1255   if (DECL_UID (nt_a->t) != DECL_UID (nt_b->t))
1256     return  DECL_UID (nt_a->t) - DECL_UID (nt_b->t);
1257   return nt_a->num - nt_b->num;
1258 }
1259 
1260 /* Called via walk_gimple_stmt / walk_gimple_op by dump_enumerated_decls.  */
1261 static tree
1262 dump_enumerated_decls_push (tree *tp, int *walk_subtrees, void *data)
1263 {
1264   struct walk_stmt_info *wi = (struct walk_stmt_info *) data;
1265   VEC (numbered_tree, heap) **list = (VEC (numbered_tree, heap) **) &wi->info;
1266   numbered_tree nt;
1267 
1268   if (!DECL_P (*tp))
1269     return NULL_TREE;
1270   nt.t = *tp;
1271   nt.num = VEC_length (numbered_tree, *list);
1272   VEC_safe_push (numbered_tree, heap, *list, &nt);
1273   *walk_subtrees = 0;
1274   return NULL_TREE;
1275 }
1276 
1277 /* Find all the declarations used by the current function, sort them by uid,
1278    and emit the sorted list.  Each declaration is tagged with a sequence
1279    number indicating when it was found during statement / tree walking,
1280    so that TDF_NOUID comparisons of anonymous declarations are still
1281    meaningful.  Where a declaration was encountered more than once, we
1282    emit only the sequence number of the first encounter.
1283    FILE is the dump file where to output the list and FLAGS is as in
1284    print_generic_expr.  */
1285 void
1286 dump_enumerated_decls (FILE *file, int flags)
1287 {
1288   basic_block bb;
1289   struct walk_stmt_info wi;
1290   VEC (numbered_tree, heap) *decl_list = VEC_alloc (numbered_tree, heap, 40);
1291 
1292   memset (&wi, '\0', sizeof (wi));
1293   wi.info = (void*) decl_list;
1294   FOR_EACH_BB (bb)
1295     {
1296       gimple_stmt_iterator gsi;
1297 
1298       for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1299 	if (!is_gimple_debug (gsi_stmt (gsi)))
1300 	  walk_gimple_stmt (&gsi, NULL, dump_enumerated_decls_push, &wi);
1301     }
1302   decl_list = (VEC (numbered_tree, heap) *) wi.info;
1303   VEC_qsort (numbered_tree, decl_list, compare_decls_by_uid);
1304   if (VEC_length (numbered_tree, decl_list))
1305     {
1306       unsigned ix;
1307       numbered_tree *ntp;
1308       tree last = NULL_TREE;
1309 
1310       fprintf (file, "Declarations used by %s, sorted by DECL_UID:\n",
1311 	       current_function_name ());
1312       FOR_EACH_VEC_ELT (numbered_tree, decl_list, ix, ntp)
1313 	{
1314 	  if (ntp->t == last)
1315 	    continue;
1316 	  fprintf (file, "%d: ", ntp->num);
1317 	  print_generic_decl (file, ntp->t, flags);
1318 	  fprintf (file, "\n");
1319 	  last = ntp->t;
1320 	}
1321     }
1322   VEC_free (numbered_tree, heap, decl_list);
1323 }
1324 
1325 #ifdef ENABLE_CHECKING
1326 /* Verify that SSA_VAR is a non-virtual SSA_NAME.  */
1327 
1328 void
1329 register_ssa_partition_check (tree ssa_var)
1330 {
1331   gcc_assert (TREE_CODE (ssa_var) == SSA_NAME);
1332   if (!is_gimple_reg (SSA_NAME_VAR (ssa_var)))
1333     {
1334       fprintf (stderr, "Illegally registering a virtual SSA name :");
1335       print_generic_expr (stderr, ssa_var, TDF_SLIM);
1336       fprintf (stderr, " in the SSA->Normal phase.\n");
1337       internal_error ("SSA corruption");
1338     }
1339 }
1340 
1341 
1342 /* Verify that the info in LIVE matches the current cfg.  */
1343 
1344 static void
1345 verify_live_on_entry (tree_live_info_p live)
1346 {
1347   unsigned i;
1348   tree var;
1349   gimple stmt;
1350   basic_block bb;
1351   edge e;
1352   int num;
1353   edge_iterator ei;
1354   var_map map = live->map;
1355 
1356    /* Check for live on entry partitions and report those with a DEF in
1357       the program. This will typically mean an optimization has done
1358       something wrong.  */
1359   bb = ENTRY_BLOCK_PTR;
1360   num = 0;
1361   FOR_EACH_EDGE (e, ei, bb->succs)
1362     {
1363       int entry_block = e->dest->index;
1364       if (e->dest == EXIT_BLOCK_PTR)
1365         continue;
1366       for (i = 0; i < (unsigned)num_var_partitions (map); i++)
1367 	{
1368 	  basic_block tmp;
1369 	  tree d;
1370 	  bitmap loe;
1371 	  var = partition_to_var (map, i);
1372 	  stmt = SSA_NAME_DEF_STMT (var);
1373 	  tmp = gimple_bb (stmt);
1374 	  d = gimple_default_def (cfun, SSA_NAME_VAR (var));
1375 
1376 	  loe = live_on_entry (live, e->dest);
1377 	  if (loe && bitmap_bit_p (loe, i))
1378 	    {
1379 	      if (!gimple_nop_p (stmt))
1380 		{
1381 		  num++;
1382 		  print_generic_expr (stderr, var, TDF_SLIM);
1383 		  fprintf (stderr, " is defined ");
1384 		  if (tmp)
1385 		    fprintf (stderr, " in BB%d, ", tmp->index);
1386 		  fprintf (stderr, "by:\n");
1387 		  print_gimple_stmt (stderr, stmt, 0, TDF_SLIM);
1388 		  fprintf (stderr, "\nIt is also live-on-entry to entry BB %d",
1389 			   entry_block);
1390 		  fprintf (stderr, " So it appears to have multiple defs.\n");
1391 		}
1392 	      else
1393 	        {
1394 		  if (d != var)
1395 		    {
1396 		      num++;
1397 		      print_generic_expr (stderr, var, TDF_SLIM);
1398 		      fprintf (stderr, " is live-on-entry to BB%d ",
1399 			       entry_block);
1400 		      if (d)
1401 		        {
1402 			  fprintf (stderr, " but is not the default def of ");
1403 			  print_generic_expr (stderr, d, TDF_SLIM);
1404 			  fprintf (stderr, "\n");
1405 			}
1406 		      else
1407 			fprintf (stderr, " and there is no default def.\n");
1408 		    }
1409 		}
1410 	    }
1411 	  else
1412 	    if (d == var)
1413 	      {
1414 		/* The only way this var shouldn't be marked live on entry is
1415 		   if it occurs in a PHI argument of the block.  */
1416 		size_t z;
1417 		bool ok = false;
1418 		gimple_stmt_iterator gsi;
1419 		for (gsi = gsi_start_phis (e->dest);
1420 		     !gsi_end_p (gsi) && !ok;
1421 		     gsi_next (&gsi))
1422 		  {
1423 		    gimple phi = gsi_stmt (gsi);
1424 		    for (z = 0; z < gimple_phi_num_args (phi); z++)
1425 		      if (var == gimple_phi_arg_def (phi, z))
1426 			{
1427 			  ok = true;
1428 			  break;
1429 			}
1430 		  }
1431 		if (ok)
1432 		  continue;
1433 	        num++;
1434 		print_generic_expr (stderr, var, TDF_SLIM);
1435 		fprintf (stderr, " is not marked live-on-entry to entry BB%d ",
1436 			 entry_block);
1437 		fprintf (stderr, "but it is a default def so it should be.\n");
1438 	      }
1439 	}
1440     }
1441   gcc_assert (num <= 0);
1442 }
1443 #endif
1444