1 /* Optimization of PHI nodes by converting them into straightline code.
2    Copyright (C) 2004-2020 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 "backend.h"
24 #include "insn-codes.h"
25 #include "rtl.h"
26 #include "tree.h"
27 #include "gimple.h"
28 #include "cfghooks.h"
29 #include "tree-pass.h"
30 #include "ssa.h"
31 #include "optabs-tree.h"
32 #include "insn-config.h"
33 #include "gimple-pretty-print.h"
34 #include "fold-const.h"
35 #include "stor-layout.h"
36 #include "cfganal.h"
37 #include "gimplify.h"
38 #include "gimple-iterator.h"
39 #include "gimplify-me.h"
40 #include "tree-cfg.h"
41 #include "tree-dfa.h"
42 #include "domwalk.h"
43 #include "cfgloop.h"
44 #include "tree-data-ref.h"
45 #include "tree-scalar-evolution.h"
46 #include "tree-inline.h"
47 #include "case-cfn-macros.h"
48 #include "tree-eh.h"
49 
50 static unsigned int tree_ssa_phiopt_worker (bool, bool, bool);
51 static bool two_value_replacement (basic_block, basic_block, edge, gphi *,
52 				   tree, tree);
53 static bool conditional_replacement (basic_block, basic_block,
54 				     edge, edge, gphi *, tree, tree);
55 static gphi *factor_out_conditional_conversion (edge, edge, gphi *, tree, tree,
56 						gimple *);
57 static int value_replacement (basic_block, basic_block,
58 			      edge, edge, gimple *, tree, tree);
59 static bool minmax_replacement (basic_block, basic_block,
60 				edge, edge, gimple *, tree, tree);
61 static bool abs_replacement (basic_block, basic_block,
62 			     edge, edge, gimple *, tree, tree);
63 static bool cond_removal_in_popcount_pattern (basic_block, basic_block,
64 					      edge, edge, gimple *, tree, tree);
65 static bool cond_store_replacement (basic_block, basic_block, edge, edge,
66 				    hash_set<tree> *);
67 static bool cond_if_else_store_replacement (basic_block, basic_block, basic_block);
68 static hash_set<tree> * get_non_trapping ();
69 static void replace_phi_edge_with_variable (basic_block, edge, gimple *, tree);
70 static void hoist_adjacent_loads (basic_block, basic_block,
71 				  basic_block, basic_block);
72 static bool gate_hoist_loads (void);
73 
74 /* This pass tries to transform conditional stores into unconditional
75    ones, enabling further simplifications with the simpler then and else
76    blocks.  In particular it replaces this:
77 
78      bb0:
79        if (cond) goto bb2; else goto bb1;
80      bb1:
81        *p = RHS;
82      bb2:
83 
84    with
85 
86      bb0:
87        if (cond) goto bb1; else goto bb2;
88      bb1:
89        condtmp' = *p;
90      bb2:
91        condtmp = PHI <RHS, condtmp'>
92        *p = condtmp;
93 
94    This transformation can only be done under several constraints,
95    documented below.  It also replaces:
96 
97      bb0:
98        if (cond) goto bb2; else goto bb1;
99      bb1:
100        *p = RHS1;
101        goto bb3;
102      bb2:
103        *p = RHS2;
104      bb3:
105 
106    with
107 
108      bb0:
109        if (cond) goto bb3; else goto bb1;
110      bb1:
111      bb3:
112        condtmp = PHI <RHS1, RHS2>
113        *p = condtmp;  */
114 
115 static unsigned int
tree_ssa_cs_elim(void)116 tree_ssa_cs_elim (void)
117 {
118   unsigned todo;
119   /* ???  We are not interested in loop related info, but the following
120      will create it, ICEing as we didn't init loops with pre-headers.
121      An interfacing issue of find_data_references_in_bb.  */
122   loop_optimizer_init (LOOPS_NORMAL);
123   scev_initialize ();
124   todo = tree_ssa_phiopt_worker (true, false, false);
125   scev_finalize ();
126   loop_optimizer_finalize ();
127   return todo;
128 }
129 
130 /* Return the singleton PHI in the SEQ of PHIs for edges E0 and E1. */
131 
132 static gphi *
single_non_singleton_phi_for_edges(gimple_seq seq,edge e0,edge e1)133 single_non_singleton_phi_for_edges (gimple_seq seq, edge e0, edge e1)
134 {
135   gimple_stmt_iterator i;
136   gphi *phi = NULL;
137   if (gimple_seq_singleton_p (seq))
138     return as_a <gphi *> (gsi_stmt (gsi_start (seq)));
139   for (i = gsi_start (seq); !gsi_end_p (i); gsi_next (&i))
140     {
141       gphi *p = as_a <gphi *> (gsi_stmt (i));
142       /* If the PHI arguments are equal then we can skip this PHI. */
143       if (operand_equal_for_phi_arg_p (gimple_phi_arg_def (p, e0->dest_idx),
144 				       gimple_phi_arg_def (p, e1->dest_idx)))
145 	continue;
146 
147       /* If we already have a PHI that has the two edge arguments are
148 	 different, then return it is not a singleton for these PHIs. */
149       if (phi)
150 	return NULL;
151 
152       phi = p;
153     }
154   return phi;
155 }
156 
157 /* The core routine of conditional store replacement and normal
158    phi optimizations.  Both share much of the infrastructure in how
159    to match applicable basic block patterns.  DO_STORE_ELIM is true
160    when we want to do conditional store replacement, false otherwise.
161    DO_HOIST_LOADS is true when we want to hoist adjacent loads out
162    of diamond control flow patterns, false otherwise.  */
163 static unsigned int
tree_ssa_phiopt_worker(bool do_store_elim,bool do_hoist_loads,bool early_p)164 tree_ssa_phiopt_worker (bool do_store_elim, bool do_hoist_loads, bool early_p)
165 {
166   basic_block bb;
167   basic_block *bb_order;
168   unsigned n, i;
169   bool cfgchanged = false;
170   hash_set<tree> *nontrap = 0;
171 
172   if (do_store_elim)
173     /* Calculate the set of non-trapping memory accesses.  */
174     nontrap = get_non_trapping ();
175 
176   /* Search every basic block for COND_EXPR we may be able to optimize.
177 
178      We walk the blocks in order that guarantees that a block with
179      a single predecessor is processed before the predecessor.
180      This ensures that we collapse inner ifs before visiting the
181      outer ones, and also that we do not try to visit a removed
182      block.  */
183   bb_order = single_pred_before_succ_order ();
184   n = n_basic_blocks_for_fn (cfun) - NUM_FIXED_BLOCKS;
185 
186   for (i = 0; i < n; i++)
187     {
188       gimple *cond_stmt;
189       gphi *phi;
190       basic_block bb1, bb2;
191       edge e1, e2;
192       tree arg0, arg1;
193 
194       bb = bb_order[i];
195 
196       cond_stmt = last_stmt (bb);
197       /* Check to see if the last statement is a GIMPLE_COND.  */
198       if (!cond_stmt
199           || gimple_code (cond_stmt) != GIMPLE_COND)
200         continue;
201 
202       e1 = EDGE_SUCC (bb, 0);
203       bb1 = e1->dest;
204       e2 = EDGE_SUCC (bb, 1);
205       bb2 = e2->dest;
206 
207       /* We cannot do the optimization on abnormal edges.  */
208       if ((e1->flags & EDGE_ABNORMAL) != 0
209           || (e2->flags & EDGE_ABNORMAL) != 0)
210        continue;
211 
212       /* If either bb1's succ or bb2 or bb2's succ is non NULL.  */
213       if (EDGE_COUNT (bb1->succs) == 0
214           || bb2 == NULL
215 	  || EDGE_COUNT (bb2->succs) == 0)
216         continue;
217 
218       /* Find the bb which is the fall through to the other.  */
219       if (EDGE_SUCC (bb1, 0)->dest == bb2)
220         ;
221       else if (EDGE_SUCC (bb2, 0)->dest == bb1)
222         {
223 	  std::swap (bb1, bb2);
224 	  std::swap (e1, e2);
225 	}
226       else if (do_store_elim
227 	       && EDGE_SUCC (bb1, 0)->dest == EDGE_SUCC (bb2, 0)->dest)
228 	{
229 	  basic_block bb3 = EDGE_SUCC (bb1, 0)->dest;
230 
231 	  if (!single_succ_p (bb1)
232 	      || (EDGE_SUCC (bb1, 0)->flags & EDGE_FALLTHRU) == 0
233 	      || !single_succ_p (bb2)
234 	      || (EDGE_SUCC (bb2, 0)->flags & EDGE_FALLTHRU) == 0
235 	      || EDGE_COUNT (bb3->preds) != 2)
236 	    continue;
237 	  if (cond_if_else_store_replacement (bb1, bb2, bb3))
238 	    cfgchanged = true;
239 	  continue;
240 	}
241       else if (do_hoist_loads
242 	       && EDGE_SUCC (bb1, 0)->dest == EDGE_SUCC (bb2, 0)->dest)
243 	{
244 	  basic_block bb3 = EDGE_SUCC (bb1, 0)->dest;
245 
246 	  if (!FLOAT_TYPE_P (TREE_TYPE (gimple_cond_lhs (cond_stmt)))
247 	      && single_succ_p (bb1)
248 	      && single_succ_p (bb2)
249 	      && single_pred_p (bb1)
250 	      && single_pred_p (bb2)
251 	      && EDGE_COUNT (bb->succs) == 2
252 	      && EDGE_COUNT (bb3->preds) == 2
253 	      /* If one edge or the other is dominant, a conditional move
254 		 is likely to perform worse than the well-predicted branch.  */
255 	      && !predictable_edge_p (EDGE_SUCC (bb, 0))
256 	      && !predictable_edge_p (EDGE_SUCC (bb, 1)))
257 	    hoist_adjacent_loads (bb, bb1, bb2, bb3);
258 	  continue;
259 	}
260       else
261 	continue;
262 
263       e1 = EDGE_SUCC (bb1, 0);
264 
265       /* Make sure that bb1 is just a fall through.  */
266       if (!single_succ_p (bb1)
267 	  || (e1->flags & EDGE_FALLTHRU) == 0)
268         continue;
269 
270       /* Also make sure that bb1 only have one predecessor and that it
271 	 is bb.  */
272       if (!single_pred_p (bb1)
273           || single_pred (bb1) != bb)
274 	continue;
275 
276       if (do_store_elim)
277 	{
278 	  /* bb1 is the middle block, bb2 the join block, bb the split block,
279 	     e1 the fallthrough edge from bb1 to bb2.  We can't do the
280 	     optimization if the join block has more than two predecessors.  */
281 	  if (EDGE_COUNT (bb2->preds) > 2)
282 	    continue;
283 	  if (cond_store_replacement (bb1, bb2, e1, e2, nontrap))
284 	    cfgchanged = true;
285 	}
286       else
287 	{
288 	  gimple_seq phis = phi_nodes (bb2);
289 	  gimple_stmt_iterator gsi;
290 	  bool candorest = true;
291 
292 	  /* Value replacement can work with more than one PHI
293 	     so try that first. */
294 	  if (!early_p)
295 	    for (gsi = gsi_start (phis); !gsi_end_p (gsi); gsi_next (&gsi))
296 	      {
297 		phi = as_a <gphi *> (gsi_stmt (gsi));
298 		arg0 = gimple_phi_arg_def (phi, e1->dest_idx);
299 		arg1 = gimple_phi_arg_def (phi, e2->dest_idx);
300 		if (value_replacement (bb, bb1, e1, e2, phi, arg0, arg1) == 2)
301 		  {
302 		    candorest = false;
303 		    cfgchanged = true;
304 		    break;
305 		  }
306 	      }
307 
308 	  if (!candorest)
309 	    continue;
310 
311 	  phi = single_non_singleton_phi_for_edges (phis, e1, e2);
312 	  if (!phi)
313 	    continue;
314 
315 	  arg0 = gimple_phi_arg_def (phi, e1->dest_idx);
316 	  arg1 = gimple_phi_arg_def (phi, e2->dest_idx);
317 
318 	  /* Something is wrong if we cannot find the arguments in the PHI
319 	     node.  */
320 	  gcc_assert (arg0 != NULL_TREE && arg1 != NULL_TREE);
321 
322 	  gphi *newphi = factor_out_conditional_conversion (e1, e2, phi,
323 							    arg0, arg1,
324 							    cond_stmt);
325 	  if (newphi != NULL)
326 	    {
327 	      phi = newphi;
328 	      /* factor_out_conditional_conversion may create a new PHI in
329 		 BB2 and eliminate an existing PHI in BB2.  Recompute values
330 		 that may be affected by that change.  */
331 	      arg0 = gimple_phi_arg_def (phi, e1->dest_idx);
332 	      arg1 = gimple_phi_arg_def (phi, e2->dest_idx);
333 	      gcc_assert (arg0 != NULL_TREE && arg1 != NULL_TREE);
334 	    }
335 
336 	  /* Do the replacement of conditional if it can be done.  */
337 	  if (two_value_replacement (bb, bb1, e2, phi, arg0, arg1))
338 	    cfgchanged = true;
339 	  else if (!early_p
340 		   && conditional_replacement (bb, bb1, e1, e2, phi,
341 					       arg0, arg1))
342 	    cfgchanged = true;
343 	  else if (abs_replacement (bb, bb1, e1, e2, phi, arg0, arg1))
344 	    cfgchanged = true;
345 	  else if (!early_p
346 		   && cond_removal_in_popcount_pattern (bb, bb1, e1, e2,
347 							phi, arg0, arg1))
348 	    cfgchanged = true;
349 	  else if (minmax_replacement (bb, bb1, e1, e2, phi, arg0, arg1))
350 	    cfgchanged = true;
351 	}
352     }
353 
354   free (bb_order);
355 
356   if (do_store_elim)
357     delete nontrap;
358   /* If the CFG has changed, we should cleanup the CFG.  */
359   if (cfgchanged && do_store_elim)
360     {
361       /* In cond-store replacement we have added some loads on edges
362          and new VOPS (as we moved the store, and created a load).  */
363       gsi_commit_edge_inserts ();
364       return TODO_cleanup_cfg | TODO_update_ssa_only_virtuals;
365     }
366   else if (cfgchanged)
367     return TODO_cleanup_cfg;
368   return 0;
369 }
370 
371 /* Replace PHI node element whose edge is E in block BB with variable NEW.
372    Remove the edge from COND_BLOCK which does not lead to BB (COND_BLOCK
373    is known to have two edges, one of which must reach BB).  */
374 
375 static void
replace_phi_edge_with_variable(basic_block cond_block,edge e,gimple * phi,tree new_tree)376 replace_phi_edge_with_variable (basic_block cond_block,
377 				edge e, gimple *phi, tree new_tree)
378 {
379   basic_block bb = gimple_bb (phi);
380   basic_block block_to_remove;
381   gimple_stmt_iterator gsi;
382 
383   /* Change the PHI argument to new.  */
384   SET_USE (PHI_ARG_DEF_PTR (phi, e->dest_idx), new_tree);
385 
386   /* Remove the empty basic block.  */
387   if (EDGE_SUCC (cond_block, 0)->dest == bb)
388     {
389       EDGE_SUCC (cond_block, 0)->flags |= EDGE_FALLTHRU;
390       EDGE_SUCC (cond_block, 0)->flags &= ~(EDGE_TRUE_VALUE | EDGE_FALSE_VALUE);
391       EDGE_SUCC (cond_block, 0)->probability = profile_probability::always ();
392 
393       block_to_remove = EDGE_SUCC (cond_block, 1)->dest;
394     }
395   else
396     {
397       EDGE_SUCC (cond_block, 1)->flags |= EDGE_FALLTHRU;
398       EDGE_SUCC (cond_block, 1)->flags
399 	&= ~(EDGE_TRUE_VALUE | EDGE_FALSE_VALUE);
400       EDGE_SUCC (cond_block, 1)->probability = profile_probability::always ();
401 
402       block_to_remove = EDGE_SUCC (cond_block, 0)->dest;
403     }
404   delete_basic_block (block_to_remove);
405 
406   /* Eliminate the COND_EXPR at the end of COND_BLOCK.  */
407   gsi = gsi_last_bb (cond_block);
408   gsi_remove (&gsi, true);
409 
410   if (dump_file && (dump_flags & TDF_DETAILS))
411     fprintf (dump_file,
412 	      "COND_EXPR in block %d and PHI in block %d converted to straightline code.\n",
413 	      cond_block->index,
414 	      bb->index);
415 }
416 
417 /* PR66726: Factor conversion out of COND_EXPR.  If the arguments of the PHI
418    stmt are CONVERT_STMT, factor out the conversion and perform the conversion
419    to the result of PHI stmt.  COND_STMT is the controlling predicate.
420    Return the newly-created PHI, if any.  */
421 
422 static gphi *
factor_out_conditional_conversion(edge e0,edge e1,gphi * phi,tree arg0,tree arg1,gimple * cond_stmt)423 factor_out_conditional_conversion (edge e0, edge e1, gphi *phi,
424 				   tree arg0, tree arg1, gimple *cond_stmt)
425 {
426   gimple *arg0_def_stmt = NULL, *arg1_def_stmt = NULL, *new_stmt;
427   tree new_arg0 = NULL_TREE, new_arg1 = NULL_TREE;
428   tree temp, result;
429   gphi *newphi;
430   gimple_stmt_iterator gsi, gsi_for_def;
431   location_t locus = gimple_location (phi);
432   enum tree_code convert_code;
433 
434   /* Handle only PHI statements with two arguments.  TODO: If all
435      other arguments to PHI are INTEGER_CST or if their defining
436      statement have the same unary operation, we can handle more
437      than two arguments too.  */
438   if (gimple_phi_num_args (phi) != 2)
439     return NULL;
440 
441   /* First canonicalize to simplify tests.  */
442   if (TREE_CODE (arg0) != SSA_NAME)
443     {
444       std::swap (arg0, arg1);
445       std::swap (e0, e1);
446     }
447 
448   if (TREE_CODE (arg0) != SSA_NAME
449       || (TREE_CODE (arg1) != SSA_NAME
450 	  && TREE_CODE (arg1) != INTEGER_CST))
451     return NULL;
452 
453   /* Check if arg0 is an SSA_NAME and the stmt which defines arg0 is
454      a conversion.  */
455   arg0_def_stmt = SSA_NAME_DEF_STMT (arg0);
456   if (!gimple_assign_cast_p (arg0_def_stmt))
457     return NULL;
458 
459   /* Use the RHS as new_arg0.  */
460   convert_code = gimple_assign_rhs_code (arg0_def_stmt);
461   new_arg0 = gimple_assign_rhs1 (arg0_def_stmt);
462   if (convert_code == VIEW_CONVERT_EXPR)
463     {
464       new_arg0 = TREE_OPERAND (new_arg0, 0);
465       if (!is_gimple_reg_type (TREE_TYPE (new_arg0)))
466 	return NULL;
467     }
468 
469   if (TREE_CODE (arg1) == SSA_NAME)
470     {
471       /* Check if arg1 is an SSA_NAME and the stmt which defines arg1
472 	 is a conversion.  */
473       arg1_def_stmt = SSA_NAME_DEF_STMT (arg1);
474       if (!is_gimple_assign (arg1_def_stmt)
475 	  || gimple_assign_rhs_code (arg1_def_stmt) != convert_code)
476 	return NULL;
477 
478       /* Use the RHS as new_arg1.  */
479       new_arg1 = gimple_assign_rhs1 (arg1_def_stmt);
480       if (convert_code == VIEW_CONVERT_EXPR)
481 	new_arg1 = TREE_OPERAND (new_arg1, 0);
482     }
483   else
484     {
485       /* If arg1 is an INTEGER_CST, fold it to new type.  */
486       if (INTEGRAL_TYPE_P (TREE_TYPE (new_arg0))
487 	  && int_fits_type_p (arg1, TREE_TYPE (new_arg0)))
488 	{
489 	  if (gimple_assign_cast_p (arg0_def_stmt))
490 	    {
491 	      /* For the INTEGER_CST case, we are just moving the
492 		 conversion from one place to another, which can often
493 		 hurt as the conversion moves further away from the
494 		 statement that computes the value.  So, perform this
495 		 only if new_arg0 is an operand of COND_STMT, or
496 		 if arg0_def_stmt is the only non-debug stmt in
497 		 its basic block, because then it is possible this
498 		 could enable further optimizations (minmax replacement
499 		 etc.).  See PR71016.  */
500 	      if (new_arg0 != gimple_cond_lhs (cond_stmt)
501 		  && new_arg0 != gimple_cond_rhs (cond_stmt)
502 		  && gimple_bb (arg0_def_stmt) == e0->src)
503 		{
504 		  gsi = gsi_for_stmt (arg0_def_stmt);
505 		  gsi_prev_nondebug (&gsi);
506 		  if (!gsi_end_p (gsi))
507 		    {
508 		      if (gassign *assign
509 			    = dyn_cast <gassign *> (gsi_stmt (gsi)))
510 			{
511 			  tree lhs = gimple_assign_lhs (assign);
512 			  enum tree_code ass_code
513 			    = gimple_assign_rhs_code (assign);
514 			  if (ass_code != MAX_EXPR && ass_code != MIN_EXPR)
515 			    return NULL;
516 			  if (lhs != gimple_assign_rhs1 (arg0_def_stmt))
517 			    return NULL;
518 			  gsi_prev_nondebug (&gsi);
519 			  if (!gsi_end_p (gsi))
520 			    return NULL;
521 			}
522 		      else
523 			return NULL;
524 		    }
525 		  gsi = gsi_for_stmt (arg0_def_stmt);
526 		  gsi_next_nondebug (&gsi);
527 		  if (!gsi_end_p (gsi))
528 		    return NULL;
529 		}
530 	      new_arg1 = fold_convert (TREE_TYPE (new_arg0), arg1);
531 	    }
532 	  else
533 	    return NULL;
534 	}
535       else
536 	return NULL;
537     }
538 
539   /*  If arg0/arg1 have > 1 use, then this transformation actually increases
540       the number of expressions evaluated at runtime.  */
541   if (!has_single_use (arg0)
542       || (arg1_def_stmt && !has_single_use (arg1)))
543     return NULL;
544 
545   /* If types of new_arg0 and new_arg1 are different bailout.  */
546   if (!types_compatible_p (TREE_TYPE (new_arg0), TREE_TYPE (new_arg1)))
547     return NULL;
548 
549   /* Create a new PHI stmt.  */
550   result = PHI_RESULT (phi);
551   temp = make_ssa_name (TREE_TYPE (new_arg0), NULL);
552   newphi = create_phi_node (temp, gimple_bb (phi));
553 
554   if (dump_file && (dump_flags & TDF_DETAILS))
555     {
556       fprintf (dump_file, "PHI ");
557       print_generic_expr (dump_file, gimple_phi_result (phi));
558       fprintf (dump_file,
559 	       " changed to factor conversion out from COND_EXPR.\n");
560       fprintf (dump_file, "New stmt with CAST that defines ");
561       print_generic_expr (dump_file, result);
562       fprintf (dump_file, ".\n");
563     }
564 
565   /* Remove the old cast(s) that has single use.  */
566   gsi_for_def = gsi_for_stmt (arg0_def_stmt);
567   gsi_remove (&gsi_for_def, true);
568   release_defs (arg0_def_stmt);
569 
570   if (arg1_def_stmt)
571     {
572       gsi_for_def = gsi_for_stmt (arg1_def_stmt);
573       gsi_remove (&gsi_for_def, true);
574       release_defs (arg1_def_stmt);
575     }
576 
577   add_phi_arg (newphi, new_arg0, e0, locus);
578   add_phi_arg (newphi, new_arg1, e1, locus);
579 
580   /* Create the conversion stmt and insert it.  */
581   if (convert_code == VIEW_CONVERT_EXPR)
582     {
583       temp = fold_build1 (VIEW_CONVERT_EXPR, TREE_TYPE (result), temp);
584       new_stmt = gimple_build_assign (result, temp);
585     }
586   else
587     new_stmt = gimple_build_assign (result, convert_code, temp);
588   gsi = gsi_after_labels (gimple_bb (phi));
589   gsi_insert_before (&gsi, new_stmt, GSI_SAME_STMT);
590 
591   /* Remove the original PHI stmt.  */
592   gsi = gsi_for_stmt (phi);
593   gsi_remove (&gsi, true);
594   return newphi;
595 }
596 
597 /* Optimize
598    # x_5 in range [cst1, cst2] where cst2 = cst1 + 1
599    if (x_5 op cstN) # where op is == or != and N is 1 or 2
600      goto bb3;
601    else
602      goto bb4;
603    bb3:
604    bb4:
605    # r_6 = PHI<cst3(2), cst4(3)> # where cst3 == cst4 + 1 or cst4 == cst3 + 1
606 
607    to r_6 = x_5 + (min (cst3, cst4) - cst1) or
608    r_6 = (min (cst3, cst4) + cst1) - x_5 depending on op, N and which
609    of cst3 and cst4 is smaller.  */
610 
611 static bool
two_value_replacement(basic_block cond_bb,basic_block middle_bb,edge e1,gphi * phi,tree arg0,tree arg1)612 two_value_replacement (basic_block cond_bb, basic_block middle_bb,
613 		       edge e1, gphi *phi, tree arg0, tree arg1)
614 {
615   /* Only look for adjacent integer constants.  */
616   if (!INTEGRAL_TYPE_P (TREE_TYPE (arg0))
617       || !INTEGRAL_TYPE_P (TREE_TYPE (arg1))
618       || TREE_CODE (arg0) != INTEGER_CST
619       || TREE_CODE (arg1) != INTEGER_CST
620       || (tree_int_cst_lt (arg0, arg1)
621 	  ? wi::to_widest (arg0) + 1 != wi::to_widest (arg1)
622 	  : wi::to_widest (arg1) + 1 != wi::to_widest (arg0)))
623     return false;
624 
625   if (!empty_block_p (middle_bb))
626     return false;
627 
628   gimple *stmt = last_stmt (cond_bb);
629   tree lhs = gimple_cond_lhs (stmt);
630   tree rhs = gimple_cond_rhs (stmt);
631 
632   if (TREE_CODE (lhs) != SSA_NAME
633       || !INTEGRAL_TYPE_P (TREE_TYPE (lhs))
634       || TREE_CODE (TREE_TYPE (lhs)) == BOOLEAN_TYPE
635       || TREE_CODE (rhs) != INTEGER_CST)
636     return false;
637 
638   switch (gimple_cond_code (stmt))
639     {
640     case EQ_EXPR:
641     case NE_EXPR:
642       break;
643     default:
644       return false;
645     }
646 
647   wide_int min, max;
648   if (get_range_info (lhs, &min, &max) != VR_RANGE
649       || min + 1 != max
650       || (wi::to_wide (rhs) != min
651 	  && wi::to_wide (rhs) != max))
652     return false;
653 
654   /* We need to know which is the true edge and which is the false
655      edge so that we know when to invert the condition below.  */
656   edge true_edge, false_edge;
657   extract_true_false_edges_from_block (cond_bb, &true_edge, &false_edge);
658   if ((gimple_cond_code (stmt) == EQ_EXPR)
659       ^ (wi::to_wide (rhs) == max)
660       ^ (e1 == false_edge))
661     std::swap (arg0, arg1);
662 
663   tree type;
664   if (TYPE_PRECISION (TREE_TYPE (lhs)) == TYPE_PRECISION (TREE_TYPE (arg0)))
665     {
666       /* Avoid performing the arithmetics in bool type which has different
667 	 semantics, otherwise prefer unsigned types from the two with
668 	 the same precision.  */
669       if (TREE_CODE (TREE_TYPE (arg0)) == BOOLEAN_TYPE
670 	  || !TYPE_UNSIGNED (TREE_TYPE (arg0)))
671 	type = TREE_TYPE (lhs);
672       else
673 	type = TREE_TYPE (arg0);
674     }
675   else if (TYPE_PRECISION (TREE_TYPE (lhs)) > TYPE_PRECISION (TREE_TYPE (arg0)))
676     type = TREE_TYPE (lhs);
677   else
678     type = TREE_TYPE (arg0);
679 
680   min = wide_int::from (min, TYPE_PRECISION (type),
681 			TYPE_SIGN (TREE_TYPE (lhs)));
682   wide_int a = wide_int::from (wi::to_wide (arg0), TYPE_PRECISION (type),
683 			       TYPE_SIGN (TREE_TYPE (arg0)));
684   enum tree_code code;
685   wi::overflow_type ovf;
686   if (tree_int_cst_lt (arg0, arg1))
687     {
688       code = PLUS_EXPR;
689       a -= min;
690       if (!TYPE_UNSIGNED (type))
691 	{
692 	  /* lhs is known to be in range [min, min+1] and we want to add a
693 	     to it.  Check if that operation can overflow for those 2 values
694 	     and if yes, force unsigned type.  */
695 	  wi::add (min + (wi::neg_p (a) ? 0 : 1), a, SIGNED, &ovf);
696 	  if (ovf)
697 	    type = unsigned_type_for (type);
698 	}
699     }
700   else
701     {
702       code = MINUS_EXPR;
703       a += min;
704       if (!TYPE_UNSIGNED (type))
705 	{
706 	  /* lhs is known to be in range [min, min+1] and we want to subtract
707 	     it from a.  Check if that operation can overflow for those 2
708 	     values and if yes, force unsigned type.  */
709 	  wi::sub (a, min + (wi::neg_p (min) ? 0 : 1), SIGNED, &ovf);
710 	  if (ovf)
711 	    type = unsigned_type_for (type);
712 	}
713     }
714 
715   tree arg = wide_int_to_tree (type, a);
716   gimple_stmt_iterator gsi = gsi_for_stmt (stmt);
717   if (!useless_type_conversion_p (type, TREE_TYPE (lhs)))
718     lhs = gimplify_build1 (&gsi, NOP_EXPR, type, lhs);
719   tree new_rhs;
720   if (code == PLUS_EXPR)
721     new_rhs = gimplify_build2 (&gsi, PLUS_EXPR, type, lhs, arg);
722   else
723     new_rhs = gimplify_build2 (&gsi, MINUS_EXPR, type, arg, lhs);
724   if (!useless_type_conversion_p (TREE_TYPE (arg0), type))
725     new_rhs = gimplify_build1 (&gsi, NOP_EXPR, TREE_TYPE (arg0), new_rhs);
726 
727   replace_phi_edge_with_variable (cond_bb, e1, phi, new_rhs);
728 
729   /* Note that we optimized this PHI.  */
730   return true;
731 }
732 
733 /*  The function conditional_replacement does the main work of doing the
734     conditional replacement.  Return true if the replacement is done.
735     Otherwise return false.
736     BB is the basic block where the replacement is going to be done on.  ARG0
737     is argument 0 from PHI.  Likewise for ARG1.  */
738 
739 static bool
conditional_replacement(basic_block cond_bb,basic_block middle_bb,edge e0,edge e1,gphi * phi,tree arg0,tree arg1)740 conditional_replacement (basic_block cond_bb, basic_block middle_bb,
741 			 edge e0, edge e1, gphi *phi,
742 			 tree arg0, tree arg1)
743 {
744   tree result;
745   gimple *stmt;
746   gassign *new_stmt;
747   tree cond;
748   gimple_stmt_iterator gsi;
749   edge true_edge, false_edge;
750   tree new_var, new_var2;
751   bool neg;
752 
753   /* FIXME: Gimplification of complex type is too hard for now.  */
754   /* We aren't prepared to handle vectors either (and it is a question
755      if it would be worthwhile anyway).  */
756   if (!(INTEGRAL_TYPE_P (TREE_TYPE (arg0))
757 	|| POINTER_TYPE_P (TREE_TYPE (arg0)))
758       || !(INTEGRAL_TYPE_P (TREE_TYPE (arg1))
759 	   || POINTER_TYPE_P (TREE_TYPE (arg1))))
760     return false;
761 
762   /* The PHI arguments have the constants 0 and 1, or 0 and -1, then
763      convert it to the conditional.  */
764   if ((integer_zerop (arg0) && integer_onep (arg1))
765       || (integer_zerop (arg1) && integer_onep (arg0)))
766     neg = false;
767   else if ((integer_zerop (arg0) && integer_all_onesp (arg1))
768 	   || (integer_zerop (arg1) && integer_all_onesp (arg0)))
769     neg = true;
770   else
771     return false;
772 
773   if (!empty_block_p (middle_bb))
774     return false;
775 
776   /* At this point we know we have a GIMPLE_COND with two successors.
777      One successor is BB, the other successor is an empty block which
778      falls through into BB.
779 
780      There is a single PHI node at the join point (BB) and its arguments
781      are constants (0, 1) or (0, -1).
782 
783      So, given the condition COND, and the two PHI arguments, we can
784      rewrite this PHI into non-branching code:
785 
786        dest = (COND) or dest = COND'
787 
788      We use the condition as-is if the argument associated with the
789      true edge has the value one or the argument associated with the
790      false edge as the value zero.  Note that those conditions are not
791      the same since only one of the outgoing edges from the GIMPLE_COND
792      will directly reach BB and thus be associated with an argument.  */
793 
794   stmt = last_stmt (cond_bb);
795   result = PHI_RESULT (phi);
796 
797   /* To handle special cases like floating point comparison, it is easier and
798      less error-prone to build a tree and gimplify it on the fly though it is
799      less efficient.  */
800   cond = fold_build2_loc (gimple_location (stmt),
801 			  gimple_cond_code (stmt), boolean_type_node,
802 			  gimple_cond_lhs (stmt), gimple_cond_rhs (stmt));
803 
804   /* We need to know which is the true edge and which is the false
805      edge so that we know when to invert the condition below.  */
806   extract_true_false_edges_from_block (cond_bb, &true_edge, &false_edge);
807   if ((e0 == true_edge && integer_zerop (arg0))
808       || (e0 == false_edge && !integer_zerop (arg0))
809       || (e1 == true_edge && integer_zerop (arg1))
810       || (e1 == false_edge && !integer_zerop (arg1)))
811     cond = fold_build1_loc (gimple_location (stmt),
812                             TRUTH_NOT_EXPR, TREE_TYPE (cond), cond);
813 
814   if (neg)
815     {
816       cond = fold_convert_loc (gimple_location (stmt),
817                                TREE_TYPE (result), cond);
818       cond = fold_build1_loc (gimple_location (stmt),
819                               NEGATE_EXPR, TREE_TYPE (cond), cond);
820     }
821 
822   /* Insert our new statements at the end of conditional block before the
823      COND_STMT.  */
824   gsi = gsi_for_stmt (stmt);
825   new_var = force_gimple_operand_gsi (&gsi, cond, true, NULL, true,
826 				      GSI_SAME_STMT);
827 
828   if (!useless_type_conversion_p (TREE_TYPE (result), TREE_TYPE (new_var)))
829     {
830       location_t locus_0, locus_1;
831 
832       new_var2 = make_ssa_name (TREE_TYPE (result));
833       new_stmt = gimple_build_assign (new_var2, CONVERT_EXPR, new_var);
834       gsi_insert_before (&gsi, new_stmt, GSI_SAME_STMT);
835       new_var = new_var2;
836 
837       /* Set the locus to the first argument, unless is doesn't have one.  */
838       locus_0 = gimple_phi_arg_location (phi, 0);
839       locus_1 = gimple_phi_arg_location (phi, 1);
840       if (locus_0 == UNKNOWN_LOCATION)
841         locus_0 = locus_1;
842       gimple_set_location (new_stmt, locus_0);
843     }
844 
845   replace_phi_edge_with_variable (cond_bb, e1, phi, new_var);
846 
847   /* Note that we optimized this PHI.  */
848   return true;
849 }
850 
851 /* Update *ARG which is defined in STMT so that it contains the
852    computed value if that seems profitable.  Return true if the
853    statement is made dead by that rewriting.  */
854 
855 static bool
jump_function_from_stmt(tree * arg,gimple * stmt)856 jump_function_from_stmt (tree *arg, gimple *stmt)
857 {
858   enum tree_code code = gimple_assign_rhs_code (stmt);
859   if (code == ADDR_EXPR)
860     {
861       /* For arg = &p->i transform it to p, if possible.  */
862       tree rhs1 = gimple_assign_rhs1 (stmt);
863       poly_int64 offset;
864       tree tem = get_addr_base_and_unit_offset (TREE_OPERAND (rhs1, 0),
865 						&offset);
866       if (tem
867 	  && TREE_CODE (tem) == MEM_REF
868 	  && known_eq (mem_ref_offset (tem) + offset, 0))
869 	{
870 	  *arg = TREE_OPERAND (tem, 0);
871 	  return true;
872 	}
873     }
874   /* TODO: Much like IPA-CP jump-functions we want to handle constant
875      additions symbolically here, and we'd need to update the comparison
876      code that compares the arg + cst tuples in our caller.  For now the
877      code above exactly handles the VEC_BASE pattern from vec.h.  */
878   return false;
879 }
880 
881 /* RHS is a source argument in a BIT_AND_EXPR which feeds a conditional
882    of the form SSA_NAME NE 0.
883 
884    If RHS is fed by a simple EQ_EXPR comparison of two values, see if
885    the two input values of the EQ_EXPR match arg0 and arg1.
886 
887    If so update *code and return TRUE.  Otherwise return FALSE.  */
888 
889 static bool
rhs_is_fed_for_value_replacement(const_tree arg0,const_tree arg1,enum tree_code * code,const_tree rhs)890 rhs_is_fed_for_value_replacement (const_tree arg0, const_tree arg1,
891 				  enum tree_code *code, const_tree rhs)
892 {
893   /* Obviously if RHS is not an SSA_NAME, we can't look at the defining
894      statement.  */
895   if (TREE_CODE (rhs) == SSA_NAME)
896     {
897       gimple *def1 = SSA_NAME_DEF_STMT (rhs);
898 
899       /* Verify the defining statement has an EQ_EXPR on the RHS.  */
900       if (is_gimple_assign (def1) && gimple_assign_rhs_code (def1) == EQ_EXPR)
901 	{
902 	  /* Finally verify the source operands of the EQ_EXPR are equal
903 	     to arg0 and arg1.  */
904 	  tree op0 = gimple_assign_rhs1 (def1);
905 	  tree op1 = gimple_assign_rhs2 (def1);
906 	  if ((operand_equal_for_phi_arg_p (arg0, op0)
907 	       && operand_equal_for_phi_arg_p (arg1, op1))
908 	      || (operand_equal_for_phi_arg_p (arg0, op1)
909                && operand_equal_for_phi_arg_p (arg1, op0)))
910 	    {
911 	      /* We will perform the optimization.  */
912 	      *code = gimple_assign_rhs_code (def1);
913 	      return true;
914 	    }
915 	}
916     }
917   return false;
918 }
919 
920 /* Return TRUE if arg0/arg1 are equal to the rhs/lhs or lhs/rhs of COND.
921 
922    Also return TRUE if arg0/arg1 are equal to the source arguments of a
923    an EQ comparison feeding a BIT_AND_EXPR which feeds COND.
924 
925    Return FALSE otherwise.  */
926 
927 static bool
operand_equal_for_value_replacement(const_tree arg0,const_tree arg1,enum tree_code * code,gimple * cond)928 operand_equal_for_value_replacement (const_tree arg0, const_tree arg1,
929 				     enum tree_code *code, gimple *cond)
930 {
931   gimple *def;
932   tree lhs = gimple_cond_lhs (cond);
933   tree rhs = gimple_cond_rhs (cond);
934 
935   if ((operand_equal_for_phi_arg_p (arg0, lhs)
936        && operand_equal_for_phi_arg_p (arg1, rhs))
937       || (operand_equal_for_phi_arg_p (arg1, lhs)
938 	  && operand_equal_for_phi_arg_p (arg0, rhs)))
939     return true;
940 
941   /* Now handle more complex case where we have an EQ comparison
942      which feeds a BIT_AND_EXPR which feeds COND.
943 
944      First verify that COND is of the form SSA_NAME NE 0.  */
945   if (*code != NE_EXPR || !integer_zerop (rhs)
946       || TREE_CODE (lhs) != SSA_NAME)
947     return false;
948 
949   /* Now ensure that SSA_NAME is set by a BIT_AND_EXPR.  */
950   def = SSA_NAME_DEF_STMT (lhs);
951   if (!is_gimple_assign (def) || gimple_assign_rhs_code (def) != BIT_AND_EXPR)
952     return false;
953 
954   /* Now verify arg0/arg1 correspond to the source arguments of an
955      EQ comparison feeding the BIT_AND_EXPR.  */
956 
957   tree tmp = gimple_assign_rhs1 (def);
958   if (rhs_is_fed_for_value_replacement (arg0, arg1, code, tmp))
959     return true;
960 
961   tmp = gimple_assign_rhs2 (def);
962   if (rhs_is_fed_for_value_replacement (arg0, arg1, code, tmp))
963     return true;
964 
965   return false;
966 }
967 
968 /* Returns true if ARG is a neutral element for operation CODE
969    on the RIGHT side.  */
970 
971 static bool
neutral_element_p(tree_code code,tree arg,bool right)972 neutral_element_p (tree_code code, tree arg, bool right)
973 {
974   switch (code)
975     {
976     case PLUS_EXPR:
977     case BIT_IOR_EXPR:
978     case BIT_XOR_EXPR:
979       return integer_zerop (arg);
980 
981     case LROTATE_EXPR:
982     case RROTATE_EXPR:
983     case LSHIFT_EXPR:
984     case RSHIFT_EXPR:
985     case MINUS_EXPR:
986     case POINTER_PLUS_EXPR:
987       return right && integer_zerop (arg);
988 
989     case MULT_EXPR:
990       return integer_onep (arg);
991 
992     case TRUNC_DIV_EXPR:
993     case CEIL_DIV_EXPR:
994     case FLOOR_DIV_EXPR:
995     case ROUND_DIV_EXPR:
996     case EXACT_DIV_EXPR:
997       return right && integer_onep (arg);
998 
999     case BIT_AND_EXPR:
1000       return integer_all_onesp (arg);
1001 
1002     default:
1003       return false;
1004     }
1005 }
1006 
1007 /* Returns true if ARG is an absorbing element for operation CODE.  */
1008 
1009 static bool
absorbing_element_p(tree_code code,tree arg,bool right,tree rval)1010 absorbing_element_p (tree_code code, tree arg, bool right, tree rval)
1011 {
1012   switch (code)
1013     {
1014     case BIT_IOR_EXPR:
1015       return integer_all_onesp (arg);
1016 
1017     case MULT_EXPR:
1018     case BIT_AND_EXPR:
1019       return integer_zerop (arg);
1020 
1021     case LSHIFT_EXPR:
1022     case RSHIFT_EXPR:
1023     case LROTATE_EXPR:
1024     case RROTATE_EXPR:
1025       return !right && integer_zerop (arg);
1026 
1027     case TRUNC_DIV_EXPR:
1028     case CEIL_DIV_EXPR:
1029     case FLOOR_DIV_EXPR:
1030     case ROUND_DIV_EXPR:
1031     case EXACT_DIV_EXPR:
1032     case TRUNC_MOD_EXPR:
1033     case CEIL_MOD_EXPR:
1034     case FLOOR_MOD_EXPR:
1035     case ROUND_MOD_EXPR:
1036       return (!right
1037 	      && integer_zerop (arg)
1038 	      && tree_single_nonzero_warnv_p (rval, NULL));
1039 
1040     default:
1041       return false;
1042     }
1043 }
1044 
1045 /*  The function value_replacement does the main work of doing the value
1046     replacement.  Return non-zero if the replacement is done.  Otherwise return
1047     0.  If we remove the middle basic block, return 2.
1048     BB is the basic block where the replacement is going to be done on.  ARG0
1049     is argument 0 from the PHI.  Likewise for ARG1.  */
1050 
1051 static int
value_replacement(basic_block cond_bb,basic_block middle_bb,edge e0,edge e1,gimple * phi,tree arg0,tree arg1)1052 value_replacement (basic_block cond_bb, basic_block middle_bb,
1053 		   edge e0, edge e1, gimple *phi,
1054 		   tree arg0, tree arg1)
1055 {
1056   gimple_stmt_iterator gsi;
1057   gimple *cond;
1058   edge true_edge, false_edge;
1059   enum tree_code code;
1060   bool empty_or_with_defined_p = true;
1061 
1062   /* If the type says honor signed zeros we cannot do this
1063      optimization.  */
1064   if (HONOR_SIGNED_ZEROS (arg1))
1065     return 0;
1066 
1067   /* If there is a statement in MIDDLE_BB that defines one of the PHI
1068      arguments, then adjust arg0 or arg1.  */
1069   gsi = gsi_start_nondebug_after_labels_bb (middle_bb);
1070   while (!gsi_end_p (gsi))
1071     {
1072       gimple *stmt = gsi_stmt (gsi);
1073       tree lhs;
1074       gsi_next_nondebug (&gsi);
1075       if (!is_gimple_assign (stmt))
1076 	{
1077 	  if (gimple_code (stmt) != GIMPLE_PREDICT
1078 	      && gimple_code (stmt) != GIMPLE_NOP)
1079 	    empty_or_with_defined_p = false;
1080 	  continue;
1081 	}
1082       /* Now try to adjust arg0 or arg1 according to the computation
1083 	 in the statement.  */
1084       lhs = gimple_assign_lhs (stmt);
1085       if (!(lhs == arg0
1086 	     && jump_function_from_stmt (&arg0, stmt))
1087 	    || (lhs == arg1
1088 		&& jump_function_from_stmt (&arg1, stmt)))
1089 	empty_or_with_defined_p = false;
1090     }
1091 
1092   cond = last_stmt (cond_bb);
1093   code = gimple_cond_code (cond);
1094 
1095   /* This transformation is only valid for equality comparisons.  */
1096   if (code != NE_EXPR && code != EQ_EXPR)
1097     return 0;
1098 
1099   /* We need to know which is the true edge and which is the false
1100       edge so that we know if have abs or negative abs.  */
1101   extract_true_false_edges_from_block (cond_bb, &true_edge, &false_edge);
1102 
1103   /* At this point we know we have a COND_EXPR with two successors.
1104      One successor is BB, the other successor is an empty block which
1105      falls through into BB.
1106 
1107      The condition for the COND_EXPR is known to be NE_EXPR or EQ_EXPR.
1108 
1109      There is a single PHI node at the join point (BB) with two arguments.
1110 
1111      We now need to verify that the two arguments in the PHI node match
1112      the two arguments to the equality comparison.  */
1113 
1114   if (operand_equal_for_value_replacement (arg0, arg1, &code, cond))
1115     {
1116       edge e;
1117       tree arg;
1118 
1119       /* For NE_EXPR, we want to build an assignment result = arg where
1120 	 arg is the PHI argument associated with the true edge.  For
1121 	 EQ_EXPR we want the PHI argument associated with the false edge.  */
1122       e = (code == NE_EXPR ? true_edge : false_edge);
1123 
1124       /* Unfortunately, E may not reach BB (it may instead have gone to
1125 	 OTHER_BLOCK).  If that is the case, then we want the single outgoing
1126 	 edge from OTHER_BLOCK which reaches BB and represents the desired
1127 	 path from COND_BLOCK.  */
1128       if (e->dest == middle_bb)
1129 	e = single_succ_edge (e->dest);
1130 
1131       /* Now we know the incoming edge to BB that has the argument for the
1132 	 RHS of our new assignment statement.  */
1133       if (e0 == e)
1134 	arg = arg0;
1135       else
1136 	arg = arg1;
1137 
1138       /* If the middle basic block was empty or is defining the
1139 	 PHI arguments and this is a single phi where the args are different
1140 	 for the edges e0 and e1 then we can remove the middle basic block. */
1141       if (empty_or_with_defined_p
1142 	  && single_non_singleton_phi_for_edges (phi_nodes (gimple_bb (phi)),
1143 						 e0, e1) == phi)
1144 	{
1145           replace_phi_edge_with_variable (cond_bb, e1, phi, arg);
1146 	  /* Note that we optimized this PHI.  */
1147 	  return 2;
1148 	}
1149       else
1150 	{
1151 	  /* Replace the PHI arguments with arg. */
1152 	  SET_PHI_ARG_DEF (phi, e0->dest_idx, arg);
1153 	  SET_PHI_ARG_DEF (phi, e1->dest_idx, arg);
1154 	  if (dump_file && (dump_flags & TDF_DETAILS))
1155 	    {
1156 	      fprintf (dump_file, "PHI ");
1157 	      print_generic_expr (dump_file, gimple_phi_result (phi));
1158 	      fprintf (dump_file, " reduced for COND_EXPR in block %d to ",
1159 		       cond_bb->index);
1160 	      print_generic_expr (dump_file, arg);
1161 	      fprintf (dump_file, ".\n");
1162             }
1163           return 1;
1164 	}
1165 
1166     }
1167 
1168   /* Now optimize (x != 0) ? x + y : y to just x + y.  */
1169   gsi = gsi_last_nondebug_bb (middle_bb);
1170   if (gsi_end_p (gsi))
1171     return 0;
1172 
1173   gimple *assign = gsi_stmt (gsi);
1174   if (!is_gimple_assign (assign)
1175       || gimple_assign_rhs_class (assign) != GIMPLE_BINARY_RHS
1176       || (!INTEGRAL_TYPE_P (TREE_TYPE (arg0))
1177 	  && !POINTER_TYPE_P (TREE_TYPE (arg0))))
1178     return 0;
1179 
1180   /* Punt if there are (degenerate) PHIs in middle_bb, there should not be.  */
1181   if (!gimple_seq_empty_p (phi_nodes (middle_bb)))
1182     return 0;
1183 
1184   /* Allow up to 2 cheap preparation statements that prepare argument
1185      for assign, e.g.:
1186       if (y_4 != 0)
1187 	goto <bb 3>;
1188       else
1189 	goto <bb 4>;
1190      <bb 3>:
1191       _1 = (int) y_4;
1192       iftmp.0_6 = x_5(D) r<< _1;
1193      <bb 4>:
1194       # iftmp.0_2 = PHI <iftmp.0_6(3), x_5(D)(2)>
1195      or:
1196       if (y_3(D) == 0)
1197 	goto <bb 4>;
1198       else
1199 	goto <bb 3>;
1200      <bb 3>:
1201       y_4 = y_3(D) & 31;
1202       _1 = (int) y_4;
1203       _6 = x_5(D) r<< _1;
1204      <bb 4>:
1205       # _2 = PHI <x_5(D)(2), _6(3)>  */
1206   gimple *prep_stmt[2] = { NULL, NULL };
1207   int prep_cnt;
1208   for (prep_cnt = 0; ; prep_cnt++)
1209     {
1210       gsi_prev_nondebug (&gsi);
1211       if (gsi_end_p (gsi))
1212 	break;
1213 
1214       gimple *g = gsi_stmt (gsi);
1215       if (gimple_code (g) == GIMPLE_LABEL)
1216 	break;
1217 
1218       if (prep_cnt == 2 || !is_gimple_assign (g))
1219 	return 0;
1220 
1221       tree lhs = gimple_assign_lhs (g);
1222       tree rhs1 = gimple_assign_rhs1 (g);
1223       use_operand_p use_p;
1224       gimple *use_stmt;
1225       if (TREE_CODE (lhs) != SSA_NAME
1226 	  || TREE_CODE (rhs1) != SSA_NAME
1227 	  || !INTEGRAL_TYPE_P (TREE_TYPE (lhs))
1228 	  || !INTEGRAL_TYPE_P (TREE_TYPE (rhs1))
1229 	  || !single_imm_use (lhs, &use_p, &use_stmt)
1230 	  || use_stmt != (prep_cnt ? prep_stmt[prep_cnt - 1] : assign))
1231 	return 0;
1232       switch (gimple_assign_rhs_code (g))
1233 	{
1234 	CASE_CONVERT:
1235 	  break;
1236 	case PLUS_EXPR:
1237 	case BIT_AND_EXPR:
1238 	case BIT_IOR_EXPR:
1239 	case BIT_XOR_EXPR:
1240 	  if (TREE_CODE (gimple_assign_rhs2 (g)) != INTEGER_CST)
1241 	    return 0;
1242 	  break;
1243 	default:
1244 	  return 0;
1245 	}
1246       prep_stmt[prep_cnt] = g;
1247     }
1248 
1249   /* Only transform if it removes the condition.  */
1250   if (!single_non_singleton_phi_for_edges (phi_nodes (gimple_bb (phi)), e0, e1))
1251     return 0;
1252 
1253   /* Size-wise, this is always profitable.  */
1254   if (optimize_bb_for_speed_p (cond_bb)
1255       /* The special case is useless if it has a low probability.  */
1256       && profile_status_for_fn (cfun) != PROFILE_ABSENT
1257       && EDGE_PRED (middle_bb, 0)->probability < profile_probability::even ()
1258       /* If assign is cheap, there is no point avoiding it.  */
1259       && estimate_num_insns_seq (bb_seq (middle_bb), &eni_time_weights)
1260 	 >= 3 * estimate_num_insns (cond, &eni_time_weights))
1261     return 0;
1262 
1263   tree lhs = gimple_assign_lhs (assign);
1264   tree rhs1 = gimple_assign_rhs1 (assign);
1265   tree rhs2 = gimple_assign_rhs2 (assign);
1266   enum tree_code code_def = gimple_assign_rhs_code (assign);
1267   tree cond_lhs = gimple_cond_lhs (cond);
1268   tree cond_rhs = gimple_cond_rhs (cond);
1269 
1270   /* Propagate the cond_rhs constant through preparation stmts,
1271      make sure UB isn't invoked while doing that.  */
1272   for (int i = prep_cnt - 1; i >= 0; --i)
1273     {
1274       gimple *g = prep_stmt[i];
1275       tree grhs1 = gimple_assign_rhs1 (g);
1276       if (!operand_equal_for_phi_arg_p (cond_lhs, grhs1))
1277 	return 0;
1278       cond_lhs = gimple_assign_lhs (g);
1279       cond_rhs = fold_convert (TREE_TYPE (grhs1), cond_rhs);
1280       if (TREE_CODE (cond_rhs) != INTEGER_CST
1281 	  || TREE_OVERFLOW (cond_rhs))
1282 	return 0;
1283       if (gimple_assign_rhs_class (g) == GIMPLE_BINARY_RHS)
1284 	{
1285 	  cond_rhs = int_const_binop (gimple_assign_rhs_code (g), cond_rhs,
1286 				      gimple_assign_rhs2 (g));
1287 	  if (TREE_OVERFLOW (cond_rhs))
1288 	    return 0;
1289 	}
1290       cond_rhs = fold_convert (TREE_TYPE (cond_lhs), cond_rhs);
1291       if (TREE_CODE (cond_rhs) != INTEGER_CST
1292 	  || TREE_OVERFLOW (cond_rhs))
1293 	return 0;
1294     }
1295 
1296   if (((code == NE_EXPR && e1 == false_edge)
1297 	|| (code == EQ_EXPR && e1 == true_edge))
1298       && arg0 == lhs
1299       && ((arg1 == rhs1
1300 	   && operand_equal_for_phi_arg_p (rhs2, cond_lhs)
1301 	   && neutral_element_p (code_def, cond_rhs, true))
1302 	  || (arg1 == rhs2
1303 	      && operand_equal_for_phi_arg_p (rhs1, cond_lhs)
1304 	      && neutral_element_p (code_def, cond_rhs, false))
1305 	  || (operand_equal_for_phi_arg_p (arg1, cond_rhs)
1306 	      && ((operand_equal_for_phi_arg_p (rhs2, cond_lhs)
1307 		   && absorbing_element_p (code_def, cond_rhs, true, rhs2))
1308 		  || (operand_equal_for_phi_arg_p (rhs1, cond_lhs)
1309 		      && absorbing_element_p (code_def,
1310 					      cond_rhs, false, rhs2))))))
1311     {
1312       gsi = gsi_for_stmt (cond);
1313       /* Moving ASSIGN might change VR of lhs, e.g. when moving u_6
1314 	 def-stmt in:
1315 	   if (n_5 != 0)
1316 	     goto <bb 3>;
1317 	   else
1318 	     goto <bb 4>;
1319 
1320 	   <bb 3>:
1321 	   # RANGE [0, 4294967294]
1322 	   u_6 = n_5 + 4294967295;
1323 
1324 	   <bb 4>:
1325 	   # u_3 = PHI <u_6(3), 4294967295(2)>  */
1326       reset_flow_sensitive_info (lhs);
1327       if (INTEGRAL_TYPE_P (TREE_TYPE (lhs)))
1328 	{
1329 	  /* If available, we can use VR of phi result at least.  */
1330 	  tree phires = gimple_phi_result (phi);
1331 	  struct range_info_def *phires_range_info
1332 	    = SSA_NAME_RANGE_INFO (phires);
1333 	  if (phires_range_info)
1334 	    duplicate_ssa_name_range_info (lhs, SSA_NAME_RANGE_TYPE (phires),
1335 					   phires_range_info);
1336 	}
1337       gimple_stmt_iterator gsi_from;
1338       for (int i = prep_cnt - 1; i >= 0; --i)
1339 	{
1340 	  tree plhs = gimple_assign_lhs (prep_stmt[i]);
1341 	  reset_flow_sensitive_info (plhs);
1342 	  gsi_from = gsi_for_stmt (prep_stmt[i]);
1343 	  gsi_move_before (&gsi_from, &gsi);
1344 	}
1345       gsi_from = gsi_for_stmt (assign);
1346       gsi_move_before (&gsi_from, &gsi);
1347       replace_phi_edge_with_variable (cond_bb, e1, phi, lhs);
1348       return 2;
1349     }
1350 
1351   return 0;
1352 }
1353 
1354 /*  The function minmax_replacement does the main work of doing the minmax
1355     replacement.  Return true if the replacement is done.  Otherwise return
1356     false.
1357     BB is the basic block where the replacement is going to be done on.  ARG0
1358     is argument 0 from the PHI.  Likewise for ARG1.  */
1359 
1360 static bool
minmax_replacement(basic_block cond_bb,basic_block middle_bb,edge e0,edge e1,gimple * phi,tree arg0,tree arg1)1361 minmax_replacement (basic_block cond_bb, basic_block middle_bb,
1362 		    edge e0, edge e1, gimple *phi,
1363 		    tree arg0, tree arg1)
1364 {
1365   tree result, type, rhs;
1366   gcond *cond;
1367   gassign *new_stmt;
1368   edge true_edge, false_edge;
1369   enum tree_code cmp, minmax, ass_code;
1370   tree smaller, alt_smaller, larger, alt_larger, arg_true, arg_false;
1371   gimple_stmt_iterator gsi, gsi_from;
1372 
1373   type = TREE_TYPE (PHI_RESULT (phi));
1374 
1375   /* The optimization may be unsafe due to NaNs.  */
1376   if (HONOR_NANS (type) || HONOR_SIGNED_ZEROS (type))
1377     return false;
1378 
1379   cond = as_a <gcond *> (last_stmt (cond_bb));
1380   cmp = gimple_cond_code (cond);
1381   rhs = gimple_cond_rhs (cond);
1382 
1383   /* Turn EQ/NE of extreme values to order comparisons.  */
1384   if ((cmp == NE_EXPR || cmp == EQ_EXPR)
1385       && TREE_CODE (rhs) == INTEGER_CST
1386       && INTEGRAL_TYPE_P (TREE_TYPE (rhs)))
1387     {
1388       if (wi::eq_p (wi::to_wide (rhs), wi::min_value (TREE_TYPE (rhs))))
1389 	{
1390 	  cmp = (cmp == EQ_EXPR) ? LT_EXPR : GE_EXPR;
1391 	  rhs = wide_int_to_tree (TREE_TYPE (rhs),
1392 				  wi::min_value (TREE_TYPE (rhs)) + 1);
1393 	}
1394       else if (wi::eq_p (wi::to_wide (rhs), wi::max_value (TREE_TYPE (rhs))))
1395 	{
1396 	  cmp = (cmp == EQ_EXPR) ? GT_EXPR : LE_EXPR;
1397 	  rhs = wide_int_to_tree (TREE_TYPE (rhs),
1398 				  wi::max_value (TREE_TYPE (rhs)) - 1);
1399 	}
1400     }
1401 
1402   /* This transformation is only valid for order comparisons.  Record which
1403      operand is smaller/larger if the result of the comparison is true.  */
1404   alt_smaller = NULL_TREE;
1405   alt_larger = NULL_TREE;
1406   if (cmp == LT_EXPR || cmp == LE_EXPR)
1407     {
1408       smaller = gimple_cond_lhs (cond);
1409       larger = rhs;
1410       /* If we have smaller < CST it is equivalent to smaller <= CST-1.
1411 	 Likewise smaller <= CST is equivalent to smaller < CST+1.  */
1412       if (TREE_CODE (larger) == INTEGER_CST
1413 	  && INTEGRAL_TYPE_P (TREE_TYPE (larger)))
1414 	{
1415 	  if (cmp == LT_EXPR)
1416 	    {
1417 	      wi::overflow_type overflow;
1418 	      wide_int alt = wi::sub (wi::to_wide (larger), 1,
1419 				      TYPE_SIGN (TREE_TYPE (larger)),
1420 				      &overflow);
1421 	      if (! overflow)
1422 		alt_larger = wide_int_to_tree (TREE_TYPE (larger), alt);
1423 	    }
1424 	  else
1425 	    {
1426 	      wi::overflow_type overflow;
1427 	      wide_int alt = wi::add (wi::to_wide (larger), 1,
1428 				      TYPE_SIGN (TREE_TYPE (larger)),
1429 				      &overflow);
1430 	      if (! overflow)
1431 		alt_larger = wide_int_to_tree (TREE_TYPE (larger), alt);
1432 	    }
1433 	}
1434     }
1435   else if (cmp == GT_EXPR || cmp == GE_EXPR)
1436     {
1437       smaller = rhs;
1438       larger = gimple_cond_lhs (cond);
1439       /* If we have larger > CST it is equivalent to larger >= CST+1.
1440 	 Likewise larger >= CST is equivalent to larger > CST-1.  */
1441       if (TREE_CODE (smaller) == INTEGER_CST
1442 	  && INTEGRAL_TYPE_P (TREE_TYPE (smaller)))
1443 	{
1444 	  wi::overflow_type overflow;
1445 	  if (cmp == GT_EXPR)
1446 	    {
1447 	      wide_int alt = wi::add (wi::to_wide (smaller), 1,
1448 				      TYPE_SIGN (TREE_TYPE (smaller)),
1449 				      &overflow);
1450 	      if (! overflow)
1451 		alt_smaller = wide_int_to_tree (TREE_TYPE (smaller), alt);
1452 	    }
1453 	  else
1454 	    {
1455 	      wide_int alt = wi::sub (wi::to_wide (smaller), 1,
1456 				      TYPE_SIGN (TREE_TYPE (smaller)),
1457 				      &overflow);
1458 	      if (! overflow)
1459 		alt_smaller = wide_int_to_tree (TREE_TYPE (smaller), alt);
1460 	    }
1461 	}
1462     }
1463   else
1464     return false;
1465 
1466   /* We need to know which is the true edge and which is the false
1467       edge so that we know if have abs or negative abs.  */
1468   extract_true_false_edges_from_block (cond_bb, &true_edge, &false_edge);
1469 
1470   /* Forward the edges over the middle basic block.  */
1471   if (true_edge->dest == middle_bb)
1472     true_edge = EDGE_SUCC (true_edge->dest, 0);
1473   if (false_edge->dest == middle_bb)
1474     false_edge = EDGE_SUCC (false_edge->dest, 0);
1475 
1476   if (true_edge == e0)
1477     {
1478       gcc_assert (false_edge == e1);
1479       arg_true = arg0;
1480       arg_false = arg1;
1481     }
1482   else
1483     {
1484       gcc_assert (false_edge == e0);
1485       gcc_assert (true_edge == e1);
1486       arg_true = arg1;
1487       arg_false = arg0;
1488     }
1489 
1490   if (empty_block_p (middle_bb))
1491     {
1492       if ((operand_equal_for_phi_arg_p (arg_true, smaller)
1493 	   || (alt_smaller
1494 	       && operand_equal_for_phi_arg_p (arg_true, alt_smaller)))
1495 	  && (operand_equal_for_phi_arg_p (arg_false, larger)
1496 	      || (alt_larger
1497 		  && operand_equal_for_phi_arg_p (arg_true, alt_larger))))
1498 	{
1499 	  /* Case
1500 
1501 	     if (smaller < larger)
1502 	     rslt = smaller;
1503 	     else
1504 	     rslt = larger;  */
1505 	  minmax = MIN_EXPR;
1506 	}
1507       else if ((operand_equal_for_phi_arg_p (arg_false, smaller)
1508 		|| (alt_smaller
1509 		    && operand_equal_for_phi_arg_p (arg_false, alt_smaller)))
1510 	       && (operand_equal_for_phi_arg_p (arg_true, larger)
1511 		   || (alt_larger
1512 		       && operand_equal_for_phi_arg_p (arg_true, alt_larger))))
1513 	minmax = MAX_EXPR;
1514       else
1515 	return false;
1516     }
1517   else
1518     {
1519       /* Recognize the following case, assuming d <= u:
1520 
1521 	 if (a <= u)
1522 	   b = MAX (a, d);
1523 	 x = PHI <b, u>
1524 
1525 	 This is equivalent to
1526 
1527 	 b = MAX (a, d);
1528 	 x = MIN (b, u);  */
1529 
1530       gimple *assign = last_and_only_stmt (middle_bb);
1531       tree lhs, op0, op1, bound;
1532 
1533       if (!assign
1534 	  || gimple_code (assign) != GIMPLE_ASSIGN)
1535 	return false;
1536 
1537       lhs = gimple_assign_lhs (assign);
1538       ass_code = gimple_assign_rhs_code (assign);
1539       if (ass_code != MAX_EXPR && ass_code != MIN_EXPR)
1540 	return false;
1541       op0 = gimple_assign_rhs1 (assign);
1542       op1 = gimple_assign_rhs2 (assign);
1543 
1544       if (true_edge->src == middle_bb)
1545 	{
1546 	  /* We got here if the condition is true, i.e., SMALLER < LARGER.  */
1547 	  if (!operand_equal_for_phi_arg_p (lhs, arg_true))
1548 	    return false;
1549 
1550 	  if (operand_equal_for_phi_arg_p (arg_false, larger)
1551 	      || (alt_larger
1552 		  && operand_equal_for_phi_arg_p (arg_false, alt_larger)))
1553 	    {
1554 	      /* Case
1555 
1556 		 if (smaller < larger)
1557 		   {
1558 		     r' = MAX_EXPR (smaller, bound)
1559 		   }
1560 		 r = PHI <r', larger>  --> to be turned to MIN_EXPR.  */
1561 	      if (ass_code != MAX_EXPR)
1562 		return false;
1563 
1564 	      minmax = MIN_EXPR;
1565 	      if (operand_equal_for_phi_arg_p (op0, smaller)
1566 		  || (alt_smaller
1567 		      && operand_equal_for_phi_arg_p (op0, alt_smaller)))
1568 		bound = op1;
1569 	      else if (operand_equal_for_phi_arg_p (op1, smaller)
1570 		       || (alt_smaller
1571 			   && operand_equal_for_phi_arg_p (op1, alt_smaller)))
1572 		bound = op0;
1573 	      else
1574 		return false;
1575 
1576 	      /* We need BOUND <= LARGER.  */
1577 	      if (!integer_nonzerop (fold_build2 (LE_EXPR, boolean_type_node,
1578 						  bound, larger)))
1579 		return false;
1580 	    }
1581 	  else if (operand_equal_for_phi_arg_p (arg_false, smaller)
1582 		   || (alt_smaller
1583 		       && operand_equal_for_phi_arg_p (arg_false, alt_smaller)))
1584 	    {
1585 	      /* Case
1586 
1587 		 if (smaller < larger)
1588 		   {
1589 		     r' = MIN_EXPR (larger, bound)
1590 		   }
1591 		 r = PHI <r', smaller>  --> to be turned to MAX_EXPR.  */
1592 	      if (ass_code != MIN_EXPR)
1593 		return false;
1594 
1595 	      minmax = MAX_EXPR;
1596 	      if (operand_equal_for_phi_arg_p (op0, larger)
1597 		  || (alt_larger
1598 		      && operand_equal_for_phi_arg_p (op0, alt_larger)))
1599 		bound = op1;
1600 	      else if (operand_equal_for_phi_arg_p (op1, larger)
1601 		       || (alt_larger
1602 			   && operand_equal_for_phi_arg_p (op1, alt_larger)))
1603 		bound = op0;
1604 	      else
1605 		return false;
1606 
1607 	      /* We need BOUND >= SMALLER.  */
1608 	      if (!integer_nonzerop (fold_build2 (GE_EXPR, boolean_type_node,
1609 						  bound, smaller)))
1610 		return false;
1611 	    }
1612 	  else
1613 	    return false;
1614 	}
1615       else
1616 	{
1617 	  /* We got here if the condition is false, i.e., SMALLER > LARGER.  */
1618 	  if (!operand_equal_for_phi_arg_p (lhs, arg_false))
1619 	    return false;
1620 
1621 	  if (operand_equal_for_phi_arg_p (arg_true, larger)
1622 	      || (alt_larger
1623 		  && operand_equal_for_phi_arg_p (arg_true, alt_larger)))
1624 	    {
1625 	      /* Case
1626 
1627 		 if (smaller > larger)
1628 		   {
1629 		     r' = MIN_EXPR (smaller, bound)
1630 		   }
1631 		 r = PHI <r', larger>  --> to be turned to MAX_EXPR.  */
1632 	      if (ass_code != MIN_EXPR)
1633 		return false;
1634 
1635 	      minmax = MAX_EXPR;
1636 	      if (operand_equal_for_phi_arg_p (op0, smaller)
1637 		  || (alt_smaller
1638 		      && operand_equal_for_phi_arg_p (op0, alt_smaller)))
1639 		bound = op1;
1640 	      else if (operand_equal_for_phi_arg_p (op1, smaller)
1641 		       || (alt_smaller
1642 			   && operand_equal_for_phi_arg_p (op1, alt_smaller)))
1643 		bound = op0;
1644 	      else
1645 		return false;
1646 
1647 	      /* We need BOUND >= LARGER.  */
1648 	      if (!integer_nonzerop (fold_build2 (GE_EXPR, boolean_type_node,
1649 						  bound, larger)))
1650 		return false;
1651 	    }
1652 	  else if (operand_equal_for_phi_arg_p (arg_true, smaller)
1653 		   || (alt_smaller
1654 		       && operand_equal_for_phi_arg_p (arg_true, alt_smaller)))
1655 	    {
1656 	      /* Case
1657 
1658 		 if (smaller > larger)
1659 		   {
1660 		     r' = MAX_EXPR (larger, bound)
1661 		   }
1662 		 r = PHI <r', smaller>  --> to be turned to MIN_EXPR.  */
1663 	      if (ass_code != MAX_EXPR)
1664 		return false;
1665 
1666 	      minmax = MIN_EXPR;
1667 	      if (operand_equal_for_phi_arg_p (op0, larger))
1668 		bound = op1;
1669 	      else if (operand_equal_for_phi_arg_p (op1, larger))
1670 		bound = op0;
1671 	      else
1672 		return false;
1673 
1674 	      /* We need BOUND <= SMALLER.  */
1675 	      if (!integer_nonzerop (fold_build2 (LE_EXPR, boolean_type_node,
1676 						  bound, smaller)))
1677 		return false;
1678 	    }
1679 	  else
1680 	    return false;
1681 	}
1682 
1683       /* Move the statement from the middle block.  */
1684       gsi = gsi_last_bb (cond_bb);
1685       gsi_from = gsi_last_nondebug_bb (middle_bb);
1686       reset_flow_sensitive_info (SINGLE_SSA_TREE_OPERAND (gsi_stmt (gsi_from),
1687 							  SSA_OP_DEF));
1688       gsi_move_before (&gsi_from, &gsi);
1689     }
1690 
1691   /* Create an SSA var to hold the min/max result.  If we're the only
1692      things setting the target PHI, then we  can clone the PHI
1693      variable.  Otherwise we must create a new one.  */
1694   result = PHI_RESULT (phi);
1695   if (EDGE_COUNT (gimple_bb (phi)->preds) == 2)
1696     result = duplicate_ssa_name (result, NULL);
1697   else
1698     result = make_ssa_name (TREE_TYPE (result));
1699 
1700   /* Emit the statement to compute min/max.  */
1701   new_stmt = gimple_build_assign (result, minmax, arg0, arg1);
1702   gsi = gsi_last_bb (cond_bb);
1703   gsi_insert_before (&gsi, new_stmt, GSI_NEW_STMT);
1704 
1705   replace_phi_edge_with_variable (cond_bb, e1, phi, result);
1706 
1707   return true;
1708 }
1709 
1710 /* Convert
1711 
1712    <bb 2>
1713    if (b_4(D) != 0)
1714    goto <bb 3>
1715    else
1716    goto <bb 4>
1717 
1718    <bb 3>
1719    _2 = (unsigned long) b_4(D);
1720    _9 = __builtin_popcountl (_2);
1721    OR
1722    _9 = __builtin_popcountl (b_4(D));
1723 
1724    <bb 4>
1725    c_12 = PHI <0(2), _9(3)>
1726 
1727    Into
1728    <bb 2>
1729    _2 = (unsigned long) b_4(D);
1730    _9 = __builtin_popcountl (_2);
1731    OR
1732    _9 = __builtin_popcountl (b_4(D));
1733 
1734    <bb 4>
1735    c_12 = PHI <_9(2)>
1736 */
1737 
1738 static bool
cond_removal_in_popcount_pattern(basic_block cond_bb,basic_block middle_bb,edge e1,edge e2,gimple * phi,tree arg0,tree arg1)1739 cond_removal_in_popcount_pattern (basic_block cond_bb, basic_block middle_bb,
1740 				  edge e1, edge e2,
1741 				  gimple *phi, tree arg0, tree arg1)
1742 {
1743   gimple *cond;
1744   gimple_stmt_iterator gsi, gsi_from;
1745   gimple *popcount;
1746   gimple *cast = NULL;
1747   tree lhs, arg;
1748 
1749   /* Check that
1750    _2 = (unsigned long) b_4(D);
1751    _9 = __builtin_popcountl (_2);
1752    OR
1753    _9 = __builtin_popcountl (b_4(D));
1754    are the only stmts in the middle_bb.  */
1755 
1756   gsi = gsi_start_nondebug_after_labels_bb (middle_bb);
1757   if (gsi_end_p (gsi))
1758     return false;
1759   cast = gsi_stmt (gsi);
1760   gsi_next_nondebug (&gsi);
1761   if (!gsi_end_p (gsi))
1762     {
1763       popcount = gsi_stmt (gsi);
1764       gsi_next_nondebug (&gsi);
1765       if (!gsi_end_p (gsi))
1766 	return false;
1767     }
1768   else
1769     {
1770       popcount = cast;
1771       cast = NULL;
1772     }
1773 
1774   /* Check that we have a popcount builtin.  */
1775   if (!is_gimple_call (popcount))
1776     return false;
1777   combined_fn cfn = gimple_call_combined_fn (popcount);
1778   switch (cfn)
1779     {
1780     CASE_CFN_POPCOUNT:
1781       break;
1782     default:
1783       return false;
1784     }
1785 
1786   arg = gimple_call_arg (popcount, 0);
1787   lhs = gimple_get_lhs (popcount);
1788 
1789   if (cast)
1790     {
1791       /* We have a cast stmt feeding popcount builtin.  */
1792       /* Check that we have a cast prior to that.  */
1793       if (gimple_code (cast) != GIMPLE_ASSIGN
1794 	  || !CONVERT_EXPR_CODE_P (gimple_assign_rhs_code (cast)))
1795 	return false;
1796       /* Result of the cast stmt is the argument to the builtin.  */
1797       if (arg != gimple_assign_lhs (cast))
1798 	return false;
1799       arg = gimple_assign_rhs1 (cast);
1800     }
1801 
1802   cond = last_stmt (cond_bb);
1803 
1804   /* Cond_bb has a check for b_4 [!=|==] 0 before calling the popcount
1805      builtin.  */
1806   if (gimple_code (cond) != GIMPLE_COND
1807       || (gimple_cond_code (cond) != NE_EXPR
1808 	  && gimple_cond_code (cond) != EQ_EXPR)
1809       || !integer_zerop (gimple_cond_rhs (cond))
1810       || arg != gimple_cond_lhs (cond))
1811     return false;
1812 
1813   /* Canonicalize.  */
1814   if ((e2->flags & EDGE_TRUE_VALUE
1815        && gimple_cond_code (cond) == NE_EXPR)
1816       || (e1->flags & EDGE_TRUE_VALUE
1817 	  && gimple_cond_code (cond) == EQ_EXPR))
1818     {
1819       std::swap (arg0, arg1);
1820       std::swap (e1, e2);
1821     }
1822 
1823   /* Check PHI arguments.  */
1824   if (lhs != arg0 || !integer_zerop (arg1))
1825     return false;
1826 
1827   /* And insert the popcount builtin and cast stmt before the cond_bb.  */
1828   gsi = gsi_last_bb (cond_bb);
1829   if (cast)
1830     {
1831       gsi_from = gsi_for_stmt (cast);
1832       gsi_move_before (&gsi_from, &gsi);
1833       reset_flow_sensitive_info (gimple_get_lhs (cast));
1834     }
1835   gsi_from = gsi_for_stmt (popcount);
1836   gsi_move_before (&gsi_from, &gsi);
1837   reset_flow_sensitive_info (gimple_get_lhs (popcount));
1838 
1839   /* Now update the PHI and remove unneeded bbs.  */
1840   replace_phi_edge_with_variable (cond_bb, e2, phi, lhs);
1841   return true;
1842 }
1843 
1844 /*  The function absolute_replacement does the main work of doing the absolute
1845     replacement.  Return true if the replacement is done.  Otherwise return
1846     false.
1847     bb is the basic block where the replacement is going to be done on.  arg0
1848     is argument 0 from the phi.  Likewise for arg1.  */
1849 
1850 static bool
abs_replacement(basic_block cond_bb,basic_block middle_bb,edge e0 ATTRIBUTE_UNUSED,edge e1,gimple * phi,tree arg0,tree arg1)1851 abs_replacement (basic_block cond_bb, basic_block middle_bb,
1852 		 edge e0 ATTRIBUTE_UNUSED, edge e1,
1853 		 gimple *phi, tree arg0, tree arg1)
1854 {
1855   tree result;
1856   gassign *new_stmt;
1857   gimple *cond;
1858   gimple_stmt_iterator gsi;
1859   edge true_edge, false_edge;
1860   gimple *assign;
1861   edge e;
1862   tree rhs, lhs;
1863   bool negate;
1864   enum tree_code cond_code;
1865 
1866   /* If the type says honor signed zeros we cannot do this
1867      optimization.  */
1868   if (HONOR_SIGNED_ZEROS (arg1))
1869     return false;
1870 
1871   /* OTHER_BLOCK must have only one executable statement which must have the
1872      form arg0 = -arg1 or arg1 = -arg0.  */
1873 
1874   assign = last_and_only_stmt (middle_bb);
1875   /* If we did not find the proper negation assignment, then we cannot
1876      optimize.  */
1877   if (assign == NULL)
1878     return false;
1879 
1880   /* If we got here, then we have found the only executable statement
1881      in OTHER_BLOCK.  If it is anything other than arg = -arg1 or
1882      arg1 = -arg0, then we cannot optimize.  */
1883   if (gimple_code (assign) != GIMPLE_ASSIGN)
1884     return false;
1885 
1886   lhs = gimple_assign_lhs (assign);
1887 
1888   if (gimple_assign_rhs_code (assign) != NEGATE_EXPR)
1889     return false;
1890 
1891   rhs = gimple_assign_rhs1 (assign);
1892 
1893   /* The assignment has to be arg0 = -arg1 or arg1 = -arg0.  */
1894   if (!(lhs == arg0 && rhs == arg1)
1895       && !(lhs == arg1 && rhs == arg0))
1896     return false;
1897 
1898   cond = last_stmt (cond_bb);
1899   result = PHI_RESULT (phi);
1900 
1901   /* Only relationals comparing arg[01] against zero are interesting.  */
1902   cond_code = gimple_cond_code (cond);
1903   if (cond_code != GT_EXPR && cond_code != GE_EXPR
1904       && cond_code != LT_EXPR && cond_code != LE_EXPR)
1905     return false;
1906 
1907   /* Make sure the conditional is arg[01] OP y.  */
1908   if (gimple_cond_lhs (cond) != rhs)
1909     return false;
1910 
1911   if (FLOAT_TYPE_P (TREE_TYPE (gimple_cond_rhs (cond)))
1912 	       ? real_zerop (gimple_cond_rhs (cond))
1913 	       : integer_zerop (gimple_cond_rhs (cond)))
1914     ;
1915   else
1916     return false;
1917 
1918   /* We need to know which is the true edge and which is the false
1919      edge so that we know if have abs or negative abs.  */
1920   extract_true_false_edges_from_block (cond_bb, &true_edge, &false_edge);
1921 
1922   /* For GT_EXPR/GE_EXPR, if the true edge goes to OTHER_BLOCK, then we
1923      will need to negate the result.  Similarly for LT_EXPR/LE_EXPR if
1924      the false edge goes to OTHER_BLOCK.  */
1925   if (cond_code == GT_EXPR || cond_code == GE_EXPR)
1926     e = true_edge;
1927   else
1928     e = false_edge;
1929 
1930   if (e->dest == middle_bb)
1931     negate = true;
1932   else
1933     negate = false;
1934 
1935   /* If the code negates only iff positive then make sure to not
1936      introduce undefined behavior when negating or computing the absolute.
1937      ???  We could use range info if present to check for arg1 == INT_MIN.  */
1938   if (negate
1939       && (ANY_INTEGRAL_TYPE_P (TREE_TYPE (arg1))
1940 	  && ! TYPE_OVERFLOW_WRAPS (TREE_TYPE (arg1))))
1941     return false;
1942 
1943   result = duplicate_ssa_name (result, NULL);
1944 
1945   if (negate)
1946     lhs = make_ssa_name (TREE_TYPE (result));
1947   else
1948     lhs = result;
1949 
1950   /* Build the modify expression with abs expression.  */
1951   new_stmt = gimple_build_assign (lhs, ABS_EXPR, rhs);
1952 
1953   gsi = gsi_last_bb (cond_bb);
1954   gsi_insert_before (&gsi, new_stmt, GSI_NEW_STMT);
1955 
1956   if (negate)
1957     {
1958       /* Get the right GSI.  We want to insert after the recently
1959 	 added ABS_EXPR statement (which we know is the first statement
1960 	 in the block.  */
1961       new_stmt = gimple_build_assign (result, NEGATE_EXPR, lhs);
1962 
1963       gsi_insert_after (&gsi, new_stmt, GSI_NEW_STMT);
1964     }
1965 
1966   replace_phi_edge_with_variable (cond_bb, e1, phi, result);
1967 
1968   /* Note that we optimized this PHI.  */
1969   return true;
1970 }
1971 
1972 /* Auxiliary functions to determine the set of memory accesses which
1973    can't trap because they are preceded by accesses to the same memory
1974    portion.  We do that for MEM_REFs, so we only need to track
1975    the SSA_NAME of the pointer indirectly referenced.  The algorithm
1976    simply is a walk over all instructions in dominator order.  When
1977    we see an MEM_REF we determine if we've already seen a same
1978    ref anywhere up to the root of the dominator tree.  If we do the
1979    current access can't trap.  If we don't see any dominating access
1980    the current access might trap, but might also make later accesses
1981    non-trapping, so we remember it.  We need to be careful with loads
1982    or stores, for instance a load might not trap, while a store would,
1983    so if we see a dominating read access this doesn't mean that a later
1984    write access would not trap.  Hence we also need to differentiate the
1985    type of access(es) seen.
1986 
1987    ??? We currently are very conservative and assume that a load might
1988    trap even if a store doesn't (write-only memory).  This probably is
1989    overly conservative.  */
1990 
1991 /* A hash-table of SSA_NAMEs, and in which basic block an MEM_REF
1992    through it was seen, which would constitute a no-trap region for
1993    same accesses.  */
1994 struct name_to_bb
1995 {
1996   unsigned int ssa_name_ver;
1997   unsigned int phase;
1998   bool store;
1999   HOST_WIDE_INT offset, size;
2000   basic_block bb;
2001 };
2002 
2003 /* Hashtable helpers.  */
2004 
2005 struct ssa_names_hasher : free_ptr_hash <name_to_bb>
2006 {
2007   static inline hashval_t hash (const name_to_bb *);
2008   static inline bool equal (const name_to_bb *, const name_to_bb *);
2009 };
2010 
2011 /* Used for quick clearing of the hash-table when we see calls.
2012    Hash entries with phase < nt_call_phase are invalid.  */
2013 static unsigned int nt_call_phase;
2014 
2015 /* The hash function.  */
2016 
2017 inline hashval_t
hash(const name_to_bb * n)2018 ssa_names_hasher::hash (const name_to_bb *n)
2019 {
2020   return n->ssa_name_ver ^ (((hashval_t) n->store) << 31)
2021          ^ (n->offset << 6) ^ (n->size << 3);
2022 }
2023 
2024 /* The equality function of *P1 and *P2.  */
2025 
2026 inline bool
equal(const name_to_bb * n1,const name_to_bb * n2)2027 ssa_names_hasher::equal (const name_to_bb *n1, const name_to_bb *n2)
2028 {
2029   return n1->ssa_name_ver == n2->ssa_name_ver
2030          && n1->store == n2->store
2031          && n1->offset == n2->offset
2032          && n1->size == n2->size;
2033 }
2034 
2035 class nontrapping_dom_walker : public dom_walker
2036 {
2037 public:
nontrapping_dom_walker(cdi_direction direction,hash_set<tree> * ps)2038   nontrapping_dom_walker (cdi_direction direction, hash_set<tree> *ps)
2039     : dom_walker (direction), m_nontrapping (ps), m_seen_ssa_names (128) {}
2040 
2041   virtual edge before_dom_children (basic_block);
2042   virtual void after_dom_children (basic_block);
2043 
2044 private:
2045 
2046   /* We see the expression EXP in basic block BB.  If it's an interesting
2047      expression (an MEM_REF through an SSA_NAME) possibly insert the
2048      expression into the set NONTRAP or the hash table of seen expressions.
2049      STORE is true if this expression is on the LHS, otherwise it's on
2050      the RHS.  */
2051   void add_or_mark_expr (basic_block, tree, bool);
2052 
2053   hash_set<tree> *m_nontrapping;
2054 
2055   /* The hash table for remembering what we've seen.  */
2056   hash_table<ssa_names_hasher> m_seen_ssa_names;
2057 };
2058 
2059 /* Called by walk_dominator_tree, when entering the block BB.  */
2060 edge
before_dom_children(basic_block bb)2061 nontrapping_dom_walker::before_dom_children (basic_block bb)
2062 {
2063   edge e;
2064   edge_iterator ei;
2065   gimple_stmt_iterator gsi;
2066 
2067   /* If we haven't seen all our predecessors, clear the hash-table.  */
2068   FOR_EACH_EDGE (e, ei, bb->preds)
2069     if ((((size_t)e->src->aux) & 2) == 0)
2070       {
2071 	nt_call_phase++;
2072 	break;
2073       }
2074 
2075   /* Mark this BB as being on the path to dominator root and as visited.  */
2076   bb->aux = (void*)(1 | 2);
2077 
2078   /* And walk the statements in order.  */
2079   for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
2080     {
2081       gimple *stmt = gsi_stmt (gsi);
2082 
2083       if ((gimple_code (stmt) == GIMPLE_ASM && gimple_vdef (stmt))
2084 	  || (is_gimple_call (stmt)
2085 	      && (!nonfreeing_call_p (stmt) || !nonbarrier_call_p (stmt))))
2086 	nt_call_phase++;
2087       else if (gimple_assign_single_p (stmt) && !gimple_has_volatile_ops (stmt))
2088 	{
2089 	  add_or_mark_expr (bb, gimple_assign_lhs (stmt), true);
2090 	  add_or_mark_expr (bb, gimple_assign_rhs1 (stmt), false);
2091 	}
2092     }
2093   return NULL;
2094 }
2095 
2096 /* Called by walk_dominator_tree, when basic block BB is exited.  */
2097 void
after_dom_children(basic_block bb)2098 nontrapping_dom_walker::after_dom_children (basic_block bb)
2099 {
2100   /* This BB isn't on the path to dominator root anymore.  */
2101   bb->aux = (void*)2;
2102 }
2103 
2104 /* We see the expression EXP in basic block BB.  If it's an interesting
2105    expression (an MEM_REF through an SSA_NAME) possibly insert the
2106    expression into the set NONTRAP or the hash table of seen expressions.
2107    STORE is true if this expression is on the LHS, otherwise it's on
2108    the RHS.  */
2109 void
add_or_mark_expr(basic_block bb,tree exp,bool store)2110 nontrapping_dom_walker::add_or_mark_expr (basic_block bb, tree exp, bool store)
2111 {
2112   HOST_WIDE_INT size;
2113 
2114   if (TREE_CODE (exp) == MEM_REF
2115       && TREE_CODE (TREE_OPERAND (exp, 0)) == SSA_NAME
2116       && tree_fits_shwi_p (TREE_OPERAND (exp, 1))
2117       && (size = int_size_in_bytes (TREE_TYPE (exp))) > 0)
2118     {
2119       tree name = TREE_OPERAND (exp, 0);
2120       struct name_to_bb map;
2121       name_to_bb **slot;
2122       struct name_to_bb *n2bb;
2123       basic_block found_bb = 0;
2124 
2125       /* Try to find the last seen MEM_REF through the same
2126          SSA_NAME, which can trap.  */
2127       map.ssa_name_ver = SSA_NAME_VERSION (name);
2128       map.phase = 0;
2129       map.bb = 0;
2130       map.store = store;
2131       map.offset = tree_to_shwi (TREE_OPERAND (exp, 1));
2132       map.size = size;
2133 
2134       slot = m_seen_ssa_names.find_slot (&map, INSERT);
2135       n2bb = *slot;
2136       if (n2bb && n2bb->phase >= nt_call_phase)
2137         found_bb = n2bb->bb;
2138 
2139       /* If we've found a trapping MEM_REF, _and_ it dominates EXP
2140          (it's in a basic block on the path from us to the dominator root)
2141 	 then we can't trap.  */
2142       if (found_bb && (((size_t)found_bb->aux) & 1) == 1)
2143 	{
2144 	  m_nontrapping->add (exp);
2145 	}
2146       else
2147         {
2148 	  /* EXP might trap, so insert it into the hash table.  */
2149 	  if (n2bb)
2150 	    {
2151 	      n2bb->phase = nt_call_phase;
2152 	      n2bb->bb = bb;
2153 	    }
2154 	  else
2155 	    {
2156 	      n2bb = XNEW (struct name_to_bb);
2157 	      n2bb->ssa_name_ver = SSA_NAME_VERSION (name);
2158 	      n2bb->phase = nt_call_phase;
2159 	      n2bb->bb = bb;
2160 	      n2bb->store = store;
2161 	      n2bb->offset = map.offset;
2162 	      n2bb->size = size;
2163 	      *slot = n2bb;
2164 	    }
2165 	}
2166     }
2167 }
2168 
2169 /* This is the entry point of gathering non trapping memory accesses.
2170    It will do a dominator walk over the whole function, and it will
2171    make use of the bb->aux pointers.  It returns a set of trees
2172    (the MEM_REFs itself) which can't trap.  */
2173 static hash_set<tree> *
get_non_trapping(void)2174 get_non_trapping (void)
2175 {
2176   nt_call_phase = 0;
2177   hash_set<tree> *nontrap = new hash_set<tree>;
2178   /* We're going to do a dominator walk, so ensure that we have
2179      dominance information.  */
2180   calculate_dominance_info (CDI_DOMINATORS);
2181 
2182   nontrapping_dom_walker (CDI_DOMINATORS, nontrap)
2183     .walk (cfun->cfg->x_entry_block_ptr);
2184 
2185   clear_aux_for_blocks ();
2186   return nontrap;
2187 }
2188 
2189 /* Do the main work of conditional store replacement.  We already know
2190    that the recognized pattern looks like so:
2191 
2192    split:
2193      if (cond) goto MIDDLE_BB; else goto JOIN_BB (edge E1)
2194    MIDDLE_BB:
2195      something
2196      fallthrough (edge E0)
2197    JOIN_BB:
2198      some more
2199 
2200    We check that MIDDLE_BB contains only one store, that that store
2201    doesn't trap (not via NOTRAP, but via checking if an access to the same
2202    memory location dominates us, or the store is to a local addressable
2203    object) and that the store has a "simple" RHS.  */
2204 
2205 static bool
cond_store_replacement(basic_block middle_bb,basic_block join_bb,edge e0,edge e1,hash_set<tree> * nontrap)2206 cond_store_replacement (basic_block middle_bb, basic_block join_bb,
2207 			edge e0, edge e1, hash_set<tree> *nontrap)
2208 {
2209   gimple *assign = last_and_only_stmt (middle_bb);
2210   tree lhs, rhs, name, name2;
2211   gphi *newphi;
2212   gassign *new_stmt;
2213   gimple_stmt_iterator gsi;
2214   location_t locus;
2215 
2216   /* Check if middle_bb contains of only one store.  */
2217   if (!assign
2218       || !gimple_assign_single_p (assign)
2219       || gimple_has_volatile_ops (assign))
2220     return false;
2221 
2222   /* And no PHI nodes so all uses in the single stmt are also
2223      available where we insert to.  */
2224   if (!gimple_seq_empty_p (phi_nodes (middle_bb)))
2225     return false;
2226 
2227   locus = gimple_location (assign);
2228   lhs = gimple_assign_lhs (assign);
2229   rhs = gimple_assign_rhs1 (assign);
2230   if ((TREE_CODE (lhs) != MEM_REF
2231        && TREE_CODE (lhs) != ARRAY_REF
2232        && TREE_CODE (lhs) != COMPONENT_REF)
2233       || !is_gimple_reg_type (TREE_TYPE (lhs)))
2234     return false;
2235 
2236   /* Prove that we can move the store down.  We could also check
2237      TREE_THIS_NOTRAP here, but in that case we also could move stores,
2238      whose value is not available readily, which we want to avoid.  */
2239   if (!nontrap->contains (lhs))
2240     {
2241       /* If LHS is an access to a local variable without address-taken
2242 	 (or when we allow data races) and known not to trap, we could
2243 	 always safely move down the store.  */
2244       tree base = get_base_address (lhs);
2245       if (!auto_var_p (base)
2246 	  || (TREE_ADDRESSABLE (base) && !flag_store_data_races)
2247 	  || tree_could_trap_p (lhs))
2248 	return false;
2249     }
2250 
2251   /* Now we've checked the constraints, so do the transformation:
2252      1) Remove the single store.  */
2253   gsi = gsi_for_stmt (assign);
2254   unlink_stmt_vdef (assign);
2255   gsi_remove (&gsi, true);
2256   release_defs (assign);
2257 
2258   /* Make both store and load use alias-set zero as we have to
2259      deal with the case of the store being a conditional change
2260      of the dynamic type.  */
2261   lhs = unshare_expr (lhs);
2262   tree *basep = &lhs;
2263   while (handled_component_p (*basep))
2264     basep = &TREE_OPERAND (*basep, 0);
2265   if (TREE_CODE (*basep) == MEM_REF
2266       || TREE_CODE (*basep) == TARGET_MEM_REF)
2267     TREE_OPERAND (*basep, 1)
2268       = fold_convert (ptr_type_node, TREE_OPERAND (*basep, 1));
2269   else
2270     *basep = build2 (MEM_REF, TREE_TYPE (*basep),
2271 		     build_fold_addr_expr (*basep),
2272 		     build_zero_cst (ptr_type_node));
2273 
2274   /* 2) Insert a load from the memory of the store to the temporary
2275         on the edge which did not contain the store.  */
2276   name = make_temp_ssa_name (TREE_TYPE (lhs), NULL, "cstore");
2277   new_stmt = gimple_build_assign (name, lhs);
2278   gimple_set_location (new_stmt, locus);
2279   lhs = unshare_expr (lhs);
2280   /* Set TREE_NO_WARNING on the rhs of the load to avoid uninit
2281      warnings.  */
2282   TREE_NO_WARNING (gimple_assign_rhs1 (new_stmt)) = 1;
2283   gsi_insert_on_edge (e1, new_stmt);
2284 
2285   /* 3) Create a PHI node at the join block, with one argument
2286         holding the old RHS, and the other holding the temporary
2287         where we stored the old memory contents.  */
2288   name2 = make_temp_ssa_name (TREE_TYPE (lhs), NULL, "cstore");
2289   newphi = create_phi_node (name2, join_bb);
2290   add_phi_arg (newphi, rhs, e0, locus);
2291   add_phi_arg (newphi, name, e1, locus);
2292 
2293   new_stmt = gimple_build_assign (lhs, PHI_RESULT (newphi));
2294 
2295   /* 4) Insert that PHI node.  */
2296   gsi = gsi_after_labels (join_bb);
2297   if (gsi_end_p (gsi))
2298     {
2299       gsi = gsi_last_bb (join_bb);
2300       gsi_insert_after (&gsi, new_stmt, GSI_NEW_STMT);
2301     }
2302   else
2303     gsi_insert_before (&gsi, new_stmt, GSI_NEW_STMT);
2304 
2305   if (dump_file && (dump_flags & TDF_DETAILS))
2306     {
2307       fprintf (dump_file, "\nConditional store replacement happened!");
2308       fprintf (dump_file, "\nReplaced the store with a load.");
2309       fprintf (dump_file, "\nInserted a new PHI statement in joint block:\n");
2310       print_gimple_stmt (dump_file, new_stmt, 0, TDF_VOPS|TDF_MEMSYMS);
2311     }
2312 
2313   return true;
2314 }
2315 
2316 /* Do the main work of conditional store replacement.  */
2317 
2318 static bool
cond_if_else_store_replacement_1(basic_block then_bb,basic_block else_bb,basic_block join_bb,gimple * then_assign,gimple * else_assign)2319 cond_if_else_store_replacement_1 (basic_block then_bb, basic_block else_bb,
2320 				  basic_block join_bb, gimple *then_assign,
2321 				  gimple *else_assign)
2322 {
2323   tree lhs_base, lhs, then_rhs, else_rhs, name;
2324   location_t then_locus, else_locus;
2325   gimple_stmt_iterator gsi;
2326   gphi *newphi;
2327   gassign *new_stmt;
2328 
2329   if (then_assign == NULL
2330       || !gimple_assign_single_p (then_assign)
2331       || gimple_clobber_p (then_assign)
2332       || gimple_has_volatile_ops (then_assign)
2333       || else_assign == NULL
2334       || !gimple_assign_single_p (else_assign)
2335       || gimple_clobber_p (else_assign)
2336       || gimple_has_volatile_ops (else_assign))
2337     return false;
2338 
2339   lhs = gimple_assign_lhs (then_assign);
2340   if (!is_gimple_reg_type (TREE_TYPE (lhs))
2341       || !operand_equal_p (lhs, gimple_assign_lhs (else_assign), 0))
2342     return false;
2343 
2344   lhs_base = get_base_address (lhs);
2345   if (lhs_base == NULL_TREE
2346       || (!DECL_P (lhs_base) && TREE_CODE (lhs_base) != MEM_REF))
2347     return false;
2348 
2349   then_rhs = gimple_assign_rhs1 (then_assign);
2350   else_rhs = gimple_assign_rhs1 (else_assign);
2351   then_locus = gimple_location (then_assign);
2352   else_locus = gimple_location (else_assign);
2353 
2354   /* Now we've checked the constraints, so do the transformation:
2355      1) Remove the stores.  */
2356   gsi = gsi_for_stmt (then_assign);
2357   unlink_stmt_vdef (then_assign);
2358   gsi_remove (&gsi, true);
2359   release_defs (then_assign);
2360 
2361   gsi = gsi_for_stmt (else_assign);
2362   unlink_stmt_vdef (else_assign);
2363   gsi_remove (&gsi, true);
2364   release_defs (else_assign);
2365 
2366   /* 2) Create a PHI node at the join block, with one argument
2367 	holding the old RHS, and the other holding the temporary
2368 	where we stored the old memory contents.  */
2369   name = make_temp_ssa_name (TREE_TYPE (lhs), NULL, "cstore");
2370   newphi = create_phi_node (name, join_bb);
2371   add_phi_arg (newphi, then_rhs, EDGE_SUCC (then_bb, 0), then_locus);
2372   add_phi_arg (newphi, else_rhs, EDGE_SUCC (else_bb, 0), else_locus);
2373 
2374   new_stmt = gimple_build_assign (lhs, PHI_RESULT (newphi));
2375 
2376   /* 3) Insert that PHI node.  */
2377   gsi = gsi_after_labels (join_bb);
2378   if (gsi_end_p (gsi))
2379     {
2380       gsi = gsi_last_bb (join_bb);
2381       gsi_insert_after (&gsi, new_stmt, GSI_NEW_STMT);
2382     }
2383   else
2384     gsi_insert_before (&gsi, new_stmt, GSI_NEW_STMT);
2385 
2386   return true;
2387 }
2388 
2389 /* Return the single store in BB with VDEF or NULL if there are
2390    other stores in the BB or loads following the store.  */
2391 
2392 static gimple *
single_trailing_store_in_bb(basic_block bb,tree vdef)2393 single_trailing_store_in_bb (basic_block bb, tree vdef)
2394 {
2395   if (SSA_NAME_IS_DEFAULT_DEF (vdef))
2396     return NULL;
2397   gimple *store = SSA_NAME_DEF_STMT (vdef);
2398   if (gimple_bb (store) != bb
2399       || gimple_code (store) == GIMPLE_PHI)
2400     return NULL;
2401 
2402   /* Verify there is no other store in this BB.  */
2403   if (!SSA_NAME_IS_DEFAULT_DEF (gimple_vuse (store))
2404       && gimple_bb (SSA_NAME_DEF_STMT (gimple_vuse (store))) == bb
2405       && gimple_code (SSA_NAME_DEF_STMT (gimple_vuse (store))) != GIMPLE_PHI)
2406     return NULL;
2407 
2408   /* Verify there is no load or store after the store.  */
2409   use_operand_p use_p;
2410   imm_use_iterator imm_iter;
2411   FOR_EACH_IMM_USE_FAST (use_p, imm_iter, gimple_vdef (store))
2412     if (USE_STMT (use_p) != store
2413 	&& gimple_bb (USE_STMT (use_p)) == bb)
2414       return NULL;
2415 
2416   return store;
2417 }
2418 
2419 /* Conditional store replacement.  We already know
2420    that the recognized pattern looks like so:
2421 
2422    split:
2423      if (cond) goto THEN_BB; else goto ELSE_BB (edge E1)
2424    THEN_BB:
2425      ...
2426      X = Y;
2427      ...
2428      goto JOIN_BB;
2429    ELSE_BB:
2430      ...
2431      X = Z;
2432      ...
2433      fallthrough (edge E0)
2434    JOIN_BB:
2435      some more
2436 
2437    We check that it is safe to sink the store to JOIN_BB by verifying that
2438    there are no read-after-write or write-after-write dependencies in
2439    THEN_BB and ELSE_BB.  */
2440 
2441 static bool
cond_if_else_store_replacement(basic_block then_bb,basic_block else_bb,basic_block join_bb)2442 cond_if_else_store_replacement (basic_block then_bb, basic_block else_bb,
2443                                 basic_block join_bb)
2444 {
2445   vec<data_reference_p> then_datarefs, else_datarefs;
2446   vec<ddr_p> then_ddrs, else_ddrs;
2447   gimple *then_store, *else_store;
2448   bool found, ok = false, res;
2449   struct data_dependence_relation *ddr;
2450   data_reference_p then_dr, else_dr;
2451   int i, j;
2452   tree then_lhs, else_lhs;
2453   basic_block blocks[3];
2454 
2455   /* Handle the case with single store in THEN_BB and ELSE_BB.  That is
2456      cheap enough to always handle as it allows us to elide dependence
2457      checking.  */
2458   gphi *vphi = NULL;
2459   for (gphi_iterator si = gsi_start_phis (join_bb); !gsi_end_p (si);
2460        gsi_next (&si))
2461     if (virtual_operand_p (gimple_phi_result (si.phi ())))
2462       {
2463 	vphi = si.phi ();
2464 	break;
2465       }
2466   if (!vphi)
2467     return false;
2468   tree then_vdef = PHI_ARG_DEF_FROM_EDGE (vphi, single_succ_edge (then_bb));
2469   tree else_vdef = PHI_ARG_DEF_FROM_EDGE (vphi, single_succ_edge (else_bb));
2470   gimple *then_assign = single_trailing_store_in_bb (then_bb, then_vdef);
2471   if (then_assign)
2472     {
2473       gimple *else_assign = single_trailing_store_in_bb (else_bb, else_vdef);
2474       if (else_assign)
2475 	return cond_if_else_store_replacement_1 (then_bb, else_bb, join_bb,
2476 						 then_assign, else_assign);
2477     }
2478 
2479   /* If either vectorization or if-conversion is disabled then do
2480      not sink any stores.  */
2481   if (param_max_stores_to_sink == 0
2482       || (!flag_tree_loop_vectorize && !flag_tree_slp_vectorize)
2483       || !flag_tree_loop_if_convert)
2484     return false;
2485 
2486   /* Find data references.  */
2487   then_datarefs.create (1);
2488   else_datarefs.create (1);
2489   if ((find_data_references_in_bb (NULL, then_bb, &then_datarefs)
2490         == chrec_dont_know)
2491       || !then_datarefs.length ()
2492       || (find_data_references_in_bb (NULL, else_bb, &else_datarefs)
2493 	  == chrec_dont_know)
2494       || !else_datarefs.length ())
2495     {
2496       free_data_refs (then_datarefs);
2497       free_data_refs (else_datarefs);
2498       return false;
2499     }
2500 
2501   /* Find pairs of stores with equal LHS.  */
2502   auto_vec<gimple *, 1> then_stores, else_stores;
2503   FOR_EACH_VEC_ELT (then_datarefs, i, then_dr)
2504     {
2505       if (DR_IS_READ (then_dr))
2506         continue;
2507 
2508       then_store = DR_STMT (then_dr);
2509       then_lhs = gimple_get_lhs (then_store);
2510       if (then_lhs == NULL_TREE)
2511 	continue;
2512       found = false;
2513 
2514       FOR_EACH_VEC_ELT (else_datarefs, j, else_dr)
2515         {
2516           if (DR_IS_READ (else_dr))
2517             continue;
2518 
2519           else_store = DR_STMT (else_dr);
2520           else_lhs = gimple_get_lhs (else_store);
2521 	  if (else_lhs == NULL_TREE)
2522 	    continue;
2523 
2524           if (operand_equal_p (then_lhs, else_lhs, 0))
2525             {
2526               found = true;
2527               break;
2528             }
2529         }
2530 
2531       if (!found)
2532         continue;
2533 
2534       then_stores.safe_push (then_store);
2535       else_stores.safe_push (else_store);
2536     }
2537 
2538   /* No pairs of stores found.  */
2539   if (!then_stores.length ()
2540       || then_stores.length () > (unsigned) param_max_stores_to_sink)
2541     {
2542       free_data_refs (then_datarefs);
2543       free_data_refs (else_datarefs);
2544       return false;
2545     }
2546 
2547   /* Compute and check data dependencies in both basic blocks.  */
2548   then_ddrs.create (1);
2549   else_ddrs.create (1);
2550   if (!compute_all_dependences (then_datarefs, &then_ddrs,
2551 				vNULL, false)
2552       || !compute_all_dependences (else_datarefs, &else_ddrs,
2553 				   vNULL, false))
2554     {
2555       free_dependence_relations (then_ddrs);
2556       free_dependence_relations (else_ddrs);
2557       free_data_refs (then_datarefs);
2558       free_data_refs (else_datarefs);
2559       return false;
2560     }
2561   blocks[0] = then_bb;
2562   blocks[1] = else_bb;
2563   blocks[2] = join_bb;
2564   renumber_gimple_stmt_uids_in_blocks (blocks, 3);
2565 
2566   /* Check that there are no read-after-write or write-after-write dependencies
2567      in THEN_BB.  */
2568   FOR_EACH_VEC_ELT (then_ddrs, i, ddr)
2569     {
2570       struct data_reference *dra = DDR_A (ddr);
2571       struct data_reference *drb = DDR_B (ddr);
2572 
2573       if (DDR_ARE_DEPENDENT (ddr) != chrec_known
2574           && ((DR_IS_READ (dra) && DR_IS_WRITE (drb)
2575                && gimple_uid (DR_STMT (dra)) > gimple_uid (DR_STMT (drb)))
2576               || (DR_IS_READ (drb) && DR_IS_WRITE (dra)
2577                   && gimple_uid (DR_STMT (drb)) > gimple_uid (DR_STMT (dra)))
2578               || (DR_IS_WRITE (dra) && DR_IS_WRITE (drb))))
2579         {
2580           free_dependence_relations (then_ddrs);
2581           free_dependence_relations (else_ddrs);
2582 	  free_data_refs (then_datarefs);
2583 	  free_data_refs (else_datarefs);
2584           return false;
2585         }
2586     }
2587 
2588   /* Check that there are no read-after-write or write-after-write dependencies
2589      in ELSE_BB.  */
2590   FOR_EACH_VEC_ELT (else_ddrs, i, ddr)
2591     {
2592       struct data_reference *dra = DDR_A (ddr);
2593       struct data_reference *drb = DDR_B (ddr);
2594 
2595       if (DDR_ARE_DEPENDENT (ddr) != chrec_known
2596           && ((DR_IS_READ (dra) && DR_IS_WRITE (drb)
2597                && gimple_uid (DR_STMT (dra)) > gimple_uid (DR_STMT (drb)))
2598               || (DR_IS_READ (drb) && DR_IS_WRITE (dra)
2599                   && gimple_uid (DR_STMT (drb)) > gimple_uid (DR_STMT (dra)))
2600               || (DR_IS_WRITE (dra) && DR_IS_WRITE (drb))))
2601         {
2602           free_dependence_relations (then_ddrs);
2603           free_dependence_relations (else_ddrs);
2604 	  free_data_refs (then_datarefs);
2605 	  free_data_refs (else_datarefs);
2606           return false;
2607         }
2608     }
2609 
2610   /* Sink stores with same LHS.  */
2611   FOR_EACH_VEC_ELT (then_stores, i, then_store)
2612     {
2613       else_store = else_stores[i];
2614       res = cond_if_else_store_replacement_1 (then_bb, else_bb, join_bb,
2615                                               then_store, else_store);
2616       ok = ok || res;
2617     }
2618 
2619   free_dependence_relations (then_ddrs);
2620   free_dependence_relations (else_ddrs);
2621   free_data_refs (then_datarefs);
2622   free_data_refs (else_datarefs);
2623 
2624   return ok;
2625 }
2626 
2627 /* Return TRUE if STMT has a VUSE whose corresponding VDEF is in BB.  */
2628 
2629 static bool
local_mem_dependence(gimple * stmt,basic_block bb)2630 local_mem_dependence (gimple *stmt, basic_block bb)
2631 {
2632   tree vuse = gimple_vuse (stmt);
2633   gimple *def;
2634 
2635   if (!vuse)
2636     return false;
2637 
2638   def = SSA_NAME_DEF_STMT (vuse);
2639   return (def && gimple_bb (def) == bb);
2640 }
2641 
2642 /* Given a "diamond" control-flow pattern where BB0 tests a condition,
2643    BB1 and BB2 are "then" and "else" blocks dependent on this test,
2644    and BB3 rejoins control flow following BB1 and BB2, look for
2645    opportunities to hoist loads as follows.  If BB3 contains a PHI of
2646    two loads, one each occurring in BB1 and BB2, and the loads are
2647    provably of adjacent fields in the same structure, then move both
2648    loads into BB0.  Of course this can only be done if there are no
2649    dependencies preventing such motion.
2650 
2651    One of the hoisted loads will always be speculative, so the
2652    transformation is currently conservative:
2653 
2654     - The fields must be strictly adjacent.
2655     - The two fields must occupy a single memory block that is
2656       guaranteed to not cross a page boundary.
2657 
2658     The last is difficult to prove, as such memory blocks should be
2659     aligned on the minimum of the stack alignment boundary and the
2660     alignment guaranteed by heap allocation interfaces.  Thus we rely
2661     on a parameter for the alignment value.
2662 
2663     Provided a good value is used for the last case, the first
2664     restriction could possibly be relaxed.  */
2665 
2666 static void
hoist_adjacent_loads(basic_block bb0,basic_block bb1,basic_block bb2,basic_block bb3)2667 hoist_adjacent_loads (basic_block bb0, basic_block bb1,
2668 		      basic_block bb2, basic_block bb3)
2669 {
2670   int param_align = param_l1_cache_line_size;
2671   unsigned param_align_bits = (unsigned) (param_align * BITS_PER_UNIT);
2672   gphi_iterator gsi;
2673 
2674   /* Walk the phis in bb3 looking for an opportunity.  We are looking
2675      for phis of two SSA names, one each of which is defined in bb1 and
2676      bb2.  */
2677   for (gsi = gsi_start_phis (bb3); !gsi_end_p (gsi); gsi_next (&gsi))
2678     {
2679       gphi *phi_stmt = gsi.phi ();
2680       gimple *def1, *def2;
2681       tree arg1, arg2, ref1, ref2, field1, field2;
2682       tree tree_offset1, tree_offset2, tree_size2, next;
2683       int offset1, offset2, size2;
2684       unsigned align1;
2685       gimple_stmt_iterator gsi2;
2686       basic_block bb_for_def1, bb_for_def2;
2687 
2688       if (gimple_phi_num_args (phi_stmt) != 2
2689 	  || virtual_operand_p (gimple_phi_result (phi_stmt)))
2690 	continue;
2691 
2692       arg1 = gimple_phi_arg_def (phi_stmt, 0);
2693       arg2 = gimple_phi_arg_def (phi_stmt, 1);
2694 
2695       if (TREE_CODE (arg1) != SSA_NAME
2696 	  || TREE_CODE (arg2) != SSA_NAME
2697 	  || SSA_NAME_IS_DEFAULT_DEF (arg1)
2698 	  || SSA_NAME_IS_DEFAULT_DEF (arg2))
2699 	continue;
2700 
2701       def1 = SSA_NAME_DEF_STMT (arg1);
2702       def2 = SSA_NAME_DEF_STMT (arg2);
2703 
2704       if ((gimple_bb (def1) != bb1 || gimple_bb (def2) != bb2)
2705 	  && (gimple_bb (def2) != bb1 || gimple_bb (def1) != bb2))
2706 	continue;
2707 
2708       /* Check the mode of the arguments to be sure a conditional move
2709 	 can be generated for it.  */
2710       if (optab_handler (movcc_optab, TYPE_MODE (TREE_TYPE (arg1)))
2711 	  == CODE_FOR_nothing)
2712 	continue;
2713 
2714       /* Both statements must be assignments whose RHS is a COMPONENT_REF.  */
2715       if (!gimple_assign_single_p (def1)
2716 	  || !gimple_assign_single_p (def2)
2717 	  || gimple_has_volatile_ops (def1)
2718 	  || gimple_has_volatile_ops (def2))
2719 	continue;
2720 
2721       ref1 = gimple_assign_rhs1 (def1);
2722       ref2 = gimple_assign_rhs1 (def2);
2723 
2724       if (TREE_CODE (ref1) != COMPONENT_REF
2725 	  || TREE_CODE (ref2) != COMPONENT_REF)
2726 	continue;
2727 
2728       /* The zeroth operand of the two component references must be
2729 	 identical.  It is not sufficient to compare get_base_address of
2730 	 the two references, because this could allow for different
2731 	 elements of the same array in the two trees.  It is not safe to
2732 	 assume that the existence of one array element implies the
2733 	 existence of a different one.  */
2734       if (!operand_equal_p (TREE_OPERAND (ref1, 0), TREE_OPERAND (ref2, 0), 0))
2735 	continue;
2736 
2737       field1 = TREE_OPERAND (ref1, 1);
2738       field2 = TREE_OPERAND (ref2, 1);
2739 
2740       /* Check for field adjacency, and ensure field1 comes first.  */
2741       for (next = DECL_CHAIN (field1);
2742 	   next && TREE_CODE (next) != FIELD_DECL;
2743 	   next = DECL_CHAIN (next))
2744 	;
2745 
2746       if (next != field2)
2747 	{
2748 	  for (next = DECL_CHAIN (field2);
2749 	       next && TREE_CODE (next) != FIELD_DECL;
2750 	       next = DECL_CHAIN (next))
2751 	    ;
2752 
2753 	  if (next != field1)
2754 	    continue;
2755 
2756 	  std::swap (field1, field2);
2757 	  std::swap (def1, def2);
2758 	}
2759 
2760       bb_for_def1 = gimple_bb (def1);
2761       bb_for_def2 = gimple_bb (def2);
2762 
2763       /* Check for proper alignment of the first field.  */
2764       tree_offset1 = bit_position (field1);
2765       tree_offset2 = bit_position (field2);
2766       tree_size2 = DECL_SIZE (field2);
2767 
2768       if (!tree_fits_uhwi_p (tree_offset1)
2769 	  || !tree_fits_uhwi_p (tree_offset2)
2770 	  || !tree_fits_uhwi_p (tree_size2))
2771 	continue;
2772 
2773       offset1 = tree_to_uhwi (tree_offset1);
2774       offset2 = tree_to_uhwi (tree_offset2);
2775       size2 = tree_to_uhwi (tree_size2);
2776       align1 = DECL_ALIGN (field1) % param_align_bits;
2777 
2778       if (offset1 % BITS_PER_UNIT != 0)
2779 	continue;
2780 
2781       /* For profitability, the two field references should fit within
2782 	 a single cache line.  */
2783       if (align1 + offset2 - offset1 + size2 > param_align_bits)
2784 	continue;
2785 
2786       /* The two expressions cannot be dependent upon vdefs defined
2787 	 in bb1/bb2.  */
2788       if (local_mem_dependence (def1, bb_for_def1)
2789 	  || local_mem_dependence (def2, bb_for_def2))
2790 	continue;
2791 
2792       /* The conditions are satisfied; hoist the loads from bb1 and bb2 into
2793 	 bb0.  We hoist the first one first so that a cache miss is handled
2794          efficiently regardless of hardware cache-fill policy.  */
2795       gsi2 = gsi_for_stmt (def1);
2796       gsi_move_to_bb_end (&gsi2, bb0);
2797       gsi2 = gsi_for_stmt (def2);
2798       gsi_move_to_bb_end (&gsi2, bb0);
2799 
2800       if (dump_file && (dump_flags & TDF_DETAILS))
2801 	{
2802 	  fprintf (dump_file,
2803 		   "\nHoisting adjacent loads from %d and %d into %d: \n",
2804 		   bb_for_def1->index, bb_for_def2->index, bb0->index);
2805 	  print_gimple_stmt (dump_file, def1, 0, TDF_VOPS|TDF_MEMSYMS);
2806 	  print_gimple_stmt (dump_file, def2, 0, TDF_VOPS|TDF_MEMSYMS);
2807 	}
2808     }
2809 }
2810 
2811 /* Determine whether we should attempt to hoist adjacent loads out of
2812    diamond patterns in pass_phiopt.  Always hoist loads if
2813    -fhoist-adjacent-loads is specified and the target machine has
2814    both a conditional move instruction and a defined cache line size.  */
2815 
2816 static bool
gate_hoist_loads(void)2817 gate_hoist_loads (void)
2818 {
2819   return (flag_hoist_adjacent_loads == 1
2820 	  && param_l1_cache_line_size
2821 	  && HAVE_conditional_move);
2822 }
2823 
2824 /* This pass tries to replaces an if-then-else block with an
2825    assignment.  We have four kinds of transformations.  Some of these
2826    transformations are also performed by the ifcvt RTL optimizer.
2827 
2828    Conditional Replacement
2829    -----------------------
2830 
2831    This transformation, implemented in conditional_replacement,
2832    replaces
2833 
2834      bb0:
2835       if (cond) goto bb2; else goto bb1;
2836      bb1:
2837      bb2:
2838       x = PHI <0 (bb1), 1 (bb0), ...>;
2839 
2840    with
2841 
2842      bb0:
2843       x' = cond;
2844       goto bb2;
2845      bb2:
2846       x = PHI <x' (bb0), ...>;
2847 
2848    We remove bb1 as it becomes unreachable.  This occurs often due to
2849    gimplification of conditionals.
2850 
2851    Value Replacement
2852    -----------------
2853 
2854    This transformation, implemented in value_replacement, replaces
2855 
2856      bb0:
2857        if (a != b) goto bb2; else goto bb1;
2858      bb1:
2859      bb2:
2860        x = PHI <a (bb1), b (bb0), ...>;
2861 
2862    with
2863 
2864      bb0:
2865      bb2:
2866        x = PHI <b (bb0), ...>;
2867 
2868    This opportunity can sometimes occur as a result of other
2869    optimizations.
2870 
2871 
2872    Another case caught by value replacement looks like this:
2873 
2874      bb0:
2875        t1 = a == CONST;
2876        t2 = b > c;
2877        t3 = t1 & t2;
2878        if (t3 != 0) goto bb1; else goto bb2;
2879      bb1:
2880      bb2:
2881        x = PHI (CONST, a)
2882 
2883    Gets replaced with:
2884      bb0:
2885      bb2:
2886        t1 = a == CONST;
2887        t2 = b > c;
2888        t3 = t1 & t2;
2889        x = a;
2890 
2891    ABS Replacement
2892    ---------------
2893 
2894    This transformation, implemented in abs_replacement, replaces
2895 
2896      bb0:
2897        if (a >= 0) goto bb2; else goto bb1;
2898      bb1:
2899        x = -a;
2900      bb2:
2901        x = PHI <x (bb1), a (bb0), ...>;
2902 
2903    with
2904 
2905      bb0:
2906        x' = ABS_EXPR< a >;
2907      bb2:
2908        x = PHI <x' (bb0), ...>;
2909 
2910    MIN/MAX Replacement
2911    -------------------
2912 
2913    This transformation, minmax_replacement replaces
2914 
2915      bb0:
2916        if (a <= b) goto bb2; else goto bb1;
2917      bb1:
2918      bb2:
2919        x = PHI <b (bb1), a (bb0), ...>;
2920 
2921    with
2922 
2923      bb0:
2924        x' = MIN_EXPR (a, b)
2925      bb2:
2926        x = PHI <x' (bb0), ...>;
2927 
2928    A similar transformation is done for MAX_EXPR.
2929 
2930 
2931    This pass also performs a fifth transformation of a slightly different
2932    flavor.
2933 
2934    Factor conversion in COND_EXPR
2935    ------------------------------
2936 
2937    This transformation factors the conversion out of COND_EXPR with
2938    factor_out_conditional_conversion.
2939 
2940    For example:
2941    if (a <= CST) goto <bb 3>; else goto <bb 4>;
2942    <bb 3>:
2943    tmp = (int) a;
2944    <bb 4>:
2945    tmp = PHI <tmp, CST>
2946 
2947    Into:
2948    if (a <= CST) goto <bb 3>; else goto <bb 4>;
2949    <bb 3>:
2950    <bb 4>:
2951    a = PHI <a, CST>
2952    tmp = (int) a;
2953 
2954    Adjacent Load Hoisting
2955    ----------------------
2956 
2957    This transformation replaces
2958 
2959      bb0:
2960        if (...) goto bb2; else goto bb1;
2961      bb1:
2962        x1 = (<expr>).field1;
2963        goto bb3;
2964      bb2:
2965        x2 = (<expr>).field2;
2966      bb3:
2967        # x = PHI <x1, x2>;
2968 
2969    with
2970 
2971      bb0:
2972        x1 = (<expr>).field1;
2973        x2 = (<expr>).field2;
2974        if (...) goto bb2; else goto bb1;
2975      bb1:
2976        goto bb3;
2977      bb2:
2978      bb3:
2979        # x = PHI <x1, x2>;
2980 
2981    The purpose of this transformation is to enable generation of conditional
2982    move instructions such as Intel CMOVE or PowerPC ISEL.  Because one of
2983    the loads is speculative, the transformation is restricted to very
2984    specific cases to avoid introducing a page fault.  We are looking for
2985    the common idiom:
2986 
2987      if (...)
2988        x = y->left;
2989      else
2990        x = y->right;
2991 
2992    where left and right are typically adjacent pointers in a tree structure.  */
2993 
2994 namespace {
2995 
2996 const pass_data pass_data_phiopt =
2997 {
2998   GIMPLE_PASS, /* type */
2999   "phiopt", /* name */
3000   OPTGROUP_NONE, /* optinfo_flags */
3001   TV_TREE_PHIOPT, /* tv_id */
3002   ( PROP_cfg | PROP_ssa ), /* properties_required */
3003   0, /* properties_provided */
3004   0, /* properties_destroyed */
3005   0, /* todo_flags_start */
3006   0, /* todo_flags_finish */
3007 };
3008 
3009 class pass_phiopt : public gimple_opt_pass
3010 {
3011 public:
pass_phiopt(gcc::context * ctxt)3012   pass_phiopt (gcc::context *ctxt)
3013     : gimple_opt_pass (pass_data_phiopt, ctxt), early_p (false)
3014   {}
3015 
3016   /* opt_pass methods: */
clone()3017   opt_pass * clone () { return new pass_phiopt (m_ctxt); }
set_pass_param(unsigned n,bool param)3018   void set_pass_param (unsigned n, bool param)
3019     {
3020       gcc_assert (n == 0);
3021       early_p = param;
3022     }
gate(function *)3023   virtual bool gate (function *) { return flag_ssa_phiopt; }
execute(function *)3024   virtual unsigned int execute (function *)
3025     {
3026       return tree_ssa_phiopt_worker (false,
3027 				     !early_p ? gate_hoist_loads () : false,
3028 				     early_p);
3029     }
3030 
3031 private:
3032   bool early_p;
3033 }; // class pass_phiopt
3034 
3035 } // anon namespace
3036 
3037 gimple_opt_pass *
make_pass_phiopt(gcc::context * ctxt)3038 make_pass_phiopt (gcc::context *ctxt)
3039 {
3040   return new pass_phiopt (ctxt);
3041 }
3042 
3043 namespace {
3044 
3045 const pass_data pass_data_cselim =
3046 {
3047   GIMPLE_PASS, /* type */
3048   "cselim", /* name */
3049   OPTGROUP_NONE, /* optinfo_flags */
3050   TV_TREE_PHIOPT, /* tv_id */
3051   ( PROP_cfg | PROP_ssa ), /* properties_required */
3052   0, /* properties_provided */
3053   0, /* properties_destroyed */
3054   0, /* todo_flags_start */
3055   0, /* todo_flags_finish */
3056 };
3057 
3058 class pass_cselim : public gimple_opt_pass
3059 {
3060 public:
pass_cselim(gcc::context * ctxt)3061   pass_cselim (gcc::context *ctxt)
3062     : gimple_opt_pass (pass_data_cselim, ctxt)
3063   {}
3064 
3065   /* opt_pass methods: */
gate(function *)3066   virtual bool gate (function *) { return flag_tree_cselim; }
execute(function *)3067   virtual unsigned int execute (function *) { return tree_ssa_cs_elim (); }
3068 
3069 }; // class pass_cselim
3070 
3071 } // anon namespace
3072 
3073 gimple_opt_pass *
make_pass_cselim(gcc::context * ctxt)3074 make_pass_cselim (gcc::context *ctxt)
3075 {
3076   return new pass_cselim (ctxt);
3077 }
3078