1 /* Instruction scheduling pass.
2    Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998,
3    1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
4    Contributed by Michael Tiemann (tiemann@cygnus.com) Enhanced by,
5    and currently maintained by, Jim Wilson (wilson@cygnus.com)
6 
7 This file is part of GCC.
8 
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.
13 
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.
18 
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.  */
23 
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.
27 
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.
31 
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.
37 
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.  */
47 
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"
68 
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.  */
72 
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
78 
79 
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)
85 
86 #define MAX_RGN_BLOCKS 10
87 #define MAX_RGN_INSNS 100
88 
89 /* nr_inter/spec counts interblock/speculative motion for the function.  */
90 static int nr_inter, nr_spec;
91 
92 /* Control flow graph edges are kept in circular lists.  */
93 typedef struct
94 {
95   int from_block;
96   int to_block;
97   int next_in;
98   int next_out;
99 }
100 haifa_edge;
101 static haifa_edge *edge_table;
102 
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)
107 
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;
111 
112 /* Circular list of incoming/outgoing edges of a block.  */
113 static int *in_edges;
114 static int *out_edges;
115 
116 #define IN_EDGES(block) (in_edges[block])
117 #define OUT_EDGES(block) (out_edges[block])
118 
119 static int is_cfg_nonregular (void);
120 static int build_control_flow (struct edge_list *);
121 static void new_edge (int, int);
122 
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
127 {
128   int rgn_nr_blocks;		/* Number of blocks in region.  */
129   int rgn_blocks;		/* cblocks in the region (actually index in rgn_bb_table).  */
130 }
131 region;
132 
133 /* Number of regions in the procedure.  */
134 static int nr_regions;
135 
136 /* Table of region descriptions.  */
137 static region *rgn_table;
138 
139 /* Array of lists of regions' blocks.  */
140 static int *rgn_bb_table;
141 
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 referred to by bb.  */
146 static int *block_to_bb;
147 
148 /* The number of the region containing a block.  */
149 static int *containing_rgn;
150 
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])
155 
156 void debug_regions (void);
157 static void find_single_block_region (void);
158 static void find_rgns (struct edge_list *);
159 static int too_large (int, int *, int *);
160 
161 extern void debug_live (int, int);
162 
163 /* Blocks of the current region being scheduled.  */
164 static int current_nr_blocks;
165 static int current_blocks;
166 
167 /* The mapping from bb to block.  */
168 #define BB_TO_BLOCK(bb) (rgn_bb_table[current_blocks + (bb)])
169 
170 typedef struct
171 {
172   int *first_member;		/* Pointer to the list start in bitlst_table.  */
173   int nr_members;		/* The number of members of the bit list.  */
174 }
175 bitlst;
176 
177 static int bitlst_table_last;
178 static int *bitlst_table;
179 
180 static void extract_bitlst (sbitmap, bitlst *);
181 
182 /* Target info declarations.
183 
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
190 {
191   char is_valid;
192   char is_speculative;
193   int src_prob;
194   bblst split_bbs;
195   bblst update_bbs;
196 }
197 candidate;
198 
199 static candidate *candidate_table;
200 
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.
205 
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;
209 
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 )
213 
214 /* The bb being currently scheduled.  */
215 static int target_bb;
216 
217 /* List of edges.  */
218 typedef bitlst edgelst;
219 
220 /* Target info functions.  */
221 static void split_edges (int, int, edgelst *);
222 static void compute_trg_info (int);
223 void debug_candidate (int);
224 void debug_candidates (int);
225 
226 /* Dominators array: dom[i] contains the sbitmap of dominators of
227    bb i in the region.  */
228 static sbitmap *dom;
229 
230 /* bb 0 is the only region entry.  */
231 #define IS_RGN_ENTRY(bb) (!bb)
232 
233 /* Is bb_src dominated by bb_trg.  */
234 #define IS_DOMINATED(bb_src, bb_trg)                                 \
235 ( TEST_BIT (dom[bb_src], bb_trg) )
236 
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;
240 
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])))
246 
247 /* Bit-set of edges, where bit i stands for edge i.  */
248 typedef sbitmap edgeset;
249 
250 /* Number of edges in the region.  */
251 static int rgn_nr_edges;
252 
253 /* Array of size rgn_nr_edges.  */
254 static int *rgn_edges;
255 
256 
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])
260 
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.
265 
266    pot_split[bb] is the set of potential split edges of bb.  */
267 static edgeset *pot_split;
268 
269 /* For every bb, a set of its ancestor edges.  */
270 static edgeset *ancestor_edges;
271 
272 static void compute_dom_prob_ps (int);
273 
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)))
277 
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
281 
282 /* Speculative scheduling functions.  */
283 static int check_live_1 (int, rtx);
284 static void update_live_1 (int, rtx);
285 static int check_live (rtx, int);
286 static void update_live (rtx, int);
287 static void set_spec_fed (rtx);
288 static int is_pfree (rtx, int, int);
289 static int find_conditional_protection (rtx, int);
290 static int is_conditionally_protected (rtx, int, int);
291 static int is_prisky (rtx, int, int);
292 static int is_exception_free (rtx, int, int);
293 
294 static bool sets_likely_spilled (rtx);
295 static void sets_likely_spilled_1 (rtx, rtx, void *);
296 static void add_branch_dependences (rtx, rtx);
297 static void compute_block_backward_dependences (int);
298 void debug_dependencies (void);
299 
300 static void init_regions (void);
301 static void schedule_region (int);
302 static rtx concat_INSN_LIST (rtx, rtx);
303 static void concat_insn_mem_list (rtx, rtx, rtx *, rtx *);
304 static void propagate_deps (int, struct deps *);
305 static void free_pending_lists (void);
306 
307 /* Functions for construction of the control flow graph.  */
308 
309 /* Return 1 if control flow graph should not be constructed, 0 otherwise.
310 
311    We decide not to build the control flow graph if there is possibly more
312    than one entry to the function, if computed branches exist, of if we
313    have nonlocal gotos.  */
314 
315 static int
is_cfg_nonregular(void)316 is_cfg_nonregular (void)
317 {
318   basic_block b;
319   rtx insn;
320   RTX_CODE code;
321 
322   /* If we have a label that could be the target of a nonlocal goto, then
323      the cfg is not well structured.  */
324   if (nonlocal_goto_handler_labels)
325     return 1;
326 
327   /* If we have any forced labels, then the cfg is not well structured.  */
328   if (forced_labels)
329     return 1;
330 
331   /* If this function has a computed jump, then we consider the cfg
332      not well structured.  */
333   if (current_function_has_computed_jump)
334     return 1;
335 
336   /* If we have exception handlers, then we consider the cfg not well
337      structured.  ?!?  We should be able to handle this now that flow.c
338      computes an accurate cfg for EH.  */
339   if (current_function_has_exception_handlers ())
340     return 1;
341 
342   /* If we have non-jumping insns which refer to labels, then we consider
343      the cfg not well structured.  */
344   /* Check for labels referred to other thn by jumps.  */
345   FOR_EACH_BB (b)
346     for (insn = BB_HEAD (b); ; insn = NEXT_INSN (insn))
347       {
348 	code = GET_CODE (insn);
349 	if (GET_RTX_CLASS (code) == 'i' && code != JUMP_INSN)
350 	  {
351 	    rtx note = find_reg_note (insn, REG_LABEL, NULL_RTX);
352 
353 	    if (note
354 		&& ! (GET_CODE (NEXT_INSN (insn)) == JUMP_INSN
355 		      && find_reg_note (NEXT_INSN (insn), REG_LABEL,
356 					XEXP (note, 0))))
357 	      return 1;
358 	  }
359 
360 	if (insn == BB_END (b))
361 	  break;
362       }
363 
364   /* All the tests passed.  Consider the cfg well structured.  */
365   return 0;
366 }
367 
368 /* Build the control flow graph and set nr_edges.
369 
370    Instead of trying to build a cfg ourselves, we rely on flow to
371    do it for us.  Stamp out useless code (and bug) duplication.
372 
373    Return nonzero if an irregularity in the cfg is found which would
374    prevent cross block scheduling.  */
375 
376 static int
build_control_flow(struct edge_list * edge_list)377 build_control_flow (struct edge_list *edge_list)
378 {
379   int i, unreachable, num_edges;
380   basic_block b;
381 
382   /* This already accounts for entry/exit edges.  */
383   num_edges = NUM_EDGES (edge_list);
384 
385   /* Unreachable loops with more than one basic block are detected
386      during the DFS traversal in find_rgns.
387 
388      Unreachable loops with a single block are detected here.  This
389      test is redundant with the one in find_rgns, but it's much
390     cheaper to go ahead and catch the trivial case here.  */
391   unreachable = 0;
392   FOR_EACH_BB (b)
393     {
394       if (b->pred == NULL
395 	  || (b->pred->src == b
396 	      && b->pred->pred_next == NULL))
397 	unreachable = 1;
398     }
399 
400   /* ??? We can kill these soon.  */
401   in_edges = xcalloc (last_basic_block, sizeof (int));
402   out_edges = xcalloc (last_basic_block, sizeof (int));
403   edge_table = xcalloc (num_edges, sizeof (haifa_edge));
404 
405   nr_edges = 0;
406   for (i = 0; i < num_edges; i++)
407     {
408       edge e = INDEX_EDGE (edge_list, i);
409 
410       if (e->dest != EXIT_BLOCK_PTR
411 	  && e->src != ENTRY_BLOCK_PTR)
412 	new_edge (e->src->index, e->dest->index);
413     }
414 
415   /* Increment by 1, since edge 0 is unused.  */
416   nr_edges++;
417 
418   return unreachable;
419 }
420 
421 /* Record an edge in the control flow graph from SOURCE to TARGET.
422 
423    In theory, this is redundant with the s_succs computed above, but
424    we have not converted all of haifa to use information from the
425    integer lists.  */
426 
427 static void
new_edge(int source,int target)428 new_edge (int source, int target)
429 {
430   int e, next_edge;
431   int curr_edge, fst_edge;
432 
433   /* Check for duplicates.  */
434   fst_edge = curr_edge = OUT_EDGES (source);
435   while (curr_edge)
436     {
437       if (FROM_BLOCK (curr_edge) == source
438 	  && TO_BLOCK (curr_edge) == target)
439 	{
440 	  return;
441 	}
442 
443       curr_edge = NEXT_OUT (curr_edge);
444 
445       if (fst_edge == curr_edge)
446 	break;
447     }
448 
449   e = ++nr_edges;
450 
451   FROM_BLOCK (e) = source;
452   TO_BLOCK (e) = target;
453 
454   if (OUT_EDGES (source))
455     {
456       next_edge = NEXT_OUT (OUT_EDGES (source));
457       NEXT_OUT (OUT_EDGES (source)) = e;
458       NEXT_OUT (e) = next_edge;
459     }
460   else
461     {
462       OUT_EDGES (source) = e;
463       NEXT_OUT (e) = e;
464     }
465 
466   if (IN_EDGES (target))
467     {
468       next_edge = NEXT_IN (IN_EDGES (target));
469       NEXT_IN (IN_EDGES (target)) = e;
470       NEXT_IN (e) = next_edge;
471     }
472   else
473     {
474       IN_EDGES (target) = e;
475       NEXT_IN (e) = e;
476     }
477 }
478 
479 /* Translate a bit-set SET to a list BL of the bit-set members.  */
480 
481 static void
extract_bitlst(sbitmap set,bitlst * bl)482 extract_bitlst (sbitmap set, bitlst *bl)
483 {
484   int i;
485 
486   /* bblst table space is reused in each call to extract_bitlst.  */
487   bitlst_table_last = 0;
488 
489   bl->first_member = &bitlst_table[bitlst_table_last];
490   bl->nr_members = 0;
491 
492   /* Iterate over each word in the bitset.  */
493   EXECUTE_IF_SET_IN_SBITMAP (set, 0, i,
494   {
495     bitlst_table[bitlst_table_last++] = i;
496     (bl->nr_members)++;
497   });
498 
499 }
500 
501 /* Functions for the construction of regions.  */
502 
503 /* Print the regions, for debugging purposes.  Callable from debugger.  */
504 
505 void
debug_regions(void)506 debug_regions (void)
507 {
508   int rgn, bb;
509 
510   fprintf (sched_dump, "\n;;   ------------ REGIONS ----------\n\n");
511   for (rgn = 0; rgn < nr_regions; rgn++)
512     {
513       fprintf (sched_dump, ";;\trgn %d nr_blocks %d:\n", rgn,
514 	       rgn_table[rgn].rgn_nr_blocks);
515       fprintf (sched_dump, ";;\tbb/block: ");
516 
517       for (bb = 0; bb < rgn_table[rgn].rgn_nr_blocks; bb++)
518 	{
519 	  current_blocks = RGN_BLOCKS (rgn);
520 
521 	  if (bb != BLOCK_TO_BB (BB_TO_BLOCK (bb)))
522 	    abort ();
523 
524 	  fprintf (sched_dump, " %d/%d ", bb, BB_TO_BLOCK (bb));
525 	}
526 
527       fprintf (sched_dump, "\n\n");
528     }
529 }
530 
531 /* Build a single block region for each basic block in the function.
532    This allows for using the same code for interblock and basic block
533    scheduling.  */
534 
535 static void
find_single_block_region(void)536 find_single_block_region (void)
537 {
538   basic_block bb;
539 
540   nr_regions = 0;
541 
542   FOR_EACH_BB (bb)
543     {
544       rgn_bb_table[nr_regions] = bb->index;
545       RGN_NR_BLOCKS (nr_regions) = 1;
546       RGN_BLOCKS (nr_regions) = nr_regions;
547       CONTAINING_RGN (bb->index) = nr_regions;
548       BLOCK_TO_BB (bb->index) = 0;
549       nr_regions++;
550     }
551 }
552 
553 /* Update number of blocks and the estimate for number of insns
554    in the region.  Return 1 if the region is "too large" for interblock
555    scheduling (compile time considerations), otherwise return 0.  */
556 
557 static int
too_large(int block,int * num_bbs,int * num_insns)558 too_large (int block, int *num_bbs, int *num_insns)
559 {
560   (*num_bbs)++;
561   (*num_insns) += (INSN_LUID (BB_END (BASIC_BLOCK (block))) -
562 		   INSN_LUID (BB_HEAD (BASIC_BLOCK (block))));
563   if ((*num_bbs > MAX_RGN_BLOCKS) || (*num_insns > MAX_RGN_INSNS))
564     return 1;
565   else
566     return 0;
567 }
568 
569 /* Update_loop_relations(blk, hdr): Check if the loop headed by max_hdr[blk]
570    is still an inner loop.  Put in max_hdr[blk] the header of the most inner
571    loop containing blk.  */
572 #define UPDATE_LOOP_RELATIONS(blk, hdr)		\
573 {						\
574   if (max_hdr[blk] == -1)			\
575     max_hdr[blk] = hdr;				\
576   else if (dfs_nr[max_hdr[blk]] > dfs_nr[hdr])	\
577     RESET_BIT (inner, hdr);			\
578   else if (dfs_nr[max_hdr[blk]] < dfs_nr[hdr])	\
579     {						\
580       RESET_BIT (inner,max_hdr[blk]);		\
581       max_hdr[blk] = hdr;			\
582     }						\
583 }
584 
585 /* Find regions for interblock scheduling.
586 
587    A region for scheduling can be:
588 
589      * A loop-free procedure, or
590 
591      * A reducible inner loop, or
592 
593      * A basic block not contained in any other region.
594 
595    ?!? In theory we could build other regions based on extended basic
596    blocks or reverse extended basic blocks.  Is it worth the trouble?
597 
598    Loop blocks that form a region are put into the region's block list
599    in topological order.
600 
601    This procedure stores its results into the following global (ick) variables
602 
603      * rgn_nr
604      * rgn_table
605      * rgn_bb_table
606      * block_to_bb
607      * containing region
608 
609    We use dominator relationships to avoid making regions out of non-reducible
610    loops.
611 
612    This procedure needs to be converted to work on pred/succ lists instead
613    of edge tables.  That would simplify it somewhat.  */
614 
615 static void
find_rgns(struct edge_list * edge_list)616 find_rgns (struct edge_list *edge_list)
617 {
618   int *max_hdr, *dfs_nr, *stack, *degree;
619   char no_loops = 1;
620   int node, child, loop_head, i, head, tail;
621   int count = 0, sp, idx = 0;
622   int current_edge = out_edges[ENTRY_BLOCK_PTR->succ->dest->index];
623   int num_bbs, num_insns, unreachable;
624   int too_large_failure;
625   basic_block bb;
626 
627   /* Note if an edge has been passed.  */
628   sbitmap passed;
629 
630   /* Note if a block is a natural loop header.  */
631   sbitmap header;
632 
633   /* Note if a block is a natural inner loop header.  */
634   sbitmap inner;
635 
636   /* Note if a block is in the block queue.  */
637   sbitmap in_queue;
638 
639   /* Note if a block is in the block queue.  */
640   sbitmap in_stack;
641 
642   int num_edges = NUM_EDGES (edge_list);
643 
644   /* Perform a DFS traversal of the cfg.  Identify loop headers, inner loops
645      and a mapping from block to its loop header (if the block is contained
646      in a loop, else -1).
647 
648      Store results in HEADER, INNER, and MAX_HDR respectively, these will
649      be used as inputs to the second traversal.
650 
651      STACK, SP and DFS_NR are only used during the first traversal.  */
652 
653   /* Allocate and initialize variables for the first traversal.  */
654   max_hdr = xmalloc (last_basic_block * sizeof (int));
655   dfs_nr = xcalloc (last_basic_block, sizeof (int));
656   stack = xmalloc (nr_edges * sizeof (int));
657 
658   inner = sbitmap_alloc (last_basic_block);
659   sbitmap_ones (inner);
660 
661   header = sbitmap_alloc (last_basic_block);
662   sbitmap_zero (header);
663 
664   passed = sbitmap_alloc (nr_edges);
665   sbitmap_zero (passed);
666 
667   in_queue = sbitmap_alloc (last_basic_block);
668   sbitmap_zero (in_queue);
669 
670   in_stack = sbitmap_alloc (last_basic_block);
671   sbitmap_zero (in_stack);
672 
673   for (i = 0; i < last_basic_block; i++)
674     max_hdr[i] = -1;
675 
676   /* DFS traversal to find inner loops in the cfg.  */
677 
678   sp = -1;
679   while (1)
680     {
681       if (current_edge == 0 || TEST_BIT (passed, current_edge))
682 	{
683 	  /* We have reached a leaf node or a node that was already
684 	     processed.  Pop edges off the stack until we find
685 	     an edge that has not yet been processed.  */
686 	  while (sp >= 0
687 		 && (current_edge == 0 || TEST_BIT (passed, current_edge)))
688 	    {
689 	      /* Pop entry off the stack.  */
690 	      current_edge = stack[sp--];
691 	      node = FROM_BLOCK (current_edge);
692 	      child = TO_BLOCK (current_edge);
693 	      RESET_BIT (in_stack, child);
694 	      if (max_hdr[child] >= 0 && TEST_BIT (in_stack, max_hdr[child]))
695 		UPDATE_LOOP_RELATIONS (node, max_hdr[child]);
696 	      current_edge = NEXT_OUT (current_edge);
697 	    }
698 
699 	  /* See if have finished the DFS tree traversal.  */
700 	  if (sp < 0 && TEST_BIT (passed, current_edge))
701 	    break;
702 
703 	  /* Nope, continue the traversal with the popped node.  */
704 	  continue;
705 	}
706 
707       /* Process a node.  */
708       node = FROM_BLOCK (current_edge);
709       child = TO_BLOCK (current_edge);
710       SET_BIT (in_stack, node);
711       dfs_nr[node] = ++count;
712 
713       /* If the successor is in the stack, then we've found a loop.
714 	 Mark the loop, if it is not a natural loop, then it will
715 	 be rejected during the second traversal.  */
716       if (TEST_BIT (in_stack, child))
717 	{
718 	  no_loops = 0;
719 	  SET_BIT (header, child);
720 	  UPDATE_LOOP_RELATIONS (node, child);
721 	  SET_BIT (passed, current_edge);
722 	  current_edge = NEXT_OUT (current_edge);
723 	  continue;
724 	}
725 
726       /* If the child was already visited, then there is no need to visit
727 	 it again.  Just update the loop relationships and restart
728 	 with a new edge.  */
729       if (dfs_nr[child])
730 	{
731 	  if (max_hdr[child] >= 0 && TEST_BIT (in_stack, max_hdr[child]))
732 	    UPDATE_LOOP_RELATIONS (node, max_hdr[child]);
733 	  SET_BIT (passed, current_edge);
734 	  current_edge = NEXT_OUT (current_edge);
735 	  continue;
736 	}
737 
738       /* Push an entry on the stack and continue DFS traversal.  */
739       stack[++sp] = current_edge;
740       SET_BIT (passed, current_edge);
741       current_edge = OUT_EDGES (child);
742 
743       /* This is temporary until haifa is converted to use rth's new
744 	 cfg routines which have true entry/exit blocks and the
745 	 appropriate edges from/to those blocks.
746 
747 	 Generally we update dfs_nr for a node when we process its
748 	 out edge.  However, if the node has no out edge then we will
749 	 not set dfs_nr for that node.  This can confuse the scheduler
750 	 into thinking that we have unreachable blocks, which in turn
751 	 disables cross block scheduling.
752 
753 	 So, if we have a node with no out edges, go ahead and mark it
754 	 as reachable now.  */
755       if (current_edge == 0)
756 	dfs_nr[child] = ++count;
757     }
758 
759   /* Another check for unreachable blocks.  The earlier test in
760      is_cfg_nonregular only finds unreachable blocks that do not
761      form a loop.
762 
763      The DFS traversal will mark every block that is reachable from
764      the entry node by placing a nonzero value in dfs_nr.  Thus if
765      dfs_nr is zero for any block, then it must be unreachable.  */
766   unreachable = 0;
767   FOR_EACH_BB (bb)
768     if (dfs_nr[bb->index] == 0)
769       {
770 	unreachable = 1;
771 	break;
772       }
773 
774   /* Gross.  To avoid wasting memory, the second pass uses the dfs_nr array
775      to hold degree counts.  */
776   degree = dfs_nr;
777 
778   FOR_EACH_BB (bb)
779     degree[bb->index] = 0;
780   for (i = 0; i < num_edges; i++)
781     {
782       edge e = INDEX_EDGE (edge_list, i);
783 
784       if (e->dest != EXIT_BLOCK_PTR)
785 	degree[e->dest->index]++;
786     }
787 
788   /* Do not perform region scheduling if there are any unreachable
789      blocks.  */
790   if (!unreachable)
791     {
792       int *queue;
793 
794       if (no_loops)
795 	SET_BIT (header, 0);
796 
797       /* Second traversal:find reducible inner loops and topologically sort
798 	 block of each region.  */
799 
800       queue = xmalloc (n_basic_blocks * sizeof (int));
801 
802       /* Find blocks which are inner loop headers.  We still have non-reducible
803 	 loops to consider at this point.  */
804       FOR_EACH_BB (bb)
805 	{
806 	  if (TEST_BIT (header, bb->index) && TEST_BIT (inner, bb->index))
807 	    {
808 	      edge e;
809 	      basic_block jbb;
810 
811 	      /* Now check that the loop is reducible.  We do this separate
812 		 from finding inner loops so that we do not find a reducible
813 		 loop which contains an inner non-reducible loop.
814 
815 		 A simple way to find reducible/natural loops is to verify
816 		 that each block in the loop is dominated by the loop
817 		 header.
818 
819 		 If there exists a block that is not dominated by the loop
820 		 header, then the block is reachable from outside the loop
821 		 and thus the loop is not a natural loop.  */
822 	      FOR_EACH_BB (jbb)
823 		{
824 		  /* First identify blocks in the loop, except for the loop
825 		     entry block.  */
826 		  if (bb->index == max_hdr[jbb->index] && bb != jbb)
827 		    {
828 		      /* Now verify that the block is dominated by the loop
829 			 header.  */
830 		      if (!dominated_by_p (CDI_DOMINATORS, jbb, bb))
831 			break;
832 		    }
833 		}
834 
835 	      /* If we exited the loop early, then I is the header of
836 		 a non-reducible loop and we should quit processing it
837 		 now.  */
838 	      if (jbb != EXIT_BLOCK_PTR)
839 		continue;
840 
841 	      /* I is a header of an inner loop, or block 0 in a subroutine
842 		 with no loops at all.  */
843 	      head = tail = -1;
844 	      too_large_failure = 0;
845 	      loop_head = max_hdr[bb->index];
846 
847 	      /* Decrease degree of all I's successors for topological
848 		 ordering.  */
849 	      for (e = bb->succ; e; e = e->succ_next)
850 		if (e->dest != EXIT_BLOCK_PTR)
851 		  --degree[e->dest->index];
852 
853 	      /* Estimate # insns, and count # blocks in the region.  */
854 	      num_bbs = 1;
855 	      num_insns = (INSN_LUID (BB_END (bb))
856 			   - INSN_LUID (BB_HEAD (bb)));
857 
858 	      /* Find all loop latches (blocks with back edges to the loop
859 		 header) or all the leaf blocks in the cfg has no loops.
860 
861 		 Place those blocks into the queue.  */
862 	      if (no_loops)
863 		{
864 		  FOR_EACH_BB (jbb)
865 		    /* Leaf nodes have only a single successor which must
866 		       be EXIT_BLOCK.  */
867 		    if (jbb->succ
868 			&& jbb->succ->dest == EXIT_BLOCK_PTR
869 			&& jbb->succ->succ_next == NULL)
870 		      {
871 			queue[++tail] = jbb->index;
872 			SET_BIT (in_queue, jbb->index);
873 
874 			if (too_large (jbb->index, &num_bbs, &num_insns))
875 			  {
876 			    too_large_failure = 1;
877 			    break;
878 			  }
879 		      }
880 		}
881 	      else
882 		{
883 		  edge e;
884 
885 		  for (e = bb->pred; e; e = e->pred_next)
886 		    {
887 		      if (e->src == ENTRY_BLOCK_PTR)
888 			continue;
889 
890 		      node = e->src->index;
891 
892 		      if (max_hdr[node] == loop_head && node != bb->index)
893 			{
894 			  /* This is a loop latch.  */
895 			  queue[++tail] = node;
896 			  SET_BIT (in_queue, node);
897 
898 			  if (too_large (node, &num_bbs, &num_insns))
899 			    {
900 			      too_large_failure = 1;
901 			      break;
902 			    }
903 			}
904 		    }
905 		}
906 
907 	      /* Now add all the blocks in the loop to the queue.
908 
909 	     We know the loop is a natural loop; however the algorithm
910 	     above will not always mark certain blocks as being in the
911 	     loop.  Consider:
912 		node   children
913 		 a	  b,c
914 		 b	  c
915 		 c	  a,d
916 		 d	  b
917 
918 	     The algorithm in the DFS traversal may not mark B & D as part
919 	     of the loop (ie they will not have max_hdr set to A).
920 
921 	     We know they can not be loop latches (else they would have
922 	     had max_hdr set since they'd have a backedge to a dominator
923 	     block).  So we don't need them on the initial queue.
924 
925 	     We know they are part of the loop because they are dominated
926 	     by the loop header and can be reached by a backwards walk of
927 	     the edges starting with nodes on the initial queue.
928 
929 	     It is safe and desirable to include those nodes in the
930 	     loop/scheduling region.  To do so we would need to decrease
931 	     the degree of a node if it is the target of a backedge
932 	     within the loop itself as the node is placed in the queue.
933 
934 	     We do not do this because I'm not sure that the actual
935 	     scheduling code will properly handle this case. ?!? */
936 
937 	      while (head < tail && !too_large_failure)
938 		{
939 		  edge e;
940 		  child = queue[++head];
941 
942 		  for (e = BASIC_BLOCK (child)->pred; e; e = e->pred_next)
943 		    {
944 		      node = e->src->index;
945 
946 		      /* See discussion above about nodes not marked as in
947 			 this loop during the initial DFS traversal.  */
948 		      if (e->src == ENTRY_BLOCK_PTR
949 			  || max_hdr[node] != loop_head)
950 			{
951 			  tail = -1;
952 			  break;
953 			}
954 		      else if (!TEST_BIT (in_queue, node) && node != bb->index)
955 			{
956 			  queue[++tail] = node;
957 			  SET_BIT (in_queue, node);
958 
959 			  if (too_large (node, &num_bbs, &num_insns))
960 			    {
961 			      too_large_failure = 1;
962 			      break;
963 			    }
964 			}
965 		    }
966 		}
967 
968 	      if (tail >= 0 && !too_large_failure)
969 		{
970 		  /* Place the loop header into list of region blocks.  */
971 		  degree[bb->index] = -1;
972 		  rgn_bb_table[idx] = bb->index;
973 		  RGN_NR_BLOCKS (nr_regions) = num_bbs;
974 		  RGN_BLOCKS (nr_regions) = idx++;
975 		  CONTAINING_RGN (bb->index) = nr_regions;
976 		  BLOCK_TO_BB (bb->index) = count = 0;
977 
978 		  /* Remove blocks from queue[] when their in degree
979 		     becomes zero.  Repeat until no blocks are left on the
980 		     list.  This produces a topological list of blocks in
981 		     the region.  */
982 		  while (tail >= 0)
983 		    {
984 		      if (head < 0)
985 			head = tail;
986 		      child = queue[head];
987 		      if (degree[child] == 0)
988 			{
989 			  edge e;
990 
991 			  degree[child] = -1;
992 			  rgn_bb_table[idx++] = child;
993 			  BLOCK_TO_BB (child) = ++count;
994 			  CONTAINING_RGN (child) = nr_regions;
995 			  queue[head] = queue[tail--];
996 
997 			  for (e = BASIC_BLOCK (child)->succ;
998 			       e;
999 			       e = e->succ_next)
1000 			    if (e->dest != EXIT_BLOCK_PTR)
1001 			      --degree[e->dest->index];
1002 			}
1003 		      else
1004 			--head;
1005 		    }
1006 		  ++nr_regions;
1007 		}
1008 	    }
1009 	}
1010       free (queue);
1011     }
1012 
1013   /* Any block that did not end up in a region is placed into a region
1014      by itself.  */
1015   FOR_EACH_BB (bb)
1016     if (degree[bb->index] >= 0)
1017       {
1018 	rgn_bb_table[idx] = bb->index;
1019 	RGN_NR_BLOCKS (nr_regions) = 1;
1020 	RGN_BLOCKS (nr_regions) = idx++;
1021 	CONTAINING_RGN (bb->index) = nr_regions++;
1022 	BLOCK_TO_BB (bb->index) = 0;
1023       }
1024 
1025   free (max_hdr);
1026   free (dfs_nr);
1027   free (stack);
1028   sbitmap_free (passed);
1029   sbitmap_free (header);
1030   sbitmap_free (inner);
1031   sbitmap_free (in_queue);
1032   sbitmap_free (in_stack);
1033 }
1034 
1035 /* Functions for regions scheduling information.  */
1036 
1037 /* Compute dominators, probability, and potential-split-edges of bb.
1038    Assume that these values were already computed for bb's predecessors.  */
1039 
1040 static void
compute_dom_prob_ps(int bb)1041 compute_dom_prob_ps (int bb)
1042 {
1043   int nxt_in_edge, fst_in_edge, pred;
1044   int fst_out_edge, nxt_out_edge, nr_out_edges, nr_rgn_out_edges;
1045 
1046   prob[bb] = 0.0;
1047   if (IS_RGN_ENTRY (bb))
1048     {
1049       SET_BIT (dom[bb], 0);
1050       prob[bb] = 1.0;
1051       return;
1052     }
1053 
1054   fst_in_edge = nxt_in_edge = IN_EDGES (BB_TO_BLOCK (bb));
1055 
1056   /* Initialize dom[bb] to '111..1'.  */
1057   sbitmap_ones (dom[bb]);
1058 
1059   do
1060     {
1061       pred = FROM_BLOCK (nxt_in_edge);
1062       sbitmap_a_and_b (dom[bb], dom[bb], dom[BLOCK_TO_BB (pred)]);
1063       sbitmap_a_or_b (ancestor_edges[bb], ancestor_edges[bb], ancestor_edges[BLOCK_TO_BB (pred)]);
1064 
1065       SET_BIT (ancestor_edges[bb], EDGE_TO_BIT (nxt_in_edge));
1066 
1067       nr_out_edges = 1;
1068       nr_rgn_out_edges = 0;
1069       fst_out_edge = OUT_EDGES (pred);
1070       nxt_out_edge = NEXT_OUT (fst_out_edge);
1071 
1072       sbitmap_a_or_b (pot_split[bb], pot_split[bb], pot_split[BLOCK_TO_BB (pred)]);
1073 
1074       SET_BIT (pot_split[bb], EDGE_TO_BIT (fst_out_edge));
1075 
1076       /* The successor doesn't belong in the region?  */
1077       if (CONTAINING_RGN (TO_BLOCK (fst_out_edge)) !=
1078 	  CONTAINING_RGN (BB_TO_BLOCK (bb)))
1079 	++nr_rgn_out_edges;
1080 
1081       while (fst_out_edge != nxt_out_edge)
1082 	{
1083 	  ++nr_out_edges;
1084 	  /* The successor doesn't belong in the region?  */
1085 	  if (CONTAINING_RGN (TO_BLOCK (nxt_out_edge)) !=
1086 	      CONTAINING_RGN (BB_TO_BLOCK (bb)))
1087 	    ++nr_rgn_out_edges;
1088 	  SET_BIT (pot_split[bb], EDGE_TO_BIT (nxt_out_edge));
1089 	  nxt_out_edge = NEXT_OUT (nxt_out_edge);
1090 
1091 	}
1092 
1093       /* Now nr_rgn_out_edges is the number of region-exit edges from
1094          pred, and nr_out_edges will be the number of pred out edges
1095          not leaving the region.  */
1096       nr_out_edges -= nr_rgn_out_edges;
1097       if (nr_rgn_out_edges > 0)
1098 	prob[bb] += 0.9 * prob[BLOCK_TO_BB (pred)] / nr_out_edges;
1099       else
1100 	prob[bb] += prob[BLOCK_TO_BB (pred)] / nr_out_edges;
1101       nxt_in_edge = NEXT_IN (nxt_in_edge);
1102     }
1103   while (fst_in_edge != nxt_in_edge);
1104 
1105   SET_BIT (dom[bb], bb);
1106   sbitmap_difference (pot_split[bb], pot_split[bb], ancestor_edges[bb]);
1107 
1108   if (sched_verbose >= 2)
1109     fprintf (sched_dump, ";;  bb_prob(%d, %d) = %3d\n", bb, BB_TO_BLOCK (bb),
1110 	     (int) (100.0 * prob[bb]));
1111 }
1112 
1113 /* Functions for target info.  */
1114 
1115 /* Compute in BL the list of split-edges of bb_src relatively to bb_trg.
1116    Note that bb_trg dominates bb_src.  */
1117 
1118 static void
split_edges(int bb_src,int bb_trg,edgelst * bl)1119 split_edges (int bb_src, int bb_trg, edgelst *bl)
1120 {
1121   sbitmap src = sbitmap_alloc (pot_split[bb_src]->n_bits);
1122   sbitmap_copy (src, pot_split[bb_src]);
1123 
1124   sbitmap_difference (src, src, pot_split[bb_trg]);
1125   extract_bitlst (src, bl);
1126   sbitmap_free (src);
1127 }
1128 
1129 /* Find the valid candidate-source-blocks for the target block TRG, compute
1130    their probability, and check if they are speculative or not.
1131    For speculative sources, compute their update-blocks and split-blocks.  */
1132 
1133 static void
compute_trg_info(int trg)1134 compute_trg_info (int trg)
1135 {
1136   candidate *sp;
1137   edgelst el;
1138   int check_block, update_idx;
1139   int i, j, k, fst_edge, nxt_edge;
1140 
1141   /* Define some of the fields for the target bb as well.  */
1142   sp = candidate_table + trg;
1143   sp->is_valid = 1;
1144   sp->is_speculative = 0;
1145   sp->src_prob = 100;
1146 
1147   for (i = trg + 1; i < current_nr_blocks; i++)
1148     {
1149       sp = candidate_table + i;
1150 
1151       sp->is_valid = IS_DOMINATED (i, trg);
1152       if (sp->is_valid)
1153 	{
1154 	  sp->src_prob = GET_SRC_PROB (i, trg);
1155 	  sp->is_valid = (sp->src_prob >= MIN_PROBABILITY);
1156 	}
1157 
1158       if (sp->is_valid)
1159 	{
1160 	  split_edges (i, trg, &el);
1161 	  sp->is_speculative = (el.nr_members) ? 1 : 0;
1162 	  if (sp->is_speculative && !flag_schedule_speculative)
1163 	    sp->is_valid = 0;
1164 	}
1165 
1166       if (sp->is_valid)
1167 	{
1168 	  char *update_blocks;
1169 
1170 	  /* Compute split blocks and store them in bblst_table.
1171 	     The TO block of every split edge is a split block.  */
1172 	  sp->split_bbs.first_member = &bblst_table[bblst_last];
1173 	  sp->split_bbs.nr_members = el.nr_members;
1174 	  for (j = 0; j < el.nr_members; bblst_last++, j++)
1175 	    bblst_table[bblst_last] =
1176 	      TO_BLOCK (rgn_edges[el.first_member[j]]);
1177 	  sp->update_bbs.first_member = &bblst_table[bblst_last];
1178 
1179 	  /* Compute update blocks and store them in bblst_table.
1180 	     For every split edge, look at the FROM block, and check
1181 	     all out edges.  For each out edge that is not a split edge,
1182 	     add the TO block to the update block list.  This list can end
1183 	     up with a lot of duplicates.  We need to weed them out to avoid
1184 	     overrunning the end of the bblst_table.  */
1185 	  update_blocks = alloca (last_basic_block);
1186 	  memset (update_blocks, 0, last_basic_block);
1187 
1188 	  update_idx = 0;
1189 	  for (j = 0; j < el.nr_members; j++)
1190 	    {
1191 	      check_block = FROM_BLOCK (rgn_edges[el.first_member[j]]);
1192 	      fst_edge = nxt_edge = OUT_EDGES (check_block);
1193 	      do
1194 		{
1195 		  if (! update_blocks[TO_BLOCK (nxt_edge)])
1196 		    {
1197 		      for (k = 0; k < el.nr_members; k++)
1198 			if (EDGE_TO_BIT (nxt_edge) == el.first_member[k])
1199 			  break;
1200 
1201 		      if (k >= el.nr_members)
1202 			{
1203 			  bblst_table[bblst_last++] = TO_BLOCK (nxt_edge);
1204 			  update_blocks[TO_BLOCK (nxt_edge)] = 1;
1205 			  update_idx++;
1206 			}
1207 		    }
1208 
1209 		  nxt_edge = NEXT_OUT (nxt_edge);
1210 		}
1211 	      while (fst_edge != nxt_edge);
1212 	    }
1213 	  sp->update_bbs.nr_members = update_idx;
1214 
1215 	  /* Make sure we didn't overrun the end of bblst_table.  */
1216 	  if (bblst_last > bblst_size)
1217 	    abort ();
1218 	}
1219       else
1220 	{
1221 	  sp->split_bbs.nr_members = sp->update_bbs.nr_members = 0;
1222 
1223 	  sp->is_speculative = 0;
1224 	  sp->src_prob = 0;
1225 	}
1226     }
1227 }
1228 
1229 /* Print candidates info, for debugging purposes.  Callable from debugger.  */
1230 
1231 void
debug_candidate(int i)1232 debug_candidate (int i)
1233 {
1234   if (!candidate_table[i].is_valid)
1235     return;
1236 
1237   if (candidate_table[i].is_speculative)
1238     {
1239       int j;
1240       fprintf (sched_dump, "src b %d bb %d speculative \n", BB_TO_BLOCK (i), i);
1241 
1242       fprintf (sched_dump, "split path: ");
1243       for (j = 0; j < candidate_table[i].split_bbs.nr_members; j++)
1244 	{
1245 	  int b = candidate_table[i].split_bbs.first_member[j];
1246 
1247 	  fprintf (sched_dump, " %d ", b);
1248 	}
1249       fprintf (sched_dump, "\n");
1250 
1251       fprintf (sched_dump, "update path: ");
1252       for (j = 0; j < candidate_table[i].update_bbs.nr_members; j++)
1253 	{
1254 	  int b = candidate_table[i].update_bbs.first_member[j];
1255 
1256 	  fprintf (sched_dump, " %d ", b);
1257 	}
1258       fprintf (sched_dump, "\n");
1259     }
1260   else
1261     {
1262       fprintf (sched_dump, " src %d equivalent\n", BB_TO_BLOCK (i));
1263     }
1264 }
1265 
1266 /* Print candidates info, for debugging purposes.  Callable from debugger.  */
1267 
1268 void
debug_candidates(int trg)1269 debug_candidates (int trg)
1270 {
1271   int i;
1272 
1273   fprintf (sched_dump, "----------- candidate table: target: b=%d bb=%d ---\n",
1274 	   BB_TO_BLOCK (trg), trg);
1275   for (i = trg + 1; i < current_nr_blocks; i++)
1276     debug_candidate (i);
1277 }
1278 
1279 /* Functions for speculative scheduling.  */
1280 
1281 /* Return 0 if x is a set of a register alive in the beginning of one
1282    of the split-blocks of src, otherwise return 1.  */
1283 
1284 static int
check_live_1(int src,rtx x)1285 check_live_1 (int src, rtx x)
1286 {
1287   int i;
1288   int regno;
1289   rtx reg = SET_DEST (x);
1290 
1291   if (reg == 0)
1292     return 1;
1293 
1294   while (GET_CODE (reg) == SUBREG || GET_CODE (reg) == ZERO_EXTRACT
1295 	 || GET_CODE (reg) == SIGN_EXTRACT
1296 	 || GET_CODE (reg) == STRICT_LOW_PART)
1297     reg = XEXP (reg, 0);
1298 
1299   if (GET_CODE (reg) == PARALLEL)
1300     {
1301       int i;
1302 
1303       for (i = XVECLEN (reg, 0) - 1; i >= 0; i--)
1304 	if (XEXP (XVECEXP (reg, 0, i), 0) != 0)
1305 	  if (check_live_1 (src, XEXP (XVECEXP (reg, 0, i), 0)))
1306 	    return 1;
1307 
1308       return 0;
1309     }
1310 
1311   if (GET_CODE (reg) != REG)
1312     return 1;
1313 
1314   regno = REGNO (reg);
1315 
1316   if (regno < FIRST_PSEUDO_REGISTER && global_regs[regno])
1317     {
1318       /* Global registers are assumed live.  */
1319       return 0;
1320     }
1321   else
1322     {
1323       if (regno < FIRST_PSEUDO_REGISTER)
1324 	{
1325 	  /* Check for hard registers.  */
1326 	  int j = HARD_REGNO_NREGS (regno, GET_MODE (reg));
1327 	  while (--j >= 0)
1328 	    {
1329 	      for (i = 0; i < candidate_table[src].split_bbs.nr_members; i++)
1330 		{
1331 		  int b = candidate_table[src].split_bbs.first_member[i];
1332 
1333 		  if (REGNO_REG_SET_P (BASIC_BLOCK (b)->global_live_at_start,
1334 				       regno + j))
1335 		    {
1336 		      return 0;
1337 		    }
1338 		}
1339 	    }
1340 	}
1341       else
1342 	{
1343 	  /* Check for pseudo registers.  */
1344 	  for (i = 0; i < candidate_table[src].split_bbs.nr_members; i++)
1345 	    {
1346 	      int b = candidate_table[src].split_bbs.first_member[i];
1347 
1348 	      if (REGNO_REG_SET_P (BASIC_BLOCK (b)->global_live_at_start, regno))
1349 		{
1350 		  return 0;
1351 		}
1352 	    }
1353 	}
1354     }
1355 
1356   return 1;
1357 }
1358 
1359 /* If x is a set of a register R, mark that R is alive in the beginning
1360    of every update-block of src.  */
1361 
1362 static void
update_live_1(int src,rtx x)1363 update_live_1 (int src, rtx x)
1364 {
1365   int i;
1366   int regno;
1367   rtx reg = SET_DEST (x);
1368 
1369   if (reg == 0)
1370     return;
1371 
1372   while (GET_CODE (reg) == SUBREG || GET_CODE (reg) == ZERO_EXTRACT
1373 	 || GET_CODE (reg) == SIGN_EXTRACT
1374 	 || GET_CODE (reg) == STRICT_LOW_PART)
1375     reg = XEXP (reg, 0);
1376 
1377   if (GET_CODE (reg) == PARALLEL)
1378     {
1379       int i;
1380 
1381       for (i = XVECLEN (reg, 0) - 1; i >= 0; i--)
1382 	if (XEXP (XVECEXP (reg, 0, i), 0) != 0)
1383 	  update_live_1 (src, XEXP (XVECEXP (reg, 0, i), 0));
1384 
1385       return;
1386     }
1387 
1388   if (GET_CODE (reg) != REG)
1389     return;
1390 
1391   /* Global registers are always live, so the code below does not apply
1392      to them.  */
1393 
1394   regno = REGNO (reg);
1395 
1396   if (regno >= FIRST_PSEUDO_REGISTER || !global_regs[regno])
1397     {
1398       if (regno < FIRST_PSEUDO_REGISTER)
1399 	{
1400 	  int j = HARD_REGNO_NREGS (regno, GET_MODE (reg));
1401 	  while (--j >= 0)
1402 	    {
1403 	      for (i = 0; i < candidate_table[src].update_bbs.nr_members; i++)
1404 		{
1405 		  int b = candidate_table[src].update_bbs.first_member[i];
1406 
1407 		  SET_REGNO_REG_SET (BASIC_BLOCK (b)->global_live_at_start,
1408 				     regno + j);
1409 		}
1410 	    }
1411 	}
1412       else
1413 	{
1414 	  for (i = 0; i < candidate_table[src].update_bbs.nr_members; i++)
1415 	    {
1416 	      int b = candidate_table[src].update_bbs.first_member[i];
1417 
1418 	      SET_REGNO_REG_SET (BASIC_BLOCK (b)->global_live_at_start, regno);
1419 	    }
1420 	}
1421     }
1422 }
1423 
1424 /* Return 1 if insn can be speculatively moved from block src to trg,
1425    otherwise return 0.  Called before first insertion of insn to
1426    ready-list or before the scheduling.  */
1427 
1428 static int
check_live(rtx insn,int src)1429 check_live (rtx insn, int src)
1430 {
1431   /* Find the registers set by instruction.  */
1432   if (GET_CODE (PATTERN (insn)) == SET
1433       || GET_CODE (PATTERN (insn)) == CLOBBER)
1434     return check_live_1 (src, PATTERN (insn));
1435   else if (GET_CODE (PATTERN (insn)) == PARALLEL)
1436     {
1437       int j;
1438       for (j = XVECLEN (PATTERN (insn), 0) - 1; j >= 0; j--)
1439 	if ((GET_CODE (XVECEXP (PATTERN (insn), 0, j)) == SET
1440 	     || GET_CODE (XVECEXP (PATTERN (insn), 0, j)) == CLOBBER)
1441 	    && !check_live_1 (src, XVECEXP (PATTERN (insn), 0, j)))
1442 	  return 0;
1443 
1444       return 1;
1445     }
1446 
1447   return 1;
1448 }
1449 
1450 /* Update the live registers info after insn was moved speculatively from
1451    block src to trg.  */
1452 
1453 static void
update_live(rtx insn,int src)1454 update_live (rtx insn, int src)
1455 {
1456   /* Find the registers set by instruction.  */
1457   if (GET_CODE (PATTERN (insn)) == SET
1458       || GET_CODE (PATTERN (insn)) == CLOBBER)
1459     update_live_1 (src, PATTERN (insn));
1460   else if (GET_CODE (PATTERN (insn)) == PARALLEL)
1461     {
1462       int j;
1463       for (j = XVECLEN (PATTERN (insn), 0) - 1; j >= 0; j--)
1464 	if (GET_CODE (XVECEXP (PATTERN (insn), 0, j)) == SET
1465 	    || GET_CODE (XVECEXP (PATTERN (insn), 0, j)) == CLOBBER)
1466 	  update_live_1 (src, XVECEXP (PATTERN (insn), 0, j));
1467     }
1468 }
1469 
1470 /* Nonzero if block bb_to is equal to, or reachable from block bb_from.  */
1471 #define IS_REACHABLE(bb_from, bb_to)					\
1472   (bb_from == bb_to							\
1473    || IS_RGN_ENTRY (bb_from)						\
1474    || (TEST_BIT (ancestor_edges[bb_to],					\
1475 		 EDGE_TO_BIT (IN_EDGES (BB_TO_BLOCK (bb_from))))))
1476 
1477 /* Turns on the fed_by_spec_load flag for insns fed by load_insn.  */
1478 
1479 static void
set_spec_fed(rtx load_insn)1480 set_spec_fed (rtx load_insn)
1481 {
1482   rtx link;
1483 
1484   for (link = INSN_DEPEND (load_insn); link; link = XEXP (link, 1))
1485     if (GET_MODE (link) == VOIDmode)
1486       FED_BY_SPEC_LOAD (XEXP (link, 0)) = 1;
1487 }				/* set_spec_fed */
1488 
1489 /* On the path from the insn to load_insn_bb, find a conditional
1490 branch depending on insn, that guards the speculative load.  */
1491 
1492 static int
find_conditional_protection(rtx insn,int load_insn_bb)1493 find_conditional_protection (rtx insn, int load_insn_bb)
1494 {
1495   rtx link;
1496 
1497   /* Iterate through DEF-USE forward dependences.  */
1498   for (link = INSN_DEPEND (insn); link; link = XEXP (link, 1))
1499     {
1500       rtx next = XEXP (link, 0);
1501       if ((CONTAINING_RGN (BLOCK_NUM (next)) ==
1502 	   CONTAINING_RGN (BB_TO_BLOCK (load_insn_bb)))
1503 	  && IS_REACHABLE (INSN_BB (next), load_insn_bb)
1504 	  && load_insn_bb != INSN_BB (next)
1505 	  && GET_MODE (link) == VOIDmode
1506 	  && (GET_CODE (next) == JUMP_INSN
1507 	      || find_conditional_protection (next, load_insn_bb)))
1508 	return 1;
1509     }
1510   return 0;
1511 }				/* find_conditional_protection */
1512 
1513 /* Returns 1 if the same insn1 that participates in the computation
1514    of load_insn's address is feeding a conditional branch that is
1515    guarding on load_insn. This is true if we find a the two DEF-USE
1516    chains:
1517    insn1 -> ... -> conditional-branch
1518    insn1 -> ... -> load_insn,
1519    and if a flow path exist:
1520    insn1 -> ... -> conditional-branch -> ... -> load_insn,
1521    and if insn1 is on the path
1522    region-entry -> ... -> bb_trg -> ... load_insn.
1523 
1524    Locate insn1 by climbing on LOG_LINKS from load_insn.
1525    Locate the branch by following INSN_DEPEND from insn1.  */
1526 
1527 static int
is_conditionally_protected(rtx load_insn,int bb_src,int bb_trg)1528 is_conditionally_protected (rtx load_insn, int bb_src, int bb_trg)
1529 {
1530   rtx link;
1531 
1532   for (link = LOG_LINKS (load_insn); link; link = XEXP (link, 1))
1533     {
1534       rtx insn1 = XEXP (link, 0);
1535 
1536       /* Must be a DEF-USE dependence upon non-branch.  */
1537       if (GET_MODE (link) != VOIDmode
1538 	  || GET_CODE (insn1) == JUMP_INSN)
1539 	continue;
1540 
1541       /* Must exist a path: region-entry -> ... -> bb_trg -> ... load_insn.  */
1542       if (INSN_BB (insn1) == bb_src
1543 	  || (CONTAINING_RGN (BLOCK_NUM (insn1))
1544 	      != CONTAINING_RGN (BB_TO_BLOCK (bb_src)))
1545 	  || (!IS_REACHABLE (bb_trg, INSN_BB (insn1))
1546 	      && !IS_REACHABLE (INSN_BB (insn1), bb_trg)))
1547 	continue;
1548 
1549       /* Now search for the conditional-branch.  */
1550       if (find_conditional_protection (insn1, bb_src))
1551 	return 1;
1552 
1553       /* Recursive step: search another insn1, "above" current insn1.  */
1554       return is_conditionally_protected (insn1, bb_src, bb_trg);
1555     }
1556 
1557   /* The chain does not exist.  */
1558   return 0;
1559 }				/* is_conditionally_protected */
1560 
1561 /* Returns 1 if a clue for "similar load" 'insn2' is found, and hence
1562    load_insn can move speculatively from bb_src to bb_trg.  All the
1563    following must hold:
1564 
1565    (1) both loads have 1 base register (PFREE_CANDIDATEs).
1566    (2) load_insn and load1 have a def-use dependence upon
1567    the same insn 'insn1'.
1568    (3) either load2 is in bb_trg, or:
1569    - there's only one split-block, and
1570    - load1 is on the escape path, and
1571 
1572    From all these we can conclude that the two loads access memory
1573    addresses that differ at most by a constant, and hence if moving
1574    load_insn would cause an exception, it would have been caused by
1575    load2 anyhow.  */
1576 
1577 static int
is_pfree(rtx load_insn,int bb_src,int bb_trg)1578 is_pfree (rtx load_insn, int bb_src, int bb_trg)
1579 {
1580   rtx back_link;
1581   candidate *candp = candidate_table + bb_src;
1582 
1583   if (candp->split_bbs.nr_members != 1)
1584     /* Must have exactly one escape block.  */
1585     return 0;
1586 
1587   for (back_link = LOG_LINKS (load_insn);
1588        back_link; back_link = XEXP (back_link, 1))
1589     {
1590       rtx insn1 = XEXP (back_link, 0);
1591 
1592       if (GET_MODE (back_link) == VOIDmode)
1593 	{
1594 	  /* Found a DEF-USE dependence (insn1, load_insn).  */
1595 	  rtx fore_link;
1596 
1597 	  for (fore_link = INSN_DEPEND (insn1);
1598 	       fore_link; fore_link = XEXP (fore_link, 1))
1599 	    {
1600 	      rtx insn2 = XEXP (fore_link, 0);
1601 	      if (GET_MODE (fore_link) == VOIDmode)
1602 		{
1603 		  /* Found a DEF-USE dependence (insn1, insn2).  */
1604 		  if (haifa_classify_insn (insn2) != PFREE_CANDIDATE)
1605 		    /* insn2 not guaranteed to be a 1 base reg load.  */
1606 		    continue;
1607 
1608 		  if (INSN_BB (insn2) == bb_trg)
1609 		    /* insn2 is the similar load, in the target block.  */
1610 		    return 1;
1611 
1612 		  if (*(candp->split_bbs.first_member) == BLOCK_NUM (insn2))
1613 		    /* insn2 is a similar load, in a split-block.  */
1614 		    return 1;
1615 		}
1616 	    }
1617 	}
1618     }
1619 
1620   /* Couldn't find a similar load.  */
1621   return 0;
1622 }				/* is_pfree */
1623 
1624 /* Return 1 if load_insn is prisky (i.e. if load_insn is fed by
1625    a load moved speculatively, or if load_insn is protected by
1626    a compare on load_insn's address).  */
1627 
1628 static int
is_prisky(rtx load_insn,int bb_src,int bb_trg)1629 is_prisky (rtx load_insn, int bb_src, int bb_trg)
1630 {
1631   if (FED_BY_SPEC_LOAD (load_insn))
1632     return 1;
1633 
1634   if (LOG_LINKS (load_insn) == NULL)
1635     /* Dependence may 'hide' out of the region.  */
1636     return 1;
1637 
1638   if (is_conditionally_protected (load_insn, bb_src, bb_trg))
1639     return 1;
1640 
1641   return 0;
1642 }
1643 
1644 /* Insn is a candidate to be moved speculatively from bb_src to bb_trg.
1645    Return 1 if insn is exception-free (and the motion is valid)
1646    and 0 otherwise.  */
1647 
1648 static int
is_exception_free(rtx insn,int bb_src,int bb_trg)1649 is_exception_free (rtx insn, int bb_src, int bb_trg)
1650 {
1651   int insn_class = haifa_classify_insn (insn);
1652 
1653   /* Handle non-load insns.  */
1654   switch (insn_class)
1655     {
1656     case TRAP_FREE:
1657       return 1;
1658     case TRAP_RISKY:
1659       return 0;
1660     default:;
1661     }
1662 
1663   /* Handle loads.  */
1664   if (!flag_schedule_speculative_load)
1665     return 0;
1666   IS_LOAD_INSN (insn) = 1;
1667   switch (insn_class)
1668     {
1669     case IFREE:
1670       return (1);
1671     case IRISKY:
1672       return 0;
1673     case PFREE_CANDIDATE:
1674       if (is_pfree (insn, bb_src, bb_trg))
1675 	return 1;
1676       /* Don't 'break' here: PFREE-candidate is also PRISKY-candidate.  */
1677     case PRISKY_CANDIDATE:
1678       if (!flag_schedule_speculative_load_dangerous
1679 	  || is_prisky (insn, bb_src, bb_trg))
1680 	return 0;
1681       break;
1682     default:;
1683     }
1684 
1685   return flag_schedule_speculative_load_dangerous;
1686 }
1687 
1688 /* The number of insns from the current block scheduled so far.  */
1689 static int sched_target_n_insns;
1690 /* The number of insns from the current block to be scheduled in total.  */
1691 static int target_n_insns;
1692 /* The number of insns from the entire region scheduled so far.  */
1693 static int sched_n_insns;
1694 /* Nonzero if the last scheduled insn was a jump.  */
1695 static int last_was_jump;
1696 
1697 /* Implementations of the sched_info functions for region scheduling.  */
1698 static void init_ready_list (struct ready_list *);
1699 static int can_schedule_ready_p (rtx);
1700 static int new_ready (rtx);
1701 static int schedule_more_p (void);
1702 static const char *rgn_print_insn (rtx, int);
1703 static int rgn_rank (rtx, rtx);
1704 static int contributes_to_priority (rtx, rtx);
1705 static void compute_jump_reg_dependencies (rtx, regset, regset, regset);
1706 
1707 /* Return nonzero if there are more insns that should be scheduled.  */
1708 
1709 static int
schedule_more_p(void)1710 schedule_more_p (void)
1711 {
1712   return ! last_was_jump && sched_target_n_insns < target_n_insns;
1713 }
1714 
1715 /* Add all insns that are initially ready to the ready list READY.  Called
1716    once before scheduling a set of insns.  */
1717 
1718 static void
init_ready_list(struct ready_list * ready)1719 init_ready_list (struct ready_list *ready)
1720 {
1721   rtx prev_head = current_sched_info->prev_head;
1722   rtx next_tail = current_sched_info->next_tail;
1723   int bb_src;
1724   rtx insn;
1725 
1726   target_n_insns = 0;
1727   sched_target_n_insns = 0;
1728   sched_n_insns = 0;
1729   last_was_jump = 0;
1730 
1731   /* Print debugging information.  */
1732   if (sched_verbose >= 5)
1733     debug_dependencies ();
1734 
1735   /* Prepare current target block info.  */
1736   if (current_nr_blocks > 1)
1737     {
1738       candidate_table = xmalloc (current_nr_blocks * sizeof (candidate));
1739 
1740       bblst_last = 0;
1741       /* bblst_table holds split blocks and update blocks for each block after
1742 	 the current one in the region.  split blocks and update blocks are
1743 	 the TO blocks of region edges, so there can be at most rgn_nr_edges
1744 	 of them.  */
1745       bblst_size = (current_nr_blocks - target_bb) * rgn_nr_edges;
1746       bblst_table = xmalloc (bblst_size * sizeof (int));
1747 
1748       bitlst_table_last = 0;
1749       bitlst_table = xmalloc (rgn_nr_edges * sizeof (int));
1750 
1751       compute_trg_info (target_bb);
1752     }
1753 
1754   /* Initialize ready list with all 'ready' insns in target block.
1755      Count number of insns in the target block being scheduled.  */
1756   for (insn = NEXT_INSN (prev_head); insn != next_tail; insn = NEXT_INSN (insn))
1757     {
1758       if (INSN_DEP_COUNT (insn) == 0)
1759 	{
1760 	  ready_add (ready, insn);
1761 
1762 	  if (targetm.sched.adjust_priority)
1763 	    INSN_PRIORITY (insn) =
1764 	      (*targetm.sched.adjust_priority) (insn, INSN_PRIORITY (insn));
1765 	}
1766       target_n_insns++;
1767     }
1768 
1769   /* Add to ready list all 'ready' insns in valid source blocks.
1770      For speculative insns, check-live, exception-free, and
1771      issue-delay.  */
1772   for (bb_src = target_bb + 1; bb_src < current_nr_blocks; bb_src++)
1773     if (IS_VALID (bb_src))
1774       {
1775 	rtx src_head;
1776 	rtx src_next_tail;
1777 	rtx tail, head;
1778 
1779 	get_block_head_tail (BB_TO_BLOCK (bb_src), &head, &tail);
1780 	src_next_tail = NEXT_INSN (tail);
1781 	src_head = head;
1782 
1783 	for (insn = src_head; insn != src_next_tail; insn = NEXT_INSN (insn))
1784 	  {
1785 	    if (! INSN_P (insn))
1786 	      continue;
1787 
1788 	    if (!CANT_MOVE (insn)
1789 		&& (!IS_SPECULATIVE_INSN (insn)
1790 		    || ((((!targetm.sched.use_dfa_pipeline_interface
1791 			   || !(*targetm.sched.use_dfa_pipeline_interface) ())
1792 			  && insn_issue_delay (insn) <= 3)
1793 			 || (targetm.sched.use_dfa_pipeline_interface
1794 			     && (*targetm.sched.use_dfa_pipeline_interface) ()
1795 			     && (recog_memoized (insn) < 0
1796 			         || min_insn_conflict_delay (curr_state,
1797 							     insn, insn) <= 3)))
1798 			&& check_live (insn, bb_src)
1799 			&& is_exception_free (insn, bb_src, target_bb))))
1800 	      if (INSN_DEP_COUNT (insn) == 0)
1801 		{
1802 		  ready_add (ready, insn);
1803 
1804 		  if (targetm.sched.adjust_priority)
1805 		    INSN_PRIORITY (insn) =
1806 		      (*targetm.sched.adjust_priority) (insn, INSN_PRIORITY (insn));
1807 		}
1808 	  }
1809       }
1810 }
1811 
1812 /* Called after taking INSN from the ready list.  Returns nonzero if this
1813    insn can be scheduled, nonzero if we should silently discard it.  */
1814 
1815 static int
can_schedule_ready_p(rtx insn)1816 can_schedule_ready_p (rtx insn)
1817 {
1818   if (GET_CODE (insn) == JUMP_INSN)
1819     last_was_jump = 1;
1820 
1821   /* An interblock motion?  */
1822   if (INSN_BB (insn) != target_bb)
1823     {
1824       basic_block b1;
1825 
1826       if (IS_SPECULATIVE_INSN (insn))
1827 	{
1828 	  if (!check_live (insn, INSN_BB (insn)))
1829 	    return 0;
1830 	  update_live (insn, INSN_BB (insn));
1831 
1832 	  /* For speculative load, mark insns fed by it.  */
1833 	  if (IS_LOAD_INSN (insn) || FED_BY_SPEC_LOAD (insn))
1834 	    set_spec_fed (insn);
1835 
1836 	  nr_spec++;
1837 	}
1838       nr_inter++;
1839 
1840       /* Update source block boundaries.  */
1841       b1 = BLOCK_FOR_INSN (insn);
1842       if (insn == BB_HEAD (b1) && insn == BB_END (b1))
1843 	{
1844 	  /* We moved all the insns in the basic block.
1845 	     Emit a note after the last insn and update the
1846 	     begin/end boundaries to point to the note.  */
1847 	  rtx note = emit_note_after (NOTE_INSN_DELETED, insn);
1848 	  BB_HEAD (b1) = note;
1849 	  BB_END (b1) = note;
1850 	}
1851       else if (insn == BB_END (b1))
1852 	{
1853 	  /* We took insns from the end of the basic block,
1854 	     so update the end of block boundary so that it
1855 	     points to the first insn we did not move.  */
1856 	  BB_END (b1) = PREV_INSN (insn);
1857 	}
1858       else if (insn == BB_HEAD (b1))
1859 	{
1860 	  /* We took insns from the start of the basic block,
1861 	     so update the start of block boundary so that
1862 	     it points to the first insn we did not move.  */
1863 	  BB_HEAD (b1) = NEXT_INSN (insn);
1864 	}
1865     }
1866   else
1867     {
1868       /* In block motion.  */
1869       sched_target_n_insns++;
1870     }
1871   sched_n_insns++;
1872 
1873   return 1;
1874 }
1875 
1876 /* Called after INSN has all its dependencies resolved.  Return nonzero
1877    if it should be moved to the ready list or the queue, or zero if we
1878    should silently discard it.  */
1879 static int
new_ready(rtx next)1880 new_ready (rtx next)
1881 {
1882   /* For speculative insns, before inserting to ready/queue,
1883      check live, exception-free, and issue-delay.  */
1884   if (INSN_BB (next) != target_bb
1885       && (!IS_VALID (INSN_BB (next))
1886 	  || CANT_MOVE (next)
1887 	  || (IS_SPECULATIVE_INSN (next)
1888 	      && (0
1889 		  || (targetm.sched.use_dfa_pipeline_interface
1890 		      && (*targetm.sched.use_dfa_pipeline_interface) ()
1891 		      && recog_memoized (next) >= 0
1892 		      && min_insn_conflict_delay (curr_state, next,
1893 						  next) > 3)
1894 		  || ((!targetm.sched.use_dfa_pipeline_interface
1895 		       || !(*targetm.sched.use_dfa_pipeline_interface) ())
1896 		      && insn_issue_delay (next) > 3)
1897 		  || !check_live (next, INSN_BB (next))
1898 		  || !is_exception_free (next, INSN_BB (next), target_bb)))))
1899     return 0;
1900   return 1;
1901 }
1902 
1903 /* Return a string that contains the insn uid and optionally anything else
1904    necessary to identify this insn in an output.  It's valid to use a
1905    static buffer for this.  The ALIGNED parameter should cause the string
1906    to be formatted so that multiple output lines will line up nicely.  */
1907 
1908 static const char *
rgn_print_insn(rtx insn,int aligned)1909 rgn_print_insn (rtx insn, int aligned)
1910 {
1911   static char tmp[80];
1912 
1913   if (aligned)
1914     sprintf (tmp, "b%3d: i%4d", INSN_BB (insn), INSN_UID (insn));
1915   else
1916     {
1917       if (current_nr_blocks > 1 && INSN_BB (insn) != target_bb)
1918 	sprintf (tmp, "%d/b%d", INSN_UID (insn), INSN_BB (insn));
1919       else
1920 	sprintf (tmp, "%d", INSN_UID (insn));
1921     }
1922   return tmp;
1923 }
1924 
1925 /* Compare priority of two insns.  Return a positive number if the second
1926    insn is to be preferred for scheduling, and a negative one if the first
1927    is to be preferred.  Zero if they are equally good.  */
1928 
1929 static int
rgn_rank(rtx insn1,rtx insn2)1930 rgn_rank (rtx insn1, rtx insn2)
1931 {
1932   /* Some comparison make sense in interblock scheduling only.  */
1933   if (INSN_BB (insn1) != INSN_BB (insn2))
1934     {
1935       int spec_val, prob_val;
1936 
1937       /* Prefer an inblock motion on an interblock motion.  */
1938       if ((INSN_BB (insn2) == target_bb) && (INSN_BB (insn1) != target_bb))
1939 	return 1;
1940       if ((INSN_BB (insn1) == target_bb) && (INSN_BB (insn2) != target_bb))
1941 	return -1;
1942 
1943       /* Prefer a useful motion on a speculative one.  */
1944       spec_val = IS_SPECULATIVE_INSN (insn1) - IS_SPECULATIVE_INSN (insn2);
1945       if (spec_val)
1946 	return spec_val;
1947 
1948       /* Prefer a more probable (speculative) insn.  */
1949       prob_val = INSN_PROBABILITY (insn2) - INSN_PROBABILITY (insn1);
1950       if (prob_val)
1951 	return prob_val;
1952     }
1953   return 0;
1954 }
1955 
1956 /* NEXT is an instruction that depends on INSN (a backward dependence);
1957    return nonzero if we should include this dependence in priority
1958    calculations.  */
1959 
1960 static int
contributes_to_priority(rtx next,rtx insn)1961 contributes_to_priority (rtx next, rtx insn)
1962 {
1963   return BLOCK_NUM (next) == BLOCK_NUM (insn);
1964 }
1965 
1966 /* INSN is a JUMP_INSN, COND_SET is the set of registers that are
1967    conditionally set before INSN.  Store the set of registers that
1968    must be considered as used by this jump in USED and that of
1969    registers that must be considered as set in SET.  */
1970 
1971 static void
compute_jump_reg_dependencies(rtx insn ATTRIBUTE_UNUSED,regset cond_exec ATTRIBUTE_UNUSED,regset used ATTRIBUTE_UNUSED,regset set ATTRIBUTE_UNUSED)1972 compute_jump_reg_dependencies (rtx insn ATTRIBUTE_UNUSED,
1973 			       regset cond_exec ATTRIBUTE_UNUSED,
1974 			       regset used ATTRIBUTE_UNUSED,
1975 			       regset set ATTRIBUTE_UNUSED)
1976 {
1977   /* Nothing to do here, since we postprocess jumps in
1978      add_branch_dependences.  */
1979 }
1980 
1981 /* Used in schedule_insns to initialize current_sched_info for scheduling
1982    regions (or single basic blocks).  */
1983 
1984 static struct sched_info region_sched_info =
1985 {
1986   init_ready_list,
1987   can_schedule_ready_p,
1988   schedule_more_p,
1989   new_ready,
1990   rgn_rank,
1991   rgn_print_insn,
1992   contributes_to_priority,
1993   compute_jump_reg_dependencies,
1994 
1995   NULL, NULL,
1996   NULL, NULL,
1997   0, 0, 0
1998 };
1999 
2000 /* Determine if PAT sets a CLASS_LIKELY_SPILLED_P register.  */
2001 
2002 static bool
sets_likely_spilled(rtx pat)2003 sets_likely_spilled (rtx pat)
2004 {
2005   bool ret = false;
2006   note_stores (pat, sets_likely_spilled_1, &ret);
2007   return ret;
2008 }
2009 
2010 static void
sets_likely_spilled_1(rtx x,rtx pat,void * data)2011 sets_likely_spilled_1 (rtx x, rtx pat, void *data)
2012 {
2013   bool *ret = (bool *) data;
2014 
2015   if (GET_CODE (pat) == SET
2016       && REG_P (x)
2017       && REGNO (x) < FIRST_PSEUDO_REGISTER
2018       && CLASS_LIKELY_SPILLED_P (REGNO_REG_CLASS (REGNO (x))))
2019     *ret = true;
2020 }
2021 
2022 /* Add dependences so that branches are scheduled to run last in their
2023    block.  */
2024 
2025 static void
add_branch_dependences(rtx head,rtx tail)2026 add_branch_dependences (rtx head, rtx tail)
2027 {
2028   rtx insn, last;
2029 
2030   /* For all branches, calls, uses, clobbers, cc0 setters, and instructions
2031      that can throw exceptions, force them to remain in order at the end of
2032      the block by adding dependencies and giving the last a high priority.
2033      There may be notes present, and prev_head may also be a note.
2034 
2035      Branches must obviously remain at the end.  Calls should remain at the
2036      end since moving them results in worse register allocation.  Uses remain
2037      at the end to ensure proper register allocation.
2038 
2039      cc0 setters remain at the end because they can't be moved away from
2040      their cc0 user.
2041 
2042      Insns setting CLASS_LIKELY_SPILLED_P registers (usually return values)
2043      are not moved before reload because we can wind up with register
2044      allocation failures.  */
2045 
2046   insn = tail;
2047   last = 0;
2048   while (GET_CODE (insn) == CALL_INSN
2049 	 || GET_CODE (insn) == JUMP_INSN
2050 	 || (GET_CODE (insn) == INSN
2051 	     && (GET_CODE (PATTERN (insn)) == USE
2052 		 || GET_CODE (PATTERN (insn)) == CLOBBER
2053 		 || can_throw_internal (insn)
2054 #ifdef HAVE_cc0
2055 		 || sets_cc0_p (PATTERN (insn))
2056 #endif
2057 		 || (!reload_completed
2058 		     && sets_likely_spilled (PATTERN (insn)))))
2059 	 || GET_CODE (insn) == NOTE)
2060     {
2061       if (GET_CODE (insn) != NOTE)
2062 	{
2063 	  if (last != 0 && !find_insn_list (insn, LOG_LINKS (last)))
2064 	    {
2065 	      add_dependence (last, insn, REG_DEP_ANTI);
2066 	      INSN_REF_COUNT (insn)++;
2067 	    }
2068 
2069 	  CANT_MOVE (insn) = 1;
2070 
2071 	  last = insn;
2072 	}
2073 
2074       /* Don't overrun the bounds of the basic block.  */
2075       if (insn == head)
2076 	break;
2077 
2078       insn = PREV_INSN (insn);
2079     }
2080 
2081   /* Make sure these insns are scheduled last in their block.  */
2082   insn = last;
2083   if (insn != 0)
2084     while (insn != head)
2085       {
2086 	insn = prev_nonnote_insn (insn);
2087 
2088 	if (INSN_REF_COUNT (insn) != 0)
2089 	  continue;
2090 
2091 	add_dependence (last, insn, REG_DEP_ANTI);
2092 	INSN_REF_COUNT (insn) = 1;
2093       }
2094 }
2095 
2096 /* Data structures for the computation of data dependences in a regions.  We
2097    keep one `deps' structure for every basic block.  Before analyzing the
2098    data dependences for a bb, its variables are initialized as a function of
2099    the variables of its predecessors.  When the analysis for a bb completes,
2100    we save the contents to the corresponding bb_deps[bb] variable.  */
2101 
2102 static struct deps *bb_deps;
2103 
2104 /* Duplicate the INSN_LIST elements of COPY and prepend them to OLD.  */
2105 
2106 static rtx
concat_INSN_LIST(rtx copy,rtx old)2107 concat_INSN_LIST (rtx copy, rtx old)
2108 {
2109   rtx new = old;
2110   for (; copy ; copy = XEXP (copy, 1))
2111     new = alloc_INSN_LIST (XEXP (copy, 0), new);
2112   return new;
2113 }
2114 
2115 static void
concat_insn_mem_list(rtx copy_insns,rtx copy_mems,rtx * old_insns_p,rtx * old_mems_p)2116 concat_insn_mem_list (rtx copy_insns, rtx copy_mems, rtx *old_insns_p,
2117 		      rtx *old_mems_p)
2118 {
2119   rtx new_insns = *old_insns_p;
2120   rtx new_mems = *old_mems_p;
2121 
2122   while (copy_insns)
2123     {
2124       new_insns = alloc_INSN_LIST (XEXP (copy_insns, 0), new_insns);
2125       new_mems = alloc_EXPR_LIST (VOIDmode, XEXP (copy_mems, 0), new_mems);
2126       copy_insns = XEXP (copy_insns, 1);
2127       copy_mems = XEXP (copy_mems, 1);
2128     }
2129 
2130   *old_insns_p = new_insns;
2131   *old_mems_p = new_mems;
2132 }
2133 
2134 /* After computing the dependencies for block BB, propagate the dependencies
2135    found in TMP_DEPS to the successors of the block.  */
2136 static void
propagate_deps(int bb,struct deps * pred_deps)2137 propagate_deps (int bb, struct deps *pred_deps)
2138 {
2139   int b = BB_TO_BLOCK (bb);
2140   int e, first_edge;
2141 
2142   /* bb's structures are inherited by its successors.  */
2143   first_edge = e = OUT_EDGES (b);
2144   if (e > 0)
2145     do
2146       {
2147 	int b_succ = TO_BLOCK (e);
2148 	int bb_succ = BLOCK_TO_BB (b_succ);
2149 	struct deps *succ_deps = bb_deps + bb_succ;
2150 	int reg;
2151 
2152 	/* Only bbs "below" bb, in the same region, are interesting.  */
2153 	if (CONTAINING_RGN (b) != CONTAINING_RGN (b_succ)
2154 	    || bb_succ <= bb)
2155 	  {
2156 	    e = NEXT_OUT (e);
2157 	    continue;
2158 	  }
2159 
2160 	/* The reg_last lists are inherited by bb_succ.  */
2161 	EXECUTE_IF_SET_IN_REG_SET (&pred_deps->reg_last_in_use, 0, reg,
2162 	  {
2163 	    struct deps_reg *pred_rl = &pred_deps->reg_last[reg];
2164 	    struct deps_reg *succ_rl = &succ_deps->reg_last[reg];
2165 
2166 	    succ_rl->uses = concat_INSN_LIST (pred_rl->uses, succ_rl->uses);
2167 	    succ_rl->sets = concat_INSN_LIST (pred_rl->sets, succ_rl->sets);
2168 	    succ_rl->clobbers = concat_INSN_LIST (pred_rl->clobbers,
2169 						  succ_rl->clobbers);
2170 	    succ_rl->uses_length += pred_rl->uses_length;
2171 	    succ_rl->clobbers_length += pred_rl->clobbers_length;
2172 	  });
2173 	IOR_REG_SET (&succ_deps->reg_last_in_use, &pred_deps->reg_last_in_use);
2174 
2175 	/* Mem read/write lists are inherited by bb_succ.  */
2176 	concat_insn_mem_list (pred_deps->pending_read_insns,
2177 			      pred_deps->pending_read_mems,
2178 			      &succ_deps->pending_read_insns,
2179 			      &succ_deps->pending_read_mems);
2180 	concat_insn_mem_list (pred_deps->pending_write_insns,
2181 			      pred_deps->pending_write_mems,
2182 			      &succ_deps->pending_write_insns,
2183 			      &succ_deps->pending_write_mems);
2184 
2185 	succ_deps->last_pending_memory_flush
2186 	  = concat_INSN_LIST (pred_deps->last_pending_memory_flush,
2187 			      succ_deps->last_pending_memory_flush);
2188 
2189 	succ_deps->pending_lists_length += pred_deps->pending_lists_length;
2190 	succ_deps->pending_flush_length += pred_deps->pending_flush_length;
2191 
2192 	/* last_function_call is inherited by bb_succ.  */
2193 	succ_deps->last_function_call
2194 	  = concat_INSN_LIST (pred_deps->last_function_call,
2195 			      succ_deps->last_function_call);
2196 
2197 	/* sched_before_next_call is inherited by bb_succ.  */
2198 	succ_deps->sched_before_next_call
2199 	  = concat_INSN_LIST (pred_deps->sched_before_next_call,
2200 			      succ_deps->sched_before_next_call);
2201 
2202 	e = NEXT_OUT (e);
2203       }
2204     while (e != first_edge);
2205 
2206   /* These lists should point to the right place, for correct
2207      freeing later.  */
2208   bb_deps[bb].pending_read_insns = pred_deps->pending_read_insns;
2209   bb_deps[bb].pending_read_mems = pred_deps->pending_read_mems;
2210   bb_deps[bb].pending_write_insns = pred_deps->pending_write_insns;
2211   bb_deps[bb].pending_write_mems = pred_deps->pending_write_mems;
2212 
2213   /* Can't allow these to be freed twice.  */
2214   pred_deps->pending_read_insns = 0;
2215   pred_deps->pending_read_mems = 0;
2216   pred_deps->pending_write_insns = 0;
2217   pred_deps->pending_write_mems = 0;
2218 }
2219 
2220 /* Compute backward dependences inside bb.  In a multiple blocks region:
2221    (1) a bb is analyzed after its predecessors, and (2) the lists in
2222    effect at the end of bb (after analyzing for bb) are inherited by
2223    bb's successors.
2224 
2225    Specifically for reg-reg data dependences, the block insns are
2226    scanned by sched_analyze () top-to-bottom.  Two lists are
2227    maintained by sched_analyze (): reg_last[].sets for register DEFs,
2228    and reg_last[].uses for register USEs.
2229 
2230    When analysis is completed for bb, we update for its successors:
2231    ;  - DEFS[succ] = Union (DEFS [succ], DEFS [bb])
2232    ;  - USES[succ] = Union (USES [succ], DEFS [bb])
2233 
2234    The mechanism for computing mem-mem data dependence is very
2235    similar, and the result is interblock dependences in the region.  */
2236 
2237 static void
compute_block_backward_dependences(int bb)2238 compute_block_backward_dependences (int bb)
2239 {
2240   rtx head, tail;
2241   struct deps tmp_deps;
2242 
2243   tmp_deps = bb_deps[bb];
2244 
2245   /* Do the analysis for this block.  */
2246   get_block_head_tail (BB_TO_BLOCK (bb), &head, &tail);
2247   sched_analyze (&tmp_deps, head, tail);
2248   add_branch_dependences (head, tail);
2249 
2250   if (current_nr_blocks > 1)
2251     propagate_deps (bb, &tmp_deps);
2252 
2253   /* Free up the INSN_LISTs.  */
2254   free_deps (&tmp_deps);
2255 }
2256 
2257 /* Remove all INSN_LISTs and EXPR_LISTs from the pending lists and add
2258    them to the unused_*_list variables, so that they can be reused.  */
2259 
2260 static void
free_pending_lists(void)2261 free_pending_lists (void)
2262 {
2263   int bb;
2264 
2265   for (bb = 0; bb < current_nr_blocks; bb++)
2266     {
2267       free_INSN_LIST_list (&bb_deps[bb].pending_read_insns);
2268       free_INSN_LIST_list (&bb_deps[bb].pending_write_insns);
2269       free_EXPR_LIST_list (&bb_deps[bb].pending_read_mems);
2270       free_EXPR_LIST_list (&bb_deps[bb].pending_write_mems);
2271     }
2272 }
2273 
2274 /* Print dependences for debugging, callable from debugger.  */
2275 
2276 void
debug_dependencies(void)2277 debug_dependencies (void)
2278 {
2279   int bb;
2280 
2281   fprintf (sched_dump, ";;   --------------- forward dependences: ------------ \n");
2282   for (bb = 0; bb < current_nr_blocks; bb++)
2283     {
2284       if (1)
2285 	{
2286 	  rtx head, tail;
2287 	  rtx next_tail;
2288 	  rtx insn;
2289 
2290 	  get_block_head_tail (BB_TO_BLOCK (bb), &head, &tail);
2291 	  next_tail = NEXT_INSN (tail);
2292 	  fprintf (sched_dump, "\n;;   --- Region Dependences --- b %d bb %d \n",
2293 		   BB_TO_BLOCK (bb), bb);
2294 
2295 	  if (targetm.sched.use_dfa_pipeline_interface
2296 	      && (*targetm.sched.use_dfa_pipeline_interface) ())
2297 	    {
2298 	      fprintf (sched_dump, ";;   %7s%6s%6s%6s%6s%6s%14s\n",
2299 		       "insn", "code", "bb", "dep", "prio", "cost",
2300 		       "reservation");
2301 	      fprintf (sched_dump, ";;   %7s%6s%6s%6s%6s%6s%14s\n",
2302 		       "----", "----", "--", "---", "----", "----",
2303 		       "-----------");
2304 	    }
2305 	  else
2306 	    {
2307 	      fprintf (sched_dump, ";;   %7s%6s%6s%6s%6s%6s%11s%6s\n",
2308 	      "insn", "code", "bb", "dep", "prio", "cost", "blockage", "units");
2309 	      fprintf (sched_dump, ";;   %7s%6s%6s%6s%6s%6s%11s%6s\n",
2310 	      "----", "----", "--", "---", "----", "----", "--------", "-----");
2311 	    }
2312 
2313 	  for (insn = head; insn != next_tail; insn = NEXT_INSN (insn))
2314 	    {
2315 	      rtx link;
2316 
2317 	      if (! INSN_P (insn))
2318 		{
2319 		  int n;
2320 		  fprintf (sched_dump, ";;   %6d ", INSN_UID (insn));
2321 		  if (GET_CODE (insn) == NOTE)
2322 		    {
2323 		      n = NOTE_LINE_NUMBER (insn);
2324 		      if (n < 0)
2325 			fprintf (sched_dump, "%s\n", GET_NOTE_INSN_NAME (n));
2326 		      else
2327 			fprintf (sched_dump, "line %d, file %s\n", n,
2328 				 NOTE_SOURCE_FILE (insn));
2329 		    }
2330 		  else
2331 		    fprintf (sched_dump, " {%s}\n", GET_RTX_NAME (GET_CODE (insn)));
2332 		  continue;
2333 		}
2334 
2335 	      if (targetm.sched.use_dfa_pipeline_interface
2336 		  && (*targetm.sched.use_dfa_pipeline_interface) ())
2337 		{
2338 		  fprintf (sched_dump,
2339 			   ";;   %s%5d%6d%6d%6d%6d%6d   ",
2340 			   (SCHED_GROUP_P (insn) ? "+" : " "),
2341 			   INSN_UID (insn),
2342 			   INSN_CODE (insn),
2343 			   INSN_BB (insn),
2344 			   INSN_DEP_COUNT (insn),
2345 			   INSN_PRIORITY (insn),
2346 			   insn_cost (insn, 0, 0));
2347 
2348 		  if (recog_memoized (insn) < 0)
2349 		    fprintf (sched_dump, "nothing");
2350 		  else
2351 		    print_reservation (sched_dump, insn);
2352 		}
2353 	      else
2354 		{
2355 		  int unit = insn_unit (insn);
2356 		  int range
2357 		    = (unit < 0
2358 		       || function_units[unit].blockage_range_function == 0
2359 		       ? 0
2360 		       : function_units[unit].blockage_range_function (insn));
2361 		  fprintf (sched_dump,
2362 			   ";;   %s%5d%6d%6d%6d%6d%6d  %3d -%3d   ",
2363 			   (SCHED_GROUP_P (insn) ? "+" : " "),
2364 			   INSN_UID (insn),
2365 			   INSN_CODE (insn),
2366 			   INSN_BB (insn),
2367 			   INSN_DEP_COUNT (insn),
2368 			   INSN_PRIORITY (insn),
2369 			   insn_cost (insn, 0, 0),
2370 			   (int) MIN_BLOCKAGE_COST (range),
2371 			   (int) MAX_BLOCKAGE_COST (range));
2372 		  insn_print_units (insn);
2373 		}
2374 
2375 	      fprintf (sched_dump, "\t: ");
2376 	      for (link = INSN_DEPEND (insn); link; link = XEXP (link, 1))
2377 		fprintf (sched_dump, "%d ", INSN_UID (XEXP (link, 0)));
2378 	      fprintf (sched_dump, "\n");
2379 	    }
2380 	}
2381     }
2382   fprintf (sched_dump, "\n");
2383 }
2384 
2385 /* Schedule a region.  A region is either an inner loop, a loop-free
2386    subroutine, or a single basic block.  Each bb in the region is
2387    scheduled after its flow predecessors.  */
2388 
2389 static void
schedule_region(int rgn)2390 schedule_region (int rgn)
2391 {
2392   int bb;
2393   int rgn_n_insns = 0;
2394   int sched_rgn_n_insns = 0;
2395 
2396   /* Set variables for the current region.  */
2397   current_nr_blocks = RGN_NR_BLOCKS (rgn);
2398   current_blocks = RGN_BLOCKS (rgn);
2399 
2400   init_deps_global ();
2401 
2402   /* Initializations for region data dependence analysis.  */
2403   bb_deps = xmalloc (sizeof (struct deps) * current_nr_blocks);
2404   for (bb = 0; bb < current_nr_blocks; bb++)
2405     init_deps (bb_deps + bb);
2406 
2407   /* Compute LOG_LINKS.  */
2408   for (bb = 0; bb < current_nr_blocks; bb++)
2409     compute_block_backward_dependences (bb);
2410 
2411   /* Compute INSN_DEPEND.  */
2412   for (bb = current_nr_blocks - 1; bb >= 0; bb--)
2413     {
2414       rtx head, tail;
2415       get_block_head_tail (BB_TO_BLOCK (bb), &head, &tail);
2416 
2417       compute_forward_dependences (head, tail);
2418 
2419       if (targetm.sched.dependencies_evaluation_hook)
2420 	targetm.sched.dependencies_evaluation_hook (head, tail);
2421 
2422     }
2423 
2424   /* Set priorities.  */
2425   for (bb = 0; bb < current_nr_blocks; bb++)
2426     {
2427       rtx head, tail;
2428       get_block_head_tail (BB_TO_BLOCK (bb), &head, &tail);
2429 
2430       rgn_n_insns += set_priorities (head, tail);
2431     }
2432 
2433   /* Compute interblock info: probabilities, split-edges, dominators, etc.  */
2434   if (current_nr_blocks > 1)
2435     {
2436       int i;
2437 
2438       prob = xmalloc ((current_nr_blocks) * sizeof (float));
2439 
2440       dom = sbitmap_vector_alloc (current_nr_blocks, current_nr_blocks);
2441       sbitmap_vector_zero (dom, current_nr_blocks);
2442       /* Edge to bit.  */
2443       rgn_nr_edges = 0;
2444       edge_to_bit = xmalloc (nr_edges * sizeof (int));
2445       for (i = 1; i < nr_edges; i++)
2446 	if (CONTAINING_RGN (FROM_BLOCK (i)) == rgn)
2447 	  EDGE_TO_BIT (i) = rgn_nr_edges++;
2448       rgn_edges = xmalloc (rgn_nr_edges * sizeof (int));
2449 
2450       rgn_nr_edges = 0;
2451       for (i = 1; i < nr_edges; i++)
2452 	if (CONTAINING_RGN (FROM_BLOCK (i)) == (rgn))
2453 	  rgn_edges[rgn_nr_edges++] = i;
2454 
2455       /* Split edges.  */
2456       pot_split = sbitmap_vector_alloc (current_nr_blocks, rgn_nr_edges);
2457       sbitmap_vector_zero (pot_split, current_nr_blocks);
2458       ancestor_edges = sbitmap_vector_alloc (current_nr_blocks, rgn_nr_edges);
2459       sbitmap_vector_zero (ancestor_edges, current_nr_blocks);
2460 
2461       /* Compute probabilities, dominators, split_edges.  */
2462       for (bb = 0; bb < current_nr_blocks; bb++)
2463 	compute_dom_prob_ps (bb);
2464     }
2465 
2466   /* Now we can schedule all blocks.  */
2467   for (bb = 0; bb < current_nr_blocks; bb++)
2468     {
2469       rtx head, tail;
2470       int b = BB_TO_BLOCK (bb);
2471 
2472       get_block_head_tail (b, &head, &tail);
2473 
2474       if (no_real_insns_p (head, tail))
2475 	continue;
2476 
2477       current_sched_info->prev_head = PREV_INSN (head);
2478       current_sched_info->next_tail = NEXT_INSN (tail);
2479 
2480       if (write_symbols != NO_DEBUG)
2481 	{
2482 	  save_line_notes (b, head, tail);
2483 	  rm_line_notes (head, tail);
2484 	}
2485 
2486       /* rm_other_notes only removes notes which are _inside_ the
2487 	 block---that is, it won't remove notes before the first real insn
2488 	 or after the last real insn of the block.  So if the first insn
2489 	 has a REG_SAVE_NOTE which would otherwise be emitted before the
2490 	 insn, it is redundant with the note before the start of the
2491 	 block, and so we have to take it out.  */
2492       if (INSN_P (head))
2493 	{
2494 	  rtx note;
2495 
2496 	  for (note = REG_NOTES (head); note; note = XEXP (note, 1))
2497 	    if (REG_NOTE_KIND (note) == REG_SAVE_NOTE)
2498 	      {
2499 		remove_note (head, note);
2500 		note = XEXP (note, 1);
2501 		remove_note (head, note);
2502 	      }
2503 	}
2504 
2505       /* Remove remaining note insns from the block, save them in
2506 	 note_list.  These notes are restored at the end of
2507 	 schedule_block ().  */
2508       rm_other_notes (head, tail);
2509 
2510       target_bb = bb;
2511 
2512       current_sched_info->queue_must_finish_empty
2513 	= current_nr_blocks > 1 && !flag_schedule_interblock;
2514 
2515       schedule_block (b, rgn_n_insns);
2516       sched_rgn_n_insns += sched_n_insns;
2517 
2518       /* Update target block boundaries.  */
2519       if (head == BB_HEAD (BASIC_BLOCK (b)))
2520 	BB_HEAD (BASIC_BLOCK (b)) = current_sched_info->head;
2521       if (tail == BB_END (BASIC_BLOCK (b)))
2522 	BB_END (BASIC_BLOCK (b)) = current_sched_info->tail;
2523 
2524       /* Clean up.  */
2525       if (current_nr_blocks > 1)
2526 	{
2527 	  free (candidate_table);
2528 	  free (bblst_table);
2529 	  free (bitlst_table);
2530 	}
2531     }
2532 
2533   /* Sanity check: verify that all region insns were scheduled.  */
2534   if (sched_rgn_n_insns != rgn_n_insns)
2535     abort ();
2536 
2537   /* Restore line notes.  */
2538   if (write_symbols != NO_DEBUG)
2539     {
2540       for (bb = 0; bb < current_nr_blocks; bb++)
2541 	{
2542 	  rtx head, tail;
2543 	  get_block_head_tail (BB_TO_BLOCK (bb), &head, &tail);
2544 	  restore_line_notes (head, tail);
2545 	}
2546     }
2547 
2548   /* Done with this region.  */
2549   free_pending_lists ();
2550 
2551   finish_deps_global ();
2552 
2553   free (bb_deps);
2554 
2555   if (current_nr_blocks > 1)
2556     {
2557       free (prob);
2558       sbitmap_vector_free (dom);
2559       sbitmap_vector_free (pot_split);
2560       sbitmap_vector_free (ancestor_edges);
2561       free (edge_to_bit);
2562       free (rgn_edges);
2563     }
2564 }
2565 
2566 /* Indexed by region, holds the number of death notes found in that region.
2567    Used for consistency checks.  */
2568 static int *deaths_in_region;
2569 
2570 /* Initialize data structures for region scheduling.  */
2571 
2572 static void
init_regions(void)2573 init_regions (void)
2574 {
2575   sbitmap blocks;
2576   int rgn;
2577 
2578   nr_regions = 0;
2579   rgn_table = xmalloc ((n_basic_blocks) * sizeof (region));
2580   rgn_bb_table = xmalloc ((n_basic_blocks) * sizeof (int));
2581   block_to_bb = xmalloc ((last_basic_block) * sizeof (int));
2582   containing_rgn = xmalloc ((last_basic_block) * sizeof (int));
2583 
2584   /* Compute regions for scheduling.  */
2585   if (reload_completed
2586       || n_basic_blocks == 1
2587       || !flag_schedule_interblock)
2588     {
2589       find_single_block_region ();
2590     }
2591   else
2592     {
2593       /* Verify that a 'good' control flow graph can be built.  */
2594       if (is_cfg_nonregular ())
2595 	{
2596 	  find_single_block_region ();
2597 	}
2598       else
2599 	{
2600 	  struct edge_list *edge_list;
2601 
2602 	  /* The scheduler runs after estimate_probabilities; therefore, we
2603 	     can't blindly call back into find_basic_blocks since doing so
2604 	     could invalidate the branch probability info.  We could,
2605 	     however, call cleanup_cfg.  */
2606 	  edge_list = create_edge_list ();
2607 
2608 	  /* Compute the dominators and post dominators.  */
2609 	  calculate_dominance_info (CDI_DOMINATORS);
2610 
2611 	  /* build_control_flow will return nonzero if it detects unreachable
2612 	     blocks or any other irregularity with the cfg which prevents
2613 	     cross block scheduling.  */
2614 	  if (build_control_flow (edge_list) != 0)
2615 	    find_single_block_region ();
2616 	  else
2617 	    find_rgns (edge_list);
2618 
2619 	  if (sched_verbose >= 3)
2620 	    debug_regions ();
2621 
2622 	  /* We are done with flow's edge list.  */
2623 	  free_edge_list (edge_list);
2624 
2625 	  /* For now.  This will move as more and more of haifa is converted
2626 	     to using the cfg code in flow.c.  */
2627 	  free_dominance_info (CDI_DOMINATORS);
2628 	}
2629     }
2630 
2631 
2632   if (CHECK_DEAD_NOTES)
2633     {
2634       blocks = sbitmap_alloc (last_basic_block);
2635       deaths_in_region = xmalloc (sizeof (int) * nr_regions);
2636       /* Remove all death notes from the subroutine.  */
2637       for (rgn = 0; rgn < nr_regions; rgn++)
2638 	{
2639 	  int b;
2640 
2641 	  sbitmap_zero (blocks);
2642 	  for (b = RGN_NR_BLOCKS (rgn) - 1; b >= 0; --b)
2643 	    SET_BIT (blocks, rgn_bb_table[RGN_BLOCKS (rgn) + b]);
2644 
2645 	  deaths_in_region[rgn] = count_or_remove_death_notes (blocks, 1);
2646 	}
2647       sbitmap_free (blocks);
2648     }
2649   else
2650     count_or_remove_death_notes (NULL, 1);
2651 }
2652 
2653 /* The one entry point in this file.  DUMP_FILE is the dump file for
2654    this pass.  */
2655 
2656 void
schedule_insns(FILE * dump_file)2657 schedule_insns (FILE *dump_file)
2658 {
2659   sbitmap large_region_blocks, blocks;
2660   int rgn;
2661   int any_large_regions;
2662   basic_block bb;
2663 
2664   /* Taking care of this degenerate case makes the rest of
2665      this code simpler.  */
2666   if (n_basic_blocks == 0)
2667     return;
2668 
2669   nr_inter = 0;
2670   nr_spec = 0;
2671 
2672   sched_init (dump_file);
2673 
2674   init_regions ();
2675 
2676   current_sched_info = &region_sched_info;
2677 
2678   /* Schedule every region in the subroutine.  */
2679   for (rgn = 0; rgn < nr_regions; rgn++)
2680     schedule_region (rgn);
2681 
2682   /* Update life analysis for the subroutine.  Do single block regions
2683      first so that we can verify that live_at_start didn't change.  Then
2684      do all other blocks.  */
2685   /* ??? There is an outside possibility that update_life_info, or more
2686      to the point propagate_block, could get called with nonzero flags
2687      more than once for one basic block.  This would be kinda bad if it
2688      were to happen, since REG_INFO would be accumulated twice for the
2689      block, and we'd have twice the REG_DEAD notes.
2690 
2691      I'm fairly certain that this _shouldn't_ happen, since I don't think
2692      that live_at_start should change at region heads.  Not sure what the
2693      best way to test for this kind of thing...  */
2694 
2695   allocate_reg_life_data ();
2696   compute_bb_for_insn ();
2697 
2698   any_large_regions = 0;
2699   large_region_blocks = sbitmap_alloc (last_basic_block);
2700   sbitmap_zero (large_region_blocks);
2701   FOR_EACH_BB (bb)
2702     SET_BIT (large_region_blocks, bb->index);
2703 
2704   blocks = sbitmap_alloc (last_basic_block);
2705   sbitmap_zero (blocks);
2706 
2707   /* Update life information.  For regions consisting of multiple blocks
2708      we've possibly done interblock scheduling that affects global liveness.
2709      For regions consisting of single blocks we need to do only local
2710      liveness.  */
2711   for (rgn = 0; rgn < nr_regions; rgn++)
2712     if (RGN_NR_BLOCKS (rgn) > 1)
2713       any_large_regions = 1;
2714     else
2715       {
2716 	SET_BIT (blocks, rgn_bb_table[RGN_BLOCKS (rgn)]);
2717 	RESET_BIT (large_region_blocks, rgn_bb_table[RGN_BLOCKS (rgn)]);
2718       }
2719 
2720   /* Don't update reg info after reload, since that affects
2721      regs_ever_live, which should not change after reload.  */
2722   update_life_info (blocks, UPDATE_LIFE_LOCAL,
2723 		    (reload_completed ? PROP_DEATH_NOTES
2724 		     : PROP_DEATH_NOTES | PROP_REG_INFO));
2725   if (any_large_regions)
2726     {
2727       update_life_info (large_region_blocks, UPDATE_LIFE_GLOBAL,
2728 			PROP_DEATH_NOTES | PROP_REG_INFO);
2729     }
2730 
2731   if (CHECK_DEAD_NOTES)
2732     {
2733       /* Verify the counts of basic block notes in single the basic block
2734          regions.  */
2735       for (rgn = 0; rgn < nr_regions; rgn++)
2736 	if (RGN_NR_BLOCKS (rgn) == 1)
2737 	  {
2738 	    sbitmap_zero (blocks);
2739 	    SET_BIT (blocks, rgn_bb_table[RGN_BLOCKS (rgn)]);
2740 
2741 	    if (deaths_in_region[rgn]
2742 		!= count_or_remove_death_notes (blocks, 0))
2743 	      abort ();
2744 	  }
2745       free (deaths_in_region);
2746     }
2747 
2748   /* Reposition the prologue and epilogue notes in case we moved the
2749      prologue/epilogue insns.  */
2750   if (reload_completed)
2751     reposition_prologue_and_epilogue_notes (get_insns ());
2752 
2753   /* Delete redundant line notes.  */
2754   if (write_symbols != NO_DEBUG)
2755     rm_redundant_line_notes ();
2756 
2757   if (sched_verbose)
2758     {
2759       if (reload_completed == 0 && flag_schedule_interblock)
2760 	{
2761 	  fprintf (sched_dump,
2762 		   "\n;; Procedure interblock/speculative motions == %d/%d \n",
2763 		   nr_inter, nr_spec);
2764 	}
2765       else
2766 	{
2767 	  if (nr_inter > 0)
2768 	    abort ();
2769 	}
2770       fprintf (sched_dump, "\n\n");
2771     }
2772 
2773   /* Clean up.  */
2774   free (rgn_table);
2775   free (rgn_bb_table);
2776   free (block_to_bb);
2777   free (containing_rgn);
2778 
2779   sched_finish ();
2780 
2781   if (edge_table)
2782     {
2783       free (edge_table);
2784       edge_table = NULL;
2785     }
2786 
2787   if (in_edges)
2788     {
2789       free (in_edges);
2790       in_edges = NULL;
2791     }
2792   if (out_edges)
2793     {
2794       free (out_edges);
2795       out_edges = NULL;
2796     }
2797 
2798   sbitmap_free (blocks);
2799   sbitmap_free (large_region_blocks);
2800 }
2801 #endif
2802