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