xref: /netbsd-src/external/gpl3/gcc/dist/gcc/tree-ssanames.cc (revision b1e838363e3c6fc78a55519254d99869742dd33c)
1 /* Generic routines for manipulating SSA_NAME expressions
2    Copyright (C) 2003-2022 Free Software Foundation, Inc.
3 
4 This file is part of GCC.
5 
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.
10 
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.
15 
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/>.  */
19 
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"
35 
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.
39 
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.
43 
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).
49 
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.
53 
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.
57 
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.  */
62 
63 
64 /* Version numbers with special meanings.  We start allocating new version
65    numbers after the special ones.  */
66 #define UNUSED_NAME_VERSION 0
67 
68 unsigned int ssa_name_nodes_reused;
69 unsigned int ssa_name_nodes_created;
70 
71 #define FREE_SSANAMES(fun) (fun)->gimple_df->free_ssanames
72 #define FREE_SSANAMES_QUEUE(fun) (fun)->gimple_df->free_ssanames_queue
73 
74 
75 /* Initialize management of SSA_NAMEs to default SIZE.  If SIZE is
76    zero use default.  */
77 
78 void
init_ssanames(struct function * fn,int size)79 init_ssanames (struct function *fn, int size)
80 {
81   if (!size)
82     vec_alloc (SSANAMES (fn), 50);
83   else
84     vec_safe_reserve (SSANAMES (fn), size, true);
85 
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.
90 
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;
96 
97   fn->gimple_df->ssa_renaming_needed = 0;
98   fn->gimple_df->rename_vops = 0;
99 }
100 
101 /* Finalize management of SSA_NAMEs.  */
102 
103 void
fini_ssanames(struct function * fn)104 fini_ssanames (struct function *fn)
105 {
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));
117 }
118 
119 /* Dump some simple statistics regarding the re-use of SSA_NAME nodes.  */
120 
121 void
ssanames_print_statistics(void)122 ssanames_print_statistics (void)
123 {
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));
128 }
129 
130 /* Verify the state of the SSA_NAME lists.
131 
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.  */
136 
137 DEBUG_FUNCTION void
verify_ssaname_freelists(struct function * fun)138 verify_ssaname_freelists (struct function *fun)
139 {
140   if (!gimple_in_ssa_p (fun))
141     return;
142 
143   auto_bitmap names_in_il;
144 
145   /* Walk the entire IL noting every SSA_NAME we see.  */
146   basic_block bb;
147   FOR_EACH_BB_FN (bb, fun)
148     {
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))
154 	{
155 	  gphi *phi = gsi.phi ();
156 	  t = gimple_phi_result (phi);
157 	  bitmap_set_bit (names_in_il, SSA_NAME_VERSION (t));
158 
159 	  for (unsigned int i = 0; i < gimple_phi_num_args (phi); i++)
160 	    {
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));
164 	    }
165 	}
166 
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))
171 	{
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));
176 	}
177     }
178 
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))
183     {
184       for (unsigned int i = 0; i < FREE_SSANAMES (fun)->length (); i++)
185 	{
186 	  tree t = (*FREE_SSANAMES (fun))[i];
187 
188 	  /* Verify that the name is marked as being in the free list.  */
189 	  gcc_assert (SSA_NAME_IN_FREE_LIST (t));
190 
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));
195 	}
196     }
197 
198   /* Similarly for the names in the pending free list.  */
199   if (FREE_SSANAMES_QUEUE (fun))
200     {
201       for (unsigned int i = 0; i < FREE_SSANAMES_QUEUE (fun)->length (); i++)
202 	{
203 	  tree t = (*FREE_SSANAMES_QUEUE (fun))[i];
204 
205 	  /* Verify that the name is marked as being in the free list.  */
206 	  gcc_assert (SSA_NAME_IN_FREE_LIST (t));
207 
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));
212 	}
213     }
214 
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);
219 
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);
224 
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);
234 
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);
240 
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));
246 }
247 
248 /* Move all SSA_NAMEs from FREE_SSA_NAMES_QUEUE to FREE_SSA_NAMES.
249 
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.  */
253 
254 void
flush_ssaname_freelist(void)255 flush_ssaname_freelist (void)
256 {
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);
262 }
263 
264 /* Initialize SSA_NAME_IMM_USE_NODE of a SSA NAME.  */
265 
266 void
init_ssa_name_imm_use(tree name)267 init_ssa_name_imm_use (tree name)
268 {
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;
275 }
276 
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.  */
282 
283 tree
make_ssa_name_fn(struct function * fn,tree var,gimple * stmt,unsigned int version)284 make_ssa_name_fn (struct function *fn, tree var, gimple *stmt,
285 		  unsigned int version)
286 {
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)));
292 
293   /* Get the specified SSA name version.  */
294   if (version != 0)
295     {
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++;
303     }
304   /* If our free list has an element, then use it.  */
305   else if (!vec_safe_is_empty (FREE_SSANAMES (fn)))
306     {
307       t = FREE_SSANAMES (fn)->pop ();
308       ssa_name_nodes_reused++;
309 
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;
314     }
315   else
316     {
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++;
321     }
322 
323   if (TYPE_P (var))
324     {
325       TREE_TYPE (t) = TYPE_MAIN_VARIANT (var);
326       SET_SSA_NAME_VAR_OR_IDENTIFIER (t, NULL_TREE);
327     }
328   else
329     {
330       TREE_TYPE (t) = TREE_TYPE (var);
331       SET_SSA_NAME_VAR_OR_IDENTIFIER (t, var);
332     }
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;
338 
339   SSA_NAME_IN_FREE_LIST (t) = 0;
340   SSA_NAME_IS_DEFAULT_DEF (t) = 0;
341   init_ssa_name_imm_use (t);
342 
343   return t;
344 }
345 
346 /* Helper function for set_range_info.
347 
348    Store range information RANGE_TYPE, MIN, and MAX to tree ssa_name
349    NAME.  */
350 
351 void
set_range_info_raw(tree name,enum value_range_kind range_type,const wide_int_ref & min,const wide_int_ref & max)352 set_range_info_raw (tree name, enum value_range_kind range_type,
353 		    const wide_int_ref &min, const wide_int_ref &max)
354 {
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));
359 
360   /* Allocate if not available.  */
361   if (ri == NULL)
362     {
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));
369     }
370 
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);
374 
375   /* Set the values.  */
376   ri->set_min (min);
377   ri->set_max (max);
378 
379   /* If it is a range, try to improve nonzero_bits from the min/max.  */
380   if (range_type == VR_RANGE)
381     {
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));
386     }
387 }
388 
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.  */
391 
392 void
set_range_info(tree name,enum value_range_kind range_type,const wide_int_ref & min,const wide_int_ref & max)393 set_range_info (tree name, enum value_range_kind range_type,
394 		const wide_int_ref &min, const wide_int_ref &max)
395 {
396   gcc_assert (!POINTER_TYPE_P (TREE_TYPE (name)));
397 
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)))
402     {
403       range_info_def *ri = SSA_NAME_RANGE_INFO (name);
404       if (ri == NULL)
405 	return;
406       if (ri->get_nonzero_bits () == -1)
407 	{
408 	  ggc_free (ri);
409 	  SSA_NAME_RANGE_INFO (name) = NULL;
410 	  return;
411 	}
412     }
413 
414   set_range_info_raw (name, range_type, min, max);
415 }
416 
417 /* Store range information for NAME from a value_range.  */
418 
419 void
set_range_info(tree name,const value_range & vr)420 set_range_info (tree name, const value_range &vr)
421 {
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);
425 }
426 
427 /* Set nonnull attribute to pointer NAME.  */
428 
429 void
set_ptr_nonnull(tree name)430 set_ptr_nonnull (tree name)
431 {
432   gcc_assert (POINTER_TYPE_P (TREE_TYPE (name)));
433   struct ptr_info_def *pi = get_ptr_info (name);
434   pi->pt.null = 0;
435 }
436 
437 /* Change non-zero bits bitmask of NAME.  */
438 
439 void
set_nonzero_bits(tree name,const wide_int_ref & mask)440 set_nonzero_bits (tree name, const wide_int_ref &mask)
441 {
442   gcc_assert (!POINTER_TYPE_P (TREE_TYPE (name)));
443   if (SSA_NAME_RANGE_INFO (name) == NULL)
444     {
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))));
450     }
451   range_info_def *ri = SSA_NAME_RANGE_INFO (name);
452   ri->set_nonzero_bits (mask);
453 }
454 
455 /* Return a widest_int with potentially non-zero bits in SSA_NAME
456    NAME, the constant for INTEGER_CST, or -1 if unknown.  */
457 
458 wide_int
get_nonzero_bits(const_tree name)459 get_nonzero_bits (const_tree name)
460 {
461   if (TREE_CODE (name) == INTEGER_CST)
462     return wi::to_wide (name);
463 
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)))
468     {
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);
474     }
475 
476   range_info_def *ri = SSA_NAME_RANGE_INFO (name);
477   if (!ri)
478     return wi::shwi (-1, precision);
479 
480   return ri->get_nonzero_bits ();
481 }
482 
483 /* Return TRUE is OP, an SSA_NAME has a range of values [0..1], false
484    otherwise.
485 
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.  */
489 
490 bool
ssa_name_has_boolean_range(tree op)491 ssa_name_has_boolean_range (tree op)
492 {
493   gcc_assert (TREE_CODE (op) == SSA_NAME);
494 
495   /* Boolean types always have a range [0..1].  */
496   if (TREE_CODE (TREE_TYPE (op)) == BOOLEAN_TYPE)
497     return true;
498 
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;
504 
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))
510     {
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;
516 
517       if (wi::eq_p (get_nonzero_bits (op), 1))
518 	return true;
519     }
520 
521   return false;
522 }
523 
524 /* We no longer need the SSA_NAME expression VAR, release it so that
525    it may be reused.
526 
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.  */
531 
532 void
release_ssa_name_fn(struct function * fn,tree var)533 release_ssa_name_fn (struct function *fn, tree var)
534 {
535   if (!var)
536     return;
537 
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;
542 
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))
546     {
547       release_ssa_name_after_update_ssa (var);
548       return;
549     }
550 
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.
555 
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))
559     {
560       int saved_ssa_name_version = SSA_NAME_VERSION (var);
561       use_operand_p imm = &(SSA_NAME_IMM_USE_NODE (var));
562 
563       if (MAY_HAVE_DEBUG_BIND_STMTS)
564 	insert_debug_temp_for_var_def (NULL, var);
565 
566       if (flag_checking)
567 	verify_imm_links (stderr, var);
568       while (imm->next != imm)
569 	delink_imm_use (imm->next);
570 
571       (*SSANAMES (fn))[SSA_NAME_VERSION (var)] = NULL_TREE;
572       memset (var, 0, tree_size (var));
573 
574       imm->prev = imm;
575       imm->next = imm;
576       imm->loc.ssa_name = var;
577 
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);
581 
582       /* Restore the version number.  */
583       SSA_NAME_VERSION (var) = saved_ssa_name_version;
584 
585       /* Note this SSA_NAME is now in the first list.  */
586       SSA_NAME_IN_FREE_LIST (var) = 1;
587 
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;
592 
593       /* And finally queue it so that it will be put on the free list.  */
594       vec_safe_push (FREE_SSANAMES_QUEUE (fn), var);
595     }
596 }
597 
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.  */
601 
602 bool
get_ptr_info_alignment(struct ptr_info_def * pi,unsigned int * alignp,unsigned int * misalignp)603 get_ptr_info_alignment (struct ptr_info_def *pi, unsigned int *alignp,
604 			unsigned int *misalignp)
605 {
606   if (pi->align)
607     {
608       *alignp = pi->align;
609       *misalignp = pi->misalign;
610       return true;
611     }
612   else
613     return false;
614 }
615 
616 /* State that the pointer described by PI has unknown alignment.  */
617 
618 void
mark_ptr_info_alignment_unknown(struct ptr_info_def * pi)619 mark_ptr_info_alignment_unknown (struct ptr_info_def *pi)
620 {
621   pi->align = 0;
622   pi->misalign = 0;
623 }
624 
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.  */
628 
629 void
set_ptr_info_alignment(struct ptr_info_def * pi,unsigned int align,unsigned int misalign)630 set_ptr_info_alignment (struct ptr_info_def *pi, unsigned int align,
631 			    unsigned int misalign)
632 {
633   gcc_checking_assert (align != 0);
634   gcc_assert ((align & (align - 1)) == 0);
635   gcc_assert ((misalign & ~(align - 1)) == 0);
636 
637   pi->align = align;
638   pi->misalign = misalign;
639 }
640 
641 /* If pointer described by PI has known alignment, increase its known
642    misalignment by INCREMENT modulo its current alignment.  */
643 
644 void
adjust_ptr_info_misalignment(struct ptr_info_def * pi,poly_uint64 increment)645 adjust_ptr_info_misalignment (struct ptr_info_def *pi, poly_uint64 increment)
646 {
647   if (pi->align != 0)
648     {
649       increment += pi->misalign;
650       if (!known_misalignment (increment, pi->align, &pi->misalign))
651 	{
652 	  pi->align = known_alignment (increment);
653 	  pi->misalign = 0;
654 	}
655     }
656 }
657 
658 /* Return the alias information associated with pointer T.  It creates a
659    new instance if none existed.  */
660 
661 struct ptr_info_def *
get_ptr_info(tree t)662 get_ptr_info (tree t)
663 {
664   struct ptr_info_def *pi;
665 
666   gcc_assert (POINTER_TYPE_P (TREE_TYPE (t)));
667 
668   pi = SSA_NAME_PTR_INFO (t);
669   if (pi == NULL)
670     {
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;
675     }
676 
677   return pi;
678 }
679 
680 
681 /* Creates a new SSA name using the template NAME tobe defined by
682    statement STMT in function FN.  */
683 
684 tree
copy_ssa_name_fn(struct function * fn,tree name,gimple * stmt)685 copy_ssa_name_fn (struct function *fn, tree name, gimple *stmt)
686 {
687   tree new_name;
688 
689   if (SSA_NAME_VAR (name))
690     new_name = make_ssa_name_fn (fn, SSA_NAME_VAR (name), stmt);
691   else
692     {
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));
695     }
696 
697   return new_name;
698 }
699 
700 
701 /* Creates a duplicate of the ptr_info_def at PTR_INFO for use by
702    the SSA name NAME.  */
703 
704 void
duplicate_ssa_name_ptr_info(tree name,struct ptr_info_def * ptr_info)705 duplicate_ssa_name_ptr_info (tree name, struct ptr_info_def *ptr_info)
706 {
707   struct ptr_info_def *new_ptr_info;
708 
709   gcc_assert (POINTER_TYPE_P (TREE_TYPE (name)));
710   gcc_assert (!SSA_NAME_PTR_INFO (name));
711 
712   if (!ptr_info)
713     return;
714 
715   new_ptr_info = ggc_alloc<ptr_info_def> ();
716   *new_ptr_info = *ptr_info;
717 
718   SSA_NAME_PTR_INFO (name) = new_ptr_info;
719 }
720 
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
duplicate_ssa_name_range_info(tree name,enum value_range_kind range_type,struct range_info_def * range_info)724 duplicate_ssa_name_range_info (tree name, enum value_range_kind range_type,
725 			       struct range_info_def *range_info)
726 {
727   struct range_info_def *new_range_info;
728 
729   gcc_assert (!POINTER_TYPE_P (TREE_TYPE (name)));
730   gcc_assert (!SSA_NAME_RANGE_INFO (name));
731 
732   if (!range_info)
733     return;
734 
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);
740 
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;
744 }
745 
746 
747 
748 /* Creates a duplicate of a ssa name NAME tobe defined by statement STMT
749    in function FN.  */
750 
751 tree
duplicate_ssa_name_fn(struct function * fn,tree name,gimple * stmt)752 duplicate_ssa_name_fn (struct function *fn, tree name, gimple *stmt)
753 {
754   tree new_name = copy_ssa_name_fn (fn, name, stmt);
755   if (POINTER_TYPE_P (TREE_TYPE (name)))
756     {
757       struct ptr_info_def *old_ptr_info = SSA_NAME_PTR_INFO (name);
758 
759       if (old_ptr_info)
760 	duplicate_ssa_name_ptr_info (new_name, old_ptr_info);
761     }
762   else
763     {
764       struct range_info_def *old_range_info = SSA_NAME_RANGE_INFO (name);
765 
766       if (old_range_info)
767 	duplicate_ssa_name_range_info (new_name, SSA_NAME_RANGE_TYPE (name),
768 				       old_range_info);
769     }
770 
771   return new_name;
772 }
773 
774 
775 /* Reset all flow sensitive data on NAME such as range-info, nonzero
776    bits and alignment.  */
777 
778 void
reset_flow_sensitive_info(tree name)779 reset_flow_sensitive_info (tree name)
780 {
781   if (POINTER_TYPE_P (TREE_TYPE (name)))
782     {
783       /* points-to info is not flow-sensitive.  */
784       if (SSA_NAME_PTR_INFO (name))
785 	{
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;
790 	}
791     }
792   else
793     SSA_NAME_RANGE_INFO (name) = NULL;
794 }
795 
796 /* Clear all flow sensitive data from all statements and PHI definitions
797    in BB.  */
798 
799 void
reset_flow_sensitive_info_in_bb(basic_block bb)800 reset_flow_sensitive_info_in_bb (basic_block bb)
801 {
802   for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi);
803        gsi_next (&gsi))
804     {
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);
810     }
811 
812   for (gphi_iterator gsi = gsi_start_phis (bb); !gsi_end_p (gsi);
813        gsi_next (&gsi))
814     {
815       tree phi_def = gimple_phi_result (gsi.phi ());
816       reset_flow_sensitive_info (phi_def);
817     }
818 }
819 
820 /* Release all the SSA_NAMEs created by STMT.  */
821 
822 void
release_defs(gimple * stmt)823 release_defs (gimple *stmt)
824 {
825   tree def;
826   ssa_op_iter iter;
827 
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);
831 }
832 
833 
834 /* Replace the symbol associated with SSA_NAME with SYM.  */
835 
836 void
replace_ssa_name_symbol(tree ssa_name,tree sym)837 replace_ssa_name_symbol (tree ssa_name, tree sym)
838 {
839   SET_SSA_NAME_VAR_OR_IDENTIFIER (ssa_name, sym);
840   TREE_TYPE (ssa_name) = TREE_TYPE (sym);
841 }
842 
843 /* Release the vector of free SSA_NAMEs and compact the vector of SSA_NAMEs
844    that are live.  */
845 
846 static void
release_free_names_and_compact_live_names(function * fun)847 release_free_names_and_compact_live_names (function *fun)
848 {
849   unsigned i, j;
850   int n = vec_safe_length (FREE_SSANAMES (fun));
851 
852   /* Now release the freelist.  */
853   vec_free (FREE_SSANAMES (fun));
854 
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)
858     {
859       tree name = ssa_name (i);
860       if (name)
861 	{
862 	  if (i != j)
863 	    {
864 	      SSA_NAME_VERSION (name) = j;
865 	      (*fun->gimple_df->ssa_names)[j] = name;
866 	    }
867 	  j++;
868 	}
869     }
870   fun->gimple_df->ssa_names->truncate (j);
871 
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);
877 }
878 
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.  */
882 
883 namespace {
884 
885 const pass_data pass_data_release_ssa_names =
886 {
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 */
896 };
897 
898 class pass_release_ssa_names : public gimple_opt_pass
899 {
900 public:
pass_release_ssa_names(gcc::context * ctxt)901   pass_release_ssa_names (gcc::context *ctxt)
902     : gimple_opt_pass (pass_data_release_ssa_names, ctxt)
903   {}
904 
905   /* opt_pass methods: */
906   virtual unsigned int execute (function *);
907 
908 }; // class pass_release_ssa_names
909 
910 unsigned int
execute(function * fun)911 pass_release_ssa_names::execute (function *fun)
912 {
913   release_free_names_and_compact_live_names (fun);
914   return 0;
915 }
916 
917 } // anon namespace
918 
919 gimple_opt_pass *
make_pass_release_ssa_names(gcc::context * ctxt)920 make_pass_release_ssa_names (gcc::context *ctxt)
921 {
922   return new pass_release_ssa_names (ctxt);
923 }
924