PR tree-optimization/19853
[official-gcc.git] / gcc / sched-rgn.c
blobd5004e4e0327551f563bd8d6b1918b2c2367b091
1 /* Instruction scheduling pass.
2 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998,
3 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
4 Contributed by Michael Tiemann (tiemann@cygnus.com) Enhanced by,
5 and currently maintained by, Jim Wilson (wilson@cygnus.com)
7 This file is part of GCC.
9 GCC is free software; you can redistribute it and/or modify it under
10 the terms of the GNU General Public License as published by the Free
11 Software Foundation; either version 2, or (at your option) any later
12 version.
14 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
15 WARRANTY; without even the implied warranty of MERCHANTABILITY or
16 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 for more details.
19 You should have received a copy of the GNU General Public License
20 along with GCC; see the file COPYING. If not, write to the Free
21 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
22 02111-1307, USA. */
24 /* This pass implements list scheduling within basic blocks. It is
25 run twice: (1) after flow analysis, but before register allocation,
26 and (2) after register allocation.
28 The first run performs interblock scheduling, moving insns between
29 different blocks in the same "region", and the second runs only
30 basic block scheduling.
32 Interblock motions performed are useful motions and speculative
33 motions, including speculative loads. Motions requiring code
34 duplication are not supported. The identification of motion type
35 and the check for validity of speculative motions requires
36 construction and analysis of the function's control flow graph.
38 The main entry point for this pass is schedule_insns(), called for
39 each function. The work of the scheduler is organized in three
40 levels: (1) function level: insns are subject to splitting,
41 control-flow-graph is constructed, regions are computed (after
42 reload, each region is of one block), (2) region level: control
43 flow graph attributes required for interblock scheduling are
44 computed (dominators, reachability, etc.), data dependences and
45 priorities are computed, and (3) block level: insns in the block
46 are actually scheduled. */
48 #include "config.h"
49 #include "system.h"
50 #include "coretypes.h"
51 #include "tm.h"
52 #include "toplev.h"
53 #include "rtl.h"
54 #include "tm_p.h"
55 #include "hard-reg-set.h"
56 #include "regs.h"
57 #include "function.h"
58 #include "flags.h"
59 #include "insn-config.h"
60 #include "insn-attr.h"
61 #include "except.h"
62 #include "toplev.h"
63 #include "recog.h"
64 #include "cfglayout.h"
65 #include "params.h"
66 #include "sched-int.h"
67 #include "target.h"
69 /* Define when we want to do count REG_DEAD notes before and after scheduling
70 for sanity checking. We can't do that when conditional execution is used,
71 as REG_DEAD exist only for unconditional deaths. */
73 #if !defined (HAVE_conditional_execution) && defined (ENABLE_CHECKING)
74 #define CHECK_DEAD_NOTES 1
75 #else
76 #define CHECK_DEAD_NOTES 0
77 #endif
80 #ifdef INSN_SCHEDULING
81 /* Some accessor macros for h_i_d members only used within this file. */
82 #define INSN_REF_COUNT(INSN) (h_i_d[INSN_UID (INSN)].ref_count)
83 #define FED_BY_SPEC_LOAD(insn) (h_i_d[INSN_UID (insn)].fed_by_spec_load)
84 #define IS_LOAD_INSN(insn) (h_i_d[INSN_UID (insn)].is_load_insn)
86 /* nr_inter/spec counts interblock/speculative motion for the function. */
87 static int nr_inter, nr_spec;
89 static int is_cfg_nonregular (void);
90 static bool sched_is_disabled_for_current_region_p (void);
92 /* A region is the main entity for interblock scheduling: insns
93 are allowed to move between blocks in the same region, along
94 control flow graph edges, in the 'up' direction. */
95 typedef struct
97 int rgn_nr_blocks; /* Number of blocks in region. */
98 int rgn_blocks; /* cblocks in the region (actually index in rgn_bb_table). */
100 region;
102 /* Number of regions in the procedure. */
103 static int nr_regions;
105 /* Table of region descriptions. */
106 static region *rgn_table;
108 /* Array of lists of regions' blocks. */
109 static int *rgn_bb_table;
111 /* Topological order of blocks in the region (if b2 is reachable from
112 b1, block_to_bb[b2] > block_to_bb[b1]). Note: A basic block is
113 always referred to by either block or b, while its topological
114 order name (in the region) is referred to by bb. */
115 static int *block_to_bb;
117 /* The number of the region containing a block. */
118 static int *containing_rgn;
120 #define RGN_NR_BLOCKS(rgn) (rgn_table[rgn].rgn_nr_blocks)
121 #define RGN_BLOCKS(rgn) (rgn_table[rgn].rgn_blocks)
122 #define BLOCK_TO_BB(block) (block_to_bb[block])
123 #define CONTAINING_RGN(block) (containing_rgn[block])
125 void debug_regions (void);
126 static void find_single_block_region (void);
127 static void find_rgns (void);
128 static bool too_large (int, int *, int *);
130 extern void debug_live (int, int);
132 /* Blocks of the current region being scheduled. */
133 static int current_nr_blocks;
134 static int current_blocks;
136 /* The mapping from bb to block. */
137 #define BB_TO_BLOCK(bb) (rgn_bb_table[current_blocks + (bb)])
139 /* Target info declarations.
141 The block currently being scheduled is referred to as the "target" block,
142 while other blocks in the region from which insns can be moved to the
143 target are called "source" blocks. The candidate structure holds info
144 about such sources: are they valid? Speculative? Etc. */
145 typedef struct
147 basic_block *first_member;
148 int nr_members;
150 bblst;
152 typedef struct
154 char is_valid;
155 char is_speculative;
156 int src_prob;
157 bblst split_bbs;
158 bblst update_bbs;
160 candidate;
162 static candidate *candidate_table;
164 /* A speculative motion requires checking live information on the path
165 from 'source' to 'target'. The split blocks are those to be checked.
166 After a speculative motion, live information should be modified in
167 the 'update' blocks.
169 Lists of split and update blocks for each candidate of the current
170 target are in array bblst_table. */
171 static basic_block *bblst_table;
172 static int bblst_size, bblst_last;
174 #define IS_VALID(src) ( candidate_table[src].is_valid )
175 #define IS_SPECULATIVE(src) ( candidate_table[src].is_speculative )
176 #define SRC_PROB(src) ( candidate_table[src].src_prob )
178 /* The bb being currently scheduled. */
179 static int target_bb;
181 /* List of edges. */
182 typedef struct
184 edge *first_member;
185 int nr_members;
187 edgelst;
189 static edge *edgelst_table;
190 static int edgelst_last;
192 static void extract_edgelst (sbitmap, edgelst *);
195 /* Target info functions. */
196 static void split_edges (int, int, edgelst *);
197 static void compute_trg_info (int);
198 void debug_candidate (int);
199 void debug_candidates (int);
201 /* Dominators array: dom[i] contains the sbitmap of dominators of
202 bb i in the region. */
203 static sbitmap *dom;
205 /* bb 0 is the only region entry. */
206 #define IS_RGN_ENTRY(bb) (!bb)
208 /* Is bb_src dominated by bb_trg. */
209 #define IS_DOMINATED(bb_src, bb_trg) \
210 ( TEST_BIT (dom[bb_src], bb_trg) )
212 /* Probability: Prob[i] is a float in [0, 1] which is the probability
213 of bb i relative to the region entry. */
214 static float *prob;
216 /* The probability of bb_src, relative to bb_trg. Note, that while the
217 'prob[bb]' is a float in [0, 1], this macro returns an integer
218 in [0, 100]. */
219 #define GET_SRC_PROB(bb_src, bb_trg) ((int) (100.0 * (prob[bb_src] / \
220 prob[bb_trg])))
222 /* Bit-set of edges, where bit i stands for edge i. */
223 typedef sbitmap edgeset;
225 /* Number of edges in the region. */
226 static int rgn_nr_edges;
228 /* Array of size rgn_nr_edges. */
229 static edge *rgn_edges;
231 /* Mapping from each edge in the graph to its number in the rgn. */
232 #define EDGE_TO_BIT(edge) ((int)(size_t)(edge)->aux)
233 #define SET_EDGE_TO_BIT(edge,nr) ((edge)->aux = (void *)(size_t)(nr))
235 /* The split edges of a source bb is different for each target
236 bb. In order to compute this efficiently, the 'potential-split edges'
237 are computed for each bb prior to scheduling a region. This is actually
238 the split edges of each bb relative to the region entry.
240 pot_split[bb] is the set of potential split edges of bb. */
241 static edgeset *pot_split;
243 /* For every bb, a set of its ancestor edges. */
244 static edgeset *ancestor_edges;
246 static void compute_dom_prob_ps (int);
248 #define INSN_PROBABILITY(INSN) (SRC_PROB (BLOCK_TO_BB (BLOCK_NUM (INSN))))
249 #define IS_SPECULATIVE_INSN(INSN) (IS_SPECULATIVE (BLOCK_TO_BB (BLOCK_NUM (INSN))))
250 #define INSN_BB(INSN) (BLOCK_TO_BB (BLOCK_NUM (INSN)))
252 /* Parameters affecting the decision of rank_for_schedule().
253 ??? Nope. But MIN_PROBABILITY is used in compute_trg_info. */
254 #define MIN_PROBABILITY 40
256 /* Speculative scheduling functions. */
257 static int check_live_1 (int, rtx);
258 static void update_live_1 (int, rtx);
259 static int check_live (rtx, int);
260 static void update_live (rtx, int);
261 static void set_spec_fed (rtx);
262 static int is_pfree (rtx, int, int);
263 static int find_conditional_protection (rtx, int);
264 static int is_conditionally_protected (rtx, int, int);
265 static int is_prisky (rtx, int, int);
266 static int is_exception_free (rtx, int, int);
268 static bool sets_likely_spilled (rtx);
269 static void sets_likely_spilled_1 (rtx, rtx, void *);
270 static void add_branch_dependences (rtx, rtx);
271 static void compute_block_backward_dependences (int);
272 void debug_dependencies (void);
274 static void init_regions (void);
275 static void schedule_region (int);
276 static rtx concat_INSN_LIST (rtx, rtx);
277 static void concat_insn_mem_list (rtx, rtx, rtx *, rtx *);
278 static void propagate_deps (int, struct deps *);
279 static void free_pending_lists (void);
281 /* Functions for construction of the control flow graph. */
283 /* Return 1 if control flow graph should not be constructed, 0 otherwise.
285 We decide not to build the control flow graph if there is possibly more
286 than one entry to the function, if computed branches exist, if we
287 have nonlocal gotos, or if we have an unreachable loop. */
289 static int
290 is_cfg_nonregular (void)
292 basic_block b;
293 rtx insn;
295 /* If we have a label that could be the target of a nonlocal goto, then
296 the cfg is not well structured. */
297 if (nonlocal_goto_handler_labels)
298 return 1;
300 /* If we have any forced labels, then the cfg is not well structured. */
301 if (forced_labels)
302 return 1;
304 /* If we have exception handlers, then we consider the cfg not well
305 structured. ?!? We should be able to handle this now that flow.c
306 computes an accurate cfg for EH. */
307 if (current_function_has_exception_handlers ())
308 return 1;
310 /* If we have non-jumping insns which refer to labels, then we consider
311 the cfg not well structured. */
312 FOR_EACH_BB (b)
313 FOR_BB_INSNS (b, insn)
315 /* Check for labels referred by non-jump insns. */
316 if (NONJUMP_INSN_P (insn) || CALL_P (insn))
318 rtx note = find_reg_note (insn, REG_LABEL, NULL_RTX);
319 if (note
320 && ! (JUMP_P (NEXT_INSN (insn))
321 && find_reg_note (NEXT_INSN (insn), REG_LABEL,
322 XEXP (note, 0))))
323 return 1;
325 /* If this function has a computed jump, then we consider the cfg
326 not well structured. */
327 else if (JUMP_P (insn) && computed_jump_p (insn))
328 return 1;
331 /* Unreachable loops with more than one basic block are detected
332 during the DFS traversal in find_rgns.
334 Unreachable loops with a single block are detected here. This
335 test is redundant with the one in find_rgns, but it's much
336 cheaper to go ahead and catch the trivial case here. */
337 FOR_EACH_BB (b)
339 if (EDGE_COUNT (b->preds) == 0
340 || (EDGE_PRED (b, 0)->src == b
341 && EDGE_COUNT (b->preds) == 1))
342 return 1;
345 /* All the tests passed. Consider the cfg well structured. */
346 return 0;
349 /* Extract list of edges from a bitmap containing EDGE_TO_BIT bits. */
351 static void
352 extract_edgelst (sbitmap set, edgelst *el)
354 int i;
356 /* edgelst table space is reused in each call to extract_edgelst. */
357 edgelst_last = 0;
359 el->first_member = &edgelst_table[edgelst_last];
360 el->nr_members = 0;
362 /* Iterate over each word in the bitset. */
363 EXECUTE_IF_SET_IN_SBITMAP (set, 0, i,
365 edgelst_table[edgelst_last++] = rgn_edges[i];
366 el->nr_members++;
370 /* Functions for the construction of regions. */
372 /* Print the regions, for debugging purposes. Callable from debugger. */
374 void
375 debug_regions (void)
377 int rgn, bb;
379 fprintf (sched_dump, "\n;; ------------ REGIONS ----------\n\n");
380 for (rgn = 0; rgn < nr_regions; rgn++)
382 fprintf (sched_dump, ";;\trgn %d nr_blocks %d:\n", rgn,
383 rgn_table[rgn].rgn_nr_blocks);
384 fprintf (sched_dump, ";;\tbb/block: ");
386 for (bb = 0; bb < rgn_table[rgn].rgn_nr_blocks; bb++)
388 current_blocks = RGN_BLOCKS (rgn);
390 gcc_assert (bb == BLOCK_TO_BB (BB_TO_BLOCK (bb)));
391 fprintf (sched_dump, " %d/%d ", bb, BB_TO_BLOCK (bb));
394 fprintf (sched_dump, "\n\n");
398 /* Build a single block region for each basic block in the function.
399 This allows for using the same code for interblock and basic block
400 scheduling. */
402 static void
403 find_single_block_region (void)
405 basic_block bb;
407 nr_regions = 0;
409 FOR_EACH_BB (bb)
411 rgn_bb_table[nr_regions] = bb->index;
412 RGN_NR_BLOCKS (nr_regions) = 1;
413 RGN_BLOCKS (nr_regions) = nr_regions;
414 CONTAINING_RGN (bb->index) = nr_regions;
415 BLOCK_TO_BB (bb->index) = 0;
416 nr_regions++;
420 /* Update number of blocks and the estimate for number of insns
421 in the region. Return true if the region is "too large" for interblock
422 scheduling (compile time considerations). */
424 static bool
425 too_large (int block, int *num_bbs, int *num_insns)
427 (*num_bbs)++;
428 (*num_insns) += (INSN_LUID (BB_END (BASIC_BLOCK (block)))
429 - INSN_LUID (BB_HEAD (BASIC_BLOCK (block))));
431 return ((*num_bbs > PARAM_VALUE (PARAM_MAX_SCHED_REGION_BLOCKS))
432 || (*num_insns > PARAM_VALUE (PARAM_MAX_SCHED_REGION_INSNS)));
435 /* Update_loop_relations(blk, hdr): Check if the loop headed by max_hdr[blk]
436 is still an inner loop. Put in max_hdr[blk] the header of the most inner
437 loop containing blk. */
438 #define UPDATE_LOOP_RELATIONS(blk, hdr) \
440 if (max_hdr[blk] == -1) \
441 max_hdr[blk] = hdr; \
442 else if (dfs_nr[max_hdr[blk]] > dfs_nr[hdr]) \
443 RESET_BIT (inner, hdr); \
444 else if (dfs_nr[max_hdr[blk]] < dfs_nr[hdr]) \
446 RESET_BIT (inner,max_hdr[blk]); \
447 max_hdr[blk] = hdr; \
451 /* Find regions for interblock scheduling.
453 A region for scheduling can be:
455 * A loop-free procedure, or
457 * A reducible inner loop, or
459 * A basic block not contained in any other region.
461 ?!? In theory we could build other regions based on extended basic
462 blocks or reverse extended basic blocks. Is it worth the trouble?
464 Loop blocks that form a region are put into the region's block list
465 in topological order.
467 This procedure stores its results into the following global (ick) variables
469 * rgn_nr
470 * rgn_table
471 * rgn_bb_table
472 * block_to_bb
473 * containing region
475 We use dominator relationships to avoid making regions out of non-reducible
476 loops.
478 This procedure needs to be converted to work on pred/succ lists instead
479 of edge tables. That would simplify it somewhat. */
481 static void
482 find_rgns (void)
484 int *max_hdr, *dfs_nr, *degree;
485 char no_loops = 1;
486 int node, child, loop_head, i, head, tail;
487 int count = 0, sp, idx = 0;
488 edge_iterator current_edge;
489 edge_iterator *stack;
490 int num_bbs, num_insns, unreachable;
491 int too_large_failure;
492 basic_block bb;
494 /* Note if a block is a natural loop header. */
495 sbitmap header;
497 /* Note if a block is a natural inner loop header. */
498 sbitmap inner;
500 /* Note if a block is in the block queue. */
501 sbitmap in_queue;
503 /* Note if a block is in the block queue. */
504 sbitmap in_stack;
506 /* Perform a DFS traversal of the cfg. Identify loop headers, inner loops
507 and a mapping from block to its loop header (if the block is contained
508 in a loop, else -1).
510 Store results in HEADER, INNER, and MAX_HDR respectively, these will
511 be used as inputs to the second traversal.
513 STACK, SP and DFS_NR are only used during the first traversal. */
515 /* Allocate and initialize variables for the first traversal. */
516 max_hdr = xmalloc (last_basic_block * sizeof (int));
517 dfs_nr = xcalloc (last_basic_block, sizeof (int));
518 stack = xmalloc (n_edges * sizeof (edge_iterator));
520 inner = sbitmap_alloc (last_basic_block);
521 sbitmap_ones (inner);
523 header = sbitmap_alloc (last_basic_block);
524 sbitmap_zero (header);
526 in_queue = sbitmap_alloc (last_basic_block);
527 sbitmap_zero (in_queue);
529 in_stack = sbitmap_alloc (last_basic_block);
530 sbitmap_zero (in_stack);
532 for (i = 0; i < last_basic_block; i++)
533 max_hdr[i] = -1;
535 #define EDGE_PASSED(E) (ei_end_p ((E)) || ei_edge ((E))->aux)
536 #define SET_EDGE_PASSED(E) (ei_edge ((E))->aux = ei_edge ((E)))
538 /* DFS traversal to find inner loops in the cfg. */
540 current_edge = ei_start (EDGE_SUCC (ENTRY_BLOCK_PTR, 0)->dest->succs);
541 sp = -1;
543 while (1)
545 if (EDGE_PASSED (current_edge))
547 /* We have reached a leaf node or a node that was already
548 processed. Pop edges off the stack until we find
549 an edge that has not yet been processed. */
550 while (sp >= 0 && EDGE_PASSED (current_edge))
552 /* Pop entry off the stack. */
553 current_edge = stack[sp--];
554 node = ei_edge (current_edge)->src->index;
555 gcc_assert (node != ENTRY_BLOCK);
556 child = ei_edge (current_edge)->dest->index;
557 gcc_assert (child != EXIT_BLOCK);
558 RESET_BIT (in_stack, child);
559 if (max_hdr[child] >= 0 && TEST_BIT (in_stack, max_hdr[child]))
560 UPDATE_LOOP_RELATIONS (node, max_hdr[child]);
561 ei_next (&current_edge);
564 /* See if have finished the DFS tree traversal. */
565 if (sp < 0 && EDGE_PASSED (current_edge))
566 break;
568 /* Nope, continue the traversal with the popped node. */
569 continue;
572 /* Process a node. */
573 node = ei_edge (current_edge)->src->index;
574 gcc_assert (node != ENTRY_BLOCK);
575 SET_BIT (in_stack, node);
576 dfs_nr[node] = ++count;
578 /* We don't traverse to the exit block. */
579 child = ei_edge (current_edge)->dest->index;
580 if (child == EXIT_BLOCK)
582 SET_EDGE_PASSED (current_edge);
583 ei_next (&current_edge);
584 continue;
587 /* If the successor is in the stack, then we've found a loop.
588 Mark the loop, if it is not a natural loop, then it will
589 be rejected during the second traversal. */
590 if (TEST_BIT (in_stack, child))
592 no_loops = 0;
593 SET_BIT (header, child);
594 UPDATE_LOOP_RELATIONS (node, child);
595 SET_EDGE_PASSED (current_edge);
596 ei_next (&current_edge);
597 continue;
600 /* If the child was already visited, then there is no need to visit
601 it again. Just update the loop relationships and restart
602 with a new edge. */
603 if (dfs_nr[child])
605 if (max_hdr[child] >= 0 && TEST_BIT (in_stack, max_hdr[child]))
606 UPDATE_LOOP_RELATIONS (node, max_hdr[child]);
607 SET_EDGE_PASSED (current_edge);
608 ei_next (&current_edge);
609 continue;
612 /* Push an entry on the stack and continue DFS traversal. */
613 stack[++sp] = current_edge;
614 SET_EDGE_PASSED (current_edge);
615 current_edge = ei_start (ei_edge (current_edge)->dest->succs);
618 /* Reset ->aux field used by EDGE_PASSED. */
619 FOR_ALL_BB (bb)
621 edge_iterator ei;
622 edge e;
623 FOR_EACH_EDGE (e, ei, bb->succs)
624 e->aux = NULL;
628 /* Another check for unreachable blocks. The earlier test in
629 is_cfg_nonregular only finds unreachable blocks that do not
630 form a loop.
632 The DFS traversal will mark every block that is reachable from
633 the entry node by placing a nonzero value in dfs_nr. Thus if
634 dfs_nr is zero for any block, then it must be unreachable. */
635 unreachable = 0;
636 FOR_EACH_BB (bb)
637 if (dfs_nr[bb->index] == 0)
639 unreachable = 1;
640 break;
643 /* Gross. To avoid wasting memory, the second pass uses the dfs_nr array
644 to hold degree counts. */
645 degree = dfs_nr;
647 FOR_EACH_BB (bb)
648 degree[bb->index] = EDGE_COUNT (bb->preds);
650 /* Do not perform region scheduling if there are any unreachable
651 blocks. */
652 if (!unreachable)
654 int *queue;
656 if (no_loops)
657 SET_BIT (header, 0);
659 /* Second traversal:find reducible inner loops and topologically sort
660 block of each region. */
662 queue = xmalloc (n_basic_blocks * sizeof (int));
664 /* Find blocks which are inner loop headers. We still have non-reducible
665 loops to consider at this point. */
666 FOR_EACH_BB (bb)
668 if (TEST_BIT (header, bb->index) && TEST_BIT (inner, bb->index))
670 edge e;
671 edge_iterator ei;
672 basic_block jbb;
674 /* Now check that the loop is reducible. We do this separate
675 from finding inner loops so that we do not find a reducible
676 loop which contains an inner non-reducible loop.
678 A simple way to find reducible/natural loops is to verify
679 that each block in the loop is dominated by the loop
680 header.
682 If there exists a block that is not dominated by the loop
683 header, then the block is reachable from outside the loop
684 and thus the loop is not a natural loop. */
685 FOR_EACH_BB (jbb)
687 /* First identify blocks in the loop, except for the loop
688 entry block. */
689 if (bb->index == max_hdr[jbb->index] && bb != jbb)
691 /* Now verify that the block is dominated by the loop
692 header. */
693 if (!dominated_by_p (CDI_DOMINATORS, jbb, bb))
694 break;
698 /* If we exited the loop early, then I is the header of
699 a non-reducible loop and we should quit processing it
700 now. */
701 if (jbb != EXIT_BLOCK_PTR)
702 continue;
704 /* I is a header of an inner loop, or block 0 in a subroutine
705 with no loops at all. */
706 head = tail = -1;
707 too_large_failure = 0;
708 loop_head = max_hdr[bb->index];
710 /* Decrease degree of all I's successors for topological
711 ordering. */
712 FOR_EACH_EDGE (e, ei, bb->succs)
713 if (e->dest != EXIT_BLOCK_PTR)
714 --degree[e->dest->index];
716 /* Estimate # insns, and count # blocks in the region. */
717 num_bbs = 1;
718 num_insns = (INSN_LUID (BB_END (bb))
719 - INSN_LUID (BB_HEAD (bb)));
721 /* Find all loop latches (blocks with back edges to the loop
722 header) or all the leaf blocks in the cfg has no loops.
724 Place those blocks into the queue. */
725 if (no_loops)
727 FOR_EACH_BB (jbb)
728 /* Leaf nodes have only a single successor which must
729 be EXIT_BLOCK. */
730 if (EDGE_COUNT (jbb->succs) == 1
731 && EDGE_SUCC (jbb, 0)->dest == EXIT_BLOCK_PTR)
733 queue[++tail] = jbb->index;
734 SET_BIT (in_queue, jbb->index);
736 if (too_large (jbb->index, &num_bbs, &num_insns))
738 too_large_failure = 1;
739 break;
743 else
745 edge e;
747 FOR_EACH_EDGE (e, ei, bb->preds)
749 if (e->src == ENTRY_BLOCK_PTR)
750 continue;
752 node = e->src->index;
754 if (max_hdr[node] == loop_head && node != bb->index)
756 /* This is a loop latch. */
757 queue[++tail] = node;
758 SET_BIT (in_queue, node);
760 if (too_large (node, &num_bbs, &num_insns))
762 too_large_failure = 1;
763 break;
769 /* Now add all the blocks in the loop to the queue.
771 We know the loop is a natural loop; however the algorithm
772 above will not always mark certain blocks as being in the
773 loop. Consider:
774 node children
775 a b,c
777 c a,d
780 The algorithm in the DFS traversal may not mark B & D as part
781 of the loop (i.e. they will not have max_hdr set to A).
783 We know they can not be loop latches (else they would have
784 had max_hdr set since they'd have a backedge to a dominator
785 block). So we don't need them on the initial queue.
787 We know they are part of the loop because they are dominated
788 by the loop header and can be reached by a backwards walk of
789 the edges starting with nodes on the initial queue.
791 It is safe and desirable to include those nodes in the
792 loop/scheduling region. To do so we would need to decrease
793 the degree of a node if it is the target of a backedge
794 within the loop itself as the node is placed in the queue.
796 We do not do this because I'm not sure that the actual
797 scheduling code will properly handle this case. ?!? */
799 while (head < tail && !too_large_failure)
801 edge e;
802 child = queue[++head];
804 FOR_EACH_EDGE (e, ei, BASIC_BLOCK (child)->preds)
806 node = e->src->index;
808 /* See discussion above about nodes not marked as in
809 this loop during the initial DFS traversal. */
810 if (e->src == ENTRY_BLOCK_PTR
811 || max_hdr[node] != loop_head)
813 tail = -1;
814 break;
816 else if (!TEST_BIT (in_queue, node) && node != bb->index)
818 queue[++tail] = node;
819 SET_BIT (in_queue, node);
821 if (too_large (node, &num_bbs, &num_insns))
823 too_large_failure = 1;
824 break;
830 if (tail >= 0 && !too_large_failure)
832 /* Place the loop header into list of region blocks. */
833 degree[bb->index] = -1;
834 rgn_bb_table[idx] = bb->index;
835 RGN_NR_BLOCKS (nr_regions) = num_bbs;
836 RGN_BLOCKS (nr_regions) = idx++;
837 CONTAINING_RGN (bb->index) = nr_regions;
838 BLOCK_TO_BB (bb->index) = count = 0;
840 /* Remove blocks from queue[] when their in degree
841 becomes zero. Repeat until no blocks are left on the
842 list. This produces a topological list of blocks in
843 the region. */
844 while (tail >= 0)
846 if (head < 0)
847 head = tail;
848 child = queue[head];
849 if (degree[child] == 0)
851 edge e;
853 degree[child] = -1;
854 rgn_bb_table[idx++] = child;
855 BLOCK_TO_BB (child) = ++count;
856 CONTAINING_RGN (child) = nr_regions;
857 queue[head] = queue[tail--];
859 FOR_EACH_EDGE (e, ei, BASIC_BLOCK (child)->succs)
860 if (e->dest != EXIT_BLOCK_PTR)
861 --degree[e->dest->index];
863 else
864 --head;
866 ++nr_regions;
870 free (queue);
873 /* Any block that did not end up in a region is placed into a region
874 by itself. */
875 FOR_EACH_BB (bb)
876 if (degree[bb->index] >= 0)
878 rgn_bb_table[idx] = bb->index;
879 RGN_NR_BLOCKS (nr_regions) = 1;
880 RGN_BLOCKS (nr_regions) = idx++;
881 CONTAINING_RGN (bb->index) = nr_regions++;
882 BLOCK_TO_BB (bb->index) = 0;
885 free (max_hdr);
886 free (dfs_nr);
887 free (stack);
888 sbitmap_free (header);
889 sbitmap_free (inner);
890 sbitmap_free (in_queue);
891 sbitmap_free (in_stack);
894 /* Functions for regions scheduling information. */
896 /* Compute dominators, probability, and potential-split-edges of bb.
897 Assume that these values were already computed for bb's predecessors. */
899 static void
900 compute_dom_prob_ps (int bb)
902 int pred_bb;
903 int nr_out_edges, nr_rgn_out_edges;
904 edge_iterator in_ei, out_ei;
905 edge in_edge, out_edge;
907 prob[bb] = 0.0;
908 if (IS_RGN_ENTRY (bb))
910 SET_BIT (dom[bb], 0);
911 prob[bb] = 1.0;
912 return;
915 /* Initialize dom[bb] to '111..1'. */
916 sbitmap_ones (dom[bb]);
918 FOR_EACH_EDGE (in_edge, in_ei, BASIC_BLOCK (BB_TO_BLOCK (bb))->preds)
920 if (in_edge->src == ENTRY_BLOCK_PTR)
921 continue;
923 pred_bb = BLOCK_TO_BB (in_edge->src->index);
924 sbitmap_a_and_b (dom[bb], dom[bb], dom[pred_bb]);
925 sbitmap_a_or_b (ancestor_edges[bb],
926 ancestor_edges[bb], ancestor_edges[pred_bb]);
928 SET_BIT (ancestor_edges[bb], EDGE_TO_BIT (in_edge));
930 sbitmap_a_or_b (pot_split[bb], pot_split[bb], pot_split[pred_bb]);
932 nr_out_edges = 0;
933 nr_rgn_out_edges = 0;
935 FOR_EACH_EDGE (out_edge, out_ei, in_edge->src->succs)
937 ++nr_out_edges;
939 /* The successor doesn't belong in the region? */
940 if (out_edge->dest != EXIT_BLOCK_PTR
941 && CONTAINING_RGN (out_edge->dest->index)
942 != CONTAINING_RGN (BB_TO_BLOCK (bb)))
943 ++nr_rgn_out_edges;
945 SET_BIT (pot_split[bb], EDGE_TO_BIT (out_edge));
948 /* Now nr_rgn_out_edges is the number of region-exit edges from
949 pred, and nr_out_edges will be the number of pred out edges
950 not leaving the region. */
951 nr_out_edges -= nr_rgn_out_edges;
952 if (nr_rgn_out_edges > 0)
953 prob[bb] += 0.9 * prob[pred_bb] / nr_out_edges;
954 else
955 prob[bb] += prob[pred_bb] / nr_out_edges;
958 SET_BIT (dom[bb], bb);
959 sbitmap_difference (pot_split[bb], pot_split[bb], ancestor_edges[bb]);
961 if (sched_verbose >= 2)
962 fprintf (sched_dump, ";; bb_prob(%d, %d) = %3d\n", bb, BB_TO_BLOCK (bb),
963 (int) (100.0 * prob[bb]));
966 /* Functions for target info. */
968 /* Compute in BL the list of split-edges of bb_src relatively to bb_trg.
969 Note that bb_trg dominates bb_src. */
971 static void
972 split_edges (int bb_src, int bb_trg, edgelst *bl)
974 sbitmap src = sbitmap_alloc (pot_split[bb_src]->n_bits);
975 sbitmap_copy (src, pot_split[bb_src]);
977 sbitmap_difference (src, src, pot_split[bb_trg]);
978 extract_edgelst (src, bl);
979 sbitmap_free (src);
982 /* Find the valid candidate-source-blocks for the target block TRG, compute
983 their probability, and check if they are speculative or not.
984 For speculative sources, compute their update-blocks and split-blocks. */
986 static void
987 compute_trg_info (int trg)
989 candidate *sp;
990 edgelst el;
991 int i, j, k, update_idx;
992 basic_block block;
993 sbitmap visited;
994 edge_iterator ei;
995 edge e;
997 /* Define some of the fields for the target bb as well. */
998 sp = candidate_table + trg;
999 sp->is_valid = 1;
1000 sp->is_speculative = 0;
1001 sp->src_prob = 100;
1003 visited = sbitmap_alloc (last_basic_block - (INVALID_BLOCK + 1));
1005 for (i = trg + 1; i < current_nr_blocks; i++)
1007 sp = candidate_table + i;
1009 sp->is_valid = IS_DOMINATED (i, trg);
1010 if (sp->is_valid)
1012 sp->src_prob = GET_SRC_PROB (i, trg);
1013 sp->is_valid = (sp->src_prob >= MIN_PROBABILITY);
1016 if (sp->is_valid)
1018 split_edges (i, trg, &el);
1019 sp->is_speculative = (el.nr_members) ? 1 : 0;
1020 if (sp->is_speculative && !flag_schedule_speculative)
1021 sp->is_valid = 0;
1024 if (sp->is_valid)
1026 /* Compute split blocks and store them in bblst_table.
1027 The TO block of every split edge is a split block. */
1028 sp->split_bbs.first_member = &bblst_table[bblst_last];
1029 sp->split_bbs.nr_members = el.nr_members;
1030 for (j = 0; j < el.nr_members; bblst_last++, j++)
1031 bblst_table[bblst_last] = el.first_member[j]->dest;
1032 sp->update_bbs.first_member = &bblst_table[bblst_last];
1034 /* Compute update blocks and store them in bblst_table.
1035 For every split edge, look at the FROM block, and check
1036 all out edges. For each out edge that is not a split edge,
1037 add the TO block to the update block list. This list can end
1038 up with a lot of duplicates. We need to weed them out to avoid
1039 overrunning the end of the bblst_table. */
1041 update_idx = 0;
1042 sbitmap_zero (visited);
1043 for (j = 0; j < el.nr_members; j++)
1045 block = el.first_member[j]->src;
1046 FOR_EACH_EDGE (e, ei, block->succs)
1048 if (!TEST_BIT (visited,
1049 e->dest->index - (INVALID_BLOCK + 1)))
1051 for (k = 0; k < el.nr_members; k++)
1052 if (e == el.first_member[k])
1053 break;
1055 if (k >= el.nr_members)
1057 bblst_table[bblst_last++] = e->dest;
1058 SET_BIT (visited,
1059 e->dest->index - (INVALID_BLOCK + 1));
1060 update_idx++;
1065 sp->update_bbs.nr_members = update_idx;
1067 /* Make sure we didn't overrun the end of bblst_table. */
1068 gcc_assert (bblst_last <= bblst_size);
1070 else
1072 sp->split_bbs.nr_members = sp->update_bbs.nr_members = 0;
1074 sp->is_speculative = 0;
1075 sp->src_prob = 0;
1079 sbitmap_free (visited);
1082 /* Print candidates info, for debugging purposes. Callable from debugger. */
1084 void
1085 debug_candidate (int i)
1087 if (!candidate_table[i].is_valid)
1088 return;
1090 if (candidate_table[i].is_speculative)
1092 int j;
1093 fprintf (sched_dump, "src b %d bb %d speculative \n", BB_TO_BLOCK (i), i);
1095 fprintf (sched_dump, "split path: ");
1096 for (j = 0; j < candidate_table[i].split_bbs.nr_members; j++)
1098 int b = candidate_table[i].split_bbs.first_member[j]->index;
1100 fprintf (sched_dump, " %d ", b);
1102 fprintf (sched_dump, "\n");
1104 fprintf (sched_dump, "update path: ");
1105 for (j = 0; j < candidate_table[i].update_bbs.nr_members; j++)
1107 int b = candidate_table[i].update_bbs.first_member[j]->index;
1109 fprintf (sched_dump, " %d ", b);
1111 fprintf (sched_dump, "\n");
1113 else
1115 fprintf (sched_dump, " src %d equivalent\n", BB_TO_BLOCK (i));
1119 /* Print candidates info, for debugging purposes. Callable from debugger. */
1121 void
1122 debug_candidates (int trg)
1124 int i;
1126 fprintf (sched_dump, "----------- candidate table: target: b=%d bb=%d ---\n",
1127 BB_TO_BLOCK (trg), trg);
1128 for (i = trg + 1; i < current_nr_blocks; i++)
1129 debug_candidate (i);
1132 /* Functions for speculative scheduling. */
1134 /* Return 0 if x is a set of a register alive in the beginning of one
1135 of the split-blocks of src, otherwise return 1. */
1137 static int
1138 check_live_1 (int src, rtx x)
1140 int i;
1141 int regno;
1142 rtx reg = SET_DEST (x);
1144 if (reg == 0)
1145 return 1;
1147 while (GET_CODE (reg) == SUBREG
1148 || GET_CODE (reg) == ZERO_EXTRACT
1149 || GET_CODE (reg) == STRICT_LOW_PART)
1150 reg = XEXP (reg, 0);
1152 if (GET_CODE (reg) == PARALLEL)
1154 int i;
1156 for (i = XVECLEN (reg, 0) - 1; i >= 0; i--)
1157 if (XEXP (XVECEXP (reg, 0, i), 0) != 0)
1158 if (check_live_1 (src, XEXP (XVECEXP (reg, 0, i), 0)))
1159 return 1;
1161 return 0;
1164 if (!REG_P (reg))
1165 return 1;
1167 regno = REGNO (reg);
1169 if (regno < FIRST_PSEUDO_REGISTER && global_regs[regno])
1171 /* Global registers are assumed live. */
1172 return 0;
1174 else
1176 if (regno < FIRST_PSEUDO_REGISTER)
1178 /* Check for hard registers. */
1179 int j = hard_regno_nregs[regno][GET_MODE (reg)];
1180 while (--j >= 0)
1182 for (i = 0; i < candidate_table[src].split_bbs.nr_members; i++)
1184 basic_block b = candidate_table[src].split_bbs.first_member[i];
1186 if (REGNO_REG_SET_P (b->global_live_at_start, regno + j))
1188 return 0;
1193 else
1195 /* Check for pseudo registers. */
1196 for (i = 0; i < candidate_table[src].split_bbs.nr_members; i++)
1198 basic_block b = candidate_table[src].split_bbs.first_member[i];
1200 if (REGNO_REG_SET_P (b->global_live_at_start, regno))
1202 return 0;
1208 return 1;
1211 /* If x is a set of a register R, mark that R is alive in the beginning
1212 of every update-block of src. */
1214 static void
1215 update_live_1 (int src, rtx x)
1217 int i;
1218 int regno;
1219 rtx reg = SET_DEST (x);
1221 if (reg == 0)
1222 return;
1224 while (GET_CODE (reg) == SUBREG
1225 || GET_CODE (reg) == ZERO_EXTRACT
1226 || GET_CODE (reg) == STRICT_LOW_PART)
1227 reg = XEXP (reg, 0);
1229 if (GET_CODE (reg) == PARALLEL)
1231 int i;
1233 for (i = XVECLEN (reg, 0) - 1; i >= 0; i--)
1234 if (XEXP (XVECEXP (reg, 0, i), 0) != 0)
1235 update_live_1 (src, XEXP (XVECEXP (reg, 0, i), 0));
1237 return;
1240 if (!REG_P (reg))
1241 return;
1243 /* Global registers are always live, so the code below does not apply
1244 to them. */
1246 regno = REGNO (reg);
1248 if (regno >= FIRST_PSEUDO_REGISTER || !global_regs[regno])
1250 if (regno < FIRST_PSEUDO_REGISTER)
1252 int j = hard_regno_nregs[regno][GET_MODE (reg)];
1253 while (--j >= 0)
1255 for (i = 0; i < candidate_table[src].update_bbs.nr_members; i++)
1257 basic_block b = candidate_table[src].update_bbs.first_member[i];
1259 SET_REGNO_REG_SET (b->global_live_at_start, regno + j);
1263 else
1265 for (i = 0; i < candidate_table[src].update_bbs.nr_members; i++)
1267 basic_block b = candidate_table[src].update_bbs.first_member[i];
1269 SET_REGNO_REG_SET (b->global_live_at_start, regno);
1275 /* Return 1 if insn can be speculatively moved from block src to trg,
1276 otherwise return 0. Called before first insertion of insn to
1277 ready-list or before the scheduling. */
1279 static int
1280 check_live (rtx insn, int src)
1282 /* Find the registers set by instruction. */
1283 if (GET_CODE (PATTERN (insn)) == SET
1284 || GET_CODE (PATTERN (insn)) == CLOBBER)
1285 return check_live_1 (src, PATTERN (insn));
1286 else if (GET_CODE (PATTERN (insn)) == PARALLEL)
1288 int j;
1289 for (j = XVECLEN (PATTERN (insn), 0) - 1; j >= 0; j--)
1290 if ((GET_CODE (XVECEXP (PATTERN (insn), 0, j)) == SET
1291 || GET_CODE (XVECEXP (PATTERN (insn), 0, j)) == CLOBBER)
1292 && !check_live_1 (src, XVECEXP (PATTERN (insn), 0, j)))
1293 return 0;
1295 return 1;
1298 return 1;
1301 /* Update the live registers info after insn was moved speculatively from
1302 block src to trg. */
1304 static void
1305 update_live (rtx insn, int src)
1307 /* Find the registers set by instruction. */
1308 if (GET_CODE (PATTERN (insn)) == SET
1309 || GET_CODE (PATTERN (insn)) == CLOBBER)
1310 update_live_1 (src, PATTERN (insn));
1311 else if (GET_CODE (PATTERN (insn)) == PARALLEL)
1313 int j;
1314 for (j = XVECLEN (PATTERN (insn), 0) - 1; j >= 0; j--)
1315 if (GET_CODE (XVECEXP (PATTERN (insn), 0, j)) == SET
1316 || GET_CODE (XVECEXP (PATTERN (insn), 0, j)) == CLOBBER)
1317 update_live_1 (src, XVECEXP (PATTERN (insn), 0, j));
1321 /* Nonzero if block bb_to is equal to, or reachable from block bb_from. */
1322 #define IS_REACHABLE(bb_from, bb_to) \
1323 (bb_from == bb_to \
1324 || IS_RGN_ENTRY (bb_from) \
1325 || (TEST_BIT (ancestor_edges[bb_to], \
1326 EDGE_TO_BIT (EDGE_PRED (BASIC_BLOCK (BB_TO_BLOCK (bb_from)), 0)))))
1328 /* Turns on the fed_by_spec_load flag for insns fed by load_insn. */
1330 static void
1331 set_spec_fed (rtx load_insn)
1333 rtx link;
1335 for (link = INSN_DEPEND (load_insn); link; link = XEXP (link, 1))
1336 if (GET_MODE (link) == VOIDmode)
1337 FED_BY_SPEC_LOAD (XEXP (link, 0)) = 1;
1338 } /* set_spec_fed */
1340 /* On the path from the insn to load_insn_bb, find a conditional
1341 branch depending on insn, that guards the speculative load. */
1343 static int
1344 find_conditional_protection (rtx insn, int load_insn_bb)
1346 rtx link;
1348 /* Iterate through DEF-USE forward dependences. */
1349 for (link = INSN_DEPEND (insn); link; link = XEXP (link, 1))
1351 rtx next = XEXP (link, 0);
1352 if ((CONTAINING_RGN (BLOCK_NUM (next)) ==
1353 CONTAINING_RGN (BB_TO_BLOCK (load_insn_bb)))
1354 && IS_REACHABLE (INSN_BB (next), load_insn_bb)
1355 && load_insn_bb != INSN_BB (next)
1356 && GET_MODE (link) == VOIDmode
1357 && (JUMP_P (next)
1358 || find_conditional_protection (next, load_insn_bb)))
1359 return 1;
1361 return 0;
1362 } /* find_conditional_protection */
1364 /* Returns 1 if the same insn1 that participates in the computation
1365 of load_insn's address is feeding a conditional branch that is
1366 guarding on load_insn. This is true if we find a the two DEF-USE
1367 chains:
1368 insn1 -> ... -> conditional-branch
1369 insn1 -> ... -> load_insn,
1370 and if a flow path exist:
1371 insn1 -> ... -> conditional-branch -> ... -> load_insn,
1372 and if insn1 is on the path
1373 region-entry -> ... -> bb_trg -> ... load_insn.
1375 Locate insn1 by climbing on LOG_LINKS from load_insn.
1376 Locate the branch by following INSN_DEPEND from insn1. */
1378 static int
1379 is_conditionally_protected (rtx load_insn, int bb_src, int bb_trg)
1381 rtx link;
1383 for (link = LOG_LINKS (load_insn); link; link = XEXP (link, 1))
1385 rtx insn1 = XEXP (link, 0);
1387 /* Must be a DEF-USE dependence upon non-branch. */
1388 if (GET_MODE (link) != VOIDmode
1389 || JUMP_P (insn1))
1390 continue;
1392 /* Must exist a path: region-entry -> ... -> bb_trg -> ... load_insn. */
1393 if (INSN_BB (insn1) == bb_src
1394 || (CONTAINING_RGN (BLOCK_NUM (insn1))
1395 != CONTAINING_RGN (BB_TO_BLOCK (bb_src)))
1396 || (!IS_REACHABLE (bb_trg, INSN_BB (insn1))
1397 && !IS_REACHABLE (INSN_BB (insn1), bb_trg)))
1398 continue;
1400 /* Now search for the conditional-branch. */
1401 if (find_conditional_protection (insn1, bb_src))
1402 return 1;
1404 /* Recursive step: search another insn1, "above" current insn1. */
1405 return is_conditionally_protected (insn1, bb_src, bb_trg);
1408 /* The chain does not exist. */
1409 return 0;
1410 } /* is_conditionally_protected */
1412 /* Returns 1 if a clue for "similar load" 'insn2' is found, and hence
1413 load_insn can move speculatively from bb_src to bb_trg. All the
1414 following must hold:
1416 (1) both loads have 1 base register (PFREE_CANDIDATEs).
1417 (2) load_insn and load1 have a def-use dependence upon
1418 the same insn 'insn1'.
1419 (3) either load2 is in bb_trg, or:
1420 - there's only one split-block, and
1421 - load1 is on the escape path, and
1423 From all these we can conclude that the two loads access memory
1424 addresses that differ at most by a constant, and hence if moving
1425 load_insn would cause an exception, it would have been caused by
1426 load2 anyhow. */
1428 static int
1429 is_pfree (rtx load_insn, int bb_src, int bb_trg)
1431 rtx back_link;
1432 candidate *candp = candidate_table + bb_src;
1434 if (candp->split_bbs.nr_members != 1)
1435 /* Must have exactly one escape block. */
1436 return 0;
1438 for (back_link = LOG_LINKS (load_insn);
1439 back_link; back_link = XEXP (back_link, 1))
1441 rtx insn1 = XEXP (back_link, 0);
1443 if (GET_MODE (back_link) == VOIDmode)
1445 /* Found a DEF-USE dependence (insn1, load_insn). */
1446 rtx fore_link;
1448 for (fore_link = INSN_DEPEND (insn1);
1449 fore_link; fore_link = XEXP (fore_link, 1))
1451 rtx insn2 = XEXP (fore_link, 0);
1452 if (GET_MODE (fore_link) == VOIDmode)
1454 /* Found a DEF-USE dependence (insn1, insn2). */
1455 if (haifa_classify_insn (insn2) != PFREE_CANDIDATE)
1456 /* insn2 not guaranteed to be a 1 base reg load. */
1457 continue;
1459 if (INSN_BB (insn2) == bb_trg)
1460 /* insn2 is the similar load, in the target block. */
1461 return 1;
1463 if (*(candp->split_bbs.first_member) == BLOCK_FOR_INSN (insn2))
1464 /* insn2 is a similar load, in a split-block. */
1465 return 1;
1471 /* Couldn't find a similar load. */
1472 return 0;
1473 } /* is_pfree */
1475 /* Return 1 if load_insn is prisky (i.e. if load_insn is fed by
1476 a load moved speculatively, or if load_insn is protected by
1477 a compare on load_insn's address). */
1479 static int
1480 is_prisky (rtx load_insn, int bb_src, int bb_trg)
1482 if (FED_BY_SPEC_LOAD (load_insn))
1483 return 1;
1485 if (LOG_LINKS (load_insn) == NULL)
1486 /* Dependence may 'hide' out of the region. */
1487 return 1;
1489 if (is_conditionally_protected (load_insn, bb_src, bb_trg))
1490 return 1;
1492 return 0;
1495 /* Insn is a candidate to be moved speculatively from bb_src to bb_trg.
1496 Return 1 if insn is exception-free (and the motion is valid)
1497 and 0 otherwise. */
1499 static int
1500 is_exception_free (rtx insn, int bb_src, int bb_trg)
1502 int insn_class = haifa_classify_insn (insn);
1504 /* Handle non-load insns. */
1505 switch (insn_class)
1507 case TRAP_FREE:
1508 return 1;
1509 case TRAP_RISKY:
1510 return 0;
1511 default:;
1514 /* Handle loads. */
1515 if (!flag_schedule_speculative_load)
1516 return 0;
1517 IS_LOAD_INSN (insn) = 1;
1518 switch (insn_class)
1520 case IFREE:
1521 return (1);
1522 case IRISKY:
1523 return 0;
1524 case PFREE_CANDIDATE:
1525 if (is_pfree (insn, bb_src, bb_trg))
1526 return 1;
1527 /* Don't 'break' here: PFREE-candidate is also PRISKY-candidate. */
1528 case PRISKY_CANDIDATE:
1529 if (!flag_schedule_speculative_load_dangerous
1530 || is_prisky (insn, bb_src, bb_trg))
1531 return 0;
1532 break;
1533 default:;
1536 return flag_schedule_speculative_load_dangerous;
1539 /* The number of insns from the current block scheduled so far. */
1540 static int sched_target_n_insns;
1541 /* The number of insns from the current block to be scheduled in total. */
1542 static int target_n_insns;
1543 /* The number of insns from the entire region scheduled so far. */
1544 static int sched_n_insns;
1545 /* Nonzero if the last scheduled insn was a jump. */
1546 static int last_was_jump;
1548 /* Implementations of the sched_info functions for region scheduling. */
1549 static void init_ready_list (struct ready_list *);
1550 static int can_schedule_ready_p (rtx);
1551 static int new_ready (rtx);
1552 static int schedule_more_p (void);
1553 static const char *rgn_print_insn (rtx, int);
1554 static int rgn_rank (rtx, rtx);
1555 static int contributes_to_priority (rtx, rtx);
1556 static void compute_jump_reg_dependencies (rtx, regset, regset, regset);
1558 /* Return nonzero if there are more insns that should be scheduled. */
1560 static int
1561 schedule_more_p (void)
1563 return ! last_was_jump && sched_target_n_insns < target_n_insns;
1566 /* Add all insns that are initially ready to the ready list READY. Called
1567 once before scheduling a set of insns. */
1569 static void
1570 init_ready_list (struct ready_list *ready)
1572 rtx prev_head = current_sched_info->prev_head;
1573 rtx next_tail = current_sched_info->next_tail;
1574 int bb_src;
1575 rtx insn;
1577 target_n_insns = 0;
1578 sched_target_n_insns = 0;
1579 sched_n_insns = 0;
1580 last_was_jump = 0;
1582 /* Print debugging information. */
1583 if (sched_verbose >= 5)
1584 debug_dependencies ();
1586 /* Prepare current target block info. */
1587 if (current_nr_blocks > 1)
1589 candidate_table = xmalloc (current_nr_blocks * sizeof (candidate));
1591 bblst_last = 0;
1592 /* bblst_table holds split blocks and update blocks for each block after
1593 the current one in the region. split blocks and update blocks are
1594 the TO blocks of region edges, so there can be at most rgn_nr_edges
1595 of them. */
1596 bblst_size = (current_nr_blocks - target_bb) * rgn_nr_edges;
1597 bblst_table = xmalloc (bblst_size * sizeof (basic_block));
1599 edgelst_last = 0;
1600 edgelst_table = xmalloc (rgn_nr_edges * sizeof (edge));
1602 compute_trg_info (target_bb);
1605 /* Initialize ready list with all 'ready' insns in target block.
1606 Count number of insns in the target block being scheduled. */
1607 for (insn = NEXT_INSN (prev_head); insn != next_tail; insn = NEXT_INSN (insn))
1609 if (INSN_DEP_COUNT (insn) == 0)
1611 ready_add (ready, insn);
1613 if (targetm.sched.adjust_priority)
1614 INSN_PRIORITY (insn) =
1615 targetm.sched.adjust_priority (insn, INSN_PRIORITY (insn));
1617 target_n_insns++;
1620 /* Add to ready list all 'ready' insns in valid source blocks.
1621 For speculative insns, check-live, exception-free, and
1622 issue-delay. */
1623 for (bb_src = target_bb + 1; bb_src < current_nr_blocks; bb_src++)
1624 if (IS_VALID (bb_src))
1626 rtx src_head;
1627 rtx src_next_tail;
1628 rtx tail, head;
1630 get_block_head_tail (BB_TO_BLOCK (bb_src), &head, &tail);
1631 src_next_tail = NEXT_INSN (tail);
1632 src_head = head;
1634 for (insn = src_head; insn != src_next_tail; insn = NEXT_INSN (insn))
1636 if (! INSN_P (insn))
1637 continue;
1639 if (!CANT_MOVE (insn)
1640 && (!IS_SPECULATIVE_INSN (insn)
1641 || ((recog_memoized (insn) < 0
1642 || min_insn_conflict_delay (curr_state,
1643 insn, insn) <= 3)
1644 && check_live (insn, bb_src)
1645 && is_exception_free (insn, bb_src, target_bb))))
1646 if (INSN_DEP_COUNT (insn) == 0)
1648 ready_add (ready, insn);
1650 if (targetm.sched.adjust_priority)
1651 INSN_PRIORITY (insn) =
1652 targetm.sched.adjust_priority (insn, INSN_PRIORITY (insn));
1658 /* Called after taking INSN from the ready list. Returns nonzero if this
1659 insn can be scheduled, nonzero if we should silently discard it. */
1661 static int
1662 can_schedule_ready_p (rtx insn)
1664 if (JUMP_P (insn))
1665 last_was_jump = 1;
1667 /* An interblock motion? */
1668 if (INSN_BB (insn) != target_bb)
1670 basic_block b1;
1672 if (IS_SPECULATIVE_INSN (insn))
1674 if (!check_live (insn, INSN_BB (insn)))
1675 return 0;
1676 update_live (insn, INSN_BB (insn));
1678 /* For speculative load, mark insns fed by it. */
1679 if (IS_LOAD_INSN (insn) || FED_BY_SPEC_LOAD (insn))
1680 set_spec_fed (insn);
1682 nr_spec++;
1684 nr_inter++;
1686 /* Update source block boundaries. */
1687 b1 = BLOCK_FOR_INSN (insn);
1688 if (insn == BB_HEAD (b1) && insn == BB_END (b1))
1690 /* We moved all the insns in the basic block.
1691 Emit a note after the last insn and update the
1692 begin/end boundaries to point to the note. */
1693 rtx note = emit_note_after (NOTE_INSN_DELETED, insn);
1694 BB_HEAD (b1) = note;
1695 BB_END (b1) = note;
1697 else if (insn == BB_END (b1))
1699 /* We took insns from the end of the basic block,
1700 so update the end of block boundary so that it
1701 points to the first insn we did not move. */
1702 BB_END (b1) = PREV_INSN (insn);
1704 else if (insn == BB_HEAD (b1))
1706 /* We took insns from the start of the basic block,
1707 so update the start of block boundary so that
1708 it points to the first insn we did not move. */
1709 BB_HEAD (b1) = NEXT_INSN (insn);
1712 else
1714 /* In block motion. */
1715 sched_target_n_insns++;
1717 sched_n_insns++;
1719 return 1;
1722 /* Called after INSN has all its dependencies resolved. Return nonzero
1723 if it should be moved to the ready list or the queue, or zero if we
1724 should silently discard it. */
1725 static int
1726 new_ready (rtx next)
1728 /* For speculative insns, before inserting to ready/queue,
1729 check live, exception-free, and issue-delay. */
1730 if (INSN_BB (next) != target_bb
1731 && (!IS_VALID (INSN_BB (next))
1732 || CANT_MOVE (next)
1733 || (IS_SPECULATIVE_INSN (next)
1734 && ((recog_memoized (next) >= 0
1735 && min_insn_conflict_delay (curr_state, next, next) > 3)
1736 || !check_live (next, INSN_BB (next))
1737 || !is_exception_free (next, INSN_BB (next), target_bb)))))
1738 return 0;
1739 return 1;
1742 /* Return a string that contains the insn uid and optionally anything else
1743 necessary to identify this insn in an output. It's valid to use a
1744 static buffer for this. The ALIGNED parameter should cause the string
1745 to be formatted so that multiple output lines will line up nicely. */
1747 static const char *
1748 rgn_print_insn (rtx insn, int aligned)
1750 static char tmp[80];
1752 if (aligned)
1753 sprintf (tmp, "b%3d: i%4d", INSN_BB (insn), INSN_UID (insn));
1754 else
1756 if (current_nr_blocks > 1 && INSN_BB (insn) != target_bb)
1757 sprintf (tmp, "%d/b%d", INSN_UID (insn), INSN_BB (insn));
1758 else
1759 sprintf (tmp, "%d", INSN_UID (insn));
1761 return tmp;
1764 /* Compare priority of two insns. Return a positive number if the second
1765 insn is to be preferred for scheduling, and a negative one if the first
1766 is to be preferred. Zero if they are equally good. */
1768 static int
1769 rgn_rank (rtx insn1, rtx insn2)
1771 /* Some comparison make sense in interblock scheduling only. */
1772 if (INSN_BB (insn1) != INSN_BB (insn2))
1774 int spec_val, prob_val;
1776 /* Prefer an inblock motion on an interblock motion. */
1777 if ((INSN_BB (insn2) == target_bb) && (INSN_BB (insn1) != target_bb))
1778 return 1;
1779 if ((INSN_BB (insn1) == target_bb) && (INSN_BB (insn2) != target_bb))
1780 return -1;
1782 /* Prefer a useful motion on a speculative one. */
1783 spec_val = IS_SPECULATIVE_INSN (insn1) - IS_SPECULATIVE_INSN (insn2);
1784 if (spec_val)
1785 return spec_val;
1787 /* Prefer a more probable (speculative) insn. */
1788 prob_val = INSN_PROBABILITY (insn2) - INSN_PROBABILITY (insn1);
1789 if (prob_val)
1790 return prob_val;
1792 return 0;
1795 /* NEXT is an instruction that depends on INSN (a backward dependence);
1796 return nonzero if we should include this dependence in priority
1797 calculations. */
1799 static int
1800 contributes_to_priority (rtx next, rtx insn)
1802 return BLOCK_NUM (next) == BLOCK_NUM (insn);
1805 /* INSN is a JUMP_INSN, COND_SET is the set of registers that are
1806 conditionally set before INSN. Store the set of registers that
1807 must be considered as used by this jump in USED and that of
1808 registers that must be considered as set in SET. */
1810 static void
1811 compute_jump_reg_dependencies (rtx insn ATTRIBUTE_UNUSED,
1812 regset cond_exec ATTRIBUTE_UNUSED,
1813 regset used ATTRIBUTE_UNUSED,
1814 regset set ATTRIBUTE_UNUSED)
1816 /* Nothing to do here, since we postprocess jumps in
1817 add_branch_dependences. */
1820 /* Used in schedule_insns to initialize current_sched_info for scheduling
1821 regions (or single basic blocks). */
1823 static struct sched_info region_sched_info =
1825 init_ready_list,
1826 can_schedule_ready_p,
1827 schedule_more_p,
1828 new_ready,
1829 rgn_rank,
1830 rgn_print_insn,
1831 contributes_to_priority,
1832 compute_jump_reg_dependencies,
1834 NULL, NULL,
1835 NULL, NULL,
1836 0, 0, 0
1839 /* Determine if PAT sets a CLASS_LIKELY_SPILLED_P register. */
1841 static bool
1842 sets_likely_spilled (rtx pat)
1844 bool ret = false;
1845 note_stores (pat, sets_likely_spilled_1, &ret);
1846 return ret;
1849 static void
1850 sets_likely_spilled_1 (rtx x, rtx pat, void *data)
1852 bool *ret = (bool *) data;
1854 if (GET_CODE (pat) == SET
1855 && REG_P (x)
1856 && REGNO (x) < FIRST_PSEUDO_REGISTER
1857 && CLASS_LIKELY_SPILLED_P (REGNO_REG_CLASS (REGNO (x))))
1858 *ret = true;
1861 /* Add dependences so that branches are scheduled to run last in their
1862 block. */
1864 static void
1865 add_branch_dependences (rtx head, rtx tail)
1867 rtx insn, last;
1869 /* For all branches, calls, uses, clobbers, cc0 setters, and instructions
1870 that can throw exceptions, force them to remain in order at the end of
1871 the block by adding dependencies and giving the last a high priority.
1872 There may be notes present, and prev_head may also be a note.
1874 Branches must obviously remain at the end. Calls should remain at the
1875 end since moving them results in worse register allocation. Uses remain
1876 at the end to ensure proper register allocation.
1878 cc0 setters remain at the end because they can't be moved away from
1879 their cc0 user.
1881 Insns setting CLASS_LIKELY_SPILLED_P registers (usually return values)
1882 are not moved before reload because we can wind up with register
1883 allocation failures. */
1885 insn = tail;
1886 last = 0;
1887 while (CALL_P (insn)
1888 || JUMP_P (insn)
1889 || (NONJUMP_INSN_P (insn)
1890 && (GET_CODE (PATTERN (insn)) == USE
1891 || GET_CODE (PATTERN (insn)) == CLOBBER
1892 || can_throw_internal (insn)
1893 #ifdef HAVE_cc0
1894 || sets_cc0_p (PATTERN (insn))
1895 #endif
1896 || (!reload_completed
1897 && sets_likely_spilled (PATTERN (insn)))))
1898 || NOTE_P (insn))
1900 if (!NOTE_P (insn))
1902 if (last != 0 && !find_insn_list (insn, LOG_LINKS (last)))
1904 add_dependence (last, insn, REG_DEP_ANTI);
1905 INSN_REF_COUNT (insn)++;
1908 CANT_MOVE (insn) = 1;
1910 last = insn;
1913 /* Don't overrun the bounds of the basic block. */
1914 if (insn == head)
1915 break;
1917 insn = PREV_INSN (insn);
1920 /* Make sure these insns are scheduled last in their block. */
1921 insn = last;
1922 if (insn != 0)
1923 while (insn != head)
1925 insn = prev_nonnote_insn (insn);
1927 if (INSN_REF_COUNT (insn) != 0)
1928 continue;
1930 add_dependence (last, insn, REG_DEP_ANTI);
1931 INSN_REF_COUNT (insn) = 1;
1935 /* Data structures for the computation of data dependences in a regions. We
1936 keep one `deps' structure for every basic block. Before analyzing the
1937 data dependences for a bb, its variables are initialized as a function of
1938 the variables of its predecessors. When the analysis for a bb completes,
1939 we save the contents to the corresponding bb_deps[bb] variable. */
1941 static struct deps *bb_deps;
1943 /* Duplicate the INSN_LIST elements of COPY and prepend them to OLD. */
1945 static rtx
1946 concat_INSN_LIST (rtx copy, rtx old)
1948 rtx new = old;
1949 for (; copy ; copy = XEXP (copy, 1))
1950 new = alloc_INSN_LIST (XEXP (copy, 0), new);
1951 return new;
1954 static void
1955 concat_insn_mem_list (rtx copy_insns, rtx copy_mems, rtx *old_insns_p,
1956 rtx *old_mems_p)
1958 rtx new_insns = *old_insns_p;
1959 rtx new_mems = *old_mems_p;
1961 while (copy_insns)
1963 new_insns = alloc_INSN_LIST (XEXP (copy_insns, 0), new_insns);
1964 new_mems = alloc_EXPR_LIST (VOIDmode, XEXP (copy_mems, 0), new_mems);
1965 copy_insns = XEXP (copy_insns, 1);
1966 copy_mems = XEXP (copy_mems, 1);
1969 *old_insns_p = new_insns;
1970 *old_mems_p = new_mems;
1973 /* After computing the dependencies for block BB, propagate the dependencies
1974 found in TMP_DEPS to the successors of the block. */
1975 static void
1976 propagate_deps (int bb, struct deps *pred_deps)
1978 basic_block block = BASIC_BLOCK (BB_TO_BLOCK (bb));
1979 edge_iterator ei;
1980 edge e;
1982 /* bb's structures are inherited by its successors. */
1983 FOR_EACH_EDGE (e, ei, block->succs)
1985 struct deps *succ_deps;
1986 unsigned reg;
1987 reg_set_iterator rsi;
1989 /* Only bbs "below" bb, in the same region, are interesting. */
1990 if (e->dest == EXIT_BLOCK_PTR
1991 || CONTAINING_RGN (block->index) != CONTAINING_RGN (e->dest->index)
1992 || BLOCK_TO_BB (e->dest->index) <= bb)
1993 continue;
1995 succ_deps = bb_deps + BLOCK_TO_BB (e->dest->index);
1997 /* The reg_last lists are inherited by successor. */
1998 EXECUTE_IF_SET_IN_REG_SET (&pred_deps->reg_last_in_use, 0, reg, rsi)
2000 struct deps_reg *pred_rl = &pred_deps->reg_last[reg];
2001 struct deps_reg *succ_rl = &succ_deps->reg_last[reg];
2003 succ_rl->uses = concat_INSN_LIST (pred_rl->uses, succ_rl->uses);
2004 succ_rl->sets = concat_INSN_LIST (pred_rl->sets, succ_rl->sets);
2005 succ_rl->clobbers = concat_INSN_LIST (pred_rl->clobbers,
2006 succ_rl->clobbers);
2007 succ_rl->uses_length += pred_rl->uses_length;
2008 succ_rl->clobbers_length += pred_rl->clobbers_length;
2010 IOR_REG_SET (&succ_deps->reg_last_in_use, &pred_deps->reg_last_in_use);
2012 /* Mem read/write lists are inherited by successor. */
2013 concat_insn_mem_list (pred_deps->pending_read_insns,
2014 pred_deps->pending_read_mems,
2015 &succ_deps->pending_read_insns,
2016 &succ_deps->pending_read_mems);
2017 concat_insn_mem_list (pred_deps->pending_write_insns,
2018 pred_deps->pending_write_mems,
2019 &succ_deps->pending_write_insns,
2020 &succ_deps->pending_write_mems);
2022 succ_deps->last_pending_memory_flush
2023 = concat_INSN_LIST (pred_deps->last_pending_memory_flush,
2024 succ_deps->last_pending_memory_flush);
2026 succ_deps->pending_lists_length += pred_deps->pending_lists_length;
2027 succ_deps->pending_flush_length += pred_deps->pending_flush_length;
2029 /* last_function_call is inherited by successor. */
2030 succ_deps->last_function_call
2031 = concat_INSN_LIST (pred_deps->last_function_call,
2032 succ_deps->last_function_call);
2034 /* sched_before_next_call is inherited by successor. */
2035 succ_deps->sched_before_next_call
2036 = concat_INSN_LIST (pred_deps->sched_before_next_call,
2037 succ_deps->sched_before_next_call);
2040 /* These lists should point to the right place, for correct
2041 freeing later. */
2042 bb_deps[bb].pending_read_insns = pred_deps->pending_read_insns;
2043 bb_deps[bb].pending_read_mems = pred_deps->pending_read_mems;
2044 bb_deps[bb].pending_write_insns = pred_deps->pending_write_insns;
2045 bb_deps[bb].pending_write_mems = pred_deps->pending_write_mems;
2047 /* Can't allow these to be freed twice. */
2048 pred_deps->pending_read_insns = 0;
2049 pred_deps->pending_read_mems = 0;
2050 pred_deps->pending_write_insns = 0;
2051 pred_deps->pending_write_mems = 0;
2054 /* Compute backward dependences inside bb. In a multiple blocks region:
2055 (1) a bb is analyzed after its predecessors, and (2) the lists in
2056 effect at the end of bb (after analyzing for bb) are inherited by
2057 bb's successors.
2059 Specifically for reg-reg data dependences, the block insns are
2060 scanned by sched_analyze () top-to-bottom. Two lists are
2061 maintained by sched_analyze (): reg_last[].sets for register DEFs,
2062 and reg_last[].uses for register USEs.
2064 When analysis is completed for bb, we update for its successors:
2065 ; - DEFS[succ] = Union (DEFS [succ], DEFS [bb])
2066 ; - USES[succ] = Union (USES [succ], DEFS [bb])
2068 The mechanism for computing mem-mem data dependence is very
2069 similar, and the result is interblock dependences in the region. */
2071 static void
2072 compute_block_backward_dependences (int bb)
2074 rtx head, tail;
2075 struct deps tmp_deps;
2077 tmp_deps = bb_deps[bb];
2079 /* Do the analysis for this block. */
2080 get_block_head_tail (BB_TO_BLOCK (bb), &head, &tail);
2081 sched_analyze (&tmp_deps, head, tail);
2082 add_branch_dependences (head, tail);
2084 if (current_nr_blocks > 1)
2085 propagate_deps (bb, &tmp_deps);
2087 /* Free up the INSN_LISTs. */
2088 free_deps (&tmp_deps);
2091 /* Remove all INSN_LISTs and EXPR_LISTs from the pending lists and add
2092 them to the unused_*_list variables, so that they can be reused. */
2094 static void
2095 free_pending_lists (void)
2097 int bb;
2099 for (bb = 0; bb < current_nr_blocks; bb++)
2101 free_INSN_LIST_list (&bb_deps[bb].pending_read_insns);
2102 free_INSN_LIST_list (&bb_deps[bb].pending_write_insns);
2103 free_EXPR_LIST_list (&bb_deps[bb].pending_read_mems);
2104 free_EXPR_LIST_list (&bb_deps[bb].pending_write_mems);
2108 /* Print dependences for debugging, callable from debugger. */
2110 void
2111 debug_dependencies (void)
2113 int bb;
2115 fprintf (sched_dump, ";; --------------- forward dependences: ------------ \n");
2116 for (bb = 0; bb < current_nr_blocks; bb++)
2118 rtx head, tail;
2119 rtx next_tail;
2120 rtx insn;
2122 get_block_head_tail (BB_TO_BLOCK (bb), &head, &tail);
2123 next_tail = NEXT_INSN (tail);
2124 fprintf (sched_dump, "\n;; --- Region Dependences --- b %d bb %d \n",
2125 BB_TO_BLOCK (bb), bb);
2127 fprintf (sched_dump, ";; %7s%6s%6s%6s%6s%6s%14s\n",
2128 "insn", "code", "bb", "dep", "prio", "cost",
2129 "reservation");
2130 fprintf (sched_dump, ";; %7s%6s%6s%6s%6s%6s%14s\n",
2131 "----", "----", "--", "---", "----", "----",
2132 "-----------");
2134 for (insn = head; insn != next_tail; insn = NEXT_INSN (insn))
2136 rtx link;
2138 if (! INSN_P (insn))
2140 int n;
2141 fprintf (sched_dump, ";; %6d ", INSN_UID (insn));
2142 if (NOTE_P (insn))
2144 n = NOTE_LINE_NUMBER (insn);
2145 if (n < 0)
2146 fprintf (sched_dump, "%s\n", GET_NOTE_INSN_NAME (n));
2147 else
2149 expanded_location xloc;
2150 NOTE_EXPANDED_LOCATION (xloc, insn);
2151 fprintf (sched_dump, "line %d, file %s\n",
2152 xloc.line, xloc.file);
2155 else
2156 fprintf (sched_dump, " {%s}\n", GET_RTX_NAME (GET_CODE (insn)));
2157 continue;
2160 fprintf (sched_dump,
2161 ";; %s%5d%6d%6d%6d%6d%6d ",
2162 (SCHED_GROUP_P (insn) ? "+" : " "),
2163 INSN_UID (insn),
2164 INSN_CODE (insn),
2165 INSN_BB (insn),
2166 INSN_DEP_COUNT (insn),
2167 INSN_PRIORITY (insn),
2168 insn_cost (insn, 0, 0));
2170 if (recog_memoized (insn) < 0)
2171 fprintf (sched_dump, "nothing");
2172 else
2173 print_reservation (sched_dump, insn);
2175 fprintf (sched_dump, "\t: ");
2176 for (link = INSN_DEPEND (insn); link; link = XEXP (link, 1))
2177 fprintf (sched_dump, "%d ", INSN_UID (XEXP (link, 0)));
2178 fprintf (sched_dump, "\n");
2181 fprintf (sched_dump, "\n");
2184 /* Returns true if all the basic blocks of the current region have
2185 NOTE_DISABLE_SCHED_OF_BLOCK which means not to schedule that region. */
2186 static bool
2187 sched_is_disabled_for_current_region_p (void)
2189 int bb;
2191 for (bb = 0; bb < current_nr_blocks; bb++)
2192 if (!(BASIC_BLOCK (BB_TO_BLOCK (bb))->flags & BB_DISABLE_SCHEDULE))
2193 return false;
2195 return true;
2198 /* Schedule a region. A region is either an inner loop, a loop-free
2199 subroutine, or a single basic block. Each bb in the region is
2200 scheduled after its flow predecessors. */
2202 static void
2203 schedule_region (int rgn)
2205 basic_block block;
2206 edge_iterator ei;
2207 edge e;
2208 int bb;
2209 int rgn_n_insns = 0;
2210 int sched_rgn_n_insns = 0;
2212 /* Set variables for the current region. */
2213 current_nr_blocks = RGN_NR_BLOCKS (rgn);
2214 current_blocks = RGN_BLOCKS (rgn);
2216 /* Don't schedule region that is marked by
2217 NOTE_DISABLE_SCHED_OF_BLOCK. */
2218 if (sched_is_disabled_for_current_region_p ())
2219 return;
2221 init_deps_global ();
2223 /* Initializations for region data dependence analysis. */
2224 bb_deps = xmalloc (sizeof (struct deps) * current_nr_blocks);
2225 for (bb = 0; bb < current_nr_blocks; bb++)
2226 init_deps (bb_deps + bb);
2228 /* Compute LOG_LINKS. */
2229 for (bb = 0; bb < current_nr_blocks; bb++)
2230 compute_block_backward_dependences (bb);
2232 /* Compute INSN_DEPEND. */
2233 for (bb = current_nr_blocks - 1; bb >= 0; bb--)
2235 rtx head, tail;
2236 get_block_head_tail (BB_TO_BLOCK (bb), &head, &tail);
2238 compute_forward_dependences (head, tail);
2240 if (targetm.sched.dependencies_evaluation_hook)
2241 targetm.sched.dependencies_evaluation_hook (head, tail);
2245 /* Set priorities. */
2246 for (bb = 0; bb < current_nr_blocks; bb++)
2248 rtx head, tail;
2249 get_block_head_tail (BB_TO_BLOCK (bb), &head, &tail);
2251 rgn_n_insns += set_priorities (head, tail);
2254 /* Compute interblock info: probabilities, split-edges, dominators, etc. */
2255 if (current_nr_blocks > 1)
2257 prob = xmalloc ((current_nr_blocks) * sizeof (float));
2259 dom = sbitmap_vector_alloc (current_nr_blocks, current_nr_blocks);
2260 sbitmap_vector_zero (dom, current_nr_blocks);
2262 /* Use ->aux to implement EDGE_TO_BIT mapping. */
2263 rgn_nr_edges = 0;
2264 FOR_EACH_BB (block)
2266 if (CONTAINING_RGN (block->index) != rgn)
2267 continue;
2268 FOR_EACH_EDGE (e, ei, block->succs)
2269 SET_EDGE_TO_BIT (e, rgn_nr_edges++);
2272 rgn_edges = xmalloc (rgn_nr_edges * sizeof (edge));
2273 rgn_nr_edges = 0;
2274 FOR_EACH_BB (block)
2276 if (CONTAINING_RGN (block->index) != rgn)
2277 continue;
2278 FOR_EACH_EDGE (e, ei, block->succs)
2279 rgn_edges[rgn_nr_edges++] = e;
2282 /* Split edges. */
2283 pot_split = sbitmap_vector_alloc (current_nr_blocks, rgn_nr_edges);
2284 sbitmap_vector_zero (pot_split, current_nr_blocks);
2285 ancestor_edges = sbitmap_vector_alloc (current_nr_blocks, rgn_nr_edges);
2286 sbitmap_vector_zero (ancestor_edges, current_nr_blocks);
2288 /* Compute probabilities, dominators, split_edges. */
2289 for (bb = 0; bb < current_nr_blocks; bb++)
2290 compute_dom_prob_ps (bb);
2293 /* Now we can schedule all blocks. */
2294 for (bb = 0; bb < current_nr_blocks; bb++)
2296 rtx head, tail;
2297 int b = BB_TO_BLOCK (bb);
2299 get_block_head_tail (b, &head, &tail);
2301 if (no_real_insns_p (head, tail))
2302 continue;
2304 current_sched_info->prev_head = PREV_INSN (head);
2305 current_sched_info->next_tail = NEXT_INSN (tail);
2307 if (write_symbols != NO_DEBUG)
2309 save_line_notes (b, head, tail);
2310 rm_line_notes (head, tail);
2313 /* rm_other_notes only removes notes which are _inside_ the
2314 block---that is, it won't remove notes before the first real insn
2315 or after the last real insn of the block. So if the first insn
2316 has a REG_SAVE_NOTE which would otherwise be emitted before the
2317 insn, it is redundant with the note before the start of the
2318 block, and so we have to take it out. */
2319 if (INSN_P (head))
2321 rtx note;
2323 for (note = REG_NOTES (head); note; note = XEXP (note, 1))
2324 if (REG_NOTE_KIND (note) == REG_SAVE_NOTE)
2325 remove_note (head, note);
2328 /* Remove remaining note insns from the block, save them in
2329 note_list. These notes are restored at the end of
2330 schedule_block (). */
2331 rm_other_notes (head, tail);
2333 target_bb = bb;
2335 current_sched_info->queue_must_finish_empty
2336 = current_nr_blocks > 1 && !flag_schedule_interblock;
2338 schedule_block (b, rgn_n_insns);
2339 sched_rgn_n_insns += sched_n_insns;
2341 /* Update target block boundaries. */
2342 if (head == BB_HEAD (BASIC_BLOCK (b)))
2343 BB_HEAD (BASIC_BLOCK (b)) = current_sched_info->head;
2344 if (tail == BB_END (BASIC_BLOCK (b)))
2345 BB_END (BASIC_BLOCK (b)) = current_sched_info->tail;
2347 /* Clean up. */
2348 if (current_nr_blocks > 1)
2350 free (candidate_table);
2351 free (bblst_table);
2352 free (edgelst_table);
2356 /* Sanity check: verify that all region insns were scheduled. */
2357 gcc_assert (sched_rgn_n_insns == rgn_n_insns);
2359 /* Restore line notes. */
2360 if (write_symbols != NO_DEBUG)
2362 for (bb = 0; bb < current_nr_blocks; bb++)
2364 rtx head, tail;
2365 get_block_head_tail (BB_TO_BLOCK (bb), &head, &tail);
2366 restore_line_notes (head, tail);
2370 /* Done with this region. */
2371 free_pending_lists ();
2373 finish_deps_global ();
2375 free (bb_deps);
2377 if (current_nr_blocks > 1)
2379 /* Cleanup ->aux used for EDGE_TO_BIT mapping. */
2380 FOR_EACH_BB (block)
2382 if (CONTAINING_RGN (block->index) != rgn)
2383 continue;
2384 FOR_EACH_EDGE (e, ei, block->succs)
2385 e->aux = NULL;
2388 free (prob);
2389 sbitmap_vector_free (dom);
2390 sbitmap_vector_free (pot_split);
2391 sbitmap_vector_free (ancestor_edges);
2392 free (rgn_edges);
2396 /* Indexed by region, holds the number of death notes found in that region.
2397 Used for consistency checks. */
2398 static int *deaths_in_region;
2400 /* Initialize data structures for region scheduling. */
2402 static void
2403 init_regions (void)
2405 sbitmap blocks;
2406 int rgn;
2408 nr_regions = 0;
2409 rgn_table = xmalloc ((n_basic_blocks) * sizeof (region));
2410 rgn_bb_table = xmalloc ((n_basic_blocks) * sizeof (int));
2411 block_to_bb = xmalloc ((last_basic_block) * sizeof (int));
2412 containing_rgn = xmalloc ((last_basic_block) * sizeof (int));
2414 /* Compute regions for scheduling. */
2415 if (reload_completed
2416 || n_basic_blocks == 1
2417 || !flag_schedule_interblock
2418 || is_cfg_nonregular ())
2420 find_single_block_region ();
2422 else
2424 /* Compute the dominators and post dominators. */
2425 calculate_dominance_info (CDI_DOMINATORS);
2427 /* Find regions. */
2428 find_rgns ();
2430 if (sched_verbose >= 3)
2431 debug_regions ();
2433 /* For now. This will move as more and more of haifa is converted
2434 to using the cfg code in flow.c. */
2435 free_dominance_info (CDI_DOMINATORS);
2439 if (CHECK_DEAD_NOTES)
2441 blocks = sbitmap_alloc (last_basic_block);
2442 deaths_in_region = xmalloc (sizeof (int) * nr_regions);
2443 /* Remove all death notes from the subroutine. */
2444 for (rgn = 0; rgn < nr_regions; rgn++)
2446 int b;
2448 sbitmap_zero (blocks);
2449 for (b = RGN_NR_BLOCKS (rgn) - 1; b >= 0; --b)
2450 SET_BIT (blocks, rgn_bb_table[RGN_BLOCKS (rgn) + b]);
2452 deaths_in_region[rgn] = count_or_remove_death_notes (blocks, 1);
2454 sbitmap_free (blocks);
2456 else
2457 count_or_remove_death_notes (NULL, 1);
2460 /* The one entry point in this file. DUMP_FILE is the dump file for
2461 this pass. */
2463 void
2464 schedule_insns (FILE *dump_file)
2466 sbitmap large_region_blocks, blocks;
2467 int rgn;
2468 int any_large_regions;
2469 basic_block bb;
2471 /* Taking care of this degenerate case makes the rest of
2472 this code simpler. */
2473 if (n_basic_blocks == 0)
2474 return;
2476 nr_inter = 0;
2477 nr_spec = 0;
2479 sched_init (dump_file);
2481 init_regions ();
2483 current_sched_info = &region_sched_info;
2485 /* Schedule every region in the subroutine. */
2486 for (rgn = 0; rgn < nr_regions; rgn++)
2487 schedule_region (rgn);
2489 /* Update life analysis for the subroutine. Do single block regions
2490 first so that we can verify that live_at_start didn't change. Then
2491 do all other blocks. */
2492 /* ??? There is an outside possibility that update_life_info, or more
2493 to the point propagate_block, could get called with nonzero flags
2494 more than once for one basic block. This would be kinda bad if it
2495 were to happen, since REG_INFO would be accumulated twice for the
2496 block, and we'd have twice the REG_DEAD notes.
2498 I'm fairly certain that this _shouldn't_ happen, since I don't think
2499 that live_at_start should change at region heads. Not sure what the
2500 best way to test for this kind of thing... */
2502 allocate_reg_life_data ();
2503 compute_bb_for_insn ();
2505 any_large_regions = 0;
2506 large_region_blocks = sbitmap_alloc (last_basic_block);
2507 sbitmap_zero (large_region_blocks);
2508 FOR_EACH_BB (bb)
2509 SET_BIT (large_region_blocks, bb->index);
2511 blocks = sbitmap_alloc (last_basic_block);
2512 sbitmap_zero (blocks);
2514 /* Update life information. For regions consisting of multiple blocks
2515 we've possibly done interblock scheduling that affects global liveness.
2516 For regions consisting of single blocks we need to do only local
2517 liveness. */
2518 for (rgn = 0; rgn < nr_regions; rgn++)
2519 if (RGN_NR_BLOCKS (rgn) > 1)
2520 any_large_regions = 1;
2521 else
2523 SET_BIT (blocks, rgn_bb_table[RGN_BLOCKS (rgn)]);
2524 RESET_BIT (large_region_blocks, rgn_bb_table[RGN_BLOCKS (rgn)]);
2527 /* Don't update reg info after reload, since that affects
2528 regs_ever_live, which should not change after reload. */
2529 update_life_info (blocks, UPDATE_LIFE_LOCAL,
2530 (reload_completed ? PROP_DEATH_NOTES
2531 : PROP_DEATH_NOTES | PROP_REG_INFO));
2532 if (any_large_regions)
2534 update_life_info (large_region_blocks, UPDATE_LIFE_GLOBAL,
2535 PROP_DEATH_NOTES | PROP_REG_INFO);
2538 if (CHECK_DEAD_NOTES)
2540 /* Verify the counts of basic block notes in single the basic block
2541 regions. */
2542 for (rgn = 0; rgn < nr_regions; rgn++)
2543 if (RGN_NR_BLOCKS (rgn) == 1)
2545 sbitmap_zero (blocks);
2546 SET_BIT (blocks, rgn_bb_table[RGN_BLOCKS (rgn)]);
2548 gcc_assert (deaths_in_region[rgn]
2549 == count_or_remove_death_notes (blocks, 0));
2551 free (deaths_in_region);
2554 /* Reposition the prologue and epilogue notes in case we moved the
2555 prologue/epilogue insns. */
2556 if (reload_completed)
2557 reposition_prologue_and_epilogue_notes (get_insns ());
2559 /* Delete redundant line notes. */
2560 if (write_symbols != NO_DEBUG)
2561 rm_redundant_line_notes ();
2563 if (sched_verbose)
2565 if (reload_completed == 0 && flag_schedule_interblock)
2567 fprintf (sched_dump,
2568 "\n;; Procedure interblock/speculative motions == %d/%d \n",
2569 nr_inter, nr_spec);
2571 else
2572 gcc_assert (nr_inter <= 0);
2573 fprintf (sched_dump, "\n\n");
2576 /* Clean up. */
2577 free (rgn_table);
2578 free (rgn_bb_table);
2579 free (block_to_bb);
2580 free (containing_rgn);
2582 sched_finish ();
2584 sbitmap_free (blocks);
2585 sbitmap_free (large_region_blocks);
2587 #endif