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