tree.c (build_tree_list): Fix parameter names in comment.
[official-gcc.git] / gcc / sched-rgn.c
blob36a53f73c26162bc35f7f299dcfb5395b59791ba
1 /* Instruction scheduling pass.
2 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998,
3 1999, 2000, 2001, 2002 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 "basic-block.h"
57 #include "regs.h"
58 #include "function.h"
59 #include "flags.h"
60 #include "insn-config.h"
61 #include "insn-attr.h"
62 #include "except.h"
63 #include "toplev.h"
64 #include "recog.h"
65 #include "cfglayout.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 #define MAX_RGN_BLOCKS 10
87 #define MAX_RGN_INSNS 100
89 /* nr_inter/spec counts interblock/speculative motion for the function. */
90 static int nr_inter, nr_spec;
92 /* Control flow graph edges are kept in circular lists. */
93 typedef struct
95 int from_block;
96 int to_block;
97 int next_in;
98 int next_out;
100 haifa_edge;
101 static haifa_edge *edge_table;
103 #define NEXT_IN(edge) (edge_table[edge].next_in)
104 #define NEXT_OUT(edge) (edge_table[edge].next_out)
105 #define FROM_BLOCK(edge) (edge_table[edge].from_block)
106 #define TO_BLOCK(edge) (edge_table[edge].to_block)
108 /* Number of edges in the control flow graph. (In fact, larger than
109 that by 1, since edge 0 is unused.) */
110 static int nr_edges;
112 /* Circular list of incoming/outgoing edges of a block. */
113 static int *in_edges;
114 static int *out_edges;
116 #define IN_EDGES(block) (in_edges[block])
117 #define OUT_EDGES(block) (out_edges[block])
119 static int is_cfg_nonregular PARAMS ((void));
120 static int build_control_flow PARAMS ((struct edge_list *));
121 static void new_edge PARAMS ((int, int));
123 /* A region is the main entity for interblock scheduling: insns
124 are allowed to move between blocks in the same region, along
125 control flow graph edges, in the 'up' direction. */
126 typedef struct
128 int rgn_nr_blocks; /* Number of blocks in region. */
129 int rgn_blocks; /* cblocks in the region (actually index in rgn_bb_table). */
131 region;
133 /* Number of regions in the procedure. */
134 static int nr_regions;
136 /* Table of region descriptions. */
137 static region *rgn_table;
139 /* Array of lists of regions' blocks. */
140 static int *rgn_bb_table;
142 /* Topological order of blocks in the region (if b2 is reachable from
143 b1, block_to_bb[b2] > block_to_bb[b1]). Note: A basic block is
144 always referred to by either block or b, while its topological
145 order name (in the region) is refered to by bb. */
146 static int *block_to_bb;
148 /* The number of the region containing a block. */
149 static int *containing_rgn;
151 #define RGN_NR_BLOCKS(rgn) (rgn_table[rgn].rgn_nr_blocks)
152 #define RGN_BLOCKS(rgn) (rgn_table[rgn].rgn_blocks)
153 #define BLOCK_TO_BB(block) (block_to_bb[block])
154 #define CONTAINING_RGN(block) (containing_rgn[block])
156 void debug_regions PARAMS ((void));
157 static void find_single_block_region PARAMS ((void));
158 static void find_rgns PARAMS ((struct edge_list *, dominance_info));
159 static int too_large PARAMS ((int, int *, int *));
161 extern void debug_live PARAMS ((int, int));
163 /* Blocks of the current region being scheduled. */
164 static int current_nr_blocks;
165 static int current_blocks;
167 /* The mapping from bb to block. */
168 #define BB_TO_BLOCK(bb) (rgn_bb_table[current_blocks + (bb)])
170 typedef struct
172 int *first_member; /* Pointer to the list start in bitlst_table. */
173 int nr_members; /* The number of members of the bit list. */
175 bitlst;
177 static int bitlst_table_last;
178 static int *bitlst_table;
180 static void extract_bitlst PARAMS ((sbitmap, bitlst *));
182 /* Target info declarations.
184 The block currently being scheduled is referred to as the "target" block,
185 while other blocks in the region from which insns can be moved to the
186 target are called "source" blocks. The candidate structure holds info
187 about such sources: are they valid? Speculative? Etc. */
188 typedef bitlst bblst;
189 typedef struct
191 char is_valid;
192 char is_speculative;
193 int src_prob;
194 bblst split_bbs;
195 bblst update_bbs;
197 candidate;
199 static candidate *candidate_table;
201 /* A speculative motion requires checking live information on the path
202 from 'source' to 'target'. The split blocks are those to be checked.
203 After a speculative motion, live information should be modified in
204 the 'update' blocks.
206 Lists of split and update blocks for each candidate of the current
207 target are in array bblst_table. */
208 static int *bblst_table, bblst_size, bblst_last;
210 #define IS_VALID(src) ( candidate_table[src].is_valid )
211 #define IS_SPECULATIVE(src) ( candidate_table[src].is_speculative )
212 #define SRC_PROB(src) ( candidate_table[src].src_prob )
214 /* The bb being currently scheduled. */
215 static int target_bb;
217 /* List of edges. */
218 typedef bitlst edgelst;
220 /* Target info functions. */
221 static void split_edges PARAMS ((int, int, edgelst *));
222 static void compute_trg_info PARAMS ((int));
223 void debug_candidate PARAMS ((int));
224 void debug_candidates PARAMS ((int));
226 /* Dominators array: dom[i] contains the sbitmap of dominators of
227 bb i in the region. */
228 static sbitmap *dom;
230 /* bb 0 is the only region entry. */
231 #define IS_RGN_ENTRY(bb) (!bb)
233 /* Is bb_src dominated by bb_trg. */
234 #define IS_DOMINATED(bb_src, bb_trg) \
235 ( TEST_BIT (dom[bb_src], bb_trg) )
237 /* Probability: Prob[i] is a float in [0, 1] which is the probability
238 of bb i relative to the region entry. */
239 static float *prob;
241 /* The probability of bb_src, relative to bb_trg. Note, that while the
242 'prob[bb]' is a float in [0, 1], this macro returns an integer
243 in [0, 100]. */
244 #define GET_SRC_PROB(bb_src, bb_trg) ((int) (100.0 * (prob[bb_src] / \
245 prob[bb_trg])))
247 /* Bit-set of edges, where bit i stands for edge i. */
248 typedef sbitmap edgeset;
250 /* Number of edges in the region. */
251 static int rgn_nr_edges;
253 /* Array of size rgn_nr_edges. */
254 static int *rgn_edges;
257 /* Mapping from each edge in the graph to its number in the rgn. */
258 static int *edge_to_bit;
259 #define EDGE_TO_BIT(edge) (edge_to_bit[edge])
261 /* The split edges of a source bb is different for each target
262 bb. In order to compute this efficiently, the 'potential-split edges'
263 are computed for each bb prior to scheduling a region. This is actually
264 the split edges of each bb relative to the region entry.
266 pot_split[bb] is the set of potential split edges of bb. */
267 static edgeset *pot_split;
269 /* For every bb, a set of its ancestor edges. */
270 static edgeset *ancestor_edges;
272 static void compute_dom_prob_ps PARAMS ((int));
274 #define INSN_PROBABILITY(INSN) (SRC_PROB (BLOCK_TO_BB (BLOCK_NUM (INSN))))
275 #define IS_SPECULATIVE_INSN(INSN) (IS_SPECULATIVE (BLOCK_TO_BB (BLOCK_NUM (INSN))))
276 #define INSN_BB(INSN) (BLOCK_TO_BB (BLOCK_NUM (INSN)))
278 /* Parameters affecting the decision of rank_for_schedule().
279 ??? Nope. But MIN_PROBABILITY is used in compute_trg_info. */
280 #define MIN_PROBABILITY 40
282 /* Speculative scheduling functions. */
283 static int check_live_1 PARAMS ((int, rtx));
284 static void update_live_1 PARAMS ((int, rtx));
285 static int check_live PARAMS ((rtx, int));
286 static void update_live PARAMS ((rtx, int));
287 static void set_spec_fed PARAMS ((rtx));
288 static int is_pfree PARAMS ((rtx, int, int));
289 static int find_conditional_protection PARAMS ((rtx, int));
290 static int is_conditionally_protected PARAMS ((rtx, int, int));
291 static int may_trap_exp PARAMS ((rtx, int));
292 static int haifa_classify_insn PARAMS ((rtx));
293 static int is_prisky PARAMS ((rtx, int, int));
294 static int is_exception_free PARAMS ((rtx, int, int));
296 static bool sets_likely_spilled PARAMS ((rtx));
297 static void sets_likely_spilled_1 PARAMS ((rtx, rtx, void *));
298 static void add_branch_dependences PARAMS ((rtx, rtx));
299 static void compute_block_backward_dependences PARAMS ((int));
300 void debug_dependencies PARAMS ((void));
302 static void init_regions PARAMS ((void));
303 static void schedule_region PARAMS ((int));
304 static rtx concat_INSN_LIST PARAMS ((rtx, rtx));
305 static void concat_insn_mem_list PARAMS ((rtx, rtx, rtx *, rtx *));
306 static void propagate_deps PARAMS ((int, struct deps *));
307 static void free_pending_lists PARAMS ((void));
309 /* Functions for construction of the control flow graph. */
311 /* Return 1 if control flow graph should not be constructed, 0 otherwise.
313 We decide not to build the control flow graph if there is possibly more
314 than one entry to the function, if computed branches exist, of if we
315 have nonlocal gotos. */
317 static int
318 is_cfg_nonregular ()
320 basic_block b;
321 rtx insn;
322 RTX_CODE code;
324 /* If we have a label that could be the target of a nonlocal goto, then
325 the cfg is not well structured. */
326 if (nonlocal_goto_handler_labels)
327 return 1;
329 /* If we have any forced labels, then the cfg is not well structured. */
330 if (forced_labels)
331 return 1;
333 /* If this function has a computed jump, then we consider the cfg
334 not well structured. */
335 if (current_function_has_computed_jump)
336 return 1;
338 /* If we have exception handlers, then we consider the cfg not well
339 structured. ?!? We should be able to handle this now that flow.c
340 computes an accurate cfg for EH. */
341 if (current_function_has_exception_handlers ())
342 return 1;
344 /* If we have non-jumping insns which refer to labels, then we consider
345 the cfg not well structured. */
346 /* Check for labels referred to other thn by jumps. */
347 FOR_EACH_BB (b)
348 for (insn = b->head;; insn = NEXT_INSN (insn))
350 code = GET_CODE (insn);
351 if (GET_RTX_CLASS (code) == 'i' && code != JUMP_INSN)
353 rtx note = find_reg_note (insn, REG_LABEL, NULL_RTX);
355 if (note
356 && ! (GET_CODE (NEXT_INSN (insn)) == JUMP_INSN
357 && find_reg_note (NEXT_INSN (insn), REG_LABEL,
358 XEXP (note, 0))))
359 return 1;
362 if (insn == b->end)
363 break;
366 /* All the tests passed. Consider the cfg well structured. */
367 return 0;
370 /* Build the control flow graph and set nr_edges.
372 Instead of trying to build a cfg ourselves, we rely on flow to
373 do it for us. Stamp out useless code (and bug) duplication.
375 Return nonzero if an irregularity in the cfg is found which would
376 prevent cross block scheduling. */
378 static int
379 build_control_flow (edge_list)
380 struct edge_list *edge_list;
382 int i, unreachable, num_edges;
383 basic_block b;
385 /* This already accounts for entry/exit edges. */
386 num_edges = NUM_EDGES (edge_list);
388 /* Unreachable loops with more than one basic block are detected
389 during the DFS traversal in find_rgns.
391 Unreachable loops with a single block are detected here. This
392 test is redundant with the one in find_rgns, but it's much
393 cheaper to go ahead and catch the trivial case here. */
394 unreachable = 0;
395 FOR_EACH_BB (b)
397 if (b->pred == NULL
398 || (b->pred->src == b
399 && b->pred->pred_next == NULL))
400 unreachable = 1;
403 /* ??? We can kill these soon. */
404 in_edges = (int *) xcalloc (last_basic_block, sizeof (int));
405 out_edges = (int *) xcalloc (last_basic_block, sizeof (int));
406 edge_table = (haifa_edge *) xcalloc (num_edges, sizeof (haifa_edge));
408 nr_edges = 0;
409 for (i = 0; i < num_edges; i++)
411 edge e = INDEX_EDGE (edge_list, i);
413 if (e->dest != EXIT_BLOCK_PTR
414 && e->src != ENTRY_BLOCK_PTR)
415 new_edge (e->src->index, e->dest->index);
418 /* Increment by 1, since edge 0 is unused. */
419 nr_edges++;
421 return unreachable;
424 /* Record an edge in the control flow graph from SOURCE to TARGET.
426 In theory, this is redundant with the s_succs computed above, but
427 we have not converted all of haifa to use information from the
428 integer lists. */
430 static void
431 new_edge (source, target)
432 int source, target;
434 int e, next_edge;
435 int curr_edge, fst_edge;
437 /* Check for duplicates. */
438 fst_edge = curr_edge = OUT_EDGES (source);
439 while (curr_edge)
441 if (FROM_BLOCK (curr_edge) == source
442 && TO_BLOCK (curr_edge) == target)
444 return;
447 curr_edge = NEXT_OUT (curr_edge);
449 if (fst_edge == curr_edge)
450 break;
453 e = ++nr_edges;
455 FROM_BLOCK (e) = source;
456 TO_BLOCK (e) = target;
458 if (OUT_EDGES (source))
460 next_edge = NEXT_OUT (OUT_EDGES (source));
461 NEXT_OUT (OUT_EDGES (source)) = e;
462 NEXT_OUT (e) = next_edge;
464 else
466 OUT_EDGES (source) = e;
467 NEXT_OUT (e) = e;
470 if (IN_EDGES (target))
472 next_edge = NEXT_IN (IN_EDGES (target));
473 NEXT_IN (IN_EDGES (target)) = e;
474 NEXT_IN (e) = next_edge;
476 else
478 IN_EDGES (target) = e;
479 NEXT_IN (e) = e;
483 /* Translate a bit-set SET to a list BL of the bit-set members. */
485 static void
486 extract_bitlst (set, bl)
487 sbitmap set;
488 bitlst *bl;
490 int i;
492 /* bblst table space is reused in each call to extract_bitlst. */
493 bitlst_table_last = 0;
495 bl->first_member = &bitlst_table[bitlst_table_last];
496 bl->nr_members = 0;
498 /* Iterate over each word in the bitset. */
499 EXECUTE_IF_SET_IN_SBITMAP (set, 0, i,
501 bitlst_table[bitlst_table_last++] = i;
502 (bl->nr_members)++;
507 /* Functions for the construction of regions. */
509 /* Print the regions, for debugging purposes. Callable from debugger. */
511 void
512 debug_regions ()
514 int rgn, bb;
516 fprintf (sched_dump, "\n;; ------------ REGIONS ----------\n\n");
517 for (rgn = 0; rgn < nr_regions; rgn++)
519 fprintf (sched_dump, ";;\trgn %d nr_blocks %d:\n", rgn,
520 rgn_table[rgn].rgn_nr_blocks);
521 fprintf (sched_dump, ";;\tbb/block: ");
523 for (bb = 0; bb < rgn_table[rgn].rgn_nr_blocks; bb++)
525 current_blocks = RGN_BLOCKS (rgn);
527 if (bb != BLOCK_TO_BB (BB_TO_BLOCK (bb)))
528 abort ();
530 fprintf (sched_dump, " %d/%d ", bb, BB_TO_BLOCK (bb));
533 fprintf (sched_dump, "\n\n");
537 /* Build a single block region for each basic block in the function.
538 This allows for using the same code for interblock and basic block
539 scheduling. */
541 static void
542 find_single_block_region ()
544 basic_block bb;
546 nr_regions = 0;
548 FOR_EACH_BB (bb)
550 rgn_bb_table[nr_regions] = bb->index;
551 RGN_NR_BLOCKS (nr_regions) = 1;
552 RGN_BLOCKS (nr_regions) = nr_regions;
553 CONTAINING_RGN (bb->index) = nr_regions;
554 BLOCK_TO_BB (bb->index) = 0;
555 nr_regions++;
559 /* Update number of blocks and the estimate for number of insns
560 in the region. Return 1 if the region is "too large" for interblock
561 scheduling (compile time considerations), otherwise return 0. */
563 static int
564 too_large (block, num_bbs, num_insns)
565 int block, *num_bbs, *num_insns;
567 (*num_bbs)++;
568 (*num_insns) += (INSN_LUID (BLOCK_END (block)) -
569 INSN_LUID (BLOCK_HEAD (block)));
570 if ((*num_bbs > MAX_RGN_BLOCKS) || (*num_insns > MAX_RGN_INSNS))
571 return 1;
572 else
573 return 0;
576 /* Update_loop_relations(blk, hdr): Check if the loop headed by max_hdr[blk]
577 is still an inner loop. Put in max_hdr[blk] the header of the most inner
578 loop containing blk. */
579 #define UPDATE_LOOP_RELATIONS(blk, hdr) \
581 if (max_hdr[blk] == -1) \
582 max_hdr[blk] = hdr; \
583 else if (dfs_nr[max_hdr[blk]] > dfs_nr[hdr]) \
584 RESET_BIT (inner, hdr); \
585 else if (dfs_nr[max_hdr[blk]] < dfs_nr[hdr]) \
587 RESET_BIT (inner,max_hdr[blk]); \
588 max_hdr[blk] = hdr; \
592 /* Find regions for interblock scheduling.
594 A region for scheduling can be:
596 * A loop-free procedure, or
598 * A reducible inner loop, or
600 * A basic block not contained in any other region.
602 ?!? In theory we could build other regions based on extended basic
603 blocks or reverse extended basic blocks. Is it worth the trouble?
605 Loop blocks that form a region are put into the region's block list
606 in topological order.
608 This procedure stores its results into the following global (ick) variables
610 * rgn_nr
611 * rgn_table
612 * rgn_bb_table
613 * block_to_bb
614 * containing region
616 We use dominator relationships to avoid making regions out of non-reducible
617 loops.
619 This procedure needs to be converted to work on pred/succ lists instead
620 of edge tables. That would simplify it somewhat. */
622 static void
623 find_rgns (edge_list, dom)
624 struct edge_list *edge_list;
625 dominance_info dom;
627 int *max_hdr, *dfs_nr, *stack, *degree;
628 char no_loops = 1;
629 int node, child, loop_head, i, head, tail;
630 int count = 0, sp, idx = 0, current_edge = out_edges[0];
631 int num_bbs, num_insns, unreachable;
632 int too_large_failure;
633 basic_block bb;
635 /* Note if an edge has been passed. */
636 sbitmap passed;
638 /* Note if a block is a natural loop header. */
639 sbitmap header;
641 /* Note if a block is a natural inner loop header. */
642 sbitmap inner;
644 /* Note if a block is in the block queue. */
645 sbitmap in_queue;
647 /* Note if a block is in the block queue. */
648 sbitmap in_stack;
650 int num_edges = NUM_EDGES (edge_list);
652 /* Perform a DFS traversal of the cfg. Identify loop headers, inner loops
653 and a mapping from block to its loop header (if the block is contained
654 in a loop, else -1).
656 Store results in HEADER, INNER, and MAX_HDR respectively, these will
657 be used as inputs to the second traversal.
659 STACK, SP and DFS_NR are only used during the first traversal. */
661 /* Allocate and initialize variables for the first traversal. */
662 max_hdr = (int *) xmalloc (last_basic_block * sizeof (int));
663 dfs_nr = (int *) xcalloc (last_basic_block, sizeof (int));
664 stack = (int *) xmalloc (nr_edges * sizeof (int));
666 inner = sbitmap_alloc (last_basic_block);
667 sbitmap_ones (inner);
669 header = sbitmap_alloc (last_basic_block);
670 sbitmap_zero (header);
672 passed = sbitmap_alloc (nr_edges);
673 sbitmap_zero (passed);
675 in_queue = sbitmap_alloc (last_basic_block);
676 sbitmap_zero (in_queue);
678 in_stack = sbitmap_alloc (last_basic_block);
679 sbitmap_zero (in_stack);
681 for (i = 0; i < last_basic_block; i++)
682 max_hdr[i] = -1;
684 /* DFS traversal to find inner loops in the cfg. */
686 sp = -1;
687 while (1)
689 if (current_edge == 0 || TEST_BIT (passed, current_edge))
691 /* We have reached a leaf node or a node that was already
692 processed. Pop edges off the stack until we find
693 an edge that has not yet been processed. */
694 while (sp >= 0
695 && (current_edge == 0 || TEST_BIT (passed, current_edge)))
697 /* Pop entry off the stack. */
698 current_edge = stack[sp--];
699 node = FROM_BLOCK (current_edge);
700 child = TO_BLOCK (current_edge);
701 RESET_BIT (in_stack, child);
702 if (max_hdr[child] >= 0 && TEST_BIT (in_stack, max_hdr[child]))
703 UPDATE_LOOP_RELATIONS (node, max_hdr[child]);
704 current_edge = NEXT_OUT (current_edge);
707 /* See if have finished the DFS tree traversal. */
708 if (sp < 0 && TEST_BIT (passed, current_edge))
709 break;
711 /* Nope, continue the traversal with the popped node. */
712 continue;
715 /* Process a node. */
716 node = FROM_BLOCK (current_edge);
717 child = TO_BLOCK (current_edge);
718 SET_BIT (in_stack, node);
719 dfs_nr[node] = ++count;
721 /* If the successor is in the stack, then we've found a loop.
722 Mark the loop, if it is not a natural loop, then it will
723 be rejected during the second traversal. */
724 if (TEST_BIT (in_stack, child))
726 no_loops = 0;
727 SET_BIT (header, child);
728 UPDATE_LOOP_RELATIONS (node, child);
729 SET_BIT (passed, current_edge);
730 current_edge = NEXT_OUT (current_edge);
731 continue;
734 /* If the child was already visited, then there is no need to visit
735 it again. Just update the loop relationships and restart
736 with a new edge. */
737 if (dfs_nr[child])
739 if (max_hdr[child] >= 0 && TEST_BIT (in_stack, max_hdr[child]))
740 UPDATE_LOOP_RELATIONS (node, max_hdr[child]);
741 SET_BIT (passed, current_edge);
742 current_edge = NEXT_OUT (current_edge);
743 continue;
746 /* Push an entry on the stack and continue DFS traversal. */
747 stack[++sp] = current_edge;
748 SET_BIT (passed, current_edge);
749 current_edge = OUT_EDGES (child);
751 /* This is temporary until haifa is converted to use rth's new
752 cfg routines which have true entry/exit blocks and the
753 appropriate edges from/to those blocks.
755 Generally we update dfs_nr for a node when we process its
756 out edge. However, if the node has no out edge then we will
757 not set dfs_nr for that node. This can confuse the scheduler
758 into thinking that we have unreachable blocks, which in turn
759 disables cross block scheduling.
761 So, if we have a node with no out edges, go ahead and mark it
762 as reachable now. */
763 if (current_edge == 0)
764 dfs_nr[child] = ++count;
767 /* Another check for unreachable blocks. The earlier test in
768 is_cfg_nonregular only finds unreachable blocks that do not
769 form a loop.
771 The DFS traversal will mark every block that is reachable from
772 the entry node by placing a nonzero value in dfs_nr. Thus if
773 dfs_nr is zero for any block, then it must be unreachable. */
774 unreachable = 0;
775 FOR_EACH_BB (bb)
776 if (dfs_nr[bb->index] == 0)
778 unreachable = 1;
779 break;
782 /* Gross. To avoid wasting memory, the second pass uses the dfs_nr array
783 to hold degree counts. */
784 degree = dfs_nr;
786 FOR_EACH_BB (bb)
787 degree[bb->index] = 0;
788 for (i = 0; i < num_edges; i++)
790 edge e = INDEX_EDGE (edge_list, i);
792 if (e->dest != EXIT_BLOCK_PTR)
793 degree[e->dest->index]++;
796 /* Do not perform region scheduling if there are any unreachable
797 blocks. */
798 if (!unreachable)
800 int *queue;
802 if (no_loops)
803 SET_BIT (header, 0);
805 /* Second traversal:find reducible inner loops and topologically sort
806 block of each region. */
808 queue = (int *) xmalloc (n_basic_blocks * sizeof (int));
810 /* Find blocks which are inner loop headers. We still have non-reducible
811 loops to consider at this point. */
812 FOR_EACH_BB (bb)
814 if (TEST_BIT (header, bb->index) && TEST_BIT (inner, bb->index))
816 edge e;
817 basic_block jbb;
819 /* Now check that the loop is reducible. We do this separate
820 from finding inner loops so that we do not find a reducible
821 loop which contains an inner non-reducible loop.
823 A simple way to find reducible/natural loops is to verify
824 that each block in the loop is dominated by the loop
825 header.
827 If there exists a block that is not dominated by the loop
828 header, then the block is reachable from outside the loop
829 and thus the loop is not a natural loop. */
830 FOR_EACH_BB (jbb)
832 /* First identify blocks in the loop, except for the loop
833 entry block. */
834 if (bb->index == max_hdr[jbb->index] && bb != jbb)
836 /* Now verify that the block is dominated by the loop
837 header. */
838 if (!dominated_by_p (dom, jbb, bb))
839 break;
843 /* If we exited the loop early, then I is the header of
844 a non-reducible loop and we should quit processing it
845 now. */
846 if (jbb != EXIT_BLOCK_PTR)
847 continue;
849 /* I is a header of an inner loop, or block 0 in a subroutine
850 with no loops at all. */
851 head = tail = -1;
852 too_large_failure = 0;
853 loop_head = max_hdr[bb->index];
855 /* Decrease degree of all I's successors for topological
856 ordering. */
857 for (e = bb->succ; e; e = e->succ_next)
858 if (e->dest != EXIT_BLOCK_PTR)
859 --degree[e->dest->index];
861 /* Estimate # insns, and count # blocks in the region. */
862 num_bbs = 1;
863 num_insns = (INSN_LUID (bb->end)
864 - INSN_LUID (bb->head));
866 /* Find all loop latches (blocks with back edges to the loop
867 header) or all the leaf blocks in the cfg has no loops.
869 Place those blocks into the queue. */
870 if (no_loops)
872 FOR_EACH_BB (jbb)
873 /* Leaf nodes have only a single successor which must
874 be EXIT_BLOCK. */
875 if (jbb->succ
876 && jbb->succ->dest == EXIT_BLOCK_PTR
877 && jbb->succ->succ_next == NULL)
879 queue[++tail] = jbb->index;
880 SET_BIT (in_queue, jbb->index);
882 if (too_large (jbb->index, &num_bbs, &num_insns))
884 too_large_failure = 1;
885 break;
889 else
891 edge e;
893 for (e = bb->pred; e; e = e->pred_next)
895 if (e->src == ENTRY_BLOCK_PTR)
896 continue;
898 node = e->src->index;
900 if (max_hdr[node] == loop_head && node != bb->index)
902 /* This is a loop latch. */
903 queue[++tail] = node;
904 SET_BIT (in_queue, node);
906 if (too_large (node, &num_bbs, &num_insns))
908 too_large_failure = 1;
909 break;
915 /* Now add all the blocks in the loop to the queue.
917 We know the loop is a natural loop; however the algorithm
918 above will not always mark certain blocks as being in the
919 loop. Consider:
920 node children
921 a b,c
923 c a,d
926 The algorithm in the DFS traversal may not mark B & D as part
927 of the loop (ie they will not have max_hdr set to A).
929 We know they can not be loop latches (else they would have
930 had max_hdr set since they'd have a backedge to a dominator
931 block). So we don't need them on the initial queue.
933 We know they are part of the loop because they are dominated
934 by the loop header and can be reached by a backwards walk of
935 the edges starting with nodes on the initial queue.
937 It is safe and desirable to include those nodes in the
938 loop/scheduling region. To do so we would need to decrease
939 the degree of a node if it is the target of a backedge
940 within the loop itself as the node is placed in the queue.
942 We do not do this because I'm not sure that the actual
943 scheduling code will properly handle this case. ?!? */
945 while (head < tail && !too_large_failure)
947 edge e;
948 child = queue[++head];
950 for (e = BASIC_BLOCK (child)->pred; e; e = e->pred_next)
952 node = e->src->index;
954 /* See discussion above about nodes not marked as in
955 this loop during the initial DFS traversal. */
956 if (e->src == ENTRY_BLOCK_PTR
957 || max_hdr[node] != loop_head)
959 tail = -1;
960 break;
962 else if (!TEST_BIT (in_queue, node) && node != bb->index)
964 queue[++tail] = node;
965 SET_BIT (in_queue, node);
967 if (too_large (node, &num_bbs, &num_insns))
969 too_large_failure = 1;
970 break;
976 if (tail >= 0 && !too_large_failure)
978 /* Place the loop header into list of region blocks. */
979 degree[bb->index] = -1;
980 rgn_bb_table[idx] = bb->index;
981 RGN_NR_BLOCKS (nr_regions) = num_bbs;
982 RGN_BLOCKS (nr_regions) = idx++;
983 CONTAINING_RGN (bb->index) = nr_regions;
984 BLOCK_TO_BB (bb->index) = count = 0;
986 /* Remove blocks from queue[] when their in degree
987 becomes zero. Repeat until no blocks are left on the
988 list. This produces a topological list of blocks in
989 the region. */
990 while (tail >= 0)
992 if (head < 0)
993 head = tail;
994 child = queue[head];
995 if (degree[child] == 0)
997 edge e;
999 degree[child] = -1;
1000 rgn_bb_table[idx++] = child;
1001 BLOCK_TO_BB (child) = ++count;
1002 CONTAINING_RGN (child) = nr_regions;
1003 queue[head] = queue[tail--];
1005 for (e = BASIC_BLOCK (child)->succ;
1007 e = e->succ_next)
1008 if (e->dest != EXIT_BLOCK_PTR)
1009 --degree[e->dest->index];
1011 else
1012 --head;
1014 ++nr_regions;
1018 free (queue);
1021 /* Any block that did not end up in a region is placed into a region
1022 by itself. */
1023 FOR_EACH_BB (bb)
1024 if (degree[bb->index] >= 0)
1026 rgn_bb_table[idx] = bb->index;
1027 RGN_NR_BLOCKS (nr_regions) = 1;
1028 RGN_BLOCKS (nr_regions) = idx++;
1029 CONTAINING_RGN (bb->index) = nr_regions++;
1030 BLOCK_TO_BB (bb->index) = 0;
1033 free (max_hdr);
1034 free (dfs_nr);
1035 free (stack);
1036 sbitmap_free (passed);
1037 sbitmap_free (header);
1038 sbitmap_free (inner);
1039 sbitmap_free (in_queue);
1040 sbitmap_free (in_stack);
1043 /* Functions for regions scheduling information. */
1045 /* Compute dominators, probability, and potential-split-edges of bb.
1046 Assume that these values were already computed for bb's predecessors. */
1048 static void
1049 compute_dom_prob_ps (bb)
1050 int bb;
1052 int nxt_in_edge, fst_in_edge, pred;
1053 int fst_out_edge, nxt_out_edge, nr_out_edges, nr_rgn_out_edges;
1055 prob[bb] = 0.0;
1056 if (IS_RGN_ENTRY (bb))
1058 SET_BIT (dom[bb], 0);
1059 prob[bb] = 1.0;
1060 return;
1063 fst_in_edge = nxt_in_edge = IN_EDGES (BB_TO_BLOCK (bb));
1065 /* Initialize dom[bb] to '111..1'. */
1066 sbitmap_ones (dom[bb]);
1070 pred = FROM_BLOCK (nxt_in_edge);
1071 sbitmap_a_and_b (dom[bb], dom[bb], dom[BLOCK_TO_BB (pred)]);
1072 sbitmap_a_or_b (ancestor_edges[bb], ancestor_edges[bb], ancestor_edges[BLOCK_TO_BB (pred)]);
1074 SET_BIT (ancestor_edges[bb], EDGE_TO_BIT (nxt_in_edge));
1076 nr_out_edges = 1;
1077 nr_rgn_out_edges = 0;
1078 fst_out_edge = OUT_EDGES (pred);
1079 nxt_out_edge = NEXT_OUT (fst_out_edge);
1081 sbitmap_a_or_b (pot_split[bb], pot_split[bb], pot_split[BLOCK_TO_BB (pred)]);
1083 SET_BIT (pot_split[bb], EDGE_TO_BIT (fst_out_edge));
1085 /* The successor doesn't belong in the region? */
1086 if (CONTAINING_RGN (TO_BLOCK (fst_out_edge)) !=
1087 CONTAINING_RGN (BB_TO_BLOCK (bb)))
1088 ++nr_rgn_out_edges;
1090 while (fst_out_edge != nxt_out_edge)
1092 ++nr_out_edges;
1093 /* The successor doesn't belong in the region? */
1094 if (CONTAINING_RGN (TO_BLOCK (nxt_out_edge)) !=
1095 CONTAINING_RGN (BB_TO_BLOCK (bb)))
1096 ++nr_rgn_out_edges;
1097 SET_BIT (pot_split[bb], EDGE_TO_BIT (nxt_out_edge));
1098 nxt_out_edge = NEXT_OUT (nxt_out_edge);
1102 /* Now nr_rgn_out_edges is the number of region-exit edges from
1103 pred, and nr_out_edges will be the number of pred out edges
1104 not leaving the region. */
1105 nr_out_edges -= nr_rgn_out_edges;
1106 if (nr_rgn_out_edges > 0)
1107 prob[bb] += 0.9 * prob[BLOCK_TO_BB (pred)] / nr_out_edges;
1108 else
1109 prob[bb] += prob[BLOCK_TO_BB (pred)] / nr_out_edges;
1110 nxt_in_edge = NEXT_IN (nxt_in_edge);
1112 while (fst_in_edge != nxt_in_edge);
1114 SET_BIT (dom[bb], bb);
1115 sbitmap_difference (pot_split[bb], pot_split[bb], ancestor_edges[bb]);
1117 if (sched_verbose >= 2)
1118 fprintf (sched_dump, ";; bb_prob(%d, %d) = %3d\n", bb, BB_TO_BLOCK (bb),
1119 (int) (100.0 * prob[bb]));
1122 /* Functions for target info. */
1124 /* Compute in BL the list of split-edges of bb_src relatively to bb_trg.
1125 Note that bb_trg dominates bb_src. */
1127 static void
1128 split_edges (bb_src, bb_trg, bl)
1129 int bb_src;
1130 int bb_trg;
1131 edgelst *bl;
1133 sbitmap src = (edgeset) sbitmap_alloc (pot_split[bb_src]->n_bits);
1134 sbitmap_copy (src, pot_split[bb_src]);
1136 sbitmap_difference (src, src, pot_split[bb_trg]);
1137 extract_bitlst (src, bl);
1138 sbitmap_free (src);
1141 /* Find the valid candidate-source-blocks for the target block TRG, compute
1142 their probability, and check if they are speculative or not.
1143 For speculative sources, compute their update-blocks and split-blocks. */
1145 static void
1146 compute_trg_info (trg)
1147 int trg;
1149 candidate *sp;
1150 edgelst el;
1151 int check_block, update_idx;
1152 int i, j, k, fst_edge, nxt_edge;
1154 /* Define some of the fields for the target bb as well. */
1155 sp = candidate_table + trg;
1156 sp->is_valid = 1;
1157 sp->is_speculative = 0;
1158 sp->src_prob = 100;
1160 for (i = trg + 1; i < current_nr_blocks; i++)
1162 sp = candidate_table + i;
1164 sp->is_valid = IS_DOMINATED (i, trg);
1165 if (sp->is_valid)
1167 sp->src_prob = GET_SRC_PROB (i, trg);
1168 sp->is_valid = (sp->src_prob >= MIN_PROBABILITY);
1171 if (sp->is_valid)
1173 split_edges (i, trg, &el);
1174 sp->is_speculative = (el.nr_members) ? 1 : 0;
1175 if (sp->is_speculative && !flag_schedule_speculative)
1176 sp->is_valid = 0;
1179 if (sp->is_valid)
1181 char *update_blocks;
1183 /* Compute split blocks and store them in bblst_table.
1184 The TO block of every split edge is a split block. */
1185 sp->split_bbs.first_member = &bblst_table[bblst_last];
1186 sp->split_bbs.nr_members = el.nr_members;
1187 for (j = 0; j < el.nr_members; bblst_last++, j++)
1188 bblst_table[bblst_last] =
1189 TO_BLOCK (rgn_edges[el.first_member[j]]);
1190 sp->update_bbs.first_member = &bblst_table[bblst_last];
1192 /* Compute update blocks and store them in bblst_table.
1193 For every split edge, look at the FROM block, and check
1194 all out edges. For each out edge that is not a split edge,
1195 add the TO block to the update block list. This list can end
1196 up with a lot of duplicates. We need to weed them out to avoid
1197 overrunning the end of the bblst_table. */
1198 update_blocks = (char *) alloca (last_basic_block);
1199 memset (update_blocks, 0, last_basic_block);
1201 update_idx = 0;
1202 for (j = 0; j < el.nr_members; j++)
1204 check_block = FROM_BLOCK (rgn_edges[el.first_member[j]]);
1205 fst_edge = nxt_edge = OUT_EDGES (check_block);
1208 if (! update_blocks[TO_BLOCK (nxt_edge)])
1210 for (k = 0; k < el.nr_members; k++)
1211 if (EDGE_TO_BIT (nxt_edge) == el.first_member[k])
1212 break;
1214 if (k >= el.nr_members)
1216 bblst_table[bblst_last++] = TO_BLOCK (nxt_edge);
1217 update_blocks[TO_BLOCK (nxt_edge)] = 1;
1218 update_idx++;
1222 nxt_edge = NEXT_OUT (nxt_edge);
1224 while (fst_edge != nxt_edge);
1226 sp->update_bbs.nr_members = update_idx;
1228 /* Make sure we didn't overrun the end of bblst_table. */
1229 if (bblst_last > bblst_size)
1230 abort ();
1232 else
1234 sp->split_bbs.nr_members = sp->update_bbs.nr_members = 0;
1236 sp->is_speculative = 0;
1237 sp->src_prob = 0;
1242 /* Print candidates info, for debugging purposes. Callable from debugger. */
1244 void
1245 debug_candidate (i)
1246 int i;
1248 if (!candidate_table[i].is_valid)
1249 return;
1251 if (candidate_table[i].is_speculative)
1253 int j;
1254 fprintf (sched_dump, "src b %d bb %d speculative \n", BB_TO_BLOCK (i), i);
1256 fprintf (sched_dump, "split path: ");
1257 for (j = 0; j < candidate_table[i].split_bbs.nr_members; j++)
1259 int b = candidate_table[i].split_bbs.first_member[j];
1261 fprintf (sched_dump, " %d ", b);
1263 fprintf (sched_dump, "\n");
1265 fprintf (sched_dump, "update path: ");
1266 for (j = 0; j < candidate_table[i].update_bbs.nr_members; j++)
1268 int b = candidate_table[i].update_bbs.first_member[j];
1270 fprintf (sched_dump, " %d ", b);
1272 fprintf (sched_dump, "\n");
1274 else
1276 fprintf (sched_dump, " src %d equivalent\n", BB_TO_BLOCK (i));
1280 /* Print candidates info, for debugging purposes. Callable from debugger. */
1282 void
1283 debug_candidates (trg)
1284 int trg;
1286 int i;
1288 fprintf (sched_dump, "----------- candidate table: target: b=%d bb=%d ---\n",
1289 BB_TO_BLOCK (trg), trg);
1290 for (i = trg + 1; i < current_nr_blocks; i++)
1291 debug_candidate (i);
1294 /* Functions for speculative scheduling. */
1296 /* Return 0 if x is a set of a register alive in the beginning of one
1297 of the split-blocks of src, otherwise return 1. */
1299 static int
1300 check_live_1 (src, x)
1301 int src;
1302 rtx x;
1304 int i;
1305 int regno;
1306 rtx reg = SET_DEST (x);
1308 if (reg == 0)
1309 return 1;
1311 while (GET_CODE (reg) == SUBREG || GET_CODE (reg) == ZERO_EXTRACT
1312 || GET_CODE (reg) == SIGN_EXTRACT
1313 || GET_CODE (reg) == STRICT_LOW_PART)
1314 reg = XEXP (reg, 0);
1316 if (GET_CODE (reg) == PARALLEL)
1318 int i;
1320 for (i = XVECLEN (reg, 0) - 1; i >= 0; i--)
1321 if (XEXP (XVECEXP (reg, 0, i), 0) != 0)
1322 if (check_live_1 (src, XEXP (XVECEXP (reg, 0, i), 0)))
1323 return 1;
1325 return 0;
1328 if (GET_CODE (reg) != REG)
1329 return 1;
1331 regno = REGNO (reg);
1333 if (regno < FIRST_PSEUDO_REGISTER && global_regs[regno])
1335 /* Global registers are assumed live. */
1336 return 0;
1338 else
1340 if (regno < FIRST_PSEUDO_REGISTER)
1342 /* Check for hard registers. */
1343 int j = HARD_REGNO_NREGS (regno, GET_MODE (reg));
1344 while (--j >= 0)
1346 for (i = 0; i < candidate_table[src].split_bbs.nr_members; i++)
1348 int b = candidate_table[src].split_bbs.first_member[i];
1350 if (REGNO_REG_SET_P (BASIC_BLOCK (b)->global_live_at_start,
1351 regno + j))
1353 return 0;
1358 else
1360 /* Check for psuedo registers. */
1361 for (i = 0; i < candidate_table[src].split_bbs.nr_members; i++)
1363 int b = candidate_table[src].split_bbs.first_member[i];
1365 if (REGNO_REG_SET_P (BASIC_BLOCK (b)->global_live_at_start, regno))
1367 return 0;
1373 return 1;
1376 /* If x is a set of a register R, mark that R is alive in the beginning
1377 of every update-block of src. */
1379 static void
1380 update_live_1 (src, x)
1381 int src;
1382 rtx x;
1384 int i;
1385 int regno;
1386 rtx reg = SET_DEST (x);
1388 if (reg == 0)
1389 return;
1391 while (GET_CODE (reg) == SUBREG || GET_CODE (reg) == ZERO_EXTRACT
1392 || GET_CODE (reg) == SIGN_EXTRACT
1393 || GET_CODE (reg) == STRICT_LOW_PART)
1394 reg = XEXP (reg, 0);
1396 if (GET_CODE (reg) == PARALLEL)
1398 int i;
1400 for (i = XVECLEN (reg, 0) - 1; i >= 0; i--)
1401 if (XEXP (XVECEXP (reg, 0, i), 0) != 0)
1402 update_live_1 (src, XEXP (XVECEXP (reg, 0, i), 0));
1404 return;
1407 if (GET_CODE (reg) != REG)
1408 return;
1410 /* Global registers are always live, so the code below does not apply
1411 to them. */
1413 regno = REGNO (reg);
1415 if (regno >= FIRST_PSEUDO_REGISTER || !global_regs[regno])
1417 if (regno < FIRST_PSEUDO_REGISTER)
1419 int j = HARD_REGNO_NREGS (regno, GET_MODE (reg));
1420 while (--j >= 0)
1422 for (i = 0; i < candidate_table[src].update_bbs.nr_members; i++)
1424 int b = candidate_table[src].update_bbs.first_member[i];
1426 SET_REGNO_REG_SET (BASIC_BLOCK (b)->global_live_at_start,
1427 regno + j);
1431 else
1433 for (i = 0; i < candidate_table[src].update_bbs.nr_members; i++)
1435 int b = candidate_table[src].update_bbs.first_member[i];
1437 SET_REGNO_REG_SET (BASIC_BLOCK (b)->global_live_at_start, regno);
1443 /* Return 1 if insn can be speculatively moved from block src to trg,
1444 otherwise return 0. Called before first insertion of insn to
1445 ready-list or before the scheduling. */
1447 static int
1448 check_live (insn, src)
1449 rtx insn;
1450 int src;
1452 /* Find the registers set by instruction. */
1453 if (GET_CODE (PATTERN (insn)) == SET
1454 || GET_CODE (PATTERN (insn)) == CLOBBER)
1455 return check_live_1 (src, PATTERN (insn));
1456 else if (GET_CODE (PATTERN (insn)) == PARALLEL)
1458 int j;
1459 for (j = XVECLEN (PATTERN (insn), 0) - 1; j >= 0; j--)
1460 if ((GET_CODE (XVECEXP (PATTERN (insn), 0, j)) == SET
1461 || GET_CODE (XVECEXP (PATTERN (insn), 0, j)) == CLOBBER)
1462 && !check_live_1 (src, XVECEXP (PATTERN (insn), 0, j)))
1463 return 0;
1465 return 1;
1468 return 1;
1471 /* Update the live registers info after insn was moved speculatively from
1472 block src to trg. */
1474 static void
1475 update_live (insn, src)
1476 rtx insn;
1477 int src;
1479 /* Find the registers set by instruction. */
1480 if (GET_CODE (PATTERN (insn)) == SET
1481 || GET_CODE (PATTERN (insn)) == CLOBBER)
1482 update_live_1 (src, PATTERN (insn));
1483 else if (GET_CODE (PATTERN (insn)) == PARALLEL)
1485 int j;
1486 for (j = XVECLEN (PATTERN (insn), 0) - 1; j >= 0; j--)
1487 if (GET_CODE (XVECEXP (PATTERN (insn), 0, j)) == SET
1488 || GET_CODE (XVECEXP (PATTERN (insn), 0, j)) == CLOBBER)
1489 update_live_1 (src, XVECEXP (PATTERN (insn), 0, j));
1493 /* Exception Free Loads:
1495 We define five classes of speculative loads: IFREE, IRISKY,
1496 PFREE, PRISKY, and MFREE.
1498 IFREE loads are loads that are proved to be exception-free, just
1499 by examining the load insn. Examples for such loads are loads
1500 from TOC and loads of global data.
1502 IRISKY loads are loads that are proved to be exception-risky,
1503 just by examining the load insn. Examples for such loads are
1504 volatile loads and loads from shared memory.
1506 PFREE loads are loads for which we can prove, by examining other
1507 insns, that they are exception-free. Currently, this class consists
1508 of loads for which we are able to find a "similar load", either in
1509 the target block, or, if only one split-block exists, in that split
1510 block. Load2 is similar to load1 if both have same single base
1511 register. We identify only part of the similar loads, by finding
1512 an insn upon which both load1 and load2 have a DEF-USE dependence.
1514 PRISKY loads are loads for which we can prove, by examining other
1515 insns, that they are exception-risky. Currently we have two proofs for
1516 such loads. The first proof detects loads that are probably guarded by a
1517 test on the memory address. This proof is based on the
1518 backward and forward data dependence information for the region.
1519 Let load-insn be the examined load.
1520 Load-insn is PRISKY iff ALL the following hold:
1522 - insn1 is not in the same block as load-insn
1523 - there is a DEF-USE dependence chain (insn1, ..., load-insn)
1524 - test-insn is either a compare or a branch, not in the same block
1525 as load-insn
1526 - load-insn is reachable from test-insn
1527 - there is a DEF-USE dependence chain (insn1, ..., test-insn)
1529 This proof might fail when the compare and the load are fed
1530 by an insn not in the region. To solve this, we will add to this
1531 group all loads that have no input DEF-USE dependence.
1533 The second proof detects loads that are directly or indirectly
1534 fed by a speculative load. This proof is affected by the
1535 scheduling process. We will use the flag fed_by_spec_load.
1536 Initially, all insns have this flag reset. After a speculative
1537 motion of an insn, if insn is either a load, or marked as
1538 fed_by_spec_load, we will also mark as fed_by_spec_load every
1539 insn1 for which a DEF-USE dependence (insn, insn1) exists. A
1540 load which is fed_by_spec_load is also PRISKY.
1542 MFREE (maybe-free) loads are all the remaining loads. They may be
1543 exception-free, but we cannot prove it.
1545 Now, all loads in IFREE and PFREE classes are considered
1546 exception-free, while all loads in IRISKY and PRISKY classes are
1547 considered exception-risky. As for loads in the MFREE class,
1548 these are considered either exception-free or exception-risky,
1549 depending on whether we are pessimistic or optimistic. We have
1550 to take the pessimistic approach to assure the safety of
1551 speculative scheduling, but we can take the optimistic approach
1552 by invoking the -fsched_spec_load_dangerous option. */
1554 enum INSN_TRAP_CLASS
1556 TRAP_FREE = 0, IFREE = 1, PFREE_CANDIDATE = 2,
1557 PRISKY_CANDIDATE = 3, IRISKY = 4, TRAP_RISKY = 5
1560 #define WORST_CLASS(class1, class2) \
1561 ((class1 > class2) ? class1 : class2)
1563 /* Nonzero if block bb_to is equal to, or reachable from block bb_from. */
1564 #define IS_REACHABLE(bb_from, bb_to) \
1565 (bb_from == bb_to \
1566 || IS_RGN_ENTRY (bb_from) \
1567 || (TEST_BIT (ancestor_edges[bb_to], \
1568 EDGE_TO_BIT (IN_EDGES (BB_TO_BLOCK (bb_from))))))
1570 /* Nonzero iff the address is comprised from at most 1 register. */
1571 #define CONST_BASED_ADDRESS_P(x) \
1572 (GET_CODE (x) == REG \
1573 || ((GET_CODE (x) == PLUS || GET_CODE (x) == MINUS \
1574 || (GET_CODE (x) == LO_SUM)) \
1575 && (CONSTANT_P (XEXP (x, 0)) \
1576 || CONSTANT_P (XEXP (x, 1)))))
1578 /* Turns on the fed_by_spec_load flag for insns fed by load_insn. */
1580 static void
1581 set_spec_fed (load_insn)
1582 rtx load_insn;
1584 rtx link;
1586 for (link = INSN_DEPEND (load_insn); link; link = XEXP (link, 1))
1587 if (GET_MODE (link) == VOIDmode)
1588 FED_BY_SPEC_LOAD (XEXP (link, 0)) = 1;
1589 } /* set_spec_fed */
1591 /* On the path from the insn to load_insn_bb, find a conditional
1592 branch depending on insn, that guards the speculative load. */
1594 static int
1595 find_conditional_protection (insn, load_insn_bb)
1596 rtx insn;
1597 int load_insn_bb;
1599 rtx link;
1601 /* Iterate through DEF-USE forward dependences. */
1602 for (link = INSN_DEPEND (insn); link; link = XEXP (link, 1))
1604 rtx next = XEXP (link, 0);
1605 if ((CONTAINING_RGN (BLOCK_NUM (next)) ==
1606 CONTAINING_RGN (BB_TO_BLOCK (load_insn_bb)))
1607 && IS_REACHABLE (INSN_BB (next), load_insn_bb)
1608 && load_insn_bb != INSN_BB (next)
1609 && GET_MODE (link) == VOIDmode
1610 && (GET_CODE (next) == JUMP_INSN
1611 || find_conditional_protection (next, load_insn_bb)))
1612 return 1;
1614 return 0;
1615 } /* find_conditional_protection */
1617 /* Returns 1 if the same insn1 that participates in the computation
1618 of load_insn's address is feeding a conditional branch that is
1619 guarding on load_insn. This is true if we find a the two DEF-USE
1620 chains:
1621 insn1 -> ... -> conditional-branch
1622 insn1 -> ... -> load_insn,
1623 and if a flow path exist:
1624 insn1 -> ... -> conditional-branch -> ... -> load_insn,
1625 and if insn1 is on the path
1626 region-entry -> ... -> bb_trg -> ... load_insn.
1628 Locate insn1 by climbing on LOG_LINKS from load_insn.
1629 Locate the branch by following INSN_DEPEND from insn1. */
1631 static int
1632 is_conditionally_protected (load_insn, bb_src, bb_trg)
1633 rtx load_insn;
1634 int bb_src, bb_trg;
1636 rtx link;
1638 for (link = LOG_LINKS (load_insn); link; link = XEXP (link, 1))
1640 rtx insn1 = XEXP (link, 0);
1642 /* Must be a DEF-USE dependence upon non-branch. */
1643 if (GET_MODE (link) != VOIDmode
1644 || GET_CODE (insn1) == JUMP_INSN)
1645 continue;
1647 /* Must exist a path: region-entry -> ... -> bb_trg -> ... load_insn. */
1648 if (INSN_BB (insn1) == bb_src
1649 || (CONTAINING_RGN (BLOCK_NUM (insn1))
1650 != CONTAINING_RGN (BB_TO_BLOCK (bb_src)))
1651 || (!IS_REACHABLE (bb_trg, INSN_BB (insn1))
1652 && !IS_REACHABLE (INSN_BB (insn1), bb_trg)))
1653 continue;
1655 /* Now search for the conditional-branch. */
1656 if (find_conditional_protection (insn1, bb_src))
1657 return 1;
1659 /* Recursive step: search another insn1, "above" current insn1. */
1660 return is_conditionally_protected (insn1, bb_src, bb_trg);
1663 /* The chain does not exist. */
1664 return 0;
1665 } /* is_conditionally_protected */
1667 /* Returns 1 if a clue for "similar load" 'insn2' is found, and hence
1668 load_insn can move speculatively from bb_src to bb_trg. All the
1669 following must hold:
1671 (1) both loads have 1 base register (PFREE_CANDIDATEs).
1672 (2) load_insn and load1 have a def-use dependence upon
1673 the same insn 'insn1'.
1674 (3) either load2 is in bb_trg, or:
1675 - there's only one split-block, and
1676 - load1 is on the escape path, and
1678 From all these we can conclude that the two loads access memory
1679 addresses that differ at most by a constant, and hence if moving
1680 load_insn would cause an exception, it would have been caused by
1681 load2 anyhow. */
1683 static int
1684 is_pfree (load_insn, bb_src, bb_trg)
1685 rtx load_insn;
1686 int bb_src, bb_trg;
1688 rtx back_link;
1689 candidate *candp = candidate_table + bb_src;
1691 if (candp->split_bbs.nr_members != 1)
1692 /* Must have exactly one escape block. */
1693 return 0;
1695 for (back_link = LOG_LINKS (load_insn);
1696 back_link; back_link = XEXP (back_link, 1))
1698 rtx insn1 = XEXP (back_link, 0);
1700 if (GET_MODE (back_link) == VOIDmode)
1702 /* Found a DEF-USE dependence (insn1, load_insn). */
1703 rtx fore_link;
1705 for (fore_link = INSN_DEPEND (insn1);
1706 fore_link; fore_link = XEXP (fore_link, 1))
1708 rtx insn2 = XEXP (fore_link, 0);
1709 if (GET_MODE (fore_link) == VOIDmode)
1711 /* Found a DEF-USE dependence (insn1, insn2). */
1712 if (haifa_classify_insn (insn2) != PFREE_CANDIDATE)
1713 /* insn2 not guaranteed to be a 1 base reg load. */
1714 continue;
1716 if (INSN_BB (insn2) == bb_trg)
1717 /* insn2 is the similar load, in the target block. */
1718 return 1;
1720 if (*(candp->split_bbs.first_member) == BLOCK_NUM (insn2))
1721 /* insn2 is a similar load, in a split-block. */
1722 return 1;
1728 /* Couldn't find a similar load. */
1729 return 0;
1730 } /* is_pfree */
1732 /* Returns a class that insn with GET_DEST(insn)=x may belong to,
1733 as found by analyzing insn's expression. */
1735 static int
1736 may_trap_exp (x, is_store)
1737 rtx x;
1738 int is_store;
1740 enum rtx_code code;
1742 if (x == 0)
1743 return TRAP_FREE;
1744 code = GET_CODE (x);
1745 if (is_store)
1747 if (code == MEM && may_trap_p (x))
1748 return TRAP_RISKY;
1749 else
1750 return TRAP_FREE;
1752 if (code == MEM)
1754 /* The insn uses memory: a volatile load. */
1755 if (MEM_VOLATILE_P (x))
1756 return IRISKY;
1757 /* An exception-free load. */
1758 if (!may_trap_p (x))
1759 return IFREE;
1760 /* A load with 1 base register, to be further checked. */
1761 if (CONST_BASED_ADDRESS_P (XEXP (x, 0)))
1762 return PFREE_CANDIDATE;
1763 /* No info on the load, to be further checked. */
1764 return PRISKY_CANDIDATE;
1766 else
1768 const char *fmt;
1769 int i, insn_class = TRAP_FREE;
1771 /* Neither store nor load, check if it may cause a trap. */
1772 if (may_trap_p (x))
1773 return TRAP_RISKY;
1774 /* Recursive step: walk the insn... */
1775 fmt = GET_RTX_FORMAT (code);
1776 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1778 if (fmt[i] == 'e')
1780 int tmp_class = may_trap_exp (XEXP (x, i), is_store);
1781 insn_class = WORST_CLASS (insn_class, tmp_class);
1783 else if (fmt[i] == 'E')
1785 int j;
1786 for (j = 0; j < XVECLEN (x, i); j++)
1788 int tmp_class = may_trap_exp (XVECEXP (x, i, j), is_store);
1789 insn_class = WORST_CLASS (insn_class, tmp_class);
1790 if (insn_class == TRAP_RISKY || insn_class == IRISKY)
1791 break;
1794 if (insn_class == TRAP_RISKY || insn_class == IRISKY)
1795 break;
1797 return insn_class;
1801 /* Classifies insn for the purpose of verifying that it can be
1802 moved speculatively, by examining it's patterns, returning:
1803 TRAP_RISKY: store, or risky non-load insn (e.g. division by variable).
1804 TRAP_FREE: non-load insn.
1805 IFREE: load from a globaly safe location.
1806 IRISKY: volatile load.
1807 PFREE_CANDIDATE, PRISKY_CANDIDATE: load that need to be checked for
1808 being either PFREE or PRISKY. */
1810 static int
1811 haifa_classify_insn (insn)
1812 rtx insn;
1814 rtx pat = PATTERN (insn);
1815 int tmp_class = TRAP_FREE;
1816 int insn_class = TRAP_FREE;
1817 enum rtx_code code;
1819 if (GET_CODE (pat) == PARALLEL)
1821 int i, len = XVECLEN (pat, 0);
1823 for (i = len - 1; i >= 0; i--)
1825 code = GET_CODE (XVECEXP (pat, 0, i));
1826 switch (code)
1828 case CLOBBER:
1829 /* Test if it is a 'store'. */
1830 tmp_class = may_trap_exp (XEXP (XVECEXP (pat, 0, i), 0), 1);
1831 break;
1832 case SET:
1833 /* Test if it is a store. */
1834 tmp_class = may_trap_exp (SET_DEST (XVECEXP (pat, 0, i)), 1);
1835 if (tmp_class == TRAP_RISKY)
1836 break;
1837 /* Test if it is a load. */
1838 tmp_class
1839 = WORST_CLASS (tmp_class,
1840 may_trap_exp (SET_SRC (XVECEXP (pat, 0, i)),
1841 0));
1842 break;
1843 case COND_EXEC:
1844 case TRAP_IF:
1845 tmp_class = TRAP_RISKY;
1846 break;
1847 default:
1850 insn_class = WORST_CLASS (insn_class, tmp_class);
1851 if (insn_class == TRAP_RISKY || insn_class == IRISKY)
1852 break;
1855 else
1857 code = GET_CODE (pat);
1858 switch (code)
1860 case CLOBBER:
1861 /* Test if it is a 'store'. */
1862 tmp_class = may_trap_exp (XEXP (pat, 0), 1);
1863 break;
1864 case SET:
1865 /* Test if it is a store. */
1866 tmp_class = may_trap_exp (SET_DEST (pat), 1);
1867 if (tmp_class == TRAP_RISKY)
1868 break;
1869 /* Test if it is a load. */
1870 tmp_class =
1871 WORST_CLASS (tmp_class,
1872 may_trap_exp (SET_SRC (pat), 0));
1873 break;
1874 case COND_EXEC:
1875 case TRAP_IF:
1876 tmp_class = TRAP_RISKY;
1877 break;
1878 default:;
1880 insn_class = tmp_class;
1883 return insn_class;
1886 /* Return 1 if load_insn is prisky (i.e. if load_insn is fed by
1887 a load moved speculatively, or if load_insn is protected by
1888 a compare on load_insn's address). */
1890 static int
1891 is_prisky (load_insn, bb_src, bb_trg)
1892 rtx load_insn;
1893 int bb_src, bb_trg;
1895 if (FED_BY_SPEC_LOAD (load_insn))
1896 return 1;
1898 if (LOG_LINKS (load_insn) == NULL)
1899 /* Dependence may 'hide' out of the region. */
1900 return 1;
1902 if (is_conditionally_protected (load_insn, bb_src, bb_trg))
1903 return 1;
1905 return 0;
1908 /* Insn is a candidate to be moved speculatively from bb_src to bb_trg.
1909 Return 1 if insn is exception-free (and the motion is valid)
1910 and 0 otherwise. */
1912 static int
1913 is_exception_free (insn, bb_src, bb_trg)
1914 rtx insn;
1915 int bb_src, bb_trg;
1917 int insn_class = haifa_classify_insn (insn);
1919 /* Handle non-load insns. */
1920 switch (insn_class)
1922 case TRAP_FREE:
1923 return 1;
1924 case TRAP_RISKY:
1925 return 0;
1926 default:;
1929 /* Handle loads. */
1930 if (!flag_schedule_speculative_load)
1931 return 0;
1932 IS_LOAD_INSN (insn) = 1;
1933 switch (insn_class)
1935 case IFREE:
1936 return (1);
1937 case IRISKY:
1938 return 0;
1939 case PFREE_CANDIDATE:
1940 if (is_pfree (insn, bb_src, bb_trg))
1941 return 1;
1942 /* Don't 'break' here: PFREE-candidate is also PRISKY-candidate. */
1943 case PRISKY_CANDIDATE:
1944 if (!flag_schedule_speculative_load_dangerous
1945 || is_prisky (insn, bb_src, bb_trg))
1946 return 0;
1947 break;
1948 default:;
1951 return flag_schedule_speculative_load_dangerous;
1954 /* The number of insns from the current block scheduled so far. */
1955 static int sched_target_n_insns;
1956 /* The number of insns from the current block to be scheduled in total. */
1957 static int target_n_insns;
1958 /* The number of insns from the entire region scheduled so far. */
1959 static int sched_n_insns;
1960 /* Nonzero if the last scheduled insn was a jump. */
1961 static int last_was_jump;
1963 /* Implementations of the sched_info functions for region scheduling. */
1964 static void init_ready_list PARAMS ((struct ready_list *));
1965 static int can_schedule_ready_p PARAMS ((rtx));
1966 static int new_ready PARAMS ((rtx));
1967 static int schedule_more_p PARAMS ((void));
1968 static const char *rgn_print_insn PARAMS ((rtx, int));
1969 static int rgn_rank PARAMS ((rtx, rtx));
1970 static int contributes_to_priority PARAMS ((rtx, rtx));
1971 static void compute_jump_reg_dependencies PARAMS ((rtx, regset));
1973 /* Return nonzero if there are more insns that should be scheduled. */
1975 static int
1976 schedule_more_p ()
1978 return ! last_was_jump && sched_target_n_insns < target_n_insns;
1981 /* Add all insns that are initially ready to the ready list READY. Called
1982 once before scheduling a set of insns. */
1984 static void
1985 init_ready_list (ready)
1986 struct ready_list *ready;
1988 rtx prev_head = current_sched_info->prev_head;
1989 rtx next_tail = current_sched_info->next_tail;
1990 int bb_src;
1991 rtx insn;
1993 target_n_insns = 0;
1994 sched_target_n_insns = 0;
1995 sched_n_insns = 0;
1996 last_was_jump = 0;
1998 /* Print debugging information. */
1999 if (sched_verbose >= 5)
2000 debug_dependencies ();
2002 /* Prepare current target block info. */
2003 if (current_nr_blocks > 1)
2005 candidate_table = (candidate *) xmalloc (current_nr_blocks
2006 * sizeof (candidate));
2008 bblst_last = 0;
2009 /* bblst_table holds split blocks and update blocks for each block after
2010 the current one in the region. split blocks and update blocks are
2011 the TO blocks of region edges, so there can be at most rgn_nr_edges
2012 of them. */
2013 bblst_size = (current_nr_blocks - target_bb) * rgn_nr_edges;
2014 bblst_table = (int *) xmalloc (bblst_size * sizeof (int));
2016 bitlst_table_last = 0;
2017 bitlst_table = (int *) xmalloc (rgn_nr_edges * sizeof (int));
2019 compute_trg_info (target_bb);
2022 /* Initialize ready list with all 'ready' insns in target block.
2023 Count number of insns in the target block being scheduled. */
2024 for (insn = NEXT_INSN (prev_head); insn != next_tail; insn = NEXT_INSN (insn))
2026 if (INSN_DEP_COUNT (insn) == 0)
2027 ready_add (ready, insn);
2028 target_n_insns++;
2031 /* Add to ready list all 'ready' insns in valid source blocks.
2032 For speculative insns, check-live, exception-free, and
2033 issue-delay. */
2034 for (bb_src = target_bb + 1; bb_src < current_nr_blocks; bb_src++)
2035 if (IS_VALID (bb_src))
2037 rtx src_head;
2038 rtx src_next_tail;
2039 rtx tail, head;
2041 get_block_head_tail (BB_TO_BLOCK (bb_src), &head, &tail);
2042 src_next_tail = NEXT_INSN (tail);
2043 src_head = head;
2045 for (insn = src_head; insn != src_next_tail; insn = NEXT_INSN (insn))
2047 if (! INSN_P (insn))
2048 continue;
2050 if (!CANT_MOVE (insn)
2051 && (!IS_SPECULATIVE_INSN (insn)
2052 || ((((!targetm.sched.use_dfa_pipeline_interface
2053 || !(*targetm.sched.use_dfa_pipeline_interface) ())
2054 && insn_issue_delay (insn) <= 3)
2055 || (targetm.sched.use_dfa_pipeline_interface
2056 && (*targetm.sched.use_dfa_pipeline_interface) ()
2057 && (recog_memoized (insn) < 0
2058 || min_insn_conflict_delay (curr_state,
2059 insn, insn) <= 3)))
2060 && check_live (insn, bb_src)
2061 && is_exception_free (insn, bb_src, target_bb))))
2062 if (INSN_DEP_COUNT (insn) == 0)
2063 ready_add (ready, insn);
2068 /* Called after taking INSN from the ready list. Returns nonzero if this
2069 insn can be scheduled, nonzero if we should silently discard it. */
2071 static int
2072 can_schedule_ready_p (insn)
2073 rtx insn;
2075 if (GET_CODE (insn) == JUMP_INSN)
2076 last_was_jump = 1;
2078 /* An interblock motion? */
2079 if (INSN_BB (insn) != target_bb)
2081 basic_block b1;
2083 if (IS_SPECULATIVE_INSN (insn))
2085 if (!check_live (insn, INSN_BB (insn)))
2086 return 0;
2087 update_live (insn, INSN_BB (insn));
2089 /* For speculative load, mark insns fed by it. */
2090 if (IS_LOAD_INSN (insn) || FED_BY_SPEC_LOAD (insn))
2091 set_spec_fed (insn);
2093 nr_spec++;
2095 nr_inter++;
2097 /* Update source block boundaries. */
2098 b1 = BLOCK_FOR_INSN (insn);
2099 if (insn == b1->head && insn == b1->end)
2101 /* We moved all the insns in the basic block.
2102 Emit a note after the last insn and update the
2103 begin/end boundaries to point to the note. */
2104 rtx note = emit_note_after (NOTE_INSN_DELETED, insn);
2105 b1->head = note;
2106 b1->end = note;
2108 else if (insn == b1->end)
2110 /* We took insns from the end of the basic block,
2111 so update the end of block boundary so that it
2112 points to the first insn we did not move. */
2113 b1->end = PREV_INSN (insn);
2115 else if (insn == b1->head)
2117 /* We took insns from the start of the basic block,
2118 so update the start of block boundary so that
2119 it points to the first insn we did not move. */
2120 b1->head = NEXT_INSN (insn);
2123 else
2125 /* In block motion. */
2126 sched_target_n_insns++;
2128 sched_n_insns++;
2130 return 1;
2133 /* Called after INSN has all its dependencies resolved. Return nonzero
2134 if it should be moved to the ready list or the queue, or zero if we
2135 should silently discard it. */
2136 static int
2137 new_ready (next)
2138 rtx next;
2140 /* For speculative insns, before inserting to ready/queue,
2141 check live, exception-free, and issue-delay. */
2142 if (INSN_BB (next) != target_bb
2143 && (!IS_VALID (INSN_BB (next))
2144 || CANT_MOVE (next)
2145 || (IS_SPECULATIVE_INSN (next)
2146 && (0
2147 || (targetm.sched.use_dfa_pipeline_interface
2148 && (*targetm.sched.use_dfa_pipeline_interface) ()
2149 && recog_memoized (next) >= 0
2150 && min_insn_conflict_delay (curr_state, next,
2151 next) > 3)
2152 || ((!targetm.sched.use_dfa_pipeline_interface
2153 || !(*targetm.sched.use_dfa_pipeline_interface) ())
2154 && insn_issue_delay (next) > 3)
2155 || !check_live (next, INSN_BB (next))
2156 || !is_exception_free (next, INSN_BB (next), target_bb)))))
2157 return 0;
2158 return 1;
2161 /* Return a string that contains the insn uid and optionally anything else
2162 necessary to identify this insn in an output. It's valid to use a
2163 static buffer for this. The ALIGNED parameter should cause the string
2164 to be formatted so that multiple output lines will line up nicely. */
2166 static const char *
2167 rgn_print_insn (insn, aligned)
2168 rtx insn;
2169 int aligned;
2171 static char tmp[80];
2173 if (aligned)
2174 sprintf (tmp, "b%3d: i%4d", INSN_BB (insn), INSN_UID (insn));
2175 else
2177 if (current_nr_blocks > 1 && INSN_BB (insn) != target_bb)
2178 sprintf (tmp, "%d/b%d", INSN_UID (insn), INSN_BB (insn));
2179 else
2180 sprintf (tmp, "%d", INSN_UID (insn));
2182 return tmp;
2185 /* Compare priority of two insns. Return a positive number if the second
2186 insn is to be preferred for scheduling, and a negative one if the first
2187 is to be preferred. Zero if they are equally good. */
2189 static int
2190 rgn_rank (insn1, insn2)
2191 rtx insn1, insn2;
2193 /* Some comparison make sense in interblock scheduling only. */
2194 if (INSN_BB (insn1) != INSN_BB (insn2))
2196 int spec_val, prob_val;
2198 /* Prefer an inblock motion on an interblock motion. */
2199 if ((INSN_BB (insn2) == target_bb) && (INSN_BB (insn1) != target_bb))
2200 return 1;
2201 if ((INSN_BB (insn1) == target_bb) && (INSN_BB (insn2) != target_bb))
2202 return -1;
2204 /* Prefer a useful motion on a speculative one. */
2205 spec_val = IS_SPECULATIVE_INSN (insn1) - IS_SPECULATIVE_INSN (insn2);
2206 if (spec_val)
2207 return spec_val;
2209 /* Prefer a more probable (speculative) insn. */
2210 prob_val = INSN_PROBABILITY (insn2) - INSN_PROBABILITY (insn1);
2211 if (prob_val)
2212 return prob_val;
2214 return 0;
2217 /* NEXT is an instruction that depends on INSN (a backward dependence);
2218 return nonzero if we should include this dependence in priority
2219 calculations. */
2221 static int
2222 contributes_to_priority (next, insn)
2223 rtx next, insn;
2225 return BLOCK_NUM (next) == BLOCK_NUM (insn);
2228 /* INSN is a JUMP_INSN. Store the set of registers that must be considered
2229 to be set by this jump in SET. */
2231 static void
2232 compute_jump_reg_dependencies (insn, set)
2233 rtx insn ATTRIBUTE_UNUSED;
2234 regset set ATTRIBUTE_UNUSED;
2236 /* Nothing to do here, since we postprocess jumps in
2237 add_branch_dependences. */
2240 /* Used in schedule_insns to initialize current_sched_info for scheduling
2241 regions (or single basic blocks). */
2243 static struct sched_info region_sched_info =
2245 init_ready_list,
2246 can_schedule_ready_p,
2247 schedule_more_p,
2248 new_ready,
2249 rgn_rank,
2250 rgn_print_insn,
2251 contributes_to_priority,
2252 compute_jump_reg_dependencies,
2254 NULL, NULL,
2255 NULL, NULL,
2256 0, 0
2259 /* Determine if PAT sets a CLASS_LIKELY_SPILLED_P register. */
2261 static bool
2262 sets_likely_spilled (pat)
2263 rtx pat;
2265 bool ret = false;
2266 note_stores (pat, sets_likely_spilled_1, &ret);
2267 return ret;
2270 static void
2271 sets_likely_spilled_1 (x, pat, data)
2272 rtx x, pat;
2273 void *data;
2275 bool *ret = (bool *) data;
2277 if (GET_CODE (pat) == SET
2278 && REG_P (x)
2279 && REGNO (x) < FIRST_PSEUDO_REGISTER
2280 && CLASS_LIKELY_SPILLED_P (REGNO_REG_CLASS (REGNO (x))))
2281 *ret = true;
2284 /* Add dependences so that branches are scheduled to run last in their
2285 block. */
2287 static void
2288 add_branch_dependences (head, tail)
2289 rtx head, tail;
2291 rtx insn, last;
2293 /* For all branches, calls, uses, clobbers, cc0 setters, and instructions
2294 that can throw exceptions, force them to remain in order at the end of
2295 the block by adding dependencies and giving the last a high priority.
2296 There may be notes present, and prev_head may also be a note.
2298 Branches must obviously remain at the end. Calls should remain at the
2299 end since moving them results in worse register allocation. Uses remain
2300 at the end to ensure proper register allocation.
2302 cc0 setters remaim at the end because they can't be moved away from
2303 their cc0 user.
2305 Insns setting CLASS_LIKELY_SPILLED_P registers (usually return values)
2306 are not moved before reload because we can wind up with register
2307 allocation failures. */
2309 insn = tail;
2310 last = 0;
2311 while (GET_CODE (insn) == CALL_INSN
2312 || GET_CODE (insn) == JUMP_INSN
2313 || (GET_CODE (insn) == INSN
2314 && (GET_CODE (PATTERN (insn)) == USE
2315 || GET_CODE (PATTERN (insn)) == CLOBBER
2316 || can_throw_internal (insn)
2317 #ifdef HAVE_cc0
2318 || sets_cc0_p (PATTERN (insn))
2319 #endif
2320 || (!reload_completed
2321 && sets_likely_spilled (PATTERN (insn)))))
2322 || GET_CODE (insn) == NOTE)
2324 if (GET_CODE (insn) != NOTE)
2326 if (last != 0 && !find_insn_list (insn, LOG_LINKS (last)))
2328 add_dependence (last, insn, REG_DEP_ANTI);
2329 INSN_REF_COUNT (insn)++;
2332 CANT_MOVE (insn) = 1;
2334 last = insn;
2337 /* Don't overrun the bounds of the basic block. */
2338 if (insn == head)
2339 break;
2341 insn = PREV_INSN (insn);
2344 /* Make sure these insns are scheduled last in their block. */
2345 insn = last;
2346 if (insn != 0)
2347 while (insn != head)
2349 insn = prev_nonnote_insn (insn);
2351 if (INSN_REF_COUNT (insn) != 0)
2352 continue;
2354 add_dependence (last, insn, REG_DEP_ANTI);
2355 INSN_REF_COUNT (insn) = 1;
2359 /* Data structures for the computation of data dependences in a regions. We
2360 keep one `deps' structure for every basic block. Before analyzing the
2361 data dependences for a bb, its variables are initialized as a function of
2362 the variables of its predecessors. When the analysis for a bb completes,
2363 we save the contents to the corresponding bb_deps[bb] variable. */
2365 static struct deps *bb_deps;
2367 /* Duplicate the INSN_LIST elements of COPY and prepend them to OLD. */
2369 static rtx
2370 concat_INSN_LIST (copy, old)
2371 rtx copy, old;
2373 rtx new = old;
2374 for (; copy ; copy = XEXP (copy, 1))
2375 new = alloc_INSN_LIST (XEXP (copy, 0), new);
2376 return new;
2379 static void
2380 concat_insn_mem_list (copy_insns, copy_mems, old_insns_p, old_mems_p)
2381 rtx copy_insns, copy_mems;
2382 rtx *old_insns_p, *old_mems_p;
2384 rtx new_insns = *old_insns_p;
2385 rtx new_mems = *old_mems_p;
2387 while (copy_insns)
2389 new_insns = alloc_INSN_LIST (XEXP (copy_insns, 0), new_insns);
2390 new_mems = alloc_EXPR_LIST (VOIDmode, XEXP (copy_mems, 0), new_mems);
2391 copy_insns = XEXP (copy_insns, 1);
2392 copy_mems = XEXP (copy_mems, 1);
2395 *old_insns_p = new_insns;
2396 *old_mems_p = new_mems;
2399 /* After computing the dependencies for block BB, propagate the dependencies
2400 found in TMP_DEPS to the successors of the block. */
2401 static void
2402 propagate_deps (bb, pred_deps)
2403 int bb;
2404 struct deps *pred_deps;
2406 int b = BB_TO_BLOCK (bb);
2407 int e, first_edge;
2409 /* bb's structures are inherited by its successors. */
2410 first_edge = e = OUT_EDGES (b);
2411 if (e > 0)
2414 int b_succ = TO_BLOCK (e);
2415 int bb_succ = BLOCK_TO_BB (b_succ);
2416 struct deps *succ_deps = bb_deps + bb_succ;
2417 int reg;
2419 /* Only bbs "below" bb, in the same region, are interesting. */
2420 if (CONTAINING_RGN (b) != CONTAINING_RGN (b_succ)
2421 || bb_succ <= bb)
2423 e = NEXT_OUT (e);
2424 continue;
2427 /* The reg_last lists are inherited by bb_succ. */
2428 EXECUTE_IF_SET_IN_REG_SET (&pred_deps->reg_last_in_use, 0, reg,
2430 struct deps_reg *pred_rl = &pred_deps->reg_last[reg];
2431 struct deps_reg *succ_rl = &succ_deps->reg_last[reg];
2433 succ_rl->uses = concat_INSN_LIST (pred_rl->uses, succ_rl->uses);
2434 succ_rl->sets = concat_INSN_LIST (pred_rl->sets, succ_rl->sets);
2435 succ_rl->clobbers = concat_INSN_LIST (pred_rl->clobbers,
2436 succ_rl->clobbers);
2437 succ_rl->uses_length += pred_rl->uses_length;
2438 succ_rl->clobbers_length += pred_rl->clobbers_length;
2440 IOR_REG_SET (&succ_deps->reg_last_in_use, &pred_deps->reg_last_in_use);
2442 /* Mem read/write lists are inherited by bb_succ. */
2443 concat_insn_mem_list (pred_deps->pending_read_insns,
2444 pred_deps->pending_read_mems,
2445 &succ_deps->pending_read_insns,
2446 &succ_deps->pending_read_mems);
2447 concat_insn_mem_list (pred_deps->pending_write_insns,
2448 pred_deps->pending_write_mems,
2449 &succ_deps->pending_write_insns,
2450 &succ_deps->pending_write_mems);
2452 succ_deps->last_pending_memory_flush
2453 = concat_INSN_LIST (pred_deps->last_pending_memory_flush,
2454 succ_deps->last_pending_memory_flush);
2456 succ_deps->pending_lists_length += pred_deps->pending_lists_length;
2457 succ_deps->pending_flush_length += pred_deps->pending_flush_length;
2459 /* last_function_call is inherited by bb_succ. */
2460 succ_deps->last_function_call
2461 = concat_INSN_LIST (pred_deps->last_function_call,
2462 succ_deps->last_function_call);
2464 /* sched_before_next_call is inherited by bb_succ. */
2465 succ_deps->sched_before_next_call
2466 = concat_INSN_LIST (pred_deps->sched_before_next_call,
2467 succ_deps->sched_before_next_call);
2469 e = NEXT_OUT (e);
2471 while (e != first_edge);
2473 /* These lists should point to the right place, for correct
2474 freeing later. */
2475 bb_deps[bb].pending_read_insns = pred_deps->pending_read_insns;
2476 bb_deps[bb].pending_read_mems = pred_deps->pending_read_mems;
2477 bb_deps[bb].pending_write_insns = pred_deps->pending_write_insns;
2478 bb_deps[bb].pending_write_mems = pred_deps->pending_write_mems;
2480 /* Can't allow these to be freed twice. */
2481 pred_deps->pending_read_insns = 0;
2482 pred_deps->pending_read_mems = 0;
2483 pred_deps->pending_write_insns = 0;
2484 pred_deps->pending_write_mems = 0;
2487 /* Compute backward dependences inside bb. In a multiple blocks region:
2488 (1) a bb is analyzed after its predecessors, and (2) the lists in
2489 effect at the end of bb (after analyzing for bb) are inherited by
2490 bb's successors.
2492 Specifically for reg-reg data dependences, the block insns are
2493 scanned by sched_analyze () top-to-bottom. Two lists are
2494 maintained by sched_analyze (): reg_last[].sets for register DEFs,
2495 and reg_last[].uses for register USEs.
2497 When analysis is completed for bb, we update for its successors:
2498 ; - DEFS[succ] = Union (DEFS [succ], DEFS [bb])
2499 ; - USES[succ] = Union (USES [succ], DEFS [bb])
2501 The mechanism for computing mem-mem data dependence is very
2502 similar, and the result is interblock dependences in the region. */
2504 static void
2505 compute_block_backward_dependences (bb)
2506 int bb;
2508 rtx head, tail;
2509 struct deps tmp_deps;
2511 tmp_deps = bb_deps[bb];
2513 /* Do the analysis for this block. */
2514 get_block_head_tail (BB_TO_BLOCK (bb), &head, &tail);
2515 sched_analyze (&tmp_deps, head, tail);
2516 add_branch_dependences (head, tail);
2518 if (current_nr_blocks > 1)
2519 propagate_deps (bb, &tmp_deps);
2521 /* Free up the INSN_LISTs. */
2522 free_deps (&tmp_deps);
2525 /* Remove all INSN_LISTs and EXPR_LISTs from the pending lists and add
2526 them to the unused_*_list variables, so that they can be reused. */
2528 static void
2529 free_pending_lists ()
2531 int bb;
2533 for (bb = 0; bb < current_nr_blocks; bb++)
2535 free_INSN_LIST_list (&bb_deps[bb].pending_read_insns);
2536 free_INSN_LIST_list (&bb_deps[bb].pending_write_insns);
2537 free_EXPR_LIST_list (&bb_deps[bb].pending_read_mems);
2538 free_EXPR_LIST_list (&bb_deps[bb].pending_write_mems);
2542 /* Print dependences for debugging, callable from debugger. */
2544 void
2545 debug_dependencies ()
2547 int bb;
2549 fprintf (sched_dump, ";; --------------- forward dependences: ------------ \n");
2550 for (bb = 0; bb < current_nr_blocks; bb++)
2552 if (1)
2554 rtx head, tail;
2555 rtx next_tail;
2556 rtx insn;
2558 get_block_head_tail (BB_TO_BLOCK (bb), &head, &tail);
2559 next_tail = NEXT_INSN (tail);
2560 fprintf (sched_dump, "\n;; --- Region Dependences --- b %d bb %d \n",
2561 BB_TO_BLOCK (bb), bb);
2563 if (targetm.sched.use_dfa_pipeline_interface
2564 && (*targetm.sched.use_dfa_pipeline_interface) ())
2566 fprintf (sched_dump, ";; %7s%6s%6s%6s%6s%6s%14s\n",
2567 "insn", "code", "bb", "dep", "prio", "cost",
2568 "reservation");
2569 fprintf (sched_dump, ";; %7s%6s%6s%6s%6s%6s%14s\n",
2570 "----", "----", "--", "---", "----", "----",
2571 "-----------");
2573 else
2575 fprintf (sched_dump, ";; %7s%6s%6s%6s%6s%6s%11s%6s\n",
2576 "insn", "code", "bb", "dep", "prio", "cost", "blockage", "units");
2577 fprintf (sched_dump, ";; %7s%6s%6s%6s%6s%6s%11s%6s\n",
2578 "----", "----", "--", "---", "----", "----", "--------", "-----");
2581 for (insn = head; insn != next_tail; insn = NEXT_INSN (insn))
2583 rtx link;
2585 if (! INSN_P (insn))
2587 int n;
2588 fprintf (sched_dump, ";; %6d ", INSN_UID (insn));
2589 if (GET_CODE (insn) == NOTE)
2591 n = NOTE_LINE_NUMBER (insn);
2592 if (n < 0)
2593 fprintf (sched_dump, "%s\n", GET_NOTE_INSN_NAME (n));
2594 else
2595 fprintf (sched_dump, "line %d, file %s\n", n,
2596 NOTE_SOURCE_FILE (insn));
2598 else
2599 fprintf (sched_dump, " {%s}\n", GET_RTX_NAME (GET_CODE (insn)));
2600 continue;
2603 if (targetm.sched.use_dfa_pipeline_interface
2604 && (*targetm.sched.use_dfa_pipeline_interface) ())
2606 fprintf (sched_dump,
2607 ";; %s%5d%6d%6d%6d%6d%6d ",
2608 (SCHED_GROUP_P (insn) ? "+" : " "),
2609 INSN_UID (insn),
2610 INSN_CODE (insn),
2611 INSN_BB (insn),
2612 INSN_DEP_COUNT (insn),
2613 INSN_PRIORITY (insn),
2614 insn_cost (insn, 0, 0));
2616 if (recog_memoized (insn) < 0)
2617 fprintf (sched_dump, "nothing");
2618 else
2619 print_reservation (sched_dump, insn);
2621 else
2623 int unit = insn_unit (insn);
2624 int range
2625 = (unit < 0
2626 || function_units[unit].blockage_range_function == 0
2628 : function_units[unit].blockage_range_function (insn));
2629 fprintf (sched_dump,
2630 ";; %s%5d%6d%6d%6d%6d%6d %3d -%3d ",
2631 (SCHED_GROUP_P (insn) ? "+" : " "),
2632 INSN_UID (insn),
2633 INSN_CODE (insn),
2634 INSN_BB (insn),
2635 INSN_DEP_COUNT (insn),
2636 INSN_PRIORITY (insn),
2637 insn_cost (insn, 0, 0),
2638 (int) MIN_BLOCKAGE_COST (range),
2639 (int) MAX_BLOCKAGE_COST (range));
2640 insn_print_units (insn);
2643 fprintf (sched_dump, "\t: ");
2644 for (link = INSN_DEPEND (insn); link; link = XEXP (link, 1))
2645 fprintf (sched_dump, "%d ", INSN_UID (XEXP (link, 0)));
2646 fprintf (sched_dump, "\n");
2650 fprintf (sched_dump, "\n");
2653 /* Schedule a region. A region is either an inner loop, a loop-free
2654 subroutine, or a single basic block. Each bb in the region is
2655 scheduled after its flow predecessors. */
2657 static void
2658 schedule_region (rgn)
2659 int rgn;
2661 int bb;
2662 int rgn_n_insns = 0;
2663 int sched_rgn_n_insns = 0;
2665 /* Set variables for the current region. */
2666 current_nr_blocks = RGN_NR_BLOCKS (rgn);
2667 current_blocks = RGN_BLOCKS (rgn);
2669 init_deps_global ();
2671 /* Initializations for region data dependence analysis. */
2672 bb_deps = (struct deps *) xmalloc (sizeof (struct deps) * current_nr_blocks);
2673 for (bb = 0; bb < current_nr_blocks; bb++)
2674 init_deps (bb_deps + bb);
2676 /* Compute LOG_LINKS. */
2677 for (bb = 0; bb < current_nr_blocks; bb++)
2678 compute_block_backward_dependences (bb);
2680 /* Compute INSN_DEPEND. */
2681 for (bb = current_nr_blocks - 1; bb >= 0; bb--)
2683 rtx head, tail;
2684 get_block_head_tail (BB_TO_BLOCK (bb), &head, &tail);
2686 compute_forward_dependences (head, tail);
2688 if (targetm.sched.dependencies_evaluation_hook)
2689 targetm.sched.dependencies_evaluation_hook (head, tail);
2693 /* Set priorities. */
2694 for (bb = 0; bb < current_nr_blocks; bb++)
2696 rtx head, tail;
2697 get_block_head_tail (BB_TO_BLOCK (bb), &head, &tail);
2699 rgn_n_insns += set_priorities (head, tail);
2702 /* Compute interblock info: probabilities, split-edges, dominators, etc. */
2703 if (current_nr_blocks > 1)
2705 int i;
2707 prob = (float *) xmalloc ((current_nr_blocks) * sizeof (float));
2709 dom = sbitmap_vector_alloc (current_nr_blocks, current_nr_blocks);
2710 sbitmap_vector_zero (dom, current_nr_blocks);
2711 /* Edge to bit. */
2712 rgn_nr_edges = 0;
2713 edge_to_bit = (int *) xmalloc (nr_edges * sizeof (int));
2714 for (i = 1; i < nr_edges; i++)
2715 if (CONTAINING_RGN (FROM_BLOCK (i)) == rgn)
2716 EDGE_TO_BIT (i) = rgn_nr_edges++;
2717 rgn_edges = (int *) xmalloc (rgn_nr_edges * sizeof (int));
2719 rgn_nr_edges = 0;
2720 for (i = 1; i < nr_edges; i++)
2721 if (CONTAINING_RGN (FROM_BLOCK (i)) == (rgn))
2722 rgn_edges[rgn_nr_edges++] = i;
2724 /* Split edges. */
2725 pot_split = sbitmap_vector_alloc (current_nr_blocks, rgn_nr_edges);
2726 sbitmap_vector_zero (pot_split, current_nr_blocks);
2727 ancestor_edges = sbitmap_vector_alloc (current_nr_blocks, rgn_nr_edges);
2728 sbitmap_vector_zero (ancestor_edges, current_nr_blocks);
2730 /* Compute probabilities, dominators, split_edges. */
2731 for (bb = 0; bb < current_nr_blocks; bb++)
2732 compute_dom_prob_ps (bb);
2735 /* Now we can schedule all blocks. */
2736 for (bb = 0; bb < current_nr_blocks; bb++)
2738 rtx head, tail;
2739 int b = BB_TO_BLOCK (bb);
2741 get_block_head_tail (b, &head, &tail);
2743 if (no_real_insns_p (head, tail))
2744 continue;
2746 current_sched_info->prev_head = PREV_INSN (head);
2747 current_sched_info->next_tail = NEXT_INSN (tail);
2749 if (write_symbols != NO_DEBUG)
2751 save_line_notes (b, head, tail);
2752 rm_line_notes (head, tail);
2755 /* rm_other_notes only removes notes which are _inside_ the
2756 block---that is, it won't remove notes before the first real insn
2757 or after the last real insn of the block. So if the first insn
2758 has a REG_SAVE_NOTE which would otherwise be emitted before the
2759 insn, it is redundant with the note before the start of the
2760 block, and so we have to take it out. */
2761 if (INSN_P (head))
2763 rtx note;
2765 for (note = REG_NOTES (head); note; note = XEXP (note, 1))
2766 if (REG_NOTE_KIND (note) == REG_SAVE_NOTE)
2768 remove_note (head, note);
2769 note = XEXP (note, 1);
2770 remove_note (head, note);
2774 /* Remove remaining note insns from the block, save them in
2775 note_list. These notes are restored at the end of
2776 schedule_block (). */
2777 rm_other_notes (head, tail);
2779 target_bb = bb;
2781 current_sched_info->queue_must_finish_empty
2782 = current_nr_blocks > 1 && !flag_schedule_interblock;
2784 schedule_block (b, rgn_n_insns);
2785 sched_rgn_n_insns += sched_n_insns;
2787 /* Update target block boundaries. */
2788 if (head == BLOCK_HEAD (b))
2789 BLOCK_HEAD (b) = current_sched_info->head;
2790 if (tail == BLOCK_END (b))
2791 BLOCK_END (b) = current_sched_info->tail;
2793 /* Clean up. */
2794 if (current_nr_blocks > 1)
2796 free (candidate_table);
2797 free (bblst_table);
2798 free (bitlst_table);
2802 /* Sanity check: verify that all region insns were scheduled. */
2803 if (sched_rgn_n_insns != rgn_n_insns)
2804 abort ();
2806 /* Restore line notes. */
2807 if (write_symbols != NO_DEBUG)
2809 for (bb = 0; bb < current_nr_blocks; bb++)
2811 rtx head, tail;
2812 get_block_head_tail (BB_TO_BLOCK (bb), &head, &tail);
2813 restore_line_notes (head, tail);
2817 /* Done with this region. */
2818 free_pending_lists ();
2820 finish_deps_global ();
2822 free (bb_deps);
2824 if (current_nr_blocks > 1)
2826 free (prob);
2827 sbitmap_vector_free (dom);
2828 sbitmap_vector_free (pot_split);
2829 sbitmap_vector_free (ancestor_edges);
2830 free (edge_to_bit);
2831 free (rgn_edges);
2835 /* Indexed by region, holds the number of death notes found in that region.
2836 Used for consistency checks. */
2837 static int *deaths_in_region;
2839 /* Initialize data structures for region scheduling. */
2841 static void
2842 init_regions ()
2844 sbitmap blocks;
2845 int rgn;
2847 nr_regions = 0;
2848 rgn_table = (region *) xmalloc ((n_basic_blocks) * sizeof (region));
2849 rgn_bb_table = (int *) xmalloc ((n_basic_blocks) * sizeof (int));
2850 block_to_bb = (int *) xmalloc ((last_basic_block) * sizeof (int));
2851 containing_rgn = (int *) xmalloc ((last_basic_block) * sizeof (int));
2853 /* Compute regions for scheduling. */
2854 if (reload_completed
2855 || n_basic_blocks == 1
2856 || !flag_schedule_interblock)
2858 find_single_block_region ();
2860 else
2862 /* Verify that a 'good' control flow graph can be built. */
2863 if (is_cfg_nonregular ())
2865 find_single_block_region ();
2867 else
2869 dominance_info dom;
2870 struct edge_list *edge_list;
2872 /* The scheduler runs after estimate_probabilities; therefore, we
2873 can't blindly call back into find_basic_blocks since doing so
2874 could invalidate the branch probability info. We could,
2875 however, call cleanup_cfg. */
2876 edge_list = create_edge_list ();
2878 /* Compute the dominators and post dominators. */
2879 dom = calculate_dominance_info (CDI_DOMINATORS);
2881 /* build_control_flow will return nonzero if it detects unreachable
2882 blocks or any other irregularity with the cfg which prevents
2883 cross block scheduling. */
2884 if (build_control_flow (edge_list) != 0)
2885 find_single_block_region ();
2886 else
2887 find_rgns (edge_list, dom);
2889 if (sched_verbose >= 3)
2890 debug_regions ();
2892 /* We are done with flow's edge list. */
2893 free_edge_list (edge_list);
2895 /* For now. This will move as more and more of haifa is converted
2896 to using the cfg code in flow.c. */
2897 free_dominance_info (dom);
2902 if (CHECK_DEAD_NOTES)
2904 blocks = sbitmap_alloc (last_basic_block);
2905 deaths_in_region = (int *) xmalloc (sizeof (int) * nr_regions);
2906 /* Remove all death notes from the subroutine. */
2907 for (rgn = 0; rgn < nr_regions; rgn++)
2909 int b;
2911 sbitmap_zero (blocks);
2912 for (b = RGN_NR_BLOCKS (rgn) - 1; b >= 0; --b)
2913 SET_BIT (blocks, rgn_bb_table[RGN_BLOCKS (rgn) + b]);
2915 deaths_in_region[rgn] = count_or_remove_death_notes (blocks, 1);
2917 sbitmap_free (blocks);
2919 else
2920 count_or_remove_death_notes (NULL, 1);
2923 /* The one entry point in this file. DUMP_FILE is the dump file for
2924 this pass. */
2926 void
2927 schedule_insns (dump_file)
2928 FILE *dump_file;
2930 sbitmap large_region_blocks, blocks;
2931 int rgn;
2932 int any_large_regions;
2933 basic_block bb;
2935 /* Taking care of this degenerate case makes the rest of
2936 this code simpler. */
2937 if (n_basic_blocks == 0)
2938 return;
2940 nr_inter = 0;
2941 nr_spec = 0;
2943 sched_init (dump_file);
2945 init_regions ();
2947 current_sched_info = &region_sched_info;
2949 /* Schedule every region in the subroutine. */
2950 for (rgn = 0; rgn < nr_regions; rgn++)
2951 schedule_region (rgn);
2953 /* Update life analysis for the subroutine. Do single block regions
2954 first so that we can verify that live_at_start didn't change. Then
2955 do all other blocks. */
2956 /* ??? There is an outside possibility that update_life_info, or more
2957 to the point propagate_block, could get called with nonzero flags
2958 more than once for one basic block. This would be kinda bad if it
2959 were to happen, since REG_INFO would be accumulated twice for the
2960 block, and we'd have twice the REG_DEAD notes.
2962 I'm fairly certain that this _shouldn't_ happen, since I don't think
2963 that live_at_start should change at region heads. Not sure what the
2964 best way to test for this kind of thing... */
2966 allocate_reg_life_data ();
2967 compute_bb_for_insn ();
2969 any_large_regions = 0;
2970 large_region_blocks = sbitmap_alloc (last_basic_block);
2971 sbitmap_zero (large_region_blocks);
2972 FOR_EACH_BB (bb)
2973 SET_BIT (large_region_blocks, bb->index);
2975 blocks = sbitmap_alloc (last_basic_block);
2976 sbitmap_zero (blocks);
2978 /* Update life information. For regions consisting of multiple blocks
2979 we've possibly done interblock scheduling that affects global liveness.
2980 For regions consisting of single blocks we need to do only local
2981 liveness. */
2982 for (rgn = 0; rgn < nr_regions; rgn++)
2983 if (RGN_NR_BLOCKS (rgn) > 1)
2984 any_large_regions = 1;
2985 else
2987 SET_BIT (blocks, rgn_bb_table[RGN_BLOCKS (rgn)]);
2988 RESET_BIT (large_region_blocks, rgn_bb_table[RGN_BLOCKS (rgn)]);
2991 /* Don't update reg info after reload, since that affects
2992 regs_ever_live, which should not change after reload. */
2993 update_life_info (blocks, UPDATE_LIFE_LOCAL,
2994 (reload_completed ? PROP_DEATH_NOTES
2995 : PROP_DEATH_NOTES | PROP_REG_INFO));
2996 if (any_large_regions)
2998 update_life_info (large_region_blocks, UPDATE_LIFE_GLOBAL,
2999 PROP_DEATH_NOTES | PROP_REG_INFO);
3002 if (CHECK_DEAD_NOTES)
3004 /* Verify the counts of basic block notes in single the basic block
3005 regions. */
3006 for (rgn = 0; rgn < nr_regions; rgn++)
3007 if (RGN_NR_BLOCKS (rgn) == 1)
3009 sbitmap_zero (blocks);
3010 SET_BIT (blocks, rgn_bb_table[RGN_BLOCKS (rgn)]);
3012 if (deaths_in_region[rgn]
3013 != count_or_remove_death_notes (blocks, 0))
3014 abort ();
3016 free (deaths_in_region);
3019 /* Reposition the prologue and epilogue notes in case we moved the
3020 prologue/epilogue insns. */
3021 if (reload_completed)
3022 reposition_prologue_and_epilogue_notes (get_insns ());
3024 /* Delete redundant line notes. */
3025 if (write_symbols != NO_DEBUG)
3026 rm_redundant_line_notes ();
3028 if (sched_verbose)
3030 if (reload_completed == 0 && flag_schedule_interblock)
3032 fprintf (sched_dump,
3033 "\n;; Procedure interblock/speculative motions == %d/%d \n",
3034 nr_inter, nr_spec);
3036 else
3038 if (nr_inter > 0)
3039 abort ();
3041 fprintf (sched_dump, "\n\n");
3044 /* Clean up. */
3045 free (rgn_table);
3046 free (rgn_bb_table);
3047 free (block_to_bb);
3048 free (containing_rgn);
3050 sched_finish ();
3052 if (edge_table)
3054 free (edge_table);
3055 edge_table = NULL;
3058 if (in_edges)
3060 free (in_edges);
3061 in_edges = NULL;
3063 if (out_edges)
3065 free (out_edges);
3066 out_edges = NULL;
3069 sbitmap_free (blocks);
3070 sbitmap_free (large_region_blocks);
3072 #endif