* gnu/regexp/CharIndexedReader.java: Removed.
[official-gcc.git] / gcc / tree-outof-ssa.c
blob97b0b4a3e82cdb5b38ca7108cb6a2499fbb54972
1 /* Convert a program in SSA form into Normal form.
2 Copyright (C) 2004 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 2, 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 COPYING. If not, write to
19 the Free Software Foundation, 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
22 #include "config.h"
23 #include "system.h"
24 #include "coretypes.h"
25 #include "tm.h"
26 #include "tree.h"
27 #include "flags.h"
28 #include "rtl.h"
29 #include "tm_p.h"
30 #include "ggc.h"
31 #include "langhooks.h"
32 #include "hard-reg-set.h"
33 #include "basic-block.h"
34 #include "output.h"
35 #include "errors.h"
36 #include "expr.h"
37 #include "function.h"
38 #include "diagnostic.h"
39 #include "bitmap.h"
40 #include "tree-flow.h"
41 #include "tree-gimple.h"
42 #include "tree-inline.h"
43 #include "varray.h"
44 #include "timevar.h"
45 #include "tree-alias-common.h"
46 #include "hashtab.h"
47 #include "tree-dump.h"
48 #include "tree-ssa-live.h"
49 #include "tree-pass.h"
51 /* Used to hold all the components required to do SSA PHI elimination.
52 The node and pred/succ list is a simple linear list of nodes and
53 edges represented as pairs of nodes.
55 The predecessor and successor list: Nodes are entered in pairs, where
56 [0] ->PRED, [1]->SUCC. All the even indexes in the array represent
57 predecessors, all the odd elements are successors.
59 Rationale:
60 When implemented as bitmaps, very large programs SSA->Normal times were
61 being dominated by clearing the interference graph.
63 Typically this list of edges is extremely small since it only includes
64 PHI results and uses from a single edge which have not coalesced with
65 each other. This means that no virtual PHI nodes are included, and
66 empirical evidence suggests that the number of edges rarely exceed
67 3, and in a bootstrap of GCC, the maximum size encountered was 7.
68 This also limits the number of possible nodes that are involved to
69 rarely more than 6, and in the bootstrap of gcc, the maximum number
70 of nodes encountered was 12. */
72 typedef struct _elim_graph {
73 /* Size of the elimination vectors. */
74 int size;
76 /* List of nodes in the elimination graph. */
77 varray_type nodes;
79 /* The predecessor and successor edge list. */
80 varray_type edge_list;
82 /* Visited vector. */
83 sbitmap visited;
85 /* Stack for visited nodes. */
86 varray_type stack;
88 /* The variable partition map. */
89 var_map map;
91 /* Edge being eliminated by this graph. */
92 edge e;
94 /* List of constant copies to emit. These are pushed on in pairs. */
95 varray_type const_copies;
96 } *elim_graph;
99 /* Local functions. */
100 static tree create_temp (tree);
101 static void insert_copy_on_edge (edge, tree, tree);
102 static elim_graph new_elim_graph (int);
103 static inline void delete_elim_graph (elim_graph);
104 static inline void clear_elim_graph (elim_graph);
105 static inline int elim_graph_size (elim_graph);
106 static inline void elim_graph_add_node (elim_graph, tree);
107 static inline void elim_graph_add_edge (elim_graph, int, int);
108 static inline int elim_graph_remove_succ_edge (elim_graph, int);
110 static inline void eliminate_name (elim_graph, tree);
111 static void eliminate_build (elim_graph, basic_block, int);
112 static void elim_forward (elim_graph, int);
113 static int elim_unvisited_predecessor (elim_graph, int);
114 static void elim_backward (elim_graph, int);
115 static void elim_create (elim_graph, int);
116 static void eliminate_phi (edge, int, elim_graph);
117 static tree_live_info_p coalesce_ssa_name (var_map, int);
118 static void assign_vars (var_map);
119 static bool replace_variable (var_map, tree *, tree *);
120 static void eliminate_virtual_phis (void);
121 static void coalesce_abnormal_edges (var_map, conflict_graph, root_var_p);
122 static void print_exprs (FILE *, const char *, tree, const char *, tree,
123 const char *);
124 static void print_exprs_edge (FILE *, edge, const char *, tree, const char *,
125 tree);
128 /* Create a temporary variable based on the type of variable T. Use T's name
129 as the prefix. */
131 static tree
132 create_temp (tree t)
134 tree tmp;
135 const char *name = NULL;
136 tree type;
138 if (TREE_CODE (t) == SSA_NAME)
139 t = SSA_NAME_VAR (t);
141 if (TREE_CODE (t) != VAR_DECL
142 && TREE_CODE (t) != PARM_DECL)
143 abort ();
145 type = TREE_TYPE (t);
146 tmp = DECL_NAME (t);
147 if (tmp)
148 name = IDENTIFIER_POINTER (tmp);
150 if (name == NULL)
151 name = "temp";
152 tmp = create_tmp_var (type, name);
153 DECL_ARTIFICIAL (tmp) = DECL_ARTIFICIAL (t);
154 add_referenced_tmp_var (tmp);
156 /* add_referenced_tmp_var will create the annotation and set up some
157 of the flags in the annotation. However, some flags we need to
158 inherit from our original variable. */
159 var_ann (tmp)->type_mem_tag = var_ann (t)->type_mem_tag;
160 if (is_call_clobbered (t))
161 mark_call_clobbered (tmp);
163 return tmp;
167 /* This helper function fill insert a copy from a constant or variable SRC to
168 variable DEST on edge E. */
170 static void
171 insert_copy_on_edge (edge e, tree dest, tree src)
173 tree copy;
175 copy = build (MODIFY_EXPR, TREE_TYPE (dest), dest, src);
176 set_is_used (dest);
178 if (TREE_CODE (src) == ADDR_EXPR)
179 src = TREE_OPERAND (src, 0);
180 if (TREE_CODE (src) == VAR_DECL || TREE_CODE (src) == PARM_DECL)
181 set_is_used (src);
183 if (dump_file && (dump_flags & TDF_DETAILS))
185 fprintf (dump_file,
186 "Inserting a copy on edge BB%d->BB%d :",
187 e->src->index,
188 e->dest->index);
189 print_generic_expr (dump_file, copy, dump_flags);
190 fprintf (dump_file, "\n");
193 bsi_insert_on_edge (e, copy);
197 /* Create an elimination graph with SIZE nodes and associated data
198 structures. */
200 static elim_graph
201 new_elim_graph (int size)
203 elim_graph g = (elim_graph) xmalloc (sizeof (struct _elim_graph));
205 VARRAY_TREE_INIT (g->nodes, 30, "Elimination Node List");
206 VARRAY_TREE_INIT (g->const_copies, 20, "Elimination Constant Copies");
207 VARRAY_INT_INIT (g->edge_list, 20, "Elimination Edge List");
208 VARRAY_INT_INIT (g->stack, 30, " Elimination Stack");
210 g->visited = sbitmap_alloc (size);
212 return g;
216 /* Empty elimination graph G. */
218 static inline void
219 clear_elim_graph (elim_graph g)
221 VARRAY_POP_ALL (g->nodes);
222 VARRAY_POP_ALL (g->edge_list);
226 /* Delete elimination graph G. */
228 static inline void
229 delete_elim_graph (elim_graph g)
231 sbitmap_free (g->visited);
232 free (g);
236 /* Return the number of nodes in graph G. */
238 static inline int
239 elim_graph_size (elim_graph g)
241 return VARRAY_ACTIVE_SIZE (g->nodes);
245 /* Add NODE to graph G, if it doesn't exist already. */
247 static inline void
248 elim_graph_add_node (elim_graph g, tree node)
250 int x;
251 for (x = 0; x < elim_graph_size (g); x++)
252 if (VARRAY_TREE (g->nodes, x) == node)
253 return;
254 VARRAY_PUSH_TREE (g->nodes, node);
258 /* Add the edge PRED->SUCC to graph G. */
260 static inline void
261 elim_graph_add_edge (elim_graph g, int pred, int succ)
263 VARRAY_PUSH_INT (g->edge_list, pred);
264 VARRAY_PUSH_INT (g->edge_list, succ);
268 /* Remove an edge from graph G for which NODE is the predecessor, and
269 return the successor node. -1 is returned if there is no such edge. */
271 static inline int
272 elim_graph_remove_succ_edge (elim_graph g, int node)
274 int y;
275 unsigned x;
276 for (x = 0; x < VARRAY_ACTIVE_SIZE (g->edge_list); x += 2)
277 if (VARRAY_INT (g->edge_list, x) == node)
279 VARRAY_INT (g->edge_list, x) = -1;
280 y = VARRAY_INT (g->edge_list, x + 1);
281 VARRAY_INT (g->edge_list, x + 1) = -1;
282 return y;
284 return -1;
288 /* Find all the nodes in GRAPH which are successors to NODE in the
289 edge list. VAR will hold the partition number found. CODE is the
290 code fragment executed for every node found. */
292 #define FOR_EACH_ELIM_GRAPH_SUCC(GRAPH, NODE, VAR, CODE) \
293 do { \
294 unsigned x_; \
295 int y_; \
296 for (x_ = 0; x_ < VARRAY_ACTIVE_SIZE ((GRAPH)->edge_list); x_ += 2) \
298 y_ = VARRAY_INT ((GRAPH)->edge_list, x_); \
299 if (y_ != (NODE)) \
300 continue; \
301 (VAR) = VARRAY_INT ((GRAPH)->edge_list, x_ + 1); \
302 CODE; \
304 } while (0)
307 /* Find all the nodes which are predecessors of NODE in the edge list for
308 GRAPH. VAR will hold the partition number found. CODE is the
309 code fragment executed for every node found. */
311 #define FOR_EACH_ELIM_GRAPH_PRED(GRAPH, NODE, VAR, CODE) \
312 do { \
313 unsigned x_; \
314 int y_; \
315 for (x_ = 0; x_ < VARRAY_ACTIVE_SIZE ((GRAPH)->edge_list); x_ += 2) \
317 y_ = VARRAY_INT ((GRAPH)->edge_list, x_ + 1); \
318 if (y_ != (NODE)) \
319 continue; \
320 (VAR) = VARRAY_INT ((GRAPH)->edge_list, x_); \
321 CODE; \
323 } while (0)
326 /* Add T to elimination graph G. */
328 static inline void
329 eliminate_name (elim_graph g, tree T)
331 elim_graph_add_node (g, T);
335 /* Build elimination graph G for basic block BB on incoming PHI edge I. */
337 static void
338 eliminate_build (elim_graph g, basic_block B, int i)
340 tree phi;
341 tree T0, Ti;
342 int p0, pi;
344 clear_elim_graph (g);
346 for (phi = phi_nodes (B); phi; phi = TREE_CHAIN (phi))
348 T0 = var_to_partition_to_var (g->map, PHI_RESULT (phi));
350 /* Ignore results which are not in partitions. */
351 if (T0 == NULL_TREE)
352 continue;
354 if (PHI_ARG_EDGE (phi, i) == g->e)
355 Ti = PHI_ARG_DEF (phi, i);
356 else
358 /* On rare occasions, a PHI node may not have the arguments
359 in the same order as all of the other PHI nodes. If they don't
360 match, find the appropriate index here. */
361 pi = phi_arg_from_edge (phi, g->e);
362 if (pi == -1)
363 abort();
364 Ti = PHI_ARG_DEF (phi, pi);
367 /* If this argument is a constant, or a SSA_NAME which is being
368 left in SSA form, just queue a copy to be emitted on this
369 edge. */
370 if (!phi_ssa_name_p (Ti)
371 || (TREE_CODE (Ti) == SSA_NAME
372 && var_to_partition (g->map, Ti) == NO_PARTITION))
374 /* Save constant copies until all other copies have been emitted
375 on this edge. */
376 VARRAY_PUSH_TREE (g->const_copies, T0);
377 VARRAY_PUSH_TREE (g->const_copies, Ti);
379 else
381 Ti = var_to_partition_to_var (g->map, Ti);
382 if (T0 != Ti)
384 eliminate_name (g, T0);
385 eliminate_name (g, Ti);
386 p0 = var_to_partition (g->map, T0);
387 pi = var_to_partition (g->map, Ti);
388 elim_graph_add_edge (g, p0, pi);
395 /* Push successors of T onto the elimination stack for G. */
397 static void
398 elim_forward (elim_graph g, int T)
400 int S;
401 SET_BIT (g->visited, T);
402 FOR_EACH_ELIM_GRAPH_SUCC (g, T, S,
404 if (!TEST_BIT (g->visited, S))
405 elim_forward (g, S);
407 VARRAY_PUSH_INT (g->stack, T);
411 /* Return 1 if there unvisited predecessors of T in graph G. */
413 static int
414 elim_unvisited_predecessor (elim_graph g, int T)
416 int P;
417 FOR_EACH_ELIM_GRAPH_PRED (g, T, P,
419 if (!TEST_BIT (g->visited, P))
420 return 1;
422 return 0;
425 /* Process predecessors first, and insert a copy. */
427 static void
428 elim_backward (elim_graph g, int T)
430 int P;
431 SET_BIT (g->visited, T);
432 FOR_EACH_ELIM_GRAPH_PRED (g, T, P,
434 if (!TEST_BIT (g->visited, P))
436 elim_backward (g, P);
437 insert_copy_on_edge (g->e,
438 partition_to_var (g->map, P),
439 partition_to_var (g->map, T));
444 /* Insert required copies for T in graph G. Check for a strongly connected
445 region, and create a temporary to break the cycle if one is found. */
447 static void
448 elim_create (elim_graph g, int T)
450 tree U;
451 int P, S;
453 if (elim_unvisited_predecessor (g, T))
455 U = create_temp (partition_to_var (g->map, T));
456 insert_copy_on_edge (g->e, U, partition_to_var (g->map, T));
457 FOR_EACH_ELIM_GRAPH_PRED (g, T, P,
459 if (!TEST_BIT (g->visited, P))
461 elim_backward (g, P);
462 insert_copy_on_edge (g->e, partition_to_var (g->map, P), U);
466 else
468 S = elim_graph_remove_succ_edge (g, T);
469 if (S != -1)
471 SET_BIT (g->visited, T);
472 insert_copy_on_edge (g->e,
473 partition_to_var (g->map, T),
474 partition_to_var (g->map, S));
480 /* Eliminate all the phi nodes on edge E in graph G. I is the usual PHI
481 index that edge E's values are found on. */
483 static void
484 eliminate_phi (edge e, int i, elim_graph g)
486 int num_nodes = 0;
487 int x;
488 basic_block B = e->dest;
490 #if defined ENABLE_CHECKING
491 if (i == -1)
492 abort ();
493 if (VARRAY_ACTIVE_SIZE (g->const_copies) != 0)
494 abort ();
495 #endif
497 /* Abnormal edges already have everything coalesced, or the coalescer
498 would have aborted. */
499 if (e->flags & EDGE_ABNORMAL)
500 return;
502 num_nodes = num_var_partitions (g->map);
503 g->e = e;
505 eliminate_build (g, B, i);
507 if (elim_graph_size (g) != 0)
509 sbitmap_zero (g->visited);
510 VARRAY_POP_ALL (g->stack);
512 for (x = 0; x < elim_graph_size (g); x++)
514 tree var = VARRAY_TREE (g->nodes, x);
515 int p = var_to_partition (g->map, var);
516 if (!TEST_BIT (g->visited, p))
517 elim_forward (g, p);
520 sbitmap_zero (g->visited);
521 while (VARRAY_ACTIVE_SIZE (g->stack) > 0)
523 x = VARRAY_TOP_INT (g->stack);
524 VARRAY_POP (g->stack);
525 if (!TEST_BIT (g->visited, x))
526 elim_create (g, x);
530 /* If there are any pending constant copies, issue them now. */
531 while (VARRAY_ACTIVE_SIZE (g->const_copies) > 0)
533 tree src, dest;
534 src = VARRAY_TOP_TREE (g->const_copies);
535 VARRAY_POP (g->const_copies);
536 dest = VARRAY_TOP_TREE (g->const_copies);
537 VARRAY_POP (g->const_copies);
538 insert_copy_on_edge (e, dest, src);
543 /* Shortcut routine to print messages to file F of the form:
544 "STR1 EXPR1 STR2 EXPR2 STR3." */
546 static void
547 print_exprs (FILE *f, const char *str1, tree expr1, const char *str2,
548 tree expr2, const char *str3)
550 fprintf (f, "%s", str1);
551 print_generic_expr (f, expr1, TDF_SLIM);
552 fprintf (f, "%s", str2);
553 print_generic_expr (f, expr2, TDF_SLIM);
554 fprintf (f, "%s", str3);
558 /* Shortcut routine to print abnormal edge messages to file F of the form:
559 "STR1 EXPR1 STR2 EXPR2 across edge E. */
561 static void
562 print_exprs_edge (FILE *f, edge e, const char *str1, tree expr1,
563 const char *str2, tree expr2)
565 print_exprs (f, str1, expr1, str2, expr2, " across an abnormal edge");
566 fprintf (f, " from BB%d->BB%d\n", e->src->index,
567 e->dest->index);
571 /* Coalesce partitions in MAP which are live across abnormal edges in GRAPH.
572 RV is the root variable groupings of the partitions in MAP. Since code
573 cannot be inserted on these edges, failure to coalesce something across
574 an abnormal edge is an error. */
576 static void
577 coalesce_abnormal_edges (var_map map, conflict_graph graph, root_var_p rv)
579 basic_block bb;
580 edge e;
581 tree phi, var, tmp;
582 int x, y;
584 /* Code cannot be inserted on abnormal edges. Look for all abnormal
585 edges, and coalesce any PHI results with their arguments across
586 that edge. */
588 FOR_EACH_BB (bb)
589 for (e = bb->succ; e; e = e->succ_next)
590 if (e->dest != EXIT_BLOCK_PTR && e->flags & EDGE_ABNORMAL)
591 for (phi = phi_nodes (e->dest); phi; phi = TREE_CHAIN (phi))
593 /* Visit each PHI on the destination side of this abnormal
594 edge, and attempt to coalesce the argument with the result. */
595 var = PHI_RESULT (phi);
596 x = var_to_partition (map, var);
598 /* Ignore results which are not relevant. */
599 if (x == NO_PARTITION)
600 continue;
602 y = phi_arg_from_edge (phi, e);
603 if (y == -1)
604 abort ();
606 tmp = PHI_ARG_DEF (phi, y);
607 if (!phi_ssa_name_p (tmp))
609 print_exprs_edge (stderr, e,
610 "\nConstant argument in PHI. Can't insert :",
611 var, " = ", tmp);
612 abort ();
614 y = var_to_partition (map, tmp);
615 if (x == NO_PARTITION || y == NO_PARTITION)
616 abort ();
617 if (root_var_find (rv, x) != root_var_find (rv, y))
619 print_exprs_edge (stderr, e, "\nDifferent root vars: ",
620 root_var (rv, root_var_find (rv, x)),
621 " and ",
622 root_var (rv, root_var_find (rv, y)));
623 abort ();
626 if (x != y)
628 if (!conflict_graph_conflict_p (graph, x, y))
630 /* Now map the partitions back to their real variables. */
631 var = partition_to_var (map, x);
632 tmp = partition_to_var (map, y);
633 if (dump_file
634 && (dump_flags & TDF_DETAILS))
636 print_exprs_edge (dump_file, e,
637 "ABNORMAL: Coalescing ",
638 var, " and ", tmp);
640 if (var_union (map, var, tmp) == NO_PARTITION)
642 print_exprs_edge (stderr, e, "\nUnable to coalesce",
643 partition_to_var (map, x), " and ",
644 partition_to_var (map, y));
645 abort ();
647 conflict_graph_merge_regs (graph, x, y);
649 else
651 print_exprs_edge (stderr, e, "\n Conflict ",
652 partition_to_var (map, x),
653 " and ", partition_to_var (map, y));
654 abort ();
661 /* Reduce the number of live ranges in MAP. Live range information is
662 returned if FLAGS indicates that we are combining temporaries, otherwise
663 NULL is returned. The only partitions which are associated with actual
664 variables at this point are those which are forced to be coalesced for
665 various reason. (live on entry, live across abnormal edges, etc.). */
667 static tree_live_info_p
668 coalesce_ssa_name (var_map map, int flags)
670 int num, x, i;
671 sbitmap live;
672 tree var, phi;
673 root_var_p rv;
674 tree_live_info_p liveinfo;
675 var_ann_t ann;
676 conflict_graph graph;
677 basic_block bb;
678 coalesce_list_p cl = NULL;
680 if (num_var_partitions (map) <= 1)
681 return NULL;
683 /* If no preference given, use cheap coalescing of all partitions. */
684 if ((flags & (SSANORM_COALESCE_PARTITIONS | SSANORM_USE_COALESCE_LIST)) == 0)
685 flags |= SSANORM_COALESCE_PARTITIONS;
687 liveinfo = calculate_live_on_entry (map);
688 calculate_live_on_exit (liveinfo);
689 rv = root_var_init (map);
691 /* Remove single element variable from the list. */
692 root_var_compact (rv);
694 if (flags & SSANORM_USE_COALESCE_LIST)
696 cl = create_coalesce_list (map);
698 /* Add all potential copies via PHI arguments to the list. */
699 FOR_EACH_BB (bb)
701 for (phi = phi_nodes (bb); phi; phi = TREE_CHAIN (phi))
703 tree res = PHI_RESULT (phi);
704 int p = var_to_partition (map, res);
705 if (p == NO_PARTITION)
706 continue;
707 for (x = 0; x < PHI_NUM_ARGS (phi); x++)
709 tree arg = PHI_ARG_DEF (phi, x);
710 int p2;
712 if (TREE_CODE (arg) != SSA_NAME)
713 continue;
714 if (SSA_NAME_VAR (res) != SSA_NAME_VAR (arg))
715 continue;
716 p2 = var_to_partition (map, PHI_ARG_DEF (phi, x));
717 if (p2 != NO_PARTITION)
718 add_coalesce (cl, p, p2, 1);
723 /* Coalesce all the result decls together. */
724 var = NULL_TREE;
725 i = 0;
726 for (x = 0; x < num_var_partitions (map); x++)
728 tree p = partition_to_var (map, x);
729 if (TREE_CODE (SSA_NAME_VAR(p)) == RESULT_DECL)
731 if (var == NULL_TREE)
733 var = p;
734 i = x;
736 else
737 add_coalesce (cl, i, x, 1);
742 /* Build a conflict graph. */
743 graph = build_tree_conflict_graph (liveinfo, rv, cl);
745 if (cl)
747 if (dump_file && (dump_flags & TDF_DETAILS))
749 fprintf (dump_file, "Before sorting:\n");
750 dump_coalesce_list (dump_file, cl);
753 sort_coalesce_list (cl);
755 if (dump_file && (dump_flags & TDF_DETAILS))
757 fprintf (dump_file, "\nAfter sorting:\n");
758 dump_coalesce_list (dump_file, cl);
762 /* Put the single element variables back in. */
763 root_var_decompact (rv);
765 /* First, coalesce all live on entry variables to their root variable.
766 This will ensure the first use is coming from the correct location. */
768 live = sbitmap_alloc (num_var_partitions (map));
769 sbitmap_zero (live);
771 /* Set 'live' vector to indicate live on entry partitions. */
772 num = num_var_partitions (map);
773 for (x = 0 ; x < num; x++)
775 var = partition_to_var (map, x);
776 if (default_def (SSA_NAME_VAR (var)) == var)
777 SET_BIT (live, x);
780 if ((flags & SSANORM_COMBINE_TEMPS) == 0)
782 delete_tree_live_info (liveinfo);
783 liveinfo = NULL;
786 /* Assign root variable as partition representative for each live on entry
787 partition. */
788 EXECUTE_IF_SET_IN_SBITMAP (live, 0, x,
790 var = root_var (rv, root_var_find (rv, x));
791 ann = var_ann (var);
792 /* If these aren't already coalesced... */
793 if (partition_to_var (map, x) != var)
795 if (ann->out_of_ssa_tag)
797 /* This root variable has already been assigned to another
798 partition which is not coalesced with this one. */
799 abort ();
802 if (dump_file && (dump_flags & TDF_DETAILS))
804 print_exprs (dump_file, "Must coalesce ",
805 partition_to_var (map, x),
806 " with the root variable ", var, ".\n");
809 change_partition_var (map, var, x);
813 sbitmap_free (live);
815 /* Coalesce partitions live across abnormal edges. */
816 coalesce_abnormal_edges (map, graph, rv);
818 if (dump_file && (dump_flags & TDF_DETAILS))
819 dump_var_map (dump_file, map);
821 /* Coalesce partitions. */
822 if (flags & SSANORM_USE_COALESCE_LIST)
823 coalesce_tpa_members (rv, graph, map, cl,
824 ((dump_flags & TDF_DETAILS) ? dump_file
825 : NULL));
828 if (flags & SSANORM_COALESCE_PARTITIONS)
829 coalesce_tpa_members (rv, graph, map, NULL,
830 ((dump_flags & TDF_DETAILS) ? dump_file
831 : NULL));
832 if (cl)
833 delete_coalesce_list (cl);
834 root_var_delete (rv);
835 conflict_graph_delete (graph);
837 return liveinfo;
841 /* Take the ssa-name var_map MAP, and assign real variables to each
842 partition. */
844 static void
845 assign_vars (var_map map)
847 int x, i, num, rep;
848 tree t, var;
849 var_ann_t ann;
850 root_var_p rv;
852 rv = root_var_init (map);
853 if (!rv)
854 return;
856 /* Coalescing may already have forced some partitions to their root
857 variable. Find these and tag them. */
859 num = num_var_partitions (map);
860 for (x = 0; x < num; x++)
862 var = partition_to_var (map, x);
863 if (TREE_CODE (var) != SSA_NAME)
865 /* Coalescing will already have verified that more than one
866 partition doesn't have the same root variable. Simply marked
867 the variable as assigned. */
868 ann = var_ann (var);
869 ann->out_of_ssa_tag = 1;
870 if (dump_file && (dump_flags & TDF_DETAILS))
872 fprintf (dump_file, "partition %d has variable ", x);
873 print_generic_expr (dump_file, var, TDF_SLIM);
874 fprintf (dump_file, " assigned to it.\n");
880 num = root_var_num (rv);
881 for (x = 0; x < num; x++)
883 var = root_var (rv, x);
884 ann = var_ann (var);
885 for (i = root_var_first_partition (rv, x);
886 i != ROOT_VAR_NONE;
887 i = root_var_next_partition (rv, i))
889 t = partition_to_var (map, i);
891 if (t == var || TREE_CODE (t) != SSA_NAME)
892 continue;
894 rep = var_to_partition (map, t);
896 if (!ann->out_of_ssa_tag)
898 if (dump_file && (dump_flags & TDF_DETAILS))
899 print_exprs (dump_file, "", t, " --> ", var, "\n");
900 change_partition_var (map, var, rep);
901 continue;
904 if (dump_file && (dump_flags & TDF_DETAILS))
905 print_exprs (dump_file, "", t, " not coalesced with ", var,
906 "");
908 var = create_temp (t);
909 change_partition_var (map, var, rep);
910 ann = var_ann (var);
912 if (dump_file && (dump_flags & TDF_DETAILS))
914 fprintf (dump_file, " --> New temp: '");
915 print_generic_expr (dump_file, var, TDF_SLIM);
916 fprintf (dump_file, "'\n");
921 root_var_delete (rv);
925 /* Replace *P with whatever variable it has been rewritten to based on the
926 partitions in MAP. EXPR is an optional expression vector over SSA versions
927 which is used to replace *P with an expression instead of a variable.
928 If the stmt is changed, return true. */
930 static inline bool
931 replace_variable (var_map map, tree *p, tree *expr)
933 tree new_var;
934 tree var = *p;
936 /* Check if we are replacing this variable with an expression. */
937 if (expr)
939 int version = SSA_NAME_VERSION (*p);
940 if (expr[version])
942 tree new_expr = TREE_OPERAND (expr[version], 1);
943 *p = new_expr;
944 /* Clear the stmt's RHS, or GC might bite us. */
945 TREE_OPERAND (expr[version], 1) = NULL_TREE;
946 return true;
950 new_var = var_to_partition_to_var (map, var);
951 if (new_var)
953 *p = new_var;
954 set_is_used (new_var);
955 return true;
957 return false;
961 /* Remove any PHI node which is a virtual PHI. */
963 static void
964 eliminate_virtual_phis (void)
966 basic_block bb;
967 tree phi, next;
969 FOR_EACH_BB (bb)
971 for (phi = phi_nodes (bb); phi; phi = next)
973 next = TREE_CHAIN (phi);
974 if (!is_gimple_reg (SSA_NAME_VAR (PHI_RESULT (phi))))
976 #ifdef ENABLE_CHECKING
977 int i;
978 /* There should be no arguments of this PHI which are in
979 the partition list, or we get incorrect results. */
980 for (i = 0; i < PHI_NUM_ARGS (phi); i++)
982 tree arg = PHI_ARG_DEF (phi, i);
983 if (TREE_CODE (arg) == SSA_NAME
984 && is_gimple_reg (SSA_NAME_VAR (arg)))
986 fprintf (stderr, "Argument of PHI is not virtual (");
987 print_generic_expr (stderr, arg, TDF_SLIM);
988 fprintf (stderr, "), but the result is :");
989 print_generic_stmt (stderr, phi, TDF_SLIM);
990 abort();
993 #endif
994 remove_phi_node (phi, NULL_TREE, bb);
1001 /* This routine will coalesce variables in MAP of the same type which do not
1002 interfere with each other. LIVEINFO is the live range info for variables
1003 of interest. This will both reduce the memory footprint of the stack, and
1004 allow us to coalesce together local copies of globals and scalarized
1005 component refs. */
1007 static void
1008 coalesce_vars (var_map map, tree_live_info_p liveinfo)
1010 basic_block bb;
1011 type_var_p tv;
1012 tree var;
1013 int x, p, p2;
1014 coalesce_list_p cl;
1015 conflict_graph graph;
1017 cl = create_coalesce_list (map);
1019 /* Merge all the live on entry vectors for coalesced partitions. */
1020 for (x = 0; x < num_var_partitions (map); x++)
1022 var = partition_to_var (map, x);
1023 p = var_to_partition (map, var);
1024 if (p != x)
1025 live_merge_and_clear (liveinfo, p, x);
1028 /* When PHI nodes are turned into copies, the result of each PHI node
1029 becomes live on entry to the block. Mark these now. */
1030 FOR_EACH_BB (bb)
1032 tree phi, arg;
1033 int p;
1034 for (phi = phi_nodes (bb); phi; phi = TREE_CHAIN (phi))
1036 p = var_to_partition (map, PHI_RESULT (phi));
1038 /* Skip virtual PHI nodes. */
1039 if (p == NO_PARTITION)
1040 continue;
1042 make_live_on_entry (liveinfo, bb, p);
1044 /* Each argument is a potential copy operation. Add any arguments
1045 which are not coalesced to the result to the coalesce list. */
1046 for (x = 0; x < PHI_NUM_ARGS (phi); x++)
1048 arg = PHI_ARG_DEF (phi, x);
1049 if (!phi_ssa_name_p (arg))
1050 continue;
1051 p2 = var_to_partition (map, arg);
1052 if (p2 == NO_PARTITION)
1053 continue;
1054 if (p != p2)
1055 add_coalesce (cl, p, p2, 1);
1061 /* Re-calculate live on exit info. */
1062 calculate_live_on_exit (liveinfo);
1064 if (dump_file && (dump_flags & TDF_DETAILS))
1066 fprintf (dump_file, "Live range info for variable memory coalescing.\n");
1067 dump_live_info (dump_file, liveinfo, LIVEDUMP_ALL);
1069 fprintf (dump_file, "Coalesce list from phi nodes:\n");
1070 dump_coalesce_list (dump_file, cl);
1074 tv = type_var_init (map);
1075 if (dump_file)
1076 type_var_dump (dump_file, tv);
1077 type_var_compact (tv);
1078 if (dump_file)
1079 type_var_dump (dump_file, tv);
1081 graph = build_tree_conflict_graph (liveinfo, tv, cl);
1083 type_var_decompact (tv);
1084 if (dump_file && (dump_flags & TDF_DETAILS))
1086 fprintf (dump_file, "type var list now looks like:n");
1087 type_var_dump (dump_file, tv);
1089 fprintf (dump_file, "Coalesce list after conflict graph build:\n");
1090 dump_coalesce_list (dump_file, cl);
1093 sort_coalesce_list (cl);
1094 if (dump_file && (dump_flags & TDF_DETAILS))
1096 fprintf (dump_file, "Coalesce list after sorting:\n");
1097 dump_coalesce_list (dump_file, cl);
1100 coalesce_tpa_members (tv, graph, map, cl,
1101 ((dump_flags & TDF_DETAILS) ? dump_file : NULL));
1103 type_var_delete (tv);
1104 delete_coalesce_list (cl);
1108 /* Temporary Expression Replacement (TER)
1110 Replace SSA version variables during out-of-ssa with their defining
1111 expression if there is only one use of the variable.
1113 A pass is made through the function, one block at a time. No cross block
1114 information is tracked.
1116 Variables which only have one use, and whose defining stmt is considered
1117 a replaceable expression (see check_replaceable) are entered into
1118 consideration by adding a list of dependent partitions to the version_info
1119 vector for that ssa_name_version. This information comes from the partition
1120 mapping for each USE. At the same time, the partition_dep_list vector for
1121 these partitions have this version number entered into their lists.
1123 When the use of a replaceable ssa_variable is encountered, the dependence
1124 list in version_info[] is moved to the "pending_dependence" list in case
1125 the current expression is also replaceable. (To be determined later in
1126 processing this stmt.) version_info[] for the version is then updated to
1127 point to the defining stmt and the 'replaceable' bit is set.
1129 Any partition which is defined by a statement 'kills' any expression which
1130 is dependent on this partition. Every ssa version in the partitions'
1131 dependence list is removed from future consideration.
1133 All virtual references are lumped together. Any expression which is
1134 dependent on any virtual variable (via a VUSE) has a dependence added
1135 to the special partition defined by VIRTUAL_PARTITION.
1137 Whenever a VDEF is seen, all expressions dependent this VIRTUAL_PARTITION
1138 are removed from consideration.
1140 At the end of a basic block, all expression are removed from consideration
1141 in preparation for the next block.
1143 The end result is a vector over SSA_NAME_VERSION which is passed back to
1144 rewrite_out_of_ssa. As the SSA variables are being rewritten, instead of
1145 replacing the SSA_NAME tree element with the partition it was assigned,
1146 it is replaced with the RHS of the defining expression. */
1149 /* Dependancy list element. This can contain either a partition index or a
1150 version number, depending on which list it is in. */
1152 typedef struct value_expr_d
1154 int value;
1155 struct value_expr_d *next;
1156 } *value_expr_p;
1159 /* Temporary Expression Replacement (TER) table information. */
1161 typedef struct temp_expr_table_d
1163 var_map map;
1164 void **version_info;
1165 value_expr_p *partition_dep_list;
1166 bitmap replaceable;
1167 bool saw_replaceable;
1168 int virtual_partition;
1169 bitmap partition_in_use;
1170 value_expr_p free_list;
1171 value_expr_p pending_dependence;
1172 } *temp_expr_table_p;
1174 /* Used to indicate a dependancy on VDEFs. */
1175 #define VIRTUAL_PARTITION(table) (table->virtual_partition)
1177 static temp_expr_table_p new_temp_expr_table (var_map);
1178 static tree *free_temp_expr_table (temp_expr_table_p);
1179 static inline value_expr_p new_value_expr (temp_expr_table_p);
1180 static inline void free_value_expr (temp_expr_table_p, value_expr_p);
1181 static inline value_expr_p find_value_in_list (value_expr_p, int,
1182 value_expr_p *);
1183 static inline void add_value_to_list (temp_expr_table_p, value_expr_p *, int);
1184 static inline void add_info_to_list (temp_expr_table_p, value_expr_p *,
1185 value_expr_p);
1186 static value_expr_p remove_value_from_list (value_expr_p *, int);
1187 static void add_dependance (temp_expr_table_p, int, tree);
1188 static bool check_replaceable (temp_expr_table_p, tree);
1189 static void finish_expr (temp_expr_table_p, int, bool);
1190 static void mark_replaceable (temp_expr_table_p, tree);
1191 static inline void kill_expr (temp_expr_table_p, int, bool);
1192 static inline void kill_virtual_exprs (temp_expr_table_p, bool);
1193 static void find_replaceable_in_bb (temp_expr_table_p, basic_block);
1194 static tree *find_replaceable_exprs (var_map);
1195 static void dump_replaceable_exprs (FILE *, tree *);
1198 /* Create a new TER table for MAP. */
1200 static temp_expr_table_p
1201 new_temp_expr_table (var_map map)
1203 temp_expr_table_p t;
1205 t = (temp_expr_table_p) xmalloc (sizeof (struct temp_expr_table_d));
1206 t->map = map;
1208 t->version_info = xcalloc (highest_ssa_version + 1, sizeof (void *));
1209 t->partition_dep_list = xcalloc (num_var_partitions (map) + 1,
1210 sizeof (value_expr_p));
1212 t->replaceable = BITMAP_XMALLOC ();
1213 t->partition_in_use = BITMAP_XMALLOC ();
1215 t->saw_replaceable = false;
1216 t->virtual_partition = num_var_partitions (map);
1217 t->free_list = NULL;
1218 t->pending_dependence = NULL;
1220 return t;
1224 /* Free TER table T. If there are valid replacements, return the expression
1225 vector. */
1227 static tree *
1228 free_temp_expr_table (temp_expr_table_p t)
1230 value_expr_p p;
1231 tree *ret = NULL;
1233 #ifdef ENABLE_CHECKING
1234 int x;
1235 for (x = 0; x <= num_var_partitions (t->map); x++)
1236 if (t->partition_dep_list[x] != NULL)
1237 abort();
1238 #endif
1240 while ((p = t->free_list))
1242 t->free_list = p->next;
1243 free (p);
1246 BITMAP_XFREE (t->partition_in_use);
1247 BITMAP_XFREE (t->replaceable);
1249 free (t->partition_dep_list);
1250 if (t->saw_replaceable)
1251 ret = (tree *)t->version_info;
1252 else
1253 free (t->version_info);
1255 free (t);
1256 return ret;
1260 /* Allocate a new value list node. Take it from the free list in TABLE if
1261 possible. */
1263 static inline value_expr_p
1264 new_value_expr (temp_expr_table_p table)
1266 value_expr_p p;
1267 if (table->free_list)
1269 p = table->free_list;
1270 table->free_list = p->next;
1272 else
1273 p = (value_expr_p) xmalloc (sizeof (struct value_expr_d));
1275 return p;
1279 /* Add value list node P to the free list in TABLE. */
1281 static inline void
1282 free_value_expr (temp_expr_table_p table, value_expr_p p)
1284 p->next = table->free_list;
1285 table->free_list = p;
1289 /* Find VALUE if its in LIST. Return a pointer to the list object if found,
1290 else return NULL. If LAST_PTR is provided, it will point to the previous
1291 item upon return, or NULL if this is the first item in the list. */
1293 static inline value_expr_p
1294 find_value_in_list (value_expr_p list, int value, value_expr_p *last_ptr)
1296 value_expr_p curr;
1297 value_expr_p last = NULL;
1299 for (curr = list; curr; last = curr, curr = curr->next)
1301 if (curr->value == value)
1302 break;
1304 if (last_ptr)
1305 *last_ptr = last;
1306 return curr;
1310 /* Add VALUE to LIST, if it isn't already present. TAB is the expression
1311 table */
1313 static inline void
1314 add_value_to_list (temp_expr_table_p tab, value_expr_p *list, int value)
1316 value_expr_p info;
1318 if (!find_value_in_list (*list, value, NULL))
1320 info = new_value_expr (tab);
1321 info->value = value;
1322 info->next = *list;
1323 *list = info;
1328 /* Add value node INFO if it's value isn't already in LIST. Free INFO if
1329 it is already in the list. TAB is the expression table. */
1331 static inline void
1332 add_info_to_list (temp_expr_table_p tab, value_expr_p *list, value_expr_p info)
1334 if (find_value_in_list (*list, info->value, NULL))
1335 free_value_expr (tab, info);
1336 else
1338 info->next = *list;
1339 *list = info;
1344 /* Look for VALUE in LIST. If found, remove it from the list and return it's
1345 pointer. */
1347 static value_expr_p
1348 remove_value_from_list (value_expr_p *list, int value)
1350 value_expr_p info, last;
1352 info = find_value_in_list (*list, value, &last);
1353 if (!info)
1354 return NULL;
1355 if (!last)
1356 *list = info->next;
1357 else
1358 last->next = info->next;
1360 return info;
1364 /* Add a dependancy between the def of ssa VERSION and VAR. if VAR is
1365 replaceable by an expression, add a dependance each of the elements of the
1366 expression. These are contained in the pending list. TAB is the
1367 expression table. */
1369 static void
1370 add_dependance (temp_expr_table_p tab, int version, tree var)
1372 int i, x;
1373 value_expr_p info;
1375 i = SSA_NAME_VERSION (var);
1376 if (bitmap_bit_p (tab->replaceable, i))
1378 /* This variable is being substituted, so use whatever dependences
1379 were queued up when we marked this as replaceable earlier. */
1380 while ((info = tab->pending_dependence))
1382 tab->pending_dependence = info->next;
1383 /* Get the partition this variable was dependent on. Reuse this
1384 object to represent the current expression instead. */
1385 x = info->value;
1386 info->value = version;
1387 add_info_to_list (tab, &(tab->partition_dep_list[x]), info);
1388 add_value_to_list (tab,
1389 (value_expr_p *)&(tab->version_info[version]), x);
1390 bitmap_set_bit (tab->partition_in_use, x);
1393 else
1395 i = var_to_partition (tab->map, var);
1396 #ifdef ENABLE_CHECKING
1397 if (i== NO_PARTITION)
1398 abort ();
1399 #endif
1400 add_value_to_list (tab, &(tab->partition_dep_list[i]), version);
1401 add_value_to_list (tab,
1402 (value_expr_p *)&(tab->version_info[version]), i);
1403 bitmap_set_bit (tab->partition_in_use, i);
1408 /* Check if expression STMT is suitable for replacement in table TAB. If so,
1409 create an expression entry. Return true if this stmt is replaceable. */
1411 static bool
1412 check_replaceable (temp_expr_table_p tab, tree stmt)
1414 stmt_ann_t ann;
1415 vuse_optype vuseops;
1416 def_optype defs;
1417 use_optype uses;
1418 tree var, def;
1419 int num_use_ops, version, i;
1420 var_map map = tab->map;
1422 if (TREE_CODE (stmt) != MODIFY_EXPR)
1423 return false;
1425 ann = stmt_ann (stmt);
1426 defs = DEF_OPS (ann);
1428 /* Punt if there is more than 1 def, or more than 1 use. */
1429 if (NUM_DEFS (defs) != 1)
1430 return false;
1431 def = DEF_OP (defs, 0);
1432 if (version_ref_count (map, def) != 1)
1433 return false;
1435 /* Assignments to variables assigned to hard registers are not
1436 replaceable. */
1437 if (DECL_HARD_REGISTER (SSA_NAME_VAR (def)))
1438 return false;
1440 /* There must be no VDEFS. */
1441 if (NUM_VDEFS (VDEF_OPS (ann)) != 0)
1442 return false;
1444 /* Float expressions must go through memory if float-store is on. */
1445 if (flag_float_store && FLOAT_TYPE_P (TREE_TYPE (TREE_OPERAND (stmt, 1))))
1446 return false;
1448 uses = USE_OPS (ann);
1449 num_use_ops = NUM_USES (uses);
1450 vuseops = VUSE_OPS (ann);
1452 /* Any expression which has no virtual operands and no real operands
1453 should have been propagated if it's possible to do anything with them.
1454 If this happens here, it probably exists that way for a reason, so we
1455 won't touch it. An example is:
1456 b_4 = &tab
1457 There are no virtual uses nor any real uses, so we just leave this
1458 alone to be safe. */
1460 if (num_use_ops == 0 && NUM_VUSES (vuseops) == 0)
1461 return false;
1463 version = SSA_NAME_VERSION (def);
1465 /* Add this expression to the dependancy list for each use partition. */
1466 for (i = 0; i < num_use_ops; i++)
1468 var = USE_OP (uses, i);
1469 add_dependance (tab, version, var);
1472 /* If there are VUSES, add a dependence on virtual defs. */
1473 if (NUM_VUSES (vuseops) != 0)
1475 add_value_to_list (tab, (value_expr_p *)&(tab->version_info[version]),
1476 VIRTUAL_PARTITION (tab));
1477 add_value_to_list (tab,
1478 &(tab->partition_dep_list[VIRTUAL_PARTITION (tab)]),
1479 version);
1480 bitmap_set_bit (tab->partition_in_use, VIRTUAL_PARTITION (tab));
1483 return true;
1487 /* This function will remove the expression for VERSION from replacement
1488 consideration.n table TAB If 'replace' is true, it is marked as
1489 replaceable, otherwise not. */
1491 static void
1492 finish_expr (temp_expr_table_p tab, int version, bool replace)
1494 value_expr_p info, tmp;
1495 int partition;
1497 /* Remove this expression from its dependent lists. The partition dependance
1498 list is retained and transfered later to whomever uses this version. */
1499 for (info = (value_expr_p) tab->version_info[version]; info; info = tmp)
1501 partition = info->value;
1502 #ifdef ENABLE_CHECKING
1503 if (tab->partition_dep_list[partition] == NULL)
1504 abort ();
1505 #endif
1506 tmp = remove_value_from_list (&(tab->partition_dep_list[partition]),
1507 version);
1508 #ifdef ENABLE_CHECKING
1509 if (!tmp)
1510 abort ();
1511 #endif
1512 free_value_expr (tab, tmp);
1513 /* Only clear the bit when the dependancy list is emptied via
1514 a replacement. Otherwise kill_expr will take care of it. */
1515 if (!(tab->partition_dep_list[partition]) && replace)
1516 bitmap_clear_bit (tab->partition_in_use, partition);
1517 tmp = info->next;
1518 if (!replace)
1519 free_value_expr (tab, info);
1522 if (replace)
1524 tab->saw_replaceable = true;
1525 bitmap_set_bit (tab->replaceable, version);
1527 else
1529 #ifdef ENABLE_CHECKING
1530 if (bitmap_bit_p (tab->replaceable, version))
1531 abort ();
1532 #endif
1533 tab->version_info[version] = NULL;
1538 /* Mark the expression associated with VAR as replaceable, and enter
1539 the defining stmt into the version_info table TAB. */
1541 static void
1542 mark_replaceable (temp_expr_table_p tab, tree var)
1544 value_expr_p info;
1545 int version = SSA_NAME_VERSION (var);
1546 finish_expr (tab, version, true);
1548 /* Move the dependence list to the pending list. */
1549 if (tab->version_info[version])
1551 info = (value_expr_p) tab->version_info[version];
1552 for ( ; info->next; info = info->next)
1553 continue;
1554 info->next = tab->pending_dependence;
1555 tab->pending_dependence = (value_expr_p)tab->version_info[version];
1558 tab->version_info[version] = SSA_NAME_DEF_STMT (var);
1562 /* This function marks any expression in TAB which is dependent on PARTITION
1563 as NOT replaceable. CLEAR_BIT is used to determine whether partition_in_use
1564 should have its bit cleared. Since this routine can be called within an
1565 EXECUTE_IF_SET_IN_BITMAP, the bit can't always be cleared. */
1567 static inline void
1568 kill_expr (temp_expr_table_p tab, int partition, bool clear_bit)
1570 value_expr_p ptr;
1572 /* Mark every active expr dependant on this var as not replaceable. */
1573 while ((ptr = tab->partition_dep_list[partition]) != NULL)
1574 finish_expr (tab, ptr->value, false);
1576 if (clear_bit)
1577 bitmap_clear_bit (tab->partition_in_use, partition);
1581 /* This function kills all expressions in TAB which are dependant on virtual
1582 DEFs. CLEAR_BIT determines whether partition_in_use gets cleared. */
1584 static inline void
1585 kill_virtual_exprs (temp_expr_table_p tab, bool clear_bit)
1587 kill_expr (tab, VIRTUAL_PARTITION (tab), clear_bit);
1591 /* This function processes basic block BB, and looks for variables which can
1592 be replaced by their expressions. Results are stored in TAB. */
1594 static void
1595 find_replaceable_in_bb (temp_expr_table_p tab, basic_block bb)
1597 block_stmt_iterator bsi;
1598 tree stmt, def;
1599 stmt_ann_t ann;
1600 int partition, num, i;
1601 use_optype uses;
1602 def_optype defs;
1603 var_map map = tab->map;
1604 value_expr_p p;
1606 for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
1608 stmt = bsi_stmt (bsi);
1609 ann = stmt_ann (stmt);
1611 /* Determine if this stmt finishes an existing expression. */
1612 uses = USE_OPS (ann);
1613 num = NUM_USES (uses);
1614 for (i = 0; i < num; i++)
1616 def = USE_OP (uses, i);
1617 if (tab->version_info[SSA_NAME_VERSION (def)])
1619 /* Mark expression as replaceable unless stmt is volatile. */
1620 if (!ann->has_volatile_ops)
1621 mark_replaceable (tab, def);
1622 else
1623 finish_expr (tab, SSA_NAME_VERSION (def), false);
1627 /* Next, see if this stmt kills off an active expression. */
1628 defs = DEF_OPS (ann);
1629 num = NUM_DEFS (defs);
1630 for (i = 0; i < num; i++)
1632 def = DEF_OP (defs, i);
1633 partition = var_to_partition (map, def);
1634 if (partition != NO_PARTITION && tab->partition_dep_list[partition])
1635 kill_expr (tab, partition, true);
1638 /* Now see if we are creating a new expression or not. */
1639 if (!ann->has_volatile_ops)
1640 check_replaceable (tab, stmt);
1642 /* Free any unused dependancy lists. */
1643 while ((p = tab->pending_dependence))
1645 tab->pending_dependence = p->next;
1646 free_value_expr (tab, p);
1649 /* A VDEF kills any expression using a virtual operand. */
1650 if (NUM_VDEFS (VDEF_OPS (ann)) > 0)
1651 kill_virtual_exprs (tab, true);
1656 /* This function is the driver routine for replacement of temporary expressions
1657 in the SSA->normal phase, operating on MAP. If there are replaceable
1658 expressions, a table is returned which maps SSA versions to the
1659 expressions they should be replaced with. A NULL_TREE indicates no
1660 replacement should take place. If there are no replacements at all,
1661 NULL is returned by the function, otherwise an expression vector indexed
1662 by SSA_NAME version numbers. */
1664 static tree *
1665 find_replaceable_exprs (var_map map)
1667 basic_block bb;
1668 int i;
1669 temp_expr_table_p table;
1670 tree *ret;
1672 table = new_temp_expr_table (map);
1673 FOR_EACH_BB (bb)
1675 find_replaceable_in_bb (table, bb);
1676 EXECUTE_IF_SET_IN_BITMAP ((table->partition_in_use), 0, i,
1678 kill_expr (table, i, false);
1682 ret = free_temp_expr_table (table);
1683 return ret;
1687 /* Dump TER expression table EXPR to file F. */
1689 static void
1690 dump_replaceable_exprs (FILE *f, tree *expr)
1692 tree stmt, var;
1693 int x;
1694 fprintf (f, "\nReplacing Expressions\n");
1695 for (x = 0; x < (int)highest_ssa_version + 1; x++)
1696 if (expr[x])
1698 stmt = expr[x];
1699 var = DEF_OP (STMT_DEF_OPS (stmt), 0);
1700 print_generic_expr (f, var, TDF_SLIM);
1701 fprintf (f, " replace with --> ");
1702 print_generic_expr (f, TREE_OPERAND (stmt, 1), TDF_SLIM);
1703 fprintf (f, "\n");
1705 fprintf (f, "\n");
1709 /* Helper function for discover_nonconstant_array_refs.
1710 Look for ARRAY_REF nodes with non-constant indexes and mark them
1711 addressable. */
1713 static tree
1714 discover_nonconstant_array_refs_r (tree * tp, int *walk_subtrees,
1715 void *data ATTRIBUTE_UNUSED)
1717 tree t = *tp;
1719 if (TYPE_P (t) || DECL_P (t))
1720 *walk_subtrees = 0;
1721 else if (TREE_CODE (t) == ARRAY_REF)
1723 while ((TREE_CODE (t) == ARRAY_REF
1724 && is_gimple_min_invariant (TREE_OPERAND (t, 1)))
1725 || (TREE_CODE (t) == COMPONENT_REF
1726 || TREE_CODE (t) == BIT_FIELD_REF
1727 || TREE_CODE (t) == REALPART_EXPR
1728 || TREE_CODE (t) == IMAGPART_EXPR))
1729 t = TREE_OPERAND (t, 0);
1731 if (TREE_CODE (t) == ARRAY_REF)
1733 t = get_base_address (t);
1734 if (t && DECL_P (t))
1735 TREE_ADDRESSABLE (t) = 1;
1738 *walk_subtrees = 0;
1741 return NULL_TREE;
1745 /* RTL expansion is not able to compile array references with variable
1746 offsets for arrays stored in single register. Discover such
1747 expressions and mark variables as addressable to avoid this
1748 scenario. */
1750 static void
1751 discover_nonconstant_array_refs (void)
1753 basic_block bb;
1754 block_stmt_iterator bsi;
1756 FOR_EACH_BB (bb)
1758 for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
1759 walk_tree (bsi_stmt_ptr (bsi), discover_nonconstant_array_refs_r,
1760 NULL , NULL);
1765 /* This function will rewrite the current program using the variable mapping
1766 found in MAP. If the replacement vector VALUES is provided, any
1767 occurrences of partitions with non-null entries in the vector will be
1768 replaced with the expression in the vector instead of its mapped
1769 variable. */
1771 static void
1772 rewrite_trees (var_map map, tree *values)
1774 elim_graph g;
1775 basic_block bb;
1776 block_stmt_iterator si;
1777 edge e;
1778 tree phi;
1779 bool changed;
1781 #ifdef ENABLE_CHECKING
1782 /* Search for PHIs where the destination has no partition, but one
1783 or more arguments has a partition. This should not happen and can
1784 create incorrect code. */
1785 FOR_EACH_BB (bb)
1787 tree phi;
1789 for (phi = phi_nodes (bb); phi; phi = TREE_CHAIN (phi))
1791 tree T0 = var_to_partition_to_var (map, PHI_RESULT (phi));
1793 if (T0 == NULL_TREE)
1795 int i;
1797 for (i = 0; i < PHI_NUM_ARGS (phi); i++)
1799 tree arg = PHI_ARG_DEF (phi, i);
1801 if (TREE_CODE (arg) == SSA_NAME
1802 && var_to_partition (map, arg) != NO_PARTITION)
1804 fprintf (stderr, "Argument of PHI is in a partition :(");
1805 print_generic_expr (stderr, arg, TDF_SLIM);
1806 fprintf (stderr, "), but the result is not :");
1807 print_generic_stmt (stderr, phi, TDF_SLIM);
1808 abort();
1814 #endif
1816 /* Replace PHI nodes with any required copies. */
1817 g = new_elim_graph (map->num_partitions);
1818 g->map = map;
1819 FOR_EACH_BB (bb)
1821 for (si = bsi_start (bb); !bsi_end_p (si); )
1823 size_t i, num_uses, num_defs;
1824 use_optype uses;
1825 def_optype defs;
1826 tree stmt = bsi_stmt (si);
1827 tree *use_p = NULL;
1828 int remove = 0, is_copy = 0;
1829 stmt_ann_t ann;
1831 get_stmt_operands (stmt);
1832 ann = stmt_ann (stmt);
1833 changed = false;
1835 if (TREE_CODE (stmt) == MODIFY_EXPR
1836 && (TREE_CODE (TREE_OPERAND (stmt, 1)) == SSA_NAME))
1837 is_copy = 1;
1839 uses = USE_OPS (ann);
1840 num_uses = NUM_USES (uses);
1842 for (i = 0; i < num_uses; i++)
1844 use_p = USE_OP_PTR (uses, i);
1845 if (replace_variable (map, use_p, values))
1846 changed = true;
1849 defs = DEF_OPS (ann);
1850 num_defs = NUM_DEFS (defs);
1852 /* Mark this stmt for removal if it is the list of replaceable
1853 expressions. */
1854 if (values && num_defs == 1)
1856 tree def = DEF_OP (defs, 0);
1857 tree val;
1858 val = values[SSA_NAME_VERSION (def)];
1859 if (val)
1860 remove = 1;
1862 if (!remove)
1864 for (i = 0; i < num_defs; i++)
1866 tree *def_p = DEF_OP_PTR (defs, i);
1868 if (replace_variable (map, def_p, NULL))
1869 changed = true;
1871 /* If both SSA_NAMEs coalesce to the same variable,
1872 mark the now redundant copy for removal. */
1873 if (is_copy
1874 && num_uses == 1
1875 && use_p
1876 && def_p
1877 && (*def_p == *use_p))
1878 remove = 1;
1880 if (changed)
1881 modify_stmt (stmt);
1884 /* Remove any stmts marked for removal. */
1885 if (remove)
1886 bsi_remove (&si);
1887 else
1888 bsi_next (&si);
1891 phi = phi_nodes (bb);
1892 if (phi)
1894 for (e = bb->pred; e; e = e->pred_next)
1895 eliminate_phi (e, phi_arg_from_edge (phi, e), g);
1899 delete_elim_graph (g);
1901 /* If any copies were inserted on edges, actually insert them now. */
1902 bsi_commit_edge_inserts (NULL);
1906 /* Remove the variables specified in MAP from SSA form. Any debug information
1907 is sent to DUMP. FLAGS indicate what options should be used. */
1909 void
1910 remove_ssa_form (FILE *dump, var_map map, int flags)
1912 tree_live_info_p liveinfo;
1913 basic_block bb;
1914 tree phi, next;
1915 FILE *save;
1916 tree *values = NULL;
1918 save = dump_file;
1919 dump_file = dump;
1921 /* If we are not combining temps, don't calculate live ranges for variables
1922 with only one SSA version. */
1923 if ((flags & SSANORM_COMBINE_TEMPS) == 0)
1924 compact_var_map (map, VARMAP_NO_SINGLE_DEFS);
1925 else
1926 compact_var_map (map, VARMAP_NORMAL);
1928 if (dump_file && (dump_flags & TDF_DETAILS))
1929 dump_var_map (dump_file, map);
1931 liveinfo = coalesce_ssa_name (map, flags);
1933 /* Make sure even single occurrence variables are in the list now. */
1934 if ((flags & SSANORM_COMBINE_TEMPS) == 0)
1935 compact_var_map (map, VARMAP_NORMAL);
1937 if (dump_file && (dump_flags & TDF_DETAILS))
1939 fprintf (dump_file, "After Coalescing:\n");
1940 dump_var_map (dump_file, map);
1943 if (flags & SSANORM_PERFORM_TER)
1945 values = find_replaceable_exprs (map);
1946 if (values && dump_file && (dump_flags & TDF_DETAILS))
1947 dump_replaceable_exprs (dump_file, values);
1950 /* Assign real variables to the partitions now. */
1951 assign_vars (map);
1953 if (dump_file && (dump_flags & TDF_DETAILS))
1955 fprintf (dump_file, "After Root variable replacement:\n");
1956 dump_var_map (dump_file, map);
1959 if ((flags & SSANORM_COMBINE_TEMPS) && liveinfo)
1961 coalesce_vars (map, liveinfo);
1962 if (dump_file && (dump_flags & TDF_DETAILS))
1964 fprintf (dump_file, "After variable memory coalescing:\n");
1965 dump_var_map (dump_file, map);
1969 if (liveinfo)
1970 delete_tree_live_info (liveinfo);
1972 rewrite_trees (map, values);
1974 if (values)
1975 free (values);
1977 /* Remove phi nodes which have been translated back to real variables. */
1978 FOR_EACH_BB (bb)
1980 for (phi = phi_nodes (bb); phi; phi = next)
1982 next = TREE_CHAIN (phi);
1983 if ((flags & SSANORM_REMOVE_ALL_PHIS)
1984 || var_to_partition (map, PHI_RESULT (phi)) != NO_PARTITION)
1985 remove_phi_node (phi, NULL_TREE, bb);
1989 dump_file = save;
1993 /* Take a subset of the variables VARS in the current function out of SSA
1994 form. */
1996 void
1997 rewrite_vars_out_of_ssa (bitmap vars)
1999 if (bitmap_first_set_bit (vars) >= 0)
2001 var_map map;
2002 basic_block bb;
2003 tree phi;
2004 int i;
2005 int ssa_flags;
2007 /* Search for PHIs in which one of the PHI arguments is marked for
2008 translation out of SSA form, but for which the PHI result is not
2009 marked for translation out of SSA form.
2011 Our per-variable out of SSA translation can not handle that case;
2012 however we can easily handle it here by creating a new instance
2013 of the PHI result's underlying variable and initializing it to
2014 the offending PHI argument on the edge associated with the
2015 PHI argument. We then change the PHI argument to use our new
2016 instead of the PHI's underlying variable.
2018 You might think we could register partitions for the out-of-ssa
2019 translation here and avoid a second walk of the PHI nodes. No
2020 such luck since the size of the var map will change if we have
2021 to manually take variables out of SSA form here. */
2022 FOR_EACH_BB (bb)
2024 for (phi = phi_nodes (bb); phi; phi = TREE_CHAIN (phi))
2026 tree result = SSA_NAME_VAR (PHI_RESULT (phi));
2028 /* If the definition is marked for renaming, then we need
2029 to do nothing more for this PHI node. */
2030 if (bitmap_bit_p (vars, var_ann (result)->uid))
2031 continue;
2033 /* Look at all the arguments and see if any of them are
2034 marked for renaming. If so, we need to handle them
2035 specially. */
2036 for (i = 0; i < PHI_NUM_ARGS (phi); i++)
2038 tree arg = PHI_ARG_DEF (phi, i);
2040 /* If the argument is not an SSA_NAME, then we can ignore
2041 this argument. */
2042 if (TREE_CODE (arg) != SSA_NAME)
2043 continue;
2045 /* If this argument is marked for renaming, then we need
2046 to undo the copy propagation so that we can take
2047 the argument out of SSA form without taking the
2048 result out of SSA form. */
2049 arg = SSA_NAME_VAR (arg);
2050 if (bitmap_bit_p (vars, var_ann (arg)->uid))
2052 tree new_name, copy;
2054 /* Get a new SSA_NAME for the copy, it is based on
2055 the result, not the argument! We use the PHI
2056 as the definition since we haven't created the
2057 definition statement yet. */
2058 new_name = make_ssa_name (result, phi);
2060 /* Now create the copy statement. */
2061 copy = build (MODIFY_EXPR, TREE_TYPE (arg),
2062 new_name, PHI_ARG_DEF (phi, i));
2064 /* Now update SSA_NAME_DEF_STMT to point to the
2065 newly created statement. */
2066 SSA_NAME_DEF_STMT (new_name) = copy;
2068 /* Now make the argument reference our new SSA_NAME. */
2069 PHI_ARG_DEF (phi, i) = new_name;
2071 /* Queue the statement for insertion. */
2072 bsi_insert_on_edge (PHI_ARG_EDGE (phi, i), copy);
2073 modify_stmt (copy);
2079 /* If any copies were inserted on edges, actually insert them now. */
2080 bsi_commit_edge_inserts (NULL);
2082 /* Now register partitions for all instances of the variables we
2083 are taking out of SSA form. */
2084 map = init_var_map (highest_ssa_version + 1);
2085 register_ssa_partitions_for_vars (vars, map);
2087 /* Now that we have all the partitions registered, translate the
2088 appropriate variables out of SSA form. */
2089 ssa_flags = SSANORM_COALESCE_PARTITIONS;
2090 if (flag_tree_combine_temps)
2091 ssa_flags |= SSANORM_COMBINE_TEMPS;
2092 remove_ssa_form (dump_file, map, ssa_flags);
2094 /* And finally, reset the out_of_ssa flag for each of the vars
2095 we just took out of SSA form. */
2096 EXECUTE_IF_SET_IN_BITMAP (vars, 0, i,
2098 var_ann (referenced_var (i))->out_of_ssa_tag = 0;
2101 /* Free the map as we are done with it. */
2102 delete_var_map (map);
2108 /* Take the current function out of SSA form, as described in
2109 R. Morgan, ``Building an Optimizing Compiler'',
2110 Butterworth-Heinemann, Boston, MA, 1998. pp 176-186. */
2112 static void
2113 rewrite_out_of_ssa (void)
2115 var_map map;
2116 int var_flags = 0;
2117 int ssa_flags = (SSANORM_REMOVE_ALL_PHIS | SSANORM_USE_COALESCE_LIST);
2119 if (!flag_tree_live_range_split)
2120 ssa_flags |= SSANORM_COALESCE_PARTITIONS;
2122 eliminate_virtual_phis ();
2124 if (dump_file && (dump_flags & TDF_DETAILS))
2125 dump_tree_cfg (dump_file, dump_flags & ~TDF_DETAILS);
2127 /* We cannot allow unssa to un-gimplify trees before we instrument them. */
2128 if (flag_tree_ter && !flag_mudflap)
2129 var_flags = SSA_VAR_MAP_REF_COUNT;
2131 map = create_ssa_var_map (var_flags);
2133 if (flag_tree_combine_temps)
2134 ssa_flags |= SSANORM_COMBINE_TEMPS;
2135 if (flag_tree_ter && !flag_mudflap)
2136 ssa_flags |= SSANORM_PERFORM_TER;
2138 remove_ssa_form (dump_file, map, ssa_flags);
2140 if (dump_file && (dump_flags & TDF_DETAILS))
2141 dump_tree_cfg (dump_file, dump_flags & ~TDF_DETAILS);
2143 /* Do some cleanups which reduce the amount of data the
2144 tree->rtl expanders deal with. */
2145 cfg_remove_useless_stmts ();
2147 /* Flush out flow graph and SSA data. */
2148 delete_var_map (map);
2150 /* Mark arrays indexed with non-constant indices with TREE_ADDRESSABLE. */
2151 discover_nonconstant_array_refs ();
2155 /* Define the parameters of the out of SSA pass. */
2157 struct tree_opt_pass pass_del_ssa =
2159 "optimized", /* name */
2160 NULL, /* gate */
2161 rewrite_out_of_ssa, /* execute */
2162 NULL, /* sub */
2163 NULL, /* next */
2164 0, /* static_pass_number */
2165 TV_TREE_SSA_TO_NORMAL, /* tv_id */
2166 PROP_cfg | PROP_ssa, /* properties_required */
2167 0, /* properties_provided */
2168 /* ??? If TER is enabled, we also kill gimple. */
2169 PROP_ssa, /* properties_destroyed */
2170 TODO_verify_ssa | TODO_verify_flow
2171 | TODO_verify_stmts, /* todo_flags_start */
2172 TODO_dump_func | TODO_ggc_collect /* todo_flags_finish */