OSDN Git Service

a0c45821cdb0e701db993e709e11ab84dee7057a
[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     case RDIV_EXPR:
440       /* Division and multiplication are usually expensive.  */
441       cost += 20;
442       break;
443
444     default:
445       break;
446     }
447
448   return cost;
449 }
450
451 /* Determine the outermost loop to that it is possible to hoist a statement
452    STMT and store it to LIM_DATA (STMT)->max_loop.  To do this we determine
453    the outermost loop in that the value computed by STMT is invariant.
454    If MUST_PRESERVE_EXEC is true, additionally choose such a loop that
455    we preserve the fact whether STMT is executed.  It also fills other related
456    information to LIM_DATA (STMT).
457    
458    The function returns false if STMT cannot be hoisted outside of the loop it
459    is defined in, and true otherwise.  */
460
461 static bool
462 determine_max_movement (tree stmt, bool must_preserve_exec)
463 {
464   basic_block bb = bb_for_stmt (stmt);
465   struct loop *loop = bb->loop_father;
466   struct loop *level;
467   struct lim_aux_data *lim_data = LIM_DATA (stmt);
468   tree val;
469   ssa_op_iter iter;
470   
471   if (must_preserve_exec)
472     level = ALWAYS_EXECUTED_IN (bb);
473   else
474     level = superloop_at_depth (loop, 1);
475   lim_data->max_loop = level;
476
477   FOR_EACH_SSA_TREE_OPERAND (val, stmt, iter, SSA_OP_USE)
478     if (!add_dependency (val, lim_data, loop, true))
479       return false;
480
481   FOR_EACH_SSA_TREE_OPERAND (val, stmt, iter, SSA_OP_VIRTUAL_USES | SSA_OP_VIRTUAL_KILLS)
482     if (!add_dependency (val, lim_data, loop, false))
483       return false;
484
485   lim_data->cost += stmt_cost (stmt);
486
487   return true;
488 }
489
490 /* Suppose that some statement in ORIG_LOOP is hoisted to the loop LEVEL,
491    and that one of the operands of this statement is computed by STMT.
492    Ensure that STMT (together with all the statements that define its
493    operands) is hoisted at least out of the loop LEVEL.  */
494
495 static void
496 set_level (tree stmt, struct loop *orig_loop, struct loop *level)
497 {
498   struct loop *stmt_loop = bb_for_stmt (stmt)->loop_father;
499   struct depend *dep;
500
501   stmt_loop = find_common_loop (orig_loop, stmt_loop);
502   if (LIM_DATA (stmt) && LIM_DATA (stmt)->tgt_loop)
503     stmt_loop = find_common_loop (stmt_loop,
504                                   LIM_DATA (stmt)->tgt_loop->outer);
505   if (flow_loop_nested_p (stmt_loop, level))
506     return;
507
508   gcc_assert (LIM_DATA (stmt));
509   gcc_assert (level == LIM_DATA (stmt)->max_loop
510               || flow_loop_nested_p (LIM_DATA (stmt)->max_loop, level));
511
512   LIM_DATA (stmt)->tgt_loop = level;
513   for (dep = LIM_DATA (stmt)->depends; dep; dep = dep->next)
514     set_level (dep->stmt, orig_loop, level);
515 }
516
517 /* Determines an outermost loop from that we want to hoist the statement STMT.
518    For now we chose the outermost possible loop.  TODO -- use profiling
519    information to set it more sanely.  */
520
521 static void
522 set_profitable_level (tree stmt)
523 {
524   set_level (stmt, bb_for_stmt (stmt)->loop_father, LIM_DATA (stmt)->max_loop);
525 }
526
527 /* Returns true if STMT is not a pure call.  */
528
529 static bool
530 nonpure_call_p (tree stmt)
531 {
532   tree call = get_call_expr_in (stmt);
533
534   if (!call)
535     return false;
536
537   return TREE_SIDE_EFFECTS (call) != 0;
538 }
539
540 /* Releases the memory occupied by DATA.  */
541
542 static void
543 free_lim_aux_data (struct lim_aux_data *data)
544 {
545   struct depend *dep, *next;
546
547   for (dep = data->depends; dep; dep = next)
548     {
549       next = dep->next;
550       free (dep);
551     }
552   free (data);
553 }
554
555 /* Determine the outermost loops in that statements in basic block BB are
556    invariant, and record them to the LIM_DATA associated with the statements.
557    Callback for walk_dominator_tree.  */
558
559 static void
560 determine_invariantness_stmt (struct dom_walk_data *dw_data ATTRIBUTE_UNUSED,
561                               basic_block bb)
562 {
563   enum move_pos pos;
564   block_stmt_iterator bsi;
565   tree stmt;
566   bool maybe_never = ALWAYS_EXECUTED_IN (bb) == NULL;
567   struct loop *outermost = ALWAYS_EXECUTED_IN (bb);
568
569   if (!bb->loop_father->outer)
570     return;
571
572   if (dump_file && (dump_flags & TDF_DETAILS))
573     fprintf (dump_file, "Basic block %d (loop %d -- depth %d):\n\n",
574              bb->index, bb->loop_father->num, bb->loop_father->depth);
575
576   for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
577     {
578       stmt = bsi_stmt (bsi);
579
580       pos = movement_possibility (stmt);
581       if (pos == MOVE_IMPOSSIBLE)
582         {
583           if (nonpure_call_p (stmt))
584             {
585               maybe_never = true;
586               outermost = NULL;
587             }
588           continue;
589         }
590
591       stmt_ann (stmt)->common.aux = xcalloc (1, sizeof (struct lim_aux_data));
592       LIM_DATA (stmt)->always_executed_in = outermost;
593
594       if (maybe_never && pos == MOVE_PRESERVE_EXECUTION)
595         continue;
596
597       if (!determine_max_movement (stmt, pos == MOVE_PRESERVE_EXECUTION))
598         {
599           LIM_DATA (stmt)->max_loop = NULL;
600           continue;
601         }
602
603       if (dump_file && (dump_flags & TDF_DETAILS))
604         {
605           print_generic_stmt_indented (dump_file, stmt, 0, 2);
606           fprintf (dump_file, "  invariant up to level %d, cost %d.\n\n",
607                    LIM_DATA (stmt)->max_loop->depth,
608                    LIM_DATA (stmt)->cost);
609         }
610
611       if (LIM_DATA (stmt)->cost >= LIM_EXPENSIVE)
612         set_profitable_level (stmt);
613     }
614 }
615
616 /* For each statement determines the outermost loop in that it is invariant,
617    statements on whose motion it depends and the cost of the computation.
618    This information is stored to the LIM_DATA structure associated with
619    each statement.  */
620
621 static void
622 determine_invariantness (void)
623 {
624   struct dom_walk_data walk_data;
625
626   memset (&walk_data, 0, sizeof (struct dom_walk_data));
627   walk_data.before_dom_children_before_stmts = determine_invariantness_stmt;
628
629   init_walk_dominator_tree (&walk_data);
630   walk_dominator_tree (&walk_data, ENTRY_BLOCK_PTR);
631   fini_walk_dominator_tree (&walk_data);
632 }
633
634 /* Commits edge insertions and updates loop structures.  */
635
636 void
637 loop_commit_inserts (void)
638 {
639   unsigned old_last_basic_block, i;
640   basic_block bb;
641
642   old_last_basic_block = last_basic_block;
643   bsi_commit_edge_inserts ();
644   for (i = old_last_basic_block; i < (unsigned) last_basic_block; i++)
645     {
646       bb = BASIC_BLOCK (i);
647       add_bb_to_loop (bb,
648                       find_common_loop (single_pred (bb)->loop_father,
649                                         single_succ (bb)->loop_father));
650     }
651 }
652
653 /* Hoist the statements in basic block BB out of the loops prescribed by
654    data stored in LIM_DATA structures associated with each statement.  Callback
655    for walk_dominator_tree.  */
656
657 static void
658 move_computations_stmt (struct dom_walk_data *dw_data ATTRIBUTE_UNUSED,
659                         basic_block bb)
660 {
661   struct loop *level;
662   block_stmt_iterator bsi;
663   tree stmt;
664   unsigned cost = 0;
665
666   if (!bb->loop_father->outer)
667     return;
668
669   for (bsi = bsi_start (bb); !bsi_end_p (bsi); )
670     {
671       stmt = bsi_stmt (bsi);
672
673       if (!LIM_DATA (stmt))
674         {
675           bsi_next (&bsi);
676           continue;
677         }
678
679       cost = LIM_DATA (stmt)->cost;
680       level = LIM_DATA (stmt)->tgt_loop;
681       free_lim_aux_data (LIM_DATA (stmt));
682       stmt_ann (stmt)->common.aux = NULL;
683
684       if (!level)
685         {
686           bsi_next (&bsi);
687           continue;
688         }
689
690       /* We do not really want to move conditionals out of the loop; we just
691          placed it here to force its operands to be moved if necessary.  */
692       if (TREE_CODE (stmt) == COND_EXPR)
693         continue;
694
695       if (dump_file && (dump_flags & TDF_DETAILS))
696         {
697           fprintf (dump_file, "Moving statement\n");
698           print_generic_stmt (dump_file, stmt, 0);
699           fprintf (dump_file, "(cost %u) out of loop %d.\n\n",
700                    cost, level->num);
701         }
702       bsi_insert_on_edge (loop_preheader_edge (level), stmt);
703       bsi_remove (&bsi);
704     }
705 }
706
707 /* Hoist the statements out of the loops prescribed by data stored in
708    LIM_DATA structures associated with each statement.*/
709
710 static void
711 move_computations (void)
712 {
713   struct dom_walk_data walk_data;
714
715   memset (&walk_data, 0, sizeof (struct dom_walk_data));
716   walk_data.before_dom_children_before_stmts = move_computations_stmt;
717
718   init_walk_dominator_tree (&walk_data);
719   walk_dominator_tree (&walk_data, ENTRY_BLOCK_PTR);
720   fini_walk_dominator_tree (&walk_data);
721
722   loop_commit_inserts ();
723
724   if (need_ssa_update_p ())
725     update_ssa (TODO_update_ssa);
726
727   /* The movement of LI code may cause violation of loop closed SSA
728      form invariants.  TODO -- avoid these rewrites completely.
729      Information in virtual phi nodes is sufficient for it.  */
730   rewrite_into_loop_closed_ssa (NULL);
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   unsigned i;
974   struct sra_data sra_data;
975   tree call;
976   tree val;
977   ssa_op_iter iter;
978   imm_use_iterator imm_iter;
979   use_operand_p use_p;
980
981   sbitmap_zero (seen);
982
983   *mem_refs = NULL;
984   sra_data.mem_refs = mem_refs;
985   sra_data.common_ref = NULL_TREE;
986
987   queue[0] = stmt;
988   SET_BIT (seen, get_stmt_uid (stmt));
989   *seen_call_stmt = false;
990
991   while (in_queue)
992     {
993       stmt = queue[--in_queue];
994       sra_data.stmt = stmt;
995
996       if (LIM_DATA (stmt)
997           && LIM_DATA (stmt)->sm_done)
998         goto fail;
999
1000       switch (TREE_CODE (stmt))
1001         {
1002         case MODIFY_EXPR:
1003         case CALL_EXPR:
1004         case RETURN_EXPR:
1005           if (!for_each_memref (stmt, fem_single_reachable_address,
1006                                 &sra_data))
1007             goto fail;
1008
1009           /* If this is a function that may depend on the memory location,
1010              record the fact.  We cannot directly refuse call clobbered
1011              operands here, since sra_data.common_ref did not have
1012              to be set yet.  */
1013           call = get_call_expr_in (stmt);
1014           if (call
1015               && !(call_expr_flags (call) & ECF_CONST))
1016             *seen_call_stmt = true;
1017
1018           /* Traverse also definitions of the VUSES (there may be other
1019              distinct from the one we used to get to this statement).  */
1020           FOR_EACH_SSA_TREE_OPERAND (val, stmt, iter, SSA_OP_VIRTUAL_USES)
1021             maybe_queue_var (val, loop, seen, queue, &in_queue);
1022
1023           break;
1024
1025         case PHI_NODE:
1026           for (i = 0; i < (unsigned) PHI_NUM_ARGS (stmt); i++)
1027             if (TREE_CODE (PHI_ARG_DEF (stmt, i)) == SSA_NAME)
1028               maybe_queue_var (PHI_ARG_DEF (stmt, i), loop,
1029                                seen, queue, &in_queue);
1030           break;
1031
1032         default:
1033           goto fail;
1034         }
1035
1036       /* Find uses of virtual names.  */
1037       if (TREE_CODE (stmt) == PHI_NODE)
1038         {
1039           if (!is_gimple_reg (SSA_NAME_VAR (PHI_RESULT (stmt))))
1040             FOR_EACH_IMM_USE_FAST (use_p, imm_iter, PHI_RESULT (stmt))
1041               {       
1042                 tree imm_stmt = USE_STMT (use_p);
1043
1044                 if (TEST_BIT (seen, get_stmt_uid (imm_stmt)))
1045                   continue;
1046
1047                 if (!flow_bb_inside_loop_p (loop, bb_for_stmt (imm_stmt)))
1048                   continue;
1049
1050                 SET_BIT (seen, get_stmt_uid (imm_stmt));
1051
1052                 queue[in_queue++] = imm_stmt;
1053               }
1054         }
1055       else
1056         FOR_EACH_SSA_TREE_OPERAND (val, stmt, iter, SSA_OP_VIRTUAL_DEFS)
1057           FOR_EACH_IMM_USE_FAST (use_p, imm_iter, val)
1058             {
1059               tree imm_stmt = USE_STMT (use_p);
1060
1061               if (TEST_BIT (seen, get_stmt_uid (imm_stmt)))
1062                 continue;
1063
1064               if (!flow_bb_inside_loop_p (loop, bb_for_stmt (imm_stmt)))
1065                 continue;
1066
1067               SET_BIT (seen, get_stmt_uid (imm_stmt));
1068
1069               queue[in_queue++] = imm_stmt;
1070             }
1071     }
1072
1073   free (queue);
1074   sbitmap_free (seen);
1075
1076   return sra_data.common_ref;
1077
1078 fail:
1079   free_mem_refs (*mem_refs);
1080   *mem_refs = NULL;
1081   free (queue);
1082   sbitmap_free (seen);
1083
1084   return NULL;
1085 }
1086
1087 /* Rewrites memory references in list MEM_REFS by variable TMP_VAR.  */
1088
1089 static void
1090 rewrite_mem_refs (tree tmp_var, struct mem_ref *mem_refs)
1091 {
1092   tree var;
1093   ssa_op_iter iter;
1094
1095   for (; mem_refs; mem_refs = mem_refs->next)
1096     {
1097       FOR_EACH_SSA_TREE_OPERAND (var, mem_refs->stmt, iter, SSA_OP_ALL_VIRTUALS)
1098         mark_sym_for_renaming (SSA_NAME_VAR (var));
1099
1100       *mem_refs->ref = tmp_var;
1101       update_stmt (mem_refs->stmt);
1102     }
1103 }
1104
1105 /* Records request for store motion of memory reference REF from LOOP.
1106    MEM_REFS is the list of occurrences of the reference REF inside LOOP;
1107    these references are rewritten by a new temporary variable.
1108    Exits from the LOOP are stored in EXITS, there are N_EXITS of them.
1109    The initialization of the temporary variable is put to the preheader
1110    of the loop, and assignments to the reference from the temporary variable
1111    are emitted to exits.  */
1112
1113 static void
1114 schedule_sm (struct loop *loop, edge *exits, unsigned n_exits, tree ref,
1115              struct mem_ref *mem_refs)
1116 {
1117   struct mem_ref *aref;
1118   tree tmp_var;
1119   unsigned i;
1120   tree load, store;
1121   struct fmt_data fmt_data;
1122
1123   if (dump_file && (dump_flags & TDF_DETAILS))
1124     {
1125       fprintf (dump_file, "Executing store motion of ");
1126       print_generic_expr (dump_file, ref, 0);
1127       fprintf (dump_file, " from loop %d\n", loop->num);
1128     }
1129
1130   tmp_var = make_rename_temp (TREE_TYPE (ref), "lsm_tmp");
1131
1132   fmt_data.loop = loop;
1133   fmt_data.orig_loop = loop;
1134   for_each_index (&ref, force_move_till, &fmt_data);
1135
1136   rewrite_mem_refs (tmp_var, mem_refs);
1137   for (aref = mem_refs; aref; aref = aref->next)
1138     if (LIM_DATA (aref->stmt))
1139       LIM_DATA (aref->stmt)->sm_done = true;
1140
1141   /* Emit the load & stores.  */
1142   load = build (MODIFY_EXPR, void_type_node, tmp_var, ref);
1143   get_stmt_ann (load)->common.aux = xcalloc (1, sizeof (struct lim_aux_data));
1144   LIM_DATA (load)->max_loop = loop;
1145   LIM_DATA (load)->tgt_loop = loop;
1146
1147   /* Put this into the latch, so that we are sure it will be processed after
1148      all dependencies.  */
1149   bsi_insert_on_edge (loop_latch_edge (loop), load);
1150
1151   for (i = 0; i < n_exits; i++)
1152     {
1153       store = build (MODIFY_EXPR, void_type_node,
1154                      unshare_expr (ref), tmp_var);
1155       bsi_insert_on_edge (exits[i], store);
1156     }
1157 }
1158
1159 /* Returns true if REF may be clobbered by calls.  */
1160
1161 static bool
1162 is_call_clobbered_ref (tree ref)
1163 {
1164   tree base;
1165   HOST_WIDE_INT offset, size;
1166   subvar_t sv;
1167   subvar_t svars;
1168   tree sref = ref;
1169
1170   if (TREE_CODE (sref) == COMPONENT_REF
1171       && (sref = okay_component_ref_for_subvars (sref, &offset, &size)))
1172     {
1173       svars = get_subvars_for_var (sref);
1174       for (sv = svars; sv; sv = sv->next)
1175         {
1176           if (overlap_subvar (offset, size, sv, NULL)
1177               && is_call_clobbered (sv->var))
1178             return true;
1179         }
1180     }
1181               
1182   base = get_base_address (ref);
1183   if (!base)
1184     return true;
1185
1186   if (DECL_P (base))
1187     {
1188       if (var_can_have_subvars (base)
1189           && (svars = get_subvars_for_var (base)))
1190         {
1191           for (sv = svars; sv; sv = sv->next)
1192             if (is_call_clobbered (sv->var))
1193               return true;
1194           return false;
1195         }
1196       else
1197         return is_call_clobbered (base);
1198     }
1199
1200   if (INDIRECT_REF_P (base))
1201     {
1202       /* Check whether the alias tags associated with the pointer
1203          are call clobbered.  */
1204       tree ptr = TREE_OPERAND (base, 0);
1205       struct ptr_info_def *pi = SSA_NAME_PTR_INFO (ptr);
1206       tree nmt = (pi) ? pi->name_mem_tag : NULL_TREE;
1207       tree tmt = var_ann (SSA_NAME_VAR (ptr))->type_mem_tag;
1208
1209       if ((nmt && is_call_clobbered (nmt))
1210           || (tmt && is_call_clobbered (tmt)))
1211         return true;
1212
1213       return false;
1214     }
1215
1216   gcc_unreachable ();
1217 }
1218
1219 /* Determine whether all memory references inside LOOP corresponding to the
1220    virtual ssa name REG are equal to each other, and whether the address of
1221    this common reference can be hoisted outside of the loop.  If this is true,
1222    prepare the statements that load the value of the memory reference to a
1223    temporary variable in the loop preheader, store it back on the loop exits,
1224    and replace all the references inside LOOP by this temporary variable.
1225    LOOP has N_EXITS stored in EXITS.  */
1226
1227 static void
1228 determine_lsm_reg (struct loop *loop, edge *exits, unsigned n_exits, tree reg)
1229 {
1230   tree ref;
1231   struct mem_ref *mem_refs, *aref;
1232   struct loop *must_exec;
1233   bool sees_call;
1234   
1235   if (is_gimple_reg (reg))
1236     return;
1237   
1238   ref = single_reachable_address (loop, SSA_NAME_DEF_STMT (reg), &mem_refs,
1239                                   &sees_call);
1240   if (!ref)
1241     return;
1242
1243   /* If we cannot create a ssa name for the result, give up.  */
1244   if (!is_gimple_reg_type (TREE_TYPE (ref))
1245       || TREE_THIS_VOLATILE (ref))
1246     goto fail;
1247
1248   /* If there is a call that may use the location, give up as well.  */
1249   if (sees_call
1250       && is_call_clobbered_ref (ref))
1251     goto fail;
1252
1253   if (!for_each_index (&ref, may_move_till, loop))
1254     goto fail;
1255
1256   if (tree_could_trap_p (ref))
1257     {
1258       /* If the memory access is unsafe (i.e. it might trap), ensure that some
1259          of the statements in that it occurs is always executed when the loop
1260          is entered.  This way we know that by moving the load from the
1261          reference out of the loop we will not cause the error that would not
1262          occur otherwise.
1263
1264          TODO -- in fact we would like to check for anticipability of the
1265          reference, i.e. that on each path from loop entry to loop exit at
1266          least one of the statements containing the memory reference is
1267          executed.  */
1268
1269       for (aref = mem_refs; aref; aref = aref->next)
1270         {
1271           if (!LIM_DATA (aref->stmt))
1272             continue;
1273
1274           must_exec = LIM_DATA (aref->stmt)->always_executed_in;
1275           if (!must_exec)
1276             continue;
1277
1278           if (must_exec == loop
1279               || flow_loop_nested_p (must_exec, loop))
1280             break;
1281         }
1282
1283       if (!aref)
1284         goto fail;
1285     }
1286
1287   schedule_sm (loop, exits, n_exits, ref, mem_refs);
1288
1289 fail: ;
1290   free_mem_refs (mem_refs);
1291 }
1292
1293 /* Checks whether LOOP (with N_EXITS exits stored in EXITS array) is suitable
1294    for a store motion optimization (i.e. whether we can insert statement
1295    on its exits).  */
1296
1297 static bool
1298 loop_suitable_for_sm (struct loop *loop ATTRIBUTE_UNUSED, edge *exits,
1299                       unsigned n_exits)
1300 {
1301   unsigned i;
1302
1303   for (i = 0; i < n_exits; i++)
1304     if (exits[i]->flags & EDGE_ABNORMAL)
1305       return false;
1306
1307   return true;
1308 }
1309
1310 /* Try to perform store motion for all memory references modified inside
1311    LOOP.  */
1312
1313 static void
1314 determine_lsm_loop (struct loop *loop)
1315 {
1316   tree phi;
1317   unsigned n_exits;
1318   edge *exits = get_loop_exit_edges (loop, &n_exits);
1319
1320   if (!loop_suitable_for_sm (loop, exits, n_exits))
1321     {
1322       free (exits);
1323       return;
1324     }
1325
1326   for (phi = phi_nodes (loop->header); phi; phi = PHI_CHAIN (phi))
1327     determine_lsm_reg (loop, exits, n_exits, PHI_RESULT (phi));
1328
1329   free (exits);
1330 }
1331
1332 /* Try to perform store motion for all memory references modified inside
1333    any of LOOPS.  */
1334
1335 static void
1336 determine_lsm (struct loops *loops)
1337 {
1338   struct loop *loop;
1339   basic_block bb;
1340
1341   if (!loops->tree_root->inner)
1342     return;
1343
1344   /* Create a UID for each statement in the function.  Ordering of the
1345      UIDs is not important for this pass.  */
1346   max_stmt_uid = 0;
1347   FOR_EACH_BB (bb)
1348     {
1349       block_stmt_iterator bsi;
1350
1351       for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
1352         stmt_ann (bsi_stmt (bsi))->uid = max_stmt_uid++;
1353     }
1354
1355   /* Pass the loops from the outermost.  For each virtual operand loop phi node
1356      check whether all the references inside the loop correspond to a single
1357      address, and if so, move them.  */
1358
1359   loop = loops->tree_root->inner;
1360   while (1)
1361     {
1362       determine_lsm_loop (loop);
1363
1364       if (loop->inner)
1365         {
1366           loop = loop->inner;
1367           continue;
1368         }
1369       while (!loop->next)
1370         {
1371           loop = loop->outer;
1372           if (loop == loops->tree_root)
1373             {
1374               loop_commit_inserts ();
1375               return;
1376             }
1377         }
1378       loop = loop->next;
1379     }
1380 }
1381
1382 /* Fills ALWAYS_EXECUTED_IN information for basic blocks of LOOP, i.e.
1383    for each such basic block bb records the outermost loop for that execution
1384    of its header implies execution of bb.  CONTAINS_CALL is the bitmap of
1385    blocks that contain a nonpure call.  */
1386
1387 static void
1388 fill_always_executed_in (struct loop *loop, sbitmap contains_call)
1389 {
1390   basic_block bb = NULL, *bbs, last = NULL;
1391   unsigned i;
1392   edge e;
1393   struct loop *inn_loop = loop;
1394
1395   if (!loop->header->aux)
1396     {
1397       bbs = get_loop_body_in_dom_order (loop);
1398
1399       for (i = 0; i < loop->num_nodes; i++)
1400         {
1401           edge_iterator ei;
1402           bb = bbs[i];
1403
1404           if (dominated_by_p (CDI_DOMINATORS, loop->latch, bb))
1405             last = bb;
1406
1407           if (TEST_BIT (contains_call, bb->index))
1408             break;
1409
1410           FOR_EACH_EDGE (e, ei, bb->succs)
1411             if (!flow_bb_inside_loop_p (loop, e->dest))
1412               break;
1413           if (e)
1414             break;
1415
1416           /* A loop might be infinite (TODO use simple loop analysis
1417              to disprove this if possible).  */
1418           if (bb->flags & BB_IRREDUCIBLE_LOOP)
1419             break;
1420
1421           if (!flow_bb_inside_loop_p (inn_loop, bb))
1422             break;
1423
1424           if (bb->loop_father->header == bb)
1425             {
1426               if (!dominated_by_p (CDI_DOMINATORS, loop->latch, bb))
1427                 break;
1428
1429               /* In a loop that is always entered we may proceed anyway.
1430                  But record that we entered it and stop once we leave it.  */
1431               inn_loop = bb->loop_father;
1432             }
1433         }
1434
1435       while (1)
1436         {
1437           last->aux = loop;
1438           if (last == loop->header)
1439             break;
1440           last = get_immediate_dominator (CDI_DOMINATORS, last);
1441         }
1442
1443       free (bbs);
1444     }
1445
1446   for (loop = loop->inner; loop; loop = loop->next)
1447     fill_always_executed_in (loop, contains_call);
1448 }
1449
1450 /* Compute the global information needed by the loop invariant motion pass.
1451    LOOPS is the loop tree.  */
1452
1453 static void
1454 tree_ssa_lim_initialize (struct loops *loops)
1455 {
1456   sbitmap contains_call = sbitmap_alloc (last_basic_block);
1457   block_stmt_iterator bsi;
1458   struct loop *loop;
1459   basic_block bb;
1460
1461   sbitmap_zero (contains_call);
1462   FOR_EACH_BB (bb)
1463     {
1464       for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
1465         {
1466           if (nonpure_call_p (bsi_stmt (bsi)))
1467             break;
1468         }
1469
1470       if (!bsi_end_p (bsi))
1471         SET_BIT (contains_call, bb->index);
1472     }
1473
1474   for (loop = loops->tree_root->inner; loop; loop = loop->next)
1475     fill_always_executed_in (loop, contains_call);
1476
1477   sbitmap_free (contains_call);
1478 }
1479
1480 /* Cleans up after the invariant motion pass.  */
1481
1482 static void
1483 tree_ssa_lim_finalize (void)
1484 {
1485   basic_block bb;
1486
1487   FOR_EACH_BB (bb)
1488     {
1489       bb->aux = NULL;
1490     }
1491 }
1492
1493 /* Moves invariants from LOOPS.  Only "expensive" invariants are moved out --
1494    i.e. those that are likely to be win regardless of the register pressure.  */
1495
1496 void
1497 tree_ssa_lim (struct loops *loops)
1498 {
1499   tree_ssa_lim_initialize (loops);
1500
1501   /* For each statement determine the outermost loop in that it is
1502      invariant and cost for computing the invariant.  */
1503   determine_invariantness ();
1504
1505   /* For each memory reference determine whether it is possible to hoist it
1506      out of the loop.  Force the necessary invariants to be moved out of the
1507      loops as well.  */
1508   determine_lsm (loops);
1509
1510   /* Move the expressions that are expensive enough.  */
1511   move_computations ();
1512
1513   tree_ssa_lim_finalize ();
1514 }