OSDN Git Service

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