OSDN Git Service

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