OSDN Git Service

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