c++: Attribute deprecated/unavailable divergence
[official-gcc.git] / gcc / tree-ssanames.cc
blobe0a6884f295b39f5e1c9d40ce1f77977aae6d794
1 /* Generic routines for manipulating SSA_NAME expressions
2 Copyright (C) 2003-2022 Free Software Foundation, Inc.
4 This file is part of GCC.
6 GCC is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3, or (at your option)
9 any later version.
11 GCC is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3. If not see
18 <http://www.gnu.org/licenses/>. */
20 #include "config.h"
21 #include "system.h"
22 #include "coretypes.h"
23 #include "backend.h"
24 #include "tree.h"
25 #include "gimple.h"
26 #include "tree-pass.h"
27 #include "ssa.h"
28 #include "gimple-iterator.h"
29 #include "stor-layout.h"
30 #include "tree-into-ssa.h"
31 #include "tree-ssa.h"
32 #include "cfgloop.h"
33 #include "tree-scalar-evolution.h"
34 #include "value-query.h"
36 /* Rewriting a function into SSA form can create a huge number of SSA_NAMEs,
37 many of which may be thrown away shortly after their creation if jumps
38 were threaded through PHI nodes.
40 While our garbage collection mechanisms will handle this situation, it
41 is extremely wasteful to create nodes and throw them away, especially
42 when the nodes can be reused.
44 For PR 8361, we can significantly reduce the number of nodes allocated
45 and thus the total amount of memory allocated by managing SSA_NAMEs a
46 little. This additionally helps reduce the amount of work done by the
47 garbage collector. Similar results have been seen on a wider variety
48 of tests (such as the compiler itself).
50 Right now we maintain our free list on a per-function basis. It may
51 or may not make sense to maintain the free list for the duration of
52 a compilation unit.
54 External code should rely solely upon HIGHEST_SSA_VERSION and the
55 externally defined functions. External code should not know about
56 the details of the free list management.
58 External code should also not assume the version number on nodes is
59 monotonically increasing. We reuse the version number when we
60 reuse an SSA_NAME expression. This helps keep arrays and bitmaps
61 more compact. */
64 /* Version numbers with special meanings. We start allocating new version
65 numbers after the special ones. */
66 #define UNUSED_NAME_VERSION 0
68 unsigned int ssa_name_nodes_reused;
69 unsigned int ssa_name_nodes_created;
71 #define FREE_SSANAMES(fun) (fun)->gimple_df->free_ssanames
72 #define FREE_SSANAMES_QUEUE(fun) (fun)->gimple_df->free_ssanames_queue
75 /* Initialize management of SSA_NAMEs to default SIZE. If SIZE is
76 zero use default. */
78 void
79 init_ssanames (struct function *fn, int size)
81 if (!size)
82 vec_alloc (SSANAMES (fn), 50);
83 else
84 vec_safe_reserve (SSANAMES (fn), size, true);
86 /* Version 0 is special, so reserve the first slot in the table. Though
87 currently unused, we may use version 0 in alias analysis as part of
88 the heuristics used to group aliases when the alias sets are too
89 large.
91 We use vec::quick_push here because we know that SSA_NAMES has at
92 least 50 elements reserved in it. */
93 SSANAMES (fn)->quick_push (NULL_TREE);
94 FREE_SSANAMES (fn) = NULL;
95 FREE_SSANAMES_QUEUE (fn) = NULL;
97 fn->gimple_df->ssa_renaming_needed = 0;
98 fn->gimple_df->rename_vops = 0;
101 /* Finalize management of SSA_NAMEs. */
103 void
104 fini_ssanames (struct function *fn)
106 unsigned i;
107 tree name;
108 /* Some SSA names leak into global tree data structures so we can't simply
109 ggc_free them. But make sure to clear references to stmts since we now
110 ggc_free the CFG itself. */
111 FOR_EACH_VEC_SAFE_ELT (SSANAMES (fn), i, name)
112 if (name)
113 SSA_NAME_DEF_STMT (name) = NULL;
114 vec_free (SSANAMES (fn));
115 vec_free (FREE_SSANAMES (fn));
116 vec_free (FREE_SSANAMES_QUEUE (fn));
119 /* Dump some simple statistics regarding the re-use of SSA_NAME nodes. */
121 void
122 ssanames_print_statistics (void)
124 fprintf (stderr, "%-32s" PRsa (11) "\n", "SSA_NAME nodes allocated:",
125 SIZE_AMOUNT (ssa_name_nodes_created));
126 fprintf (stderr, "%-32s" PRsa (11) "\n", "SSA_NAME nodes reused:",
127 SIZE_AMOUNT (ssa_name_nodes_reused));
130 /* Verify the state of the SSA_NAME lists.
132 There must be no duplicates on the free list.
133 Every name on the free list must be marked as on the free list.
134 Any name on the free list must not appear in the IL.
135 No names can be leaked. */
137 DEBUG_FUNCTION void
138 verify_ssaname_freelists (struct function *fun)
140 if (!gimple_in_ssa_p (fun))
141 return;
143 auto_bitmap names_in_il;
145 /* Walk the entire IL noting every SSA_NAME we see. */
146 basic_block bb;
147 FOR_EACH_BB_FN (bb, fun)
149 tree t;
150 /* First note the result and arguments of PHI nodes. */
151 for (gphi_iterator gsi = gsi_start_phis (bb);
152 !gsi_end_p (gsi);
153 gsi_next (&gsi))
155 gphi *phi = gsi.phi ();
156 t = gimple_phi_result (phi);
157 bitmap_set_bit (names_in_il, SSA_NAME_VERSION (t));
159 for (unsigned int i = 0; i < gimple_phi_num_args (phi); i++)
161 t = gimple_phi_arg_def (phi, i);
162 if (TREE_CODE (t) == SSA_NAME)
163 bitmap_set_bit (names_in_il, SSA_NAME_VERSION (t));
167 /* Then note the operands of each statement. */
168 for (gimple_stmt_iterator gsi = gsi_start_bb (bb);
169 !gsi_end_p (gsi);
170 gsi_next (&gsi))
172 ssa_op_iter iter;
173 gimple *stmt = gsi_stmt (gsi);
174 FOR_EACH_SSA_TREE_OPERAND (t, stmt, iter, SSA_OP_ALL_OPERANDS)
175 bitmap_set_bit (names_in_il, SSA_NAME_VERSION (t));
179 /* Now walk the free list noting what we find there and verifying
180 there are no duplicates. */
181 auto_bitmap names_in_freelists;
182 if (FREE_SSANAMES (fun))
184 for (unsigned int i = 0; i < FREE_SSANAMES (fun)->length (); i++)
186 tree t = (*FREE_SSANAMES (fun))[i];
188 /* Verify that the name is marked as being in the free list. */
189 gcc_assert (SSA_NAME_IN_FREE_LIST (t));
191 /* Verify the name has not already appeared in the free list and
192 note it in the list of names found in the free list. */
193 gcc_assert (!bitmap_bit_p (names_in_freelists, SSA_NAME_VERSION (t)));
194 bitmap_set_bit (names_in_freelists, SSA_NAME_VERSION (t));
198 /* Similarly for the names in the pending free list. */
199 if (FREE_SSANAMES_QUEUE (fun))
201 for (unsigned int i = 0; i < FREE_SSANAMES_QUEUE (fun)->length (); i++)
203 tree t = (*FREE_SSANAMES_QUEUE (fun))[i];
205 /* Verify that the name is marked as being in the free list. */
206 gcc_assert (SSA_NAME_IN_FREE_LIST (t));
208 /* Verify the name has not already appeared in the free list and
209 note it in the list of names found in the free list. */
210 gcc_assert (!bitmap_bit_p (names_in_freelists, SSA_NAME_VERSION (t)));
211 bitmap_set_bit (names_in_freelists, SSA_NAME_VERSION (t));
215 /* If any name appears in both the IL and the freelists, then
216 something horrible has happened. */
217 bool intersect_p = bitmap_intersect_p (names_in_il, names_in_freelists);
218 gcc_assert (!intersect_p);
220 /* Names can be queued up for release if there is an ssa update
221 pending. Pretend we saw them in the IL. */
222 if (names_to_release)
223 bitmap_ior_into (names_in_il, names_to_release);
225 /* Function splitting can "lose" SSA_NAMEs in an effort to ensure that
226 debug/non-debug compilations have the same SSA_NAMEs. So for each
227 lost SSA_NAME, see if it's likely one from that wart. These will always
228 be marked as default definitions. So we loosely assume that anything
229 marked as a default definition isn't leaked by pretending they are
230 in the IL. */
231 for (unsigned int i = UNUSED_NAME_VERSION + 1; i < num_ssa_names; i++)
232 if (ssa_name (i) && SSA_NAME_IS_DEFAULT_DEF (ssa_name (i)))
233 bitmap_set_bit (names_in_il, i);
235 unsigned int i;
236 bitmap_iterator bi;
237 auto_bitmap all_names;
238 bitmap_set_range (all_names, UNUSED_NAME_VERSION + 1, num_ssa_names - 1);
239 bitmap_ior_into (names_in_il, names_in_freelists);
241 /* Any name not mentioned in the IL and not in the feelists
242 has been leaked. */
243 EXECUTE_IF_AND_COMPL_IN_BITMAP(all_names, names_in_il,
244 UNUSED_NAME_VERSION + 1, i, bi)
245 gcc_assert (!ssa_name (i));
248 /* Move all SSA_NAMEs from FREE_SSA_NAMES_QUEUE to FREE_SSA_NAMES.
250 We do not, but should have a mode to verify the state of the SSA_NAMEs
251 lists. In particular at this point every name must be in the IL,
252 on the free list or in the queue. Anything else is an error. */
254 void
255 flush_ssaname_freelist (void)
257 /* If there were any SSA names released reset the SCEV cache. */
258 if (! vec_safe_is_empty (FREE_SSANAMES_QUEUE (cfun)))
259 scev_reset_htab ();
260 vec_safe_splice (FREE_SSANAMES (cfun), FREE_SSANAMES_QUEUE (cfun));
261 vec_safe_truncate (FREE_SSANAMES_QUEUE (cfun), 0);
264 /* Initialize SSA_NAME_IMM_USE_NODE of a SSA NAME. */
266 void
267 init_ssa_name_imm_use (tree name)
269 use_operand_p imm;
270 imm = &(SSA_NAME_IMM_USE_NODE (name));
271 imm->use = NULL;
272 imm->prev = imm;
273 imm->next = imm;
274 imm->loc.ssa_name = name;
277 /* Return an SSA_NAME node for variable VAR defined in statement STMT
278 in function FN. STMT may be an empty statement for artificial
279 references (e.g., default definitions created when a variable is
280 used without a preceding definition). If VERISON is not zero then
281 allocate the SSA name with that version. */
283 tree
284 make_ssa_name_fn (struct function *fn, tree var, gimple *stmt,
285 unsigned int version)
287 tree t;
288 gcc_assert (VAR_P (var)
289 || TREE_CODE (var) == PARM_DECL
290 || TREE_CODE (var) == RESULT_DECL
291 || (TYPE_P (var) && is_gimple_reg_type (var)));
293 /* Get the specified SSA name version. */
294 if (version != 0)
296 t = make_node (SSA_NAME);
297 SSA_NAME_VERSION (t) = version;
298 if (version >= SSANAMES (fn)->length ())
299 vec_safe_grow_cleared (SSANAMES (fn), version + 1, true);
300 gcc_assert ((*SSANAMES (fn))[version] == NULL);
301 (*SSANAMES (fn))[version] = t;
302 ssa_name_nodes_created++;
304 /* If our free list has an element, then use it. */
305 else if (!vec_safe_is_empty (FREE_SSANAMES (fn)))
307 t = FREE_SSANAMES (fn)->pop ();
308 ssa_name_nodes_reused++;
310 /* The node was cleared out when we put it on the free list, so
311 there is no need to do so again here. */
312 gcc_assert ((*SSANAMES (fn))[SSA_NAME_VERSION (t)] == NULL);
313 (*SSANAMES (fn))[SSA_NAME_VERSION (t)] = t;
315 else
317 t = make_node (SSA_NAME);
318 SSA_NAME_VERSION (t) = SSANAMES (fn)->length ();
319 vec_safe_push (SSANAMES (fn), t);
320 ssa_name_nodes_created++;
323 if (TYPE_P (var))
325 TREE_TYPE (t) = TYPE_MAIN_VARIANT (var);
326 SET_SSA_NAME_VAR_OR_IDENTIFIER (t, NULL_TREE);
328 else
330 TREE_TYPE (t) = TREE_TYPE (var);
331 SET_SSA_NAME_VAR_OR_IDENTIFIER (t, var);
333 SSA_NAME_DEF_STMT (t) = stmt;
334 if (POINTER_TYPE_P (TREE_TYPE (t)))
335 SSA_NAME_PTR_INFO (t) = NULL;
336 else
337 SSA_NAME_RANGE_INFO (t) = NULL;
339 SSA_NAME_IN_FREE_LIST (t) = 0;
340 SSA_NAME_IS_DEFAULT_DEF (t) = 0;
341 init_ssa_name_imm_use (t);
343 return t;
346 /* Helper function for set_range_info.
348 Store range information RANGE_TYPE, MIN, and MAX to tree ssa_name
349 NAME. */
351 void
352 set_range_info_raw (tree name, enum value_range_kind range_type,
353 const wide_int_ref &min, const wide_int_ref &max)
355 gcc_assert (!POINTER_TYPE_P (TREE_TYPE (name)));
356 gcc_assert (range_type == VR_RANGE || range_type == VR_ANTI_RANGE);
357 range_info_def *ri = SSA_NAME_RANGE_INFO (name);
358 unsigned int precision = TYPE_PRECISION (TREE_TYPE (name));
360 /* Allocate if not available. */
361 if (ri == NULL)
363 size_t size = (sizeof (range_info_def)
364 + trailing_wide_ints <3>::extra_size (precision));
365 ri = static_cast<range_info_def *> (ggc_internal_alloc (size));
366 ri->ints.set_precision (precision);
367 SSA_NAME_RANGE_INFO (name) = ri;
368 ri->set_nonzero_bits (wi::shwi (-1, precision));
371 /* Record the range type. */
372 if (SSA_NAME_RANGE_TYPE (name) != range_type)
373 SSA_NAME_ANTI_RANGE_P (name) = (range_type == VR_ANTI_RANGE);
375 /* Set the values. */
376 ri->set_min (min);
377 ri->set_max (max);
379 /* If it is a range, try to improve nonzero_bits from the min/max. */
380 if (range_type == VR_RANGE)
382 wide_int xorv = ri->get_min () ^ ri->get_max ();
383 if (xorv != 0)
384 xorv = wi::mask (precision - wi::clz (xorv), false, precision);
385 ri->set_nonzero_bits (ri->get_nonzero_bits () & (ri->get_min () | xorv));
389 /* Store range information RANGE_TYPE, MIN, and MAX to tree ssa_name
390 NAME while making sure we don't store useless range info. */
392 void
393 set_range_info (tree name, enum value_range_kind range_type,
394 const wide_int_ref &min, const wide_int_ref &max)
396 gcc_assert (!POINTER_TYPE_P (TREE_TYPE (name)));
398 /* A range of the entire domain is really no range at all. */
399 tree type = TREE_TYPE (name);
400 if (min == wi::min_value (TYPE_PRECISION (type), TYPE_SIGN (type))
401 && max == wi::max_value (TYPE_PRECISION (type), TYPE_SIGN (type)))
403 range_info_def *ri = SSA_NAME_RANGE_INFO (name);
404 if (ri == NULL)
405 return;
406 if (ri->get_nonzero_bits () == -1)
408 ggc_free (ri);
409 SSA_NAME_RANGE_INFO (name) = NULL;
410 return;
414 set_range_info_raw (name, range_type, min, max);
417 /* Store range information for NAME from a value_range. */
419 void
420 set_range_info (tree name, const value_range &vr)
422 wide_int min = wi::to_wide (vr.min ());
423 wide_int max = wi::to_wide (vr.max ());
424 set_range_info (name, vr.kind (), min, max);
427 /* Set nonnull attribute to pointer NAME. */
429 void
430 set_ptr_nonnull (tree name)
432 gcc_assert (POINTER_TYPE_P (TREE_TYPE (name)));
433 struct ptr_info_def *pi = get_ptr_info (name);
434 pi->pt.null = 0;
437 /* Change non-zero bits bitmask of NAME. */
439 void
440 set_nonzero_bits (tree name, const wide_int_ref &mask)
442 gcc_assert (!POINTER_TYPE_P (TREE_TYPE (name)));
443 if (SSA_NAME_RANGE_INFO (name) == NULL)
445 if (mask == -1)
446 return;
447 set_range_info_raw (name, VR_RANGE,
448 wi::to_wide (TYPE_MIN_VALUE (TREE_TYPE (name))),
449 wi::to_wide (TYPE_MAX_VALUE (TREE_TYPE (name))));
451 range_info_def *ri = SSA_NAME_RANGE_INFO (name);
452 ri->set_nonzero_bits (mask);
455 /* Return a widest_int with potentially non-zero bits in SSA_NAME
456 NAME, the constant for INTEGER_CST, or -1 if unknown. */
458 wide_int
459 get_nonzero_bits (const_tree name)
461 if (TREE_CODE (name) == INTEGER_CST)
462 return wi::to_wide (name);
464 /* Use element_precision instead of TYPE_PRECISION so complex and
465 vector types get a non-zero precision. */
466 unsigned int precision = element_precision (TREE_TYPE (name));
467 if (POINTER_TYPE_P (TREE_TYPE (name)))
469 struct ptr_info_def *pi = SSA_NAME_PTR_INFO (name);
470 if (pi && pi->align)
471 return wi::shwi (-(HOST_WIDE_INT) pi->align
472 | (HOST_WIDE_INT) pi->misalign, precision);
473 return wi::shwi (-1, precision);
476 range_info_def *ri = SSA_NAME_RANGE_INFO (name);
477 if (!ri)
478 return wi::shwi (-1, precision);
480 return ri->get_nonzero_bits ();
483 /* Return TRUE is OP, an SSA_NAME has a range of values [0..1], false
484 otherwise.
486 This can be because it is a boolean type, any unsigned integral
487 type with a single bit of precision, or has known range of [0..1]
488 via range analysis. */
490 bool
491 ssa_name_has_boolean_range (tree op)
493 gcc_assert (TREE_CODE (op) == SSA_NAME);
495 /* Boolean types always have a range [0..1]. */
496 if (TREE_CODE (TREE_TYPE (op)) == BOOLEAN_TYPE)
497 return true;
499 /* An integral type with a single bit of precision. */
500 if (INTEGRAL_TYPE_P (TREE_TYPE (op))
501 && TYPE_UNSIGNED (TREE_TYPE (op))
502 && TYPE_PRECISION (TREE_TYPE (op)) == 1)
503 return true;
505 /* An integral type with more precision, but the object
506 only takes on values [0..1] as determined by range
507 analysis. */
508 if (INTEGRAL_TYPE_P (TREE_TYPE (op))
509 && (TYPE_PRECISION (TREE_TYPE (op)) > 1))
511 int_range<2> onezero (build_zero_cst (TREE_TYPE (op)),
512 build_one_cst (TREE_TYPE (op)));
513 int_range<2> r;
514 if (get_range_query (cfun)->range_of_expr (r, op) && r == onezero)
515 return true;
517 if (wi::eq_p (get_nonzero_bits (op), 1))
518 return true;
521 return false;
524 /* We no longer need the SSA_NAME expression VAR, release it so that
525 it may be reused.
527 Note it is assumed that no calls to make_ssa_name will be made
528 until all uses of the ssa name are released and that the only
529 use of the SSA_NAME expression is to check its SSA_NAME_VAR. All
530 other fields must be assumed clobbered. */
532 void
533 release_ssa_name_fn (struct function *fn, tree var)
535 if (!var)
536 return;
538 /* Never release the default definition for a symbol. It's a
539 special SSA name that should always exist once it's created. */
540 if (SSA_NAME_IS_DEFAULT_DEF (var))
541 return;
543 /* If VAR has been registered for SSA updating, don't remove it.
544 After update_ssa has run, the name will be released. */
545 if (name_registered_for_update_p (var))
547 release_ssa_name_after_update_ssa (var);
548 return;
551 /* release_ssa_name can be called multiple times on a single SSA_NAME.
552 However, it should only end up on our free list one time. We
553 keep a status bit in the SSA_NAME node itself to indicate it has
554 been put on the free list.
556 Note that once on the freelist you cannot reference the SSA_NAME's
557 defining statement. */
558 if (! SSA_NAME_IN_FREE_LIST (var))
560 int saved_ssa_name_version = SSA_NAME_VERSION (var);
561 use_operand_p imm = &(SSA_NAME_IMM_USE_NODE (var));
563 if (MAY_HAVE_DEBUG_BIND_STMTS)
564 insert_debug_temp_for_var_def (NULL, var);
566 if (flag_checking)
567 verify_imm_links (stderr, var);
568 while (imm->next != imm)
569 delink_imm_use (imm->next);
571 (*SSANAMES (fn))[SSA_NAME_VERSION (var)] = NULL_TREE;
572 memset (var, 0, tree_size (var));
574 imm->prev = imm;
575 imm->next = imm;
576 imm->loc.ssa_name = var;
578 /* First put back the right tree node so that the tree checking
579 macros do not complain. */
580 TREE_SET_CODE (var, SSA_NAME);
582 /* Restore the version number. */
583 SSA_NAME_VERSION (var) = saved_ssa_name_version;
585 /* Note this SSA_NAME is now in the first list. */
586 SSA_NAME_IN_FREE_LIST (var) = 1;
588 /* Put in a non-NULL TREE_TYPE so dumping code will not ICE
589 if it happens to come along a released SSA name and tries
590 to inspect its type. */
591 TREE_TYPE (var) = error_mark_node;
593 /* And finally queue it so that it will be put on the free list. */
594 vec_safe_push (FREE_SSANAMES_QUEUE (fn), var);
598 /* If the alignment of the pointer described by PI is known, return true and
599 store the alignment and the deviation from it into *ALIGNP and *MISALIGNP
600 respectively. Otherwise return false. */
602 bool
603 get_ptr_info_alignment (struct ptr_info_def *pi, unsigned int *alignp,
604 unsigned int *misalignp)
606 if (pi->align)
608 *alignp = pi->align;
609 *misalignp = pi->misalign;
610 return true;
612 else
613 return false;
616 /* State that the pointer described by PI has unknown alignment. */
618 void
619 mark_ptr_info_alignment_unknown (struct ptr_info_def *pi)
621 pi->align = 0;
622 pi->misalign = 0;
625 /* Store the power-of-two byte alignment and the deviation from that
626 alignment of pointer described by PI to ALIOGN and MISALIGN
627 respectively. */
629 void
630 set_ptr_info_alignment (struct ptr_info_def *pi, unsigned int align,
631 unsigned int misalign)
633 gcc_checking_assert (align != 0);
634 gcc_assert ((align & (align - 1)) == 0);
635 gcc_assert ((misalign & ~(align - 1)) == 0);
637 pi->align = align;
638 pi->misalign = misalign;
641 /* If pointer described by PI has known alignment, increase its known
642 misalignment by INCREMENT modulo its current alignment. */
644 void
645 adjust_ptr_info_misalignment (struct ptr_info_def *pi, poly_uint64 increment)
647 if (pi->align != 0)
649 increment += pi->misalign;
650 if (!known_misalignment (increment, pi->align, &pi->misalign))
652 pi->align = known_alignment (increment);
653 pi->misalign = 0;
658 /* Return the alias information associated with pointer T. It creates a
659 new instance if none existed. */
661 struct ptr_info_def *
662 get_ptr_info (tree t)
664 struct ptr_info_def *pi;
666 gcc_assert (POINTER_TYPE_P (TREE_TYPE (t)));
668 pi = SSA_NAME_PTR_INFO (t);
669 if (pi == NULL)
671 pi = ggc_cleared_alloc<ptr_info_def> ();
672 pt_solution_reset (&pi->pt);
673 mark_ptr_info_alignment_unknown (pi);
674 SSA_NAME_PTR_INFO (t) = pi;
677 return pi;
681 /* Creates a new SSA name using the template NAME tobe defined by
682 statement STMT in function FN. */
684 tree
685 copy_ssa_name_fn (struct function *fn, tree name, gimple *stmt)
687 tree new_name;
689 if (SSA_NAME_VAR (name))
690 new_name = make_ssa_name_fn (fn, SSA_NAME_VAR (name), stmt);
691 else
693 new_name = make_ssa_name_fn (fn, TREE_TYPE (name), stmt);
694 SET_SSA_NAME_VAR_OR_IDENTIFIER (new_name, SSA_NAME_IDENTIFIER (name));
697 return new_name;
701 /* Creates a duplicate of the ptr_info_def at PTR_INFO for use by
702 the SSA name NAME. */
704 void
705 duplicate_ssa_name_ptr_info (tree name, struct ptr_info_def *ptr_info)
707 struct ptr_info_def *new_ptr_info;
709 gcc_assert (POINTER_TYPE_P (TREE_TYPE (name)));
710 gcc_assert (!SSA_NAME_PTR_INFO (name));
712 if (!ptr_info)
713 return;
715 new_ptr_info = ggc_alloc<ptr_info_def> ();
716 *new_ptr_info = *ptr_info;
718 SSA_NAME_PTR_INFO (name) = new_ptr_info;
721 /* Creates a duplicate of the range_info_def at RANGE_INFO of type
722 RANGE_TYPE for use by the SSA name NAME. */
723 void
724 duplicate_ssa_name_range_info (tree name, enum value_range_kind range_type,
725 struct range_info_def *range_info)
727 struct range_info_def *new_range_info;
729 gcc_assert (!POINTER_TYPE_P (TREE_TYPE (name)));
730 gcc_assert (!SSA_NAME_RANGE_INFO (name));
732 if (!range_info)
733 return;
735 unsigned int precision = TYPE_PRECISION (TREE_TYPE (name));
736 size_t size = (sizeof (range_info_def)
737 + trailing_wide_ints <3>::extra_size (precision));
738 new_range_info = static_cast<range_info_def *> (ggc_internal_alloc (size));
739 memcpy (new_range_info, range_info, size);
741 gcc_assert (range_type == VR_RANGE || range_type == VR_ANTI_RANGE);
742 SSA_NAME_ANTI_RANGE_P (name) = (range_type == VR_ANTI_RANGE);
743 SSA_NAME_RANGE_INFO (name) = new_range_info;
748 /* Creates a duplicate of a ssa name NAME tobe defined by statement STMT
749 in function FN. */
751 tree
752 duplicate_ssa_name_fn (struct function *fn, tree name, gimple *stmt)
754 tree new_name = copy_ssa_name_fn (fn, name, stmt);
755 if (POINTER_TYPE_P (TREE_TYPE (name)))
757 struct ptr_info_def *old_ptr_info = SSA_NAME_PTR_INFO (name);
759 if (old_ptr_info)
760 duplicate_ssa_name_ptr_info (new_name, old_ptr_info);
762 else
764 struct range_info_def *old_range_info = SSA_NAME_RANGE_INFO (name);
766 if (old_range_info)
767 duplicate_ssa_name_range_info (new_name, SSA_NAME_RANGE_TYPE (name),
768 old_range_info);
771 return new_name;
775 /* Reset all flow sensitive data on NAME such as range-info, nonzero
776 bits and alignment. */
778 void
779 reset_flow_sensitive_info (tree name)
781 if (POINTER_TYPE_P (TREE_TYPE (name)))
783 /* points-to info is not flow-sensitive. */
784 if (SSA_NAME_PTR_INFO (name))
786 /* [E]VRP can derive context sensitive alignment info and
787 non-nullness properties. We must reset both. */
788 mark_ptr_info_alignment_unknown (SSA_NAME_PTR_INFO (name));
789 SSA_NAME_PTR_INFO (name)->pt.null = 1;
792 else
793 SSA_NAME_RANGE_INFO (name) = NULL;
796 /* Clear all flow sensitive data from all statements and PHI definitions
797 in BB. */
799 void
800 reset_flow_sensitive_info_in_bb (basic_block bb)
802 for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi);
803 gsi_next (&gsi))
805 gimple *stmt = gsi_stmt (gsi);
806 ssa_op_iter i;
807 tree op;
808 FOR_EACH_SSA_TREE_OPERAND (op, stmt, i, SSA_OP_DEF)
809 reset_flow_sensitive_info (op);
812 for (gphi_iterator gsi = gsi_start_phis (bb); !gsi_end_p (gsi);
813 gsi_next (&gsi))
815 tree phi_def = gimple_phi_result (gsi.phi ());
816 reset_flow_sensitive_info (phi_def);
820 /* Release all the SSA_NAMEs created by STMT. */
822 void
823 release_defs (gimple *stmt)
825 tree def;
826 ssa_op_iter iter;
828 FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_ALL_DEFS)
829 if (TREE_CODE (def) == SSA_NAME)
830 release_ssa_name (def);
834 /* Replace the symbol associated with SSA_NAME with SYM. */
836 void
837 replace_ssa_name_symbol (tree ssa_name, tree sym)
839 SET_SSA_NAME_VAR_OR_IDENTIFIER (ssa_name, sym);
840 TREE_TYPE (ssa_name) = TREE_TYPE (sym);
843 /* Release the vector of free SSA_NAMEs and compact the vector of SSA_NAMEs
844 that are live. */
846 static void
847 release_free_names_and_compact_live_names (function *fun)
849 unsigned i, j;
850 int n = vec_safe_length (FREE_SSANAMES (fun));
852 /* Now release the freelist. */
853 vec_free (FREE_SSANAMES (fun));
855 /* And compact the SSA number space. We make sure to not change the
856 relative order of SSA versions. */
857 for (i = 1, j = 1; i < fun->gimple_df->ssa_names->length (); ++i)
859 tree name = ssa_name (i);
860 if (name)
862 if (i != j)
864 SSA_NAME_VERSION (name) = j;
865 (*fun->gimple_df->ssa_names)[j] = name;
867 j++;
870 fun->gimple_df->ssa_names->truncate (j);
872 statistics_counter_event (fun, "SSA names released", n);
873 statistics_counter_event (fun, "SSA name holes removed", i - j);
874 if (dump_file)
875 fprintf (dump_file, "Released %i names, %.2f%%, removed %i holes\n",
876 n, n * 100.0 / num_ssa_names, i - j);
879 /* Return SSA names that are unused to GGC memory and compact the SSA
880 version namespace. This is used to keep footprint of compiler during
881 interprocedural optimization. */
883 namespace {
885 const pass_data pass_data_release_ssa_names =
887 GIMPLE_PASS, /* type */
888 "release_ssa", /* name */
889 OPTGROUP_NONE, /* optinfo_flags */
890 TV_TREE_SSA_OTHER, /* tv_id */
891 PROP_ssa, /* properties_required */
892 0, /* properties_provided */
893 0, /* properties_destroyed */
894 TODO_remove_unused_locals, /* todo_flags_start */
895 0, /* todo_flags_finish */
898 class pass_release_ssa_names : public gimple_opt_pass
900 public:
901 pass_release_ssa_names (gcc::context *ctxt)
902 : gimple_opt_pass (pass_data_release_ssa_names, ctxt)
905 /* opt_pass methods: */
906 virtual unsigned int execute (function *);
908 }; // class pass_release_ssa_names
910 unsigned int
911 pass_release_ssa_names::execute (function *fun)
913 release_free_names_and_compact_live_names (fun);
914 return 0;
917 } // anon namespace
919 gimple_opt_pass *
920 make_pass_release_ssa_names (gcc::context *ctxt)
922 return new pass_release_ssa_names (ctxt);