OSDN Git Service

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