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