OSDN Git Service

PR target/21101
[pf3gnuchains/gcc-fork.git] / gcc / tree-ssa-copy.c
1 /* Copy propagation and SSA_NAME replacement support routines.
2    Copyright (C) 2004, 2005 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 2, 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 COPYING.  If not, write to
18 the Free Software Foundation, 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA.  */
20
21 #include "config.h"
22 #include "system.h"
23 #include "coretypes.h"
24 #include "tm.h"
25 #include "tree.h"
26 #include "flags.h"
27 #include "rtl.h"
28 #include "tm_p.h"
29 #include "ggc.h"
30 #include "basic-block.h"
31 #include "output.h"
32 #include "errors.h"
33 #include "expr.h"
34 #include "function.h"
35 #include "diagnostic.h"
36 #include "timevar.h"
37 #include "tree-dump.h"
38 #include "tree-flow.h"
39 #include "tree-pass.h"
40 #include "tree-ssa-propagate.h"
41 #include "langhooks.h"
42
43 /* This file implements the copy propagation pass and provides a
44    handful of interfaces for performing const/copy propagation and
45    simple expression replacement which keep variable annotations
46    up-to-date.
47
48    We require that for any copy operation where the RHS and LHS have
49    a non-null memory tag the memory tag be the same.   It is OK
50    for one or both of the memory tags to be NULL.
51
52    We also require tracking if a variable is dereferenced in a load or
53    store operation.
54
55    We enforce these requirements by having all copy propagation and
56    replacements of one SSA_NAME with a different SSA_NAME to use the
57    APIs defined in this file.  */
58
59 /* Return true if we may propagate ORIG into DEST, false otherwise.  */
60
61 bool
62 may_propagate_copy (tree dest, tree orig)
63 {
64   tree type_d = TREE_TYPE (dest);
65   tree type_o = TREE_TYPE (orig);
66
67   /* Do not copy between types for which we *do* need a conversion.  */
68   if (!tree_ssa_useless_type_conversion_1 (type_d, type_o))
69     return false;
70
71   /* FIXME.  GIMPLE is allowing pointer assignments and comparisons of
72      pointers that have different alias sets.  This means that these
73      pointers will have different memory tags associated to them.
74
75      If we allow copy propagation in these cases, statements de-referencing
76      the new pointer will now have a reference to a different memory tag
77      with potentially incorrect SSA information.
78
79      This was showing up in libjava/java/util/zip/ZipFile.java with code
80      like:
81
82         struct java.io.BufferedInputStream *T.660;
83         struct java.io.BufferedInputStream *T.647;
84         struct java.io.InputStream *is;
85         struct java.io.InputStream *is.662;
86         [ ... ]
87         T.660 = T.647;
88         is = T.660;     <-- This ought to be type-casted
89         is.662 = is;
90
91      Also, f/name.c exposed a similar problem with a COND_EXPR predicate
92      that was causing DOM to generate and equivalence with two pointers of
93      alias-incompatible types:
94
95         struct _ffename_space *n;
96         struct _ffename *ns;
97         [ ... ]
98         if (n == ns)
99           goto lab;
100         ...
101         lab:
102         return n;
103
104      I think that GIMPLE should emit the appropriate type-casts.  For the
105      time being, blocking copy-propagation in these cases is the safe thing
106      to do.  */
107   if (TREE_CODE (dest) == SSA_NAME
108       && TREE_CODE (orig) == SSA_NAME
109       && POINTER_TYPE_P (type_d)
110       && POINTER_TYPE_P (type_o))
111     {
112       tree mt_dest = var_ann (SSA_NAME_VAR (dest))->type_mem_tag;
113       tree mt_orig = var_ann (SSA_NAME_VAR (orig))->type_mem_tag;
114       if (mt_dest && mt_orig && mt_dest != mt_orig)
115         return false;
116       else if (!lang_hooks.types_compatible_p (type_d, type_o))
117         return false;
118       else if (get_alias_set (TREE_TYPE (type_d)) != 
119                get_alias_set (TREE_TYPE (type_o)))
120         return false;
121     }
122
123   /* If the destination is a SSA_NAME for a virtual operand, then we have
124      some special cases to handle.  */
125   if (TREE_CODE (dest) == SSA_NAME && !is_gimple_reg (dest))
126     {
127       /* If both operands are SSA_NAMEs referring to virtual operands, then
128          we can always propagate.  */
129       if (TREE_CODE (orig) == SSA_NAME
130           && !is_gimple_reg (orig))
131         return true;
132
133       /* We have a "copy" from something like a constant into a virtual
134          operand.  Reject these.  */
135       return false;
136     }
137
138   /* If ORIG flows in from an abnormal edge, it cannot be propagated.  */
139   if (TREE_CODE (orig) == SSA_NAME
140       && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (orig))
141     return false;
142
143   /* If DEST is an SSA_NAME that flows from an abnormal edge, then it
144      cannot be replaced.  */
145   if (TREE_CODE (dest) == SSA_NAME
146       && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (dest))
147     return false;
148
149   /* Anything else is OK.  */
150   return true;
151 }
152
153 /* Similarly, but we know that we're propagating into an ASM_EXPR.  */
154
155 bool
156 may_propagate_copy_into_asm (tree dest)
157 {
158   /* Hard register operands of asms are special.  Do not bypass.  */
159   return !(TREE_CODE (dest) == SSA_NAME
160            && TREE_CODE (SSA_NAME_VAR (dest)) == VAR_DECL
161            && DECL_HARD_REGISTER (SSA_NAME_VAR (dest)));
162 }
163
164
165 /* Given two SSA_NAMEs pointers ORIG and NEW such that we are copy
166    propagating NEW into ORIG, consolidate aliasing information so that
167    they both share the same memory tags.  */
168
169 static void
170 merge_alias_info (tree orig, tree new)
171 {
172   tree new_sym = SSA_NAME_VAR (new);
173   tree orig_sym = SSA_NAME_VAR (orig);
174   var_ann_t new_ann = var_ann (new_sym);
175   var_ann_t orig_ann = var_ann (orig_sym);
176
177   gcc_assert (POINTER_TYPE_P (TREE_TYPE (orig)));
178   gcc_assert (POINTER_TYPE_P (TREE_TYPE (new)));
179
180 #if defined ENABLE_CHECKING
181   gcc_assert (lang_hooks.types_compatible_p (TREE_TYPE (orig),
182                                              TREE_TYPE (new)));
183
184   /* If the pointed-to alias sets are different, these two pointers
185      would never have the same memory tag.  In this case, NEW should
186      not have been propagated into ORIG.  */
187   gcc_assert (get_alias_set (TREE_TYPE (TREE_TYPE (new_sym)))
188               == get_alias_set (TREE_TYPE (TREE_TYPE (orig_sym))));
189 #endif
190
191   /* Synchronize the type tags.  If both pointers had a tag and they
192      are different, then something has gone wrong.  */
193   if (new_ann->type_mem_tag == NULL_TREE)
194     new_ann->type_mem_tag = orig_ann->type_mem_tag;
195   else if (orig_ann->type_mem_tag == NULL_TREE)
196     orig_ann->type_mem_tag = new_ann->type_mem_tag;
197   else
198     gcc_assert (new_ann->type_mem_tag == orig_ann->type_mem_tag);
199
200   /* Synchronize the name tags.  If NEW did not have a name tag, get
201      it from ORIG.  This happens when NEW is a compiler generated
202      temporary which still hasn't had its points-to information filled
203      in.  */
204   if (SSA_NAME_PTR_INFO (orig))
205     {
206       struct ptr_info_def *orig_ptr_info = SSA_NAME_PTR_INFO (orig);
207       struct ptr_info_def *new_ptr_info = SSA_NAME_PTR_INFO (new);
208
209       if (new_ptr_info == NULL)
210         duplicate_ssa_name_ptr_info (new, orig_ptr_info);
211       else if (orig_ptr_info->name_mem_tag
212                && new_ptr_info->name_mem_tag
213                && orig_ptr_info->pt_vars
214                && new_ptr_info->pt_vars)
215         {
216           /* Note that pointer NEW may actually have a different set
217              of pointed-to variables.  However, since NEW is being
218              copy-propagated into ORIG, it must always be true that
219              the pointed-to set for pointer NEW is the same, or a
220              subset, of the pointed-to set for pointer ORIG.  If this
221              isn't the case, we shouldn't have been able to do the
222              propagation of NEW into ORIG.  */
223           gcc_assert (bitmap_intersect_p (new_ptr_info->pt_vars,
224                 orig_ptr_info->pt_vars));
225         }
226     }
227 }   
228
229
230 /* Common code for propagate_value and replace_exp.
231
232    Replace use operand OP_P with VAL.  FOR_PROPAGATION indicates if the
233    replacement is done to propagate a value or not.  */
234
235 static void
236 replace_exp_1 (use_operand_p op_p, tree val,
237                bool for_propagation ATTRIBUTE_UNUSED)
238 {
239   tree op = USE_FROM_PTR (op_p);
240
241 #if defined ENABLE_CHECKING
242   gcc_assert (!(for_propagation
243                 && TREE_CODE (op) == SSA_NAME
244                 && TREE_CODE (val) == SSA_NAME
245                 && !may_propagate_copy (op, val)));
246 #endif
247
248   if (TREE_CODE (val) == SSA_NAME)
249     {
250       if (TREE_CODE (op) == SSA_NAME && POINTER_TYPE_P (TREE_TYPE (op)))
251         merge_alias_info (op, val);
252       SET_USE (op_p, val);
253     }
254   else
255     SET_USE (op_p, unsave_expr_now (val));
256 }
257
258
259 /* Propagate the value VAL (assumed to be a constant or another SSA_NAME)
260    into the operand pointed by OP_P.
261
262    Use this version for const/copy propagation as it will perform additional
263    checks to ensure validity of the const/copy propagation.  */
264
265 void
266 propagate_value (use_operand_p op_p, tree val)
267 {
268   replace_exp_1 (op_p, val, true);
269 }
270
271
272 /* Propagate the value VAL (assumed to be a constant or another SSA_NAME)
273    into the tree pointed by OP_P.
274
275    Use this version for const/copy propagation when SSA operands are not
276    available.  It will perform the additional checks to ensure validity of
277    the const/copy propagation, but will not update any operand information.
278    Be sure to mark the stmt as modified.  */
279
280 void
281 propagate_tree_value (tree *op_p, tree val)
282 {
283 #if defined ENABLE_CHECKING
284   gcc_assert (!(TREE_CODE (val) == SSA_NAME
285                 && TREE_CODE (*op_p) == SSA_NAME
286                 && !may_propagate_copy (*op_p, val)));
287 #endif
288
289   if (TREE_CODE (val) == SSA_NAME)
290     {
291       if (TREE_CODE (*op_p) == SSA_NAME && POINTER_TYPE_P (TREE_TYPE (*op_p)))
292         merge_alias_info (*op_p, val);
293       *op_p = val;
294     }
295   else
296     *op_p = unsave_expr_now (val);
297 }
298
299
300 /* Replace *OP_P with value VAL (assumed to be a constant or another SSA_NAME).
301
302    Use this version when not const/copy propagating values.  For example,
303    PRE uses this version when building expressions as they would appear
304    in specific blocks taking into account actions of PHI nodes.  */
305
306 void
307 replace_exp (use_operand_p op_p, tree val)
308 {
309   replace_exp_1 (op_p, val, false);
310 }
311
312
313 /*---------------------------------------------------------------------------
314                                 Copy propagation
315 ---------------------------------------------------------------------------*/
316 /* During propagation, we keep chains of variables that are copies of
317    one another.  If variable X_i is a copy of X_j and X_j is a copy of
318    X_k, COPY_OF will contain:
319
320         COPY_OF[i].VALUE = X_j
321         COPY_OF[j].VALUE = X_k
322         COPY_OF[k].VALUE = X_k
323
324    After propagation, the copy-of value for each variable X_i is
325    converted into the final value by walking the copy-of chains and
326    updating COPY_OF[i].VALUE to be the last element of the chain.  */
327 static prop_value_t *copy_of;
328
329 /* Used in set_copy_of_val to determine if the last link of a copy-of
330    chain has changed.  */
331 static tree *cached_last_copy_of;
332
333 /* True if we are doing copy propagation on loads and stores.  */
334 static bool do_store_copy_prop;
335
336
337 /* Return true if this statement may generate a useful copy.  */
338
339 static bool
340 stmt_may_generate_copy (tree stmt)
341 {
342   tree lhs, rhs;
343   stmt_ann_t ann;
344
345   if (TREE_CODE (stmt) == PHI_NODE)
346     return !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (PHI_RESULT (stmt));
347
348   if (TREE_CODE (stmt) != MODIFY_EXPR)
349     return false;
350
351   lhs = TREE_OPERAND (stmt, 0);
352   rhs = TREE_OPERAND (stmt, 1);
353   ann = stmt_ann (stmt);
354
355   /* If the statement has volatile operands, it won't generate a
356      useful copy.  */
357   if (ann->has_volatile_ops)
358     return false;
359
360   /* If we are not doing store copy-prop, statements with loads and/or
361      stores will never generate a useful copy.  */
362   if (!do_store_copy_prop
363       && (NUM_VUSES (VUSE_OPS (ann)) > 0
364           || NUM_V_MAY_DEFS (V_MAY_DEF_OPS (ann)) > 0
365           || NUM_V_MUST_DEFS (V_MUST_DEF_OPS (ann)) > 0))
366     return false;
367
368   /* Otherwise, the only statements that generate useful copies are
369      assignments whose RHS is just an SSA name that doesn't flow
370      through abnormal edges.  */
371   return TREE_CODE (rhs) == SSA_NAME && !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (rhs);
372 }
373
374
375 /* Return the copy-of value for VAR.  */
376
377 static inline prop_value_t *
378 get_copy_of_val (tree var)
379 {
380   prop_value_t *val = &copy_of[SSA_NAME_VERSION (var)];
381
382   if (val->value == NULL_TREE
383       && !stmt_may_generate_copy (SSA_NAME_DEF_STMT (var)))
384     {
385       /* If the variable will never generate a useful copy relation,
386          make it its own copy.  */
387       val->value = var;
388       val->mem_ref = NULL_TREE;
389     }
390
391   return val;
392 }
393
394
395 /* Return last link in the copy-of chain for VAR.  */
396
397 static tree
398 get_last_copy_of (tree var)
399 {
400   tree last;
401   int i;
402
403   /* Traverse COPY_OF starting at VAR until we get to the last
404      link in the chain.  Since it is possible to have cycles in PHI
405      nodes, the copy-of chain may also contain cycles.
406      
407      To avoid infinite loops and to avoid traversing lengthy copy-of
408      chains, we artificially limit the maximum number of chains we are
409      willing to traverse.
410
411      The value 5 was taken from a compiler and runtime library
412      bootstrap and a mixture of C and C++ code from various sources.
413      More than 82% of all copy-of chains were shorter than 5 links.  */
414 #define LIMIT   5
415
416   last = var;
417   for (i = 0; i < LIMIT; i++)
418     {
419       tree copy = copy_of[SSA_NAME_VERSION (last)].value;
420       if (copy == NULL_TREE || copy == last)
421         break;
422       last = copy;
423     }
424
425   /* If we have reached the limit, then we are either in a copy-of
426      cycle or the copy-of chain is too long.  In this case, just
427      return VAR so that it is not considered a copy of anything.  */
428   return (i < LIMIT ? last : var);
429 }
430
431
432 /* Set FIRST to be the first variable in the copy-of chain for DEST.
433    If DEST's copy-of value or its copy-of chain has changed, return
434    true.
435
436    MEM_REF is the memory reference where FIRST is stored.  This is
437    used when DEST is a non-register and we are copy propagating loads
438    and stores.  */
439
440 static inline bool
441 set_copy_of_val (tree dest, tree first, tree mem_ref)
442 {
443   unsigned int dest_ver = SSA_NAME_VERSION (dest);
444   tree old_first, old_last, new_last;
445   
446   /* Set FIRST to be the first link in COPY_OF[DEST].  If that
447      changed, return true.  */
448   old_first = copy_of[dest_ver].value;
449   copy_of[dest_ver].value = first;
450   copy_of[dest_ver].mem_ref = mem_ref;
451
452   if (old_first != first)
453     return true;
454
455   /* If FIRST and OLD_FIRST are the same, we need to check whether the
456      copy-of chain starting at FIRST ends in a different variable.  If
457      the copy-of chain starting at FIRST ends up in a different
458      variable than the last cached value we had for DEST, then return
459      true because DEST is now a copy of a different variable.
460
461      This test is necessary because even though the first link in the
462      copy-of chain may not have changed, if any of the variables in
463      the copy-of chain changed its final value, DEST will now be the
464      copy of a different variable, so we have to do another round of
465      propagation for everything that depends on DEST.  */
466   old_last = cached_last_copy_of[dest_ver];
467   new_last = get_last_copy_of (dest);
468   cached_last_copy_of[dest_ver] = new_last;
469
470   return (old_last != new_last);
471 }
472
473
474 /* Dump the copy-of value for variable VAR to DUMP_FILE.  */
475
476 static void
477 dump_copy_of (FILE *dump_file, tree var)
478 {
479   tree val;
480
481   print_generic_expr (dump_file, var, dump_flags);
482
483   if (TREE_CODE (var) != SSA_NAME)
484     return;
485
486   fprintf (dump_file, " copy-of chain: ");
487
488   val = var;
489   print_generic_expr (dump_file, val, 0);
490   fprintf (dump_file, " ");
491   while (copy_of[SSA_NAME_VERSION (val)].value
492          && copy_of[SSA_NAME_VERSION (val)].value != val)
493     {
494       fprintf (dump_file, "-> ");
495       val = copy_of[SSA_NAME_VERSION (val)].value;
496       print_generic_expr (dump_file, val, 0);
497       fprintf (dump_file, " ");
498     }
499
500   val = get_copy_of_val (var)->value;
501   if (val == NULL_TREE)
502     fprintf (dump_file, "[UNDEFINED]");
503   else if (val != var)
504     fprintf (dump_file, "[COPY]");
505   else
506     fprintf (dump_file, "[NOT A COPY]");
507 }
508
509
510 /* Evaluate the RHS of STMT.  If it produces a valid copy, set the LHS
511    value and store the LHS into *RESULT_P.  If STMT generates more
512    than one name (i.e., STMT is an aliased store), it is enough to
513    store the first name in the V_MAY_DEF list into *RESULT_P.  After
514    all, the names generated will be VUSEd in the same statements.  */
515
516 static enum ssa_prop_result
517 copy_prop_visit_assignment (tree stmt, tree *result_p)
518 {
519   tree lhs, rhs;
520   prop_value_t *rhs_val;
521
522   lhs = TREE_OPERAND (stmt, 0);
523   rhs = TREE_OPERAND (stmt, 1);
524
525   gcc_assert (TREE_CODE (rhs) == SSA_NAME);
526
527   rhs_val = get_copy_of_val (rhs);
528
529   if (TREE_CODE (lhs) == SSA_NAME)
530     {
531       /* Straight copy between two SSA names.  First, make sure that
532          we can propagate the RHS into uses of LHS.  */
533       if (!may_propagate_copy (lhs, rhs))
534         return SSA_PROP_VARYING;
535
536       /* Avoid copy propagation from an inner into an outer loop.
537          Otherwise, this may move loop variant variables outside of
538          their loops and prevent coalescing opportunities.  If the
539          value was loop invariant, it will be hoisted by LICM and
540          exposed for copy propagation.  */
541       if (loop_depth_of_name (rhs) > loop_depth_of_name (lhs))
542         return SSA_PROP_VARYING;
543
544       /* Notice that in the case of assignments, we make the LHS be a
545          copy of RHS's value, not of RHS itself.  This avoids keeping
546          unnecessary copy-of chains (assignments cannot be in a cycle
547          like PHI nodes), speeding up the propagation process.
548          This is different from what we do in copy_prop_visit_phi_node. 
549          In those cases, we are interested in the copy-of chains.  */
550       *result_p = lhs;
551       if (set_copy_of_val (*result_p, rhs_val->value, rhs_val->mem_ref))
552         return SSA_PROP_INTERESTING;
553       else
554         return SSA_PROP_NOT_INTERESTING;
555     }
556   else if (stmt_makes_single_store (stmt))
557     {
558       /* Otherwise, set the names in V_MAY_DEF/V_MUST_DEF operands
559          to be a copy of RHS.  */
560       ssa_op_iter i;
561       tree vdef;
562       bool changed;
563
564       /* This should only be executed when doing store copy-prop.  */
565       gcc_assert (do_store_copy_prop);
566
567       /* Set the value of every VDEF to RHS_VAL.  */
568       changed = false;
569       FOR_EACH_SSA_TREE_OPERAND (vdef, stmt, i, SSA_OP_VIRTUAL_DEFS)
570         changed |= set_copy_of_val (vdef, rhs_val->value, lhs);
571       
572       /* Note that for propagation purposes, we are only interested in
573          visiting statements that load the exact same memory reference
574          stored here.  Those statements will have the exact same list
575          of virtual uses, so it is enough to set the output of this
576          statement to be its first virtual definition.  */
577       *result_p = first_vdef (stmt);
578
579       if (changed)
580         return SSA_PROP_INTERESTING;
581       else
582         return SSA_PROP_NOT_INTERESTING;
583     }
584
585
586   return SSA_PROP_VARYING;
587 }
588
589
590 /* Visit the COND_EXPR STMT.  Return SSA_PROP_INTERESTING
591    if it can determine which edge will be taken.  Otherwise, return
592    SSA_PROP_VARYING.  */
593
594 static enum ssa_prop_result
595 copy_prop_visit_cond_stmt (tree stmt, edge *taken_edge_p)
596 {
597   enum ssa_prop_result retval;
598   tree cond;
599   use_optype uses;
600
601   cond = COND_EXPR_COND (stmt);
602   uses = STMT_USE_OPS (stmt);
603   retval = SSA_PROP_VARYING;
604
605   /* The only conditionals that we may be able to compute statically
606      are predicates involving at least one SSA_NAME.  */
607   if (TREE_CODE_CLASS (TREE_CODE (cond)) == tcc_comparison
608       && NUM_USES (uses) >= 1)
609     {
610       unsigned i;
611       tree *orig;
612
613       /* Save the original operands.  */
614       orig = xmalloc (sizeof (tree) * NUM_USES (uses));
615       for (i = 0; i < NUM_USES (uses); i++)
616         {
617           orig[i] = USE_OP (uses, i);
618           SET_USE_OP (uses, i, get_last_copy_of (USE_OP (uses, i)));
619         }
620
621       /* See if we can determine the predicate's value.  */
622       if (dump_file && (dump_flags & TDF_DETAILS))
623         {
624           fprintf (dump_file, "Trying to determine truth value of ");
625           fprintf (dump_file, "predicate ");
626           print_generic_stmt (dump_file, cond, 0);
627         }
628
629       /* We can fold COND only and get a useful result only when we
630          have the same SSA_NAME on both sides of a comparison
631          operator.  */
632       if (TREE_CODE (TREE_OPERAND (cond, 0)) == SSA_NAME
633           && TREE_OPERAND (cond, 0) == TREE_OPERAND (cond, 1))
634         {
635           *taken_edge_p = find_taken_edge (bb_for_stmt (stmt), fold (cond));
636           if (*taken_edge_p)
637             retval = SSA_PROP_INTERESTING;
638         }
639
640       /* Restore the original operands.  */
641       for (i = 0; i < NUM_USES (uses); i++)
642         SET_USE_OP (uses, i, orig[i]);
643       free (orig);
644     }
645
646   if (dump_file && (dump_flags & TDF_DETAILS) && *taken_edge_p)
647     fprintf (dump_file, "\nConditional will always take edge %d->%d\n",
648              (*taken_edge_p)->src->index, (*taken_edge_p)->dest->index);
649
650   return retval;
651 }
652
653
654 /* Evaluate statement STMT.  If the statement produces a new output
655    value, return SSA_PROP_INTERESTING and store the SSA_NAME holding
656    the new value in *RESULT_P.
657
658    If STMT is a conditional branch and we can determine its truth
659    value, set *TAKEN_EDGE_P accordingly.
660
661    If the new value produced by STMT is varying, return
662    SSA_PROP_VARYING.  */
663
664 static enum ssa_prop_result
665 copy_prop_visit_stmt (tree stmt, edge *taken_edge_p, tree *result_p)
666 {
667   stmt_ann_t ann;
668   enum ssa_prop_result retval;
669
670   if (dump_file && (dump_flags & TDF_DETAILS))
671     {
672       fprintf (dump_file, "\nVisiting statement:\n");
673       print_generic_stmt (dump_file, stmt, dump_flags);
674       fprintf (dump_file, "\n");
675     }
676
677   ann = stmt_ann (stmt);
678
679   if (TREE_CODE (stmt) == MODIFY_EXPR
680       && TREE_CODE (TREE_OPERAND (stmt, 1)) == SSA_NAME
681       && (do_store_copy_prop
682           || TREE_CODE (TREE_OPERAND (stmt, 0)) == SSA_NAME))
683     {
684       /* If the statement is a copy assignment, evaluate its RHS to
685          see if the lattice value of its output has changed.  */
686       retval = copy_prop_visit_assignment (stmt, result_p);
687     }
688   else if (TREE_CODE (stmt) == COND_EXPR)
689     {
690       /* See if we can determine which edge goes out of a conditional
691          jump.  */
692       retval = copy_prop_visit_cond_stmt (stmt, taken_edge_p);
693     }
694   else
695     retval = SSA_PROP_VARYING;
696
697   if (retval == SSA_PROP_VARYING)
698     {
699       tree def;
700       ssa_op_iter i;
701
702       /* Any other kind of statement is not interesting for constant
703          propagation and, therefore, not worth simulating.  */
704       if (dump_file && (dump_flags & TDF_DETAILS))
705         fprintf (dump_file, "No interesting values produced.\n");
706
707       /* The assignment is not a copy operation.  Don't visit this
708          statement again and mark all the definitions in the statement
709          to be copies of nothing.  */
710       FOR_EACH_SSA_TREE_OPERAND (def, stmt, i, SSA_OP_ALL_DEFS)
711         set_copy_of_val (def, def, NULL_TREE);
712     }
713
714   return retval;
715 }
716
717
718 /* Visit PHI node PHI.  If all the arguments produce the same value,
719    set it to be the value of the LHS of PHI.  */
720
721 static enum ssa_prop_result
722 copy_prop_visit_phi_node (tree phi)
723 {
724   enum ssa_prop_result retval;
725   int i;
726   tree lhs;
727   prop_value_t phi_val = { 0, NULL_TREE, NULL_TREE };
728
729   lhs = PHI_RESULT (phi);
730
731   if (dump_file && (dump_flags & TDF_DETAILS))
732     {
733       fprintf (dump_file, "\nVisiting PHI node: ");
734       print_generic_expr (dump_file, phi, dump_flags);
735       fprintf (dump_file, "\n\n");
736     }
737
738   for (i = 0; i < PHI_NUM_ARGS (phi); i++)
739     {
740       prop_value_t *arg_val;
741       tree arg = PHI_ARG_DEF (phi, i);
742       edge e = PHI_ARG_EDGE (phi, i);
743
744       /* We don't care about values flowing through non-executable
745          edges.  */
746       if (!(e->flags & EDGE_EXECUTABLE))
747         continue;
748
749       /* Constants in the argument list never generate a useful copy.
750          Similarly, names that flow through abnormal edges cannot be
751          used to derive copies.  */
752       if (TREE_CODE (arg) != SSA_NAME || SSA_NAME_OCCURS_IN_ABNORMAL_PHI (arg))
753         {
754           phi_val.value = lhs;
755           break;
756         }
757
758       /* Avoid copy propagation from an inner into an outer loop.
759          Otherwise, this may move loop variant variables outside of
760          their loops and prevent coalescing opportunities.  If the
761          value was loop invariant, it will be hoisted by LICM and
762          exposed for copy propagation.  */
763       if (loop_depth_of_name (arg) > loop_depth_of_name (lhs))
764         {
765           phi_val.value = lhs;
766           break;
767         }
768
769       /* If the LHS appears in the argument list, ignore it.  It is
770          irrelevant as a copy.  */
771       if (arg == lhs || get_last_copy_of (arg) == lhs)
772         continue;
773
774       if (dump_file && (dump_flags & TDF_DETAILS))
775         {
776           fprintf (dump_file, "\tArgument #%d: ", i);
777           dump_copy_of (dump_file, arg);
778           fprintf (dump_file, "\n");
779         }
780
781       arg_val = get_copy_of_val (arg);
782
783       /* If the LHS didn't have a value yet, make it a copy of the
784          first argument we find.  Notice that while we make the LHS be
785          a copy of the argument itself, we take the memory reference
786          from the argument's value so that we can compare it to the
787          memory reference of all the other arguments.  */
788       if (phi_val.value == NULL_TREE)
789         {
790           phi_val.value = arg;
791           phi_val.mem_ref = arg_val->mem_ref;
792           continue;
793         }
794
795       /* If PHI_VAL and ARG don't have a common copy-of chain, then
796          this PHI node cannot be a copy operation.  Also, if we are
797          copy propagating stores and these two arguments came from
798          different memory references, they cannot be considered
799          copies.  */
800       if (get_last_copy_of (phi_val.value) != get_last_copy_of (arg)
801           || (do_store_copy_prop
802               && phi_val.mem_ref
803               && arg_val->mem_ref
804               && simple_cst_equal (phi_val.mem_ref, arg_val->mem_ref) != 1))
805         {
806           phi_val.value = lhs;
807           break;
808         }
809     }
810
811   if (phi_val.value && set_copy_of_val (lhs, phi_val.value, phi_val.mem_ref))
812     retval = (phi_val.value != lhs) ? SSA_PROP_INTERESTING : SSA_PROP_VARYING;
813   else
814     retval = SSA_PROP_NOT_INTERESTING;
815
816   if (dump_file && (dump_flags & TDF_DETAILS))
817     {
818       fprintf (dump_file, "\nPHI node ");
819       dump_copy_of (dump_file, lhs);
820       fprintf (dump_file, "\nTelling the propagator to ");
821       if (retval == SSA_PROP_INTERESTING)
822         fprintf (dump_file, "add SSA edges out of this PHI and continue.");
823       else if (retval == SSA_PROP_VARYING)
824         fprintf (dump_file, "add SSA edges out of this PHI and never visit again.");
825       else
826         fprintf (dump_file, "do nothing with SSA edges and keep iterating.");
827       fprintf (dump_file, "\n\n");
828     }
829
830   return retval;
831 }
832
833
834 /* Initialize structures used for copy propagation.  */
835
836 static void
837 init_copy_prop (void)
838 {
839   basic_block bb;
840
841   copy_of = xmalloc (num_ssa_names * sizeof (*copy_of));
842   memset (copy_of, 0, num_ssa_names * sizeof (*copy_of));
843
844   cached_last_copy_of = xmalloc (num_ssa_names * sizeof (*cached_last_copy_of));
845   memset (cached_last_copy_of, 0, num_ssa_names * sizeof (*cached_last_copy_of));
846
847   FOR_EACH_BB (bb)
848     {
849       block_stmt_iterator si;
850       tree phi;
851
852       for (si = bsi_start (bb); !bsi_end_p (si); bsi_next (&si))
853         {
854           tree stmt = bsi_stmt (si);
855
856           /* The only statements that we care about are those that may
857              generate useful copies.  We also need to mark conditional
858              jumps so that their outgoing edges are added to the work
859              lists of the propagator.  */
860           if (stmt_ends_bb_p (stmt))
861             DONT_SIMULATE_AGAIN (stmt) = false;
862           else if (stmt_may_generate_copy (stmt))
863             DONT_SIMULATE_AGAIN (stmt) = false;
864           else
865             {
866               tree def;
867               ssa_op_iter iter;
868
869               /* No need to simulate this statement anymore.  */
870               DONT_SIMULATE_AGAIN (stmt) = true;
871
872               /* Mark all the outputs of this statement as not being
873                  the copy of anything.  */
874               FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_ALL_DEFS)
875                 set_copy_of_val (def, def, NULL_TREE);
876             }
877         }
878
879       for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
880         DONT_SIMULATE_AGAIN (phi) = false;
881     }
882 }
883
884
885 /* Deallocate memory used in copy propagation and do final
886    substitution.  */
887
888 static void
889 fini_copy_prop (void)
890 {
891   size_t i;
892   
893   /* Set the final copy-of value for each variable by traversing the
894      copy-of chains.  */
895   for (i = 1; i < num_ssa_names; i++)
896     {
897       tree var = ssa_name (i);
898       if (var && copy_of[i].value && copy_of[i].value != var)
899         copy_of[i].value = get_last_copy_of (var);
900     }
901
902   substitute_and_fold (copy_of);
903
904   free (cached_last_copy_of);
905   free (copy_of);
906 }
907
908
909 /* Main entry point to the copy propagator.  The algorithm propagates
910    the value COPY-OF using ssa_propagate.  For every variable X_i,
911    COPY-OF(X_i) indicates which variable is X_i created from.  The
912    following example shows how the algorithm proceeds at a high level:
913
914             1   a_24 = x_1
915             2   a_2 = PHI <a_24, x_1>
916             3   a_5 = PHI <a_2>
917             4   x_1 = PHI <x_298, a_5, a_2>
918
919    The end result should be that a_2, a_5, a_24 and x_1 are a copy of
920    x_298.  Propagation proceeds as follows.
921
922    Visit #1: a_24 is copy-of x_1.  Value changed.
923    Visit #2: a_2 is copy-of x_1.  Value changed.
924    Visit #3: a_5 is copy-of x_1.  Value changed.
925    Visit #4: x_1 is copy-of x_298.  Value changed.
926    Visit #1: a_24 is copy-of x_298.  Value changed.
927    Visit #2: a_2 is copy-of x_298.  Value changed.
928    Visit #3: a_5 is copy-of x_298.  Value changed.
929    Visit #4: x_1 is copy-of x_298.  Stable state reached.
930    
931    When visiting PHI nodes, we only consider arguments that flow
932    through edges marked executable by the propagation engine.  So,
933    when visiting statement #2 for the first time, we will only look at
934    the first argument (a_24) and optimistically assume that its value
935    is the copy of a_24 (x_1).
936
937    The problem with this approach is that it may fail to discover copy
938    relations in PHI cycles.  Instead of propagating copy-of
939    values, we actually propagate copy-of chains.  For instance:
940
941                 A_3 = B_1;
942                 C_9 = A_3;
943                 D_4 = C_9;
944                 X_i = D_4;
945
946    In this code fragment, COPY-OF (X_i) = { D_4, C_9, A_3, B_1 }.
947    Obviously, we are only really interested in the last value of the
948    chain, however the propagator needs to access the copy-of chain
949    when visiting PHI nodes.
950
951    To represent the copy-of chain, we use the array COPY_CHAINS, which
952    holds the first link in the copy-of chain for every variable.
953    If variable X_i is a copy of X_j, which in turn is a copy of X_k,
954    the array will contain:
955
956                 COPY_CHAINS[i] = X_j
957                 COPY_CHAINS[j] = X_k
958                 COPY_CHAINS[k] = X_k
959
960    Keeping copy-of chains instead of copy-of values directly becomes
961    important when visiting PHI nodes.  Suppose that we had the
962    following PHI cycle, such that x_52 is already considered a copy of
963    x_53:
964
965             1   x_54 = PHI <x_53, x_52>
966             2   x_53 = PHI <x_898, x_54>
967    
968    Visit #1: x_54 is copy-of x_53 (because x_52 is copy-of x_53)
969    Visit #2: x_53 is copy-of x_898 (because x_54 is a copy of x_53,
970                                     so it is considered irrelevant
971                                     as a copy).
972    Visit #1: x_54 is copy-of nothing (x_53 is a copy-of x_898 and
973                                       x_52 is a copy of x_53, so
974                                       they don't match)
975    Visit #2: x_53 is copy-of nothing
976
977    This problem is avoided by keeping a chain of copies, instead of
978    the final copy-of value.  Propagation will now only keep the first
979    element of a variable's copy-of chain.  When visiting PHI nodes,
980    arguments are considered equal if their copy-of chains end in the
981    same variable.  So, as long as their copy-of chains overlap, we
982    know that they will be a copy of the same variable, regardless of
983    which variable that may be).
984    
985    Propagation would then proceed as follows (the notation a -> b
986    means that a is a copy-of b):
987
988    Visit #1: x_54 = PHI <x_53, x_52>
989                 x_53 -> x_53
990                 x_52 -> x_53
991                 Result: x_54 -> x_53.  Value changed.  Add SSA edges.
992
993    Visit #1: x_53 = PHI <x_898, x_54>
994                 x_898 -> x_898
995                 x_54 -> x_53
996                 Result: x_53 -> x_898.  Value changed.  Add SSA edges.
997
998    Visit #2: x_54 = PHI <x_53, x_52>
999                 x_53 -> x_898
1000                 x_52 -> x_53 -> x_898
1001                 Result: x_54 -> x_898.  Value changed.  Add SSA edges.
1002
1003    Visit #2: x_53 = PHI <x_898, x_54>
1004                 x_898 -> x_898
1005                 x_54 -> x_898
1006                 Result: x_53 -> x_898.  Value didn't change.  Stable state
1007
1008    Once the propagator stabilizes, we end up with the desired result
1009    x_53 and x_54 are both copies of x_898.  */
1010
1011 static void
1012 execute_copy_prop (bool store_copy_prop)
1013 {
1014   do_store_copy_prop = store_copy_prop;
1015   init_copy_prop ();
1016   ssa_propagate (copy_prop_visit_stmt, copy_prop_visit_phi_node);
1017   fini_copy_prop ();
1018 }
1019
1020
1021 static bool
1022 gate_copy_prop (void)
1023 {
1024   return flag_tree_copy_prop != 0;
1025 }
1026
1027 static void
1028 do_copy_prop (void)
1029 {
1030   execute_copy_prop (false);
1031 }
1032
1033 struct tree_opt_pass pass_copy_prop =
1034 {
1035   "copyprop",                           /* name */
1036   gate_copy_prop,                       /* gate */
1037   do_copy_prop,                         /* execute */
1038   NULL,                                 /* sub */
1039   NULL,                                 /* next */
1040   0,                                    /* static_pass_number */
1041   TV_TREE_COPY_PROP,                    /* tv_id */
1042   PROP_ssa | PROP_alias | PROP_cfg,     /* properties_required */
1043   0,                                    /* properties_provided */
1044   0,                                    /* properties_destroyed */
1045   0,                                    /* todo_flags_start */
1046   TODO_cleanup_cfg
1047     | TODO_dump_func
1048     | TODO_ggc_collect
1049     | TODO_verify_ssa
1050     | TODO_update_ssa,                  /* todo_flags_finish */
1051   0                                     /* letter */
1052 };
1053
1054
1055 static bool
1056 gate_store_copy_prop (void)
1057 {
1058   /* STORE-COPY-PROP is enabled only with -ftree-store-copy-prop, but
1059      when -fno-tree-store-copy-prop is specified, we should run
1060      regular COPY-PROP. That's why the pass is enabled with either
1061      flag.  */
1062   return flag_tree_store_copy_prop != 0 || flag_tree_copy_prop != 0;
1063 }
1064
1065 static void
1066 store_copy_prop (void)
1067 {
1068   /* If STORE-COPY-PROP is not enabled, we just run regular COPY-PROP.  */
1069   execute_copy_prop (flag_tree_store_copy_prop != 0);
1070 }
1071
1072 struct tree_opt_pass pass_store_copy_prop =
1073 {
1074   "store_copyprop",                     /* name */
1075   gate_store_copy_prop,                 /* gate */
1076   store_copy_prop,                      /* execute */
1077   NULL,                                 /* sub */
1078   NULL,                                 /* next */
1079   0,                                    /* static_pass_number */
1080   TV_TREE_STORE_COPY_PROP,              /* tv_id */
1081   PROP_ssa | PROP_alias | PROP_cfg,     /* properties_required */
1082   0,                                    /* properties_provided */
1083   0,                                    /* properties_destroyed */
1084   0,                                    /* todo_flags_start */
1085   TODO_dump_func
1086     | TODO_cleanup_cfg
1087     | TODO_ggc_collect
1088     | TODO_verify_ssa
1089     | TODO_update_ssa,                  /* todo_flags_finish */
1090   0                                     /* letter */
1091 };