1 /* Copy propagation and SSA_NAME replacement support routines.
2 Copyright (C) 2004-2021 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"
26 #include "tree-pass.h"
28 #include "gimple-pretty-print.h"
29 #include "fold-const.h"
30 #include "gimple-iterator.h"
32 #include "tree-ssa-propagate.h"
34 #include "tree-scalar-evolution.h"
35 #include "tree-ssa-loop-niter.h"
38 /* This file implements the copy propagation pass and provides a
39 handful of interfaces for performing const/copy propagation and
40 simple expression replacement which keep variable annotations
43 We require that for any copy operation where the RHS and LHS have
44 a non-null memory tag the memory tag be the same. It is OK
45 for one or both of the memory tags to be NULL.
47 We also require tracking if a variable is dereferenced in a load or
50 We enforce these requirements by having all copy propagation and
51 replacements of one SSA_NAME with a different SSA_NAME to use the
52 APIs defined in this file. */
54 /*---------------------------------------------------------------------------
56 ---------------------------------------------------------------------------*/
57 /* Lattice for copy-propagation. The lattice is initialized to
58 UNDEFINED (value == NULL) for SSA names that can become a copy
59 of something or VARYING (value == self) if not (see get_copy_of_val
60 and stmt_may_generate_copy). Other values make the name a COPY
63 When visiting a statement or PHI node the lattice value for an
64 SSA name can transition from UNDEFINED to COPY to VARYING. */
71 class copy_prop
: public ssa_propagation_engine
74 enum ssa_prop_result
visit_stmt (gimple
*, edge
*, tree
*) FINAL OVERRIDE
;
75 enum ssa_prop_result
visit_phi (gphi
*) FINAL OVERRIDE
;
78 static prop_value_t
*copy_of
;
79 static unsigned n_copy_of
;
82 /* Return true if this statement may generate a useful copy. */
85 stmt_may_generate_copy (gimple
*stmt
)
87 if (gimple_code (stmt
) == GIMPLE_PHI
)
88 return !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (gimple_phi_result (stmt
));
90 if (gimple_code (stmt
) != GIMPLE_ASSIGN
)
93 /* If the statement has volatile operands, it won't generate a
95 if (gimple_has_volatile_ops (stmt
))
98 /* Statements with loads and/or stores will never generate a useful copy. */
99 if (gimple_vuse (stmt
))
102 /* Otherwise, the only statements that generate useful copies are
103 assignments whose RHS is just an SSA name that doesn't flow
104 through abnormal edges. */
105 return ((gimple_assign_rhs_code (stmt
) == SSA_NAME
106 && !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (gimple_assign_rhs1 (stmt
)))
107 || is_gimple_min_invariant (gimple_assign_rhs1 (stmt
)));
111 /* Return the copy-of value for VAR. */
113 static inline prop_value_t
*
114 get_copy_of_val (tree var
)
116 prop_value_t
*val
= ©_of
[SSA_NAME_VERSION (var
)];
118 if (val
->value
== NULL_TREE
119 && !stmt_may_generate_copy (SSA_NAME_DEF_STMT (var
)))
121 /* If the variable will never generate a useful copy relation,
122 make it its own copy. */
129 /* Return the variable VAR is a copy of or VAR if VAR isn't the result
133 valueize_val (tree var
)
135 if (TREE_CODE (var
) == SSA_NAME
)
137 tree val
= get_copy_of_val (var
)->value
;
144 /* Set VAL to be the copy of VAR. If that changed return true. */
147 set_copy_of_val (tree var
, tree val
)
149 unsigned int ver
= SSA_NAME_VERSION (var
);
152 /* Set FIRST to be the first link in COPY_OF[DEST]. If that
153 changed, return true. */
154 old
= copy_of
[ver
].value
;
155 copy_of
[ver
].value
= val
;
158 && (!old
|| !operand_equal_p (old
, val
, 0)))
165 /* Dump the copy-of value for variable VAR to FILE. */
168 dump_copy_of (FILE *file
, tree var
)
172 print_generic_expr (file
, var
, dump_flags
);
173 if (TREE_CODE (var
) != SSA_NAME
)
176 val
= copy_of
[SSA_NAME_VERSION (var
)].value
;
177 fprintf (file
, " copy-of chain: ");
178 print_generic_expr (file
, var
);
181 fprintf (file
, "[UNDEFINED]");
183 fprintf (file
, "[NOT A COPY]");
186 fprintf (file
, "-> ");
187 print_generic_expr (file
, val
);
189 fprintf (file
, "[COPY]");
194 /* Evaluate the RHS of STMT. If it produces a valid copy, set the LHS
195 value and store the LHS into *RESULT_P. */
197 static enum ssa_prop_result
198 copy_prop_visit_assignment (gimple
*stmt
, tree
*result_p
)
202 lhs
= gimple_assign_lhs (stmt
);
203 rhs
= valueize_val (gimple_assign_rhs1 (stmt
));
205 if (TREE_CODE (lhs
) == SSA_NAME
)
207 /* Straight copy between two SSA names. First, make sure that
208 we can propagate the RHS into uses of LHS. */
209 if (!may_propagate_copy (lhs
, rhs
))
210 return SSA_PROP_VARYING
;
213 if (set_copy_of_val (*result_p
, rhs
))
214 return SSA_PROP_INTERESTING
;
216 return SSA_PROP_NOT_INTERESTING
;
219 return SSA_PROP_VARYING
;
223 /* Visit the GIMPLE_COND STMT. Return SSA_PROP_INTERESTING
224 if it can determine which edge will be taken. Otherwise, return
227 static enum ssa_prop_result
228 copy_prop_visit_cond_stmt (gimple
*stmt
, edge
*taken_edge_p
)
230 enum ssa_prop_result retval
= SSA_PROP_VARYING
;
231 location_t loc
= gimple_location (stmt
);
233 tree op0
= valueize_val (gimple_cond_lhs (stmt
));
234 tree op1
= valueize_val (gimple_cond_rhs (stmt
));
236 /* See if we can determine the predicate's value. */
237 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
239 fprintf (dump_file
, "Trying to determine truth value of ");
240 fprintf (dump_file
, "predicate ");
241 print_gimple_stmt (dump_file
, stmt
, 0);
244 /* Fold COND and see whether we get a useful result. */
245 tree folded_cond
= fold_binary_loc (loc
, gimple_cond_code (stmt
),
246 boolean_type_node
, op0
, op1
);
249 basic_block bb
= gimple_bb (stmt
);
250 *taken_edge_p
= find_taken_edge (bb
, folded_cond
);
252 retval
= SSA_PROP_INTERESTING
;
255 if (dump_file
&& (dump_flags
& TDF_DETAILS
) && *taken_edge_p
)
256 fprintf (dump_file
, "\nConditional will always take edge %d->%d\n",
257 (*taken_edge_p
)->src
->index
, (*taken_edge_p
)->dest
->index
);
263 /* Evaluate statement STMT. If the statement produces a new output
264 value, return SSA_PROP_INTERESTING and store the SSA_NAME holding
265 the new value in *RESULT_P.
267 If STMT is a conditional branch and we can determine its truth
268 value, set *TAKEN_EDGE_P accordingly.
270 If the new value produced by STMT is varying, return
274 copy_prop::visit_stmt (gimple
*stmt
, edge
*taken_edge_p
, tree
*result_p
)
276 enum ssa_prop_result retval
;
278 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
280 fprintf (dump_file
, "\nVisiting statement:\n");
281 print_gimple_stmt (dump_file
, stmt
, 0, dump_flags
);
282 fprintf (dump_file
, "\n");
285 if (gimple_assign_single_p (stmt
)
286 && TREE_CODE (gimple_assign_lhs (stmt
)) == SSA_NAME
287 && (TREE_CODE (gimple_assign_rhs1 (stmt
)) == SSA_NAME
288 || is_gimple_min_invariant (gimple_assign_rhs1 (stmt
))))
290 /* If the statement is a copy assignment, evaluate its RHS to
291 see if the lattice value of its output has changed. */
292 retval
= copy_prop_visit_assignment (stmt
, result_p
);
294 else if (gimple_code (stmt
) == GIMPLE_COND
)
296 /* See if we can determine which edge goes out of a conditional
298 retval
= copy_prop_visit_cond_stmt (stmt
, taken_edge_p
);
301 retval
= SSA_PROP_VARYING
;
303 if (retval
== SSA_PROP_VARYING
)
308 /* Any other kind of statement is not interesting for constant
309 propagation and, therefore, not worth simulating. */
310 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
311 fprintf (dump_file
, "No interesting values produced.\n");
313 /* The assignment is not a copy operation. Don't visit this
314 statement again and mark all the definitions in the statement
315 to be copies of nothing. */
316 FOR_EACH_SSA_TREE_OPERAND (def
, stmt
, i
, SSA_OP_ALL_DEFS
)
317 set_copy_of_val (def
, def
);
324 /* Visit PHI node PHI. If all the arguments produce the same value,
325 set it to be the value of the LHS of PHI. */
328 copy_prop::visit_phi (gphi
*phi
)
330 enum ssa_prop_result retval
;
332 prop_value_t phi_val
= { NULL_TREE
};
334 tree lhs
= gimple_phi_result (phi
);
336 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
338 fprintf (dump_file
, "\nVisiting PHI node: ");
339 print_gimple_stmt (dump_file
, phi
, 0, dump_flags
);
342 for (i
= 0; i
< gimple_phi_num_args (phi
); i
++)
344 prop_value_t
*arg_val
;
346 tree arg
= gimple_phi_arg_def (phi
, i
);
347 edge e
= gimple_phi_arg_edge (phi
, i
);
349 /* We don't care about values flowing through non-executable
351 if (!(e
->flags
& EDGE_EXECUTABLE
))
354 /* Names that flow through abnormal edges cannot be used to
356 if (TREE_CODE (arg
) == SSA_NAME
&& SSA_NAME_OCCURS_IN_ABNORMAL_PHI (arg
))
362 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
364 fprintf (dump_file
, "\tArgument #%d: ", i
);
365 dump_copy_of (dump_file
, arg
);
366 fprintf (dump_file
, "\n");
369 if (TREE_CODE (arg
) == SSA_NAME
)
371 arg_val
= get_copy_of_val (arg
);
373 /* If we didn't visit the definition of arg yet treat it as
374 UNDEFINED. This also handles PHI arguments that are the
375 same as lhs. We'll come here again. */
379 arg_value
= arg_val
->value
;
382 arg_value
= valueize_val (arg
);
384 /* In loop-closed SSA form do not copy-propagate SSA-names across
386 if (loops_state_satisfies_p (LOOP_CLOSED_SSA
)
387 && TREE_CODE (arg_value
) == SSA_NAME
388 && loop_exit_edge_p (e
->src
->loop_father
, e
))
394 /* If the LHS didn't have a value yet, make it a copy of the
395 first argument we find. */
396 if (phi_val
.value
== NULL_TREE
)
398 phi_val
.value
= arg_value
;
402 /* If PHI_VAL and ARG don't have a common copy-of chain, then
403 this PHI node cannot be a copy operation. */
404 if (phi_val
.value
!= arg_value
405 && !operand_equal_p (phi_val
.value
, arg_value
, 0))
413 && may_propagate_copy (lhs
, phi_val
.value
)
414 && set_copy_of_val (lhs
, phi_val
.value
))
415 retval
= (phi_val
.value
!= lhs
) ? SSA_PROP_INTERESTING
: SSA_PROP_VARYING
;
417 retval
= SSA_PROP_NOT_INTERESTING
;
419 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
421 fprintf (dump_file
, "PHI node ");
422 dump_copy_of (dump_file
, lhs
);
423 fprintf (dump_file
, "\nTelling the propagator to ");
424 if (retval
== SSA_PROP_INTERESTING
)
425 fprintf (dump_file
, "add SSA edges out of this PHI and continue.");
426 else if (retval
== SSA_PROP_VARYING
)
427 fprintf (dump_file
, "add SSA edges out of this PHI and never visit again.");
429 fprintf (dump_file
, "do nothing with SSA edges and keep iterating.");
430 fprintf (dump_file
, "\n\n");
437 /* Initialize structures used for copy propagation. */
440 init_copy_prop (void)
444 n_copy_of
= num_ssa_names
;
445 copy_of
= XCNEWVEC (prop_value_t
, n_copy_of
);
447 FOR_EACH_BB_FN (bb
, cfun
)
449 for (gimple_stmt_iterator si
= gsi_start_bb (bb
); !gsi_end_p (si
);
452 gimple
*stmt
= gsi_stmt (si
);
456 /* The only statements that we care about are those that may
457 generate useful copies. We also need to mark conditional
458 jumps so that their outgoing edges are added to the work
459 lists of the propagator. */
460 if (stmt_ends_bb_p (stmt
))
461 prop_set_simulate_again (stmt
, true);
462 else if (stmt_may_generate_copy (stmt
))
463 prop_set_simulate_again (stmt
, true);
465 prop_set_simulate_again (stmt
, false);
467 /* Mark all the outputs of this statement as not being
468 the copy of anything. */
469 FOR_EACH_SSA_TREE_OPERAND (def
, stmt
, iter
, SSA_OP_ALL_DEFS
)
470 if (!prop_simulate_again_p (stmt
))
471 set_copy_of_val (def
, def
);
474 for (gphi_iterator si
= gsi_start_phis (bb
); !gsi_end_p (si
);
477 gphi
*phi
= si
.phi ();
480 def
= gimple_phi_result (phi
);
481 if (virtual_operand_p (def
))
482 prop_set_simulate_again (phi
, false);
484 prop_set_simulate_again (phi
, true);
486 if (!prop_simulate_again_p (phi
))
487 set_copy_of_val (def
, def
);
492 class copy_folder
: public substitute_and_fold_engine
495 tree
value_of_expr (tree name
, gimple
*) FINAL OVERRIDE
;
498 /* Callback for substitute_and_fold to get at the final copy-of values. */
501 copy_folder::value_of_expr (tree name
, gimple
*)
504 if (SSA_NAME_VERSION (name
) >= n_copy_of
)
506 val
= copy_of
[SSA_NAME_VERSION (name
)].value
;
507 if (val
&& val
!= name
)
512 /* Deallocate memory used in copy propagation and do final
516 fini_copy_prop (void)
521 /* Set the final copy-of value for each variable by traversing the
523 FOR_EACH_SSA_NAME (i
, var
, cfun
)
525 if (!copy_of
[i
].value
526 || copy_of
[i
].value
== var
)
529 /* In theory the points-to solution of all members of the
530 copy chain is their intersection. For now we do not bother
531 to compute this but only make sure we do not lose points-to
532 information completely by setting the points-to solution
533 of the representative to the first solution we find if
534 it doesn't have one already. */
535 if (copy_of
[i
].value
!= var
536 && TREE_CODE (copy_of
[i
].value
) == SSA_NAME
)
538 basic_block copy_of_bb
539 = gimple_bb (SSA_NAME_DEF_STMT (copy_of
[i
].value
));
540 basic_block var_bb
= gimple_bb (SSA_NAME_DEF_STMT (var
));
541 if (POINTER_TYPE_P (TREE_TYPE (var
))
542 && SSA_NAME_PTR_INFO (var
)
543 && !SSA_NAME_PTR_INFO (copy_of
[i
].value
))
545 duplicate_ssa_name_ptr_info (copy_of
[i
].value
,
546 SSA_NAME_PTR_INFO (var
));
547 /* Points-to information is cfg insensitive,
548 but [E]VRP might record context sensitive alignment
549 info, non-nullness, etc. So reset context sensitive
550 info if the two SSA_NAMEs aren't defined in the same
552 if (var_bb
!= copy_of_bb
)
553 reset_flow_sensitive_info (copy_of
[i
].value
);
555 else if (!POINTER_TYPE_P (TREE_TYPE (var
))
556 && SSA_NAME_RANGE_INFO (var
)
557 && !SSA_NAME_RANGE_INFO (copy_of
[i
].value
)
558 && var_bb
== copy_of_bb
)
559 duplicate_ssa_name_range_info (copy_of
[i
].value
,
560 SSA_NAME_RANGE_TYPE (var
),
561 SSA_NAME_RANGE_INFO (var
));
565 class copy_folder copy_folder
;
566 bool changed
= copy_folder
.substitute_and_fold ();
569 free_numbers_of_iterations_estimates (cfun
);
570 if (scev_initialized_p ())
580 /* Main entry point to the copy propagator.
582 PHIS_ONLY is true if we should only consider PHI nodes as generating
583 copy propagation opportunities.
585 The algorithm propagates the value COPY-OF using ssa_propagate. For
586 every variable X_i, COPY-OF(X_i) indicates which variable is X_i created
587 from. The following example shows how the algorithm proceeds at a
591 2 a_2 = PHI <a_24, x_1>
593 4 x_1 = PHI <x_298, a_5, a_2>
595 The end result should be that a_2, a_5, a_24 and x_1 are a copy of
596 x_298. Propagation proceeds as follows.
598 Visit #1: a_24 is copy-of x_1. Value changed.
599 Visit #2: a_2 is copy-of x_1. Value changed.
600 Visit #3: a_5 is copy-of x_1. Value changed.
601 Visit #4: x_1 is copy-of x_298. Value changed.
602 Visit #1: a_24 is copy-of x_298. Value changed.
603 Visit #2: a_2 is copy-of x_298. Value changed.
604 Visit #3: a_5 is copy-of x_298. Value changed.
605 Visit #4: x_1 is copy-of x_298. Stable state reached.
607 When visiting PHI nodes, we only consider arguments that flow
608 through edges marked executable by the propagation engine. So,
609 when visiting statement #2 for the first time, we will only look at
610 the first argument (a_24) and optimistically assume that its value
611 is the copy of a_24 (x_1). */
614 execute_copy_prop (void)
617 class copy_prop copy_prop
;
618 copy_prop
.ssa_propagate ();
619 if (fini_copy_prop ())
620 return TODO_cleanup_cfg
;
626 const pass_data pass_data_copy_prop
=
628 GIMPLE_PASS
, /* type */
629 "copyprop", /* name */
630 OPTGROUP_NONE
, /* optinfo_flags */
631 TV_TREE_COPY_PROP
, /* tv_id */
632 ( PROP_ssa
| PROP_cfg
), /* properties_required */
633 0, /* properties_provided */
634 0, /* properties_destroyed */
635 0, /* todo_flags_start */
636 0, /* todo_flags_finish */
639 class pass_copy_prop
: public gimple_opt_pass
642 pass_copy_prop (gcc::context
*ctxt
)
643 : gimple_opt_pass (pass_data_copy_prop
, ctxt
)
646 /* opt_pass methods: */
647 opt_pass
* clone () { return new pass_copy_prop (m_ctxt
); }
648 virtual bool gate (function
*) { return flag_tree_copy_prop
!= 0; }
649 virtual unsigned int execute (function
*) { return execute_copy_prop (); }
651 }; // class pass_copy_prop
656 make_pass_copy_prop (gcc::context
*ctxt
)
658 return new pass_copy_prop (ctxt
);