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