xref: /netbsd-src/external/gpl3/gcc.old/dist/gcc/tree-ssa-phiopt.c (revision bdc22b2e01993381dcefeff2bc9b56ca75a4235c)
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 }
2291