gimplify.c (is_gimple_addr_expr_arg_or_indirect): Remove.
[gcc.git] / gcc / tree-ssa-loop-im.c
1 /* Loop invariant motion.
2 Copyright (C) 2003 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 /* A type for the list of statements that have to be moved in order to be able
42 to hoist an invariant computation. */
43
44 struct depend
45 {
46 tree stmt;
47 struct depend *next;
48 };
49
50 /* The possibilities of statement movement. */
51
52 enum move_pos
53 {
54 MOVE_IMPOSSIBLE, /* No movement -- side effect expression. */
55 MOVE_PRESERVE_EXECUTION, /* Must not cause the non-executed statement
56 become executed -- memory accesses, ... */
57 MOVE_POSSIBLE /* Unlimited movement. */
58 };
59
60 /* The auxiliary data kept for each statement. */
61
62 struct lim_aux_data
63 {
64 struct loop *max_loop; /* The outermost loop in that the statement
65 is invariant. */
66
67 struct loop *tgt_loop; /* The loop out of that we want to move the
68 invariant. */
69
70 struct loop *always_executed_in;
71 /* The outermost loop for that we are sure
72 the statement is executed if the loop
73 is entered. */
74
75 bool sm_done; /* True iff the store motion for a memory
76 reference in the statement has already
77 been executed. */
78
79 unsigned cost; /* Cost of the computation performed by the
80 statement. */
81
82 struct depend *depends; /* List of statements that must be also hoisted
83 out of the loop when this statement is
84 hoisted; i.e. those that define the operands
85 of the statement and are inside of the
86 MAX_LOOP loop. */
87 };
88
89 #define LIM_DATA(STMT) ((struct lim_aux_data *) (stmt_ann (STMT)->common.aux))
90
91 /* Description of a memory reference for store motion. */
92
93 struct mem_ref
94 {
95 tree *ref; /* The reference itself. */
96 tree stmt; /* The statement in that it occurs. */
97 struct mem_ref *next; /* Next use in the chain. */
98 };
99
100 /* Minimum cost of an expensive expression. */
101 #define LIM_EXPENSIVE ((unsigned) PARAM_VALUE (PARAM_LIM_EXPENSIVE))
102
103 /* The outermost loop for that execution of the header guarantees that the
104 block will be executed. */
105 #define ALWAYS_EXECUTED_IN(BB) ((struct loop *) (BB)->aux)
106
107 /* Maximum uid in the statement in the function. */
108
109 static unsigned max_uid;
110
111 /* Calls CBCK for each index in memory reference ADDR_P. There are two
112 kinds situations handled; in each of these cases, the memory reference
113 and DATA are passed to the callback:
114
115 Access to an array: ARRAY_{RANGE_}REF (base, index). In this case we also
116 pass the pointer to the index to the callback.
117
118 Pointer dereference: INDIRECT_REF (addr). In this case we also pass the
119 pointer to addr to the callback.
120
121 If the callback returns false, the whole search stops and false is returned.
122 Otherwise the function returns true after traversing through the whole
123 reference *ADDR_P. */
124
125 bool
126 for_each_index (tree *addr_p, bool (*cbck) (tree, tree *, void *), void *data)
127 {
128 tree *nxt;
129
130 for (; ; addr_p = nxt)
131 {
132 switch (TREE_CODE (*addr_p))
133 {
134 case SSA_NAME:
135 return cbck (*addr_p, addr_p, data);
136
137 case INDIRECT_REF:
138 nxt = &TREE_OPERAND (*addr_p, 0);
139 return cbck (*addr_p, nxt, data);
140
141 case BIT_FIELD_REF:
142 case COMPONENT_REF:
143 case VIEW_CONVERT_EXPR:
144 case ARRAY_RANGE_REF:
145 nxt = &TREE_OPERAND (*addr_p, 0);
146 break;
147
148 case ARRAY_REF:
149 nxt = &TREE_OPERAND (*addr_p, 0);
150 if (!cbck (*addr_p, &TREE_OPERAND (*addr_p, 1), data))
151 return false;
152 break;
153
154 case VAR_DECL:
155 case PARM_DECL:
156 case STRING_CST:
157 case RESULT_DECL:
158 return true;
159
160 default:
161 abort ();
162 }
163 }
164 }
165
166 /* If it is possible to hoist the statement STMT unconditionally,
167 returns MOVE_POSSIBLE.
168 If it is possible to hoist the statement STMT, but we must avoid making
169 it executed if it would not be executed in the original program (e.g.
170 because it may trap), return MOVE_PRESERVE_EXECUTION.
171 Otherwise return MOVE_IMPOSSIBLE. */
172
173 static enum move_pos
174 movement_possibility (tree stmt)
175 {
176 tree lhs, rhs;
177
178 if (flag_unswitch_loops
179 && TREE_CODE (stmt) == COND_EXPR)
180 {
181 /* If we perform unswitching, force the operands of the invariant
182 condition to be moved out of the loop. */
183 get_stmt_operands (stmt);
184
185 return MOVE_POSSIBLE;
186 }
187
188 if (TREE_CODE (stmt) != MODIFY_EXPR)
189 return MOVE_IMPOSSIBLE;
190
191 if (stmt_ends_bb_p (stmt))
192 return MOVE_IMPOSSIBLE;
193
194 get_stmt_operands (stmt);
195
196 if (stmt_ann (stmt)->has_volatile_ops)
197 return MOVE_IMPOSSIBLE;
198
199 lhs = TREE_OPERAND (stmt, 0);
200 if (TREE_CODE (lhs) == SSA_NAME
201 && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (lhs))
202 return MOVE_IMPOSSIBLE;
203
204 rhs = TREE_OPERAND (stmt, 1);
205
206 if (TREE_SIDE_EFFECTS (rhs))
207 return MOVE_IMPOSSIBLE;
208
209 if (TREE_CODE (lhs) != SSA_NAME
210 || tree_could_trap_p (rhs))
211 return MOVE_PRESERVE_EXECUTION;
212
213 return MOVE_POSSIBLE;
214 }
215
216 /* Suppose that operand DEF is used inside the LOOP. Returns the outermost
217 loop to that we could move the expresion using DEF if it did not have
218 other operands, i.e. the outermost loop enclosing LOOP in that the value
219 of DEF is invariant. */
220
221 static struct loop *
222 outermost_invariant_loop (tree def, struct loop *loop)
223 {
224 tree def_stmt;
225 basic_block def_bb;
226 struct loop *max_loop;
227
228 if (TREE_CODE (def) != SSA_NAME)
229 return superloop_at_depth (loop, 1);
230
231 def_stmt = SSA_NAME_DEF_STMT (def);
232 def_bb = bb_for_stmt (def_stmt);
233 if (!def_bb)
234 return superloop_at_depth (loop, 1);
235
236 max_loop = find_common_loop (loop, def_bb->loop_father);
237
238 if (LIM_DATA (def_stmt) && LIM_DATA (def_stmt)->max_loop)
239 max_loop = find_common_loop (max_loop,
240 LIM_DATA (def_stmt)->max_loop->outer);
241 if (max_loop == loop)
242 return NULL;
243 max_loop = superloop_at_depth (loop, max_loop->depth + 1);
244
245 return max_loop;
246 }
247
248 /* Returns the outermost superloop of LOOP in that the expression EXPR is
249 invariant. */
250
251 static struct loop *
252 outermost_invariant_loop_expr (tree expr, struct loop *loop)
253 {
254 char class = TREE_CODE_CLASS (TREE_CODE (expr));
255 unsigned i, nops;
256 struct loop *max_loop = superloop_at_depth (loop, 1), *aloop;
257
258 if (TREE_CODE (expr) == SSA_NAME
259 || TREE_CODE (expr) == INTEGER_CST
260 || is_gimple_min_invariant (expr))
261 return outermost_invariant_loop (expr, loop);
262
263 if (class != '1'
264 && class != '2'
265 && class != 'e'
266 && class != '<')
267 return NULL;
268
269 nops = first_rtl_op (TREE_CODE (expr));
270 for (i = 0; i < nops; i++)
271 {
272 aloop = outermost_invariant_loop_expr (TREE_OPERAND (expr, i), loop);
273 if (!aloop)
274 return NULL;
275
276 if (flow_loop_nested_p (max_loop, aloop))
277 max_loop = aloop;
278 }
279
280 return max_loop;
281 }
282
283 /* DATA is a structure containing information associated with a statement
284 inside LOOP. DEF is one of the operands of this statement.
285
286 Find the outermost loop enclosing LOOP in that value of DEF is invariant
287 and record this in DATA->max_loop field. If DEF itself is defined inside
288 this loop as well (i.e. we need to hoist it out of the loop if we want
289 to hoist the statement represented by DATA), record the statement in that
290 DEF is defined to the DATA->depends list. Additionally if ADD_COST is true,
291 add the cost of the computation of DEF to the DATA->cost.
292
293 If DEF is not invariant in LOOP, return false. Otherwise return TRUE. */
294
295 static bool
296 add_dependency (tree def, struct lim_aux_data *data, struct loop *loop,
297 bool add_cost)
298 {
299 tree def_stmt = SSA_NAME_DEF_STMT (def);
300 basic_block def_bb = bb_for_stmt (def_stmt);
301 struct loop *max_loop;
302 struct depend *dep;
303
304 if (!def_bb)
305 return true;
306
307 max_loop = outermost_invariant_loop (def, loop);
308 if (!max_loop)
309 return false;
310
311 if (flow_loop_nested_p (data->max_loop, max_loop))
312 data->max_loop = max_loop;
313
314 if (!LIM_DATA (def_stmt))
315 return true;
316
317 if (add_cost
318 /* Only add the cost if the statement defining DEF is inside LOOP,
319 i.e. if it is likely that by moving the invariants dependent
320 on it, we will be able to avoid creating a new register for
321 it (since it will be only used in these dependent invariants). */
322 && def_bb->loop_father == loop)
323 data->cost += LIM_DATA (def_stmt)->cost;
324
325 dep = xmalloc (sizeof (struct depend));
326 dep->stmt = def_stmt;
327 dep->next = data->depends;
328 data->depends = dep;
329
330 return true;
331 }
332
333 /* Returns an estimate for a cost of statement STMT. TODO -- the values here
334 are just ad-hoc constants. The estimates should be based on target-specific
335 values. */
336
337 static unsigned
338 stmt_cost (tree stmt)
339 {
340 tree lhs, rhs;
341 unsigned cost = 1;
342
343 /* Always try to create possibilities for unswitching. */
344 if (TREE_CODE (stmt) == COND_EXPR)
345 return LIM_EXPENSIVE;
346
347 lhs = TREE_OPERAND (stmt, 0);
348 rhs = TREE_OPERAND (stmt, 1);
349
350 /* Hoisting memory references out should almost surely be a win. */
351 if (!is_gimple_variable (lhs))
352 cost += 20;
353 if (is_gimple_addressable (rhs) && !is_gimple_variable (rhs))
354 cost += 20;
355
356 switch (TREE_CODE (rhs))
357 {
358 case CALL_EXPR:
359 /* We should be hoisting calls if possible. */
360
361 /* Unless the call is a builtin_constant_p; this always folds to a
362 constant, so moving it is useless. */
363 rhs = get_callee_fndecl (rhs);
364 if (DECL_BUILT_IN (rhs)
365 && DECL_FUNCTION_CODE (rhs) == BUILT_IN_CONSTANT_P)
366 return 0;
367
368 cost += 20;
369 break;
370
371 case MULT_EXPR:
372 case TRUNC_DIV_EXPR:
373 case CEIL_DIV_EXPR:
374 case FLOOR_DIV_EXPR:
375 case ROUND_DIV_EXPR:
376 case EXACT_DIV_EXPR:
377 case CEIL_MOD_EXPR:
378 case FLOOR_MOD_EXPR:
379 case ROUND_MOD_EXPR:
380 case TRUNC_MOD_EXPR:
381 /* Division and multiplication are usually expensive. */
382 cost += 20;
383 break;
384
385 default:
386 break;
387 }
388
389 return cost;
390 }
391
392 /* Determine the outermost loop to that it is possible to hoist a statement
393 STMT and store it to LIM_DATA (STMT)->max_loop. To do this we determine
394 the outermost loop in that the value computed by STMT is invariant.
395 If MUST_PRESERVE_EXEC is true, additionally choose such a loop that
396 we preserve the fact whether STMT is executed. It also fills other related
397 information to LIM_DATA (STMT).
398
399 The function returns false if STMT cannot be hoisted outside of the loop it
400 is defined in, and true otherwise. */
401
402 static bool
403 determine_max_movement (tree stmt, bool must_preserve_exec)
404 {
405 basic_block bb = bb_for_stmt (stmt);
406 struct loop *loop = bb->loop_father;
407 struct loop *level;
408 struct lim_aux_data *lim_data = LIM_DATA (stmt);
409 use_optype uses;
410 vuse_optype vuses;
411 v_may_def_optype v_may_defs;
412 stmt_ann_t ann = stmt_ann (stmt);
413 unsigned i;
414
415 if (must_preserve_exec)
416 level = ALWAYS_EXECUTED_IN (bb);
417 else
418 level = superloop_at_depth (loop, 1);
419 lim_data->max_loop = level;
420
421 uses = USE_OPS (ann);
422 for (i = 0; i < NUM_USES (uses); i++)
423 if (!add_dependency (USE_OP (uses, i), lim_data, loop, true))
424 return false;
425
426 vuses = VUSE_OPS (ann);
427 for (i = 0; i < NUM_VUSES (vuses); i++)
428 if (!add_dependency (VUSE_OP (vuses, i), lim_data, loop, false))
429 return false;
430
431 v_may_defs = V_MAY_DEF_OPS (ann);
432 for (i = 0; i < NUM_V_MAY_DEFS (v_may_defs); i++)
433 if (!add_dependency (V_MAY_DEF_OP (v_may_defs, i), lim_data, loop, false))
434 return false;
435
436 lim_data->cost += stmt_cost (stmt);
437
438 return true;
439 }
440
441 /* Suppose that some statement in ORIG_LOOP is hoisted to the loop LEVEL,
442 and that one of the operands of this statement is computed by STMT.
443 Ensure that STMT (together with all the statements that define its
444 operands) is hoisted at least out of the loop LEVEL. */
445
446 static void
447 set_level (tree stmt, struct loop *orig_loop, struct loop *level)
448 {
449 struct loop *stmt_loop = bb_for_stmt (stmt)->loop_father;
450 struct depend *dep;
451
452 stmt_loop = find_common_loop (orig_loop, stmt_loop);
453 if (LIM_DATA (stmt) && LIM_DATA (stmt)->tgt_loop)
454 stmt_loop = find_common_loop (stmt_loop,
455 LIM_DATA (stmt)->tgt_loop->outer);
456 if (flow_loop_nested_p (stmt_loop, level))
457 return;
458
459 if (!LIM_DATA (stmt))
460 abort ();
461
462 if (level != LIM_DATA (stmt)->max_loop
463 && !flow_loop_nested_p (LIM_DATA (stmt)->max_loop, level))
464 abort ();
465
466 LIM_DATA (stmt)->tgt_loop = level;
467 for (dep = LIM_DATA (stmt)->depends; dep; dep = dep->next)
468 set_level (dep->stmt, orig_loop, level);
469 }
470
471 /* Determines an outermost loop from that we want to hoist the statement STMT.
472 For now we chose the outermost possible loop. TODO -- use profiling
473 information to set it more sanely. */
474
475 static void
476 set_profitable_level (tree stmt)
477 {
478 set_level (stmt, bb_for_stmt (stmt)->loop_father, LIM_DATA (stmt)->max_loop);
479 }
480
481 /* Returns true if STMT is not a pure call. */
482
483 static bool
484 nonpure_call_p (tree stmt)
485 {
486 tree call = get_call_expr_in (stmt);
487
488 if (!call)
489 return false;
490
491 return TREE_SIDE_EFFECTS (call) != 0;
492 }
493
494 /* Releases the memory occupied by DATA. */
495
496 static void
497 free_lim_aux_data (struct lim_aux_data *data)
498 {
499 struct depend *dep, *next;
500
501 for (dep = data->depends; dep; dep = next)
502 {
503 next = dep->next;
504 free (dep);
505 }
506 free (data);
507 }
508
509 /* Determine the outermost loops in that statements in basic block BB are
510 invariant, and record them to the LIM_DATA associated with the statements.
511 Callback for walk_dominator_tree. */
512
513 static void
514 determine_invariantness_stmt (struct dom_walk_data *dw_data ATTRIBUTE_UNUSED,
515 basic_block bb)
516 {
517 enum move_pos pos;
518 block_stmt_iterator bsi;
519 tree stmt;
520 bool maybe_never = ALWAYS_EXECUTED_IN (bb) == NULL;
521 struct loop *outermost = ALWAYS_EXECUTED_IN (bb);
522
523 if (!bb->loop_father->outer)
524 return;
525
526 if (dump_file && (dump_flags & TDF_DETAILS))
527 fprintf (dump_file, "Basic block %d (loop %d -- depth %d):\n\n",
528 bb->index, bb->loop_father->num, bb->loop_father->depth);
529
530 for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
531 {
532 stmt = bsi_stmt (bsi);
533
534 pos = movement_possibility (stmt);
535 if (pos == MOVE_IMPOSSIBLE)
536 {
537 if (nonpure_call_p (stmt))
538 {
539 maybe_never = true;
540 outermost = NULL;
541 }
542 continue;
543 }
544
545 stmt_ann (stmt)->common.aux = xcalloc (1, sizeof (struct lim_aux_data));
546 LIM_DATA (stmt)->always_executed_in = outermost;
547
548 if (maybe_never && pos == MOVE_PRESERVE_EXECUTION)
549 continue;
550
551 if (!determine_max_movement (stmt, pos == MOVE_PRESERVE_EXECUTION))
552 {
553 LIM_DATA (stmt)->max_loop = NULL;
554 continue;
555 }
556
557 if (dump_file && (dump_flags & TDF_DETAILS))
558 {
559 print_generic_stmt_indented (dump_file, stmt, 0, 2);
560 fprintf (dump_file, " invariant up to level %d, cost %d.\n\n",
561 LIM_DATA (stmt)->max_loop->depth,
562 LIM_DATA (stmt)->cost);
563 }
564
565 if (LIM_DATA (stmt)->cost >= LIM_EXPENSIVE)
566 set_profitable_level (stmt);
567 }
568 }
569
570 /* For each statement determines the outermost loop in that it is invariant,
571 statements on whose motion it depends and the cost of the computation.
572 This information is stored to the LIM_DATA structure associated with
573 each statement. */
574
575 static void
576 determine_invariantness (void)
577 {
578 struct dom_walk_data walk_data;
579
580 memset (&walk_data, 0, sizeof (struct dom_walk_data));
581 walk_data.before_dom_children_before_stmts = determine_invariantness_stmt;
582
583 init_walk_dominator_tree (&walk_data);
584 walk_dominator_tree (&walk_data, ENTRY_BLOCK_PTR);
585 fini_walk_dominator_tree (&walk_data);
586 }
587
588 /* Commits edge insertions and updates loop structures. */
589
590 void
591 loop_commit_inserts (void)
592 {
593 unsigned old_last_basic_block, i;
594 basic_block bb;
595
596 old_last_basic_block = last_basic_block;
597 bsi_commit_edge_inserts (NULL);
598 for (i = old_last_basic_block; i < (unsigned) last_basic_block; i++)
599 {
600 bb = BASIC_BLOCK (i);
601 add_bb_to_loop (bb,
602 find_common_loop (bb->succ->dest->loop_father,
603 bb->pred->src->loop_father));
604 }
605 }
606
607 /* Hoist the statements in basic block BB out of the loops prescribed by
608 data stored in LIM_DATA structres associated with each statement. Callback
609 for walk_dominator_tree. */
610
611 static void
612 move_computations_stmt (struct dom_walk_data *dw_data ATTRIBUTE_UNUSED,
613 basic_block bb)
614 {
615 struct loop *level;
616 block_stmt_iterator bsi;
617 tree stmt;
618 unsigned cost = 0;
619
620 if (!bb->loop_father->outer)
621 return;
622
623 for (bsi = bsi_start (bb); !bsi_end_p (bsi); )
624 {
625 stmt = bsi_stmt (bsi);
626
627 if (!LIM_DATA (stmt))
628 {
629 bsi_next (&bsi);
630 continue;
631 }
632
633 cost = LIM_DATA (stmt)->cost;
634 level = LIM_DATA (stmt)->tgt_loop;
635 free_lim_aux_data (LIM_DATA (stmt));
636 stmt_ann (stmt)->common.aux = NULL;
637
638 if (!level)
639 {
640 bsi_next (&bsi);
641 continue;
642 }
643
644 /* We do not really want to move conditionals out of the loop; we just
645 placed it here to force its operands to be moved if necessary. */
646 if (TREE_CODE (stmt) == COND_EXPR)
647 continue;
648
649 if (dump_file && (dump_flags & TDF_DETAILS))
650 {
651 fprintf (dump_file, "Moving statement\n");
652 print_generic_stmt (dump_file, stmt, 0);
653 fprintf (dump_file, "(cost %u) out of loop %d.\n\n",
654 cost, level->num);
655 }
656 bsi_insert_on_edge (loop_preheader_edge (level), stmt);
657 bsi_remove (&bsi);
658 }
659 }
660
661 /* Hoist the statements out of the loops prescribed by data stored in
662 LIM_DATA structres associated with each statement.*/
663
664 static void
665 move_computations (void)
666 {
667 struct dom_walk_data walk_data;
668
669 memset (&walk_data, 0, sizeof (struct dom_walk_data));
670 walk_data.before_dom_children_before_stmts = move_computations_stmt;
671
672 init_walk_dominator_tree (&walk_data);
673 walk_dominator_tree (&walk_data, ENTRY_BLOCK_PTR);
674 fini_walk_dominator_tree (&walk_data);
675
676 loop_commit_inserts ();
677 rewrite_into_ssa (false);
678 bitmap_clear (vars_to_rename);
679 }
680
681 /* Checks whether the statement defining variable *INDEX can be hoisted
682 out of the loop passed in DATA. Callback for for_each_index. */
683
684 static bool
685 may_move_till (tree ref, tree *index, void *data)
686 {
687 struct loop *loop = data, *max_loop;
688
689 /* If REF is an array reference, check also that the step and the lower
690 bound is invariant in LOOP. */
691 if (TREE_CODE (ref) == ARRAY_REF)
692 {
693 tree step = array_ref_element_size (ref);
694 tree lbound = array_ref_low_bound (ref);
695
696 max_loop = outermost_invariant_loop_expr (step, loop);
697 if (!max_loop)
698 return false;
699
700 max_loop = outermost_invariant_loop_expr (lbound, loop);
701 if (!max_loop)
702 return false;
703 }
704
705 max_loop = outermost_invariant_loop (*index, loop);
706 if (!max_loop)
707 return false;
708
709 return true;
710 }
711
712 /* Forces statements definining (invariant) SSA names in expression EXPR to be
713 moved out of the LOOP. */
714
715 static void
716 force_move_till_expr (tree expr, struct loop *loop)
717 {
718 char class = TREE_CODE_CLASS (TREE_CODE (expr));
719 unsigned i, nops;
720
721 if (TREE_CODE (expr) == SSA_NAME)
722 {
723 tree stmt = SSA_NAME_DEF_STMT (expr);
724 if (IS_EMPTY_STMT (stmt))
725 return;
726
727 set_level (stmt, bb_for_stmt (stmt)->loop_father, loop);
728 return;
729 }
730
731 if (class != '1'
732 && class != '2'
733 && class != 'e'
734 && class != '<')
735 return;
736
737 nops = first_rtl_op (TREE_CODE (expr));
738 for (i = 0; i < nops; i++)
739 force_move_till_expr (TREE_OPERAND (expr, i), loop);
740 }
741
742 /* Forces statement defining invariants in REF (and *INDEX) to be moved out of
743 the loop passed in DATA. Callback for for_each_index. */
744
745 static bool
746 force_move_till (tree ref, tree *index, void *data)
747 {
748 tree stmt;
749
750 if (TREE_CODE (ref) == ARRAY_REF)
751 {
752 tree step = array_ref_element_size (ref);
753 tree lbound = array_ref_low_bound (ref);
754
755 force_move_till_expr (step, data);
756 force_move_till_expr (lbound, data);
757 }
758
759 if (TREE_CODE (*index) != SSA_NAME)
760 return true;
761
762 stmt = SSA_NAME_DEF_STMT (*index);
763 if (IS_EMPTY_STMT (stmt))
764 return true;
765
766 set_level (stmt, bb_for_stmt (stmt)->loop_father, data);
767
768 return true;
769 }
770
771 /* Records memory reference *REF (that occurs in statement STMT)
772 to the list MEM_REFS. */
773
774 static void
775 record_mem_ref (struct mem_ref **mem_refs, tree stmt, tree *ref)
776 {
777 struct mem_ref *aref = xmalloc (sizeof (struct mem_ref));
778
779 aref->stmt = stmt;
780 aref->ref = ref;
781
782 aref->next = *mem_refs;
783 *mem_refs = aref;
784 }
785
786 /* Releases list of memory references MEM_REFS. */
787
788 static void
789 free_mem_refs (struct mem_ref *mem_refs)
790 {
791 struct mem_ref *act;
792
793 while (mem_refs)
794 {
795 act = mem_refs;
796 mem_refs = mem_refs->next;
797 free (act);
798 }
799 }
800
801 /* If VAR is defined in LOOP and the statement it is defined in does not belong
802 to the set SEEN, add the statement to QUEUE of length IN_QUEUE and
803 to the set SEEN. */
804
805 static void
806 maybe_queue_var (tree var, struct loop *loop,
807 sbitmap seen, tree *queue, unsigned *in_queue)
808 {
809 tree stmt = SSA_NAME_DEF_STMT (var);
810 basic_block def_bb = bb_for_stmt (stmt);
811
812 if (!def_bb
813 || !flow_bb_inside_loop_p (loop, def_bb)
814 || TEST_BIT (seen, stmt_ann (stmt)->uid))
815 return;
816
817 SET_BIT (seen, stmt_ann (stmt)->uid);
818 queue[(*in_queue)++] = stmt;
819 }
820
821 /* Determine whether all memory references inside the LOOP that correspond
822 to virtual ssa names defined in statement STMT are equal.
823 If so, store the list of the references to MEM_REFS, and return one
824 of them. Otherwise store NULL to MEM_REFS and return NULL_TREE. */
825
826 static tree
827 single_reachable_address (struct loop *loop, tree stmt,
828 struct mem_ref **mem_refs)
829 {
830 tree *queue = xmalloc (sizeof (tree) * max_uid);
831 sbitmap seen = sbitmap_alloc (max_uid);
832 tree common_ref = NULL, *aref;
833 unsigned in_queue = 1;
834 dataflow_t df;
835 unsigned i, n;
836 v_may_def_optype v_may_defs;
837 vuse_optype vuses;
838
839 sbitmap_zero (seen);
840
841 *mem_refs = NULL;
842
843 queue[0] = stmt;
844 SET_BIT (seen, stmt_ann (stmt)->uid);
845
846 while (in_queue)
847 {
848 stmt = queue[--in_queue];
849
850 if (LIM_DATA (stmt)
851 && LIM_DATA (stmt)->sm_done)
852 goto fail;
853
854 switch (TREE_CODE (stmt))
855 {
856 case MODIFY_EXPR:
857 aref = &TREE_OPERAND (stmt, 0);
858 if (is_gimple_reg (*aref)
859 || !is_gimple_lvalue (*aref))
860 aref = &TREE_OPERAND (stmt, 1);
861 if (is_gimple_reg (*aref)
862 || !is_gimple_lvalue (*aref)
863 || (common_ref && !operand_equal_p (*aref, common_ref, 0)))
864 goto fail;
865 common_ref = *aref;
866
867 record_mem_ref (mem_refs, stmt, aref);
868
869 /* Traverse also definitions of the VUSES (there may be other
870 distinct from the one we used to get to this statement). */
871 v_may_defs = STMT_V_MAY_DEF_OPS (stmt);
872 for (i = 0; i < NUM_V_MAY_DEFS (v_may_defs); i++)
873 maybe_queue_var (V_MAY_DEF_OP (v_may_defs, i), loop,
874 seen, queue, &in_queue);
875
876 vuses = STMT_VUSE_OPS (stmt);
877 for (i = 0; i < NUM_VUSES (vuses); i++)
878 maybe_queue_var (VUSE_OP (vuses, i), loop,
879 seen, queue, &in_queue);
880 break;
881
882 case PHI_NODE:
883 for (i = 0; i < (unsigned) PHI_NUM_ARGS (stmt); i++)
884 maybe_queue_var (PHI_ARG_DEF (stmt, i), loop,
885 seen, queue, &in_queue);
886 break;
887
888 default:
889 goto fail;
890 }
891
892 /* Find uses of virtual names. */
893 df = get_immediate_uses (stmt);
894 n = num_immediate_uses (df);
895
896 for (i = 0; i < n; i++)
897 {
898 stmt = immediate_use (df, i);
899
900 if (!flow_bb_inside_loop_p (loop, bb_for_stmt (stmt)))
901 continue;
902
903 if (TEST_BIT (seen, stmt_ann (stmt)->uid))
904 continue;
905 SET_BIT (seen, stmt_ann (stmt)->uid);
906
907 queue[in_queue++] = stmt;
908 }
909 }
910
911 free (queue);
912 sbitmap_free (seen);
913
914 return common_ref;
915
916 fail:
917 free_mem_refs (*mem_refs);
918 *mem_refs = NULL;
919 free (queue);
920 sbitmap_free (seen);
921
922 return NULL;
923 }
924
925 /* Rewrites memory references in list MEM_REFS by variable TMP_VAR. */
926
927 static void
928 rewrite_mem_refs (tree tmp_var, struct mem_ref *mem_refs)
929 {
930 v_may_def_optype v_may_defs;
931 v_must_def_optype v_must_defs;
932 vuse_optype vuses;
933 unsigned i;
934 tree var;
935
936 for (; mem_refs; mem_refs = mem_refs->next)
937 {
938 v_may_defs = STMT_V_MAY_DEF_OPS (mem_refs->stmt);
939 for (i = 0; i < NUM_V_MAY_DEFS (v_may_defs); i++)
940 {
941 var = SSA_NAME_VAR (V_MAY_DEF_RESULT (v_may_defs, i));
942 bitmap_set_bit (vars_to_rename, var_ann (var)->uid);
943 }
944
945 v_must_defs = STMT_V_MUST_DEF_OPS (mem_refs->stmt);
946 for (i = 0; i < NUM_V_MUST_DEFS (v_must_defs); i++)
947 {
948 var = SSA_NAME_VAR (V_MUST_DEF_OP (v_must_defs, i));
949 bitmap_set_bit (vars_to_rename, var_ann (var)->uid);
950 }
951
952 vuses = STMT_VUSE_OPS (mem_refs->stmt);
953 for (i = 0; i < NUM_VUSES (vuses); i++)
954 {
955 var = SSA_NAME_VAR (VUSE_OP (vuses, i));
956 bitmap_set_bit (vars_to_rename, var_ann (var)->uid);
957 }
958
959 *mem_refs->ref = tmp_var;
960 modify_stmt (mem_refs->stmt);
961 }
962 }
963
964 /* Records request for store motion of memory reference REF from LOOP.
965 MEM_REFS is the list of occurences of the reference REF inside LOOP;
966 these references are rewritten by a new temporary variable.
967 Exits from the LOOP are stored in EXITS, there are N_EXITS of them.
968 The initialization of the temporary variable is put to the preheader
969 of the loop, and assignments to the reference from the temporary variable
970 are emitted to exits. */
971
972 static void
973 schedule_sm (struct loop *loop, edge *exits, unsigned n_exits, tree ref,
974 struct mem_ref *mem_refs)
975 {
976 struct mem_ref *aref;
977 tree tmp_var;
978 unsigned i;
979 tree load, store;
980
981 tmp_var = make_rename_temp (TREE_TYPE (ref), "lsm_tmp");
982
983 for_each_index (&ref, force_move_till, loop);
984
985 rewrite_mem_refs (tmp_var, mem_refs);
986 for (aref = mem_refs; aref; aref = aref->next)
987 if (LIM_DATA (aref->stmt))
988 LIM_DATA (aref->stmt)->sm_done = true;
989
990 /* Emit the load & stores. */
991 load = build (MODIFY_EXPR, void_type_node, tmp_var, ref);
992 modify_stmt (load);
993 stmt_ann (load)->common.aux = xcalloc (1, sizeof (struct lim_aux_data));
994 LIM_DATA (load)->max_loop = loop;
995 LIM_DATA (load)->tgt_loop = loop;
996
997 /* Put this into the latch, so that we are sure it will be processed after
998 all dependencies. */
999 bsi_insert_on_edge (loop_latch_edge (loop), load);
1000
1001 for (i = 0; i < n_exits; i++)
1002 {
1003 store = build (MODIFY_EXPR, void_type_node,
1004 unshare_expr (ref), tmp_var);
1005 bsi_insert_on_edge (exits[i], store);
1006 }
1007 }
1008
1009 /* Determine whether all memory references inside LOOP corresponding to the
1010 virtual ssa name REG are equal to each other, and whether the address of
1011 this common reference can be hoisted outside of the loop. If this is true,
1012 prepare the statements that load the value of the memory reference to a
1013 temporary variable in the loop preheader, store it back on the loop exits,
1014 and replace all the references inside LOOP by this temporary variable.
1015 LOOP has N_EXITS stored in EXITS. */
1016
1017 static void
1018 determine_lsm_reg (struct loop *loop, edge *exits, unsigned n_exits, tree reg)
1019 {
1020 tree ref;
1021 struct mem_ref *mem_refs, *aref;
1022 struct loop *must_exec;
1023
1024 if (is_gimple_reg (reg))
1025 return;
1026
1027 ref = single_reachable_address (loop, SSA_NAME_DEF_STMT (reg), &mem_refs);
1028 if (!ref)
1029 return;
1030
1031 if (!for_each_index (&ref, may_move_till, loop))
1032 {
1033 free_mem_refs (mem_refs);
1034 return;
1035 }
1036
1037 if (tree_could_trap_p (ref))
1038 {
1039 /* If the memory access is unsafe (i.e. it might trap), ensure that some
1040 of the statements in that it occurs is always executed when the loop
1041 is entered. This way we know that by moving the load from the
1042 reference out of the loop we will not cause the error that would not
1043 occur otherwise.
1044
1045 TODO -- in fact we would like to check for anticipability of the
1046 reference, i.e. that on each path from loop entry to loop exit at
1047 least one of the statements containing the memory reference is
1048 executed. */
1049
1050 for (aref = mem_refs; aref; aref = aref->next)
1051 {
1052 if (!LIM_DATA (aref->stmt))
1053 continue;
1054
1055 must_exec = LIM_DATA (aref->stmt)->always_executed_in;
1056 if (!must_exec)
1057 continue;
1058
1059 if (must_exec == loop
1060 || flow_loop_nested_p (must_exec, loop))
1061 break;
1062 }
1063
1064 if (!aref)
1065 {
1066 free_mem_refs (mem_refs);
1067 return;
1068 }
1069 }
1070
1071 schedule_sm (loop, exits, n_exits, ref, mem_refs);
1072 free_mem_refs (mem_refs);
1073 }
1074
1075 /* Checks whether LOOP (with N_EXITS exits stored in EXITS array) is suitable
1076 for a store motion optimization (i.e. whether we can insert statement
1077 on its exits). */
1078
1079 static bool
1080 loop_suitable_for_sm (struct loop *loop ATTRIBUTE_UNUSED, edge *exits,
1081 unsigned n_exits)
1082 {
1083 unsigned i;
1084
1085 for (i = 0; i < n_exits; i++)
1086 if (exits[i]->flags & EDGE_ABNORMAL)
1087 return false;
1088
1089 return true;
1090 }
1091
1092 /* Try to perform store motion for all memory references modified inside
1093 LOOP. */
1094
1095 static void
1096 determine_lsm_loop (struct loop *loop)
1097 {
1098 tree phi;
1099 unsigned n_exits;
1100 edge *exits = get_loop_exit_edges (loop, &n_exits);
1101
1102 if (!loop_suitable_for_sm (loop, exits, n_exits))
1103 {
1104 free (exits);
1105 return;
1106 }
1107
1108 for (phi = phi_nodes (loop->header); phi; phi = TREE_CHAIN (phi))
1109 determine_lsm_reg (loop, exits, n_exits, PHI_RESULT (phi));
1110
1111 free (exits);
1112 }
1113
1114 /* Try to perform store motion for all memory references modified inside
1115 any of LOOPS. */
1116
1117 static void
1118 determine_lsm (struct loops *loops)
1119 {
1120 struct loop *loop;
1121 basic_block bb;
1122
1123 /* Create a UID for each statement in the function. Ordering of the
1124 UIDs is not important for this pass. */
1125 max_uid = 0;
1126 FOR_EACH_BB (bb)
1127 {
1128 block_stmt_iterator bsi;
1129 tree phi;
1130
1131 for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
1132 stmt_ann (bsi_stmt (bsi))->uid = max_uid++;
1133
1134 for (phi = phi_nodes (bb); phi; phi = TREE_CHAIN (phi))
1135 stmt_ann (phi)->uid = max_uid++;
1136 }
1137
1138 compute_immediate_uses (TDFA_USE_VOPS, NULL);
1139
1140 /* Pass the loops from the outermost. For each virtual operand loop phi node
1141 check whether all the references inside the loop correspond to a single
1142 address, and if so, move them. */
1143
1144 loop = loops->tree_root->inner;
1145 while (1)
1146 {
1147 determine_lsm_loop (loop);
1148
1149 if (loop->inner)
1150 {
1151 loop = loop->inner;
1152 continue;
1153 }
1154 while (!loop->next)
1155 {
1156 loop = loop->outer;
1157 if (loop == loops->tree_root)
1158 {
1159 free_df ();
1160 loop_commit_inserts ();
1161 return;
1162 }
1163 }
1164 loop = loop->next;
1165 }
1166 }
1167
1168 /* Fills ALWAYS_EXECUTED_IN information for basic blocks of LOOP, i.e.
1169 for each such basic block bb records the outermost loop for that execution
1170 of its header implies execution of bb. CONTAINS_CALL is the bitmap of
1171 blocks that contain a nonpure call. */
1172
1173 static void
1174 fill_always_executed_in (struct loop *loop, sbitmap contains_call)
1175 {
1176 basic_block bb = NULL, *bbs, last = NULL;
1177 unsigned i;
1178 edge e;
1179 struct loop *inn_loop = loop;
1180
1181 if (!loop->header->aux)
1182 {
1183 bbs = get_loop_body_in_dom_order (loop);
1184
1185 for (i = 0; i < loop->num_nodes; i++)
1186 {
1187 bb = bbs[i];
1188
1189 if (dominated_by_p (CDI_DOMINATORS, loop->latch, bb))
1190 last = bb;
1191
1192 if (TEST_BIT (contains_call, bb->index))
1193 break;
1194
1195 for (e = bb->succ; e; e = e->succ_next)
1196 if (!flow_bb_inside_loop_p (loop, e->dest))
1197 break;
1198 if (e)
1199 break;
1200
1201 /* A loop might be infinite (TODO use simple loop analysis
1202 to disprove this if possible). */
1203 if (bb->flags & BB_IRREDUCIBLE_LOOP)
1204 break;
1205
1206 if (!flow_bb_inside_loop_p (inn_loop, bb))
1207 break;
1208
1209 if (bb->loop_father->header == bb)
1210 {
1211 if (!dominated_by_p (CDI_DOMINATORS, loop->latch, bb))
1212 break;
1213
1214 /* In a loop that is always entered we may proceed anyway.
1215 But record that we entered it and stop once we leave it. */
1216 inn_loop = bb->loop_father;
1217 }
1218 }
1219
1220 while (1)
1221 {
1222 last->aux = loop;
1223 if (last == loop->header)
1224 break;
1225 last = get_immediate_dominator (CDI_DOMINATORS, last);
1226 }
1227
1228 free (bbs);
1229 }
1230
1231 for (loop = loop->inner; loop; loop = loop->next)
1232 fill_always_executed_in (loop, contains_call);
1233 }
1234
1235 /* Compute the global information needed by the loop invariant motion pass.
1236 LOOPS is the loop tree. */
1237
1238 static void
1239 tree_ssa_lim_initialize (struct loops *loops)
1240 {
1241 sbitmap contains_call = sbitmap_alloc (last_basic_block);
1242 block_stmt_iterator bsi;
1243 struct loop *loop;
1244 basic_block bb;
1245
1246 sbitmap_zero (contains_call);
1247 FOR_EACH_BB (bb)
1248 {
1249 for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
1250 {
1251 if (nonpure_call_p (bsi_stmt (bsi)))
1252 break;
1253 }
1254
1255 if (!bsi_end_p (bsi))
1256 SET_BIT (contains_call, bb->index);
1257 }
1258
1259 for (loop = loops->tree_root->inner; loop; loop = loop->next)
1260 fill_always_executed_in (loop, contains_call);
1261
1262 sbitmap_free (contains_call);
1263 }
1264
1265 /* Cleans up after the invariant motion pass. */
1266
1267 static void
1268 tree_ssa_lim_finalize (void)
1269 {
1270 basic_block bb;
1271
1272 FOR_EACH_BB (bb)
1273 {
1274 bb->aux = NULL;
1275 }
1276 }
1277
1278 /* Moves invariants from LOOPS. Only "expensive" invariants are moved out --
1279 i.e. those that are likely to be win regardless of the register pressure. */
1280
1281 void
1282 tree_ssa_lim (struct loops *loops)
1283 {
1284 tree_ssa_lim_initialize (loops);
1285
1286 /* For each statement determine the outermost loop in that it is
1287 invariant and cost for computing the invariant. */
1288 determine_invariantness ();
1289
1290 /* For each memory reference determine whether it is possible to hoist it
1291 out of the loop. Force the necessary invariants to be moved out of the
1292 loops as well. */
1293 determine_lsm (loops);
1294
1295 /* Move the expressions that are expensive enough. */
1296 move_computations ();
1297
1298 tree_ssa_lim_finalize ();
1299 }