OSDN Git Service

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