Fix typo.
[official-gcc.git] / gcc / tree-ssa-copy.c
blob0f70372c80ef2809866fe1999ac73043925f5663
1 /* Copy propagation and SSA_NAME replacement support routines.
2 Copyright (C) 2004-2013 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)
9 any later version.
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/>. */
20 #include "config.h"
21 #include "system.h"
22 #include "coretypes.h"
23 #include "tm.h"
24 #include "tree.h"
25 #include "flags.h"
26 #include "tm_p.h"
27 #include "basic-block.h"
28 #include "function.h"
29 #include "gimple-pretty-print.h"
30 #include "gimple.h"
31 #include "gimple-iterator.h"
32 #include "gimple-ssa.h"
33 #include "tree-cfg.h"
34 #include "tree-phinodes.h"
35 #include "ssa-iterators.h"
36 #include "tree-ssanames.h"
37 #include "tree-pass.h"
38 #include "tree-ssa-propagate.h"
39 #include "langhooks.h"
40 #include "cfgloop.h"
41 #include "tree-scalar-evolution.h"
42 #include "tree-ssa-dom.h"
44 /* This file implements the copy propagation pass and provides a
45 handful of interfaces for performing const/copy propagation and
46 simple expression replacement which keep variable annotations
47 up-to-date.
49 We require that for any copy operation where the RHS and LHS have
50 a non-null memory tag the memory tag be the same. It is OK
51 for one or both of the memory tags to be NULL.
53 We also require tracking if a variable is dereferenced in a load or
54 store operation.
56 We enforce these requirements by having all copy propagation and
57 replacements of one SSA_NAME with a different SSA_NAME to use the
58 APIs defined in this file. */
60 /*---------------------------------------------------------------------------
61 Copy propagation
62 ---------------------------------------------------------------------------*/
63 /* Lattice for copy-propagation. The lattice is initialized to
64 UNDEFINED (value == NULL) for SSA names that can become a copy
65 of something or VARYING (value == self) if not (see get_copy_of_val
66 and stmt_may_generate_copy). Other values make the name a COPY
67 of that value.
69 When visiting a statement or PHI node the lattice value for an
70 SSA name can transition from UNDEFINED to COPY to VARYING. */
72 struct prop_value_d {
73 /* Copy-of value. */
74 tree value;
76 typedef struct prop_value_d prop_value_t;
78 static prop_value_t *copy_of;
79 static unsigned n_copy_of;
82 /* Return true if this statement may generate a useful copy. */
84 static bool
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)
91 return false;
93 /* If the statement has volatile operands, it won't generate a
94 useful copy. */
95 if (gimple_has_volatile_ops (stmt))
96 return false;
98 /* Statements with loads and/or stores will never generate a useful copy. */
99 if (gimple_vuse (stmt))
100 return false;
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 = &copy_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. */
123 val->value = var;
126 return val;
129 /* Return the variable VAR is a copy of or VAR if VAR isn't the result
130 of a copy. */
132 static inline tree
133 valueize_val (tree var)
135 if (TREE_CODE (var) == SSA_NAME)
137 tree val = get_copy_of_val (var)->value;
138 if (val)
139 return val;
141 return var;
144 /* Set VAL to be the copy of VAR. If that changed return true. */
146 static inline bool
147 set_copy_of_val (tree var, tree val)
149 unsigned int ver = SSA_NAME_VERSION (var);
150 tree old;
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;
157 if (old != val
158 || (val && !operand_equal_p (old, val, 0)))
159 return true;
161 return false;
165 /* Dump the copy-of value for variable VAR to FILE. */
167 static void
168 dump_copy_of (FILE *file, tree var)
170 tree val;
172 print_generic_expr (file, var, dump_flags);
173 if (TREE_CODE (var) != SSA_NAME)
174 return;
176 val = copy_of[SSA_NAME_VERSION (var)].value;
177 fprintf (file, " copy-of chain: ");
178 print_generic_expr (file, var, 0);
179 fprintf (file, " ");
180 if (!val)
181 fprintf (file, "[UNDEFINED]");
182 else if (val == var)
183 fprintf (file, "[NOT A COPY]");
184 else
186 fprintf (file, "-> ");
187 print_generic_expr (file, val, 0);
188 fprintf (file, " ");
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)
200 tree lhs, rhs;
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;
212 *result_p = lhs;
213 if (set_copy_of_val (*result_p, rhs))
214 return SSA_PROP_INTERESTING;
215 else
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
225 SSA_PROP_VARYING. */
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 = gimple_cond_lhs (stmt);
234 tree op1 = gimple_cond_rhs (stmt);
236 /* The only conditionals that we may be able to compute statically
237 are predicates involving two SSA_NAMEs. */
238 if (TREE_CODE (op0) == SSA_NAME && TREE_CODE (op1) == SSA_NAME)
240 op0 = valueize_val (op0);
241 op1 = valueize_val (op1);
243 /* See if we can determine the predicate's value. */
244 if (dump_file && (dump_flags & TDF_DETAILS))
246 fprintf (dump_file, "Trying to determine truth value of ");
247 fprintf (dump_file, "predicate ");
248 print_gimple_stmt (dump_file, stmt, 0, 0);
251 /* We can fold COND and get a useful result only when we have
252 the same SSA_NAME on both sides of a comparison operator. */
253 if (op0 == op1)
255 tree folded_cond = fold_binary_loc (loc, gimple_cond_code (stmt),
256 boolean_type_node, op0, op1);
257 if (folded_cond)
259 basic_block bb = gimple_bb (stmt);
260 *taken_edge_p = find_taken_edge (bb, folded_cond);
261 if (*taken_edge_p)
262 retval = SSA_PROP_INTERESTING;
267 if (dump_file && (dump_flags & TDF_DETAILS) && *taken_edge_p)
268 fprintf (dump_file, "\nConditional will always take edge %d->%d\n",
269 (*taken_edge_p)->src->index, (*taken_edge_p)->dest->index);
271 return retval;
275 /* Evaluate statement STMT. If the statement produces a new output
276 value, return SSA_PROP_INTERESTING and store the SSA_NAME holding
277 the new value in *RESULT_P.
279 If STMT is a conditional branch and we can determine its truth
280 value, set *TAKEN_EDGE_P accordingly.
282 If the new value produced by STMT is varying, return
283 SSA_PROP_VARYING. */
285 static enum ssa_prop_result
286 copy_prop_visit_stmt (gimple stmt, edge *taken_edge_p, tree *result_p)
288 enum ssa_prop_result retval;
290 if (dump_file && (dump_flags & TDF_DETAILS))
292 fprintf (dump_file, "\nVisiting statement:\n");
293 print_gimple_stmt (dump_file, stmt, 0, dump_flags);
294 fprintf (dump_file, "\n");
297 if (gimple_assign_single_p (stmt)
298 && TREE_CODE (gimple_assign_lhs (stmt)) == SSA_NAME
299 && (TREE_CODE (gimple_assign_rhs1 (stmt)) == SSA_NAME
300 || is_gimple_min_invariant (gimple_assign_rhs1 (stmt))))
302 /* If the statement is a copy assignment, evaluate its RHS to
303 see if the lattice value of its output has changed. */
304 retval = copy_prop_visit_assignment (stmt, result_p);
306 else if (gimple_code (stmt) == GIMPLE_COND)
308 /* See if we can determine which edge goes out of a conditional
309 jump. */
310 retval = copy_prop_visit_cond_stmt (stmt, taken_edge_p);
312 else
313 retval = SSA_PROP_VARYING;
315 if (retval == SSA_PROP_VARYING)
317 tree def;
318 ssa_op_iter i;
320 /* Any other kind of statement is not interesting for constant
321 propagation and, therefore, not worth simulating. */
322 if (dump_file && (dump_flags & TDF_DETAILS))
323 fprintf (dump_file, "No interesting values produced.\n");
325 /* The assignment is not a copy operation. Don't visit this
326 statement again and mark all the definitions in the statement
327 to be copies of nothing. */
328 FOR_EACH_SSA_TREE_OPERAND (def, stmt, i, SSA_OP_ALL_DEFS)
329 set_copy_of_val (def, def);
332 return retval;
336 /* Visit PHI node PHI. If all the arguments produce the same value,
337 set it to be the value of the LHS of PHI. */
339 static enum ssa_prop_result
340 copy_prop_visit_phi_node (gimple phi)
342 enum ssa_prop_result retval;
343 unsigned i;
344 prop_value_t phi_val = { NULL_TREE };
346 tree lhs = gimple_phi_result (phi);
348 if (dump_file && (dump_flags & TDF_DETAILS))
350 fprintf (dump_file, "\nVisiting PHI node: ");
351 print_gimple_stmt (dump_file, phi, 0, dump_flags);
354 for (i = 0; i < gimple_phi_num_args (phi); i++)
356 prop_value_t *arg_val;
357 tree arg_value;
358 tree arg = gimple_phi_arg_def (phi, i);
359 edge e = gimple_phi_arg_edge (phi, i);
361 /* We don't care about values flowing through non-executable
362 edges. */
363 if (!(e->flags & EDGE_EXECUTABLE))
364 continue;
366 /* Names that flow through abnormal edges cannot be used to
367 derive copies. */
368 if (TREE_CODE (arg) == SSA_NAME && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (arg))
370 phi_val.value = lhs;
371 break;
374 if (dump_file && (dump_flags & TDF_DETAILS))
376 fprintf (dump_file, "\tArgument #%d: ", i);
377 dump_copy_of (dump_file, arg);
378 fprintf (dump_file, "\n");
381 if (TREE_CODE (arg) == SSA_NAME)
383 arg_val = get_copy_of_val (arg);
385 /* If we didn't visit the definition of arg yet treat it as
386 UNDEFINED. This also handles PHI arguments that are the
387 same as lhs. We'll come here again. */
388 if (!arg_val->value)
389 continue;
391 arg_value = arg_val->value;
393 else
394 arg_value = valueize_val (arg);
396 /* Avoid copy propagation from an inner into an outer loop.
397 Otherwise, this may move loop variant variables outside of
398 their loops and prevent coalescing opportunities. If the
399 value was loop invariant, it will be hoisted by LICM and
400 exposed for copy propagation.
401 ??? The value will be always loop invariant.
402 In loop-closed SSA form do not copy-propagate through
403 PHI nodes in blocks with a loop exit edge predecessor. */
404 if (current_loops
405 && TREE_CODE (arg_value) == SSA_NAME
406 && (loop_depth_of_name (arg_value) > loop_depth_of_name (lhs)
407 || (loops_state_satisfies_p (LOOP_CLOSED_SSA)
408 && loop_exit_edge_p (e->src->loop_father, e))))
410 phi_val.value = lhs;
411 break;
414 /* If the LHS didn't have a value yet, make it a copy of the
415 first argument we find. */
416 if (phi_val.value == NULL_TREE)
418 phi_val.value = arg_value;
419 continue;
422 /* If PHI_VAL and ARG don't have a common copy-of chain, then
423 this PHI node cannot be a copy operation. */
424 if (phi_val.value != arg_value
425 && !operand_equal_p (phi_val.value, arg_value, 0))
427 phi_val.value = lhs;
428 break;
432 if (phi_val.value
433 && may_propagate_copy (lhs, phi_val.value)
434 && set_copy_of_val (lhs, phi_val.value))
435 retval = (phi_val.value != lhs) ? SSA_PROP_INTERESTING : SSA_PROP_VARYING;
436 else
437 retval = SSA_PROP_NOT_INTERESTING;
439 if (dump_file && (dump_flags & TDF_DETAILS))
441 fprintf (dump_file, "PHI node ");
442 dump_copy_of (dump_file, lhs);
443 fprintf (dump_file, "\nTelling the propagator to ");
444 if (retval == SSA_PROP_INTERESTING)
445 fprintf (dump_file, "add SSA edges out of this PHI and continue.");
446 else if (retval == SSA_PROP_VARYING)
447 fprintf (dump_file, "add SSA edges out of this PHI and never visit again.");
448 else
449 fprintf (dump_file, "do nothing with SSA edges and keep iterating.");
450 fprintf (dump_file, "\n\n");
453 return retval;
457 /* Initialize structures used for copy propagation. */
459 static void
460 init_copy_prop (void)
462 basic_block bb;
464 n_copy_of = num_ssa_names;
465 copy_of = XCNEWVEC (prop_value_t, n_copy_of);
467 FOR_EACH_BB (bb)
469 gimple_stmt_iterator si;
470 int depth = bb_loop_depth (bb);
472 for (si = gsi_start_bb (bb); !gsi_end_p (si); gsi_next (&si))
474 gimple stmt = gsi_stmt (si);
475 ssa_op_iter iter;
476 tree def;
478 /* The only statements that we care about are those that may
479 generate useful copies. We also need to mark conditional
480 jumps so that their outgoing edges are added to the work
481 lists of the propagator.
483 Avoid copy propagation from an inner into an outer loop.
484 Otherwise, this may move loop variant variables outside of
485 their loops and prevent coalescing opportunities. If the
486 value was loop invariant, it will be hoisted by LICM and
487 exposed for copy propagation.
488 ??? This doesn't make sense. */
489 if (stmt_ends_bb_p (stmt))
490 prop_set_simulate_again (stmt, true);
491 else if (stmt_may_generate_copy (stmt)
492 /* Since we are iterating over the statements in
493 BB, not the phi nodes, STMT will always be an
494 assignment. */
495 && loop_depth_of_name (gimple_assign_rhs1 (stmt)) <= depth)
496 prop_set_simulate_again (stmt, true);
497 else
498 prop_set_simulate_again (stmt, false);
500 /* Mark all the outputs of this statement as not being
501 the copy of anything. */
502 FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_ALL_DEFS)
503 if (!prop_simulate_again_p (stmt))
504 set_copy_of_val (def, def);
507 for (si = gsi_start_phis (bb); !gsi_end_p (si); gsi_next (&si))
509 gimple phi = gsi_stmt (si);
510 tree def;
512 def = gimple_phi_result (phi);
513 if (virtual_operand_p (def))
514 prop_set_simulate_again (phi, false);
515 else
516 prop_set_simulate_again (phi, true);
518 if (!prop_simulate_again_p (phi))
519 set_copy_of_val (def, def);
524 /* Callback for substitute_and_fold to get at the final copy-of values. */
526 static tree
527 get_value (tree name)
529 tree val;
530 if (SSA_NAME_VERSION (name) >= n_copy_of)
531 return NULL_TREE;
532 val = copy_of[SSA_NAME_VERSION (name)].value;
533 if (val && val != name)
534 return val;
535 return NULL_TREE;
538 /* Deallocate memory used in copy propagation and do final
539 substitution. */
541 static void
542 fini_copy_prop (void)
544 unsigned i;
546 /* Set the final copy-of value for each variable by traversing the
547 copy-of chains. */
548 for (i = 1; i < num_ssa_names; i++)
550 tree var = ssa_name (i);
551 if (!var
552 || !copy_of[i].value
553 || copy_of[i].value == var)
554 continue;
556 /* In theory the points-to solution of all members of the
557 copy chain is their intersection. For now we do not bother
558 to compute this but only make sure we do not lose points-to
559 information completely by setting the points-to solution
560 of the representative to the first solution we find if
561 it doesn't have one already. */
562 if (copy_of[i].value != var
563 && TREE_CODE (copy_of[i].value) == SSA_NAME)
565 if (POINTER_TYPE_P (TREE_TYPE (var))
566 && SSA_NAME_PTR_INFO (var)
567 && !SSA_NAME_PTR_INFO (copy_of[i].value))
568 duplicate_ssa_name_ptr_info (copy_of[i].value,
569 SSA_NAME_PTR_INFO (var));
570 else if (!POINTER_TYPE_P (TREE_TYPE (var))
571 && SSA_NAME_RANGE_INFO (var)
572 && !SSA_NAME_RANGE_INFO (copy_of[i].value))
573 duplicate_ssa_name_range_info (copy_of[i].value,
574 SSA_NAME_RANGE_INFO (var));
578 /* Don't do DCE if SCEV is initialized. It would destroy the scev cache. */
579 substitute_and_fold (get_value, NULL, !scev_initialized_p ());
581 free (copy_of);
585 /* Main entry point to the copy propagator.
587 PHIS_ONLY is true if we should only consider PHI nodes as generating
588 copy propagation opportunities.
590 The algorithm propagates the value COPY-OF using ssa_propagate. For
591 every variable X_i, COPY-OF(X_i) indicates which variable is X_i created
592 from. The following example shows how the algorithm proceeds at a
593 high level:
595 1 a_24 = x_1
596 2 a_2 = PHI <a_24, x_1>
597 3 a_5 = PHI <a_2>
598 4 x_1 = PHI <x_298, a_5, a_2>
600 The end result should be that a_2, a_5, a_24 and x_1 are a copy of
601 x_298. Propagation proceeds as follows.
603 Visit #1: a_24 is copy-of x_1. Value changed.
604 Visit #2: a_2 is copy-of x_1. Value changed.
605 Visit #3: a_5 is copy-of x_1. Value changed.
606 Visit #4: x_1 is copy-of x_298. Value changed.
607 Visit #1: a_24 is copy-of x_298. Value changed.
608 Visit #2: a_2 is copy-of x_298. Value changed.
609 Visit #3: a_5 is copy-of x_298. Value changed.
610 Visit #4: x_1 is copy-of x_298. Stable state reached.
612 When visiting PHI nodes, we only consider arguments that flow
613 through edges marked executable by the propagation engine. So,
614 when visiting statement #2 for the first time, we will only look at
615 the first argument (a_24) and optimistically assume that its value
616 is the copy of a_24 (x_1). */
618 static unsigned int
619 execute_copy_prop (void)
621 init_copy_prop ();
622 ssa_propagate (copy_prop_visit_stmt, copy_prop_visit_phi_node);
623 fini_copy_prop ();
624 return 0;
627 static bool
628 gate_copy_prop (void)
630 return flag_tree_copy_prop != 0;
633 namespace {
635 const pass_data pass_data_copy_prop =
637 GIMPLE_PASS, /* type */
638 "copyprop", /* name */
639 OPTGROUP_NONE, /* optinfo_flags */
640 true, /* has_gate */
641 true, /* has_execute */
642 TV_TREE_COPY_PROP, /* tv_id */
643 ( PROP_ssa | PROP_cfg ), /* properties_required */
644 0, /* properties_provided */
645 0, /* properties_destroyed */
646 0, /* todo_flags_start */
647 ( TODO_cleanup_cfg | TODO_verify_ssa
648 | TODO_update_ssa ), /* todo_flags_finish */
651 class pass_copy_prop : public gimple_opt_pass
653 public:
654 pass_copy_prop (gcc::context *ctxt)
655 : gimple_opt_pass (pass_data_copy_prop, ctxt)
658 /* opt_pass methods: */
659 opt_pass * clone () { return new pass_copy_prop (m_ctxt); }
660 bool gate () { return gate_copy_prop (); }
661 unsigned int execute () { return execute_copy_prop (); }
663 }; // class pass_copy_prop
665 } // anon namespace
667 gimple_opt_pass *
668 make_pass_copy_prop (gcc::context *ctxt)
670 return new pass_copy_prop (ctxt);