2015-06-11 Paul Thomas <pault@gcc.gnu.org>
[official-gcc.git] / gcc / tree-ssa-copy.c
blobea65289864572928e607619d9197450722a544f0
1 /* Copy propagation and SSA_NAME replacement support routines.
2 Copyright (C) 2004-2015 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 "input.h"
25 #include "alias.h"
26 #include "symtab.h"
27 #include "tree.h"
28 #include "fold-const.h"
29 #include "flags.h"
30 #include "tm_p.h"
31 #include "predict.h"
32 #include "hard-reg-set.h"
33 #include "input.h"
34 #include "function.h"
35 #include "dominance.h"
36 #include "cfg.h"
37 #include "basic-block.h"
38 #include "gimple-pretty-print.h"
39 #include "tree-ssa-alias.h"
40 #include "internal-fn.h"
41 #include "gimple-expr.h"
42 #include "is-a.h"
43 #include "gimple.h"
44 #include "gimple-iterator.h"
45 #include "gimple-ssa.h"
46 #include "tree-cfg.h"
47 #include "tree-phinodes.h"
48 #include "ssa-iterators.h"
49 #include "stringpool.h"
50 #include "tree-ssanames.h"
51 #include "tree-pass.h"
52 #include "tree-ssa-propagate.h"
53 #include "langhooks.h"
54 #include "cfgloop.h"
55 #include "tree-scalar-evolution.h"
56 #include "tree-ssa-dom.h"
57 #include "tree-ssa-loop-niter.h"
60 /* This file implements the copy propagation pass and provides a
61 handful of interfaces for performing const/copy propagation and
62 simple expression replacement which keep variable annotations
63 up-to-date.
65 We require that for any copy operation where the RHS and LHS have
66 a non-null memory tag the memory tag be the same. It is OK
67 for one or both of the memory tags to be NULL.
69 We also require tracking if a variable is dereferenced in a load or
70 store operation.
72 We enforce these requirements by having all copy propagation and
73 replacements of one SSA_NAME with a different SSA_NAME to use the
74 APIs defined in this file. */
76 /*---------------------------------------------------------------------------
77 Copy propagation
78 ---------------------------------------------------------------------------*/
79 /* Lattice for copy-propagation. The lattice is initialized to
80 UNDEFINED (value == NULL) for SSA names that can become a copy
81 of something or VARYING (value == self) if not (see get_copy_of_val
82 and stmt_may_generate_copy). Other values make the name a COPY
83 of that value.
85 When visiting a statement or PHI node the lattice value for an
86 SSA name can transition from UNDEFINED to COPY to VARYING. */
88 struct prop_value_t {
89 /* Copy-of value. */
90 tree value;
93 static prop_value_t *copy_of;
94 static unsigned n_copy_of;
97 /* Return true if this statement may generate a useful copy. */
99 static bool
100 stmt_may_generate_copy (gimple stmt)
102 if (gimple_code (stmt) == GIMPLE_PHI)
103 return !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (gimple_phi_result (stmt));
105 if (gimple_code (stmt) != GIMPLE_ASSIGN)
106 return false;
108 /* If the statement has volatile operands, it won't generate a
109 useful copy. */
110 if (gimple_has_volatile_ops (stmt))
111 return false;
113 /* Statements with loads and/or stores will never generate a useful copy. */
114 if (gimple_vuse (stmt))
115 return false;
117 /* Otherwise, the only statements that generate useful copies are
118 assignments whose RHS is just an SSA name that doesn't flow
119 through abnormal edges. */
120 return ((gimple_assign_rhs_code (stmt) == SSA_NAME
121 && !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (gimple_assign_rhs1 (stmt)))
122 || is_gimple_min_invariant (gimple_assign_rhs1 (stmt)));
126 /* Return the copy-of value for VAR. */
128 static inline prop_value_t *
129 get_copy_of_val (tree var)
131 prop_value_t *val = &copy_of[SSA_NAME_VERSION (var)];
133 if (val->value == NULL_TREE
134 && !stmt_may_generate_copy (SSA_NAME_DEF_STMT (var)))
136 /* If the variable will never generate a useful copy relation,
137 make it its own copy. */
138 val->value = var;
141 return val;
144 /* Return the variable VAR is a copy of or VAR if VAR isn't the result
145 of a copy. */
147 static inline tree
148 valueize_val (tree var)
150 if (TREE_CODE (var) == SSA_NAME)
152 tree val = get_copy_of_val (var)->value;
153 if (val)
154 return val;
156 return var;
159 /* Set VAL to be the copy of VAR. If that changed return true. */
161 static inline bool
162 set_copy_of_val (tree var, tree val)
164 unsigned int ver = SSA_NAME_VERSION (var);
165 tree old;
167 /* Set FIRST to be the first link in COPY_OF[DEST]. If that
168 changed, return true. */
169 old = copy_of[ver].value;
170 copy_of[ver].value = val;
172 if (old != val
173 || (val && !operand_equal_p (old, val, 0)))
174 return true;
176 return false;
180 /* Dump the copy-of value for variable VAR to FILE. */
182 static void
183 dump_copy_of (FILE *file, tree var)
185 tree val;
187 print_generic_expr (file, var, dump_flags);
188 if (TREE_CODE (var) != SSA_NAME)
189 return;
191 val = copy_of[SSA_NAME_VERSION (var)].value;
192 fprintf (file, " copy-of chain: ");
193 print_generic_expr (file, var, 0);
194 fprintf (file, " ");
195 if (!val)
196 fprintf (file, "[UNDEFINED]");
197 else if (val == var)
198 fprintf (file, "[NOT A COPY]");
199 else
201 fprintf (file, "-> ");
202 print_generic_expr (file, val, 0);
203 fprintf (file, " ");
204 fprintf (file, "[COPY]");
209 /* Evaluate the RHS of STMT. If it produces a valid copy, set the LHS
210 value and store the LHS into *RESULT_P. */
212 static enum ssa_prop_result
213 copy_prop_visit_assignment (gimple stmt, tree *result_p)
215 tree lhs, rhs;
217 lhs = gimple_assign_lhs (stmt);
218 rhs = valueize_val (gimple_assign_rhs1 (stmt));
220 if (TREE_CODE (lhs) == SSA_NAME)
222 /* Straight copy between two SSA names. First, make sure that
223 we can propagate the RHS into uses of LHS. */
224 if (!may_propagate_copy (lhs, rhs))
225 return SSA_PROP_VARYING;
227 *result_p = lhs;
228 if (set_copy_of_val (*result_p, rhs))
229 return SSA_PROP_INTERESTING;
230 else
231 return SSA_PROP_NOT_INTERESTING;
234 return SSA_PROP_VARYING;
238 /* Visit the GIMPLE_COND STMT. Return SSA_PROP_INTERESTING
239 if it can determine which edge will be taken. Otherwise, return
240 SSA_PROP_VARYING. */
242 static enum ssa_prop_result
243 copy_prop_visit_cond_stmt (gimple stmt, edge *taken_edge_p)
245 enum ssa_prop_result retval = SSA_PROP_VARYING;
246 location_t loc = gimple_location (stmt);
248 tree op0 = valueize_val (gimple_cond_lhs (stmt));
249 tree op1 = valueize_val (gimple_cond_rhs (stmt));
251 /* See if we can determine the predicate's value. */
252 if (dump_file && (dump_flags & TDF_DETAILS))
254 fprintf (dump_file, "Trying to determine truth value of ");
255 fprintf (dump_file, "predicate ");
256 print_gimple_stmt (dump_file, stmt, 0, 0);
259 /* Fold COND and see whether we get a useful result. */
260 tree folded_cond = fold_binary_loc (loc, gimple_cond_code (stmt),
261 boolean_type_node, op0, op1);
262 if (folded_cond)
264 basic_block bb = gimple_bb (stmt);
265 *taken_edge_p = find_taken_edge (bb, folded_cond);
266 if (*taken_edge_p)
267 retval = SSA_PROP_INTERESTING;
270 if (dump_file && (dump_flags & TDF_DETAILS) && *taken_edge_p)
271 fprintf (dump_file, "\nConditional will always take edge %d->%d\n",
272 (*taken_edge_p)->src->index, (*taken_edge_p)->dest->index);
274 return retval;
278 /* Evaluate statement STMT. If the statement produces a new output
279 value, return SSA_PROP_INTERESTING and store the SSA_NAME holding
280 the new value in *RESULT_P.
282 If STMT is a conditional branch and we can determine its truth
283 value, set *TAKEN_EDGE_P accordingly.
285 If the new value produced by STMT is varying, return
286 SSA_PROP_VARYING. */
288 static enum ssa_prop_result
289 copy_prop_visit_stmt (gimple stmt, edge *taken_edge_p, tree *result_p)
291 enum ssa_prop_result retval;
293 if (dump_file && (dump_flags & TDF_DETAILS))
295 fprintf (dump_file, "\nVisiting statement:\n");
296 print_gimple_stmt (dump_file, stmt, 0, dump_flags);
297 fprintf (dump_file, "\n");
300 if (gimple_assign_single_p (stmt)
301 && TREE_CODE (gimple_assign_lhs (stmt)) == SSA_NAME
302 && (TREE_CODE (gimple_assign_rhs1 (stmt)) == SSA_NAME
303 || is_gimple_min_invariant (gimple_assign_rhs1 (stmt))))
305 /* If the statement is a copy assignment, evaluate its RHS to
306 see if the lattice value of its output has changed. */
307 retval = copy_prop_visit_assignment (stmt, result_p);
309 else if (gimple_code (stmt) == GIMPLE_COND)
311 /* See if we can determine which edge goes out of a conditional
312 jump. */
313 retval = copy_prop_visit_cond_stmt (stmt, taken_edge_p);
315 else
316 retval = SSA_PROP_VARYING;
318 if (retval == SSA_PROP_VARYING)
320 tree def;
321 ssa_op_iter i;
323 /* Any other kind of statement is not interesting for constant
324 propagation and, therefore, not worth simulating. */
325 if (dump_file && (dump_flags & TDF_DETAILS))
326 fprintf (dump_file, "No interesting values produced.\n");
328 /* The assignment is not a copy operation. Don't visit this
329 statement again and mark all the definitions in the statement
330 to be copies of nothing. */
331 FOR_EACH_SSA_TREE_OPERAND (def, stmt, i, SSA_OP_ALL_DEFS)
332 set_copy_of_val (def, def);
335 return retval;
339 /* Visit PHI node PHI. If all the arguments produce the same value,
340 set it to be the value of the LHS of PHI. */
342 static enum ssa_prop_result
343 copy_prop_visit_phi_node (gphi *phi)
345 enum ssa_prop_result retval;
346 unsigned i;
347 prop_value_t phi_val = { NULL_TREE };
349 tree lhs = gimple_phi_result (phi);
351 if (dump_file && (dump_flags & TDF_DETAILS))
353 fprintf (dump_file, "\nVisiting PHI node: ");
354 print_gimple_stmt (dump_file, phi, 0, dump_flags);
357 for (i = 0; i < gimple_phi_num_args (phi); i++)
359 prop_value_t *arg_val;
360 tree arg_value;
361 tree arg = gimple_phi_arg_def (phi, i);
362 edge e = gimple_phi_arg_edge (phi, i);
364 /* We don't care about values flowing through non-executable
365 edges. */
366 if (!(e->flags & EDGE_EXECUTABLE))
367 continue;
369 /* Names that flow through abnormal edges cannot be used to
370 derive copies. */
371 if (TREE_CODE (arg) == SSA_NAME && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (arg))
373 phi_val.value = lhs;
374 break;
377 if (dump_file && (dump_flags & TDF_DETAILS))
379 fprintf (dump_file, "\tArgument #%d: ", i);
380 dump_copy_of (dump_file, arg);
381 fprintf (dump_file, "\n");
384 if (TREE_CODE (arg) == SSA_NAME)
386 arg_val = get_copy_of_val (arg);
388 /* If we didn't visit the definition of arg yet treat it as
389 UNDEFINED. This also handles PHI arguments that are the
390 same as lhs. We'll come here again. */
391 if (!arg_val->value)
392 continue;
394 arg_value = arg_val->value;
396 else
397 arg_value = valueize_val (arg);
399 /* In loop-closed SSA form do not copy-propagate SSA-names across
400 loop exit edges. */
401 if (loops_state_satisfies_p (LOOP_CLOSED_SSA)
402 && TREE_CODE (arg_value) == SSA_NAME
403 && loop_exit_edge_p (e->src->loop_father, e))
405 phi_val.value = lhs;
406 break;
409 /* If the LHS didn't have a value yet, make it a copy of the
410 first argument we find. */
411 if (phi_val.value == NULL_TREE)
413 phi_val.value = arg_value;
414 continue;
417 /* If PHI_VAL and ARG don't have a common copy-of chain, then
418 this PHI node cannot be a copy operation. */
419 if (phi_val.value != arg_value
420 && !operand_equal_p (phi_val.value, arg_value, 0))
422 phi_val.value = lhs;
423 break;
427 if (phi_val.value
428 && may_propagate_copy (lhs, phi_val.value)
429 && set_copy_of_val (lhs, phi_val.value))
430 retval = (phi_val.value != lhs) ? SSA_PROP_INTERESTING : SSA_PROP_VARYING;
431 else
432 retval = SSA_PROP_NOT_INTERESTING;
434 if (dump_file && (dump_flags & TDF_DETAILS))
436 fprintf (dump_file, "PHI node ");
437 dump_copy_of (dump_file, lhs);
438 fprintf (dump_file, "\nTelling the propagator to ");
439 if (retval == SSA_PROP_INTERESTING)
440 fprintf (dump_file, "add SSA edges out of this PHI and continue.");
441 else if (retval == SSA_PROP_VARYING)
442 fprintf (dump_file, "add SSA edges out of this PHI and never visit again.");
443 else
444 fprintf (dump_file, "do nothing with SSA edges and keep iterating.");
445 fprintf (dump_file, "\n\n");
448 return retval;
452 /* Initialize structures used for copy propagation. */
454 static void
455 init_copy_prop (void)
457 basic_block bb;
459 n_copy_of = num_ssa_names;
460 copy_of = XCNEWVEC (prop_value_t, n_copy_of);
462 FOR_EACH_BB_FN (bb, cfun)
464 for (gimple_stmt_iterator si = gsi_start_bb (bb); !gsi_end_p (si);
465 gsi_next (&si))
467 gimple stmt = gsi_stmt (si);
468 ssa_op_iter iter;
469 tree def;
471 /* The only statements that we care about are those that may
472 generate useful copies. We also need to mark conditional
473 jumps so that their outgoing edges are added to the work
474 lists of the propagator. */
475 if (stmt_ends_bb_p (stmt))
476 prop_set_simulate_again (stmt, true);
477 else if (stmt_may_generate_copy (stmt))
478 prop_set_simulate_again (stmt, true);
479 else
480 prop_set_simulate_again (stmt, false);
482 /* Mark all the outputs of this statement as not being
483 the copy of anything. */
484 FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_ALL_DEFS)
485 if (!prop_simulate_again_p (stmt))
486 set_copy_of_val (def, def);
489 for (gphi_iterator si = gsi_start_phis (bb); !gsi_end_p (si);
490 gsi_next (&si))
492 gphi *phi = si.phi ();
493 tree def;
495 def = gimple_phi_result (phi);
496 if (virtual_operand_p (def))
497 prop_set_simulate_again (phi, false);
498 else
499 prop_set_simulate_again (phi, true);
501 if (!prop_simulate_again_p (phi))
502 set_copy_of_val (def, def);
507 /* Callback for substitute_and_fold to get at the final copy-of values. */
509 static tree
510 get_value (tree name)
512 tree val;
513 if (SSA_NAME_VERSION (name) >= n_copy_of)
514 return NULL_TREE;
515 val = copy_of[SSA_NAME_VERSION (name)].value;
516 if (val && val != name)
517 return val;
518 return NULL_TREE;
521 /* Deallocate memory used in copy propagation and do final
522 substitution. */
524 static bool
525 fini_copy_prop (void)
527 unsigned i;
529 /* Set the final copy-of value for each variable by traversing the
530 copy-of chains. */
531 for (i = 1; i < num_ssa_names; i++)
533 tree var = ssa_name (i);
534 if (!var
535 || !copy_of[i].value
536 || copy_of[i].value == var)
537 continue;
539 /* In theory the points-to solution of all members of the
540 copy chain is their intersection. For now we do not bother
541 to compute this but only make sure we do not lose points-to
542 information completely by setting the points-to solution
543 of the representative to the first solution we find if
544 it doesn't have one already. */
545 if (copy_of[i].value != var
546 && TREE_CODE (copy_of[i].value) == SSA_NAME)
548 basic_block copy_of_bb
549 = gimple_bb (SSA_NAME_DEF_STMT (copy_of[i].value));
550 basic_block var_bb = gimple_bb (SSA_NAME_DEF_STMT (var));
551 if (POINTER_TYPE_P (TREE_TYPE (var))
552 && SSA_NAME_PTR_INFO (var)
553 && !SSA_NAME_PTR_INFO (copy_of[i].value))
555 duplicate_ssa_name_ptr_info (copy_of[i].value,
556 SSA_NAME_PTR_INFO (var));
557 /* Points-to information is cfg insensitive,
558 but alignment info might be cfg sensitive, if it
559 e.g. is derived from VRP derived non-zero bits.
560 So, do not copy alignment info if the two SSA_NAMEs
561 aren't defined in the same basic block. */
562 if (var_bb != copy_of_bb)
563 mark_ptr_info_alignment_unknown
564 (SSA_NAME_PTR_INFO (copy_of[i].value));
566 else if (!POINTER_TYPE_P (TREE_TYPE (var))
567 && SSA_NAME_RANGE_INFO (var)
568 && !SSA_NAME_RANGE_INFO (copy_of[i].value)
569 && var_bb == copy_of_bb)
570 duplicate_ssa_name_range_info (copy_of[i].value,
571 SSA_NAME_RANGE_TYPE (var),
572 SSA_NAME_RANGE_INFO (var));
576 bool changed = substitute_and_fold (get_value, NULL, true);
577 if (changed)
579 free_numbers_of_iterations_estimates ();
580 if (scev_initialized_p ())
581 scev_reset ();
584 free (copy_of);
586 return changed;
590 /* Main entry point to the copy propagator.
592 PHIS_ONLY is true if we should only consider PHI nodes as generating
593 copy propagation opportunities.
595 The algorithm propagates the value COPY-OF using ssa_propagate. For
596 every variable X_i, COPY-OF(X_i) indicates which variable is X_i created
597 from. The following example shows how the algorithm proceeds at a
598 high level:
600 1 a_24 = x_1
601 2 a_2 = PHI <a_24, x_1>
602 3 a_5 = PHI <a_2>
603 4 x_1 = PHI <x_298, a_5, a_2>
605 The end result should be that a_2, a_5, a_24 and x_1 are a copy of
606 x_298. Propagation proceeds as follows.
608 Visit #1: a_24 is copy-of x_1. Value changed.
609 Visit #2: a_2 is copy-of x_1. Value changed.
610 Visit #3: a_5 is copy-of x_1. Value changed.
611 Visit #4: x_1 is copy-of x_298. Value changed.
612 Visit #1: a_24 is copy-of x_298. Value changed.
613 Visit #2: a_2 is copy-of x_298. Value changed.
614 Visit #3: a_5 is copy-of x_298. Value changed.
615 Visit #4: x_1 is copy-of x_298. Stable state reached.
617 When visiting PHI nodes, we only consider arguments that flow
618 through edges marked executable by the propagation engine. So,
619 when visiting statement #2 for the first time, we will only look at
620 the first argument (a_24) and optimistically assume that its value
621 is the copy of a_24 (x_1). */
623 static unsigned int
624 execute_copy_prop (void)
626 init_copy_prop ();
627 ssa_propagate (copy_prop_visit_stmt, copy_prop_visit_phi_node);
628 if (fini_copy_prop ())
629 return TODO_cleanup_cfg;
630 return 0;
633 namespace {
635 const pass_data pass_data_copy_prop =
637 GIMPLE_PASS, /* type */
638 "copyprop", /* name */
639 OPTGROUP_NONE, /* optinfo_flags */
640 TV_TREE_COPY_PROP, /* tv_id */
641 ( PROP_ssa | PROP_cfg ), /* properties_required */
642 0, /* properties_provided */
643 0, /* properties_destroyed */
644 0, /* todo_flags_start */
645 0, /* todo_flags_finish */
648 class pass_copy_prop : public gimple_opt_pass
650 public:
651 pass_copy_prop (gcc::context *ctxt)
652 : gimple_opt_pass (pass_data_copy_prop, ctxt)
655 /* opt_pass methods: */
656 opt_pass * clone () { return new pass_copy_prop (m_ctxt); }
657 virtual bool gate (function *) { return flag_tree_copy_prop != 0; }
658 virtual unsigned int execute (function *) { return execute_copy_prop (); }
660 }; // class pass_copy_prop
662 } // anon namespace
664 gimple_opt_pass *
665 make_pass_copy_prop (gcc::context *ctxt)
667 return new pass_copy_prop (ctxt);