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