OSDN Git Service

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