Import pre-release gcc-5.0 to new vendor branch
[dragonfly.git] / contrib / gcc-5.0 / gcc / tree-outof-ssa.c
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 }