1 /* Copy propagation and SSA_NAME replacement support routines.
2 Copyright (C) 2004, 2005 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 2, 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 COPYING. If not, write to
18 the Free Software Foundation, 51 Franklin Street, Fifth Floor,
19 Boston, MA 02110-1301, USA. */
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"
42 /* This file implements the copy propagation pass and provides a
43 handful of interfaces for performing const/copy propagation and
44 simple expression replacement which keep variable annotations
47 We require that for any copy operation where the RHS and LHS have
48 a non-null memory tag the memory tag be the same. It is OK
49 for one or both of the memory tags to be NULL.
51 We also require tracking if a variable is dereferenced in a load or
54 We enforce these requirements by having all copy propagation and
55 replacements of one SSA_NAME with a different SSA_NAME to use the
56 APIs defined in this file. */
58 /* Return true if we may propagate ORIG into DEST, false otherwise. */
61 may_propagate_copy (tree dest
, tree orig
)
63 tree type_d
= TREE_TYPE (dest
);
64 tree type_o
= TREE_TYPE (orig
);
66 /* Do not copy between types for which we *do* need a conversion. */
67 if (!tree_ssa_useless_type_conversion_1 (type_d
, type_o
))
70 /* FIXME. GIMPLE is allowing pointer assignments and comparisons of
71 pointers that have different alias sets. This means that these
72 pointers will have different memory tags associated to them.
74 If we allow copy propagation in these cases, statements de-referencing
75 the new pointer will now have a reference to a different memory tag
76 with potentially incorrect SSA information.
78 This was showing up in libjava/java/util/zip/ZipFile.java with code
81 struct java.io.BufferedInputStream *T.660;
82 struct java.io.BufferedInputStream *T.647;
83 struct java.io.InputStream *is;
84 struct java.io.InputStream *is.662;
87 is = T.660; <-- This ought to be type-casted
90 Also, f/name.c exposed a similar problem with a COND_EXPR predicate
91 that was causing DOM to generate and equivalence with two pointers of
92 alias-incompatible types:
94 struct _ffename_space *n;
103 I think that GIMPLE should emit the appropriate type-casts. For the
104 time being, blocking copy-propagation in these cases is the safe thing
106 if (TREE_CODE (dest
) == SSA_NAME
107 && TREE_CODE (orig
) == SSA_NAME
108 && POINTER_TYPE_P (type_d
)
109 && POINTER_TYPE_P (type_o
))
111 tree mt_dest
= var_ann (SSA_NAME_VAR (dest
))->type_mem_tag
;
112 tree mt_orig
= var_ann (SSA_NAME_VAR (orig
))->type_mem_tag
;
113 if (mt_dest
&& mt_orig
&& mt_dest
!= mt_orig
)
115 else if (!lang_hooks
.types_compatible_p (type_d
, type_o
))
117 else if (get_alias_set (TREE_TYPE (type_d
)) !=
118 get_alias_set (TREE_TYPE (type_o
)))
121 /* Also verify flow-sensitive information is compatible. */
122 if (SSA_NAME_PTR_INFO (orig
) && SSA_NAME_PTR_INFO (dest
))
124 struct ptr_info_def
*orig_ptr_info
= SSA_NAME_PTR_INFO (orig
);
125 struct ptr_info_def
*dest_ptr_info
= SSA_NAME_PTR_INFO (dest
);
127 if (orig_ptr_info
->name_mem_tag
128 && dest_ptr_info
->name_mem_tag
129 && orig_ptr_info
->pt_vars
130 && dest_ptr_info
->pt_vars
131 && !bitmap_intersect_p (dest_ptr_info
->pt_vars
,
132 orig_ptr_info
->pt_vars
))
137 /* If the destination is a SSA_NAME for a virtual operand, then we have
138 some special cases to handle. */
139 if (TREE_CODE (dest
) == SSA_NAME
&& !is_gimple_reg (dest
))
141 /* If both operands are SSA_NAMEs referring to virtual operands, then
142 we can always propagate. */
143 if (TREE_CODE (orig
) == SSA_NAME
144 && !is_gimple_reg (orig
))
147 /* We have a "copy" from something like a constant into a virtual
148 operand. Reject these. */
152 /* If ORIG flows in from an abnormal edge, it cannot be propagated. */
153 if (TREE_CODE (orig
) == SSA_NAME
154 && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (orig
))
157 /* If DEST is an SSA_NAME that flows from an abnormal edge, then it
158 cannot be replaced. */
159 if (TREE_CODE (dest
) == SSA_NAME
160 && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (dest
))
163 /* Anything else is OK. */
167 /* Similarly, but we know that we're propagating into an ASM_EXPR. */
170 may_propagate_copy_into_asm (tree dest
)
172 /* Hard register operands of asms are special. Do not bypass. */
173 return !(TREE_CODE (dest
) == SSA_NAME
174 && TREE_CODE (SSA_NAME_VAR (dest
)) == VAR_DECL
175 && DECL_HARD_REGISTER (SSA_NAME_VAR (dest
)));
179 /* Given two SSA_NAMEs pointers ORIG and NEW such that we are copy
180 propagating NEW into ORIG, consolidate aliasing information so that
181 they both share the same memory tags. */
184 merge_alias_info (tree orig
, tree
new)
186 tree new_sym
= SSA_NAME_VAR (new);
187 tree orig_sym
= SSA_NAME_VAR (orig
);
188 var_ann_t new_ann
= var_ann (new_sym
);
189 var_ann_t orig_ann
= var_ann (orig_sym
);
191 gcc_assert (POINTER_TYPE_P (TREE_TYPE (orig
)));
192 gcc_assert (POINTER_TYPE_P (TREE_TYPE (new)));
194 #if defined ENABLE_CHECKING
195 gcc_assert (lang_hooks
.types_compatible_p (TREE_TYPE (orig
),
198 /* If the pointed-to alias sets are different, these two pointers
199 would never have the same memory tag. In this case, NEW should
200 not have been propagated into ORIG. */
201 gcc_assert (get_alias_set (TREE_TYPE (TREE_TYPE (new_sym
)))
202 == get_alias_set (TREE_TYPE (TREE_TYPE (orig_sym
))));
205 /* Synchronize the type tags. If both pointers had a tag and they
206 are different, then something has gone wrong. Type tags can
207 always be merged because they are flow insensitive, all the SSA
208 names of the same base DECL share the same type tag. */
209 if (new_ann
->type_mem_tag
== NULL_TREE
)
210 new_ann
->type_mem_tag
= orig_ann
->type_mem_tag
;
211 else if (orig_ann
->type_mem_tag
== NULL_TREE
)
212 orig_ann
->type_mem_tag
= new_ann
->type_mem_tag
;
214 gcc_assert (new_ann
->type_mem_tag
== orig_ann
->type_mem_tag
);
216 /* Check that flow-sensitive information is compatible. Notice that
217 we may not merge flow-sensitive information here. This function
218 is called when propagating equivalences dictated by the IL, like
219 a copy operation P_i = Q_j, and from equivalences dictated by
220 control-flow, like if (P_i == Q_j).
222 In the former case, P_i and Q_j are equivalent in every block
223 dominated by the assignment, so their flow-sensitive information
224 is always the same. However, in the latter case, the pointers
225 P_i and Q_j are only equivalent in one of the sub-graphs out of
226 the predicate, so their flow-sensitive information is not the
227 same in every block dominated by the predicate.
229 Since we cannot distinguish one case from another in this
230 function, we can only make sure that if P_i and Q_j have
231 flow-sensitive information, they should be compatible. */
232 if (SSA_NAME_PTR_INFO (orig
) && SSA_NAME_PTR_INFO (new))
234 struct ptr_info_def
*orig_ptr_info
= SSA_NAME_PTR_INFO (orig
);
235 struct ptr_info_def
*new_ptr_info
= SSA_NAME_PTR_INFO (new);
237 /* Note that pointer NEW and ORIG may actually have different
238 pointed-to variables (e.g., PR 18291 represented in
239 testsuite/gcc.c-torture/compile/pr18291.c). However, since
240 NEW is being copy-propagated into ORIG, it must always be
241 true that the pointed-to set for pointer NEW is the same, or
242 a subset, of the pointed-to set for pointer ORIG. If this
243 isn't the case, we shouldn't have been able to do the
244 propagation of NEW into ORIG. */
245 if (orig_ptr_info
->name_mem_tag
246 && new_ptr_info
->name_mem_tag
247 && orig_ptr_info
->pt_vars
248 && new_ptr_info
->pt_vars
)
249 gcc_assert (bitmap_intersect_p (new_ptr_info
->pt_vars
,
250 orig_ptr_info
->pt_vars
));
255 /* Common code for propagate_value and replace_exp.
257 Replace use operand OP_P with VAL. FOR_PROPAGATION indicates if the
258 replacement is done to propagate a value or not. */
261 replace_exp_1 (use_operand_p op_p
, tree val
,
262 bool for_propagation ATTRIBUTE_UNUSED
)
264 tree op
= USE_FROM_PTR (op_p
);
266 #if defined ENABLE_CHECKING
267 gcc_assert (!(for_propagation
268 && TREE_CODE (op
) == SSA_NAME
269 && TREE_CODE (val
) == SSA_NAME
270 && !may_propagate_copy (op
, val
)));
273 if (TREE_CODE (val
) == SSA_NAME
)
275 if (TREE_CODE (op
) == SSA_NAME
&& POINTER_TYPE_P (TREE_TYPE (op
)))
276 merge_alias_info (op
, val
);
280 SET_USE (op_p
, unsave_expr_now (val
));
284 /* Propagate the value VAL (assumed to be a constant or another SSA_NAME)
285 into the operand pointed to by OP_P.
287 Use this version for const/copy propagation as it will perform additional
288 checks to ensure validity of the const/copy propagation. */
291 propagate_value (use_operand_p op_p
, tree val
)
293 replace_exp_1 (op_p
, val
, true);
297 /* Propagate the value VAL (assumed to be a constant or another SSA_NAME)
298 into the tree pointed to by OP_P.
300 Use this version for const/copy propagation when SSA operands are not
301 available. It will perform the additional checks to ensure validity of
302 the const/copy propagation, but will not update any operand information.
303 Be sure to mark the stmt as modified. */
306 propagate_tree_value (tree
*op_p
, tree val
)
308 #if defined ENABLE_CHECKING
309 gcc_assert (!(TREE_CODE (val
) == SSA_NAME
310 && TREE_CODE (*op_p
) == SSA_NAME
311 && !may_propagate_copy (*op_p
, val
)));
314 if (TREE_CODE (val
) == SSA_NAME
)
316 if (TREE_CODE (*op_p
) == SSA_NAME
&& POINTER_TYPE_P (TREE_TYPE (*op_p
)))
317 merge_alias_info (*op_p
, val
);
321 *op_p
= unsave_expr_now (val
);
325 /* Replace *OP_P with value VAL (assumed to be a constant or another SSA_NAME).
327 Use this version when not const/copy propagating values. For example,
328 PRE uses this version when building expressions as they would appear
329 in specific blocks taking into account actions of PHI nodes. */
332 replace_exp (use_operand_p op_p
, tree val
)
334 replace_exp_1 (op_p
, val
, false);
338 /*---------------------------------------------------------------------------
340 ---------------------------------------------------------------------------*/
341 /* During propagation, we keep chains of variables that are copies of
342 one another. If variable X_i is a copy of X_j and X_j is a copy of
343 X_k, COPY_OF will contain:
345 COPY_OF[i].VALUE = X_j
346 COPY_OF[j].VALUE = X_k
347 COPY_OF[k].VALUE = X_k
349 After propagation, the copy-of value for each variable X_i is
350 converted into the final value by walking the copy-of chains and
351 updating COPY_OF[i].VALUE to be the last element of the chain. */
352 static prop_value_t
*copy_of
;
354 /* Used in set_copy_of_val to determine if the last link of a copy-of
355 chain has changed. */
356 static tree
*cached_last_copy_of
;
358 /* True if we are doing copy propagation on loads and stores. */
359 static bool do_store_copy_prop
;
362 /* Return true if this statement may generate a useful copy. */
365 stmt_may_generate_copy (tree stmt
)
370 if (TREE_CODE (stmt
) == PHI_NODE
)
371 return !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (PHI_RESULT (stmt
));
373 if (TREE_CODE (stmt
) != MODIFY_EXPR
)
376 lhs
= TREE_OPERAND (stmt
, 0);
377 rhs
= TREE_OPERAND (stmt
, 1);
378 ann
= stmt_ann (stmt
);
380 /* If the statement has volatile operands, it won't generate a
382 if (ann
->has_volatile_ops
)
385 /* If we are not doing store copy-prop, statements with loads and/or
386 stores will never generate a useful copy. */
387 if (!do_store_copy_prop
388 && !ZERO_SSA_OPERANDS (stmt
, SSA_OP_ALL_VIRTUALS
))
391 /* Otherwise, the only statements that generate useful copies are
392 assignments whose RHS is just an SSA name that doesn't flow
393 through abnormal edges. */
394 return TREE_CODE (rhs
) == SSA_NAME
&& !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (rhs
);
398 /* Return the copy-of value for VAR. */
400 static inline prop_value_t
*
401 get_copy_of_val (tree var
)
403 prop_value_t
*val
= ©_of
[SSA_NAME_VERSION (var
)];
405 if (val
->value
== NULL_TREE
406 && !stmt_may_generate_copy (SSA_NAME_DEF_STMT (var
)))
408 /* If the variable will never generate a useful copy relation,
409 make it its own copy. */
411 val
->mem_ref
= NULL_TREE
;
418 /* Return last link in the copy-of chain for VAR. */
421 get_last_copy_of (tree var
)
426 /* Traverse COPY_OF starting at VAR until we get to the last
427 link in the chain. Since it is possible to have cycles in PHI
428 nodes, the copy-of chain may also contain cycles.
430 To avoid infinite loops and to avoid traversing lengthy copy-of
431 chains, we artificially limit the maximum number of chains we are
434 The value 5 was taken from a compiler and runtime library
435 bootstrap and a mixture of C and C++ code from various sources.
436 More than 82% of all copy-of chains were shorter than 5 links. */
440 for (i
= 0; i
< LIMIT
; i
++)
442 tree copy
= copy_of
[SSA_NAME_VERSION (last
)].value
;
443 if (copy
== NULL_TREE
|| copy
== last
)
448 /* If we have reached the limit, then we are either in a copy-of
449 cycle or the copy-of chain is too long. In this case, just
450 return VAR so that it is not considered a copy of anything. */
451 return (i
< LIMIT
? last
: var
);
455 /* Set FIRST to be the first variable in the copy-of chain for DEST.
456 If DEST's copy-of value or its copy-of chain has changed, return
459 MEM_REF is the memory reference where FIRST is stored. This is
460 used when DEST is a non-register and we are copy propagating loads
464 set_copy_of_val (tree dest
, tree first
, tree mem_ref
)
466 unsigned int dest_ver
= SSA_NAME_VERSION (dest
);
467 tree old_first
, old_last
, new_last
;
469 /* Set FIRST to be the first link in COPY_OF[DEST]. If that
470 changed, return true. */
471 old_first
= copy_of
[dest_ver
].value
;
472 copy_of
[dest_ver
].value
= first
;
473 copy_of
[dest_ver
].mem_ref
= mem_ref
;
475 if (old_first
!= first
)
478 /* If FIRST and OLD_FIRST are the same, we need to check whether the
479 copy-of chain starting at FIRST ends in a different variable. If
480 the copy-of chain starting at FIRST ends up in a different
481 variable than the last cached value we had for DEST, then return
482 true because DEST is now a copy of a different variable.
484 This test is necessary because even though the first link in the
485 copy-of chain may not have changed, if any of the variables in
486 the copy-of chain changed its final value, DEST will now be the
487 copy of a different variable, so we have to do another round of
488 propagation for everything that depends on DEST. */
489 old_last
= cached_last_copy_of
[dest_ver
];
490 new_last
= get_last_copy_of (dest
);
491 cached_last_copy_of
[dest_ver
] = new_last
;
493 return (old_last
!= new_last
);
497 /* Dump the copy-of value for variable VAR to DUMP_FILE. */
500 dump_copy_of (FILE *dump_file
, tree var
)
505 print_generic_expr (dump_file
, var
, dump_flags
);
507 if (TREE_CODE (var
) != SSA_NAME
)
510 visited
= sbitmap_alloc (num_ssa_names
);
511 sbitmap_zero (visited
);
512 SET_BIT (visited
, SSA_NAME_VERSION (var
));
514 fprintf (dump_file
, " copy-of chain: ");
517 print_generic_expr (dump_file
, val
, 0);
518 fprintf (dump_file
, " ");
519 while (copy_of
[SSA_NAME_VERSION (val
)].value
)
521 fprintf (dump_file
, "-> ");
522 val
= copy_of
[SSA_NAME_VERSION (val
)].value
;
523 print_generic_expr (dump_file
, val
, 0);
524 fprintf (dump_file
, " ");
525 if (TEST_BIT (visited
, SSA_NAME_VERSION (val
)))
527 SET_BIT (visited
, SSA_NAME_VERSION (val
));
530 val
= get_copy_of_val (var
)->value
;
531 if (val
== NULL_TREE
)
532 fprintf (dump_file
, "[UNDEFINED]");
534 fprintf (dump_file
, "[COPY]");
536 fprintf (dump_file
, "[NOT A COPY]");
538 sbitmap_free (visited
);
542 /* Evaluate the RHS of STMT. If it produces a valid copy, set the LHS
543 value and store the LHS into *RESULT_P. If STMT generates more
544 than one name (i.e., STMT is an aliased store), it is enough to
545 store the first name in the V_MAY_DEF list into *RESULT_P. After
546 all, the names generated will be VUSEd in the same statements. */
548 static enum ssa_prop_result
549 copy_prop_visit_assignment (tree stmt
, tree
*result_p
)
552 prop_value_t
*rhs_val
;
554 lhs
= TREE_OPERAND (stmt
, 0);
555 rhs
= TREE_OPERAND (stmt
, 1);
557 gcc_assert (TREE_CODE (rhs
) == SSA_NAME
);
559 rhs_val
= get_copy_of_val (rhs
);
561 if (TREE_CODE (lhs
) == SSA_NAME
)
563 /* Straight copy between two SSA names. First, make sure that
564 we can propagate the RHS into uses of LHS. */
565 if (!may_propagate_copy (lhs
, rhs
))
566 return SSA_PROP_VARYING
;
568 /* Notice that in the case of assignments, we make the LHS be a
569 copy of RHS's value, not of RHS itself. This avoids keeping
570 unnecessary copy-of chains (assignments cannot be in a cycle
571 like PHI nodes), speeding up the propagation process.
572 This is different from what we do in copy_prop_visit_phi_node.
573 In those cases, we are interested in the copy-of chains. */
575 if (set_copy_of_val (*result_p
, rhs_val
->value
, rhs_val
->mem_ref
))
576 return SSA_PROP_INTERESTING
;
578 return SSA_PROP_NOT_INTERESTING
;
580 else if (stmt_makes_single_store (stmt
))
582 /* Otherwise, set the names in V_MAY_DEF/V_MUST_DEF operands
583 to be a copy of RHS. */
588 /* This should only be executed when doing store copy-prop. */
589 gcc_assert (do_store_copy_prop
);
591 /* Set the value of every VDEF to RHS_VAL. */
593 FOR_EACH_SSA_TREE_OPERAND (vdef
, stmt
, i
, SSA_OP_VIRTUAL_DEFS
)
594 changed
|= set_copy_of_val (vdef
, rhs_val
->value
, lhs
);
596 /* Note that for propagation purposes, we are only interested in
597 visiting statements that load the exact same memory reference
598 stored here. Those statements will have the exact same list
599 of virtual uses, so it is enough to set the output of this
600 statement to be its first virtual definition. */
601 *result_p
= first_vdef (stmt
);
604 return SSA_PROP_INTERESTING
;
606 return SSA_PROP_NOT_INTERESTING
;
610 return SSA_PROP_VARYING
;
614 /* Visit the COND_EXPR STMT. Return SSA_PROP_INTERESTING
615 if it can determine which edge will be taken. Otherwise, return
618 static enum ssa_prop_result
619 copy_prop_visit_cond_stmt (tree stmt
, edge
*taken_edge_p
)
621 enum ssa_prop_result retval
;
624 cond
= COND_EXPR_COND (stmt
);
625 retval
= SSA_PROP_VARYING
;
627 /* The only conditionals that we may be able to compute statically
628 are predicates involving two SSA_NAMEs. */
629 if (COMPARISON_CLASS_P (cond
)
630 && TREE_CODE (TREE_OPERAND (cond
, 0)) == SSA_NAME
631 && TREE_CODE (TREE_OPERAND (cond
, 1)) == SSA_NAME
)
633 tree op0
= get_last_copy_of (TREE_OPERAND (cond
, 0));
634 tree op1
= get_last_copy_of (TREE_OPERAND (cond
, 1));
636 /* See if we can determine the predicate's value. */
637 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
639 fprintf (dump_file
, "Trying to determine truth value of ");
640 fprintf (dump_file
, "predicate ");
641 print_generic_stmt (dump_file
, cond
, 0);
644 /* We can fold COND and get a useful result only when we have
645 the same SSA_NAME on both sides of a comparison operator. */
648 tree folded_cond
= fold_binary (TREE_CODE (cond
), boolean_type_node
,
652 basic_block bb
= bb_for_stmt (stmt
);
653 *taken_edge_p
= find_taken_edge (bb
, folded_cond
);
655 retval
= SSA_PROP_INTERESTING
;
660 if (dump_file
&& (dump_flags
& TDF_DETAILS
) && *taken_edge_p
)
661 fprintf (dump_file
, "\nConditional will always take edge %d->%d\n",
662 (*taken_edge_p
)->src
->index
, (*taken_edge_p
)->dest
->index
);
668 /* Evaluate statement STMT. If the statement produces a new output
669 value, return SSA_PROP_INTERESTING and store the SSA_NAME holding
670 the new value in *RESULT_P.
672 If STMT is a conditional branch and we can determine its truth
673 value, set *TAKEN_EDGE_P accordingly.
675 If the new value produced by STMT is varying, return
678 static enum ssa_prop_result
679 copy_prop_visit_stmt (tree stmt
, edge
*taken_edge_p
, tree
*result_p
)
681 enum ssa_prop_result retval
;
683 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
685 fprintf (dump_file
, "\nVisiting statement:\n");
686 print_generic_stmt (dump_file
, stmt
, dump_flags
);
687 fprintf (dump_file
, "\n");
690 if (TREE_CODE (stmt
) == MODIFY_EXPR
691 && TREE_CODE (TREE_OPERAND (stmt
, 1)) == SSA_NAME
692 && (do_store_copy_prop
693 || TREE_CODE (TREE_OPERAND (stmt
, 0)) == SSA_NAME
))
695 /* If the statement is a copy assignment, evaluate its RHS to
696 see if the lattice value of its output has changed. */
697 retval
= copy_prop_visit_assignment (stmt
, result_p
);
699 else if (TREE_CODE (stmt
) == COND_EXPR
)
701 /* See if we can determine which edge goes out of a conditional
703 retval
= copy_prop_visit_cond_stmt (stmt
, taken_edge_p
);
706 retval
= SSA_PROP_VARYING
;
708 if (retval
== SSA_PROP_VARYING
)
713 /* Any other kind of statement is not interesting for constant
714 propagation and, therefore, not worth simulating. */
715 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
716 fprintf (dump_file
, "No interesting values produced.\n");
718 /* The assignment is not a copy operation. Don't visit this
719 statement again and mark all the definitions in the statement
720 to be copies of nothing. */
721 FOR_EACH_SSA_TREE_OPERAND (def
, stmt
, i
, SSA_OP_ALL_DEFS
)
722 set_copy_of_val (def
, def
, NULL_TREE
);
729 /* Visit PHI node PHI. If all the arguments produce the same value,
730 set it to be the value of the LHS of PHI. */
732 static enum ssa_prop_result
733 copy_prop_visit_phi_node (tree phi
)
735 enum ssa_prop_result retval
;
738 prop_value_t phi_val
= { 0, NULL_TREE
, NULL_TREE
};
740 lhs
= PHI_RESULT (phi
);
742 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
744 fprintf (dump_file
, "\nVisiting PHI node: ");
745 print_generic_expr (dump_file
, phi
, dump_flags
);
746 fprintf (dump_file
, "\n\n");
749 for (i
= 0; i
< PHI_NUM_ARGS (phi
); i
++)
751 prop_value_t
*arg_val
;
752 tree arg
= PHI_ARG_DEF (phi
, i
);
753 edge e
= PHI_ARG_EDGE (phi
, i
);
755 /* We don't care about values flowing through non-executable
757 if (!(e
->flags
& EDGE_EXECUTABLE
))
760 /* Constants in the argument list never generate a useful copy.
761 Similarly, names that flow through abnormal edges cannot be
762 used to derive copies. */
763 if (TREE_CODE (arg
) != SSA_NAME
|| SSA_NAME_OCCURS_IN_ABNORMAL_PHI (arg
))
769 /* Avoid copy propagation from an inner into an outer loop.
770 Otherwise, this may move loop variant variables outside of
771 their loops and prevent coalescing opportunities. If the
772 value was loop invariant, it will be hoisted by LICM and
773 exposed for copy propagation. */
774 if (loop_depth_of_name (arg
) > loop_depth_of_name (lhs
))
780 /* If the LHS appears in the argument list, ignore it. It is
781 irrelevant as a copy. */
782 if (arg
== lhs
|| get_last_copy_of (arg
) == lhs
)
785 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
787 fprintf (dump_file
, "\tArgument #%d: ", i
);
788 dump_copy_of (dump_file
, arg
);
789 fprintf (dump_file
, "\n");
792 arg_val
= get_copy_of_val (arg
);
794 /* If the LHS didn't have a value yet, make it a copy of the
795 first argument we find. Notice that while we make the LHS be
796 a copy of the argument itself, we take the memory reference
797 from the argument's value so that we can compare it to the
798 memory reference of all the other arguments. */
799 if (phi_val
.value
== NULL_TREE
)
802 phi_val
.mem_ref
= arg_val
->mem_ref
;
806 /* If PHI_VAL and ARG don't have a common copy-of chain, then
807 this PHI node cannot be a copy operation. Also, if we are
808 copy propagating stores and these two arguments came from
809 different memory references, they cannot be considered
811 if (get_last_copy_of (phi_val
.value
) != get_last_copy_of (arg
)
812 || (do_store_copy_prop
815 && simple_cst_equal (phi_val
.mem_ref
, arg_val
->mem_ref
) != 1))
822 if (phi_val
.value
&& set_copy_of_val (lhs
, phi_val
.value
, phi_val
.mem_ref
))
823 retval
= (phi_val
.value
!= lhs
) ? SSA_PROP_INTERESTING
: SSA_PROP_VARYING
;
825 retval
= SSA_PROP_NOT_INTERESTING
;
827 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
829 fprintf (dump_file
, "\nPHI node ");
830 dump_copy_of (dump_file
, lhs
);
831 fprintf (dump_file
, "\nTelling the propagator to ");
832 if (retval
== SSA_PROP_INTERESTING
)
833 fprintf (dump_file
, "add SSA edges out of this PHI and continue.");
834 else if (retval
== SSA_PROP_VARYING
)
835 fprintf (dump_file
, "add SSA edges out of this PHI and never visit again.");
837 fprintf (dump_file
, "do nothing with SSA edges and keep iterating.");
838 fprintf (dump_file
, "\n\n");
845 /* Initialize structures used for copy propagation. PHIS_ONLY is true
846 if we should only consider PHI nodes as generating copy propagation
850 init_copy_prop (bool phis_only
)
854 copy_of
= xmalloc (num_ssa_names
* sizeof (*copy_of
));
855 memset (copy_of
, 0, num_ssa_names
* sizeof (*copy_of
));
857 cached_last_copy_of
= xmalloc (num_ssa_names
* sizeof (*cached_last_copy_of
));
858 memset (cached_last_copy_of
, 0, num_ssa_names
* sizeof (*cached_last_copy_of
));
862 block_stmt_iterator si
;
864 int depth
= bb
->loop_depth
;
866 for (si
= bsi_start (bb
); !bsi_end_p (si
); bsi_next (&si
))
868 tree stmt
= bsi_stmt (si
);
871 /* The only statements that we care about are those that may
872 generate useful copies. We also need to mark conditional
873 jumps so that their outgoing edges are added to the work
874 lists of the propagator.
876 Avoid copy propagation from an inner into an outer loop.
877 Otherwise, this may move loop variant variables outside of
878 their loops and prevent coalescing opportunities. If the
879 value was loop invariant, it will be hoisted by LICM and
880 exposed for copy propagation. */
881 if (stmt_ends_bb_p (stmt
))
882 DONT_SIMULATE_AGAIN (stmt
) = false;
883 else if (!phis_only
&& stmt_may_generate_copy (stmt
)
884 && loop_depth_of_name (TREE_OPERAND (stmt
, 1)) <= depth
)
885 DONT_SIMULATE_AGAIN (stmt
) = false;
887 DONT_SIMULATE_AGAIN (stmt
) = true;
889 /* Mark all the outputs of this statement as not being
890 the copy of anything. */
891 FOR_EACH_SSA_TREE_OPERAND (def
, stmt
, iter
, SSA_OP_ALL_DEFS
)
892 if (DONT_SIMULATE_AGAIN (stmt
))
893 set_copy_of_val (def
, def
, NULL_TREE
);
895 cached_last_copy_of
[SSA_NAME_VERSION (def
)] = def
;
898 for (phi
= phi_nodes (bb
); phi
; phi
= PHI_CHAIN (phi
))
900 def
= PHI_RESULT (phi
);
901 if (!do_store_copy_prop
&& !is_gimple_reg (def
))
902 DONT_SIMULATE_AGAIN (phi
) = true;
904 DONT_SIMULATE_AGAIN (phi
) = false;
906 if (DONT_SIMULATE_AGAIN (phi
))
907 set_copy_of_val (def
, def
, NULL_TREE
);
909 cached_last_copy_of
[SSA_NAME_VERSION (def
)] = def
;
915 /* Deallocate memory used in copy propagation and do final
919 fini_copy_prop (void)
924 /* Set the final copy-of value for each variable by traversing the
926 tmp
= xmalloc (num_ssa_names
* sizeof (*tmp
));
927 memset (tmp
, 0, num_ssa_names
* sizeof (*tmp
));
928 for (i
= 1; i
< num_ssa_names
; i
++)
930 tree var
= ssa_name (i
);
931 if (var
&& copy_of
[i
].value
&& copy_of
[i
].value
!= var
)
932 tmp
[i
].value
= get_last_copy_of (var
);
935 substitute_and_fold (tmp
, false);
937 free (cached_last_copy_of
);
943 /* Main entry point to the copy propagator.
945 PHIS_ONLY is true if we should only consider PHI nodes as generating
946 copy propagation opportunities.
948 The algorithm propagates the value COPY-OF using ssa_propagate. For
949 every variable X_i, COPY-OF(X_i) indicates which variable is X_i created
950 from. The following example shows how the algorithm proceeds at a
954 2 a_2 = PHI <a_24, x_1>
956 4 x_1 = PHI <x_298, a_5, a_2>
958 The end result should be that a_2, a_5, a_24 and x_1 are a copy of
959 x_298. Propagation proceeds as follows.
961 Visit #1: a_24 is copy-of x_1. Value changed.
962 Visit #2: a_2 is copy-of x_1. Value changed.
963 Visit #3: a_5 is copy-of x_1. Value changed.
964 Visit #4: x_1 is copy-of x_298. Value changed.
965 Visit #1: a_24 is copy-of x_298. Value changed.
966 Visit #2: a_2 is copy-of x_298. Value changed.
967 Visit #3: a_5 is copy-of x_298. Value changed.
968 Visit #4: x_1 is copy-of x_298. Stable state reached.
970 When visiting PHI nodes, we only consider arguments that flow
971 through edges marked executable by the propagation engine. So,
972 when visiting statement #2 for the first time, we will only look at
973 the first argument (a_24) and optimistically assume that its value
974 is the copy of a_24 (x_1).
976 The problem with this approach is that it may fail to discover copy
977 relations in PHI cycles. Instead of propagating copy-of
978 values, we actually propagate copy-of chains. For instance:
985 In this code fragment, COPY-OF (X_i) = { D_4, C_9, A_3, B_1 }.
986 Obviously, we are only really interested in the last value of the
987 chain, however the propagator needs to access the copy-of chain
988 when visiting PHI nodes.
990 To represent the copy-of chain, we use the array COPY_CHAINS, which
991 holds the first link in the copy-of chain for every variable.
992 If variable X_i is a copy of X_j, which in turn is a copy of X_k,
993 the array will contain:
999 Keeping copy-of chains instead of copy-of values directly becomes
1000 important when visiting PHI nodes. Suppose that we had the
1001 following PHI cycle, such that x_52 is already considered a copy of
1004 1 x_54 = PHI <x_53, x_52>
1005 2 x_53 = PHI <x_898, x_54>
1007 Visit #1: x_54 is copy-of x_53 (because x_52 is copy-of x_53)
1008 Visit #2: x_53 is copy-of x_898 (because x_54 is a copy of x_53,
1009 so it is considered irrelevant
1011 Visit #1: x_54 is copy-of nothing (x_53 is a copy-of x_898 and
1012 x_52 is a copy of x_53, so
1014 Visit #2: x_53 is copy-of nothing
1016 This problem is avoided by keeping a chain of copies, instead of
1017 the final copy-of value. Propagation will now only keep the first
1018 element of a variable's copy-of chain. When visiting PHI nodes,
1019 arguments are considered equal if their copy-of chains end in the
1020 same variable. So, as long as their copy-of chains overlap, we
1021 know that they will be a copy of the same variable, regardless of
1022 which variable that may be).
1024 Propagation would then proceed as follows (the notation a -> b
1025 means that a is a copy-of b):
1027 Visit #1: x_54 = PHI <x_53, x_52>
1030 Result: x_54 -> x_53. Value changed. Add SSA edges.
1032 Visit #1: x_53 = PHI <x_898, x_54>
1035 Result: x_53 -> x_898. Value changed. Add SSA edges.
1037 Visit #2: x_54 = PHI <x_53, x_52>
1039 x_52 -> x_53 -> x_898
1040 Result: x_54 -> x_898. Value changed. Add SSA edges.
1042 Visit #2: x_53 = PHI <x_898, x_54>
1045 Result: x_53 -> x_898. Value didn't change. Stable state
1047 Once the propagator stabilizes, we end up with the desired result
1048 x_53 and x_54 are both copies of x_898. */
1051 execute_copy_prop (bool store_copy_prop
, bool phis_only
)
1053 do_store_copy_prop
= store_copy_prop
;
1054 init_copy_prop (phis_only
);
1055 ssa_propagate (copy_prop_visit_stmt
, copy_prop_visit_phi_node
);
1061 gate_copy_prop (void)
1063 return flag_tree_copy_prop
!= 0;
1069 execute_copy_prop (false, false);
1072 struct tree_opt_pass pass_copy_prop
=
1074 "copyprop", /* name */
1075 gate_copy_prop
, /* gate */
1076 do_copy_prop
, /* execute */
1079 0, /* static_pass_number */
1080 TV_TREE_COPY_PROP
, /* tv_id */
1081 PROP_ssa
| PROP_alias
| PROP_cfg
, /* properties_required */
1082 0, /* properties_provided */
1083 0, /* properties_destroyed */
1084 0, /* todo_flags_start */
1089 | TODO_update_ssa
, /* todo_flags_finish */
1095 do_phi_only_copy_prop (void)
1097 execute_copy_prop (false, true);
1100 struct tree_opt_pass pass_phi_only_copy_prop
=
1102 "phionlycopyprop", /* name */
1103 gate_copy_prop
, /* gate */
1104 do_phi_only_copy_prop
, /* execute */
1107 0, /* static_pass_number */
1108 TV_TREE_COPY_PROP
, /* tv_id */
1109 PROP_ssa
| PROP_alias
| PROP_cfg
, /* properties_required */
1110 0, /* properties_provided */
1111 0, /* properties_destroyed */
1112 0, /* todo_flags_start */
1117 | TODO_update_ssa
, /* todo_flags_finish */
1123 gate_store_copy_prop (void)
1125 /* STORE-COPY-PROP is enabled only with -ftree-store-copy-prop, but
1126 when -fno-tree-store-copy-prop is specified, we should run
1127 regular COPY-PROP. That's why the pass is enabled with either
1129 return flag_tree_store_copy_prop
!= 0 || flag_tree_copy_prop
!= 0;
1133 store_copy_prop (void)
1135 /* If STORE-COPY-PROP is not enabled, we just run regular COPY-PROP. */
1136 execute_copy_prop (flag_tree_store_copy_prop
!= 0, false);
1139 struct tree_opt_pass pass_store_copy_prop
=
1141 "store_copyprop", /* name */
1142 gate_store_copy_prop
, /* gate */
1143 store_copy_prop
, /* execute */
1146 0, /* static_pass_number */
1147 TV_TREE_STORE_COPY_PROP
, /* tv_id */
1148 PROP_ssa
| PROP_alias
| PROP_cfg
, /* properties_required */
1149 0, /* properties_provided */
1150 0, /* properties_destroyed */
1151 0, /* todo_flags_start */
1156 | TODO_update_ssa
, /* todo_flags_finish */