gcc50: Disconnect from buildworld.
[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   reset_flow_sensitive_info_in_bb (cond_bb);
548
549   /* Note that we optimized this PHI.  */
550   return true;
551 }
552
553 /* Update *ARG which is defined in STMT so that it contains the
554    computed value if that seems profitable.  Return true if the
555    statement is made dead by that rewriting.  */
556
557 static bool
558 jump_function_from_stmt (tree *arg, gimple stmt)
559 {
560   enum tree_code code = gimple_assign_rhs_code (stmt);
561   if (code == ADDR_EXPR)
562     {
563       /* For arg = &p->i transform it to p, if possible.  */
564       tree rhs1 = gimple_assign_rhs1 (stmt);
565       HOST_WIDE_INT offset;
566       tree tem = get_addr_base_and_unit_offset (TREE_OPERAND (rhs1, 0),
567                                                 &offset);
568       if (tem
569           && TREE_CODE (tem) == MEM_REF
570           && (mem_ref_offset (tem) + offset) == 0)
571         {
572           *arg = TREE_OPERAND (tem, 0);
573           return true;
574         }
575     }
576   /* TODO: Much like IPA-CP jump-functions we want to handle constant
577      additions symbolically here, and we'd need to update the comparison
578      code that compares the arg + cst tuples in our caller.  For now the
579      code above exactly handles the VEC_BASE pattern from vec.h.  */
580   return false;
581 }
582
583 /* RHS is a source argument in a BIT_AND_EXPR which feeds a conditional
584    of the form SSA_NAME NE 0.
585
586    If RHS is fed by a simple EQ_EXPR comparison of two values, see if
587    the two input values of the EQ_EXPR match arg0 and arg1.
588
589    If so update *code and return TRUE.  Otherwise return FALSE.  */
590
591 static bool
592 rhs_is_fed_for_value_replacement (const_tree arg0, const_tree arg1,
593                                   enum tree_code *code, const_tree rhs)
594 {
595   /* Obviously if RHS is not an SSA_NAME, we can't look at the defining
596      statement.  */
597   if (TREE_CODE (rhs) == SSA_NAME)
598     {
599       gimple def1 = SSA_NAME_DEF_STMT (rhs);
600
601       /* Verify the defining statement has an EQ_EXPR on the RHS.  */
602       if (is_gimple_assign (def1) && gimple_assign_rhs_code (def1) == EQ_EXPR)
603         {
604           /* Finally verify the source operands of the EQ_EXPR are equal
605              to arg0 and arg1.  */
606           tree op0 = gimple_assign_rhs1 (def1);
607           tree op1 = gimple_assign_rhs2 (def1);
608           if ((operand_equal_for_phi_arg_p (arg0, op0)
609                && operand_equal_for_phi_arg_p (arg1, op1))
610               || (operand_equal_for_phi_arg_p (arg0, op1)
611                && operand_equal_for_phi_arg_p (arg1, op0)))
612             {
613               /* We will perform the optimization.  */
614               *code = gimple_assign_rhs_code (def1);
615               return true;
616             }
617         }
618     }
619   return false;
620 }
621
622 /* Return TRUE if arg0/arg1 are equal to the rhs/lhs or lhs/rhs of COND. 
623
624    Also return TRUE if arg0/arg1 are equal to the source arguments of a
625    an EQ comparison feeding a BIT_AND_EXPR which feeds COND. 
626
627    Return FALSE otherwise.  */
628
629 static bool
630 operand_equal_for_value_replacement (const_tree arg0, const_tree arg1,
631                                      enum tree_code *code, gimple cond)
632 {
633   gimple def;
634   tree lhs = gimple_cond_lhs (cond);
635   tree rhs = gimple_cond_rhs (cond);
636
637   if ((operand_equal_for_phi_arg_p (arg0, lhs)
638        && operand_equal_for_phi_arg_p (arg1, rhs))
639       || (operand_equal_for_phi_arg_p (arg1, lhs)
640           && operand_equal_for_phi_arg_p (arg0, rhs)))
641     return true;
642
643   /* Now handle more complex case where we have an EQ comparison
644      which feeds a BIT_AND_EXPR which feeds COND.
645
646      First verify that COND is of the form SSA_NAME NE 0.  */
647   if (*code != NE_EXPR || !integer_zerop (rhs)
648       || TREE_CODE (lhs) != SSA_NAME)
649     return false;
650
651   /* Now ensure that SSA_NAME is set by a BIT_AND_EXPR.  */
652   def = SSA_NAME_DEF_STMT (lhs);
653   if (!is_gimple_assign (def) || gimple_assign_rhs_code (def) != BIT_AND_EXPR)
654     return false;
655
656   /* Now verify arg0/arg1 correspond to the source arguments of an 
657      EQ comparison feeding the BIT_AND_EXPR.  */
658      
659   tree tmp = gimple_assign_rhs1 (def);
660   if (rhs_is_fed_for_value_replacement (arg0, arg1, code, tmp))
661     return true;
662
663   tmp = gimple_assign_rhs2 (def);
664   if (rhs_is_fed_for_value_replacement (arg0, arg1, code, tmp))
665     return true;
666
667   return false;
668 }
669
670 /* Returns true if ARG is a neutral element for operation CODE
671    on the RIGHT side.  */
672
673 static bool
674 neutral_element_p (tree_code code, tree arg, bool right)
675 {
676   switch (code)
677     {
678     case PLUS_EXPR:
679     case BIT_IOR_EXPR:
680     case BIT_XOR_EXPR:
681       return integer_zerop (arg);
682
683     case LROTATE_EXPR:
684     case RROTATE_EXPR:
685     case LSHIFT_EXPR:
686     case RSHIFT_EXPR:
687     case MINUS_EXPR:
688     case POINTER_PLUS_EXPR:
689       return right && integer_zerop (arg);
690
691     case MULT_EXPR:
692       return integer_onep (arg);
693
694     case TRUNC_DIV_EXPR:
695     case CEIL_DIV_EXPR:
696     case FLOOR_DIV_EXPR:
697     case ROUND_DIV_EXPR:
698     case EXACT_DIV_EXPR:
699       return right && integer_onep (arg);
700
701     case BIT_AND_EXPR:
702       return integer_all_onesp (arg);
703
704     default:
705       return false;
706     }
707 }
708
709 /* Returns true if ARG is an absorbing element for operation CODE.  */
710
711 static bool
712 absorbing_element_p (tree_code code, tree arg)
713 {
714   switch (code)
715     {
716     case BIT_IOR_EXPR:
717       return integer_all_onesp (arg);
718
719     case MULT_EXPR:
720     case BIT_AND_EXPR:
721       return integer_zerop (arg);
722
723     default:
724       return false;
725     }
726 }
727
728 /*  The function value_replacement does the main work of doing the value
729     replacement.  Return non-zero if the replacement is done.  Otherwise return
730     0.  If we remove the middle basic block, return 2.
731     BB is the basic block where the replacement is going to be done on.  ARG0
732     is argument 0 from the PHI.  Likewise for ARG1.  */
733
734 static int
735 value_replacement (basic_block cond_bb, basic_block middle_bb,
736                    edge e0, edge e1, gimple phi,
737                    tree arg0, tree arg1)
738 {
739   gimple_stmt_iterator gsi;
740   gimple cond;
741   edge true_edge, false_edge;
742   enum tree_code code;
743   bool emtpy_or_with_defined_p = true;
744
745   /* If the type says honor signed zeros we cannot do this
746      optimization.  */
747   if (HONOR_SIGNED_ZEROS (arg1))
748     return 0;
749
750   /* If there is a statement in MIDDLE_BB that defines one of the PHI
751      arguments, then adjust arg0 or arg1.  */
752   gsi = gsi_start_nondebug_after_labels_bb (middle_bb);
753   while (!gsi_end_p (gsi))
754     {
755       gimple stmt = gsi_stmt (gsi);
756       tree lhs;
757       gsi_next_nondebug (&gsi);
758       if (!is_gimple_assign (stmt))
759         {
760           emtpy_or_with_defined_p = false;
761           continue;
762         }
763       /* Now try to adjust arg0 or arg1 according to the computation
764          in the statement.  */
765       lhs = gimple_assign_lhs (stmt);
766       if (!(lhs == arg0
767              && jump_function_from_stmt (&arg0, stmt))
768             || (lhs == arg1
769                 && jump_function_from_stmt (&arg1, stmt)))
770         emtpy_or_with_defined_p = false;
771     }
772
773   cond = last_stmt (cond_bb);
774   code = gimple_cond_code (cond);
775
776   /* This transformation is only valid for equality comparisons.  */
777   if (code != NE_EXPR && code != EQ_EXPR)
778     return 0;
779
780   /* We need to know which is the true edge and which is the false
781       edge so that we know if have abs or negative abs.  */
782   extract_true_false_edges_from_block (cond_bb, &true_edge, &false_edge);
783
784   /* At this point we know we have a COND_EXPR with two successors.
785      One successor is BB, the other successor is an empty block which
786      falls through into BB.
787
788      The condition for the COND_EXPR is known to be NE_EXPR or EQ_EXPR.
789
790      There is a single PHI node at the join point (BB) with two arguments.
791
792      We now need to verify that the two arguments in the PHI node match
793      the two arguments to the equality comparison.  */
794
795   if (operand_equal_for_value_replacement (arg0, arg1, &code, cond))
796     {
797       edge e;
798       tree arg;
799
800       /* For NE_EXPR, we want to build an assignment result = arg where
801          arg is the PHI argument associated with the true edge.  For
802          EQ_EXPR we want the PHI argument associated with the false edge.  */
803       e = (code == NE_EXPR ? true_edge : false_edge);
804
805       /* Unfortunately, E may not reach BB (it may instead have gone to
806          OTHER_BLOCK).  If that is the case, then we want the single outgoing
807          edge from OTHER_BLOCK which reaches BB and represents the desired
808          path from COND_BLOCK.  */
809       if (e->dest == middle_bb)
810         e = single_succ_edge (e->dest);
811
812       /* Now we know the incoming edge to BB that has the argument for the
813          RHS of our new assignment statement.  */
814       if (e0 == e)
815         arg = arg0;
816       else
817         arg = arg1;
818
819       /* If the middle basic block was empty or is defining the
820          PHI arguments and this is a single phi where the args are different
821          for the edges e0 and e1 then we can remove the middle basic block. */
822       if (emtpy_or_with_defined_p
823           && single_non_singleton_phi_for_edges (phi_nodes (gimple_bb (phi)),
824                                                  e0, e1) == phi)
825         {
826           replace_phi_edge_with_variable (cond_bb, e1, phi, arg);
827           /* Note that we optimized this PHI.  */
828           return 2;
829         }
830       else
831         {
832           /* Replace the PHI arguments with arg. */
833           SET_PHI_ARG_DEF (phi, e0->dest_idx, arg);
834           SET_PHI_ARG_DEF (phi, e1->dest_idx, arg);
835           if (dump_file && (dump_flags & TDF_DETAILS))
836             {
837               fprintf (dump_file, "PHI ");
838               print_generic_expr (dump_file, gimple_phi_result (phi), 0);
839               fprintf (dump_file, " reduced for COND_EXPR in block %d to ",
840                        cond_bb->index);
841               print_generic_expr (dump_file, arg, 0);
842               fprintf (dump_file, ".\n");
843             }
844           return 1;
845         }
846
847     }
848
849   /* Now optimize (x != 0) ? x + y : y to just y.
850      The following condition is too restrictive, there can easily be another
851      stmt in middle_bb, for instance a CONVERT_EXPR for the second argument.  */
852   gimple assign = last_and_only_stmt (middle_bb);
853   if (!assign || gimple_code (assign) != GIMPLE_ASSIGN
854       || gimple_assign_rhs_class (assign) != GIMPLE_BINARY_RHS
855       || (!INTEGRAL_TYPE_P (TREE_TYPE (arg0))
856           && !POINTER_TYPE_P (TREE_TYPE (arg0))))
857     return 0;
858
859   /* Punt if there are (degenerate) PHIs in middle_bb, there should not be.  */
860   if (!gimple_seq_empty_p (phi_nodes (middle_bb)))
861     return 0;
862
863   /* Only transform if it removes the condition.  */
864   if (!single_non_singleton_phi_for_edges (phi_nodes (gimple_bb (phi)), e0, e1))
865     return 0;
866
867   /* Size-wise, this is always profitable.  */
868   if (optimize_bb_for_speed_p (cond_bb)
869       /* The special case is useless if it has a low probability.  */
870       && profile_status_for_fn (cfun) != PROFILE_ABSENT
871       && EDGE_PRED (middle_bb, 0)->probability < PROB_EVEN
872       /* If assign is cheap, there is no point avoiding it.  */
873       && estimate_num_insns (assign, &eni_time_weights)
874          >= 3 * estimate_num_insns (cond, &eni_time_weights))
875     return 0;
876
877   tree lhs = gimple_assign_lhs (assign);
878   tree rhs1 = gimple_assign_rhs1 (assign);
879   tree rhs2 = gimple_assign_rhs2 (assign);
880   enum tree_code code_def = gimple_assign_rhs_code (assign);
881   tree cond_lhs = gimple_cond_lhs (cond);
882   tree cond_rhs = gimple_cond_rhs (cond);
883
884   if (((code == NE_EXPR && e1 == false_edge)
885         || (code == EQ_EXPR && e1 == true_edge))
886       && arg0 == lhs
887       && ((arg1 == rhs1
888            && operand_equal_for_phi_arg_p (rhs2, cond_lhs)
889            && neutral_element_p (code_def, cond_rhs, true))
890           || (arg1 == rhs2
891               && operand_equal_for_phi_arg_p (rhs1, cond_lhs)
892               && neutral_element_p (code_def, cond_rhs, false))
893           || (operand_equal_for_phi_arg_p (arg1, cond_rhs)
894               && (operand_equal_for_phi_arg_p (rhs2, cond_lhs)
895                   || operand_equal_for_phi_arg_p (rhs1, cond_lhs))
896               && absorbing_element_p (code_def, cond_rhs))))
897     {
898       gsi = gsi_for_stmt (cond);
899       if (INTEGRAL_TYPE_P (TREE_TYPE (lhs)))
900         {
901           /* Moving ASSIGN might change VR of lhs, e.g. when moving u_6
902              def-stmt in:
903              if (n_5 != 0)
904                goto <bb 3>;
905              else
906                goto <bb 4>;
907
908              <bb 3>:
909              # RANGE [0, 4294967294]
910              u_6 = n_5 + 4294967295;
911
912              <bb 4>:
913              # u_3 = PHI <u_6(3), 4294967295(2)>  */
914           SSA_NAME_RANGE_INFO (lhs) = NULL;
915           SSA_NAME_ANTI_RANGE_P (lhs) = 0;
916           /* If available, we can use VR of phi result at least.  */
917           tree phires = gimple_phi_result (phi);
918           struct range_info_def *phires_range_info
919             = SSA_NAME_RANGE_INFO (phires);
920           if (phires_range_info)
921             duplicate_ssa_name_range_info (lhs, SSA_NAME_RANGE_TYPE (phires),
922                                            phires_range_info);
923         }
924       gimple_stmt_iterator gsi_from = gsi_for_stmt (assign);
925       gsi_move_before (&gsi_from, &gsi);
926       replace_phi_edge_with_variable (cond_bb, e1, phi, lhs);
927       return 2;
928     }
929
930   return 0;
931 }
932
933 /*  The function minmax_replacement does the main work of doing the minmax
934     replacement.  Return true if the replacement is done.  Otherwise return
935     false.
936     BB is the basic block where the replacement is going to be done on.  ARG0
937     is argument 0 from the PHI.  Likewise for ARG1.  */
938
939 static bool
940 minmax_replacement (basic_block cond_bb, basic_block middle_bb,
941                     edge e0, edge e1, gimple phi,
942                     tree arg0, tree arg1)
943 {
944   tree result, type;
945   gcond *cond;
946   gassign *new_stmt;
947   edge true_edge, false_edge;
948   enum tree_code cmp, minmax, ass_code;
949   tree smaller, larger, arg_true, arg_false;
950   gimple_stmt_iterator gsi, gsi_from;
951
952   type = TREE_TYPE (PHI_RESULT (phi));
953
954   /* The optimization may be unsafe due to NaNs.  */
955   if (HONOR_NANS (type))
956     return false;
957
958   cond = as_a <gcond *> (last_stmt (cond_bb));
959   cmp = gimple_cond_code (cond);
960
961   /* This transformation is only valid for order comparisons.  Record which
962      operand is smaller/larger if the result of the comparison is true.  */
963   if (cmp == LT_EXPR || cmp == LE_EXPR)
964     {
965       smaller = gimple_cond_lhs (cond);
966       larger = gimple_cond_rhs (cond);
967     }
968   else if (cmp == GT_EXPR || cmp == GE_EXPR)
969     {
970       smaller = gimple_cond_rhs (cond);
971       larger = gimple_cond_lhs (cond);
972     }
973   else
974     return false;
975
976   /* We need to know which is the true edge and which is the false
977       edge so that we know if have abs or negative abs.  */
978   extract_true_false_edges_from_block (cond_bb, &true_edge, &false_edge);
979
980   /* Forward the edges over the middle basic block.  */
981   if (true_edge->dest == middle_bb)
982     true_edge = EDGE_SUCC (true_edge->dest, 0);
983   if (false_edge->dest == middle_bb)
984     false_edge = EDGE_SUCC (false_edge->dest, 0);
985
986   if (true_edge == e0)
987     {
988       gcc_assert (false_edge == e1);
989       arg_true = arg0;
990       arg_false = arg1;
991     }
992   else
993     {
994       gcc_assert (false_edge == e0);
995       gcc_assert (true_edge == e1);
996       arg_true = arg1;
997       arg_false = arg0;
998     }
999
1000   if (empty_block_p (middle_bb))
1001     {
1002       if (operand_equal_for_phi_arg_p (arg_true, smaller)
1003           && operand_equal_for_phi_arg_p (arg_false, larger))
1004         {
1005           /* Case
1006
1007              if (smaller < larger)
1008              rslt = smaller;
1009              else
1010              rslt = larger;  */
1011           minmax = MIN_EXPR;
1012         }
1013       else if (operand_equal_for_phi_arg_p (arg_false, smaller)
1014                && operand_equal_for_phi_arg_p (arg_true, larger))
1015         minmax = MAX_EXPR;
1016       else
1017         return false;
1018     }
1019   else
1020     {
1021       /* Recognize the following case, assuming d <= u:
1022
1023          if (a <= u)
1024            b = MAX (a, d);
1025          x = PHI <b, u>
1026
1027          This is equivalent to
1028
1029          b = MAX (a, d);
1030          x = MIN (b, u);  */
1031
1032       gimple assign = last_and_only_stmt (middle_bb);
1033       tree lhs, op0, op1, bound;
1034
1035       if (!assign
1036           || gimple_code (assign) != GIMPLE_ASSIGN)
1037         return false;
1038
1039       lhs = gimple_assign_lhs (assign);
1040       ass_code = gimple_assign_rhs_code (assign);
1041       if (ass_code != MAX_EXPR && ass_code != MIN_EXPR)
1042         return false;
1043       op0 = gimple_assign_rhs1 (assign);
1044       op1 = gimple_assign_rhs2 (assign);
1045
1046       if (true_edge->src == middle_bb)
1047         {
1048           /* We got here if the condition is true, i.e., SMALLER < LARGER.  */
1049           if (!operand_equal_for_phi_arg_p (lhs, arg_true))
1050             return false;
1051
1052           if (operand_equal_for_phi_arg_p (arg_false, larger))
1053             {
1054               /* Case
1055
1056                  if (smaller < larger)
1057                    {
1058                      r' = MAX_EXPR (smaller, bound)
1059                    }
1060                  r = PHI <r', larger>  --> to be turned to MIN_EXPR.  */
1061               if (ass_code != MAX_EXPR)
1062                 return false;
1063
1064               minmax = MIN_EXPR;
1065               if (operand_equal_for_phi_arg_p (op0, smaller))
1066                 bound = op1;
1067               else if (operand_equal_for_phi_arg_p (op1, smaller))
1068                 bound = op0;
1069               else
1070                 return false;
1071
1072               /* We need BOUND <= LARGER.  */
1073               if (!integer_nonzerop (fold_build2 (LE_EXPR, boolean_type_node,
1074                                                   bound, larger)))
1075                 return false;
1076             }
1077           else if (operand_equal_for_phi_arg_p (arg_false, smaller))
1078             {
1079               /* Case
1080
1081                  if (smaller < larger)
1082                    {
1083                      r' = MIN_EXPR (larger, bound)
1084                    }
1085                  r = PHI <r', smaller>  --> to be turned to MAX_EXPR.  */
1086               if (ass_code != MIN_EXPR)
1087                 return false;
1088
1089               minmax = MAX_EXPR;
1090               if (operand_equal_for_phi_arg_p (op0, larger))
1091                 bound = op1;
1092               else if (operand_equal_for_phi_arg_p (op1, larger))
1093                 bound = op0;
1094               else
1095                 return false;
1096
1097               /* We need BOUND >= SMALLER.  */
1098               if (!integer_nonzerop (fold_build2 (GE_EXPR, boolean_type_node,
1099                                                   bound, smaller)))
1100                 return false;
1101             }
1102           else
1103             return false;
1104         }
1105       else
1106         {
1107           /* We got here if the condition is false, i.e., SMALLER > LARGER.  */
1108           if (!operand_equal_for_phi_arg_p (lhs, arg_false))
1109             return false;
1110
1111           if (operand_equal_for_phi_arg_p (arg_true, larger))
1112             {
1113               /* Case
1114
1115                  if (smaller > larger)
1116                    {
1117                      r' = MIN_EXPR (smaller, bound)
1118                    }
1119                  r = PHI <r', larger>  --> to be turned to MAX_EXPR.  */
1120               if (ass_code != MIN_EXPR)
1121                 return false;
1122
1123               minmax = MAX_EXPR;
1124               if (operand_equal_for_phi_arg_p (op0, smaller))
1125                 bound = op1;
1126               else if (operand_equal_for_phi_arg_p (op1, smaller))
1127                 bound = op0;
1128               else
1129                 return false;
1130
1131               /* We need BOUND >= LARGER.  */
1132               if (!integer_nonzerop (fold_build2 (GE_EXPR, boolean_type_node,
1133                                                   bound, larger)))
1134                 return false;
1135             }
1136           else if (operand_equal_for_phi_arg_p (arg_true, smaller))
1137             {
1138               /* Case
1139
1140                  if (smaller > larger)
1141                    {
1142                      r' = MAX_EXPR (larger, bound)
1143                    }
1144                  r = PHI <r', smaller>  --> to be turned to MIN_EXPR.  */
1145               if (ass_code != MAX_EXPR)
1146                 return false;
1147
1148               minmax = MIN_EXPR;
1149               if (operand_equal_for_phi_arg_p (op0, larger))
1150                 bound = op1;
1151               else if (operand_equal_for_phi_arg_p (op1, larger))
1152                 bound = op0;
1153               else
1154                 return false;
1155
1156               /* We need BOUND <= SMALLER.  */
1157               if (!integer_nonzerop (fold_build2 (LE_EXPR, boolean_type_node,
1158                                                   bound, smaller)))
1159                 return false;
1160             }
1161           else
1162             return false;
1163         }
1164
1165       /* Move the statement from the middle block.  */
1166       gsi = gsi_last_bb (cond_bb);
1167       gsi_from = gsi_last_nondebug_bb (middle_bb);
1168       gsi_move_before (&gsi_from, &gsi);
1169     }
1170
1171   /* Emit the statement to compute min/max.  */
1172   result = duplicate_ssa_name (PHI_RESULT (phi), NULL);
1173   new_stmt = gimple_build_assign (result, minmax, arg0, arg1);
1174   gsi = gsi_last_bb (cond_bb);
1175   gsi_insert_before (&gsi, new_stmt, GSI_NEW_STMT);
1176
1177   replace_phi_edge_with_variable (cond_bb, e1, phi, result);
1178   reset_flow_sensitive_info_in_bb (cond_bb);
1179
1180   return true;
1181 }
1182
1183 /*  The function absolute_replacement does the main work of doing the absolute
1184     replacement.  Return true if the replacement is done.  Otherwise return
1185     false.
1186     bb is the basic block where the replacement is going to be done on.  arg0
1187     is argument 0 from the phi.  Likewise for arg1.  */
1188
1189 static bool
1190 abs_replacement (basic_block cond_bb, basic_block middle_bb,
1191                  edge e0 ATTRIBUTE_UNUSED, edge e1,
1192                  gimple phi, tree arg0, tree arg1)
1193 {
1194   tree result;
1195   gassign *new_stmt;
1196   gimple cond;
1197   gimple_stmt_iterator gsi;
1198   edge true_edge, false_edge;
1199   gimple assign;
1200   edge e;
1201   tree rhs, lhs;
1202   bool negate;
1203   enum tree_code cond_code;
1204
1205   /* If the type says honor signed zeros we cannot do this
1206      optimization.  */
1207   if (HONOR_SIGNED_ZEROS (arg1))
1208     return false;
1209
1210   /* OTHER_BLOCK must have only one executable statement which must have the
1211      form arg0 = -arg1 or arg1 = -arg0.  */
1212
1213   assign = last_and_only_stmt (middle_bb);
1214   /* If we did not find the proper negation assignment, then we can not
1215      optimize.  */
1216   if (assign == NULL)
1217     return false;
1218
1219   /* If we got here, then we have found the only executable statement
1220      in OTHER_BLOCK.  If it is anything other than arg = -arg1 or
1221      arg1 = -arg0, then we can not optimize.  */
1222   if (gimple_code (assign) != GIMPLE_ASSIGN)
1223     return false;
1224
1225   lhs = gimple_assign_lhs (assign);
1226
1227   if (gimple_assign_rhs_code (assign) != NEGATE_EXPR)
1228     return false;
1229
1230   rhs = gimple_assign_rhs1 (assign);
1231
1232   /* The assignment has to be arg0 = -arg1 or arg1 = -arg0.  */
1233   if (!(lhs == arg0 && rhs == arg1)
1234       && !(lhs == arg1 && rhs == arg0))
1235     return false;
1236
1237   cond = last_stmt (cond_bb);
1238   result = PHI_RESULT (phi);
1239
1240   /* Only relationals comparing arg[01] against zero are interesting.  */
1241   cond_code = gimple_cond_code (cond);
1242   if (cond_code != GT_EXPR && cond_code != GE_EXPR
1243       && cond_code != LT_EXPR && cond_code != LE_EXPR)
1244     return false;
1245
1246   /* Make sure the conditional is arg[01] OP y.  */
1247   if (gimple_cond_lhs (cond) != rhs)
1248     return false;
1249
1250   if (FLOAT_TYPE_P (TREE_TYPE (gimple_cond_rhs (cond)))
1251                ? real_zerop (gimple_cond_rhs (cond))
1252                : integer_zerop (gimple_cond_rhs (cond)))
1253     ;
1254   else
1255     return false;
1256
1257   /* We need to know which is the true edge and which is the false
1258      edge so that we know if have abs or negative abs.  */
1259   extract_true_false_edges_from_block (cond_bb, &true_edge, &false_edge);
1260
1261   /* For GT_EXPR/GE_EXPR, if the true edge goes to OTHER_BLOCK, then we
1262      will need to negate the result.  Similarly for LT_EXPR/LE_EXPR if
1263      the false edge goes to OTHER_BLOCK.  */
1264   if (cond_code == GT_EXPR || cond_code == GE_EXPR)
1265     e = true_edge;
1266   else
1267     e = false_edge;
1268
1269   if (e->dest == middle_bb)
1270     negate = true;
1271   else
1272     negate = false;
1273
1274   result = duplicate_ssa_name (result, NULL);
1275
1276   if (negate)
1277     lhs = make_ssa_name (TREE_TYPE (result));
1278   else
1279     lhs = result;
1280
1281   /* Build the modify expression with abs expression.  */
1282   new_stmt = gimple_build_assign (lhs, ABS_EXPR, rhs);
1283
1284   gsi = gsi_last_bb (cond_bb);
1285   gsi_insert_before (&gsi, new_stmt, GSI_NEW_STMT);
1286
1287   if (negate)
1288     {
1289       /* Get the right GSI.  We want to insert after the recently
1290          added ABS_EXPR statement (which we know is the first statement
1291          in the block.  */
1292       new_stmt = gimple_build_assign (result, NEGATE_EXPR, lhs);
1293
1294       gsi_insert_after (&gsi, new_stmt, GSI_NEW_STMT);
1295     }
1296
1297   replace_phi_edge_with_variable (cond_bb, e1, phi, result);
1298   reset_flow_sensitive_info_in_bb (cond_bb);
1299
1300   /* Note that we optimized this PHI.  */
1301   return true;
1302 }
1303
1304 /* Auxiliary functions to determine the set of memory accesses which
1305    can't trap because they are preceded by accesses to the same memory
1306    portion.  We do that for MEM_REFs, so we only need to track
1307    the SSA_NAME of the pointer indirectly referenced.  The algorithm
1308    simply is a walk over all instructions in dominator order.  When
1309    we see an MEM_REF we determine if we've already seen a same
1310    ref anywhere up to the root of the dominator tree.  If we do the
1311    current access can't trap.  If we don't see any dominating access
1312    the current access might trap, but might also make later accesses
1313    non-trapping, so we remember it.  We need to be careful with loads
1314    or stores, for instance a load might not trap, while a store would,
1315    so if we see a dominating read access this doesn't mean that a later
1316    write access would not trap.  Hence we also need to differentiate the
1317    type of access(es) seen.
1318
1319    ??? We currently are very conservative and assume that a load might
1320    trap even if a store doesn't (write-only memory).  This probably is
1321    overly conservative.  */
1322
1323 /* A hash-table of SSA_NAMEs, and in which basic block an MEM_REF
1324    through it was seen, which would constitute a no-trap region for
1325    same accesses.  */
1326 struct name_to_bb
1327 {
1328   unsigned int ssa_name_ver;
1329   unsigned int phase;
1330   bool store;
1331   HOST_WIDE_INT offset, size;
1332   basic_block bb;
1333 };
1334
1335 /* Hashtable helpers.  */
1336
1337 struct ssa_names_hasher : typed_free_remove <name_to_bb>
1338 {
1339   typedef name_to_bb value_type;
1340   typedef name_to_bb compare_type;
1341   static inline hashval_t hash (const value_type *);
1342   static inline bool equal (const value_type *, const compare_type *);
1343 };
1344
1345 /* Used for quick clearing of the hash-table when we see calls.
1346    Hash entries with phase < nt_call_phase are invalid.  */
1347 static unsigned int nt_call_phase;
1348
1349 /* The hash function.  */
1350
1351 inline hashval_t
1352 ssa_names_hasher::hash (const value_type *n)
1353 {
1354   return n->ssa_name_ver ^ (((hashval_t) n->store) << 31)
1355          ^ (n->offset << 6) ^ (n->size << 3);
1356 }
1357
1358 /* The equality function of *P1 and *P2.  */
1359
1360 inline bool
1361 ssa_names_hasher::equal (const value_type *n1, const compare_type *n2)
1362 {
1363   return n1->ssa_name_ver == n2->ssa_name_ver
1364          && n1->store == n2->store
1365          && n1->offset == n2->offset
1366          && n1->size == n2->size;
1367 }
1368
1369 class nontrapping_dom_walker : public dom_walker
1370 {
1371 public:
1372   nontrapping_dom_walker (cdi_direction direction, hash_set<tree> *ps)
1373     : dom_walker (direction), m_nontrapping (ps), m_seen_ssa_names (128) {}
1374
1375   virtual void before_dom_children (basic_block);
1376   virtual void after_dom_children (basic_block);
1377
1378 private:
1379
1380   /* We see the expression EXP in basic block BB.  If it's an interesting
1381      expression (an MEM_REF through an SSA_NAME) possibly insert the
1382      expression into the set NONTRAP or the hash table of seen expressions.
1383      STORE is true if this expression is on the LHS, otherwise it's on
1384      the RHS.  */
1385   void add_or_mark_expr (basic_block, tree, bool);
1386
1387   hash_set<tree> *m_nontrapping;
1388
1389   /* The hash table for remembering what we've seen.  */
1390   hash_table<ssa_names_hasher> m_seen_ssa_names;
1391 };
1392
1393 /* Called by walk_dominator_tree, when entering the block BB.  */
1394 void
1395 nontrapping_dom_walker::before_dom_children (basic_block bb)
1396 {
1397   edge e;
1398   edge_iterator ei;
1399   gimple_stmt_iterator gsi;
1400
1401   /* If we haven't seen all our predecessors, clear the hash-table.  */
1402   FOR_EACH_EDGE (e, ei, bb->preds)
1403     if ((((size_t)e->src->aux) & 2) == 0)
1404       {
1405         nt_call_phase++;
1406         break;
1407       }
1408
1409   /* Mark this BB as being on the path to dominator root and as visited.  */
1410   bb->aux = (void*)(1 | 2);
1411
1412   /* And walk the statements in order.  */
1413   for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1414     {
1415       gimple stmt = gsi_stmt (gsi);
1416
1417       if (is_gimple_call (stmt) && !nonfreeing_call_p (stmt))
1418         nt_call_phase++;
1419       else if (gimple_assign_single_p (stmt) && !gimple_has_volatile_ops (stmt))
1420         {
1421           add_or_mark_expr (bb, gimple_assign_lhs (stmt), true);
1422           add_or_mark_expr (bb, gimple_assign_rhs1 (stmt), false);
1423         }
1424     }
1425 }
1426
1427 /* Called by walk_dominator_tree, when basic block BB is exited.  */
1428 void
1429 nontrapping_dom_walker::after_dom_children (basic_block bb)
1430 {
1431   /* This BB isn't on the path to dominator root anymore.  */
1432   bb->aux = (void*)2;
1433 }
1434
1435 /* We see the expression EXP in basic block BB.  If it's an interesting
1436    expression (an MEM_REF through an SSA_NAME) possibly insert the
1437    expression into the set NONTRAP or the hash table of seen expressions.
1438    STORE is true if this expression is on the LHS, otherwise it's on
1439    the RHS.  */
1440 void
1441 nontrapping_dom_walker::add_or_mark_expr (basic_block bb, tree exp, bool store)
1442 {
1443   HOST_WIDE_INT size;
1444
1445   if (TREE_CODE (exp) == MEM_REF
1446       && TREE_CODE (TREE_OPERAND (exp, 0)) == SSA_NAME
1447       && tree_fits_shwi_p (TREE_OPERAND (exp, 1))
1448       && (size = int_size_in_bytes (TREE_TYPE (exp))) > 0)
1449     {
1450       tree name = TREE_OPERAND (exp, 0);
1451       struct name_to_bb map;
1452       name_to_bb **slot;
1453       struct name_to_bb *n2bb;
1454       basic_block found_bb = 0;
1455
1456       /* Try to find the last seen MEM_REF through the same
1457          SSA_NAME, which can trap.  */
1458       map.ssa_name_ver = SSA_NAME_VERSION (name);
1459       map.phase = 0;
1460       map.bb = 0;
1461       map.store = store;
1462       map.offset = tree_to_shwi (TREE_OPERAND (exp, 1));
1463       map.size = size;
1464
1465       slot = m_seen_ssa_names.find_slot (&map, INSERT);
1466       n2bb = *slot;
1467       if (n2bb && n2bb->phase >= nt_call_phase)
1468         found_bb = n2bb->bb;
1469
1470       /* If we've found a trapping MEM_REF, _and_ it dominates EXP
1471          (it's in a basic block on the path from us to the dominator root)
1472          then we can't trap.  */
1473       if (found_bb && (((size_t)found_bb->aux) & 1) == 1)
1474         {
1475           m_nontrapping->add (exp);
1476         }
1477       else
1478         {
1479           /* EXP might trap, so insert it into the hash table.  */
1480           if (n2bb)
1481             {
1482               n2bb->phase = nt_call_phase;
1483               n2bb->bb = bb;
1484             }
1485           else
1486             {
1487               n2bb = XNEW (struct name_to_bb);
1488               n2bb->ssa_name_ver = SSA_NAME_VERSION (name);
1489               n2bb->phase = nt_call_phase;
1490               n2bb->bb = bb;
1491               n2bb->store = store;
1492               n2bb->offset = map.offset;
1493               n2bb->size = size;
1494               *slot = n2bb;
1495             }
1496         }
1497     }
1498 }
1499
1500 /* This is the entry point of gathering non trapping memory accesses.
1501    It will do a dominator walk over the whole function, and it will
1502    make use of the bb->aux pointers.  It returns a set of trees
1503    (the MEM_REFs itself) which can't trap.  */
1504 static hash_set<tree> *
1505 get_non_trapping (void)
1506 {
1507   nt_call_phase = 0;
1508   hash_set<tree> *nontrap = new hash_set<tree>;
1509   /* We're going to do a dominator walk, so ensure that we have
1510      dominance information.  */
1511   calculate_dominance_info (CDI_DOMINATORS);
1512
1513   nontrapping_dom_walker (CDI_DOMINATORS, nontrap)
1514     .walk (cfun->cfg->x_entry_block_ptr);
1515
1516   clear_aux_for_blocks ();
1517   return nontrap;
1518 }
1519
1520 /* Do the main work of conditional store replacement.  We already know
1521    that the recognized pattern looks like so:
1522
1523    split:
1524      if (cond) goto MIDDLE_BB; else goto JOIN_BB (edge E1)
1525    MIDDLE_BB:
1526      something
1527      fallthrough (edge E0)
1528    JOIN_BB:
1529      some more
1530
1531    We check that MIDDLE_BB contains only one store, that that store
1532    doesn't trap (not via NOTRAP, but via checking if an access to the same
1533    memory location dominates us) and that the store has a "simple" RHS.  */
1534
1535 static bool
1536 cond_store_replacement (basic_block middle_bb, basic_block join_bb,
1537                         edge e0, edge e1, hash_set<tree> *nontrap)
1538 {
1539   gimple assign = last_and_only_stmt (middle_bb);
1540   tree lhs, rhs, name, name2;
1541   gphi *newphi;
1542   gassign *new_stmt;
1543   gimple_stmt_iterator gsi;
1544   source_location locus;
1545
1546   /* Check if middle_bb contains of only one store.  */
1547   if (!assign
1548       || !gimple_assign_single_p (assign)
1549       || gimple_has_volatile_ops (assign))
1550     return false;
1551
1552   locus = gimple_location (assign);
1553   lhs = gimple_assign_lhs (assign);
1554   rhs = gimple_assign_rhs1 (assign);
1555   if (TREE_CODE (lhs) != MEM_REF
1556       || TREE_CODE (TREE_OPERAND (lhs, 0)) != SSA_NAME
1557       || !is_gimple_reg_type (TREE_TYPE (lhs)))
1558     return false;
1559
1560   /* Prove that we can move the store down.  We could also check
1561      TREE_THIS_NOTRAP here, but in that case we also could move stores,
1562      whose value is not available readily, which we want to avoid.  */
1563   if (!nontrap->contains (lhs))
1564     return false;
1565
1566   /* Now we've checked the constraints, so do the transformation:
1567      1) Remove the single store.  */
1568   gsi = gsi_for_stmt (assign);
1569   unlink_stmt_vdef (assign);
1570   gsi_remove (&gsi, true);
1571   release_defs (assign);
1572
1573   /* 2) Insert a load from the memory of the store to the temporary
1574         on the edge which did not contain the store.  */
1575   lhs = unshare_expr (lhs);
1576   name = make_temp_ssa_name (TREE_TYPE (lhs), NULL, "cstore");
1577   new_stmt = gimple_build_assign (name, lhs);
1578   gimple_set_location (new_stmt, locus);
1579   gsi_insert_on_edge (e1, new_stmt);
1580
1581   /* 3) Create a PHI node at the join block, with one argument
1582         holding the old RHS, and the other holding the temporary
1583         where we stored the old memory contents.  */
1584   name2 = make_temp_ssa_name (TREE_TYPE (lhs), NULL, "cstore");
1585   newphi = create_phi_node (name2, join_bb);
1586   add_phi_arg (newphi, rhs, e0, locus);
1587   add_phi_arg (newphi, name, e1, locus);
1588
1589   lhs = unshare_expr (lhs);
1590   new_stmt = gimple_build_assign (lhs, PHI_RESULT (newphi));
1591
1592   /* 4) Insert that PHI node.  */
1593   gsi = gsi_after_labels (join_bb);
1594   if (gsi_end_p (gsi))
1595     {
1596       gsi = gsi_last_bb (join_bb);
1597       gsi_insert_after (&gsi, new_stmt, GSI_NEW_STMT);
1598     }
1599   else
1600     gsi_insert_before (&gsi, new_stmt, GSI_NEW_STMT);
1601
1602   return true;
1603 }
1604
1605 /* Do the main work of conditional store replacement.  */
1606
1607 static bool
1608 cond_if_else_store_replacement_1 (basic_block then_bb, basic_block else_bb,
1609                                   basic_block join_bb, gimple then_assign,
1610                                   gimple else_assign)
1611 {
1612   tree lhs_base, lhs, then_rhs, else_rhs, name;
1613   source_location then_locus, else_locus;
1614   gimple_stmt_iterator gsi;
1615   gphi *newphi;
1616   gassign *new_stmt;
1617
1618   if (then_assign == NULL
1619       || !gimple_assign_single_p (then_assign)
1620       || gimple_clobber_p (then_assign)
1621       || gimple_has_volatile_ops (then_assign)
1622       || else_assign == NULL
1623       || !gimple_assign_single_p (else_assign)
1624       || gimple_clobber_p (else_assign)
1625       || gimple_has_volatile_ops (else_assign))
1626     return false;
1627
1628   lhs = gimple_assign_lhs (then_assign);
1629   if (!is_gimple_reg_type (TREE_TYPE (lhs))
1630       || !operand_equal_p (lhs, gimple_assign_lhs (else_assign), 0))
1631     return false;
1632
1633   lhs_base = get_base_address (lhs);
1634   if (lhs_base == NULL_TREE
1635       || (!DECL_P (lhs_base) && TREE_CODE (lhs_base) != MEM_REF))
1636     return false;
1637
1638   then_rhs = gimple_assign_rhs1 (then_assign);
1639   else_rhs = gimple_assign_rhs1 (else_assign);
1640   then_locus = gimple_location (then_assign);
1641   else_locus = gimple_location (else_assign);
1642
1643   /* Now we've checked the constraints, so do the transformation:
1644      1) Remove the stores.  */
1645   gsi = gsi_for_stmt (then_assign);
1646   unlink_stmt_vdef (then_assign);
1647   gsi_remove (&gsi, true);
1648   release_defs (then_assign);
1649
1650   gsi = gsi_for_stmt (else_assign);
1651   unlink_stmt_vdef (else_assign);
1652   gsi_remove (&gsi, true);
1653   release_defs (else_assign);
1654
1655   /* 2) Create a PHI node at the join block, with one argument
1656         holding the old RHS, and the other holding the temporary
1657         where we stored the old memory contents.  */
1658   name = make_temp_ssa_name (TREE_TYPE (lhs), NULL, "cstore");
1659   newphi = create_phi_node (name, join_bb);
1660   add_phi_arg (newphi, then_rhs, EDGE_SUCC (then_bb, 0), then_locus);
1661   add_phi_arg (newphi, else_rhs, EDGE_SUCC (else_bb, 0), else_locus);
1662
1663   new_stmt = gimple_build_assign (lhs, PHI_RESULT (newphi));
1664
1665   /* 3) Insert that PHI node.  */
1666   gsi = gsi_after_labels (join_bb);
1667   if (gsi_end_p (gsi))
1668     {
1669       gsi = gsi_last_bb (join_bb);
1670       gsi_insert_after (&gsi, new_stmt, GSI_NEW_STMT);
1671     }
1672   else
1673     gsi_insert_before (&gsi, new_stmt, GSI_NEW_STMT);
1674
1675   return true;
1676 }
1677
1678 /* Conditional store replacement.  We already know
1679    that the recognized pattern looks like so:
1680
1681    split:
1682      if (cond) goto THEN_BB; else goto ELSE_BB (edge E1)
1683    THEN_BB:
1684      ...
1685      X = Y;
1686      ...
1687      goto JOIN_BB;
1688    ELSE_BB:
1689      ...
1690      X = Z;
1691      ...
1692      fallthrough (edge E0)
1693    JOIN_BB:
1694      some more
1695
1696    We check that it is safe to sink the store to JOIN_BB by verifying that
1697    there are no read-after-write or write-after-write dependencies in
1698    THEN_BB and ELSE_BB.  */
1699
1700 static bool
1701 cond_if_else_store_replacement (basic_block then_bb, basic_block else_bb,
1702                                 basic_block join_bb)
1703 {
1704   gimple then_assign = last_and_only_stmt (then_bb);
1705   gimple else_assign = last_and_only_stmt (else_bb);
1706   vec<data_reference_p> then_datarefs, else_datarefs;
1707   vec<ddr_p> then_ddrs, else_ddrs;
1708   gimple then_store, else_store;
1709   bool found, ok = false, res;
1710   struct data_dependence_relation *ddr;
1711   data_reference_p then_dr, else_dr;
1712   int i, j;
1713   tree then_lhs, else_lhs;
1714   basic_block blocks[3];
1715
1716   if (MAX_STORES_TO_SINK == 0)
1717     return false;
1718
1719   /* Handle the case with single statement in THEN_BB and ELSE_BB.  */
1720   if (then_assign && else_assign)
1721     return cond_if_else_store_replacement_1 (then_bb, else_bb, join_bb,
1722                                              then_assign, else_assign);
1723
1724   /* Find data references.  */
1725   then_datarefs.create (1);
1726   else_datarefs.create (1);
1727   if ((find_data_references_in_bb (NULL, then_bb, &then_datarefs)
1728         == chrec_dont_know)
1729       || !then_datarefs.length ()
1730       || (find_data_references_in_bb (NULL, else_bb, &else_datarefs)
1731           == chrec_dont_know)
1732       || !else_datarefs.length ())
1733     {
1734       free_data_refs (then_datarefs);
1735       free_data_refs (else_datarefs);
1736       return false;
1737     }
1738
1739   /* Find pairs of stores with equal LHS.  */
1740   auto_vec<gimple, 1> then_stores, else_stores;
1741   FOR_EACH_VEC_ELT (then_datarefs, i, then_dr)
1742     {
1743       if (DR_IS_READ (then_dr))
1744         continue;
1745
1746       then_store = DR_STMT (then_dr);
1747       then_lhs = gimple_get_lhs (then_store);
1748       if (then_lhs == NULL_TREE)
1749         continue;
1750       found = false;
1751
1752       FOR_EACH_VEC_ELT (else_datarefs, j, else_dr)
1753         {
1754           if (DR_IS_READ (else_dr))
1755             continue;
1756
1757           else_store = DR_STMT (else_dr);
1758           else_lhs = gimple_get_lhs (else_store);
1759           if (else_lhs == NULL_TREE)
1760             continue;
1761
1762           if (operand_equal_p (then_lhs, else_lhs, 0))
1763             {
1764               found = true;
1765               break;
1766             }
1767         }
1768
1769       if (!found)
1770         continue;
1771
1772       then_stores.safe_push (then_store);
1773       else_stores.safe_push (else_store);
1774     }
1775
1776   /* No pairs of stores found.  */
1777   if (!then_stores.length ()
1778       || then_stores.length () > (unsigned) MAX_STORES_TO_SINK)
1779     {
1780       free_data_refs (then_datarefs);
1781       free_data_refs (else_datarefs);
1782       return false;
1783     }
1784
1785   /* Compute and check data dependencies in both basic blocks.  */
1786   then_ddrs.create (1);
1787   else_ddrs.create (1);
1788   if (!compute_all_dependences (then_datarefs, &then_ddrs,
1789                                 vNULL, false)
1790       || !compute_all_dependences (else_datarefs, &else_ddrs,
1791                                    vNULL, false))
1792     {
1793       free_dependence_relations (then_ddrs);
1794       free_dependence_relations (else_ddrs);
1795       free_data_refs (then_datarefs);
1796       free_data_refs (else_datarefs);
1797       return false;
1798     }
1799   blocks[0] = then_bb;
1800   blocks[1] = else_bb;
1801   blocks[2] = join_bb;
1802   renumber_gimple_stmt_uids_in_blocks (blocks, 3);
1803
1804   /* Check that there are no read-after-write or write-after-write dependencies
1805      in THEN_BB.  */
1806   FOR_EACH_VEC_ELT (then_ddrs, i, ddr)
1807     {
1808       struct data_reference *dra = DDR_A (ddr);
1809       struct data_reference *drb = DDR_B (ddr);
1810
1811       if (DDR_ARE_DEPENDENT (ddr) != chrec_known
1812           && ((DR_IS_READ (dra) && DR_IS_WRITE (drb)
1813                && gimple_uid (DR_STMT (dra)) > gimple_uid (DR_STMT (drb)))
1814               || (DR_IS_READ (drb) && DR_IS_WRITE (dra)
1815                   && gimple_uid (DR_STMT (drb)) > gimple_uid (DR_STMT (dra)))
1816               || (DR_IS_WRITE (dra) && DR_IS_WRITE (drb))))
1817         {
1818           free_dependence_relations (then_ddrs);
1819           free_dependence_relations (else_ddrs);
1820           free_data_refs (then_datarefs);
1821           free_data_refs (else_datarefs);
1822           return false;
1823         }
1824     }
1825
1826   /* Check that there are no read-after-write or write-after-write dependencies
1827      in ELSE_BB.  */
1828   FOR_EACH_VEC_ELT (else_ddrs, i, ddr)
1829     {
1830       struct data_reference *dra = DDR_A (ddr);
1831       struct data_reference *drb = DDR_B (ddr);
1832
1833       if (DDR_ARE_DEPENDENT (ddr) != chrec_known
1834           && ((DR_IS_READ (dra) && DR_IS_WRITE (drb)
1835                && gimple_uid (DR_STMT (dra)) > gimple_uid (DR_STMT (drb)))
1836               || (DR_IS_READ (drb) && DR_IS_WRITE (dra)
1837                   && gimple_uid (DR_STMT (drb)) > gimple_uid (DR_STMT (dra)))
1838               || (DR_IS_WRITE (dra) && DR_IS_WRITE (drb))))
1839         {
1840           free_dependence_relations (then_ddrs);
1841           free_dependence_relations (else_ddrs);
1842           free_data_refs (then_datarefs);
1843           free_data_refs (else_datarefs);
1844           return false;
1845         }
1846     }
1847
1848   /* Sink stores with same LHS.  */
1849   FOR_EACH_VEC_ELT (then_stores, i, then_store)
1850     {
1851       else_store = else_stores[i];
1852       res = cond_if_else_store_replacement_1 (then_bb, else_bb, join_bb,
1853                                               then_store, else_store);
1854       ok = ok || res;
1855     }
1856
1857   free_dependence_relations (then_ddrs);
1858   free_dependence_relations (else_ddrs);
1859   free_data_refs (then_datarefs);
1860   free_data_refs (else_datarefs);
1861
1862   return ok;
1863 }
1864
1865 /* Return TRUE if STMT has a VUSE whose corresponding VDEF is in BB.  */
1866
1867 static bool
1868 local_mem_dependence (gimple stmt, basic_block bb)
1869 {
1870   tree vuse = gimple_vuse (stmt);
1871   gimple def;
1872
1873   if (!vuse)
1874     return false;
1875
1876   def = SSA_NAME_DEF_STMT (vuse);
1877   return (def && gimple_bb (def) == bb);
1878 }
1879
1880 /* Given a "diamond" control-flow pattern where BB0 tests a condition,
1881    BB1 and BB2 are "then" and "else" blocks dependent on this test,
1882    and BB3 rejoins control flow following BB1 and BB2, look for
1883    opportunities to hoist loads as follows.  If BB3 contains a PHI of
1884    two loads, one each occurring in BB1 and BB2, and the loads are
1885    provably of adjacent fields in the same structure, then move both
1886    loads into BB0.  Of course this can only be done if there are no
1887    dependencies preventing such motion.
1888
1889    One of the hoisted loads will always be speculative, so the
1890    transformation is currently conservative:
1891
1892     - The fields must be strictly adjacent.
1893     - The two fields must occupy a single memory block that is
1894       guaranteed to not cross a page boundary.
1895
1896     The last is difficult to prove, as such memory blocks should be
1897     aligned on the minimum of the stack alignment boundary and the
1898     alignment guaranteed by heap allocation interfaces.  Thus we rely
1899     on a parameter for the alignment value.
1900
1901     Provided a good value is used for the last case, the first
1902     restriction could possibly be relaxed.  */
1903
1904 static void
1905 hoist_adjacent_loads (basic_block bb0, basic_block bb1,
1906                       basic_block bb2, basic_block bb3)
1907 {
1908   int param_align = PARAM_VALUE (PARAM_L1_CACHE_LINE_SIZE);
1909   unsigned param_align_bits = (unsigned) (param_align * BITS_PER_UNIT);
1910   gphi_iterator gsi;
1911
1912   /* Walk the phis in bb3 looking for an opportunity.  We are looking
1913      for phis of two SSA names, one each of which is defined in bb1 and
1914      bb2.  */
1915   for (gsi = gsi_start_phis (bb3); !gsi_end_p (gsi); gsi_next (&gsi))
1916     {
1917       gphi *phi_stmt = gsi.phi ();
1918       gimple def1, def2, defswap;
1919       tree arg1, arg2, ref1, ref2, field1, field2, fieldswap;
1920       tree tree_offset1, tree_offset2, tree_size2, next;
1921       int offset1, offset2, size2;
1922       unsigned align1;
1923       gimple_stmt_iterator gsi2;
1924       basic_block bb_for_def1, bb_for_def2;
1925
1926       if (gimple_phi_num_args (phi_stmt) != 2
1927           || virtual_operand_p (gimple_phi_result (phi_stmt)))
1928         continue;
1929
1930       arg1 = gimple_phi_arg_def (phi_stmt, 0);
1931       arg2 = gimple_phi_arg_def (phi_stmt, 1);
1932
1933       if (TREE_CODE (arg1) != SSA_NAME
1934           || TREE_CODE (arg2) != SSA_NAME
1935           || SSA_NAME_IS_DEFAULT_DEF (arg1)
1936           || SSA_NAME_IS_DEFAULT_DEF (arg2))
1937         continue;
1938
1939       def1 = SSA_NAME_DEF_STMT (arg1);
1940       def2 = SSA_NAME_DEF_STMT (arg2);
1941
1942       if ((gimple_bb (def1) != bb1 || gimple_bb (def2) != bb2)
1943           && (gimple_bb (def2) != bb1 || gimple_bb (def1) != bb2))
1944         continue;
1945
1946       /* Check the mode of the arguments to be sure a conditional move
1947          can be generated for it.  */
1948       if (optab_handler (movcc_optab, TYPE_MODE (TREE_TYPE (arg1)))
1949           == CODE_FOR_nothing)
1950         continue;
1951
1952       /* Both statements must be assignments whose RHS is a COMPONENT_REF.  */
1953       if (!gimple_assign_single_p (def1)
1954           || !gimple_assign_single_p (def2)
1955           || gimple_has_volatile_ops (def1)
1956           || gimple_has_volatile_ops (def2))
1957         continue;
1958
1959       ref1 = gimple_assign_rhs1 (def1);
1960       ref2 = gimple_assign_rhs1 (def2);
1961
1962       if (TREE_CODE (ref1) != COMPONENT_REF
1963           || TREE_CODE (ref2) != COMPONENT_REF)
1964         continue;
1965
1966       /* The zeroth operand of the two component references must be
1967          identical.  It is not sufficient to compare get_base_address of
1968          the two references, because this could allow for different
1969          elements of the same array in the two trees.  It is not safe to
1970          assume that the existence of one array element implies the
1971          existence of a different one.  */
1972       if (!operand_equal_p (TREE_OPERAND (ref1, 0), TREE_OPERAND (ref2, 0), 0))
1973         continue;
1974
1975       field1 = TREE_OPERAND (ref1, 1);
1976       field2 = TREE_OPERAND (ref2, 1);
1977
1978       /* Check for field adjacency, and ensure field1 comes first.  */
1979       for (next = DECL_CHAIN (field1);
1980            next && TREE_CODE (next) != FIELD_DECL;
1981            next = DECL_CHAIN (next))
1982         ;
1983
1984       if (next != field2)
1985         {
1986           for (next = DECL_CHAIN (field2);
1987                next && TREE_CODE (next) != FIELD_DECL;
1988                next = DECL_CHAIN (next))
1989             ;
1990
1991           if (next != field1)
1992             continue;
1993
1994           fieldswap = field1;
1995           field1 = field2;
1996           field2 = fieldswap;
1997           defswap = def1;
1998           def1 = def2;
1999           def2 = defswap;
2000         }
2001
2002       bb_for_def1 = gimple_bb (def1);
2003       bb_for_def2 = gimple_bb (def2);
2004
2005       /* Check for proper alignment of the first field.  */
2006       tree_offset1 = bit_position (field1);
2007       tree_offset2 = bit_position (field2);
2008       tree_size2 = DECL_SIZE (field2);
2009
2010       if (!tree_fits_uhwi_p (tree_offset1)
2011           || !tree_fits_uhwi_p (tree_offset2)
2012           || !tree_fits_uhwi_p (tree_size2))
2013         continue;
2014
2015       offset1 = tree_to_uhwi (tree_offset1);
2016       offset2 = tree_to_uhwi (tree_offset2);
2017       size2 = tree_to_uhwi (tree_size2);
2018       align1 = DECL_ALIGN (field1) % param_align_bits;
2019
2020       if (offset1 % BITS_PER_UNIT != 0)
2021         continue;
2022
2023       /* For profitability, the two field references should fit within
2024          a single cache line.  */
2025       if (align1 + offset2 - offset1 + size2 > param_align_bits)
2026         continue;
2027
2028       /* The two expressions cannot be dependent upon vdefs defined
2029          in bb1/bb2.  */
2030       if (local_mem_dependence (def1, bb_for_def1)
2031           || local_mem_dependence (def2, bb_for_def2))
2032         continue;
2033
2034       /* The conditions are satisfied; hoist the loads from bb1 and bb2 into
2035          bb0.  We hoist the first one first so that a cache miss is handled
2036          efficiently regardless of hardware cache-fill policy.  */
2037       gsi2 = gsi_for_stmt (def1);
2038       gsi_move_to_bb_end (&gsi2, bb0);
2039       gsi2 = gsi_for_stmt (def2);
2040       gsi_move_to_bb_end (&gsi2, bb0);
2041
2042       if (dump_file && (dump_flags & TDF_DETAILS))
2043         {
2044           fprintf (dump_file,
2045                    "\nHoisting adjacent loads from %d and %d into %d: \n",
2046                    bb_for_def1->index, bb_for_def2->index, bb0->index);
2047           print_gimple_stmt (dump_file, def1, 0, TDF_VOPS|TDF_MEMSYMS);
2048           print_gimple_stmt (dump_file, def2, 0, TDF_VOPS|TDF_MEMSYMS);
2049         }
2050     }
2051 }
2052
2053 /* Determine whether we should attempt to hoist adjacent loads out of
2054    diamond patterns in pass_phiopt.  Always hoist loads if
2055    -fhoist-adjacent-loads is specified and the target machine has
2056    both a conditional move instruction and a defined cache line size.  */
2057
2058 static bool
2059 gate_hoist_loads (void)
2060 {
2061   return (flag_hoist_adjacent_loads == 1
2062           && PARAM_VALUE (PARAM_L1_CACHE_LINE_SIZE)
2063           && HAVE_conditional_move);
2064 }
2065
2066 /* This pass tries to replaces an if-then-else block with an
2067    assignment.  We have four kinds of transformations.  Some of these
2068    transformations are also performed by the ifcvt RTL optimizer.
2069
2070    Conditional Replacement
2071    -----------------------
2072
2073    This transformation, implemented in conditional_replacement,
2074    replaces
2075
2076      bb0:
2077       if (cond) goto bb2; else goto bb1;
2078      bb1:
2079      bb2:
2080       x = PHI <0 (bb1), 1 (bb0), ...>;
2081
2082    with
2083
2084      bb0:
2085       x' = cond;
2086       goto bb2;
2087      bb2:
2088       x = PHI <x' (bb0), ...>;
2089
2090    We remove bb1 as it becomes unreachable.  This occurs often due to
2091    gimplification of conditionals.
2092
2093    Value Replacement
2094    -----------------
2095
2096    This transformation, implemented in value_replacement, replaces
2097
2098      bb0:
2099        if (a != b) goto bb2; else goto bb1;
2100      bb1:
2101      bb2:
2102        x = PHI <a (bb1), b (bb0), ...>;
2103
2104    with
2105
2106      bb0:
2107      bb2:
2108        x = PHI <b (bb0), ...>;
2109
2110    This opportunity can sometimes occur as a result of other
2111    optimizations.
2112
2113
2114    Another case caught by value replacement looks like this:
2115
2116      bb0:
2117        t1 = a == CONST;
2118        t2 = b > c;
2119        t3 = t1 & t2;
2120        if (t3 != 0) goto bb1; else goto bb2;
2121      bb1:
2122      bb2:
2123        x = PHI (CONST, a)
2124
2125    Gets replaced with:
2126      bb0:
2127      bb2:
2128        t1 = a == CONST;
2129        t2 = b > c;
2130        t3 = t1 & t2;
2131        x = a;
2132
2133    ABS Replacement
2134    ---------------
2135
2136    This transformation, implemented in abs_replacement, replaces
2137
2138      bb0:
2139        if (a >= 0) goto bb2; else goto bb1;
2140      bb1:
2141        x = -a;
2142      bb2:
2143        x = PHI <x (bb1), a (bb0), ...>;
2144
2145    with
2146
2147      bb0:
2148        x' = ABS_EXPR< a >;
2149      bb2:
2150        x = PHI <x' (bb0), ...>;
2151
2152    MIN/MAX Replacement
2153    -------------------
2154
2155    This transformation, minmax_replacement replaces
2156
2157      bb0:
2158        if (a <= b) goto bb2; else goto bb1;
2159      bb1:
2160      bb2:
2161        x = PHI <b (bb1), a (bb0), ...>;
2162
2163    with
2164
2165      bb0:
2166        x' = MIN_EXPR (a, b)
2167      bb2:
2168        x = PHI <x' (bb0), ...>;
2169
2170    A similar transformation is done for MAX_EXPR.
2171
2172
2173    This pass also performs a fifth transformation of a slightly different
2174    flavor.
2175
2176    Adjacent Load Hoisting
2177    ----------------------
2178
2179    This transformation replaces
2180
2181      bb0:
2182        if (...) goto bb2; else goto bb1;
2183      bb1:
2184        x1 = (<expr>).field1;
2185        goto bb3;
2186      bb2:
2187        x2 = (<expr>).field2;
2188      bb3:
2189        # x = PHI <x1, x2>;
2190
2191    with
2192
2193      bb0:
2194        x1 = (<expr>).field1;
2195        x2 = (<expr>).field2;
2196        if (...) goto bb2; else goto bb1;
2197      bb1:
2198        goto bb3;
2199      bb2:
2200      bb3:
2201        # x = PHI <x1, x2>;
2202
2203    The purpose of this transformation is to enable generation of conditional
2204    move instructions such as Intel CMOVE or PowerPC ISEL.  Because one of
2205    the loads is speculative, the transformation is restricted to very
2206    specific cases to avoid introducing a page fault.  We are looking for
2207    the common idiom:
2208
2209      if (...)
2210        x = y->left;
2211      else
2212        x = y->right;
2213
2214    where left and right are typically adjacent pointers in a tree structure.  */
2215
2216 namespace {
2217
2218 const pass_data pass_data_phiopt =
2219 {
2220   GIMPLE_PASS, /* type */
2221   "phiopt", /* name */
2222   OPTGROUP_NONE, /* optinfo_flags */
2223   TV_TREE_PHIOPT, /* tv_id */
2224   ( PROP_cfg | PROP_ssa ), /* properties_required */
2225   0, /* properties_provided */
2226   0, /* properties_destroyed */
2227   0, /* todo_flags_start */
2228   0, /* todo_flags_finish */
2229 };
2230
2231 class pass_phiopt : public gimple_opt_pass
2232 {
2233 public:
2234   pass_phiopt (gcc::context *ctxt)
2235     : gimple_opt_pass (pass_data_phiopt, ctxt)
2236   {}
2237
2238   /* opt_pass methods: */
2239   opt_pass * clone () { return new pass_phiopt (m_ctxt); }
2240   virtual bool gate (function *) { return flag_ssa_phiopt; }
2241   virtual unsigned int execute (function *)
2242     {
2243       return tree_ssa_phiopt_worker (false, gate_hoist_loads ());
2244     }
2245
2246 }; // class pass_phiopt
2247
2248 } // anon namespace
2249
2250 gimple_opt_pass *
2251 make_pass_phiopt (gcc::context *ctxt)
2252 {
2253   return new pass_phiopt (ctxt);
2254 }
2255
2256 namespace {
2257
2258 const pass_data pass_data_cselim =
2259 {
2260   GIMPLE_PASS, /* type */
2261   "cselim", /* name */
2262   OPTGROUP_NONE, /* optinfo_flags */
2263   TV_TREE_PHIOPT, /* tv_id */
2264   ( PROP_cfg | PROP_ssa ), /* properties_required */
2265   0, /* properties_provided */
2266   0, /* properties_destroyed */
2267   0, /* todo_flags_start */
2268   0, /* todo_flags_finish */
2269 };
2270
2271 class pass_cselim : public gimple_opt_pass
2272 {
2273 public:
2274   pass_cselim (gcc::context *ctxt)
2275     : gimple_opt_pass (pass_data_cselim, ctxt)
2276   {}
2277
2278   /* opt_pass methods: */
2279   virtual bool gate (function *) { return flag_tree_cselim; }
2280   virtual unsigned int execute (function *) { return tree_ssa_cs_elim (); }
2281
2282 }; // class pass_cselim
2283
2284 } // anon namespace
2285
2286 gimple_opt_pass *
2287 make_pass_cselim (gcc::context *ctxt)
2288 {
2289   return new pass_cselim (ctxt);
2290 }