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