OSDN Git Service

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