re PR c++/69145 (Bogus 'warning: #pragma implementation for ‘...’ appears after file...
[gcc.git] / gcc / tree-ssa-copy.c
1 /* Copy propagation and SSA_NAME replacement support routines.
2 Copyright (C) 2004-2016 Free Software Foundation, Inc.
3
4 This file is part of GCC.
5
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.
10
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.
15
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/>. */
19
20 #include "config.h"
21 #include "system.h"
22 #include "coretypes.h"
23 #include "backend.h"
24 #include "tree.h"
25 #include "gimple.h"
26 #include "tree-pass.h"
27 #include "ssa.h"
28 #include "gimple-pretty-print.h"
29 #include "fold-const.h"
30 #include "gimple-iterator.h"
31 #include "tree-cfg.h"
32 #include "tree-ssa-propagate.h"
33 #include "cfgloop.h"
34 #include "tree-scalar-evolution.h"
35 #include "tree-ssa-loop-niter.h"
36
37
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
41 up-to-date.
42
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.
46
47 We also require tracking if a variable is dereferenced in a load or
48 store operation.
49
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. */
53
54 /*---------------------------------------------------------------------------
55 Copy propagation
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
61 of that value.
62
63 When visiting a statement or PHI node the lattice value for an
64 SSA name can transition from UNDEFINED to COPY to VARYING. */
65
66 struct prop_value_t {
67 /* Copy-of value. */
68 tree value;
69 };
70
71 static prop_value_t *copy_of;
72 static unsigned n_copy_of;
73
74
75 /* Return true if this statement may generate a useful copy. */
76
77 static bool
78 stmt_may_generate_copy (gimple *stmt)
79 {
80 if (gimple_code (stmt) == GIMPLE_PHI)
81 return !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (gimple_phi_result (stmt));
82
83 if (gimple_code (stmt) != GIMPLE_ASSIGN)
84 return false;
85
86 /* If the statement has volatile operands, it won't generate a
87 useful copy. */
88 if (gimple_has_volatile_ops (stmt))
89 return false;
90
91 /* Statements with loads and/or stores will never generate a useful copy. */
92 if (gimple_vuse (stmt))
93 return false;
94
95 /* Otherwise, the only statements that generate useful copies are
96 assignments whose RHS is just an SSA name that doesn't flow
97 through abnormal edges. */
98 return ((gimple_assign_rhs_code (stmt) == SSA_NAME
99 && !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (gimple_assign_rhs1 (stmt)))
100 || is_gimple_min_invariant (gimple_assign_rhs1 (stmt)));
101 }
102
103
104 /* Return the copy-of value for VAR. */
105
106 static inline prop_value_t *
107 get_copy_of_val (tree var)
108 {
109 prop_value_t *val = &copy_of[SSA_NAME_VERSION (var)];
110
111 if (val->value == NULL_TREE
112 && !stmt_may_generate_copy (SSA_NAME_DEF_STMT (var)))
113 {
114 /* If the variable will never generate a useful copy relation,
115 make it its own copy. */
116 val->value = var;
117 }
118
119 return val;
120 }
121
122 /* Return the variable VAR is a copy of or VAR if VAR isn't the result
123 of a copy. */
124
125 static inline tree
126 valueize_val (tree var)
127 {
128 if (TREE_CODE (var) == SSA_NAME)
129 {
130 tree val = get_copy_of_val (var)->value;
131 if (val)
132 return val;
133 }
134 return var;
135 }
136
137 /* Set VAL to be the copy of VAR. If that changed return true. */
138
139 static inline bool
140 set_copy_of_val (tree var, tree val)
141 {
142 unsigned int ver = SSA_NAME_VERSION (var);
143 tree old;
144
145 /* Set FIRST to be the first link in COPY_OF[DEST]. If that
146 changed, return true. */
147 old = copy_of[ver].value;
148 copy_of[ver].value = val;
149
150 if (old != val
151 || (val && !operand_equal_p (old, val, 0)))
152 return true;
153
154 return false;
155 }
156
157
158 /* Dump the copy-of value for variable VAR to FILE. */
159
160 static void
161 dump_copy_of (FILE *file, tree var)
162 {
163 tree val;
164
165 print_generic_expr (file, var, dump_flags);
166 if (TREE_CODE (var) != SSA_NAME)
167 return;
168
169 val = copy_of[SSA_NAME_VERSION (var)].value;
170 fprintf (file, " copy-of chain: ");
171 print_generic_expr (file, var, 0);
172 fprintf (file, " ");
173 if (!val)
174 fprintf (file, "[UNDEFINED]");
175 else if (val == var)
176 fprintf (file, "[NOT A COPY]");
177 else
178 {
179 fprintf (file, "-> ");
180 print_generic_expr (file, val, 0);
181 fprintf (file, " ");
182 fprintf (file, "[COPY]");
183 }
184 }
185
186
187 /* Evaluate the RHS of STMT. If it produces a valid copy, set the LHS
188 value and store the LHS into *RESULT_P. */
189
190 static enum ssa_prop_result
191 copy_prop_visit_assignment (gimple *stmt, tree *result_p)
192 {
193 tree lhs, rhs;
194
195 lhs = gimple_assign_lhs (stmt);
196 rhs = valueize_val (gimple_assign_rhs1 (stmt));
197
198 if (TREE_CODE (lhs) == SSA_NAME)
199 {
200 /* Straight copy between two SSA names. First, make sure that
201 we can propagate the RHS into uses of LHS. */
202 if (!may_propagate_copy (lhs, rhs))
203 return SSA_PROP_VARYING;
204
205 *result_p = lhs;
206 if (set_copy_of_val (*result_p, rhs))
207 return SSA_PROP_INTERESTING;
208 else
209 return SSA_PROP_NOT_INTERESTING;
210 }
211
212 return SSA_PROP_VARYING;
213 }
214
215
216 /* Visit the GIMPLE_COND STMT. Return SSA_PROP_INTERESTING
217 if it can determine which edge will be taken. Otherwise, return
218 SSA_PROP_VARYING. */
219
220 static enum ssa_prop_result
221 copy_prop_visit_cond_stmt (gimple *stmt, edge *taken_edge_p)
222 {
223 enum ssa_prop_result retval = SSA_PROP_VARYING;
224 location_t loc = gimple_location (stmt);
225
226 tree op0 = valueize_val (gimple_cond_lhs (stmt));
227 tree op1 = valueize_val (gimple_cond_rhs (stmt));
228
229 /* See if we can determine the predicate's value. */
230 if (dump_file && (dump_flags & TDF_DETAILS))
231 {
232 fprintf (dump_file, "Trying to determine truth value of ");
233 fprintf (dump_file, "predicate ");
234 print_gimple_stmt (dump_file, stmt, 0, 0);
235 }
236
237 /* Fold COND and see whether we get a useful result. */
238 tree folded_cond = fold_binary_loc (loc, gimple_cond_code (stmt),
239 boolean_type_node, op0, op1);
240 if (folded_cond)
241 {
242 basic_block bb = gimple_bb (stmt);
243 *taken_edge_p = find_taken_edge (bb, folded_cond);
244 if (*taken_edge_p)
245 retval = SSA_PROP_INTERESTING;
246 }
247
248 if (dump_file && (dump_flags & TDF_DETAILS) && *taken_edge_p)
249 fprintf (dump_file, "\nConditional will always take edge %d->%d\n",
250 (*taken_edge_p)->src->index, (*taken_edge_p)->dest->index);
251
252 return retval;
253 }
254
255
256 /* Evaluate statement STMT. If the statement produces a new output
257 value, return SSA_PROP_INTERESTING and store the SSA_NAME holding
258 the new value in *RESULT_P.
259
260 If STMT is a conditional branch and we can determine its truth
261 value, set *TAKEN_EDGE_P accordingly.
262
263 If the new value produced by STMT is varying, return
264 SSA_PROP_VARYING. */
265
266 static enum ssa_prop_result
267 copy_prop_visit_stmt (gimple *stmt, edge *taken_edge_p, tree *result_p)
268 {
269 enum ssa_prop_result retval;
270
271 if (dump_file && (dump_flags & TDF_DETAILS))
272 {
273 fprintf (dump_file, "\nVisiting statement:\n");
274 print_gimple_stmt (dump_file, stmt, 0, dump_flags);
275 fprintf (dump_file, "\n");
276 }
277
278 if (gimple_assign_single_p (stmt)
279 && TREE_CODE (gimple_assign_lhs (stmt)) == SSA_NAME
280 && (TREE_CODE (gimple_assign_rhs1 (stmt)) == SSA_NAME
281 || is_gimple_min_invariant (gimple_assign_rhs1 (stmt))))
282 {
283 /* If the statement is a copy assignment, evaluate its RHS to
284 see if the lattice value of its output has changed. */
285 retval = copy_prop_visit_assignment (stmt, result_p);
286 }
287 else if (gimple_code (stmt) == GIMPLE_COND)
288 {
289 /* See if we can determine which edge goes out of a conditional
290 jump. */
291 retval = copy_prop_visit_cond_stmt (stmt, taken_edge_p);
292 }
293 else
294 retval = SSA_PROP_VARYING;
295
296 if (retval == SSA_PROP_VARYING)
297 {
298 tree def;
299 ssa_op_iter i;
300
301 /* Any other kind of statement is not interesting for constant
302 propagation and, therefore, not worth simulating. */
303 if (dump_file && (dump_flags & TDF_DETAILS))
304 fprintf (dump_file, "No interesting values produced.\n");
305
306 /* The assignment is not a copy operation. Don't visit this
307 statement again and mark all the definitions in the statement
308 to be copies of nothing. */
309 FOR_EACH_SSA_TREE_OPERAND (def, stmt, i, SSA_OP_ALL_DEFS)
310 set_copy_of_val (def, def);
311 }
312
313 return retval;
314 }
315
316
317 /* Visit PHI node PHI. If all the arguments produce the same value,
318 set it to be the value of the LHS of PHI. */
319
320 static enum ssa_prop_result
321 copy_prop_visit_phi_node (gphi *phi)
322 {
323 enum ssa_prop_result retval;
324 unsigned i;
325 prop_value_t phi_val = { NULL_TREE };
326
327 tree lhs = gimple_phi_result (phi);
328
329 if (dump_file && (dump_flags & TDF_DETAILS))
330 {
331 fprintf (dump_file, "\nVisiting PHI node: ");
332 print_gimple_stmt (dump_file, phi, 0, dump_flags);
333 }
334
335 for (i = 0; i < gimple_phi_num_args (phi); i++)
336 {
337 prop_value_t *arg_val;
338 tree arg_value;
339 tree arg = gimple_phi_arg_def (phi, i);
340 edge e = gimple_phi_arg_edge (phi, i);
341
342 /* We don't care about values flowing through non-executable
343 edges. */
344 if (!(e->flags & EDGE_EXECUTABLE))
345 continue;
346
347 /* Names that flow through abnormal edges cannot be used to
348 derive copies. */
349 if (TREE_CODE (arg) == SSA_NAME && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (arg))
350 {
351 phi_val.value = lhs;
352 break;
353 }
354
355 if (dump_file && (dump_flags & TDF_DETAILS))
356 {
357 fprintf (dump_file, "\tArgument #%d: ", i);
358 dump_copy_of (dump_file, arg);
359 fprintf (dump_file, "\n");
360 }
361
362 if (TREE_CODE (arg) == SSA_NAME)
363 {
364 arg_val = get_copy_of_val (arg);
365
366 /* If we didn't visit the definition of arg yet treat it as
367 UNDEFINED. This also handles PHI arguments that are the
368 same as lhs. We'll come here again. */
369 if (!arg_val->value)
370 continue;
371
372 arg_value = arg_val->value;
373 }
374 else
375 arg_value = valueize_val (arg);
376
377 /* In loop-closed SSA form do not copy-propagate SSA-names across
378 loop exit edges. */
379 if (loops_state_satisfies_p (LOOP_CLOSED_SSA)
380 && TREE_CODE (arg_value) == SSA_NAME
381 && loop_exit_edge_p (e->src->loop_father, e))
382 {
383 phi_val.value = lhs;
384 break;
385 }
386
387 /* If the LHS didn't have a value yet, make it a copy of the
388 first argument we find. */
389 if (phi_val.value == NULL_TREE)
390 {
391 phi_val.value = arg_value;
392 continue;
393 }
394
395 /* If PHI_VAL and ARG don't have a common copy-of chain, then
396 this PHI node cannot be a copy operation. */
397 if (phi_val.value != arg_value
398 && !operand_equal_p (phi_val.value, arg_value, 0))
399 {
400 phi_val.value = lhs;
401 break;
402 }
403 }
404
405 if (phi_val.value
406 && may_propagate_copy (lhs, phi_val.value)
407 && set_copy_of_val (lhs, phi_val.value))
408 retval = (phi_val.value != lhs) ? SSA_PROP_INTERESTING : SSA_PROP_VARYING;
409 else
410 retval = SSA_PROP_NOT_INTERESTING;
411
412 if (dump_file && (dump_flags & TDF_DETAILS))
413 {
414 fprintf (dump_file, "PHI node ");
415 dump_copy_of (dump_file, lhs);
416 fprintf (dump_file, "\nTelling the propagator to ");
417 if (retval == SSA_PROP_INTERESTING)
418 fprintf (dump_file, "add SSA edges out of this PHI and continue.");
419 else if (retval == SSA_PROP_VARYING)
420 fprintf (dump_file, "add SSA edges out of this PHI and never visit again.");
421 else
422 fprintf (dump_file, "do nothing with SSA edges and keep iterating.");
423 fprintf (dump_file, "\n\n");
424 }
425
426 return retval;
427 }
428
429
430 /* Initialize structures used for copy propagation. */
431
432 static void
433 init_copy_prop (void)
434 {
435 basic_block bb;
436
437 n_copy_of = num_ssa_names;
438 copy_of = XCNEWVEC (prop_value_t, n_copy_of);
439
440 FOR_EACH_BB_FN (bb, cfun)
441 {
442 for (gimple_stmt_iterator si = gsi_start_bb (bb); !gsi_end_p (si);
443 gsi_next (&si))
444 {
445 gimple *stmt = gsi_stmt (si);
446 ssa_op_iter iter;
447 tree def;
448
449 /* The only statements that we care about are those that may
450 generate useful copies. We also need to mark conditional
451 jumps so that their outgoing edges are added to the work
452 lists of the propagator. */
453 if (stmt_ends_bb_p (stmt))
454 prop_set_simulate_again (stmt, true);
455 else if (stmt_may_generate_copy (stmt))
456 prop_set_simulate_again (stmt, true);
457 else
458 prop_set_simulate_again (stmt, false);
459
460 /* Mark all the outputs of this statement as not being
461 the copy of anything. */
462 FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_ALL_DEFS)
463 if (!prop_simulate_again_p (stmt))
464 set_copy_of_val (def, def);
465 }
466
467 for (gphi_iterator si = gsi_start_phis (bb); !gsi_end_p (si);
468 gsi_next (&si))
469 {
470 gphi *phi = si.phi ();
471 tree def;
472
473 def = gimple_phi_result (phi);
474 if (virtual_operand_p (def))
475 prop_set_simulate_again (phi, false);
476 else
477 prop_set_simulate_again (phi, true);
478
479 if (!prop_simulate_again_p (phi))
480 set_copy_of_val (def, def);
481 }
482 }
483 }
484
485 /* Callback for substitute_and_fold to get at the final copy-of values. */
486
487 static tree
488 get_value (tree name)
489 {
490 tree val;
491 if (SSA_NAME_VERSION (name) >= n_copy_of)
492 return NULL_TREE;
493 val = copy_of[SSA_NAME_VERSION (name)].value;
494 if (val && val != name)
495 return val;
496 return NULL_TREE;
497 }
498
499 /* Deallocate memory used in copy propagation and do final
500 substitution. */
501
502 static bool
503 fini_copy_prop (void)
504 {
505 unsigned i;
506
507 /* Set the final copy-of value for each variable by traversing the
508 copy-of chains. */
509 for (i = 1; i < num_ssa_names; i++)
510 {
511 tree var = ssa_name (i);
512 if (!var
513 || !copy_of[i].value
514 || copy_of[i].value == var)
515 continue;
516
517 /* In theory the points-to solution of all members of the
518 copy chain is their intersection. For now we do not bother
519 to compute this but only make sure we do not lose points-to
520 information completely by setting the points-to solution
521 of the representative to the first solution we find if
522 it doesn't have one already. */
523 if (copy_of[i].value != var
524 && TREE_CODE (copy_of[i].value) == SSA_NAME)
525 {
526 basic_block copy_of_bb
527 = gimple_bb (SSA_NAME_DEF_STMT (copy_of[i].value));
528 basic_block var_bb = gimple_bb (SSA_NAME_DEF_STMT (var));
529 if (POINTER_TYPE_P (TREE_TYPE (var))
530 && SSA_NAME_PTR_INFO (var)
531 && !SSA_NAME_PTR_INFO (copy_of[i].value))
532 {
533 duplicate_ssa_name_ptr_info (copy_of[i].value,
534 SSA_NAME_PTR_INFO (var));
535 /* Points-to information is cfg insensitive,
536 but alignment info might be cfg sensitive, if it
537 e.g. is derived from VRP derived non-zero bits.
538 So, do not copy alignment info if the two SSA_NAMEs
539 aren't defined in the same basic block. */
540 if (var_bb != copy_of_bb)
541 mark_ptr_info_alignment_unknown
542 (SSA_NAME_PTR_INFO (copy_of[i].value));
543 }
544 else if (!POINTER_TYPE_P (TREE_TYPE (var))
545 && SSA_NAME_RANGE_INFO (var)
546 && !SSA_NAME_RANGE_INFO (copy_of[i].value)
547 && var_bb == copy_of_bb)
548 duplicate_ssa_name_range_info (copy_of[i].value,
549 SSA_NAME_RANGE_TYPE (var),
550 SSA_NAME_RANGE_INFO (var));
551 }
552 }
553
554 bool changed = substitute_and_fold (get_value, NULL, true);
555 if (changed)
556 {
557 free_numbers_of_iterations_estimates (cfun);
558 if (scev_initialized_p ())
559 scev_reset ();
560 }
561
562 free (copy_of);
563
564 return changed;
565 }
566
567
568 /* Main entry point to the copy propagator.
569
570 PHIS_ONLY is true if we should only consider PHI nodes as generating
571 copy propagation opportunities.
572
573 The algorithm propagates the value COPY-OF using ssa_propagate. For
574 every variable X_i, COPY-OF(X_i) indicates which variable is X_i created
575 from. The following example shows how the algorithm proceeds at a
576 high level:
577
578 1 a_24 = x_1
579 2 a_2 = PHI <a_24, x_1>
580 3 a_5 = PHI <a_2>
581 4 x_1 = PHI <x_298, a_5, a_2>
582
583 The end result should be that a_2, a_5, a_24 and x_1 are a copy of
584 x_298. Propagation proceeds as follows.
585
586 Visit #1: a_24 is copy-of x_1. Value changed.
587 Visit #2: a_2 is copy-of x_1. Value changed.
588 Visit #3: a_5 is copy-of x_1. Value changed.
589 Visit #4: x_1 is copy-of x_298. Value changed.
590 Visit #1: a_24 is copy-of x_298. Value changed.
591 Visit #2: a_2 is copy-of x_298. Value changed.
592 Visit #3: a_5 is copy-of x_298. Value changed.
593 Visit #4: x_1 is copy-of x_298. Stable state reached.
594
595 When visiting PHI nodes, we only consider arguments that flow
596 through edges marked executable by the propagation engine. So,
597 when visiting statement #2 for the first time, we will only look at
598 the first argument (a_24) and optimistically assume that its value
599 is the copy of a_24 (x_1). */
600
601 static unsigned int
602 execute_copy_prop (void)
603 {
604 init_copy_prop ();
605 ssa_propagate (copy_prop_visit_stmt, copy_prop_visit_phi_node);
606 if (fini_copy_prop ())
607 return TODO_cleanup_cfg;
608 return 0;
609 }
610
611 namespace {
612
613 const pass_data pass_data_copy_prop =
614 {
615 GIMPLE_PASS, /* type */
616 "copyprop", /* name */
617 OPTGROUP_NONE, /* optinfo_flags */
618 TV_TREE_COPY_PROP, /* tv_id */
619 ( PROP_ssa | PROP_cfg ), /* properties_required */
620 0, /* properties_provided */
621 0, /* properties_destroyed */
622 0, /* todo_flags_start */
623 0, /* todo_flags_finish */
624 };
625
626 class pass_copy_prop : public gimple_opt_pass
627 {
628 public:
629 pass_copy_prop (gcc::context *ctxt)
630 : gimple_opt_pass (pass_data_copy_prop, ctxt)
631 {}
632
633 /* opt_pass methods: */
634 opt_pass * clone () { return new pass_copy_prop (m_ctxt); }
635 virtual bool gate (function *) { return flag_tree_copy_prop != 0; }
636 virtual unsigned int execute (function *) { return execute_copy_prop (); }
637
638 }; // class pass_copy_prop
639
640 } // anon namespace
641
642 gimple_opt_pass *
643 make_pass_copy_prop (gcc::context *ctxt)
644 {
645 return new pass_copy_prop (ctxt);
646 }