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