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 (struct mem_ref *mem)
1484 {
1485   unsigned i;
1486   mem_ref_locs_p accs;
1487
1488   BITMAP_FREE (mem->stored);
1489   BITMAP_FREE (mem->indep_loop);
1490   BITMAP_FREE (mem->dep_loop);
1491   BITMAP_FREE (mem->indep_ref);
1492   BITMAP_FREE (mem->dep_ref);
1493
1494   FOR_EACH_VEC_ELT (mem_ref_locs_p, mem->accesses_in_loop, i, accs)
1495     free_mem_ref_locs (accs);
1496   VEC_free (mem_ref_locs_p, heap, mem->accesses_in_loop);
1497
1498   free (mem);
1499 }
1500
1501 /* Allocates and returns a memory reference description for MEM whose hash
1502    value is HASH and id is ID.  */
1503
1504 static mem_ref_p
1505 mem_ref_alloc (tree mem, unsigned hash, unsigned id)
1506 {
1507   mem_ref_p ref = XNEW (struct mem_ref);
1508   ref->mem = mem;
1509   ref->id = id;
1510   ref->hash = hash;
1511   ref->stored = BITMAP_ALLOC (NULL);
1512   ref->indep_loop = BITMAP_ALLOC (NULL);
1513   ref->dep_loop = BITMAP_ALLOC (NULL);
1514   ref->indep_ref = BITMAP_ALLOC (NULL);
1515   ref->dep_ref = BITMAP_ALLOC (NULL);
1516   ref->accesses_in_loop = NULL;
1517
1518   return ref;
1519 }
1520
1521 /* Allocates and returns the new list of locations.  */
1522
1523 static mem_ref_locs_p
1524 mem_ref_locs_alloc (void)
1525 {
1526   mem_ref_locs_p accs = XNEW (struct mem_ref_locs);
1527   accs->locs = NULL;
1528   return accs;
1529 }
1530
1531 /* Records memory reference location *LOC in LOOP to the memory reference
1532    description REF.  The reference occurs in statement STMT.  */
1533
1534 static void
1535 record_mem_ref_loc (mem_ref_p ref, struct loop *loop, gimple stmt, tree *loc)
1536 {
1537   mem_ref_loc_p aref = XNEW (struct mem_ref_loc);
1538   mem_ref_locs_p accs;
1539   bitmap ril = VEC_index (bitmap, memory_accesses.refs_in_loop, loop->num);
1540
1541   if (VEC_length (mem_ref_locs_p, ref->accesses_in_loop)
1542       <= (unsigned) loop->num)
1543     VEC_safe_grow_cleared (mem_ref_locs_p, heap, ref->accesses_in_loop,
1544                            loop->num + 1);
1545   accs = VEC_index (mem_ref_locs_p, ref->accesses_in_loop, loop->num);
1546   if (!accs)
1547     {
1548       accs = mem_ref_locs_alloc ();
1549       VEC_replace (mem_ref_locs_p, ref->accesses_in_loop, loop->num, accs);
1550     }
1551
1552   aref->stmt = stmt;
1553   aref->ref = loc;
1554
1555   VEC_safe_push (mem_ref_loc_p, heap, accs->locs, aref);
1556   bitmap_set_bit (ril, ref->id);
1557 }
1558
1559 /* Marks reference REF as stored in LOOP.  */
1560
1561 static void
1562 mark_ref_stored (mem_ref_p ref, struct loop *loop)
1563 {
1564   for (;
1565        loop != current_loops->tree_root
1566        && !bitmap_bit_p (ref->stored, loop->num);
1567        loop = loop_outer (loop))
1568     bitmap_set_bit (ref->stored, loop->num);
1569 }
1570
1571 /* Gathers memory references in statement STMT in LOOP, storing the
1572    information about them in the memory_accesses structure.  Marks
1573    the vops accessed through unrecognized statements there as
1574    well.  */
1575
1576 static void
1577 gather_mem_refs_stmt (struct loop *loop, gimple stmt)
1578 {
1579   tree *mem = NULL;
1580   hashval_t hash;
1581   PTR *slot;
1582   mem_ref_p ref;
1583   bool is_stored;
1584   unsigned id;
1585
1586   if (!gimple_vuse (stmt))
1587     return;
1588
1589   mem = simple_mem_ref_in_stmt (stmt, &is_stored);
1590   if (!mem)
1591     {
1592       id = VEC_length (mem_ref_p, memory_accesses.refs_list);
1593       ref = mem_ref_alloc (error_mark_node, 0, id);
1594       VEC_safe_push (mem_ref_p, heap, memory_accesses.refs_list, ref);
1595       if (dump_file && (dump_flags & TDF_DETAILS))
1596         {
1597           fprintf (dump_file, "Unanalyzed memory reference %u: ", id);
1598           print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM);
1599         }
1600       if (gimple_vdef (stmt))
1601         mark_ref_stored (ref, loop);
1602       record_mem_ref_loc (ref, loop, stmt, mem);
1603       return;
1604     }
1605
1606   hash = iterative_hash_expr (*mem, 0);
1607   slot = htab_find_slot_with_hash (memory_accesses.refs, *mem, hash, INSERT);
1608
1609   if (*slot)
1610     {
1611       ref = (mem_ref_p) *slot;
1612       id = ref->id;
1613     }
1614   else
1615     {
1616       id = VEC_length (mem_ref_p, memory_accesses.refs_list);
1617       ref = mem_ref_alloc (*mem, hash, id);
1618       VEC_safe_push (mem_ref_p, heap, memory_accesses.refs_list, ref);
1619       *slot = ref;
1620
1621       if (dump_file && (dump_flags & TDF_DETAILS))
1622         {
1623           fprintf (dump_file, "Memory reference %u: ", id);
1624           print_generic_expr (dump_file, ref->mem, TDF_SLIM);
1625           fprintf (dump_file, "\n");
1626         }
1627     }
1628
1629   if (is_stored)
1630     mark_ref_stored (ref, loop);
1631
1632   record_mem_ref_loc (ref, loop, stmt, mem);
1633   return;
1634 }
1635
1636 /* Gathers memory references in loops.  */
1637
1638 static void
1639 gather_mem_refs_in_loops (void)
1640 {
1641   gimple_stmt_iterator bsi;
1642   basic_block bb;
1643   struct loop *loop;
1644   loop_iterator li;
1645   bitmap lrefs, alrefs, alrefso;
1646
1647   FOR_EACH_BB (bb)
1648     {
1649       loop = bb->loop_father;
1650       if (loop == current_loops->tree_root)
1651         continue;
1652
1653       for (bsi = gsi_start_bb (bb); !gsi_end_p (bsi); gsi_next (&bsi))
1654         gather_mem_refs_stmt (loop, gsi_stmt (bsi));
1655     }
1656
1657   /* Propagate the information about accessed memory references up
1658      the loop hierarchy.  */
1659   FOR_EACH_LOOP (li, loop, LI_FROM_INNERMOST)
1660     {
1661       lrefs = VEC_index (bitmap, memory_accesses.refs_in_loop, loop->num);
1662       alrefs = VEC_index (bitmap, memory_accesses.all_refs_in_loop, loop->num);
1663       bitmap_ior_into (alrefs, lrefs);
1664
1665       if (loop_outer (loop) == current_loops->tree_root)
1666         continue;
1667
1668       alrefso = VEC_index (bitmap, memory_accesses.all_refs_in_loop,
1669                            loop_outer (loop)->num);
1670       bitmap_ior_into (alrefso, alrefs);
1671     }
1672 }
1673
1674 /* Create a mapping from virtual operands to references that touch them
1675    in LOOP.  */
1676
1677 static void
1678 create_vop_ref_mapping_loop (struct loop *loop)
1679 {
1680   bitmap refs = VEC_index (bitmap, memory_accesses.refs_in_loop, loop->num);
1681   struct loop *sloop;
1682   bitmap_iterator bi;
1683   unsigned i;
1684   mem_ref_p ref;
1685
1686   EXECUTE_IF_SET_IN_BITMAP (refs, 0, i, bi)
1687     {
1688       ref = VEC_index (mem_ref_p, memory_accesses.refs_list, i);
1689       for (sloop = loop; sloop != current_loops->tree_root;
1690            sloop = loop_outer (sloop))
1691         if (bitmap_bit_p (ref->stored, loop->num))
1692           {
1693             bitmap refs_stored
1694               = VEC_index (bitmap, memory_accesses.all_refs_stored_in_loop,
1695                            sloop->num);
1696             bitmap_set_bit (refs_stored, ref->id);
1697           }
1698     }
1699 }
1700
1701 /* For each non-clobbered virtual operand and each loop, record the memory
1702    references in this loop that touch the operand.  */
1703
1704 static void
1705 create_vop_ref_mapping (void)
1706 {
1707   loop_iterator li;
1708   struct loop *loop;
1709
1710   FOR_EACH_LOOP (li, loop, 0)
1711     {
1712       create_vop_ref_mapping_loop (loop);
1713     }
1714 }
1715
1716 /* Gathers information about memory accesses in the loops.  */
1717
1718 static void
1719 analyze_memory_references (void)
1720 {
1721   unsigned i;
1722   bitmap empty;
1723
1724   memory_accesses.refs = htab_create (100, memref_hash, memref_eq, NULL);
1725   memory_accesses.refs_list = NULL;
1726   memory_accesses.refs_in_loop = VEC_alloc (bitmap, heap,
1727                                             number_of_loops ());
1728   memory_accesses.all_refs_in_loop = VEC_alloc (bitmap, heap,
1729                                                 number_of_loops ());
1730   memory_accesses.all_refs_stored_in_loop = VEC_alloc (bitmap, heap,
1731                                                        number_of_loops ());
1732
1733   for (i = 0; i < number_of_loops (); i++)
1734     {
1735       empty = BITMAP_ALLOC (NULL);
1736       VEC_quick_push (bitmap, memory_accesses.refs_in_loop, empty);
1737       empty = BITMAP_ALLOC (NULL);
1738       VEC_quick_push (bitmap, memory_accesses.all_refs_in_loop, empty);
1739       empty = BITMAP_ALLOC (NULL);
1740       VEC_quick_push (bitmap, memory_accesses.all_refs_stored_in_loop, empty);
1741     }
1742
1743   memory_accesses.ttae_cache = NULL;
1744
1745   gather_mem_refs_in_loops ();
1746   create_vop_ref_mapping ();
1747 }
1748
1749 /* Returns true if MEM1 and MEM2 may alias.  TTAE_CACHE is used as a cache in
1750    tree_to_aff_combination_expand.  */
1751
1752 static bool
1753 mem_refs_may_alias_p (tree mem1, tree mem2, struct pointer_map_t **ttae_cache)
1754 {
1755   /* Perform BASE + OFFSET analysis -- if MEM1 and MEM2 are based on the same
1756      object and their offset differ in such a way that the locations cannot
1757      overlap, then they cannot alias.  */
1758   double_int size1, size2;
1759   aff_tree off1, off2;
1760
1761   /* Perform basic offset and type-based disambiguation.  */
1762   if (!refs_may_alias_p (mem1, mem2))
1763     return false;
1764
1765   /* The expansion of addresses may be a bit expensive, thus we only do
1766      the check at -O2 and higher optimization levels.  */
1767   if (optimize < 2)
1768     return true;
1769
1770   get_inner_reference_aff (mem1, &off1, &size1);
1771   get_inner_reference_aff (mem2, &off2, &size2);
1772   aff_combination_expand (&off1, ttae_cache);
1773   aff_combination_expand (&off2, ttae_cache);
1774   aff_combination_scale (&off1, double_int_minus_one);
1775   aff_combination_add (&off2, &off1);
1776
1777   if (aff_comb_cannot_overlap_p (&off2, size1, size2))
1778     return false;
1779
1780   return true;
1781 }
1782
1783 /* Rewrites location LOC by TMP_VAR.  */
1784
1785 static void
1786 rewrite_mem_ref_loc (mem_ref_loc_p loc, tree tmp_var)
1787 {
1788   mark_virtual_ops_for_renaming (loc->stmt);
1789   *loc->ref = tmp_var;
1790   update_stmt (loc->stmt);
1791 }
1792
1793 /* Adds all locations of REF in LOOP and its subloops to LOCS.  */
1794
1795 static void
1796 get_all_locs_in_loop (struct loop *loop, mem_ref_p ref,
1797                       VEC (mem_ref_loc_p, heap) **locs)
1798 {
1799   mem_ref_locs_p accs;
1800   unsigned i;
1801   mem_ref_loc_p loc;
1802   bitmap refs = VEC_index (bitmap, memory_accesses.all_refs_in_loop,
1803                            loop->num);
1804   struct loop *subloop;
1805
1806   if (!bitmap_bit_p (refs, ref->id))
1807     return;
1808
1809   if (VEC_length (mem_ref_locs_p, ref->accesses_in_loop)
1810       > (unsigned) loop->num)
1811     {
1812       accs = VEC_index (mem_ref_locs_p, ref->accesses_in_loop, loop->num);
1813       if (accs)
1814         {
1815           FOR_EACH_VEC_ELT (mem_ref_loc_p, accs->locs, i, loc)
1816             VEC_safe_push (mem_ref_loc_p, heap, *locs, loc);
1817         }
1818     }
1819
1820   for (subloop = loop->inner; subloop != NULL; subloop = subloop->next)
1821     get_all_locs_in_loop (subloop, ref, locs);
1822 }
1823
1824 /* Rewrites all references to REF in LOOP by variable TMP_VAR.  */
1825
1826 static void
1827 rewrite_mem_refs (struct loop *loop, mem_ref_p ref, tree tmp_var)
1828 {
1829   unsigned i;
1830   mem_ref_loc_p loc;
1831   VEC (mem_ref_loc_p, heap) *locs = NULL;
1832
1833   get_all_locs_in_loop (loop, ref, &locs);
1834   FOR_EACH_VEC_ELT (mem_ref_loc_p, locs, i, loc)
1835     rewrite_mem_ref_loc (loc, tmp_var);
1836   VEC_free (mem_ref_loc_p, heap, locs);
1837 }
1838
1839 /* The name and the length of the currently generated variable
1840    for lsm.  */
1841 #define MAX_LSM_NAME_LENGTH 40
1842 static char lsm_tmp_name[MAX_LSM_NAME_LENGTH + 1];
1843 static int lsm_tmp_name_length;
1844
1845 /* Adds S to lsm_tmp_name.  */
1846
1847 static void
1848 lsm_tmp_name_add (const char *s)
1849 {
1850   int l = strlen (s) + lsm_tmp_name_length;
1851   if (l > MAX_LSM_NAME_LENGTH)
1852     return;
1853
1854   strcpy (lsm_tmp_name + lsm_tmp_name_length, s);
1855   lsm_tmp_name_length = l;
1856 }
1857
1858 /* Stores the name for temporary variable that replaces REF to
1859    lsm_tmp_name.  */
1860
1861 static void
1862 gen_lsm_tmp_name (tree ref)
1863 {
1864   const char *name;
1865
1866   switch (TREE_CODE (ref))
1867     {
1868     case MEM_REF:
1869     case TARGET_MEM_REF:
1870       gen_lsm_tmp_name (TREE_OPERAND (ref, 0));
1871       lsm_tmp_name_add ("_");
1872       break;
1873
1874     case ADDR_EXPR:
1875       gen_lsm_tmp_name (TREE_OPERAND (ref, 0));
1876       break;
1877
1878     case BIT_FIELD_REF:
1879     case VIEW_CONVERT_EXPR:
1880     case ARRAY_RANGE_REF:
1881       gen_lsm_tmp_name (TREE_OPERAND (ref, 0));
1882       break;
1883
1884     case REALPART_EXPR:
1885       gen_lsm_tmp_name (TREE_OPERAND (ref, 0));
1886       lsm_tmp_name_add ("_RE");
1887       break;
1888
1889     case IMAGPART_EXPR:
1890       gen_lsm_tmp_name (TREE_OPERAND (ref, 0));
1891       lsm_tmp_name_add ("_IM");
1892       break;
1893
1894     case COMPONENT_REF:
1895       gen_lsm_tmp_name (TREE_OPERAND (ref, 0));
1896       lsm_tmp_name_add ("_");
1897       name = get_name (TREE_OPERAND (ref, 1));
1898       if (!name)
1899         name = "F";
1900       lsm_tmp_name_add (name);
1901       break;
1902
1903     case ARRAY_REF:
1904       gen_lsm_tmp_name (TREE_OPERAND (ref, 0));
1905       lsm_tmp_name_add ("_I");
1906       break;
1907
1908     case SSA_NAME:
1909       ref = SSA_NAME_VAR (ref);
1910       /* Fallthru.  */
1911
1912     case VAR_DECL:
1913     case PARM_DECL:
1914       name = get_name (ref);
1915       if (!name)
1916         name = "D";
1917       lsm_tmp_name_add (name);
1918       break;
1919
1920     case STRING_CST:
1921       lsm_tmp_name_add ("S");
1922       break;
1923
1924     case RESULT_DECL:
1925       lsm_tmp_name_add ("R");
1926       break;
1927
1928     case INTEGER_CST:
1929       /* Nothing.  */
1930       break;
1931
1932     default:
1933       gcc_unreachable ();
1934     }
1935 }
1936
1937 /* Determines name for temporary variable that replaces REF.
1938    The name is accumulated into the lsm_tmp_name variable.
1939    N is added to the name of the temporary.  */
1940
1941 char *
1942 get_lsm_tmp_name (tree ref, unsigned n)
1943 {
1944   char ns[2];
1945
1946   lsm_tmp_name_length = 0;
1947   gen_lsm_tmp_name (ref);
1948   lsm_tmp_name_add ("_lsm");
1949   if (n < 10)
1950     {
1951       ns[0] = '0' + n;
1952       ns[1] = 0;
1953       lsm_tmp_name_add (ns);
1954     }
1955   return lsm_tmp_name;
1956 }
1957
1958 struct prev_flag_edges {
1959   /* Edge to insert new flag comparison code.  */
1960   edge append_cond_position;
1961
1962   /* Edge for fall through from previous flag comparison.  */
1963   edge last_cond_fallthru;
1964 };
1965
1966 /* Helper function for execute_sm.  Emit code to store TMP_VAR into
1967    MEM along edge EX.
1968
1969    The store is only done if MEM has changed.  We do this so no
1970    changes to MEM occur on code paths that did not originally store
1971    into it.
1972
1973    The common case for execute_sm will transform:
1974
1975      for (...) {
1976        if (foo)
1977          stuff;
1978        else
1979          MEM = TMP_VAR;
1980      }
1981
1982    into:
1983
1984      lsm = MEM;
1985      for (...) {
1986        if (foo)
1987          stuff;
1988        else
1989          lsm = TMP_VAR;
1990      }
1991      MEM = lsm;
1992
1993   This function will generate:
1994
1995      lsm = MEM;
1996
1997      lsm_flag = false;
1998      ...
1999      for (...) {
2000        if (foo)
2001          stuff;
2002        else {
2003          lsm = TMP_VAR;
2004          lsm_flag = true;
2005        }
2006      }
2007      if (lsm_flag)      <--
2008        MEM = lsm;       <--
2009 */
2010
2011 static void
2012 execute_sm_if_changed (edge ex, tree mem, tree tmp_var, tree flag)
2013 {
2014   basic_block new_bb, then_bb, old_dest;
2015   bool loop_has_only_one_exit;
2016   edge then_old_edge, orig_ex = ex;
2017   gimple_stmt_iterator gsi;
2018   gimple stmt;
2019   struct prev_flag_edges *prev_edges = (struct prev_flag_edges *) ex->aux;
2020
2021   /* ?? Insert store after previous store if applicable.  See note
2022      below.  */
2023   if (prev_edges)
2024     ex = prev_edges->append_cond_position;
2025
2026   loop_has_only_one_exit = single_pred_p (ex->dest);
2027
2028   if (loop_has_only_one_exit)
2029     ex = split_block_after_labels (ex->dest);
2030
2031   old_dest = ex->dest;
2032   new_bb = split_edge (ex);
2033   then_bb = create_empty_bb (new_bb);
2034   if (current_loops && new_bb->loop_father)
2035     add_bb_to_loop (then_bb, new_bb->loop_father);
2036
2037   gsi = gsi_start_bb (new_bb);
2038   stmt = gimple_build_cond (NE_EXPR, flag, boolean_false_node,
2039                             NULL_TREE, NULL_TREE);
2040   gsi_insert_after (&gsi, stmt, GSI_CONTINUE_LINKING);
2041
2042   gsi = gsi_start_bb (then_bb);
2043   /* Insert actual store.  */
2044   stmt = gimple_build_assign (unshare_expr (mem), tmp_var);
2045   gsi_insert_after (&gsi, stmt, GSI_CONTINUE_LINKING);
2046
2047   make_edge (new_bb, then_bb, EDGE_TRUE_VALUE);
2048   make_edge (new_bb, old_dest, EDGE_FALSE_VALUE);
2049   then_old_edge = make_edge (then_bb, old_dest, EDGE_FALLTHRU);
2050
2051   set_immediate_dominator (CDI_DOMINATORS, then_bb, new_bb);
2052
2053   if (prev_edges)
2054     {
2055       basic_block prevbb = prev_edges->last_cond_fallthru->src;
2056       redirect_edge_succ (prev_edges->last_cond_fallthru, new_bb);
2057       set_immediate_dominator (CDI_DOMINATORS, new_bb, prevbb);
2058       set_immediate_dominator (CDI_DOMINATORS, old_dest,
2059                                recompute_dominator (CDI_DOMINATORS, old_dest));
2060     }
2061
2062   /* ?? Because stores may alias, they must happen in the exact
2063      sequence they originally happened.  Save the position right after
2064      the (_lsm) store we just created so we can continue appending after
2065      it and maintain the original order.  */
2066   {
2067     struct prev_flag_edges *p;
2068
2069     if (orig_ex->aux)
2070       orig_ex->aux = NULL;
2071     alloc_aux_for_edge (orig_ex, sizeof (struct prev_flag_edges));
2072     p = (struct prev_flag_edges *) orig_ex->aux;
2073     p->append_cond_position = then_old_edge;
2074     p->last_cond_fallthru = find_edge (new_bb, old_dest);
2075     orig_ex->aux = (void *) p;
2076   }
2077
2078   if (!loop_has_only_one_exit)
2079     for (gsi = gsi_start_phis (old_dest); !gsi_end_p (gsi); gsi_next (&gsi))
2080       {
2081         gimple phi = gsi_stmt (gsi);
2082         unsigned i;
2083
2084         for (i = 0; i < gimple_phi_num_args (phi); i++)
2085           if (gimple_phi_arg_edge (phi, i)->src == new_bb)
2086             {
2087               tree arg = gimple_phi_arg_def (phi, i);
2088               add_phi_arg (phi, arg, then_old_edge, UNKNOWN_LOCATION);
2089               update_stmt (phi);
2090             }
2091       }
2092   /* Remove the original fall through edge.  This was the
2093      single_succ_edge (new_bb).  */
2094   EDGE_SUCC (new_bb, 0)->flags &= ~EDGE_FALLTHRU;
2095 }
2096
2097 /* Helper function for execute_sm.  On every location where REF is
2098    set, set an appropriate flag indicating the store.  */
2099
2100 static tree
2101 execute_sm_if_changed_flag_set (struct loop *loop, mem_ref_p ref)
2102 {
2103   unsigned i;
2104   mem_ref_loc_p loc;
2105   tree flag;
2106   VEC (mem_ref_loc_p, heap) *locs = NULL;
2107   char *str = get_lsm_tmp_name (ref->mem, ~0);
2108
2109   lsm_tmp_name_add ("_flag");
2110   flag = make_rename_temp (boolean_type_node, str);
2111   get_all_locs_in_loop (loop, ref, &locs);
2112   FOR_EACH_VEC_ELT (mem_ref_loc_p, locs, i, loc)
2113     {
2114       gimple_stmt_iterator gsi;
2115       gimple stmt;
2116
2117       gsi = gsi_for_stmt (loc->stmt);
2118       stmt = gimple_build_assign (flag, boolean_true_node);
2119       gsi_insert_after (&gsi, stmt, GSI_CONTINUE_LINKING);
2120     }
2121   VEC_free (mem_ref_loc_p, heap, locs);
2122   return flag;
2123 }
2124
2125 /* Executes store motion of memory reference REF from LOOP.
2126    Exits from the LOOP are stored in EXITS.  The initialization of the
2127    temporary variable is put to the preheader of the loop, and assignments
2128    to the reference from the temporary variable are emitted to exits.  */
2129
2130 static void
2131 execute_sm (struct loop *loop, VEC (edge, heap) *exits, mem_ref_p ref)
2132 {
2133   tree tmp_var, store_flag;
2134   unsigned i;
2135   gimple load;
2136   struct fmt_data fmt_data;
2137   edge ex, latch_edge;
2138   struct lim_aux_data *lim_data;
2139   bool multi_threaded_model_p = false;
2140
2141   if (dump_file && (dump_flags & TDF_DETAILS))
2142     {
2143       fprintf (dump_file, "Executing store motion of ");
2144       print_generic_expr (dump_file, ref->mem, 0);
2145       fprintf (dump_file, " from loop %d\n", loop->num);
2146     }
2147
2148   tmp_var = make_rename_temp (TREE_TYPE (ref->mem),
2149                               get_lsm_tmp_name (ref->mem, ~0));
2150
2151   fmt_data.loop = loop;
2152   fmt_data.orig_loop = loop;
2153   for_each_index (&ref->mem, force_move_till, &fmt_data);
2154
2155   if (block_in_transaction (loop_preheader_edge (loop)->src)
2156       || !PARAM_VALUE (PARAM_ALLOW_STORE_DATA_RACES))
2157     multi_threaded_model_p = true;
2158
2159   if (multi_threaded_model_p)
2160     store_flag = execute_sm_if_changed_flag_set (loop, ref);
2161
2162   rewrite_mem_refs (loop, ref, tmp_var);
2163
2164   /* Emit the load code into the latch, so that we are sure it will
2165      be processed after all dependencies.  */
2166   latch_edge = loop_latch_edge (loop);
2167
2168   /* FIXME/TODO: For the multi-threaded variant, we could avoid this
2169      load altogether, since the store is predicated by a flag.  We
2170      could, do the load only if it was originally in the loop.  */
2171   load = gimple_build_assign (tmp_var, unshare_expr (ref->mem));
2172   lim_data = init_lim_data (load);
2173   lim_data->max_loop = loop;
2174   lim_data->tgt_loop = loop;
2175   gsi_insert_on_edge (latch_edge, load);
2176
2177   if (multi_threaded_model_p)
2178     {
2179       load = gimple_build_assign (store_flag, boolean_false_node);
2180       lim_data = init_lim_data (load);
2181       lim_data->max_loop = loop;
2182       lim_data->tgt_loop = loop;
2183       gsi_insert_on_edge (latch_edge, load);
2184     }
2185
2186   /* Sink the store to every exit from the loop.  */
2187   FOR_EACH_VEC_ELT (edge, exits, i, ex)
2188     if (!multi_threaded_model_p)
2189       {
2190         gimple store;
2191         store = gimple_build_assign (unshare_expr (ref->mem), tmp_var);
2192         gsi_insert_on_edge (ex, store);
2193       }
2194     else
2195       execute_sm_if_changed (ex, ref->mem, tmp_var, store_flag);
2196 }
2197
2198 /* Hoists memory references MEM_REFS out of LOOP.  EXITS is the list of exit
2199    edges of the LOOP.  */
2200
2201 static void
2202 hoist_memory_references (struct loop *loop, bitmap mem_refs,
2203                          VEC (edge, heap) *exits)
2204 {
2205   mem_ref_p ref;
2206   unsigned  i;
2207   bitmap_iterator bi;
2208
2209   EXECUTE_IF_SET_IN_BITMAP (mem_refs, 0, i, bi)
2210     {
2211       ref = VEC_index (mem_ref_p, memory_accesses.refs_list, i);
2212       execute_sm (loop, exits, ref);
2213     }
2214 }
2215
2216 /* Returns true if REF is always accessed in LOOP.  If STORED_P is true
2217    make sure REF is always stored to in LOOP.  */
2218
2219 static bool
2220 ref_always_accessed_p (struct loop *loop, mem_ref_p ref, bool stored_p)
2221 {
2222   VEC (mem_ref_loc_p, heap) *locs = NULL;
2223   unsigned i;
2224   mem_ref_loc_p loc;
2225   bool ret = false;
2226   struct loop *must_exec;
2227   tree base;
2228
2229   base = get_base_address (ref->mem);
2230   if (INDIRECT_REF_P (base)
2231       || TREE_CODE (base) == MEM_REF)
2232     base = TREE_OPERAND (base, 0);
2233
2234   get_all_locs_in_loop (loop, ref, &locs);
2235   FOR_EACH_VEC_ELT (mem_ref_loc_p, locs, i, loc)
2236     {
2237       if (!get_lim_data (loc->stmt))
2238         continue;
2239
2240       /* If we require an always executed store make sure the statement
2241          stores to the reference.  */
2242       if (stored_p)
2243         {
2244           tree lhs;
2245           if (!gimple_get_lhs (loc->stmt))
2246             continue;
2247           lhs = get_base_address (gimple_get_lhs (loc->stmt));
2248           if (!lhs)
2249             continue;
2250           if (INDIRECT_REF_P (lhs)
2251               || TREE_CODE (lhs) == MEM_REF)
2252             lhs = TREE_OPERAND (lhs, 0);
2253           if (lhs != base)
2254             continue;
2255         }
2256
2257       must_exec = get_lim_data (loc->stmt)->always_executed_in;
2258       if (!must_exec)
2259         continue;
2260
2261       if (must_exec == loop
2262           || flow_loop_nested_p (must_exec, loop))
2263         {
2264           ret = true;
2265           break;
2266         }
2267     }
2268   VEC_free (mem_ref_loc_p, heap, locs);
2269
2270   return ret;
2271 }
2272
2273 /* Returns true if REF1 and REF2 are independent.  */
2274
2275 static bool
2276 refs_independent_p (mem_ref_p ref1, mem_ref_p ref2)
2277 {
2278   if (ref1 == ref2
2279       || bitmap_bit_p (ref1->indep_ref, ref2->id))
2280     return true;
2281   if (bitmap_bit_p (ref1->dep_ref, ref2->id))
2282     return false;
2283   if (!MEM_ANALYZABLE (ref1)
2284       || !MEM_ANALYZABLE (ref2))
2285     return false;
2286
2287   if (dump_file && (dump_flags & TDF_DETAILS))
2288     fprintf (dump_file, "Querying dependency of refs %u and %u: ",
2289              ref1->id, ref2->id);
2290
2291   if (mem_refs_may_alias_p (ref1->mem, ref2->mem,
2292                             &memory_accesses.ttae_cache))
2293     {
2294       bitmap_set_bit (ref1->dep_ref, ref2->id);
2295       bitmap_set_bit (ref2->dep_ref, ref1->id);
2296       if (dump_file && (dump_flags & TDF_DETAILS))
2297         fprintf (dump_file, "dependent.\n");
2298       return false;
2299     }
2300   else
2301     {
2302       bitmap_set_bit (ref1->indep_ref, ref2->id);
2303       bitmap_set_bit (ref2->indep_ref, ref1->id);
2304       if (dump_file && (dump_flags & TDF_DETAILS))
2305         fprintf (dump_file, "independent.\n");
2306       return true;
2307     }
2308 }
2309
2310 /* Records the information whether REF is independent in LOOP (according
2311    to INDEP).  */
2312
2313 static void
2314 record_indep_loop (struct loop *loop, mem_ref_p ref, bool indep)
2315 {
2316   if (indep)
2317     bitmap_set_bit (ref->indep_loop, loop->num);
2318   else
2319     bitmap_set_bit (ref->dep_loop, loop->num);
2320 }
2321
2322 /* Returns true if REF is independent on all other memory references in
2323    LOOP.  */
2324
2325 static bool
2326 ref_indep_loop_p_1 (struct loop *loop, mem_ref_p ref)
2327 {
2328   bitmap refs_to_check;
2329   unsigned i;
2330   bitmap_iterator bi;
2331   bool ret = true, stored = bitmap_bit_p (ref->stored, loop->num);
2332   mem_ref_p aref;
2333
2334   if (stored)
2335     refs_to_check = VEC_index (bitmap,
2336                                memory_accesses.all_refs_in_loop, loop->num);
2337   else
2338     refs_to_check = VEC_index (bitmap,
2339                                memory_accesses.all_refs_stored_in_loop,
2340                                loop->num);
2341
2342   EXECUTE_IF_SET_IN_BITMAP (refs_to_check, 0, i, bi)
2343     {
2344       aref = VEC_index (mem_ref_p, memory_accesses.refs_list, i);
2345       if (!MEM_ANALYZABLE (aref)
2346           || !refs_independent_p (ref, aref))
2347         {
2348           ret = false;
2349           record_indep_loop (loop, aref, false);
2350           break;
2351         }
2352     }
2353
2354   return ret;
2355 }
2356
2357 /* Returns true if REF is independent on all other memory references in
2358    LOOP.  Wrapper over ref_indep_loop_p_1, caching its results.  */
2359
2360 static bool
2361 ref_indep_loop_p (struct loop *loop, mem_ref_p ref)
2362 {
2363   bool ret;
2364
2365   if (bitmap_bit_p (ref->indep_loop, loop->num))
2366     return true;
2367   if (bitmap_bit_p (ref->dep_loop, loop->num))
2368     return false;
2369
2370   ret = ref_indep_loop_p_1 (loop, ref);
2371
2372   if (dump_file && (dump_flags & TDF_DETAILS))
2373     fprintf (dump_file, "Querying dependencies of ref %u in loop %d: %s\n",
2374              ref->id, loop->num, ret ? "independent" : "dependent");
2375
2376   record_indep_loop (loop, ref, ret);
2377
2378   return ret;
2379 }
2380
2381 /* Returns true if we can perform store motion of REF from LOOP.  */
2382
2383 static bool
2384 can_sm_ref_p (struct loop *loop, mem_ref_p ref)
2385 {
2386   tree base;
2387
2388   /* Can't hoist unanalyzable refs.  */
2389   if (!MEM_ANALYZABLE (ref))
2390     return false;
2391
2392   /* Unless the reference is stored in the loop, there is nothing to do.  */
2393   if (!bitmap_bit_p (ref->stored, loop->num))
2394     return false;
2395
2396   /* It should be movable.  */
2397   if (!is_gimple_reg_type (TREE_TYPE (ref->mem))
2398       || TREE_THIS_VOLATILE (ref->mem)
2399       || !for_each_index (&ref->mem, may_move_till, loop))
2400     return false;
2401
2402   /* If it can throw fail, we do not properly update EH info.  */
2403   if (tree_could_throw_p (ref->mem))
2404     return false;
2405
2406   /* If it can trap, it must be always executed in LOOP.
2407      Readonly memory locations may trap when storing to them, but
2408      tree_could_trap_p is a predicate for rvalues, so check that
2409      explicitly.  */
2410   base = get_base_address (ref->mem);
2411   if ((tree_could_trap_p (ref->mem)
2412        || (DECL_P (base) && TREE_READONLY (base)))
2413       && !ref_always_accessed_p (loop, ref, true))
2414     return false;
2415
2416   /* And it must be independent on all other memory references
2417      in LOOP.  */
2418   if (!ref_indep_loop_p (loop, ref))
2419     return false;
2420
2421   return true;
2422 }
2423
2424 /* Marks the references in LOOP for that store motion should be performed
2425    in REFS_TO_SM.  SM_EXECUTED is the set of references for that store
2426    motion was performed in one of the outer loops.  */
2427
2428 static void
2429 find_refs_for_sm (struct loop *loop, bitmap sm_executed, bitmap refs_to_sm)
2430 {
2431   bitmap refs = VEC_index (bitmap, memory_accesses.all_refs_in_loop,
2432                            loop->num);
2433   unsigned i;
2434   bitmap_iterator bi;
2435   mem_ref_p ref;
2436
2437   EXECUTE_IF_AND_COMPL_IN_BITMAP (refs, sm_executed, 0, i, bi)
2438     {
2439       ref = VEC_index (mem_ref_p, memory_accesses.refs_list, i);
2440       if (can_sm_ref_p (loop, ref))
2441         bitmap_set_bit (refs_to_sm, i);
2442     }
2443 }
2444
2445 /* Checks whether LOOP (with exits stored in EXITS array) is suitable
2446    for a store motion optimization (i.e. whether we can insert statement
2447    on its exits).  */
2448
2449 static bool
2450 loop_suitable_for_sm (struct loop *loop ATTRIBUTE_UNUSED,
2451                       VEC (edge, heap) *exits)
2452 {
2453   unsigned i;
2454   edge ex;
2455
2456   FOR_EACH_VEC_ELT (edge, exits, i, ex)
2457     if (ex->flags & (EDGE_ABNORMAL | EDGE_EH))
2458       return false;
2459
2460   return true;
2461 }
2462
2463 /* Try to perform store motion for all memory references modified inside
2464    LOOP.  SM_EXECUTED is the bitmap of the memory references for that
2465    store motion was executed in one of the outer loops.  */
2466
2467 static void
2468 store_motion_loop (struct loop *loop, bitmap sm_executed)
2469 {
2470   VEC (edge, heap) *exits = get_loop_exit_edges (loop);
2471   struct loop *subloop;
2472   bitmap sm_in_loop = BITMAP_ALLOC (NULL);
2473
2474   if (loop_suitable_for_sm (loop, exits))
2475     {
2476       find_refs_for_sm (loop, sm_executed, sm_in_loop);
2477       hoist_memory_references (loop, sm_in_loop, exits);
2478     }
2479   VEC_free (edge, heap, exits);
2480
2481   bitmap_ior_into (sm_executed, sm_in_loop);
2482   for (subloop = loop->inner; subloop != NULL; subloop = subloop->next)
2483     store_motion_loop (subloop, sm_executed);
2484   bitmap_and_compl_into (sm_executed, sm_in_loop);
2485   BITMAP_FREE (sm_in_loop);
2486 }
2487
2488 /* Try to perform store motion for all memory references modified inside
2489    loops.  */
2490
2491 static void
2492 store_motion (void)
2493 {
2494   struct loop *loop;
2495   bitmap sm_executed = BITMAP_ALLOC (NULL);
2496
2497   for (loop = current_loops->tree_root->inner; loop != NULL; loop = loop->next)
2498     store_motion_loop (loop, sm_executed);
2499
2500   BITMAP_FREE (sm_executed);
2501   gsi_commit_edge_inserts ();
2502 }
2503
2504 /* Fills ALWAYS_EXECUTED_IN information for basic blocks of LOOP, i.e.
2505    for each such basic block bb records the outermost loop for that execution
2506    of its header implies execution of bb.  CONTAINS_CALL is the bitmap of
2507    blocks that contain a nonpure call.  */
2508
2509 static void
2510 fill_always_executed_in (struct loop *loop, sbitmap contains_call)
2511 {
2512   basic_block bb = NULL, *bbs, last = NULL;
2513   unsigned i;
2514   edge e;
2515   struct loop *inn_loop = loop;
2516
2517   if (ALWAYS_EXECUTED_IN (loop->header) == NULL)
2518     {
2519       bbs = get_loop_body_in_dom_order (loop);
2520
2521       for (i = 0; i < loop->num_nodes; i++)
2522         {
2523           edge_iterator ei;
2524           bb = bbs[i];
2525
2526           if (dominated_by_p (CDI_DOMINATORS, loop->latch, bb))
2527             last = bb;
2528
2529           if (TEST_BIT (contains_call, bb->index))
2530             break;
2531
2532           FOR_EACH_EDGE (e, ei, bb->succs)
2533             if (!flow_bb_inside_loop_p (loop, e->dest))
2534               break;
2535           if (e)
2536             break;
2537
2538           /* A loop might be infinite (TODO use simple loop analysis
2539              to disprove this if possible).  */
2540           if (bb->flags & BB_IRREDUCIBLE_LOOP)
2541             break;
2542
2543           if (!flow_bb_inside_loop_p (inn_loop, bb))
2544             break;
2545
2546           if (bb->loop_father->header == bb)
2547             {
2548               if (!dominated_by_p (CDI_DOMINATORS, loop->latch, bb))
2549                 break;
2550
2551               /* In a loop that is always entered we may proceed anyway.
2552                  But record that we entered it and stop once we leave it.  */
2553               inn_loop = bb->loop_father;
2554             }
2555         }
2556
2557       while (1)
2558         {
2559           SET_ALWAYS_EXECUTED_IN (last, loop);
2560           if (last == loop->header)
2561             break;
2562           last = get_immediate_dominator (CDI_DOMINATORS, last);
2563         }
2564
2565       free (bbs);
2566     }
2567
2568   for (loop = loop->inner; loop; loop = loop->next)
2569     fill_always_executed_in (loop, contains_call);
2570 }
2571
2572 /* Compute the global information needed by the loop invariant motion pass.  */
2573
2574 static void
2575 tree_ssa_lim_initialize (void)
2576 {
2577   sbitmap contains_call = sbitmap_alloc (last_basic_block);
2578   gimple_stmt_iterator bsi;
2579   struct loop *loop;
2580   basic_block bb;
2581
2582   sbitmap_zero (contains_call);
2583   FOR_EACH_BB (bb)
2584     {
2585       for (bsi = gsi_start_bb (bb); !gsi_end_p (bsi); gsi_next (&bsi))
2586         {
2587           if (nonpure_call_p (gsi_stmt (bsi)))
2588             break;
2589         }
2590
2591       if (!gsi_end_p (bsi))
2592         SET_BIT (contains_call, bb->index);
2593     }
2594
2595   for (loop = current_loops->tree_root->inner; loop; loop = loop->next)
2596     fill_always_executed_in (loop, contains_call);
2597
2598   sbitmap_free (contains_call);
2599
2600   lim_aux_data_map = pointer_map_create ();
2601
2602   if (flag_tm)
2603     compute_transaction_bits ();
2604
2605   alloc_aux_for_edges (0);
2606 }
2607
2608 /* Cleans up after the invariant motion pass.  */
2609
2610 static void
2611 tree_ssa_lim_finalize (void)
2612 {
2613   basic_block bb;
2614   unsigned i;
2615   bitmap b;
2616   mem_ref_p ref;
2617
2618   free_aux_for_edges ();
2619
2620   FOR_EACH_BB (bb)
2621     SET_ALWAYS_EXECUTED_IN (bb, NULL);
2622
2623   pointer_map_destroy (lim_aux_data_map);
2624
2625   htab_delete (memory_accesses.refs);
2626
2627   FOR_EACH_VEC_ELT (mem_ref_p, memory_accesses.refs_list, i, ref)
2628     memref_free (ref);
2629   VEC_free (mem_ref_p, heap, memory_accesses.refs_list);
2630
2631   FOR_EACH_VEC_ELT (bitmap, memory_accesses.refs_in_loop, i, b)
2632     BITMAP_FREE (b);
2633   VEC_free (bitmap, heap, memory_accesses.refs_in_loop);
2634
2635   FOR_EACH_VEC_ELT (bitmap, memory_accesses.all_refs_in_loop, i, b)
2636     BITMAP_FREE (b);
2637   VEC_free (bitmap, heap, memory_accesses.all_refs_in_loop);
2638
2639   FOR_EACH_VEC_ELT (bitmap, memory_accesses.all_refs_stored_in_loop, i, b)
2640     BITMAP_FREE (b);
2641   VEC_free (bitmap, heap, memory_accesses.all_refs_stored_in_loop);
2642
2643   if (memory_accesses.ttae_cache)
2644     free_affine_expand_cache (&memory_accesses.ttae_cache);
2645 }
2646
2647 /* Moves invariants from loops.  Only "expensive" invariants are moved out --
2648    i.e. those that are likely to be win regardless of the register pressure.  */
2649
2650 unsigned int
2651 tree_ssa_lim (void)
2652 {
2653   unsigned int todo;
2654
2655   tree_ssa_lim_initialize ();
2656
2657   /* Gathers information about memory accesses in the loops.  */
2658   analyze_memory_references ();
2659
2660   /* For each statement determine the outermost loop in that it is
2661      invariant and cost for computing the invariant.  */
2662   determine_invariantness ();
2663
2664   /* Execute store motion.  Force the necessary invariants to be moved
2665      out of the loops as well.  */
2666   store_motion ();
2667
2668   /* Move the expressions that are expensive enough.  */
2669   todo = move_computations ();
2670
2671   tree_ssa_lim_finalize ();
2672
2673   return todo;
2674 }