Update gcc-50 to SVN version 221845
[dragonfly.git] / contrib / gcc-5.0 / gcc / tree-ssa-phiopt.c
1 /* Optimization of PHI nodes by converting them into straightline code.
2    Copyright (C) 2004-2015 Free Software Foundation, Inc.
3
4 This file is part of GCC.
5
6 GCC is free software; you can redistribute it and/or modify it
7 under the terms of the GNU General Public License as published by the
8 Free Software Foundation; either version 3, or (at your option) any
9 later version.
10
11 GCC is distributed in the hope that it will be useful, but WITHOUT
12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3.  If not see
18 <http://www.gnu.org/licenses/>.  */
19
20 #include "config.h"
21 #include "system.h"
22 #include "coretypes.h"
23 #include "hash-table.h"
24 #include "tm.h"
25 #include "hash-set.h"
26 #include "machmode.h"
27 #include "vec.h"
28 #include "double-int.h"
29 #include "input.h"
30 #include "alias.h"
31 #include "symtab.h"
32 #include "wide-int.h"
33 #include "inchash.h"
34 #include "tree.h"
35 #include "fold-const.h"
36 #include "stor-layout.h"
37 #include "flags.h"
38 #include "tm_p.h"
39 #include "predict.h"
40 #include "hard-reg-set.h"
41 #include "function.h"
42 #include "dominance.h"
43 #include "cfg.h"
44 #include "cfganal.h"
45 #include "basic-block.h"
46 #include "tree-ssa-alias.h"
47 #include "internal-fn.h"
48 #include "gimple-expr.h"
49 #include "is-a.h"
50 #include "gimple.h"
51 #include "gimplify.h"
52 #include "gimple-iterator.h"
53 #include "gimplify-me.h"
54 #include "gimple-ssa.h"
55 #include "tree-cfg.h"
56 #include "tree-phinodes.h"
57 #include "ssa-iterators.h"
58 #include "stringpool.h"
59 #include "tree-ssanames.h"
60 #include "hashtab.h"
61 #include "rtl.h"
62 #include "statistics.h"
63 #include "real.h"
64 #include "fixed-value.h"
65 #include "insn-config.h"
66 #include "expmed.h"
67 #include "dojump.h"
68 #include "explow.h"
69 #include "calls.h"
70 #include "emit-rtl.h"
71 #include "varasm.h"
72 #include "stmt.h"
73 #include "expr.h"
74 #include "tree-dfa.h"
75 #include "tree-pass.h"
76 #include "langhooks.h"
77 #include "domwalk.h"
78 #include "cfgloop.h"
79 #include "tree-data-ref.h"
80 #include "gimple-pretty-print.h"
81 #include "insn-codes.h"
82 #include "optabs.h"
83 #include "tree-scalar-evolution.h"
84 #include "tree-inline.h"
85
86 #ifndef HAVE_conditional_move
87 #define HAVE_conditional_move (0)
88 #endif
89
90 static unsigned int tree_ssa_phiopt_worker (bool, bool);
91 static bool conditional_replacement (basic_block, basic_block,
92                                      edge, edge, gphi *, tree, tree);
93 static int value_replacement (basic_block, basic_block,
94                               edge, edge, gimple, tree, tree);
95 static bool minmax_replacement (basic_block, basic_block,
96                                 edge, edge, gimple, tree, tree);
97 static bool abs_replacement (basic_block, basic_block,
98                              edge, edge, gimple, tree, tree);
99 static bool cond_store_replacement (basic_block, basic_block, edge, edge,
100                                     hash_set<tree> *);
101 static bool cond_if_else_store_replacement (basic_block, basic_block, basic_block);
102 static hash_set<tree> * get_non_trapping ();
103 static void replace_phi_edge_with_variable (basic_block, edge, gimple, tree);
104 static void hoist_adjacent_loads (basic_block, basic_block,
105                                   basic_block, basic_block);
106 static bool gate_hoist_loads (void);
107
108 /* This pass tries to transform conditional stores into unconditional
109    ones, enabling further simplifications with the simpler then and else
110    blocks.  In particular it replaces this:
111
112      bb0:
113        if (cond) goto bb2; else goto bb1;
114      bb1:
115        *p = RHS;
116      bb2:
117
118    with
119
120      bb0:
121        if (cond) goto bb1; else goto bb2;
122      bb1:
123        condtmp' = *p;
124      bb2:
125        condtmp = PHI <RHS, condtmp'>
126        *p = condtmp;
127
128    This transformation can only be done under several constraints,
129    documented below.  It also replaces:
130
131      bb0:
132        if (cond) goto bb2; else goto bb1;
133      bb1:
134        *p = RHS1;
135        goto bb3;
136      bb2:
137        *p = RHS2;
138      bb3:
139
140    with
141
142      bb0:
143        if (cond) goto bb3; else goto bb1;
144      bb1:
145      bb3:
146        condtmp = PHI <RHS1, RHS2>
147        *p = condtmp;  */
148
149 static unsigned int
150 tree_ssa_cs_elim (void)
151 {
152   unsigned todo;
153   /* ???  We are not interested in loop related info, but the following
154      will create it, ICEing as we didn't init loops with pre-headers.
155      An interfacing issue of find_data_references_in_bb.  */
156   loop_optimizer_init (LOOPS_NORMAL);
157   scev_initialize ();
158   todo = tree_ssa_phiopt_worker (true, false);
159   scev_finalize ();
160   loop_optimizer_finalize ();
161   return todo;
162 }
163
164 /* Return the singleton PHI in the SEQ of PHIs for edges E0 and E1. */
165
166 static gphi *
167 single_non_singleton_phi_for_edges (gimple_seq seq, edge e0, edge e1)
168 {
169   gimple_stmt_iterator i;
170   gphi *phi = NULL;
171   if (gimple_seq_singleton_p (seq))
172     return as_a <gphi *> (gsi_stmt (gsi_start (seq)));
173   for (i = gsi_start (seq); !gsi_end_p (i); gsi_next (&i))
174     {
175       gphi *p = as_a <gphi *> (gsi_stmt (i));
176       /* If the PHI arguments are equal then we can skip this PHI. */
177       if (operand_equal_for_phi_arg_p (gimple_phi_arg_def (p, e0->dest_idx),
178                                        gimple_phi_arg_def (p, e1->dest_idx)))
179         continue;
180
181       /* If we already have a PHI that has the two edge arguments are
182          different, then return it is not a singleton for these PHIs. */
183       if (phi)
184         return NULL;
185
186       phi = p;
187     }
188   return phi;
189 }
190
191 /* The core routine of conditional store replacement and normal
192    phi optimizations.  Both share much of the infrastructure in how
193    to match applicable basic block patterns.  DO_STORE_ELIM is true
194    when we want to do conditional store replacement, false otherwise.
195    DO_HOIST_LOADS is true when we want to hoist adjacent loads out
196    of diamond control flow patterns, false otherwise.  */
197 static unsigned int
198 tree_ssa_phiopt_worker (bool do_store_elim, bool do_hoist_loads)
199 {
200   basic_block bb;
201   basic_block *bb_order;
202   unsigned n, i;
203   bool cfgchanged = false;
204   hash_set<tree> *nontrap = 0;
205
206   if (do_store_elim)
207     /* Calculate the set of non-trapping memory accesses.  */
208     nontrap = get_non_trapping ();
209
210   /* Search every basic block for COND_EXPR we may be able to optimize.
211
212      We walk the blocks in order that guarantees that a block with
213      a single predecessor is processed before the predecessor.
214      This ensures that we collapse inner ifs before visiting the
215      outer ones, and also that we do not try to visit a removed
216      block.  */
217   bb_order = single_pred_before_succ_order ();
218   n = n_basic_blocks_for_fn (cfun) - NUM_FIXED_BLOCKS;
219
220   for (i = 0; i < n; i++)
221     {
222       gimple cond_stmt;
223       gphi *phi;
224       basic_block bb1, bb2;
225       edge e1, e2;
226       tree arg0, arg1;
227
228       bb = bb_order[i];
229
230       cond_stmt = last_stmt (bb);
231       /* Check to see if the last statement is a GIMPLE_COND.  */
232       if (!cond_stmt
233           || gimple_code (cond_stmt) != GIMPLE_COND)
234         continue;
235
236       e1 = EDGE_SUCC (bb, 0);
237       bb1 = e1->dest;
238       e2 = EDGE_SUCC (bb, 1);
239       bb2 = e2->dest;
240
241       /* We cannot do the optimization on abnormal edges.  */
242       if ((e1->flags & EDGE_ABNORMAL) != 0
243           || (e2->flags & EDGE_ABNORMAL) != 0)
244        continue;
245
246       /* If either bb1's succ or bb2 or bb2's succ is non NULL.  */
247       if (EDGE_COUNT (bb1->succs) == 0
248           || bb2 == NULL
249           || EDGE_COUNT (bb2->succs) == 0)
250         continue;
251
252       /* Find the bb which is the fall through to the other.  */
253       if (EDGE_SUCC (bb1, 0)->dest == bb2)
254         ;
255       else if (EDGE_SUCC (bb2, 0)->dest == bb1)
256         {
257           basic_block bb_tmp = bb1;
258           edge e_tmp = e1;
259           bb1 = bb2;
260           bb2 = bb_tmp;
261           e1 = e2;
262           e2 = e_tmp;
263         }
264       else if (do_store_elim
265                && EDGE_SUCC (bb1, 0)->dest == EDGE_SUCC (bb2, 0)->dest)
266         {
267           basic_block bb3 = EDGE_SUCC (bb1, 0)->dest;
268
269           if (!single_succ_p (bb1)
270               || (EDGE_SUCC (bb1, 0)->flags & EDGE_FALLTHRU) == 0
271               || !single_succ_p (bb2)
272               || (EDGE_SUCC (bb2, 0)->flags & EDGE_FALLTHRU) == 0
273               || EDGE_COUNT (bb3->preds) != 2)
274             continue;
275           if (cond_if_else_store_replacement (bb1, bb2, bb3))
276             cfgchanged = true;
277           continue;
278         }
279       else if (do_hoist_loads
280                  && EDGE_SUCC (bb1, 0)->dest == EDGE_SUCC (bb2, 0)->dest)
281         {
282           basic_block bb3 = EDGE_SUCC (bb1, 0)->dest;
283
284           if (!FLOAT_TYPE_P (TREE_TYPE (gimple_cond_lhs (cond_stmt)))
285               && single_succ_p (bb1)
286               && single_succ_p (bb2)
287               && single_pred_p (bb1)
288               && single_pred_p (bb2)
289               && EDGE_COUNT (bb->succs) == 2
290               && EDGE_COUNT (bb3->preds) == 2
291               /* If one edge or the other is dominant, a conditional move
292                  is likely to perform worse than the well-predicted branch.  */
293               && !predictable_edge_p (EDGE_SUCC (bb, 0))
294               && !predictable_edge_p (EDGE_SUCC (bb, 1)))
295             hoist_adjacent_loads (bb, bb1, bb2, bb3);
296           continue;
297         }
298       else
299         continue;
300
301       e1 = EDGE_SUCC (bb1, 0);
302
303       /* Make sure that bb1 is just a fall through.  */
304       if (!single_succ_p (bb1)
305           || (e1->flags & EDGE_FALLTHRU) == 0)
306         continue;
307
308       /* Also make sure that bb1 only have one predecessor and that it
309          is bb.  */
310       if (!single_pred_p (bb1)
311           || single_pred (bb1) != bb)
312         continue;
313
314       if (do_store_elim)
315         {
316           /* bb1 is the middle block, bb2 the join block, bb the split block,
317              e1 the fallthrough edge from bb1 to bb2.  We can't do the
318              optimization if the join block has more than two predecessors.  */
319           if (EDGE_COUNT (bb2->preds) > 2)
320             continue;
321           if (cond_store_replacement (bb1, bb2, e1, e2, nontrap))
322             cfgchanged = true;
323         }
324       else
325         {
326           gimple_seq phis = phi_nodes (bb2);
327           gimple_stmt_iterator gsi;
328           bool candorest = true;
329
330           /* Value replacement can work with more than one PHI
331              so try that first. */
332           for (gsi = gsi_start (phis); !gsi_end_p (gsi); gsi_next (&gsi))
333             {
334               phi = as_a <gphi *> (gsi_stmt (gsi));
335               arg0 = gimple_phi_arg_def (phi, e1->dest_idx);
336               arg1 = gimple_phi_arg_def (phi, e2->dest_idx);
337               if (value_replacement (bb, bb1, e1, e2, phi, arg0, arg1) == 2)
338                 {
339                   candorest = false;
340                   cfgchanged = true;
341                   break;
342                 }
343             }
344
345           if (!candorest)
346             continue;
347
348           phi = single_non_singleton_phi_for_edges (phis, e1, e2);
349           if (!phi)
350             continue;
351
352           arg0 = gimple_phi_arg_def (phi, e1->dest_idx);
353           arg1 = gimple_phi_arg_def (phi, e2->dest_idx);
354
355           /* Something is wrong if we cannot find the arguments in the PHI
356              node.  */
357           gcc_assert (arg0 != NULL && arg1 != NULL);
358
359           /* Do the replacement of conditional if it can be done.  */
360           if (conditional_replacement (bb, bb1, e1, e2, phi, arg0, arg1))
361             cfgchanged = true;
362           else if (abs_replacement (bb, bb1, e1, e2, phi, arg0, arg1))
363             cfgchanged = true;
364           else if (minmax_replacement (bb, bb1, e1, e2, phi, arg0, arg1))
365             cfgchanged = true;
366         }
367     }
368
369   free (bb_order);
370
371   if (do_store_elim)
372     delete nontrap;
373   /* If the CFG has changed, we should cleanup the CFG.  */
374   if (cfgchanged && do_store_elim)
375     {
376       /* In cond-store replacement we have added some loads on edges
377          and new VOPS (as we moved the store, and created a load).  */
378       gsi_commit_edge_inserts ();
379       return TODO_cleanup_cfg | TODO_update_ssa_only_virtuals;
380     }
381   else if (cfgchanged)
382     return TODO_cleanup_cfg;
383   return 0;
384 }
385
386 /* Replace PHI node element whose edge is E in block BB with variable NEW.
387    Remove the edge from COND_BLOCK which does not lead to BB (COND_BLOCK
388    is known to have two edges, one of which must reach BB).  */
389
390 static void
391 replace_phi_edge_with_variable (basic_block cond_block,
392                                 edge e, gimple phi, tree new_tree)
393 {
394   basic_block bb = gimple_bb (phi);
395   basic_block block_to_remove;
396   gimple_stmt_iterator gsi;
397
398   /* Change the PHI argument to new.  */
399   SET_USE (PHI_ARG_DEF_PTR (phi, e->dest_idx), new_tree);
400
401   /* Remove the empty basic block.  */
402   if (EDGE_SUCC (cond_block, 0)->dest == bb)
403     {
404       EDGE_SUCC (cond_block, 0)->flags |= EDGE_FALLTHRU;
405       EDGE_SUCC (cond_block, 0)->flags &= ~(EDGE_TRUE_VALUE | EDGE_FALSE_VALUE);
406       EDGE_SUCC (cond_block, 0)->probability = REG_BR_PROB_BASE;
407       EDGE_SUCC (cond_block, 0)->count += EDGE_SUCC (cond_block, 1)->count;
408
409       block_to_remove = EDGE_SUCC (cond_block, 1)->dest;
410     }
411   else
412     {
413       EDGE_SUCC (cond_block, 1)->flags |= EDGE_FALLTHRU;
414       EDGE_SUCC (cond_block, 1)->flags
415         &= ~(EDGE_TRUE_VALUE | EDGE_FALSE_VALUE);
416       EDGE_SUCC (cond_block, 1)->probability = REG_BR_PROB_BASE;
417       EDGE_SUCC (cond_block, 1)->count += EDGE_SUCC (cond_block, 0)->count;
418
419       block_to_remove = EDGE_SUCC (cond_block, 0)->dest;
420     }
421   delete_basic_block (block_to_remove);
422
423   /* Eliminate the COND_EXPR at the end of COND_BLOCK.  */
424   gsi = gsi_last_bb (cond_block);
425   gsi_remove (&gsi, true);
426
427   if (dump_file && (dump_flags & TDF_DETAILS))
428     fprintf (dump_file,
429               "COND_EXPR in block %d and PHI in block %d converted to straightline code.\n",
430               cond_block->index,
431               bb->index);
432 }
433
434 /*  The function conditional_replacement does the main work of doing the
435     conditional replacement.  Return true if the replacement is done.
436     Otherwise return false.
437     BB is the basic block where the replacement is going to be done on.  ARG0
438     is argument 0 from PHI.  Likewise for ARG1.  */
439
440 static bool
441 conditional_replacement (basic_block cond_bb, basic_block middle_bb,
442                          edge e0, edge e1, gphi *phi,
443                          tree arg0, tree arg1)
444 {
445   tree result;
446   gimple stmt;
447   gassign *new_stmt;
448   tree cond;
449   gimple_stmt_iterator gsi;
450   edge true_edge, false_edge;
451   tree new_var, new_var2;
452   bool neg;
453
454   /* FIXME: Gimplification of complex type is too hard for now.  */
455   /* We aren't prepared to handle vectors either (and it is a question
456      if it would be worthwhile anyway).  */
457   if (!(INTEGRAL_TYPE_P (TREE_TYPE (arg0))
458         || POINTER_TYPE_P (TREE_TYPE (arg0)))
459       || !(INTEGRAL_TYPE_P (TREE_TYPE (arg1))
460            || POINTER_TYPE_P (TREE_TYPE (arg1))))
461     return false;
462
463   /* The PHI arguments have the constants 0 and 1, or 0 and -1, then
464      convert it to the conditional.  */
465   if ((integer_zerop (arg0) && integer_onep (arg1))
466       || (integer_zerop (arg1) && integer_onep (arg0)))
467     neg = false;
468   else if ((integer_zerop (arg0) && integer_all_onesp (arg1))
469            || (integer_zerop (arg1) && integer_all_onesp (arg0)))
470     neg = true;
471   else
472     return false;
473
474   if (!empty_block_p (middle_bb))
475     return false;
476
477   /* At this point we know we have a GIMPLE_COND with two successors.
478      One successor is BB, the other successor is an empty block which
479      falls through into BB.
480
481      There is a single PHI node at the join point (BB) and its arguments
482      are constants (0, 1) or (0, -1).
483
484      So, given the condition COND, and the two PHI arguments, we can
485      rewrite this PHI into non-branching code:
486
487        dest = (COND) or dest = COND'
488
489      We use the condition as-is if the argument associated with the
490      true edge has the value one or the argument associated with the
491      false edge as the value zero.  Note that those conditions are not
492      the same since only one of the outgoing edges from the GIMPLE_COND
493      will directly reach BB and thus be associated with an argument.  */
494
495   stmt = last_stmt (cond_bb);
496   result = PHI_RESULT (phi);
497
498   /* To handle special cases like floating point comparison, it is easier and
499      less error-prone to build a tree and gimplify it on the fly though it is
500      less efficient.  */
501   cond = fold_build2_loc (gimple_location (stmt),
502                           gimple_cond_code (stmt), boolean_type_node,
503                           gimple_cond_lhs (stmt), gimple_cond_rhs (stmt));
504
505   /* We need to know which is the true edge and which is the false
506      edge so that we know when to invert the condition below.  */
507   extract_true_false_edges_from_block (cond_bb, &true_edge, &false_edge);
508   if ((e0 == true_edge && integer_zerop (arg0))
509       || (e0 == false_edge && !integer_zerop (arg0))
510       || (e1 == true_edge && integer_zerop (arg1))
511       || (e1 == false_edge && !integer_zerop (arg1)))
512     cond = fold_build1_loc (gimple_location (stmt),
513                             TRUTH_NOT_EXPR, TREE_TYPE (cond), cond);
514
515   if (neg)
516     {
517       cond = fold_convert_loc (gimple_location (stmt),
518                                TREE_TYPE (result), cond);
519       cond = fold_build1_loc (gimple_location (stmt),
520                               NEGATE_EXPR, TREE_TYPE (cond), cond);
521     }
522
523   /* Insert our new statements at the end of conditional block before the
524      COND_STMT.  */
525   gsi = gsi_for_stmt (stmt);
526   new_var = force_gimple_operand_gsi (&gsi, cond, true, NULL, true,
527                                       GSI_SAME_STMT);
528
529   if (!useless_type_conversion_p (TREE_TYPE (result), TREE_TYPE (new_var)))
530     {
531       source_location locus_0, locus_1;
532
533       new_var2 = make_ssa_name (TREE_TYPE (result));
534       new_stmt = gimple_build_assign (new_var2, CONVERT_EXPR, new_var);
535       gsi_insert_before (&gsi, new_stmt, GSI_SAME_STMT);
536       new_var = new_var2;
537
538       /* Set the locus to the first argument, unless is doesn't have one.  */
539       locus_0 = gimple_phi_arg_location (phi, 0);
540       locus_1 = gimple_phi_arg_location (phi, 1);
541       if (locus_0 == UNKNOWN_LOCATION)
542         locus_0 = locus_1;
543       gimple_set_location (new_stmt, locus_0);
544     }
545
546   replace_phi_edge_with_variable (cond_bb, e1, phi, new_var);
547
548   /* Note that we optimized this PHI.  */
549   return true;
550 }
551
552 /* Update *ARG which is defined in STMT so that it contains the
553    computed value if that seems profitable.  Return true if the
554    statement is made dead by that rewriting.  */
555
556 static bool
557 jump_function_from_stmt (tree *arg, gimple stmt)
558 {
559   enum tree_code code = gimple_assign_rhs_code (stmt);
560   if (code == ADDR_EXPR)
561     {
562       /* For arg = &p->i transform it to p, if possible.  */
563       tree rhs1 = gimple_assign_rhs1 (stmt);
564       HOST_WIDE_INT offset;
565       tree tem = get_addr_base_and_unit_offset (TREE_OPERAND (rhs1, 0),
566                                                 &offset);
567       if (tem
568           && TREE_CODE (tem) == MEM_REF
569           && (mem_ref_offset (tem) + offset) == 0)
570         {
571           *arg = TREE_OPERAND (tem, 0);
572           return true;
573         }
574     }
575   /* TODO: Much like IPA-CP jump-functions we want to handle constant
576      additions symbolically here, and we'd need to update the comparison
577      code that compares the arg + cst tuples in our caller.  For now the
578      code above exactly handles the VEC_BASE pattern from vec.h.  */
579   return false;
580 }
581
582 /* RHS is a source argument in a BIT_AND_EXPR which feeds a conditional
583    of the form SSA_NAME NE 0.
584
585    If RHS is fed by a simple EQ_EXPR comparison of two values, see if
586    the two input values of the EQ_EXPR match arg0 and arg1.
587
588    If so update *code and return TRUE.  Otherwise return FALSE.  */
589
590 static bool
591 rhs_is_fed_for_value_replacement (const_tree arg0, const_tree arg1,
592                                   enum tree_code *code, const_tree rhs)
593 {
594   /* Obviously if RHS is not an SSA_NAME, we can't look at the defining
595      statement.  */
596   if (TREE_CODE (rhs) == SSA_NAME)
597     {
598       gimple def1 = SSA_NAME_DEF_STMT (rhs);
599
600       /* Verify the defining statement has an EQ_EXPR on the RHS.  */
601       if (is_gimple_assign (def1) && gimple_assign_rhs_code (def1) == EQ_EXPR)
602         {
603           /* Finally verify the source operands of the EQ_EXPR are equal
604              to arg0 and arg1.  */
605           tree op0 = gimple_assign_rhs1 (def1);
606           tree op1 = gimple_assign_rhs2 (def1);
607           if ((operand_equal_for_phi_arg_p (arg0, op0)
608                && operand_equal_for_phi_arg_p (arg1, op1))
609               || (operand_equal_for_phi_arg_p (arg0, op1)
610                && operand_equal_for_phi_arg_p (arg1, op0)))
611             {
612               /* We will perform the optimization.  */
613               *code = gimple_assign_rhs_code (def1);
614               return true;
615             }
616         }
617     }
618   return false;
619 }
620
621 /* Return TRUE if arg0/arg1 are equal to the rhs/lhs or lhs/rhs of COND. 
622
623    Also return TRUE if arg0/arg1 are equal to the source arguments of a
624    an EQ comparison feeding a BIT_AND_EXPR which feeds COND. 
625
626    Return FALSE otherwise.  */
627
628 static bool
629 operand_equal_for_value_replacement (const_tree arg0, const_tree arg1,
630                                      enum tree_code *code, gimple cond)
631 {
632   gimple def;
633   tree lhs = gimple_cond_lhs (cond);
634   tree rhs = gimple_cond_rhs (cond);
635
636   if ((operand_equal_for_phi_arg_p (arg0, lhs)
637        && operand_equal_for_phi_arg_p (arg1, rhs))
638       || (operand_equal_for_phi_arg_p (arg1, lhs)
639           && operand_equal_for_phi_arg_p (arg0, rhs)))
640     return true;
641
642   /* Now handle more complex case where we have an EQ comparison
643      which feeds a BIT_AND_EXPR which feeds COND.
644
645      First verify that COND is of the form SSA_NAME NE 0.  */
646   if (*code != NE_EXPR || !integer_zerop (rhs)
647       || TREE_CODE (lhs) != SSA_NAME)
648     return false;
649
650   /* Now ensure that SSA_NAME is set by a BIT_AND_EXPR.  */
651   def = SSA_NAME_DEF_STMT (lhs);
652   if (!is_gimple_assign (def) || gimple_assign_rhs_code (def) != BIT_AND_EXPR)
653     return false;
654
655   /* Now verify arg0/arg1 correspond to the source arguments of an 
656      EQ comparison feeding the BIT_AND_EXPR.  */
657      
658   tree tmp = gimple_assign_rhs1 (def);
659   if (rhs_is_fed_for_value_replacement (arg0, arg1, code, tmp))
660     return true;
661
662   tmp = gimple_assign_rhs2 (def);
663   if (rhs_is_fed_for_value_replacement (arg0, arg1, code, tmp))
664     return true;
665
666   return false;
667 }
668
669 /* Returns true if ARG is a neutral element for operation CODE
670    on the RIGHT side.  */
671
672 static bool
673 neutral_element_p (tree_code code, tree arg, bool right)
674 {
675   switch (code)
676     {
677     case PLUS_EXPR:
678     case BIT_IOR_EXPR:
679     case BIT_XOR_EXPR:
680       return integer_zerop (arg);
681
682     case LROTATE_EXPR:
683     case RROTATE_EXPR:
684     case LSHIFT_EXPR:
685     case RSHIFT_EXPR:
686     case MINUS_EXPR:
687     case POINTER_PLUS_EXPR:
688       return right && integer_zerop (arg);
689
690     case MULT_EXPR:
691       return integer_onep (arg);
692
693     case TRUNC_DIV_EXPR:
694     case CEIL_DIV_EXPR:
695     case FLOOR_DIV_EXPR:
696     case ROUND_DIV_EXPR:
697     case EXACT_DIV_EXPR:
698       return right && integer_onep (arg);
699
700     case BIT_AND_EXPR:
701       return integer_all_onesp (arg);
702
703     default:
704       return false;
705     }
706 }
707
708 /* Returns true if ARG is an absorbing element for operation CODE.  */
709
710 static bool
711 absorbing_element_p (tree_code code, tree arg)
712 {
713   switch (code)
714     {
715     case BIT_IOR_EXPR:
716       return integer_all_onesp (arg);
717
718     case MULT_EXPR:
719     case BIT_AND_EXPR:
720       return integer_zerop (arg);
721
722     default:
723       return false;
724     }
725 }
726
727 /*  The function value_replacement does the main work of doing the value
728     replacement.  Return non-zero if the replacement is done.  Otherwise return
729     0.  If we remove the middle basic block, return 2.
730     BB is the basic block where the replacement is going to be done on.  ARG0
731     is argument 0 from the PHI.  Likewise for ARG1.  */
732
733 static int
734 value_replacement (basic_block cond_bb, basic_block middle_bb,
735                    edge e0, edge e1, gimple phi,
736                    tree arg0, tree arg1)
737 {
738   gimple_stmt_iterator gsi;
739   gimple cond;
740   edge true_edge, false_edge;
741   enum tree_code code;
742   bool emtpy_or_with_defined_p = true;
743
744   /* If the type says honor signed zeros we cannot do this
745      optimization.  */
746   if (HONOR_SIGNED_ZEROS (arg1))
747     return 0;
748
749   /* If there is a statement in MIDDLE_BB that defines one of the PHI
750      arguments, then adjust arg0 or arg1.  */
751   gsi = gsi_start_nondebug_after_labels_bb (middle_bb);
752   while (!gsi_end_p (gsi))
753     {
754       gimple stmt = gsi_stmt (gsi);
755       tree lhs;
756       gsi_next_nondebug (&gsi);
757       if (!is_gimple_assign (stmt))
758         {
759           emtpy_or_with_defined_p = false;
760           continue;
761         }
762       /* Now try to adjust arg0 or arg1 according to the computation
763          in the statement.  */
764       lhs = gimple_assign_lhs (stmt);
765       if (!(lhs == arg0
766              && jump_function_from_stmt (&arg0, stmt))
767             || (lhs == arg1
768                 && jump_function_from_stmt (&arg1, stmt)))
769         emtpy_or_with_defined_p = false;
770     }
771
772   cond = last_stmt (cond_bb);
773   code = gimple_cond_code (cond);
774
775   /* This transformation is only valid for equality comparisons.  */
776   if (code != NE_EXPR && code != EQ_EXPR)
777     return 0;
778
779   /* We need to know which is the true edge and which is the false
780       edge so that we know if have abs or negative abs.  */
781   extract_true_false_edges_from_block (cond_bb, &true_edge, &false_edge);
782
783   /* At this point we know we have a COND_EXPR with two successors.
784      One successor is BB, the other successor is an empty block which
785      falls through into BB.
786
787      The condition for the COND_EXPR is known to be NE_EXPR or EQ_EXPR.
788
789      There is a single PHI node at the join point (BB) with two arguments.
790
791      We now need to verify that the two arguments in the PHI node match
792      the two arguments to the equality comparison.  */
793
794   if (operand_equal_for_value_replacement (arg0, arg1, &code, cond))
795     {
796       edge e;
797       tree arg;
798
799       /* For NE_EXPR, we want to build an assignment result = arg where
800          arg is the PHI argument associated with the true edge.  For
801          EQ_EXPR we want the PHI argument associated with the false edge.  */
802       e = (code == NE_EXPR ? true_edge : false_edge);
803
804       /* Unfortunately, E may not reach BB (it may instead have gone to
805          OTHER_BLOCK).  If that is the case, then we want the single outgoing
806          edge from OTHER_BLOCK which reaches BB and represents the desired
807          path from COND_BLOCK.  */
808       if (e->dest == middle_bb)
809         e = single_succ_edge (e->dest);
810
811       /* Now we know the incoming edge to BB that has the argument for the
812          RHS of our new assignment statement.  */
813       if (e0 == e)
814         arg = arg0;
815       else
816         arg = arg1;
817
818       /* If the middle basic block was empty or is defining the
819          PHI arguments and this is a single phi where the args are different
820          for the edges e0 and e1 then we can remove the middle basic block. */
821       if (emtpy_or_with_defined_p
822           && single_non_singleton_phi_for_edges (phi_nodes (gimple_bb (phi)),
823                                                  e0, e1) == phi)
824         {
825           replace_phi_edge_with_variable (cond_bb, e1, phi, arg);
826           /* Note that we optimized this PHI.  */
827           return 2;
828         }
829       else
830         {
831           /* Replace the PHI arguments with arg. */
832           SET_PHI_ARG_DEF (phi, e0->dest_idx, arg);
833           SET_PHI_ARG_DEF (phi, e1->dest_idx, arg);
834           if (dump_file && (dump_flags & TDF_DETAILS))
835             {
836               fprintf (dump_file, "PHI ");
837               print_generic_expr (dump_file, gimple_phi_result (phi), 0);
838               fprintf (dump_file, " reduced for COND_EXPR in block %d to ",
839                        cond_bb->index);
840               print_generic_expr (dump_file, arg, 0);
841               fprintf (dump_file, ".\n");
842             }
843           return 1;
844         }
845
846     }
847
848   /* Now optimize (x != 0) ? x + y : y to just y.
849      The following condition is too restrictive, there can easily be another
850      stmt in middle_bb, for instance a CONVERT_EXPR for the second argument.  */
851   gimple assign = last_and_only_stmt (middle_bb);
852   if (!assign || gimple_code (assign) != GIMPLE_ASSIGN
853       || gimple_assign_rhs_class (assign) != GIMPLE_BINARY_RHS
854       || (!INTEGRAL_TYPE_P (TREE_TYPE (arg0))
855           && !POINTER_TYPE_P (TREE_TYPE (arg0))))
856     return 0;
857
858   /* Punt if there are (degenerate) PHIs in middle_bb, there should not be.  */
859   if (!gimple_seq_empty_p (phi_nodes (middle_bb)))
860     return 0;
861
862   /* Only transform if it removes the condition.  */
863   if (!single_non_singleton_phi_for_edges (phi_nodes (gimple_bb (phi)), e0, e1))
864     return 0;
865
866   /* Size-wise, this is always profitable.  */
867   if (optimize_bb_for_speed_p (cond_bb)
868       /* The special case is useless if it has a low probability.  */
869       && profile_status_for_fn (cfun) != PROFILE_ABSENT
870       && EDGE_PRED (middle_bb, 0)->probability < PROB_EVEN
871       /* If assign is cheap, there is no point avoiding it.  */
872       && estimate_num_insns (assign, &eni_time_weights)
873          >= 3 * estimate_num_insns (cond, &eni_time_weights))
874     return 0;
875
876   tree lhs = gimple_assign_lhs (assign);
877   tree rhs1 = gimple_assign_rhs1 (assign);
878   tree rhs2 = gimple_assign_rhs2 (assign);
879   enum tree_code code_def = gimple_assign_rhs_code (assign);
880   tree cond_lhs = gimple_cond_lhs (cond);
881   tree cond_rhs = gimple_cond_rhs (cond);
882
883   if (((code == NE_EXPR && e1 == false_edge)
884         || (code == EQ_EXPR && e1 == true_edge))
885       && arg0 == lhs
886       && ((arg1 == rhs1
887            && operand_equal_for_phi_arg_p (rhs2, cond_lhs)
888            && neutral_element_p (code_def, cond_rhs, true))
889           || (arg1 == rhs2
890               && operand_equal_for_phi_arg_p (rhs1, cond_lhs)
891               && neutral_element_p (code_def, cond_rhs, false))
892           || (operand_equal_for_phi_arg_p (arg1, cond_rhs)
893               && (operand_equal_for_phi_arg_p (rhs2, cond_lhs)
894                   || operand_equal_for_phi_arg_p (rhs1, cond_lhs))
895               && absorbing_element_p (code_def, cond_rhs))))
896     {
897       gsi = gsi_for_stmt (cond);
898       if (INTEGRAL_TYPE_P (TREE_TYPE (lhs)))
899         {
900           /* Moving ASSIGN might change VR of lhs, e.g. when moving u_6
901              def-stmt in:
902              if (n_5 != 0)
903                goto <bb 3>;
904              else
905                goto <bb 4>;
906
907              <bb 3>:
908              # RANGE [0, 4294967294]
909              u_6 = n_5 + 4294967295;
910
911              <bb 4>:
912              # u_3 = PHI <u_6(3), 4294967295(2)>  */
913           SSA_NAME_RANGE_INFO (lhs) = NULL;
914           SSA_NAME_ANTI_RANGE_P (lhs) = 0;
915           /* If available, we can use VR of phi result at least.  */
916           tree phires = gimple_phi_result (phi);
917           struct range_info_def *phires_range_info
918             = SSA_NAME_RANGE_INFO (phires);
919           if (phires_range_info)
920             duplicate_ssa_name_range_info (lhs, SSA_NAME_RANGE_TYPE (phires),
921                                            phires_range_info);
922         }
923       gimple_stmt_iterator gsi_from = gsi_for_stmt (assign);
924       gsi_move_before (&gsi_from, &gsi);
925       replace_phi_edge_with_variable (cond_bb, e1, phi, lhs);
926       return 2;
927     }
928
929   return 0;
930 }
931
932 /*  The function minmax_replacement does the main work of doing the minmax
933     replacement.  Return true if the replacement is done.  Otherwise return
934     false.
935     BB is the basic block where the replacement is going to be done on.  ARG0
936     is argument 0 from the PHI.  Likewise for ARG1.  */
937
938 static bool
939 minmax_replacement (basic_block cond_bb, basic_block middle_bb,
940                     edge e0, edge e1, gimple phi,
941                     tree arg0, tree arg1)
942 {
943   tree result, type;
944   gcond *cond;
945   gassign *new_stmt;
946   edge true_edge, false_edge;
947   enum tree_code cmp, minmax, ass_code;
948   tree smaller, larger, arg_true, arg_false;
949   gimple_stmt_iterator gsi, gsi_from;
950
951   type = TREE_TYPE (PHI_RESULT (phi));
952
953   /* The optimization may be unsafe due to NaNs.  */
954   if (HONOR_NANS (type))
955     return false;
956
957   cond = as_a <gcond *> (last_stmt (cond_bb));
958   cmp = gimple_cond_code (cond);
959
960   /* This transformation is only valid for order comparisons.  Record which
961      operand is smaller/larger if the result of the comparison is true.  */
962   if (cmp == LT_EXPR || cmp == LE_EXPR)
963     {
964       smaller = gimple_cond_lhs (cond);
965       larger = gimple_cond_rhs (cond);
966     }
967   else if (cmp == GT_EXPR || cmp == GE_EXPR)
968     {
969       smaller = gimple_cond_rhs (cond);
970       larger = gimple_cond_lhs (cond);
971     }
972   else
973     return false;
974
975   /* We need to know which is the true edge and which is the false
976       edge so that we know if have abs or negative abs.  */
977   extract_true_false_edges_from_block (cond_bb, &true_edge, &false_edge);
978
979   /* Forward the edges over the middle basic block.  */
980   if (true_edge->dest == middle_bb)
981     true_edge = EDGE_SUCC (true_edge->dest, 0);
982   if (false_edge->dest == middle_bb)
983     false_edge = EDGE_SUCC (false_edge->dest, 0);
984
985   if (true_edge == e0)
986     {
987       gcc_assert (false_edge == e1);
988       arg_true = arg0;
989       arg_false = arg1;
990     }
991   else
992     {
993       gcc_assert (false_edge == e0);
994       gcc_assert (true_edge == e1);
995       arg_true = arg1;
996       arg_false = arg0;
997     }
998
999   if (empty_block_p (middle_bb))
1000     {
1001       if (operand_equal_for_phi_arg_p (arg_true, smaller)
1002           && operand_equal_for_phi_arg_p (arg_false, larger))
1003         {
1004           /* Case
1005
1006              if (smaller < larger)
1007              rslt = smaller;
1008              else
1009              rslt = larger;  */
1010           minmax = MIN_EXPR;
1011         }
1012       else if (operand_equal_for_phi_arg_p (arg_false, smaller)
1013                && operand_equal_for_phi_arg_p (arg_true, larger))
1014         minmax = MAX_EXPR;
1015       else
1016         return false;
1017     }
1018   else
1019     {
1020       /* Recognize the following case, assuming d <= u:
1021
1022          if (a <= u)
1023            b = MAX (a, d);
1024          x = PHI <b, u>
1025
1026          This is equivalent to
1027
1028          b = MAX (a, d);
1029          x = MIN (b, u);  */
1030
1031       gimple assign = last_and_only_stmt (middle_bb);
1032       tree lhs, op0, op1, bound;
1033
1034       if (!assign
1035           || gimple_code (assign) != GIMPLE_ASSIGN)
1036         return false;
1037
1038       lhs = gimple_assign_lhs (assign);
1039       ass_code = gimple_assign_rhs_code (assign);
1040       if (ass_code != MAX_EXPR && ass_code != MIN_EXPR)
1041         return false;
1042       op0 = gimple_assign_rhs1 (assign);
1043       op1 = gimple_assign_rhs2 (assign);
1044
1045       if (true_edge->src == middle_bb)
1046         {
1047           /* We got here if the condition is true, i.e., SMALLER < LARGER.  */
1048           if (!operand_equal_for_phi_arg_p (lhs, arg_true))
1049             return false;
1050
1051           if (operand_equal_for_phi_arg_p (arg_false, larger))
1052             {
1053               /* Case
1054
1055                  if (smaller < larger)
1056                    {
1057                      r' = MAX_EXPR (smaller, bound)
1058                    }
1059                  r = PHI <r', larger>  --> to be turned to MIN_EXPR.  */
1060               if (ass_code != MAX_EXPR)
1061                 return false;
1062
1063               minmax = MIN_EXPR;
1064               if (operand_equal_for_phi_arg_p (op0, smaller))
1065                 bound = op1;
1066               else if (operand_equal_for_phi_arg_p (op1, smaller))
1067                 bound = op0;
1068               else
1069                 return false;
1070
1071               /* We need BOUND <= LARGER.  */
1072               if (!integer_nonzerop (fold_build2 (LE_EXPR, boolean_type_node,
1073                                                   bound, larger)))
1074                 return false;
1075             }
1076           else if (operand_equal_for_phi_arg_p (arg_false, smaller))
1077             {
1078               /* Case
1079
1080                  if (smaller < larger)
1081                    {
1082                      r' = MIN_EXPR (larger, bound)
1083                    }
1084                  r = PHI <r', smaller>  --> to be turned to MAX_EXPR.  */
1085               if (ass_code != MIN_EXPR)
1086                 return false;
1087
1088               minmax = MAX_EXPR;
1089               if (operand_equal_for_phi_arg_p (op0, larger))
1090                 bound = op1;
1091               else if (operand_equal_for_phi_arg_p (op1, larger))
1092                 bound = op0;
1093               else
1094                 return false;
1095
1096               /* We need BOUND >= SMALLER.  */
1097               if (!integer_nonzerop (fold_build2 (GE_EXPR, boolean_type_node,
1098                                                   bound, smaller)))
1099                 return false;
1100             }
1101           else
1102             return false;
1103         }
1104       else
1105         {
1106           /* We got here if the condition is false, i.e., SMALLER > LARGER.  */
1107           if (!operand_equal_for_phi_arg_p (lhs, arg_false))
1108             return false;
1109
1110           if (operand_equal_for_phi_arg_p (arg_true, larger))
1111             {
1112               /* Case
1113
1114                  if (smaller > larger)
1115                    {
1116                      r' = MIN_EXPR (smaller, bound)
1117                    }
1118                  r = PHI <r', larger>  --> to be turned to MAX_EXPR.  */
1119               if (ass_code != MIN_EXPR)
1120                 return false;
1121
1122               minmax = MAX_EXPR;
1123               if (operand_equal_for_phi_arg_p (op0, smaller))
1124                 bound = op1;
1125               else if (operand_equal_for_phi_arg_p (op1, smaller))
1126                 bound = op0;
1127               else
1128                 return false;
1129
1130               /* We need BOUND >= LARGER.  */
1131               if (!integer_nonzerop (fold_build2 (GE_EXPR, boolean_type_node,
1132                                                   bound, larger)))
1133                 return false;
1134             }
1135           else if (operand_equal_for_phi_arg_p (arg_true, smaller))
1136             {
1137               /* Case
1138
1139                  if (smaller > larger)
1140                    {
1141                      r' = MAX_EXPR (larger, bound)
1142                    }
1143                  r = PHI <r', smaller>  --> to be turned to MIN_EXPR.  */
1144               if (ass_code != MAX_EXPR)
1145                 return false;
1146
1147               minmax = MIN_EXPR;
1148               if (operand_equal_for_phi_arg_p (op0, larger))
1149                 bound = op1;
1150               else if (operand_equal_for_phi_arg_p (op1, larger))
1151                 bound = op0;
1152               else
1153                 return false;
1154
1155               /* We need BOUND <= SMALLER.  */
1156               if (!integer_nonzerop (fold_build2 (LE_EXPR, boolean_type_node,
1157                                                   bound, smaller)))
1158                 return false;
1159             }
1160           else
1161             return false;
1162         }
1163
1164       /* Move the statement from the middle block.  */
1165       gsi = gsi_last_bb (cond_bb);
1166       gsi_from = gsi_last_nondebug_bb (middle_bb);
1167       gsi_move_before (&gsi_from, &gsi);
1168     }
1169
1170   /* Emit the statement to compute min/max.  */
1171   result = duplicate_ssa_name (PHI_RESULT (phi), NULL);
1172   new_stmt = gimple_build_assign (result, minmax, arg0, arg1);
1173   gsi = gsi_last_bb (cond_bb);
1174   gsi_insert_before (&gsi, new_stmt, GSI_NEW_STMT);
1175
1176   replace_phi_edge_with_variable (cond_bb, e1, phi, result);
1177   return true;
1178 }
1179
1180 /*  The function absolute_replacement does the main work of doing the absolute
1181     replacement.  Return true if the replacement is done.  Otherwise return
1182     false.
1183     bb is the basic block where the replacement is going to be done on.  arg0
1184     is argument 0 from the phi.  Likewise for arg1.  */
1185
1186 static bool
1187 abs_replacement (basic_block cond_bb, basic_block middle_bb,
1188                  edge e0 ATTRIBUTE_UNUSED, edge e1,
1189                  gimple phi, tree arg0, tree arg1)
1190 {
1191   tree result;
1192   gassign *new_stmt;
1193   gimple cond;
1194   gimple_stmt_iterator gsi;
1195   edge true_edge, false_edge;
1196   gimple assign;
1197   edge e;
1198   tree rhs, lhs;
1199   bool negate;
1200   enum tree_code cond_code;
1201
1202   /* If the type says honor signed zeros we cannot do this
1203      optimization.  */
1204   if (HONOR_SIGNED_ZEROS (arg1))
1205     return false;
1206
1207   /* OTHER_BLOCK must have only one executable statement which must have the
1208      form arg0 = -arg1 or arg1 = -arg0.  */
1209
1210   assign = last_and_only_stmt (middle_bb);
1211   /* If we did not find the proper negation assignment, then we can not
1212      optimize.  */
1213   if (assign == NULL)
1214     return false;
1215
1216   /* If we got here, then we have found the only executable statement
1217      in OTHER_BLOCK.  If it is anything other than arg = -arg1 or
1218      arg1 = -arg0, then we can not optimize.  */
1219   if (gimple_code (assign) != GIMPLE_ASSIGN)
1220     return false;
1221
1222   lhs = gimple_assign_lhs (assign);
1223
1224   if (gimple_assign_rhs_code (assign) != NEGATE_EXPR)
1225     return false;
1226
1227   rhs = gimple_assign_rhs1 (assign);
1228
1229   /* The assignment has to be arg0 = -arg1 or arg1 = -arg0.  */
1230   if (!(lhs == arg0 && rhs == arg1)
1231       && !(lhs == arg1 && rhs == arg0))
1232     return false;
1233
1234   cond = last_stmt (cond_bb);
1235   result = PHI_RESULT (phi);
1236
1237   /* Only relationals comparing arg[01] against zero are interesting.  */
1238   cond_code = gimple_cond_code (cond);
1239   if (cond_code != GT_EXPR && cond_code != GE_EXPR
1240       && cond_code != LT_EXPR && cond_code != LE_EXPR)
1241     return false;
1242
1243   /* Make sure the conditional is arg[01] OP y.  */
1244   if (gimple_cond_lhs (cond) != rhs)
1245     return false;
1246
1247   if (FLOAT_TYPE_P (TREE_TYPE (gimple_cond_rhs (cond)))
1248                ? real_zerop (gimple_cond_rhs (cond))
1249                : integer_zerop (gimple_cond_rhs (cond)))
1250     ;
1251   else
1252     return false;
1253
1254   /* We need to know which is the true edge and which is the false
1255      edge so that we know if have abs or negative abs.  */
1256   extract_true_false_edges_from_block (cond_bb, &true_edge, &false_edge);
1257
1258   /* For GT_EXPR/GE_EXPR, if the true edge goes to OTHER_BLOCK, then we
1259      will need to negate the result.  Similarly for LT_EXPR/LE_EXPR if
1260      the false edge goes to OTHER_BLOCK.  */
1261   if (cond_code == GT_EXPR || cond_code == GE_EXPR)
1262     e = true_edge;
1263   else
1264     e = false_edge;
1265
1266   if (e->dest == middle_bb)
1267     negate = true;
1268   else
1269     negate = false;
1270
1271   result = duplicate_ssa_name (result, NULL);
1272
1273   if (negate)
1274     lhs = make_ssa_name (TREE_TYPE (result));
1275   else
1276     lhs = result;
1277
1278   /* Build the modify expression with abs expression.  */
1279   new_stmt = gimple_build_assign (lhs, ABS_EXPR, rhs);
1280
1281   gsi = gsi_last_bb (cond_bb);
1282   gsi_insert_before (&gsi, new_stmt, GSI_NEW_STMT);
1283
1284   if (negate)
1285     {
1286       /* Get the right GSI.  We want to insert after the recently
1287          added ABS_EXPR statement (which we know is the first statement
1288          in the block.  */
1289       new_stmt = gimple_build_assign (result, NEGATE_EXPR, lhs);
1290
1291       gsi_insert_after (&gsi, new_stmt, GSI_NEW_STMT);
1292     }
1293
1294   replace_phi_edge_with_variable (cond_bb, e1, phi, result);
1295
1296   /* Note that we optimized this PHI.  */
1297   return true;
1298 }
1299
1300 /* Auxiliary functions to determine the set of memory accesses which
1301    can't trap because they are preceded by accesses to the same memory
1302    portion.  We do that for MEM_REFs, so we only need to track
1303    the SSA_NAME of the pointer indirectly referenced.  The algorithm
1304    simply is a walk over all instructions in dominator order.  When
1305    we see an MEM_REF we determine if we've already seen a same
1306    ref anywhere up to the root of the dominator tree.  If we do the
1307    current access can't trap.  If we don't see any dominating access
1308    the current access might trap, but might also make later accesses
1309    non-trapping, so we remember it.  We need to be careful with loads
1310    or stores, for instance a load might not trap, while a store would,
1311    so if we see a dominating read access this doesn't mean that a later
1312    write access would not trap.  Hence we also need to differentiate the
1313    type of access(es) seen.
1314
1315    ??? We currently are very conservative and assume that a load might
1316    trap even if a store doesn't (write-only memory).  This probably is
1317    overly conservative.  */
1318
1319 /* A hash-table of SSA_NAMEs, and in which basic block an MEM_REF
1320    through it was seen, which would constitute a no-trap region for
1321    same accesses.  */
1322 struct name_to_bb
1323 {
1324   unsigned int ssa_name_ver;
1325   unsigned int phase;
1326   bool store;
1327   HOST_WIDE_INT offset, size;
1328   basic_block bb;
1329 };
1330
1331 /* Hashtable helpers.  */
1332
1333 struct ssa_names_hasher : typed_free_remove <name_to_bb>
1334 {
1335   typedef name_to_bb value_type;
1336   typedef name_to_bb compare_type;
1337   static inline hashval_t hash (const value_type *);
1338   static inline bool equal (const value_type *, const compare_type *);
1339 };
1340
1341 /* Used for quick clearing of the hash-table when we see calls.
1342    Hash entries with phase < nt_call_phase are invalid.  */
1343 static unsigned int nt_call_phase;
1344
1345 /* The hash function.  */
1346
1347 inline hashval_t
1348 ssa_names_hasher::hash (const value_type *n)
1349 {
1350   return n->ssa_name_ver ^ (((hashval_t) n->store) << 31)
1351          ^ (n->offset << 6) ^ (n->size << 3);
1352 }
1353
1354 /* The equality function of *P1 and *P2.  */
1355
1356 inline bool
1357 ssa_names_hasher::equal (const value_type *n1, const compare_type *n2)
1358 {
1359   return n1->ssa_name_ver == n2->ssa_name_ver
1360          && n1->store == n2->store
1361          && n1->offset == n2->offset
1362          && n1->size == n2->size;
1363 }
1364
1365 class nontrapping_dom_walker : public dom_walker
1366 {
1367 public:
1368   nontrapping_dom_walker (cdi_direction direction, hash_set<tree> *ps)
1369     : dom_walker (direction), m_nontrapping (ps), m_seen_ssa_names (128) {}
1370
1371   virtual void before_dom_children (basic_block);
1372   virtual void after_dom_children (basic_block);
1373
1374 private:
1375
1376   /* We see the expression EXP in basic block BB.  If it's an interesting
1377      expression (an MEM_REF through an SSA_NAME) possibly insert the
1378      expression into the set NONTRAP or the hash table of seen expressions.
1379      STORE is true if this expression is on the LHS, otherwise it's on
1380      the RHS.  */
1381   void add_or_mark_expr (basic_block, tree, bool);
1382
1383   hash_set<tree> *m_nontrapping;
1384
1385   /* The hash table for remembering what we've seen.  */
1386   hash_table<ssa_names_hasher> m_seen_ssa_names;
1387 };
1388
1389 /* Called by walk_dominator_tree, when entering the block BB.  */
1390 void
1391 nontrapping_dom_walker::before_dom_children (basic_block bb)
1392 {
1393   edge e;
1394   edge_iterator ei;
1395   gimple_stmt_iterator gsi;
1396
1397   /* If we haven't seen all our predecessors, clear the hash-table.  */
1398   FOR_EACH_EDGE (e, ei, bb->preds)
1399     if ((((size_t)e->src->aux) & 2) == 0)
1400       {
1401         nt_call_phase++;
1402         break;
1403       }
1404
1405   /* Mark this BB as being on the path to dominator root and as visited.  */
1406   bb->aux = (void*)(1 | 2);
1407
1408   /* And walk the statements in order.  */
1409   for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1410     {
1411       gimple stmt = gsi_stmt (gsi);
1412
1413       if (is_gimple_call (stmt) && !nonfreeing_call_p (stmt))
1414         nt_call_phase++;
1415       else if (gimple_assign_single_p (stmt) && !gimple_has_volatile_ops (stmt))
1416         {
1417           add_or_mark_expr (bb, gimple_assign_lhs (stmt), true);
1418           add_or_mark_expr (bb, gimple_assign_rhs1 (stmt), false);
1419         }
1420     }
1421 }
1422
1423 /* Called by walk_dominator_tree, when basic block BB is exited.  */
1424 void
1425 nontrapping_dom_walker::after_dom_children (basic_block bb)
1426 {
1427   /* This BB isn't on the path to dominator root anymore.  */
1428   bb->aux = (void*)2;
1429 }
1430
1431 /* We see the expression EXP in basic block BB.  If it's an interesting
1432    expression (an MEM_REF through an SSA_NAME) possibly insert the
1433    expression into the set NONTRAP or the hash table of seen expressions.
1434    STORE is true if this expression is on the LHS, otherwise it's on
1435    the RHS.  */
1436 void
1437 nontrapping_dom_walker::add_or_mark_expr (basic_block bb, tree exp, bool store)
1438 {
1439   HOST_WIDE_INT size;
1440
1441   if (TREE_CODE (exp) == MEM_REF
1442       && TREE_CODE (TREE_OPERAND (exp, 0)) == SSA_NAME
1443       && tree_fits_shwi_p (TREE_OPERAND (exp, 1))
1444       && (size = int_size_in_bytes (TREE_TYPE (exp))) > 0)
1445     {
1446       tree name = TREE_OPERAND (exp, 0);
1447       struct name_to_bb map;
1448       name_to_bb **slot;
1449       struct name_to_bb *n2bb;
1450       basic_block found_bb = 0;
1451
1452       /* Try to find the last seen MEM_REF through the same
1453          SSA_NAME, which can trap.  */
1454       map.ssa_name_ver = SSA_NAME_VERSION (name);
1455       map.phase = 0;
1456       map.bb = 0;
1457       map.store = store;
1458       map.offset = tree_to_shwi (TREE_OPERAND (exp, 1));
1459       map.size = size;
1460
1461       slot = m_seen_ssa_names.find_slot (&map, INSERT);
1462       n2bb = *slot;
1463       if (n2bb && n2bb->phase >= nt_call_phase)
1464         found_bb = n2bb->bb;
1465
1466       /* If we've found a trapping MEM_REF, _and_ it dominates EXP
1467          (it's in a basic block on the path from us to the dominator root)
1468          then we can't trap.  */
1469       if (found_bb && (((size_t)found_bb->aux) & 1) == 1)
1470         {
1471           m_nontrapping->add (exp);
1472         }
1473       else
1474         {
1475           /* EXP might trap, so insert it into the hash table.  */
1476           if (n2bb)
1477             {
1478               n2bb->phase = nt_call_phase;
1479               n2bb->bb = bb;
1480             }
1481           else
1482             {
1483               n2bb = XNEW (struct name_to_bb);
1484               n2bb->ssa_name_ver = SSA_NAME_VERSION (name);
1485               n2bb->phase = nt_call_phase;
1486               n2bb->bb = bb;
1487               n2bb->store = store;
1488               n2bb->offset = map.offset;
1489               n2bb->size = size;
1490               *slot = n2bb;
1491             }
1492         }
1493     }
1494 }
1495
1496 /* This is the entry point of gathering non trapping memory accesses.
1497    It will do a dominator walk over the whole function, and it will
1498    make use of the bb->aux pointers.  It returns a set of trees
1499    (the MEM_REFs itself) which can't trap.  */
1500 static hash_set<tree> *
1501 get_non_trapping (void)
1502 {
1503   nt_call_phase = 0;
1504   hash_set<tree> *nontrap = new hash_set<tree>;
1505   /* We're going to do a dominator walk, so ensure that we have
1506      dominance information.  */
1507   calculate_dominance_info (CDI_DOMINATORS);
1508
1509   nontrapping_dom_walker (CDI_DOMINATORS, nontrap)
1510     .walk (cfun->cfg->x_entry_block_ptr);
1511
1512   clear_aux_for_blocks ();
1513   return nontrap;
1514 }
1515
1516 /* Do the main work of conditional store replacement.  We already know
1517    that the recognized pattern looks like so:
1518
1519    split:
1520      if (cond) goto MIDDLE_BB; else goto JOIN_BB (edge E1)
1521    MIDDLE_BB:
1522      something
1523      fallthrough (edge E0)
1524    JOIN_BB:
1525      some more
1526
1527    We check that MIDDLE_BB contains only one store, that that store
1528    doesn't trap (not via NOTRAP, but via checking if an access to the same
1529    memory location dominates us) and that the store has a "simple" RHS.  */
1530
1531 static bool
1532 cond_store_replacement (basic_block middle_bb, basic_block join_bb,
1533                         edge e0, edge e1, hash_set<tree> *nontrap)
1534 {
1535   gimple assign = last_and_only_stmt (middle_bb);
1536   tree lhs, rhs, name, name2;
1537   gphi *newphi;
1538   gassign *new_stmt;
1539   gimple_stmt_iterator gsi;
1540   source_location locus;
1541
1542   /* Check if middle_bb contains of only one store.  */
1543   if (!assign
1544       || !gimple_assign_single_p (assign)
1545       || gimple_has_volatile_ops (assign))
1546     return false;
1547
1548   locus = gimple_location (assign);
1549   lhs = gimple_assign_lhs (assign);
1550   rhs = gimple_assign_rhs1 (assign);
1551   if (TREE_CODE (lhs) != MEM_REF
1552       || TREE_CODE (TREE_OPERAND (lhs, 0)) != SSA_NAME
1553       || !is_gimple_reg_type (TREE_TYPE (lhs)))
1554     return false;
1555
1556   /* Prove that we can move the store down.  We could also check
1557      TREE_THIS_NOTRAP here, but in that case we also could move stores,
1558      whose value is not available readily, which we want to avoid.  */
1559   if (!nontrap->contains (lhs))
1560     return false;
1561
1562   /* Now we've checked the constraints, so do the transformation:
1563      1) Remove the single store.  */
1564   gsi = gsi_for_stmt (assign);
1565   unlink_stmt_vdef (assign);
1566   gsi_remove (&gsi, true);
1567   release_defs (assign);
1568
1569   /* 2) Insert a load from the memory of the store to the temporary
1570         on the edge which did not contain the store.  */
1571   lhs = unshare_expr (lhs);
1572   name = make_temp_ssa_name (TREE_TYPE (lhs), NULL, "cstore");
1573   new_stmt = gimple_build_assign (name, lhs);
1574   gimple_set_location (new_stmt, locus);
1575   gsi_insert_on_edge (e1, new_stmt);
1576
1577   /* 3) Create a PHI node at the join block, with one argument
1578         holding the old RHS, and the other holding the temporary
1579         where we stored the old memory contents.  */
1580   name2 = make_temp_ssa_name (TREE_TYPE (lhs), NULL, "cstore");
1581   newphi = create_phi_node (name2, join_bb);
1582   add_phi_arg (newphi, rhs, e0, locus);
1583   add_phi_arg (newphi, name, e1, locus);
1584
1585   lhs = unshare_expr (lhs);
1586   new_stmt = gimple_build_assign (lhs, PHI_RESULT (newphi));
1587
1588   /* 4) Insert that PHI node.  */
1589   gsi = gsi_after_labels (join_bb);
1590   if (gsi_end_p (gsi))
1591     {
1592       gsi = gsi_last_bb (join_bb);
1593       gsi_insert_after (&gsi, new_stmt, GSI_NEW_STMT);
1594     }
1595   else
1596     gsi_insert_before (&gsi, new_stmt, GSI_NEW_STMT);
1597
1598   return true;
1599 }
1600
1601 /* Do the main work of conditional store replacement.  */
1602
1603 static bool
1604 cond_if_else_store_replacement_1 (basic_block then_bb, basic_block else_bb,
1605                                   basic_block join_bb, gimple then_assign,
1606                                   gimple else_assign)
1607 {
1608   tree lhs_base, lhs, then_rhs, else_rhs, name;
1609   source_location then_locus, else_locus;
1610   gimple_stmt_iterator gsi;
1611   gphi *newphi;
1612   gassign *new_stmt;
1613
1614   if (then_assign == NULL
1615       || !gimple_assign_single_p (then_assign)
1616       || gimple_clobber_p (then_assign)
1617       || gimple_has_volatile_ops (then_assign)
1618       || else_assign == NULL
1619       || !gimple_assign_single_p (else_assign)
1620       || gimple_clobber_p (else_assign)
1621       || gimple_has_volatile_ops (else_assign))
1622     return false;
1623
1624   lhs = gimple_assign_lhs (then_assign);
1625   if (!is_gimple_reg_type (TREE_TYPE (lhs))
1626       || !operand_equal_p (lhs, gimple_assign_lhs (else_assign), 0))
1627     return false;
1628
1629   lhs_base = get_base_address (lhs);
1630   if (lhs_base == NULL_TREE
1631       || (!DECL_P (lhs_base) && TREE_CODE (lhs_base) != MEM_REF))
1632     return false;
1633
1634   then_rhs = gimple_assign_rhs1 (then_assign);
1635   else_rhs = gimple_assign_rhs1 (else_assign);
1636   then_locus = gimple_location (then_assign);
1637   else_locus = gimple_location (else_assign);
1638
1639   /* Now we've checked the constraints, so do the transformation:
1640      1) Remove the stores.  */
1641   gsi = gsi_for_stmt (then_assign);
1642   unlink_stmt_vdef (then_assign);
1643   gsi_remove (&gsi, true);
1644   release_defs (then_assign);
1645
1646   gsi = gsi_for_stmt (else_assign);
1647   unlink_stmt_vdef (else_assign);
1648   gsi_remove (&gsi, true);
1649   release_defs (else_assign);
1650
1651   /* 2) Create a PHI node at the join block, with one argument
1652         holding the old RHS, and the other holding the temporary
1653         where we stored the old memory contents.  */
1654   name = make_temp_ssa_name (TREE_TYPE (lhs), NULL, "cstore");
1655   newphi = create_phi_node (name, join_bb);
1656   add_phi_arg (newphi, then_rhs, EDGE_SUCC (then_bb, 0), then_locus);
1657   add_phi_arg (newphi, else_rhs, EDGE_SUCC (else_bb, 0), else_locus);
1658
1659   new_stmt = gimple_build_assign (lhs, PHI_RESULT (newphi));
1660
1661   /* 3) Insert that PHI node.  */
1662   gsi = gsi_after_labels (join_bb);
1663   if (gsi_end_p (gsi))
1664     {
1665       gsi = gsi_last_bb (join_bb);
1666       gsi_insert_after (&gsi, new_stmt, GSI_NEW_STMT);
1667     }
1668   else
1669     gsi_insert_before (&gsi, new_stmt, GSI_NEW_STMT);
1670
1671   return true;
1672 }
1673
1674 /* Conditional store replacement.  We already know
1675    that the recognized pattern looks like so:
1676
1677    split:
1678      if (cond) goto THEN_BB; else goto ELSE_BB (edge E1)
1679    THEN_BB:
1680      ...
1681      X = Y;
1682      ...
1683      goto JOIN_BB;
1684    ELSE_BB:
1685      ...
1686      X = Z;
1687      ...
1688      fallthrough (edge E0)
1689    JOIN_BB:
1690      some more
1691
1692    We check that it is safe to sink the store to JOIN_BB by verifying that
1693    there are no read-after-write or write-after-write dependencies in
1694    THEN_BB and ELSE_BB.  */
1695
1696 static bool
1697 cond_if_else_store_replacement (basic_block then_bb, basic_block else_bb,
1698                                 basic_block join_bb)
1699 {
1700   gimple then_assign = last_and_only_stmt (then_bb);
1701   gimple else_assign = last_and_only_stmt (else_bb);
1702   vec<data_reference_p> then_datarefs, else_datarefs;
1703   vec<ddr_p> then_ddrs, else_ddrs;
1704   gimple then_store, else_store;
1705   bool found, ok = false, res;
1706   struct data_dependence_relation *ddr;
1707   data_reference_p then_dr, else_dr;
1708   int i, j;
1709   tree then_lhs, else_lhs;
1710   basic_block blocks[3];
1711
1712   if (MAX_STORES_TO_SINK == 0)
1713     return false;
1714
1715   /* Handle the case with single statement in THEN_BB and ELSE_BB.  */
1716   if (then_assign && else_assign)
1717     return cond_if_else_store_replacement_1 (then_bb, else_bb, join_bb,
1718                                              then_assign, else_assign);
1719
1720   /* Find data references.  */
1721   then_datarefs.create (1);
1722   else_datarefs.create (1);
1723   if ((find_data_references_in_bb (NULL, then_bb, &then_datarefs)
1724         == chrec_dont_know)
1725       || !then_datarefs.length ()
1726       || (find_data_references_in_bb (NULL, else_bb, &else_datarefs)
1727           == chrec_dont_know)
1728       || !else_datarefs.length ())
1729     {
1730       free_data_refs (then_datarefs);
1731       free_data_refs (else_datarefs);
1732       return false;
1733     }
1734
1735   /* Find pairs of stores with equal LHS.  */
1736   auto_vec<gimple, 1> then_stores, else_stores;
1737   FOR_EACH_VEC_ELT (then_datarefs, i, then_dr)
1738     {
1739       if (DR_IS_READ (then_dr))
1740         continue;
1741
1742       then_store = DR_STMT (then_dr);
1743       then_lhs = gimple_get_lhs (then_store);
1744       if (then_lhs == NULL_TREE)
1745         continue;
1746       found = false;
1747
1748       FOR_EACH_VEC_ELT (else_datarefs, j, else_dr)
1749         {
1750           if (DR_IS_READ (else_dr))
1751             continue;
1752
1753           else_store = DR_STMT (else_dr);
1754           else_lhs = gimple_get_lhs (else_store);
1755           if (else_lhs == NULL_TREE)
1756             continue;
1757
1758           if (operand_equal_p (then_lhs, else_lhs, 0))
1759             {
1760               found = true;
1761               break;
1762             }
1763         }
1764
1765       if (!found)
1766         continue;
1767
1768       then_stores.safe_push (then_store);
1769       else_stores.safe_push (else_store);
1770     }
1771
1772   /* No pairs of stores found.  */
1773   if (!then_stores.length ()
1774       || then_stores.length () > (unsigned) MAX_STORES_TO_SINK)
1775     {
1776       free_data_refs (then_datarefs);
1777       free_data_refs (else_datarefs);
1778       return false;
1779     }
1780
1781   /* Compute and check data dependencies in both basic blocks.  */
1782   then_ddrs.create (1);
1783   else_ddrs.create (1);
1784   if (!compute_all_dependences (then_datarefs, &then_ddrs,
1785                                 vNULL, false)
1786       || !compute_all_dependences (else_datarefs, &else_ddrs,
1787                                    vNULL, false))
1788     {
1789       free_dependence_relations (then_ddrs);
1790       free_dependence_relations (else_ddrs);
1791       free_data_refs (then_datarefs);
1792       free_data_refs (else_datarefs);
1793       return false;
1794     }
1795   blocks[0] = then_bb;
1796   blocks[1] = else_bb;
1797   blocks[2] = join_bb;
1798   renumber_gimple_stmt_uids_in_blocks (blocks, 3);
1799
1800   /* Check that there are no read-after-write or write-after-write dependencies
1801      in THEN_BB.  */
1802   FOR_EACH_VEC_ELT (then_ddrs, i, ddr)
1803     {
1804       struct data_reference *dra = DDR_A (ddr);
1805       struct data_reference *drb = DDR_B (ddr);
1806
1807       if (DDR_ARE_DEPENDENT (ddr) != chrec_known
1808           && ((DR_IS_READ (dra) && DR_IS_WRITE (drb)
1809                && gimple_uid (DR_STMT (dra)) > gimple_uid (DR_STMT (drb)))
1810               || (DR_IS_READ (drb) && DR_IS_WRITE (dra)
1811                   && gimple_uid (DR_STMT (drb)) > gimple_uid (DR_STMT (dra)))
1812               || (DR_IS_WRITE (dra) && DR_IS_WRITE (drb))))
1813         {
1814           free_dependence_relations (then_ddrs);
1815           free_dependence_relations (else_ddrs);
1816           free_data_refs (then_datarefs);
1817           free_data_refs (else_datarefs);
1818           return false;
1819         }
1820     }
1821
1822   /* Check that there are no read-after-write or write-after-write dependencies
1823      in ELSE_BB.  */
1824   FOR_EACH_VEC_ELT (else_ddrs, i, ddr)
1825     {
1826       struct data_reference *dra = DDR_A (ddr);
1827       struct data_reference *drb = DDR_B (ddr);
1828
1829       if (DDR_ARE_DEPENDENT (ddr) != chrec_known
1830           && ((DR_IS_READ (dra) && DR_IS_WRITE (drb)
1831                && gimple_uid (DR_STMT (dra)) > gimple_uid (DR_STMT (drb)))
1832               || (DR_IS_READ (drb) && DR_IS_WRITE (dra)
1833                   && gimple_uid (DR_STMT (drb)) > gimple_uid (DR_STMT (dra)))
1834               || (DR_IS_WRITE (dra) && DR_IS_WRITE (drb))))
1835         {
1836           free_dependence_relations (then_ddrs);
1837           free_dependence_relations (else_ddrs);
1838           free_data_refs (then_datarefs);
1839           free_data_refs (else_datarefs);
1840           return false;
1841         }
1842     }
1843
1844   /* Sink stores with same LHS.  */
1845   FOR_EACH_VEC_ELT (then_stores, i, then_store)
1846     {
1847       else_store = else_stores[i];
1848       res = cond_if_else_store_replacement_1 (then_bb, else_bb, join_bb,
1849                                               then_store, else_store);
1850       ok = ok || res;
1851     }
1852
1853   free_dependence_relations (then_ddrs);
1854   free_dependence_relations (else_ddrs);
1855   free_data_refs (then_datarefs);
1856   free_data_refs (else_datarefs);
1857
1858   return ok;
1859 }
1860
1861 /* Return TRUE if STMT has a VUSE whose corresponding VDEF is in BB.  */
1862
1863 static bool
1864 local_mem_dependence (gimple stmt, basic_block bb)
1865 {
1866   tree vuse = gimple_vuse (stmt);
1867   gimple def;
1868
1869   if (!vuse)
1870     return false;
1871
1872   def = SSA_NAME_DEF_STMT (vuse);
1873   return (def && gimple_bb (def) == bb);
1874 }
1875
1876 /* Given a "diamond" control-flow pattern where BB0 tests a condition,
1877    BB1 and BB2 are "then" and "else" blocks dependent on this test,
1878    and BB3 rejoins control flow following BB1 and BB2, look for
1879    opportunities to hoist loads as follows.  If BB3 contains a PHI of
1880    two loads, one each occurring in BB1 and BB2, and the loads are
1881    provably of adjacent fields in the same structure, then move both
1882    loads into BB0.  Of course this can only be done if there are no
1883    dependencies preventing such motion.
1884
1885    One of the hoisted loads will always be speculative, so the
1886    transformation is currently conservative:
1887
1888     - The fields must be strictly adjacent.
1889     - The two fields must occupy a single memory block that is
1890       guaranteed to not cross a page boundary.
1891
1892     The last is difficult to prove, as such memory blocks should be
1893     aligned on the minimum of the stack alignment boundary and the
1894     alignment guaranteed by heap allocation interfaces.  Thus we rely
1895     on a parameter for the alignment value.
1896
1897     Provided a good value is used for the last case, the first
1898     restriction could possibly be relaxed.  */
1899
1900 static void
1901 hoist_adjacent_loads (basic_block bb0, basic_block bb1,
1902                       basic_block bb2, basic_block bb3)
1903 {
1904   int param_align = PARAM_VALUE (PARAM_L1_CACHE_LINE_SIZE);
1905   unsigned param_align_bits = (unsigned) (param_align * BITS_PER_UNIT);
1906   gphi_iterator gsi;
1907
1908   /* Walk the phis in bb3 looking for an opportunity.  We are looking
1909      for phis of two SSA names, one each of which is defined in bb1 and
1910      bb2.  */
1911   for (gsi = gsi_start_phis (bb3); !gsi_end_p (gsi); gsi_next (&gsi))
1912     {
1913       gphi *phi_stmt = gsi.phi ();
1914       gimple def1, def2, defswap;
1915       tree arg1, arg2, ref1, ref2, field1, field2, fieldswap;
1916       tree tree_offset1, tree_offset2, tree_size2, next;
1917       int offset1, offset2, size2;
1918       unsigned align1;
1919       gimple_stmt_iterator gsi2;
1920       basic_block bb_for_def1, bb_for_def2;
1921
1922       if (gimple_phi_num_args (phi_stmt) != 2
1923           || virtual_operand_p (gimple_phi_result (phi_stmt)))
1924         continue;
1925
1926       arg1 = gimple_phi_arg_def (phi_stmt, 0);
1927       arg2 = gimple_phi_arg_def (phi_stmt, 1);
1928
1929       if (TREE_CODE (arg1) != SSA_NAME
1930           || TREE_CODE (arg2) != SSA_NAME
1931           || SSA_NAME_IS_DEFAULT_DEF (arg1)
1932           || SSA_NAME_IS_DEFAULT_DEF (arg2))
1933         continue;
1934
1935       def1 = SSA_NAME_DEF_STMT (arg1);
1936       def2 = SSA_NAME_DEF_STMT (arg2);
1937
1938       if ((gimple_bb (def1) != bb1 || gimple_bb (def2) != bb2)
1939           && (gimple_bb (def2) != bb1 || gimple_bb (def1) != bb2))
1940         continue;
1941
1942       /* Check the mode of the arguments to be sure a conditional move
1943          can be generated for it.  */
1944       if (optab_handler (movcc_optab, TYPE_MODE (TREE_TYPE (arg1)))
1945           == CODE_FOR_nothing)
1946         continue;
1947
1948       /* Both statements must be assignments whose RHS is a COMPONENT_REF.  */
1949       if (!gimple_assign_single_p (def1)
1950           || !gimple_assign_single_p (def2)
1951           || gimple_has_volatile_ops (def1)
1952           || gimple_has_volatile_ops (def2))
1953         continue;
1954
1955       ref1 = gimple_assign_rhs1 (def1);
1956       ref2 = gimple_assign_rhs1 (def2);
1957
1958       if (TREE_CODE (ref1) != COMPONENT_REF
1959           || TREE_CODE (ref2) != COMPONENT_REF)
1960         continue;
1961
1962       /* The zeroth operand of the two component references must be
1963          identical.  It is not sufficient to compare get_base_address of
1964          the two references, because this could allow for different
1965          elements of the same array in the two trees.  It is not safe to
1966          assume that the existence of one array element implies the
1967          existence of a different one.  */
1968       if (!operand_equal_p (TREE_OPERAND (ref1, 0), TREE_OPERAND (ref2, 0), 0))
1969         continue;
1970
1971       field1 = TREE_OPERAND (ref1, 1);
1972       field2 = TREE_OPERAND (ref2, 1);
1973
1974       /* Check for field adjacency, and ensure field1 comes first.  */
1975       for (next = DECL_CHAIN (field1);
1976            next && TREE_CODE (next) != FIELD_DECL;
1977            next = DECL_CHAIN (next))
1978         ;
1979
1980       if (next != field2)
1981         {
1982           for (next = DECL_CHAIN (field2);
1983                next && TREE_CODE (next) != FIELD_DECL;
1984                next = DECL_CHAIN (next))
1985             ;
1986
1987           if (next != field1)
1988             continue;
1989
1990           fieldswap = field1;
1991           field1 = field2;
1992           field2 = fieldswap;
1993           defswap = def1;
1994           def1 = def2;
1995           def2 = defswap;
1996         }
1997
1998       bb_for_def1 = gimple_bb (def1);
1999       bb_for_def2 = gimple_bb (def2);
2000
2001       /* Check for proper alignment of the first field.  */
2002       tree_offset1 = bit_position (field1);
2003       tree_offset2 = bit_position (field2);
2004       tree_size2 = DECL_SIZE (field2);
2005
2006       if (!tree_fits_uhwi_p (tree_offset1)
2007           || !tree_fits_uhwi_p (tree_offset2)
2008           || !tree_fits_uhwi_p (tree_size2))
2009         continue;
2010
2011       offset1 = tree_to_uhwi (tree_offset1);
2012       offset2 = tree_to_uhwi (tree_offset2);
2013       size2 = tree_to_uhwi (tree_size2);
2014       align1 = DECL_ALIGN (field1) % param_align_bits;
2015
2016       if (offset1 % BITS_PER_UNIT != 0)
2017         continue;
2018
2019       /* For profitability, the two field references should fit within
2020          a single cache line.  */
2021       if (align1 + offset2 - offset1 + size2 > param_align_bits)
2022         continue;
2023
2024       /* The two expressions cannot be dependent upon vdefs defined
2025          in bb1/bb2.  */
2026       if (local_mem_dependence (def1, bb_for_def1)
2027           || local_mem_dependence (def2, bb_for_def2))
2028         continue;
2029
2030       /* The conditions are satisfied; hoist the loads from bb1 and bb2 into
2031          bb0.  We hoist the first one first so that a cache miss is handled
2032          efficiently regardless of hardware cache-fill policy.  */
2033       gsi2 = gsi_for_stmt (def1);
2034       gsi_move_to_bb_end (&gsi2, bb0);
2035       gsi2 = gsi_for_stmt (def2);
2036       gsi_move_to_bb_end (&gsi2, bb0);
2037
2038       if (dump_file && (dump_flags & TDF_DETAILS))
2039         {
2040           fprintf (dump_file,
2041                    "\nHoisting adjacent loads from %d and %d into %d: \n",
2042                    bb_for_def1->index, bb_for_def2->index, bb0->index);
2043           print_gimple_stmt (dump_file, def1, 0, TDF_VOPS|TDF_MEMSYMS);
2044           print_gimple_stmt (dump_file, def2, 0, TDF_VOPS|TDF_MEMSYMS);
2045         }
2046     }
2047 }
2048
2049 /* Determine whether we should attempt to hoist adjacent loads out of
2050    diamond patterns in pass_phiopt.  Always hoist loads if
2051    -fhoist-adjacent-loads is specified and the target machine has
2052    both a conditional move instruction and a defined cache line size.  */
2053
2054 static bool
2055 gate_hoist_loads (void)
2056 {
2057   return (flag_hoist_adjacent_loads == 1
2058           && PARAM_VALUE (PARAM_L1_CACHE_LINE_SIZE)
2059           && HAVE_conditional_move);
2060 }
2061
2062 /* This pass tries to replaces an if-then-else block with an
2063    assignment.  We have four kinds of transformations.  Some of these
2064    transformations are also performed by the ifcvt RTL optimizer.
2065
2066    Conditional Replacement
2067    -----------------------
2068
2069    This transformation, implemented in conditional_replacement,
2070    replaces
2071
2072      bb0:
2073       if (cond) goto bb2; else goto bb1;
2074      bb1:
2075      bb2:
2076       x = PHI <0 (bb1), 1 (bb0), ...>;
2077
2078    with
2079
2080      bb0:
2081       x' = cond;
2082       goto bb2;
2083      bb2:
2084       x = PHI <x' (bb0), ...>;
2085
2086    We remove bb1 as it becomes unreachable.  This occurs often due to
2087    gimplification of conditionals.
2088
2089    Value Replacement
2090    -----------------
2091
2092    This transformation, implemented in value_replacement, replaces
2093
2094      bb0:
2095        if (a != b) goto bb2; else goto bb1;
2096      bb1:
2097      bb2:
2098        x = PHI <a (bb1), b (bb0), ...>;
2099
2100    with
2101
2102      bb0:
2103      bb2:
2104        x = PHI <b (bb0), ...>;
2105
2106    This opportunity can sometimes occur as a result of other
2107    optimizations.
2108
2109
2110    Another case caught by value replacement looks like this:
2111
2112      bb0:
2113        t1 = a == CONST;
2114        t2 = b > c;
2115        t3 = t1 & t2;
2116        if (t3 != 0) goto bb1; else goto bb2;
2117      bb1:
2118      bb2:
2119        x = PHI (CONST, a)
2120
2121    Gets replaced with:
2122      bb0:
2123      bb2:
2124        t1 = a == CONST;
2125        t2 = b > c;
2126        t3 = t1 & t2;
2127        x = a;
2128
2129    ABS Replacement
2130    ---------------
2131
2132    This transformation, implemented in abs_replacement, replaces
2133
2134      bb0:
2135        if (a >= 0) goto bb2; else goto bb1;
2136      bb1:
2137        x = -a;
2138      bb2:
2139        x = PHI <x (bb1), a (bb0), ...>;
2140
2141    with
2142
2143      bb0:
2144        x' = ABS_EXPR< a >;
2145      bb2:
2146        x = PHI <x' (bb0), ...>;
2147
2148    MIN/MAX Replacement
2149    -------------------
2150
2151    This transformation, minmax_replacement replaces
2152
2153      bb0:
2154        if (a <= b) goto bb2; else goto bb1;
2155      bb1:
2156      bb2:
2157        x = PHI <b (bb1), a (bb0), ...>;
2158
2159    with
2160
2161      bb0:
2162        x' = MIN_EXPR (a, b)
2163      bb2:
2164        x = PHI <x' (bb0), ...>;
2165
2166    A similar transformation is done for MAX_EXPR.
2167
2168
2169    This pass also performs a fifth transformation of a slightly different
2170    flavor.
2171
2172    Adjacent Load Hoisting
2173    ----------------------
2174
2175    This transformation replaces
2176
2177      bb0:
2178        if (...) goto bb2; else goto bb1;
2179      bb1:
2180        x1 = (<expr>).field1;
2181        goto bb3;
2182      bb2:
2183        x2 = (<expr>).field2;
2184      bb3:
2185        # x = PHI <x1, x2>;
2186
2187    with
2188
2189      bb0:
2190        x1 = (<expr>).field1;
2191        x2 = (<expr>).field2;
2192        if (...) goto bb2; else goto bb1;
2193      bb1:
2194        goto bb3;
2195      bb2:
2196      bb3:
2197        # x = PHI <x1, x2>;
2198
2199    The purpose of this transformation is to enable generation of conditional
2200    move instructions such as Intel CMOVE or PowerPC ISEL.  Because one of
2201    the loads is speculative, the transformation is restricted to very
2202    specific cases to avoid introducing a page fault.  We are looking for
2203    the common idiom:
2204
2205      if (...)
2206        x = y->left;
2207      else
2208        x = y->right;
2209
2210    where left and right are typically adjacent pointers in a tree structure.  */
2211
2212 namespace {
2213
2214 const pass_data pass_data_phiopt =
2215 {
2216   GIMPLE_PASS, /* type */
2217   "phiopt", /* name */
2218   OPTGROUP_NONE, /* optinfo_flags */
2219   TV_TREE_PHIOPT, /* tv_id */
2220   ( PROP_cfg | PROP_ssa ), /* properties_required */
2221   0, /* properties_provided */
2222   0, /* properties_destroyed */
2223   0, /* todo_flags_start */
2224   0, /* todo_flags_finish */
2225 };
2226
2227 class pass_phiopt : public gimple_opt_pass
2228 {
2229 public:
2230   pass_phiopt (gcc::context *ctxt)
2231     : gimple_opt_pass (pass_data_phiopt, ctxt)
2232   {}
2233
2234   /* opt_pass methods: */
2235   opt_pass * clone () { return new pass_phiopt (m_ctxt); }
2236   virtual bool gate (function *) { return flag_ssa_phiopt; }
2237   virtual unsigned int execute (function *)
2238     {
2239       return tree_ssa_phiopt_worker (false, gate_hoist_loads ());
2240     }
2241
2242 }; // class pass_phiopt
2243
2244 } // anon namespace
2245
2246 gimple_opt_pass *
2247 make_pass_phiopt (gcc::context *ctxt)
2248 {
2249   return new pass_phiopt (ctxt);
2250 }
2251
2252 namespace {
2253
2254 const pass_data pass_data_cselim =
2255 {
2256   GIMPLE_PASS, /* type */
2257   "cselim", /* name */
2258   OPTGROUP_NONE, /* optinfo_flags */
2259   TV_TREE_PHIOPT, /* tv_id */
2260   ( PROP_cfg | PROP_ssa ), /* properties_required */
2261   0, /* properties_provided */
2262   0, /* properties_destroyed */
2263   0, /* todo_flags_start */
2264   0, /* todo_flags_finish */
2265 };
2266
2267 class pass_cselim : public gimple_opt_pass
2268 {
2269 public:
2270   pass_cselim (gcc::context *ctxt)
2271     : gimple_opt_pass (pass_data_cselim, ctxt)
2272   {}
2273
2274   /* opt_pass methods: */
2275   virtual bool gate (function *) { return flag_tree_cselim; }
2276   virtual unsigned int execute (function *) { return tree_ssa_cs_elim (); }
2277
2278 }; // class pass_cselim
2279
2280 } // anon namespace
2281
2282 gimple_opt_pass *
2283 make_pass_cselim (gcc::context *ctxt)
2284 {
2285   return new pass_cselim (ctxt);
2286 }