1 /* Copy propagation and SSA_NAME replacement support routines.
2 Copyright (C) 2004, 2005, 2006, 2007, 2008, 2010
3 Free Software Foundation, Inc.
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3, or (at your option)
12 GCC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
23 #include "coretypes.h"
30 #include "basic-block.h"
34 #include "diagnostic.h"
36 #include "tree-dump.h"
37 #include "tree-flow.h"
38 #include "tree-pass.h"
39 #include "tree-ssa-propagate.h"
40 #include "langhooks.h"
43 /* This file implements the copy propagation pass and provides a
44 handful of interfaces for performing const/copy propagation and
45 simple expression replacement which keep variable annotations
48 We require that for any copy operation where the RHS and LHS have
49 a non-null memory tag the memory tag be the same. It is OK
50 for one or both of the memory tags to be NULL.
52 We also require tracking if a variable is dereferenced in a load or
55 We enforce these requirements by having all copy propagation and
56 replacements of one SSA_NAME with a different SSA_NAME to use the
57 APIs defined in this file. */
59 /* Return true if we may propagate ORIG into DEST, false otherwise. */
62 may_propagate_copy (tree dest
, tree orig
)
64 tree type_d
= TREE_TYPE (dest
);
65 tree type_o
= TREE_TYPE (orig
);
67 /* If ORIG flows in from an abnormal edge, it cannot be propagated. */
68 if (TREE_CODE (orig
) == SSA_NAME
69 && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (orig
))
72 /* If DEST is an SSA_NAME that flows from an abnormal edge, then it
73 cannot be replaced. */
74 if (TREE_CODE (dest
) == SSA_NAME
75 && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (dest
))
78 /* Do not copy between types for which we *do* need a conversion. */
79 if (!useless_type_conversion_p (type_d
, type_o
))
82 /* Propagating virtual operands is always ok. */
83 if (TREE_CODE (dest
) == SSA_NAME
&& !is_gimple_reg (dest
))
85 /* But only between virtual operands. */
86 gcc_assert (TREE_CODE (orig
) == SSA_NAME
&& !is_gimple_reg (orig
));
91 /* Anything else is OK. */
95 /* Like may_propagate_copy, but use as the destination expression
96 the principal expression (typically, the RHS) contained in
97 statement DEST. This is more efficient when working with the
98 gimple tuples representation. */
101 may_propagate_copy_into_stmt (gimple dest
, tree orig
)
106 /* If the statement is a switch or a single-rhs assignment,
107 then the expression to be replaced by the propagation may
108 be an SSA_NAME. Fortunately, there is an explicit tree
109 for the expression, so we delegate to may_propagate_copy. */
111 if (gimple_assign_single_p (dest
))
112 return may_propagate_copy (gimple_assign_rhs1 (dest
), orig
);
113 else if (gimple_code (dest
) == GIMPLE_SWITCH
)
114 return may_propagate_copy (gimple_switch_index (dest
), orig
);
116 /* In other cases, the expression is not materialized, so there
117 is no destination to pass to may_propagate_copy. On the other
118 hand, the expression cannot be an SSA_NAME, so the analysis
121 if (TREE_CODE (orig
) == SSA_NAME
122 && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (orig
))
125 if (is_gimple_assign (dest
))
126 type_d
= TREE_TYPE (gimple_assign_lhs (dest
));
127 else if (gimple_code (dest
) == GIMPLE_COND
)
128 type_d
= boolean_type_node
;
129 else if (is_gimple_call (dest
)
130 && gimple_call_lhs (dest
) != NULL_TREE
)
131 type_d
= TREE_TYPE (gimple_call_lhs (dest
));
135 type_o
= TREE_TYPE (orig
);
137 if (!useless_type_conversion_p (type_d
, type_o
))
143 /* Similarly, but we know that we're propagating into an ASM_EXPR. */
146 may_propagate_copy_into_asm (tree dest
)
148 /* Hard register operands of asms are special. Do not bypass. */
149 return !(TREE_CODE (dest
) == SSA_NAME
150 && TREE_CODE (SSA_NAME_VAR (dest
)) == VAR_DECL
151 && DECL_HARD_REGISTER (SSA_NAME_VAR (dest
)));
155 /* Common code for propagate_value and replace_exp.
157 Replace use operand OP_P with VAL. FOR_PROPAGATION indicates if the
158 replacement is done to propagate a value or not. */
161 replace_exp_1 (use_operand_p op_p
, tree val
,
162 bool for_propagation ATTRIBUTE_UNUSED
)
164 #if defined ENABLE_CHECKING
165 tree op
= USE_FROM_PTR (op_p
);
167 gcc_assert (!(for_propagation
168 && TREE_CODE (op
) == SSA_NAME
169 && TREE_CODE (val
) == SSA_NAME
170 && !may_propagate_copy (op
, val
)));
173 if (TREE_CODE (val
) == SSA_NAME
)
176 SET_USE (op_p
, unsave_expr_now (val
));
180 /* Propagate the value VAL (assumed to be a constant or another SSA_NAME)
181 into the operand pointed to by OP_P.
183 Use this version for const/copy propagation as it will perform additional
184 checks to ensure validity of the const/copy propagation. */
187 propagate_value (use_operand_p op_p
, tree val
)
189 replace_exp_1 (op_p
, val
, true);
192 /* Replace *OP_P with value VAL (assumed to be a constant or another SSA_NAME).
194 Use this version when not const/copy propagating values. For example,
195 PRE uses this version when building expressions as they would appear
196 in specific blocks taking into account actions of PHI nodes. */
199 replace_exp (use_operand_p op_p
, tree val
)
201 replace_exp_1 (op_p
, val
, false);
205 /* Propagate the value VAL (assumed to be a constant or another SSA_NAME)
206 into the tree pointed to by OP_P.
208 Use this version for const/copy propagation when SSA operands are not
209 available. It will perform the additional checks to ensure validity of
210 the const/copy propagation, but will not update any operand information.
211 Be sure to mark the stmt as modified. */
214 propagate_tree_value (tree
*op_p
, tree val
)
216 #if defined ENABLE_CHECKING
217 gcc_assert (!(TREE_CODE (val
) == SSA_NAME
219 && TREE_CODE (*op_p
) == SSA_NAME
220 && !may_propagate_copy (*op_p
, val
)));
223 if (TREE_CODE (val
) == SSA_NAME
)
226 *op_p
= unsave_expr_now (val
);
230 /* Like propagate_tree_value, but use as the operand to replace
231 the principal expression (typically, the RHS) contained in the
232 statement referenced by iterator GSI. Note that it is not
233 always possible to update the statement in-place, so a new
234 statement may be created to replace the original. */
237 propagate_tree_value_into_stmt (gimple_stmt_iterator
*gsi
, tree val
)
239 gimple stmt
= gsi_stmt (*gsi
);
241 if (is_gimple_assign (stmt
))
243 tree expr
= NULL_TREE
;
244 if (gimple_assign_single_p (stmt
))
245 expr
= gimple_assign_rhs1 (stmt
);
246 propagate_tree_value (&expr
, val
);
247 gimple_assign_set_rhs_from_tree (gsi
, expr
);
248 stmt
= gsi_stmt (*gsi
);
250 else if (gimple_code (stmt
) == GIMPLE_COND
)
252 tree lhs
= NULL_TREE
;
253 tree rhs
= fold_convert (TREE_TYPE (val
), integer_zero_node
);
254 propagate_tree_value (&lhs
, val
);
255 gimple_cond_set_code (stmt
, NE_EXPR
);
256 gimple_cond_set_lhs (stmt
, lhs
);
257 gimple_cond_set_rhs (stmt
, rhs
);
259 else if (is_gimple_call (stmt
)
260 && gimple_call_lhs (stmt
) != NULL_TREE
)
264 tree expr
= NULL_TREE
;
265 propagate_tree_value (&expr
, val
);
266 new_stmt
= gimple_build_assign (gimple_call_lhs (stmt
), expr
);
267 move_ssa_defining_stmt_for_defs (new_stmt
, stmt
);
268 gsi_replace (gsi
, new_stmt
, false);
270 else if (gimple_code (stmt
) == GIMPLE_SWITCH
)
271 propagate_tree_value (gimple_switch_index_ptr (stmt
), val
);
276 /*---------------------------------------------------------------------------
278 ---------------------------------------------------------------------------*/
279 /* During propagation, we keep chains of variables that are copies of
280 one another. If variable X_i is a copy of X_j and X_j is a copy of
281 X_k, COPY_OF will contain:
283 COPY_OF[i].VALUE = X_j
284 COPY_OF[j].VALUE = X_k
285 COPY_OF[k].VALUE = X_k
287 After propagation, the copy-of value for each variable X_i is
288 converted into the final value by walking the copy-of chains and
289 updating COPY_OF[i].VALUE to be the last element of the chain. */
290 static prop_value_t
*copy_of
;
292 /* Used in set_copy_of_val to determine if the last link of a copy-of
293 chain has changed. */
294 static tree
*cached_last_copy_of
;
297 /* Return true if this statement may generate a useful copy. */
300 stmt_may_generate_copy (gimple stmt
)
302 if (gimple_code (stmt
) == GIMPLE_PHI
)
303 return !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (gimple_phi_result (stmt
));
305 if (gimple_code (stmt
) != GIMPLE_ASSIGN
)
308 /* If the statement has volatile operands, it won't generate a
310 if (gimple_has_volatile_ops (stmt
))
313 /* Statements with loads and/or stores will never generate a useful copy. */
314 if (gimple_vuse (stmt
))
317 /* Otherwise, the only statements that generate useful copies are
318 assignments whose RHS is just an SSA name that doesn't flow
319 through abnormal edges. */
320 return (gimple_assign_rhs_code (stmt
) == SSA_NAME
321 && !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (gimple_assign_rhs1 (stmt
)));
325 /* Return the copy-of value for VAR. */
327 static inline prop_value_t
*
328 get_copy_of_val (tree var
)
330 prop_value_t
*val
= ©_of
[SSA_NAME_VERSION (var
)];
332 if (val
->value
== NULL_TREE
333 && !stmt_may_generate_copy (SSA_NAME_DEF_STMT (var
)))
335 /* If the variable will never generate a useful copy relation,
336 make it its own copy. */
344 /* Return last link in the copy-of chain for VAR. */
347 get_last_copy_of (tree var
)
352 /* Traverse COPY_OF starting at VAR until we get to the last
353 link in the chain. Since it is possible to have cycles in PHI
354 nodes, the copy-of chain may also contain cycles.
356 To avoid infinite loops and to avoid traversing lengthy copy-of
357 chains, we artificially limit the maximum number of chains we are
360 The value 5 was taken from a compiler and runtime library
361 bootstrap and a mixture of C and C++ code from various sources.
362 More than 82% of all copy-of chains were shorter than 5 links. */
366 for (i
= 0; i
< LIMIT
; i
++)
368 tree copy
= copy_of
[SSA_NAME_VERSION (last
)].value
;
369 if (copy
== NULL_TREE
|| copy
== last
)
374 /* If we have reached the limit, then we are either in a copy-of
375 cycle or the copy-of chain is too long. In this case, just
376 return VAR so that it is not considered a copy of anything. */
377 return (i
< LIMIT
? last
: var
);
381 /* Set FIRST to be the first variable in the copy-of chain for DEST.
382 If DEST's copy-of value or its copy-of chain has changed, return
385 MEM_REF is the memory reference where FIRST is stored. This is
386 used when DEST is a non-register and we are copy propagating loads
390 set_copy_of_val (tree dest
, tree first
)
392 unsigned int dest_ver
= SSA_NAME_VERSION (dest
);
393 tree old_first
, old_last
, new_last
;
395 /* Set FIRST to be the first link in COPY_OF[DEST]. If that
396 changed, return true. */
397 old_first
= copy_of
[dest_ver
].value
;
398 copy_of
[dest_ver
].value
= first
;
400 if (old_first
!= first
)
403 /* If FIRST and OLD_FIRST are the same, we need to check whether the
404 copy-of chain starting at FIRST ends in a different variable. If
405 the copy-of chain starting at FIRST ends up in a different
406 variable than the last cached value we had for DEST, then return
407 true because DEST is now a copy of a different variable.
409 This test is necessary because even though the first link in the
410 copy-of chain may not have changed, if any of the variables in
411 the copy-of chain changed its final value, DEST will now be the
412 copy of a different variable, so we have to do another round of
413 propagation for everything that depends on DEST. */
414 old_last
= cached_last_copy_of
[dest_ver
];
415 new_last
= get_last_copy_of (dest
);
416 cached_last_copy_of
[dest_ver
] = new_last
;
418 return (old_last
!= new_last
);
422 /* Dump the copy-of value for variable VAR to FILE. */
425 dump_copy_of (FILE *file
, tree var
)
430 print_generic_expr (file
, var
, dump_flags
);
432 if (TREE_CODE (var
) != SSA_NAME
)
435 visited
= sbitmap_alloc (num_ssa_names
);
436 sbitmap_zero (visited
);
437 SET_BIT (visited
, SSA_NAME_VERSION (var
));
439 fprintf (file
, " copy-of chain: ");
442 print_generic_expr (file
, val
, 0);
444 while (copy_of
[SSA_NAME_VERSION (val
)].value
)
446 fprintf (file
, "-> ");
447 val
= copy_of
[SSA_NAME_VERSION (val
)].value
;
448 print_generic_expr (file
, val
, 0);
450 if (TEST_BIT (visited
, SSA_NAME_VERSION (val
)))
452 SET_BIT (visited
, SSA_NAME_VERSION (val
));
455 val
= get_copy_of_val (var
)->value
;
456 if (val
== NULL_TREE
)
457 fprintf (file
, "[UNDEFINED]");
459 fprintf (file
, "[COPY]");
461 fprintf (file
, "[NOT A COPY]");
463 sbitmap_free (visited
);
467 /* Evaluate the RHS of STMT. If it produces a valid copy, set the LHS
468 value and store the LHS into *RESULT_P. If STMT generates more
469 than one name (i.e., STMT is an aliased store), it is enough to
470 store the first name in the VDEF list into *RESULT_P. After
471 all, the names generated will be VUSEd in the same statements. */
473 static enum ssa_prop_result
474 copy_prop_visit_assignment (gimple stmt
, tree
*result_p
)
477 prop_value_t
*rhs_val
;
479 lhs
= gimple_assign_lhs (stmt
);
480 rhs
= gimple_assign_rhs1 (stmt
);
483 gcc_assert (gimple_assign_rhs_code (stmt
) == SSA_NAME
);
485 rhs_val
= get_copy_of_val (rhs
);
487 if (TREE_CODE (lhs
) == SSA_NAME
)
489 /* Straight copy between two SSA names. First, make sure that
490 we can propagate the RHS into uses of LHS. */
491 if (!may_propagate_copy (lhs
, rhs
))
492 return SSA_PROP_VARYING
;
494 /* Notice that in the case of assignments, we make the LHS be a
495 copy of RHS's value, not of RHS itself. This avoids keeping
496 unnecessary copy-of chains (assignments cannot be in a cycle
497 like PHI nodes), speeding up the propagation process.
498 This is different from what we do in copy_prop_visit_phi_node.
499 In those cases, we are interested in the copy-of chains. */
501 if (set_copy_of_val (*result_p
, rhs_val
->value
))
502 return SSA_PROP_INTERESTING
;
504 return SSA_PROP_NOT_INTERESTING
;
507 return SSA_PROP_VARYING
;
511 /* Visit the GIMPLE_COND STMT. Return SSA_PROP_INTERESTING
512 if it can determine which edge will be taken. Otherwise, return
515 static enum ssa_prop_result
516 copy_prop_visit_cond_stmt (gimple stmt
, edge
*taken_edge_p
)
518 enum ssa_prop_result retval
= SSA_PROP_VARYING
;
519 location_t loc
= gimple_location (stmt
);
521 tree op0
= gimple_cond_lhs (stmt
);
522 tree op1
= gimple_cond_rhs (stmt
);
524 /* The only conditionals that we may be able to compute statically
525 are predicates involving two SSA_NAMEs. */
526 if (TREE_CODE (op0
) == SSA_NAME
&& TREE_CODE (op1
) == SSA_NAME
)
528 op0
= get_last_copy_of (op0
);
529 op1
= get_last_copy_of (op1
);
531 /* See if we can determine the predicate's value. */
532 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
534 fprintf (dump_file
, "Trying to determine truth value of ");
535 fprintf (dump_file
, "predicate ");
536 print_gimple_stmt (dump_file
, stmt
, 0, 0);
539 /* We can fold COND and get a useful result only when we have
540 the same SSA_NAME on both sides of a comparison operator. */
543 tree folded_cond
= fold_binary_loc (loc
, gimple_cond_code (stmt
),
544 boolean_type_node
, op0
, op1
);
547 basic_block bb
= gimple_bb (stmt
);
548 *taken_edge_p
= find_taken_edge (bb
, folded_cond
);
550 retval
= SSA_PROP_INTERESTING
;
555 if (dump_file
&& (dump_flags
& TDF_DETAILS
) && *taken_edge_p
)
556 fprintf (dump_file
, "\nConditional will always take edge %d->%d\n",
557 (*taken_edge_p
)->src
->index
, (*taken_edge_p
)->dest
->index
);
563 /* Evaluate statement STMT. If the statement produces a new output
564 value, return SSA_PROP_INTERESTING and store the SSA_NAME holding
565 the new value in *RESULT_P.
567 If STMT is a conditional branch and we can determine its truth
568 value, set *TAKEN_EDGE_P accordingly.
570 If the new value produced by STMT is varying, return
573 static enum ssa_prop_result
574 copy_prop_visit_stmt (gimple stmt
, edge
*taken_edge_p
, tree
*result_p
)
576 enum ssa_prop_result retval
;
578 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
580 fprintf (dump_file
, "\nVisiting statement:\n");
581 print_gimple_stmt (dump_file
, stmt
, 0, dump_flags
);
582 fprintf (dump_file
, "\n");
585 if (gimple_assign_single_p (stmt
)
586 && TREE_CODE (gimple_assign_lhs (stmt
)) == SSA_NAME
587 && TREE_CODE (gimple_assign_rhs1 (stmt
)) == SSA_NAME
)
589 /* If the statement is a copy assignment, evaluate its RHS to
590 see if the lattice value of its output has changed. */
591 retval
= copy_prop_visit_assignment (stmt
, result_p
);
593 else if (gimple_code (stmt
) == GIMPLE_COND
)
595 /* See if we can determine which edge goes out of a conditional
597 retval
= copy_prop_visit_cond_stmt (stmt
, taken_edge_p
);
600 retval
= SSA_PROP_VARYING
;
602 if (retval
== SSA_PROP_VARYING
)
607 /* Any other kind of statement is not interesting for constant
608 propagation and, therefore, not worth simulating. */
609 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
610 fprintf (dump_file
, "No interesting values produced.\n");
612 /* The assignment is not a copy operation. Don't visit this
613 statement again and mark all the definitions in the statement
614 to be copies of nothing. */
615 FOR_EACH_SSA_TREE_OPERAND (def
, stmt
, i
, SSA_OP_ALL_DEFS
)
616 set_copy_of_val (def
, def
);
623 /* Visit PHI node PHI. If all the arguments produce the same value,
624 set it to be the value of the LHS of PHI. */
626 static enum ssa_prop_result
627 copy_prop_visit_phi_node (gimple phi
)
629 enum ssa_prop_result retval
;
631 prop_value_t phi_val
= { 0, NULL_TREE
};
633 tree lhs
= gimple_phi_result (phi
);
635 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
637 fprintf (dump_file
, "\nVisiting PHI node: ");
638 print_gimple_stmt (dump_file
, phi
, 0, dump_flags
);
639 fprintf (dump_file
, "\n\n");
642 for (i
= 0; i
< gimple_phi_num_args (phi
); i
++)
644 prop_value_t
*arg_val
;
645 tree arg
= gimple_phi_arg_def (phi
, i
);
646 edge e
= gimple_phi_arg_edge (phi
, i
);
648 /* We don't care about values flowing through non-executable
650 if (!(e
->flags
& EDGE_EXECUTABLE
))
653 /* Constants in the argument list never generate a useful copy.
654 Similarly, names that flow through abnormal edges cannot be
655 used to derive copies. */
656 if (TREE_CODE (arg
) != SSA_NAME
|| SSA_NAME_OCCURS_IN_ABNORMAL_PHI (arg
))
662 /* Avoid copy propagation from an inner into an outer loop.
663 Otherwise, this may move loop variant variables outside of
664 their loops and prevent coalescing opportunities. If the
665 value was loop invariant, it will be hoisted by LICM and
666 exposed for copy propagation. Not a problem for virtual
668 if (is_gimple_reg (lhs
)
669 && loop_depth_of_name (arg
) > loop_depth_of_name (lhs
))
675 /* If the LHS appears in the argument list, ignore it. It is
676 irrelevant as a copy. */
677 if (arg
== lhs
|| get_last_copy_of (arg
) == lhs
)
680 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
682 fprintf (dump_file
, "\tArgument #%d: ", i
);
683 dump_copy_of (dump_file
, arg
);
684 fprintf (dump_file
, "\n");
687 arg_val
= get_copy_of_val (arg
);
689 /* If the LHS didn't have a value yet, make it a copy of the
690 first argument we find. Notice that while we make the LHS be
691 a copy of the argument itself, we take the memory reference
692 from the argument's value so that we can compare it to the
693 memory reference of all the other arguments. */
694 if (phi_val
.value
== NULL_TREE
)
696 phi_val
.value
= arg_val
->value
? arg_val
->value
: arg
;
700 /* If PHI_VAL and ARG don't have a common copy-of chain, then
701 this PHI node cannot be a copy operation. Also, if we are
702 copy propagating stores and these two arguments came from
703 different memory references, they cannot be considered
705 if (get_last_copy_of (phi_val
.value
) != get_last_copy_of (arg
))
712 if (phi_val
.value
&& may_propagate_copy (lhs
, phi_val
.value
)
713 && set_copy_of_val (lhs
, phi_val
.value
))
714 retval
= (phi_val
.value
!= lhs
) ? SSA_PROP_INTERESTING
: SSA_PROP_VARYING
;
716 retval
= SSA_PROP_NOT_INTERESTING
;
718 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
720 fprintf (dump_file
, "\nPHI node ");
721 dump_copy_of (dump_file
, lhs
);
722 fprintf (dump_file
, "\nTelling the propagator to ");
723 if (retval
== SSA_PROP_INTERESTING
)
724 fprintf (dump_file
, "add SSA edges out of this PHI and continue.");
725 else if (retval
== SSA_PROP_VARYING
)
726 fprintf (dump_file
, "add SSA edges out of this PHI and never visit again.");
728 fprintf (dump_file
, "do nothing with SSA edges and keep iterating.");
729 fprintf (dump_file
, "\n\n");
736 /* Initialize structures used for copy propagation. PHIS_ONLY is true
737 if we should only consider PHI nodes as generating copy propagation
741 init_copy_prop (void)
745 copy_of
= XCNEWVEC (prop_value_t
, num_ssa_names
);
747 cached_last_copy_of
= XCNEWVEC (tree
, num_ssa_names
);
751 gimple_stmt_iterator si
;
752 int depth
= bb
->loop_depth
;
753 bool loop_exit_p
= false;
755 for (si
= gsi_start_bb (bb
); !gsi_end_p (si
); gsi_next (&si
))
757 gimple stmt
= gsi_stmt (si
);
761 /* The only statements that we care about are those that may
762 generate useful copies. We also need to mark conditional
763 jumps so that their outgoing edges are added to the work
764 lists of the propagator.
766 Avoid copy propagation from an inner into an outer loop.
767 Otherwise, this may move loop variant variables outside of
768 their loops and prevent coalescing opportunities. If the
769 value was loop invariant, it will be hoisted by LICM and
770 exposed for copy propagation. */
771 if (stmt_ends_bb_p (stmt
))
772 prop_set_simulate_again (stmt
, true);
773 else if (stmt_may_generate_copy (stmt
)
774 /* Since we are iterating over the statements in
775 BB, not the phi nodes, STMT will always be an
777 && loop_depth_of_name (gimple_assign_rhs1 (stmt
)) <= depth
)
778 prop_set_simulate_again (stmt
, true);
780 prop_set_simulate_again (stmt
, false);
782 /* Mark all the outputs of this statement as not being
783 the copy of anything. */
784 FOR_EACH_SSA_TREE_OPERAND (def
, stmt
, iter
, SSA_OP_ALL_DEFS
)
785 if (!prop_simulate_again_p (stmt
))
786 set_copy_of_val (def
, def
);
788 cached_last_copy_of
[SSA_NAME_VERSION (def
)] = def
;
791 /* In loop-closed SSA form do not copy-propagate through
792 PHI nodes in blocks with a loop exit edge predecessor. */
794 && loops_state_satisfies_p (LOOP_CLOSED_SSA
))
798 FOR_EACH_EDGE (e
, ei
, bb
->preds
)
799 if (loop_exit_edge_p (e
->src
->loop_father
, e
))
803 for (si
= gsi_start_phis (bb
); !gsi_end_p (si
); gsi_next (&si
))
805 gimple phi
= gsi_stmt (si
);
808 def
= gimple_phi_result (phi
);
809 if (!is_gimple_reg (def
)
811 prop_set_simulate_again (phi
, false);
813 prop_set_simulate_again (phi
, true);
815 if (!prop_simulate_again_p (phi
))
816 set_copy_of_val (def
, def
);
818 cached_last_copy_of
[SSA_NAME_VERSION (def
)] = def
;
824 /* Deallocate memory used in copy propagation and do final
828 fini_copy_prop (void)
833 /* Set the final copy-of value for each variable by traversing the
835 tmp
= XCNEWVEC (prop_value_t
, num_ssa_names
);
836 for (i
= 1; i
< num_ssa_names
; i
++)
838 tree var
= ssa_name (i
);
841 || copy_of
[i
].value
== var
)
844 tmp
[i
].value
= get_last_copy_of (var
);
846 /* In theory the points-to solution of all members of the
847 copy chain is their intersection. For now we do not bother
848 to compute this but only make sure we do not lose points-to
849 information completely by setting the points-to solution
850 of the representative to the first solution we find if
851 it doesn't have one already. */
852 if (tmp
[i
].value
!= var
853 && POINTER_TYPE_P (TREE_TYPE (var
))
854 && SSA_NAME_PTR_INFO (var
)
855 && !SSA_NAME_PTR_INFO (tmp
[i
].value
))
856 duplicate_ssa_name_ptr_info (tmp
[i
].value
, SSA_NAME_PTR_INFO (var
));
859 substitute_and_fold (tmp
, NULL
);
861 free (cached_last_copy_of
);
867 /* Main entry point to the copy propagator.
869 PHIS_ONLY is true if we should only consider PHI nodes as generating
870 copy propagation opportunities.
872 The algorithm propagates the value COPY-OF using ssa_propagate. For
873 every variable X_i, COPY-OF(X_i) indicates which variable is X_i created
874 from. The following example shows how the algorithm proceeds at a
878 2 a_2 = PHI <a_24, x_1>
880 4 x_1 = PHI <x_298, a_5, a_2>
882 The end result should be that a_2, a_5, a_24 and x_1 are a copy of
883 x_298. Propagation proceeds as follows.
885 Visit #1: a_24 is copy-of x_1. Value changed.
886 Visit #2: a_2 is copy-of x_1. Value changed.
887 Visit #3: a_5 is copy-of x_1. Value changed.
888 Visit #4: x_1 is copy-of x_298. Value changed.
889 Visit #1: a_24 is copy-of x_298. Value changed.
890 Visit #2: a_2 is copy-of x_298. Value changed.
891 Visit #3: a_5 is copy-of x_298. Value changed.
892 Visit #4: x_1 is copy-of x_298. Stable state reached.
894 When visiting PHI nodes, we only consider arguments that flow
895 through edges marked executable by the propagation engine. So,
896 when visiting statement #2 for the first time, we will only look at
897 the first argument (a_24) and optimistically assume that its value
898 is the copy of a_24 (x_1).
900 The problem with this approach is that it may fail to discover copy
901 relations in PHI cycles. Instead of propagating copy-of
902 values, we actually propagate copy-of chains. For instance:
909 In this code fragment, COPY-OF (X_i) = { D_4, C_9, A_3, B_1 }.
910 Obviously, we are only really interested in the last value of the
911 chain, however the propagator needs to access the copy-of chain
912 when visiting PHI nodes.
914 To represent the copy-of chain, we use the array COPY_CHAINS, which
915 holds the first link in the copy-of chain for every variable.
916 If variable X_i is a copy of X_j, which in turn is a copy of X_k,
917 the array will contain:
923 Keeping copy-of chains instead of copy-of values directly becomes
924 important when visiting PHI nodes. Suppose that we had the
925 following PHI cycle, such that x_52 is already considered a copy of
928 1 x_54 = PHI <x_53, x_52>
929 2 x_53 = PHI <x_898, x_54>
931 Visit #1: x_54 is copy-of x_53 (because x_52 is copy-of x_53)
932 Visit #2: x_53 is copy-of x_898 (because x_54 is a copy of x_53,
933 so it is considered irrelevant
935 Visit #1: x_54 is copy-of nothing (x_53 is a copy-of x_898 and
936 x_52 is a copy of x_53, so
938 Visit #2: x_53 is copy-of nothing
940 This problem is avoided by keeping a chain of copies, instead of
941 the final copy-of value. Propagation will now only keep the first
942 element of a variable's copy-of chain. When visiting PHI nodes,
943 arguments are considered equal if their copy-of chains end in the
944 same variable. So, as long as their copy-of chains overlap, we
945 know that they will be a copy of the same variable, regardless of
946 which variable that may be).
948 Propagation would then proceed as follows (the notation a -> b
949 means that a is a copy-of b):
951 Visit #1: x_54 = PHI <x_53, x_52>
954 Result: x_54 -> x_53. Value changed. Add SSA edges.
956 Visit #1: x_53 = PHI <x_898, x_54>
959 Result: x_53 -> x_898. Value changed. Add SSA edges.
961 Visit #2: x_54 = PHI <x_53, x_52>
963 x_52 -> x_53 -> x_898
964 Result: x_54 -> x_898. Value changed. Add SSA edges.
966 Visit #2: x_53 = PHI <x_898, x_54>
969 Result: x_53 -> x_898. Value didn't change. Stable state
971 Once the propagator stabilizes, we end up with the desired result
972 x_53 and x_54 are both copies of x_898. */
975 execute_copy_prop (void)
978 ssa_propagate (copy_prop_visit_stmt
, copy_prop_visit_phi_node
);
984 gate_copy_prop (void)
986 return flag_tree_copy_prop
!= 0;
989 struct gimple_opt_pass pass_copy_prop
=
993 "copyprop", /* name */
994 gate_copy_prop
, /* gate */
995 execute_copy_prop
, /* execute */
998 0, /* static_pass_number */
999 TV_TREE_COPY_PROP
, /* tv_id */
1000 PROP_ssa
| PROP_cfg
, /* properties_required */
1001 0, /* properties_provided */
1002 0, /* properties_destroyed */
1003 0, /* todo_flags_start */
1008 | TODO_update_ssa
/* todo_flags_finish */