[AArch64 Testsuite] vld1_lane.c: Remove unused test data
[platform/upstream/gcc.git] / gcc / tree-phinodes.c
1 /* Generic routines for manipulating PHIs
2    Copyright (C) 2003-2015 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 "hard-reg-set.h"
27 #include "ssa.h"
28 #include "alias.h"
29 #include "fold-const.h"
30 #include "internal-fn.h"
31 #include "gimple-iterator.h"
32 #include "tree-ssa.h"
33 #include "diagnostic-core.h"
34
35 /* Rewriting a function into SSA form can create a huge number of PHIs
36    many of which may be thrown away shortly after their creation if jumps
37    were threaded through PHI nodes.
38
39    While our garbage collection mechanisms will handle this situation, it
40    is extremely wasteful to create nodes and throw them away, especially
41    when the nodes can be reused.
42
43    For PR 8361, we can significantly reduce the number of nodes allocated
44    and thus the total amount of memory allocated by managing PHIs a
45    little.  This additionally helps reduce the amount of work done by the
46    garbage collector.  Similar results have been seen on a wider variety
47    of tests (such as the compiler itself).
48
49    PHI nodes have different sizes, so we can't have a single list of all
50    the PHI nodes as it would be too expensive to walk down that list to
51    find a PHI of a suitable size.
52
53    Instead we have an array of lists of free PHI nodes.  The array is
54    indexed by the number of PHI alternatives that PHI node can hold.
55    Except for the last array member, which holds all remaining PHI
56    nodes.
57
58    So to find a free PHI node, we compute its index into the free PHI
59    node array and see if there are any elements with an exact match.
60    If so, then we are done.  Otherwise, we test the next larger size
61    up and continue until we are in the last array element.
62
63    We do not actually walk members of the last array element.  While it
64    might allow us to pick up a few reusable PHI nodes, it could potentially
65    be very expensive if the program has released a bunch of large PHI nodes,
66    but keeps asking for even larger PHI nodes.  Experiments have shown that
67    walking the elements of the last array entry would result in finding less
68    than .1% additional reusable PHI nodes.
69
70    Note that we can never have less than two PHI argument slots.  Thus,
71    the -2 on all the calculations below.  */
72
73 #define NUM_BUCKETS 10
74 static GTY ((deletable (""))) vec<gimple, va_gc> *free_phinodes[NUM_BUCKETS - 2];
75 static unsigned long free_phinode_count;
76
77 static int ideal_phi_node_len (int);
78
79 unsigned int phi_nodes_reused;
80 unsigned int phi_nodes_created;
81
82 /* Dump some simple statistics regarding the re-use of PHI nodes.  */
83
84 void
85 phinodes_print_statistics (void)
86 {
87   fprintf (stderr, "PHI nodes allocated: %u\n", phi_nodes_created);
88   fprintf (stderr, "PHI nodes reused: %u\n", phi_nodes_reused);
89 }
90
91 /* Allocate a PHI node with at least LEN arguments.  If the free list
92    happens to contain a PHI node with LEN arguments or more, return
93    that one.  */
94
95 static inline gphi *
96 allocate_phi_node (size_t len)
97 {
98   gphi *phi;
99   size_t bucket = NUM_BUCKETS - 2;
100   size_t size = sizeof (struct gphi)
101                 + (len - 1) * sizeof (struct phi_arg_d);
102
103   if (free_phinode_count)
104     for (bucket = len - 2; bucket < NUM_BUCKETS - 2; bucket++)
105       if (free_phinodes[bucket])
106         break;
107
108   /* If our free list has an element, then use it.  */
109   if (bucket < NUM_BUCKETS - 2
110       && gimple_phi_capacity ((*free_phinodes[bucket])[0]) >= len)
111     {
112       free_phinode_count--;
113       phi = as_a <gphi *> (free_phinodes[bucket]->pop ());
114       if (free_phinodes[bucket]->is_empty ())
115         vec_free (free_phinodes[bucket]);
116       if (GATHER_STATISTICS)
117         phi_nodes_reused++;
118     }
119   else
120     {
121       phi = static_cast <gphi *> (ggc_internal_alloc (size));
122       if (GATHER_STATISTICS)
123         {
124           enum gimple_alloc_kind kind = gimple_alloc_kind (GIMPLE_PHI);
125           phi_nodes_created++;
126           gimple_alloc_counts[(int) kind]++;
127           gimple_alloc_sizes[(int) kind] += size;
128         }
129     }
130
131   return phi;
132 }
133
134 /* Given LEN, the original number of requested PHI arguments, return
135    a new, "ideal" length for the PHI node.  The "ideal" length rounds
136    the total size of the PHI node up to the next power of two bytes.
137
138    Rounding up will not result in wasting any memory since the size request
139    will be rounded up by the GC system anyway.  [ Note this is not entirely
140    true since the original length might have fit on one of the special
141    GC pages. ]  By rounding up, we may avoid the need to reallocate the
142    PHI node later if we increase the number of arguments for the PHI.  */
143
144 static int
145 ideal_phi_node_len (int len)
146 {
147   size_t size, new_size;
148   int log2, new_len;
149
150   /* We do not support allocations of less than two PHI argument slots.  */
151   if (len < 2)
152     len = 2;
153
154   /* Compute the number of bytes of the original request.  */
155   size = sizeof (struct gphi)
156          + (len - 1) * sizeof (struct phi_arg_d);
157
158   /* Round it up to the next power of two.  */
159   log2 = ceil_log2 (size);
160   new_size = 1 << log2;
161
162   /* Now compute and return the number of PHI argument slots given an
163      ideal size allocation.  */
164   new_len = len + (new_size - size) / sizeof (struct phi_arg_d);
165   return new_len;
166 }
167
168 /* Return a PHI node with LEN argument slots for variable VAR.  */
169
170 static gphi *
171 make_phi_node (tree var, int len)
172 {
173   gphi *phi;
174   int capacity, i;
175
176   capacity = ideal_phi_node_len (len);
177
178   phi = allocate_phi_node (capacity);
179
180   /* We need to clear the entire PHI node, including the argument
181      portion, because we represent a "missing PHI argument" by placing
182      NULL_TREE in PHI_ARG_DEF.  */
183   memset (phi, 0, (sizeof (struct gphi)
184                    - sizeof (struct phi_arg_d)
185                    + sizeof (struct phi_arg_d) * len));
186   phi->code = GIMPLE_PHI;
187   gimple_init_singleton (phi);
188   phi->nargs = len;
189   phi->capacity = capacity;
190   if (!var)
191     ;
192   else if (TREE_CODE (var) == SSA_NAME)
193     gimple_phi_set_result (phi, var);
194   else
195     gimple_phi_set_result (phi, make_ssa_name (var, phi));
196
197   for (i = 0; i < capacity; i++)
198     {
199       use_operand_p  imm;
200
201       gimple_phi_arg_set_location (phi, i, UNKNOWN_LOCATION);
202       imm = gimple_phi_arg_imm_use_ptr (phi, i);
203       imm->use = gimple_phi_arg_def_ptr (phi, i);
204       imm->prev = NULL;
205       imm->next = NULL;
206       imm->loc.stmt = phi;
207     }
208
209   return phi;
210 }
211
212 /* We no longer need PHI, release it so that it may be reused.  */
213
214 void
215 release_phi_node (gimple phi)
216 {
217   size_t bucket;
218   size_t len = gimple_phi_capacity (phi);
219   size_t x;
220
221   for (x = 0; x < gimple_phi_num_args (phi); x++)
222     {
223       use_operand_p  imm;
224       imm = gimple_phi_arg_imm_use_ptr (phi, x);
225       delink_imm_use (imm);
226     }
227
228   bucket = len > NUM_BUCKETS - 1 ? NUM_BUCKETS - 1 : len;
229   bucket -= 2;
230   vec_safe_push (free_phinodes[bucket], phi);
231   free_phinode_count++;
232 }
233
234
235 /* Resize an existing PHI node.  The only way is up.  Return the
236    possibly relocated phi.  */
237
238 static gphi *
239 resize_phi_node (gphi *phi, size_t len)
240 {
241   size_t old_size, i;
242   gphi *new_phi;
243
244   gcc_assert (len > gimple_phi_capacity (phi));
245
246   /* The garbage collector will not look at the PHI node beyond the
247      first PHI_NUM_ARGS elements.  Therefore, all we have to copy is a
248      portion of the PHI node currently in use.  */
249   old_size = sizeof (struct gphi)
250              + (gimple_phi_num_args (phi) - 1) * sizeof (struct phi_arg_d);
251
252   new_phi = allocate_phi_node (len);
253
254   memcpy (new_phi, phi, old_size);
255
256   for (i = 0; i < gimple_phi_num_args (new_phi); i++)
257     {
258       use_operand_p imm, old_imm;
259       imm = gimple_phi_arg_imm_use_ptr (new_phi, i);
260       old_imm = gimple_phi_arg_imm_use_ptr (phi, i);
261       imm->use = gimple_phi_arg_def_ptr (new_phi, i);
262       relink_imm_use_stmt (imm, old_imm, new_phi);
263     }
264
265   new_phi->capacity = len;
266
267   for (i = gimple_phi_num_args (new_phi); i < len; i++)
268     {
269       use_operand_p imm;
270
271       gimple_phi_arg_set_location (new_phi, i, UNKNOWN_LOCATION);
272       imm = gimple_phi_arg_imm_use_ptr (new_phi, i);
273       imm->use = gimple_phi_arg_def_ptr (new_phi, i);
274       imm->prev = NULL;
275       imm->next = NULL;
276       imm->loc.stmt = new_phi;
277     }
278
279   return new_phi;
280 }
281
282 /* Reserve PHI arguments for a new edge to basic block BB.  */
283
284 void
285 reserve_phi_args_for_new_edge (basic_block bb)
286 {
287   size_t len = EDGE_COUNT (bb->preds);
288   size_t cap = ideal_phi_node_len (len + 4);
289   gphi_iterator gsi;
290
291   for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
292     {
293       gphi *stmt = gsi.phi ();
294
295       if (len > gimple_phi_capacity (stmt))
296         {
297           gphi *new_phi = resize_phi_node (stmt, cap);
298
299           /* The result of the PHI is defined by this PHI node.  */
300           SSA_NAME_DEF_STMT (gimple_phi_result (new_phi)) = new_phi;
301           gsi_set_stmt (&gsi, new_phi);
302
303           release_phi_node (stmt);
304           stmt = new_phi;
305         }
306
307       /* We represent a "missing PHI argument" by placing NULL_TREE in
308          the corresponding slot.  If PHI arguments were added
309          immediately after an edge is created, this zeroing would not
310          be necessary, but unfortunately this is not the case.  For
311          example, the loop optimizer duplicates several basic blocks,
312          redirects edges, and then fixes up PHI arguments later in
313          batch.  */
314       SET_PHI_ARG_DEF (stmt, len - 1, NULL_TREE);
315       gimple_phi_arg_set_location (stmt, len - 1, UNKNOWN_LOCATION);
316
317       stmt->nargs++;
318     }
319 }
320
321 /* Adds PHI to BB.  */
322
323 void
324 add_phi_node_to_bb (gphi *phi, basic_block bb)
325 {
326   gimple_seq seq = phi_nodes (bb);
327   /* Add the new PHI node to the list of PHI nodes for block BB.  */
328   if (seq == NULL)
329     set_phi_nodes (bb, gimple_seq_alloc_with_stmt (phi));
330   else
331     {
332       gimple_seq_add_stmt (&seq, phi);
333       gcc_assert (seq == phi_nodes (bb));
334     }
335
336   /* Associate BB to the PHI node.  */
337   gimple_set_bb (phi, bb);
338
339 }
340
341 /* Create a new PHI node for variable VAR at basic block BB.  */
342
343 gphi *
344 create_phi_node (tree var, basic_block bb)
345 {
346   gphi *phi = make_phi_node (var, EDGE_COUNT (bb->preds));
347
348   add_phi_node_to_bb (phi, bb);
349   return phi;
350 }
351
352
353 /* Add a new argument to PHI node PHI.  DEF is the incoming reaching
354    definition and E is the edge through which DEF reaches PHI.  The new
355    argument is added at the end of the argument list.
356    If PHI has reached its maximum capacity, add a few slots.  In this case,
357    PHI points to the reallocated phi node when we return.  */
358
359 void
360 add_phi_arg (gphi *phi, tree def, edge e, source_location locus)
361 {
362   basic_block bb = e->dest;
363
364   gcc_assert (bb == gimple_bb (phi));
365
366   /* We resize PHI nodes upon edge creation.  We should always have
367      enough room at this point.  */
368   gcc_assert (gimple_phi_num_args (phi) <= gimple_phi_capacity (phi));
369
370   /* We resize PHI nodes upon edge creation.  We should always have
371      enough room at this point.  */
372   gcc_assert (e->dest_idx < gimple_phi_num_args (phi));
373
374   /* Copy propagation needs to know what object occur in abnormal
375      PHI nodes.  This is a convenient place to record such information.  */
376   if (e->flags & EDGE_ABNORMAL)
377     {
378       SSA_NAME_OCCURS_IN_ABNORMAL_PHI (def) = 1;
379       SSA_NAME_OCCURS_IN_ABNORMAL_PHI (PHI_RESULT (phi)) = 1;
380     }
381
382   SET_PHI_ARG_DEF (phi, e->dest_idx, def);
383   gimple_phi_arg_set_location (phi, e->dest_idx, locus);
384 }
385
386
387 /* Remove the Ith argument from PHI's argument list.  This routine
388    implements removal by swapping the last alternative with the
389    alternative we want to delete and then shrinking the vector, which
390    is consistent with how we remove an edge from the edge vector.  */
391
392 static void
393 remove_phi_arg_num (gphi *phi, int i)
394 {
395   int num_elem = gimple_phi_num_args (phi);
396
397   gcc_assert (i < num_elem);
398
399   /* Delink the item which is being removed.  */
400   delink_imm_use (gimple_phi_arg_imm_use_ptr (phi, i));
401
402   /* If it is not the last element, move the last element
403      to the element we want to delete, resetting all the links. */
404   if (i != num_elem - 1)
405     {
406       use_operand_p old_p, new_p;
407       old_p = gimple_phi_arg_imm_use_ptr (phi, num_elem - 1);
408       new_p = gimple_phi_arg_imm_use_ptr (phi, i);
409       /* Set use on new node, and link into last element's place.  */
410       *(new_p->use) = *(old_p->use);
411       relink_imm_use (new_p, old_p);
412       /* Move the location as well.  */
413       gimple_phi_arg_set_location (phi, i,
414                                    gimple_phi_arg_location (phi, num_elem - 1));
415     }
416
417   /* Shrink the vector and return.  Note that we do not have to clear
418      PHI_ARG_DEF because the garbage collector will not look at those
419      elements beyond the first PHI_NUM_ARGS elements of the array.  */
420   phi->nargs--;
421 }
422
423
424 /* Remove all PHI arguments associated with edge E.  */
425
426 void
427 remove_phi_args (edge e)
428 {
429   gphi_iterator gsi;
430
431   for (gsi = gsi_start_phis (e->dest); !gsi_end_p (gsi); gsi_next (&gsi))
432     remove_phi_arg_num (gsi.phi (),
433                         e->dest_idx);
434 }
435
436
437 /* Remove the PHI node pointed-to by iterator GSI from basic block BB.  After
438    removal, iterator GSI is updated to point to the next PHI node in the
439    sequence. If RELEASE_LHS_P is true, the LHS of this PHI node is released
440    into the free pool of SSA names.  */
441
442 void
443 remove_phi_node (gimple_stmt_iterator *gsi, bool release_lhs_p)
444 {
445   gimple phi = gsi_stmt (*gsi);
446
447   if (release_lhs_p)
448     insert_debug_temps_for_defs (gsi);
449
450   gsi_remove (gsi, false);
451
452   /* If we are deleting the PHI node, then we should release the
453      SSA_NAME node so that it can be reused.  */
454   release_phi_node (phi);
455   if (release_lhs_p)
456     release_ssa_name (gimple_phi_result (phi));
457 }
458
459 /* Remove all the phi nodes from BB.  */
460
461 void
462 remove_phi_nodes (basic_block bb)
463 {
464   gphi_iterator gsi;
465
466   for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); )
467     remove_phi_node (&gsi, true);
468
469   set_phi_nodes (bb, NULL);
470 }
471
472 /* Given PHI, return its RHS if the PHI is a degenerate, otherwise return
473    NULL.  */
474
475 tree
476 degenerate_phi_result (gphi *phi)
477 {
478   tree lhs = gimple_phi_result (phi);
479   tree val = NULL;
480   size_t i;
481
482   /* Ignoring arguments which are the same as LHS, if all the remaining
483      arguments are the same, then the PHI is a degenerate and has the
484      value of that common argument.  */
485   for (i = 0; i < gimple_phi_num_args (phi); i++)
486     {
487       tree arg = gimple_phi_arg_def (phi, i);
488
489       if (arg == lhs)
490         continue;
491       else if (!arg)
492         break;
493       else if (!val)
494         val = arg;
495       else if (arg == val)
496         continue;
497       /* We bring in some of operand_equal_p not only to speed things
498          up, but also to avoid crashing when dereferencing the type of
499          a released SSA name.  */
500       else if (TREE_CODE (val) != TREE_CODE (arg)
501                || TREE_CODE (val) == SSA_NAME
502                || !operand_equal_p (arg, val, 0))
503         break;
504     }
505   return (i == gimple_phi_num_args (phi) ? val : NULL);
506 }
507
508 /* Set PHI nodes of a basic block BB to SEQ.  */
509
510 void
511 set_phi_nodes (basic_block bb, gimple_seq seq)
512 {
513   gimple_stmt_iterator i;
514
515   gcc_checking_assert (!(bb->flags & BB_RTL));
516   bb->il.gimple.phi_nodes = seq;
517   if (seq)
518     for (i = gsi_start (seq); !gsi_end_p (i); gsi_next (&i))
519       gimple_set_bb (gsi_stmt (i), bb);
520 }
521
522 #include "gt-tree-phinodes.h"