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