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
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
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
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. */
50 #include "coretypes.h"
55 #include "hard-reg-set.h"
59 #include "insn-config.h"
60 #include "insn-attr.h"
64 #include "cfglayout.h"
66 #include "sched-int.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
76 #define CHECK_DEAD_NOTES 0
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. */
97 int rgn_nr_blocks
; /* Number of blocks in region. */
98 int rgn_blocks
; /* cblocks in the region (actually index in rgn_bb_table). */
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. */
147 basic_block
*first_member
;
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
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
;
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. */
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. */
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
219 #define GET_SRC_PROB(bb_src, bb_trg) ((int) (100.0 * (prob[bb_src] / \
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. */
290 is_cfg_nonregular (void)
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
)
300 /* If we have any forced labels, then the cfg is not well structured. */
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 ())
310 /* If we have non-jumping insns which refer to labels, then we consider
311 the cfg not well structured. */
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
);
320 && ! (JUMP_P (NEXT_INSN (insn
))
321 && find_reg_note (NEXT_INSN (insn
), REG_LABEL
,
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
))
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. */
339 if (EDGE_COUNT (b
->preds
) == 0
340 || (EDGE_PRED (b
, 0)->src
== b
341 && EDGE_COUNT (b
->preds
) == 1))
345 /* All the tests passed. Consider the cfg well structured. */
349 /* Extract list of edges from a bitmap containing EDGE_TO_BIT bits. */
352 extract_edgelst (sbitmap set
, edgelst
*el
)
356 /* edgelst table space is reused in each call to extract_edgelst. */
359 el
->first_member
= &edgelst_table
[edgelst_last
];
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
];
370 /* Functions for the construction of regions. */
372 /* Print the regions, for debugging purposes. Callable from debugger. */
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
403 find_single_block_region (void)
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;
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). */
425 too_large (int block
, int *num_bbs
, int *num_insns
)
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
475 We use dominator relationships to avoid making regions out of non-reducible
478 This procedure needs to be converted to work on pred/succ lists instead
479 of edge tables. That would simplify it somewhat. */
484 int *max_hdr
, *dfs_nr
, *degree
;
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
;
494 /* Note if a block is a natural loop header. */
497 /* Note if a block is a natural inner loop header. */
500 /* Note if a block is in the block queue. */
503 /* Note if a block is in the block queue. */
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
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
++)
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
);
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 (¤t_edge
);
564 /* See if have finished the DFS tree traversal. */
565 if (sp
< 0 && EDGE_PASSED (current_edge
))
568 /* Nope, continue the traversal with the popped node. */
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 (¤t_edge
);
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
))
593 SET_BIT (header
, child
);
594 UPDATE_LOOP_RELATIONS (node
, child
);
595 SET_EDGE_PASSED (current_edge
);
596 ei_next (¤t_edge
);
600 /* If the child was already visited, then there is no need to visit
601 it again. Just update the loop relationships and restart
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 (¤t_edge
);
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. */
623 FOR_EACH_EDGE (e
, ei
, bb
->succs
)
628 /* Another check for unreachable blocks. The earlier test in
629 is_cfg_nonregular only finds unreachable blocks that do not
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. */
637 if (dfs_nr
[bb
->index
] == 0)
643 /* Gross. To avoid wasting memory, the second pass uses the dfs_nr array
644 to hold degree counts. */
648 degree
[bb
->index
] = EDGE_COUNT (bb
->preds
);
650 /* Do not perform region scheduling if there are any unreachable
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. */
668 if (TEST_BIT (header
, bb
->index
) && TEST_BIT (inner
, bb
->index
))
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
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. */
687 /* First identify blocks in the loop, except for the loop
689 if (bb
->index
== max_hdr
[jbb
->index
] && bb
!= jbb
)
691 /* Now verify that the block is dominated by the loop
693 if (!dominated_by_p (CDI_DOMINATORS
, jbb
, bb
))
698 /* If we exited the loop early, then I is the header of
699 a non-reducible loop and we should quit processing it
701 if (jbb
!= EXIT_BLOCK_PTR
)
704 /* I is a header of an inner loop, or block 0 in a subroutine
705 with no loops at all. */
707 too_large_failure
= 0;
708 loop_head
= max_hdr
[bb
->index
];
710 /* Decrease degree of all I's successors for topological
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. */
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. */
728 /* Leaf nodes have only a single successor which must
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;
747 FOR_EACH_EDGE (e
, ei
, bb
->preds
)
749 if (e
->src
== ENTRY_BLOCK_PTR
)
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;
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
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
)
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
)
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;
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
849 if (degree
[child
] == 0)
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
];
873 /* Any block that did not end up in a region is placed into a region
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;
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. */
900 compute_dom_prob_ps (int bb
)
903 int nr_out_edges
, nr_rgn_out_edges
;
904 edge_iterator in_ei
, out_ei
;
905 edge in_edge
, out_edge
;
908 if (IS_RGN_ENTRY (bb
))
910 SET_BIT (dom
[bb
], 0);
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
)
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
]);
933 nr_rgn_out_edges
= 0;
935 FOR_EACH_EDGE (out_edge
, out_ei
, in_edge
->src
->succs
)
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
)))
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
;
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. */
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
);
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. */
987 compute_trg_info (int trg
)
991 int i
, j
, k
, update_idx
;
997 /* Define some of the fields for the target bb as well. */
998 sp
= candidate_table
+ trg
;
1000 sp
->is_speculative
= 0;
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
);
1012 sp
->src_prob
= GET_SRC_PROB (i
, trg
);
1013 sp
->is_valid
= (sp
->src_prob
>= MIN_PROBABILITY
);
1018 split_edges (i
, trg
, &el
);
1019 sp
->is_speculative
= (el
.nr_members
) ? 1 : 0;
1020 if (sp
->is_speculative
&& !flag_schedule_speculative
)
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. */
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
])
1055 if (k
>= el
.nr_members
)
1057 bblst_table
[bblst_last
++] = e
->dest
;
1059 e
->dest
->index
- (INVALID_BLOCK
+ 1));
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
);
1072 sp
->split_bbs
.nr_members
= sp
->update_bbs
.nr_members
= 0;
1074 sp
->is_speculative
= 0;
1079 sbitmap_free (visited
);
1082 /* Print candidates info, for debugging purposes. Callable from debugger. */
1085 debug_candidate (int i
)
1087 if (!candidate_table
[i
].is_valid
)
1090 if (candidate_table
[i
].is_speculative
)
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");
1115 fprintf (sched_dump
, " src %d equivalent\n", BB_TO_BLOCK (i
));
1119 /* Print candidates info, for debugging purposes. Callable from debugger. */
1122 debug_candidates (int trg
)
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. */
1138 check_live_1 (int src
, rtx x
)
1142 rtx reg
= SET_DEST (x
);
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
)
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)))
1167 regno
= REGNO (reg
);
1169 if (regno
< FIRST_PSEUDO_REGISTER
&& global_regs
[regno
])
1171 /* Global registers are assumed live. */
1176 if (regno
< FIRST_PSEUDO_REGISTER
)
1178 /* Check for hard registers. */
1179 int j
= hard_regno_nregs
[regno
][GET_MODE (reg
)];
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
))
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
))
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. */
1215 update_live_1 (int src
, rtx x
)
1219 rtx reg
= SET_DEST (x
);
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
)
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));
1243 /* Global registers are always live, so the code below does not apply
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
)];
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
);
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. */
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
)
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
)))
1301 /* Update the live registers info after insn was moved speculatively from
1302 block src to trg. */
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
)
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) \
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. */
1331 set_spec_fed (rtx load_insn
)
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. */
1344 find_conditional_protection (rtx insn
, int load_insn_bb
)
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
1358 || find_conditional_protection (next
, load_insn_bb
)))
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
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. */
1379 is_conditionally_protected (rtx load_insn
, int bb_src
, int bb_trg
)
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
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
)))
1400 /* Now search for the conditional-branch. */
1401 if (find_conditional_protection (insn1
, bb_src
))
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. */
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
1429 is_pfree (rtx load_insn
, int bb_src
, int bb_trg
)
1432 candidate
*candp
= candidate_table
+ bb_src
;
1434 if (candp
->split_bbs
.nr_members
!= 1)
1435 /* Must have exactly one escape block. */
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). */
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. */
1459 if (INSN_BB (insn2
) == bb_trg
)
1460 /* insn2 is the similar load, in the target block. */
1463 if (*(candp
->split_bbs
.first_member
) == BLOCK_FOR_INSN (insn2
))
1464 /* insn2 is a similar load, in a split-block. */
1471 /* Couldn't find a similar load. */
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). */
1480 is_prisky (rtx load_insn
, int bb_src
, int bb_trg
)
1482 if (FED_BY_SPEC_LOAD (load_insn
))
1485 if (LOG_LINKS (load_insn
) == NULL
)
1486 /* Dependence may 'hide' out of the region. */
1489 if (is_conditionally_protected (load_insn
, bb_src
, bb_trg
))
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)
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. */
1515 if (!flag_schedule_speculative_load
)
1517 IS_LOAD_INSN (insn
) = 1;
1524 case PFREE_CANDIDATE
:
1525 if (is_pfree (insn
, bb_src
, bb_trg
))
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
))
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. */
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. */
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
;
1578 sched_target_n_insns
= 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
));
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
1596 bblst_size
= (current_nr_blocks
- target_bb
) * rgn_nr_edges
;
1597 bblst_table
= xmalloc (bblst_size
* sizeof (basic_block
));
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
));
1620 /* Add to ready list all 'ready' insns in valid source blocks.
1621 For speculative insns, check-live, exception-free, and
1623 for (bb_src
= target_bb
+ 1; bb_src
< current_nr_blocks
; bb_src
++)
1624 if (IS_VALID (bb_src
))
1630 get_block_head_tail (BB_TO_BLOCK (bb_src
), &head
, &tail
);
1631 src_next_tail
= NEXT_INSN (tail
);
1634 for (insn
= src_head
; insn
!= src_next_tail
; insn
= NEXT_INSN (insn
))
1636 if (! INSN_P (insn
))
1639 if (!CANT_MOVE (insn
)
1640 && (!IS_SPECULATIVE_INSN (insn
)
1641 || ((recog_memoized (insn
) < 0
1642 || min_insn_conflict_delay (curr_state
,
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. */
1662 can_schedule_ready_p (rtx insn
)
1667 /* An interblock motion? */
1668 if (INSN_BB (insn
) != target_bb
)
1672 if (IS_SPECULATIVE_INSN (insn
))
1674 if (!check_live (insn
, INSN_BB (insn
)))
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
);
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
;
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
);
1714 /* In block motion. */
1715 sched_target_n_insns
++;
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. */
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
))
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
)))))
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. */
1748 rgn_print_insn (rtx insn
, int aligned
)
1750 static char tmp
[80];
1753 sprintf (tmp
, "b%3d: i%4d", INSN_BB (insn
), INSN_UID (insn
));
1756 if (current_nr_blocks
> 1 && INSN_BB (insn
) != target_bb
)
1757 sprintf (tmp
, "%d/b%d", INSN_UID (insn
), INSN_BB (insn
));
1759 sprintf (tmp
, "%d", INSN_UID (insn
));
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. */
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
))
1779 if ((INSN_BB (insn1
) == target_bb
) && (INSN_BB (insn2
) != target_bb
))
1782 /* Prefer a useful motion on a speculative one. */
1783 spec_val
= IS_SPECULATIVE_INSN (insn1
) - IS_SPECULATIVE_INSN (insn2
);
1787 /* Prefer a more probable (speculative) insn. */
1788 prob_val
= INSN_PROBABILITY (insn2
) - INSN_PROBABILITY (insn1
);
1795 /* NEXT is an instruction that depends on INSN (a backward dependence);
1796 return nonzero if we should include this dependence in priority
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. */
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
=
1826 can_schedule_ready_p
,
1831 contributes_to_priority
,
1832 compute_jump_reg_dependencies
,
1839 /* Determine if PAT sets a CLASS_LIKELY_SPILLED_P register. */
1842 sets_likely_spilled (rtx pat
)
1845 note_stores (pat
, sets_likely_spilled_1
, &ret
);
1850 sets_likely_spilled_1 (rtx x
, rtx pat
, void *data
)
1852 bool *ret
= (bool *) data
;
1854 if (GET_CODE (pat
) == SET
1856 && REGNO (x
) < FIRST_PSEUDO_REGISTER
1857 && CLASS_LIKELY_SPILLED_P (REGNO_REG_CLASS (REGNO (x
))))
1861 /* Add dependences so that branches are scheduled to run last in their
1865 add_branch_dependences (rtx head
, rtx tail
)
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
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. */
1887 while (CALL_P (insn
)
1889 || (NONJUMP_INSN_P (insn
)
1890 && (GET_CODE (PATTERN (insn
)) == USE
1891 || GET_CODE (PATTERN (insn
)) == CLOBBER
1892 || can_throw_internal (insn
)
1894 || sets_cc0_p (PATTERN (insn
))
1896 || (!reload_completed
1897 && sets_likely_spilled (PATTERN (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;
1913 /* Don't overrun the bounds of the basic block. */
1917 insn
= PREV_INSN (insn
);
1920 /* Make sure these insns are scheduled last in their block. */
1923 while (insn
!= head
)
1925 insn
= prev_nonnote_insn (insn
);
1927 if (INSN_REF_COUNT (insn
) != 0)
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. */
1946 concat_INSN_LIST (rtx copy
, rtx old
)
1949 for (; copy
; copy
= XEXP (copy
, 1))
1950 new = alloc_INSN_LIST (XEXP (copy
, 0), new);
1955 concat_insn_mem_list (rtx copy_insns
, rtx copy_mems
, rtx
*old_insns_p
,
1958 rtx new_insns
= *old_insns_p
;
1959 rtx new_mems
= *old_mems_p
;
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. */
1976 propagate_deps (int bb
, struct deps
*pred_deps
)
1978 basic_block block
= BASIC_BLOCK (BB_TO_BLOCK (bb
));
1982 /* bb's structures are inherited by its successors. */
1983 FOR_EACH_EDGE (e
, ei
, block
->succs
)
1985 struct deps
*succ_deps
;
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
)
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
,
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
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
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. */
2072 compute_block_backward_dependences (int bb
)
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. */
2095 free_pending_lists (void)
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. */
2111 debug_dependencies (void)
2115 fprintf (sched_dump
, ";; --------------- forward dependences: ------------ \n");
2116 for (bb
= 0; bb
< current_nr_blocks
; bb
++)
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",
2130 fprintf (sched_dump
, ";; %7s%6s%6s%6s%6s%6s%14s\n",
2131 "----", "----", "--", "---", "----", "----",
2134 for (insn
= head
; insn
!= next_tail
; insn
= NEXT_INSN (insn
))
2138 if (! INSN_P (insn
))
2141 fprintf (sched_dump
, ";; %6d ", INSN_UID (insn
));
2144 n
= NOTE_LINE_NUMBER (insn
);
2146 fprintf (sched_dump
, "%s\n", GET_NOTE_INSN_NAME (n
));
2149 expanded_location xloc
;
2150 NOTE_EXPANDED_LOCATION (xloc
, insn
);
2151 fprintf (sched_dump
, "line %d, file %s\n",
2152 xloc
.line
, xloc
.file
);
2156 fprintf (sched_dump
, " {%s}\n", GET_RTX_NAME (GET_CODE (insn
)));
2160 fprintf (sched_dump
,
2161 ";; %s%5d%6d%6d%6d%6d%6d ",
2162 (SCHED_GROUP_P (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");
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. */
2187 sched_is_disabled_for_current_region_p (void)
2191 for (bb
= 0; bb
< current_nr_blocks
; bb
++)
2192 if (!(BASIC_BLOCK (BB_TO_BLOCK (bb
))->flags
& BB_DISABLE_SCHEDULE
))
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. */
2203 schedule_region (int rgn
)
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 ())
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
--)
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
++)
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. */
2266 if (CONTAINING_RGN (block
->index
) != rgn
)
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
));
2276 if (CONTAINING_RGN (block
->index
) != rgn
)
2278 FOR_EACH_EDGE (e
, ei
, block
->succs
)
2279 rgn_edges
[rgn_nr_edges
++] = e
;
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
++)
2297 int b
= BB_TO_BLOCK (bb
);
2299 get_block_head_tail (b
, &head
, &tail
);
2301 if (no_real_insns_p (head
, tail
))
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. */
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
);
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
;
2348 if (current_nr_blocks
> 1)
2350 free (candidate_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
++)
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 ();
2377 if (current_nr_blocks
> 1)
2379 /* Cleanup ->aux used for EDGE_TO_BIT mapping. */
2382 if (CONTAINING_RGN (block
->index
) != rgn
)
2384 FOR_EACH_EDGE (e
, ei
, block
->succs
)
2389 sbitmap_vector_free (dom
);
2390 sbitmap_vector_free (pot_split
);
2391 sbitmap_vector_free (ancestor_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. */
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 ();
2424 /* Compute the dominators and post dominators. */
2425 calculate_dominance_info (CDI_DOMINATORS
);
2430 if (sched_verbose
>= 3)
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
++)
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
);
2457 count_or_remove_death_notes (NULL
, 1);
2460 /* The one entry point in this file. DUMP_FILE is the dump file for
2464 schedule_insns (FILE *dump_file
)
2466 sbitmap large_region_blocks
, blocks
;
2468 int any_large_regions
;
2471 /* Taking care of this degenerate case makes the rest of
2472 this code simpler. */
2473 if (n_basic_blocks
== 0)
2479 sched_init (dump_file
);
2483 current_sched_info
= ®ion_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
);
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
2518 for (rgn
= 0; rgn
< nr_regions
; rgn
++)
2519 if (RGN_NR_BLOCKS (rgn
) > 1)
2520 any_large_regions
= 1;
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
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 ();
2565 if (reload_completed
== 0 && flag_schedule_interblock
)
2567 fprintf (sched_dump
,
2568 "\n;; Procedure interblock/speculative motions == %d/%d \n",
2572 gcc_assert (nr_inter
<= 0);
2573 fprintf (sched_dump
, "\n\n");
2578 free (rgn_bb_table
);
2580 free (containing_rgn
);
2584 sbitmap_free (blocks
);
2585 sbitmap_free (large_region_blocks
);