Account for high/lo_sum simplification with displacements
[official-gcc.git] / gcc / tree-outof-ssa.c
blobe6310cdfd3cca2efb88995b4fa3f62a3026e189f
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>
5 This file is part of GCC.
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.
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.
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/>. */
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"
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"
86 /* Return TRUE if expression STMT is suitable for replacement. */
88 bool
89 ssa_is_replaceable_p (gimple stmt)
91 use_operand_p use_p;
92 tree def;
93 gimple use_stmt;
95 /* Only consider modify stmts. */
96 if (!is_gimple_assign (stmt))
97 return false;
99 /* If the statement may throw an exception, it cannot be replaced. */
100 if (stmt_could_throw_p (stmt))
101 return false;
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;
108 /* Only consider definitions which have a single use. */
109 if (!single_imm_use (def, &use_p, &use_stmt))
110 return false;
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;
116 /* There must be no VDEFs. */
117 if (gimple_vdef (stmt))
118 return false;
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;
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;
131 /* No function calls can be replaced. */
132 if (is_gimple_call (stmt))
133 return false;
135 /* Leave any stmt with volatile operands alone as well. */
136 if (gimple_has_volatile_ops (stmt))
137 return false;
139 return true;
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.
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.
151 Rationale:
152 When implemented as bitmaps, very large programs SSA->Normal times were
153 being dominated by clearing the interference graph.
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. */
164 typedef struct _elim_graph {
165 /* Size of the elimination vectors. */
166 int size;
168 /* List of nodes in the elimination graph. */
169 vec<int> nodes;
171 /* The predecessor and successor edge list. */
172 vec<int> edge_list;
174 /* Source locus on each edge */
175 vec<source_location> edge_locus;
177 /* Visited vector. */
178 sbitmap visited;
180 /* Stack for visited nodes. */
181 vec<int> stack;
183 /* The variable partition map. */
184 var_map map;
186 /* Edge being eliminated by this graph. */
187 edge e;
189 /* List of constant copies to emit. These are pushed on in pairs. */
190 vec<int> const_dests;
191 vec<tree> const_copies;
193 /* Source locations for any constant copies. */
194 vec<source_location> copy_locus;
195 } *elim_graph;
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. */
205 static void
206 set_location_for_edge (edge e)
208 if (e->goto_locus)
210 set_curr_insn_location (e->goto_locus);
212 else
214 basic_block bb = e->src;
215 gimple_stmt_iterator gsi;
219 for (gsi = gsi_last_bb (bb); !gsi_end_p (gsi); gsi_prev (&gsi))
221 gimple stmt = gsi_stmt (gsi);
222 if (is_gimple_debug (stmt))
223 continue;
224 if (gimple_has_location (stmt) || gimple_block (stmt))
226 set_curr_insn_location (gimple_location (stmt));
227 return;
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;
237 while (bb != e->src);
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. */
245 static inline rtx
246 emit_partition_copy (rtx dest, rtx src, int unsignedsrcp, tree sizeexp)
248 rtx seq;
250 start_sequence ();
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)
256 gcc_assert (GET_MODE (dest) == BLKmode);
257 emit_block_move (dest, src, expr_size (sizeexp), BLOCK_OP_NORMAL);
259 else
260 emit_move_insn (dest, src);
262 seq = get_insns ();
263 end_sequence ();
265 return seq;
268 /* Insert a copy instruction from partition SRC to DEST onto edge E. */
270 static void
271 insert_partition_copy_on_edge (edge e, int dest, int src, source_location locus)
273 tree var;
274 rtx seq;
275 if (dump_file && (dump_flags & TDF_DETAILS))
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");
285 gcc_assert (SA.partition_to_pseudo[dest]);
286 gcc_assert (SA.partition_to_pseudo[src]);
288 set_location_for_edge (e);
289 /* If a locus is provided, override the default. */
290 if (locus)
291 set_curr_insn_location (locus);
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);
299 insert_insn_on_edge (seq, e);
302 /* Insert a copy instruction from expression SRC to partition DEST
303 onto edge E. */
305 static void
306 insert_value_copy_on_edge (edge e, int dest, tree src, source_location locus)
308 rtx dest_rtx, seq, x;
309 machine_mode dest_mode, src_mode;
310 int unsignedp;
311 tree var;
313 if (dump_file && (dump_flags & TDF_DETAILS))
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");
323 dest_rtx = copy_rtx (SA.partition_to_pseudo[dest]);
324 gcc_assert (dest_rtx);
326 set_location_for_edge (e);
327 /* If a locus is provided, override the default. */
328 if (locus)
329 set_curr_insn_location (locus);
331 start_sequence ();
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));
340 if (src_mode != dest_mode)
342 x = expand_expr (src, NULL, src_mode, EXPAND_NORMAL);
343 x = convert_modes (dest_mode, src_mode, x, unsignedp);
345 else if (src_mode == BLKmode)
347 x = dest_rtx;
348 store_expr (src, x, 0, false);
350 else
351 x = expand_expr (src, dest_rtx, dest_mode, EXPAND_NORMAL);
353 if (x != dest_rtx)
354 emit_move_insn (dest_rtx, x);
355 seq = get_insns ();
356 end_sequence ();
358 insert_insn_on_edge (seq, e);
361 /* Insert a copy instruction from RTL expression SRC to partition DEST
362 onto edge E. */
364 static void
365 insert_rtx_to_part_on_edge (edge e, int dest, rtx src, int unsignedsrcp,
366 source_location locus)
368 rtx seq;
369 if (dump_file && (dump_flags & TDF_DETAILS))
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");
379 gcc_assert (SA.partition_to_pseudo[dest]);
381 set_location_for_edge (e);
382 /* If a locus is provided, override the default. */
383 if (locus)
384 set_curr_insn_location (locus);
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));
394 insert_insn_on_edge (seq, e);
397 /* Insert a copy instruction from partition SRC to RTL lvalue DEST
398 onto edge E. */
400 static void
401 insert_part_to_rtx_on_edge (edge e, rtx dest, int src, source_location locus)
403 tree var;
404 rtx seq;
405 if (dump_file && (dump_flags & TDF_DETAILS))
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);
415 gcc_assert (SA.partition_to_pseudo[src]);
417 set_location_for_edge (e);
418 /* If a locus is provided, override the default. */
419 if (locus)
420 set_curr_insn_location (locus);
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);
428 insert_insn_on_edge (seq, e);
432 /* Create an elimination graph with SIZE nodes and associated data
433 structures. */
435 static elim_graph
436 new_elim_graph (int size)
438 elim_graph g = (elim_graph) xmalloc (sizeof (struct _elim_graph));
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);
448 g->visited = sbitmap_alloc (size);
450 return g;
454 /* Empty elimination graph G. */
456 static inline void
457 clear_elim_graph (elim_graph g)
459 g->nodes.truncate (0);
460 g->edge_list.truncate (0);
461 g->edge_locus.truncate (0);
465 /* Delete elimination graph G. */
467 static inline void
468 delete_elim_graph (elim_graph g)
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 ();
479 free (g);
483 /* Return the number of nodes in graph G. */
485 static inline int
486 elim_graph_size (elim_graph g)
488 return g->nodes.length ();
492 /* Add NODE to graph G, if it doesn't exist already. */
494 static inline void
495 elim_graph_add_node (elim_graph g, int node)
497 int x;
498 int t;
500 FOR_EACH_VEC_ELT (g->nodes, x, t)
501 if (t == node)
502 return;
503 g->nodes.safe_push (node);
507 /* Add the edge PRED->SUCC to graph G. */
509 static inline void
510 elim_graph_add_edge (elim_graph g, int pred, int succ, source_location locus)
512 g->edge_list.safe_push (pred);
513 g->edge_list.safe_push (succ);
514 g->edge_locus.safe_push (locus);
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. */
521 static inline int
522 elim_graph_remove_succ_edge (elim_graph g, int node, source_location *locus)
524 int y;
525 unsigned x;
526 for (x = 0; x < g->edge_list.length (); x += 2)
527 if (g->edge_list[x] == node)
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;
536 *locus = UNKNOWN_LOCATION;
537 return -1;
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. */
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) \
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; \
558 } while (0)
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. */
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) \
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; \
578 } while (0)
581 /* Add T to elimination graph G. */
583 static inline void
584 eliminate_name (elim_graph g, int T)
586 elim_graph_add_node (g, T);
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. */
594 static inline bool
595 queue_phi_copy_p (var_map map, tree t)
597 if (TREE_CODE (t) == SSA_NAME)
599 if (var_to_partition (map, t) == NO_PARTITION)
600 return true;
601 return false;
603 gcc_checking_assert (is_gimple_min_invariant (t));
604 return true;
607 /* Build elimination graph G for basic block BB on incoming PHI edge
608 G->e. */
610 static void
611 eliminate_build (elim_graph g)
613 tree Ti;
614 int p0, pi;
615 gphi_iterator gsi;
617 clear_elim_graph (g);
619 for (gsi = gsi_start_phis (g->e->dest); !gsi_end_p (gsi); gsi_next (&gsi))
621 gphi *phi = gsi.phi ();
622 source_location locus;
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;
629 Ti = PHI_ARG_DEF (phi, g->e->dest_idx);
630 locus = gimple_phi_arg_location_from_edge (phi, g->e);
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))
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);
643 else
645 pi = var_to_partition (g->map, Ti);
646 if (p0 != pi)
648 eliminate_name (g, p0);
649 eliminate_name (g, pi);
650 elim_graph_add_edge (g, p0, pi, locus);
657 /* Push successors of T onto the elimination stack for G. */
659 static void
660 elim_forward (elim_graph g, int T)
662 int S;
663 source_location locus;
665 bitmap_set_bit (g->visited, T);
666 FOR_EACH_ELIM_GRAPH_SUCC (g, T, S, locus,
668 if (!bitmap_bit_p (g->visited, S))
669 elim_forward (g, S);
671 g->stack.safe_push (T);
675 /* Return 1 if there unvisited predecessors of T in graph G. */
677 static int
678 elim_unvisited_predecessor (elim_graph g, int T)
680 int P;
681 source_location locus;
683 FOR_EACH_ELIM_GRAPH_PRED (g, T, P, locus,
685 if (!bitmap_bit_p (g->visited, P))
686 return 1;
688 return 0;
691 /* Process predecessors first, and insert a copy. */
693 static void
694 elim_backward (elim_graph g, int T)
696 int P;
697 source_location locus;
699 bitmap_set_bit (g->visited, T);
700 FOR_EACH_ELIM_GRAPH_PRED (g, T, P, locus,
702 if (!bitmap_bit_p (g->visited, P))
704 elim_backward (g, P);
705 insert_partition_copy_on_edge (g->e, P, T, locus);
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. */
713 static rtx
714 get_temp_reg (tree name)
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;
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. */
729 static void
730 elim_create (elim_graph g, int T)
732 int P, S;
733 source_location locus;
735 if (elim_unvisited_predecessor (g, T))
737 tree var = partition_to_var (g->map, T);
738 rtx U = get_temp_reg (var);
739 int unsignedsrcp = TYPE_UNSIGNED (TREE_TYPE (var));
741 insert_part_to_rtx_on_edge (g->e, U, T, UNKNOWN_LOCATION);
742 FOR_EACH_ELIM_GRAPH_PRED (g, T, P, locus,
744 if (!bitmap_bit_p (g->visited, P))
746 elim_backward (g, P);
747 insert_rtx_to_part_on_edge (g->e, P, U, unsignedsrcp, locus);
751 else
753 S = elim_graph_remove_succ_edge (g, T, &locus);
754 if (S != -1)
756 bitmap_set_bit (g->visited, T);
757 insert_partition_copy_on_edge (g->e, T, S, locus);
763 /* Eliminate all the phi nodes on edge E in graph G. */
765 static void
766 eliminate_phi (edge e, elim_graph g)
768 int x;
770 gcc_assert (g->const_copies.length () == 0);
771 gcc_assert (g->copy_locus.length () == 0);
773 /* Abnormal edges already have everything coalesced. */
774 if (e->flags & EDGE_ABNORMAL)
775 return;
777 g->e = e;
779 eliminate_build (g);
781 if (elim_graph_size (g) != 0)
783 int part;
785 bitmap_clear (g->visited);
786 g->stack.truncate (0);
788 FOR_EACH_VEC_ELT (g->nodes, x, part)
790 if (!bitmap_bit_p (g->visited, part))
791 elim_forward (g, part);
794 bitmap_clear (g->visited);
795 while (g->stack.length () > 0)
797 x = g->stack.pop ();
798 if (!bitmap_bit_p (g->visited, x))
799 elim_create (g, x);
803 /* If there are any pending constant copies, issue them now. */
804 while (g->const_copies.length () > 0)
806 int dest;
807 tree src;
808 source_location locus;
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);
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. */
821 static void
822 remove_gimple_phi_args (gphi *phi)
824 use_operand_p arg_p;
825 ssa_op_iter iter;
827 if (dump_file && (dump_flags & TDF_DETAILS))
829 fprintf (dump_file, "Removing Dead PHI definition: ");
830 print_gimple_stmt (dump_file, phi, 0, TDF_SLIM);
833 FOR_EACH_PHI_ARG (arg_p, phi, iter, SSA_OP_USE)
835 tree arg = USE_FROM_PTR (arg_p);
836 if (TREE_CODE (arg) == SSA_NAME)
838 /* Remove the reference to the existing argument. */
839 SET_USE (arg_p, NULL_TREE);
840 if (has_zero_uses (arg))
842 gimple stmt;
843 gimple_stmt_iterator gsi;
845 stmt = SSA_NAME_DEF_STMT (arg);
847 /* Also remove the def if it is a PHI node. */
848 if (gimple_code (stmt) == GIMPLE_PHI)
850 remove_gimple_phi_args (as_a <gphi *> (stmt));
851 gsi = gsi_for_stmt (stmt);
852 remove_phi_node (&gsi, true);
860 /* Remove any PHI node which is a virtual PHI, or a PHI with no uses. */
862 static void
863 eliminate_useless_phis (void)
865 basic_block bb;
866 gphi_iterator gsi;
867 tree result;
869 FOR_EACH_BB_FN (bb, cfun)
871 for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); )
873 gphi *phi = gsi.phi ();
874 result = gimple_phi_result (phi);
875 if (virtual_operand_p (result))
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++)
883 tree arg = PHI_ARG_DEF (phi, i);
884 if (TREE_CODE (arg) == SSA_NAME
885 && !virtual_operand_p (arg))
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");
894 #endif
895 remove_phi_node (&gsi, true);
897 else
899 /* Also remove real PHIs with no uses. */
900 if (has_zero_uses (result))
902 remove_gimple_phi_args (phi);
903 remove_phi_node (&gsi, true);
905 else
906 gsi_next (&gsi);
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. */
919 static void
920 rewrite_trees (var_map map ATTRIBUTE_UNUSED)
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)
929 gphi_iterator gsi;
930 for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
932 gphi *phi = gsi.phi ();
933 tree T0 = var_to_partition_to_var (map, gimple_phi_result (phi));
934 if (T0 == NULL_TREE)
936 size_t i;
937 for (i = 0; i < gimple_phi_num_args (phi); i++)
939 tree arg = PHI_ARG_DEF (phi, i);
941 if (TREE_CODE (arg) == SSA_NAME
942 && var_to_partition (map, arg) != NO_PARTITION)
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");
954 #endif
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. */
962 void
963 expand_phi_nodes (struct ssaexpand *sa)
965 basic_block bb;
966 elim_graph g = new_elim_graph (sa->map->num_partitions);
967 g->map = sa->map;
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)))
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)); )
989 if (e->insns.r && (e->flags & EDGE_EH)
990 && !single_pred_p (e->dest))
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;
998 else
999 ei_next (&ei);
1003 delete_elim_graph (g);
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. */
1011 static void
1012 remove_ssa_form (bool perform_ter, struct ssaexpand *sa)
1014 bitmap values = NULL;
1015 var_map map;
1016 unsigned i;
1018 map = coalesce_ssa_name ();
1020 /* Return to viewing the variable list as just all reference variables after
1021 coalescing has been performed. */
1022 partition_view_normal (map, false);
1024 if (dump_file && (dump_flags & TDF_DETAILS))
1026 fprintf (dump_file, "After Coalescing:\n");
1027 dump_var_map (dump_file, map);
1030 if (perform_ter)
1032 values = find_replaceable_exprs (map);
1033 if (values && dump_file && (dump_flags & TDF_DETAILS))
1034 dump_replaceable_exprs (dump_file, values);
1037 rewrite_trees (map);
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++)
1044 tree t = ssa_name (i);
1045 if (t && SSA_NAME_IS_DEFAULT_DEF (t))
1047 int p = var_to_partition (map, t);
1048 if (p != NO_PARTITION)
1049 bitmap_set_bit (sa->partition_has_default_def, p);
1055 /* If not already done so for basic block BB, assign increasing uids
1056 to each of its instructions. */
1058 static void
1059 maybe_renumber_stmts_bb (basic_block bb)
1061 unsigned i = 0;
1062 gimple_stmt_iterator gsi;
1064 if (!bb->aux)
1065 return;
1066 bb->aux = NULL;
1067 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1069 gimple stmt = gsi_stmt (gsi);
1070 gimple_set_uid (stmt, i);
1071 i++;
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. */
1080 static bool
1081 trivially_conflicts_p (basic_block bb, tree result, tree arg)
1083 use_operand_p use;
1084 imm_use_iterator imm_iter;
1085 gimple defa = SSA_NAME_DEF_STMT (arg);
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;
1092 FOR_EACH_IMM_USE_FAST (use, imm_iter, result)
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;
1114 return false;
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).
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. */
1127 static void
1128 insert_backedge_copies (void)
1130 basic_block bb;
1131 gphi_iterator gsi;
1133 mark_dfs_back_edges ();
1135 FOR_EACH_BB_FN (bb, cfun)
1137 /* Mark block as possibly needing calculation of UIDs. */
1138 bb->aux = &bb->aux;
1140 for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1142 gphi *phi = gsi.phi ();
1143 tree result = gimple_phi_result (phi);
1144 size_t i;
1146 if (virtual_operand_p (result))
1147 continue;
1149 for (i = 0; i < gimple_phi_num_args (phi); i++)
1151 tree arg = gimple_phi_arg_def (phi, i);
1152 edge e = gimple_phi_arg_edge (phi, i);
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)))
1163 tree name;
1164 gassign *stmt;
1165 gimple last = NULL;
1166 gimple_stmt_iterator gsi2;
1168 gsi2 = gsi_last_bb (gimple_phi_arg_edge (phi, i)->src);
1169 if (!gsi_end_p (gsi2))
1170 last = gsi_stmt (gsi2);
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))
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;
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));
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));
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);
1211 /* Unmark this block again. */
1212 bb->aux = NULL;
1216 /* Free all memory associated with going out of SSA form. SA is
1217 the outof-SSA info object. */
1219 void
1220 finish_out_of_ssa (struct ssaexpand *sa)
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);
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. */
1234 unsigned int
1235 rewrite_out_of_ssa (struct ssaexpand *sa)
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.
1241 A significant number of such cases can be handled here by inserting
1242 copies into the loop itself. */
1243 insert_backedge_copies ();
1246 /* Eliminate PHIs which are of no use, such as virtual or dead phis. */
1247 eliminate_useless_phis ();
1249 if (dump_file && (dump_flags & TDF_DETAILS))
1250 gimple_dump_cfg (dump_file, dump_flags & ~TDF_DETAILS);
1252 remove_ssa_form (flag_tree_ter, sa);
1254 if (dump_file && (dump_flags & TDF_DETAILS))
1255 gimple_dump_cfg (dump_file, dump_flags & ~TDF_DETAILS);
1257 return 0;