1*38fd1498Szrj /* Generic routines for manipulating SSA_NAME expressions
2*38fd1498Szrj    Copyright (C) 2003-2018 Free Software Foundation, Inc.
3*38fd1498Szrj 
4*38fd1498Szrj This file is part of GCC.
5*38fd1498Szrj 
6*38fd1498Szrj GCC is free software; you can redistribute it and/or modify
7*38fd1498Szrj it under the terms of the GNU General Public License as published by
8*38fd1498Szrj the Free Software Foundation; either version 3, or (at your option)
9*38fd1498Szrj any later version.
10*38fd1498Szrj 
11*38fd1498Szrj GCC is distributed in the hope that it will be useful,
12*38fd1498Szrj but WITHOUT ANY WARRANTY; without even the implied warranty of
13*38fd1498Szrj MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14*38fd1498Szrj GNU General Public License for more details.
15*38fd1498Szrj 
16*38fd1498Szrj You should have received a copy of the GNU General Public License
17*38fd1498Szrj along with GCC; see the file COPYING3.  If not see
18*38fd1498Szrj <http://www.gnu.org/licenses/>.  */
19*38fd1498Szrj 
20*38fd1498Szrj #include "config.h"
21*38fd1498Szrj #include "system.h"
22*38fd1498Szrj #include "coretypes.h"
23*38fd1498Szrj #include "backend.h"
24*38fd1498Szrj #include "tree.h"
25*38fd1498Szrj #include "gimple.h"
26*38fd1498Szrj #include "tree-pass.h"
27*38fd1498Szrj #include "ssa.h"
28*38fd1498Szrj #include "gimple-iterator.h"
29*38fd1498Szrj #include "stor-layout.h"
30*38fd1498Szrj #include "tree-into-ssa.h"
31*38fd1498Szrj #include "tree-ssa.h"
32*38fd1498Szrj #include "cfgloop.h"
33*38fd1498Szrj #include "tree-scalar-evolution.h"
34*38fd1498Szrj 
35*38fd1498Szrj /* Rewriting a function into SSA form can create a huge number of SSA_NAMEs,
36*38fd1498Szrj    many of which may be thrown away shortly after their creation if jumps
37*38fd1498Szrj    were threaded through PHI nodes.
38*38fd1498Szrj 
39*38fd1498Szrj    While our garbage collection mechanisms will handle this situation, it
40*38fd1498Szrj    is extremely wasteful to create nodes and throw them away, especially
41*38fd1498Szrj    when the nodes can be reused.
42*38fd1498Szrj 
43*38fd1498Szrj    For PR 8361, we can significantly reduce the number of nodes allocated
44*38fd1498Szrj    and thus the total amount of memory allocated by managing SSA_NAMEs a
45*38fd1498Szrj    little.  This additionally helps reduce the amount of work done by the
46*38fd1498Szrj    garbage collector.  Similar results have been seen on a wider variety
47*38fd1498Szrj    of tests (such as the compiler itself).
48*38fd1498Szrj 
49*38fd1498Szrj    Right now we maintain our free list on a per-function basis.  It may
50*38fd1498Szrj    or may not make sense to maintain the free list for the duration of
51*38fd1498Szrj    a compilation unit.
52*38fd1498Szrj 
53*38fd1498Szrj    External code should rely solely upon HIGHEST_SSA_VERSION and the
54*38fd1498Szrj    externally defined functions.  External code should not know about
55*38fd1498Szrj    the details of the free list management.
56*38fd1498Szrj 
57*38fd1498Szrj    External code should also not assume the version number on nodes is
58*38fd1498Szrj    monotonically increasing.  We reuse the version number when we
59*38fd1498Szrj    reuse an SSA_NAME expression.  This helps keep arrays and bitmaps
60*38fd1498Szrj    more compact.  */
61*38fd1498Szrj 
62*38fd1498Szrj 
63*38fd1498Szrj /* Version numbers with special meanings.  We start allocating new version
64*38fd1498Szrj    numbers after the special ones.  */
65*38fd1498Szrj #define UNUSED_NAME_VERSION 0
66*38fd1498Szrj 
67*38fd1498Szrj unsigned int ssa_name_nodes_reused;
68*38fd1498Szrj unsigned int ssa_name_nodes_created;
69*38fd1498Szrj 
70*38fd1498Szrj #define FREE_SSANAMES(fun) (fun)->gimple_df->free_ssanames
71*38fd1498Szrj #define FREE_SSANAMES_QUEUE(fun) (fun)->gimple_df->free_ssanames_queue
72*38fd1498Szrj 
73*38fd1498Szrj 
74*38fd1498Szrj /* Initialize management of SSA_NAMEs to default SIZE.  If SIZE is
75*38fd1498Szrj    zero use default.  */
76*38fd1498Szrj 
77*38fd1498Szrj void
init_ssanames(struct function * fn,int size)78*38fd1498Szrj init_ssanames (struct function *fn, int size)
79*38fd1498Szrj {
80*38fd1498Szrj   if (size < 50)
81*38fd1498Szrj     size = 50;
82*38fd1498Szrj 
83*38fd1498Szrj   vec_alloc (SSANAMES (fn), size);
84*38fd1498Szrj 
85*38fd1498Szrj   /* Version 0 is special, so reserve the first slot in the table.  Though
86*38fd1498Szrj      currently unused, we may use version 0 in alias analysis as part of
87*38fd1498Szrj      the heuristics used to group aliases when the alias sets are too
88*38fd1498Szrj      large.
89*38fd1498Szrj 
90*38fd1498Szrj      We use vec::quick_push here because we know that SSA_NAMES has at
91*38fd1498Szrj      least 50 elements reserved in it.  */
92*38fd1498Szrj   SSANAMES (fn)->quick_push (NULL_TREE);
93*38fd1498Szrj   FREE_SSANAMES (fn) = NULL;
94*38fd1498Szrj   FREE_SSANAMES_QUEUE (fn) = NULL;
95*38fd1498Szrj 
96*38fd1498Szrj   fn->gimple_df->ssa_renaming_needed = 0;
97*38fd1498Szrj   fn->gimple_df->rename_vops = 0;
98*38fd1498Szrj }
99*38fd1498Szrj 
100*38fd1498Szrj /* Finalize management of SSA_NAMEs.  */
101*38fd1498Szrj 
102*38fd1498Szrj void
fini_ssanames(struct function * fn)103*38fd1498Szrj fini_ssanames (struct function *fn)
104*38fd1498Szrj {
105*38fd1498Szrj   vec_free (SSANAMES (fn));
106*38fd1498Szrj   vec_free (FREE_SSANAMES (fn));
107*38fd1498Szrj   vec_free (FREE_SSANAMES_QUEUE (fn));
108*38fd1498Szrj }
109*38fd1498Szrj 
110*38fd1498Szrj /* Dump some simple statistics regarding the re-use of SSA_NAME nodes.  */
111*38fd1498Szrj 
112*38fd1498Szrj void
ssanames_print_statistics(void)113*38fd1498Szrj ssanames_print_statistics (void)
114*38fd1498Szrj {
115*38fd1498Szrj   fprintf (stderr, "SSA_NAME nodes allocated: %u\n", ssa_name_nodes_created);
116*38fd1498Szrj   fprintf (stderr, "SSA_NAME nodes reused: %u\n", ssa_name_nodes_reused);
117*38fd1498Szrj }
118*38fd1498Szrj 
119*38fd1498Szrj /* Verify the state of the SSA_NAME lists.
120*38fd1498Szrj 
121*38fd1498Szrj    There must be no duplicates on the free list.
122*38fd1498Szrj    Every name on the free list must be marked as on the free list.
123*38fd1498Szrj    Any name on the free list must not appear in the IL.
124*38fd1498Szrj    No names can be leaked.  */
125*38fd1498Szrj 
126*38fd1498Szrj DEBUG_FUNCTION void
verify_ssaname_freelists(struct function * fun)127*38fd1498Szrj verify_ssaname_freelists (struct function *fun)
128*38fd1498Szrj {
129*38fd1498Szrj   if (!gimple_in_ssa_p (fun))
130*38fd1498Szrj     return;
131*38fd1498Szrj 
132*38fd1498Szrj   auto_bitmap names_in_il;
133*38fd1498Szrj 
134*38fd1498Szrj   /* Walk the entire IL noting every SSA_NAME we see.  */
135*38fd1498Szrj   basic_block bb;
136*38fd1498Szrj   FOR_EACH_BB_FN (bb, fun)
137*38fd1498Szrj     {
138*38fd1498Szrj       tree t;
139*38fd1498Szrj       /* First note the result and arguments of PHI nodes.  */
140*38fd1498Szrj       for (gphi_iterator gsi = gsi_start_phis (bb);
141*38fd1498Szrj 	   !gsi_end_p (gsi);
142*38fd1498Szrj 	   gsi_next (&gsi))
143*38fd1498Szrj 	{
144*38fd1498Szrj 	  gphi *phi = gsi.phi ();
145*38fd1498Szrj 	  t = gimple_phi_result (phi);
146*38fd1498Szrj 	  bitmap_set_bit (names_in_il, SSA_NAME_VERSION (t));
147*38fd1498Szrj 
148*38fd1498Szrj 	  for (unsigned int i = 0; i < gimple_phi_num_args (phi); i++)
149*38fd1498Szrj 	    {
150*38fd1498Szrj 	      t = gimple_phi_arg_def (phi, i);
151*38fd1498Szrj 	      if (TREE_CODE (t) == SSA_NAME)
152*38fd1498Szrj 		bitmap_set_bit (names_in_il, SSA_NAME_VERSION (t));
153*38fd1498Szrj 	    }
154*38fd1498Szrj 	}
155*38fd1498Szrj 
156*38fd1498Szrj       /* Then note the operands of each statement.  */
157*38fd1498Szrj       for (gimple_stmt_iterator gsi = gsi_start_bb (bb);
158*38fd1498Szrj 	   !gsi_end_p (gsi);
159*38fd1498Szrj 	   gsi_next (&gsi))
160*38fd1498Szrj 	{
161*38fd1498Szrj 	  ssa_op_iter iter;
162*38fd1498Szrj 	  gimple *stmt = gsi_stmt (gsi);
163*38fd1498Szrj 	  FOR_EACH_SSA_TREE_OPERAND (t, stmt, iter, SSA_OP_ALL_OPERANDS)
164*38fd1498Szrj 	    bitmap_set_bit (names_in_il, SSA_NAME_VERSION (t));
165*38fd1498Szrj 	}
166*38fd1498Szrj     }
167*38fd1498Szrj 
168*38fd1498Szrj   /* Now walk the free list noting what we find there and verifying
169*38fd1498Szrj      there are no duplicates.  */
170*38fd1498Szrj   auto_bitmap names_in_freelists;
171*38fd1498Szrj   if (FREE_SSANAMES (fun))
172*38fd1498Szrj     {
173*38fd1498Szrj       for (unsigned int i = 0; i < FREE_SSANAMES (fun)->length (); i++)
174*38fd1498Szrj 	{
175*38fd1498Szrj 	  tree t = (*FREE_SSANAMES (fun))[i];
176*38fd1498Szrj 
177*38fd1498Szrj 	  /* Verify that the name is marked as being in the free list.  */
178*38fd1498Szrj 	  gcc_assert (SSA_NAME_IN_FREE_LIST (t));
179*38fd1498Szrj 
180*38fd1498Szrj 	  /* Verify the name has not already appeared in the free list and
181*38fd1498Szrj 	     note it in the list of names found in the free list.  */
182*38fd1498Szrj 	  gcc_assert (!bitmap_bit_p (names_in_freelists, SSA_NAME_VERSION (t)));
183*38fd1498Szrj 	  bitmap_set_bit (names_in_freelists, SSA_NAME_VERSION (t));
184*38fd1498Szrj 	}
185*38fd1498Szrj     }
186*38fd1498Szrj 
187*38fd1498Szrj   /* Similarly for the names in the pending free list.  */
188*38fd1498Szrj   if (FREE_SSANAMES_QUEUE (fun))
189*38fd1498Szrj     {
190*38fd1498Szrj       for (unsigned int i = 0; i < FREE_SSANAMES_QUEUE (fun)->length (); i++)
191*38fd1498Szrj 	{
192*38fd1498Szrj 	  tree t = (*FREE_SSANAMES_QUEUE (fun))[i];
193*38fd1498Szrj 
194*38fd1498Szrj 	  /* Verify that the name is marked as being in the free list.  */
195*38fd1498Szrj 	  gcc_assert (SSA_NAME_IN_FREE_LIST (t));
196*38fd1498Szrj 
197*38fd1498Szrj 	  /* Verify the name has not already appeared in the free list and
198*38fd1498Szrj 	     note it in the list of names found in the free list.  */
199*38fd1498Szrj 	  gcc_assert (!bitmap_bit_p (names_in_freelists, SSA_NAME_VERSION (t)));
200*38fd1498Szrj 	  bitmap_set_bit (names_in_freelists, SSA_NAME_VERSION (t));
201*38fd1498Szrj 	}
202*38fd1498Szrj     }
203*38fd1498Szrj 
204*38fd1498Szrj   /* If any name appears in both the IL and the freelists, then
205*38fd1498Szrj      something horrible has happened.  */
206*38fd1498Szrj   bool intersect_p = bitmap_intersect_p (names_in_il, names_in_freelists);
207*38fd1498Szrj   gcc_assert (!intersect_p);
208*38fd1498Szrj 
209*38fd1498Szrj   /* Names can be queued up for release if there is an ssa update
210*38fd1498Szrj      pending.  Pretend we saw them in the IL.  */
211*38fd1498Szrj   if (names_to_release)
212*38fd1498Szrj     bitmap_ior_into (names_in_il, names_to_release);
213*38fd1498Szrj 
214*38fd1498Szrj   /* Function splitting can "lose" SSA_NAMEs in an effort to ensure that
215*38fd1498Szrj      debug/non-debug compilations have the same SSA_NAMEs.  So for each
216*38fd1498Szrj      lost SSA_NAME, see if it's likely one from that wart.  These will always
217*38fd1498Szrj      be marked as default definitions.  So we loosely assume that anything
218*38fd1498Szrj      marked as a default definition isn't leaked by pretending they are
219*38fd1498Szrj      in the IL.  */
220*38fd1498Szrj   for (unsigned int i = UNUSED_NAME_VERSION + 1; i < num_ssa_names; i++)
221*38fd1498Szrj     if (ssa_name (i) && SSA_NAME_IS_DEFAULT_DEF (ssa_name (i)))
222*38fd1498Szrj       bitmap_set_bit (names_in_il, i);
223*38fd1498Szrj 
224*38fd1498Szrj   unsigned int i;
225*38fd1498Szrj   bitmap_iterator bi;
226*38fd1498Szrj   auto_bitmap all_names;
227*38fd1498Szrj   bitmap_set_range (all_names, UNUSED_NAME_VERSION + 1, num_ssa_names - 1);
228*38fd1498Szrj   bitmap_ior_into (names_in_il, names_in_freelists);
229*38fd1498Szrj 
230*38fd1498Szrj   /* Any name not mentioned in the IL and not in the feelists
231*38fd1498Szrj      has been leaked.  */
232*38fd1498Szrj   EXECUTE_IF_AND_COMPL_IN_BITMAP(all_names, names_in_il,
233*38fd1498Szrj 				 UNUSED_NAME_VERSION + 1, i, bi)
234*38fd1498Szrj     gcc_assert (!ssa_name (i));
235*38fd1498Szrj }
236*38fd1498Szrj 
237*38fd1498Szrj /* Move all SSA_NAMEs from FREE_SSA_NAMES_QUEUE to FREE_SSA_NAMES.
238*38fd1498Szrj 
239*38fd1498Szrj    We do not, but should have a mode to verify the state of the SSA_NAMEs
240*38fd1498Szrj    lists.  In particular at this point every name must be in the IL,
241*38fd1498Szrj    on the free list or in the queue.  Anything else is an error.  */
242*38fd1498Szrj 
243*38fd1498Szrj void
flush_ssaname_freelist(void)244*38fd1498Szrj flush_ssaname_freelist (void)
245*38fd1498Szrj {
246*38fd1498Szrj   /* If there were any SSA names released reset the SCEV cache.  */
247*38fd1498Szrj   if (! vec_safe_is_empty (FREE_SSANAMES_QUEUE (cfun)))
248*38fd1498Szrj     scev_reset_htab ();
249*38fd1498Szrj   vec_safe_splice (FREE_SSANAMES (cfun), FREE_SSANAMES_QUEUE (cfun));
250*38fd1498Szrj   vec_safe_truncate (FREE_SSANAMES_QUEUE (cfun), 0);
251*38fd1498Szrj }
252*38fd1498Szrj 
253*38fd1498Szrj /* Return an SSA_NAME node for variable VAR defined in statement STMT
254*38fd1498Szrj    in function FN.  STMT may be an empty statement for artificial
255*38fd1498Szrj    references (e.g., default definitions created when a variable is
256*38fd1498Szrj    used without a preceding definition).  If VERISON is not zero then
257*38fd1498Szrj    allocate the SSA name with that version.  */
258*38fd1498Szrj 
259*38fd1498Szrj tree
make_ssa_name_fn(struct function * fn,tree var,gimple * stmt,unsigned int version)260*38fd1498Szrj make_ssa_name_fn (struct function *fn, tree var, gimple *stmt,
261*38fd1498Szrj 		  unsigned int version)
262*38fd1498Szrj {
263*38fd1498Szrj   tree t;
264*38fd1498Szrj   use_operand_p imm;
265*38fd1498Szrj 
266*38fd1498Szrj   gcc_assert (VAR_P (var)
267*38fd1498Szrj 	      || TREE_CODE (var) == PARM_DECL
268*38fd1498Szrj 	      || TREE_CODE (var) == RESULT_DECL
269*38fd1498Szrj 	      || (TYPE_P (var) && is_gimple_reg_type (var)));
270*38fd1498Szrj 
271*38fd1498Szrj   /* Get the specified SSA name version.  */
272*38fd1498Szrj   if (version != 0)
273*38fd1498Szrj     {
274*38fd1498Szrj       t = make_node (SSA_NAME);
275*38fd1498Szrj       SSA_NAME_VERSION (t) = version;
276*38fd1498Szrj       if (version >= SSANAMES (fn)->length ())
277*38fd1498Szrj 	vec_safe_grow_cleared (SSANAMES (fn), version + 1);
278*38fd1498Szrj       gcc_assert ((*SSANAMES (fn))[version] == NULL);
279*38fd1498Szrj       (*SSANAMES (fn))[version] = t;
280*38fd1498Szrj       ssa_name_nodes_created++;
281*38fd1498Szrj     }
282*38fd1498Szrj   /* If our free list has an element, then use it.  */
283*38fd1498Szrj   else if (!vec_safe_is_empty (FREE_SSANAMES (fn)))
284*38fd1498Szrj     {
285*38fd1498Szrj       t = FREE_SSANAMES (fn)->pop ();
286*38fd1498Szrj       ssa_name_nodes_reused++;
287*38fd1498Szrj 
288*38fd1498Szrj       /* The node was cleared out when we put it on the free list, so
289*38fd1498Szrj 	 there is no need to do so again here.  */
290*38fd1498Szrj       gcc_assert ((*SSANAMES (fn))[SSA_NAME_VERSION (t)] == NULL);
291*38fd1498Szrj       (*SSANAMES (fn))[SSA_NAME_VERSION (t)] = t;
292*38fd1498Szrj     }
293*38fd1498Szrj   else
294*38fd1498Szrj     {
295*38fd1498Szrj       t = make_node (SSA_NAME);
296*38fd1498Szrj       SSA_NAME_VERSION (t) = SSANAMES (fn)->length ();
297*38fd1498Szrj       vec_safe_push (SSANAMES (fn), t);
298*38fd1498Szrj       ssa_name_nodes_created++;
299*38fd1498Szrj     }
300*38fd1498Szrj 
301*38fd1498Szrj   if (TYPE_P (var))
302*38fd1498Szrj     {
303*38fd1498Szrj       TREE_TYPE (t) = TYPE_MAIN_VARIANT (var);
304*38fd1498Szrj       SET_SSA_NAME_VAR_OR_IDENTIFIER (t, NULL_TREE);
305*38fd1498Szrj     }
306*38fd1498Szrj   else
307*38fd1498Szrj     {
308*38fd1498Szrj       TREE_TYPE (t) = TREE_TYPE (var);
309*38fd1498Szrj       SET_SSA_NAME_VAR_OR_IDENTIFIER (t, var);
310*38fd1498Szrj     }
311*38fd1498Szrj   SSA_NAME_DEF_STMT (t) = stmt;
312*38fd1498Szrj   if (POINTER_TYPE_P (TREE_TYPE (t)))
313*38fd1498Szrj     SSA_NAME_PTR_INFO (t) = NULL;
314*38fd1498Szrj   else
315*38fd1498Szrj     SSA_NAME_RANGE_INFO (t) = NULL;
316*38fd1498Szrj 
317*38fd1498Szrj   SSA_NAME_IN_FREE_LIST (t) = 0;
318*38fd1498Szrj   SSA_NAME_IS_DEFAULT_DEF (t) = 0;
319*38fd1498Szrj   imm = &(SSA_NAME_IMM_USE_NODE (t));
320*38fd1498Szrj   imm->use = NULL;
321*38fd1498Szrj   imm->prev = imm;
322*38fd1498Szrj   imm->next = imm;
323*38fd1498Szrj   imm->loc.ssa_name = t;
324*38fd1498Szrj 
325*38fd1498Szrj   return t;
326*38fd1498Szrj }
327*38fd1498Szrj 
328*38fd1498Szrj /* Helper function for set_range_info.
329*38fd1498Szrj 
330*38fd1498Szrj    Store range information RANGE_TYPE, MIN, and MAX to tree ssa_name
331*38fd1498Szrj    NAME.  */
332*38fd1498Szrj 
333*38fd1498Szrj void
set_range_info_raw(tree name,enum value_range_type range_type,const wide_int_ref & min,const wide_int_ref & max)334*38fd1498Szrj set_range_info_raw (tree name, enum value_range_type range_type,
335*38fd1498Szrj 		    const wide_int_ref &min, const wide_int_ref &max)
336*38fd1498Szrj {
337*38fd1498Szrj   gcc_assert (!POINTER_TYPE_P (TREE_TYPE (name)));
338*38fd1498Szrj   gcc_assert (range_type == VR_RANGE || range_type == VR_ANTI_RANGE);
339*38fd1498Szrj   range_info_def *ri = SSA_NAME_RANGE_INFO (name);
340*38fd1498Szrj   unsigned int precision = TYPE_PRECISION (TREE_TYPE (name));
341*38fd1498Szrj 
342*38fd1498Szrj   /* Allocate if not available.  */
343*38fd1498Szrj   if (ri == NULL)
344*38fd1498Szrj     {
345*38fd1498Szrj       size_t size = (sizeof (range_info_def)
346*38fd1498Szrj 		     + trailing_wide_ints <3>::extra_size (precision));
347*38fd1498Szrj       ri = static_cast<range_info_def *> (ggc_internal_alloc (size));
348*38fd1498Szrj       ri->ints.set_precision (precision);
349*38fd1498Szrj       SSA_NAME_RANGE_INFO (name) = ri;
350*38fd1498Szrj       ri->set_nonzero_bits (wi::shwi (-1, precision));
351*38fd1498Szrj     }
352*38fd1498Szrj 
353*38fd1498Szrj   /* Record the range type.  */
354*38fd1498Szrj   if (SSA_NAME_RANGE_TYPE (name) != range_type)
355*38fd1498Szrj     SSA_NAME_ANTI_RANGE_P (name) = (range_type == VR_ANTI_RANGE);
356*38fd1498Szrj 
357*38fd1498Szrj   /* Set the values.  */
358*38fd1498Szrj   ri->set_min (min);
359*38fd1498Szrj   ri->set_max (max);
360*38fd1498Szrj 
361*38fd1498Szrj   /* If it is a range, try to improve nonzero_bits from the min/max.  */
362*38fd1498Szrj   if (range_type == VR_RANGE)
363*38fd1498Szrj     {
364*38fd1498Szrj       wide_int xorv = ri->get_min () ^ ri->get_max ();
365*38fd1498Szrj       if (xorv != 0)
366*38fd1498Szrj 	xorv = wi::mask (precision - wi::clz (xorv), false, precision);
367*38fd1498Szrj       ri->set_nonzero_bits (ri->get_nonzero_bits () & (ri->get_min () | xorv));
368*38fd1498Szrj     }
369*38fd1498Szrj }
370*38fd1498Szrj 
371*38fd1498Szrj /* Store range information RANGE_TYPE, MIN, and MAX to tree ssa_name
372*38fd1498Szrj    NAME while making sure we don't store useless range info.  */
373*38fd1498Szrj 
374*38fd1498Szrj void
set_range_info(tree name,enum value_range_type range_type,const wide_int_ref & min,const wide_int_ref & max)375*38fd1498Szrj set_range_info (tree name, enum value_range_type range_type,
376*38fd1498Szrj 		const wide_int_ref &min, const wide_int_ref &max)
377*38fd1498Szrj {
378*38fd1498Szrj   gcc_assert (!POINTER_TYPE_P (TREE_TYPE (name)));
379*38fd1498Szrj 
380*38fd1498Szrj   /* A range of the entire domain is really no range at all.  */
381*38fd1498Szrj   tree type = TREE_TYPE (name);
382*38fd1498Szrj   if (min == wi::min_value (TYPE_PRECISION (type), TYPE_SIGN (type))
383*38fd1498Szrj       && max == wi::max_value (TYPE_PRECISION (type), TYPE_SIGN (type)))
384*38fd1498Szrj     {
385*38fd1498Szrj       range_info_def *ri = SSA_NAME_RANGE_INFO (name);
386*38fd1498Szrj       if (ri == NULL)
387*38fd1498Szrj 	return;
388*38fd1498Szrj       if (ri->get_nonzero_bits () == -1)
389*38fd1498Szrj 	{
390*38fd1498Szrj 	  ggc_free (ri);
391*38fd1498Szrj 	  SSA_NAME_RANGE_INFO (name) = NULL;
392*38fd1498Szrj 	  return;
393*38fd1498Szrj 	}
394*38fd1498Szrj     }
395*38fd1498Szrj 
396*38fd1498Szrj   set_range_info_raw (name, range_type, min, max);
397*38fd1498Szrj }
398*38fd1498Szrj 
399*38fd1498Szrj 
400*38fd1498Szrj /* Gets range information MIN, MAX and returns enum value_range_type
401*38fd1498Szrj    corresponding to tree ssa_name NAME.  enum value_range_type returned
402*38fd1498Szrj    is used to determine if MIN and MAX are valid values.  */
403*38fd1498Szrj 
404*38fd1498Szrj enum value_range_type
get_range_info(const_tree name,wide_int * min,wide_int * max)405*38fd1498Szrj get_range_info (const_tree name, wide_int *min, wide_int *max)
406*38fd1498Szrj {
407*38fd1498Szrj   gcc_assert (!POINTER_TYPE_P (TREE_TYPE (name)));
408*38fd1498Szrj   gcc_assert (min && max);
409*38fd1498Szrj   range_info_def *ri = SSA_NAME_RANGE_INFO (name);
410*38fd1498Szrj 
411*38fd1498Szrj   /* Return VR_VARYING for SSA_NAMEs with NULL RANGE_INFO or SSA_NAMEs
412*38fd1498Szrj      with integral types width > 2 * HOST_BITS_PER_WIDE_INT precision.  */
413*38fd1498Szrj   if (!ri || (GET_MODE_PRECISION (SCALAR_INT_TYPE_MODE (TREE_TYPE (name)))
414*38fd1498Szrj 	      > 2 * HOST_BITS_PER_WIDE_INT))
415*38fd1498Szrj     return VR_VARYING;
416*38fd1498Szrj 
417*38fd1498Szrj   *min = ri->get_min ();
418*38fd1498Szrj   *max = ri->get_max ();
419*38fd1498Szrj   return SSA_NAME_RANGE_TYPE (name);
420*38fd1498Szrj }
421*38fd1498Szrj 
422*38fd1498Szrj /* Set nonnull attribute to pointer NAME.  */
423*38fd1498Szrj 
424*38fd1498Szrj void
set_ptr_nonnull(tree name)425*38fd1498Szrj set_ptr_nonnull (tree name)
426*38fd1498Szrj {
427*38fd1498Szrj   gcc_assert (POINTER_TYPE_P (TREE_TYPE (name)));
428*38fd1498Szrj   struct ptr_info_def *pi = get_ptr_info (name);
429*38fd1498Szrj   pi->pt.null = 0;
430*38fd1498Szrj }
431*38fd1498Szrj 
432*38fd1498Szrj /* Return nonnull attribute of pointer NAME.  */
433*38fd1498Szrj bool
get_ptr_nonnull(const_tree name)434*38fd1498Szrj get_ptr_nonnull (const_tree name)
435*38fd1498Szrj {
436*38fd1498Szrj   gcc_assert (POINTER_TYPE_P (TREE_TYPE (name)));
437*38fd1498Szrj   struct ptr_info_def *pi = SSA_NAME_PTR_INFO (name);
438*38fd1498Szrj   if (pi == NULL)
439*38fd1498Szrj     return false;
440*38fd1498Szrj   /* TODO Now pt->null is conservatively set to true in PTA
441*38fd1498Szrj      analysis. vrp is the only pass (including ipa-vrp)
442*38fd1498Szrj      that clears pt.null via set_ptr_nonull when it knows
443*38fd1498Szrj      for sure. PTA will preserves the pt.null value set by VRP.
444*38fd1498Szrj 
445*38fd1498Szrj      When PTA analysis is improved, pt.anything, pt.nonlocal
446*38fd1498Szrj      and pt.escaped may also has to be considered before
447*38fd1498Szrj      deciding that pointer cannot point to NULL.  */
448*38fd1498Szrj   return !pi->pt.null;
449*38fd1498Szrj }
450*38fd1498Szrj 
451*38fd1498Szrj /* Change non-zero bits bitmask of NAME.  */
452*38fd1498Szrj 
453*38fd1498Szrj void
set_nonzero_bits(tree name,const wide_int_ref & mask)454*38fd1498Szrj set_nonzero_bits (tree name, const wide_int_ref &mask)
455*38fd1498Szrj {
456*38fd1498Szrj   gcc_assert (!POINTER_TYPE_P (TREE_TYPE (name)));
457*38fd1498Szrj   if (SSA_NAME_RANGE_INFO (name) == NULL)
458*38fd1498Szrj     {
459*38fd1498Szrj       if (mask == -1)
460*38fd1498Szrj 	return;
461*38fd1498Szrj       set_range_info_raw (name, VR_RANGE,
462*38fd1498Szrj 			  wi::to_wide (TYPE_MIN_VALUE (TREE_TYPE (name))),
463*38fd1498Szrj 			  wi::to_wide (TYPE_MAX_VALUE (TREE_TYPE (name))));
464*38fd1498Szrj     }
465*38fd1498Szrj   range_info_def *ri = SSA_NAME_RANGE_INFO (name);
466*38fd1498Szrj   ri->set_nonzero_bits (mask);
467*38fd1498Szrj }
468*38fd1498Szrj 
469*38fd1498Szrj /* Return a widest_int with potentially non-zero bits in SSA_NAME
470*38fd1498Szrj    NAME, the constant for INTEGER_CST, or -1 if unknown.  */
471*38fd1498Szrj 
472*38fd1498Szrj wide_int
get_nonzero_bits(const_tree name)473*38fd1498Szrj get_nonzero_bits (const_tree name)
474*38fd1498Szrj {
475*38fd1498Szrj   if (TREE_CODE (name) == INTEGER_CST)
476*38fd1498Szrj     return wi::to_wide (name);
477*38fd1498Szrj 
478*38fd1498Szrj   /* Use element_precision instead of TYPE_PRECISION so complex and
479*38fd1498Szrj      vector types get a non-zero precision.  */
480*38fd1498Szrj   unsigned int precision = element_precision (TREE_TYPE (name));
481*38fd1498Szrj   if (POINTER_TYPE_P (TREE_TYPE (name)))
482*38fd1498Szrj     {
483*38fd1498Szrj       struct ptr_info_def *pi = SSA_NAME_PTR_INFO (name);
484*38fd1498Szrj       if (pi && pi->align)
485*38fd1498Szrj 	return wi::shwi (-(HOST_WIDE_INT) pi->align
486*38fd1498Szrj 			 | (HOST_WIDE_INT) pi->misalign, precision);
487*38fd1498Szrj       return wi::shwi (-1, precision);
488*38fd1498Szrj     }
489*38fd1498Szrj 
490*38fd1498Szrj   range_info_def *ri = SSA_NAME_RANGE_INFO (name);
491*38fd1498Szrj   if (!ri)
492*38fd1498Szrj     return wi::shwi (-1, precision);
493*38fd1498Szrj 
494*38fd1498Szrj   return ri->get_nonzero_bits ();
495*38fd1498Szrj }
496*38fd1498Szrj 
497*38fd1498Szrj /* Return TRUE is OP, an SSA_NAME has a range of values [0..1], false
498*38fd1498Szrj    otherwise.
499*38fd1498Szrj 
500*38fd1498Szrj    This can be because it is a boolean type, any unsigned integral
501*38fd1498Szrj    type with a single bit of precision, or has known range of [0..1]
502*38fd1498Szrj    via VRP analysis.  */
503*38fd1498Szrj 
504*38fd1498Szrj bool
ssa_name_has_boolean_range(tree op)505*38fd1498Szrj ssa_name_has_boolean_range (tree op)
506*38fd1498Szrj {
507*38fd1498Szrj   gcc_assert (TREE_CODE (op) == SSA_NAME);
508*38fd1498Szrj 
509*38fd1498Szrj   /* Boolean types always have a range [0..1].  */
510*38fd1498Szrj   if (TREE_CODE (TREE_TYPE (op)) == BOOLEAN_TYPE)
511*38fd1498Szrj     return true;
512*38fd1498Szrj 
513*38fd1498Szrj   /* An integral type with a single bit of precision.  */
514*38fd1498Szrj   if (INTEGRAL_TYPE_P (TREE_TYPE (op))
515*38fd1498Szrj       && TYPE_UNSIGNED (TREE_TYPE (op))
516*38fd1498Szrj       && TYPE_PRECISION (TREE_TYPE (op)) == 1)
517*38fd1498Szrj     return true;
518*38fd1498Szrj 
519*38fd1498Szrj   /* An integral type with more precision, but the object
520*38fd1498Szrj      only takes on values [0..1] as determined by VRP
521*38fd1498Szrj      analysis.  */
522*38fd1498Szrj   if (INTEGRAL_TYPE_P (TREE_TYPE (op))
523*38fd1498Szrj       && (TYPE_PRECISION (TREE_TYPE (op)) > 1)
524*38fd1498Szrj       && wi::eq_p (get_nonzero_bits (op), 1))
525*38fd1498Szrj     return true;
526*38fd1498Szrj 
527*38fd1498Szrj   return false;
528*38fd1498Szrj }
529*38fd1498Szrj 
530*38fd1498Szrj /* We no longer need the SSA_NAME expression VAR, release it so that
531*38fd1498Szrj    it may be reused.
532*38fd1498Szrj 
533*38fd1498Szrj    Note it is assumed that no calls to make_ssa_name will be made
534*38fd1498Szrj    until all uses of the ssa name are released and that the only
535*38fd1498Szrj    use of the SSA_NAME expression is to check its SSA_NAME_VAR.  All
536*38fd1498Szrj    other fields must be assumed clobbered.  */
537*38fd1498Szrj 
538*38fd1498Szrj void
release_ssa_name_fn(struct function * fn,tree var)539*38fd1498Szrj release_ssa_name_fn (struct function *fn, tree var)
540*38fd1498Szrj {
541*38fd1498Szrj   if (!var)
542*38fd1498Szrj     return;
543*38fd1498Szrj 
544*38fd1498Szrj   /* Never release the default definition for a symbol.  It's a
545*38fd1498Szrj      special SSA name that should always exist once it's created.  */
546*38fd1498Szrj   if (SSA_NAME_IS_DEFAULT_DEF (var))
547*38fd1498Szrj     return;
548*38fd1498Szrj 
549*38fd1498Szrj   /* If VAR has been registered for SSA updating, don't remove it.
550*38fd1498Szrj      After update_ssa has run, the name will be released.  */
551*38fd1498Szrj   if (name_registered_for_update_p (var))
552*38fd1498Szrj     {
553*38fd1498Szrj       release_ssa_name_after_update_ssa (var);
554*38fd1498Szrj       return;
555*38fd1498Szrj     }
556*38fd1498Szrj 
557*38fd1498Szrj   /* release_ssa_name can be called multiple times on a single SSA_NAME.
558*38fd1498Szrj      However, it should only end up on our free list one time.   We
559*38fd1498Szrj      keep a status bit in the SSA_NAME node itself to indicate it has
560*38fd1498Szrj      been put on the free list.
561*38fd1498Szrj 
562*38fd1498Szrj      Note that once on the freelist you can not reference the SSA_NAME's
563*38fd1498Szrj      defining statement.  */
564*38fd1498Szrj   if (! SSA_NAME_IN_FREE_LIST (var))
565*38fd1498Szrj     {
566*38fd1498Szrj       tree saved_ssa_name_var = SSA_NAME_VAR (var);
567*38fd1498Szrj       int saved_ssa_name_version = SSA_NAME_VERSION (var);
568*38fd1498Szrj       use_operand_p imm = &(SSA_NAME_IMM_USE_NODE (var));
569*38fd1498Szrj 
570*38fd1498Szrj       if (MAY_HAVE_DEBUG_BIND_STMTS)
571*38fd1498Szrj 	insert_debug_temp_for_var_def (NULL, var);
572*38fd1498Szrj 
573*38fd1498Szrj       if (flag_checking)
574*38fd1498Szrj 	verify_imm_links (stderr, var);
575*38fd1498Szrj       while (imm->next != imm)
576*38fd1498Szrj 	delink_imm_use (imm->next);
577*38fd1498Szrj 
578*38fd1498Szrj       (*SSANAMES (fn))[SSA_NAME_VERSION (var)] = NULL_TREE;
579*38fd1498Szrj       memset (var, 0, tree_size (var));
580*38fd1498Szrj 
581*38fd1498Szrj       imm->prev = imm;
582*38fd1498Szrj       imm->next = imm;
583*38fd1498Szrj       imm->loc.ssa_name = var;
584*38fd1498Szrj 
585*38fd1498Szrj       /* First put back the right tree node so that the tree checking
586*38fd1498Szrj 	 macros do not complain.  */
587*38fd1498Szrj       TREE_SET_CODE (var, SSA_NAME);
588*38fd1498Szrj 
589*38fd1498Szrj       /* Restore the version number.  */
590*38fd1498Szrj       SSA_NAME_VERSION (var) = saved_ssa_name_version;
591*38fd1498Szrj 
592*38fd1498Szrj       /* Hopefully this can go away once we have the new incremental
593*38fd1498Szrj          SSA updating code installed.  */
594*38fd1498Szrj       SET_SSA_NAME_VAR_OR_IDENTIFIER (var, saved_ssa_name_var);
595*38fd1498Szrj 
596*38fd1498Szrj       /* Note this SSA_NAME is now in the first list.  */
597*38fd1498Szrj       SSA_NAME_IN_FREE_LIST (var) = 1;
598*38fd1498Szrj 
599*38fd1498Szrj       /* And finally queue it so that it will be put on the free list.  */
600*38fd1498Szrj       vec_safe_push (FREE_SSANAMES_QUEUE (fn), var);
601*38fd1498Szrj     }
602*38fd1498Szrj }
603*38fd1498Szrj 
604*38fd1498Szrj /* If the alignment of the pointer described by PI is known, return true and
605*38fd1498Szrj    store the alignment and the deviation from it into *ALIGNP and *MISALIGNP
606*38fd1498Szrj    respectively.  Otherwise return false.  */
607*38fd1498Szrj 
608*38fd1498Szrj bool
get_ptr_info_alignment(struct ptr_info_def * pi,unsigned int * alignp,unsigned int * misalignp)609*38fd1498Szrj get_ptr_info_alignment (struct ptr_info_def *pi, unsigned int *alignp,
610*38fd1498Szrj 			unsigned int *misalignp)
611*38fd1498Szrj {
612*38fd1498Szrj   if (pi->align)
613*38fd1498Szrj     {
614*38fd1498Szrj       *alignp = pi->align;
615*38fd1498Szrj       *misalignp = pi->misalign;
616*38fd1498Szrj       return true;
617*38fd1498Szrj     }
618*38fd1498Szrj   else
619*38fd1498Szrj     return false;
620*38fd1498Szrj }
621*38fd1498Szrj 
622*38fd1498Szrj /* State that the pointer described by PI has unknown alignment.  */
623*38fd1498Szrj 
624*38fd1498Szrj void
mark_ptr_info_alignment_unknown(struct ptr_info_def * pi)625*38fd1498Szrj mark_ptr_info_alignment_unknown (struct ptr_info_def *pi)
626*38fd1498Szrj {
627*38fd1498Szrj   pi->align = 0;
628*38fd1498Szrj   pi->misalign = 0;
629*38fd1498Szrj }
630*38fd1498Szrj 
631*38fd1498Szrj /* Store the power-of-two byte alignment and the deviation from that
632*38fd1498Szrj    alignment of pointer described by PI to ALIOGN and MISALIGN
633*38fd1498Szrj    respectively.  */
634*38fd1498Szrj 
635*38fd1498Szrj void
set_ptr_info_alignment(struct ptr_info_def * pi,unsigned int align,unsigned int misalign)636*38fd1498Szrj set_ptr_info_alignment (struct ptr_info_def *pi, unsigned int align,
637*38fd1498Szrj 			    unsigned int misalign)
638*38fd1498Szrj {
639*38fd1498Szrj   gcc_checking_assert (align != 0);
640*38fd1498Szrj   gcc_assert ((align & (align - 1)) == 0);
641*38fd1498Szrj   gcc_assert ((misalign & ~(align - 1)) == 0);
642*38fd1498Szrj 
643*38fd1498Szrj   pi->align = align;
644*38fd1498Szrj   pi->misalign = misalign;
645*38fd1498Szrj }
646*38fd1498Szrj 
647*38fd1498Szrj /* If pointer described by PI has known alignment, increase its known
648*38fd1498Szrj    misalignment by INCREMENT modulo its current alignment.  */
649*38fd1498Szrj 
650*38fd1498Szrj void
adjust_ptr_info_misalignment(struct ptr_info_def * pi,poly_uint64 increment)651*38fd1498Szrj adjust_ptr_info_misalignment (struct ptr_info_def *pi, poly_uint64 increment)
652*38fd1498Szrj {
653*38fd1498Szrj   if (pi->align != 0)
654*38fd1498Szrj     {
655*38fd1498Szrj       increment += pi->misalign;
656*38fd1498Szrj       if (!known_misalignment (increment, pi->align, &pi->misalign))
657*38fd1498Szrj 	{
658*38fd1498Szrj 	  pi->align = known_alignment (increment);
659*38fd1498Szrj 	  pi->misalign = 0;
660*38fd1498Szrj 	}
661*38fd1498Szrj     }
662*38fd1498Szrj }
663*38fd1498Szrj 
664*38fd1498Szrj /* Return the alias information associated with pointer T.  It creates a
665*38fd1498Szrj    new instance if none existed.  */
666*38fd1498Szrj 
667*38fd1498Szrj struct ptr_info_def *
get_ptr_info(tree t)668*38fd1498Szrj get_ptr_info (tree t)
669*38fd1498Szrj {
670*38fd1498Szrj   struct ptr_info_def *pi;
671*38fd1498Szrj 
672*38fd1498Szrj   gcc_assert (POINTER_TYPE_P (TREE_TYPE (t)));
673*38fd1498Szrj 
674*38fd1498Szrj   pi = SSA_NAME_PTR_INFO (t);
675*38fd1498Szrj   if (pi == NULL)
676*38fd1498Szrj     {
677*38fd1498Szrj       pi = ggc_cleared_alloc<ptr_info_def> ();
678*38fd1498Szrj       pt_solution_reset (&pi->pt);
679*38fd1498Szrj       mark_ptr_info_alignment_unknown (pi);
680*38fd1498Szrj       SSA_NAME_PTR_INFO (t) = pi;
681*38fd1498Szrj     }
682*38fd1498Szrj 
683*38fd1498Szrj   return pi;
684*38fd1498Szrj }
685*38fd1498Szrj 
686*38fd1498Szrj 
687*38fd1498Szrj /* Creates a new SSA name using the template NAME tobe defined by
688*38fd1498Szrj    statement STMT in function FN.  */
689*38fd1498Szrj 
690*38fd1498Szrj tree
copy_ssa_name_fn(struct function * fn,tree name,gimple * stmt)691*38fd1498Szrj copy_ssa_name_fn (struct function *fn, tree name, gimple *stmt)
692*38fd1498Szrj {
693*38fd1498Szrj   tree new_name;
694*38fd1498Szrj 
695*38fd1498Szrj   if (SSA_NAME_VAR (name))
696*38fd1498Szrj     new_name = make_ssa_name_fn (fn, SSA_NAME_VAR (name), stmt);
697*38fd1498Szrj   else
698*38fd1498Szrj     {
699*38fd1498Szrj       new_name = make_ssa_name_fn (fn, TREE_TYPE (name), stmt);
700*38fd1498Szrj       SET_SSA_NAME_VAR_OR_IDENTIFIER (new_name, SSA_NAME_IDENTIFIER (name));
701*38fd1498Szrj     }
702*38fd1498Szrj 
703*38fd1498Szrj   return new_name;
704*38fd1498Szrj }
705*38fd1498Szrj 
706*38fd1498Szrj 
707*38fd1498Szrj /* Creates a duplicate of the ptr_info_def at PTR_INFO for use by
708*38fd1498Szrj    the SSA name NAME.  */
709*38fd1498Szrj 
710*38fd1498Szrj void
duplicate_ssa_name_ptr_info(tree name,struct ptr_info_def * ptr_info)711*38fd1498Szrj duplicate_ssa_name_ptr_info (tree name, struct ptr_info_def *ptr_info)
712*38fd1498Szrj {
713*38fd1498Szrj   struct ptr_info_def *new_ptr_info;
714*38fd1498Szrj 
715*38fd1498Szrj   gcc_assert (POINTER_TYPE_P (TREE_TYPE (name)));
716*38fd1498Szrj   gcc_assert (!SSA_NAME_PTR_INFO (name));
717*38fd1498Szrj 
718*38fd1498Szrj   if (!ptr_info)
719*38fd1498Szrj     return;
720*38fd1498Szrj 
721*38fd1498Szrj   new_ptr_info = ggc_alloc<ptr_info_def> ();
722*38fd1498Szrj   *new_ptr_info = *ptr_info;
723*38fd1498Szrj 
724*38fd1498Szrj   SSA_NAME_PTR_INFO (name) = new_ptr_info;
725*38fd1498Szrj }
726*38fd1498Szrj 
727*38fd1498Szrj /* Creates a duplicate of the range_info_def at RANGE_INFO of type
728*38fd1498Szrj    RANGE_TYPE for use by the SSA name NAME.  */
729*38fd1498Szrj void
duplicate_ssa_name_range_info(tree name,enum value_range_type range_type,struct range_info_def * range_info)730*38fd1498Szrj duplicate_ssa_name_range_info (tree name, enum value_range_type range_type,
731*38fd1498Szrj 			       struct range_info_def *range_info)
732*38fd1498Szrj {
733*38fd1498Szrj   struct range_info_def *new_range_info;
734*38fd1498Szrj 
735*38fd1498Szrj   gcc_assert (!POINTER_TYPE_P (TREE_TYPE (name)));
736*38fd1498Szrj   gcc_assert (!SSA_NAME_RANGE_INFO (name));
737*38fd1498Szrj 
738*38fd1498Szrj   if (!range_info)
739*38fd1498Szrj     return;
740*38fd1498Szrj 
741*38fd1498Szrj   unsigned int precision = TYPE_PRECISION (TREE_TYPE (name));
742*38fd1498Szrj   size_t size = (sizeof (range_info_def)
743*38fd1498Szrj 		 + trailing_wide_ints <3>::extra_size (precision));
744*38fd1498Szrj   new_range_info = static_cast<range_info_def *> (ggc_internal_alloc (size));
745*38fd1498Szrj   memcpy (new_range_info, range_info, size);
746*38fd1498Szrj 
747*38fd1498Szrj   gcc_assert (range_type == VR_RANGE || range_type == VR_ANTI_RANGE);
748*38fd1498Szrj   SSA_NAME_ANTI_RANGE_P (name) = (range_type == VR_ANTI_RANGE);
749*38fd1498Szrj   SSA_NAME_RANGE_INFO (name) = new_range_info;
750*38fd1498Szrj }
751*38fd1498Szrj 
752*38fd1498Szrj 
753*38fd1498Szrj 
754*38fd1498Szrj /* Creates a duplicate of a ssa name NAME tobe defined by statement STMT
755*38fd1498Szrj    in function FN.  */
756*38fd1498Szrj 
757*38fd1498Szrj tree
duplicate_ssa_name_fn(struct function * fn,tree name,gimple * stmt)758*38fd1498Szrj duplicate_ssa_name_fn (struct function *fn, tree name, gimple *stmt)
759*38fd1498Szrj {
760*38fd1498Szrj   tree new_name = copy_ssa_name_fn (fn, name, stmt);
761*38fd1498Szrj   if (POINTER_TYPE_P (TREE_TYPE (name)))
762*38fd1498Szrj     {
763*38fd1498Szrj       struct ptr_info_def *old_ptr_info = SSA_NAME_PTR_INFO (name);
764*38fd1498Szrj 
765*38fd1498Szrj       if (old_ptr_info)
766*38fd1498Szrj 	duplicate_ssa_name_ptr_info (new_name, old_ptr_info);
767*38fd1498Szrj     }
768*38fd1498Szrj   else
769*38fd1498Szrj     {
770*38fd1498Szrj       struct range_info_def *old_range_info = SSA_NAME_RANGE_INFO (name);
771*38fd1498Szrj 
772*38fd1498Szrj       if (old_range_info)
773*38fd1498Szrj 	duplicate_ssa_name_range_info (new_name, SSA_NAME_RANGE_TYPE (name),
774*38fd1498Szrj 				       old_range_info);
775*38fd1498Szrj     }
776*38fd1498Szrj 
777*38fd1498Szrj   return new_name;
778*38fd1498Szrj }
779*38fd1498Szrj 
780*38fd1498Szrj 
781*38fd1498Szrj /* Reset all flow sensitive data on NAME such as range-info, nonzero
782*38fd1498Szrj    bits and alignment.  */
783*38fd1498Szrj 
784*38fd1498Szrj void
reset_flow_sensitive_info(tree name)785*38fd1498Szrj reset_flow_sensitive_info (tree name)
786*38fd1498Szrj {
787*38fd1498Szrj   if (POINTER_TYPE_P (TREE_TYPE (name)))
788*38fd1498Szrj     {
789*38fd1498Szrj       /* points-to info is not flow-sensitive.  */
790*38fd1498Szrj       if (SSA_NAME_PTR_INFO (name))
791*38fd1498Szrj 	mark_ptr_info_alignment_unknown (SSA_NAME_PTR_INFO (name));
792*38fd1498Szrj     }
793*38fd1498Szrj   else
794*38fd1498Szrj     SSA_NAME_RANGE_INFO (name) = NULL;
795*38fd1498Szrj }
796*38fd1498Szrj 
797*38fd1498Szrj /* Clear all flow sensitive data from all statements and PHI definitions
798*38fd1498Szrj    in BB.  */
799*38fd1498Szrj 
800*38fd1498Szrj void
reset_flow_sensitive_info_in_bb(basic_block bb)801*38fd1498Szrj reset_flow_sensitive_info_in_bb (basic_block bb)
802*38fd1498Szrj {
803*38fd1498Szrj   for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi);
804*38fd1498Szrj        gsi_next (&gsi))
805*38fd1498Szrj     {
806*38fd1498Szrj       gimple *stmt = gsi_stmt (gsi);
807*38fd1498Szrj       ssa_op_iter i;
808*38fd1498Szrj       tree op;
809*38fd1498Szrj       FOR_EACH_SSA_TREE_OPERAND (op, stmt, i, SSA_OP_DEF)
810*38fd1498Szrj 	reset_flow_sensitive_info (op);
811*38fd1498Szrj     }
812*38fd1498Szrj 
813*38fd1498Szrj   for (gphi_iterator gsi = gsi_start_phis (bb); !gsi_end_p (gsi);
814*38fd1498Szrj        gsi_next (&gsi))
815*38fd1498Szrj     {
816*38fd1498Szrj       tree phi_def = gimple_phi_result (gsi.phi ());
817*38fd1498Szrj       reset_flow_sensitive_info (phi_def);
818*38fd1498Szrj     }
819*38fd1498Szrj }
820*38fd1498Szrj 
821*38fd1498Szrj /* Release all the SSA_NAMEs created by STMT.  */
822*38fd1498Szrj 
823*38fd1498Szrj void
release_defs(gimple * stmt)824*38fd1498Szrj release_defs (gimple *stmt)
825*38fd1498Szrj {
826*38fd1498Szrj   tree def;
827*38fd1498Szrj   ssa_op_iter iter;
828*38fd1498Szrj 
829*38fd1498Szrj   FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_ALL_DEFS)
830*38fd1498Szrj     if (TREE_CODE (def) == SSA_NAME)
831*38fd1498Szrj       release_ssa_name (def);
832*38fd1498Szrj }
833*38fd1498Szrj 
834*38fd1498Szrj 
835*38fd1498Szrj /* Replace the symbol associated with SSA_NAME with SYM.  */
836*38fd1498Szrj 
837*38fd1498Szrj void
replace_ssa_name_symbol(tree ssa_name,tree sym)838*38fd1498Szrj replace_ssa_name_symbol (tree ssa_name, tree sym)
839*38fd1498Szrj {
840*38fd1498Szrj   SET_SSA_NAME_VAR_OR_IDENTIFIER (ssa_name, sym);
841*38fd1498Szrj   TREE_TYPE (ssa_name) = TREE_TYPE (sym);
842*38fd1498Szrj }
843*38fd1498Szrj 
844*38fd1498Szrj /* Release the vector of free SSA_NAMEs and compact the vector of SSA_NAMEs
845*38fd1498Szrj    that are live.  */
846*38fd1498Szrj 
847*38fd1498Szrj static void
release_free_names_and_compact_live_names(function * fun)848*38fd1498Szrj release_free_names_and_compact_live_names (function *fun)
849*38fd1498Szrj {
850*38fd1498Szrj   unsigned i, j;
851*38fd1498Szrj   int n = vec_safe_length (FREE_SSANAMES (fun));
852*38fd1498Szrj 
853*38fd1498Szrj   /* Now release the freelist.  */
854*38fd1498Szrj   vec_free (FREE_SSANAMES (fun));
855*38fd1498Szrj 
856*38fd1498Szrj   /* And compact the SSA number space.  We make sure to not change the
857*38fd1498Szrj      relative order of SSA versions.  */
858*38fd1498Szrj   for (i = 1, j = 1; i < fun->gimple_df->ssa_names->length (); ++i)
859*38fd1498Szrj     {
860*38fd1498Szrj       tree name = ssa_name (i);
861*38fd1498Szrj       if (name)
862*38fd1498Szrj 	{
863*38fd1498Szrj 	  if (i != j)
864*38fd1498Szrj 	    {
865*38fd1498Szrj 	      SSA_NAME_VERSION (name) = j;
866*38fd1498Szrj 	      (*fun->gimple_df->ssa_names)[j] = name;
867*38fd1498Szrj 	    }
868*38fd1498Szrj 	  j++;
869*38fd1498Szrj 	}
870*38fd1498Szrj     }
871*38fd1498Szrj   fun->gimple_df->ssa_names->truncate (j);
872*38fd1498Szrj 
873*38fd1498Szrj   statistics_counter_event (fun, "SSA names released", n);
874*38fd1498Szrj   statistics_counter_event (fun, "SSA name holes removed", i - j);
875*38fd1498Szrj   if (dump_file)
876*38fd1498Szrj     fprintf (dump_file, "Released %i names, %.2f%%, removed %i holes\n",
877*38fd1498Szrj 	     n, n * 100.0 / num_ssa_names, i - j);
878*38fd1498Szrj }
879*38fd1498Szrj 
880*38fd1498Szrj /* Return SSA names that are unused to GGC memory and compact the SSA
881*38fd1498Szrj    version namespace.  This is used to keep footprint of compiler during
882*38fd1498Szrj    interprocedural optimization.  */
883*38fd1498Szrj 
884*38fd1498Szrj namespace {
885*38fd1498Szrj 
886*38fd1498Szrj const pass_data pass_data_release_ssa_names =
887*38fd1498Szrj {
888*38fd1498Szrj   GIMPLE_PASS, /* type */
889*38fd1498Szrj   "release_ssa", /* name */
890*38fd1498Szrj   OPTGROUP_NONE, /* optinfo_flags */
891*38fd1498Szrj   TV_TREE_SSA_OTHER, /* tv_id */
892*38fd1498Szrj   PROP_ssa, /* properties_required */
893*38fd1498Szrj   0, /* properties_provided */
894*38fd1498Szrj   0, /* properties_destroyed */
895*38fd1498Szrj   TODO_remove_unused_locals, /* todo_flags_start */
896*38fd1498Szrj   0, /* todo_flags_finish */
897*38fd1498Szrj };
898*38fd1498Szrj 
899*38fd1498Szrj class pass_release_ssa_names : public gimple_opt_pass
900*38fd1498Szrj {
901*38fd1498Szrj public:
pass_release_ssa_names(gcc::context * ctxt)902*38fd1498Szrj   pass_release_ssa_names (gcc::context *ctxt)
903*38fd1498Szrj     : gimple_opt_pass (pass_data_release_ssa_names, ctxt)
904*38fd1498Szrj   {}
905*38fd1498Szrj 
906*38fd1498Szrj   /* opt_pass methods: */
907*38fd1498Szrj   virtual unsigned int execute (function *);
908*38fd1498Szrj 
909*38fd1498Szrj }; // class pass_release_ssa_names
910*38fd1498Szrj 
911*38fd1498Szrj unsigned int
execute(function * fun)912*38fd1498Szrj pass_release_ssa_names::execute (function *fun)
913*38fd1498Szrj {
914*38fd1498Szrj   release_free_names_and_compact_live_names (fun);
915*38fd1498Szrj   return 0;
916*38fd1498Szrj }
917*38fd1498Szrj 
918*38fd1498Szrj } // anon namespace
919*38fd1498Szrj 
920*38fd1498Szrj gimple_opt_pass *
make_pass_release_ssa_names(gcc::context * ctxt)921*38fd1498Szrj make_pass_release_ssa_names (gcc::context *ctxt)
922*38fd1498Szrj {
923*38fd1498Szrj   return new pass_release_ssa_names (ctxt);
924*38fd1498Szrj }
925