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