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