OSDN Git Service

Emit DW_AT_ranges for inlined subroutines that contain disjoint blocks.
[pf3gnuchains/gcc-fork.git] / gcc / tree-ssa-loop-im.c
1 /* Loop invariant motion.
2    Copyright (C) 2003, 2004, 2005 Free Software Foundation, Inc.
3    
4 This file is part of GCC.
5    
6 GCC is free software; you can redistribute it and/or modify it
7 under the terms of the GNU General Public License as published by the
8 Free Software Foundation; either version 2, or (at your option) any
9 later version.
10    
11 GCC is distributed in the hope that it will be useful, but WITHOUT
12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 for more details.
15    
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING.  If not, write to the Free
18 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
19 02111-1307, USA.  */
20
21 #include "config.h"
22 #include "system.h"
23 #include "coretypes.h"
24 #include "tm.h"
25 #include "tree.h"
26 #include "rtl.h"
27 #include "tm_p.h"
28 #include "hard-reg-set.h"
29 #include "basic-block.h"
30 #include "output.h"
31 #include "diagnostic.h"
32 #include "tree-flow.h"
33 #include "tree-dump.h"
34 #include "timevar.h"
35 #include "cfgloop.h"
36 #include "domwalk.h"
37 #include "params.h"
38 #include "tree-pass.h"
39 #include "flags.h"
40
41 /* TODO:  Support for predicated code motion.  I.e.
42
43    while (1)
44      {
45        if (cond)
46          {
47            a = inv;
48            something;
49          }
50      }
51
52    Where COND and INV are is invariants, but evaluating INV may trap or be
53    invalid from some other reason if !COND.  This may be transformed to
54
55    if (cond)
56      a = inv;
57    while (1)
58      {
59        if (cond)
60          something;
61      }  */
62
63 /* A type for the list of statements that have to be moved in order to be able
64    to hoist an invariant computation.  */
65
66 struct depend
67 {
68   tree stmt;
69   struct depend *next;
70 };
71
72 /* The auxiliary data kept for each statement.  */
73
74 struct lim_aux_data
75 {
76   struct loop *max_loop;        /* The outermost loop in that the statement
77                                    is invariant.  */
78
79   struct loop *tgt_loop;        /* The loop out of that we want to move the
80                                    invariant.  */
81
82   struct loop *always_executed_in;
83                                 /* The outermost loop for that we are sure
84                                    the statement is executed if the loop
85                                    is entered.  */
86
87   bool sm_done;                 /* True iff the store motion for a memory
88                                    reference in the statement has already
89                                    been executed.  */
90
91   unsigned cost;                /* Cost of the computation performed by the
92                                    statement.  */
93
94   struct depend *depends;       /* List of statements that must be also hoisted
95                                    out of the loop when this statement is
96                                    hoisted; i.e. those that define the operands
97                                    of the statement and are inside of the
98                                    MAX_LOOP loop.  */
99 };
100
101 #define LIM_DATA(STMT) (TREE_CODE (STMT) == PHI_NODE \
102                         ? NULL \
103                         : (struct lim_aux_data *) (stmt_ann (STMT)->common.aux))
104
105 /* Description of a memory reference for store motion.  */
106
107 struct mem_ref
108 {
109   tree *ref;                    /* The reference itself.  */
110   tree stmt;                    /* The statement in that it occurs.  */
111   struct mem_ref *next;         /* Next use in the chain.  */
112 };
113
114 /* Minimum cost of an expensive expression.  */
115 #define LIM_EXPENSIVE ((unsigned) PARAM_VALUE (PARAM_LIM_EXPENSIVE))
116
117 /* The outermost loop for that execution of the header guarantees that the
118    block will be executed.  */
119 #define ALWAYS_EXECUTED_IN(BB) ((struct loop *) (BB)->aux)
120
121 static unsigned max_stmt_uid;   /* Maximal uid of a statement.  Uids to phi
122                                    nodes are assigned using the versions of
123                                    ssa names they define.  */
124
125 /* Returns uid of statement STMT.  */
126
127 static unsigned
128 get_stmt_uid (tree stmt)
129 {
130   if (TREE_CODE (stmt) == PHI_NODE)
131     return SSA_NAME_VERSION (PHI_RESULT (stmt)) + max_stmt_uid;
132
133   return stmt_ann (stmt)->uid;
134 }
135
136 /* Calls CBCK for each index in memory reference ADDR_P.  There are two
137    kinds situations handled; in each of these cases, the memory reference
138    and DATA are passed to the callback:
139    
140    Access to an array: ARRAY_{RANGE_}REF (base, index).  In this case we also
141    pass the pointer to the index to the callback.
142
143    Pointer dereference: INDIRECT_REF (addr).  In this case we also pass the
144    pointer to addr to the callback.
145    
146    If the callback returns false, the whole search stops and false is returned.
147    Otherwise the function returns true after traversing through the whole
148    reference *ADDR_P.  */
149
150 bool
151 for_each_index (tree *addr_p, bool (*cbck) (tree, tree *, void *), void *data)
152 {
153   tree *nxt, *idx;
154
155   for (; ; addr_p = nxt)
156     {
157       switch (TREE_CODE (*addr_p))
158         {
159         case SSA_NAME:
160           return cbck (*addr_p, addr_p, data);
161
162         case MISALIGNED_INDIRECT_REF:
163         case ALIGN_INDIRECT_REF:
164         case INDIRECT_REF:
165           nxt = &TREE_OPERAND (*addr_p, 0);
166           return cbck (*addr_p, nxt, data);
167
168         case BIT_FIELD_REF:
169         case VIEW_CONVERT_EXPR:
170         case ARRAY_RANGE_REF:
171         case REALPART_EXPR:
172         case IMAGPART_EXPR:
173           nxt = &TREE_OPERAND (*addr_p, 0);
174           break;
175
176         case COMPONENT_REF:
177           /* If the component has varying offset, it behaves like index
178              as well.  */
179           idx = &TREE_OPERAND (*addr_p, 2);
180           if (*idx
181               && !cbck (*addr_p, idx, data))
182             return false;
183
184           nxt = &TREE_OPERAND (*addr_p, 0);
185           break;
186
187         case ARRAY_REF:
188           nxt = &TREE_OPERAND (*addr_p, 0);
189           if (!cbck (*addr_p, &TREE_OPERAND (*addr_p, 1), data))
190             return false;
191           break;
192
193         case VAR_DECL:
194         case PARM_DECL:
195         case STRING_CST:
196         case RESULT_DECL:
197           return true;
198
199         default:
200           gcc_unreachable ();
201         }
202     }
203 }
204
205 /* If it is possible to hoist the statement STMT unconditionally,
206    returns MOVE_POSSIBLE.
207    If it is possible to hoist the statement STMT, but we must avoid making
208    it executed if it would not be executed in the original program (e.g.
209    because it may trap), return MOVE_PRESERVE_EXECUTION.
210    Otherwise return MOVE_IMPOSSIBLE.  */
211
212 enum move_pos
213 movement_possibility (tree stmt)
214 {
215   tree lhs, rhs;
216
217   if (flag_unswitch_loops
218       && TREE_CODE (stmt) == COND_EXPR)
219     {
220       /* If we perform unswitching, force the operands of the invariant
221          condition to be moved out of the loop.  */
222       get_stmt_operands (stmt);
223
224       return MOVE_POSSIBLE;
225     }
226
227   if (TREE_CODE (stmt) != MODIFY_EXPR)
228     return MOVE_IMPOSSIBLE;
229
230   if (stmt_ends_bb_p (stmt))
231     return MOVE_IMPOSSIBLE;
232
233   get_stmt_operands (stmt);
234
235   if (stmt_ann (stmt)->has_volatile_ops)
236     return MOVE_IMPOSSIBLE;
237
238   lhs = TREE_OPERAND (stmt, 0);
239   if (TREE_CODE (lhs) == SSA_NAME
240       && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (lhs))
241     return MOVE_IMPOSSIBLE;
242
243   rhs = TREE_OPERAND (stmt, 1);
244
245   if (TREE_SIDE_EFFECTS (rhs))
246     return MOVE_IMPOSSIBLE;
247
248   if (TREE_CODE (lhs) != SSA_NAME
249       || tree_could_trap_p (rhs))
250     return MOVE_PRESERVE_EXECUTION;
251
252   if (get_call_expr_in (stmt))
253     {
254       /* While pure or const call is guaranteed to have no side effects, we
255          cannot move it arbitrarily.  Consider code like
256
257          char *s = something ();
258
259          while (1)
260            {
261              if (s)
262                t = strlen (s);
263              else
264                t = 0;
265            }
266
267          Here the strlen call cannot be moved out of the loop, even though
268          s is invariant.  In addition to possibly creating a call with
269          invalid arguments, moving out a function call that is not executed
270          may cause performance regressions in case the call is costly and
271          not executed at all.  */
272       return MOVE_PRESERVE_EXECUTION;
273     }
274   return MOVE_POSSIBLE;
275 }
276
277 /* Suppose that operand DEF is used inside the LOOP.  Returns the outermost
278    loop to that we could move the expression using DEF if it did not have
279    other operands, i.e. the outermost loop enclosing LOOP in that the value
280    of DEF is invariant.  */
281
282 static struct loop *
283 outermost_invariant_loop (tree def, struct loop *loop)
284 {
285   tree def_stmt;
286   basic_block def_bb;
287   struct loop *max_loop;
288
289   if (TREE_CODE (def) != SSA_NAME)
290     return superloop_at_depth (loop, 1);
291
292   def_stmt = SSA_NAME_DEF_STMT (def);
293   def_bb = bb_for_stmt (def_stmt);
294   if (!def_bb)
295     return superloop_at_depth (loop, 1);
296
297   max_loop = find_common_loop (loop, def_bb->loop_father);
298
299   if (LIM_DATA (def_stmt) && LIM_DATA (def_stmt)->max_loop)
300     max_loop = find_common_loop (max_loop,
301                                  LIM_DATA (def_stmt)->max_loop->outer);
302   if (max_loop == loop)
303     return NULL;
304   max_loop = superloop_at_depth (loop, max_loop->depth + 1);
305
306   return max_loop;
307 }
308
309 /* Returns the outermost superloop of LOOP in that the expression EXPR is
310    invariant.  */
311
312 static struct loop *
313 outermost_invariant_loop_expr (tree expr, struct loop *loop)
314 {
315   enum tree_code_class class = TREE_CODE_CLASS (TREE_CODE (expr));
316   unsigned i, nops;
317   struct loop *max_loop = superloop_at_depth (loop, 1), *aloop;
318
319   if (TREE_CODE (expr) == SSA_NAME
320       || TREE_CODE (expr) == INTEGER_CST
321       || is_gimple_min_invariant (expr))
322     return outermost_invariant_loop (expr, loop);
323
324   if (class != tcc_unary
325       && class != tcc_binary
326       && class != tcc_expression
327       && class != tcc_comparison)
328     return NULL;
329
330   nops = TREE_CODE_LENGTH (TREE_CODE (expr));
331   for (i = 0; i < nops; i++)
332     {
333       aloop = outermost_invariant_loop_expr (TREE_OPERAND (expr, i), loop);
334       if (!aloop)
335         return NULL;
336
337       if (flow_loop_nested_p (max_loop, aloop))
338         max_loop = aloop;
339     }
340
341   return max_loop;
342 }
343
344 /* DATA is a structure containing information associated with a statement
345    inside LOOP.  DEF is one of the operands of this statement.
346    
347    Find the outermost loop enclosing LOOP in that value of DEF is invariant
348    and record this in DATA->max_loop field.  If DEF itself is defined inside
349    this loop as well (i.e. we need to hoist it out of the loop if we want
350    to hoist the statement represented by DATA), record the statement in that
351    DEF is defined to the DATA->depends list.  Additionally if ADD_COST is true,
352    add the cost of the computation of DEF to the DATA->cost.
353    
354    If DEF is not invariant in LOOP, return false.  Otherwise return TRUE.  */
355
356 static bool
357 add_dependency (tree def, struct lim_aux_data *data, struct loop *loop,
358                 bool add_cost)
359 {
360   tree def_stmt = SSA_NAME_DEF_STMT (def);
361   basic_block def_bb = bb_for_stmt (def_stmt);
362   struct loop *max_loop;
363   struct depend *dep;
364
365   if (!def_bb)
366     return true;
367
368   max_loop = outermost_invariant_loop (def, loop);
369   if (!max_loop)
370     return false;
371
372   if (flow_loop_nested_p (data->max_loop, max_loop))
373     data->max_loop = max_loop;
374
375   if (!LIM_DATA (def_stmt))
376     return true;
377
378   if (add_cost
379       /* Only add the cost if the statement defining DEF is inside LOOP,
380          i.e. if it is likely that by moving the invariants dependent
381          on it, we will be able to avoid creating a new register for
382          it (since it will be only used in these dependent invariants).  */
383       && def_bb->loop_father == loop)
384     data->cost += LIM_DATA (def_stmt)->cost;
385
386   dep = xmalloc (sizeof (struct depend));
387   dep->stmt = def_stmt;
388   dep->next = data->depends;
389   data->depends = dep;
390
391   return true;
392 }
393
394 /* Returns an estimate for a cost of statement STMT.  TODO -- the values here
395    are just ad-hoc constants.  The estimates should be based on target-specific
396    values.  */
397
398 static unsigned
399 stmt_cost (tree stmt)
400 {
401   tree rhs;
402   unsigned cost = 1;
403
404   /* Always try to create possibilities for unswitching.  */
405   if (TREE_CODE (stmt) == COND_EXPR)
406     return LIM_EXPENSIVE;
407
408   rhs = TREE_OPERAND (stmt, 1);
409
410   /* Hoisting memory references out should almost surely be a win.  */
411   if (stmt_references_memory_p (stmt))
412     cost += 20;
413
414   switch (TREE_CODE (rhs))
415     {
416     case CALL_EXPR:
417       /* We should be hoisting calls if possible.  */
418
419       /* Unless the call is a builtin_constant_p; this always folds to a
420          constant, so moving it is useless.  */
421       rhs = get_callee_fndecl (rhs);
422       if (DECL_BUILT_IN_CLASS (rhs) == BUILT_IN_NORMAL
423           && DECL_FUNCTION_CODE (rhs) == BUILT_IN_CONSTANT_P)
424         return 0;
425
426       cost += 20;
427       break;
428
429     case MULT_EXPR:
430     case TRUNC_DIV_EXPR:
431     case CEIL_DIV_EXPR:
432     case FLOOR_DIV_EXPR:
433     case ROUND_DIV_EXPR:
434     case EXACT_DIV_EXPR:
435     case CEIL_MOD_EXPR:
436     case FLOOR_MOD_EXPR:
437     case ROUND_MOD_EXPR:
438     case TRUNC_MOD_EXPR:
439       /* Division and multiplication are usually expensive.  */
440       cost += 20;
441       break;
442
443     default:
444       break;
445     }
446
447   return cost;
448 }
449
450 /* Determine the outermost loop to that it is possible to hoist a statement
451    STMT and store it to LIM_DATA (STMT)->max_loop.  To do this we determine
452    the outermost loop in that the value computed by STMT is invariant.
453    If MUST_PRESERVE_EXEC is true, additionally choose such a loop that
454    we preserve the fact whether STMT is executed.  It also fills other related
455    information to LIM_DATA (STMT).
456    
457    The function returns false if STMT cannot be hoisted outside of the loop it
458    is defined in, and true otherwise.  */
459
460 static bool
461 determine_max_movement (tree stmt, bool must_preserve_exec)
462 {
463   basic_block bb = bb_for_stmt (stmt);
464   struct loop *loop = bb->loop_father;
465   struct loop *level;
466   struct lim_aux_data *lim_data = LIM_DATA (stmt);
467   tree val;
468   ssa_op_iter iter;
469   
470   if (must_preserve_exec)
471     level = ALWAYS_EXECUTED_IN (bb);
472   else
473     level = superloop_at_depth (loop, 1);
474   lim_data->max_loop = level;
475
476   FOR_EACH_SSA_TREE_OPERAND (val, stmt, iter, SSA_OP_USE)
477     if (!add_dependency (val, lim_data, loop, true))
478       return false;
479
480   FOR_EACH_SSA_TREE_OPERAND (val, stmt, iter, SSA_OP_VIRTUAL_USES | SSA_OP_VIRTUAL_KILLS)
481     if (!add_dependency (val, lim_data, loop, false))
482       return false;
483
484   lim_data->cost += stmt_cost (stmt);
485
486   return true;
487 }
488
489 /* Suppose that some statement in ORIG_LOOP is hoisted to the loop LEVEL,
490    and that one of the operands of this statement is computed by STMT.
491    Ensure that STMT (together with all the statements that define its
492    operands) is hoisted at least out of the loop LEVEL.  */
493
494 static void
495 set_level (tree stmt, struct loop *orig_loop, struct loop *level)
496 {
497   struct loop *stmt_loop = bb_for_stmt (stmt)->loop_father;
498   struct depend *dep;
499
500   stmt_loop = find_common_loop (orig_loop, stmt_loop);
501   if (LIM_DATA (stmt) && LIM_DATA (stmt)->tgt_loop)
502     stmt_loop = find_common_loop (stmt_loop,
503                                   LIM_DATA (stmt)->tgt_loop->outer);
504   if (flow_loop_nested_p (stmt_loop, level))
505     return;
506
507   gcc_assert (LIM_DATA (stmt));
508   gcc_assert (level == LIM_DATA (stmt)->max_loop
509               || flow_loop_nested_p (LIM_DATA (stmt)->max_loop, level));
510
511   LIM_DATA (stmt)->tgt_loop = level;
512   for (dep = LIM_DATA (stmt)->depends; dep; dep = dep->next)
513     set_level (dep->stmt, orig_loop, level);
514 }
515
516 /* Determines an outermost loop from that we want to hoist the statement STMT.
517    For now we chose the outermost possible loop.  TODO -- use profiling
518    information to set it more sanely.  */
519
520 static void
521 set_profitable_level (tree stmt)
522 {
523   set_level (stmt, bb_for_stmt (stmt)->loop_father, LIM_DATA (stmt)->max_loop);
524 }
525
526 /* Returns true if STMT is not a pure call.  */
527
528 static bool
529 nonpure_call_p (tree stmt)
530 {
531   tree call = get_call_expr_in (stmt);
532
533   if (!call)
534     return false;
535
536   return TREE_SIDE_EFFECTS (call) != 0;
537 }
538
539 /* Releases the memory occupied by DATA.  */
540
541 static void
542 free_lim_aux_data (struct lim_aux_data *data)
543 {
544   struct depend *dep, *next;
545
546   for (dep = data->depends; dep; dep = next)
547     {
548       next = dep->next;
549       free (dep);
550     }
551   free (data);
552 }
553
554 /* Determine the outermost loops in that statements in basic block BB are
555    invariant, and record them to the LIM_DATA associated with the statements.
556    Callback for walk_dominator_tree.  */
557
558 static void
559 determine_invariantness_stmt (struct dom_walk_data *dw_data ATTRIBUTE_UNUSED,
560                               basic_block bb)
561 {
562   enum move_pos pos;
563   block_stmt_iterator bsi;
564   tree stmt;
565   bool maybe_never = ALWAYS_EXECUTED_IN (bb) == NULL;
566   struct loop *outermost = ALWAYS_EXECUTED_IN (bb);
567
568   if (!bb->loop_father->outer)
569     return;
570
571   if (dump_file && (dump_flags & TDF_DETAILS))
572     fprintf (dump_file, "Basic block %d (loop %d -- depth %d):\n\n",
573              bb->index, bb->loop_father->num, bb->loop_father->depth);
574
575   for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
576     {
577       stmt = bsi_stmt (bsi);
578
579       pos = movement_possibility (stmt);
580       if (pos == MOVE_IMPOSSIBLE)
581         {
582           if (nonpure_call_p (stmt))
583             {
584               maybe_never = true;
585               outermost = NULL;
586             }
587           continue;
588         }
589
590       stmt_ann (stmt)->common.aux = xcalloc (1, sizeof (struct lim_aux_data));
591       LIM_DATA (stmt)->always_executed_in = outermost;
592
593       if (maybe_never && pos == MOVE_PRESERVE_EXECUTION)
594         continue;
595
596       if (!determine_max_movement (stmt, pos == MOVE_PRESERVE_EXECUTION))
597         {
598           LIM_DATA (stmt)->max_loop = NULL;
599           continue;
600         }
601
602       if (dump_file && (dump_flags & TDF_DETAILS))
603         {
604           print_generic_stmt_indented (dump_file, stmt, 0, 2);
605           fprintf (dump_file, "  invariant up to level %d, cost %d.\n\n",
606                    LIM_DATA (stmt)->max_loop->depth,
607                    LIM_DATA (stmt)->cost);
608         }
609
610       if (LIM_DATA (stmt)->cost >= LIM_EXPENSIVE)
611         set_profitable_level (stmt);
612     }
613 }
614
615 /* For each statement determines the outermost loop in that it is invariant,
616    statements on whose motion it depends and the cost of the computation.
617    This information is stored to the LIM_DATA structure associated with
618    each statement.  */
619
620 static void
621 determine_invariantness (void)
622 {
623   struct dom_walk_data walk_data;
624
625   memset (&walk_data, 0, sizeof (struct dom_walk_data));
626   walk_data.before_dom_children_before_stmts = determine_invariantness_stmt;
627
628   init_walk_dominator_tree (&walk_data);
629   walk_dominator_tree (&walk_data, ENTRY_BLOCK_PTR);
630   fini_walk_dominator_tree (&walk_data);
631 }
632
633 /* Commits edge insertions and updates loop structures.  */
634
635 void
636 loop_commit_inserts (void)
637 {
638   unsigned old_last_basic_block, i;
639   basic_block bb;
640
641   old_last_basic_block = last_basic_block;
642   bsi_commit_edge_inserts ();
643   for (i = old_last_basic_block; i < (unsigned) last_basic_block; i++)
644     {
645       bb = BASIC_BLOCK (i);
646       add_bb_to_loop (bb,
647                       find_common_loop (single_pred (bb)->loop_father,
648                                         single_succ (bb)->loop_father));
649     }
650 }
651
652 /* Hoist the statements in basic block BB out of the loops prescribed by
653    data stored in LIM_DATA structures associated with each statement.  Callback
654    for walk_dominator_tree.  */
655
656 static void
657 move_computations_stmt (struct dom_walk_data *dw_data ATTRIBUTE_UNUSED,
658                         basic_block bb)
659 {
660   struct loop *level;
661   block_stmt_iterator bsi;
662   tree stmt;
663   unsigned cost = 0;
664
665   if (!bb->loop_father->outer)
666     return;
667
668   for (bsi = bsi_start (bb); !bsi_end_p (bsi); )
669     {
670       stmt = bsi_stmt (bsi);
671
672       if (!LIM_DATA (stmt))
673         {
674           bsi_next (&bsi);
675           continue;
676         }
677
678       cost = LIM_DATA (stmt)->cost;
679       level = LIM_DATA (stmt)->tgt_loop;
680       free_lim_aux_data (LIM_DATA (stmt));
681       stmt_ann (stmt)->common.aux = NULL;
682
683       if (!level)
684         {
685           bsi_next (&bsi);
686           continue;
687         }
688
689       /* We do not really want to move conditionals out of the loop; we just
690          placed it here to force its operands to be moved if necessary.  */
691       if (TREE_CODE (stmt) == COND_EXPR)
692         continue;
693
694       if (dump_file && (dump_flags & TDF_DETAILS))
695         {
696           fprintf (dump_file, "Moving statement\n");
697           print_generic_stmt (dump_file, stmt, 0);
698           fprintf (dump_file, "(cost %u) out of loop %d.\n\n",
699                    cost, level->num);
700         }
701       bsi_insert_on_edge (loop_preheader_edge (level), stmt);
702       bsi_remove (&bsi);
703     }
704 }
705
706 /* Hoist the statements out of the loops prescribed by data stored in
707    LIM_DATA structures associated with each statement.*/
708
709 static void
710 move_computations (void)
711 {
712   struct dom_walk_data walk_data;
713
714   memset (&walk_data, 0, sizeof (struct dom_walk_data));
715   walk_data.before_dom_children_before_stmts = move_computations_stmt;
716
717   init_walk_dominator_tree (&walk_data);
718   walk_dominator_tree (&walk_data, ENTRY_BLOCK_PTR);
719   fini_walk_dominator_tree (&walk_data);
720
721   loop_commit_inserts ();
722   rewrite_into_ssa (false);
723   if (!bitmap_empty_p (vars_to_rename))
724     {
725       /* The rewrite of ssa names may cause violation of loop closed ssa
726          form invariants.  TODO -- avoid these rewrites completely.
727          Information in virtual phi nodes is sufficient for it.  */
728       rewrite_into_loop_closed_ssa (NULL);
729     }
730   bitmap_clear (vars_to_rename);
731 }
732
733 /* Checks whether the statement defining variable *INDEX can be hoisted
734    out of the loop passed in DATA.  Callback for for_each_index.  */
735
736 static bool
737 may_move_till (tree ref, tree *index, void *data)
738 {
739   struct loop *loop = data, *max_loop;
740
741   /* If REF is an array reference, check also that the step and the lower
742      bound is invariant in LOOP.  */
743   if (TREE_CODE (ref) == ARRAY_REF)
744     {
745       tree step = array_ref_element_size (ref);
746       tree lbound = array_ref_low_bound (ref);
747
748       max_loop = outermost_invariant_loop_expr (step, loop);
749       if (!max_loop)
750         return false;
751
752       max_loop = outermost_invariant_loop_expr (lbound, loop);
753       if (!max_loop)
754         return false;
755     }
756
757   max_loop = outermost_invariant_loop (*index, loop);
758   if (!max_loop)
759     return false;
760
761   return true;
762 }
763
764 /* Forces statements defining (invariant) SSA names in expression EXPR to be
765    moved out of the LOOP.  ORIG_LOOP is the loop in that EXPR is used.  */
766
767 static void
768 force_move_till_expr (tree expr, struct loop *orig_loop, struct loop *loop)
769 {
770   enum tree_code_class class = TREE_CODE_CLASS (TREE_CODE (expr));
771   unsigned i, nops;
772
773   if (TREE_CODE (expr) == SSA_NAME)
774     {
775       tree stmt = SSA_NAME_DEF_STMT (expr);
776       if (IS_EMPTY_STMT (stmt))
777         return;
778
779       set_level (stmt, orig_loop, loop);
780       return;
781     }
782
783   if (class != tcc_unary
784       && class != tcc_binary
785       && class != tcc_expression
786       && class != tcc_comparison)
787     return;
788
789   nops = TREE_CODE_LENGTH (TREE_CODE (expr));
790   for (i = 0; i < nops; i++)
791     force_move_till_expr (TREE_OPERAND (expr, i), orig_loop, loop);
792 }
793
794 /* Forces statement defining invariants in REF (and *INDEX) to be moved out of
795    the LOOP.  The reference REF is used in the loop ORIG_LOOP.  Callback for
796    for_each_index.  */
797
798 struct fmt_data
799 {
800   struct loop *loop;
801   struct loop *orig_loop;
802 };
803
804 static bool
805 force_move_till (tree ref, tree *index, void *data)
806 {
807   tree stmt;
808   struct fmt_data *fmt_data = data;
809
810   if (TREE_CODE (ref) == ARRAY_REF)
811     {
812       tree step = array_ref_element_size (ref);
813       tree lbound = array_ref_low_bound (ref);
814
815       force_move_till_expr (step, fmt_data->orig_loop, fmt_data->loop);
816       force_move_till_expr (lbound, fmt_data->orig_loop, fmt_data->loop);
817     }
818
819   if (TREE_CODE (*index) != SSA_NAME)
820     return true;
821
822   stmt = SSA_NAME_DEF_STMT (*index);
823   if (IS_EMPTY_STMT (stmt))
824     return true;
825
826   set_level (stmt, fmt_data->orig_loop, fmt_data->loop);
827
828   return true;
829 }
830
831 /* Records memory reference *REF (that occurs in statement STMT)
832    to the list MEM_REFS.  */
833
834 static void
835 record_mem_ref (struct mem_ref **mem_refs, tree stmt, tree *ref)
836 {
837   struct mem_ref *aref = xmalloc (sizeof (struct mem_ref));
838
839   aref->stmt = stmt;
840   aref->ref = ref;
841
842   aref->next = *mem_refs;
843   *mem_refs = aref;
844 }
845
846 /* Releases list of memory references MEM_REFS.  */
847
848 static void
849 free_mem_refs (struct mem_ref *mem_refs)
850 {
851   struct mem_ref *act;
852
853   while (mem_refs)
854     {
855       act = mem_refs;
856       mem_refs = mem_refs->next;
857       free (act);
858     }
859 }
860
861 /* If VAR is defined in LOOP and the statement it is defined in does not belong
862    to the set SEEN, add the statement to QUEUE of length IN_QUEUE and
863    to the set SEEN.  */
864
865 static void
866 maybe_queue_var (tree var, struct loop *loop,
867                  sbitmap seen, tree *queue, unsigned *in_queue)
868 {
869   tree stmt = SSA_NAME_DEF_STMT (var);
870   basic_block def_bb = bb_for_stmt (stmt);
871               
872   if (!def_bb
873       || !flow_bb_inside_loop_p (loop, def_bb)
874       || TEST_BIT (seen, get_stmt_uid (stmt)))
875     return;
876           
877   SET_BIT (seen, get_stmt_uid (stmt));
878   queue[(*in_queue)++] = stmt;
879 }
880
881 /* If COMMON_REF is NULL, set COMMON_REF to *OP and return true.
882    Otherwise return true if the memory reference *OP is equal to COMMON_REF.
883    Record the reference OP to list MEM_REFS.  STMT is the statement in that
884    the reference occurs.  */
885
886 struct sra_data
887 {
888   struct mem_ref **mem_refs;
889   tree common_ref;
890   tree stmt;
891 };
892
893 static bool
894 fem_single_reachable_address (tree *op, void *data)
895 {
896   struct sra_data *sra_data = data;
897
898   if (sra_data->common_ref
899       && !operand_equal_p (*op, sra_data->common_ref, 0))
900     return false;
901   sra_data->common_ref = *op;
902
903   record_mem_ref (sra_data->mem_refs, sra_data->stmt, op);
904   return true;
905 }
906
907 /* Runs CALLBACK for each operand of STMT that is a memory reference.  DATA
908    is passed to the CALLBACK as well.  The traversal stops if CALLBACK
909    returns false, for_each_memref then returns false as well.  Otherwise
910    for_each_memref returns true.  */
911
912 static bool
913 for_each_memref (tree stmt, bool (*callback)(tree *, void *), void *data)
914 {
915   tree *op;
916
917   if (TREE_CODE (stmt) == RETURN_EXPR)
918     stmt = TREE_OPERAND (stmt, 1);
919
920   if (TREE_CODE (stmt) == MODIFY_EXPR)
921     {
922       op = &TREE_OPERAND (stmt, 0);
923       if (TREE_CODE (*op) != SSA_NAME
924           && !callback (op, data))
925         return false;
926
927       op = &TREE_OPERAND (stmt, 1);
928       if (TREE_CODE (*op) != SSA_NAME
929           && is_gimple_lvalue (*op)
930           && !callback (op, data))
931         return false;
932
933       stmt = TREE_OPERAND (stmt, 1);
934     }
935
936   if (TREE_CODE (stmt) == WITH_SIZE_EXPR)
937     stmt = TREE_OPERAND (stmt, 0);
938
939   if (TREE_CODE (stmt) == CALL_EXPR)
940     {
941       tree args;
942
943       for (args = TREE_OPERAND (stmt, 1); args; args = TREE_CHAIN (args))
944         {
945           op = &TREE_VALUE (args);
946
947           if (TREE_CODE (*op) != SSA_NAME
948               && is_gimple_lvalue (*op)
949               && !callback (op, data))
950             return false;
951         }
952     }
953
954   return true;
955 }
956
957 /* Determine whether all memory references inside the LOOP that correspond
958    to virtual ssa names defined in statement STMT are equal.
959    If so, store the list of the references to MEM_REFS, and return one
960    of them.  Otherwise store NULL to MEM_REFS and return NULL_TREE.
961    *SEEN_CALL_STMT is set to true if the virtual operands suggest
962    that the reference might be clobbered by a call inside the LOOP.  */
963
964 static tree
965 single_reachable_address (struct loop *loop, tree stmt,
966                           struct mem_ref **mem_refs,
967                           bool *seen_call_stmt)
968 {
969   unsigned max_uid = max_stmt_uid + num_ssa_names;
970   tree *queue = xmalloc (sizeof (tree) * max_uid);
971   sbitmap seen = sbitmap_alloc (max_uid);
972   unsigned in_queue = 1;
973   dataflow_t df;
974   unsigned i, n;
975   struct sra_data sra_data;
976   tree call;
977   tree val;
978   ssa_op_iter iter;
979
980   sbitmap_zero (seen);
981
982   *mem_refs = NULL;
983   sra_data.mem_refs = mem_refs;
984   sra_data.common_ref = NULL_TREE;
985
986   queue[0] = stmt;
987   SET_BIT (seen, get_stmt_uid (stmt));
988   *seen_call_stmt = false;
989
990   while (in_queue)
991     {
992       stmt = queue[--in_queue];
993       sra_data.stmt = stmt;
994
995       if (LIM_DATA (stmt)
996           && LIM_DATA (stmt)->sm_done)
997         goto fail;
998
999       switch (TREE_CODE (stmt))
1000         {
1001         case MODIFY_EXPR:
1002         case CALL_EXPR:
1003         case RETURN_EXPR:
1004           if (!for_each_memref (stmt, fem_single_reachable_address,
1005                                 &sra_data))
1006             goto fail;
1007
1008           /* If this is a function that may depend on the memory location,
1009              record the fact.  We cannot directly refuse call clobbered
1010              operands here, since sra_data.common_ref did not have
1011              to be set yet.  */
1012           call = get_call_expr_in (stmt);
1013           if (call
1014               && !(call_expr_flags (call) & ECF_CONST))
1015             *seen_call_stmt = true;
1016
1017           /* Traverse also definitions of the VUSES (there may be other
1018              distinct from the one we used to get to this statement).  */
1019           FOR_EACH_SSA_TREE_OPERAND (val, stmt, iter, SSA_OP_VIRTUAL_USES)
1020             maybe_queue_var (val, loop, seen, queue, &in_queue);
1021
1022           break;
1023
1024         case PHI_NODE:
1025           for (i = 0; i < (unsigned) PHI_NUM_ARGS (stmt); i++)
1026             if (TREE_CODE (PHI_ARG_DEF (stmt, i)) == SSA_NAME)
1027               maybe_queue_var (PHI_ARG_DEF (stmt, i), loop,
1028                                seen, queue, &in_queue);
1029           break;
1030
1031         default:
1032           goto fail;
1033         }
1034
1035       /* Find uses of virtual names.  */
1036       df = get_immediate_uses (stmt);
1037       n = num_immediate_uses (df);
1038
1039       for (i = 0; i < n; i++)
1040         {
1041           stmt = immediate_use (df, i);
1042
1043           if (!flow_bb_inside_loop_p (loop, bb_for_stmt (stmt)))
1044             continue;
1045
1046           if (TEST_BIT (seen, get_stmt_uid (stmt)))
1047             continue;
1048           SET_BIT (seen, get_stmt_uid (stmt));
1049
1050           queue[in_queue++] = stmt;
1051         }
1052     }
1053
1054   free (queue);
1055   sbitmap_free (seen);
1056
1057   return sra_data.common_ref;
1058
1059 fail:
1060   free_mem_refs (*mem_refs);
1061   *mem_refs = NULL;
1062   free (queue);
1063   sbitmap_free (seen);
1064
1065   return NULL;
1066 }
1067
1068 /* Rewrites memory references in list MEM_REFS by variable TMP_VAR.  */
1069
1070 static void
1071 rewrite_mem_refs (tree tmp_var, struct mem_ref *mem_refs)
1072 {
1073   tree var;
1074   ssa_op_iter iter;
1075
1076   for (; mem_refs; mem_refs = mem_refs->next)
1077     {
1078       FOR_EACH_SSA_TREE_OPERAND (var, mem_refs->stmt, iter, SSA_OP_ALL_VIRTUALS)
1079         {
1080           var = SSA_NAME_VAR (var);
1081           bitmap_set_bit (vars_to_rename, var_ann (var)->uid);
1082         }
1083
1084       *mem_refs->ref = tmp_var;
1085       modify_stmt (mem_refs->stmt);
1086     }
1087 }
1088
1089 /* Records request for store motion of memory reference REF from LOOP.
1090    MEM_REFS is the list of occurrences of the reference REF inside LOOP;
1091    these references are rewritten by a new temporary variable.
1092    Exits from the LOOP are stored in EXITS, there are N_EXITS of them.
1093    The initialization of the temporary variable is put to the preheader
1094    of the loop, and assignments to the reference from the temporary variable
1095    are emitted to exits.  */
1096
1097 static void
1098 schedule_sm (struct loop *loop, edge *exits, unsigned n_exits, tree ref,
1099              struct mem_ref *mem_refs)
1100 {
1101   struct mem_ref *aref;
1102   tree tmp_var;
1103   unsigned i;
1104   tree load, store;
1105   struct fmt_data fmt_data;
1106
1107   if (dump_file && (dump_flags & TDF_DETAILS))
1108     {
1109       fprintf (dump_file, "Executing store motion of ");
1110       print_generic_expr (dump_file, ref, 0);
1111       fprintf (dump_file, " from loop %d\n", loop->num);
1112     }
1113
1114   tmp_var = make_rename_temp (TREE_TYPE (ref), "lsm_tmp");
1115
1116   fmt_data.loop = loop;
1117   fmt_data.orig_loop = loop;
1118   for_each_index (&ref, force_move_till, &fmt_data);
1119
1120   rewrite_mem_refs (tmp_var, mem_refs);
1121   for (aref = mem_refs; aref; aref = aref->next)
1122     if (LIM_DATA (aref->stmt))
1123       LIM_DATA (aref->stmt)->sm_done = true;
1124
1125   /* Emit the load & stores.  */
1126   load = build (MODIFY_EXPR, void_type_node, tmp_var, ref);
1127   get_stmt_ann (load)->common.aux = xcalloc (1, sizeof (struct lim_aux_data));
1128   LIM_DATA (load)->max_loop = loop;
1129   LIM_DATA (load)->tgt_loop = loop;
1130
1131   /* Put this into the latch, so that we are sure it will be processed after
1132      all dependencies.  */
1133   bsi_insert_on_edge (loop_latch_edge (loop), load);
1134
1135   for (i = 0; i < n_exits; i++)
1136     {
1137       store = build (MODIFY_EXPR, void_type_node,
1138                      unshare_expr (ref), tmp_var);
1139       bsi_insert_on_edge (exits[i], store);
1140     }
1141 }
1142
1143 /* Returns true if REF may be clobbered by calls.  */
1144
1145 static bool
1146 is_call_clobbered_ref (tree ref)
1147 {
1148   tree base;
1149   HOST_WIDE_INT offset, size;
1150   subvar_t sv;
1151   subvar_t svars;
1152   tree sref = ref;
1153
1154   if (TREE_CODE (sref) == COMPONENT_REF
1155       && (sref = okay_component_ref_for_subvars (sref, &offset, &size)))
1156     {
1157       svars = get_subvars_for_var (sref);
1158       for (sv = svars; sv; sv = sv->next)
1159         {
1160           if (overlap_subvar (offset, size, sv, NULL)
1161               && is_call_clobbered (sv->var))
1162             return true;
1163         }
1164     }
1165               
1166   base = get_base_address (ref);
1167   if (!base)
1168     return true;
1169
1170   if (DECL_P (base))
1171     {
1172       if (var_can_have_subvars (base)
1173           && (svars = get_subvars_for_var (base)))
1174         {
1175           for (sv = svars; sv; sv = sv->next)
1176             if (is_call_clobbered (sv->var))
1177               return true;
1178           return false;
1179         }
1180       else
1181         return is_call_clobbered (base);
1182     }
1183
1184   if (INDIRECT_REF_P (base))
1185     {
1186       /* Check whether the alias tags associated with the pointer
1187          are call clobbered.  */
1188       tree ptr = TREE_OPERAND (base, 0);
1189       struct ptr_info_def *pi = SSA_NAME_PTR_INFO (ptr);
1190       tree nmt = (pi) ? pi->name_mem_tag : NULL_TREE;
1191       tree tmt = var_ann (SSA_NAME_VAR (ptr))->type_mem_tag;
1192
1193       if ((nmt && is_call_clobbered (nmt))
1194           || (tmt && is_call_clobbered (tmt)))
1195         return true;
1196
1197       return false;
1198     }
1199
1200   gcc_unreachable ();
1201 }
1202
1203 /* Determine whether all memory references inside LOOP corresponding to the
1204    virtual ssa name REG are equal to each other, and whether the address of
1205    this common reference can be hoisted outside of the loop.  If this is true,
1206    prepare the statements that load the value of the memory reference to a
1207    temporary variable in the loop preheader, store it back on the loop exits,
1208    and replace all the references inside LOOP by this temporary variable.
1209    LOOP has N_EXITS stored in EXITS.  */
1210
1211 static void
1212 determine_lsm_reg (struct loop *loop, edge *exits, unsigned n_exits, tree reg)
1213 {
1214   tree ref;
1215   struct mem_ref *mem_refs, *aref;
1216   struct loop *must_exec;
1217   bool sees_call;
1218   
1219   if (is_gimple_reg (reg))
1220     return;
1221   
1222   ref = single_reachable_address (loop, SSA_NAME_DEF_STMT (reg), &mem_refs,
1223                                   &sees_call);
1224   if (!ref)
1225     return;
1226
1227   /* If we cannot create a ssa name for the result, give up.  */
1228   if (!is_gimple_reg_type (TREE_TYPE (ref))
1229       || TREE_THIS_VOLATILE (ref))
1230     goto fail;
1231
1232   /* If there is a call that may use the location, give up as well.  */
1233   if (sees_call
1234       && is_call_clobbered_ref (ref))
1235     goto fail;
1236
1237   if (!for_each_index (&ref, may_move_till, loop))
1238     goto fail;
1239
1240   if (tree_could_trap_p (ref))
1241     {
1242       /* If the memory access is unsafe (i.e. it might trap), ensure that some
1243          of the statements in that it occurs is always executed when the loop
1244          is entered.  This way we know that by moving the load from the
1245          reference out of the loop we will not cause the error that would not
1246          occur otherwise.
1247
1248          TODO -- in fact we would like to check for anticipability of the
1249          reference, i.e. that on each path from loop entry to loop exit at
1250          least one of the statements containing the memory reference is
1251          executed.  */
1252
1253       for (aref = mem_refs; aref; aref = aref->next)
1254         {
1255           if (!LIM_DATA (aref->stmt))
1256             continue;
1257
1258           must_exec = LIM_DATA (aref->stmt)->always_executed_in;
1259           if (!must_exec)
1260             continue;
1261
1262           if (must_exec == loop
1263               || flow_loop_nested_p (must_exec, loop))
1264             break;
1265         }
1266
1267       if (!aref)
1268         goto fail;
1269     }
1270
1271   schedule_sm (loop, exits, n_exits, ref, mem_refs);
1272
1273 fail: ;
1274   free_mem_refs (mem_refs);
1275 }
1276
1277 /* Checks whether LOOP (with N_EXITS exits stored in EXITS array) is suitable
1278    for a store motion optimization (i.e. whether we can insert statement
1279    on its exits).  */
1280
1281 static bool
1282 loop_suitable_for_sm (struct loop *loop ATTRIBUTE_UNUSED, edge *exits,
1283                       unsigned n_exits)
1284 {
1285   unsigned i;
1286
1287   for (i = 0; i < n_exits; i++)
1288     if (exits[i]->flags & EDGE_ABNORMAL)
1289       return false;
1290
1291   return true;
1292 }
1293
1294 /* Try to perform store motion for all memory references modified inside
1295    LOOP.  */
1296
1297 static void
1298 determine_lsm_loop (struct loop *loop)
1299 {
1300   tree phi;
1301   unsigned n_exits;
1302   edge *exits = get_loop_exit_edges (loop, &n_exits);
1303
1304   if (!loop_suitable_for_sm (loop, exits, n_exits))
1305     {
1306       free (exits);
1307       return;
1308     }
1309
1310   for (phi = phi_nodes (loop->header); phi; phi = PHI_CHAIN (phi))
1311     determine_lsm_reg (loop, exits, n_exits, PHI_RESULT (phi));
1312
1313   free (exits);
1314 }
1315
1316 /* Try to perform store motion for all memory references modified inside
1317    any of LOOPS.  */
1318
1319 static void
1320 determine_lsm (struct loops *loops)
1321 {
1322   struct loop *loop;
1323   basic_block bb;
1324
1325   if (!loops->tree_root->inner)
1326     return;
1327
1328   /* Create a UID for each statement in the function.  Ordering of the
1329      UIDs is not important for this pass.  */
1330   max_stmt_uid = 0;
1331   FOR_EACH_BB (bb)
1332     {
1333       block_stmt_iterator bsi;
1334
1335       for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
1336         stmt_ann (bsi_stmt (bsi))->uid = max_stmt_uid++;
1337     }
1338
1339   compute_immediate_uses (TDFA_USE_VOPS, NULL);
1340
1341   /* Pass the loops from the outermost.  For each virtual operand loop phi node
1342      check whether all the references inside the loop correspond to a single
1343      address, and if so, move them.  */
1344
1345   loop = loops->tree_root->inner;
1346   while (1)
1347     {
1348       determine_lsm_loop (loop);
1349
1350       if (loop->inner)
1351         {
1352           loop = loop->inner;
1353           continue;
1354         }
1355       while (!loop->next)
1356         {
1357           loop = loop->outer;
1358           if (loop == loops->tree_root)
1359             {
1360               free_df ();
1361               loop_commit_inserts ();
1362               return;
1363             }
1364         }
1365       loop = loop->next;
1366     }
1367 }
1368
1369 /* Fills ALWAYS_EXECUTED_IN information for basic blocks of LOOP, i.e.
1370    for each such basic block bb records the outermost loop for that execution
1371    of its header implies execution of bb.  CONTAINS_CALL is the bitmap of
1372    blocks that contain a nonpure call.  */
1373
1374 static void
1375 fill_always_executed_in (struct loop *loop, sbitmap contains_call)
1376 {
1377   basic_block bb = NULL, *bbs, last = NULL;
1378   unsigned i;
1379   edge e;
1380   struct loop *inn_loop = loop;
1381
1382   if (!loop->header->aux)
1383     {
1384       bbs = get_loop_body_in_dom_order (loop);
1385
1386       for (i = 0; i < loop->num_nodes; i++)
1387         {
1388           edge_iterator ei;
1389           bb = bbs[i];
1390
1391           if (dominated_by_p (CDI_DOMINATORS, loop->latch, bb))
1392             last = bb;
1393
1394           if (TEST_BIT (contains_call, bb->index))
1395             break;
1396
1397           FOR_EACH_EDGE (e, ei, bb->succs)
1398             if (!flow_bb_inside_loop_p (loop, e->dest))
1399               break;
1400           if (e)
1401             break;
1402
1403           /* A loop might be infinite (TODO use simple loop analysis
1404              to disprove this if possible).  */
1405           if (bb->flags & BB_IRREDUCIBLE_LOOP)
1406             break;
1407
1408           if (!flow_bb_inside_loop_p (inn_loop, bb))
1409             break;
1410
1411           if (bb->loop_father->header == bb)
1412             {
1413               if (!dominated_by_p (CDI_DOMINATORS, loop->latch, bb))
1414                 break;
1415
1416               /* In a loop that is always entered we may proceed anyway.
1417                  But record that we entered it and stop once we leave it.  */
1418               inn_loop = bb->loop_father;
1419             }
1420         }
1421
1422       while (1)
1423         {
1424           last->aux = loop;
1425           if (last == loop->header)
1426             break;
1427           last = get_immediate_dominator (CDI_DOMINATORS, last);
1428         }
1429
1430       free (bbs);
1431     }
1432
1433   for (loop = loop->inner; loop; loop = loop->next)
1434     fill_always_executed_in (loop, contains_call);
1435 }
1436
1437 /* Compute the global information needed by the loop invariant motion pass.
1438    LOOPS is the loop tree.  */
1439
1440 static void
1441 tree_ssa_lim_initialize (struct loops *loops)
1442 {
1443   sbitmap contains_call = sbitmap_alloc (last_basic_block);
1444   block_stmt_iterator bsi;
1445   struct loop *loop;
1446   basic_block bb;
1447
1448   sbitmap_zero (contains_call);
1449   FOR_EACH_BB (bb)
1450     {
1451       for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
1452         {
1453           if (nonpure_call_p (bsi_stmt (bsi)))
1454             break;
1455         }
1456
1457       if (!bsi_end_p (bsi))
1458         SET_BIT (contains_call, bb->index);
1459     }
1460
1461   for (loop = loops->tree_root->inner; loop; loop = loop->next)
1462     fill_always_executed_in (loop, contains_call);
1463
1464   sbitmap_free (contains_call);
1465 }
1466
1467 /* Cleans up after the invariant motion pass.  */
1468
1469 static void
1470 tree_ssa_lim_finalize (void)
1471 {
1472   basic_block bb;
1473
1474   FOR_EACH_BB (bb)
1475     {
1476       bb->aux = NULL;
1477     }
1478 }
1479
1480 /* Moves invariants from LOOPS.  Only "expensive" invariants are moved out --
1481    i.e. those that are likely to be win regardless of the register pressure.  */
1482
1483 void
1484 tree_ssa_lim (struct loops *loops)
1485 {
1486   tree_ssa_lim_initialize (loops);
1487
1488   /* For each statement determine the outermost loop in that it is
1489      invariant and cost for computing the invariant.  */
1490   determine_invariantness ();
1491
1492   /* For each memory reference determine whether it is possible to hoist it
1493      out of the loop.  Force the necessary invariants to be moved out of the
1494      loops as well.  */
1495   determine_lsm (loops);
1496
1497   /* Move the expressions that are expensive enough.  */
1498   move_computations ();
1499
1500   tree_ssa_lim_finalize ();
1501 }