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)
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. */
24 #include "coretypes.h"
31 #include "langhooks.h"
32 #include "hard-reg-set.h"
33 #include "basic-block.h"
38 #include "diagnostic.h"
40 #include "tree-flow.h"
41 #include "tree-gimple.h"
42 #include "tree-inline.h"
45 #include "tree-alias-common.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.
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. */
76 /* List of nodes in the elimination graph. */
79 /* The predecessor and successor edge list. */
80 varray_type edge_list
;
85 /* Stack for visited nodes. */
88 /* The variable partition map. */
91 /* Edge being eliminated by this graph. */
94 /* List of constant copies to emit. These are pushed on in pairs. */
95 varray_type const_copies
;
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
,
124 static void print_exprs_edge (FILE *, edge
, const char *, tree
, const char *,
128 /* Create a temporary variable based on the type of variable T. Use T's name
135 const char *name
= NULL
;
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
)
145 type
= TREE_TYPE (t
);
148 name
= IDENTIFIER_POINTER (tmp
);
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
);
167 /* This helper function fill insert a copy from a constant or variable SRC to
168 variable DEST on edge E. */
171 insert_copy_on_edge (edge e
, tree dest
, tree src
)
175 copy
= build (MODIFY_EXPR
, TREE_TYPE (dest
), dest
, src
);
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
)
183 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
186 "Inserting a copy on edge BB%d->BB%d :",
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
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
);
216 /* Empty elimination graph G. */
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. */
229 delete_elim_graph (elim_graph g
)
231 sbitmap_free (g
->visited
);
236 /* Return the number of nodes in graph G. */
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. */
248 elim_graph_add_node (elim_graph g
, tree node
)
251 for (x
= 0; x
< elim_graph_size (g
); x
++)
252 if (VARRAY_TREE (g
->nodes
, x
) == node
)
254 VARRAY_PUSH_TREE (g
->nodes
, node
);
258 /* Add the edge PRED->SUCC to graph G. */
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. */
272 elim_graph_remove_succ_edge (elim_graph g
, int node
)
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;
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) \
296 for (x_ = 0; x_ < VARRAY_ACTIVE_SIZE ((GRAPH)->edge_list); x_ += 2) \
298 y_ = VARRAY_INT ((GRAPH)->edge_list, x_); \
301 (VAR) = VARRAY_INT ((GRAPH)->edge_list, x_ + 1); \
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) \
315 for (x_ = 0; x_ < VARRAY_ACTIVE_SIZE ((GRAPH)->edge_list); x_ += 2) \
317 y_ = VARRAY_INT ((GRAPH)->edge_list, x_ + 1); \
320 (VAR) = VARRAY_INT ((GRAPH)->edge_list, x_); \
326 /* Add T to elimination graph G. */
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. */
338 eliminate_build (elim_graph g
, basic_block B
, int i
)
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. */
354 if (PHI_ARG_EDGE (phi
, i
) == g
->e
)
355 Ti
= PHI_ARG_DEF (phi
, i
);
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
);
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
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
376 VARRAY_PUSH_TREE (g
->const_copies
, T0
);
377 VARRAY_PUSH_TREE (g
->const_copies
, Ti
);
381 Ti
= var_to_partition_to_var (g
->map
, 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. */
398 elim_forward (elim_graph g
, int T
)
401 SET_BIT (g
->visited
, T
);
402 FOR_EACH_ELIM_GRAPH_SUCC (g
, T
, S
,
404 if (!TEST_BIT (g
->visited
, S
))
407 VARRAY_PUSH_INT (g
->stack
, T
);
411 /* Return 1 if there unvisited predecessors of T in graph G. */
414 elim_unvisited_predecessor (elim_graph g
, int T
)
417 FOR_EACH_ELIM_GRAPH_PRED (g
, T
, P
,
419 if (!TEST_BIT (g
->visited
, P
))
425 /* Process predecessors first, and insert a copy. */
428 elim_backward (elim_graph g
, int T
)
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. */
448 elim_create (elim_graph g
, int T
)
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
);
468 S
= elim_graph_remove_succ_edge (g
, T
);
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. */
484 eliminate_phi (edge e
, int i
, elim_graph g
)
488 basic_block B
= e
->dest
;
490 #if defined ENABLE_CHECKING
493 if (VARRAY_ACTIVE_SIZE (g
->const_copies
) != 0)
497 /* Abnormal edges already have everything coalesced, or the coalescer
498 would have aborted. */
499 if (e
->flags
& EDGE_ABNORMAL
)
502 num_nodes
= num_var_partitions (g
->map
);
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
))
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
))
530 /* If there are any pending constant copies, issue them now. */
531 while (VARRAY_ACTIVE_SIZE (g
->const_copies
) > 0)
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." */
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. */
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
,
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. */
577 coalesce_abnormal_edges (var_map map
, conflict_graph graph
, root_var_p rv
)
584 /* Code cannot be inserted on abnormal edges. Look for all abnormal
585 edges, and coalesce any PHI results with their arguments across
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
)
602 y
= phi_arg_from_edge (phi
, e
);
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 :",
614 y
= var_to_partition (map
, tmp
);
615 if (x
== NO_PARTITION
|| y
== NO_PARTITION
)
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
)),
622 root_var (rv
, root_var_find (rv
, 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
);
634 && (dump_flags
& TDF_DETAILS
))
636 print_exprs_edge (dump_file
, e
,
637 "ABNORMAL: Coalescing ",
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
));
647 conflict_graph_merge_regs (graph
, x
, y
);
651 print_exprs_edge (stderr
, e
, "\n Conflict ",
652 partition_to_var (map
, x
),
653 " and ", partition_to_var (map
, y
));
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
)
674 tree_live_info_p liveinfo
;
676 conflict_graph graph
;
678 coalesce_list_p cl
= NULL
;
680 if (num_var_partitions (map
) <= 1)
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. */
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
)
707 for (x
= 0; x
< PHI_NUM_ARGS (phi
); x
++)
709 tree arg
= PHI_ARG_DEF (phi
, x
);
712 if (TREE_CODE (arg
) != SSA_NAME
)
714 if (SSA_NAME_VAR (res
) != SSA_NAME_VAR (arg
))
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. */
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
)
737 add_coalesce (cl
, i
, x
, 1);
742 /* Build a conflict graph. */
743 graph
= build_tree_conflict_graph (liveinfo
, rv
, 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
));
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
)
780 if ((flags
& SSANORM_COMBINE_TEMPS
) == 0)
782 delete_tree_live_info (liveinfo
);
786 /* Assign root variable as partition representative for each live on entry
788 EXECUTE_IF_SET_IN_SBITMAP (live
, 0, x
,
790 var
= root_var (rv
, root_var_find (rv
, x
));
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. */
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
);
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
828 if (flags
& SSANORM_COALESCE_PARTITIONS
)
829 coalesce_tpa_members (rv
, graph
, map
, NULL
,
830 ((dump_flags
& TDF_DETAILS
) ? dump_file
833 delete_coalesce_list (cl
);
834 root_var_delete (rv
);
835 conflict_graph_delete (graph
);
841 /* Take the ssa-name var_map MAP, and assign real variables to each
845 assign_vars (var_map map
)
852 rv
= root_var_init (map
);
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. */
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
);
885 for (i
= root_var_first_partition (rv
, x
);
887 i
= root_var_next_partition (rv
, i
))
889 t
= partition_to_var (map
, i
);
891 if (t
== var
|| TREE_CODE (t
) != SSA_NAME
)
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
);
904 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
905 print_exprs (dump_file
, "", t
, " not coalesced with ", var
,
908 var
= create_temp (t
);
909 change_partition_var (map
, var
, rep
);
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. */
931 replace_variable (var_map map
, tree
*p
, tree
*expr
)
936 /* Check if we are replacing this variable with an expression. */
939 int version
= SSA_NAME_VERSION (*p
);
942 tree new_expr
= TREE_OPERAND (expr
[version
], 1);
944 /* Clear the stmt's RHS, or GC might bite us. */
945 TREE_OPERAND (expr
[version
], 1) = NULL_TREE
;
950 new_var
= var_to_partition_to_var (map
, var
);
954 set_is_used (new_var
);
961 /* Remove any PHI node which is a virtual PHI. */
964 eliminate_virtual_phis (void)
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
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
);
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
1008 coalesce_vars (var_map map
, tree_live_info_p liveinfo
)
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
);
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. */
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
)
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
))
1051 p2
= var_to_partition (map
, arg
);
1052 if (p2
== NO_PARTITION
)
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
);
1076 type_var_dump (dump_file
, tv
);
1077 type_var_compact (tv
);
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
1155 struct value_expr_d
*next
;
1159 /* Temporary Expression Replacement (TER) table information. */
1161 typedef struct temp_expr_table_d
1164 void **version_info
;
1165 value_expr_p
*partition_dep_list
;
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,
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
*,
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
));
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
;
1224 /* Free TER table T. If there are valid replacements, return the expression
1228 free_temp_expr_table (temp_expr_table_p t
)
1233 #ifdef ENABLE_CHECKING
1235 for (x
= 0; x
<= num_var_partitions (t
->map
); x
++)
1236 if (t
->partition_dep_list
[x
] != NULL
)
1240 while ((p
= t
->free_list
))
1242 t
->free_list
= p
->next
;
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
;
1253 free (t
->version_info
);
1260 /* Allocate a new value list node. Take it from the free list in TABLE if
1263 static inline value_expr_p
1264 new_value_expr (temp_expr_table_p table
)
1267 if (table
->free_list
)
1269 p
= table
->free_list
;
1270 table
->free_list
= p
->next
;
1273 p
= (value_expr_p
) xmalloc (sizeof (struct value_expr_d
));
1279 /* Add value list node P to the free list in TABLE. */
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
)
1297 value_expr_p last
= NULL
;
1299 for (curr
= list
; curr
; last
= curr
, curr
= curr
->next
)
1301 if (curr
->value
== value
)
1310 /* Add VALUE to LIST, if it isn't already present. TAB is the expression
1314 add_value_to_list (temp_expr_table_p tab
, value_expr_p
*list
, int value
)
1318 if (!find_value_in_list (*list
, value
, NULL
))
1320 info
= new_value_expr (tab
);
1321 info
->value
= value
;
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. */
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
);
1344 /* Look for VALUE in LIST. If found, remove it from the list and return it's
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
);
1358 last
->next
= info
->next
;
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. */
1370 add_dependance (temp_expr_table_p tab
, int version
, tree var
)
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. */
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
);
1395 i
= var_to_partition (tab
->map
, var
);
1396 #ifdef ENABLE_CHECKING
1397 if (i
== NO_PARTITION
)
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. */
1412 check_replaceable (temp_expr_table_p tab
, tree stmt
)
1415 vuse_optype vuseops
;
1419 int num_use_ops
, version
, i
;
1420 var_map map
= tab
->map
;
1422 if (TREE_CODE (stmt
) != MODIFY_EXPR
)
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)
1431 def
= DEF_OP (defs
, 0);
1432 if (version_ref_count (map
, def
) != 1)
1435 /* Assignments to variables assigned to hard registers are not
1437 if (DECL_HARD_REGISTER (SSA_NAME_VAR (def
)))
1440 /* There must be no VDEFS. */
1441 if (NUM_VDEFS (VDEF_OPS (ann
)) != 0)
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))))
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:
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)
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
)]),
1480 bitmap_set_bit (tab
->partition_in_use
, VIRTUAL_PARTITION (tab
));
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. */
1492 finish_expr (temp_expr_table_p tab
, int version
, bool replace
)
1494 value_expr_p info
, tmp
;
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
)
1506 tmp
= remove_value_from_list (&(tab
->partition_dep_list
[partition
]),
1508 #ifdef ENABLE_CHECKING
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
);
1519 free_value_expr (tab
, info
);
1524 tab
->saw_replaceable
= true;
1525 bitmap_set_bit (tab
->replaceable
, version
);
1529 #ifdef ENABLE_CHECKING
1530 if (bitmap_bit_p (tab
->replaceable
, version
))
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. */
1542 mark_replaceable (temp_expr_table_p tab
, tree var
)
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
)
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. */
1568 kill_expr (temp_expr_table_p tab
, int partition
, bool clear_bit
)
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);
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. */
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. */
1595 find_replaceable_in_bb (temp_expr_table_p tab
, basic_block bb
)
1597 block_stmt_iterator bsi
;
1600 int partition
, num
, i
;
1603 var_map map
= tab
->map
;
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
);
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. */
1665 find_replaceable_exprs (var_map map
)
1669 temp_expr_table_p table
;
1672 table
= new_temp_expr_table (map
);
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
);
1687 /* Dump TER expression table EXPR to file F. */
1690 dump_replaceable_exprs (FILE *f
, tree
*expr
)
1694 fprintf (f
, "\nReplacing Expressions\n");
1695 for (x
= 0; x
< (int)highest_ssa_version
+ 1; 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
);
1709 /* Helper function for discover_nonconstant_array_refs.
1710 Look for ARRAY_REF nodes with non-constant indexes and mark them
1714 discover_nonconstant_array_refs_r (tree
* tp
, int *walk_subtrees
,
1715 void *data ATTRIBUTE_UNUSED
)
1719 if (TYPE_P (t
) || DECL_P (t
))
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;
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
1751 discover_nonconstant_array_refs (void)
1754 block_stmt_iterator bsi
;
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
,
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
1772 rewrite_trees (var_map map
, tree
*values
)
1776 block_stmt_iterator si
;
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. */
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
)
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
);
1816 /* Replace PHI nodes with any required copies. */
1817 g
= new_elim_graph (map
->num_partitions
);
1821 for (si
= bsi_start (bb
); !bsi_end_p (si
); )
1823 size_t i
, num_uses
, num_defs
;
1826 tree stmt
= bsi_stmt (si
);
1828 int remove
= 0, is_copy
= 0;
1831 get_stmt_operands (stmt
);
1832 ann
= stmt_ann (stmt
);
1835 if (TREE_CODE (stmt
) == MODIFY_EXPR
1836 && (TREE_CODE (TREE_OPERAND (stmt
, 1)) == SSA_NAME
))
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
))
1849 defs
= DEF_OPS (ann
);
1850 num_defs
= NUM_DEFS (defs
);
1852 /* Mark this stmt for removal if it is the list of replaceable
1854 if (values
&& num_defs
== 1)
1856 tree def
= DEF_OP (defs
, 0);
1858 val
= values
[SSA_NAME_VERSION (def
)];
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
))
1871 /* If both SSA_NAMEs coalesce to the same variable,
1872 mark the now redundant copy for removal. */
1877 && (*def_p
== *use_p
))
1884 /* Remove any stmts marked for removal. */
1891 phi
= phi_nodes (bb
);
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. */
1910 remove_ssa_form (FILE *dump
, var_map map
, int flags
)
1912 tree_live_info_p liveinfo
;
1916 tree
*values
= NULL
;
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
);
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. */
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
);
1970 delete_tree_live_info (liveinfo
);
1972 rewrite_trees (map
, values
);
1977 /* Remove phi nodes which have been translated back to real variables. */
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
);
1993 /* Take a subset of the variables VARS in the current function out of SSA
1997 rewrite_vars_out_of_ssa (bitmap vars
)
1999 if (bitmap_first_set_bit (vars
) >= 0)
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. */
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
))
2033 /* Look at all the arguments and see if any of them are
2034 marked for renaming. If so, we need to handle them
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
2042 if (TREE_CODE (arg
) != SSA_NAME
)
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
);
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. */
2113 rewrite_out_of_ssa (void)
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 */
2161 rewrite_out_of_ssa
, /* execute */
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 */