1/* SSA Dominator optimizations for trees
2   Copyright (C) 2001-2015 Free Software Foundation, Inc.
3   Contributed by Diego Novillo <dnovillo@redhat.com>
4
5This file is part of GCC.
6
7GCC is free software; you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
9the Free Software Foundation; either version 3, or (at your option)
10any later version.
11
12GCC is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
18along with GCC; see the file COPYING3.  If not see
19<http://www.gnu.org/licenses/>.  */
20
21#include "config.h"
22#include "system.h"
23#include "coretypes.h"
24#include "hash-table.h"
25#include "tm.h"
26#include "hash-set.h"
27#include "machmode.h"
28#include "vec.h"
29#include "double-int.h"
30#include "input.h"
31#include "alias.h"
32#include "symtab.h"
33#include "wide-int.h"
34#include "inchash.h"
35#include "real.h"
36#include "tree.h"
37#include "fold-const.h"
38#include "stor-layout.h"
39#include "flags.h"
40#include "tm_p.h"
41#include "predict.h"
42#include "hard-reg-set.h"
43#include "input.h"
44#include "function.h"
45#include "dominance.h"
46#include "cfg.h"
47#include "cfganal.h"
48#include "basic-block.h"
49#include "cfgloop.h"
50#include "inchash.h"
51#include "gimple-pretty-print.h"
52#include "tree-ssa-alias.h"
53#include "internal-fn.h"
54#include "gimple-fold.h"
55#include "tree-eh.h"
56#include "gimple-expr.h"
57#include "is-a.h"
58#include "gimple.h"
59#include "gimple-iterator.h"
60#include "gimple-ssa.h"
61#include "tree-cfg.h"
62#include "tree-phinodes.h"
63#include "ssa-iterators.h"
64#include "stringpool.h"
65#include "tree-ssanames.h"
66#include "tree-into-ssa.h"
67#include "domwalk.h"
68#include "tree-pass.h"
69#include "tree-ssa-propagate.h"
70#include "tree-ssa-threadupdate.h"
71#include "langhooks.h"
72#include "params.h"
73#include "tree-ssa-threadedge.h"
74#include "tree-ssa-dom.h"
75#include "inchash.h"
76#include "gimplify.h"
77#include "tree-cfgcleanup.h"
78
79/* This file implements optimizations on the dominator tree.  */
80
81/* Representation of a "naked" right-hand-side expression, to be used
82   in recording available expressions in the expression hash table.  */
83
84enum expr_kind
85{
86  EXPR_SINGLE,
87  EXPR_UNARY,
88  EXPR_BINARY,
89  EXPR_TERNARY,
90  EXPR_CALL,
91  EXPR_PHI
92};
93
94struct hashable_expr
95{
96  tree type;
97  enum expr_kind kind;
98  union {
99    struct { tree rhs; } single;
100    struct { enum tree_code op;  tree opnd; } unary;
101    struct { enum tree_code op;  tree opnd0, opnd1; } binary;
102    struct { enum tree_code op;  tree opnd0, opnd1, opnd2; } ternary;
103    struct { gcall *fn_from; bool pure; size_t nargs; tree *args; } call;
104    struct { size_t nargs; tree *args; } phi;
105  } ops;
106};
107
108/* Structure for recording known values of a conditional expression
109   at the exits from its block.  */
110
111typedef struct cond_equivalence_s
112{
113  struct hashable_expr cond;
114  tree value;
115} cond_equivalence;
116
117
118/* Structure for recording edge equivalences as well as any pending
119   edge redirections during the dominator optimizer.
120
121   Computing and storing the edge equivalences instead of creating
122   them on-demand can save significant amounts of time, particularly
123   for pathological cases involving switch statements.
124
125   These structures live for a single iteration of the dominator
126   optimizer in the edge's AUX field.  At the end of an iteration we
127   free each of these structures and update the AUX field to point
128   to any requested redirection target (the code for updating the
129   CFG and SSA graph for edge redirection expects redirection edge
130   targets to be in the AUX field for each edge.  */
131
132struct edge_info
133{
134  /* If this edge creates a simple equivalence, the LHS and RHS of
135     the equivalence will be stored here.  */
136  tree lhs;
137  tree rhs;
138
139  /* Traversing an edge may also indicate one or more particular conditions
140     are true or false.  */
141  vec<cond_equivalence> cond_equivalences;
142};
143
144/* Stack of available expressions in AVAIL_EXPRs.  Each block pushes any
145   expressions it enters into the hash table along with a marker entry
146   (null).  When we finish processing the block, we pop off entries and
147   remove the expressions from the global hash table until we hit the
148   marker.  */
149typedef struct expr_hash_elt * expr_hash_elt_t;
150
151static vec<std::pair<expr_hash_elt_t, expr_hash_elt_t> > avail_exprs_stack;
152
153/* Structure for entries in the expression hash table.  */
154
155struct expr_hash_elt
156{
157  /* The value (lhs) of this expression.  */
158  tree lhs;
159
160  /* The expression (rhs) we want to record.  */
161  struct hashable_expr expr;
162
163  /* The virtual operand associated with the nearest dominating stmt
164     loading from or storing to expr.  */
165  tree vop;
166
167  /* The hash value for RHS.  */
168  hashval_t hash;
169
170  /* A unique stamp, typically the address of the hash
171     element itself, used in removing entries from the table.  */
172  struct expr_hash_elt *stamp;
173};
174
175/* Hashtable helpers.  */
176
177static bool hashable_expr_equal_p (const struct hashable_expr *,
178				   const struct hashable_expr *);
179static void free_expr_hash_elt (void *);
180
181struct expr_elt_hasher
182{
183  typedef expr_hash_elt *value_type;
184  typedef expr_hash_elt *compare_type;
185  typedef int store_values_directly;
186  static inline hashval_t hash (const value_type &);
187  static inline bool equal (const value_type &, const compare_type &);
188  static inline void remove (value_type &);
189};
190
191inline hashval_t
192expr_elt_hasher::hash (const value_type &p)
193{
194  return p->hash;
195}
196
197inline bool
198expr_elt_hasher::equal (const value_type &p1, const compare_type &p2)
199{
200  const struct hashable_expr *expr1 = &p1->expr;
201  const struct expr_hash_elt *stamp1 = p1->stamp;
202  const struct hashable_expr *expr2 = &p2->expr;
203  const struct expr_hash_elt *stamp2 = p2->stamp;
204
205  /* This case should apply only when removing entries from the table.  */
206  if (stamp1 == stamp2)
207    return true;
208
209  if (p1->hash != p2->hash)
210    return false;
211
212  /* In case of a collision, both RHS have to be identical and have the
213     same VUSE operands.  */
214  if (hashable_expr_equal_p (expr1, expr2)
215      && types_compatible_p (expr1->type, expr2->type))
216    return true;
217
218  return false;
219}
220
221/* Delete an expr_hash_elt and reclaim its storage.  */
222
223inline void
224expr_elt_hasher::remove (value_type &element)
225{
226  free_expr_hash_elt (element);
227}
228
229/* Hash table with expressions made available during the renaming process.
230   When an assignment of the form X_i = EXPR is found, the statement is
231   stored in this table.  If the same expression EXPR is later found on the
232   RHS of another statement, it is replaced with X_i (thus performing
233   global redundancy elimination).  Similarly as we pass through conditionals
234   we record the conditional itself as having either a true or false value
235   in this table.  */
236static hash_table<expr_elt_hasher> *avail_exprs;
237
238/* Stack of dest,src pairs that need to be restored during finalization.
239
240   A NULL entry is used to mark the end of pairs which need to be
241   restored during finalization of this block.  */
242static vec<tree> const_and_copies_stack;
243
244/* Track whether or not we have changed the control flow graph.  */
245static bool cfg_altered;
246
247/* Bitmap of blocks that have had EH statements cleaned.  We should
248   remove their dead edges eventually.  */
249static bitmap need_eh_cleanup;
250static vec<gimple> need_noreturn_fixup;
251
252/* Statistics for dominator optimizations.  */
253struct opt_stats_d
254{
255  long num_stmts;
256  long num_exprs_considered;
257  long num_re;
258  long num_const_prop;
259  long num_copy_prop;
260};
261
262static struct opt_stats_d opt_stats;
263
264/* Local functions.  */
265static void optimize_stmt (basic_block, gimple_stmt_iterator);
266static tree lookup_avail_expr (gimple, bool, bool = true);
267static hashval_t avail_expr_hash (const void *);
268static void htab_statistics (FILE *,
269			     const hash_table<expr_elt_hasher> &);
270static void record_cond (cond_equivalence *);
271static void record_const_or_copy (tree, tree);
272static void record_equality (tree, tree);
273static void record_equivalences_from_phis (basic_block);
274static void record_equivalences_from_incoming_edge (basic_block);
275static void eliminate_redundant_computations (gimple_stmt_iterator *);
276static void record_equivalences_from_stmt (gimple, int);
277static void remove_local_expressions_from_table (void);
278static void restore_vars_to_original_value (void);
279static edge single_incoming_edge_ignoring_loop_edges (basic_block);
280
281
282/* Given a statement STMT, initialize the hash table element pointed to
283   by ELEMENT.  */
284
285static void
286initialize_hash_element (gimple stmt, tree lhs,
287                         struct expr_hash_elt *element)
288{
289  enum gimple_code code = gimple_code (stmt);
290  struct hashable_expr *expr = &element->expr;
291
292  if (code == GIMPLE_ASSIGN)
293    {
294      enum tree_code subcode = gimple_assign_rhs_code (stmt);
295
296      switch (get_gimple_rhs_class (subcode))
297        {
298        case GIMPLE_SINGLE_RHS:
299	  expr->kind = EXPR_SINGLE;
300	  expr->type = TREE_TYPE (gimple_assign_rhs1 (stmt));
301	  expr->ops.single.rhs = gimple_assign_rhs1 (stmt);
302	  break;
303        case GIMPLE_UNARY_RHS:
304	  expr->kind = EXPR_UNARY;
305	  expr->type = TREE_TYPE (gimple_assign_lhs (stmt));
306	  if (CONVERT_EXPR_CODE_P (subcode))
307	    subcode = NOP_EXPR;
308	  expr->ops.unary.op = subcode;
309	  expr->ops.unary.opnd = gimple_assign_rhs1 (stmt);
310	  break;
311        case GIMPLE_BINARY_RHS:
312	  expr->kind = EXPR_BINARY;
313	  expr->type = TREE_TYPE (gimple_assign_lhs (stmt));
314	  expr->ops.binary.op = subcode;
315	  expr->ops.binary.opnd0 = gimple_assign_rhs1 (stmt);
316	  expr->ops.binary.opnd1 = gimple_assign_rhs2 (stmt);
317	  break;
318        case GIMPLE_TERNARY_RHS:
319	  expr->kind = EXPR_TERNARY;
320	  expr->type = TREE_TYPE (gimple_assign_lhs (stmt));
321	  expr->ops.ternary.op = subcode;
322	  expr->ops.ternary.opnd0 = gimple_assign_rhs1 (stmt);
323	  expr->ops.ternary.opnd1 = gimple_assign_rhs2 (stmt);
324	  expr->ops.ternary.opnd2 = gimple_assign_rhs3 (stmt);
325	  break;
326        default:
327          gcc_unreachable ();
328        }
329    }
330  else if (code == GIMPLE_COND)
331    {
332      expr->type = boolean_type_node;
333      expr->kind = EXPR_BINARY;
334      expr->ops.binary.op = gimple_cond_code (stmt);
335      expr->ops.binary.opnd0 = gimple_cond_lhs (stmt);
336      expr->ops.binary.opnd1 = gimple_cond_rhs (stmt);
337    }
338  else if (gcall *call_stmt = dyn_cast <gcall *> (stmt))
339    {
340      size_t nargs = gimple_call_num_args (call_stmt);
341      size_t i;
342
343      gcc_assert (gimple_call_lhs (call_stmt));
344
345      expr->type = TREE_TYPE (gimple_call_lhs (call_stmt));
346      expr->kind = EXPR_CALL;
347      expr->ops.call.fn_from = call_stmt;
348
349      if (gimple_call_flags (call_stmt) & (ECF_CONST | ECF_PURE))
350        expr->ops.call.pure = true;
351      else
352        expr->ops.call.pure = false;
353
354      expr->ops.call.nargs = nargs;
355      expr->ops.call.args = XCNEWVEC (tree, nargs);
356      for (i = 0; i < nargs; i++)
357        expr->ops.call.args[i] = gimple_call_arg (call_stmt, i);
358    }
359  else if (gswitch *swtch_stmt = dyn_cast <gswitch *> (stmt))
360    {
361      expr->type = TREE_TYPE (gimple_switch_index (swtch_stmt));
362      expr->kind = EXPR_SINGLE;
363      expr->ops.single.rhs = gimple_switch_index (swtch_stmt);
364    }
365  else if (code == GIMPLE_GOTO)
366    {
367      expr->type = TREE_TYPE (gimple_goto_dest (stmt));
368      expr->kind = EXPR_SINGLE;
369      expr->ops.single.rhs = gimple_goto_dest (stmt);
370    }
371  else if (code == GIMPLE_PHI)
372    {
373      size_t nargs = gimple_phi_num_args (stmt);
374      size_t i;
375
376      expr->type = TREE_TYPE (gimple_phi_result (stmt));
377      expr->kind = EXPR_PHI;
378      expr->ops.phi.nargs = nargs;
379      expr->ops.phi.args = XCNEWVEC (tree, nargs);
380
381      for (i = 0; i < nargs; i++)
382        expr->ops.phi.args[i] = gimple_phi_arg_def (stmt, i);
383    }
384  else
385    gcc_unreachable ();
386
387  element->lhs = lhs;
388  element->vop = gimple_vuse (stmt);
389  element->hash = avail_expr_hash (element);
390  element->stamp = element;
391}
392
393/* Given a conditional expression COND as a tree, initialize
394   a hashable_expr expression EXPR.  The conditional must be a
395   comparison or logical negation.  A constant or a variable is
396   not permitted.  */
397
398static void
399initialize_expr_from_cond (tree cond, struct hashable_expr *expr)
400{
401  expr->type = boolean_type_node;
402
403  if (COMPARISON_CLASS_P (cond))
404    {
405      expr->kind = EXPR_BINARY;
406      expr->ops.binary.op = TREE_CODE (cond);
407      expr->ops.binary.opnd0 = TREE_OPERAND (cond, 0);
408      expr->ops.binary.opnd1 = TREE_OPERAND (cond, 1);
409    }
410  else if (TREE_CODE (cond) == TRUTH_NOT_EXPR)
411    {
412      expr->kind = EXPR_UNARY;
413      expr->ops.unary.op = TRUTH_NOT_EXPR;
414      expr->ops.unary.opnd = TREE_OPERAND (cond, 0);
415    }
416  else
417    gcc_unreachable ();
418}
419
420/* Given a hashable_expr expression EXPR and an LHS,
421   initialize the hash table element pointed to by ELEMENT.  */
422
423static void
424initialize_hash_element_from_expr (struct hashable_expr *expr,
425                                   tree lhs,
426                                   struct expr_hash_elt *element)
427{
428  element->expr = *expr;
429  element->lhs = lhs;
430  element->vop = NULL_TREE;
431  element->hash = avail_expr_hash (element);
432  element->stamp = element;
433}
434
435/* Compare two hashable_expr structures for equivalence.
436   They are considered equivalent when the the expressions
437   they denote must necessarily be equal.  The logic is intended
438   to follow that of operand_equal_p in fold-const.c  */
439
440static bool
441hashable_expr_equal_p (const struct hashable_expr *expr0,
442                        const struct hashable_expr *expr1)
443{
444  tree type0 = expr0->type;
445  tree type1 = expr1->type;
446
447  /* If either type is NULL, there is nothing to check.  */
448  if ((type0 == NULL_TREE) ^ (type1 == NULL_TREE))
449    return false;
450
451  /* If both types don't have the same signedness, precision, and mode,
452     then we can't consider  them equal.  */
453  if (type0 != type1
454      && (TREE_CODE (type0) == ERROR_MARK
455	  || TREE_CODE (type1) == ERROR_MARK
456	  || TYPE_UNSIGNED (type0) != TYPE_UNSIGNED (type1)
457	  || TYPE_PRECISION (type0) != TYPE_PRECISION (type1)
458	  || TYPE_MODE (type0) != TYPE_MODE (type1)))
459    return false;
460
461  if (expr0->kind != expr1->kind)
462    return false;
463
464  switch (expr0->kind)
465    {
466    case EXPR_SINGLE:
467      return operand_equal_p (expr0->ops.single.rhs,
468                              expr1->ops.single.rhs, 0);
469
470    case EXPR_UNARY:
471      if (expr0->ops.unary.op != expr1->ops.unary.op)
472        return false;
473
474      if ((CONVERT_EXPR_CODE_P (expr0->ops.unary.op)
475           || expr0->ops.unary.op == NON_LVALUE_EXPR)
476          && TYPE_UNSIGNED (expr0->type) != TYPE_UNSIGNED (expr1->type))
477        return false;
478
479      return operand_equal_p (expr0->ops.unary.opnd,
480                              expr1->ops.unary.opnd, 0);
481
482    case EXPR_BINARY:
483      if (expr0->ops.binary.op != expr1->ops.binary.op)
484	return false;
485
486      if (operand_equal_p (expr0->ops.binary.opnd0,
487			   expr1->ops.binary.opnd0, 0)
488	  && operand_equal_p (expr0->ops.binary.opnd1,
489			      expr1->ops.binary.opnd1, 0))
490	return true;
491
492      /* For commutative ops, allow the other order.  */
493      return (commutative_tree_code (expr0->ops.binary.op)
494	      && operand_equal_p (expr0->ops.binary.opnd0,
495				  expr1->ops.binary.opnd1, 0)
496	      && operand_equal_p (expr0->ops.binary.opnd1,
497				  expr1->ops.binary.opnd0, 0));
498
499    case EXPR_TERNARY:
500      if (expr0->ops.ternary.op != expr1->ops.ternary.op
501	  || !operand_equal_p (expr0->ops.ternary.opnd2,
502			       expr1->ops.ternary.opnd2, 0))
503	return false;
504
505      if (operand_equal_p (expr0->ops.ternary.opnd0,
506			   expr1->ops.ternary.opnd0, 0)
507	  && operand_equal_p (expr0->ops.ternary.opnd1,
508			      expr1->ops.ternary.opnd1, 0))
509	return true;
510
511      /* For commutative ops, allow the other order.  */
512      return (commutative_ternary_tree_code (expr0->ops.ternary.op)
513	      && operand_equal_p (expr0->ops.ternary.opnd0,
514				  expr1->ops.ternary.opnd1, 0)
515	      && operand_equal_p (expr0->ops.ternary.opnd1,
516				  expr1->ops.ternary.opnd0, 0));
517
518    case EXPR_CALL:
519      {
520        size_t i;
521
522        /* If the calls are to different functions, then they
523           clearly cannot be equal.  */
524        if (!gimple_call_same_target_p (expr0->ops.call.fn_from,
525                                        expr1->ops.call.fn_from))
526          return false;
527
528        if (! expr0->ops.call.pure)
529          return false;
530
531        if (expr0->ops.call.nargs !=  expr1->ops.call.nargs)
532          return false;
533
534        for (i = 0; i < expr0->ops.call.nargs; i++)
535          if (! operand_equal_p (expr0->ops.call.args[i],
536                                 expr1->ops.call.args[i], 0))
537            return false;
538
539	if (stmt_could_throw_p (expr0->ops.call.fn_from))
540	  {
541	    int lp0 = lookup_stmt_eh_lp (expr0->ops.call.fn_from);
542	    int lp1 = lookup_stmt_eh_lp (expr1->ops.call.fn_from);
543	    if ((lp0 > 0 || lp1 > 0) && lp0 != lp1)
544	      return false;
545	  }
546
547        return true;
548      }
549
550    case EXPR_PHI:
551      {
552        size_t i;
553
554        if (expr0->ops.phi.nargs !=  expr1->ops.phi.nargs)
555          return false;
556
557        for (i = 0; i < expr0->ops.phi.nargs; i++)
558          if (! operand_equal_p (expr0->ops.phi.args[i],
559                                 expr1->ops.phi.args[i], 0))
560            return false;
561
562        return true;
563      }
564
565    default:
566      gcc_unreachable ();
567    }
568}
569
570/* Generate a hash value for a pair of expressions.  This can be used
571   iteratively by passing a previous result in HSTATE.
572
573   The same hash value is always returned for a given pair of expressions,
574   regardless of the order in which they are presented.  This is useful in
575   hashing the operands of commutative functions.  */
576
577namespace inchash
578{
579
580static void
581add_expr_commutative (const_tree t1, const_tree t2, hash &hstate)
582{
583  hash one, two;
584
585  inchash::add_expr (t1, one);
586  inchash::add_expr (t2, two);
587  hstate.add_commutative (one, two);
588}
589
590/* Compute a hash value for a hashable_expr value EXPR and a
591   previously accumulated hash value VAL.  If two hashable_expr
592   values compare equal with hashable_expr_equal_p, they must
593   hash to the same value, given an identical value of VAL.
594   The logic is intended to follow inchash::add_expr in tree.c.  */
595
596static void
597add_hashable_expr (const struct hashable_expr *expr, hash &hstate)
598{
599  switch (expr->kind)
600    {
601    case EXPR_SINGLE:
602      inchash::add_expr (expr->ops.single.rhs, hstate);
603      break;
604
605    case EXPR_UNARY:
606      hstate.add_object (expr->ops.unary.op);
607
608      /* Make sure to include signedness in the hash computation.
609         Don't hash the type, that can lead to having nodes which
610         compare equal according to operand_equal_p, but which
611         have different hash codes.  */
612      if (CONVERT_EXPR_CODE_P (expr->ops.unary.op)
613          || expr->ops.unary.op == NON_LVALUE_EXPR)
614        hstate.add_int (TYPE_UNSIGNED (expr->type));
615
616      inchash::add_expr (expr->ops.unary.opnd, hstate);
617      break;
618
619    case EXPR_BINARY:
620      hstate.add_object (expr->ops.binary.op);
621      if (commutative_tree_code (expr->ops.binary.op))
622	inchash::add_expr_commutative (expr->ops.binary.opnd0,
623					  expr->ops.binary.opnd1, hstate);
624      else
625        {
626          inchash::add_expr (expr->ops.binary.opnd0, hstate);
627          inchash::add_expr (expr->ops.binary.opnd1, hstate);
628        }
629      break;
630
631    case EXPR_TERNARY:
632      hstate.add_object (expr->ops.ternary.op);
633      if (commutative_ternary_tree_code (expr->ops.ternary.op))
634	inchash::add_expr_commutative (expr->ops.ternary.opnd0,
635					  expr->ops.ternary.opnd1, hstate);
636      else
637        {
638          inchash::add_expr (expr->ops.ternary.opnd0, hstate);
639          inchash::add_expr (expr->ops.ternary.opnd1, hstate);
640        }
641      inchash::add_expr (expr->ops.ternary.opnd2, hstate);
642      break;
643
644    case EXPR_CALL:
645      {
646        size_t i;
647        enum tree_code code = CALL_EXPR;
648        gcall *fn_from;
649
650        hstate.add_object (code);
651        fn_from = expr->ops.call.fn_from;
652        if (gimple_call_internal_p (fn_from))
653          hstate.merge_hash ((hashval_t) gimple_call_internal_fn (fn_from));
654        else
655          inchash::add_expr (gimple_call_fn (fn_from), hstate);
656        for (i = 0; i < expr->ops.call.nargs; i++)
657          inchash::add_expr (expr->ops.call.args[i], hstate);
658      }
659      break;
660
661    case EXPR_PHI:
662      {
663        size_t i;
664
665        for (i = 0; i < expr->ops.phi.nargs; i++)
666          inchash::add_expr (expr->ops.phi.args[i], hstate);
667      }
668      break;
669
670    default:
671      gcc_unreachable ();
672    }
673}
674
675}
676
677/* Print a diagnostic dump of an expression hash table entry.  */
678
679static void
680print_expr_hash_elt (FILE * stream, const struct expr_hash_elt *element)
681{
682  fprintf (stream, "STMT ");
683
684  if (element->lhs)
685    {
686      print_generic_expr (stream, element->lhs, 0);
687      fprintf (stream, " = ");
688    }
689
690  switch (element->expr.kind)
691    {
692      case EXPR_SINGLE:
693        print_generic_expr (stream, element->expr.ops.single.rhs, 0);
694        break;
695
696      case EXPR_UNARY:
697	fprintf (stream, "%s ", get_tree_code_name (element->expr.ops.unary.op));
698        print_generic_expr (stream, element->expr.ops.unary.opnd, 0);
699        break;
700
701      case EXPR_BINARY:
702        print_generic_expr (stream, element->expr.ops.binary.opnd0, 0);
703	fprintf (stream, " %s ", get_tree_code_name (element->expr.ops.binary.op));
704        print_generic_expr (stream, element->expr.ops.binary.opnd1, 0);
705        break;
706
707      case EXPR_TERNARY:
708	fprintf (stream, " %s <", get_tree_code_name (element->expr.ops.ternary.op));
709        print_generic_expr (stream, element->expr.ops.ternary.opnd0, 0);
710	fputs (", ", stream);
711        print_generic_expr (stream, element->expr.ops.ternary.opnd1, 0);
712	fputs (", ", stream);
713        print_generic_expr (stream, element->expr.ops.ternary.opnd2, 0);
714	fputs (">", stream);
715        break;
716
717      case EXPR_CALL:
718        {
719          size_t i;
720          size_t nargs = element->expr.ops.call.nargs;
721          gcall *fn_from;
722
723          fn_from = element->expr.ops.call.fn_from;
724          if (gimple_call_internal_p (fn_from))
725            fputs (internal_fn_name (gimple_call_internal_fn (fn_from)),
726                   stream);
727          else
728            print_generic_expr (stream, gimple_call_fn (fn_from), 0);
729          fprintf (stream, " (");
730          for (i = 0; i < nargs; i++)
731            {
732              print_generic_expr (stream, element->expr.ops.call.args[i], 0);
733              if (i + 1 < nargs)
734                fprintf (stream, ", ");
735            }
736          fprintf (stream, ")");
737        }
738        break;
739
740      case EXPR_PHI:
741        {
742          size_t i;
743          size_t nargs = element->expr.ops.phi.nargs;
744
745          fprintf (stream, "PHI <");
746          for (i = 0; i < nargs; i++)
747            {
748              print_generic_expr (stream, element->expr.ops.phi.args[i], 0);
749              if (i + 1 < nargs)
750                fprintf (stream, ", ");
751            }
752          fprintf (stream, ">");
753        }
754        break;
755    }
756
757  if (element->vop)
758    {
759      fprintf (stream, " with ");
760      print_generic_expr (stream, element->vop, 0);
761    }
762
763  fprintf (stream, "\n");
764}
765
766/* Delete variable sized pieces of the expr_hash_elt ELEMENT.  */
767
768static void
769free_expr_hash_elt_contents (struct expr_hash_elt *element)
770{
771  if (element->expr.kind == EXPR_CALL)
772    free (element->expr.ops.call.args);
773  else if (element->expr.kind == EXPR_PHI)
774    free (element->expr.ops.phi.args);
775}
776
777/* Delete an expr_hash_elt and reclaim its storage.  */
778
779static void
780free_expr_hash_elt (void *elt)
781{
782  struct expr_hash_elt *element = ((struct expr_hash_elt *)elt);
783  free_expr_hash_elt_contents (element);
784  free (element);
785}
786
787/* Allocate an EDGE_INFO for edge E and attach it to E.
788   Return the new EDGE_INFO structure.  */
789
790static struct edge_info *
791allocate_edge_info (edge e)
792{
793  struct edge_info *edge_info;
794
795  edge_info = XCNEW (struct edge_info);
796
797  e->aux = edge_info;
798  return edge_info;
799}
800
801/* Free all EDGE_INFO structures associated with edges in the CFG.
802   If a particular edge can be threaded, copy the redirection
803   target from the EDGE_INFO structure into the edge's AUX field
804   as required by code to update the CFG and SSA graph for
805   jump threading.  */
806
807static void
808free_all_edge_infos (void)
809{
810  basic_block bb;
811  edge_iterator ei;
812  edge e;
813
814  FOR_EACH_BB_FN (bb, cfun)
815    {
816      FOR_EACH_EDGE (e, ei, bb->preds)
817        {
818	 struct edge_info *edge_info = (struct edge_info *) e->aux;
819
820	  if (edge_info)
821	    {
822	      edge_info->cond_equivalences.release ();
823	      free (edge_info);
824	      e->aux = NULL;
825	    }
826	}
827    }
828}
829
830class dom_opt_dom_walker : public dom_walker
831{
832public:
833  dom_opt_dom_walker (cdi_direction direction)
834    : dom_walker (direction), m_dummy_cond (NULL) {}
835
836  virtual void before_dom_children (basic_block);
837  virtual void after_dom_children (basic_block);
838
839private:
840  void thread_across_edge (edge);
841
842  gcond *m_dummy_cond;
843};
844
845/* Jump threading, redundancy elimination and const/copy propagation.
846
847   This pass may expose new symbols that need to be renamed into SSA.  For
848   every new symbol exposed, its corresponding bit will be set in
849   VARS_TO_RENAME.  */
850
851namespace {
852
853const pass_data pass_data_dominator =
854{
855  GIMPLE_PASS, /* type */
856  "dom", /* name */
857  OPTGROUP_NONE, /* optinfo_flags */
858  TV_TREE_SSA_DOMINATOR_OPTS, /* tv_id */
859  ( PROP_cfg | PROP_ssa ), /* properties_required */
860  0, /* properties_provided */
861  0, /* properties_destroyed */
862  0, /* todo_flags_start */
863  ( TODO_cleanup_cfg | TODO_update_ssa ), /* todo_flags_finish */
864};
865
866class pass_dominator : public gimple_opt_pass
867{
868public:
869  pass_dominator (gcc::context *ctxt)
870    : gimple_opt_pass (pass_data_dominator, ctxt)
871  {}
872
873  /* opt_pass methods: */
874  opt_pass * clone () { return new pass_dominator (m_ctxt); }
875  virtual bool gate (function *) { return flag_tree_dom != 0; }
876  virtual unsigned int execute (function *);
877
878}; // class pass_dominator
879
880unsigned int
881pass_dominator::execute (function *fun)
882{
883  memset (&opt_stats, 0, sizeof (opt_stats));
884
885  /* Create our hash tables.  */
886  avail_exprs = new hash_table<expr_elt_hasher> (1024);
887  avail_exprs_stack.create (20);
888  const_and_copies_stack.create (20);
889  need_eh_cleanup = BITMAP_ALLOC (NULL);
890  need_noreturn_fixup.create (0);
891
892  calculate_dominance_info (CDI_DOMINATORS);
893  cfg_altered = false;
894
895  /* We need to know loop structures in order to avoid destroying them
896     in jump threading.  Note that we still can e.g. thread through loop
897     headers to an exit edge, or through loop header to the loop body, assuming
898     that we update the loop info.
899
900     TODO: We don't need to set LOOPS_HAVE_PREHEADERS generally, but due
901     to several overly conservative bail-outs in jump threading, case
902     gcc.dg/tree-ssa/pr21417.c can't be threaded if loop preheader is
903     missing.  We should improve jump threading in future then
904     LOOPS_HAVE_PREHEADERS won't be needed here.  */
905  loop_optimizer_init (LOOPS_HAVE_PREHEADERS | LOOPS_HAVE_SIMPLE_LATCHES);
906
907  /* Initialize the value-handle array.  */
908  threadedge_initialize_values ();
909
910  /* We need accurate information regarding back edges in the CFG
911     for jump threading; this may include back edges that are not part of
912     a single loop.  */
913  mark_dfs_back_edges ();
914
915  /* Recursively walk the dominator tree optimizing statements.  */
916  dom_opt_dom_walker (CDI_DOMINATORS).walk (fun->cfg->x_entry_block_ptr);
917
918  {
919    gimple_stmt_iterator gsi;
920    basic_block bb;
921    FOR_EACH_BB_FN (bb, fun)
922      {
923	for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
924	  update_stmt_if_modified (gsi_stmt (gsi));
925      }
926  }
927
928  /* If we exposed any new variables, go ahead and put them into
929     SSA form now, before we handle jump threading.  This simplifies
930     interactions between rewriting of _DECL nodes into SSA form
931     and rewriting SSA_NAME nodes into SSA form after block
932     duplication and CFG manipulation.  */
933  update_ssa (TODO_update_ssa);
934
935  free_all_edge_infos ();
936
937  /* Thread jumps, creating duplicate blocks as needed.  */
938  cfg_altered |= thread_through_all_blocks (first_pass_instance);
939
940  if (cfg_altered)
941    free_dominance_info (CDI_DOMINATORS);
942
943  /* Removal of statements may make some EH edges dead.  Purge
944     such edges from the CFG as needed.  */
945  if (!bitmap_empty_p (need_eh_cleanup))
946    {
947      unsigned i;
948      bitmap_iterator bi;
949
950      /* Jump threading may have created forwarder blocks from blocks
951	 needing EH cleanup; the new successor of these blocks, which
952	 has inherited from the original block, needs the cleanup.
953	 Don't clear bits in the bitmap, as that can break the bitmap
954	 iterator.  */
955      EXECUTE_IF_SET_IN_BITMAP (need_eh_cleanup, 0, i, bi)
956	{
957	  basic_block bb = BASIC_BLOCK_FOR_FN (fun, i);
958	  if (bb == NULL)
959	    continue;
960	  while (single_succ_p (bb)
961		 && (single_succ_edge (bb)->flags & EDGE_EH) == 0)
962	    bb = single_succ (bb);
963	  if (bb == EXIT_BLOCK_PTR_FOR_FN (fun))
964	    continue;
965	  if ((unsigned) bb->index != i)
966	    bitmap_set_bit (need_eh_cleanup, bb->index);
967	}
968
969      gimple_purge_all_dead_eh_edges (need_eh_cleanup);
970      bitmap_clear (need_eh_cleanup);
971    }
972
973  /* Fixup stmts that became noreturn calls.  This may require splitting
974     blocks and thus isn't possible during the dominator walk or before
975     jump threading finished.  Do this in reverse order so we don't
976     inadvertedly remove a stmt we want to fixup by visiting a dominating
977     now noreturn call first.  */
978  while (!need_noreturn_fixup.is_empty ())
979    {
980      gimple stmt = need_noreturn_fixup.pop ();
981      if (dump_file && dump_flags & TDF_DETAILS)
982	{
983	  fprintf (dump_file, "Fixing up noreturn call ");
984	  print_gimple_stmt (dump_file, stmt, 0, 0);
985	  fprintf (dump_file, "\n");
986	}
987      fixup_noreturn_call (stmt);
988    }
989
990  statistics_counter_event (fun, "Redundant expressions eliminated",
991			    opt_stats.num_re);
992  statistics_counter_event (fun, "Constants propagated",
993			    opt_stats.num_const_prop);
994  statistics_counter_event (fun, "Copies propagated",
995			    opt_stats.num_copy_prop);
996
997  /* Debugging dumps.  */
998  if (dump_file && (dump_flags & TDF_STATS))
999    dump_dominator_optimization_stats (dump_file);
1000
1001  loop_optimizer_finalize ();
1002
1003  /* Delete our main hashtable.  */
1004  delete avail_exprs;
1005  avail_exprs = NULL;
1006
1007  /* Free asserted bitmaps and stacks.  */
1008  BITMAP_FREE (need_eh_cleanup);
1009  need_noreturn_fixup.release ();
1010  avail_exprs_stack.release ();
1011  const_and_copies_stack.release ();
1012
1013  /* Free the value-handle array.  */
1014  threadedge_finalize_values ();
1015
1016  return 0;
1017}
1018
1019} // anon namespace
1020
1021gimple_opt_pass *
1022make_pass_dominator (gcc::context *ctxt)
1023{
1024  return new pass_dominator (ctxt);
1025}
1026
1027
1028/* Given a conditional statement CONDSTMT, convert the
1029   condition to a canonical form.  */
1030
1031static void
1032canonicalize_comparison (gcond *condstmt)
1033{
1034  tree op0;
1035  tree op1;
1036  enum tree_code code;
1037
1038  gcc_assert (gimple_code (condstmt) == GIMPLE_COND);
1039
1040  op0 = gimple_cond_lhs (condstmt);
1041  op1 = gimple_cond_rhs (condstmt);
1042
1043  code = gimple_cond_code (condstmt);
1044
1045  /* If it would be profitable to swap the operands, then do so to
1046     canonicalize the statement, enabling better optimization.
1047
1048     By placing canonicalization of such expressions here we
1049     transparently keep statements in canonical form, even
1050     when the statement is modified.  */
1051  if (tree_swap_operands_p (op0, op1, false))
1052    {
1053      /* For relationals we need to swap the operands
1054	 and change the code.  */
1055      if (code == LT_EXPR
1056	  || code == GT_EXPR
1057	  || code == LE_EXPR
1058	  || code == GE_EXPR)
1059	{
1060          code = swap_tree_comparison (code);
1061
1062          gimple_cond_set_code (condstmt, code);
1063          gimple_cond_set_lhs (condstmt, op1);
1064          gimple_cond_set_rhs (condstmt, op0);
1065
1066          update_stmt (condstmt);
1067	}
1068    }
1069}
1070
1071/* Initialize local stacks for this optimizer and record equivalences
1072   upon entry to BB.  Equivalences can come from the edge traversed to
1073   reach BB or they may come from PHI nodes at the start of BB.  */
1074
1075/* Remove all the expressions in LOCALS from TABLE, stopping when there are
1076   LIMIT entries left in LOCALs.  */
1077
1078static void
1079remove_local_expressions_from_table (void)
1080{
1081  /* Remove all the expressions made available in this block.  */
1082  while (avail_exprs_stack.length () > 0)
1083    {
1084      std::pair<expr_hash_elt_t, expr_hash_elt_t> victim
1085	= avail_exprs_stack.pop ();
1086      expr_hash_elt **slot;
1087
1088      if (victim.first == NULL)
1089	break;
1090
1091      /* This must precede the actual removal from the hash table,
1092         as ELEMENT and the table entry may share a call argument
1093         vector which will be freed during removal.  */
1094      if (dump_file && (dump_flags & TDF_DETAILS))
1095        {
1096          fprintf (dump_file, "<<<< ");
1097          print_expr_hash_elt (dump_file, victim.first);
1098        }
1099
1100      slot = avail_exprs->find_slot (victim.first, NO_INSERT);
1101      gcc_assert (slot && *slot == victim.first);
1102      if (victim.second != NULL)
1103	{
1104	  free_expr_hash_elt (*slot);
1105	  *slot = victim.second;
1106	}
1107      else
1108	avail_exprs->clear_slot (slot);
1109    }
1110}
1111
1112/* Use the source/dest pairs in CONST_AND_COPIES_STACK to restore
1113   CONST_AND_COPIES to its original state, stopping when we hit a
1114   NULL marker.  */
1115
1116static void
1117restore_vars_to_original_value (void)
1118{
1119  while (const_and_copies_stack.length () > 0)
1120    {
1121      tree prev_value, dest;
1122
1123      dest = const_and_copies_stack.pop ();
1124
1125      if (dest == NULL)
1126	break;
1127
1128      if (dump_file && (dump_flags & TDF_DETAILS))
1129	{
1130	  fprintf (dump_file, "<<<< COPY ");
1131	  print_generic_expr (dump_file, dest, 0);
1132	  fprintf (dump_file, " = ");
1133	  print_generic_expr (dump_file, SSA_NAME_VALUE (dest), 0);
1134	  fprintf (dump_file, "\n");
1135	}
1136
1137      prev_value = const_and_copies_stack.pop ();
1138      set_ssa_name_value (dest, prev_value);
1139    }
1140}
1141
1142/* A trivial wrapper so that we can present the generic jump
1143   threading code with a simple API for simplifying statements.  */
1144static tree
1145simplify_stmt_for_jump_threading (gimple stmt,
1146				  gimple within_stmt ATTRIBUTE_UNUSED)
1147{
1148  return lookup_avail_expr (stmt, false);
1149}
1150
1151/* Record into the equivalence tables any equivalences implied by
1152   traversing edge E (which are cached in E->aux).
1153
1154   Callers are responsible for managing the unwinding markers.  */
1155static void
1156record_temporary_equivalences (edge e)
1157{
1158  int i;
1159  struct edge_info *edge_info = (struct edge_info *) e->aux;
1160
1161  /* If we have info associated with this edge, record it into
1162     our equivalence tables.  */
1163  if (edge_info)
1164    {
1165      cond_equivalence *eq;
1166      tree lhs = edge_info->lhs;
1167      tree rhs = edge_info->rhs;
1168
1169      /* If we have a simple NAME = VALUE equivalence, record it.  */
1170      if (lhs && TREE_CODE (lhs) == SSA_NAME)
1171	record_const_or_copy (lhs, rhs);
1172
1173      /* If we have 0 = COND or 1 = COND equivalences, record them
1174	 into our expression hash tables.  */
1175      for (i = 0; edge_info->cond_equivalences.iterate (i, &eq); ++i)
1176	record_cond (eq);
1177    }
1178}
1179
1180/* Wrapper for common code to attempt to thread an edge.  For example,
1181   it handles lazily building the dummy condition and the bookkeeping
1182   when jump threading is successful.  */
1183
1184void
1185dom_opt_dom_walker::thread_across_edge (edge e)
1186{
1187  if (! m_dummy_cond)
1188    m_dummy_cond =
1189        gimple_build_cond (NE_EXPR,
1190                           integer_zero_node, integer_zero_node,
1191                           NULL, NULL);
1192
1193  /* Push a marker on both stacks so we can unwind the tables back to their
1194     current state.  */
1195  avail_exprs_stack.safe_push
1196    (std::pair<expr_hash_elt_t, expr_hash_elt_t> (NULL, NULL));
1197  const_and_copies_stack.safe_push (NULL_TREE);
1198
1199  /* Traversing E may result in equivalences we can utilize.  */
1200  record_temporary_equivalences (e);
1201
1202  /* With all the edge equivalences in the tables, go ahead and attempt
1203     to thread through E->dest.  */
1204  ::thread_across_edge (m_dummy_cond, e, false,
1205		        &const_and_copies_stack,
1206		        simplify_stmt_for_jump_threading);
1207
1208  /* And restore the various tables to their state before
1209     we threaded this edge.
1210
1211     XXX The code in tree-ssa-threadedge.c will restore the state of
1212     the const_and_copies table.  We we just have to restore the expression
1213     table.  */
1214  remove_local_expressions_from_table ();
1215}
1216
1217/* PHI nodes can create equivalences too.
1218
1219   Ignoring any alternatives which are the same as the result, if
1220   all the alternatives are equal, then the PHI node creates an
1221   equivalence.  */
1222
1223static void
1224record_equivalences_from_phis (basic_block bb)
1225{
1226  gphi_iterator gsi;
1227
1228  for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1229    {
1230      gphi *phi = gsi.phi ();
1231
1232      tree lhs = gimple_phi_result (phi);
1233      tree rhs = NULL;
1234      size_t i;
1235
1236      for (i = 0; i < gimple_phi_num_args (phi); i++)
1237	{
1238	  tree t = gimple_phi_arg_def (phi, i);
1239
1240	  /* Ignore alternatives which are the same as our LHS.  Since
1241	     LHS is a PHI_RESULT, it is known to be a SSA_NAME, so we
1242	     can simply compare pointers.  */
1243	  if (lhs == t)
1244	    continue;
1245
1246	  /* If we have not processed an alternative yet, then set
1247	     RHS to this alternative.  */
1248	  if (rhs == NULL)
1249	    rhs = t;
1250	  /* If we have processed an alternative (stored in RHS), then
1251	     see if it is equal to this one.  If it isn't, then stop
1252	     the search.  */
1253	  else if (! operand_equal_for_phi_arg_p (rhs, t))
1254	    break;
1255	}
1256
1257      /* If we had no interesting alternatives, then all the RHS alternatives
1258	 must have been the same as LHS.  */
1259      if (!rhs)
1260	rhs = lhs;
1261
1262      /* If we managed to iterate through each PHI alternative without
1263	 breaking out of the loop, then we have a PHI which may create
1264	 a useful equivalence.  We do not need to record unwind data for
1265	 this, since this is a true assignment and not an equivalence
1266	 inferred from a comparison.  All uses of this ssa name are dominated
1267	 by this assignment, so unwinding just costs time and space.  */
1268      if (i == gimple_phi_num_args (phi)
1269	  && may_propagate_copy (lhs, rhs))
1270	set_ssa_name_value (lhs, rhs);
1271    }
1272}
1273
1274/* Ignoring loop backedges, if BB has precisely one incoming edge then
1275   return that edge.  Otherwise return NULL.  */
1276static edge
1277single_incoming_edge_ignoring_loop_edges (basic_block bb)
1278{
1279  edge retval = NULL;
1280  edge e;
1281  edge_iterator ei;
1282
1283  FOR_EACH_EDGE (e, ei, bb->preds)
1284    {
1285      /* A loop back edge can be identified by the destination of
1286	 the edge dominating the source of the edge.  */
1287      if (dominated_by_p (CDI_DOMINATORS, e->src, e->dest))
1288	continue;
1289
1290      /* If we have already seen a non-loop edge, then we must have
1291	 multiple incoming non-loop edges and thus we return NULL.  */
1292      if (retval)
1293	return NULL;
1294
1295      /* This is the first non-loop incoming edge we have found.  Record
1296	 it.  */
1297      retval = e;
1298    }
1299
1300  return retval;
1301}
1302
1303/* Record any equivalences created by the incoming edge to BB.  If BB
1304   has more than one incoming edge, then no equivalence is created.  */
1305
1306static void
1307record_equivalences_from_incoming_edge (basic_block bb)
1308{
1309  edge e;
1310  basic_block parent;
1311  struct edge_info *edge_info;
1312
1313  /* If our parent block ended with a control statement, then we may be
1314     able to record some equivalences based on which outgoing edge from
1315     the parent was followed.  */
1316  parent = get_immediate_dominator (CDI_DOMINATORS, bb);
1317
1318  e = single_incoming_edge_ignoring_loop_edges (bb);
1319
1320  /* If we had a single incoming edge from our parent block, then enter
1321     any data associated with the edge into our tables.  */
1322  if (e && e->src == parent)
1323    {
1324      unsigned int i;
1325
1326      edge_info = (struct edge_info *) e->aux;
1327
1328      if (edge_info)
1329	{
1330	  tree lhs = edge_info->lhs;
1331	  tree rhs = edge_info->rhs;
1332	  cond_equivalence *eq;
1333
1334	  if (lhs)
1335	    record_equality (lhs, rhs);
1336
1337	  /* If LHS is an SSA_NAME and RHS is a constant integer and LHS was
1338	     set via a widening type conversion, then we may be able to record
1339	     additional equivalences.  */
1340	  if (lhs
1341	      && TREE_CODE (lhs) == SSA_NAME
1342	      && is_gimple_constant (rhs)
1343	      && TREE_CODE (rhs) == INTEGER_CST)
1344	    {
1345	      gimple defstmt = SSA_NAME_DEF_STMT (lhs);
1346
1347	      if (defstmt
1348		  && is_gimple_assign (defstmt)
1349		  && CONVERT_EXPR_CODE_P (gimple_assign_rhs_code (defstmt)))
1350		{
1351		  tree old_rhs = gimple_assign_rhs1 (defstmt);
1352
1353		  /* If the conversion widens the original value and
1354		     the constant is in the range of the type of OLD_RHS,
1355		     then convert the constant and record the equivalence.
1356
1357		     Note that int_fits_type_p does not check the precision
1358		     if the upper and lower bounds are OK.  */
1359		  if (INTEGRAL_TYPE_P (TREE_TYPE (old_rhs))
1360		      && (TYPE_PRECISION (TREE_TYPE (lhs))
1361			  > TYPE_PRECISION (TREE_TYPE (old_rhs)))
1362		      && int_fits_type_p (rhs, TREE_TYPE (old_rhs)))
1363		    {
1364		      tree newval = fold_convert (TREE_TYPE (old_rhs), rhs);
1365		      record_equality (old_rhs, newval);
1366		    }
1367		}
1368	    }
1369
1370	  for (i = 0; edge_info->cond_equivalences.iterate (i, &eq); ++i)
1371	    record_cond (eq);
1372	}
1373    }
1374}
1375
1376/* Dump SSA statistics on FILE.  */
1377
1378void
1379dump_dominator_optimization_stats (FILE *file)
1380{
1381  fprintf (file, "Total number of statements:                   %6ld\n\n",
1382	   opt_stats.num_stmts);
1383  fprintf (file, "Exprs considered for dominator optimizations: %6ld\n",
1384           opt_stats.num_exprs_considered);
1385
1386  fprintf (file, "\nHash table statistics:\n");
1387
1388  fprintf (file, "    avail_exprs: ");
1389  htab_statistics (file, *avail_exprs);
1390}
1391
1392
1393/* Dump SSA statistics on stderr.  */
1394
1395DEBUG_FUNCTION void
1396debug_dominator_optimization_stats (void)
1397{
1398  dump_dominator_optimization_stats (stderr);
1399}
1400
1401
1402/* Dump statistics for the hash table HTAB.  */
1403
1404static void
1405htab_statistics (FILE *file, const hash_table<expr_elt_hasher> &htab)
1406{
1407  fprintf (file, "size %ld, %ld elements, %f collision/search ratio\n",
1408	   (long) htab.size (),
1409	   (long) htab.elements (),
1410	   htab.collisions ());
1411}
1412
1413
1414/* Enter condition equivalence into the expression hash table.
1415   This indicates that a conditional expression has a known
1416   boolean value.  */
1417
1418static void
1419record_cond (cond_equivalence *p)
1420{
1421  struct expr_hash_elt *element = XCNEW (struct expr_hash_elt);
1422  expr_hash_elt **slot;
1423
1424  initialize_hash_element_from_expr (&p->cond, p->value, element);
1425
1426  slot = avail_exprs->find_slot_with_hash (element, element->hash, INSERT);
1427  if (*slot == NULL)
1428    {
1429      *slot = element;
1430
1431      if (dump_file && (dump_flags & TDF_DETAILS))
1432        {
1433          fprintf (dump_file, "1>>> ");
1434          print_expr_hash_elt (dump_file, element);
1435        }
1436
1437      avail_exprs_stack.safe_push
1438	(std::pair<expr_hash_elt_t, expr_hash_elt_t> (element, NULL));
1439    }
1440  else
1441    free_expr_hash_elt (element);
1442}
1443
1444/* Build a cond_equivalence record indicating that the comparison
1445   CODE holds between operands OP0 and OP1 and push it to **P.  */
1446
1447static void
1448build_and_record_new_cond (enum tree_code code,
1449                           tree op0, tree op1,
1450                           vec<cond_equivalence> *p)
1451{
1452  cond_equivalence c;
1453  struct hashable_expr *cond = &c.cond;
1454
1455  gcc_assert (TREE_CODE_CLASS (code) == tcc_comparison);
1456
1457  cond->type = boolean_type_node;
1458  cond->kind = EXPR_BINARY;
1459  cond->ops.binary.op = code;
1460  cond->ops.binary.opnd0 = op0;
1461  cond->ops.binary.opnd1 = op1;
1462
1463  c.value = boolean_true_node;
1464  p->safe_push (c);
1465}
1466
1467/* Record that COND is true and INVERTED is false into the edge information
1468   structure.  Also record that any conditions dominated by COND are true
1469   as well.
1470
1471   For example, if a < b is true, then a <= b must also be true.  */
1472
1473static void
1474record_conditions (struct edge_info *edge_info, tree cond, tree inverted)
1475{
1476  tree op0, op1;
1477  cond_equivalence c;
1478
1479  if (!COMPARISON_CLASS_P (cond))
1480    return;
1481
1482  op0 = TREE_OPERAND (cond, 0);
1483  op1 = TREE_OPERAND (cond, 1);
1484
1485  switch (TREE_CODE (cond))
1486    {
1487    case LT_EXPR:
1488    case GT_EXPR:
1489      if (FLOAT_TYPE_P (TREE_TYPE (op0)))
1490	{
1491	  build_and_record_new_cond (ORDERED_EXPR, op0, op1,
1492				     &edge_info->cond_equivalences);
1493	  build_and_record_new_cond (LTGT_EXPR, op0, op1,
1494				     &edge_info->cond_equivalences);
1495	}
1496
1497      build_and_record_new_cond ((TREE_CODE (cond) == LT_EXPR
1498				  ? LE_EXPR : GE_EXPR),
1499				 op0, op1, &edge_info->cond_equivalences);
1500      build_and_record_new_cond (NE_EXPR, op0, op1,
1501				 &edge_info->cond_equivalences);
1502      break;
1503
1504    case GE_EXPR:
1505    case LE_EXPR:
1506      if (FLOAT_TYPE_P (TREE_TYPE (op0)))
1507	{
1508	  build_and_record_new_cond (ORDERED_EXPR, op0, op1,
1509				     &edge_info->cond_equivalences);
1510	}
1511      break;
1512
1513    case EQ_EXPR:
1514      if (FLOAT_TYPE_P (TREE_TYPE (op0)))
1515	{
1516	  build_and_record_new_cond (ORDERED_EXPR, op0, op1,
1517				     &edge_info->cond_equivalences);
1518	}
1519      build_and_record_new_cond (LE_EXPR, op0, op1,
1520				 &edge_info->cond_equivalences);
1521      build_and_record_new_cond (GE_EXPR, op0, op1,
1522				 &edge_info->cond_equivalences);
1523      break;
1524
1525    case UNORDERED_EXPR:
1526      build_and_record_new_cond (NE_EXPR, op0, op1,
1527				 &edge_info->cond_equivalences);
1528      build_and_record_new_cond (UNLE_EXPR, op0, op1,
1529				 &edge_info->cond_equivalences);
1530      build_and_record_new_cond (UNGE_EXPR, op0, op1,
1531				 &edge_info->cond_equivalences);
1532      build_and_record_new_cond (UNEQ_EXPR, op0, op1,
1533				 &edge_info->cond_equivalences);
1534      build_and_record_new_cond (UNLT_EXPR, op0, op1,
1535				 &edge_info->cond_equivalences);
1536      build_and_record_new_cond (UNGT_EXPR, op0, op1,
1537				 &edge_info->cond_equivalences);
1538      break;
1539
1540    case UNLT_EXPR:
1541    case UNGT_EXPR:
1542      build_and_record_new_cond ((TREE_CODE (cond) == UNLT_EXPR
1543				  ? UNLE_EXPR : UNGE_EXPR),
1544				 op0, op1, &edge_info->cond_equivalences);
1545      build_and_record_new_cond (NE_EXPR, op0, op1,
1546				 &edge_info->cond_equivalences);
1547      break;
1548
1549    case UNEQ_EXPR:
1550      build_and_record_new_cond (UNLE_EXPR, op0, op1,
1551				 &edge_info->cond_equivalences);
1552      build_and_record_new_cond (UNGE_EXPR, op0, op1,
1553				 &edge_info->cond_equivalences);
1554      break;
1555
1556    case LTGT_EXPR:
1557      build_and_record_new_cond (NE_EXPR, op0, op1,
1558				 &edge_info->cond_equivalences);
1559      build_and_record_new_cond (ORDERED_EXPR, op0, op1,
1560				 &edge_info->cond_equivalences);
1561      break;
1562
1563    default:
1564      break;
1565    }
1566
1567  /* Now store the original true and false conditions into the first
1568     two slots.  */
1569  initialize_expr_from_cond (cond, &c.cond);
1570  c.value = boolean_true_node;
1571  edge_info->cond_equivalences.safe_push (c);
1572
1573  /* It is possible for INVERTED to be the negation of a comparison,
1574     and not a valid RHS or GIMPLE_COND condition.  This happens because
1575     invert_truthvalue may return such an expression when asked to invert
1576     a floating-point comparison.  These comparisons are not assumed to
1577     obey the trichotomy law.  */
1578  initialize_expr_from_cond (inverted, &c.cond);
1579  c.value = boolean_false_node;
1580  edge_info->cond_equivalences.safe_push (c);
1581}
1582
1583/* A helper function for record_const_or_copy and record_equality.
1584   Do the work of recording the value and undo info.  */
1585
1586static void
1587record_const_or_copy_1 (tree x, tree y, tree prev_x)
1588{
1589  set_ssa_name_value (x, y);
1590
1591  if (dump_file && (dump_flags & TDF_DETAILS))
1592    {
1593      fprintf (dump_file, "0>>> COPY ");
1594      print_generic_expr (dump_file, x, 0);
1595      fprintf (dump_file, " = ");
1596      print_generic_expr (dump_file, y, 0);
1597      fprintf (dump_file, "\n");
1598    }
1599
1600  const_and_copies_stack.reserve (2);
1601  const_and_copies_stack.quick_push (prev_x);
1602  const_and_copies_stack.quick_push (x);
1603}
1604
1605/* Record that X is equal to Y in const_and_copies.  Record undo
1606   information in the block-local vector.  */
1607
1608static void
1609record_const_or_copy (tree x, tree y)
1610{
1611  tree prev_x = SSA_NAME_VALUE (x);
1612
1613  gcc_assert (TREE_CODE (x) == SSA_NAME);
1614
1615  if (TREE_CODE (y) == SSA_NAME)
1616    {
1617      tree tmp = SSA_NAME_VALUE (y);
1618      if (tmp)
1619	y = tmp;
1620    }
1621
1622  record_const_or_copy_1 (x, y, prev_x);
1623}
1624
1625/* Return the loop depth of the basic block of the defining statement of X.
1626   This number should not be treated as absolutely correct because the loop
1627   information may not be completely up-to-date when dom runs.  However, it
1628   will be relatively correct, and as more passes are taught to keep loop info
1629   up to date, the result will become more and more accurate.  */
1630
1631static int
1632loop_depth_of_name (tree x)
1633{
1634  gimple defstmt;
1635  basic_block defbb;
1636
1637  /* If it's not an SSA_NAME, we have no clue where the definition is.  */
1638  if (TREE_CODE (x) != SSA_NAME)
1639    return 0;
1640
1641  /* Otherwise return the loop depth of the defining statement's bb.
1642     Note that there may not actually be a bb for this statement, if the
1643     ssa_name is live on entry.  */
1644  defstmt = SSA_NAME_DEF_STMT (x);
1645  defbb = gimple_bb (defstmt);
1646  if (!defbb)
1647    return 0;
1648
1649  return bb_loop_depth (defbb);
1650}
1651
1652/* Similarly, but assume that X and Y are the two operands of an EQ_EXPR.
1653   This constrains the cases in which we may treat this as assignment.  */
1654
1655static void
1656record_equality (tree x, tree y)
1657{
1658  tree prev_x = NULL, prev_y = NULL;
1659
1660  if (TREE_CODE (x) == SSA_NAME)
1661    prev_x = SSA_NAME_VALUE (x);
1662  if (TREE_CODE (y) == SSA_NAME)
1663    prev_y = SSA_NAME_VALUE (y);
1664
1665  /* If one of the previous values is invariant, or invariant in more loops
1666     (by depth), then use that.
1667     Otherwise it doesn't matter which value we choose, just so
1668     long as we canonicalize on one value.  */
1669  if (is_gimple_min_invariant (y))
1670    ;
1671  else if (is_gimple_min_invariant (x)
1672	   /* ???  When threading over backedges the following is important
1673	      for correctness.  See PR61757.  */
1674	   || (loop_depth_of_name (x) <= loop_depth_of_name (y)))
1675    prev_x = x, x = y, y = prev_x, prev_x = prev_y;
1676  else if (prev_x && is_gimple_min_invariant (prev_x))
1677    x = y, y = prev_x, prev_x = prev_y;
1678  else if (prev_y)
1679    y = prev_y;
1680
1681  /* After the swapping, we must have one SSA_NAME.  */
1682  if (TREE_CODE (x) != SSA_NAME)
1683    return;
1684
1685  /* For IEEE, -0.0 == 0.0, so we don't necessarily know the sign of a
1686     variable compared against zero.  If we're honoring signed zeros,
1687     then we cannot record this value unless we know that the value is
1688     nonzero.  */
1689  if (HONOR_SIGNED_ZEROS (x)
1690      && (TREE_CODE (y) != REAL_CST
1691	  || REAL_VALUES_EQUAL (dconst0, TREE_REAL_CST (y))))
1692    return;
1693
1694  record_const_or_copy_1 (x, y, prev_x);
1695}
1696
1697/* Returns true when STMT is a simple iv increment.  It detects the
1698   following situation:
1699
1700   i_1 = phi (..., i_2)
1701   i_2 = i_1 +/- ...  */
1702
1703bool
1704simple_iv_increment_p (gimple stmt)
1705{
1706  enum tree_code code;
1707  tree lhs, preinc;
1708  gimple phi;
1709  size_t i;
1710
1711  if (gimple_code (stmt) != GIMPLE_ASSIGN)
1712    return false;
1713
1714  lhs = gimple_assign_lhs (stmt);
1715  if (TREE_CODE (lhs) != SSA_NAME)
1716    return false;
1717
1718  code = gimple_assign_rhs_code (stmt);
1719  if (code != PLUS_EXPR
1720      && code != MINUS_EXPR
1721      && code != POINTER_PLUS_EXPR)
1722    return false;
1723
1724  preinc = gimple_assign_rhs1 (stmt);
1725  if (TREE_CODE (preinc) != SSA_NAME)
1726    return false;
1727
1728  phi = SSA_NAME_DEF_STMT (preinc);
1729  if (gimple_code (phi) != GIMPLE_PHI)
1730    return false;
1731
1732  for (i = 0; i < gimple_phi_num_args (phi); i++)
1733    if (gimple_phi_arg_def (phi, i) == lhs)
1734      return true;
1735
1736  return false;
1737}
1738
1739/* CONST_AND_COPIES is a table which maps an SSA_NAME to the current
1740   known value for that SSA_NAME (or NULL if no value is known).
1741
1742   Propagate values from CONST_AND_COPIES into the PHI nodes of the
1743   successors of BB.  */
1744
1745static void
1746cprop_into_successor_phis (basic_block bb)
1747{
1748  edge e;
1749  edge_iterator ei;
1750
1751  FOR_EACH_EDGE (e, ei, bb->succs)
1752    {
1753      int indx;
1754      gphi_iterator gsi;
1755
1756      /* If this is an abnormal edge, then we do not want to copy propagate
1757	 into the PHI alternative associated with this edge.  */
1758      if (e->flags & EDGE_ABNORMAL)
1759	continue;
1760
1761      gsi = gsi_start_phis (e->dest);
1762      if (gsi_end_p (gsi))
1763	continue;
1764
1765      /* We may have an equivalence associated with this edge.  While
1766	 we can not propagate it into non-dominated blocks, we can
1767	 propagate them into PHIs in non-dominated blocks.  */
1768
1769      /* Push the unwind marker so we can reset the const and copies
1770	 table back to its original state after processing this edge.  */
1771      const_and_copies_stack.safe_push (NULL_TREE);
1772
1773      /* Extract and record any simple NAME = VALUE equivalences.
1774
1775	 Don't bother with [01] = COND equivalences, they're not useful
1776	 here.  */
1777      struct edge_info *edge_info = (struct edge_info *) e->aux;
1778      if (edge_info)
1779	{
1780	  tree lhs = edge_info->lhs;
1781	  tree rhs = edge_info->rhs;
1782
1783	  if (lhs && TREE_CODE (lhs) == SSA_NAME)
1784	    record_const_or_copy (lhs, rhs);
1785	}
1786
1787      indx = e->dest_idx;
1788      for ( ; !gsi_end_p (gsi); gsi_next (&gsi))
1789	{
1790	  tree new_val;
1791	  use_operand_p orig_p;
1792	  tree orig_val;
1793          gphi *phi = gsi.phi ();
1794
1795	  /* The alternative may be associated with a constant, so verify
1796	     it is an SSA_NAME before doing anything with it.  */
1797	  orig_p = gimple_phi_arg_imm_use_ptr (phi, indx);
1798	  orig_val = get_use_from_ptr (orig_p);
1799	  if (TREE_CODE (orig_val) != SSA_NAME)
1800	    continue;
1801
1802	  /* If we have *ORIG_P in our constant/copy table, then replace
1803	     ORIG_P with its value in our constant/copy table.  */
1804	  new_val = SSA_NAME_VALUE (orig_val);
1805	  if (new_val
1806	      && new_val != orig_val
1807	      && (TREE_CODE (new_val) == SSA_NAME
1808		  || is_gimple_min_invariant (new_val))
1809	      && may_propagate_copy (orig_val, new_val))
1810	    propagate_value (orig_p, new_val);
1811	}
1812
1813      restore_vars_to_original_value ();
1814    }
1815}
1816
1817/* We have finished optimizing BB, record any information implied by
1818   taking a specific outgoing edge from BB.  */
1819
1820static void
1821record_edge_info (basic_block bb)
1822{
1823  gimple_stmt_iterator gsi = gsi_last_bb (bb);
1824  struct edge_info *edge_info;
1825
1826  if (! gsi_end_p (gsi))
1827    {
1828      gimple stmt = gsi_stmt (gsi);
1829      location_t loc = gimple_location (stmt);
1830
1831      if (gimple_code (stmt) == GIMPLE_SWITCH)
1832	{
1833	  gswitch *switch_stmt = as_a <gswitch *> (stmt);
1834	  tree index = gimple_switch_index (switch_stmt);
1835
1836	  if (TREE_CODE (index) == SSA_NAME)
1837	    {
1838	      int i;
1839              int n_labels = gimple_switch_num_labels (switch_stmt);
1840	      tree *info = XCNEWVEC (tree, last_basic_block_for_fn (cfun));
1841	      edge e;
1842	      edge_iterator ei;
1843
1844	      for (i = 0; i < n_labels; i++)
1845		{
1846		  tree label = gimple_switch_label (switch_stmt, i);
1847		  basic_block target_bb = label_to_block (CASE_LABEL (label));
1848		  if (CASE_HIGH (label)
1849		      || !CASE_LOW (label)
1850		      || info[target_bb->index])
1851		    info[target_bb->index] = error_mark_node;
1852		  else
1853		    info[target_bb->index] = label;
1854		}
1855
1856	      FOR_EACH_EDGE (e, ei, bb->succs)
1857		{
1858		  basic_block target_bb = e->dest;
1859		  tree label = info[target_bb->index];
1860
1861		  if (label != NULL && label != error_mark_node)
1862		    {
1863		      tree x = fold_convert_loc (loc, TREE_TYPE (index),
1864						 CASE_LOW (label));
1865		      edge_info = allocate_edge_info (e);
1866		      edge_info->lhs = index;
1867		      edge_info->rhs = x;
1868		    }
1869		}
1870	      free (info);
1871	    }
1872	}
1873
1874      /* A COND_EXPR may create equivalences too.  */
1875      if (gimple_code (stmt) == GIMPLE_COND)
1876	{
1877	  edge true_edge;
1878	  edge false_edge;
1879
1880          tree op0 = gimple_cond_lhs (stmt);
1881          tree op1 = gimple_cond_rhs (stmt);
1882          enum tree_code code = gimple_cond_code (stmt);
1883
1884	  extract_true_false_edges_from_block (bb, &true_edge, &false_edge);
1885
1886          /* Special case comparing booleans against a constant as we
1887             know the value of OP0 on both arms of the branch.  i.e., we
1888             can record an equivalence for OP0 rather than COND.  */
1889          if ((code == EQ_EXPR || code == NE_EXPR)
1890              && TREE_CODE (op0) == SSA_NAME
1891              && TREE_CODE (TREE_TYPE (op0)) == BOOLEAN_TYPE
1892              && is_gimple_min_invariant (op1))
1893            {
1894              if (code == EQ_EXPR)
1895                {
1896                  edge_info = allocate_edge_info (true_edge);
1897                  edge_info->lhs = op0;
1898                  edge_info->rhs = (integer_zerop (op1)
1899                                    ? boolean_false_node
1900                                    : boolean_true_node);
1901
1902                  edge_info = allocate_edge_info (false_edge);
1903                  edge_info->lhs = op0;
1904                  edge_info->rhs = (integer_zerop (op1)
1905                                    ? boolean_true_node
1906                                    : boolean_false_node);
1907                }
1908              else
1909                {
1910                  edge_info = allocate_edge_info (true_edge);
1911                  edge_info->lhs = op0;
1912                  edge_info->rhs = (integer_zerop (op1)
1913                                    ? boolean_true_node
1914                                    : boolean_false_node);
1915
1916                  edge_info = allocate_edge_info (false_edge);
1917                  edge_info->lhs = op0;
1918                  edge_info->rhs = (integer_zerop (op1)
1919                                    ? boolean_false_node
1920                                    : boolean_true_node);
1921                }
1922            }
1923          else if (is_gimple_min_invariant (op0)
1924                   && (TREE_CODE (op1) == SSA_NAME
1925                       || is_gimple_min_invariant (op1)))
1926            {
1927              tree cond = build2 (code, boolean_type_node, op0, op1);
1928              tree inverted = invert_truthvalue_loc (loc, cond);
1929              bool can_infer_simple_equiv
1930                = !(HONOR_SIGNED_ZEROS (op0)
1931                    && real_zerop (op0));
1932              struct edge_info *edge_info;
1933
1934              edge_info = allocate_edge_info (true_edge);
1935              record_conditions (edge_info, cond, inverted);
1936
1937              if (can_infer_simple_equiv && code == EQ_EXPR)
1938                {
1939                  edge_info->lhs = op1;
1940                  edge_info->rhs = op0;
1941                }
1942
1943              edge_info = allocate_edge_info (false_edge);
1944              record_conditions (edge_info, inverted, cond);
1945
1946              if (can_infer_simple_equiv && TREE_CODE (inverted) == EQ_EXPR)
1947                {
1948                  edge_info->lhs = op1;
1949                  edge_info->rhs = op0;
1950                }
1951            }
1952
1953          else if (TREE_CODE (op0) == SSA_NAME
1954                   && (TREE_CODE (op1) == SSA_NAME
1955                       || is_gimple_min_invariant (op1)))
1956            {
1957              tree cond = build2 (code, boolean_type_node, op0, op1);
1958              tree inverted = invert_truthvalue_loc (loc, cond);
1959              bool can_infer_simple_equiv
1960                = !(HONOR_SIGNED_ZEROS (op1)
1961                    && (TREE_CODE (op1) == SSA_NAME || real_zerop (op1)));
1962              struct edge_info *edge_info;
1963
1964              edge_info = allocate_edge_info (true_edge);
1965              record_conditions (edge_info, cond, inverted);
1966
1967              if (can_infer_simple_equiv && code == EQ_EXPR)
1968                {
1969                  edge_info->lhs = op0;
1970                  edge_info->rhs = op1;
1971                }
1972
1973              edge_info = allocate_edge_info (false_edge);
1974              record_conditions (edge_info, inverted, cond);
1975
1976              if (can_infer_simple_equiv && TREE_CODE (inverted) == EQ_EXPR)
1977                {
1978                  edge_info->lhs = op0;
1979                  edge_info->rhs = op1;
1980                }
1981            }
1982        }
1983
1984      /* ??? TRUTH_NOT_EXPR can create an equivalence too.  */
1985    }
1986}
1987
1988void
1989dom_opt_dom_walker::before_dom_children (basic_block bb)
1990{
1991  gimple_stmt_iterator gsi;
1992
1993  if (dump_file && (dump_flags & TDF_DETAILS))
1994    fprintf (dump_file, "\n\nOptimizing block #%d\n\n", bb->index);
1995
1996  /* Push a marker on the stacks of local information so that we know how
1997     far to unwind when we finalize this block.  */
1998  avail_exprs_stack.safe_push
1999    (std::pair<expr_hash_elt_t, expr_hash_elt_t> (NULL, NULL));
2000  const_and_copies_stack.safe_push (NULL_TREE);
2001
2002  record_equivalences_from_incoming_edge (bb);
2003
2004  /* PHI nodes can create equivalences too.  */
2005  record_equivalences_from_phis (bb);
2006
2007  /* Create equivalences from redundant PHIs.  PHIs are only truly
2008     redundant when they exist in the same block, so push another
2009     marker and unwind right afterwards.  */
2010  avail_exprs_stack.safe_push
2011    (std::pair<expr_hash_elt_t, expr_hash_elt_t> (NULL, NULL));
2012  for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
2013    eliminate_redundant_computations (&gsi);
2014  remove_local_expressions_from_table ();
2015
2016  for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
2017    optimize_stmt (bb, gsi);
2018
2019  /* Now prepare to process dominated blocks.  */
2020  record_edge_info (bb);
2021  cprop_into_successor_phis (bb);
2022}
2023
2024/* We have finished processing the dominator children of BB, perform
2025   any finalization actions in preparation for leaving this node in
2026   the dominator tree.  */
2027
2028void
2029dom_opt_dom_walker::after_dom_children (basic_block bb)
2030{
2031  gimple last;
2032
2033  /* If we have an outgoing edge to a block with multiple incoming and
2034     outgoing edges, then we may be able to thread the edge, i.e., we
2035     may be able to statically determine which of the outgoing edges
2036     will be traversed when the incoming edge from BB is traversed.  */
2037  if (single_succ_p (bb)
2038      && (single_succ_edge (bb)->flags & EDGE_ABNORMAL) == 0
2039      && potentially_threadable_block (single_succ (bb)))
2040    {
2041      thread_across_edge (single_succ_edge (bb));
2042    }
2043  else if ((last = last_stmt (bb))
2044	   && gimple_code (last) == GIMPLE_COND
2045	   && EDGE_COUNT (bb->succs) == 2
2046	   && (EDGE_SUCC (bb, 0)->flags & EDGE_ABNORMAL) == 0
2047	   && (EDGE_SUCC (bb, 1)->flags & EDGE_ABNORMAL) == 0)
2048    {
2049      edge true_edge, false_edge;
2050
2051      extract_true_false_edges_from_block (bb, &true_edge, &false_edge);
2052
2053      /* Only try to thread the edge if it reaches a target block with
2054	 more than one predecessor and more than one successor.  */
2055      if (potentially_threadable_block (true_edge->dest))
2056	thread_across_edge (true_edge);
2057
2058      /* Similarly for the ELSE arm.  */
2059      if (potentially_threadable_block (false_edge->dest))
2060	thread_across_edge (false_edge);
2061
2062    }
2063
2064  /* These remove expressions local to BB from the tables.  */
2065  remove_local_expressions_from_table ();
2066  restore_vars_to_original_value ();
2067}
2068
2069/* Search for redundant computations in STMT.  If any are found, then
2070   replace them with the variable holding the result of the computation.
2071
2072   If safe, record this expression into the available expression hash
2073   table.  */
2074
2075static void
2076eliminate_redundant_computations (gimple_stmt_iterator* gsi)
2077{
2078  tree expr_type;
2079  tree cached_lhs;
2080  tree def;
2081  bool insert = true;
2082  bool assigns_var_p = false;
2083
2084  gimple stmt = gsi_stmt (*gsi);
2085
2086  if (gimple_code (stmt) == GIMPLE_PHI)
2087    def = gimple_phi_result (stmt);
2088  else
2089    def = gimple_get_lhs (stmt);
2090
2091  /* Certain expressions on the RHS can be optimized away, but can not
2092     themselves be entered into the hash tables.  */
2093  if (! def
2094      || TREE_CODE (def) != SSA_NAME
2095      || SSA_NAME_OCCURS_IN_ABNORMAL_PHI (def)
2096      || gimple_vdef (stmt)
2097      /* Do not record equivalences for increments of ivs.  This would create
2098	 overlapping live ranges for a very questionable gain.  */
2099      || simple_iv_increment_p (stmt))
2100    insert = false;
2101
2102  /* Check if the expression has been computed before.  */
2103  cached_lhs = lookup_avail_expr (stmt, insert);
2104
2105  opt_stats.num_exprs_considered++;
2106
2107  /* Get the type of the expression we are trying to optimize.  */
2108  if (is_gimple_assign (stmt))
2109    {
2110      expr_type = TREE_TYPE (gimple_assign_lhs (stmt));
2111      assigns_var_p = true;
2112    }
2113  else if (gimple_code (stmt) == GIMPLE_COND)
2114    expr_type = boolean_type_node;
2115  else if (is_gimple_call (stmt))
2116    {
2117      gcc_assert (gimple_call_lhs (stmt));
2118      expr_type = TREE_TYPE (gimple_call_lhs (stmt));
2119      assigns_var_p = true;
2120    }
2121  else if (gswitch *swtch_stmt = dyn_cast <gswitch *> (stmt))
2122    expr_type = TREE_TYPE (gimple_switch_index (swtch_stmt));
2123  else if (gimple_code (stmt) == GIMPLE_PHI)
2124    /* We can't propagate into a phi, so the logic below doesn't apply.
2125       Instead record an equivalence between the cached LHS and the
2126       PHI result of this statement, provided they are in the same block.
2127       This should be sufficient to kill the redundant phi.  */
2128    {
2129      if (def && cached_lhs)
2130	record_const_or_copy (def, cached_lhs);
2131      return;
2132    }
2133  else
2134    gcc_unreachable ();
2135
2136  if (!cached_lhs)
2137    return;
2138
2139  /* It is safe to ignore types here since we have already done
2140     type checking in the hashing and equality routines.  In fact
2141     type checking here merely gets in the way of constant
2142     propagation.  Also, make sure that it is safe to propagate
2143     CACHED_LHS into the expression in STMT.  */
2144  if ((TREE_CODE (cached_lhs) != SSA_NAME
2145       && (assigns_var_p
2146           || useless_type_conversion_p (expr_type, TREE_TYPE (cached_lhs))))
2147      || may_propagate_copy_into_stmt (stmt, cached_lhs))
2148  {
2149      gcc_checking_assert (TREE_CODE (cached_lhs) == SSA_NAME
2150			   || is_gimple_min_invariant (cached_lhs));
2151
2152      if (dump_file && (dump_flags & TDF_DETAILS))
2153	{
2154	  fprintf (dump_file, "  Replaced redundant expr '");
2155	  print_gimple_expr (dump_file, stmt, 0, dump_flags);
2156	  fprintf (dump_file, "' with '");
2157	  print_generic_expr (dump_file, cached_lhs, dump_flags);
2158          fprintf (dump_file, "'\n");
2159	}
2160
2161      opt_stats.num_re++;
2162
2163      if (assigns_var_p
2164	  && !useless_type_conversion_p (expr_type, TREE_TYPE (cached_lhs)))
2165	cached_lhs = fold_convert (expr_type, cached_lhs);
2166
2167      propagate_tree_value_into_stmt (gsi, cached_lhs);
2168
2169      /* Since it is always necessary to mark the result as modified,
2170         perhaps we should move this into propagate_tree_value_into_stmt
2171         itself.  */
2172      gimple_set_modified (gsi_stmt (*gsi), true);
2173  }
2174}
2175
2176/* STMT, a GIMPLE_ASSIGN, may create certain equivalences, in either
2177   the available expressions table or the const_and_copies table.
2178   Detect and record those equivalences.  */
2179/* We handle only very simple copy equivalences here.  The heavy
2180   lifing is done by eliminate_redundant_computations.  */
2181
2182static void
2183record_equivalences_from_stmt (gimple stmt, int may_optimize_p)
2184{
2185  tree lhs;
2186  enum tree_code lhs_code;
2187
2188  gcc_assert (is_gimple_assign (stmt));
2189
2190  lhs = gimple_assign_lhs (stmt);
2191  lhs_code = TREE_CODE (lhs);
2192
2193  if (lhs_code == SSA_NAME
2194      && gimple_assign_single_p (stmt))
2195    {
2196      tree rhs = gimple_assign_rhs1 (stmt);
2197
2198      /* If the RHS of the assignment is a constant or another variable that
2199	 may be propagated, register it in the CONST_AND_COPIES table.  We
2200	 do not need to record unwind data for this, since this is a true
2201	 assignment and not an equivalence inferred from a comparison.  All
2202	 uses of this ssa name are dominated by this assignment, so unwinding
2203	 just costs time and space.  */
2204      if (may_optimize_p
2205	  && (TREE_CODE (rhs) == SSA_NAME
2206	      || is_gimple_min_invariant (rhs)))
2207      {
2208	if (dump_file && (dump_flags & TDF_DETAILS))
2209	  {
2210	    fprintf (dump_file, "==== ASGN ");
2211	    print_generic_expr (dump_file, lhs, 0);
2212	    fprintf (dump_file, " = ");
2213	    print_generic_expr (dump_file, rhs, 0);
2214	    fprintf (dump_file, "\n");
2215	  }
2216
2217	set_ssa_name_value (lhs, rhs);
2218      }
2219    }
2220
2221  /* Make sure we can propagate &x + CST.  */
2222  if (lhs_code == SSA_NAME
2223      && gimple_assign_rhs_code (stmt) == POINTER_PLUS_EXPR
2224      && TREE_CODE (gimple_assign_rhs1 (stmt)) == ADDR_EXPR
2225      && TREE_CODE (gimple_assign_rhs2 (stmt)) == INTEGER_CST)
2226    {
2227      tree op0 = gimple_assign_rhs1 (stmt);
2228      tree op1 = gimple_assign_rhs2 (stmt);
2229      tree new_rhs
2230	= build_fold_addr_expr (fold_build2 (MEM_REF,
2231					     TREE_TYPE (TREE_TYPE (op0)),
2232					     unshare_expr (op0),
2233					     fold_convert (ptr_type_node,
2234							   op1)));
2235      if (dump_file && (dump_flags & TDF_DETAILS))
2236	{
2237	  fprintf (dump_file, "==== ASGN ");
2238	  print_generic_expr (dump_file, lhs, 0);
2239	  fprintf (dump_file, " = ");
2240	  print_generic_expr (dump_file, new_rhs, 0);
2241	  fprintf (dump_file, "\n");
2242	}
2243
2244      set_ssa_name_value (lhs, new_rhs);
2245    }
2246
2247  /* A memory store, even an aliased store, creates a useful
2248     equivalence.  By exchanging the LHS and RHS, creating suitable
2249     vops and recording the result in the available expression table,
2250     we may be able to expose more redundant loads.  */
2251  if (!gimple_has_volatile_ops (stmt)
2252      && gimple_references_memory_p (stmt)
2253      && gimple_assign_single_p (stmt)
2254      && (TREE_CODE (gimple_assign_rhs1 (stmt)) == SSA_NAME
2255	  || is_gimple_min_invariant (gimple_assign_rhs1 (stmt)))
2256      && !is_gimple_reg (lhs))
2257    {
2258      tree rhs = gimple_assign_rhs1 (stmt);
2259      gassign *new_stmt;
2260
2261      /* Build a new statement with the RHS and LHS exchanged.  */
2262      if (TREE_CODE (rhs) == SSA_NAME)
2263        {
2264          /* NOTE tuples.  The call to gimple_build_assign below replaced
2265             a call to build_gimple_modify_stmt, which did not set the
2266             SSA_NAME_DEF_STMT on the LHS of the assignment.  Doing so
2267             may cause an SSA validation failure, as the LHS may be a
2268             default-initialized name and should have no definition.  I'm
2269             a bit dubious of this, as the artificial statement that we
2270             generate here may in fact be ill-formed, but it is simply
2271             used as an internal device in this pass, and never becomes
2272             part of the CFG.  */
2273          gimple defstmt = SSA_NAME_DEF_STMT (rhs);
2274          new_stmt = gimple_build_assign (rhs, lhs);
2275          SSA_NAME_DEF_STMT (rhs) = defstmt;
2276        }
2277      else
2278        new_stmt = gimple_build_assign (rhs, lhs);
2279
2280      gimple_set_vuse (new_stmt, gimple_vdef (stmt));
2281
2282      /* Finally enter the statement into the available expression
2283	 table.  */
2284      lookup_avail_expr (new_stmt, true);
2285    }
2286}
2287
2288/* Replace *OP_P in STMT with any known equivalent value for *OP_P from
2289   CONST_AND_COPIES.  */
2290
2291static void
2292cprop_operand (gimple stmt, use_operand_p op_p)
2293{
2294  tree val;
2295  tree op = USE_FROM_PTR (op_p);
2296
2297  /* If the operand has a known constant value or it is known to be a
2298     copy of some other variable, use the value or copy stored in
2299     CONST_AND_COPIES.  */
2300  val = SSA_NAME_VALUE (op);
2301  if (val && val != op)
2302    {
2303      /* Do not replace hard register operands in asm statements.  */
2304      if (gimple_code (stmt) == GIMPLE_ASM
2305	  && !may_propagate_copy_into_asm (op))
2306	return;
2307
2308      /* Certain operands are not allowed to be copy propagated due
2309	 to their interaction with exception handling and some GCC
2310	 extensions.  */
2311      if (!may_propagate_copy (op, val))
2312	return;
2313
2314      /* Do not propagate copies into BIVs.
2315         See PR23821 and PR62217 for how this can disturb IV and
2316	 number of iteration analysis.  */
2317      if (TREE_CODE (val) != INTEGER_CST)
2318	{
2319	  gimple def = SSA_NAME_DEF_STMT (op);
2320	  if (gimple_code (def) == GIMPLE_PHI
2321	      && gimple_bb (def)->loop_father->header == gimple_bb (def))
2322	    return;
2323	}
2324
2325      /* Dump details.  */
2326      if (dump_file && (dump_flags & TDF_DETAILS))
2327	{
2328	  fprintf (dump_file, "  Replaced '");
2329	  print_generic_expr (dump_file, op, dump_flags);
2330	  fprintf (dump_file, "' with %s '",
2331		   (TREE_CODE (val) != SSA_NAME ? "constant" : "variable"));
2332	  print_generic_expr (dump_file, val, dump_flags);
2333	  fprintf (dump_file, "'\n");
2334	}
2335
2336      if (TREE_CODE (val) != SSA_NAME)
2337	opt_stats.num_const_prop++;
2338      else
2339	opt_stats.num_copy_prop++;
2340
2341      propagate_value (op_p, val);
2342
2343      /* And note that we modified this statement.  This is now
2344	 safe, even if we changed virtual operands since we will
2345	 rescan the statement and rewrite its operands again.  */
2346      gimple_set_modified (stmt, true);
2347    }
2348}
2349
2350/* CONST_AND_COPIES is a table which maps an SSA_NAME to the current
2351   known value for that SSA_NAME (or NULL if no value is known).
2352
2353   Propagate values from CONST_AND_COPIES into the uses, vuses and
2354   vdef_ops of STMT.  */
2355
2356static void
2357cprop_into_stmt (gimple stmt)
2358{
2359  use_operand_p op_p;
2360  ssa_op_iter iter;
2361
2362  FOR_EACH_SSA_USE_OPERAND (op_p, stmt, iter, SSA_OP_USE)
2363    cprop_operand (stmt, op_p);
2364}
2365
2366/* Optimize the statement pointed to by iterator SI.
2367
2368   We try to perform some simplistic global redundancy elimination and
2369   constant propagation:
2370
2371   1- To detect global redundancy, we keep track of expressions that have
2372      been computed in this block and its dominators.  If we find that the
2373      same expression is computed more than once, we eliminate repeated
2374      computations by using the target of the first one.
2375
2376   2- Constant values and copy assignments.  This is used to do very
2377      simplistic constant and copy propagation.  When a constant or copy
2378      assignment is found, we map the value on the RHS of the assignment to
2379      the variable in the LHS in the CONST_AND_COPIES table.  */
2380
2381static void
2382optimize_stmt (basic_block bb, gimple_stmt_iterator si)
2383{
2384  gimple stmt, old_stmt;
2385  bool may_optimize_p;
2386  bool modified_p = false;
2387  bool was_noreturn;
2388
2389  old_stmt = stmt = gsi_stmt (si);
2390  was_noreturn = is_gimple_call (stmt) && gimple_call_noreturn_p (stmt);
2391
2392  if (dump_file && (dump_flags & TDF_DETAILS))
2393    {
2394      fprintf (dump_file, "Optimizing statement ");
2395      print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM);
2396    }
2397
2398  if (gimple_code (stmt) == GIMPLE_COND)
2399    canonicalize_comparison (as_a <gcond *> (stmt));
2400
2401  update_stmt_if_modified (stmt);
2402  opt_stats.num_stmts++;
2403
2404  /* Const/copy propagate into USES, VUSES and the RHS of VDEFs.  */
2405  cprop_into_stmt (stmt);
2406
2407  /* If the statement has been modified with constant replacements,
2408     fold its RHS before checking for redundant computations.  */
2409  if (gimple_modified_p (stmt))
2410    {
2411      tree rhs = NULL;
2412
2413      /* Try to fold the statement making sure that STMT is kept
2414	 up to date.  */
2415      if (fold_stmt (&si))
2416	{
2417	  stmt = gsi_stmt (si);
2418	  gimple_set_modified (stmt, true);
2419
2420	  if (dump_file && (dump_flags & TDF_DETAILS))
2421	    {
2422	      fprintf (dump_file, "  Folded to: ");
2423	      print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM);
2424	    }
2425	}
2426
2427      /* We only need to consider cases that can yield a gimple operand.  */
2428      if (gimple_assign_single_p (stmt))
2429        rhs = gimple_assign_rhs1 (stmt);
2430      else if (gimple_code (stmt) == GIMPLE_GOTO)
2431        rhs = gimple_goto_dest (stmt);
2432      else if (gswitch *swtch_stmt = dyn_cast <gswitch *> (stmt))
2433        /* This should never be an ADDR_EXPR.  */
2434        rhs = gimple_switch_index (swtch_stmt);
2435
2436      if (rhs && TREE_CODE (rhs) == ADDR_EXPR)
2437        recompute_tree_invariant_for_addr_expr (rhs);
2438
2439      /* Indicate that maybe_clean_or_replace_eh_stmt needs to be called,
2440	 even if fold_stmt updated the stmt already and thus cleared
2441	 gimple_modified_p flag on it.  */
2442      modified_p = true;
2443    }
2444
2445  /* Check for redundant computations.  Do this optimization only
2446     for assignments that have no volatile ops and conditionals.  */
2447  may_optimize_p = (!gimple_has_side_effects (stmt)
2448                    && (is_gimple_assign (stmt)
2449                        || (is_gimple_call (stmt)
2450                            && gimple_call_lhs (stmt) != NULL_TREE)
2451                        || gimple_code (stmt) == GIMPLE_COND
2452                        || gimple_code (stmt) == GIMPLE_SWITCH));
2453
2454  if (may_optimize_p)
2455    {
2456      if (gimple_code (stmt) == GIMPLE_CALL)
2457	{
2458	  /* Resolve __builtin_constant_p.  If it hasn't been
2459	     folded to integer_one_node by now, it's fairly
2460	     certain that the value simply isn't constant.  */
2461	  tree callee = gimple_call_fndecl (stmt);
2462	  if (callee
2463	      && DECL_BUILT_IN_CLASS (callee) == BUILT_IN_NORMAL
2464	      && DECL_FUNCTION_CODE (callee) == BUILT_IN_CONSTANT_P)
2465	    {
2466	      propagate_tree_value_into_stmt (&si, integer_zero_node);
2467	      stmt = gsi_stmt (si);
2468	    }
2469	}
2470
2471      update_stmt_if_modified (stmt);
2472      eliminate_redundant_computations (&si);
2473      stmt = gsi_stmt (si);
2474
2475      /* Perform simple redundant store elimination.  */
2476      if (gimple_assign_single_p (stmt)
2477	  && TREE_CODE (gimple_assign_lhs (stmt)) != SSA_NAME)
2478	{
2479	  tree lhs = gimple_assign_lhs (stmt);
2480	  tree rhs = gimple_assign_rhs1 (stmt);
2481	  tree cached_lhs;
2482	  gassign *new_stmt;
2483	  if (TREE_CODE (rhs) == SSA_NAME)
2484	    {
2485	      tree tem = SSA_NAME_VALUE (rhs);
2486	      if (tem)
2487		rhs = tem;
2488	    }
2489	  /* Build a new statement with the RHS and LHS exchanged.  */
2490	  if (TREE_CODE (rhs) == SSA_NAME)
2491	    {
2492	      gimple defstmt = SSA_NAME_DEF_STMT (rhs);
2493	      new_stmt = gimple_build_assign (rhs, lhs);
2494	      SSA_NAME_DEF_STMT (rhs) = defstmt;
2495	    }
2496	  else
2497	    new_stmt = gimple_build_assign (rhs, lhs);
2498	  gimple_set_vuse (new_stmt, gimple_vuse (stmt));
2499	  cached_lhs = lookup_avail_expr (new_stmt, false, false);
2500	  if (cached_lhs
2501	      && rhs == cached_lhs)
2502	    {
2503	      basic_block bb = gimple_bb (stmt);
2504	      unlink_stmt_vdef (stmt);
2505	      if (gsi_remove (&si, true))
2506		{
2507		  bitmap_set_bit (need_eh_cleanup, bb->index);
2508		  if (dump_file && (dump_flags & TDF_DETAILS))
2509		    fprintf (dump_file, "  Flagged to clear EH edges.\n");
2510		}
2511	      release_defs (stmt);
2512	      return;
2513	    }
2514	}
2515    }
2516
2517  /* Record any additional equivalences created by this statement.  */
2518  if (is_gimple_assign (stmt))
2519    record_equivalences_from_stmt (stmt, may_optimize_p);
2520
2521  /* If STMT is a COND_EXPR and it was modified, then we may know
2522     where it goes.  If that is the case, then mark the CFG as altered.
2523
2524     This will cause us to later call remove_unreachable_blocks and
2525     cleanup_tree_cfg when it is safe to do so.  It is not safe to
2526     clean things up here since removal of edges and such can trigger
2527     the removal of PHI nodes, which in turn can release SSA_NAMEs to
2528     the manager.
2529
2530     That's all fine and good, except that once SSA_NAMEs are released
2531     to the manager, we must not call create_ssa_name until all references
2532     to released SSA_NAMEs have been eliminated.
2533
2534     All references to the deleted SSA_NAMEs can not be eliminated until
2535     we remove unreachable blocks.
2536
2537     We can not remove unreachable blocks until after we have completed
2538     any queued jump threading.
2539
2540     We can not complete any queued jump threads until we have taken
2541     appropriate variables out of SSA form.  Taking variables out of
2542     SSA form can call create_ssa_name and thus we lose.
2543
2544     Ultimately I suspect we're going to need to change the interface
2545     into the SSA_NAME manager.  */
2546  if (gimple_modified_p (stmt) || modified_p)
2547    {
2548      tree val = NULL;
2549
2550      update_stmt_if_modified (stmt);
2551
2552      if (gimple_code (stmt) == GIMPLE_COND)
2553        val = fold_binary_loc (gimple_location (stmt),
2554			   gimple_cond_code (stmt), boolean_type_node,
2555                           gimple_cond_lhs (stmt),  gimple_cond_rhs (stmt));
2556      else if (gswitch *swtch_stmt = dyn_cast <gswitch *> (stmt))
2557	val = gimple_switch_index (swtch_stmt);
2558
2559      if (val && TREE_CODE (val) == INTEGER_CST && find_taken_edge (bb, val))
2560	cfg_altered = true;
2561
2562      /* If we simplified a statement in such a way as to be shown that it
2563	 cannot trap, update the eh information and the cfg to match.  */
2564      if (maybe_clean_or_replace_eh_stmt (old_stmt, stmt))
2565	{
2566	  bitmap_set_bit (need_eh_cleanup, bb->index);
2567	  if (dump_file && (dump_flags & TDF_DETAILS))
2568	    fprintf (dump_file, "  Flagged to clear EH edges.\n");
2569	}
2570
2571      if (!was_noreturn
2572	  && is_gimple_call (stmt) && gimple_call_noreturn_p (stmt))
2573	need_noreturn_fixup.safe_push (stmt);
2574    }
2575}
2576
2577/* Helper for walk_non_aliased_vuses.  Determine if we arrived at
2578   the desired memory state.  */
2579
2580static void *
2581vuse_eq (ao_ref *, tree vuse1, unsigned int cnt, void *data)
2582{
2583  tree vuse2 = (tree) data;
2584  if (vuse1 == vuse2)
2585    return data;
2586
2587  /* This bounds the stmt walks we perform on reference lookups
2588     to O(1) instead of O(N) where N is the number of dominating
2589     stores leading to a candidate.  We re-use the SCCVN param
2590     for this as it is basically the same complexity.  */
2591  if (cnt > (unsigned) PARAM_VALUE (PARAM_SCCVN_MAX_ALIAS_QUERIES_PER_ACCESS))
2592    return (void *)-1;
2593
2594  return NULL;
2595}
2596
2597/* Search for an existing instance of STMT in the AVAIL_EXPRS table.
2598   If found, return its LHS. Otherwise insert STMT in the table and
2599   return NULL_TREE.
2600
2601   Also, when an expression is first inserted in the  table, it is also
2602   is also added to AVAIL_EXPRS_STACK, so that it can be removed when
2603   we finish processing this block and its children.  */
2604
2605static tree
2606lookup_avail_expr (gimple stmt, bool insert, bool tbaa_p)
2607{
2608  expr_hash_elt **slot;
2609  tree lhs;
2610  tree temp;
2611  struct expr_hash_elt element;
2612
2613  /* Get LHS of phi, assignment, or call; else NULL_TREE.  */
2614  if (gimple_code (stmt) == GIMPLE_PHI)
2615    lhs = gimple_phi_result (stmt);
2616  else
2617    lhs = gimple_get_lhs (stmt);
2618
2619  initialize_hash_element (stmt, lhs, &element);
2620
2621  if (dump_file && (dump_flags & TDF_DETAILS))
2622    {
2623      fprintf (dump_file, "LKUP ");
2624      print_expr_hash_elt (dump_file, &element);
2625    }
2626
2627  /* Don't bother remembering constant assignments and copy operations.
2628     Constants and copy operations are handled by the constant/copy propagator
2629     in optimize_stmt.  */
2630  if (element.expr.kind == EXPR_SINGLE
2631      && (TREE_CODE (element.expr.ops.single.rhs) == SSA_NAME
2632          || is_gimple_min_invariant (element.expr.ops.single.rhs)))
2633    return NULL_TREE;
2634
2635  /* Finally try to find the expression in the main expression hash table.  */
2636  slot = avail_exprs->find_slot (&element, (insert ? INSERT : NO_INSERT));
2637  if (slot == NULL)
2638    {
2639      free_expr_hash_elt_contents (&element);
2640      return NULL_TREE;
2641    }
2642  else if (*slot == NULL)
2643    {
2644      struct expr_hash_elt *element2 = XNEW (struct expr_hash_elt);
2645      *element2 = element;
2646      element2->stamp = element2;
2647      *slot = element2;
2648
2649      if (dump_file && (dump_flags & TDF_DETAILS))
2650        {
2651          fprintf (dump_file, "2>>> ");
2652          print_expr_hash_elt (dump_file, element2);
2653        }
2654
2655      avail_exprs_stack.safe_push
2656	(std::pair<expr_hash_elt_t, expr_hash_elt_t> (element2, NULL));
2657      return NULL_TREE;
2658    }
2659
2660  /* If we found a redundant memory operation do an alias walk to
2661     check if we can re-use it.  */
2662  if (gimple_vuse (stmt) != (*slot)->vop)
2663    {
2664      tree vuse1 = (*slot)->vop;
2665      tree vuse2 = gimple_vuse (stmt);
2666      /* If we have a load of a register and a candidate in the
2667	 hash with vuse1 then try to reach its stmt by walking
2668	 up the virtual use-def chain using walk_non_aliased_vuses.
2669	 But don't do this when removing expressions from the hash.  */
2670      ao_ref ref;
2671      if (!(vuse1 && vuse2
2672	    && gimple_assign_single_p (stmt)
2673	    && TREE_CODE (gimple_assign_lhs (stmt)) == SSA_NAME
2674	    && (ao_ref_init (&ref, gimple_assign_rhs1 (stmt)),
2675		ref.base_alias_set = ref.ref_alias_set = tbaa_p ? -1 : 0, true)
2676	    && walk_non_aliased_vuses (&ref, vuse2,
2677				       vuse_eq, NULL, NULL, vuse1) != NULL))
2678	{
2679	  if (insert)
2680	    {
2681	      struct expr_hash_elt *element2 = XNEW (struct expr_hash_elt);
2682	      *element2 = element;
2683	      element2->stamp = element2;
2684
2685	      /* Insert the expr into the hash by replacing the current
2686		 entry and recording the value to restore in the
2687		 avail_exprs_stack.  */
2688	      avail_exprs_stack.safe_push (std::make_pair (element2, *slot));
2689	      *slot = element2;
2690	      if (dump_file && (dump_flags & TDF_DETAILS))
2691		{
2692		  fprintf (dump_file, "2>>> ");
2693		  print_expr_hash_elt (dump_file, *slot);
2694		}
2695	    }
2696	  return NULL_TREE;
2697	}
2698    }
2699
2700  free_expr_hash_elt_contents (&element);
2701
2702  /* Extract the LHS of the assignment so that it can be used as the current
2703     definition of another variable.  */
2704  lhs = (*slot)->lhs;
2705
2706  /* See if the LHS appears in the CONST_AND_COPIES table.  If it does, then
2707     use the value from the const_and_copies table.  */
2708  if (TREE_CODE (lhs) == SSA_NAME)
2709    {
2710      temp = SSA_NAME_VALUE (lhs);
2711      if (temp)
2712	lhs = temp;
2713    }
2714
2715  if (dump_file && (dump_flags & TDF_DETAILS))
2716    {
2717      fprintf (dump_file, "FIND: ");
2718      print_generic_expr (dump_file, lhs, 0);
2719      fprintf (dump_file, "\n");
2720    }
2721
2722  return lhs;
2723}
2724
2725/* Hashing and equality functions for AVAIL_EXPRS.  We compute a value number
2726   for expressions using the code of the expression and the SSA numbers of
2727   its operands.  */
2728
2729static hashval_t
2730avail_expr_hash (const void *p)
2731{
2732  const struct hashable_expr *expr = &((const struct expr_hash_elt *)p)->expr;
2733  inchash::hash hstate;
2734
2735  inchash::add_hashable_expr (expr, hstate);
2736
2737  return hstate.end ();
2738}
2739
2740/* PHI-ONLY copy and constant propagation.  This pass is meant to clean
2741   up degenerate PHIs created by or exposed by jump threading.  */
2742
2743/* Given a statement STMT, which is either a PHI node or an assignment,
2744   remove it from the IL.  */
2745
2746static void
2747remove_stmt_or_phi (gimple stmt)
2748{
2749  gimple_stmt_iterator gsi = gsi_for_stmt (stmt);
2750
2751  if (gimple_code (stmt) == GIMPLE_PHI)
2752    remove_phi_node (&gsi, true);
2753  else
2754    {
2755      gsi_remove (&gsi, true);
2756      release_defs (stmt);
2757    }
2758}
2759
2760/* Given a statement STMT, which is either a PHI node or an assignment,
2761   return the "rhs" of the node, in the case of a non-degenerate
2762   phi, NULL is returned.  */
2763
2764static tree
2765get_rhs_or_phi_arg (gimple stmt)
2766{
2767  if (gimple_code (stmt) == GIMPLE_PHI)
2768    return degenerate_phi_result (as_a <gphi *> (stmt));
2769  else if (gimple_assign_single_p (stmt))
2770    return gimple_assign_rhs1 (stmt);
2771  else
2772    gcc_unreachable ();
2773}
2774
2775
2776/* Given a statement STMT, which is either a PHI node or an assignment,
2777   return the "lhs" of the node.  */
2778
2779static tree
2780get_lhs_or_phi_result (gimple stmt)
2781{
2782  if (gimple_code (stmt) == GIMPLE_PHI)
2783    return gimple_phi_result (stmt);
2784  else if (is_gimple_assign (stmt))
2785    return gimple_assign_lhs (stmt);
2786  else
2787    gcc_unreachable ();
2788}
2789
2790/* Propagate RHS into all uses of LHS (when possible).
2791
2792   RHS and LHS are derived from STMT, which is passed in solely so
2793   that we can remove it if propagation is successful.
2794
2795   When propagating into a PHI node or into a statement which turns
2796   into a trivial copy or constant initialization, set the
2797   appropriate bit in INTERESTING_NAMEs so that we will visit those
2798   nodes as well in an effort to pick up secondary optimization
2799   opportunities.  */
2800
2801static void
2802propagate_rhs_into_lhs (gimple stmt, tree lhs, tree rhs, bitmap interesting_names)
2803{
2804  /* First verify that propagation is valid.  */
2805  if (may_propagate_copy (lhs, rhs))
2806    {
2807      use_operand_p use_p;
2808      imm_use_iterator iter;
2809      gimple use_stmt;
2810      bool all = true;
2811
2812      /* Dump details.  */
2813      if (dump_file && (dump_flags & TDF_DETAILS))
2814	{
2815	  fprintf (dump_file, "  Replacing '");
2816	  print_generic_expr (dump_file, lhs, dump_flags);
2817	  fprintf (dump_file, "' with %s '",
2818	           (TREE_CODE (rhs) != SSA_NAME ? "constant" : "variable"));
2819		   print_generic_expr (dump_file, rhs, dump_flags);
2820	  fprintf (dump_file, "'\n");
2821	}
2822
2823      /* Walk over every use of LHS and try to replace the use with RHS.
2824	 At this point the only reason why such a propagation would not
2825	 be successful would be if the use occurs in an ASM_EXPR.  */
2826      FOR_EACH_IMM_USE_STMT (use_stmt, iter, lhs)
2827	{
2828	  /* Leave debug stmts alone.  If we succeed in propagating
2829	     all non-debug uses, we'll drop the DEF, and propagation
2830	     into debug stmts will occur then.  */
2831	  if (gimple_debug_bind_p (use_stmt))
2832	    continue;
2833
2834	  /* It's not always safe to propagate into an ASM_EXPR.  */
2835	  if (gimple_code (use_stmt) == GIMPLE_ASM
2836              && ! may_propagate_copy_into_asm (lhs))
2837	    {
2838	      all = false;
2839	      continue;
2840	    }
2841
2842	  /* It's not ok to propagate into the definition stmt of RHS.
2843		<bb 9>:
2844		  # prephitmp.12_36 = PHI <g_67.1_6(9)>
2845		  g_67.1_6 = prephitmp.12_36;
2846		  goto <bb 9>;
2847	     While this is strictly all dead code we do not want to
2848	     deal with this here.  */
2849	  if (TREE_CODE (rhs) == SSA_NAME
2850	      && SSA_NAME_DEF_STMT (rhs) == use_stmt)
2851	    {
2852	      all = false;
2853	      continue;
2854	    }
2855
2856	  /* Dump details.  */
2857	  if (dump_file && (dump_flags & TDF_DETAILS))
2858	    {
2859	      fprintf (dump_file, "    Original statement:");
2860	      print_gimple_stmt (dump_file, use_stmt, 0, dump_flags);
2861	    }
2862
2863	  /* Propagate the RHS into this use of the LHS.  */
2864	  FOR_EACH_IMM_USE_ON_STMT (use_p, iter)
2865	    propagate_value (use_p, rhs);
2866
2867	  /* Special cases to avoid useless calls into the folding
2868	     routines, operand scanning, etc.
2869
2870	     Propagation into a PHI may cause the PHI to become
2871	     a degenerate, so mark the PHI as interesting.  No other
2872	     actions are necessary.  */
2873	  if (gimple_code (use_stmt) == GIMPLE_PHI)
2874	    {
2875	      tree result;
2876
2877	      /* Dump details.  */
2878	      if (dump_file && (dump_flags & TDF_DETAILS))
2879		{
2880		  fprintf (dump_file, "    Updated statement:");
2881		  print_gimple_stmt (dump_file, use_stmt, 0, dump_flags);
2882		}
2883
2884	      result = get_lhs_or_phi_result (use_stmt);
2885	      bitmap_set_bit (interesting_names, SSA_NAME_VERSION (result));
2886	      continue;
2887	    }
2888
2889	  /* From this point onward we are propagating into a
2890	     real statement.  Folding may (or may not) be possible,
2891	     we may expose new operands, expose dead EH edges,
2892	     etc.  */
2893          /* NOTE tuples. In the tuples world, fold_stmt_inplace
2894             cannot fold a call that simplifies to a constant,
2895             because the GIMPLE_CALL must be replaced by a
2896             GIMPLE_ASSIGN, and there is no way to effect such a
2897             transformation in-place.  We might want to consider
2898             using the more general fold_stmt here.  */
2899	    {
2900	      gimple_stmt_iterator gsi = gsi_for_stmt (use_stmt);
2901	      fold_stmt_inplace (&gsi);
2902	    }
2903
2904	  /* Sometimes propagation can expose new operands to the
2905	     renamer.  */
2906	  update_stmt (use_stmt);
2907
2908	  /* Dump details.  */
2909	  if (dump_file && (dump_flags & TDF_DETAILS))
2910	    {
2911	      fprintf (dump_file, "    Updated statement:");
2912	      print_gimple_stmt (dump_file, use_stmt, 0, dump_flags);
2913	    }
2914
2915	  /* If we replaced a variable index with a constant, then
2916	     we would need to update the invariant flag for ADDR_EXPRs.  */
2917          if (gimple_assign_single_p (use_stmt)
2918              && TREE_CODE (gimple_assign_rhs1 (use_stmt)) == ADDR_EXPR)
2919	    recompute_tree_invariant_for_addr_expr
2920                (gimple_assign_rhs1 (use_stmt));
2921
2922	  /* If we cleaned up EH information from the statement,
2923	     mark its containing block as needing EH cleanups.  */
2924	  if (maybe_clean_or_replace_eh_stmt (use_stmt, use_stmt))
2925	    {
2926	      bitmap_set_bit (need_eh_cleanup, gimple_bb (use_stmt)->index);
2927	      if (dump_file && (dump_flags & TDF_DETAILS))
2928		fprintf (dump_file, "  Flagged to clear EH edges.\n");
2929	    }
2930
2931	  /* Propagation may expose new trivial copy/constant propagation
2932	     opportunities.  */
2933          if (gimple_assign_single_p (use_stmt)
2934              && TREE_CODE (gimple_assign_lhs (use_stmt)) == SSA_NAME
2935              && (TREE_CODE (gimple_assign_rhs1 (use_stmt)) == SSA_NAME
2936                  || is_gimple_min_invariant (gimple_assign_rhs1 (use_stmt))))
2937            {
2938	      tree result = get_lhs_or_phi_result (use_stmt);
2939	      bitmap_set_bit (interesting_names, SSA_NAME_VERSION (result));
2940	    }
2941
2942	  /* Propagation into these nodes may make certain edges in
2943	     the CFG unexecutable.  We want to identify them as PHI nodes
2944	     at the destination of those unexecutable edges may become
2945	     degenerates.  */
2946	  else if (gimple_code (use_stmt) == GIMPLE_COND
2947		   || gimple_code (use_stmt) == GIMPLE_SWITCH
2948		   || gimple_code (use_stmt) == GIMPLE_GOTO)
2949            {
2950	      tree val;
2951
2952	      if (gimple_code (use_stmt) == GIMPLE_COND)
2953                val = fold_binary_loc (gimple_location (use_stmt),
2954				   gimple_cond_code (use_stmt),
2955                                   boolean_type_node,
2956                                   gimple_cond_lhs (use_stmt),
2957                                   gimple_cond_rhs (use_stmt));
2958              else if (gimple_code (use_stmt) == GIMPLE_SWITCH)
2959		val = gimple_switch_index (as_a <gswitch *> (use_stmt));
2960	      else
2961		val = gimple_goto_dest  (use_stmt);
2962
2963	      if (val && is_gimple_min_invariant (val))
2964		{
2965		  basic_block bb = gimple_bb (use_stmt);
2966		  edge te = find_taken_edge (bb, val);
2967		  if (!te)
2968		    continue;
2969
2970		  edge_iterator ei;
2971		  edge e;
2972		  gimple_stmt_iterator gsi;
2973		  gphi_iterator psi;
2974
2975		  /* Remove all outgoing edges except TE.  */
2976		  for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei));)
2977		    {
2978		      if (e != te)
2979			{
2980			  /* Mark all the PHI nodes at the destination of
2981			     the unexecutable edge as interesting.  */
2982                          for (psi = gsi_start_phis (e->dest);
2983                               !gsi_end_p (psi);
2984                               gsi_next (&psi))
2985                            {
2986                              gphi *phi = psi.phi ();
2987
2988			      tree result = gimple_phi_result (phi);
2989			      int version = SSA_NAME_VERSION (result);
2990
2991			      bitmap_set_bit (interesting_names, version);
2992			    }
2993
2994			  te->probability += e->probability;
2995
2996			  te->count += e->count;
2997			  remove_edge (e);
2998			  cfg_altered = true;
2999			}
3000		      else
3001			ei_next (&ei);
3002		    }
3003
3004		  gsi = gsi_last_bb (gimple_bb (use_stmt));
3005		  gsi_remove (&gsi, true);
3006
3007		  /* And fixup the flags on the single remaining edge.  */
3008		  te->flags &= ~(EDGE_TRUE_VALUE | EDGE_FALSE_VALUE);
3009		  te->flags &= ~EDGE_ABNORMAL;
3010		  te->flags |= EDGE_FALLTHRU;
3011		  if (te->probability > REG_BR_PROB_BASE)
3012		    te->probability = REG_BR_PROB_BASE;
3013	        }
3014	    }
3015	}
3016
3017      /* Ensure there is nothing else to do. */
3018      gcc_assert (!all || has_zero_uses (lhs));
3019
3020      /* If we were able to propagate away all uses of LHS, then
3021	 we can remove STMT.  */
3022      if (all)
3023	remove_stmt_or_phi (stmt);
3024    }
3025}
3026
3027/* STMT is either a PHI node (potentially a degenerate PHI node) or
3028   a statement that is a trivial copy or constant initialization.
3029
3030   Attempt to eliminate T by propagating its RHS into all uses of
3031   its LHS.  This may in turn set new bits in INTERESTING_NAMES
3032   for nodes we want to revisit later.
3033
3034   All exit paths should clear INTERESTING_NAMES for the result
3035   of STMT.  */
3036
3037static void
3038eliminate_const_or_copy (gimple stmt, bitmap interesting_names)
3039{
3040  tree lhs = get_lhs_or_phi_result (stmt);
3041  tree rhs;
3042  int version = SSA_NAME_VERSION (lhs);
3043
3044  /* If the LHS of this statement or PHI has no uses, then we can
3045     just eliminate it.  This can occur if, for example, the PHI
3046     was created by block duplication due to threading and its only
3047     use was in the conditional at the end of the block which was
3048     deleted.  */
3049  if (has_zero_uses (lhs))
3050    {
3051      bitmap_clear_bit (interesting_names, version);
3052      remove_stmt_or_phi (stmt);
3053      return;
3054    }
3055
3056  /* Get the RHS of the assignment or PHI node if the PHI is a
3057     degenerate.  */
3058  rhs = get_rhs_or_phi_arg (stmt);
3059  if (!rhs)
3060    {
3061      bitmap_clear_bit (interesting_names, version);
3062      return;
3063    }
3064
3065  if (!virtual_operand_p (lhs))
3066    propagate_rhs_into_lhs (stmt, lhs, rhs, interesting_names);
3067  else
3068    {
3069      gimple use_stmt;
3070      imm_use_iterator iter;
3071      use_operand_p use_p;
3072      /* For virtual operands we have to propagate into all uses as
3073         otherwise we will create overlapping life-ranges.  */
3074      FOR_EACH_IMM_USE_STMT (use_stmt, iter, lhs)
3075	FOR_EACH_IMM_USE_ON_STMT (use_p, iter)
3076	  SET_USE (use_p, rhs);
3077      if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (lhs))
3078	SSA_NAME_OCCURS_IN_ABNORMAL_PHI (rhs) = 1;
3079      remove_stmt_or_phi (stmt);
3080    }
3081
3082  /* Note that STMT may well have been deleted by now, so do
3083     not access it, instead use the saved version # to clear
3084     T's entry in the worklist.  */
3085  bitmap_clear_bit (interesting_names, version);
3086}
3087
3088/* The first phase in degenerate PHI elimination.
3089
3090   Eliminate the degenerate PHIs in BB, then recurse on the
3091   dominator children of BB.  */
3092
3093static void
3094eliminate_degenerate_phis_1 (basic_block bb, bitmap interesting_names)
3095{
3096  gphi_iterator gsi;
3097  basic_block son;
3098
3099  for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
3100    {
3101      gphi *phi = gsi.phi ();
3102
3103      eliminate_const_or_copy (phi, interesting_names);
3104    }
3105
3106  /* Recurse into the dominator children of BB.  */
3107  for (son = first_dom_son (CDI_DOMINATORS, bb);
3108       son;
3109       son = next_dom_son (CDI_DOMINATORS, son))
3110    eliminate_degenerate_phis_1 (son, interesting_names);
3111}
3112
3113
3114/* A very simple pass to eliminate degenerate PHI nodes from the
3115   IL.  This is meant to be fast enough to be able to be run several
3116   times in the optimization pipeline.
3117
3118   Certain optimizations, particularly those which duplicate blocks
3119   or remove edges from the CFG can create or expose PHIs which are
3120   trivial copies or constant initializations.
3121
3122   While we could pick up these optimizations in DOM or with the
3123   combination of copy-prop and CCP, those solutions are far too
3124   heavy-weight for our needs.
3125
3126   This implementation has two phases so that we can efficiently
3127   eliminate the first order degenerate PHIs and second order
3128   degenerate PHIs.
3129
3130   The first phase performs a dominator walk to identify and eliminate
3131   the vast majority of the degenerate PHIs.  When a degenerate PHI
3132   is identified and eliminated any affected statements or PHIs
3133   are put on a worklist.
3134
3135   The second phase eliminates degenerate PHIs and trivial copies
3136   or constant initializations using the worklist.  This is how we
3137   pick up the secondary optimization opportunities with minimal
3138   cost.  */
3139
3140namespace {
3141
3142const pass_data pass_data_phi_only_cprop =
3143{
3144  GIMPLE_PASS, /* type */
3145  "phicprop", /* name */
3146  OPTGROUP_NONE, /* optinfo_flags */
3147  TV_TREE_PHI_CPROP, /* tv_id */
3148  ( PROP_cfg | PROP_ssa ), /* properties_required */
3149  0, /* properties_provided */
3150  0, /* properties_destroyed */
3151  0, /* todo_flags_start */
3152  ( TODO_cleanup_cfg | TODO_update_ssa ), /* todo_flags_finish */
3153};
3154
3155class pass_phi_only_cprop : public gimple_opt_pass
3156{
3157public:
3158  pass_phi_only_cprop (gcc::context *ctxt)
3159    : gimple_opt_pass (pass_data_phi_only_cprop, ctxt)
3160  {}
3161
3162  /* opt_pass methods: */
3163  opt_pass * clone () { return new pass_phi_only_cprop (m_ctxt); }
3164  virtual bool gate (function *) { return flag_tree_dom != 0; }
3165  virtual unsigned int execute (function *);
3166
3167}; // class pass_phi_only_cprop
3168
3169unsigned int
3170pass_phi_only_cprop::execute (function *fun)
3171{
3172  bitmap interesting_names;
3173  bitmap interesting_names1;
3174
3175  /* Bitmap of blocks which need EH information updated.  We can not
3176     update it on-the-fly as doing so invalidates the dominator tree.  */
3177  need_eh_cleanup = BITMAP_ALLOC (NULL);
3178
3179  /* INTERESTING_NAMES is effectively our worklist, indexed by
3180     SSA_NAME_VERSION.
3181
3182     A set bit indicates that the statement or PHI node which
3183     defines the SSA_NAME should be (re)examined to determine if
3184     it has become a degenerate PHI or trivial const/copy propagation
3185     opportunity.
3186
3187     Experiments have show we generally get better compilation
3188     time behavior with bitmaps rather than sbitmaps.  */
3189  interesting_names = BITMAP_ALLOC (NULL);
3190  interesting_names1 = BITMAP_ALLOC (NULL);
3191
3192  calculate_dominance_info (CDI_DOMINATORS);
3193  cfg_altered = false;
3194
3195  /* First phase.  Eliminate degenerate PHIs via a dominator
3196     walk of the CFG.
3197
3198     Experiments have indicated that we generally get better
3199     compile-time behavior by visiting blocks in the first
3200     phase in dominator order.  Presumably this is because walking
3201     in dominator order leaves fewer PHIs for later examination
3202     by the worklist phase.  */
3203  eliminate_degenerate_phis_1 (ENTRY_BLOCK_PTR_FOR_FN (fun),
3204			       interesting_names);
3205
3206  /* Second phase.  Eliminate second order degenerate PHIs as well
3207     as trivial copies or constant initializations identified by
3208     the first phase or this phase.  Basically we keep iterating
3209     until our set of INTERESTING_NAMEs is empty.   */
3210  while (!bitmap_empty_p (interesting_names))
3211    {
3212      unsigned int i;
3213      bitmap_iterator bi;
3214
3215      /* EXECUTE_IF_SET_IN_BITMAP does not like its bitmap
3216	 changed during the loop.  Copy it to another bitmap and
3217	 use that.  */
3218      bitmap_copy (interesting_names1, interesting_names);
3219
3220      EXECUTE_IF_SET_IN_BITMAP (interesting_names1, 0, i, bi)
3221	{
3222	  tree name = ssa_name (i);
3223
3224	  /* Ignore SSA_NAMEs that have been released because
3225	     their defining statement was deleted (unreachable).  */
3226	  if (name)
3227	    eliminate_const_or_copy (SSA_NAME_DEF_STMT (ssa_name (i)),
3228				     interesting_names);
3229	}
3230    }
3231
3232  if (cfg_altered)
3233    {
3234      free_dominance_info (CDI_DOMINATORS);
3235      /* If we changed the CFG schedule loops for fixup by cfgcleanup.  */
3236      loops_state_set (LOOPS_NEED_FIXUP);
3237    }
3238
3239  /* Propagation of const and copies may make some EH edges dead.  Purge
3240     such edges from the CFG as needed.  */
3241  if (!bitmap_empty_p (need_eh_cleanup))
3242    {
3243      gimple_purge_all_dead_eh_edges (need_eh_cleanup);
3244      BITMAP_FREE (need_eh_cleanup);
3245    }
3246
3247  BITMAP_FREE (interesting_names);
3248  BITMAP_FREE (interesting_names1);
3249  return 0;
3250}
3251
3252} // anon namespace
3253
3254gimple_opt_pass *
3255make_pass_phi_only_cprop (gcc::context *ctxt)
3256{
3257  return new pass_phi_only_cprop (ctxt);
3258}
3259