xref: /netbsd-src/external/gpl3/gcc.old/dist/gcc/tree-outof-ssa.c (revision b7b7574d3bf8eeb51a1fa3977b59142ec6434a55)
1 /* Convert a program in SSA form into Normal form.
2    Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010
3    Free Software Foundation, Inc.
4    Contributed by Andrew Macleod <amacleod@redhat.com>
5 
6 This file is part of GCC.
7 
8 GCC is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3, or (at your option)
11 any later version.
12 
13 GCC is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 GNU General Public License for more details.
17 
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3.  If not see
20 <http://www.gnu.org/licenses/>.  */
21 
22 #include "config.h"
23 #include "system.h"
24 #include "coretypes.h"
25 #include "tm.h"
26 #include "tree.h"
27 #include "ggc.h"
28 #include "basic-block.h"
29 #include "diagnostic.h"
30 #include "bitmap.h"
31 #include "tree-flow.h"
32 #include "timevar.h"
33 #include "tree-dump.h"
34 #include "tree-pass.h"
35 #include "toplev.h"
36 #include "expr.h"
37 #include "ssaexpand.h"
38 
39 
40 DEF_VEC_I(source_location);
41 DEF_VEC_ALLOC_I(source_location,heap);
42 
43 /* Used to hold all the components required to do SSA PHI elimination.
44    The node and pred/succ list is a simple linear list of nodes and
45    edges represented as pairs of nodes.
46 
47    The predecessor and successor list:  Nodes are entered in pairs, where
48    [0] ->PRED, [1]->SUCC.  All the even indexes in the array represent
49    predecessors, all the odd elements are successors.
50 
51    Rationale:
52    When implemented as bitmaps, very large programs SSA->Normal times were
53    being dominated by clearing the interference graph.
54 
55    Typically this list of edges is extremely small since it only includes
56    PHI results and uses from a single edge which have not coalesced with
57    each other.  This means that no virtual PHI nodes are included, and
58    empirical evidence suggests that the number of edges rarely exceed
59    3, and in a bootstrap of GCC, the maximum size encountered was 7.
60    This also limits the number of possible nodes that are involved to
61    rarely more than 6, and in the bootstrap of gcc, the maximum number
62    of nodes encountered was 12.  */
63 
64 typedef struct _elim_graph {
65   /* Size of the elimination vectors.  */
66   int size;
67 
68   /* List of nodes in the elimination graph.  */
69   VEC(int,heap) *nodes;
70 
71   /*  The predecessor and successor edge list.  */
72   VEC(int,heap) *edge_list;
73 
74   /* Source locus on each edge */
75   VEC(source_location,heap) *edge_locus;
76 
77   /* Visited vector.  */
78   sbitmap visited;
79 
80   /* Stack for visited nodes.  */
81   VEC(int,heap) *stack;
82 
83   /* The variable partition map.  */
84   var_map map;
85 
86   /* Edge being eliminated by this graph.  */
87   edge e;
88 
89   /* List of constant copies to emit.  These are pushed on in pairs.  */
90   VEC(int,heap) *const_dests;
91   VEC(tree,heap) *const_copies;
92 
93   /* Source locations for any constant copies.  */
94   VEC(source_location,heap) *copy_locus;
95 } *elim_graph;
96 
97 
98 /* For an edge E find out a good source location to associate with
99    instructions inserted on edge E.  If E has an implicit goto set,
100    use its location.  Otherwise search instructions in predecessors
101    of E for a location, and use that one.  That makes sense because
102    we insert on edges for PHI nodes, and effects of PHIs happen on
103    the end of the predecessor conceptually.  */
104 
105 static void
106 set_location_for_edge (edge e)
107 {
108   if (e->goto_locus)
109     {
110       set_curr_insn_source_location (e->goto_locus);
111       set_curr_insn_block (e->goto_block);
112     }
113   else
114     {
115       basic_block bb = e->src;
116       gimple_stmt_iterator gsi;
117 
118       do
119 	{
120 	  for (gsi = gsi_last_bb (bb); !gsi_end_p (gsi); gsi_prev (&gsi))
121 	    {
122 	      gimple stmt = gsi_stmt (gsi);
123 	      if (is_gimple_debug (stmt))
124 		continue;
125 	      if (gimple_has_location (stmt) || gimple_block (stmt))
126 		{
127 		  set_curr_insn_source_location (gimple_location (stmt));
128 		  set_curr_insn_block (gimple_block (stmt));
129 		  return;
130 		}
131 	    }
132 	  /* Nothing found in this basic block.  Make a half-assed attempt
133 	     to continue with another block.  */
134 	  if (single_pred_p (bb))
135 	    bb = single_pred (bb);
136 	  else
137 	    bb = e->src;
138 	}
139       while (bb != e->src);
140     }
141 }
142 
143 /* Emit insns to copy SRC into DEST converting SRC if necessary.  As
144    SRC/DEST might be BLKmode memory locations SIZEEXP is a tree from
145    which we deduce the size to copy in that case.  */
146 
147 static inline rtx
148 emit_partition_copy (rtx dest, rtx src, int unsignedsrcp, tree sizeexp)
149 {
150   rtx seq;
151 
152   start_sequence ();
153 
154   if (GET_MODE (src) != VOIDmode && GET_MODE (src) != GET_MODE (dest))
155     src = convert_to_mode (GET_MODE (dest), src, unsignedsrcp);
156   if (GET_MODE (src) == BLKmode)
157     {
158       gcc_assert (GET_MODE (dest) == BLKmode);
159       emit_block_move (dest, src, expr_size (sizeexp), BLOCK_OP_NORMAL);
160     }
161   else
162     emit_move_insn (dest, src);
163 
164   seq = get_insns ();
165   end_sequence ();
166 
167   return seq;
168 }
169 
170 /* Insert a copy instruction from partition SRC to DEST onto edge E.  */
171 
172 static void
173 insert_partition_copy_on_edge (edge e, int dest, int src, source_location locus)
174 {
175   tree var;
176   rtx seq;
177   if (dump_file && (dump_flags & TDF_DETAILS))
178     {
179       fprintf (dump_file,
180 	       "Inserting a partition copy on edge BB%d->BB%d :"
181 	       "PART.%d = PART.%d",
182 	       e->src->index,
183 	       e->dest->index, dest, src);
184       fprintf (dump_file, "\n");
185     }
186 
187   gcc_assert (SA.partition_to_pseudo[dest]);
188   gcc_assert (SA.partition_to_pseudo[src]);
189 
190   set_location_for_edge (e);
191   /* If a locus is provided, override the default.  */
192   if (locus)
193     set_curr_insn_source_location (locus);
194 
195   var = partition_to_var (SA.map, src);
196   seq = emit_partition_copy (SA.partition_to_pseudo[dest],
197 			     SA.partition_to_pseudo[src],
198 			     TYPE_UNSIGNED (TREE_TYPE (var)),
199 			     var);
200 
201   insert_insn_on_edge (seq, e);
202 }
203 
204 /* Insert a copy instruction from expression SRC to partition DEST
205    onto edge E.  */
206 
207 static void
208 insert_value_copy_on_edge (edge e, int dest, tree src, source_location locus)
209 {
210   rtx seq, x;
211   enum machine_mode dest_mode, src_mode;
212   int unsignedp;
213   tree var;
214 
215   if (dump_file && (dump_flags & TDF_DETAILS))
216     {
217       fprintf (dump_file,
218 	       "Inserting a value copy on edge BB%d->BB%d : PART.%d = ",
219 	       e->src->index,
220 	       e->dest->index, dest);
221       print_generic_expr (dump_file, src, TDF_SLIM);
222       fprintf (dump_file, "\n");
223     }
224 
225   gcc_assert (SA.partition_to_pseudo[dest]);
226 
227   set_location_for_edge (e);
228   /* If a locus is provided, override the default.  */
229   if (locus)
230     set_curr_insn_source_location (locus);
231 
232   start_sequence ();
233 
234   var = SSA_NAME_VAR (partition_to_var (SA.map, dest));
235   src_mode = TYPE_MODE (TREE_TYPE (src));
236   dest_mode = GET_MODE (SA.partition_to_pseudo[dest]);
237   gcc_assert (src_mode == TYPE_MODE (TREE_TYPE (var)));
238   gcc_assert (!REG_P (SA.partition_to_pseudo[dest])
239 	      || dest_mode == promote_decl_mode (var, &unsignedp));
240 
241   if (src_mode != dest_mode)
242     {
243       x = expand_expr (src, NULL, src_mode, EXPAND_NORMAL);
244       x = convert_modes (dest_mode, src_mode, x, unsignedp);
245     }
246   else if (src_mode == BLKmode)
247     {
248       x = SA.partition_to_pseudo[dest];
249       store_expr (src, x, 0, false);
250     }
251   else
252     x = expand_expr (src, SA.partition_to_pseudo[dest],
253 		     dest_mode, EXPAND_NORMAL);
254 
255   if (x != SA.partition_to_pseudo[dest])
256     emit_move_insn (SA.partition_to_pseudo[dest], x);
257   seq = get_insns ();
258   end_sequence ();
259 
260   insert_insn_on_edge (seq, e);
261 }
262 
263 /* Insert a copy instruction from RTL expression SRC to partition DEST
264    onto edge E.  */
265 
266 static void
267 insert_rtx_to_part_on_edge (edge e, int dest, rtx src, int unsignedsrcp,
268 			    source_location locus)
269 {
270   rtx seq;
271   if (dump_file && (dump_flags & TDF_DETAILS))
272     {
273       fprintf (dump_file,
274 	       "Inserting a temp copy on edge BB%d->BB%d : PART.%d = ",
275 	       e->src->index,
276 	       e->dest->index, dest);
277       print_simple_rtl (dump_file, src);
278       fprintf (dump_file, "\n");
279     }
280 
281   gcc_assert (SA.partition_to_pseudo[dest]);
282 
283   set_location_for_edge (e);
284   /* If a locus is provided, override the default.  */
285   if (locus)
286     set_curr_insn_source_location (locus);
287 
288   /* We give the destination as sizeexp in case src/dest are BLKmode
289      mems.  Usually we give the source.  As we result from SSA names
290      the left and right size should be the same (and no WITH_SIZE_EXPR
291      involved), so it doesn't matter.  */
292   seq = emit_partition_copy (SA.partition_to_pseudo[dest],
293 			     src, unsignedsrcp,
294 			     partition_to_var (SA.map, dest));
295 
296   insert_insn_on_edge (seq, e);
297 }
298 
299 /* Insert a copy instruction from partition SRC to RTL lvalue DEST
300    onto edge E.  */
301 
302 static void
303 insert_part_to_rtx_on_edge (edge e, rtx dest, int src, source_location locus)
304 {
305   tree var;
306   rtx seq;
307   if (dump_file && (dump_flags & TDF_DETAILS))
308     {
309       fprintf (dump_file,
310 	       "Inserting a temp copy on edge BB%d->BB%d : ",
311 	       e->src->index,
312 	       e->dest->index);
313       print_simple_rtl (dump_file, dest);
314       fprintf (dump_file, "= PART.%d\n", src);
315     }
316 
317   gcc_assert (SA.partition_to_pseudo[src]);
318 
319   set_location_for_edge (e);
320   /* If a locus is provided, override the default.  */
321   if (locus)
322     set_curr_insn_source_location (locus);
323 
324   var = partition_to_var (SA.map, src);
325   seq = emit_partition_copy (dest,
326 			     SA.partition_to_pseudo[src],
327 			     TYPE_UNSIGNED (TREE_TYPE (var)),
328 			     var);
329 
330   insert_insn_on_edge (seq, e);
331 }
332 
333 
334 /* Create an elimination graph with SIZE nodes and associated data
335    structures.  */
336 
337 static elim_graph
338 new_elim_graph (int size)
339 {
340   elim_graph g = (elim_graph) xmalloc (sizeof (struct _elim_graph));
341 
342   g->nodes = VEC_alloc (int, heap, 30);
343   g->const_dests = VEC_alloc (int, heap, 20);
344   g->const_copies = VEC_alloc (tree, heap, 20);
345   g->copy_locus = VEC_alloc (source_location, heap, 10);
346   g->edge_list = VEC_alloc (int, heap, 20);
347   g->edge_locus = VEC_alloc (source_location, heap, 10);
348   g->stack = VEC_alloc (int, heap, 30);
349 
350   g->visited = sbitmap_alloc (size);
351 
352   return g;
353 }
354 
355 
356 /* Empty elimination graph G.  */
357 
358 static inline void
359 clear_elim_graph (elim_graph g)
360 {
361   VEC_truncate (int, g->nodes, 0);
362   VEC_truncate (int, g->edge_list, 0);
363   VEC_truncate (source_location, g->edge_locus, 0);
364 }
365 
366 
367 /* Delete elimination graph G.  */
368 
369 static inline void
370 delete_elim_graph (elim_graph g)
371 {
372   sbitmap_free (g->visited);
373   VEC_free (int, heap, g->stack);
374   VEC_free (int, heap, g->edge_list);
375   VEC_free (tree, heap, g->const_copies);
376   VEC_free (int, heap, g->const_dests);
377   VEC_free (int, heap, g->nodes);
378   VEC_free (source_location, heap, g->copy_locus);
379   VEC_free (source_location, heap, g->edge_locus);
380 
381   free (g);
382 }
383 
384 
385 /* Return the number of nodes in graph G.  */
386 
387 static inline int
388 elim_graph_size (elim_graph g)
389 {
390   return VEC_length (int, g->nodes);
391 }
392 
393 
394 /* Add NODE to graph G, if it doesn't exist already.  */
395 
396 static inline void
397 elim_graph_add_node (elim_graph g, int node)
398 {
399   int x;
400   int t;
401 
402   for (x = 0; VEC_iterate (int, g->nodes, x, t); x++)
403     if (t == node)
404       return;
405   VEC_safe_push (int, heap, g->nodes, node);
406 }
407 
408 
409 /* Add the edge PRED->SUCC to graph G.  */
410 
411 static inline void
412 elim_graph_add_edge (elim_graph g, int pred, int succ, source_location locus)
413 {
414   VEC_safe_push (int, heap, g->edge_list, pred);
415   VEC_safe_push (int, heap, g->edge_list, succ);
416   VEC_safe_push (source_location, heap, g->edge_locus, locus);
417 }
418 
419 
420 /* Remove an edge from graph G for which NODE is the predecessor, and
421    return the successor node.  -1 is returned if there is no such edge.  */
422 
423 static inline int
424 elim_graph_remove_succ_edge (elim_graph g, int node, source_location *locus)
425 {
426   int y;
427   unsigned x;
428   for (x = 0; x < VEC_length (int, g->edge_list); x += 2)
429     if (VEC_index (int, g->edge_list, x) == node)
430       {
431         VEC_replace (int, g->edge_list, x, -1);
432 	y = VEC_index (int, g->edge_list, x + 1);
433 	VEC_replace (int, g->edge_list, x + 1, -1);
434 	*locus = VEC_index (source_location, g->edge_locus, x / 2);
435 	VEC_replace (source_location, g->edge_locus, x / 2, UNKNOWN_LOCATION);
436 	return y;
437       }
438   *locus = UNKNOWN_LOCATION;
439   return -1;
440 }
441 
442 
443 /* Find all the nodes in GRAPH which are successors to NODE in the
444    edge list.  VAR will hold the partition number found.  CODE is the
445    code fragment executed for every node found.  */
446 
447 #define FOR_EACH_ELIM_GRAPH_SUCC(GRAPH, NODE, VAR, LOCUS, CODE)		\
448 do {									\
449   unsigned x_;								\
450   int y_;								\
451   for (x_ = 0; x_ < VEC_length (int, (GRAPH)->edge_list); x_ += 2)	\
452     {									\
453       y_ = VEC_index (int, (GRAPH)->edge_list, x_);			\
454       if (y_ != (NODE))							\
455         continue;							\
456       (VAR) = VEC_index (int, (GRAPH)->edge_list, x_ + 1);		\
457       (LOCUS) = VEC_index (source_location, (GRAPH)->edge_locus, x_ / 2); \
458       CODE;								\
459     }									\
460 } while (0)
461 
462 
463 /* Find all the nodes which are predecessors of NODE in the edge list for
464    GRAPH.  VAR will hold the partition number found.  CODE is the
465    code fragment executed for every node found.  */
466 
467 #define FOR_EACH_ELIM_GRAPH_PRED(GRAPH, NODE, VAR, LOCUS, CODE)		\
468 do {									\
469   unsigned x_;								\
470   int y_;								\
471   for (x_ = 0; x_ < VEC_length (int, (GRAPH)->edge_list); x_ += 2)	\
472     {									\
473       y_ = VEC_index (int, (GRAPH)->edge_list, x_ + 1);			\
474       if (y_ != (NODE))							\
475         continue;							\
476       (VAR) = VEC_index (int, (GRAPH)->edge_list, x_);			\
477       (LOCUS) = VEC_index (source_location, (GRAPH)->edge_locus, x_ / 2); \
478       CODE;								\
479     }									\
480 } while (0)
481 
482 
483 /* Add T to elimination graph G.  */
484 
485 static inline void
486 eliminate_name (elim_graph g, int T)
487 {
488   elim_graph_add_node (g, T);
489 }
490 
491 
492 /* Build elimination graph G for basic block BB on incoming PHI edge
493    G->e.  */
494 
495 static void
496 eliminate_build (elim_graph g)
497 {
498   tree Ti;
499   int p0, pi;
500   gimple_stmt_iterator gsi;
501 
502   clear_elim_graph (g);
503 
504   for (gsi = gsi_start_phis (g->e->dest); !gsi_end_p (gsi); gsi_next (&gsi))
505     {
506       gimple phi = gsi_stmt (gsi);
507       source_location locus;
508 
509       p0 = var_to_partition (g->map, gimple_phi_result (phi));
510       /* Ignore results which are not in partitions.  */
511       if (p0 == NO_PARTITION)
512 	continue;
513 
514       Ti = PHI_ARG_DEF (phi, g->e->dest_idx);
515       locus = gimple_phi_arg_location_from_edge (phi, g->e);
516 
517       /* If this argument is a constant, or a SSA_NAME which is being
518 	 left in SSA form, just queue a copy to be emitted on this
519 	 edge.  */
520       if (!phi_ssa_name_p (Ti)
521 	  || (TREE_CODE (Ti) == SSA_NAME
522 	      && var_to_partition (g->map, Ti) == NO_PARTITION))
523         {
524 	  /* Save constant copies until all other copies have been emitted
525 	     on this edge.  */
526 	  VEC_safe_push (int, heap, g->const_dests, p0);
527 	  VEC_safe_push (tree, heap, g->const_copies, Ti);
528 	  VEC_safe_push (source_location, heap, g->copy_locus, locus);
529 	}
530       else
531         {
532 	  pi = var_to_partition (g->map, Ti);
533 	  if (p0 != pi)
534 	    {
535 	      eliminate_name (g, p0);
536 	      eliminate_name (g, pi);
537 	      elim_graph_add_edge (g, p0, pi, locus);
538 	    }
539 	}
540     }
541 }
542 
543 
544 /* Push successors of T onto the elimination stack for G.  */
545 
546 static void
547 elim_forward (elim_graph g, int T)
548 {
549   int S;
550   source_location locus;
551 
552   SET_BIT (g->visited, T);
553   FOR_EACH_ELIM_GRAPH_SUCC (g, T, S, locus,
554     {
555       if (!TEST_BIT (g->visited, S))
556         elim_forward (g, S);
557     });
558   VEC_safe_push (int, heap, g->stack, T);
559 }
560 
561 
562 /* Return 1 if there unvisited predecessors of T in graph G.  */
563 
564 static int
565 elim_unvisited_predecessor (elim_graph g, int T)
566 {
567   int P;
568   source_location locus;
569 
570   FOR_EACH_ELIM_GRAPH_PRED (g, T, P, locus,
571     {
572       if (!TEST_BIT (g->visited, P))
573         return 1;
574     });
575   return 0;
576 }
577 
578 /* Process predecessors first, and insert a copy.  */
579 
580 static void
581 elim_backward (elim_graph g, int T)
582 {
583   int P;
584   source_location locus;
585 
586   SET_BIT (g->visited, T);
587   FOR_EACH_ELIM_GRAPH_PRED (g, T, P, locus,
588     {
589       if (!TEST_BIT (g->visited, P))
590         {
591 	  elim_backward (g, P);
592 	  insert_partition_copy_on_edge (g->e, P, T, locus);
593 	}
594     });
595 }
596 
597 /* Allocate a new pseudo register usable for storing values sitting
598    in NAME (a decl or SSA name), i.e. with matching mode and attributes.  */
599 
600 static rtx
601 get_temp_reg (tree name)
602 {
603   tree var = TREE_CODE (name) == SSA_NAME ? SSA_NAME_VAR (name) : name;
604   tree type = TREE_TYPE (var);
605   int unsignedp;
606   enum machine_mode reg_mode = promote_decl_mode (var, &unsignedp);
607   rtx x = gen_reg_rtx (reg_mode);
608   if (POINTER_TYPE_P (type))
609     mark_reg_pointer (x, TYPE_ALIGN (TREE_TYPE (TREE_TYPE (var))));
610   return x;
611 }
612 
613 /* Insert required copies for T in graph G.  Check for a strongly connected
614    region, and create a temporary to break the cycle if one is found.  */
615 
616 static void
617 elim_create (elim_graph g, int T)
618 {
619   int P, S;
620   source_location locus;
621 
622   if (elim_unvisited_predecessor (g, T))
623     {
624       tree var = partition_to_var (g->map, T);
625       rtx U = get_temp_reg (var);
626       int unsignedsrcp = TYPE_UNSIGNED (TREE_TYPE (var));
627 
628       insert_part_to_rtx_on_edge (g->e, U, T, UNKNOWN_LOCATION);
629       FOR_EACH_ELIM_GRAPH_PRED (g, T, P, locus,
630 	{
631 	  if (!TEST_BIT (g->visited, P))
632 	    {
633 	      elim_backward (g, P);
634 	      insert_rtx_to_part_on_edge (g->e, P, U, unsignedsrcp, locus);
635 	    }
636 	});
637     }
638   else
639     {
640       S = elim_graph_remove_succ_edge (g, T, &locus);
641       if (S != -1)
642 	{
643 	  SET_BIT (g->visited, T);
644 	  insert_partition_copy_on_edge (g->e, T, S, locus);
645 	}
646     }
647 }
648 
649 
650 /* Eliminate all the phi nodes on edge E in graph G.  */
651 
652 static void
653 eliminate_phi (edge e, elim_graph g)
654 {
655   int x;
656 
657   gcc_assert (VEC_length (tree, g->const_copies) == 0);
658   gcc_assert (VEC_length (source_location, g->copy_locus) == 0);
659 
660   /* Abnormal edges already have everything coalesced.  */
661   if (e->flags & EDGE_ABNORMAL)
662     return;
663 
664   g->e = e;
665 
666   eliminate_build (g);
667 
668   if (elim_graph_size (g) != 0)
669     {
670       int part;
671 
672       sbitmap_zero (g->visited);
673       VEC_truncate (int, g->stack, 0);
674 
675       for (x = 0; VEC_iterate (int, g->nodes, x, part); x++)
676         {
677 	  if (!TEST_BIT (g->visited, part))
678 	    elim_forward (g, part);
679 	}
680 
681       sbitmap_zero (g->visited);
682       while (VEC_length (int, g->stack) > 0)
683 	{
684 	  x = VEC_pop (int, g->stack);
685 	  if (!TEST_BIT (g->visited, x))
686 	    elim_create (g, x);
687 	}
688     }
689 
690   /* If there are any pending constant copies, issue them now.  */
691   while (VEC_length (tree, g->const_copies) > 0)
692     {
693       int dest;
694       tree src;
695       source_location locus;
696 
697       src = VEC_pop (tree, g->const_copies);
698       dest = VEC_pop (int, g->const_dests);
699       locus = VEC_pop (source_location, g->copy_locus);
700       insert_value_copy_on_edge (e, dest, src, locus);
701     }
702 }
703 
704 
705 /* Remove each argument from PHI.  If an arg was the last use of an SSA_NAME,
706    check to see if this allows another PHI node to be removed.  */
707 
708 static void
709 remove_gimple_phi_args (gimple phi)
710 {
711   use_operand_p arg_p;
712   ssa_op_iter iter;
713 
714   if (dump_file && (dump_flags & TDF_DETAILS))
715     {
716       fprintf (dump_file, "Removing Dead PHI definition: ");
717       print_gimple_stmt (dump_file, phi, 0, TDF_SLIM);
718     }
719 
720   FOR_EACH_PHI_ARG (arg_p, phi, iter, SSA_OP_USE)
721     {
722       tree arg = USE_FROM_PTR (arg_p);
723       if (TREE_CODE (arg) == SSA_NAME)
724         {
725 	  /* Remove the reference to the existing argument.  */
726 	  SET_USE (arg_p, NULL_TREE);
727 	  if (has_zero_uses (arg))
728 	    {
729 	      gimple stmt;
730 	      gimple_stmt_iterator gsi;
731 
732 	      stmt = SSA_NAME_DEF_STMT (arg);
733 
734 	      /* Also remove the def if it is a PHI node.  */
735 	      if (gimple_code (stmt) == GIMPLE_PHI)
736 		{
737 		  remove_gimple_phi_args (stmt);
738 		  gsi = gsi_for_stmt (stmt);
739 		  remove_phi_node (&gsi, true);
740 		}
741 
742 	    }
743 	}
744     }
745 }
746 
747 /* Remove any PHI node which is a virtual PHI, or a PHI with no uses.  */
748 
749 static void
750 eliminate_useless_phis (void)
751 {
752   basic_block bb;
753   gimple_stmt_iterator gsi;
754   tree result;
755 
756   FOR_EACH_BB (bb)
757     {
758       for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); )
759         {
760 	  gimple phi = gsi_stmt (gsi);
761 	  result = gimple_phi_result (phi);
762 	  if (!is_gimple_reg (SSA_NAME_VAR (result)))
763 	    {
764 #ifdef ENABLE_CHECKING
765 	      size_t i;
766 	      /* There should be no arguments which are not virtual, or the
767 	         results will be incorrect.  */
768 	      for (i = 0; i < gimple_phi_num_args (phi); i++)
769 	        {
770 		  tree arg = PHI_ARG_DEF (phi, i);
771 		  if (TREE_CODE (arg) == SSA_NAME
772 		      && is_gimple_reg (SSA_NAME_VAR (arg)))
773 		    {
774 		      fprintf (stderr, "Argument of PHI is not virtual (");
775 		      print_generic_expr (stderr, arg, TDF_SLIM);
776 		      fprintf (stderr, "), but the result is :");
777 		      print_gimple_stmt (stderr, phi, 0, TDF_SLIM);
778 		      internal_error ("SSA corruption");
779 		    }
780 		}
781 #endif
782 	      remove_phi_node (&gsi, true);
783 	    }
784           else
785 	    {
786 	      /* Also remove real PHIs with no uses.  */
787 	      if (has_zero_uses (result))
788 	        {
789 		  remove_gimple_phi_args (phi);
790 		  remove_phi_node (&gsi, true);
791 		}
792 	      else
793 		gsi_next (&gsi);
794 	    }
795 	}
796     }
797 }
798 
799 
800 /* This function will rewrite the current program using the variable mapping
801    found in MAP.  If the replacement vector VALUES is provided, any
802    occurrences of partitions with non-null entries in the vector will be
803    replaced with the expression in the vector instead of its mapped
804    variable.  */
805 
806 static void
807 rewrite_trees (var_map map ATTRIBUTE_UNUSED)
808 {
809 #ifdef ENABLE_CHECKING
810   basic_block bb;
811   /* Search for PHIs where the destination has no partition, but one
812      or more arguments has a partition.  This should not happen and can
813      create incorrect code.  */
814   FOR_EACH_BB (bb)
815     {
816       gimple_stmt_iterator gsi;
817       for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
818 	{
819 	  gimple phi = gsi_stmt (gsi);
820 	  tree T0 = var_to_partition_to_var (map, gimple_phi_result (phi));
821 	  if (T0 == NULL_TREE)
822 	    {
823 	      size_t i;
824 	      for (i = 0; i < gimple_phi_num_args (phi); i++)
825 		{
826 		  tree arg = PHI_ARG_DEF (phi, i);
827 
828 		  if (TREE_CODE (arg) == SSA_NAME
829 		      && var_to_partition (map, arg) != NO_PARTITION)
830 		    {
831 		      fprintf (stderr, "Argument of PHI is in a partition :(");
832 		      print_generic_expr (stderr, arg, TDF_SLIM);
833 		      fprintf (stderr, "), but the result is not :");
834 		      print_gimple_stmt (stderr, phi, 0, TDF_SLIM);
835 		      internal_error ("SSA corruption");
836 		    }
837 		}
838 	    }
839 	}
840     }
841 #endif
842 }
843 
844 /* Given the out-of-ssa info object SA (with prepared partitions)
845    eliminate all phi nodes in all basic blocks.  Afterwards no
846    basic block will have phi nodes anymore and there are possibly
847    some RTL instructions inserted on edges.  */
848 
849 void
850 expand_phi_nodes (struct ssaexpand *sa)
851 {
852   basic_block bb;
853   elim_graph g = new_elim_graph (sa->map->num_partitions);
854   g->map = sa->map;
855 
856   FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR->next_bb, EXIT_BLOCK_PTR, next_bb)
857     if (!gimple_seq_empty_p (phi_nodes (bb)))
858       {
859 	edge e;
860 	edge_iterator ei;
861 	FOR_EACH_EDGE (e, ei, bb->preds)
862 	  eliminate_phi (e, g);
863 	set_phi_nodes (bb, NULL);
864 	/* We can't redirect EH edges in RTL land, so we need to do this
865 	   here.  Redirection happens only when splitting is necessary,
866 	   which it is only for critical edges, normally.  For EH edges
867 	   it might also be necessary when the successor has more than
868 	   one predecessor.  In that case the edge is either required to
869 	   be fallthru (which EH edges aren't), or the predecessor needs
870 	   to end with a jump (which again, isn't the case with EH edges).
871 	   Hence, split all EH edges on which we inserted instructions
872 	   and whose successor has multiple predecessors.  */
873 	for (ei = ei_start (bb->preds); (e = ei_safe_edge (ei)); )
874 	  {
875 	    if (e->insns.r && (e->flags & EDGE_EH)
876 		&& !single_pred_p (e->dest))
877 	      {
878 		rtx insns = e->insns.r;
879 		basic_block bb;
880 		e->insns.r = NULL_RTX;
881 		bb = split_edge (e);
882 		single_pred_edge (bb)->insns.r = insns;
883 	      }
884 	    else
885 	      ei_next (&ei);
886 	  }
887       }
888 
889   delete_elim_graph (g);
890 }
891 
892 
893 /* Remove the ssa-names in the current function and translate them into normal
894    compiler variables.  PERFORM_TER is true if Temporary Expression Replacement
895    should also be used.  */
896 
897 static void
898 remove_ssa_form (bool perform_ter, struct ssaexpand *sa)
899 {
900   bitmap values = NULL;
901   var_map map;
902   unsigned i;
903 
904   map = coalesce_ssa_name ();
905 
906   /* Return to viewing the variable list as just all reference variables after
907      coalescing has been performed.  */
908   partition_view_normal (map, false);
909 
910   if (dump_file && (dump_flags & TDF_DETAILS))
911     {
912       fprintf (dump_file, "After Coalescing:\n");
913       dump_var_map (dump_file, map);
914     }
915 
916   if (perform_ter)
917     {
918       values = find_replaceable_exprs (map);
919       if (values && dump_file && (dump_flags & TDF_DETAILS))
920 	dump_replaceable_exprs (dump_file, values);
921     }
922 
923   rewrite_trees (map);
924 
925   sa->map = map;
926   sa->values = values;
927   sa->partition_has_default_def = BITMAP_ALLOC (NULL);
928   for (i = 1; i < num_ssa_names; i++)
929     {
930       tree t = ssa_name (i);
931       if (t && SSA_NAME_IS_DEFAULT_DEF (t))
932 	{
933 	  int p = var_to_partition (map, t);
934 	  if (p != NO_PARTITION)
935 	    bitmap_set_bit (sa->partition_has_default_def, p);
936 	}
937     }
938 }
939 
940 
941 /* If not already done so for basic block BB, assign increasing uids
942    to each of its instructions.  */
943 
944 static void
945 maybe_renumber_stmts_bb (basic_block bb)
946 {
947   unsigned i = 0;
948   gimple_stmt_iterator gsi;
949 
950   if (!bb->aux)
951     return;
952   bb->aux = NULL;
953   for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
954     {
955       gimple stmt = gsi_stmt (gsi);
956       gimple_set_uid (stmt, i);
957       i++;
958     }
959 }
960 
961 
962 /* Return true if we can determine that the SSA_NAMEs RESULT (a result
963    of a PHI node) and ARG (one of its arguments) conflict.  Return false
964    otherwise, also when we simply aren't sure.  */
965 
966 static bool
967 trivially_conflicts_p (basic_block bb, tree result, tree arg)
968 {
969   use_operand_p use;
970   imm_use_iterator imm_iter;
971   gimple defa = SSA_NAME_DEF_STMT (arg);
972 
973   /* If ARG isn't defined in the same block it's too complicated for
974      our little mind.  */
975   if (gimple_bb (defa) != bb)
976     return false;
977 
978   FOR_EACH_IMM_USE_FAST (use, imm_iter, result)
979     {
980       gimple use_stmt = USE_STMT (use);
981       if (is_gimple_debug (use_stmt))
982 	continue;
983       /* Now, if there's a use of RESULT that lies outside this basic block,
984 	 then there surely is a conflict with ARG.  */
985       if (gimple_bb (use_stmt) != bb)
986 	return true;
987       if (gimple_code (use_stmt) == GIMPLE_PHI)
988 	continue;
989       /* The use now is in a real stmt of BB, so if ARG was defined
990          in a PHI node (like RESULT) both conflict.  */
991       if (gimple_code (defa) == GIMPLE_PHI)
992 	return true;
993       maybe_renumber_stmts_bb (bb);
994       /* If the use of RESULT occurs after the definition of ARG,
995          the two conflict too.  */
996       if (gimple_uid (defa) < gimple_uid (use_stmt))
997 	return true;
998     }
999 
1000   return false;
1001 }
1002 
1003 
1004 /* Search every PHI node for arguments associated with backedges which
1005    we can trivially determine will need a copy (the argument is either
1006    not an SSA_NAME or the argument has a different underlying variable
1007    than the PHI result).
1008 
1009    Insert a copy from the PHI argument to a new destination at the
1010    end of the block with the backedge to the top of the loop.  Update
1011    the PHI argument to reference this new destination.  */
1012 
1013 static void
1014 insert_backedge_copies (void)
1015 {
1016   basic_block bb;
1017   gimple_stmt_iterator gsi;
1018 
1019   FOR_EACH_BB (bb)
1020     {
1021       /* Mark block as possibly needing calculation of UIDs.  */
1022       bb->aux = &bb->aux;
1023 
1024       for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1025 	{
1026 	  gimple phi = gsi_stmt (gsi);
1027 	  tree result = gimple_phi_result (phi);
1028 	  tree result_var;
1029 	  size_t i;
1030 
1031 	  if (!is_gimple_reg (result))
1032 	    continue;
1033 
1034 	  result_var = SSA_NAME_VAR (result);
1035 	  for (i = 0; i < gimple_phi_num_args (phi); i++)
1036 	    {
1037 	      tree arg = gimple_phi_arg_def (phi, i);
1038 	      edge e = gimple_phi_arg_edge (phi, i);
1039 
1040 	      /* If the argument is not an SSA_NAME, then we will need a
1041 		 constant initialization.  If the argument is an SSA_NAME with
1042 		 a different underlying variable then a copy statement will be
1043 		 needed.  */
1044 	      if ((e->flags & EDGE_DFS_BACK)
1045 		  && (TREE_CODE (arg) != SSA_NAME
1046 		      || SSA_NAME_VAR (arg) != result_var
1047 		      || trivially_conflicts_p (bb, result, arg)))
1048 		{
1049 		  tree name;
1050 		  gimple stmt, last = NULL;
1051 		  gimple_stmt_iterator gsi2;
1052 
1053 		  gsi2 = gsi_last_bb (gimple_phi_arg_edge (phi, i)->src);
1054 		  if (!gsi_end_p (gsi2))
1055 		    last = gsi_stmt (gsi2);
1056 
1057 		  /* In theory the only way we ought to get back to the
1058 		     start of a loop should be with a COND_EXPR or GOTO_EXPR.
1059 		     However, better safe than sorry.
1060 		     If the block ends with a control statement or
1061 		     something that might throw, then we have to
1062 		     insert this assignment before the last
1063 		     statement.  Else insert it after the last statement.  */
1064 		  if (last && stmt_ends_bb_p (last))
1065 		    {
1066 		      /* If the last statement in the block is the definition
1067 			 site of the PHI argument, then we can't insert
1068 			 anything after it.  */
1069 		      if (TREE_CODE (arg) == SSA_NAME
1070 			  && SSA_NAME_DEF_STMT (arg) == last)
1071 			continue;
1072 		    }
1073 
1074 		  /* Create a new instance of the underlying variable of the
1075 		     PHI result.  */
1076 		  stmt = gimple_build_assign (result_var,
1077 					      gimple_phi_arg_def (phi, i));
1078 		  name = make_ssa_name (result_var, stmt);
1079 		  gimple_assign_set_lhs (stmt, name);
1080 
1081 		  /* copy location if present.  */
1082 		  if (gimple_phi_arg_has_location (phi, i))
1083 		    gimple_set_location (stmt,
1084 					 gimple_phi_arg_location (phi, i));
1085 
1086 		  /* Insert the new statement into the block and update
1087 		     the PHI node.  */
1088 		  if (last && stmt_ends_bb_p (last))
1089 		    gsi_insert_before (&gsi2, stmt, GSI_NEW_STMT);
1090 		  else
1091 		    gsi_insert_after (&gsi2, stmt, GSI_NEW_STMT);
1092 		  SET_PHI_ARG_DEF (phi, i, name);
1093 		}
1094 	    }
1095 	}
1096 
1097       /* Unmark this block again.  */
1098       bb->aux = NULL;
1099     }
1100 }
1101 
1102 /* Free all memory associated with going out of SSA form.  SA is
1103    the outof-SSA info object.  */
1104 
1105 void
1106 finish_out_of_ssa (struct ssaexpand *sa)
1107 {
1108   free (sa->partition_to_pseudo);
1109   if (sa->values)
1110     BITMAP_FREE (sa->values);
1111   delete_var_map (sa->map);
1112   BITMAP_FREE (sa->partition_has_default_def);
1113   memset (sa, 0, sizeof *sa);
1114 }
1115 
1116 /* Take the current function out of SSA form, translating PHIs as described in
1117    R. Morgan, ``Building an Optimizing Compiler'',
1118    Butterworth-Heinemann, Boston, MA, 1998. pp 176-186.  */
1119 
1120 unsigned int
1121 rewrite_out_of_ssa (struct ssaexpand *sa)
1122 {
1123   /* If elimination of a PHI requires inserting a copy on a backedge,
1124      then we will have to split the backedge which has numerous
1125      undesirable performance effects.
1126 
1127      A significant number of such cases can be handled here by inserting
1128      copies into the loop itself.  */
1129   insert_backedge_copies ();
1130 
1131 
1132   /* Eliminate PHIs which are of no use, such as virtual or dead phis.  */
1133   eliminate_useless_phis ();
1134 
1135   if (dump_file && (dump_flags & TDF_DETAILS))
1136     gimple_dump_cfg (dump_file, dump_flags & ~TDF_DETAILS);
1137 
1138   remove_ssa_form (flag_tree_ter, sa);
1139 
1140   if (dump_file && (dump_flags & TDF_DETAILS))
1141     gimple_dump_cfg (dump_file, dump_flags & ~TDF_DETAILS);
1142 
1143   return 0;
1144 }
1145