1 /* Copy propagation and SSA_NAME replacement support routines.
2 Copyright (C) 2004, 2005, 2007 Free Software Foundation, Inc.
4 This file is part of GCC.
6 GCC is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3, or (at your option)
11 GCC is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3. If not see
18 <http://www.gnu.org/licenses/>. */
22 #include "coretypes.h"
29 #include "basic-block.h"
33 #include "diagnostic.h"
35 #include "tree-dump.h"
36 #include "tree-flow.h"
37 #include "tree-pass.h"
38 #include "tree-ssa-propagate.h"
39 #include "langhooks.h"
41 /* This file implements the copy propagation pass and provides a
42 handful of interfaces for performing const/copy propagation and
43 simple expression replacement which keep variable annotations
46 We require that for any copy operation where the RHS and LHS have
47 a non-null memory tag the memory tag be the same. It is OK
48 for one or both of the memory tags to be NULL.
50 We also require tracking if a variable is dereferenced in a load or
53 We enforce these requirements by having all copy propagation and
54 replacements of one SSA_NAME with a different SSA_NAME to use the
55 APIs defined in this file. */
57 /* Return true if we may propagate ORIG into DEST, false otherwise. */
60 may_propagate_copy (tree dest
, tree orig
)
62 tree type_d
= TREE_TYPE (dest
);
63 tree type_o
= TREE_TYPE (orig
);
65 /* For memory partitions, copies are OK as long as the memory symbol
66 belongs to the partition. */
67 if (TREE_CODE (dest
) == SSA_NAME
68 && TREE_CODE (SSA_NAME_VAR (dest
)) == MEMORY_PARTITION_TAG
)
69 return (TREE_CODE (orig
) == SSA_NAME
70 && !is_gimple_reg (orig
)
71 && (SSA_NAME_VAR (dest
) == SSA_NAME_VAR (orig
)
72 || bitmap_bit_p (MPT_SYMBOLS (SSA_NAME_VAR (dest
)),
73 DECL_UID (SSA_NAME_VAR (orig
)))));
75 if (TREE_CODE (orig
) == SSA_NAME
76 && TREE_CODE (SSA_NAME_VAR (orig
)) == MEMORY_PARTITION_TAG
)
77 return (TREE_CODE (dest
) == SSA_NAME
78 && !is_gimple_reg (dest
)
79 && (SSA_NAME_VAR (dest
) == SSA_NAME_VAR (orig
)
80 || bitmap_bit_p (MPT_SYMBOLS (SSA_NAME_VAR (orig
)),
81 DECL_UID (SSA_NAME_VAR (dest
)))));
83 /* Do not copy between types for which we *do* need a conversion. */
84 if (!useless_type_conversion_p (type_d
, type_o
))
87 /* FIXME. GIMPLE is allowing pointer assignments and comparisons of
88 pointers that have different alias sets. This means that these
89 pointers will have different memory tags associated to them.
91 If we allow copy propagation in these cases, statements de-referencing
92 the new pointer will now have a reference to a different memory tag
93 with potentially incorrect SSA information.
95 This was showing up in libjava/java/util/zip/ZipFile.java with code
98 struct java.io.BufferedInputStream *T.660;
99 struct java.io.BufferedInputStream *T.647;
100 struct java.io.InputStream *is;
101 struct java.io.InputStream *is.662;
104 is = T.660; <-- This ought to be type-casted
107 Also, f/name.c exposed a similar problem with a COND_EXPR predicate
108 that was causing DOM to generate and equivalence with two pointers of
109 alias-incompatible types:
111 struct _ffename_space *n;
120 I think that GIMPLE should emit the appropriate type-casts. For the
121 time being, blocking copy-propagation in these cases is the safe thing
123 if (TREE_CODE (dest
) == SSA_NAME
124 && TREE_CODE (orig
) == SSA_NAME
125 && POINTER_TYPE_P (type_d
)
126 && POINTER_TYPE_P (type_o
))
128 tree mt_dest
= symbol_mem_tag (SSA_NAME_VAR (dest
));
129 tree mt_orig
= symbol_mem_tag (SSA_NAME_VAR (orig
));
130 if (mt_dest
&& mt_orig
&& mt_dest
!= mt_orig
)
132 else if (!useless_type_conversion_p (type_d
, type_o
))
134 else if (get_alias_set (TREE_TYPE (type_d
)) !=
135 get_alias_set (TREE_TYPE (type_o
)))
138 /* Also verify flow-sensitive information is compatible. */
139 if (SSA_NAME_PTR_INFO (orig
) && SSA_NAME_PTR_INFO (dest
))
141 struct ptr_info_def
*orig_ptr_info
= SSA_NAME_PTR_INFO (orig
);
142 struct ptr_info_def
*dest_ptr_info
= SSA_NAME_PTR_INFO (dest
);
144 if (orig_ptr_info
->name_mem_tag
145 && dest_ptr_info
->name_mem_tag
146 && orig_ptr_info
->pt_vars
147 && dest_ptr_info
->pt_vars
148 && !bitmap_intersect_p (dest_ptr_info
->pt_vars
,
149 orig_ptr_info
->pt_vars
))
154 /* If the destination is a SSA_NAME for a virtual operand, then we have
155 some special cases to handle. */
156 if (TREE_CODE (dest
) == SSA_NAME
&& !is_gimple_reg (dest
))
158 /* If both operands are SSA_NAMEs referring to virtual operands, then
159 we can always propagate. */
160 if (TREE_CODE (orig
) == SSA_NAME
161 && !is_gimple_reg (orig
))
164 /* We have a "copy" from something like a constant into a virtual
165 operand. Reject these. */
169 /* If ORIG flows in from an abnormal edge, it cannot be propagated. */
170 if (TREE_CODE (orig
) == SSA_NAME
171 && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (orig
))
174 /* If DEST is an SSA_NAME that flows from an abnormal edge, then it
175 cannot be replaced. */
176 if (TREE_CODE (dest
) == SSA_NAME
177 && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (dest
))
180 /* Anything else is OK. */
184 /* Similarly, but we know that we're propagating into an ASM_EXPR. */
187 may_propagate_copy_into_asm (tree dest
)
189 /* Hard register operands of asms are special. Do not bypass. */
190 return !(TREE_CODE (dest
) == SSA_NAME
191 && TREE_CODE (SSA_NAME_VAR (dest
)) == VAR_DECL
192 && DECL_HARD_REGISTER (SSA_NAME_VAR (dest
)));
196 /* Given two SSA_NAMEs pointers ORIG and NEW such that we are copy
197 propagating NEW into ORIG, consolidate aliasing information so that
198 they both share the same memory tags. */
201 merge_alias_info (tree orig_name
, tree new_name
)
203 tree new_sym
= SSA_NAME_VAR (new_name
);
204 tree orig_sym
= SSA_NAME_VAR (orig_name
);
205 var_ann_t new_ann
= var_ann (new_sym
);
206 var_ann_t orig_ann
= var_ann (orig_sym
);
208 /* No merging necessary when memory partitions are involved. */
209 if (factoring_name_p (new_name
))
211 gcc_assert (!is_gimple_reg (orig_sym
));
214 else if (factoring_name_p (orig_name
))
216 gcc_assert (!is_gimple_reg (new_sym
));
220 gcc_assert (POINTER_TYPE_P (TREE_TYPE (orig_name
)));
221 gcc_assert (POINTER_TYPE_P (TREE_TYPE (new_name
)));
223 #if defined ENABLE_CHECKING
224 gcc_assert (useless_type_conversion_p (TREE_TYPE (orig_name
),
225 TREE_TYPE (new_name
)));
227 /* If the pointed-to alias sets are different, these two pointers
228 would never have the same memory tag. In this case, NEW should
229 not have been propagated into ORIG. */
230 gcc_assert (get_alias_set (TREE_TYPE (TREE_TYPE (new_sym
)))
231 == get_alias_set (TREE_TYPE (TREE_TYPE (orig_sym
))));
234 /* Synchronize the symbol tags. If both pointers had a tag and they
235 are different, then something has gone wrong. Symbol tags can
236 always be merged because they are flow insensitive, all the SSA
237 names of the same base DECL share the same symbol tag. */
238 if (new_ann
->symbol_mem_tag
== NULL_TREE
)
239 new_ann
->symbol_mem_tag
= orig_ann
->symbol_mem_tag
;
240 else if (orig_ann
->symbol_mem_tag
== NULL_TREE
)
241 orig_ann
->symbol_mem_tag
= new_ann
->symbol_mem_tag
;
243 gcc_assert (new_ann
->symbol_mem_tag
== orig_ann
->symbol_mem_tag
);
245 /* Check that flow-sensitive information is compatible. Notice that
246 we may not merge flow-sensitive information here. This function
247 is called when propagating equivalences dictated by the IL, like
248 a copy operation P_i = Q_j, and from equivalences dictated by
249 control-flow, like if (P_i == Q_j).
251 In the former case, P_i and Q_j are equivalent in every block
252 dominated by the assignment, so their flow-sensitive information
253 is always the same. However, in the latter case, the pointers
254 P_i and Q_j are only equivalent in one of the sub-graphs out of
255 the predicate, so their flow-sensitive information is not the
256 same in every block dominated by the predicate.
258 Since we cannot distinguish one case from another in this
259 function, we can only make sure that if P_i and Q_j have
260 flow-sensitive information, they should be compatible. */
261 if (SSA_NAME_PTR_INFO (orig_name
) && SSA_NAME_PTR_INFO (new_name
))
263 struct ptr_info_def
*orig_ptr_info
= SSA_NAME_PTR_INFO (orig_name
);
264 struct ptr_info_def
*new_ptr_info
= SSA_NAME_PTR_INFO (new_name
);
266 /* Note that pointer NEW and ORIG may actually have different
267 pointed-to variables (e.g., PR 18291 represented in
268 testsuite/gcc.c-torture/compile/pr18291.c). However, since
269 NEW is being copy-propagated into ORIG, it must always be
270 true that the pointed-to set for pointer NEW is the same, or
271 a subset, of the pointed-to set for pointer ORIG. If this
272 isn't the case, we shouldn't have been able to do the
273 propagation of NEW into ORIG. */
274 if (orig_ptr_info
->name_mem_tag
275 && new_ptr_info
->name_mem_tag
276 && orig_ptr_info
->pt_vars
277 && new_ptr_info
->pt_vars
)
278 gcc_assert (bitmap_intersect_p (new_ptr_info
->pt_vars
,
279 orig_ptr_info
->pt_vars
));
284 /* Common code for propagate_value and replace_exp.
286 Replace use operand OP_P with VAL. FOR_PROPAGATION indicates if the
287 replacement is done to propagate a value or not. */
290 replace_exp_1 (use_operand_p op_p
, tree val
,
291 bool for_propagation ATTRIBUTE_UNUSED
)
293 tree op
= USE_FROM_PTR (op_p
);
295 #if defined ENABLE_CHECKING
296 gcc_assert (!(for_propagation
297 && TREE_CODE (op
) == SSA_NAME
298 && TREE_CODE (val
) == SSA_NAME
299 && !may_propagate_copy (op
, val
)));
302 if (TREE_CODE (val
) == SSA_NAME
)
304 if (TREE_CODE (op
) == SSA_NAME
&& POINTER_TYPE_P (TREE_TYPE (op
)))
305 merge_alias_info (op
, val
);
309 SET_USE (op_p
, unsave_expr_now (val
));
313 /* Propagate the value VAL (assumed to be a constant or another SSA_NAME)
314 into the operand pointed to by OP_P.
316 Use this version for const/copy propagation as it will perform additional
317 checks to ensure validity of the const/copy propagation. */
320 propagate_value (use_operand_p op_p
, tree val
)
322 replace_exp_1 (op_p
, val
, true);
326 /* Propagate the value VAL (assumed to be a constant or another SSA_NAME)
327 into the tree pointed to by OP_P.
329 Use this version for const/copy propagation when SSA operands are not
330 available. It will perform the additional checks to ensure validity of
331 the const/copy propagation, but will not update any operand information.
332 Be sure to mark the stmt as modified. */
335 propagate_tree_value (tree
*op_p
, tree val
)
337 #if defined ENABLE_CHECKING
338 gcc_assert (!(TREE_CODE (val
) == SSA_NAME
339 && TREE_CODE (*op_p
) == SSA_NAME
340 && !may_propagate_copy (*op_p
, val
)));
343 if (TREE_CODE (val
) == SSA_NAME
)
345 if (TREE_CODE (*op_p
) == SSA_NAME
&& POINTER_TYPE_P (TREE_TYPE (*op_p
)))
346 merge_alias_info (*op_p
, val
);
350 *op_p
= unsave_expr_now (val
);
354 /* Replace *OP_P with value VAL (assumed to be a constant or another SSA_NAME).
356 Use this version when not const/copy propagating values. For example,
357 PRE uses this version when building expressions as they would appear
358 in specific blocks taking into account actions of PHI nodes. */
361 replace_exp (use_operand_p op_p
, tree val
)
363 replace_exp_1 (op_p
, val
, false);
367 /*---------------------------------------------------------------------------
369 ---------------------------------------------------------------------------*/
370 /* During propagation, we keep chains of variables that are copies of
371 one another. If variable X_i is a copy of X_j and X_j is a copy of
372 X_k, COPY_OF will contain:
374 COPY_OF[i].VALUE = X_j
375 COPY_OF[j].VALUE = X_k
376 COPY_OF[k].VALUE = X_k
378 After propagation, the copy-of value for each variable X_i is
379 converted into the final value by walking the copy-of chains and
380 updating COPY_OF[i].VALUE to be the last element of the chain. */
381 static prop_value_t
*copy_of
;
383 /* Used in set_copy_of_val to determine if the last link of a copy-of
384 chain has changed. */
385 static tree
*cached_last_copy_of
;
387 /* True if we are doing copy propagation on loads and stores. */
388 static bool do_store_copy_prop
;
391 /* Return true if this statement may generate a useful copy. */
394 stmt_may_generate_copy (tree stmt
)
399 if (TREE_CODE (stmt
) == PHI_NODE
)
400 return !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (PHI_RESULT (stmt
));
402 if (TREE_CODE (stmt
) != GIMPLE_MODIFY_STMT
)
405 lhs
= GIMPLE_STMT_OPERAND (stmt
, 0);
406 rhs
= GIMPLE_STMT_OPERAND (stmt
, 1);
407 ann
= stmt_ann (stmt
);
409 /* If the statement has volatile operands, it won't generate a
411 if (ann
->has_volatile_ops
)
414 /* If we are not doing store copy-prop, statements with loads and/or
415 stores will never generate a useful copy. */
416 if (!do_store_copy_prop
417 && !ZERO_SSA_OPERANDS (stmt
, SSA_OP_ALL_VIRTUALS
))
420 /* Otherwise, the only statements that generate useful copies are
421 assignments whose RHS is just an SSA name that doesn't flow
422 through abnormal edges. */
423 return (do_store_copy_prop
424 && TREE_CODE (lhs
) == SSA_NAME
)
425 || (TREE_CODE (rhs
) == SSA_NAME
426 && !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (rhs
));
430 /* Return the copy-of value for VAR. */
432 static inline prop_value_t
*
433 get_copy_of_val (tree var
)
435 prop_value_t
*val
= ©_of
[SSA_NAME_VERSION (var
)];
437 if (val
->value
== NULL_TREE
438 && !stmt_may_generate_copy (SSA_NAME_DEF_STMT (var
)))
440 /* If the variable will never generate a useful copy relation,
441 make it its own copy. */
443 val
->mem_ref
= NULL_TREE
;
450 /* Return last link in the copy-of chain for VAR. */
453 get_last_copy_of (tree var
)
458 /* Traverse COPY_OF starting at VAR until we get to the last
459 link in the chain. Since it is possible to have cycles in PHI
460 nodes, the copy-of chain may also contain cycles.
462 To avoid infinite loops and to avoid traversing lengthy copy-of
463 chains, we artificially limit the maximum number of chains we are
466 The value 5 was taken from a compiler and runtime library
467 bootstrap and a mixture of C and C++ code from various sources.
468 More than 82% of all copy-of chains were shorter than 5 links. */
472 for (i
= 0; i
< LIMIT
; i
++)
474 tree copy
= copy_of
[SSA_NAME_VERSION (last
)].value
;
475 if (copy
== NULL_TREE
|| copy
== last
)
480 /* If we have reached the limit, then we are either in a copy-of
481 cycle or the copy-of chain is too long. In this case, just
482 return VAR so that it is not considered a copy of anything. */
483 return (i
< LIMIT
? last
: var
);
487 /* Set FIRST to be the first variable in the copy-of chain for DEST.
488 If DEST's copy-of value or its copy-of chain has changed, return
491 MEM_REF is the memory reference where FIRST is stored. This is
492 used when DEST is a non-register and we are copy propagating loads
496 set_copy_of_val (tree dest
, tree first
, tree mem_ref
)
498 unsigned int dest_ver
= SSA_NAME_VERSION (dest
);
499 tree old_first
, old_last
, new_last
;
501 /* Set FIRST to be the first link in COPY_OF[DEST]. If that
502 changed, return true. */
503 old_first
= copy_of
[dest_ver
].value
;
504 copy_of
[dest_ver
].value
= first
;
505 copy_of
[dest_ver
].mem_ref
= mem_ref
;
507 if (old_first
!= first
)
510 /* If FIRST and OLD_FIRST are the same, we need to check whether the
511 copy-of chain starting at FIRST ends in a different variable. If
512 the copy-of chain starting at FIRST ends up in a different
513 variable than the last cached value we had for DEST, then return
514 true because DEST is now a copy of a different variable.
516 This test is necessary because even though the first link in the
517 copy-of chain may not have changed, if any of the variables in
518 the copy-of chain changed its final value, DEST will now be the
519 copy of a different variable, so we have to do another round of
520 propagation for everything that depends on DEST. */
521 old_last
= cached_last_copy_of
[dest_ver
];
522 new_last
= get_last_copy_of (dest
);
523 cached_last_copy_of
[dest_ver
] = new_last
;
525 return (old_last
!= new_last
);
529 /* Dump the copy-of value for variable VAR to FILE. */
532 dump_copy_of (FILE *file
, tree var
)
537 print_generic_expr (file
, var
, dump_flags
);
539 if (TREE_CODE (var
) != SSA_NAME
)
542 visited
= sbitmap_alloc (num_ssa_names
);
543 sbitmap_zero (visited
);
544 SET_BIT (visited
, SSA_NAME_VERSION (var
));
546 fprintf (file
, " copy-of chain: ");
549 print_generic_expr (file
, val
, 0);
551 while (copy_of
[SSA_NAME_VERSION (val
)].value
)
553 fprintf (file
, "-> ");
554 val
= copy_of
[SSA_NAME_VERSION (val
)].value
;
555 print_generic_expr (file
, val
, 0);
557 if (TEST_BIT (visited
, SSA_NAME_VERSION (val
)))
559 SET_BIT (visited
, SSA_NAME_VERSION (val
));
562 val
= get_copy_of_val (var
)->value
;
563 if (val
== NULL_TREE
)
564 fprintf (file
, "[UNDEFINED]");
566 fprintf (file
, "[COPY]");
568 fprintf (file
, "[NOT A COPY]");
570 sbitmap_free (visited
);
574 /* Evaluate the RHS of STMT. If it produces a valid copy, set the LHS
575 value and store the LHS into *RESULT_P. If STMT generates more
576 than one name (i.e., STMT is an aliased store), it is enough to
577 store the first name in the VDEF list into *RESULT_P. After
578 all, the names generated will be VUSEd in the same statements. */
580 static enum ssa_prop_result
581 copy_prop_visit_assignment (tree stmt
, tree
*result_p
)
584 prop_value_t
*rhs_val
;
586 lhs
= GIMPLE_STMT_OPERAND (stmt
, 0);
587 rhs
= GIMPLE_STMT_OPERAND (stmt
, 1);
589 gcc_assert (TREE_CODE (rhs
) == SSA_NAME
);
591 rhs_val
= get_copy_of_val (rhs
);
593 if (TREE_CODE (lhs
) == SSA_NAME
)
595 /* Straight copy between two SSA names. First, make sure that
596 we can propagate the RHS into uses of LHS. */
597 if (!may_propagate_copy (lhs
, rhs
))
598 return SSA_PROP_VARYING
;
600 /* Notice that in the case of assignments, we make the LHS be a
601 copy of RHS's value, not of RHS itself. This avoids keeping
602 unnecessary copy-of chains (assignments cannot be in a cycle
603 like PHI nodes), speeding up the propagation process.
604 This is different from what we do in copy_prop_visit_phi_node.
605 In those cases, we are interested in the copy-of chains. */
607 if (set_copy_of_val (*result_p
, rhs_val
->value
, rhs_val
->mem_ref
))
608 return SSA_PROP_INTERESTING
;
610 return SSA_PROP_NOT_INTERESTING
;
612 else if (stmt_makes_single_store (stmt
))
614 /* Otherwise, set the names in VDEF operands to be a copy
620 /* This should only be executed when doing store copy-prop. */
621 gcc_assert (do_store_copy_prop
);
623 /* Set the value of every VDEF to RHS_VAL. */
625 FOR_EACH_SSA_TREE_OPERAND (vdef
, stmt
, i
, SSA_OP_VIRTUAL_DEFS
)
626 changed
|= set_copy_of_val (vdef
, rhs_val
->value
, lhs
);
628 /* Note that for propagation purposes, we are only interested in
629 visiting statements that load the exact same memory reference
630 stored here. Those statements will have the exact same list
631 of virtual uses, so it is enough to set the output of this
632 statement to be its first virtual definition. */
633 *result_p
= first_vdef (stmt
);
636 return SSA_PROP_INTERESTING
;
638 return SSA_PROP_NOT_INTERESTING
;
642 return SSA_PROP_VARYING
;
646 /* Visit the COND_EXPR STMT. Return SSA_PROP_INTERESTING
647 if it can determine which edge will be taken. Otherwise, return
650 static enum ssa_prop_result
651 copy_prop_visit_cond_stmt (tree stmt
, edge
*taken_edge_p
)
653 enum ssa_prop_result retval
;
656 cond
= COND_EXPR_COND (stmt
);
657 retval
= SSA_PROP_VARYING
;
659 /* The only conditionals that we may be able to compute statically
660 are predicates involving two SSA_NAMEs. */
661 if (COMPARISON_CLASS_P (cond
)
662 && TREE_CODE (TREE_OPERAND (cond
, 0)) == SSA_NAME
663 && TREE_CODE (TREE_OPERAND (cond
, 1)) == SSA_NAME
)
665 tree op0
= get_last_copy_of (TREE_OPERAND (cond
, 0));
666 tree op1
= get_last_copy_of (TREE_OPERAND (cond
, 1));
668 /* See if we can determine the predicate's value. */
669 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
671 fprintf (dump_file
, "Trying to determine truth value of ");
672 fprintf (dump_file
, "predicate ");
673 print_generic_stmt (dump_file
, cond
, 0);
676 /* We can fold COND and get a useful result only when we have
677 the same SSA_NAME on both sides of a comparison operator. */
680 tree folded_cond
= fold_binary (TREE_CODE (cond
), boolean_type_node
,
684 basic_block bb
= bb_for_stmt (stmt
);
685 *taken_edge_p
= find_taken_edge (bb
, folded_cond
);
687 retval
= SSA_PROP_INTERESTING
;
692 if (dump_file
&& (dump_flags
& TDF_DETAILS
) && *taken_edge_p
)
693 fprintf (dump_file
, "\nConditional will always take edge %d->%d\n",
694 (*taken_edge_p
)->src
->index
, (*taken_edge_p
)->dest
->index
);
700 /* Evaluate statement STMT. If the statement produces a new output
701 value, return SSA_PROP_INTERESTING and store the SSA_NAME holding
702 the new value in *RESULT_P.
704 If STMT is a conditional branch and we can determine its truth
705 value, set *TAKEN_EDGE_P accordingly.
707 If the new value produced by STMT is varying, return
710 static enum ssa_prop_result
711 copy_prop_visit_stmt (tree stmt
, edge
*taken_edge_p
, tree
*result_p
)
713 enum ssa_prop_result retval
;
715 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
717 fprintf (dump_file
, "\nVisiting statement:\n");
718 print_generic_stmt (dump_file
, stmt
, dump_flags
);
719 fprintf (dump_file
, "\n");
722 if (TREE_CODE (stmt
) == GIMPLE_MODIFY_STMT
723 && TREE_CODE (GIMPLE_STMT_OPERAND (stmt
, 1)) == SSA_NAME
724 && (do_store_copy_prop
725 || TREE_CODE (GIMPLE_STMT_OPERAND (stmt
, 0)) == SSA_NAME
))
727 /* If the statement is a copy assignment, evaluate its RHS to
728 see if the lattice value of its output has changed. */
729 retval
= copy_prop_visit_assignment (stmt
, result_p
);
731 else if (TREE_CODE (stmt
) == GIMPLE_MODIFY_STMT
732 && TREE_CODE (GIMPLE_STMT_OPERAND (stmt
, 0)) == SSA_NAME
733 && do_store_copy_prop
734 && stmt_makes_single_load (stmt
))
736 /* If the statement is a copy assignment with a memory load
737 on the RHS, see if we know the value of this load and
738 update the lattice accordingly. */
739 prop_value_t
*val
= get_value_loaded_by (stmt
, copy_of
);
742 && is_gimple_reg (val
->value
)
743 && operand_equal_p (val
->mem_ref
, GIMPLE_STMT_OPERAND (stmt
, 1), 0))
746 changed
= set_copy_of_val (GIMPLE_STMT_OPERAND (stmt
, 0),
747 val
->value
, val
->mem_ref
);
750 *result_p
= GIMPLE_STMT_OPERAND (stmt
, 0);
751 retval
= SSA_PROP_INTERESTING
;
754 retval
= SSA_PROP_NOT_INTERESTING
;
757 retval
= SSA_PROP_VARYING
;
759 else if (TREE_CODE (stmt
) == COND_EXPR
)
761 /* See if we can determine which edge goes out of a conditional
763 retval
= copy_prop_visit_cond_stmt (stmt
, taken_edge_p
);
766 retval
= SSA_PROP_VARYING
;
768 if (retval
== SSA_PROP_VARYING
)
773 /* Any other kind of statement is not interesting for constant
774 propagation and, therefore, not worth simulating. */
775 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
776 fprintf (dump_file
, "No interesting values produced.\n");
778 /* The assignment is not a copy operation. Don't visit this
779 statement again and mark all the definitions in the statement
780 to be copies of nothing. */
781 FOR_EACH_SSA_TREE_OPERAND (def
, stmt
, i
, SSA_OP_ALL_DEFS
)
782 set_copy_of_val (def
, def
, NULL_TREE
);
789 /* Visit PHI node PHI. If all the arguments produce the same value,
790 set it to be the value of the LHS of PHI. */
792 static enum ssa_prop_result
793 copy_prop_visit_phi_node (tree phi
)
795 enum ssa_prop_result retval
;
798 prop_value_t phi_val
= { 0, NULL_TREE
, NULL_TREE
};
800 lhs
= PHI_RESULT (phi
);
802 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
804 fprintf (dump_file
, "\nVisiting PHI node: ");
805 print_generic_expr (dump_file
, phi
, dump_flags
);
806 fprintf (dump_file
, "\n\n");
809 for (i
= 0; i
< PHI_NUM_ARGS (phi
); i
++)
811 prop_value_t
*arg_val
;
812 tree arg
= PHI_ARG_DEF (phi
, i
);
813 edge e
= PHI_ARG_EDGE (phi
, i
);
815 /* We don't care about values flowing through non-executable
817 if (!(e
->flags
& EDGE_EXECUTABLE
))
820 /* Constants in the argument list never generate a useful copy.
821 Similarly, names that flow through abnormal edges cannot be
822 used to derive copies. */
823 if (TREE_CODE (arg
) != SSA_NAME
|| SSA_NAME_OCCURS_IN_ABNORMAL_PHI (arg
))
829 /* Avoid copy propagation from an inner into an outer loop.
830 Otherwise, this may move loop variant variables outside of
831 their loops and prevent coalescing opportunities. If the
832 value was loop invariant, it will be hoisted by LICM and
833 exposed for copy propagation. */
834 if (loop_depth_of_name (arg
) > loop_depth_of_name (lhs
))
840 /* If the LHS appears in the argument list, ignore it. It is
841 irrelevant as a copy. */
842 if (arg
== lhs
|| get_last_copy_of (arg
) == lhs
)
845 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
847 fprintf (dump_file
, "\tArgument #%d: ", i
);
848 dump_copy_of (dump_file
, arg
);
849 fprintf (dump_file
, "\n");
852 arg_val
= get_copy_of_val (arg
);
854 /* If the LHS didn't have a value yet, make it a copy of the
855 first argument we find. Notice that while we make the LHS be
856 a copy of the argument itself, we take the memory reference
857 from the argument's value so that we can compare it to the
858 memory reference of all the other arguments. */
859 if (phi_val
.value
== NULL_TREE
)
862 phi_val
.mem_ref
= arg_val
->mem_ref
;
866 /* If PHI_VAL and ARG don't have a common copy-of chain, then
867 this PHI node cannot be a copy operation. Also, if we are
868 copy propagating stores and these two arguments came from
869 different memory references, they cannot be considered
871 if (get_last_copy_of (phi_val
.value
) != get_last_copy_of (arg
)
872 || (do_store_copy_prop
875 && simple_cst_equal (phi_val
.mem_ref
, arg_val
->mem_ref
) != 1))
882 if (phi_val
.value
&& set_copy_of_val (lhs
, phi_val
.value
, phi_val
.mem_ref
))
883 retval
= (phi_val
.value
!= lhs
) ? SSA_PROP_INTERESTING
: SSA_PROP_VARYING
;
885 retval
= SSA_PROP_NOT_INTERESTING
;
887 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
889 fprintf (dump_file
, "\nPHI node ");
890 dump_copy_of (dump_file
, lhs
);
891 fprintf (dump_file
, "\nTelling the propagator to ");
892 if (retval
== SSA_PROP_INTERESTING
)
893 fprintf (dump_file
, "add SSA edges out of this PHI and continue.");
894 else if (retval
== SSA_PROP_VARYING
)
895 fprintf (dump_file
, "add SSA edges out of this PHI and never visit again.");
897 fprintf (dump_file
, "do nothing with SSA edges and keep iterating.");
898 fprintf (dump_file
, "\n\n");
905 /* Initialize structures used for copy propagation. PHIS_ONLY is true
906 if we should only consider PHI nodes as generating copy propagation
910 init_copy_prop (void)
914 copy_of
= XCNEWVEC (prop_value_t
, num_ssa_names
);
916 cached_last_copy_of
= XCNEWVEC (tree
, num_ssa_names
);
920 block_stmt_iterator si
;
922 int depth
= bb
->loop_depth
;
924 for (si
= bsi_start (bb
); !bsi_end_p (si
); bsi_next (&si
))
926 tree stmt
= bsi_stmt (si
);
929 /* The only statements that we care about are those that may
930 generate useful copies. We also need to mark conditional
931 jumps so that their outgoing edges are added to the work
932 lists of the propagator.
934 Avoid copy propagation from an inner into an outer loop.
935 Otherwise, this may move loop variant variables outside of
936 their loops and prevent coalescing opportunities. If the
937 value was loop invariant, it will be hoisted by LICM and
938 exposed for copy propagation. */
939 if (stmt_ends_bb_p (stmt
))
940 DONT_SIMULATE_AGAIN (stmt
) = false;
941 else if (stmt_may_generate_copy (stmt
)
942 && loop_depth_of_name (GIMPLE_STMT_OPERAND (stmt
, 1)) <= depth
)
943 DONT_SIMULATE_AGAIN (stmt
) = false;
945 DONT_SIMULATE_AGAIN (stmt
) = true;
947 /* Mark all the outputs of this statement as not being
948 the copy of anything. */
949 FOR_EACH_SSA_TREE_OPERAND (def
, stmt
, iter
, SSA_OP_ALL_DEFS
)
950 if (DONT_SIMULATE_AGAIN (stmt
))
951 set_copy_of_val (def
, def
, NULL_TREE
);
953 cached_last_copy_of
[SSA_NAME_VERSION (def
)] = def
;
956 for (phi
= phi_nodes (bb
); phi
; phi
= PHI_CHAIN (phi
))
958 def
= PHI_RESULT (phi
);
959 if (!do_store_copy_prop
&& !is_gimple_reg (def
))
960 DONT_SIMULATE_AGAIN (phi
) = true;
962 DONT_SIMULATE_AGAIN (phi
) = false;
964 if (DONT_SIMULATE_AGAIN (phi
))
965 set_copy_of_val (def
, def
, NULL_TREE
);
967 cached_last_copy_of
[SSA_NAME_VERSION (def
)] = def
;
973 /* Deallocate memory used in copy propagation and do final
977 fini_copy_prop (void)
982 /* Set the final copy-of value for each variable by traversing the
984 tmp
= XCNEWVEC (prop_value_t
, num_ssa_names
);
985 for (i
= 1; i
< num_ssa_names
; i
++)
987 tree var
= ssa_name (i
);
988 if (var
&& copy_of
[i
].value
&& copy_of
[i
].value
!= var
)
989 tmp
[i
].value
= get_last_copy_of (var
);
992 substitute_and_fold (tmp
, false);
994 free (cached_last_copy_of
);
1000 /* Main entry point to the copy propagator.
1002 PHIS_ONLY is true if we should only consider PHI nodes as generating
1003 copy propagation opportunities.
1005 The algorithm propagates the value COPY-OF using ssa_propagate. For
1006 every variable X_i, COPY-OF(X_i) indicates which variable is X_i created
1007 from. The following example shows how the algorithm proceeds at a
1011 2 a_2 = PHI <a_24, x_1>
1013 4 x_1 = PHI <x_298, a_5, a_2>
1015 The end result should be that a_2, a_5, a_24 and x_1 are a copy of
1016 x_298. Propagation proceeds as follows.
1018 Visit #1: a_24 is copy-of x_1. Value changed.
1019 Visit #2: a_2 is copy-of x_1. Value changed.
1020 Visit #3: a_5 is copy-of x_1. Value changed.
1021 Visit #4: x_1 is copy-of x_298. Value changed.
1022 Visit #1: a_24 is copy-of x_298. Value changed.
1023 Visit #2: a_2 is copy-of x_298. Value changed.
1024 Visit #3: a_5 is copy-of x_298. Value changed.
1025 Visit #4: x_1 is copy-of x_298. Stable state reached.
1027 When visiting PHI nodes, we only consider arguments that flow
1028 through edges marked executable by the propagation engine. So,
1029 when visiting statement #2 for the first time, we will only look at
1030 the first argument (a_24) and optimistically assume that its value
1031 is the copy of a_24 (x_1).
1033 The problem with this approach is that it may fail to discover copy
1034 relations in PHI cycles. Instead of propagating copy-of
1035 values, we actually propagate copy-of chains. For instance:
1042 In this code fragment, COPY-OF (X_i) = { D_4, C_9, A_3, B_1 }.
1043 Obviously, we are only really interested in the last value of the
1044 chain, however the propagator needs to access the copy-of chain
1045 when visiting PHI nodes.
1047 To represent the copy-of chain, we use the array COPY_CHAINS, which
1048 holds the first link in the copy-of chain for every variable.
1049 If variable X_i is a copy of X_j, which in turn is a copy of X_k,
1050 the array will contain:
1052 COPY_CHAINS[i] = X_j
1053 COPY_CHAINS[j] = X_k
1054 COPY_CHAINS[k] = X_k
1056 Keeping copy-of chains instead of copy-of values directly becomes
1057 important when visiting PHI nodes. Suppose that we had the
1058 following PHI cycle, such that x_52 is already considered a copy of
1061 1 x_54 = PHI <x_53, x_52>
1062 2 x_53 = PHI <x_898, x_54>
1064 Visit #1: x_54 is copy-of x_53 (because x_52 is copy-of x_53)
1065 Visit #2: x_53 is copy-of x_898 (because x_54 is a copy of x_53,
1066 so it is considered irrelevant
1068 Visit #1: x_54 is copy-of nothing (x_53 is a copy-of x_898 and
1069 x_52 is a copy of x_53, so
1071 Visit #2: x_53 is copy-of nothing
1073 This problem is avoided by keeping a chain of copies, instead of
1074 the final copy-of value. Propagation will now only keep the first
1075 element of a variable's copy-of chain. When visiting PHI nodes,
1076 arguments are considered equal if their copy-of chains end in the
1077 same variable. So, as long as their copy-of chains overlap, we
1078 know that they will be a copy of the same variable, regardless of
1079 which variable that may be).
1081 Propagation would then proceed as follows (the notation a -> b
1082 means that a is a copy-of b):
1084 Visit #1: x_54 = PHI <x_53, x_52>
1087 Result: x_54 -> x_53. Value changed. Add SSA edges.
1089 Visit #1: x_53 = PHI <x_898, x_54>
1092 Result: x_53 -> x_898. Value changed. Add SSA edges.
1094 Visit #2: x_54 = PHI <x_53, x_52>
1096 x_52 -> x_53 -> x_898
1097 Result: x_54 -> x_898. Value changed. Add SSA edges.
1099 Visit #2: x_53 = PHI <x_898, x_54>
1102 Result: x_53 -> x_898. Value didn't change. Stable state
1104 Once the propagator stabilizes, we end up with the desired result
1105 x_53 and x_54 are both copies of x_898. */
1108 execute_copy_prop (bool store_copy_prop
)
1110 do_store_copy_prop
= store_copy_prop
;
1112 ssa_propagate (copy_prop_visit_stmt
, copy_prop_visit_phi_node
);
1118 gate_copy_prop (void)
1120 return flag_tree_copy_prop
!= 0;
1126 execute_copy_prop (false);
1130 struct tree_opt_pass pass_copy_prop
=
1132 "copyprop", /* name */
1133 gate_copy_prop
, /* gate */
1134 do_copy_prop
, /* execute */
1137 0, /* static_pass_number */
1138 TV_TREE_COPY_PROP
, /* tv_id */
1139 PROP_ssa
| PROP_cfg
, /* properties_required */
1140 0, /* properties_provided */
1141 0, /* properties_destroyed */
1142 0, /* todo_flags_start */
1147 | TODO_update_ssa
, /* todo_flags_finish */
1152 gate_store_copy_prop (void)
1154 /* STORE-COPY-PROP is enabled only with -ftree-store-copy-prop, but
1155 when -fno-tree-store-copy-prop is specified, we should run
1156 regular COPY-PROP. That's why the pass is enabled with either
1158 return flag_tree_store_copy_prop
!= 0 || flag_tree_copy_prop
!= 0;
1162 store_copy_prop (void)
1164 /* If STORE-COPY-PROP is not enabled, we just run regular COPY-PROP. */
1165 execute_copy_prop (flag_tree_store_copy_prop
!= 0);
1169 struct tree_opt_pass pass_store_copy_prop
=
1171 "store_copyprop", /* name */
1172 gate_store_copy_prop
, /* gate */
1173 store_copy_prop
, /* execute */
1176 0, /* static_pass_number */
1177 TV_TREE_STORE_COPY_PROP
, /* tv_id */
1178 PROP_ssa
| PROP_alias
| PROP_cfg
, /* properties_required */
1179 0, /* properties_provided */
1180 0, /* properties_destroyed */
1181 0, /* todo_flags_start */
1186 | TODO_update_ssa
, /* todo_flags_finish */