2002-11-21 Phil Edwards <pme@gcc.gnu.org>
[official-gcc.git] / gcc / sched-rgn.c
blob6853a2e6a0a23f6b388b6b45cda568323e4b410b
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 "toplev.h"
51 #include "rtl.h"
52 #include "tm_p.h"
53 #include "hard-reg-set.h"
54 #include "basic-block.h"
55 #include "regs.h"
56 #include "function.h"
57 #include "flags.h"
58 #include "insn-config.h"
59 #include "insn-attr.h"
60 #include "except.h"
61 #include "toplev.h"
62 #include "recog.h"
63 #include "cfglayout.h"
64 #include "sched-int.h"
65 #include "target.h"
67 /* Define when we want to do count REG_DEAD notes before and after scheduling
68 for sanity checking. We can't do that when conditional execution is used,
69 as REG_DEAD exist only for unconditional deaths. */
71 #if !defined (HAVE_conditional_execution) && defined (ENABLE_CHECKING)
72 #define CHECK_DEAD_NOTES 1
73 #else
74 #define CHECK_DEAD_NOTES 0
75 #endif
78 #ifdef INSN_SCHEDULING
79 /* Some accessor macros for h_i_d members only used within this file. */
80 #define INSN_REF_COUNT(INSN) (h_i_d[INSN_UID (INSN)].ref_count)
81 #define FED_BY_SPEC_LOAD(insn) (h_i_d[INSN_UID (insn)].fed_by_spec_load)
82 #define IS_LOAD_INSN(insn) (h_i_d[INSN_UID (insn)].is_load_insn)
84 #define MAX_RGN_BLOCKS 10
85 #define MAX_RGN_INSNS 100
87 /* nr_inter/spec counts interblock/speculative motion for the function. */
88 static int nr_inter, nr_spec;
90 /* Control flow graph edges are kept in circular lists. */
91 typedef struct
93 int from_block;
94 int to_block;
95 int next_in;
96 int next_out;
98 haifa_edge;
99 static haifa_edge *edge_table;
101 #define NEXT_IN(edge) (edge_table[edge].next_in)
102 #define NEXT_OUT(edge) (edge_table[edge].next_out)
103 #define FROM_BLOCK(edge) (edge_table[edge].from_block)
104 #define TO_BLOCK(edge) (edge_table[edge].to_block)
106 /* Number of edges in the control flow graph. (In fact, larger than
107 that by 1, since edge 0 is unused.) */
108 static int nr_edges;
110 /* Circular list of incoming/outgoing edges of a block. */
111 static int *in_edges;
112 static int *out_edges;
114 #define IN_EDGES(block) (in_edges[block])
115 #define OUT_EDGES(block) (out_edges[block])
117 static int is_cfg_nonregular PARAMS ((void));
118 static int build_control_flow PARAMS ((struct edge_list *));
119 static void new_edge PARAMS ((int, int));
121 /* A region is the main entity for interblock scheduling: insns
122 are allowed to move between blocks in the same region, along
123 control flow graph edges, in the 'up' direction. */
124 typedef struct
126 int rgn_nr_blocks; /* Number of blocks in region. */
127 int rgn_blocks; /* cblocks in the region (actually index in rgn_bb_table). */
129 region;
131 /* Number of regions in the procedure. */
132 static int nr_regions;
134 /* Table of region descriptions. */
135 static region *rgn_table;
137 /* Array of lists of regions' blocks. */
138 static int *rgn_bb_table;
140 /* Topological order of blocks in the region (if b2 is reachable from
141 b1, block_to_bb[b2] > block_to_bb[b1]). Note: A basic block is
142 always referred to by either block or b, while its topological
143 order name (in the region) is refered to by bb. */
144 static int *block_to_bb;
146 /* The number of the region containing a block. */
147 static int *containing_rgn;
149 #define RGN_NR_BLOCKS(rgn) (rgn_table[rgn].rgn_nr_blocks)
150 #define RGN_BLOCKS(rgn) (rgn_table[rgn].rgn_blocks)
151 #define BLOCK_TO_BB(block) (block_to_bb[block])
152 #define CONTAINING_RGN(block) (containing_rgn[block])
154 void debug_regions PARAMS ((void));
155 static void find_single_block_region PARAMS ((void));
156 static void find_rgns PARAMS ((struct edge_list *, dominance_info));
157 static int too_large PARAMS ((int, int *, int *));
159 extern void debug_live PARAMS ((int, int));
161 /* Blocks of the current region being scheduled. */
162 static int current_nr_blocks;
163 static int current_blocks;
165 /* The mapping from bb to block. */
166 #define BB_TO_BLOCK(bb) (rgn_bb_table[current_blocks + (bb)])
168 typedef struct
170 int *first_member; /* Pointer to the list start in bitlst_table. */
171 int nr_members; /* The number of members of the bit list. */
173 bitlst;
175 static int bitlst_table_last;
176 static int bitlst_table_size;
177 static int *bitlst_table;
179 static void extract_bitlst PARAMS ((sbitmap, bitlst *));
181 /* Target info declarations.
183 The block currently being scheduled is referred to as the "target" block,
184 while other blocks in the region from which insns can be moved to the
185 target are called "source" blocks. The candidate structure holds info
186 about such sources: are they valid? Speculative? Etc. */
187 typedef bitlst bblst;
188 typedef struct
190 char is_valid;
191 char is_speculative;
192 int src_prob;
193 bblst split_bbs;
194 bblst update_bbs;
196 candidate;
198 static candidate *candidate_table;
200 /* A speculative motion requires checking live information on the path
201 from 'source' to 'target'. The split blocks are those to be checked.
202 After a speculative motion, live information should be modified in
203 the 'update' blocks.
205 Lists of split and update blocks for each candidate of the current
206 target are in array bblst_table. */
207 static int *bblst_table, bblst_size, bblst_last;
209 #define IS_VALID(src) ( candidate_table[src].is_valid )
210 #define IS_SPECULATIVE(src) ( candidate_table[src].is_speculative )
211 #define SRC_PROB(src) ( candidate_table[src].src_prob )
213 /* The bb being currently scheduled. */
214 static int target_bb;
216 /* List of edges. */
217 typedef bitlst edgelst;
219 /* Target info functions. */
220 static void split_edges PARAMS ((int, int, edgelst *));
221 static void compute_trg_info PARAMS ((int));
222 void debug_candidate PARAMS ((int));
223 void debug_candidates PARAMS ((int));
225 /* Dominators array: dom[i] contains the sbitmap of dominators of
226 bb i in the region. */
227 static sbitmap *dom;
229 /* bb 0 is the only region entry. */
230 #define IS_RGN_ENTRY(bb) (!bb)
232 /* Is bb_src dominated by bb_trg. */
233 #define IS_DOMINATED(bb_src, bb_trg) \
234 ( TEST_BIT (dom[bb_src], bb_trg) )
236 /* Probability: Prob[i] is a float in [0, 1] which is the probability
237 of bb i relative to the region entry. */
238 static float *prob;
240 /* The probability of bb_src, relative to bb_trg. Note, that while the
241 'prob[bb]' is a float in [0, 1], this macro returns an integer
242 in [0, 100]. */
243 #define GET_SRC_PROB(bb_src, bb_trg) ((int) (100.0 * (prob[bb_src] / \
244 prob[bb_trg])))
246 /* Bit-set of edges, where bit i stands for edge i. */
247 typedef sbitmap edgeset;
249 /* Number of edges in the region. */
250 static int rgn_nr_edges;
252 /* Array of size rgn_nr_edges. */
253 static int *rgn_edges;
256 /* Mapping from each edge in the graph to its number in the rgn. */
257 static int *edge_to_bit;
258 #define EDGE_TO_BIT(edge) (edge_to_bit[edge])
260 /* The split edges of a source bb is different for each target
261 bb. In order to compute this efficiently, the 'potential-split edges'
262 are computed for each bb prior to scheduling a region. This is actually
263 the split edges of each bb relative to the region entry.
265 pot_split[bb] is the set of potential split edges of bb. */
266 static edgeset *pot_split;
268 /* For every bb, a set of its ancestor edges. */
269 static edgeset *ancestor_edges;
271 static void compute_dom_prob_ps PARAMS ((int));
273 #define INSN_PROBABILITY(INSN) (SRC_PROB (BLOCK_TO_BB (BLOCK_NUM (INSN))))
274 #define IS_SPECULATIVE_INSN(INSN) (IS_SPECULATIVE (BLOCK_TO_BB (BLOCK_NUM (INSN))))
275 #define INSN_BB(INSN) (BLOCK_TO_BB (BLOCK_NUM (INSN)))
277 /* Parameters affecting the decision of rank_for_schedule().
278 ??? Nope. But MIN_PROBABILITY is used in copmute_trg_info. */
279 #define MIN_PROBABILITY 40
281 /* Speculative scheduling functions. */
282 static int check_live_1 PARAMS ((int, rtx));
283 static void update_live_1 PARAMS ((int, rtx));
284 static int check_live PARAMS ((rtx, int));
285 static void update_live PARAMS ((rtx, int));
286 static void set_spec_fed PARAMS ((rtx));
287 static int is_pfree PARAMS ((rtx, int, int));
288 static int find_conditional_protection PARAMS ((rtx, int));
289 static int is_conditionally_protected PARAMS ((rtx, int, int));
290 static int may_trap_exp PARAMS ((rtx, int));
291 static int haifa_classify_insn PARAMS ((rtx));
292 static int is_prisky PARAMS ((rtx, int, int));
293 static int is_exception_free PARAMS ((rtx, int, int));
295 static bool sets_likely_spilled PARAMS ((rtx));
296 static void sets_likely_spilled_1 PARAMS ((rtx, rtx, void *));
297 static void add_branch_dependences PARAMS ((rtx, rtx));
298 static void compute_block_backward_dependences PARAMS ((int));
299 void debug_dependencies PARAMS ((void));
301 static void init_regions PARAMS ((void));
302 static void schedule_region PARAMS ((int));
303 static rtx concat_INSN_LIST PARAMS ((rtx, rtx));
304 static void concat_insn_mem_list PARAMS ((rtx, rtx, rtx *, rtx *));
305 static void propagate_deps PARAMS ((int, struct deps *));
306 static void free_pending_lists PARAMS ((void));
308 /* Functions for construction of the control flow graph. */
310 /* Return 1 if control flow graph should not be constructed, 0 otherwise.
312 We decide not to build the control flow graph if there is possibly more
313 than one entry to the function, if computed branches exist, of if we
314 have nonlocal gotos. */
316 static int
317 is_cfg_nonregular ()
319 basic_block b;
320 rtx insn;
321 RTX_CODE code;
323 /* If we have a label that could be the target of a nonlocal goto, then
324 the cfg is not well structured. */
325 if (nonlocal_goto_handler_labels)
326 return 1;
328 /* If we have any forced labels, then the cfg is not well structured. */
329 if (forced_labels)
330 return 1;
332 /* If this function has a computed jump, then we consider the cfg
333 not well structured. */
334 if (current_function_has_computed_jump)
335 return 1;
337 /* If we have exception handlers, then we consider the cfg not well
338 structured. ?!? We should be able to handle this now that flow.c
339 computes an accurate cfg for EH. */
340 if (current_function_has_exception_handlers ())
341 return 1;
343 /* If we have non-jumping insns which refer to labels, then we consider
344 the cfg not well structured. */
345 /* Check for labels referred to other thn by jumps. */
346 FOR_EACH_BB (b)
347 for (insn = b->head;; insn = NEXT_INSN (insn))
349 code = GET_CODE (insn);
350 if (GET_RTX_CLASS (code) == 'i' && code != JUMP_INSN)
352 rtx note = find_reg_note (insn, REG_LABEL, NULL_RTX);
354 if (note
355 && ! (GET_CODE (NEXT_INSN (insn)) == JUMP_INSN
356 && find_reg_note (NEXT_INSN (insn), REG_LABEL,
357 XEXP (note, 0))))
358 return 1;
361 if (insn == b->end)
362 break;
365 /* All the tests passed. Consider the cfg well structured. */
366 return 0;
369 /* Build the control flow graph and set nr_edges.
371 Instead of trying to build a cfg ourselves, we rely on flow to
372 do it for us. Stamp out useless code (and bug) duplication.
374 Return nonzero if an irregularity in the cfg is found which would
375 prevent cross block scheduling. */
377 static int
378 build_control_flow (edge_list)
379 struct edge_list *edge_list;
381 int i, unreachable, num_edges;
382 basic_block b;
384 /* This already accounts for entry/exit edges. */
385 num_edges = NUM_EDGES (edge_list);
387 /* Unreachable loops with more than one basic block are detected
388 during the DFS traversal in find_rgns.
390 Unreachable loops with a single block are detected here. This
391 test is redundant with the one in find_rgns, but it's much
392 cheaper to go ahead and catch the trivial case here. */
393 unreachable = 0;
394 FOR_EACH_BB (b)
396 if (b->pred == NULL
397 || (b->pred->src == b
398 && b->pred->pred_next == NULL))
399 unreachable = 1;
402 /* ??? We can kill these soon. */
403 in_edges = (int *) xcalloc (last_basic_block, sizeof (int));
404 out_edges = (int *) xcalloc (last_basic_block, sizeof (int));
405 edge_table = (haifa_edge *) xcalloc (num_edges, sizeof (haifa_edge));
407 nr_edges = 0;
408 for (i = 0; i < num_edges; i++)
410 edge e = INDEX_EDGE (edge_list, i);
412 if (e->dest != EXIT_BLOCK_PTR
413 && e->src != ENTRY_BLOCK_PTR)
414 new_edge (e->src->index, e->dest->index);
417 /* Increment by 1, since edge 0 is unused. */
418 nr_edges++;
420 return unreachable;
423 /* Record an edge in the control flow graph from SOURCE to TARGET.
425 In theory, this is redundant with the s_succs computed above, but
426 we have not converted all of haifa to use information from the
427 integer lists. */
429 static void
430 new_edge (source, target)
431 int source, target;
433 int e, next_edge;
434 int curr_edge, fst_edge;
436 /* Check for duplicates. */
437 fst_edge = curr_edge = OUT_EDGES (source);
438 while (curr_edge)
440 if (FROM_BLOCK (curr_edge) == source
441 && TO_BLOCK (curr_edge) == target)
443 return;
446 curr_edge = NEXT_OUT (curr_edge);
448 if (fst_edge == curr_edge)
449 break;
452 e = ++nr_edges;
454 FROM_BLOCK (e) = source;
455 TO_BLOCK (e) = target;
457 if (OUT_EDGES (source))
459 next_edge = NEXT_OUT (OUT_EDGES (source));
460 NEXT_OUT (OUT_EDGES (source)) = e;
461 NEXT_OUT (e) = next_edge;
463 else
465 OUT_EDGES (source) = e;
466 NEXT_OUT (e) = e;
469 if (IN_EDGES (target))
471 next_edge = NEXT_IN (IN_EDGES (target));
472 NEXT_IN (IN_EDGES (target)) = e;
473 NEXT_IN (e) = next_edge;
475 else
477 IN_EDGES (target) = e;
478 NEXT_IN (e) = e;
482 /* Translate a bit-set SET to a list BL of the bit-set members. */
484 static void
485 extract_bitlst (set, bl)
486 sbitmap set;
487 bitlst *bl;
489 int i;
491 /* bblst table space is reused in each call to extract_bitlst. */
492 bitlst_table_last = 0;
494 bl->first_member = &bitlst_table[bitlst_table_last];
495 bl->nr_members = 0;
497 /* Iterate over each word in the bitset. */
498 EXECUTE_IF_SET_IN_SBITMAP (set, 0, i,
500 bitlst_table[bitlst_table_last++] = i;
501 (bl->nr_members)++;
506 /* Functions for the construction of regions. */
508 /* Print the regions, for debugging purposes. Callable from debugger. */
510 void
511 debug_regions ()
513 int rgn, bb;
515 fprintf (sched_dump, "\n;; ------------ REGIONS ----------\n\n");
516 for (rgn = 0; rgn < nr_regions; rgn++)
518 fprintf (sched_dump, ";;\trgn %d nr_blocks %d:\n", rgn,
519 rgn_table[rgn].rgn_nr_blocks);
520 fprintf (sched_dump, ";;\tbb/block: ");
522 for (bb = 0; bb < rgn_table[rgn].rgn_nr_blocks; bb++)
524 current_blocks = RGN_BLOCKS (rgn);
526 if (bb != BLOCK_TO_BB (BB_TO_BLOCK (bb)))
527 abort ();
529 fprintf (sched_dump, " %d/%d ", bb, BB_TO_BLOCK (bb));
532 fprintf (sched_dump, "\n\n");
536 /* Build a single block region for each basic block in the function.
537 This allows for using the same code for interblock and basic block
538 scheduling. */
540 static void
541 find_single_block_region ()
543 basic_block bb;
545 nr_regions = 0;
547 FOR_EACH_BB (bb)
549 rgn_bb_table[nr_regions] = bb->index;
550 RGN_NR_BLOCKS (nr_regions) = 1;
551 RGN_BLOCKS (nr_regions) = nr_regions;
552 CONTAINING_RGN (bb->index) = nr_regions;
553 BLOCK_TO_BB (bb->index) = 0;
554 nr_regions++;
558 /* Update number of blocks and the estimate for number of insns
559 in the region. Return 1 if the region is "too large" for interblock
560 scheduling (compile time considerations), otherwise return 0. */
562 static int
563 too_large (block, num_bbs, num_insns)
564 int block, *num_bbs, *num_insns;
566 (*num_bbs)++;
567 (*num_insns) += (INSN_LUID (BLOCK_END (block)) -
568 INSN_LUID (BLOCK_HEAD (block)));
569 if ((*num_bbs > MAX_RGN_BLOCKS) || (*num_insns > MAX_RGN_INSNS))
570 return 1;
571 else
572 return 0;
575 /* Update_loop_relations(blk, hdr): Check if the loop headed by max_hdr[blk]
576 is still an inner loop. Put in max_hdr[blk] the header of the most inner
577 loop containing blk. */
578 #define UPDATE_LOOP_RELATIONS(blk, hdr) \
580 if (max_hdr[blk] == -1) \
581 max_hdr[blk] = hdr; \
582 else if (dfs_nr[max_hdr[blk]] > dfs_nr[hdr]) \
583 RESET_BIT (inner, hdr); \
584 else if (dfs_nr[max_hdr[blk]] < dfs_nr[hdr]) \
586 RESET_BIT (inner,max_hdr[blk]); \
587 max_hdr[blk] = hdr; \
591 /* Find regions for interblock scheduling.
593 A region for scheduling can be:
595 * A loop-free procedure, or
597 * A reducible inner loop, or
599 * A basic block not contained in any other region.
601 ?!? In theory we could build other regions based on extended basic
602 blocks or reverse extended basic blocks. Is it worth the trouble?
604 Loop blocks that form a region are put into the region's block list
605 in topological order.
607 This procedure stores its results into the following global (ick) variables
609 * rgn_nr
610 * rgn_table
611 * rgn_bb_table
612 * block_to_bb
613 * containing region
615 We use dominator relationships to avoid making regions out of non-reducible
616 loops.
618 This procedure needs to be converted to work on pred/succ lists instead
619 of edge tables. That would simplify it somewhat. */
621 static void
622 find_rgns (edge_list, dom)
623 struct edge_list *edge_list;
624 dominance_info dom;
626 int *max_hdr, *dfs_nr, *stack, *degree;
627 char no_loops = 1;
628 int node, child, loop_head, i, head, tail;
629 int count = 0, sp, idx = 0, current_edge = out_edges[0];
630 int num_bbs, num_insns, unreachable;
631 int too_large_failure;
632 basic_block bb;
634 /* Note if an edge has been passed. */
635 sbitmap passed;
637 /* Note if a block is a natural loop header. */
638 sbitmap header;
640 /* Note if a block is an natural inner loop header. */
641 sbitmap inner;
643 /* Note if a block is in the block queue. */
644 sbitmap in_queue;
646 /* Note if a block is in the block queue. */
647 sbitmap in_stack;
649 int num_edges = NUM_EDGES (edge_list);
651 /* Perform a DFS traversal of the cfg. Identify loop headers, inner loops
652 and a mapping from block to its loop header (if the block is contained
653 in a loop, else -1).
655 Store results in HEADER, INNER, and MAX_HDR respectively, these will
656 be used as inputs to the second traversal.
658 STACK, SP and DFS_NR are only used during the first traversal. */
660 /* Allocate and initialize variables for the first traversal. */
661 max_hdr = (int *) xmalloc (last_basic_block * sizeof (int));
662 dfs_nr = (int *) xcalloc (last_basic_block, sizeof (int));
663 stack = (int *) xmalloc (nr_edges * sizeof (int));
665 inner = sbitmap_alloc (last_basic_block);
666 sbitmap_ones (inner);
668 header = sbitmap_alloc (last_basic_block);
669 sbitmap_zero (header);
671 passed = sbitmap_alloc (nr_edges);
672 sbitmap_zero (passed);
674 in_queue = sbitmap_alloc (last_basic_block);
675 sbitmap_zero (in_queue);
677 in_stack = sbitmap_alloc (last_basic_block);
678 sbitmap_zero (in_stack);
680 for (i = 0; i < last_basic_block; i++)
681 max_hdr[i] = -1;
683 /* DFS traversal to find inner loops in the cfg. */
685 sp = -1;
686 while (1)
688 if (current_edge == 0 || TEST_BIT (passed, current_edge))
690 /* We have reached a leaf node or a node that was already
691 processed. Pop edges off the stack until we find
692 an edge that has not yet been processed. */
693 while (sp >= 0
694 && (current_edge == 0 || TEST_BIT (passed, current_edge)))
696 /* Pop entry off the stack. */
697 current_edge = stack[sp--];
698 node = FROM_BLOCK (current_edge);
699 child = TO_BLOCK (current_edge);
700 RESET_BIT (in_stack, child);
701 if (max_hdr[child] >= 0 && TEST_BIT (in_stack, max_hdr[child]))
702 UPDATE_LOOP_RELATIONS (node, max_hdr[child]);
703 current_edge = NEXT_OUT (current_edge);
706 /* See if have finished the DFS tree traversal. */
707 if (sp < 0 && TEST_BIT (passed, current_edge))
708 break;
710 /* Nope, continue the traversal with the popped node. */
711 continue;
714 /* Process a node. */
715 node = FROM_BLOCK (current_edge);
716 child = TO_BLOCK (current_edge);
717 SET_BIT (in_stack, node);
718 dfs_nr[node] = ++count;
720 /* If the successor is in the stack, then we've found a loop.
721 Mark the loop, if it is not a natural loop, then it will
722 be rejected during the second traversal. */
723 if (TEST_BIT (in_stack, child))
725 no_loops = 0;
726 SET_BIT (header, child);
727 UPDATE_LOOP_RELATIONS (node, child);
728 SET_BIT (passed, current_edge);
729 current_edge = NEXT_OUT (current_edge);
730 continue;
733 /* If the child was already visited, then there is no need to visit
734 it again. Just update the loop relationships and restart
735 with a new edge. */
736 if (dfs_nr[child])
738 if (max_hdr[child] >= 0 && TEST_BIT (in_stack, max_hdr[child]))
739 UPDATE_LOOP_RELATIONS (node, max_hdr[child]);
740 SET_BIT (passed, current_edge);
741 current_edge = NEXT_OUT (current_edge);
742 continue;
745 /* Push an entry on the stack and continue DFS traversal. */
746 stack[++sp] = current_edge;
747 SET_BIT (passed, current_edge);
748 current_edge = OUT_EDGES (child);
750 /* This is temporary until haifa is converted to use rth's new
751 cfg routines which have true entry/exit blocks and the
752 appropriate edges from/to those blocks.
754 Generally we update dfs_nr for a node when we process its
755 out edge. However, if the node has no out edge then we will
756 not set dfs_nr for that node. This can confuse the scheduler
757 into thinking that we have unreachable blocks, which in turn
758 disables cross block scheduling.
760 So, if we have a node with no out edges, go ahead and mark it
761 as reachable now. */
762 if (current_edge == 0)
763 dfs_nr[child] = ++count;
766 /* Another check for unreachable blocks. The earlier test in
767 is_cfg_nonregular only finds unreachable blocks that do not
768 form a loop.
770 The DFS traversal will mark every block that is reachable from
771 the entry node by placing a nonzero value in dfs_nr. Thus if
772 dfs_nr is zero for any block, then it must be unreachable. */
773 unreachable = 0;
774 FOR_EACH_BB (bb)
775 if (dfs_nr[bb->index] == 0)
777 unreachable = 1;
778 break;
781 /* Gross. To avoid wasting memory, the second pass uses the dfs_nr array
782 to hold degree counts. */
783 degree = dfs_nr;
785 FOR_EACH_BB (bb)
786 degree[bb->index] = 0;
787 for (i = 0; i < num_edges; i++)
789 edge e = INDEX_EDGE (edge_list, i);
791 if (e->dest != EXIT_BLOCK_PTR)
792 degree[e->dest->index]++;
795 /* Do not perform region scheduling if there are any unreachable
796 blocks. */
797 if (!unreachable)
799 int *queue;
801 if (no_loops)
802 SET_BIT (header, 0);
804 /* Second travsersal:find reducible inner loops and topologically sort
805 block of each region. */
807 queue = (int *) xmalloc (n_basic_blocks * sizeof (int));
809 /* Find blocks which are inner loop headers. We still have non-reducible
810 loops to consider at this point. */
811 FOR_EACH_BB (bb)
813 if (TEST_BIT (header, bb->index) && TEST_BIT (inner, bb->index))
815 edge e;
816 basic_block jbb;
818 /* Now check that the loop is reducible. We do this separate
819 from finding inner loops so that we do not find a reducible
820 loop which contains an inner non-reducible loop.
822 A simple way to find reducible/natural loops is to verify
823 that each block in the loop is dominated by the loop
824 header.
826 If there exists a block that is not dominated by the loop
827 header, then the block is reachable from outside the loop
828 and thus the loop is not a natural loop. */
829 FOR_EACH_BB (jbb)
831 /* First identify blocks in the loop, except for the loop
832 entry block. */
833 if (bb->index == max_hdr[jbb->index] && bb != jbb)
835 /* Now verify that the block is dominated by the loop
836 header. */
837 if (!dominated_by_p (dom, jbb, bb))
838 break;
842 /* If we exited the loop early, then I is the header of
843 a non-reducible loop and we should quit processing it
844 now. */
845 if (jbb != EXIT_BLOCK_PTR)
846 continue;
848 /* I is a header of an inner loop, or block 0 in a subroutine
849 with no loops at all. */
850 head = tail = -1;
851 too_large_failure = 0;
852 loop_head = max_hdr[bb->index];
854 /* Decrease degree of all I's successors for topological
855 ordering. */
856 for (e = bb->succ; e; e = e->succ_next)
857 if (e->dest != EXIT_BLOCK_PTR)
858 --degree[e->dest->index];
860 /* Estimate # insns, and count # blocks in the region. */
861 num_bbs = 1;
862 num_insns = (INSN_LUID (bb->end)
863 - INSN_LUID (bb->head));
865 /* Find all loop latches (blocks with back edges to the loop
866 header) or all the leaf blocks in the cfg has no loops.
868 Place those blocks into the queue. */
869 if (no_loops)
871 FOR_EACH_BB (jbb)
872 /* Leaf nodes have only a single successor which must
873 be EXIT_BLOCK. */
874 if (jbb->succ
875 && jbb->succ->dest == EXIT_BLOCK_PTR
876 && jbb->succ->succ_next == NULL)
878 queue[++tail] = jbb->index;
879 SET_BIT (in_queue, jbb->index);
881 if (too_large (jbb->index, &num_bbs, &num_insns))
883 too_large_failure = 1;
884 break;
888 else
890 edge e;
892 for (e = bb->pred; e; e = e->pred_next)
894 if (e->src == ENTRY_BLOCK_PTR)
895 continue;
897 node = e->src->index;
899 if (max_hdr[node] == loop_head && node != bb->index)
901 /* This is a loop latch. */
902 queue[++tail] = node;
903 SET_BIT (in_queue, node);
905 if (too_large (node, &num_bbs, &num_insns))
907 too_large_failure = 1;
908 break;
914 /* Now add all the blocks in the loop to the queue.
916 We know the loop is a natural loop; however the algorithm
917 above will not always mark certain blocks as being in the
918 loop. Consider:
919 node children
920 a b,c
922 c a,d
925 The algorithm in the DFS traversal may not mark B & D as part
926 of the loop (ie they will not have max_hdr set to A).
928 We know they can not be loop latches (else they would have
929 had max_hdr set since they'd have a backedge to a dominator
930 block). So we don't need them on the initial queue.
932 We know they are part of the loop because they are dominated
933 by the loop header and can be reached by a backwards walk of
934 the edges starting with nodes on the initial queue.
936 It is safe and desirable to include those nodes in the
937 loop/scheduling region. To do so we would need to decrease
938 the degree of a node if it is the target of a backedge
939 within the loop itself as the node is placed in the queue.
941 We do not do this because I'm not sure that the actual
942 scheduling code will properly handle this case. ?!? */
944 while (head < tail && !too_large_failure)
946 edge e;
947 child = queue[++head];
949 for (e = BASIC_BLOCK (child)->pred; e; e = e->pred_next)
951 node = e->src->index;
953 /* See discussion above about nodes not marked as in
954 this loop during the initial DFS traversal. */
955 if (e->src == ENTRY_BLOCK_PTR
956 || max_hdr[node] != loop_head)
958 tail = -1;
959 break;
961 else if (!TEST_BIT (in_queue, node) && node != bb->index)
963 queue[++tail] = node;
964 SET_BIT (in_queue, node);
966 if (too_large (node, &num_bbs, &num_insns))
968 too_large_failure = 1;
969 break;
975 if (tail >= 0 && !too_large_failure)
977 /* Place the loop header into list of region blocks. */
978 degree[bb->index] = -1;
979 rgn_bb_table[idx] = bb->index;
980 RGN_NR_BLOCKS (nr_regions) = num_bbs;
981 RGN_BLOCKS (nr_regions) = idx++;
982 CONTAINING_RGN (bb->index) = nr_regions;
983 BLOCK_TO_BB (bb->index) = count = 0;
985 /* Remove blocks from queue[] when their in degree
986 becomes zero. Repeat until no blocks are left on the
987 list. This produces a topological list of blocks in
988 the region. */
989 while (tail >= 0)
991 if (head < 0)
992 head = tail;
993 child = queue[head];
994 if (degree[child] == 0)
996 edge e;
998 degree[child] = -1;
999 rgn_bb_table[idx++] = child;
1000 BLOCK_TO_BB (child) = ++count;
1001 CONTAINING_RGN (child) = nr_regions;
1002 queue[head] = queue[tail--];
1004 for (e = BASIC_BLOCK (child)->succ;
1006 e = e->succ_next)
1007 if (e->dest != EXIT_BLOCK_PTR)
1008 --degree[e->dest->index];
1010 else
1011 --head;
1013 ++nr_regions;
1017 free (queue);
1020 /* Any block that did not end up in a region is placed into a region
1021 by itself. */
1022 FOR_EACH_BB (bb)
1023 if (degree[bb->index] >= 0)
1025 rgn_bb_table[idx] = bb->index;
1026 RGN_NR_BLOCKS (nr_regions) = 1;
1027 RGN_BLOCKS (nr_regions) = idx++;
1028 CONTAINING_RGN (bb->index) = nr_regions++;
1029 BLOCK_TO_BB (bb->index) = 0;
1032 free (max_hdr);
1033 free (dfs_nr);
1034 free (stack);
1035 sbitmap_free (passed);
1036 sbitmap_free (header);
1037 sbitmap_free (inner);
1038 sbitmap_free (in_queue);
1039 sbitmap_free (in_stack);
1042 /* Functions for regions scheduling information. */
1044 /* Compute dominators, probability, and potential-split-edges of bb.
1045 Assume that these values were already computed for bb's predecessors. */
1047 static void
1048 compute_dom_prob_ps (bb)
1049 int bb;
1051 int nxt_in_edge, fst_in_edge, pred;
1052 int fst_out_edge, nxt_out_edge, nr_out_edges, nr_rgn_out_edges;
1054 prob[bb] = 0.0;
1055 if (IS_RGN_ENTRY (bb))
1057 SET_BIT (dom[bb], 0);
1058 prob[bb] = 1.0;
1059 return;
1062 fst_in_edge = nxt_in_edge = IN_EDGES (BB_TO_BLOCK (bb));
1064 /* Initialize dom[bb] to '111..1'. */
1065 sbitmap_ones (dom[bb]);
1069 pred = FROM_BLOCK (nxt_in_edge);
1070 sbitmap_a_and_b (dom[bb], dom[bb], dom[BLOCK_TO_BB (pred)]);
1071 sbitmap_a_or_b (ancestor_edges[bb], ancestor_edges[bb], ancestor_edges[BLOCK_TO_BB (pred)]);
1073 SET_BIT (ancestor_edges[bb], EDGE_TO_BIT (nxt_in_edge));
1075 nr_out_edges = 1;
1076 nr_rgn_out_edges = 0;
1077 fst_out_edge = OUT_EDGES (pred);
1078 nxt_out_edge = NEXT_OUT (fst_out_edge);
1080 sbitmap_a_or_b (pot_split[bb], pot_split[bb], pot_split[BLOCK_TO_BB (pred)]);
1082 SET_BIT (pot_split[bb], EDGE_TO_BIT (fst_out_edge));
1084 /* The successor doesn't belong in the region? */
1085 if (CONTAINING_RGN (TO_BLOCK (fst_out_edge)) !=
1086 CONTAINING_RGN (BB_TO_BLOCK (bb)))
1087 ++nr_rgn_out_edges;
1089 while (fst_out_edge != nxt_out_edge)
1091 ++nr_out_edges;
1092 /* The successor doesn't belong in the region? */
1093 if (CONTAINING_RGN (TO_BLOCK (nxt_out_edge)) !=
1094 CONTAINING_RGN (BB_TO_BLOCK (bb)))
1095 ++nr_rgn_out_edges;
1096 SET_BIT (pot_split[bb], EDGE_TO_BIT (nxt_out_edge));
1097 nxt_out_edge = NEXT_OUT (nxt_out_edge);
1101 /* Now nr_rgn_out_edges is the number of region-exit edges from
1102 pred, and nr_out_edges will be the number of pred out edges
1103 not leaving the region. */
1104 nr_out_edges -= nr_rgn_out_edges;
1105 if (nr_rgn_out_edges > 0)
1106 prob[bb] += 0.9 * prob[BLOCK_TO_BB (pred)] / nr_out_edges;
1107 else
1108 prob[bb] += prob[BLOCK_TO_BB (pred)] / nr_out_edges;
1109 nxt_in_edge = NEXT_IN (nxt_in_edge);
1111 while (fst_in_edge != nxt_in_edge);
1113 SET_BIT (dom[bb], bb);
1114 sbitmap_difference (pot_split[bb], pot_split[bb], ancestor_edges[bb]);
1116 if (sched_verbose >= 2)
1117 fprintf (sched_dump, ";; bb_prob(%d, %d) = %3d\n", bb, BB_TO_BLOCK (bb),
1118 (int) (100.0 * prob[bb]));
1121 /* Functions for target info. */
1123 /* Compute in BL the list of split-edges of bb_src relatively to bb_trg.
1124 Note that bb_trg dominates bb_src. */
1126 static void
1127 split_edges (bb_src, bb_trg, bl)
1128 int bb_src;
1129 int bb_trg;
1130 edgelst *bl;
1132 sbitmap src = (edgeset) sbitmap_alloc (pot_split[bb_src]->n_bits);
1133 sbitmap_copy (src, pot_split[bb_src]);
1135 sbitmap_difference (src, src, pot_split[bb_trg]);
1136 extract_bitlst (src, bl);
1137 sbitmap_free (src);
1140 /* Find the valid candidate-source-blocks for the target block TRG, compute
1141 their probability, and check if they are speculative or not.
1142 For speculative sources, compute their update-blocks and split-blocks. */
1144 static void
1145 compute_trg_info (trg)
1146 int trg;
1148 candidate *sp;
1149 edgelst el;
1150 int check_block, update_idx;
1151 int i, j, k, fst_edge, nxt_edge;
1153 /* Define some of the fields for the target bb as well. */
1154 sp = candidate_table + trg;
1155 sp->is_valid = 1;
1156 sp->is_speculative = 0;
1157 sp->src_prob = 100;
1159 for (i = trg + 1; i < current_nr_blocks; i++)
1161 sp = candidate_table + i;
1163 sp->is_valid = IS_DOMINATED (i, trg);
1164 if (sp->is_valid)
1166 sp->src_prob = GET_SRC_PROB (i, trg);
1167 sp->is_valid = (sp->src_prob >= MIN_PROBABILITY);
1170 if (sp->is_valid)
1172 split_edges (i, trg, &el);
1173 sp->is_speculative = (el.nr_members) ? 1 : 0;
1174 if (sp->is_speculative && !flag_schedule_speculative)
1175 sp->is_valid = 0;
1178 if (sp->is_valid)
1180 char *update_blocks;
1182 /* Compute split blocks and store them in bblst_table.
1183 The TO block of every split edge is a split block. */
1184 sp->split_bbs.first_member = &bblst_table[bblst_last];
1185 sp->split_bbs.nr_members = el.nr_members;
1186 for (j = 0; j < el.nr_members; bblst_last++, j++)
1187 bblst_table[bblst_last] =
1188 TO_BLOCK (rgn_edges[el.first_member[j]]);
1189 sp->update_bbs.first_member = &bblst_table[bblst_last];
1191 /* Compute update blocks and store them in bblst_table.
1192 For every split edge, look at the FROM block, and check
1193 all out edges. For each out edge that is not a split edge,
1194 add the TO block to the update block list. This list can end
1195 up with a lot of duplicates. We need to weed them out to avoid
1196 overrunning the end of the bblst_table. */
1197 update_blocks = (char *) alloca (last_basic_block);
1198 memset (update_blocks, 0, last_basic_block);
1200 update_idx = 0;
1201 for (j = 0; j < el.nr_members; j++)
1203 check_block = FROM_BLOCK (rgn_edges[el.first_member[j]]);
1204 fst_edge = nxt_edge = OUT_EDGES (check_block);
1207 if (! update_blocks[TO_BLOCK (nxt_edge)])
1209 for (k = 0; k < el.nr_members; k++)
1210 if (EDGE_TO_BIT (nxt_edge) == el.first_member[k])
1211 break;
1213 if (k >= el.nr_members)
1215 bblst_table[bblst_last++] = TO_BLOCK (nxt_edge);
1216 update_blocks[TO_BLOCK (nxt_edge)] = 1;
1217 update_idx++;
1221 nxt_edge = NEXT_OUT (nxt_edge);
1223 while (fst_edge != nxt_edge);
1225 sp->update_bbs.nr_members = update_idx;
1227 /* Make sure we didn't overrun the end of bblst_table. */
1228 if (bblst_last > bblst_size)
1229 abort ();
1231 else
1233 sp->split_bbs.nr_members = sp->update_bbs.nr_members = 0;
1235 sp->is_speculative = 0;
1236 sp->src_prob = 0;
1241 /* Print candidates info, for debugging purposes. Callable from debugger. */
1243 void
1244 debug_candidate (i)
1245 int i;
1247 if (!candidate_table[i].is_valid)
1248 return;
1250 if (candidate_table[i].is_speculative)
1252 int j;
1253 fprintf (sched_dump, "src b %d bb %d speculative \n", BB_TO_BLOCK (i), i);
1255 fprintf (sched_dump, "split path: ");
1256 for (j = 0; j < candidate_table[i].split_bbs.nr_members; j++)
1258 int b = candidate_table[i].split_bbs.first_member[j];
1260 fprintf (sched_dump, " %d ", b);
1262 fprintf (sched_dump, "\n");
1264 fprintf (sched_dump, "update path: ");
1265 for (j = 0; j < candidate_table[i].update_bbs.nr_members; j++)
1267 int b = candidate_table[i].update_bbs.first_member[j];
1269 fprintf (sched_dump, " %d ", b);
1271 fprintf (sched_dump, "\n");
1273 else
1275 fprintf (sched_dump, " src %d equivalent\n", BB_TO_BLOCK (i));
1279 /* Print candidates info, for debugging purposes. Callable from debugger. */
1281 void
1282 debug_candidates (trg)
1283 int trg;
1285 int i;
1287 fprintf (sched_dump, "----------- candidate table: target: b=%d bb=%d ---\n",
1288 BB_TO_BLOCK (trg), trg);
1289 for (i = trg + 1; i < current_nr_blocks; i++)
1290 debug_candidate (i);
1293 /* Functions for speculative scheduing. */
1295 /* Return 0 if x is a set of a register alive in the beginning of one
1296 of the split-blocks of src, otherwise return 1. */
1298 static int
1299 check_live_1 (src, x)
1300 int src;
1301 rtx x;
1303 int i;
1304 int regno;
1305 rtx reg = SET_DEST (x);
1307 if (reg == 0)
1308 return 1;
1310 while (GET_CODE (reg) == SUBREG || GET_CODE (reg) == ZERO_EXTRACT
1311 || GET_CODE (reg) == SIGN_EXTRACT
1312 || GET_CODE (reg) == STRICT_LOW_PART)
1313 reg = XEXP (reg, 0);
1315 if (GET_CODE (reg) == PARALLEL)
1317 int i;
1319 for (i = XVECLEN (reg, 0) - 1; i >= 0; i--)
1320 if (XEXP (XVECEXP (reg, 0, i), 0) != 0)
1321 if (check_live_1 (src, XEXP (XVECEXP (reg, 0, i), 0)))
1322 return 1;
1324 return 0;
1327 if (GET_CODE (reg) != REG)
1328 return 1;
1330 regno = REGNO (reg);
1332 if (regno < FIRST_PSEUDO_REGISTER && global_regs[regno])
1334 /* Global registers are assumed live. */
1335 return 0;
1337 else
1339 if (regno < FIRST_PSEUDO_REGISTER)
1341 /* Check for hard registers. */
1342 int j = HARD_REGNO_NREGS (regno, GET_MODE (reg));
1343 while (--j >= 0)
1345 for (i = 0; i < candidate_table[src].split_bbs.nr_members; i++)
1347 int b = candidate_table[src].split_bbs.first_member[i];
1349 if (REGNO_REG_SET_P (BASIC_BLOCK (b)->global_live_at_start,
1350 regno + j))
1352 return 0;
1357 else
1359 /* Check for psuedo registers. */
1360 for (i = 0; i < candidate_table[src].split_bbs.nr_members; i++)
1362 int b = candidate_table[src].split_bbs.first_member[i];
1364 if (REGNO_REG_SET_P (BASIC_BLOCK (b)->global_live_at_start, regno))
1366 return 0;
1372 return 1;
1375 /* If x is a set of a register R, mark that R is alive in the beginning
1376 of every update-block of src. */
1378 static void
1379 update_live_1 (src, x)
1380 int src;
1381 rtx x;
1383 int i;
1384 int regno;
1385 rtx reg = SET_DEST (x);
1387 if (reg == 0)
1388 return;
1390 while (GET_CODE (reg) == SUBREG || GET_CODE (reg) == ZERO_EXTRACT
1391 || GET_CODE (reg) == SIGN_EXTRACT
1392 || GET_CODE (reg) == STRICT_LOW_PART)
1393 reg = XEXP (reg, 0);
1395 if (GET_CODE (reg) == PARALLEL)
1397 int i;
1399 for (i = XVECLEN (reg, 0) - 1; i >= 0; i--)
1400 if (XEXP (XVECEXP (reg, 0, i), 0) != 0)
1401 update_live_1 (src, XEXP (XVECEXP (reg, 0, i), 0));
1403 return;
1406 if (GET_CODE (reg) != REG)
1407 return;
1409 /* Global registers are always live, so the code below does not apply
1410 to them. */
1412 regno = REGNO (reg);
1414 if (regno >= FIRST_PSEUDO_REGISTER || !global_regs[regno])
1416 if (regno < FIRST_PSEUDO_REGISTER)
1418 int j = HARD_REGNO_NREGS (regno, GET_MODE (reg));
1419 while (--j >= 0)
1421 for (i = 0; i < candidate_table[src].update_bbs.nr_members; i++)
1423 int b = candidate_table[src].update_bbs.first_member[i];
1425 SET_REGNO_REG_SET (BASIC_BLOCK (b)->global_live_at_start,
1426 regno + j);
1430 else
1432 for (i = 0; i < candidate_table[src].update_bbs.nr_members; i++)
1434 int b = candidate_table[src].update_bbs.first_member[i];
1436 SET_REGNO_REG_SET (BASIC_BLOCK (b)->global_live_at_start, regno);
1442 /* Return 1 if insn can be speculatively moved from block src to trg,
1443 otherwise return 0. Called before first insertion of insn to
1444 ready-list or before the scheduling. */
1446 static int
1447 check_live (insn, src)
1448 rtx insn;
1449 int src;
1451 /* Find the registers set by instruction. */
1452 if (GET_CODE (PATTERN (insn)) == SET
1453 || GET_CODE (PATTERN (insn)) == CLOBBER)
1454 return check_live_1 (src, PATTERN (insn));
1455 else if (GET_CODE (PATTERN (insn)) == PARALLEL)
1457 int j;
1458 for (j = XVECLEN (PATTERN (insn), 0) - 1; j >= 0; j--)
1459 if ((GET_CODE (XVECEXP (PATTERN (insn), 0, j)) == SET
1460 || GET_CODE (XVECEXP (PATTERN (insn), 0, j)) == CLOBBER)
1461 && !check_live_1 (src, XVECEXP (PATTERN (insn), 0, j)))
1462 return 0;
1464 return 1;
1467 return 1;
1470 /* Update the live registers info after insn was moved speculatively from
1471 block src to trg. */
1473 static void
1474 update_live (insn, src)
1475 rtx insn;
1476 int src;
1478 /* Find the registers set by instruction. */
1479 if (GET_CODE (PATTERN (insn)) == SET
1480 || GET_CODE (PATTERN (insn)) == CLOBBER)
1481 update_live_1 (src, PATTERN (insn));
1482 else if (GET_CODE (PATTERN (insn)) == PARALLEL)
1484 int j;
1485 for (j = XVECLEN (PATTERN (insn), 0) - 1; j >= 0; j--)
1486 if (GET_CODE (XVECEXP (PATTERN (insn), 0, j)) == SET
1487 || GET_CODE (XVECEXP (PATTERN (insn), 0, j)) == CLOBBER)
1488 update_live_1 (src, XVECEXP (PATTERN (insn), 0, j));
1492 /* Exception Free Loads:
1494 We define five classes of speculative loads: IFREE, IRISKY,
1495 PFREE, PRISKY, and MFREE.
1497 IFREE loads are loads that are proved to be exception-free, just
1498 by examining the load insn. Examples for such loads are loads
1499 from TOC and loads of global data.
1501 IRISKY loads are loads that are proved to be exception-risky,
1502 just by examining the load insn. Examples for such loads are
1503 volatile loads and loads from shared memory.
1505 PFREE loads are loads for which we can prove, by examining other
1506 insns, that they are exception-free. Currently, this class consists
1507 of loads for which we are able to find a "similar load", either in
1508 the target block, or, if only one split-block exists, in that split
1509 block. Load2 is similar to load1 if both have same single base
1510 register. We identify only part of the similar loads, by finding
1511 an insn upon which both load1 and load2 have a DEF-USE dependence.
1513 PRISKY loads are loads for which we can prove, by examining other
1514 insns, that they are exception-risky. Currently we have two proofs for
1515 such loads. The first proof detects loads that are probably guarded by a
1516 test on the memory address. This proof is based on the
1517 backward and forward data dependence information for the region.
1518 Let load-insn be the examined load.
1519 Load-insn is PRISKY iff ALL the following hold:
1521 - insn1 is not in the same block as load-insn
1522 - there is a DEF-USE dependence chain (insn1, ..., load-insn)
1523 - test-insn is either a compare or a branch, not in the same block
1524 as load-insn
1525 - load-insn is reachable from test-insn
1526 - there is a DEF-USE dependence chain (insn1, ..., test-insn)
1528 This proof might fail when the compare and the load are fed
1529 by an insn not in the region. To solve this, we will add to this
1530 group all loads that have no input DEF-USE dependence.
1532 The second proof detects loads that are directly or indirectly
1533 fed by a speculative load. This proof is affected by the
1534 scheduling process. We will use the flag fed_by_spec_load.
1535 Initially, all insns have this flag reset. After a speculative
1536 motion of an insn, if insn is either a load, or marked as
1537 fed_by_spec_load, we will also mark as fed_by_spec_load every
1538 insn1 for which a DEF-USE dependence (insn, insn1) exists. A
1539 load which is fed_by_spec_load is also PRISKY.
1541 MFREE (maybe-free) loads are all the remaining loads. They may be
1542 exception-free, but we cannot prove it.
1544 Now, all loads in IFREE and PFREE classes are considered
1545 exception-free, while all loads in IRISKY and PRISKY classes are
1546 considered exception-risky. As for loads in the MFREE class,
1547 these are considered either exception-free or exception-risky,
1548 depending on whether we are pessimistic or optimistic. We have
1549 to take the pessimistic approach to assure the safety of
1550 speculative scheduling, but we can take the optimistic approach
1551 by invoking the -fsched_spec_load_dangerous option. */
1553 enum INSN_TRAP_CLASS
1555 TRAP_FREE = 0, IFREE = 1, PFREE_CANDIDATE = 2,
1556 PRISKY_CANDIDATE = 3, IRISKY = 4, TRAP_RISKY = 5
1559 #define WORST_CLASS(class1, class2) \
1560 ((class1 > class2) ? class1 : class2)
1562 /* Non-zero if block bb_to is equal to, or reachable from block bb_from. */
1563 #define IS_REACHABLE(bb_from, bb_to) \
1564 (bb_from == bb_to \
1565 || IS_RGN_ENTRY (bb_from) \
1566 || (TEST_BIT (ancestor_edges[bb_to], \
1567 EDGE_TO_BIT (IN_EDGES (BB_TO_BLOCK (bb_from))))))
1569 /* Non-zero iff the address is comprised from at most 1 register. */
1570 #define CONST_BASED_ADDRESS_P(x) \
1571 (GET_CODE (x) == REG \
1572 || ((GET_CODE (x) == PLUS || GET_CODE (x) == MINUS \
1573 || (GET_CODE (x) == LO_SUM)) \
1574 && (CONSTANT_P (XEXP (x, 0)) \
1575 || CONSTANT_P (XEXP (x, 1)))))
1577 /* Turns on the fed_by_spec_load flag for insns fed by load_insn. */
1579 static void
1580 set_spec_fed (load_insn)
1581 rtx load_insn;
1583 rtx link;
1585 for (link = INSN_DEPEND (load_insn); link; link = XEXP (link, 1))
1586 if (GET_MODE (link) == VOIDmode)
1587 FED_BY_SPEC_LOAD (XEXP (link, 0)) = 1;
1588 } /* set_spec_fed */
1590 /* On the path from the insn to load_insn_bb, find a conditional
1591 branch depending on insn, that guards the speculative load. */
1593 static int
1594 find_conditional_protection (insn, load_insn_bb)
1595 rtx insn;
1596 int load_insn_bb;
1598 rtx link;
1600 /* Iterate through DEF-USE forward dependences. */
1601 for (link = INSN_DEPEND (insn); link; link = XEXP (link, 1))
1603 rtx next = XEXP (link, 0);
1604 if ((CONTAINING_RGN (BLOCK_NUM (next)) ==
1605 CONTAINING_RGN (BB_TO_BLOCK (load_insn_bb)))
1606 && IS_REACHABLE (INSN_BB (next), load_insn_bb)
1607 && load_insn_bb != INSN_BB (next)
1608 && GET_MODE (link) == VOIDmode
1609 && (GET_CODE (next) == JUMP_INSN
1610 || find_conditional_protection (next, load_insn_bb)))
1611 return 1;
1613 return 0;
1614 } /* find_conditional_protection */
1616 /* Returns 1 if the same insn1 that participates in the computation
1617 of load_insn's address is feeding a conditional branch that is
1618 guarding on load_insn. This is true if we find a the two DEF-USE
1619 chains:
1620 insn1 -> ... -> conditional-branch
1621 insn1 -> ... -> load_insn,
1622 and if a flow path exist:
1623 insn1 -> ... -> conditional-branch -> ... -> load_insn,
1624 and if insn1 is on the path
1625 region-entry -> ... -> bb_trg -> ... load_insn.
1627 Locate insn1 by climbing on LOG_LINKS from load_insn.
1628 Locate the branch by following INSN_DEPEND from insn1. */
1630 static int
1631 is_conditionally_protected (load_insn, bb_src, bb_trg)
1632 rtx load_insn;
1633 int bb_src, bb_trg;
1635 rtx link;
1637 for (link = LOG_LINKS (load_insn); link; link = XEXP (link, 1))
1639 rtx insn1 = XEXP (link, 0);
1641 /* Must be a DEF-USE dependence upon non-branch. */
1642 if (GET_MODE (link) != VOIDmode
1643 || GET_CODE (insn1) == JUMP_INSN)
1644 continue;
1646 /* Must exist a path: region-entry -> ... -> bb_trg -> ... load_insn. */
1647 if (INSN_BB (insn1) == bb_src
1648 || (CONTAINING_RGN (BLOCK_NUM (insn1))
1649 != CONTAINING_RGN (BB_TO_BLOCK (bb_src)))
1650 || (!IS_REACHABLE (bb_trg, INSN_BB (insn1))
1651 && !IS_REACHABLE (INSN_BB (insn1), bb_trg)))
1652 continue;
1654 /* Now search for the conditional-branch. */
1655 if (find_conditional_protection (insn1, bb_src))
1656 return 1;
1658 /* Recursive step: search another insn1, "above" current insn1. */
1659 return is_conditionally_protected (insn1, bb_src, bb_trg);
1662 /* The chain does not exist. */
1663 return 0;
1664 } /* is_conditionally_protected */
1666 /* Returns 1 if a clue for "similar load" 'insn2' is found, and hence
1667 load_insn can move speculatively from bb_src to bb_trg. All the
1668 following must hold:
1670 (1) both loads have 1 base register (PFREE_CANDIDATEs).
1671 (2) load_insn and load1 have a def-use dependence upon
1672 the same insn 'insn1'.
1673 (3) either load2 is in bb_trg, or:
1674 - there's only one split-block, and
1675 - load1 is on the escape path, and
1677 From all these we can conclude that the two loads access memory
1678 addresses that differ at most by a constant, and hence if moving
1679 load_insn would cause an exception, it would have been caused by
1680 load2 anyhow. */
1682 static int
1683 is_pfree (load_insn, bb_src, bb_trg)
1684 rtx load_insn;
1685 int bb_src, bb_trg;
1687 rtx back_link;
1688 candidate *candp = candidate_table + bb_src;
1690 if (candp->split_bbs.nr_members != 1)
1691 /* Must have exactly one escape block. */
1692 return 0;
1694 for (back_link = LOG_LINKS (load_insn);
1695 back_link; back_link = XEXP (back_link, 1))
1697 rtx insn1 = XEXP (back_link, 0);
1699 if (GET_MODE (back_link) == VOIDmode)
1701 /* Found a DEF-USE dependence (insn1, load_insn). */
1702 rtx fore_link;
1704 for (fore_link = INSN_DEPEND (insn1);
1705 fore_link; fore_link = XEXP (fore_link, 1))
1707 rtx insn2 = XEXP (fore_link, 0);
1708 if (GET_MODE (fore_link) == VOIDmode)
1710 /* Found a DEF-USE dependence (insn1, insn2). */
1711 if (haifa_classify_insn (insn2) != PFREE_CANDIDATE)
1712 /* insn2 not guaranteed to be a 1 base reg load. */
1713 continue;
1715 if (INSN_BB (insn2) == bb_trg)
1716 /* insn2 is the similar load, in the target block. */
1717 return 1;
1719 if (*(candp->split_bbs.first_member) == BLOCK_NUM (insn2))
1720 /* insn2 is a similar load, in a split-block. */
1721 return 1;
1727 /* Couldn't find a similar load. */
1728 return 0;
1729 } /* is_pfree */
1731 /* Returns a class that insn with GET_DEST(insn)=x may belong to,
1732 as found by analyzing insn's expression. */
1734 static int
1735 may_trap_exp (x, is_store)
1736 rtx x;
1737 int is_store;
1739 enum rtx_code code;
1741 if (x == 0)
1742 return TRAP_FREE;
1743 code = GET_CODE (x);
1744 if (is_store)
1746 if (code == MEM && may_trap_p (x))
1747 return TRAP_RISKY;
1748 else
1749 return TRAP_FREE;
1751 if (code == MEM)
1753 /* The insn uses memory: a volatile load. */
1754 if (MEM_VOLATILE_P (x))
1755 return IRISKY;
1756 /* An exception-free load. */
1757 if (!may_trap_p (x))
1758 return IFREE;
1759 /* A load with 1 base register, to be further checked. */
1760 if (CONST_BASED_ADDRESS_P (XEXP (x, 0)))
1761 return PFREE_CANDIDATE;
1762 /* No info on the load, to be further checked. */
1763 return PRISKY_CANDIDATE;
1765 else
1767 const char *fmt;
1768 int i, insn_class = TRAP_FREE;
1770 /* Neither store nor load, check if it may cause a trap. */
1771 if (may_trap_p (x))
1772 return TRAP_RISKY;
1773 /* Recursive step: walk the insn... */
1774 fmt = GET_RTX_FORMAT (code);
1775 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1777 if (fmt[i] == 'e')
1779 int tmp_class = may_trap_exp (XEXP (x, i), is_store);
1780 insn_class = WORST_CLASS (insn_class, tmp_class);
1782 else if (fmt[i] == 'E')
1784 int j;
1785 for (j = 0; j < XVECLEN (x, i); j++)
1787 int tmp_class = may_trap_exp (XVECEXP (x, i, j), is_store);
1788 insn_class = WORST_CLASS (insn_class, tmp_class);
1789 if (insn_class == TRAP_RISKY || insn_class == IRISKY)
1790 break;
1793 if (insn_class == TRAP_RISKY || insn_class == IRISKY)
1794 break;
1796 return insn_class;
1800 /* Classifies insn for the purpose of verifying that it can be
1801 moved speculatively, by examining it's patterns, returning:
1802 TRAP_RISKY: store, or risky non-load insn (e.g. division by variable).
1803 TRAP_FREE: non-load insn.
1804 IFREE: load from a globaly safe location.
1805 IRISKY: volatile load.
1806 PFREE_CANDIDATE, PRISKY_CANDIDATE: load that need to be checked for
1807 being either PFREE or PRISKY. */
1809 static int
1810 haifa_classify_insn (insn)
1811 rtx insn;
1813 rtx pat = PATTERN (insn);
1814 int tmp_class = TRAP_FREE;
1815 int insn_class = TRAP_FREE;
1816 enum rtx_code code;
1818 if (GET_CODE (pat) == PARALLEL)
1820 int i, len = XVECLEN (pat, 0);
1822 for (i = len - 1; i >= 0; i--)
1824 code = GET_CODE (XVECEXP (pat, 0, i));
1825 switch (code)
1827 case CLOBBER:
1828 /* Test if it is a 'store'. */
1829 tmp_class = may_trap_exp (XEXP (XVECEXP (pat, 0, i), 0), 1);
1830 break;
1831 case SET:
1832 /* Test if it is a store. */
1833 tmp_class = may_trap_exp (SET_DEST (XVECEXP (pat, 0, i)), 1);
1834 if (tmp_class == TRAP_RISKY)
1835 break;
1836 /* Test if it is a load. */
1837 tmp_class
1838 = WORST_CLASS (tmp_class,
1839 may_trap_exp (SET_SRC (XVECEXP (pat, 0, i)),
1840 0));
1841 break;
1842 case COND_EXEC:
1843 case TRAP_IF:
1844 tmp_class = TRAP_RISKY;
1845 break;
1846 default:
1849 insn_class = WORST_CLASS (insn_class, tmp_class);
1850 if (insn_class == TRAP_RISKY || insn_class == IRISKY)
1851 break;
1854 else
1856 code = GET_CODE (pat);
1857 switch (code)
1859 case CLOBBER:
1860 /* Test if it is a 'store'. */
1861 tmp_class = may_trap_exp (XEXP (pat, 0), 1);
1862 break;
1863 case SET:
1864 /* Test if it is a store. */
1865 tmp_class = may_trap_exp (SET_DEST (pat), 1);
1866 if (tmp_class == TRAP_RISKY)
1867 break;
1868 /* Test if it is a load. */
1869 tmp_class =
1870 WORST_CLASS (tmp_class,
1871 may_trap_exp (SET_SRC (pat), 0));
1872 break;
1873 case COND_EXEC:
1874 case TRAP_IF:
1875 tmp_class = TRAP_RISKY;
1876 break;
1877 default:;
1879 insn_class = tmp_class;
1882 return insn_class;
1885 /* Return 1 if load_insn is prisky (i.e. if load_insn is fed by
1886 a load moved speculatively, or if load_insn is protected by
1887 a compare on load_insn's address). */
1889 static int
1890 is_prisky (load_insn, bb_src, bb_trg)
1891 rtx load_insn;
1892 int bb_src, bb_trg;
1894 if (FED_BY_SPEC_LOAD (load_insn))
1895 return 1;
1897 if (LOG_LINKS (load_insn) == NULL)
1898 /* Dependence may 'hide' out of the region. */
1899 return 1;
1901 if (is_conditionally_protected (load_insn, bb_src, bb_trg))
1902 return 1;
1904 return 0;
1907 /* Insn is a candidate to be moved speculatively from bb_src to bb_trg.
1908 Return 1 if insn is exception-free (and the motion is valid)
1909 and 0 otherwise. */
1911 static int
1912 is_exception_free (insn, bb_src, bb_trg)
1913 rtx insn;
1914 int bb_src, bb_trg;
1916 int insn_class = haifa_classify_insn (insn);
1918 /* Handle non-load insns. */
1919 switch (insn_class)
1921 case TRAP_FREE:
1922 return 1;
1923 case TRAP_RISKY:
1924 return 0;
1925 default:;
1928 /* Handle loads. */
1929 if (!flag_schedule_speculative_load)
1930 return 0;
1931 IS_LOAD_INSN (insn) = 1;
1932 switch (insn_class)
1934 case IFREE:
1935 return (1);
1936 case IRISKY:
1937 return 0;
1938 case PFREE_CANDIDATE:
1939 if (is_pfree (insn, bb_src, bb_trg))
1940 return 1;
1941 /* Don't 'break' here: PFREE-candidate is also PRISKY-candidate. */
1942 case PRISKY_CANDIDATE:
1943 if (!flag_schedule_speculative_load_dangerous
1944 || is_prisky (insn, bb_src, bb_trg))
1945 return 0;
1946 break;
1947 default:;
1950 return flag_schedule_speculative_load_dangerous;
1953 /* The number of insns from the current block scheduled so far. */
1954 static int sched_target_n_insns;
1955 /* The number of insns from the current block to be scheduled in total. */
1956 static int target_n_insns;
1957 /* The number of insns from the entire region scheduled so far. */
1958 static int sched_n_insns;
1959 /* Nonzero if the last scheduled insn was a jump. */
1960 static int last_was_jump;
1962 /* Implementations of the sched_info functions for region scheduling. */
1963 static void init_ready_list PARAMS ((struct ready_list *));
1964 static int can_schedule_ready_p PARAMS ((rtx));
1965 static int new_ready PARAMS ((rtx));
1966 static int schedule_more_p PARAMS ((void));
1967 static const char *rgn_print_insn PARAMS ((rtx, int));
1968 static int rgn_rank PARAMS ((rtx, rtx));
1969 static int contributes_to_priority PARAMS ((rtx, rtx));
1970 static void compute_jump_reg_dependencies PARAMS ((rtx, regset));
1972 /* Return nonzero if there are more insns that should be scheduled. */
1974 static int
1975 schedule_more_p ()
1977 return ! last_was_jump && sched_target_n_insns < target_n_insns;
1980 /* Add all insns that are initially ready to the ready list READY. Called
1981 once before scheduling a set of insns. */
1983 static void
1984 init_ready_list (ready)
1985 struct ready_list *ready;
1987 rtx prev_head = current_sched_info->prev_head;
1988 rtx next_tail = current_sched_info->next_tail;
1989 int bb_src;
1990 rtx insn;
1992 target_n_insns = 0;
1993 sched_target_n_insns = 0;
1994 sched_n_insns = 0;
1995 last_was_jump = 0;
1997 /* Print debugging information. */
1998 if (sched_verbose >= 5)
1999 debug_dependencies ();
2001 /* Prepare current target block info. */
2002 if (current_nr_blocks > 1)
2004 candidate_table = (candidate *) xmalloc (current_nr_blocks
2005 * sizeof (candidate));
2007 bblst_last = 0;
2008 /* bblst_table holds split blocks and update blocks for each block after
2009 the current one in the region. split blocks and update blocks are
2010 the TO blocks of region edges, so there can be at most rgn_nr_edges
2011 of them. */
2012 bblst_size = (current_nr_blocks - target_bb) * rgn_nr_edges;
2013 bblst_table = (int *) xmalloc (bblst_size * sizeof (int));
2015 bitlst_table_last = 0;
2016 bitlst_table_size = rgn_nr_edges;
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 rtx next;
2028 if (! INSN_P (insn))
2029 continue;
2030 next = NEXT_INSN (insn);
2032 if (INSN_DEP_COUNT (insn) == 0
2033 && (! INSN_P (next) || SCHED_GROUP_P (next) == 0))
2034 ready_add (ready, insn);
2035 if (!(SCHED_GROUP_P (insn)))
2036 target_n_insns++;
2039 /* Add to ready list all 'ready' insns in valid source blocks.
2040 For speculative insns, check-live, exception-free, and
2041 issue-delay. */
2042 for (bb_src = target_bb + 1; bb_src < current_nr_blocks; bb_src++)
2043 if (IS_VALID (bb_src))
2045 rtx src_head;
2046 rtx src_next_tail;
2047 rtx tail, head;
2049 get_block_head_tail (BB_TO_BLOCK (bb_src), &head, &tail);
2050 src_next_tail = NEXT_INSN (tail);
2051 src_head = head;
2053 for (insn = src_head; insn != src_next_tail; insn = NEXT_INSN (insn))
2055 if (! INSN_P (insn))
2056 continue;
2058 if (!CANT_MOVE (insn)
2059 && (!IS_SPECULATIVE_INSN (insn)
2060 || ((((!targetm.sched.use_dfa_pipeline_interface
2061 || !(*targetm.sched.use_dfa_pipeline_interface) ())
2062 && insn_issue_delay (insn) <= 3)
2063 || (targetm.sched.use_dfa_pipeline_interface
2064 && (*targetm.sched.use_dfa_pipeline_interface) ()
2065 && (recog_memoized (insn) < 0
2066 || min_insn_conflict_delay (curr_state,
2067 insn, insn) <= 3)))
2068 && check_live (insn, bb_src)
2069 && is_exception_free (insn, bb_src, target_bb))))
2071 rtx next;
2073 /* Note that we haven't squirreled away the notes for
2074 blocks other than the current. So if this is a
2075 speculative insn, NEXT might otherwise be a note. */
2076 next = next_nonnote_insn (insn);
2077 if (INSN_DEP_COUNT (insn) == 0
2078 && (! next
2079 || ! INSN_P (next)
2080 || SCHED_GROUP_P (next) == 0))
2081 ready_add (ready, insn);
2087 /* Called after taking INSN from the ready list. Returns nonzero if this
2088 insn can be scheduled, nonzero if we should silently discard it. */
2090 static int
2091 can_schedule_ready_p (insn)
2092 rtx insn;
2094 if (GET_CODE (insn) == JUMP_INSN)
2095 last_was_jump = 1;
2097 /* An interblock motion? */
2098 if (INSN_BB (insn) != target_bb)
2100 rtx temp;
2101 basic_block b1;
2103 if (IS_SPECULATIVE_INSN (insn))
2105 if (!check_live (insn, INSN_BB (insn)))
2106 return 0;
2107 update_live (insn, INSN_BB (insn));
2109 /* For speculative load, mark insns fed by it. */
2110 if (IS_LOAD_INSN (insn) || FED_BY_SPEC_LOAD (insn))
2111 set_spec_fed (insn);
2113 nr_spec++;
2115 nr_inter++;
2117 /* Find the beginning of the scheduling group. */
2118 /* ??? Ought to update basic block here, but later bits of
2119 schedule_block assumes the original insn block is
2120 still intact. */
2122 temp = insn;
2123 while (SCHED_GROUP_P (temp))
2124 temp = PREV_INSN (temp);
2126 /* Update source block boundaries. */
2127 b1 = BLOCK_FOR_INSN (temp);
2128 if (temp == b1->head && insn == b1->end)
2130 /* We moved all the insns in the basic block.
2131 Emit a note after the last insn and update the
2132 begin/end boundaries to point to the note. */
2133 rtx note = emit_note_after (NOTE_INSN_DELETED, insn);
2134 b1->head = note;
2135 b1->end = note;
2137 else if (insn == b1->end)
2139 /* We took insns from the end of the basic block,
2140 so update the end of block boundary so that it
2141 points to the first insn we did not move. */
2142 b1->end = PREV_INSN (temp);
2144 else if (temp == b1->head)
2146 /* We took insns from the start of the basic block,
2147 so update the start of block boundary so that
2148 it points to the first insn we did not move. */
2149 b1->head = NEXT_INSN (insn);
2152 else
2154 /* In block motion. */
2155 sched_target_n_insns++;
2157 sched_n_insns++;
2159 return 1;
2162 /* Called after INSN has all its dependencies resolved. Return nonzero
2163 if it should be moved to the ready list or the queue, or zero if we
2164 should silently discard it. */
2165 static int
2166 new_ready (next)
2167 rtx next;
2169 /* For speculative insns, before inserting to ready/queue,
2170 check live, exception-free, and issue-delay. */
2171 if (INSN_BB (next) != target_bb
2172 && (!IS_VALID (INSN_BB (next))
2173 || CANT_MOVE (next)
2174 || (IS_SPECULATIVE_INSN (next)
2175 && (0
2176 || (targetm.sched.use_dfa_pipeline_interface
2177 && (*targetm.sched.use_dfa_pipeline_interface) ()
2178 && recog_memoized (next) >= 0
2179 && min_insn_conflict_delay (curr_state, next,
2180 next) > 3)
2181 || ((!targetm.sched.use_dfa_pipeline_interface
2182 || !(*targetm.sched.use_dfa_pipeline_interface) ())
2183 && insn_issue_delay (next) > 3)
2184 || !check_live (next, INSN_BB (next))
2185 || !is_exception_free (next, INSN_BB (next), target_bb)))))
2186 return 0;
2187 return 1;
2190 /* Return a string that contains the insn uid and optionally anything else
2191 necessary to identify this insn in an output. It's valid to use a
2192 static buffer for this. The ALIGNED parameter should cause the string
2193 to be formatted so that multiple output lines will line up nicely. */
2195 static const char *
2196 rgn_print_insn (insn, aligned)
2197 rtx insn;
2198 int aligned;
2200 static char tmp[80];
2202 if (aligned)
2203 sprintf (tmp, "b%3d: i%4d", INSN_BB (insn), INSN_UID (insn));
2204 else
2206 if (current_nr_blocks > 1 && INSN_BB (insn) != target_bb)
2207 sprintf (tmp, "%d/b%d", INSN_UID (insn), INSN_BB (insn));
2208 else
2209 sprintf (tmp, "%d", INSN_UID (insn));
2211 return tmp;
2214 /* Compare priority of two insns. Return a positive number if the second
2215 insn is to be preferred for scheduling, and a negative one if the first
2216 is to be preferred. Zero if they are equally good. */
2218 static int
2219 rgn_rank (insn1, insn2)
2220 rtx insn1, insn2;
2222 /* Some comparison make sense in interblock scheduling only. */
2223 if (INSN_BB (insn1) != INSN_BB (insn2))
2225 int spec_val, prob_val;
2227 /* Prefer an inblock motion on an interblock motion. */
2228 if ((INSN_BB (insn2) == target_bb) && (INSN_BB (insn1) != target_bb))
2229 return 1;
2230 if ((INSN_BB (insn1) == target_bb) && (INSN_BB (insn2) != target_bb))
2231 return -1;
2233 /* Prefer a useful motion on a speculative one. */
2234 spec_val = IS_SPECULATIVE_INSN (insn1) - IS_SPECULATIVE_INSN (insn2);
2235 if (spec_val)
2236 return spec_val;
2238 /* Prefer a more probable (speculative) insn. */
2239 prob_val = INSN_PROBABILITY (insn2) - INSN_PROBABILITY (insn1);
2240 if (prob_val)
2241 return prob_val;
2243 return 0;
2246 /* NEXT is an instruction that depends on INSN (a backward dependence);
2247 return nonzero if we should include this dependence in priority
2248 calculations. */
2250 static int
2251 contributes_to_priority (next, insn)
2252 rtx next, insn;
2254 return BLOCK_NUM (next) == BLOCK_NUM (insn);
2257 /* INSN is a JUMP_INSN. Store the set of registers that must be considered
2258 to be set by this jump in SET. */
2260 static void
2261 compute_jump_reg_dependencies (insn, set)
2262 rtx insn ATTRIBUTE_UNUSED;
2263 regset set ATTRIBUTE_UNUSED;
2265 /* Nothing to do here, since we postprocess jumps in
2266 add_branch_dependences. */
2269 /* Used in schedule_insns to initialize current_sched_info for scheduling
2270 regions (or single basic blocks). */
2272 static struct sched_info region_sched_info =
2274 init_ready_list,
2275 can_schedule_ready_p,
2276 schedule_more_p,
2277 new_ready,
2278 rgn_rank,
2279 rgn_print_insn,
2280 contributes_to_priority,
2281 compute_jump_reg_dependencies,
2283 NULL, NULL,
2284 NULL, NULL,
2285 0, 0
2288 /* Determine if PAT sets a CLASS_LIKELY_SPILLED_P register. */
2290 static bool
2291 sets_likely_spilled (pat)
2292 rtx pat;
2294 bool ret = false;
2295 note_stores (pat, sets_likely_spilled_1, &ret);
2296 return ret;
2299 static void
2300 sets_likely_spilled_1 (x, pat, data)
2301 rtx x, pat;
2302 void *data;
2304 bool *ret = (bool *) data;
2306 if (GET_CODE (pat) == SET
2307 && REG_P (x)
2308 && REGNO (x) < FIRST_PSEUDO_REGISTER
2309 && CLASS_LIKELY_SPILLED_P (REGNO_REG_CLASS (REGNO (x))))
2310 *ret = true;
2313 /* Add dependences so that branches are scheduled to run last in their
2314 block. */
2316 static void
2317 add_branch_dependences (head, tail)
2318 rtx head, tail;
2320 rtx insn, last;
2322 /* For all branches, calls, uses, clobbers, cc0 setters, and instructions
2323 that can throw exceptions, force them to remain in order at the end of
2324 the block by adding dependencies and giving the last a high priority.
2325 There may be notes present, and prev_head may also be a note.
2327 Branches must obviously remain at the end. Calls should remain at the
2328 end since moving them results in worse register allocation. Uses remain
2329 at the end to ensure proper register allocation.
2331 cc0 setters remaim at the end because they can't be moved away from
2332 their cc0 user.
2334 Insns setting CLASS_LIKELY_SPILLED_P registers (usually return values)
2335 are not moved before reload because we can wind up with register
2336 allocation failures. */
2338 insn = tail;
2339 last = 0;
2340 while (GET_CODE (insn) == CALL_INSN
2341 || GET_CODE (insn) == JUMP_INSN
2342 || (GET_CODE (insn) == INSN
2343 && (GET_CODE (PATTERN (insn)) == USE
2344 || GET_CODE (PATTERN (insn)) == CLOBBER
2345 || can_throw_internal (insn)
2346 #ifdef HAVE_cc0
2347 || sets_cc0_p (PATTERN (insn))
2348 #endif
2349 || (!reload_completed
2350 && sets_likely_spilled (PATTERN (insn)))))
2351 || GET_CODE (insn) == NOTE)
2353 if (GET_CODE (insn) != NOTE)
2355 if (last != 0 && !find_insn_list (insn, LOG_LINKS (last)))
2357 add_dependence (last, insn, REG_DEP_ANTI);
2358 INSN_REF_COUNT (insn)++;
2361 CANT_MOVE (insn) = 1;
2363 last = insn;
2364 /* Skip over insns that are part of a group.
2365 Make each insn explicitly depend on the previous insn.
2366 This ensures that only the group header will ever enter
2367 the ready queue (and, when scheduled, will automatically
2368 schedule the SCHED_GROUP_P block). */
2369 while (SCHED_GROUP_P (insn))
2371 rtx temp = prev_nonnote_insn (insn);
2372 add_dependence (insn, temp, REG_DEP_ANTI);
2373 insn = temp;
2377 /* Don't overrun the bounds of the basic block. */
2378 if (insn == head)
2379 break;
2381 insn = PREV_INSN (insn);
2384 /* Make sure these insns are scheduled last in their block. */
2385 insn = last;
2386 if (insn != 0)
2387 while (insn != head)
2389 insn = prev_nonnote_insn (insn);
2391 if (INSN_REF_COUNT (insn) != 0)
2392 continue;
2394 add_dependence (last, insn, REG_DEP_ANTI);
2395 INSN_REF_COUNT (insn) = 1;
2397 /* Skip over insns that are part of a group. */
2398 while (SCHED_GROUP_P (insn))
2399 insn = prev_nonnote_insn (insn);
2403 /* Data structures for the computation of data dependences in a regions. We
2404 keep one `deps' structure for every basic block. Before analyzing the
2405 data dependences for a bb, its variables are initialized as a function of
2406 the variables of its predecessors. When the analysis for a bb completes,
2407 we save the contents to the corresponding bb_deps[bb] variable. */
2409 static struct deps *bb_deps;
2411 /* Duplicate the INSN_LIST elements of COPY and prepend them to OLD. */
2413 static rtx
2414 concat_INSN_LIST (copy, old)
2415 rtx copy, old;
2417 rtx new = old;
2418 for (; copy ; copy = XEXP (copy, 1))
2419 new = alloc_INSN_LIST (XEXP (copy, 0), new);
2420 return new;
2423 static void
2424 concat_insn_mem_list (copy_insns, copy_mems, old_insns_p, old_mems_p)
2425 rtx copy_insns, copy_mems;
2426 rtx *old_insns_p, *old_mems_p;
2428 rtx new_insns = *old_insns_p;
2429 rtx new_mems = *old_mems_p;
2431 while (copy_insns)
2433 new_insns = alloc_INSN_LIST (XEXP (copy_insns, 0), new_insns);
2434 new_mems = alloc_EXPR_LIST (VOIDmode, XEXP (copy_mems, 0), new_mems);
2435 copy_insns = XEXP (copy_insns, 1);
2436 copy_mems = XEXP (copy_mems, 1);
2439 *old_insns_p = new_insns;
2440 *old_mems_p = new_mems;
2443 /* After computing the dependencies for block BB, propagate the dependencies
2444 found in TMP_DEPS to the successors of the block. */
2445 static void
2446 propagate_deps (bb, pred_deps)
2447 int bb;
2448 struct deps *pred_deps;
2450 int b = BB_TO_BLOCK (bb);
2451 int e, first_edge;
2453 /* bb's structures are inherited by its successors. */
2454 first_edge = e = OUT_EDGES (b);
2455 if (e > 0)
2458 int b_succ = TO_BLOCK (e);
2459 int bb_succ = BLOCK_TO_BB (b_succ);
2460 struct deps *succ_deps = bb_deps + bb_succ;
2461 int reg;
2463 /* Only bbs "below" bb, in the same region, are interesting. */
2464 if (CONTAINING_RGN (b) != CONTAINING_RGN (b_succ)
2465 || bb_succ <= bb)
2467 e = NEXT_OUT (e);
2468 continue;
2471 /* The reg_last lists are inherited by bb_succ. */
2472 EXECUTE_IF_SET_IN_REG_SET (&pred_deps->reg_last_in_use, 0, reg,
2474 struct deps_reg *pred_rl = &pred_deps->reg_last[reg];
2475 struct deps_reg *succ_rl = &succ_deps->reg_last[reg];
2477 succ_rl->uses = concat_INSN_LIST (pred_rl->uses, succ_rl->uses);
2478 succ_rl->sets = concat_INSN_LIST (pred_rl->sets, succ_rl->sets);
2479 succ_rl->clobbers = concat_INSN_LIST (pred_rl->clobbers,
2480 succ_rl->clobbers);
2481 succ_rl->uses_length += pred_rl->uses_length;
2482 succ_rl->clobbers_length += pred_rl->clobbers_length;
2484 IOR_REG_SET (&succ_deps->reg_last_in_use, &pred_deps->reg_last_in_use);
2486 /* Mem read/write lists are inherited by bb_succ. */
2487 concat_insn_mem_list (pred_deps->pending_read_insns,
2488 pred_deps->pending_read_mems,
2489 &succ_deps->pending_read_insns,
2490 &succ_deps->pending_read_mems);
2491 concat_insn_mem_list (pred_deps->pending_write_insns,
2492 pred_deps->pending_write_mems,
2493 &succ_deps->pending_write_insns,
2494 &succ_deps->pending_write_mems);
2496 succ_deps->last_pending_memory_flush
2497 = concat_INSN_LIST (pred_deps->last_pending_memory_flush,
2498 succ_deps->last_pending_memory_flush);
2500 succ_deps->pending_lists_length += pred_deps->pending_lists_length;
2501 succ_deps->pending_flush_length += pred_deps->pending_flush_length;
2503 /* last_function_call is inherited by bb_succ. */
2504 succ_deps->last_function_call
2505 = concat_INSN_LIST (pred_deps->last_function_call,
2506 succ_deps->last_function_call);
2508 /* sched_before_next_call is inherited by bb_succ. */
2509 succ_deps->sched_before_next_call
2510 = concat_INSN_LIST (pred_deps->sched_before_next_call,
2511 succ_deps->sched_before_next_call);
2513 e = NEXT_OUT (e);
2515 while (e != first_edge);
2517 /* These lists should point to the right place, for correct
2518 freeing later. */
2519 bb_deps[bb].pending_read_insns = pred_deps->pending_read_insns;
2520 bb_deps[bb].pending_read_mems = pred_deps->pending_read_mems;
2521 bb_deps[bb].pending_write_insns = pred_deps->pending_write_insns;
2522 bb_deps[bb].pending_write_mems = pred_deps->pending_write_mems;
2524 /* Can't allow these to be freed twice. */
2525 pred_deps->pending_read_insns = 0;
2526 pred_deps->pending_read_mems = 0;
2527 pred_deps->pending_write_insns = 0;
2528 pred_deps->pending_write_mems = 0;
2531 /* Compute backward dependences inside bb. In a multiple blocks region:
2532 (1) a bb is analyzed after its predecessors, and (2) the lists in
2533 effect at the end of bb (after analyzing for bb) are inherited by
2534 bb's successrs.
2536 Specifically for reg-reg data dependences, the block insns are
2537 scanned by sched_analyze () top-to-bottom. Two lists are
2538 maintained by sched_analyze (): reg_last[].sets for register DEFs,
2539 and reg_last[].uses for register USEs.
2541 When analysis is completed for bb, we update for its successors:
2542 ; - DEFS[succ] = Union (DEFS [succ], DEFS [bb])
2543 ; - USES[succ] = Union (USES [succ], DEFS [bb])
2545 The mechanism for computing mem-mem data dependence is very
2546 similar, and the result is interblock dependences in the region. */
2548 static void
2549 compute_block_backward_dependences (bb)
2550 int bb;
2552 rtx head, tail;
2553 struct deps tmp_deps;
2555 tmp_deps = bb_deps[bb];
2557 /* Do the analysis for this block. */
2558 get_block_head_tail (BB_TO_BLOCK (bb), &head, &tail);
2559 sched_analyze (&tmp_deps, head, tail);
2560 add_branch_dependences (head, tail);
2562 if (current_nr_blocks > 1)
2563 propagate_deps (bb, &tmp_deps);
2565 /* Free up the INSN_LISTs. */
2566 free_deps (&tmp_deps);
2569 /* Remove all INSN_LISTs and EXPR_LISTs from the pending lists and add
2570 them to the unused_*_list variables, so that they can be reused. */
2572 static void
2573 free_pending_lists ()
2575 int bb;
2577 for (bb = 0; bb < current_nr_blocks; bb++)
2579 free_INSN_LIST_list (&bb_deps[bb].pending_read_insns);
2580 free_INSN_LIST_list (&bb_deps[bb].pending_write_insns);
2581 free_EXPR_LIST_list (&bb_deps[bb].pending_read_mems);
2582 free_EXPR_LIST_list (&bb_deps[bb].pending_write_mems);
2586 /* Print dependences for debugging, callable from debugger. */
2588 void
2589 debug_dependencies ()
2591 int bb;
2593 fprintf (sched_dump, ";; --------------- forward dependences: ------------ \n");
2594 for (bb = 0; bb < current_nr_blocks; bb++)
2596 if (1)
2598 rtx head, tail;
2599 rtx next_tail;
2600 rtx insn;
2602 get_block_head_tail (BB_TO_BLOCK (bb), &head, &tail);
2603 next_tail = NEXT_INSN (tail);
2604 fprintf (sched_dump, "\n;; --- Region Dependences --- b %d bb %d \n",
2605 BB_TO_BLOCK (bb), bb);
2607 if (targetm.sched.use_dfa_pipeline_interface
2608 && (*targetm.sched.use_dfa_pipeline_interface) ())
2610 fprintf (sched_dump, ";; %7s%6s%6s%6s%6s%6s%14s\n",
2611 "insn", "code", "bb", "dep", "prio", "cost",
2612 "reservation");
2613 fprintf (sched_dump, ";; %7s%6s%6s%6s%6s%6s%14s\n",
2614 "----", "----", "--", "---", "----", "----",
2615 "-----------");
2617 else
2619 fprintf (sched_dump, ";; %7s%6s%6s%6s%6s%6s%11s%6s\n",
2620 "insn", "code", "bb", "dep", "prio", "cost", "blockage", "units");
2621 fprintf (sched_dump, ";; %7s%6s%6s%6s%6s%6s%11s%6s\n",
2622 "----", "----", "--", "---", "----", "----", "--------", "-----");
2625 for (insn = head; insn != next_tail; insn = NEXT_INSN (insn))
2627 rtx link;
2629 if (! INSN_P (insn))
2631 int n;
2632 fprintf (sched_dump, ";; %6d ", INSN_UID (insn));
2633 if (GET_CODE (insn) == NOTE)
2635 n = NOTE_LINE_NUMBER (insn);
2636 if (n < 0)
2637 fprintf (sched_dump, "%s\n", GET_NOTE_INSN_NAME (n));
2638 else
2639 fprintf (sched_dump, "line %d, file %s\n", n,
2640 NOTE_SOURCE_FILE (insn));
2642 else
2643 fprintf (sched_dump, " {%s}\n", GET_RTX_NAME (GET_CODE (insn)));
2644 continue;
2647 if (targetm.sched.use_dfa_pipeline_interface
2648 && (*targetm.sched.use_dfa_pipeline_interface) ())
2650 fprintf (sched_dump,
2651 ";; %s%5d%6d%6d%6d%6d%6d ",
2652 (SCHED_GROUP_P (insn) ? "+" : " "),
2653 INSN_UID (insn),
2654 INSN_CODE (insn),
2655 INSN_BB (insn),
2656 INSN_DEP_COUNT (insn),
2657 INSN_PRIORITY (insn),
2658 insn_cost (insn, 0, 0));
2660 if (recog_memoized (insn) < 0)
2661 fprintf (sched_dump, "nothing");
2662 else
2663 print_reservation (sched_dump, insn);
2665 else
2667 int unit = insn_unit (insn);
2668 int range
2669 = (unit < 0
2670 || function_units[unit].blockage_range_function == 0
2672 : function_units[unit].blockage_range_function (insn));
2673 fprintf (sched_dump,
2674 ";; %s%5d%6d%6d%6d%6d%6d %3d -%3d ",
2675 (SCHED_GROUP_P (insn) ? "+" : " "),
2676 INSN_UID (insn),
2677 INSN_CODE (insn),
2678 INSN_BB (insn),
2679 INSN_DEP_COUNT (insn),
2680 INSN_PRIORITY (insn),
2681 insn_cost (insn, 0, 0),
2682 (int) MIN_BLOCKAGE_COST (range),
2683 (int) MAX_BLOCKAGE_COST (range));
2684 insn_print_units (insn);
2687 fprintf (sched_dump, "\t: ");
2688 for (link = INSN_DEPEND (insn); link; link = XEXP (link, 1))
2689 fprintf (sched_dump, "%d ", INSN_UID (XEXP (link, 0)));
2690 fprintf (sched_dump, "\n");
2694 fprintf (sched_dump, "\n");
2697 /* Schedule a region. A region is either an inner loop, a loop-free
2698 subroutine, or a single basic block. Each bb in the region is
2699 scheduled after its flow predecessors. */
2701 static void
2702 schedule_region (rgn)
2703 int rgn;
2705 int bb;
2706 int rgn_n_insns = 0;
2707 int sched_rgn_n_insns = 0;
2709 /* Set variables for the current region. */
2710 current_nr_blocks = RGN_NR_BLOCKS (rgn);
2711 current_blocks = RGN_BLOCKS (rgn);
2713 init_deps_global ();
2715 /* Initializations for region data dependence analyisis. */
2716 bb_deps = (struct deps *) xmalloc (sizeof (struct deps) * current_nr_blocks);
2717 for (bb = 0; bb < current_nr_blocks; bb++)
2718 init_deps (bb_deps + bb);
2720 /* Compute LOG_LINKS. */
2721 for (bb = 0; bb < current_nr_blocks; bb++)
2722 compute_block_backward_dependences (bb);
2724 /* Compute INSN_DEPEND. */
2725 for (bb = current_nr_blocks - 1; bb >= 0; bb--)
2727 rtx head, tail;
2728 get_block_head_tail (BB_TO_BLOCK (bb), &head, &tail);
2730 compute_forward_dependences (head, tail);
2733 /* Set priorities. */
2734 for (bb = 0; bb < current_nr_blocks; bb++)
2736 rtx head, tail;
2737 get_block_head_tail (BB_TO_BLOCK (bb), &head, &tail);
2739 rgn_n_insns += set_priorities (head, tail);
2742 /* Compute interblock info: probabilities, split-edges, dominators, etc. */
2743 if (current_nr_blocks > 1)
2745 int i;
2747 prob = (float *) xmalloc ((current_nr_blocks) * sizeof (float));
2749 dom = sbitmap_vector_alloc (current_nr_blocks, current_nr_blocks);
2750 sbitmap_vector_zero (dom, current_nr_blocks);
2751 /* Edge to bit. */
2752 rgn_nr_edges = 0;
2753 edge_to_bit = (int *) xmalloc (nr_edges * sizeof (int));
2754 for (i = 1; i < nr_edges; i++)
2755 if (CONTAINING_RGN (FROM_BLOCK (i)) == rgn)
2756 EDGE_TO_BIT (i) = rgn_nr_edges++;
2757 rgn_edges = (int *) xmalloc (rgn_nr_edges * sizeof (int));
2759 rgn_nr_edges = 0;
2760 for (i = 1; i < nr_edges; i++)
2761 if (CONTAINING_RGN (FROM_BLOCK (i)) == (rgn))
2762 rgn_edges[rgn_nr_edges++] = i;
2764 /* Split edges. */
2765 pot_split = sbitmap_vector_alloc (current_nr_blocks, rgn_nr_edges);
2766 sbitmap_vector_zero (pot_split, current_nr_blocks);
2767 ancestor_edges = sbitmap_vector_alloc (current_nr_blocks, rgn_nr_edges);
2768 sbitmap_vector_zero (ancestor_edges, current_nr_blocks);
2770 /* Compute probabilities, dominators, split_edges. */
2771 for (bb = 0; bb < current_nr_blocks; bb++)
2772 compute_dom_prob_ps (bb);
2775 /* Now we can schedule all blocks. */
2776 for (bb = 0; bb < current_nr_blocks; bb++)
2778 rtx head, tail;
2779 int b = BB_TO_BLOCK (bb);
2781 get_block_head_tail (b, &head, &tail);
2783 if (no_real_insns_p (head, tail))
2784 continue;
2786 current_sched_info->prev_head = PREV_INSN (head);
2787 current_sched_info->next_tail = NEXT_INSN (tail);
2789 if (write_symbols != NO_DEBUG)
2791 save_line_notes (b, head, tail);
2792 rm_line_notes (head, tail);
2795 /* rm_other_notes only removes notes which are _inside_ the
2796 block---that is, it won't remove notes before the first real insn
2797 or after the last real insn of the block. So if the first insn
2798 has a REG_SAVE_NOTE which would otherwise be emitted before the
2799 insn, it is redundant with the note before the start of the
2800 block, and so we have to take it out. */
2801 if (INSN_P (head))
2803 rtx note;
2805 for (note = REG_NOTES (head); note; note = XEXP (note, 1))
2806 if (REG_NOTE_KIND (note) == REG_SAVE_NOTE)
2808 remove_note (head, note);
2809 note = XEXP (note, 1);
2810 remove_note (head, note);
2814 /* Remove remaining note insns from the block, save them in
2815 note_list. These notes are restored at the end of
2816 schedule_block (). */
2817 rm_other_notes (head, tail);
2819 target_bb = bb;
2821 current_sched_info->queue_must_finish_empty
2822 = current_nr_blocks > 1 && !flag_schedule_interblock;
2824 schedule_block (b, rgn_n_insns);
2825 sched_rgn_n_insns += sched_n_insns;
2827 /* Update target block boundaries. */
2828 if (head == BLOCK_HEAD (b))
2829 BLOCK_HEAD (b) = current_sched_info->head;
2830 if (tail == BLOCK_END (b))
2831 BLOCK_END (b) = current_sched_info->tail;
2833 /* Clean up. */
2834 if (current_nr_blocks > 1)
2836 free (candidate_table);
2837 free (bblst_table);
2838 free (bitlst_table);
2842 /* Sanity check: verify that all region insns were scheduled. */
2843 if (sched_rgn_n_insns != rgn_n_insns)
2844 abort ();
2846 /* Restore line notes. */
2847 if (write_symbols != NO_DEBUG)
2849 for (bb = 0; bb < current_nr_blocks; bb++)
2851 rtx head, tail;
2852 get_block_head_tail (BB_TO_BLOCK (bb), &head, &tail);
2853 restore_line_notes (head, tail);
2857 /* Done with this region. */
2858 free_pending_lists ();
2860 finish_deps_global ();
2862 free (bb_deps);
2864 if (current_nr_blocks > 1)
2866 free (prob);
2867 sbitmap_vector_free (dom);
2868 sbitmap_vector_free (pot_split);
2869 sbitmap_vector_free (ancestor_edges);
2870 free (edge_to_bit);
2871 free (rgn_edges);
2875 /* Indexed by region, holds the number of death notes found in that region.
2876 Used for consistency checks. */
2877 static int *deaths_in_region;
2879 /* Initialize data structures for region scheduling. */
2881 static void
2882 init_regions ()
2884 sbitmap blocks;
2885 int rgn;
2887 nr_regions = 0;
2888 rgn_table = (region *) xmalloc ((n_basic_blocks) * sizeof (region));
2889 rgn_bb_table = (int *) xmalloc ((n_basic_blocks) * sizeof (int));
2890 block_to_bb = (int *) xmalloc ((last_basic_block) * sizeof (int));
2891 containing_rgn = (int *) xmalloc ((last_basic_block) * sizeof (int));
2893 /* Compute regions for scheduling. */
2894 if (reload_completed
2895 || n_basic_blocks == 1
2896 || !flag_schedule_interblock)
2898 find_single_block_region ();
2900 else
2902 /* Verify that a 'good' control flow graph can be built. */
2903 if (is_cfg_nonregular ())
2905 find_single_block_region ();
2907 else
2909 dominance_info dom;
2910 struct edge_list *edge_list;
2912 /* The scheduler runs after flow; therefore, we can't blindly call
2913 back into find_basic_blocks since doing so could invalidate the
2914 info in global_live_at_start.
2916 Consider a block consisting entirely of dead stores; after life
2917 analysis it would be a block of NOTE_INSN_DELETED notes. If
2918 we call find_basic_blocks again, then the block would be removed
2919 entirely and invalidate our the register live information.
2921 We could (should?) recompute register live information. Doing
2922 so may even be beneficial. */
2923 edge_list = create_edge_list ();
2925 /* Compute the dominators and post dominators. */
2926 dom = calculate_dominance_info (CDI_DOMINATORS);
2928 /* build_control_flow will return nonzero if it detects unreachable
2929 blocks or any other irregularity with the cfg which prevents
2930 cross block scheduling. */
2931 if (build_control_flow (edge_list) != 0)
2932 find_single_block_region ();
2933 else
2934 find_rgns (edge_list, dom);
2936 if (sched_verbose >= 3)
2937 debug_regions ();
2939 /* We are done with flow's edge list. */
2940 free_edge_list (edge_list);
2942 /* For now. This will move as more and more of haifa is converted
2943 to using the cfg code in flow.c. */
2944 free_dominance_info (dom);
2949 if (CHECK_DEAD_NOTES)
2951 blocks = sbitmap_alloc (last_basic_block);
2952 deaths_in_region = (int *) xmalloc (sizeof (int) * nr_regions);
2953 /* Remove all death notes from the subroutine. */
2954 for (rgn = 0; rgn < nr_regions; rgn++)
2956 int b;
2958 sbitmap_zero (blocks);
2959 for (b = RGN_NR_BLOCKS (rgn) - 1; b >= 0; --b)
2960 SET_BIT (blocks, rgn_bb_table[RGN_BLOCKS (rgn) + b]);
2962 deaths_in_region[rgn] = count_or_remove_death_notes (blocks, 1);
2964 sbitmap_free (blocks);
2966 else
2967 count_or_remove_death_notes (NULL, 1);
2970 /* The one entry point in this file. DUMP_FILE is the dump file for
2971 this pass. */
2973 void
2974 schedule_insns (dump_file)
2975 FILE *dump_file;
2977 sbitmap large_region_blocks, blocks;
2978 int rgn;
2979 int any_large_regions;
2980 basic_block bb;
2982 /* Taking care of this degenerate case makes the rest of
2983 this code simpler. */
2984 if (n_basic_blocks == 0)
2985 return;
2987 nr_inter = 0;
2988 nr_spec = 0;
2990 sched_init (dump_file);
2992 init_regions ();
2994 current_sched_info = &region_sched_info;
2996 /* Schedule every region in the subroutine. */
2997 for (rgn = 0; rgn < nr_regions; rgn++)
2998 schedule_region (rgn);
3000 /* Update life analysis for the subroutine. Do single block regions
3001 first so that we can verify that live_at_start didn't change. Then
3002 do all other blocks. */
3003 /* ??? There is an outside possibility that update_life_info, or more
3004 to the point propagate_block, could get called with nonzero flags
3005 more than once for one basic block. This would be kinda bad if it
3006 were to happen, since REG_INFO would be accumulated twice for the
3007 block, and we'd have twice the REG_DEAD notes.
3009 I'm fairly certain that this _shouldn't_ happen, since I don't think
3010 that live_at_start should change at region heads. Not sure what the
3011 best way to test for this kind of thing... */
3013 allocate_reg_life_data ();
3014 compute_bb_for_insn ();
3016 any_large_regions = 0;
3017 large_region_blocks = sbitmap_alloc (last_basic_block);
3018 sbitmap_zero (large_region_blocks);
3019 FOR_EACH_BB (bb)
3020 SET_BIT (large_region_blocks, bb->index);
3022 blocks = sbitmap_alloc (last_basic_block);
3023 sbitmap_zero (blocks);
3025 /* Update life information. For regions consisting of multiple blocks
3026 we've possibly done interblock scheduling that affects global liveness.
3027 For regions consisting of single blocks we need to do only local
3028 liveness. */
3029 for (rgn = 0; rgn < nr_regions; rgn++)
3030 if (RGN_NR_BLOCKS (rgn) > 1)
3031 any_large_regions = 1;
3032 else
3034 SET_BIT (blocks, rgn_bb_table[RGN_BLOCKS (rgn)]);
3035 RESET_BIT (large_region_blocks, rgn_bb_table[RGN_BLOCKS (rgn)]);
3038 /* Don't update reg info after reload, since that affects
3039 regs_ever_live, which should not change after reload. */
3040 update_life_info (blocks, UPDATE_LIFE_LOCAL,
3041 (reload_completed ? PROP_DEATH_NOTES
3042 : PROP_DEATH_NOTES | PROP_REG_INFO));
3043 if (any_large_regions)
3045 update_life_info (large_region_blocks, UPDATE_LIFE_GLOBAL,
3046 PROP_DEATH_NOTES | PROP_REG_INFO);
3049 if (CHECK_DEAD_NOTES)
3051 /* Verify the counts of basic block notes in single the basic block
3052 regions. */
3053 for (rgn = 0; rgn < nr_regions; rgn++)
3054 if (RGN_NR_BLOCKS (rgn) == 1)
3056 sbitmap_zero (blocks);
3057 SET_BIT (blocks, rgn_bb_table[RGN_BLOCKS (rgn)]);
3059 if (deaths_in_region[rgn]
3060 != count_or_remove_death_notes (blocks, 0))
3061 abort ();
3063 free (deaths_in_region);
3066 /* Reposition the prologue and epilogue notes in case we moved the
3067 prologue/epilogue insns. */
3068 if (reload_completed)
3069 reposition_prologue_and_epilogue_notes (get_insns ());
3071 /* Delete redundant line notes. */
3072 if (write_symbols != NO_DEBUG)
3073 rm_redundant_line_notes ();
3075 if (sched_verbose)
3077 if (reload_completed == 0 && flag_schedule_interblock)
3079 fprintf (sched_dump,
3080 "\n;; Procedure interblock/speculative motions == %d/%d \n",
3081 nr_inter, nr_spec);
3083 else
3085 if (nr_inter > 0)
3086 abort ();
3088 fprintf (sched_dump, "\n\n");
3091 /* Clean up. */
3092 free (rgn_table);
3093 free (rgn_bb_table);
3094 free (block_to_bb);
3095 free (containing_rgn);
3097 sched_finish ();
3099 if (edge_table)
3101 free (edge_table);
3102 edge_table = NULL;
3105 if (in_edges)
3107 free (in_edges);
3108 in_edges = NULL;
3110 if (out_edges)
3112 free (out_edges);
3113 out_edges = NULL;
3116 sbitmap_free (blocks);
3117 sbitmap_free (large_region_blocks);
3119 #endif