xref: /netbsd-src/external/gpl3/gcc.old/dist/gcc/tree-ssa-copy.c (revision cef8759bd76c1b621f8eab8faa6f208faabc2e15)
1 /* Copy propagation and SSA_NAME replacement support routines.
2    Copyright (C) 2004-2017 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   tree var;
507 
508   /* Set the final copy-of value for each variable by traversing the
509      copy-of chains.  */
510   FOR_EACH_SSA_NAME (i, var, cfun)
511     {
512       if (!copy_of[i].value
513 	  || copy_of[i].value == var)
514 	continue;
515 
516       /* In theory the points-to solution of all members of the
517          copy chain is their intersection.  For now we do not bother
518 	 to compute this but only make sure we do not lose points-to
519 	 information completely by setting the points-to solution
520 	 of the representative to the first solution we find if
521 	 it doesn't have one already.  */
522       if (copy_of[i].value != var
523 	  && TREE_CODE (copy_of[i].value) == SSA_NAME)
524 	{
525 	  basic_block copy_of_bb
526 	    = gimple_bb (SSA_NAME_DEF_STMT (copy_of[i].value));
527 	  basic_block var_bb = gimple_bb (SSA_NAME_DEF_STMT (var));
528 	  if (POINTER_TYPE_P (TREE_TYPE (var))
529 	      && SSA_NAME_PTR_INFO (var)
530 	      && !SSA_NAME_PTR_INFO (copy_of[i].value))
531 	    {
532 	      duplicate_ssa_name_ptr_info (copy_of[i].value,
533 					   SSA_NAME_PTR_INFO (var));
534 	      /* Points-to information is cfg insensitive,
535 		 but [E]VRP might record context sensitive alignment
536 		 info, non-nullness, etc.  So reset context sensitive
537 		 info if the two SSA_NAMEs aren't defined in the same
538 		 basic block.  */
539 	      if (var_bb != copy_of_bb)
540 		reset_flow_sensitive_info (copy_of[i].value);
541 	    }
542 	  else if (!POINTER_TYPE_P (TREE_TYPE (var))
543 		   && SSA_NAME_RANGE_INFO (var)
544 		   && !SSA_NAME_RANGE_INFO (copy_of[i].value)
545 		   && var_bb == copy_of_bb)
546 	    duplicate_ssa_name_range_info (copy_of[i].value,
547 					   SSA_NAME_RANGE_TYPE (var),
548 					   SSA_NAME_RANGE_INFO (var));
549 	}
550     }
551 
552   bool changed = substitute_and_fold (get_value, NULL);
553   if (changed)
554     {
555       free_numbers_of_iterations_estimates (cfun);
556       if (scev_initialized_p ())
557 	scev_reset ();
558     }
559 
560   free (copy_of);
561 
562   return changed;
563 }
564 
565 
566 /* Main entry point to the copy propagator.
567 
568    PHIS_ONLY is true if we should only consider PHI nodes as generating
569    copy propagation opportunities.
570 
571    The algorithm propagates the value COPY-OF using ssa_propagate.  For
572    every variable X_i, COPY-OF(X_i) indicates which variable is X_i created
573    from.  The following example shows how the algorithm proceeds at a
574    high level:
575 
576 	    1	a_24 = x_1
577 	    2	a_2 = PHI <a_24, x_1>
578 	    3	a_5 = PHI <a_2>
579 	    4	x_1 = PHI <x_298, a_5, a_2>
580 
581    The end result should be that a_2, a_5, a_24 and x_1 are a copy of
582    x_298.  Propagation proceeds as follows.
583 
584    Visit #1: a_24 is copy-of x_1.  Value changed.
585    Visit #2: a_2 is copy-of x_1.  Value changed.
586    Visit #3: a_5 is copy-of x_1.  Value changed.
587    Visit #4: x_1 is copy-of x_298.  Value changed.
588    Visit #1: a_24 is copy-of x_298.  Value changed.
589    Visit #2: a_2 is copy-of x_298.  Value changed.
590    Visit #3: a_5 is copy-of x_298.  Value changed.
591    Visit #4: x_1 is copy-of x_298.  Stable state reached.
592 
593    When visiting PHI nodes, we only consider arguments that flow
594    through edges marked executable by the propagation engine.  So,
595    when visiting statement #2 for the first time, we will only look at
596    the first argument (a_24) and optimistically assume that its value
597    is the copy of a_24 (x_1).  */
598 
599 static unsigned int
600 execute_copy_prop (void)
601 {
602   init_copy_prop ();
603   ssa_propagate (copy_prop_visit_stmt, copy_prop_visit_phi_node);
604   if (fini_copy_prop ())
605     return TODO_cleanup_cfg;
606   return 0;
607 }
608 
609 namespace {
610 
611 const pass_data pass_data_copy_prop =
612 {
613   GIMPLE_PASS, /* type */
614   "copyprop", /* name */
615   OPTGROUP_NONE, /* optinfo_flags */
616   TV_TREE_COPY_PROP, /* tv_id */
617   ( PROP_ssa | PROP_cfg ), /* properties_required */
618   0, /* properties_provided */
619   0, /* properties_destroyed */
620   0, /* todo_flags_start */
621   0, /* todo_flags_finish */
622 };
623 
624 class pass_copy_prop : public gimple_opt_pass
625 {
626 public:
627   pass_copy_prop (gcc::context *ctxt)
628     : gimple_opt_pass (pass_data_copy_prop, ctxt)
629   {}
630 
631   /* opt_pass methods: */
632   opt_pass * clone () { return new pass_copy_prop (m_ctxt); }
633   virtual bool gate (function *) { return flag_tree_copy_prop != 0; }
634   virtual unsigned int execute (function *) { return execute_copy_prop (); }
635 
636 }; // class pass_copy_prop
637 
638 } // anon namespace
639 
640 gimple_opt_pass *
641 make_pass_copy_prop (gcc::context *ctxt)
642 {
643   return new pass_copy_prop (ctxt);
644 }
645