xref: /netbsd-src/external/gpl3/gcc.old/dist/gcc/tree-ssa-loop-im.c (revision c9496f6b604074a9451a67df576a5b423068e71e)
1 /* Loop invariant motion.
2    Copyright (C) 2003-2015 Free Software Foundation, Inc.
3 
4 This file is part of GCC.
5 
6 GCC is free software; you can redistribute it and/or modify it
7 under the terms of the GNU General Public License as published by the
8 Free Software Foundation; either version 3, or (at your option) any
9 later version.
10 
11 GCC is distributed in the hope that it will be useful, but WITHOUT
12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 for more details.
15 
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3.  If not see
18 <http://www.gnu.org/licenses/>.  */
19 
20 #include "config.h"
21 #include "system.h"
22 #include "coretypes.h"
23 #include "tm.h"
24 #include "hash-set.h"
25 #include "machmode.h"
26 #include "vec.h"
27 #include "double-int.h"
28 #include "input.h"
29 #include "alias.h"
30 #include "symtab.h"
31 #include "wide-int.h"
32 #include "inchash.h"
33 #include "tree.h"
34 #include "fold-const.h"
35 #include "tm_p.h"
36 #include "predict.h"
37 #include "hard-reg-set.h"
38 #include "input.h"
39 #include "function.h"
40 #include "dominance.h"
41 #include "cfg.h"
42 #include "cfganal.h"
43 #include "basic-block.h"
44 #include "gimple-pretty-print.h"
45 #include "hash-map.h"
46 #include "hash-table.h"
47 #include "tree-ssa-alias.h"
48 #include "internal-fn.h"
49 #include "tree-eh.h"
50 #include "gimple-expr.h"
51 #include "is-a.h"
52 #include "gimple.h"
53 #include "gimplify.h"
54 #include "gimple-iterator.h"
55 #include "gimple-ssa.h"
56 #include "tree-cfg.h"
57 #include "tree-phinodes.h"
58 #include "ssa-iterators.h"
59 #include "stringpool.h"
60 #include "tree-ssanames.h"
61 #include "tree-ssa-loop-manip.h"
62 #include "tree-ssa-loop.h"
63 #include "tree-into-ssa.h"
64 #include "cfgloop.h"
65 #include "domwalk.h"
66 #include "params.h"
67 #include "tree-pass.h"
68 #include "flags.h"
69 #include "tree-affine.h"
70 #include "tree-ssa-propagate.h"
71 #include "trans-mem.h"
72 #include "gimple-fold.h"
73 #include "tree-ssa-loop-niter.h"
74 
75 /* TODO:  Support for predicated code motion.  I.e.
76 
77    while (1)
78      {
79        if (cond)
80 	 {
81 	   a = inv;
82 	   something;
83 	 }
84      }
85 
86    Where COND and INV are invariants, but evaluating INV may trap or be
87    invalid from some other reason if !COND.  This may be transformed to
88 
89    if (cond)
90      a = inv;
91    while (1)
92      {
93        if (cond)
94 	 something;
95      }  */
96 
97 /* The auxiliary data kept for each statement.  */
98 
99 struct lim_aux_data
100 {
101   struct loop *max_loop;	/* The outermost loop in that the statement
102 				   is invariant.  */
103 
104   struct loop *tgt_loop;	/* The loop out of that we want to move the
105 				   invariant.  */
106 
107   struct loop *always_executed_in;
108 				/* The outermost loop for that we are sure
109 				   the statement is executed if the loop
110 				   is entered.  */
111 
112   unsigned cost;		/* Cost of the computation performed by the
113 				   statement.  */
114 
115   vec<gimple> depends;		/* Vector of statements that must be also
116 				   hoisted out of the loop when this statement
117 				   is hoisted; i.e. those that define the
118 				   operands of the statement and are inside of
119 				   the MAX_LOOP loop.  */
120 };
121 
122 /* Maps statements to their lim_aux_data.  */
123 
124 static hash_map<gimple, lim_aux_data *> *lim_aux_data_map;
125 
126 /* Description of a memory reference location.  */
127 
128 typedef struct mem_ref_loc
129 {
130   tree *ref;			/* The reference itself.  */
131   gimple stmt;			/* The statement in that it occurs.  */
132 } *mem_ref_loc_p;
133 
134 
135 /* Description of a memory reference.  */
136 
137 typedef struct im_mem_ref
138 {
139   unsigned id;			/* ID assigned to the memory reference
140 				   (its index in memory_accesses.refs_list)  */
141   hashval_t hash;		/* Its hash value.  */
142 
143   /* The memory access itself and associated caching of alias-oracle
144      query meta-data.  */
145   ao_ref mem;
146 
147   bitmap stored;		/* The set of loops in that this memory location
148 				   is stored to.  */
149   vec<mem_ref_loc>		accesses_in_loop;
150 				/* The locations of the accesses.  Vector
151 				   indexed by the loop number.  */
152 
153   /* The following sets are computed on demand.  We keep both set and
154      its complement, so that we know whether the information was
155      already computed or not.  */
156   bitmap_head indep_loop;	/* The set of loops in that the memory
157 				   reference is independent, meaning:
158 				   If it is stored in the loop, this store
159 				     is independent on all other loads and
160 				     stores.
161 				   If it is only loaded, then it is independent
162 				     on all stores in the loop.  */
163   bitmap_head dep_loop;		/* The complement of INDEP_LOOP.  */
164 } *mem_ref_p;
165 
166 /* We use two bits per loop in the ref->{in,}dep_loop bitmaps, the first
167    to record (in)dependence against stores in the loop and its subloops, the
168    second to record (in)dependence against all references in the loop
169    and its subloops.  */
170 #define LOOP_DEP_BIT(loopnum, storedp) (2 * (loopnum) + (storedp ? 1 : 0))
171 
172 /* Mem_ref hashtable helpers.  */
173 
174 struct mem_ref_hasher : typed_noop_remove <im_mem_ref>
175 {
176   typedef im_mem_ref value_type;
177   typedef tree_node compare_type;
178   static inline hashval_t hash (const value_type *);
179   static inline bool equal (const value_type *, const compare_type *);
180 };
181 
182 /* A hash function for struct im_mem_ref object OBJ.  */
183 
184 inline hashval_t
185 mem_ref_hasher::hash (const value_type *mem)
186 {
187   return mem->hash;
188 }
189 
190 /* An equality function for struct im_mem_ref object MEM1 with
191    memory reference OBJ2.  */
192 
193 inline bool
194 mem_ref_hasher::equal (const value_type *mem1, const compare_type *obj2)
195 {
196   return operand_equal_p (mem1->mem.ref, (const_tree) obj2, 0);
197 }
198 
199 
200 /* Description of memory accesses in loops.  */
201 
202 static struct
203 {
204   /* The hash table of memory references accessed in loops.  */
205   hash_table<mem_ref_hasher> *refs;
206 
207   /* The list of memory references.  */
208   vec<mem_ref_p> refs_list;
209 
210   /* The set of memory references accessed in each loop.  */
211   vec<bitmap_head> refs_in_loop;
212 
213   /* The set of memory references stored in each loop.  */
214   vec<bitmap_head> refs_stored_in_loop;
215 
216   /* The set of memory references stored in each loop, including subloops .  */
217   vec<bitmap_head> all_refs_stored_in_loop;
218 
219   /* Cache for expanding memory addresses.  */
220   hash_map<tree, name_expansion *> *ttae_cache;
221 } memory_accesses;
222 
223 /* Obstack for the bitmaps in the above data structures.  */
224 static bitmap_obstack lim_bitmap_obstack;
225 static obstack mem_ref_obstack;
226 
227 static bool ref_indep_loop_p (struct loop *, mem_ref_p);
228 
229 /* Minimum cost of an expensive expression.  */
230 #define LIM_EXPENSIVE ((unsigned) PARAM_VALUE (PARAM_LIM_EXPENSIVE))
231 
232 /* The outermost loop for which execution of the header guarantees that the
233    block will be executed.  */
234 #define ALWAYS_EXECUTED_IN(BB) ((struct loop *) (BB)->aux)
235 #define SET_ALWAYS_EXECUTED_IN(BB, VAL) ((BB)->aux = (void *) (VAL))
236 
237 /* ID of the shared unanalyzable mem.  */
238 #define UNANALYZABLE_MEM_ID 0
239 
240 /* Whether the reference was analyzable.  */
241 #define MEM_ANALYZABLE(REF) ((REF)->id != UNANALYZABLE_MEM_ID)
242 
243 static struct lim_aux_data *
244 init_lim_data (gimple stmt)
245 {
246   lim_aux_data *p = XCNEW (struct lim_aux_data);
247   lim_aux_data_map->put (stmt, p);
248 
249   return p;
250 }
251 
252 static struct lim_aux_data *
253 get_lim_data (gimple stmt)
254 {
255   lim_aux_data **p = lim_aux_data_map->get (stmt);
256   if (!p)
257     return NULL;
258 
259   return *p;
260 }
261 
262 /* Releases the memory occupied by DATA.  */
263 
264 static void
265 free_lim_aux_data (struct lim_aux_data *data)
266 {
267   data->depends.release ();
268   free (data);
269 }
270 
271 static void
272 clear_lim_data (gimple stmt)
273 {
274   lim_aux_data **p = lim_aux_data_map->get (stmt);
275   if (!p)
276     return;
277 
278   free_lim_aux_data (*p);
279   *p = NULL;
280 }
281 
282 
283 /* The possibilities of statement movement.  */
284 enum move_pos
285   {
286     MOVE_IMPOSSIBLE,		/* No movement -- side effect expression.  */
287     MOVE_PRESERVE_EXECUTION,	/* Must not cause the non-executed statement
288 				   become executed -- memory accesses, ... */
289     MOVE_POSSIBLE		/* Unlimited movement.  */
290   };
291 
292 
293 /* If it is possible to hoist the statement STMT unconditionally,
294    returns MOVE_POSSIBLE.
295    If it is possible to hoist the statement STMT, but we must avoid making
296    it executed if it would not be executed in the original program (e.g.
297    because it may trap), return MOVE_PRESERVE_EXECUTION.
298    Otherwise return MOVE_IMPOSSIBLE.  */
299 
300 enum move_pos
301 movement_possibility (gimple stmt)
302 {
303   tree lhs;
304   enum move_pos ret = MOVE_POSSIBLE;
305 
306   if (flag_unswitch_loops
307       && gimple_code (stmt) == GIMPLE_COND)
308     {
309       /* If we perform unswitching, force the operands of the invariant
310 	 condition to be moved out of the loop.  */
311       return MOVE_POSSIBLE;
312     }
313 
314   if (gimple_code (stmt) == GIMPLE_PHI
315       && gimple_phi_num_args (stmt) <= 2
316       && !virtual_operand_p (gimple_phi_result (stmt))
317       && !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (gimple_phi_result (stmt)))
318     return MOVE_POSSIBLE;
319 
320   if (gimple_get_lhs (stmt) == NULL_TREE)
321     return MOVE_IMPOSSIBLE;
322 
323   if (gimple_vdef (stmt))
324     return MOVE_IMPOSSIBLE;
325 
326   if (stmt_ends_bb_p (stmt)
327       || gimple_has_volatile_ops (stmt)
328       || gimple_has_side_effects (stmt)
329       || stmt_could_throw_p (stmt))
330     return MOVE_IMPOSSIBLE;
331 
332   if (is_gimple_call (stmt))
333     {
334       /* While pure or const call is guaranteed to have no side effects, we
335 	 cannot move it arbitrarily.  Consider code like
336 
337 	 char *s = something ();
338 
339 	 while (1)
340 	   {
341 	     if (s)
342 	       t = strlen (s);
343 	     else
344 	       t = 0;
345 	   }
346 
347 	 Here the strlen call cannot be moved out of the loop, even though
348 	 s is invariant.  In addition to possibly creating a call with
349 	 invalid arguments, moving out a function call that is not executed
350 	 may cause performance regressions in case the call is costly and
351 	 not executed at all.  */
352       ret = MOVE_PRESERVE_EXECUTION;
353       lhs = gimple_call_lhs (stmt);
354     }
355   else if (is_gimple_assign (stmt))
356     lhs = gimple_assign_lhs (stmt);
357   else
358     return MOVE_IMPOSSIBLE;
359 
360   if (TREE_CODE (lhs) == SSA_NAME
361       && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (lhs))
362     return MOVE_IMPOSSIBLE;
363 
364   if (TREE_CODE (lhs) != SSA_NAME
365       || gimple_could_trap_p (stmt))
366     return MOVE_PRESERVE_EXECUTION;
367 
368   /* Non local loads in a transaction cannot be hoisted out.  Well,
369      unless the load happens on every path out of the loop, but we
370      don't take this into account yet.  */
371   if (flag_tm
372       && gimple_in_transaction (stmt)
373       && gimple_assign_single_p (stmt))
374     {
375       tree rhs = gimple_assign_rhs1 (stmt);
376       if (DECL_P (rhs) && is_global_var (rhs))
377 	{
378 	  if (dump_file)
379 	    {
380 	      fprintf (dump_file, "Cannot hoist conditional load of ");
381 	      print_generic_expr (dump_file, rhs, TDF_SLIM);
382 	      fprintf (dump_file, " because it is in a transaction.\n");
383 	    }
384 	  return MOVE_IMPOSSIBLE;
385 	}
386     }
387 
388   return ret;
389 }
390 
391 /* Suppose that operand DEF is used inside the LOOP.  Returns the outermost
392    loop to that we could move the expression using DEF if it did not have
393    other operands, i.e. the outermost loop enclosing LOOP in that the value
394    of DEF is invariant.  */
395 
396 static struct loop *
397 outermost_invariant_loop (tree def, struct loop *loop)
398 {
399   gimple def_stmt;
400   basic_block def_bb;
401   struct loop *max_loop;
402   struct lim_aux_data *lim_data;
403 
404   if (!def)
405     return superloop_at_depth (loop, 1);
406 
407   if (TREE_CODE (def) != SSA_NAME)
408     {
409       gcc_assert (is_gimple_min_invariant (def));
410       return superloop_at_depth (loop, 1);
411     }
412 
413   def_stmt = SSA_NAME_DEF_STMT (def);
414   def_bb = gimple_bb (def_stmt);
415   if (!def_bb)
416     return superloop_at_depth (loop, 1);
417 
418   max_loop = find_common_loop (loop, def_bb->loop_father);
419 
420   lim_data = get_lim_data (def_stmt);
421   if (lim_data != NULL && lim_data->max_loop != NULL)
422     max_loop = find_common_loop (max_loop,
423 				 loop_outer (lim_data->max_loop));
424   if (max_loop == loop)
425     return NULL;
426   max_loop = superloop_at_depth (loop, loop_depth (max_loop) + 1);
427 
428   return max_loop;
429 }
430 
431 /* DATA is a structure containing information associated with a statement
432    inside LOOP.  DEF is one of the operands of this statement.
433 
434    Find the outermost loop enclosing LOOP in that value of DEF is invariant
435    and record this in DATA->max_loop field.  If DEF itself is defined inside
436    this loop as well (i.e. we need to hoist it out of the loop if we want
437    to hoist the statement represented by DATA), record the statement in that
438    DEF is defined to the DATA->depends list.  Additionally if ADD_COST is true,
439    add the cost of the computation of DEF to the DATA->cost.
440 
441    If DEF is not invariant in LOOP, return false.  Otherwise return TRUE.  */
442 
443 static bool
444 add_dependency (tree def, struct lim_aux_data *data, struct loop *loop,
445 		bool add_cost)
446 {
447   gimple def_stmt = SSA_NAME_DEF_STMT (def);
448   basic_block def_bb = gimple_bb (def_stmt);
449   struct loop *max_loop;
450   struct lim_aux_data *def_data;
451 
452   if (!def_bb)
453     return true;
454 
455   max_loop = outermost_invariant_loop (def, loop);
456   if (!max_loop)
457     return false;
458 
459   if (flow_loop_nested_p (data->max_loop, max_loop))
460     data->max_loop = max_loop;
461 
462   def_data = get_lim_data (def_stmt);
463   if (!def_data)
464     return true;
465 
466   if (add_cost
467       /* Only add the cost if the statement defining DEF is inside LOOP,
468 	 i.e. if it is likely that by moving the invariants dependent
469 	 on it, we will be able to avoid creating a new register for
470 	 it (since it will be only used in these dependent invariants).  */
471       && def_bb->loop_father == loop)
472     data->cost += def_data->cost;
473 
474   data->depends.safe_push (def_stmt);
475 
476   return true;
477 }
478 
479 /* Returns an estimate for a cost of statement STMT.  The values here
480    are just ad-hoc constants, similar to costs for inlining.  */
481 
482 static unsigned
483 stmt_cost (gimple stmt)
484 {
485   /* Always try to create possibilities for unswitching.  */
486   if (gimple_code (stmt) == GIMPLE_COND
487       || gimple_code (stmt) == GIMPLE_PHI)
488     return LIM_EXPENSIVE;
489 
490   /* We should be hoisting calls if possible.  */
491   if (is_gimple_call (stmt))
492     {
493       tree fndecl;
494 
495       /* Unless the call is a builtin_constant_p; this always folds to a
496 	 constant, so moving it is useless.  */
497       fndecl = gimple_call_fndecl (stmt);
498       if (fndecl
499 	  && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL
500 	  && DECL_FUNCTION_CODE (fndecl) == BUILT_IN_CONSTANT_P)
501 	return 0;
502 
503       return LIM_EXPENSIVE;
504     }
505 
506   /* Hoisting memory references out should almost surely be a win.  */
507   if (gimple_references_memory_p (stmt))
508     return LIM_EXPENSIVE;
509 
510   if (gimple_code (stmt) != GIMPLE_ASSIGN)
511     return 1;
512 
513   switch (gimple_assign_rhs_code (stmt))
514     {
515     case MULT_EXPR:
516     case WIDEN_MULT_EXPR:
517     case WIDEN_MULT_PLUS_EXPR:
518     case WIDEN_MULT_MINUS_EXPR:
519     case DOT_PROD_EXPR:
520     case FMA_EXPR:
521     case TRUNC_DIV_EXPR:
522     case CEIL_DIV_EXPR:
523     case FLOOR_DIV_EXPR:
524     case ROUND_DIV_EXPR:
525     case EXACT_DIV_EXPR:
526     case CEIL_MOD_EXPR:
527     case FLOOR_MOD_EXPR:
528     case ROUND_MOD_EXPR:
529     case TRUNC_MOD_EXPR:
530     case RDIV_EXPR:
531       /* Division and multiplication are usually expensive.  */
532       return LIM_EXPENSIVE;
533 
534     case LSHIFT_EXPR:
535     case RSHIFT_EXPR:
536     case WIDEN_LSHIFT_EXPR:
537     case LROTATE_EXPR:
538     case RROTATE_EXPR:
539       /* Shifts and rotates are usually expensive.  */
540       return LIM_EXPENSIVE;
541 
542     case CONSTRUCTOR:
543       /* Make vector construction cost proportional to the number
544          of elements.  */
545       return CONSTRUCTOR_NELTS (gimple_assign_rhs1 (stmt));
546 
547     case SSA_NAME:
548     case PAREN_EXPR:
549       /* Whether or not something is wrapped inside a PAREN_EXPR
550          should not change move cost.  Nor should an intermediate
551 	 unpropagated SSA name copy.  */
552       return 0;
553 
554     default:
555       return 1;
556     }
557 }
558 
559 /* Finds the outermost loop between OUTER and LOOP in that the memory reference
560    REF is independent.  If REF is not independent in LOOP, NULL is returned
561    instead.  */
562 
563 static struct loop *
564 outermost_indep_loop (struct loop *outer, struct loop *loop, mem_ref_p ref)
565 {
566   struct loop *aloop;
567 
568   if (ref->stored && bitmap_bit_p (ref->stored, loop->num))
569     return NULL;
570 
571   for (aloop = outer;
572        aloop != loop;
573        aloop = superloop_at_depth (loop, loop_depth (aloop) + 1))
574     if ((!ref->stored || !bitmap_bit_p (ref->stored, aloop->num))
575 	&& ref_indep_loop_p (aloop, ref))
576       return aloop;
577 
578   if (ref_indep_loop_p (loop, ref))
579     return loop;
580   else
581     return NULL;
582 }
583 
584 /* If there is a simple load or store to a memory reference in STMT, returns
585    the location of the memory reference, and sets IS_STORE according to whether
586    it is a store or load.  Otherwise, returns NULL.  */
587 
588 static tree *
589 simple_mem_ref_in_stmt (gimple stmt, bool *is_store)
590 {
591   tree *lhs, *rhs;
592 
593   /* Recognize SSA_NAME = MEM and MEM = (SSA_NAME | invariant) patterns.  */
594   if (!gimple_assign_single_p (stmt))
595     return NULL;
596 
597   lhs = gimple_assign_lhs_ptr (stmt);
598   rhs = gimple_assign_rhs1_ptr (stmt);
599 
600   if (TREE_CODE (*lhs) == SSA_NAME && gimple_vuse (stmt))
601     {
602       *is_store = false;
603       return rhs;
604     }
605   else if (gimple_vdef (stmt)
606 	   && (TREE_CODE (*rhs) == SSA_NAME || is_gimple_min_invariant (*rhs)))
607     {
608       *is_store = true;
609       return lhs;
610     }
611   else
612     return NULL;
613 }
614 
615 /* Returns the memory reference contained in STMT.  */
616 
617 static mem_ref_p
618 mem_ref_in_stmt (gimple stmt)
619 {
620   bool store;
621   tree *mem = simple_mem_ref_in_stmt (stmt, &store);
622   hashval_t hash;
623   mem_ref_p ref;
624 
625   if (!mem)
626     return NULL;
627   gcc_assert (!store);
628 
629   hash = iterative_hash_expr (*mem, 0);
630   ref = memory_accesses.refs->find_with_hash (*mem, hash);
631 
632   gcc_assert (ref != NULL);
633   return ref;
634 }
635 
636 /* From a controlling predicate in DOM determine the arguments from
637    the PHI node PHI that are chosen if the predicate evaluates to
638    true and false and store them to *TRUE_ARG_P and *FALSE_ARG_P if
639    they are non-NULL.  Returns true if the arguments can be determined,
640    else return false.  */
641 
642 static bool
643 extract_true_false_args_from_phi (basic_block dom, gphi *phi,
644 				  tree *true_arg_p, tree *false_arg_p)
645 {
646   basic_block bb = gimple_bb (phi);
647   edge true_edge, false_edge, tem;
648   tree arg0 = NULL_TREE, arg1 = NULL_TREE;
649 
650   /* We have to verify that one edge into the PHI node is dominated
651      by the true edge of the predicate block and the other edge
652      dominated by the false edge.  This ensures that the PHI argument
653      we are going to take is completely determined by the path we
654      take from the predicate block.
655      We can only use BB dominance checks below if the destination of
656      the true/false edges are dominated by their edge, thus only
657      have a single predecessor.  */
658   extract_true_false_edges_from_block (dom, &true_edge, &false_edge);
659   tem = EDGE_PRED (bb, 0);
660   if (tem == true_edge
661       || (single_pred_p (true_edge->dest)
662 	  && (tem->src == true_edge->dest
663 	      || dominated_by_p (CDI_DOMINATORS,
664 				 tem->src, true_edge->dest))))
665     arg0 = PHI_ARG_DEF (phi, tem->dest_idx);
666   else if (tem == false_edge
667 	   || (single_pred_p (false_edge->dest)
668 	       && (tem->src == false_edge->dest
669 		   || dominated_by_p (CDI_DOMINATORS,
670 				      tem->src, false_edge->dest))))
671     arg1 = PHI_ARG_DEF (phi, tem->dest_idx);
672   else
673     return false;
674   tem = EDGE_PRED (bb, 1);
675   if (tem == true_edge
676       || (single_pred_p (true_edge->dest)
677 	  && (tem->src == true_edge->dest
678 	      || dominated_by_p (CDI_DOMINATORS,
679 				 tem->src, true_edge->dest))))
680     arg0 = PHI_ARG_DEF (phi, tem->dest_idx);
681   else if (tem == false_edge
682 	   || (single_pred_p (false_edge->dest)
683 	       && (tem->src == false_edge->dest
684 		   || dominated_by_p (CDI_DOMINATORS,
685 				      tem->src, false_edge->dest))))
686     arg1 = PHI_ARG_DEF (phi, tem->dest_idx);
687   else
688     return false;
689   if (!arg0 || !arg1)
690     return false;
691 
692   if (true_arg_p)
693     *true_arg_p = arg0;
694   if (false_arg_p)
695     *false_arg_p = arg1;
696 
697   return true;
698 }
699 
700 /* Determine the outermost loop to that it is possible to hoist a statement
701    STMT and store it to LIM_DATA (STMT)->max_loop.  To do this we determine
702    the outermost loop in that the value computed by STMT is invariant.
703    If MUST_PRESERVE_EXEC is true, additionally choose such a loop that
704    we preserve the fact whether STMT is executed.  It also fills other related
705    information to LIM_DATA (STMT).
706 
707    The function returns false if STMT cannot be hoisted outside of the loop it
708    is defined in, and true otherwise.  */
709 
710 static bool
711 determine_max_movement (gimple stmt, bool must_preserve_exec)
712 {
713   basic_block bb = gimple_bb (stmt);
714   struct loop *loop = bb->loop_father;
715   struct loop *level;
716   struct lim_aux_data *lim_data = get_lim_data (stmt);
717   tree val;
718   ssa_op_iter iter;
719 
720   if (must_preserve_exec)
721     level = ALWAYS_EXECUTED_IN (bb);
722   else
723     level = superloop_at_depth (loop, 1);
724   lim_data->max_loop = level;
725 
726   if (gphi *phi = dyn_cast <gphi *> (stmt))
727     {
728       use_operand_p use_p;
729       unsigned min_cost = UINT_MAX;
730       unsigned total_cost = 0;
731       struct lim_aux_data *def_data;
732 
733       /* We will end up promoting dependencies to be unconditionally
734 	 evaluated.  For this reason the PHI cost (and thus the
735 	 cost we remove from the loop by doing the invariant motion)
736 	 is that of the cheapest PHI argument dependency chain.  */
737       FOR_EACH_PHI_ARG (use_p, phi, iter, SSA_OP_USE)
738 	{
739 	  val = USE_FROM_PTR (use_p);
740 
741 	  if (TREE_CODE (val) != SSA_NAME)
742 	    {
743 	      /* Assign const 1 to constants.  */
744 	      min_cost = MIN (min_cost, 1);
745 	      total_cost += 1;
746 	      continue;
747 	    }
748 	  if (!add_dependency (val, lim_data, loop, false))
749 	    return false;
750 
751 	  gimple def_stmt = SSA_NAME_DEF_STMT (val);
752 	  if (gimple_bb (def_stmt)
753 	      && gimple_bb (def_stmt)->loop_father == loop)
754 	    {
755 	      def_data = get_lim_data (def_stmt);
756 	      if (def_data)
757 		{
758 		  min_cost = MIN (min_cost, def_data->cost);
759 		  total_cost += def_data->cost;
760 		}
761 	    }
762 	}
763 
764       min_cost = MIN (min_cost, total_cost);
765       lim_data->cost += min_cost;
766 
767       if (gimple_phi_num_args (phi) > 1)
768 	{
769 	  basic_block dom = get_immediate_dominator (CDI_DOMINATORS, bb);
770 	  gimple cond;
771 	  if (gsi_end_p (gsi_last_bb (dom)))
772 	    return false;
773 	  cond = gsi_stmt (gsi_last_bb (dom));
774 	  if (gimple_code (cond) != GIMPLE_COND)
775 	    return false;
776 	  /* Verify that this is an extended form of a diamond and
777 	     the PHI arguments are completely controlled by the
778 	     predicate in DOM.  */
779 	  if (!extract_true_false_args_from_phi (dom, phi, NULL, NULL))
780 	    return false;
781 
782 	  /* Fold in dependencies and cost of the condition.  */
783 	  FOR_EACH_SSA_TREE_OPERAND (val, cond, iter, SSA_OP_USE)
784 	    {
785 	      if (!add_dependency (val, lim_data, loop, false))
786 		return false;
787 	      def_data = get_lim_data (SSA_NAME_DEF_STMT (val));
788 	      if (def_data)
789 		total_cost += def_data->cost;
790 	    }
791 
792 	  /* We want to avoid unconditionally executing very expensive
793 	     operations.  As costs for our dependencies cannot be
794 	     negative just claim we are not invariand for this case.
795 	     We also are not sure whether the control-flow inside the
796 	     loop will vanish.  */
797 	  if (total_cost - min_cost >= 2 * LIM_EXPENSIVE
798 	      && !(min_cost != 0
799 		   && total_cost / min_cost <= 2))
800 	    return false;
801 
802 	  /* Assume that the control-flow in the loop will vanish.
803 	     ???  We should verify this and not artificially increase
804 	     the cost if that is not the case.  */
805 	  lim_data->cost += stmt_cost (stmt);
806 	}
807 
808       return true;
809     }
810   else
811     FOR_EACH_SSA_TREE_OPERAND (val, stmt, iter, SSA_OP_USE)
812       if (!add_dependency (val, lim_data, loop, true))
813 	return false;
814 
815   if (gimple_vuse (stmt))
816     {
817       mem_ref_p ref = mem_ref_in_stmt (stmt);
818 
819       if (ref)
820 	{
821 	  lim_data->max_loop
822 		  = outermost_indep_loop (lim_data->max_loop, loop, ref);
823 	  if (!lim_data->max_loop)
824 	    return false;
825 	}
826       else
827 	{
828 	  if ((val = gimple_vuse (stmt)) != NULL_TREE)
829 	    {
830 	      if (!add_dependency (val, lim_data, loop, false))
831 		return false;
832 	    }
833 	}
834     }
835 
836   lim_data->cost += stmt_cost (stmt);
837 
838   return true;
839 }
840 
841 /* Suppose that some statement in ORIG_LOOP is hoisted to the loop LEVEL,
842    and that one of the operands of this statement is computed by STMT.
843    Ensure that STMT (together with all the statements that define its
844    operands) is hoisted at least out of the loop LEVEL.  */
845 
846 static void
847 set_level (gimple stmt, struct loop *orig_loop, struct loop *level)
848 {
849   struct loop *stmt_loop = gimple_bb (stmt)->loop_father;
850   struct lim_aux_data *lim_data;
851   gimple dep_stmt;
852   unsigned i;
853 
854   stmt_loop = find_common_loop (orig_loop, stmt_loop);
855   lim_data = get_lim_data (stmt);
856   if (lim_data != NULL && lim_data->tgt_loop != NULL)
857     stmt_loop = find_common_loop (stmt_loop,
858 				  loop_outer (lim_data->tgt_loop));
859   if (flow_loop_nested_p (stmt_loop, level))
860     return;
861 
862   gcc_assert (level == lim_data->max_loop
863 	      || flow_loop_nested_p (lim_data->max_loop, level));
864 
865   lim_data->tgt_loop = level;
866   FOR_EACH_VEC_ELT (lim_data->depends, i, dep_stmt)
867     set_level (dep_stmt, orig_loop, level);
868 }
869 
870 /* Determines an outermost loop from that we want to hoist the statement STMT.
871    For now we chose the outermost possible loop.  TODO -- use profiling
872    information to set it more sanely.  */
873 
874 static void
875 set_profitable_level (gimple stmt)
876 {
877   set_level (stmt, gimple_bb (stmt)->loop_father, get_lim_data (stmt)->max_loop);
878 }
879 
880 /* Returns true if STMT is a call that has side effects.  */
881 
882 static bool
883 nonpure_call_p (gimple stmt)
884 {
885   if (gimple_code (stmt) != GIMPLE_CALL)
886     return false;
887 
888   return gimple_has_side_effects (stmt);
889 }
890 
891 /* Rewrite a/b to a*(1/b).  Return the invariant stmt to process.  */
892 
893 static gimple
894 rewrite_reciprocal (gimple_stmt_iterator *bsi)
895 {
896   gassign *stmt, *stmt1, *stmt2;
897   tree name, lhs, type;
898   tree real_one;
899   gimple_stmt_iterator gsi;
900 
901   stmt = as_a <gassign *> (gsi_stmt (*bsi));
902   lhs = gimple_assign_lhs (stmt);
903   type = TREE_TYPE (lhs);
904 
905   real_one = build_one_cst (type);
906 
907   name = make_temp_ssa_name (type, NULL, "reciptmp");
908   stmt1 = gimple_build_assign (name, RDIV_EXPR, real_one,
909 			       gimple_assign_rhs2 (stmt));
910   stmt2 = gimple_build_assign (lhs, MULT_EXPR, name,
911 			       gimple_assign_rhs1 (stmt));
912 
913   /* Replace division stmt with reciprocal and multiply stmts.
914      The multiply stmt is not invariant, so update iterator
915      and avoid rescanning.  */
916   gsi = *bsi;
917   gsi_insert_before (bsi, stmt1, GSI_NEW_STMT);
918   gsi_replace (&gsi, stmt2, true);
919 
920   /* Continue processing with invariant reciprocal statement.  */
921   return stmt1;
922 }
923 
924 /* Check if the pattern at *BSI is a bittest of the form
925    (A >> B) & 1 != 0 and in this case rewrite it to A & (1 << B) != 0.  */
926 
927 static gimple
928 rewrite_bittest (gimple_stmt_iterator *bsi)
929 {
930   gassign *stmt;
931   gimple stmt1;
932   gassign *stmt2;
933   gimple use_stmt;
934   gcond *cond_stmt;
935   tree lhs, name, t, a, b;
936   use_operand_p use;
937 
938   stmt = as_a <gassign *> (gsi_stmt (*bsi));
939   lhs = gimple_assign_lhs (stmt);
940 
941   /* Verify that the single use of lhs is a comparison against zero.  */
942   if (TREE_CODE (lhs) != SSA_NAME
943       || !single_imm_use (lhs, &use, &use_stmt))
944     return stmt;
945   cond_stmt = dyn_cast <gcond *> (use_stmt);
946   if (!cond_stmt)
947     return stmt;
948   if (gimple_cond_lhs (cond_stmt) != lhs
949       || (gimple_cond_code (cond_stmt) != NE_EXPR
950 	  && gimple_cond_code (cond_stmt) != EQ_EXPR)
951       || !integer_zerop (gimple_cond_rhs (cond_stmt)))
952     return stmt;
953 
954   /* Get at the operands of the shift.  The rhs is TMP1 & 1.  */
955   stmt1 = SSA_NAME_DEF_STMT (gimple_assign_rhs1 (stmt));
956   if (gimple_code (stmt1) != GIMPLE_ASSIGN)
957     return stmt;
958 
959   /* There is a conversion in between possibly inserted by fold.  */
960   if (CONVERT_EXPR_CODE_P (gimple_assign_rhs_code (stmt1)))
961     {
962       t = gimple_assign_rhs1 (stmt1);
963       if (TREE_CODE (t) != SSA_NAME
964 	  || !has_single_use (t))
965 	return stmt;
966       stmt1 = SSA_NAME_DEF_STMT (t);
967       if (gimple_code (stmt1) != GIMPLE_ASSIGN)
968 	return stmt;
969     }
970 
971   /* Verify that B is loop invariant but A is not.  Verify that with
972      all the stmt walking we are still in the same loop.  */
973   if (gimple_assign_rhs_code (stmt1) != RSHIFT_EXPR
974       || loop_containing_stmt (stmt1) != loop_containing_stmt (stmt))
975     return stmt;
976 
977   a = gimple_assign_rhs1 (stmt1);
978   b = gimple_assign_rhs2 (stmt1);
979 
980   if (outermost_invariant_loop (b, loop_containing_stmt (stmt1)) != NULL
981       && outermost_invariant_loop (a, loop_containing_stmt (stmt1)) == NULL)
982     {
983       gimple_stmt_iterator rsi;
984 
985       /* 1 << B */
986       t = fold_build2 (LSHIFT_EXPR, TREE_TYPE (a),
987 		       build_int_cst (TREE_TYPE (a), 1), b);
988       name = make_temp_ssa_name (TREE_TYPE (a), NULL, "shifttmp");
989       stmt1 = gimple_build_assign (name, t);
990 
991       /* A & (1 << B) */
992       t = fold_build2 (BIT_AND_EXPR, TREE_TYPE (a), a, name);
993       name = make_temp_ssa_name (TREE_TYPE (a), NULL, "shifttmp");
994       stmt2 = gimple_build_assign (name, t);
995 
996       /* Replace the SSA_NAME we compare against zero.  Adjust
997 	 the type of zero accordingly.  */
998       SET_USE (use, name);
999       gimple_cond_set_rhs (cond_stmt,
1000 			   build_int_cst_type (TREE_TYPE (name),
1001 					       0));
1002 
1003       /* Don't use gsi_replace here, none of the new assignments sets
1004 	 the variable originally set in stmt.  Move bsi to stmt1, and
1005 	 then remove the original stmt, so that we get a chance to
1006 	 retain debug info for it.  */
1007       rsi = *bsi;
1008       gsi_insert_before (bsi, stmt1, GSI_NEW_STMT);
1009       gsi_insert_before (&rsi, stmt2, GSI_SAME_STMT);
1010       gsi_remove (&rsi, true);
1011 
1012       return stmt1;
1013     }
1014 
1015   return stmt;
1016 }
1017 
1018 /* For each statement determines the outermost loop in that it is invariant,
1019    -   statements on whose motion it depends and the cost of the computation.
1020    -   This information is stored to the LIM_DATA structure associated with
1021    -   each statement.  */
1022 class invariantness_dom_walker : public dom_walker
1023 {
1024 public:
1025   invariantness_dom_walker (cdi_direction direction)
1026     : dom_walker (direction) {}
1027 
1028   virtual void before_dom_children (basic_block);
1029 };
1030 
1031 /* Determine the outermost loops in that statements in basic block BB are
1032    invariant, and record them to the LIM_DATA associated with the statements.
1033    Callback for dom_walker.  */
1034 
1035 void
1036 invariantness_dom_walker::before_dom_children (basic_block bb)
1037 {
1038   enum move_pos pos;
1039   gimple_stmt_iterator bsi;
1040   gimple stmt;
1041   bool maybe_never = ALWAYS_EXECUTED_IN (bb) == NULL;
1042   struct loop *outermost = ALWAYS_EXECUTED_IN (bb);
1043   struct lim_aux_data *lim_data;
1044 
1045   if (!loop_outer (bb->loop_father))
1046     return;
1047 
1048   if (dump_file && (dump_flags & TDF_DETAILS))
1049     fprintf (dump_file, "Basic block %d (loop %d -- depth %d):\n\n",
1050 	     bb->index, bb->loop_father->num, loop_depth (bb->loop_father));
1051 
1052   /* Look at PHI nodes, but only if there is at most two.
1053      ???  We could relax this further by post-processing the inserted
1054      code and transforming adjacent cond-exprs with the same predicate
1055      to control flow again.  */
1056   bsi = gsi_start_phis (bb);
1057   if (!gsi_end_p (bsi)
1058       && ((gsi_next (&bsi), gsi_end_p (bsi))
1059 	  || (gsi_next (&bsi), gsi_end_p (bsi))))
1060     for (bsi = gsi_start_phis (bb); !gsi_end_p (bsi); gsi_next (&bsi))
1061       {
1062 	stmt = gsi_stmt (bsi);
1063 
1064 	pos = movement_possibility (stmt);
1065 	if (pos == MOVE_IMPOSSIBLE)
1066 	  continue;
1067 
1068 	lim_data = init_lim_data (stmt);
1069 	lim_data->always_executed_in = outermost;
1070 
1071 	if (!determine_max_movement (stmt, false))
1072 	  {
1073 	    lim_data->max_loop = NULL;
1074 	    continue;
1075 	  }
1076 
1077 	if (dump_file && (dump_flags & TDF_DETAILS))
1078 	  {
1079 	    print_gimple_stmt (dump_file, stmt, 2, 0);
1080 	    fprintf (dump_file, "  invariant up to level %d, cost %d.\n\n",
1081 		     loop_depth (lim_data->max_loop),
1082 		     lim_data->cost);
1083 	  }
1084 
1085 	if (lim_data->cost >= LIM_EXPENSIVE)
1086 	  set_profitable_level (stmt);
1087       }
1088 
1089   for (bsi = gsi_start_bb (bb); !gsi_end_p (bsi); gsi_next (&bsi))
1090     {
1091       stmt = gsi_stmt (bsi);
1092 
1093       pos = movement_possibility (stmt);
1094       if (pos == MOVE_IMPOSSIBLE)
1095 	{
1096 	  if (nonpure_call_p (stmt))
1097 	    {
1098 	      maybe_never = true;
1099 	      outermost = NULL;
1100 	    }
1101 	  /* Make sure to note always_executed_in for stores to make
1102 	     store-motion work.  */
1103 	  else if (stmt_makes_single_store (stmt))
1104 	    {
1105 	      struct lim_aux_data *lim_data = init_lim_data (stmt);
1106 	      lim_data->always_executed_in = outermost;
1107 	    }
1108 	  continue;
1109 	}
1110 
1111       if (is_gimple_assign (stmt)
1112 	  && (get_gimple_rhs_class (gimple_assign_rhs_code (stmt))
1113 	      == GIMPLE_BINARY_RHS))
1114 	{
1115 	  tree op0 = gimple_assign_rhs1 (stmt);
1116 	  tree op1 = gimple_assign_rhs2 (stmt);
1117 	  struct loop *ol1 = outermost_invariant_loop (op1,
1118 					loop_containing_stmt (stmt));
1119 
1120 	  /* If divisor is invariant, convert a/b to a*(1/b), allowing reciprocal
1121 	     to be hoisted out of loop, saving expensive divide.  */
1122 	  if (pos == MOVE_POSSIBLE
1123 	      && gimple_assign_rhs_code (stmt) == RDIV_EXPR
1124 	      && flag_unsafe_math_optimizations
1125 	      && !flag_trapping_math
1126 	      && ol1 != NULL
1127 	      && outermost_invariant_loop (op0, ol1) == NULL)
1128 	    stmt = rewrite_reciprocal (&bsi);
1129 
1130 	  /* If the shift count is invariant, convert (A >> B) & 1 to
1131 	     A & (1 << B) allowing the bit mask to be hoisted out of the loop
1132 	     saving an expensive shift.  */
1133 	  if (pos == MOVE_POSSIBLE
1134 	      && gimple_assign_rhs_code (stmt) == BIT_AND_EXPR
1135 	      && integer_onep (op1)
1136 	      && TREE_CODE (op0) == SSA_NAME
1137 	      && has_single_use (op0))
1138 	    stmt = rewrite_bittest (&bsi);
1139 	}
1140 
1141       lim_data = init_lim_data (stmt);
1142       lim_data->always_executed_in = outermost;
1143 
1144       if (maybe_never && pos == MOVE_PRESERVE_EXECUTION)
1145 	continue;
1146 
1147       if (!determine_max_movement (stmt, pos == MOVE_PRESERVE_EXECUTION))
1148 	{
1149 	  lim_data->max_loop = NULL;
1150 	  continue;
1151 	}
1152 
1153       if (dump_file && (dump_flags & TDF_DETAILS))
1154 	{
1155 	  print_gimple_stmt (dump_file, stmt, 2, 0);
1156 	  fprintf (dump_file, "  invariant up to level %d, cost %d.\n\n",
1157 		   loop_depth (lim_data->max_loop),
1158 		   lim_data->cost);
1159 	}
1160 
1161       if (lim_data->cost >= LIM_EXPENSIVE)
1162 	set_profitable_level (stmt);
1163     }
1164 }
1165 
1166 class move_computations_dom_walker : public dom_walker
1167 {
1168 public:
1169   move_computations_dom_walker (cdi_direction direction)
1170     : dom_walker (direction), todo_ (0) {}
1171 
1172   virtual void before_dom_children (basic_block);
1173 
1174   unsigned int todo_;
1175 };
1176 
1177 /* Hoist the statements in basic block BB out of the loops prescribed by
1178    data stored in LIM_DATA structures associated with each statement.  Callback
1179    for walk_dominator_tree.  */
1180 
1181 void
1182 move_computations_dom_walker::before_dom_children (basic_block bb)
1183 {
1184   struct loop *level;
1185   unsigned cost = 0;
1186   struct lim_aux_data *lim_data;
1187 
1188   if (!loop_outer (bb->loop_father))
1189     return;
1190 
1191   for (gphi_iterator bsi = gsi_start_phis (bb); !gsi_end_p (bsi); )
1192     {
1193       gassign *new_stmt;
1194       gphi *stmt = bsi.phi ();
1195 
1196       lim_data = get_lim_data (stmt);
1197       if (lim_data == NULL)
1198 	{
1199 	  gsi_next (&bsi);
1200 	  continue;
1201 	}
1202 
1203       cost = lim_data->cost;
1204       level = lim_data->tgt_loop;
1205       clear_lim_data (stmt);
1206 
1207       if (!level)
1208 	{
1209 	  gsi_next (&bsi);
1210 	  continue;
1211 	}
1212 
1213       if (dump_file && (dump_flags & TDF_DETAILS))
1214 	{
1215 	  fprintf (dump_file, "Moving PHI node\n");
1216 	  print_gimple_stmt (dump_file, stmt, 0, 0);
1217 	  fprintf (dump_file, "(cost %u) out of loop %d.\n\n",
1218 		   cost, level->num);
1219 	}
1220 
1221       if (gimple_phi_num_args (stmt) == 1)
1222 	{
1223 	  tree arg = PHI_ARG_DEF (stmt, 0);
1224 	  new_stmt = gimple_build_assign (gimple_phi_result (stmt),
1225 					  TREE_CODE (arg), arg);
1226 	}
1227       else
1228 	{
1229 	  basic_block dom = get_immediate_dominator (CDI_DOMINATORS, bb);
1230 	  gimple cond = gsi_stmt (gsi_last_bb (dom));
1231 	  tree arg0 = NULL_TREE, arg1 = NULL_TREE, t;
1232 	  /* Get the PHI arguments corresponding to the true and false
1233 	     edges of COND.  */
1234 	  extract_true_false_args_from_phi (dom, stmt, &arg0, &arg1);
1235 	  gcc_assert (arg0 && arg1);
1236 	  t = build2 (gimple_cond_code (cond), boolean_type_node,
1237 		      gimple_cond_lhs (cond), gimple_cond_rhs (cond));
1238 	  new_stmt = gimple_build_assign (gimple_phi_result (stmt),
1239 					  COND_EXPR, t, arg0, arg1);
1240 	  todo_ |= TODO_cleanup_cfg;
1241 	}
1242       if (INTEGRAL_TYPE_P (TREE_TYPE (gimple_assign_lhs (new_stmt)))
1243 	  && (!ALWAYS_EXECUTED_IN (bb)
1244 	      || (ALWAYS_EXECUTED_IN (bb) != level
1245 		  && !flow_loop_nested_p (ALWAYS_EXECUTED_IN (bb), level))))
1246 	{
1247 	  tree lhs = gimple_assign_lhs (new_stmt);
1248 	  SSA_NAME_RANGE_INFO (lhs) = NULL;
1249 	  SSA_NAME_ANTI_RANGE_P (lhs) = 0;
1250 	}
1251       gsi_insert_on_edge (loop_preheader_edge (level), new_stmt);
1252       remove_phi_node (&bsi, false);
1253     }
1254 
1255   for (gimple_stmt_iterator bsi = gsi_start_bb (bb); !gsi_end_p (bsi); )
1256     {
1257       edge e;
1258 
1259       gimple stmt = gsi_stmt (bsi);
1260 
1261       lim_data = get_lim_data (stmt);
1262       if (lim_data == NULL)
1263 	{
1264 	  gsi_next (&bsi);
1265 	  continue;
1266 	}
1267 
1268       cost = lim_data->cost;
1269       level = lim_data->tgt_loop;
1270       clear_lim_data (stmt);
1271 
1272       if (!level)
1273 	{
1274 	  gsi_next (&bsi);
1275 	  continue;
1276 	}
1277 
1278       /* We do not really want to move conditionals out of the loop; we just
1279 	 placed it here to force its operands to be moved if necessary.  */
1280       if (gimple_code (stmt) == GIMPLE_COND)
1281 	continue;
1282 
1283       if (dump_file && (dump_flags & TDF_DETAILS))
1284 	{
1285 	  fprintf (dump_file, "Moving statement\n");
1286 	  print_gimple_stmt (dump_file, stmt, 0, 0);
1287 	  fprintf (dump_file, "(cost %u) out of loop %d.\n\n",
1288 		   cost, level->num);
1289 	}
1290 
1291       e = loop_preheader_edge (level);
1292       gcc_assert (!gimple_vdef (stmt));
1293       if (gimple_vuse (stmt))
1294 	{
1295 	  /* The new VUSE is the one from the virtual PHI in the loop
1296 	     header or the one already present.  */
1297 	  gphi_iterator gsi2;
1298 	  for (gsi2 = gsi_start_phis (e->dest);
1299 	       !gsi_end_p (gsi2); gsi_next (&gsi2))
1300 	    {
1301 	      gphi *phi = gsi2.phi ();
1302 	      if (virtual_operand_p (gimple_phi_result (phi)))
1303 		{
1304 		  gimple_set_vuse (stmt, PHI_ARG_DEF_FROM_EDGE (phi, e));
1305 		  break;
1306 		}
1307 	    }
1308 	}
1309       gsi_remove (&bsi, false);
1310       if (gimple_has_lhs (stmt)
1311 	  && TREE_CODE (gimple_get_lhs (stmt)) == SSA_NAME
1312 	  && INTEGRAL_TYPE_P (TREE_TYPE (gimple_get_lhs (stmt)))
1313 	  && (!ALWAYS_EXECUTED_IN (bb)
1314 	      || !(ALWAYS_EXECUTED_IN (bb) == level
1315 		   || flow_loop_nested_p (ALWAYS_EXECUTED_IN (bb), level))))
1316 	{
1317 	  tree lhs = gimple_get_lhs (stmt);
1318 	  SSA_NAME_RANGE_INFO (lhs) = NULL;
1319 	  SSA_NAME_ANTI_RANGE_P (lhs) = 0;
1320 	}
1321       /* In case this is a stmt that is not unconditionally executed
1322          when the target loop header is executed and the stmt may
1323 	 invoke undefined integer or pointer overflow rewrite it to
1324 	 unsigned arithmetic.  */
1325       if (is_gimple_assign (stmt)
1326 	  && INTEGRAL_TYPE_P (TREE_TYPE (gimple_assign_lhs (stmt)))
1327 	  && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (gimple_assign_lhs (stmt)))
1328 	  && arith_code_with_undefined_signed_overflow
1329 	       (gimple_assign_rhs_code (stmt))
1330 	  && (!ALWAYS_EXECUTED_IN (bb)
1331 	      || !(ALWAYS_EXECUTED_IN (bb) == level
1332 		   || flow_loop_nested_p (ALWAYS_EXECUTED_IN (bb), level))))
1333 	gsi_insert_seq_on_edge (e, rewrite_to_defined_overflow (stmt));
1334       else
1335 	gsi_insert_on_edge (e, stmt);
1336     }
1337 }
1338 
1339 /* Hoist the statements out of the loops prescribed by data stored in
1340    LIM_DATA structures associated with each statement.*/
1341 
1342 static unsigned int
1343 move_computations (void)
1344 {
1345   move_computations_dom_walker walker (CDI_DOMINATORS);
1346   walker.walk (cfun->cfg->x_entry_block_ptr);
1347 
1348   gsi_commit_edge_inserts ();
1349   if (need_ssa_update_p (cfun))
1350     rewrite_into_loop_closed_ssa (NULL, TODO_update_ssa);
1351 
1352   return walker.todo_;
1353 }
1354 
1355 /* Checks whether the statement defining variable *INDEX can be hoisted
1356    out of the loop passed in DATA.  Callback for for_each_index.  */
1357 
1358 static bool
1359 may_move_till (tree ref, tree *index, void *data)
1360 {
1361   struct loop *loop = (struct loop *) data, *max_loop;
1362 
1363   /* If REF is an array reference, check also that the step and the lower
1364      bound is invariant in LOOP.  */
1365   if (TREE_CODE (ref) == ARRAY_REF)
1366     {
1367       tree step = TREE_OPERAND (ref, 3);
1368       tree lbound = TREE_OPERAND (ref, 2);
1369 
1370       max_loop = outermost_invariant_loop (step, loop);
1371       if (!max_loop)
1372 	return false;
1373 
1374       max_loop = outermost_invariant_loop (lbound, loop);
1375       if (!max_loop)
1376 	return false;
1377     }
1378 
1379   max_loop = outermost_invariant_loop (*index, loop);
1380   if (!max_loop)
1381     return false;
1382 
1383   return true;
1384 }
1385 
1386 /* If OP is SSA NAME, force the statement that defines it to be
1387    moved out of the LOOP.  ORIG_LOOP is the loop in that EXPR is used.  */
1388 
1389 static void
1390 force_move_till_op (tree op, struct loop *orig_loop, struct loop *loop)
1391 {
1392   gimple stmt;
1393 
1394   if (!op
1395       || is_gimple_min_invariant (op))
1396     return;
1397 
1398   gcc_assert (TREE_CODE (op) == SSA_NAME);
1399 
1400   stmt = SSA_NAME_DEF_STMT (op);
1401   if (gimple_nop_p (stmt))
1402     return;
1403 
1404   set_level (stmt, orig_loop, loop);
1405 }
1406 
1407 /* Forces statement defining invariants in REF (and *INDEX) to be moved out of
1408    the LOOP.  The reference REF is used in the loop ORIG_LOOP.  Callback for
1409    for_each_index.  */
1410 
1411 struct fmt_data
1412 {
1413   struct loop *loop;
1414   struct loop *orig_loop;
1415 };
1416 
1417 static bool
1418 force_move_till (tree ref, tree *index, void *data)
1419 {
1420   struct fmt_data *fmt_data = (struct fmt_data *) data;
1421 
1422   if (TREE_CODE (ref) == ARRAY_REF)
1423     {
1424       tree step = TREE_OPERAND (ref, 3);
1425       tree lbound = TREE_OPERAND (ref, 2);
1426 
1427       force_move_till_op (step, fmt_data->orig_loop, fmt_data->loop);
1428       force_move_till_op (lbound, fmt_data->orig_loop, fmt_data->loop);
1429     }
1430 
1431   force_move_till_op (*index, fmt_data->orig_loop, fmt_data->loop);
1432 
1433   return true;
1434 }
1435 
1436 /* A function to free the mem_ref object OBJ.  */
1437 
1438 static void
1439 memref_free (struct im_mem_ref *mem)
1440 {
1441   mem->accesses_in_loop.release ();
1442 }
1443 
1444 /* Allocates and returns a memory reference description for MEM whose hash
1445    value is HASH and id is ID.  */
1446 
1447 static mem_ref_p
1448 mem_ref_alloc (tree mem, unsigned hash, unsigned id)
1449 {
1450   mem_ref_p ref = XOBNEW (&mem_ref_obstack, struct im_mem_ref);
1451   ao_ref_init (&ref->mem, mem);
1452   ref->id = id;
1453   ref->hash = hash;
1454   ref->stored = NULL;
1455   bitmap_initialize (&ref->indep_loop, &lim_bitmap_obstack);
1456   bitmap_initialize (&ref->dep_loop, &lim_bitmap_obstack);
1457   ref->accesses_in_loop.create (1);
1458 
1459   return ref;
1460 }
1461 
1462 /* Records memory reference location *LOC in LOOP to the memory reference
1463    description REF.  The reference occurs in statement STMT.  */
1464 
1465 static void
1466 record_mem_ref_loc (mem_ref_p ref, gimple stmt, tree *loc)
1467 {
1468   mem_ref_loc aref;
1469   aref.stmt = stmt;
1470   aref.ref = loc;
1471   ref->accesses_in_loop.safe_push (aref);
1472 }
1473 
1474 /* Set the LOOP bit in REF stored bitmap and allocate that if
1475    necessary.  Return whether a bit was changed.  */
1476 
1477 static bool
1478 set_ref_stored_in_loop (mem_ref_p ref, struct loop *loop)
1479 {
1480   if (!ref->stored)
1481     ref->stored = BITMAP_ALLOC (&lim_bitmap_obstack);
1482   return bitmap_set_bit (ref->stored, loop->num);
1483 }
1484 
1485 /* Marks reference REF as stored in LOOP.  */
1486 
1487 static void
1488 mark_ref_stored (mem_ref_p ref, struct loop *loop)
1489 {
1490   while (loop != current_loops->tree_root
1491 	 && set_ref_stored_in_loop (ref, loop))
1492     loop = loop_outer (loop);
1493 }
1494 
1495 /* Gathers memory references in statement STMT in LOOP, storing the
1496    information about them in the memory_accesses structure.  Marks
1497    the vops accessed through unrecognized statements there as
1498    well.  */
1499 
1500 static void
1501 gather_mem_refs_stmt (struct loop *loop, gimple stmt)
1502 {
1503   tree *mem = NULL;
1504   hashval_t hash;
1505   im_mem_ref **slot;
1506   mem_ref_p ref;
1507   bool is_stored;
1508   unsigned id;
1509 
1510   if (!gimple_vuse (stmt))
1511     return;
1512 
1513   mem = simple_mem_ref_in_stmt (stmt, &is_stored);
1514   if (!mem)
1515     {
1516       /* We use the shared mem_ref for all unanalyzable refs.  */
1517       id = UNANALYZABLE_MEM_ID;
1518       ref = memory_accesses.refs_list[id];
1519       if (dump_file && (dump_flags & TDF_DETAILS))
1520 	{
1521 	  fprintf (dump_file, "Unanalyzed memory reference %u: ", id);
1522 	  print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM);
1523 	}
1524       is_stored = gimple_vdef (stmt);
1525     }
1526   else
1527     {
1528       hash = iterative_hash_expr (*mem, 0);
1529       slot = memory_accesses.refs->find_slot_with_hash (*mem, hash, INSERT);
1530       if (*slot)
1531 	{
1532 	  ref = (mem_ref_p) *slot;
1533 	  id = ref->id;
1534 	}
1535       else
1536 	{
1537 	  id = memory_accesses.refs_list.length ();
1538 	  ref = mem_ref_alloc (*mem, hash, id);
1539 	  memory_accesses.refs_list.safe_push (ref);
1540 	  *slot = ref;
1541 
1542 	  if (dump_file && (dump_flags & TDF_DETAILS))
1543 	    {
1544 	      fprintf (dump_file, "Memory reference %u: ", id);
1545 	      print_generic_expr (dump_file, ref->mem.ref, TDF_SLIM);
1546 	      fprintf (dump_file, "\n");
1547 	    }
1548 	}
1549 
1550       record_mem_ref_loc (ref, stmt, mem);
1551     }
1552   bitmap_set_bit (&memory_accesses.refs_in_loop[loop->num], ref->id);
1553   if (is_stored)
1554     {
1555       bitmap_set_bit (&memory_accesses.refs_stored_in_loop[loop->num], ref->id);
1556       mark_ref_stored (ref, loop);
1557     }
1558   return;
1559 }
1560 
1561 static unsigned *bb_loop_postorder;
1562 
1563 /* qsort sort function to sort blocks after their loop fathers postorder.  */
1564 
1565 static int
1566 sort_bbs_in_loop_postorder_cmp (const void *bb1_, const void *bb2_)
1567 {
1568   basic_block bb1 = *(basic_block *)const_cast<void *>(bb1_);
1569   basic_block bb2 = *(basic_block *)const_cast<void *>(bb2_);
1570   struct loop *loop1 = bb1->loop_father;
1571   struct loop *loop2 = bb2->loop_father;
1572   if (loop1->num == loop2->num)
1573     return 0;
1574   return bb_loop_postorder[loop1->num] < bb_loop_postorder[loop2->num] ? -1 : 1;
1575 }
1576 
1577 /* qsort sort function to sort ref locs after their loop fathers postorder.  */
1578 
1579 static int
1580 sort_locs_in_loop_postorder_cmp (const void *loc1_, const void *loc2_)
1581 {
1582   mem_ref_loc *loc1 = (mem_ref_loc *)const_cast<void *>(loc1_);
1583   mem_ref_loc *loc2 = (mem_ref_loc *)const_cast<void *>(loc2_);
1584   struct loop *loop1 = gimple_bb (loc1->stmt)->loop_father;
1585   struct loop *loop2 = gimple_bb (loc2->stmt)->loop_father;
1586   if (loop1->num == loop2->num)
1587     return 0;
1588   return bb_loop_postorder[loop1->num] < bb_loop_postorder[loop2->num] ? -1 : 1;
1589 }
1590 
1591 /* Gathers memory references in loops.  */
1592 
1593 static void
1594 analyze_memory_references (void)
1595 {
1596   gimple_stmt_iterator bsi;
1597   basic_block bb, *bbs;
1598   struct loop *loop, *outer;
1599   unsigned i, n;
1600 
1601   /* Collect all basic-blocks in loops and sort them after their
1602      loops postorder.  */
1603   i = 0;
1604   bbs = XNEWVEC (basic_block, n_basic_blocks_for_fn (cfun) - NUM_FIXED_BLOCKS);
1605   FOR_EACH_BB_FN (bb, cfun)
1606     if (bb->loop_father != current_loops->tree_root)
1607       bbs[i++] = bb;
1608   n = i;
1609   qsort (bbs, n, sizeof (basic_block), sort_bbs_in_loop_postorder_cmp);
1610 
1611   /* Visit blocks in loop postorder and assign mem-ref IDs in that order.
1612      That results in better locality for all the bitmaps.  */
1613   for (i = 0; i < n; ++i)
1614     {
1615       basic_block bb = bbs[i];
1616       for (bsi = gsi_start_bb (bb); !gsi_end_p (bsi); gsi_next (&bsi))
1617         gather_mem_refs_stmt (bb->loop_father, gsi_stmt (bsi));
1618     }
1619 
1620   /* Sort the location list of gathered memory references after their
1621      loop postorder number.  */
1622   im_mem_ref *ref;
1623   FOR_EACH_VEC_ELT (memory_accesses.refs_list, i, ref)
1624     ref->accesses_in_loop.qsort (sort_locs_in_loop_postorder_cmp);
1625 
1626   free (bbs);
1627 //  free (bb_loop_postorder);
1628 
1629   /* Propagate the information about accessed memory references up
1630      the loop hierarchy.  */
1631   FOR_EACH_LOOP (loop, LI_FROM_INNERMOST)
1632     {
1633       /* Finalize the overall touched references (including subloops).  */
1634       bitmap_ior_into (&memory_accesses.all_refs_stored_in_loop[loop->num],
1635 		       &memory_accesses.refs_stored_in_loop[loop->num]);
1636 
1637       /* Propagate the information about accessed memory references up
1638 	 the loop hierarchy.  */
1639       outer = loop_outer (loop);
1640       if (outer == current_loops->tree_root)
1641 	continue;
1642 
1643       bitmap_ior_into (&memory_accesses.all_refs_stored_in_loop[outer->num],
1644 		       &memory_accesses.all_refs_stored_in_loop[loop->num]);
1645     }
1646 }
1647 
1648 /* Returns true if MEM1 and MEM2 may alias.  TTAE_CACHE is used as a cache in
1649    tree_to_aff_combination_expand.  */
1650 
1651 static bool
1652 mem_refs_may_alias_p (mem_ref_p mem1, mem_ref_p mem2,
1653 		      hash_map<tree, name_expansion *> **ttae_cache)
1654 {
1655   /* Perform BASE + OFFSET analysis -- if MEM1 and MEM2 are based on the same
1656      object and their offset differ in such a way that the locations cannot
1657      overlap, then they cannot alias.  */
1658   widest_int size1, size2;
1659   aff_tree off1, off2;
1660 
1661   /* Perform basic offset and type-based disambiguation.  */
1662   if (!refs_may_alias_p_1 (&mem1->mem, &mem2->mem, true))
1663     return false;
1664 
1665   /* The expansion of addresses may be a bit expensive, thus we only do
1666      the check at -O2 and higher optimization levels.  */
1667   if (optimize < 2)
1668     return true;
1669 
1670   get_inner_reference_aff (mem1->mem.ref, &off1, &size1);
1671   get_inner_reference_aff (mem2->mem.ref, &off2, &size2);
1672   aff_combination_expand (&off1, ttae_cache);
1673   aff_combination_expand (&off2, ttae_cache);
1674   aff_combination_scale (&off1, -1);
1675   aff_combination_add (&off2, &off1);
1676 
1677   if (aff_comb_cannot_overlap_p (&off2, size1, size2))
1678     return false;
1679 
1680   return true;
1681 }
1682 
1683 /* Compare function for bsearch searching for reference locations
1684    in a loop.  */
1685 
1686 static int
1687 find_ref_loc_in_loop_cmp (const void *loop_, const void *loc_)
1688 {
1689   struct loop *loop = (struct loop *)const_cast<void *>(loop_);
1690   mem_ref_loc *loc = (mem_ref_loc *)const_cast<void *>(loc_);
1691   struct loop *loc_loop = gimple_bb (loc->stmt)->loop_father;
1692   if (loop->num  == loc_loop->num
1693       || flow_loop_nested_p (loop, loc_loop))
1694     return 0;
1695   return (bb_loop_postorder[loop->num] < bb_loop_postorder[loc_loop->num]
1696 	  ? -1 : 1);
1697 }
1698 
1699 /* Iterates over all locations of REF in LOOP and its subloops calling
1700    fn.operator() with the location as argument.  When that operator
1701    returns true the iteration is stopped and true is returned.
1702    Otherwise false is returned.  */
1703 
1704 template <typename FN>
1705 static bool
1706 for_all_locs_in_loop (struct loop *loop, mem_ref_p ref, FN fn)
1707 {
1708   unsigned i;
1709   mem_ref_loc_p loc;
1710 
1711   /* Search for the cluster of locs in the accesses_in_loop vector
1712      which is sorted after postorder index of the loop father.  */
1713   loc = ref->accesses_in_loop.bsearch (loop, find_ref_loc_in_loop_cmp);
1714   if (!loc)
1715     return false;
1716 
1717   /* We have found one location inside loop or its sub-loops.  Iterate
1718      both forward and backward to cover the whole cluster.  */
1719   i = loc - ref->accesses_in_loop.address ();
1720   while (i > 0)
1721     {
1722       --i;
1723       mem_ref_loc_p l = &ref->accesses_in_loop[i];
1724       if (!flow_bb_inside_loop_p (loop, gimple_bb (l->stmt)))
1725 	break;
1726       if (fn (l))
1727 	return true;
1728     }
1729   for (i = loc - ref->accesses_in_loop.address ();
1730        i < ref->accesses_in_loop.length (); ++i)
1731     {
1732       mem_ref_loc_p l = &ref->accesses_in_loop[i];
1733       if (!flow_bb_inside_loop_p (loop, gimple_bb (l->stmt)))
1734 	break;
1735       if (fn (l))
1736 	return true;
1737     }
1738 
1739   return false;
1740 }
1741 
1742 /* Rewrites location LOC by TMP_VAR.  */
1743 
1744 struct rewrite_mem_ref_loc
1745 {
1746   rewrite_mem_ref_loc (tree tmp_var_) : tmp_var (tmp_var_) {}
1747   bool operator () (mem_ref_loc_p loc);
1748   tree tmp_var;
1749 };
1750 
1751 bool
1752 rewrite_mem_ref_loc::operator () (mem_ref_loc_p loc)
1753 {
1754   *loc->ref = tmp_var;
1755   update_stmt (loc->stmt);
1756   return false;
1757 }
1758 
1759 /* Rewrites all references to REF in LOOP by variable TMP_VAR.  */
1760 
1761 static void
1762 rewrite_mem_refs (struct loop *loop, mem_ref_p ref, tree tmp_var)
1763 {
1764   for_all_locs_in_loop (loop, ref, rewrite_mem_ref_loc (tmp_var));
1765 }
1766 
1767 /* Stores the first reference location in LOCP.  */
1768 
1769 struct first_mem_ref_loc_1
1770 {
1771   first_mem_ref_loc_1 (mem_ref_loc_p *locp_) : locp (locp_) {}
1772   bool operator () (mem_ref_loc_p loc);
1773   mem_ref_loc_p *locp;
1774 };
1775 
1776 bool
1777 first_mem_ref_loc_1::operator () (mem_ref_loc_p loc)
1778 {
1779   *locp = loc;
1780   return true;
1781 }
1782 
1783 /* Returns the first reference location to REF in LOOP.  */
1784 
1785 static mem_ref_loc_p
1786 first_mem_ref_loc (struct loop *loop, mem_ref_p ref)
1787 {
1788   mem_ref_loc_p locp = NULL;
1789   for_all_locs_in_loop (loop, ref, first_mem_ref_loc_1 (&locp));
1790   return locp;
1791 }
1792 
1793 struct prev_flag_edges {
1794   /* Edge to insert new flag comparison code.  */
1795   edge append_cond_position;
1796 
1797   /* Edge for fall through from previous flag comparison.  */
1798   edge last_cond_fallthru;
1799 };
1800 
1801 /* Helper function for execute_sm.  Emit code to store TMP_VAR into
1802    MEM along edge EX.
1803 
1804    The store is only done if MEM has changed.  We do this so no
1805    changes to MEM occur on code paths that did not originally store
1806    into it.
1807 
1808    The common case for execute_sm will transform:
1809 
1810      for (...) {
1811        if (foo)
1812          stuff;
1813        else
1814          MEM = TMP_VAR;
1815      }
1816 
1817    into:
1818 
1819      lsm = MEM;
1820      for (...) {
1821        if (foo)
1822          stuff;
1823        else
1824          lsm = TMP_VAR;
1825      }
1826      MEM = lsm;
1827 
1828   This function will generate:
1829 
1830      lsm = MEM;
1831 
1832      lsm_flag = false;
1833      ...
1834      for (...) {
1835        if (foo)
1836          stuff;
1837        else {
1838          lsm = TMP_VAR;
1839          lsm_flag = true;
1840        }
1841      }
1842      if (lsm_flag)	<--
1843        MEM = lsm;	<--
1844 */
1845 
1846 static void
1847 execute_sm_if_changed (edge ex, tree mem, tree tmp_var, tree flag)
1848 {
1849   basic_block new_bb, then_bb, old_dest;
1850   bool loop_has_only_one_exit;
1851   edge then_old_edge, orig_ex = ex;
1852   gimple_stmt_iterator gsi;
1853   gimple stmt;
1854   struct prev_flag_edges *prev_edges = (struct prev_flag_edges *) ex->aux;
1855   bool irr = ex->flags & EDGE_IRREDUCIBLE_LOOP;
1856 
1857   /* ?? Insert store after previous store if applicable.  See note
1858      below.  */
1859   if (prev_edges)
1860     ex = prev_edges->append_cond_position;
1861 
1862   loop_has_only_one_exit = single_pred_p (ex->dest);
1863 
1864   if (loop_has_only_one_exit)
1865     ex = split_block_after_labels (ex->dest);
1866   else
1867     {
1868       for (gphi_iterator gpi = gsi_start_phis (ex->dest);
1869 	   !gsi_end_p (gpi); gsi_next (&gpi))
1870 	{
1871 	  gphi *phi = gpi.phi ();
1872 	  if (virtual_operand_p (gimple_phi_result (phi)))
1873 	    continue;
1874 
1875 	  /* When the destination has a non-virtual PHI node with multiple
1876 	     predecessors make sure we preserve the PHI structure by
1877 	     forcing a forwarder block so that hoisting of that PHI will
1878 	     still work.  */
1879 	  split_edge (ex);
1880 	  break;
1881 	}
1882     }
1883 
1884   old_dest = ex->dest;
1885   new_bb = split_edge (ex);
1886   then_bb = create_empty_bb (new_bb);
1887   if (irr)
1888     then_bb->flags = BB_IRREDUCIBLE_LOOP;
1889   add_bb_to_loop (then_bb, new_bb->loop_father);
1890 
1891   gsi = gsi_start_bb (new_bb);
1892   stmt = gimple_build_cond (NE_EXPR, flag, boolean_false_node,
1893 			    NULL_TREE, NULL_TREE);
1894   gsi_insert_after (&gsi, stmt, GSI_CONTINUE_LINKING);
1895 
1896   gsi = gsi_start_bb (then_bb);
1897   /* Insert actual store.  */
1898   stmt = gimple_build_assign (unshare_expr (mem), tmp_var);
1899   gsi_insert_after (&gsi, stmt, GSI_CONTINUE_LINKING);
1900 
1901   make_edge (new_bb, then_bb,
1902 	     EDGE_TRUE_VALUE | (irr ? EDGE_IRREDUCIBLE_LOOP : 0));
1903   make_edge (new_bb, old_dest,
1904 	     EDGE_FALSE_VALUE | (irr ? EDGE_IRREDUCIBLE_LOOP : 0));
1905   then_old_edge = make_edge (then_bb, old_dest,
1906 			     EDGE_FALLTHRU | (irr ? EDGE_IRREDUCIBLE_LOOP : 0));
1907 
1908   set_immediate_dominator (CDI_DOMINATORS, then_bb, new_bb);
1909 
1910   if (prev_edges)
1911     {
1912       basic_block prevbb = prev_edges->last_cond_fallthru->src;
1913       redirect_edge_succ (prev_edges->last_cond_fallthru, new_bb);
1914       set_immediate_dominator (CDI_DOMINATORS, new_bb, prevbb);
1915       set_immediate_dominator (CDI_DOMINATORS, old_dest,
1916 			       recompute_dominator (CDI_DOMINATORS, old_dest));
1917     }
1918 
1919   /* ?? Because stores may alias, they must happen in the exact
1920      sequence they originally happened.  Save the position right after
1921      the (_lsm) store we just created so we can continue appending after
1922      it and maintain the original order.  */
1923   {
1924     struct prev_flag_edges *p;
1925 
1926     if (orig_ex->aux)
1927       orig_ex->aux = NULL;
1928     alloc_aux_for_edge (orig_ex, sizeof (struct prev_flag_edges));
1929     p = (struct prev_flag_edges *) orig_ex->aux;
1930     p->append_cond_position = then_old_edge;
1931     p->last_cond_fallthru = find_edge (new_bb, old_dest);
1932     orig_ex->aux = (void *) p;
1933   }
1934 
1935   if (!loop_has_only_one_exit)
1936     for (gphi_iterator gpi = gsi_start_phis (old_dest);
1937 	 !gsi_end_p (gpi); gsi_next (&gpi))
1938       {
1939 	gphi *phi = gpi.phi ();
1940 	unsigned i;
1941 
1942 	for (i = 0; i < gimple_phi_num_args (phi); i++)
1943 	  if (gimple_phi_arg_edge (phi, i)->src == new_bb)
1944 	    {
1945 	      tree arg = gimple_phi_arg_def (phi, i);
1946 	      add_phi_arg (phi, arg, then_old_edge, UNKNOWN_LOCATION);
1947 	      update_stmt (phi);
1948 	    }
1949       }
1950   /* Remove the original fall through edge.  This was the
1951      single_succ_edge (new_bb).  */
1952   EDGE_SUCC (new_bb, 0)->flags &= ~EDGE_FALLTHRU;
1953 }
1954 
1955 /* When REF is set on the location, set flag indicating the store.  */
1956 
1957 struct sm_set_flag_if_changed
1958 {
1959   sm_set_flag_if_changed (tree flag_) : flag (flag_) {}
1960   bool operator () (mem_ref_loc_p loc);
1961   tree flag;
1962 };
1963 
1964 bool
1965 sm_set_flag_if_changed::operator () (mem_ref_loc_p loc)
1966 {
1967   /* Only set the flag for writes.  */
1968   if (is_gimple_assign (loc->stmt)
1969       && gimple_assign_lhs_ptr (loc->stmt) == loc->ref)
1970     {
1971       gimple_stmt_iterator gsi = gsi_for_stmt (loc->stmt);
1972       gimple stmt = gimple_build_assign (flag, boolean_true_node);
1973       gsi_insert_after (&gsi, stmt, GSI_CONTINUE_LINKING);
1974     }
1975   return false;
1976 }
1977 
1978 /* Helper function for execute_sm.  On every location where REF is
1979    set, set an appropriate flag indicating the store.  */
1980 
1981 static tree
1982 execute_sm_if_changed_flag_set (struct loop *loop, mem_ref_p ref)
1983 {
1984   tree flag;
1985   char *str = get_lsm_tmp_name (ref->mem.ref, ~0, "_flag");
1986   flag = create_tmp_reg (boolean_type_node, str);
1987   for_all_locs_in_loop (loop, ref, sm_set_flag_if_changed (flag));
1988   return flag;
1989 }
1990 
1991 /* Executes store motion of memory reference REF from LOOP.
1992    Exits from the LOOP are stored in EXITS.  The initialization of the
1993    temporary variable is put to the preheader of the loop, and assignments
1994    to the reference from the temporary variable are emitted to exits.  */
1995 
1996 static void
1997 execute_sm (struct loop *loop, vec<edge> exits, mem_ref_p ref)
1998 {
1999   tree tmp_var, store_flag = NULL_TREE;
2000   unsigned i;
2001   gassign *load;
2002   struct fmt_data fmt_data;
2003   edge ex;
2004   struct lim_aux_data *lim_data;
2005   bool multi_threaded_model_p = false;
2006   gimple_stmt_iterator gsi;
2007 
2008   if (dump_file && (dump_flags & TDF_DETAILS))
2009     {
2010       fprintf (dump_file, "Executing store motion of ");
2011       print_generic_expr (dump_file, ref->mem.ref, 0);
2012       fprintf (dump_file, " from loop %d\n", loop->num);
2013     }
2014 
2015   tmp_var = create_tmp_reg (TREE_TYPE (ref->mem.ref),
2016 			    get_lsm_tmp_name (ref->mem.ref, ~0));
2017 
2018   fmt_data.loop = loop;
2019   fmt_data.orig_loop = loop;
2020   for_each_index (&ref->mem.ref, force_move_till, &fmt_data);
2021 
2022   if (bb_in_transaction (loop_preheader_edge (loop)->src)
2023       || !PARAM_VALUE (PARAM_ALLOW_STORE_DATA_RACES))
2024     multi_threaded_model_p = true;
2025 
2026   if (multi_threaded_model_p)
2027     store_flag = execute_sm_if_changed_flag_set (loop, ref);
2028 
2029   rewrite_mem_refs (loop, ref, tmp_var);
2030 
2031   /* Emit the load code on a random exit edge or into the latch if
2032      the loop does not exit, so that we are sure it will be processed
2033      by move_computations after all dependencies.  */
2034   gsi = gsi_for_stmt (first_mem_ref_loc (loop, ref)->stmt);
2035 
2036   /* FIXME/TODO: For the multi-threaded variant, we could avoid this
2037      load altogether, since the store is predicated by a flag.  We
2038      could, do the load only if it was originally in the loop.  */
2039   load = gimple_build_assign (tmp_var, unshare_expr (ref->mem.ref));
2040   lim_data = init_lim_data (load);
2041   lim_data->max_loop = loop;
2042   lim_data->tgt_loop = loop;
2043   gsi_insert_before (&gsi, load, GSI_SAME_STMT);
2044 
2045   if (multi_threaded_model_p)
2046     {
2047       load = gimple_build_assign (store_flag, boolean_false_node);
2048       lim_data = init_lim_data (load);
2049       lim_data->max_loop = loop;
2050       lim_data->tgt_loop = loop;
2051       gsi_insert_before (&gsi, load, GSI_SAME_STMT);
2052     }
2053 
2054   /* Sink the store to every exit from the loop.  */
2055   FOR_EACH_VEC_ELT (exits, i, ex)
2056     if (!multi_threaded_model_p)
2057       {
2058 	gassign *store;
2059 	store = gimple_build_assign (unshare_expr (ref->mem.ref), tmp_var);
2060 	gsi_insert_on_edge (ex, store);
2061       }
2062     else
2063       execute_sm_if_changed (ex, ref->mem.ref, tmp_var, store_flag);
2064 }
2065 
2066 /* Hoists memory references MEM_REFS out of LOOP.  EXITS is the list of exit
2067    edges of the LOOP.  */
2068 
2069 static void
2070 hoist_memory_references (struct loop *loop, bitmap mem_refs,
2071 			 vec<edge> exits)
2072 {
2073   mem_ref_p ref;
2074   unsigned  i;
2075   bitmap_iterator bi;
2076 
2077   EXECUTE_IF_SET_IN_BITMAP (mem_refs, 0, i, bi)
2078     {
2079       ref = memory_accesses.refs_list[i];
2080       execute_sm (loop, exits, ref);
2081     }
2082 }
2083 
2084 struct ref_always_accessed
2085 {
2086   ref_always_accessed (struct loop *loop_, bool stored_p_)
2087       : loop (loop_), stored_p (stored_p_) {}
2088   bool operator () (mem_ref_loc_p loc);
2089   struct loop *loop;
2090   bool stored_p;
2091 };
2092 
2093 bool
2094 ref_always_accessed::operator () (mem_ref_loc_p loc)
2095 {
2096   struct loop *must_exec;
2097 
2098   if (!get_lim_data (loc->stmt))
2099     return false;
2100 
2101   /* If we require an always executed store make sure the statement
2102      stores to the reference.  */
2103   if (stored_p)
2104     {
2105       tree lhs = gimple_get_lhs (loc->stmt);
2106       if (!lhs
2107 	  || lhs != *loc->ref)
2108 	return false;
2109     }
2110 
2111   must_exec = get_lim_data (loc->stmt)->always_executed_in;
2112   if (!must_exec)
2113     return false;
2114 
2115   if (must_exec == loop
2116       || flow_loop_nested_p (must_exec, loop))
2117     return true;
2118 
2119   return false;
2120 }
2121 
2122 /* Returns true if REF is always accessed in LOOP.  If STORED_P is true
2123    make sure REF is always stored to in LOOP.  */
2124 
2125 static bool
2126 ref_always_accessed_p (struct loop *loop, mem_ref_p ref, bool stored_p)
2127 {
2128   return for_all_locs_in_loop (loop, ref,
2129 			       ref_always_accessed (loop, stored_p));
2130 }
2131 
2132 /* Returns true if REF1 and REF2 are independent.  */
2133 
2134 static bool
2135 refs_independent_p (mem_ref_p ref1, mem_ref_p ref2)
2136 {
2137   if (ref1 == ref2)
2138     return true;
2139 
2140   if (dump_file && (dump_flags & TDF_DETAILS))
2141     fprintf (dump_file, "Querying dependency of refs %u and %u: ",
2142 	     ref1->id, ref2->id);
2143 
2144   if (mem_refs_may_alias_p (ref1, ref2, &memory_accesses.ttae_cache))
2145     {
2146       if (dump_file && (dump_flags & TDF_DETAILS))
2147 	fprintf (dump_file, "dependent.\n");
2148       return false;
2149     }
2150   else
2151     {
2152       if (dump_file && (dump_flags & TDF_DETAILS))
2153 	fprintf (dump_file, "independent.\n");
2154       return true;
2155     }
2156 }
2157 
2158 /* Mark REF dependent on stores or loads (according to STORED_P) in LOOP
2159    and its super-loops.  */
2160 
2161 static void
2162 record_dep_loop (struct loop *loop, mem_ref_p ref, bool stored_p)
2163 {
2164   /* We can propagate dependent-in-loop bits up the loop
2165      hierarchy to all outer loops.  */
2166   while (loop != current_loops->tree_root
2167 	 && bitmap_set_bit (&ref->dep_loop, LOOP_DEP_BIT (loop->num, stored_p)))
2168     loop = loop_outer (loop);
2169 }
2170 
2171 /* Returns true if REF is independent on all other memory references in
2172    LOOP.  */
2173 
2174 static bool
2175 ref_indep_loop_p_1 (struct loop *loop, mem_ref_p ref, bool stored_p)
2176 {
2177   bitmap refs_to_check;
2178   unsigned i;
2179   bitmap_iterator bi;
2180   mem_ref_p aref;
2181 
2182   if (stored_p)
2183     refs_to_check = &memory_accesses.refs_in_loop[loop->num];
2184   else
2185     refs_to_check = &memory_accesses.refs_stored_in_loop[loop->num];
2186 
2187   if (bitmap_bit_p (refs_to_check, UNANALYZABLE_MEM_ID))
2188     return false;
2189 
2190   EXECUTE_IF_SET_IN_BITMAP (refs_to_check, 0, i, bi)
2191     {
2192       aref = memory_accesses.refs_list[i];
2193       if (!refs_independent_p (ref, aref))
2194 	return false;
2195     }
2196 
2197   return true;
2198 }
2199 
2200 /* Returns true if REF is independent on all other memory references in
2201    LOOP.  Wrapper over ref_indep_loop_p_1, caching its results.  */
2202 
2203 static bool
2204 ref_indep_loop_p_2 (struct loop *loop, mem_ref_p ref, bool stored_p)
2205 {
2206   stored_p |= (ref->stored && bitmap_bit_p (ref->stored, loop->num));
2207 
2208   if (bitmap_bit_p (&ref->indep_loop, LOOP_DEP_BIT (loop->num, stored_p)))
2209     return true;
2210   if (bitmap_bit_p (&ref->dep_loop, LOOP_DEP_BIT (loop->num, stored_p)))
2211     return false;
2212 
2213   struct loop *inner = loop->inner;
2214   while (inner)
2215     {
2216       if (!ref_indep_loop_p_2 (inner, ref, stored_p))
2217 	return false;
2218       inner = inner->next;
2219     }
2220 
2221   bool indep_p = ref_indep_loop_p_1 (loop, ref, stored_p);
2222 
2223   if (dump_file && (dump_flags & TDF_DETAILS))
2224     fprintf (dump_file, "Querying dependencies of ref %u in loop %d: %s\n",
2225 	     ref->id, loop->num, indep_p ? "independent" : "dependent");
2226 
2227   /* Record the computed result in the cache.  */
2228   if (indep_p)
2229     {
2230       if (bitmap_set_bit (&ref->indep_loop, LOOP_DEP_BIT (loop->num, stored_p))
2231 	  && stored_p)
2232 	{
2233 	  /* If it's independend against all refs then it's independent
2234 	     against stores, too.  */
2235 	  bitmap_set_bit (&ref->indep_loop, LOOP_DEP_BIT (loop->num, false));
2236 	}
2237     }
2238   else
2239     {
2240       record_dep_loop (loop, ref, stored_p);
2241       if (!stored_p)
2242 	{
2243 	  /* If it's dependent against stores it's dependent against
2244 	     all refs, too.  */
2245 	  record_dep_loop (loop, ref, true);
2246 	}
2247     }
2248 
2249   return indep_p;
2250 }
2251 
2252 /* Returns true if REF is independent on all other memory references in
2253    LOOP.  */
2254 
2255 static bool
2256 ref_indep_loop_p (struct loop *loop, mem_ref_p ref)
2257 {
2258   gcc_checking_assert (MEM_ANALYZABLE (ref));
2259 
2260   return ref_indep_loop_p_2 (loop, ref, false);
2261 }
2262 
2263 /* Returns true if we can perform store motion of REF from LOOP.  */
2264 
2265 static bool
2266 can_sm_ref_p (struct loop *loop, mem_ref_p ref)
2267 {
2268   tree base;
2269 
2270   /* Can't hoist unanalyzable refs.  */
2271   if (!MEM_ANALYZABLE (ref))
2272     return false;
2273 
2274   /* It should be movable.  */
2275   if (!is_gimple_reg_type (TREE_TYPE (ref->mem.ref))
2276       || TREE_THIS_VOLATILE (ref->mem.ref)
2277       || !for_each_index (&ref->mem.ref, may_move_till, loop))
2278     return false;
2279 
2280   /* If it can throw fail, we do not properly update EH info.  */
2281   if (tree_could_throw_p (ref->mem.ref))
2282     return false;
2283 
2284   /* If it can trap, it must be always executed in LOOP.
2285      Readonly memory locations may trap when storing to them, but
2286      tree_could_trap_p is a predicate for rvalues, so check that
2287      explicitly.  */
2288   base = get_base_address (ref->mem.ref);
2289   if ((tree_could_trap_p (ref->mem.ref)
2290        || (DECL_P (base) && TREE_READONLY (base)))
2291       && !ref_always_accessed_p (loop, ref, true))
2292     return false;
2293 
2294   /* And it must be independent on all other memory references
2295      in LOOP.  */
2296   if (!ref_indep_loop_p (loop, ref))
2297     return false;
2298 
2299   return true;
2300 }
2301 
2302 /* Marks the references in LOOP for that store motion should be performed
2303    in REFS_TO_SM.  SM_EXECUTED is the set of references for that store
2304    motion was performed in one of the outer loops.  */
2305 
2306 static void
2307 find_refs_for_sm (struct loop *loop, bitmap sm_executed, bitmap refs_to_sm)
2308 {
2309   bitmap refs = &memory_accesses.all_refs_stored_in_loop[loop->num];
2310   unsigned i;
2311   bitmap_iterator bi;
2312   mem_ref_p ref;
2313 
2314   EXECUTE_IF_AND_COMPL_IN_BITMAP (refs, sm_executed, 0, i, bi)
2315     {
2316       ref = memory_accesses.refs_list[i];
2317       if (can_sm_ref_p (loop, ref))
2318 	bitmap_set_bit (refs_to_sm, i);
2319     }
2320 }
2321 
2322 /* Checks whether LOOP (with exits stored in EXITS array) is suitable
2323    for a store motion optimization (i.e. whether we can insert statement
2324    on its exits).  */
2325 
2326 static bool
2327 loop_suitable_for_sm (struct loop *loop ATTRIBUTE_UNUSED,
2328 		      vec<edge> exits)
2329 {
2330   unsigned i;
2331   edge ex;
2332 
2333   FOR_EACH_VEC_ELT (exits, i, ex)
2334     if (ex->flags & (EDGE_ABNORMAL | EDGE_EH))
2335       return false;
2336 
2337   return true;
2338 }
2339 
2340 /* Try to perform store motion for all memory references modified inside
2341    LOOP.  SM_EXECUTED is the bitmap of the memory references for that
2342    store motion was executed in one of the outer loops.  */
2343 
2344 static void
2345 store_motion_loop (struct loop *loop, bitmap sm_executed)
2346 {
2347   vec<edge> exits = get_loop_exit_edges (loop);
2348   struct loop *subloop;
2349   bitmap sm_in_loop = BITMAP_ALLOC (&lim_bitmap_obstack);
2350 
2351   if (loop_suitable_for_sm (loop, exits))
2352     {
2353       find_refs_for_sm (loop, sm_executed, sm_in_loop);
2354       hoist_memory_references (loop, sm_in_loop, exits);
2355     }
2356   exits.release ();
2357 
2358   bitmap_ior_into (sm_executed, sm_in_loop);
2359   for (subloop = loop->inner; subloop != NULL; subloop = subloop->next)
2360     store_motion_loop (subloop, sm_executed);
2361   bitmap_and_compl_into (sm_executed, sm_in_loop);
2362   BITMAP_FREE (sm_in_loop);
2363 }
2364 
2365 /* Try to perform store motion for all memory references modified inside
2366    loops.  */
2367 
2368 static void
2369 store_motion (void)
2370 {
2371   struct loop *loop;
2372   bitmap sm_executed = BITMAP_ALLOC (&lim_bitmap_obstack);
2373 
2374   for (loop = current_loops->tree_root->inner; loop != NULL; loop = loop->next)
2375     store_motion_loop (loop, sm_executed);
2376 
2377   BITMAP_FREE (sm_executed);
2378   gsi_commit_edge_inserts ();
2379 }
2380 
2381 /* Fills ALWAYS_EXECUTED_IN information for basic blocks of LOOP, i.e.
2382    for each such basic block bb records the outermost loop for that execution
2383    of its header implies execution of bb.  CONTAINS_CALL is the bitmap of
2384    blocks that contain a nonpure call.  */
2385 
2386 static void
2387 fill_always_executed_in_1 (struct loop *loop, sbitmap contains_call)
2388 {
2389   basic_block bb = NULL, *bbs, last = NULL;
2390   unsigned i;
2391   edge e;
2392   struct loop *inn_loop = loop;
2393 
2394   if (ALWAYS_EXECUTED_IN (loop->header) == NULL)
2395     {
2396       bbs = get_loop_body_in_dom_order (loop);
2397 
2398       for (i = 0; i < loop->num_nodes; i++)
2399 	{
2400 	  edge_iterator ei;
2401 	  bb = bbs[i];
2402 
2403 	  if (dominated_by_p (CDI_DOMINATORS, loop->latch, bb))
2404 	    last = bb;
2405 
2406 	  if (bitmap_bit_p (contains_call, bb->index))
2407 	    break;
2408 
2409 	  FOR_EACH_EDGE (e, ei, bb->succs)
2410 	    {
2411 	      /* If there is an exit from this BB.  */
2412 	      if (!flow_bb_inside_loop_p (loop, e->dest))
2413 		break;
2414 	      /* Or we enter a possibly non-finite loop.  */
2415 	      if (flow_loop_nested_p (bb->loop_father,
2416 				      e->dest->loop_father)
2417 		  && ! finite_loop_p (e->dest->loop_father))
2418 		break;
2419 	    }
2420 	  if (e)
2421 	    break;
2422 
2423 	  /* A loop might be infinite (TODO use simple loop analysis
2424 	     to disprove this if possible).  */
2425 	  if (bb->flags & BB_IRREDUCIBLE_LOOP)
2426 	    break;
2427 
2428 	  if (!flow_bb_inside_loop_p (inn_loop, bb))
2429 	    break;
2430 
2431 	  if (bb->loop_father->header == bb)
2432 	    {
2433 	      if (!dominated_by_p (CDI_DOMINATORS, loop->latch, bb))
2434 		break;
2435 
2436 	      /* In a loop that is always entered we may proceed anyway.
2437 		 But record that we entered it and stop once we leave it.  */
2438 	      inn_loop = bb->loop_father;
2439 	    }
2440 	}
2441 
2442       while (1)
2443 	{
2444 	  SET_ALWAYS_EXECUTED_IN (last, loop);
2445 	  if (last == loop->header)
2446 	    break;
2447 	  last = get_immediate_dominator (CDI_DOMINATORS, last);
2448 	}
2449 
2450       free (bbs);
2451     }
2452 
2453   for (loop = loop->inner; loop; loop = loop->next)
2454     fill_always_executed_in_1 (loop, contains_call);
2455 }
2456 
2457 /* Fills ALWAYS_EXECUTED_IN information for basic blocks, i.e.
2458    for each such basic block bb records the outermost loop for that execution
2459    of its header implies execution of bb.  */
2460 
2461 static void
2462 fill_always_executed_in (void)
2463 {
2464   sbitmap contains_call = sbitmap_alloc (last_basic_block_for_fn (cfun));
2465   basic_block bb;
2466   struct loop *loop;
2467 
2468   bitmap_clear (contains_call);
2469   FOR_EACH_BB_FN (bb, cfun)
2470     {
2471       gimple_stmt_iterator gsi;
2472       for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
2473 	{
2474 	  if (nonpure_call_p (gsi_stmt (gsi)))
2475 	    break;
2476 	}
2477 
2478       if (!gsi_end_p (gsi))
2479 	bitmap_set_bit (contains_call, bb->index);
2480     }
2481 
2482   for (loop = current_loops->tree_root->inner; loop; loop = loop->next)
2483     fill_always_executed_in_1 (loop, contains_call);
2484 
2485   sbitmap_free (contains_call);
2486 }
2487 
2488 
2489 /* Compute the global information needed by the loop invariant motion pass.  */
2490 
2491 static void
2492 tree_ssa_lim_initialize (void)
2493 {
2494   struct loop *loop;
2495   unsigned i;
2496 
2497   bitmap_obstack_initialize (&lim_bitmap_obstack);
2498   gcc_obstack_init (&mem_ref_obstack);
2499   lim_aux_data_map = new hash_map<gimple, lim_aux_data *>;
2500 
2501   if (flag_tm)
2502     compute_transaction_bits ();
2503 
2504   alloc_aux_for_edges (0);
2505 
2506   memory_accesses.refs = new hash_table<mem_ref_hasher> (100);
2507   memory_accesses.refs_list.create (100);
2508   /* Allocate a special, unanalyzable mem-ref with ID zero.  */
2509   memory_accesses.refs_list.quick_push
2510     (mem_ref_alloc (error_mark_node, 0, UNANALYZABLE_MEM_ID));
2511 
2512   memory_accesses.refs_in_loop.create (number_of_loops (cfun));
2513   memory_accesses.refs_in_loop.quick_grow (number_of_loops (cfun));
2514   memory_accesses.refs_stored_in_loop.create (number_of_loops (cfun));
2515   memory_accesses.refs_stored_in_loop.quick_grow (number_of_loops (cfun));
2516   memory_accesses.all_refs_stored_in_loop.create (number_of_loops (cfun));
2517   memory_accesses.all_refs_stored_in_loop.quick_grow (number_of_loops (cfun));
2518 
2519   for (i = 0; i < number_of_loops (cfun); i++)
2520     {
2521       bitmap_initialize (&memory_accesses.refs_in_loop[i],
2522 			 &lim_bitmap_obstack);
2523       bitmap_initialize (&memory_accesses.refs_stored_in_loop[i],
2524 			 &lim_bitmap_obstack);
2525       bitmap_initialize (&memory_accesses.all_refs_stored_in_loop[i],
2526 			 &lim_bitmap_obstack);
2527     }
2528 
2529   memory_accesses.ttae_cache = NULL;
2530 
2531   /* Initialize bb_loop_postorder with a mapping from loop->num to
2532      its postorder index.  */
2533   i = 0;
2534   bb_loop_postorder = XNEWVEC (unsigned, number_of_loops (cfun));
2535   FOR_EACH_LOOP (loop, LI_FROM_INNERMOST)
2536     bb_loop_postorder[loop->num] = i++;
2537 }
2538 
2539 /* Cleans up after the invariant motion pass.  */
2540 
2541 static void
2542 tree_ssa_lim_finalize (void)
2543 {
2544   basic_block bb;
2545   unsigned i;
2546   mem_ref_p ref;
2547 
2548   free_aux_for_edges ();
2549 
2550   FOR_EACH_BB_FN (bb, cfun)
2551     SET_ALWAYS_EXECUTED_IN (bb, NULL);
2552 
2553   bitmap_obstack_release (&lim_bitmap_obstack);
2554   delete lim_aux_data_map;
2555 
2556   delete memory_accesses.refs;
2557   memory_accesses.refs = NULL;
2558 
2559   FOR_EACH_VEC_ELT (memory_accesses.refs_list, i, ref)
2560     memref_free (ref);
2561   memory_accesses.refs_list.release ();
2562   obstack_free (&mem_ref_obstack, NULL);
2563 
2564   memory_accesses.refs_in_loop.release ();
2565   memory_accesses.refs_stored_in_loop.release ();
2566   memory_accesses.all_refs_stored_in_loop.release ();
2567 
2568   if (memory_accesses.ttae_cache)
2569     free_affine_expand_cache (&memory_accesses.ttae_cache);
2570 
2571   free (bb_loop_postorder);
2572 }
2573 
2574 /* Moves invariants from loops.  Only "expensive" invariants are moved out --
2575    i.e. those that are likely to be win regardless of the register pressure.  */
2576 
2577 unsigned int
2578 tree_ssa_lim (void)
2579 {
2580   unsigned int todo;
2581 
2582   tree_ssa_lim_initialize ();
2583 
2584   /* Gathers information about memory accesses in the loops.  */
2585   analyze_memory_references ();
2586 
2587   /* Fills ALWAYS_EXECUTED_IN information for basic blocks.  */
2588   fill_always_executed_in ();
2589 
2590   /* For each statement determine the outermost loop in that it is
2591      invariant and cost for computing the invariant.  */
2592   invariantness_dom_walker (CDI_DOMINATORS)
2593     .walk (cfun->cfg->x_entry_block_ptr);
2594 
2595   /* Execute store motion.  Force the necessary invariants to be moved
2596      out of the loops as well.  */
2597   store_motion ();
2598 
2599   /* Move the expressions that are expensive enough.  */
2600   todo = move_computations ();
2601 
2602   tree_ssa_lim_finalize ();
2603 
2604   return todo;
2605 }
2606 
2607 /* Loop invariant motion pass.  */
2608 
2609 namespace {
2610 
2611 const pass_data pass_data_lim =
2612 {
2613   GIMPLE_PASS, /* type */
2614   "lim", /* name */
2615   OPTGROUP_LOOP, /* optinfo_flags */
2616   TV_LIM, /* tv_id */
2617   PROP_cfg, /* properties_required */
2618   0, /* properties_provided */
2619   0, /* properties_destroyed */
2620   0, /* todo_flags_start */
2621   0, /* todo_flags_finish */
2622 };
2623 
2624 class pass_lim : public gimple_opt_pass
2625 {
2626 public:
2627   pass_lim (gcc::context *ctxt)
2628     : gimple_opt_pass (pass_data_lim, ctxt)
2629   {}
2630 
2631   /* opt_pass methods: */
2632   opt_pass * clone () { return new pass_lim (m_ctxt); }
2633   virtual bool gate (function *) { return flag_tree_loop_im != 0; }
2634   virtual unsigned int execute (function *);
2635 
2636 }; // class pass_lim
2637 
2638 unsigned int
2639 pass_lim::execute (function *fun)
2640 {
2641   if (number_of_loops (fun) <= 1)
2642     return 0;
2643 
2644   return tree_ssa_lim ();
2645 }
2646 
2647 } // anon namespace
2648 
2649 gimple_opt_pass *
2650 make_pass_lim (gcc::context *ctxt)
2651 {
2652   return new pass_lim (ctxt);
2653 }
2654 
2655 
2656