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