OSDN Git Service

* haifa-sched.c (alloc_EXPR_LIST): Change to use
[pf3gnuchains/gcc-fork.git] / gcc / haifa-sched.c
1 /* Instruction scheduling pass.
2    Copyright (C) 1992, 93-97, 1998 Free Software Foundation, Inc.
3    Contributed by Michael Tiemann (tiemann@cygnus.com) Enhanced by,
4    and currently maintained by, Jim Wilson (wilson@cygnus.com)
5
6    This file is part of GNU CC.
7
8    GNU CC is free software; you can redistribute it and/or modify it
9    under the terms of the GNU General Public License as published by
10    the Free Software Foundation; either version 2, or (at your option)
11    any later version.
12
13    GNU CC is distributed in the hope that it will be useful, but
14    WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16    General Public License for more details.
17
18    You should have received a copy of the GNU General Public License
19    along with GNU CC; see the file COPYING.  If not, write to the Free
20    the Free Software Foundation, 59 Temple Place - Suite 330,
21    Boston, MA 02111-1307, USA.  */
22
23
24 /* Instruction scheduling pass.
25
26    This pass implements list scheduling within basic blocks.  It is
27    run twice: (1) after flow analysis, but before register allocation,
28    and (2) after register allocation.
29
30    The first run performs interblock scheduling, moving insns between
31    different blocks in the same "region", and the second runs only
32    basic block scheduling.
33
34    Interblock motions performed are useful motions and speculative
35    motions, including speculative loads.  Motions requiring code
36    duplication are not supported.  The identification of motion type
37    and the check for validity of speculative motions requires
38    construction and analysis of the function's control flow graph.
39    The scheduler works as follows:
40
41    We compute insn priorities based on data dependencies.  Flow
42    analysis only creates a fraction of the data-dependencies we must
43    observe: namely, only those dependencies which the combiner can be
44    expected to use.  For this pass, we must therefore create the
45    remaining dependencies we need to observe: register dependencies,
46    memory dependencies, dependencies to keep function calls in order,
47    and the dependence between a conditional branch and the setting of
48    condition codes are all dealt with here.
49
50    The scheduler first traverses the data flow graph, starting with
51    the last instruction, and proceeding to the first, assigning values
52    to insn_priority as it goes.  This sorts the instructions
53    topologically by data dependence.
54
55    Once priorities have been established, we order the insns using
56    list scheduling.  This works as follows: starting with a list of
57    all the ready insns, and sorted according to priority number, we
58    schedule the insn from the end of the list by placing its
59    predecessors in the list according to their priority order.  We
60    consider this insn scheduled by setting the pointer to the "end" of
61    the list to point to the previous insn.  When an insn has no
62    predecessors, we either queue it until sufficient time has elapsed
63    or add it to the ready list.  As the instructions are scheduled or
64    when stalls are introduced, the queue advances and dumps insns into
65    the ready list.  When all insns down to the lowest priority have
66    been scheduled, the critical path of the basic block has been made
67    as short as possible.  The remaining insns are then scheduled in
68    remaining slots.
69
70    Function unit conflicts are resolved during forward list scheduling
71    by tracking the time when each insn is committed to the schedule
72    and from that, the time the function units it uses must be free.
73    As insns on the ready list are considered for scheduling, those
74    that would result in a blockage of the already committed insns are
75    queued until no blockage will result.
76
77    The following list shows the order in which we want to break ties
78    among insns in the ready list:
79
80    1.  choose insn with the longest path to end of bb, ties
81    broken by
82    2.  choose insn with least contribution to register pressure,
83    ties broken by
84    3.  prefer in-block upon interblock motion, ties broken by
85    4.  prefer useful upon speculative motion, ties broken by
86    5.  choose insn with largest control flow probability, ties
87    broken by
88    6.  choose insn with the least dependences upon the previously
89    scheduled insn, or finally
90    7   choose the insn which has the most insns dependent on it.
91    8.  choose insn with lowest UID.
92
93    Memory references complicate matters.  Only if we can be certain
94    that memory references are not part of the data dependency graph
95    (via true, anti, or output dependence), can we move operations past
96    memory references.  To first approximation, reads can be done
97    independently, while writes introduce dependencies.  Better
98    approximations will yield fewer dependencies.
99
100    Before reload, an extended analysis of interblock data dependences
101    is required for interblock scheduling.  This is performed in
102    compute_block_backward_dependences ().
103
104    Dependencies set up by memory references are treated in exactly the
105    same way as other dependencies, by using LOG_LINKS backward
106    dependences.  LOG_LINKS are translated into INSN_DEPEND forward
107    dependences for the purpose of forward list scheduling.
108
109    Having optimized the critical path, we may have also unduly
110    extended the lifetimes of some registers.  If an operation requires
111    that constants be loaded into registers, it is certainly desirable
112    to load those constants as early as necessary, but no earlier.
113    I.e., it will not do to load up a bunch of registers at the
114    beginning of a basic block only to use them at the end, if they
115    could be loaded later, since this may result in excessive register
116    utilization.
117
118    Note that since branches are never in basic blocks, but only end
119    basic blocks, this pass will not move branches.  But that is ok,
120    since we can use GNU's delayed branch scheduling pass to take care
121    of this case.
122
123    Also note that no further optimizations based on algebraic
124    identities are performed, so this pass would be a good one to
125    perform instruction splitting, such as breaking up a multiply
126    instruction into shifts and adds where that is profitable.
127
128    Given the memory aliasing analysis that this pass should perform,
129    it should be possible to remove redundant stores to memory, and to
130    load values from registers instead of hitting memory.
131
132    Before reload, speculative insns are moved only if a 'proof' exists
133    that no exception will be caused by this, and if no live registers
134    exist that inhibit the motion (live registers constraints are not
135    represented by data dependence edges).
136
137    This pass must update information that subsequent passes expect to
138    be correct.  Namely: reg_n_refs, reg_n_sets, reg_n_deaths,
139    reg_n_calls_crossed, and reg_live_length.  Also, basic_block_head,
140    basic_block_end.
141
142    The information in the line number notes is carefully retained by
143    this pass.  Notes that refer to the starting and ending of
144    exception regions are also carefully retained by this pass.  All
145    other NOTE insns are grouped in their same relative order at the
146    beginning of basic blocks and regions that have been scheduled.
147
148    The main entry point for this pass is schedule_insns(), called for
149    each function.  The work of the scheduler is organized in three
150    levels: (1) function level: insns are subject to splitting,
151    control-flow-graph is constructed, regions are computed (after
152    reload, each region is of one block), (2) region level: control
153    flow graph attributes required for interblock scheduling are
154    computed (dominators, reachability, etc.), data dependences and
155    priorities are computed, and (3) block level: insns in the block
156    are actually scheduled.  */
157 \f
158 #include "config.h"
159 #include "system.h"
160 #include "rtl.h"
161 #include "basic-block.h"
162 #include "regs.h"
163 #include "hard-reg-set.h"
164 #include "flags.h"
165 #include "insn-config.h"
166 #include "insn-attr.h"
167 #include "except.h"
168 #include "toplev.h"
169
170 extern char *reg_known_equiv_p;
171 extern rtx *reg_known_value;
172
173 #ifdef INSN_SCHEDULING
174
175 /* target_units bitmask has 1 for each unit in the cpu.  It should be
176    possible to compute this variable from the machine description.
177    But currently it is computed by examinning the insn list.  Since
178    this is only needed for visualization, it seems an acceptable
179    solution.  (For understanding the mapping of bits to units, see
180    definition of function_units[] in "insn-attrtab.c") */
181
182 static int target_units = 0;
183
184 /* issue_rate is the number of insns that can be scheduled in the same
185    machine cycle.  It can be defined in the config/mach/mach.h file,
186    otherwise we set it to 1.  */
187
188 static int issue_rate;
189
190 #ifndef ISSUE_RATE
191 #define ISSUE_RATE 1
192 #endif
193
194 /* sched-verbose controls the amount of debugging output the
195    scheduler prints.  It is controlled by -fsched-verbose-N:
196    N>0 and no -DSR : the output is directed to stderr.
197    N>=10 will direct the printouts to stderr (regardless of -dSR).
198    N=1: same as -dSR.
199    N=2: bb's probabilities, detailed ready list info, unit/insn info.
200    N=3: rtl at abort point, control-flow, regions info.
201    N=5: dependences info.  */
202
203 #define MAX_RGN_BLOCKS 10
204 #define MAX_RGN_INSNS 100
205
206 static int sched_verbose_param = 0;
207 static int sched_verbose = 0;
208
209 /* nr_inter/spec counts interblock/speculative motion for the function */
210 static int nr_inter, nr_spec;
211
212
213 /* debugging file. all printouts are sent to dump, which is always set,
214    either to stderr, or to the dump listing file (-dRS).  */
215 static FILE *dump = 0;
216
217 /* fix_sched_param() is called from toplev.c upon detection
218    of the -fsched-***-N options.  */
219
220 void
221 fix_sched_param (param, val)
222      char *param, *val;
223 {
224   if (!strcmp (param, "verbose"))
225     sched_verbose_param = atoi (val);
226   else
227     warning ("fix_sched_param: unknown param: %s", param);
228 }
229
230
231 /* Arrays set up by scheduling for the same respective purposes as
232    similar-named arrays set up by flow analysis.  We work with these
233    arrays during the scheduling pass so we can compare values against
234    unscheduled code.
235
236    Values of these arrays are copied at the end of this pass into the
237    arrays set up by flow analysis.  */
238 static int *sched_reg_n_calls_crossed;
239 static int *sched_reg_live_length;
240 static int *sched_reg_basic_block;
241
242 /* We need to know the current block number during the post scheduling
243    update of live register information so that we can also update
244    REG_BASIC_BLOCK if a register changes blocks.  */
245 static int current_block_num;
246
247 /* Element N is the next insn that sets (hard or pseudo) register
248    N within the current basic block; or zero, if there is no
249    such insn.  Needed for new registers which may be introduced
250    by splitting insns.  */
251 static rtx *reg_last_uses;
252 static rtx *reg_last_sets;
253 static regset reg_pending_sets;
254 static int reg_pending_sets_all;
255
256 /* Vector indexed by INSN_UID giving the original ordering of the insns.  */
257 static int *insn_luid;
258 #define INSN_LUID(INSN) (insn_luid[INSN_UID (INSN)])
259
260 /* Vector indexed by INSN_UID giving each instruction a priority.  */
261 static int *insn_priority;
262 #define INSN_PRIORITY(INSN) (insn_priority[INSN_UID (INSN)])
263
264 static short *insn_costs;
265 #define INSN_COST(INSN) insn_costs[INSN_UID (INSN)]
266
267 /* Vector indexed by INSN_UID giving an encoding of the function units
268    used.  */
269 static short *insn_units;
270 #define INSN_UNIT(INSN) insn_units[INSN_UID (INSN)]
271
272 /* Vector indexed by INSN_UID giving each instruction a register-weight.
273    This weight is an estimation of the insn contribution to registers pressure.  */
274 static int *insn_reg_weight;
275 #define INSN_REG_WEIGHT(INSN) (insn_reg_weight[INSN_UID (INSN)])
276
277 /* Vector indexed by INSN_UID giving list of insns which
278    depend upon INSN.  Unlike LOG_LINKS, it represents forward dependences.  */
279 static rtx *insn_depend;
280 #define INSN_DEPEND(INSN) insn_depend[INSN_UID (INSN)]
281
282 /* Vector indexed by INSN_UID. Initialized to the number of incoming
283    edges in forward dependence graph (= number of LOG_LINKS).  As
284    scheduling procedes, dependence counts are decreased.  An
285    instruction moves to the ready list when its counter is zero.  */
286 static int *insn_dep_count;
287 #define INSN_DEP_COUNT(INSN) (insn_dep_count[INSN_UID (INSN)])
288
289 /* Vector indexed by INSN_UID giving an encoding of the blockage range
290    function.  The unit and the range are encoded.  */
291 static unsigned int *insn_blockage;
292 #define INSN_BLOCKAGE(INSN) insn_blockage[INSN_UID (INSN)]
293 #define UNIT_BITS 5
294 #define BLOCKAGE_MASK ((1 << BLOCKAGE_BITS) - 1)
295 #define ENCODE_BLOCKAGE(U, R)                           \
296 ((((U) << UNIT_BITS) << BLOCKAGE_BITS                   \
297   | MIN_BLOCKAGE_COST (R)) << BLOCKAGE_BITS             \
298   | MAX_BLOCKAGE_COST (R))
299 #define UNIT_BLOCKED(B) ((B) >> (2 * BLOCKAGE_BITS))
300 #define BLOCKAGE_RANGE(B)                                                \
301   (((((B) >> BLOCKAGE_BITS) & BLOCKAGE_MASK) << (HOST_BITS_PER_INT / 2)) \
302    | ((B) & BLOCKAGE_MASK))
303
304 /* Encodings of the `<name>_unit_blockage_range' function.  */
305 #define MIN_BLOCKAGE_COST(R) ((R) >> (HOST_BITS_PER_INT / 2))
306 #define MAX_BLOCKAGE_COST(R) ((R) & ((1 << (HOST_BITS_PER_INT / 2)) - 1))
307
308 #define DONE_PRIORITY   -1
309 #define MAX_PRIORITY    0x7fffffff
310 #define TAIL_PRIORITY   0x7ffffffe
311 #define LAUNCH_PRIORITY 0x7f000001
312 #define DONE_PRIORITY_P(INSN) (INSN_PRIORITY (INSN) < 0)
313 #define LOW_PRIORITY_P(INSN) ((INSN_PRIORITY (INSN) & 0x7f000000) == 0)
314
315 /* Vector indexed by INSN_UID giving number of insns referring to this insn.  */
316 static int *insn_ref_count;
317 #define INSN_REF_COUNT(INSN) (insn_ref_count[INSN_UID (INSN)])
318
319 /* Vector indexed by INSN_UID giving line-number note in effect for each
320    insn.  For line-number notes, this indicates whether the note may be
321    reused.  */
322 static rtx *line_note;
323 #define LINE_NOTE(INSN) (line_note[INSN_UID (INSN)])
324
325 /* Vector indexed by basic block number giving the starting line-number
326    for each basic block.  */
327 static rtx *line_note_head;
328
329 /* List of important notes we must keep around.  This is a pointer to the
330    last element in the list.  */
331 static rtx note_list;
332
333 /* Regsets telling whether a given register is live or dead before the last
334    scheduled insn.  Must scan the instructions once before scheduling to
335    determine what registers are live or dead at the end of the block.  */
336 static regset bb_live_regs;
337
338 /* Regset telling whether a given register is live after the insn currently
339    being scheduled.  Before processing an insn, this is equal to bb_live_regs
340    above.  This is used so that we can find registers that are newly born/dead
341    after processing an insn.  */
342 static regset old_live_regs;
343
344 /* The chain of REG_DEAD notes.  REG_DEAD notes are removed from all insns
345    during the initial scan and reused later.  If there are not exactly as
346    many REG_DEAD notes in the post scheduled code as there were in the
347    prescheduled code then we trigger an abort because this indicates a bug.  */
348 static rtx dead_notes;
349
350 /* Queues, etc.  */
351
352 /* An instruction is ready to be scheduled when all insns preceding it
353    have already been scheduled.  It is important to ensure that all
354    insns which use its result will not be executed until its result
355    has been computed.  An insn is maintained in one of four structures:
356
357    (P) the "Pending" set of insns which cannot be scheduled until
358    their dependencies have been satisfied.
359    (Q) the "Queued" set of insns that can be scheduled when sufficient
360    time has passed.
361    (R) the "Ready" list of unscheduled, uncommitted insns.
362    (S) the "Scheduled" list of insns.
363
364    Initially, all insns are either "Pending" or "Ready" depending on
365    whether their dependencies are satisfied.
366
367    Insns move from the "Ready" list to the "Scheduled" list as they
368    are committed to the schedule.  As this occurs, the insns in the
369    "Pending" list have their dependencies satisfied and move to either
370    the "Ready" list or the "Queued" set depending on whether
371    sufficient time has passed to make them ready.  As time passes,
372    insns move from the "Queued" set to the "Ready" list.  Insns may
373    move from the "Ready" list to the "Queued" set if they are blocked
374    due to a function unit conflict.
375
376    The "Pending" list (P) are the insns in the INSN_DEPEND of the unscheduled
377    insns, i.e., those that are ready, queued, and pending.
378    The "Queued" set (Q) is implemented by the variable `insn_queue'.
379    The "Ready" list (R) is implemented by the variables `ready' and
380    `n_ready'.
381    The "Scheduled" list (S) is the new insn chain built by this pass.
382
383    The transition (R->S) is implemented in the scheduling loop in
384    `schedule_block' when the best insn to schedule is chosen.
385    The transition (R->Q) is implemented in `queue_insn' when an
386    insn is found to have a function unit conflict with the already
387    committed insns.
388    The transitions (P->R and P->Q) are implemented in `schedule_insn' as
389    insns move from the ready list to the scheduled list.
390    The transition (Q->R) is implemented in 'queue_to_insn' as time
391    passes or stalls are introduced.  */
392
393 /* Implement a circular buffer to delay instructions until sufficient
394    time has passed.  INSN_QUEUE_SIZE is a power of two larger than
395    MAX_BLOCKAGE and MAX_READY_COST computed by genattr.c.  This is the
396    longest time an isnsn may be queued.  */
397 static rtx insn_queue[INSN_QUEUE_SIZE];
398 static int q_ptr = 0;
399 static int q_size = 0;
400 #define NEXT_Q(X) (((X)+1) & (INSN_QUEUE_SIZE-1))
401 #define NEXT_Q_AFTER(X, C) (((X)+C) & (INSN_QUEUE_SIZE-1))
402
403 /* Vector indexed by INSN_UID giving the minimum clock tick at which
404    the insn becomes ready.  This is used to note timing constraints for
405    insns in the pending list.  */
406 static int *insn_tick;
407 #define INSN_TICK(INSN) (insn_tick[INSN_UID (INSN)])
408
409 /* Data structure for keeping track of register information
410    during that register's life.  */
411
412 struct sometimes
413   {
414     int regno;
415     int live_length;
416     int calls_crossed;
417   };
418
419 /* Forward declarations.  */
420 static void add_dependence PROTO ((rtx, rtx, enum reg_note));
421 static void remove_dependence PROTO ((rtx, rtx));
422 static rtx find_insn_list PROTO ((rtx, rtx));
423 static int insn_unit PROTO ((rtx));
424 static unsigned int blockage_range PROTO ((int, rtx));
425 static void clear_units PROTO ((void));
426 static int actual_hazard_this_instance PROTO ((int, int, rtx, int, int));
427 static void schedule_unit PROTO ((int, rtx, int));
428 static int actual_hazard PROTO ((int, rtx, int, int));
429 static int potential_hazard PROTO ((int, rtx, int));
430 static int insn_cost PROTO ((rtx, rtx, rtx));
431 static int priority PROTO ((rtx));
432 static void free_pending_lists PROTO ((void));
433 static void add_insn_mem_dependence PROTO ((rtx *, rtx *, rtx, rtx));
434 static void flush_pending_lists PROTO ((rtx, int));
435 static void sched_analyze_1 PROTO ((rtx, rtx));
436 static void sched_analyze_2 PROTO ((rtx, rtx));
437 static void sched_analyze_insn PROTO ((rtx, rtx, rtx));
438 static void sched_analyze PROTO ((rtx, rtx));
439 static void sched_note_set PROTO ((rtx, int));
440 static int rank_for_schedule PROTO ((const GENERIC_PTR, const GENERIC_PTR));
441 static void swap_sort PROTO ((rtx *, int));
442 static void queue_insn PROTO ((rtx, int));
443 static int schedule_insn PROTO ((rtx, rtx *, int, int));
444 static void create_reg_dead_note PROTO ((rtx, rtx));
445 static void attach_deaths PROTO ((rtx, rtx, int));
446 static void attach_deaths_insn PROTO ((rtx));
447 static int new_sometimes_live PROTO ((struct sometimes *, int, int));
448 static void finish_sometimes_live PROTO ((struct sometimes *, int));
449 static int schedule_block PROTO ((int, int));
450 static rtx regno_use_in PROTO ((int, rtx));
451 static void split_hard_reg_notes PROTO ((rtx, rtx, rtx));
452 static void new_insn_dead_notes PROTO ((rtx, rtx, rtx, rtx));
453 static void update_n_sets PROTO ((rtx, int));
454 static void update_flow_info PROTO ((rtx, rtx, rtx, rtx));
455 static char *safe_concat PROTO ((char *, char *, char *));
456 static int insn_issue_delay PROTO ((rtx));
457 static int birthing_insn_p PROTO ((rtx));
458 static void adjust_priority PROTO ((rtx));
459
460 /* Mapping of insns to their original block prior to scheduling.  */
461 static int *insn_orig_block;
462 #define INSN_BLOCK(insn) (insn_orig_block[INSN_UID (insn)])
463
464 /* Some insns (e.g. call) are not allowed to move across blocks.  */
465 static char *cant_move;
466 #define CANT_MOVE(insn) (cant_move[INSN_UID (insn)])
467
468 /* Control flow graph edges are kept in circular lists.  */
469 typedef struct
470   {
471     int from_block;
472     int to_block;
473     int next_in;
474     int next_out;
475   }
476 edge;
477 static edge *edge_table;
478
479 #define NEXT_IN(edge) (edge_table[edge].next_in)
480 #define NEXT_OUT(edge) (edge_table[edge].next_out)
481 #define FROM_BLOCK(edge) (edge_table[edge].from_block)
482 #define TO_BLOCK(edge) (edge_table[edge].to_block)
483
484 /* Number of edges in the control flow graph.  (in fact larger than
485    that by 1, since edge 0 is unused.) */
486 static int nr_edges;
487
488 /* Circular list of incoming/outgoing edges of a block */
489 static int *in_edges;
490 static int *out_edges;
491
492 #define IN_EDGES(block) (in_edges[block])
493 #define OUT_EDGES(block) (out_edges[block])
494
495 /* List of labels which cannot be deleted, needed for control
496    flow graph construction.  */
497 extern rtx forced_labels;
498
499
500 static int is_cfg_nonregular PROTO ((void));
501 static int build_control_flow PROTO ((int_list_ptr *, int_list_ptr *,
502                                       int *, int *));
503 static void new_edge PROTO ((int, int));
504
505
506 /* A region is the main entity for interblock scheduling: insns
507    are allowed to move between blocks in the same region, along
508    control flow graph edges, in the 'up' direction.  */
509 typedef struct
510   {
511     int rgn_nr_blocks;          /* number of blocks in region */
512     int rgn_blocks;             /* blocks in the region (actually index in rgn_bb_table) */
513   }
514 region;
515
516 /* Number of regions in the procedure */
517 static int nr_regions;
518
519 /* Table of region descriptions */
520 static region *rgn_table;
521
522 /* Array of lists of regions' blocks */
523 static int *rgn_bb_table;
524
525 /* Topological order of blocks in the region (if b2 is reachable from
526    b1, block_to_bb[b2] > block_to_bb[b1]).
527    Note: A basic block is always referred to by either block or b,
528    while its topological order name (in the region) is refered to by
529    bb.
530  */
531 static int *block_to_bb;
532
533 /* The number of the region containing a block.  */
534 static int *containing_rgn;
535
536 #define RGN_NR_BLOCKS(rgn) (rgn_table[rgn].rgn_nr_blocks)
537 #define RGN_BLOCKS(rgn) (rgn_table[rgn].rgn_blocks)
538 #define BLOCK_TO_BB(block) (block_to_bb[block])
539 #define CONTAINING_RGN(block) (containing_rgn[block])
540
541 void debug_regions PROTO ((void));
542 static void find_single_block_region PROTO ((void));
543 static void find_rgns PROTO ((int_list_ptr *, int_list_ptr *,
544                               int *, int *, sbitmap *));
545 static int too_large PROTO ((int, int *, int *));
546
547 extern void debug_live PROTO ((int, int));
548
549 /* Blocks of the current region being scheduled.  */
550 static int current_nr_blocks;
551 static int current_blocks;
552
553 /* The mapping from bb to block */
554 #define BB_TO_BLOCK(bb) (rgn_bb_table[current_blocks + (bb)])
555
556
557 /* Bit vectors and bitset operations are needed for computations on
558    the control flow graph.  */
559
560 typedef unsigned HOST_WIDE_INT *bitset;
561 typedef struct
562   {
563     int *first_member;          /* pointer to the list start in bitlst_table.  */
564     int nr_members;             /* the number of members of the bit list.     */
565   }
566 bitlst;
567
568 static int bitlst_table_last;
569 static int bitlst_table_size;
570 static int *bitlst_table;
571
572 static char bitset_member PROTO ((bitset, int, int));
573 static void extract_bitlst PROTO ((bitset, int, bitlst *));
574
575 /* target info declarations.
576
577    The block currently being scheduled is referred to as the "target" block,
578    while other blocks in the region from which insns can be moved to the
579    target are called "source" blocks.  The candidate structure holds info
580    about such sources: are they valid?  Speculative?  Etc.  */
581 typedef bitlst bblst;
582 typedef struct
583   {
584     char is_valid;
585     char is_speculative;
586     int src_prob;
587     bblst split_bbs;
588     bblst update_bbs;
589   }
590 candidate;
591
592 static candidate *candidate_table;
593
594 /* A speculative motion requires checking live information on the path
595    from 'source' to 'target'.  The split blocks are those to be checked.
596    After a speculative motion, live information should be modified in
597    the 'update' blocks.
598
599    Lists of split and update blocks for  each candidate of the current
600    target  are  in  array bblst_table */
601 static int *bblst_table, bblst_size, bblst_last;
602
603 #define IS_VALID(src) ( candidate_table[src].is_valid )
604 #define IS_SPECULATIVE(src) ( candidate_table[src].is_speculative )
605 #define SRC_PROB(src) ( candidate_table[src].src_prob )
606
607 /* The bb being currently scheduled.  */
608 static int target_bb;
609
610 /* List of edges.  */
611 typedef bitlst edgelst;
612
613 /* target info functions */
614 static void split_edges PROTO ((int, int, edgelst *));
615 static void compute_trg_info PROTO ((int));
616 void debug_candidate PROTO ((int));
617 void debug_candidates PROTO ((int));
618
619
620 /* Bit-set of bbs, where bit 'i' stands for bb 'i'.  */
621 typedef bitset bbset;
622
623 /* Number of words of the bbset.  */
624 static int bbset_size;
625
626 /* Dominators array: dom[i] contains the bbset of dominators of
627    bb i in the region.  */
628 static bbset *dom;
629
630 /* bb 0 is the only region entry */
631 #define IS_RGN_ENTRY(bb) (!bb)
632
633 /* Is bb_src dominated by bb_trg.  */
634 #define IS_DOMINATED(bb_src, bb_trg)                                 \
635 ( bitset_member (dom[bb_src], bb_trg, bbset_size) )
636
637 /* Probability: Prob[i] is a float in [0, 1] which is the probability
638    of bb i relative to the region entry.  */
639 static float *prob;
640
641 /*  The probability of bb_src, relative to bb_trg.  Note, that while the
642    'prob[bb]' is a float in [0, 1], this macro returns an integer
643    in [0, 100].  */
644 #define GET_SRC_PROB(bb_src, bb_trg) ((int) (100.0 * (prob[bb_src] / \
645                                                       prob[bb_trg])))
646
647 /* Bit-set of edges, where bit i stands for edge i.  */
648 typedef bitset edgeset;
649
650 /* Number of edges in the region.  */
651 static int rgn_nr_edges;
652
653 /* Array of size rgn_nr_edges.    */
654 static int *rgn_edges;
655
656 /* Number of words in an edgeset.    */
657 static int edgeset_size;
658
659 /* Mapping from each edge in the graph to its number in the rgn.  */
660 static int *edge_to_bit;
661 #define EDGE_TO_BIT(edge) (edge_to_bit[edge])
662
663 /* The split edges of a source bb is different for each target
664    bb.  In order to compute this efficiently, the 'potential-split edges'
665    are computed for each bb prior to scheduling a region.  This is actually
666    the split edges of each bb relative to the region entry.
667
668    pot_split[bb] is the set of potential split edges of bb.  */
669 static edgeset *pot_split;
670
671 /* For every bb, a set of its ancestor edges.  */
672 static edgeset *ancestor_edges;
673
674 static void compute_dom_prob_ps PROTO ((int));
675
676 #define ABS_VALUE(x) (((x)<0)?(-(x)):(x))
677 #define INSN_PROBABILITY(INSN) (SRC_PROB (BLOCK_TO_BB (INSN_BLOCK (INSN))))
678 #define IS_SPECULATIVE_INSN(INSN) (IS_SPECULATIVE (BLOCK_TO_BB (INSN_BLOCK (INSN))))
679 #define INSN_BB(INSN) (BLOCK_TO_BB (INSN_BLOCK (INSN)))
680
681 /* parameters affecting the decision of rank_for_schedule() */
682 #define MIN_DIFF_PRIORITY 2
683 #define MIN_PROBABILITY 40
684 #define MIN_PROB_DIFF 10
685
686 /* speculative scheduling functions */
687 static int check_live_1 PROTO ((int, rtx));
688 static void update_live_1 PROTO ((int, rtx));
689 static int check_live PROTO ((rtx, int));
690 static void update_live PROTO ((rtx, int));
691 static void set_spec_fed PROTO ((rtx));
692 static int is_pfree PROTO ((rtx, int, int));
693 static int find_conditional_protection PROTO ((rtx, int));
694 static int is_conditionally_protected PROTO ((rtx, int, int));
695 static int may_trap_exp PROTO ((rtx, int));
696 static int haifa_classify_insn PROTO ((rtx));
697 static int is_prisky PROTO ((rtx, int, int));
698 static int is_exception_free PROTO ((rtx, int, int));
699
700 static char find_insn_mem_list PROTO ((rtx, rtx, rtx, rtx));
701 static void compute_block_forward_dependences PROTO ((int));
702 static void init_rgn_data_dependences PROTO ((int));
703 static void add_branch_dependences PROTO ((rtx, rtx));
704 static void compute_block_backward_dependences PROTO ((int));
705 void debug_dependencies PROTO ((void));
706
707 /* Notes handling mechanism:
708    =========================
709    Generally, NOTES are saved before scheduling and restored after scheduling.
710    The scheduler distinguishes between three types of notes:
711
712    (1) LINE_NUMBER notes, generated and used for debugging.  Here,
713    before scheduling a region, a pointer to the LINE_NUMBER note is
714    added to the insn following it (in save_line_notes()), and the note
715    is removed (in rm_line_notes() and unlink_line_notes()).  After
716    scheduling the region, this pointer is used for regeneration of
717    the LINE_NUMBER note (in restore_line_notes()).
718
719    (2) LOOP_BEGIN, LOOP_END, SETJMP, EHREGION_BEG, EHREGION_END notes:
720    Before scheduling a region, a pointer to the note is added to the insn
721    that follows or precedes it.  (This happens as part of the data dependence
722    computation).  After scheduling an insn, the pointer contained in it is
723    used for regenerating the corresponding note (in reemit_notes).
724
725    (3) All other notes (e.g. INSN_DELETED):  Before scheduling a block,
726    these notes are put in a list (in rm_other_notes() and
727    unlink_other_notes ()).  After scheduling the block, these notes are
728    inserted at the beginning of the block (in schedule_block()).  */
729
730 static rtx unlink_other_notes PROTO ((rtx, rtx));
731 static rtx unlink_line_notes PROTO ((rtx, rtx));
732 static void rm_line_notes PROTO ((int));
733 static void save_line_notes PROTO ((int));
734 static void restore_line_notes PROTO ((int));
735 static void rm_redundant_line_notes PROTO ((void));
736 static void rm_other_notes PROTO ((rtx, rtx));
737 static rtx reemit_notes PROTO ((rtx, rtx));
738
739 static void get_block_head_tail PROTO ((int, rtx *, rtx *));
740
741 static void find_pre_sched_live PROTO ((int));
742 static void find_post_sched_live PROTO ((int));
743 static void update_reg_usage PROTO ((void));
744 static int queue_to_ready PROTO ((rtx [], int));
745
746 static void debug_ready_list PROTO ((rtx[], int));
747 static void init_target_units PROTO ((void));
748 static void insn_print_units PROTO ((rtx));
749 static int get_visual_tbl_length PROTO ((void));
750 static void init_block_visualization PROTO ((void));
751 static void print_block_visualization PROTO ((int, char *));
752 static void visualize_scheduled_insns PROTO ((int, int));
753 static void visualize_no_unit PROTO ((rtx));
754 static void visualize_stall_cycles PROTO ((int, int));
755 static void print_exp PROTO ((char *, rtx, int));
756 static void print_value PROTO ((char *, rtx, int));
757 static void print_pattern PROTO ((char *, rtx, int));
758 static void print_insn PROTO ((char *, rtx, int));
759 void debug_reg_vector PROTO ((regset));
760
761 static rtx move_insn1 PROTO ((rtx, rtx));
762 static rtx move_insn PROTO ((rtx, rtx));
763 static rtx group_leader PROTO ((rtx));
764 static int set_priorities PROTO ((int));
765 static void init_rtx_vector PROTO ((rtx **, rtx *, int, int));
766 static void schedule_region PROTO ((int));
767 static void split_block_insns PROTO ((int));
768
769 #endif /* INSN_SCHEDULING */
770 \f
771 #define SIZE_FOR_MODE(X) (GET_MODE_SIZE (GET_MODE (X)))
772
773 /* Helper functions for instruction scheduling.  */
774
775 /* An INSN_LIST containing all INSN_LISTs allocated but currently unused.  */
776 static rtx unused_insn_list;
777
778 /* An EXPR_LIST containing all EXPR_LISTs allocated but currently unused.  */
779 static rtx unused_expr_list;
780
781 static void free_list PROTO ((rtx *, rtx *));
782 static rtx alloc_INSN_LIST PROTO ((rtx, rtx));
783 static rtx alloc_EXPR_LIST PROTO ((int, rtx, rtx));
784
785 static void
786 free_list (listp, unused_listp)
787      rtx *listp, *unused_listp;
788 {
789   register rtx link, prev_link;
790
791   if (*listp == 0)
792     return;
793
794   prev_link = *listp;
795   link = XEXP (prev_link, 1);
796
797   while (link)
798     {
799       prev_link = link;
800       link = XEXP (link, 1);
801     }
802
803   XEXP (prev_link, 1) = *unused_listp;
804   *unused_listp = *listp;
805   *listp = 0;
806 }
807
808 static rtx
809 alloc_INSN_LIST (val, next)
810      rtx val, next;
811 {
812   rtx r;
813
814   if (unused_insn_list)
815     {
816       r = unused_insn_list;
817       unused_insn_list = XEXP (r, 1);
818       XEXP (r, 0) = val;
819       XEXP (r, 1) = next;
820       PUT_REG_NOTE_KIND (r, VOIDmode);
821     }
822   else
823     r = gen_rtx_INSN_LIST (VOIDmode, val, next);
824
825   return r;
826 }
827
828 static rtx
829 alloc_EXPR_LIST (kind, val, next)
830      int kind;
831      rtx val, next;
832 {
833   rtx r;
834
835   if (unused_expr_list)
836     {
837       r = unused_expr_list;
838       unused_expr_list = XEXP (r, 1);
839       XEXP (r, 0) = val;
840       XEXP (r, 1) = next;
841       PUT_REG_NOTE_KIND (r, kind);
842     }
843   else
844     r = gen_rtx_EXPR_LIST (kind, val, next);
845
846   return r;
847 }
848
849 /* Add ELEM wrapped in an INSN_LIST with reg note kind DEP_TYPE to the
850    LOG_LINKS of INSN, if not already there.  DEP_TYPE indicates the type
851    of dependence that this link represents.  */
852
853 static void
854 add_dependence (insn, elem, dep_type)
855      rtx insn;
856      rtx elem;
857      enum reg_note dep_type;
858 {
859   rtx link, next;
860
861   /* Don't depend an insn on itself.  */
862   if (insn == elem)
863     return;
864
865   /* If elem is part of a sequence that must be scheduled together, then
866      make the dependence point to the last insn of the sequence.
867      When HAVE_cc0, it is possible for NOTEs to exist between users and
868      setters of the condition codes, so we must skip past notes here.
869      Otherwise, NOTEs are impossible here.  */
870
871   next = NEXT_INSN (elem);
872
873 #ifdef HAVE_cc0
874   while (next && GET_CODE (next) == NOTE)
875     next = NEXT_INSN (next);
876 #endif
877
878   if (next && SCHED_GROUP_P (next)
879       && GET_CODE (next) != CODE_LABEL)
880     {
881       /* Notes will never intervene here though, so don't bother checking
882          for them.  */
883       /* We must reject CODE_LABELs, so that we don't get confused by one
884          that has LABEL_PRESERVE_P set, which is represented by the same
885          bit in the rtl as SCHED_GROUP_P.  A CODE_LABEL can never be
886          SCHED_GROUP_P.  */
887       while (NEXT_INSN (next) && SCHED_GROUP_P (NEXT_INSN (next))
888              && GET_CODE (NEXT_INSN (next)) != CODE_LABEL)
889         next = NEXT_INSN (next);
890
891       /* Again, don't depend an insn on itself.  */
892       if (insn == next)
893         return;
894
895       /* Make the dependence to NEXT, the last insn of the group, instead
896          of the original ELEM.  */
897       elem = next;
898     }
899
900 #ifdef INSN_SCHEDULING
901   /* (This code is guarded by INSN_SCHEDULING, otherwise INSN_BB is undefined.)
902      No need for interblock dependences with calls, since
903      calls are not moved between blocks.   Note: the edge where
904      elem is a CALL is still required.  */
905   if (GET_CODE (insn) == CALL_INSN
906       && (INSN_BB (elem) != INSN_BB (insn)))
907     return;
908
909 #endif
910
911   /* Check that we don't already have this dependence.  */
912   for (link = LOG_LINKS (insn); link; link = XEXP (link, 1))
913     if (XEXP (link, 0) == elem)
914       {
915         /* If this is a more restrictive type of dependence than the existing
916            one, then change the existing dependence to this type.  */
917         if ((int) dep_type < (int) REG_NOTE_KIND (link))
918           PUT_REG_NOTE_KIND (link, dep_type);
919         return;
920       }
921   /* Might want to check one level of transitivity to save conses.  */
922
923   link = alloc_INSN_LIST (elem, LOG_LINKS (insn));
924   LOG_LINKS (insn) = link;
925
926   /* Insn dependency, not data dependency.  */
927   PUT_REG_NOTE_KIND (link, dep_type);
928 }
929
930 /* Remove ELEM wrapped in an INSN_LIST from the LOG_LINKS
931    of INSN.  Abort if not found.  */
932
933 static void
934 remove_dependence (insn, elem)
935      rtx insn;
936      rtx elem;
937 {
938   rtx prev, link, next;
939   int found = 0;
940
941   for (prev = 0, link = LOG_LINKS (insn); link; link = next)
942     {
943       next = XEXP (link, 1);
944       if (XEXP (link, 0) == elem)
945         {
946           if (prev)
947             XEXP (prev, 1) = next;
948           else
949             LOG_LINKS (insn) = next;
950
951           XEXP (link, 1) = unused_insn_list;
952           unused_insn_list = link;
953
954           found = 1;
955         }
956       else
957         prev = link;
958     }
959
960   if (!found)
961     abort ();
962   return;
963 }
964 \f
965 #ifndef INSN_SCHEDULING
966 void
967 schedule_insns (dump_file)
968      FILE *dump_file;
969 {
970 }
971 #else
972 #ifndef __GNUC__
973 #define __inline
974 #endif
975
976 #ifndef HAIFA_INLINE
977 #define HAIFA_INLINE __inline
978 #endif
979
980 /* Computation of memory dependencies.  */
981
982 /* The *_insns and *_mems are paired lists.  Each pending memory operation
983    will have a pointer to the MEM rtx on one list and a pointer to the
984    containing insn on the other list in the same place in the list.  */
985
986 /* We can't use add_dependence like the old code did, because a single insn
987    may have multiple memory accesses, and hence needs to be on the list
988    once for each memory access.  Add_dependence won't let you add an insn
989    to a list more than once.  */
990
991 /* An INSN_LIST containing all insns with pending read operations.  */
992 static rtx pending_read_insns;
993
994 /* An EXPR_LIST containing all MEM rtx's which are pending reads.  */
995 static rtx pending_read_mems;
996
997 /* An INSN_LIST containing all insns with pending write operations.  */
998 static rtx pending_write_insns;
999
1000 /* An EXPR_LIST containing all MEM rtx's which are pending writes.  */
1001 static rtx pending_write_mems;
1002
1003 /* Indicates the combined length of the two pending lists.  We must prevent
1004    these lists from ever growing too large since the number of dependencies
1005    produced is at least O(N*N), and execution time is at least O(4*N*N), as
1006    a function of the length of these pending lists.  */
1007
1008 static int pending_lists_length;
1009
1010 /* The last insn upon which all memory references must depend.
1011    This is an insn which flushed the pending lists, creating a dependency
1012    between it and all previously pending memory references.  This creates
1013    a barrier (or a checkpoint) which no memory reference is allowed to cross.
1014
1015    This includes all non constant CALL_INSNs.  When we do interprocedural
1016    alias analysis, this restriction can be relaxed.
1017    This may also be an INSN that writes memory if the pending lists grow
1018    too large.  */
1019
1020 static rtx last_pending_memory_flush;
1021
1022 /* The last function call we have seen.  All hard regs, and, of course,
1023    the last function call, must depend on this.  */
1024
1025 static rtx last_function_call;
1026
1027 /* The LOG_LINKS field of this is a list of insns which use a pseudo register
1028    that does not already cross a call.  We create dependencies between each
1029    of those insn and the next call insn, to ensure that they won't cross a call
1030    after scheduling is done.  */
1031
1032 static rtx sched_before_next_call;
1033
1034 /* Pointer to the last instruction scheduled.  Used by rank_for_schedule,
1035    so that insns independent of the last scheduled insn will be preferred
1036    over dependent instructions.  */
1037
1038 static rtx last_scheduled_insn;
1039
1040 /* Data structures for the computation of data dependences in a regions.  We
1041    keep one copy of each of the declared above variables for each bb in the
1042    region.  Before analyzing the data dependences for a bb, its variables
1043    are initialized as a function of the variables of its predecessors.  When
1044    the analysis for a bb completes, we save the contents of each variable X
1045    to a corresponding bb_X[bb] variable.  For example, pending_read_insns is
1046    copied to bb_pending_read_insns[bb].  Another change is that few
1047    variables are now a list of insns rather than a single insn:
1048    last_pending_memory_flash, last_function_call, reg_last_sets.  The
1049    manipulation of these variables was changed appropriately.  */
1050
1051 static rtx **bb_reg_last_uses;
1052 static rtx **bb_reg_last_sets;
1053
1054 static rtx *bb_pending_read_insns;
1055 static rtx *bb_pending_read_mems;
1056 static rtx *bb_pending_write_insns;
1057 static rtx *bb_pending_write_mems;
1058 static int *bb_pending_lists_length;
1059
1060 static rtx *bb_last_pending_memory_flush;
1061 static rtx *bb_last_function_call;
1062 static rtx *bb_sched_before_next_call;
1063
1064 /* functions for construction of the control flow graph.  */
1065
1066 /* Return 1 if control flow graph should not be constructed, 0 otherwise.
1067
1068    We decide not to build the control flow graph if there is possibly more
1069    than one entry to the function, if computed branches exist, of if we
1070    have nonlocal gotos.  */
1071
1072 static int
1073 is_cfg_nonregular ()
1074 {
1075   int b;
1076   rtx insn;
1077   RTX_CODE code;
1078
1079   /* If we have a label that could be the target of a nonlocal goto, then
1080      the cfg is not well structured.  */
1081   if (nonlocal_label_rtx_list () != NULL)
1082     return 1;
1083
1084   /* If we have any forced labels, then the cfg is not well structured.  */
1085   if (forced_labels)
1086     return 1;
1087
1088   /* If this function has a computed jump, then we consider the cfg
1089      not well structured.  */
1090   if (current_function_has_computed_jump)
1091     return 1;
1092
1093   /* If we have exception handlers, then we consider the cfg not well
1094      structured.  ?!?  We should be able to handle this now that flow.c
1095      computes an accurate cfg for EH.  */
1096   if (exception_handler_labels)
1097     return 1;
1098
1099   /* If we have non-jumping insns which refer to labels, then we consider
1100      the cfg not well structured.  */
1101   /* check for labels referred to other thn by jumps */
1102   for (b = 0; b < n_basic_blocks; b++)
1103     for (insn = basic_block_head[b];; insn = NEXT_INSN (insn))
1104       {
1105         code = GET_CODE (insn);
1106         if (GET_RTX_CLASS (code) == 'i')
1107           {
1108             rtx note;
1109
1110             for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
1111               if (REG_NOTE_KIND (note) == REG_LABEL)
1112                 return 1;
1113           }
1114
1115         if (insn == basic_block_end[b])
1116           break;
1117       }
1118
1119   /* All the tests passed.  Consider the cfg well structured.  */
1120   return 0;
1121 }
1122
1123 /* Build the control flow graph and set nr_edges.
1124
1125    Instead of trying to build a cfg ourselves, we rely on flow to
1126    do it for us.  Stamp out useless code (and bug) duplication.
1127
1128    Return nonzero if an irregularity in the cfg is found which would
1129    prevent cross block scheduling.  */
1130
1131 static int
1132 build_control_flow (s_preds, s_succs, num_preds, num_succs)
1133      int_list_ptr *s_preds;
1134      int_list_ptr *s_succs;
1135      int *num_preds;
1136      int *num_succs;
1137 {
1138   int i;
1139   int_list_ptr succ;
1140   int unreachable;
1141
1142   /* Count the number of edges in the cfg.  */
1143   nr_edges = 0;
1144   unreachable = 0;
1145   for (i = 0; i < n_basic_blocks; i++)
1146     {
1147       nr_edges += num_succs[i];
1148
1149       /* Unreachable loops with more than one basic block are detected
1150          during the DFS traversal in find_rgns.
1151
1152          Unreachable loops with a single block are detected here.  This
1153          test is redundant with the one in find_rgns, but it's much
1154          cheaper to go ahead and catch the trivial case here.  */
1155       if (num_preds[i] == 0
1156           || (num_preds[i] == 1 && INT_LIST_VAL (s_preds[i]) == i))
1157         unreachable = 1;
1158     }
1159
1160   /* Account for entry/exit edges.  */
1161   nr_edges += 2;
1162
1163   in_edges = (int *) xmalloc (n_basic_blocks * sizeof (int));
1164   out_edges = (int *) xmalloc (n_basic_blocks * sizeof (int));
1165   bzero ((char *) in_edges, n_basic_blocks * sizeof (int));
1166   bzero ((char *) out_edges, n_basic_blocks * sizeof (int));
1167
1168   edge_table = (edge *) xmalloc ((nr_edges) * sizeof (edge));
1169   bzero ((char *) edge_table, ((nr_edges) * sizeof (edge)));
1170
1171   nr_edges = 0;
1172   for (i = 0; i < n_basic_blocks; i++)
1173     for (succ = s_succs[i]; succ; succ = succ->next)
1174       {
1175         if (INT_LIST_VAL (succ) != EXIT_BLOCK)
1176           new_edge (i, INT_LIST_VAL (succ));
1177       }
1178
1179   /* increment by 1, since edge 0 is unused.  */
1180   nr_edges++;
1181
1182   return unreachable;
1183 }
1184
1185
1186 /* Record an edge in the control flow graph from SOURCE to TARGET.
1187
1188    In theory, this is redundant with the s_succs computed above, but
1189    we have not converted all of haifa to use information from the
1190    integer lists.  */
1191
1192 static void
1193 new_edge (source, target)
1194      int source, target;
1195 {
1196   int e, next_edge;
1197   int curr_edge, fst_edge;
1198
1199   /* check for duplicates */
1200   fst_edge = curr_edge = OUT_EDGES (source);
1201   while (curr_edge)
1202     {
1203       if (FROM_BLOCK (curr_edge) == source
1204           && TO_BLOCK (curr_edge) == target)
1205         {
1206           return;
1207         }
1208
1209       curr_edge = NEXT_OUT (curr_edge);
1210
1211       if (fst_edge == curr_edge)
1212         break;
1213     }
1214
1215   e = ++nr_edges;
1216
1217   FROM_BLOCK (e) = source;
1218   TO_BLOCK (e) = target;
1219
1220   if (OUT_EDGES (source))
1221     {
1222       next_edge = NEXT_OUT (OUT_EDGES (source));
1223       NEXT_OUT (OUT_EDGES (source)) = e;
1224       NEXT_OUT (e) = next_edge;
1225     }
1226   else
1227     {
1228       OUT_EDGES (source) = e;
1229       NEXT_OUT (e) = e;
1230     }
1231
1232   if (IN_EDGES (target))
1233     {
1234       next_edge = NEXT_IN (IN_EDGES (target));
1235       NEXT_IN (IN_EDGES (target)) = e;
1236       NEXT_IN (e) = next_edge;
1237     }
1238   else
1239     {
1240       IN_EDGES (target) = e;
1241       NEXT_IN (e) = e;
1242     }
1243 }
1244
1245
1246 /* BITSET macros for operations on the control flow graph.  */
1247
1248 /* Compute  bitwise union  of two  bitsets.  */
1249 #define BITSET_UNION(set1, set2, len)                                \
1250 do { register bitset tp = set1, sp = set2;                           \
1251      register int i;                                                 \
1252      for (i = 0; i < len; i++)                                       \
1253        *(tp++) |= *(sp++); } while (0)
1254
1255 /* Compute  bitwise intersection  of two  bitsets.  */
1256 #define BITSET_INTER(set1, set2, len)                                \
1257 do { register bitset tp = set1, sp = set2;                           \
1258      register int i;                                                 \
1259      for (i = 0; i < len; i++)                                       \
1260        *(tp++) &= *(sp++); } while (0)
1261
1262 /* Compute bitwise   difference of  two bitsets.  */
1263 #define BITSET_DIFFER(set1, set2, len)                               \
1264 do { register bitset tp = set1, sp = set2;                           \
1265      register int i;                                                 \
1266      for (i = 0; i < len; i++)                                       \
1267        *(tp++) &= ~*(sp++); } while (0)
1268
1269 /* Inverts every bit of bitset 'set' */
1270 #define BITSET_INVERT(set, len)                                      \
1271 do { register bitset tmpset = set;                                   \
1272      register int i;                                                 \
1273      for (i = 0; i < len; i++, tmpset++)                             \
1274        *tmpset = ~*tmpset; } while (0)
1275
1276 /* Turn on the index'th bit in bitset set.  */
1277 #define BITSET_ADD(set, index, len)                                  \
1278 {                                                                    \
1279   if (index >= HOST_BITS_PER_WIDE_INT * len)                         \
1280     abort ();                                                        \
1281   else                                                               \
1282     set[index/HOST_BITS_PER_WIDE_INT] |=                             \
1283       1 << (index % HOST_BITS_PER_WIDE_INT);                         \
1284 }
1285
1286 /* Turn off the index'th bit in set.  */
1287 #define BITSET_REMOVE(set, index, len)                               \
1288 {                                                                    \
1289   if (index >= HOST_BITS_PER_WIDE_INT * len)                         \
1290     abort ();                                                        \
1291   else                                                               \
1292     set[index/HOST_BITS_PER_WIDE_INT] &=                             \
1293       ~(1 << (index%HOST_BITS_PER_WIDE_INT));                        \
1294 }
1295
1296
1297 /* Check if the index'th bit in bitset  set is on.  */
1298
1299 static char
1300 bitset_member (set, index, len)
1301      bitset set;
1302      int index, len;
1303 {
1304   if (index >= HOST_BITS_PER_WIDE_INT * len)
1305     abort ();
1306   return (set[index / HOST_BITS_PER_WIDE_INT] &
1307           1 << (index % HOST_BITS_PER_WIDE_INT)) ? 1 : 0;
1308 }
1309
1310
1311 /* Translate a bit-set SET to a list BL of the bit-set members.  */
1312
1313 static void
1314 extract_bitlst (set, len, bl)
1315      bitset set;
1316      int len;
1317      bitlst *bl;
1318 {
1319   int i, j, offset;
1320   unsigned HOST_WIDE_INT word;
1321
1322   /* bblst table space is reused in each call to extract_bitlst */
1323   bitlst_table_last = 0;
1324
1325   bl->first_member = &bitlst_table[bitlst_table_last];
1326   bl->nr_members = 0;
1327
1328   for (i = 0; i < len; i++)
1329     {
1330       word = set[i];
1331       offset = i * HOST_BITS_PER_WIDE_INT;
1332       for (j = 0; word; j++)
1333         {
1334           if (word & 1)
1335             {
1336               bitlst_table[bitlst_table_last++] = offset;
1337               (bl->nr_members)++;
1338             }
1339           word >>= 1;
1340           ++offset;
1341         }
1342     }
1343
1344 }
1345
1346
1347 /* functions for the construction of regions */
1348
1349 /* Print the regions, for debugging purposes.  Callable from debugger.  */
1350
1351 void
1352 debug_regions ()
1353 {
1354   int rgn, bb;
1355
1356   fprintf (dump, "\n;;   ------------ REGIONS ----------\n\n");
1357   for (rgn = 0; rgn < nr_regions; rgn++)
1358     {
1359       fprintf (dump, ";;\trgn %d nr_blocks %d:\n", rgn,
1360                rgn_table[rgn].rgn_nr_blocks);
1361       fprintf (dump, ";;\tbb/block: ");
1362
1363       for (bb = 0; bb < rgn_table[rgn].rgn_nr_blocks; bb++)
1364         {
1365           current_blocks = RGN_BLOCKS (rgn);
1366
1367           if (bb != BLOCK_TO_BB (BB_TO_BLOCK (bb)))
1368             abort ();
1369
1370           fprintf (dump, " %d/%d ", bb, BB_TO_BLOCK (bb));
1371         }
1372
1373       fprintf (dump, "\n\n");
1374     }
1375 }
1376
1377
1378 /* Build a single block region for each basic block in the function.
1379    This allows for using the same code for interblock and basic block
1380    scheduling.  */
1381
1382 static void
1383 find_single_block_region ()
1384 {
1385   int i;
1386
1387   for (i = 0; i < n_basic_blocks; i++)
1388     {
1389       rgn_bb_table[i] = i;
1390       RGN_NR_BLOCKS (i) = 1;
1391       RGN_BLOCKS (i) = i;
1392       CONTAINING_RGN (i) = i;
1393       BLOCK_TO_BB (i) = 0;
1394     }
1395   nr_regions = n_basic_blocks;
1396 }
1397
1398
1399 /* Update number of blocks and the estimate for number of insns
1400    in the region.  Return 1 if the region is "too large" for interblock
1401    scheduling (compile time considerations), otherwise return 0.  */
1402
1403 static int
1404 too_large (block, num_bbs, num_insns)
1405      int block, *num_bbs, *num_insns;
1406 {
1407   (*num_bbs)++;
1408   (*num_insns) += (INSN_LUID (basic_block_end[block]) -
1409                    INSN_LUID (basic_block_head[block]));
1410   if ((*num_bbs > MAX_RGN_BLOCKS) || (*num_insns > MAX_RGN_INSNS))
1411     return 1;
1412   else
1413     return 0;
1414 }
1415
1416
1417 /* Update_loop_relations(blk, hdr): Check if the loop headed by max_hdr[blk]
1418    is still an inner loop.  Put in max_hdr[blk] the header of the most inner
1419    loop containing blk.  */
1420 #define UPDATE_LOOP_RELATIONS(blk, hdr)                              \
1421 {                                                                    \
1422   if (max_hdr[blk] == -1)                                            \
1423     max_hdr[blk] = hdr;                                              \
1424   else if (dfs_nr[max_hdr[blk]] > dfs_nr[hdr])                       \
1425          RESET_BIT (inner, hdr);                                     \
1426   else if (dfs_nr[max_hdr[blk]] < dfs_nr[hdr])                       \
1427          {                                                           \
1428             RESET_BIT (inner,max_hdr[blk]);                          \
1429             max_hdr[blk] = hdr;                                      \
1430          }                                                           \
1431 }
1432
1433
1434 /* Find regions for interblock scheduling.
1435
1436    A region for scheduling can be:
1437
1438      * A loop-free procedure, or
1439
1440      * A reducible inner loop, or
1441
1442      * A basic block not contained in any other region.
1443
1444
1445    ?!? In theory we could build other regions based on extended basic
1446    blocks or reverse extended basic blocks.  Is it worth the trouble?
1447
1448    Loop blocks that form a region are put into the region's block list
1449    in topological order.
1450
1451    This procedure stores its results into the following global (ick) variables
1452
1453      * rgn_nr
1454      * rgn_table
1455      * rgn_bb_table
1456      * block_to_bb
1457      * containing region
1458
1459
1460    We use dominator relationships to avoid making regions out of non-reducible
1461    loops.
1462
1463    This procedure needs to be converted to work on pred/succ lists instead
1464    of edge tables.  That would simplify it somewhat.  */
1465
1466 static void
1467 find_rgns (s_preds, s_succs, num_preds, num_succs, dom)
1468      int_list_ptr *s_preds;
1469      int_list_ptr *s_succs;
1470      int *num_preds;
1471      int *num_succs;
1472      sbitmap *dom;
1473 {
1474   int *max_hdr, *dfs_nr, *stack, *queue, *degree;
1475   char no_loops = 1;
1476   int node, child, loop_head, i, head, tail;
1477   int count = 0, sp, idx = 0, current_edge = out_edges[0];
1478   int num_bbs, num_insns, unreachable;
1479   int too_large_failure;
1480
1481   /* Note if an edge has been passed.  */
1482   sbitmap passed;
1483
1484   /* Note if a block is a natural loop header.  */
1485   sbitmap header;
1486
1487   /* Note if a block is an natural inner loop header.  */
1488   sbitmap inner;
1489
1490   /* Note if a block is in the block queue. */
1491   sbitmap in_queue;
1492
1493   /* Note if a block is in the block queue. */
1494   sbitmap in_stack;
1495
1496   /* Perform a DFS traversal of the cfg.  Identify loop headers, inner loops
1497      and a mapping from block to its loop header (if the block is contained
1498      in a loop, else -1).
1499
1500      Store results in HEADER, INNER, and MAX_HDR respectively, these will
1501      be used as inputs to the second traversal.
1502
1503      STACK, SP and DFS_NR are only used during the first traversal.  */
1504
1505   /* Allocate and initialize variables for the first traversal.  */
1506   max_hdr = (int *) alloca (n_basic_blocks * sizeof (int));
1507   dfs_nr = (int *) alloca (n_basic_blocks * sizeof (int));
1508   bzero ((char *) dfs_nr, n_basic_blocks * sizeof (int));
1509   stack = (int *) alloca (nr_edges * sizeof (int));
1510
1511   inner = sbitmap_alloc (n_basic_blocks);
1512   sbitmap_ones (inner);
1513
1514   header = sbitmap_alloc (n_basic_blocks);
1515   sbitmap_zero (header);
1516
1517   passed = sbitmap_alloc (nr_edges);
1518   sbitmap_zero (passed);
1519
1520   in_queue = sbitmap_alloc (n_basic_blocks);
1521   sbitmap_zero (in_queue);
1522
1523   in_stack = sbitmap_alloc (n_basic_blocks);
1524   sbitmap_zero (in_stack);
1525
1526   for (i = 0; i < n_basic_blocks; i++)
1527     max_hdr[i] = -1;
1528
1529   /* DFS traversal to find inner loops in the cfg.  */
1530
1531   sp = -1;
1532   while (1)
1533     {
1534       if (current_edge == 0 || TEST_BIT (passed, current_edge))
1535         {
1536           /* We have reached a leaf node or a node that was already
1537              processed.  Pop edges off the stack until we find
1538              an edge that has not yet been processed.  */
1539           while (sp >= 0
1540                  && (current_edge == 0 || TEST_BIT (passed, current_edge)))
1541             {
1542               /* Pop entry off the stack.  */
1543               current_edge = stack[sp--];
1544               node = FROM_BLOCK (current_edge);
1545               child = TO_BLOCK (current_edge);
1546               RESET_BIT (in_stack, child);
1547               if (max_hdr[child] >= 0 && TEST_BIT (in_stack, max_hdr[child]))
1548                 UPDATE_LOOP_RELATIONS (node, max_hdr[child]);
1549               current_edge = NEXT_OUT (current_edge);
1550             }
1551
1552           /* See if have finished the DFS tree traversal.  */
1553           if (sp < 0 && TEST_BIT (passed, current_edge))
1554             break;
1555
1556           /* Nope, continue the traversal with the popped node.  */
1557           continue;
1558         }
1559
1560       /* Process a node.  */
1561       node = FROM_BLOCK (current_edge);
1562       child = TO_BLOCK (current_edge);
1563       SET_BIT (in_stack, node);
1564       dfs_nr[node] = ++count;
1565
1566       /* If the successor is in the stack, then we've found a loop.
1567          Mark the loop, if it is not a natural loop, then it will
1568          be rejected during the second traversal.  */
1569       if (TEST_BIT (in_stack, child))
1570         {
1571           no_loops = 0;
1572           SET_BIT (header, child);
1573           UPDATE_LOOP_RELATIONS (node, child);
1574           SET_BIT (passed, current_edge);
1575           current_edge = NEXT_OUT (current_edge);
1576           continue;
1577         }
1578
1579       /* If the child was already visited, then there is no need to visit
1580          it again.  Just update the loop relationships and restart
1581          with a new edge.  */
1582       if (dfs_nr[child])
1583         {
1584           if (max_hdr[child] >= 0 && TEST_BIT (in_stack, max_hdr[child]))
1585             UPDATE_LOOP_RELATIONS (node, max_hdr[child]);
1586           SET_BIT (passed, current_edge);
1587           current_edge = NEXT_OUT (current_edge);
1588           continue;
1589         }
1590
1591       /* Push an entry on the stack and continue DFS traversal.  */
1592       stack[++sp] = current_edge;
1593       SET_BIT (passed, current_edge);
1594       current_edge = OUT_EDGES (child);
1595     }
1596
1597   /* Another check for unreachable blocks.  The earlier test in
1598      is_cfg_nonregular only finds unreachable blocks that do not
1599      form a loop.
1600
1601      The DFS traversal will mark every block that is reachable from
1602      the entry node by placing a nonzero value in dfs_nr.  Thus if
1603      dfs_nr is zero for any block, then it must be unreachable.  */
1604   unreachable = 0;
1605   for (i = 0; i < n_basic_blocks; i++)
1606     if (dfs_nr[i] == 0)
1607       {
1608         unreachable = 1;
1609         break;
1610       }
1611
1612   /* Gross.  To avoid wasting memory, the second pass uses the dfs_nr array
1613      to hold degree counts.  */
1614   degree = dfs_nr;
1615
1616   /* Compute the in-degree of every block in the graph */
1617   for (i = 0; i < n_basic_blocks; i++)
1618     degree[i] = num_preds[i];
1619
1620   /* Do not perform region scheduling if there are any unreachable
1621      blocks.  */
1622   if (!unreachable)
1623     {
1624       if (no_loops)
1625         SET_BIT (header, 0);
1626
1627       /* Second travsersal:find reducible inner loops and topologically sort
1628          block of each region.  */
1629
1630       queue = (int *) alloca (n_basic_blocks * sizeof (int));
1631
1632       /* Find blocks which are inner loop headers.  We still have non-reducible
1633          loops to consider at this point.  */
1634       for (i = 0; i < n_basic_blocks; i++)
1635         {
1636           if (TEST_BIT (header, i) && TEST_BIT (inner, i))
1637             {
1638               int_list_ptr ps;
1639               int j;
1640
1641               /* Now check that the loop is reducible.  We do this separate
1642                  from finding inner loops so that we do not find a reducible
1643                  loop which contains an inner  non-reducible loop.
1644
1645                  A simple way to find reducible/natrual loops is to verify
1646                  that each block in the loop is dominated by the loop
1647                  header.
1648
1649                  If there exists a block that is not dominated by the loop
1650                  header, then the block is reachable from outside the loop
1651                  and thus the loop is not a natural loop.  */
1652               for (j = 0; j < n_basic_blocks; j++)      
1653                 {
1654                   /* First identify blocks in the loop, except for the loop
1655                      entry block.  */
1656                   if (i == max_hdr[j] && i != j)
1657                     {
1658                       /* Now verify that the block is dominated by the loop
1659                          header.  */
1660                       if (!TEST_BIT (dom[j], i))
1661                         break;
1662                     }
1663                 }
1664
1665               /* If we exited the loop early, then I is the header of a non
1666                  reducible loop and we should quit processing it now.  */
1667               if (j != n_basic_blocks)
1668                 continue;
1669
1670               /* I is a header of an inner loop, or block 0 in a subroutine
1671                  with no loops at all.  */
1672               head = tail = -1;
1673               too_large_failure = 0;
1674               loop_head = max_hdr[i];
1675
1676               /* Decrease degree of all I's successors for topological
1677                  ordering.  */
1678               for (ps = s_succs[i]; ps; ps = ps->next)
1679                 if (INT_LIST_VAL (ps) != EXIT_BLOCK
1680                     && INT_LIST_VAL (ps) != ENTRY_BLOCK)
1681                   --degree[INT_LIST_VAL(ps)];
1682
1683               /* Estimate # insns, and count # blocks in the region.  */
1684               num_bbs = 1;
1685               num_insns = (INSN_LUID (basic_block_end[i])
1686                            - INSN_LUID (basic_block_head[i]));
1687
1688
1689               /* Find all loop latches (blocks which back edges to the loop
1690                  header) or all the leaf blocks in the cfg has no loops.
1691
1692                  Place those blocks into the queue.  */
1693               if (no_loops)
1694                 {
1695                   for (j = 0; j < n_basic_blocks; j++)
1696                     /* Leaf nodes have only a single successor which must
1697                        be EXIT_BLOCK.  */
1698                     if (num_succs[j] == 1
1699                         && INT_LIST_VAL (s_succs[j]) == EXIT_BLOCK)
1700                       {
1701                         queue[++tail] = j;
1702                         SET_BIT (in_queue, j);
1703
1704                         if (too_large (j, &num_bbs, &num_insns))
1705                           {
1706                             too_large_failure = 1;
1707                             break;
1708                           }
1709                       }
1710                 }
1711               else
1712                 {
1713                   int_list_ptr ps;
1714
1715                   for (ps = s_preds[i]; ps; ps = ps->next)
1716                     {
1717                       node = INT_LIST_VAL (ps);
1718
1719                       if (node == ENTRY_BLOCK || node == EXIT_BLOCK)
1720                         continue;
1721  
1722                       if (max_hdr[node] == loop_head && node != i)
1723                         {
1724                           /* This is a loop latch.  */
1725                           queue[++tail] = node;
1726                           SET_BIT (in_queue, node);
1727
1728                           if (too_large (node, &num_bbs, &num_insns))
1729                             {
1730                               too_large_failure = 1;
1731                               break;
1732                             }
1733                         }
1734                       
1735                     }
1736                 }
1737
1738               /* Now add all the blocks in the loop to the queue.
1739
1740              We know the loop is a natural loop; however the algorithm
1741              above will not always mark certain blocks as being in the
1742              loop.  Consider:
1743                 node   children
1744                  a        b,c
1745                  b        c
1746                  c        a,d
1747                  d        b
1748
1749
1750              The algorithm in the DFS traversal may not mark B & D as part
1751              of the loop (ie they will not have max_hdr set to A).
1752
1753              We know they can not be loop latches (else they would have
1754              had max_hdr set since they'd have a backedge to a dominator
1755              block).  So we don't need them on the initial queue.
1756
1757              We know they are part of the loop because they are dominated
1758              by the loop header and can be reached by a backwards walk of
1759              the edges starting with nodes on the initial queue.
1760
1761              It is safe and desirable to include those nodes in the
1762              loop/scheduling region.  To do so we would need to decrease
1763              the degree of a node if it is the target of a backedge
1764              within the loop itself as the node is placed in the queue.
1765
1766              We do not do this because I'm not sure that the actual
1767              scheduling code will properly handle this case. ?!? */
1768         
1769               while (head < tail && !too_large_failure)
1770                 {
1771                   int_list_ptr ps;
1772                   child = queue[++head];
1773
1774                   for (ps = s_preds[child]; ps; ps = ps->next)
1775                     {
1776                       node = INT_LIST_VAL (ps);
1777
1778                       /* See discussion above about nodes not marked as in
1779                          this loop during the initial DFS traversal.  */
1780                       if (node == ENTRY_BLOCK || node == EXIT_BLOCK
1781                           || max_hdr[node] != loop_head)
1782                         {
1783                           tail = -1;
1784                           break;
1785                         }
1786                       else if (!TEST_BIT (in_queue, node) && node != i)
1787                         {
1788                           queue[++tail] = node;
1789                           SET_BIT (in_queue, node);
1790
1791                           if (too_large (node, &num_bbs, &num_insns))
1792                             {
1793                               too_large_failure = 1;
1794                               break;
1795                             }
1796                         }
1797                     }
1798                 }
1799
1800               if (tail >= 0 && !too_large_failure)
1801                 {
1802                   /* Place the loop header into list of region blocks.  */
1803                   degree[i] = -1;
1804                   rgn_bb_table[idx] = i;
1805                   RGN_NR_BLOCKS (nr_regions) = num_bbs;
1806                   RGN_BLOCKS (nr_regions) = idx++;
1807                   CONTAINING_RGN (i) = nr_regions;
1808                   BLOCK_TO_BB (i) = count = 0;
1809
1810                   /* Remove blocks from queue[] when their in degree becomes
1811                  zero.  Repeat until no blocks are left on the list.  This
1812                  produces a topological list of blocks in the region.  */
1813                   while (tail >= 0)
1814                     {
1815                       int_list_ptr ps;
1816
1817                       if (head < 0)
1818                         head = tail;
1819                       child = queue[head];
1820                       if (degree[child] == 0)
1821                         {
1822                           degree[child] = -1;
1823                           rgn_bb_table[idx++] = child;
1824                           BLOCK_TO_BB (child) = ++count;
1825                           CONTAINING_RGN (child) = nr_regions;
1826                           queue[head] = queue[tail--];
1827
1828                           for (ps = s_succs[child]; ps; ps = ps->next)
1829                             if (INT_LIST_VAL (ps) != ENTRY_BLOCK
1830                                 && INT_LIST_VAL (ps) != EXIT_BLOCK)
1831                               --degree[INT_LIST_VAL (ps)];
1832                         }
1833                       else
1834                         --head;
1835                     }
1836                   ++nr_regions;
1837                 }
1838             }
1839         }
1840     }
1841
1842   /* Any block that did not end up in a region is placed into a region
1843      by itself.  */
1844   for (i = 0; i < n_basic_blocks; i++)
1845     if (degree[i] >= 0)
1846       {
1847         rgn_bb_table[idx] = i;
1848         RGN_NR_BLOCKS (nr_regions) = 1;
1849         RGN_BLOCKS (nr_regions) = idx++;
1850         CONTAINING_RGN (i) = nr_regions++;
1851         BLOCK_TO_BB (i) = 0;
1852       }
1853
1854   free (passed);
1855   free (header);
1856   free (inner);
1857   free (in_queue);
1858   free (in_stack);
1859 }
1860
1861
1862 /* functions for regions scheduling information */
1863
1864 /* Compute dominators, probability, and potential-split-edges of bb.
1865    Assume that these values were already computed for bb's predecessors.  */
1866
1867 static void
1868 compute_dom_prob_ps (bb)
1869      int bb;
1870 {
1871   int nxt_in_edge, fst_in_edge, pred;
1872   int fst_out_edge, nxt_out_edge, nr_out_edges, nr_rgn_out_edges;
1873
1874   prob[bb] = 0.0;
1875   if (IS_RGN_ENTRY (bb))
1876     {
1877       BITSET_ADD (dom[bb], 0, bbset_size);
1878       prob[bb] = 1.0;
1879       return;
1880     }
1881
1882   fst_in_edge = nxt_in_edge = IN_EDGES (BB_TO_BLOCK (bb));
1883
1884   /* intialize dom[bb] to '111..1' */
1885   BITSET_INVERT (dom[bb], bbset_size);
1886
1887   do
1888     {
1889       pred = FROM_BLOCK (nxt_in_edge);
1890       BITSET_INTER (dom[bb], dom[BLOCK_TO_BB (pred)], bbset_size);
1891
1892       BITSET_UNION (ancestor_edges[bb], ancestor_edges[BLOCK_TO_BB (pred)],
1893                     edgeset_size);
1894
1895       BITSET_ADD (ancestor_edges[bb], EDGE_TO_BIT (nxt_in_edge), edgeset_size);
1896
1897       nr_out_edges = 1;
1898       nr_rgn_out_edges = 0;
1899       fst_out_edge = OUT_EDGES (pred);
1900       nxt_out_edge = NEXT_OUT (fst_out_edge);
1901       BITSET_UNION (pot_split[bb], pot_split[BLOCK_TO_BB (pred)],
1902                     edgeset_size);
1903
1904       BITSET_ADD (pot_split[bb], EDGE_TO_BIT (fst_out_edge), edgeset_size);
1905
1906       /* the successor doesn't belong the region? */
1907       if (CONTAINING_RGN (TO_BLOCK (fst_out_edge)) !=
1908           CONTAINING_RGN (BB_TO_BLOCK (bb)))
1909         ++nr_rgn_out_edges;
1910
1911       while (fst_out_edge != nxt_out_edge)
1912         {
1913           ++nr_out_edges;
1914           /* the successor doesn't belong the region? */
1915           if (CONTAINING_RGN (TO_BLOCK (nxt_out_edge)) !=
1916               CONTAINING_RGN (BB_TO_BLOCK (bb)))
1917             ++nr_rgn_out_edges;
1918           BITSET_ADD (pot_split[bb], EDGE_TO_BIT (nxt_out_edge), edgeset_size);
1919           nxt_out_edge = NEXT_OUT (nxt_out_edge);
1920
1921         }
1922
1923       /* now nr_rgn_out_edges is the number of region-exit edges from pred,
1924          and nr_out_edges will be the number of pred out edges not leaving
1925          the region.  */
1926       nr_out_edges -= nr_rgn_out_edges;
1927       if (nr_rgn_out_edges > 0)
1928         prob[bb] += 0.9 * prob[BLOCK_TO_BB (pred)] / nr_out_edges;
1929       else
1930         prob[bb] += prob[BLOCK_TO_BB (pred)] / nr_out_edges;
1931       nxt_in_edge = NEXT_IN (nxt_in_edge);
1932     }
1933   while (fst_in_edge != nxt_in_edge);
1934
1935   BITSET_ADD (dom[bb], bb, bbset_size);
1936   BITSET_DIFFER (pot_split[bb], ancestor_edges[bb], edgeset_size);
1937
1938   if (sched_verbose >= 2)
1939     fprintf (dump, ";;  bb_prob(%d, %d) = %3d\n", bb, BB_TO_BLOCK (bb), (int) (100.0 * prob[bb]));
1940 }                               /* compute_dom_prob_ps */
1941
1942 /* functions for target info */
1943
1944 /* Compute in BL the list of split-edges of bb_src relatively to bb_trg.
1945    Note that bb_trg dominates bb_src.  */
1946
1947 static void
1948 split_edges (bb_src, bb_trg, bl)
1949      int bb_src;
1950      int bb_trg;
1951      edgelst *bl;
1952 {
1953   int es = edgeset_size;
1954   edgeset src = (edgeset) alloca (es * sizeof (HOST_WIDE_INT));
1955
1956   while (es--)
1957     src[es] = (pot_split[bb_src])[es];
1958   BITSET_DIFFER (src, pot_split[bb_trg], edgeset_size);
1959   extract_bitlst (src, edgeset_size, bl);
1960 }
1961
1962
1963 /* Find the valid candidate-source-blocks for the target block TRG, compute
1964    their probability, and check if they are speculative or not.
1965    For speculative sources, compute their update-blocks and split-blocks.  */
1966
1967 static void
1968 compute_trg_info (trg)
1969      int trg;
1970 {
1971   register candidate *sp;
1972   edgelst el;
1973   int check_block, update_idx;
1974   int i, j, k, fst_edge, nxt_edge;
1975
1976   /* define some of the fields for the target bb as well */
1977   sp = candidate_table + trg;
1978   sp->is_valid = 1;
1979   sp->is_speculative = 0;
1980   sp->src_prob = 100;
1981
1982   for (i = trg + 1; i < current_nr_blocks; i++)
1983     {
1984       sp = candidate_table + i;
1985
1986       sp->is_valid = IS_DOMINATED (i, trg);
1987       if (sp->is_valid)
1988         {
1989           sp->src_prob = GET_SRC_PROB (i, trg);
1990           sp->is_valid = (sp->src_prob >= MIN_PROBABILITY);
1991         }
1992
1993       if (sp->is_valid)
1994         {
1995           split_edges (i, trg, &el);
1996           sp->is_speculative = (el.nr_members) ? 1 : 0;
1997           if (sp->is_speculative && !flag_schedule_speculative)
1998             sp->is_valid = 0;
1999         }
2000
2001       if (sp->is_valid)
2002         {
2003           sp->split_bbs.first_member = &bblst_table[bblst_last];
2004           sp->split_bbs.nr_members = el.nr_members;
2005           for (j = 0; j < el.nr_members; bblst_last++, j++)
2006             bblst_table[bblst_last] =
2007               TO_BLOCK (rgn_edges[el.first_member[j]]);
2008           sp->update_bbs.first_member = &bblst_table[bblst_last];
2009           update_idx = 0;
2010           for (j = 0; j < el.nr_members; j++)
2011             {
2012               check_block = FROM_BLOCK (rgn_edges[el.first_member[j]]);
2013               fst_edge = nxt_edge = OUT_EDGES (check_block);
2014               do
2015                 {
2016                   for (k = 0; k < el.nr_members; k++)
2017                     if (EDGE_TO_BIT (nxt_edge) == el.first_member[k])
2018                       break;
2019
2020                   if (k >= el.nr_members)
2021                     {
2022                       bblst_table[bblst_last++] = TO_BLOCK (nxt_edge);
2023                       update_idx++;
2024                     }
2025
2026                   nxt_edge = NEXT_OUT (nxt_edge);
2027                 }
2028               while (fst_edge != nxt_edge);
2029             }
2030           sp->update_bbs.nr_members = update_idx;
2031
2032         }
2033       else
2034         {
2035           sp->split_bbs.nr_members = sp->update_bbs.nr_members = 0;
2036
2037           sp->is_speculative = 0;
2038           sp->src_prob = 0;
2039         }
2040     }
2041 }                               /* compute_trg_info */
2042
2043
2044 /* Print candidates info, for debugging purposes.  Callable from debugger.  */
2045
2046 void
2047 debug_candidate (i)
2048      int i;
2049 {
2050   if (!candidate_table[i].is_valid)
2051     return;
2052
2053   if (candidate_table[i].is_speculative)
2054     {
2055       int j;
2056       fprintf (dump, "src b %d bb %d speculative \n", BB_TO_BLOCK (i), i);
2057
2058       fprintf (dump, "split path: ");
2059       for (j = 0; j < candidate_table[i].split_bbs.nr_members; j++)
2060         {
2061           int b = candidate_table[i].split_bbs.first_member[j];
2062
2063           fprintf (dump, " %d ", b);
2064         }
2065       fprintf (dump, "\n");
2066
2067       fprintf (dump, "update path: ");
2068       for (j = 0; j < candidate_table[i].update_bbs.nr_members; j++)
2069         {
2070           int b = candidate_table[i].update_bbs.first_member[j];
2071
2072           fprintf (dump, " %d ", b);
2073         }
2074       fprintf (dump, "\n");
2075     }
2076   else
2077     {
2078       fprintf (dump, " src %d equivalent\n", BB_TO_BLOCK (i));
2079     }
2080 }
2081
2082
2083 /* Print candidates info, for debugging purposes.  Callable from debugger.  */
2084
2085 void
2086 debug_candidates (trg)
2087      int trg;
2088 {
2089   int i;
2090
2091   fprintf (dump, "----------- candidate table: target: b=%d bb=%d ---\n",
2092            BB_TO_BLOCK (trg), trg);
2093   for (i = trg + 1; i < current_nr_blocks; i++)
2094     debug_candidate (i);
2095 }
2096
2097
2098 /* functions for speculative scheduing */
2099
2100 /* Return 0 if x is a set of a register alive in the beginning of one
2101    of the split-blocks of src, otherwise return 1.  */
2102
2103 static int
2104 check_live_1 (src, x)
2105      int src;
2106      rtx x;
2107 {
2108   register int i;
2109   register int regno;
2110   register rtx reg = SET_DEST (x);
2111
2112   if (reg == 0)
2113     return 1;
2114
2115   while (GET_CODE (reg) == SUBREG || GET_CODE (reg) == ZERO_EXTRACT
2116          || GET_CODE (reg) == SIGN_EXTRACT
2117          || GET_CODE (reg) == STRICT_LOW_PART)
2118     reg = XEXP (reg, 0);
2119
2120   if (GET_CODE (reg) != REG)
2121     return 1;
2122
2123   regno = REGNO (reg);
2124
2125   if (regno < FIRST_PSEUDO_REGISTER && global_regs[regno])
2126     {
2127       /* Global registers are assumed live */
2128       return 0;
2129     }
2130   else
2131     {
2132       if (regno < FIRST_PSEUDO_REGISTER)
2133         {
2134           /* check for hard registers */
2135           int j = HARD_REGNO_NREGS (regno, GET_MODE (reg));
2136           while (--j >= 0)
2137             {
2138               for (i = 0; i < candidate_table[src].split_bbs.nr_members; i++)
2139                 {
2140                   int b = candidate_table[src].split_bbs.first_member[i];
2141
2142                   if (REGNO_REG_SET_P (basic_block_live_at_start[b], regno + j))
2143                     {
2144                       return 0;
2145                     }
2146                 }
2147             }
2148         }
2149       else
2150         {
2151           /* check for psuedo registers */
2152           for (i = 0; i < candidate_table[src].split_bbs.nr_members; i++)
2153             {
2154               int b = candidate_table[src].split_bbs.first_member[i];
2155
2156               if (REGNO_REG_SET_P (basic_block_live_at_start[b], regno))
2157                 {
2158                   return 0;
2159                 }
2160             }
2161         }
2162     }
2163
2164   return 1;
2165 }
2166
2167
2168 /* If x is a set of a register R, mark that R is alive in the beginning
2169    of every update-block of src.  */
2170
2171 static void
2172 update_live_1 (src, x)
2173      int src;
2174      rtx x;
2175 {
2176   register int i;
2177   register int regno;
2178   register rtx reg = SET_DEST (x);
2179
2180   if (reg == 0)
2181     return;
2182
2183   while (GET_CODE (reg) == SUBREG || GET_CODE (reg) == ZERO_EXTRACT
2184          || GET_CODE (reg) == SIGN_EXTRACT
2185          || GET_CODE (reg) == STRICT_LOW_PART)
2186     reg = XEXP (reg, 0);
2187
2188   if (GET_CODE (reg) != REG)
2189     return;
2190
2191   /* Global registers are always live, so the code below does not apply
2192      to them.  */
2193
2194   regno = REGNO (reg);
2195
2196   if (regno >= FIRST_PSEUDO_REGISTER || !global_regs[regno])
2197     {
2198       if (regno < FIRST_PSEUDO_REGISTER)
2199         {
2200           int j = HARD_REGNO_NREGS (regno, GET_MODE (reg));
2201           while (--j >= 0)
2202             {
2203               for (i = 0; i < candidate_table[src].update_bbs.nr_members; i++)
2204                 {
2205                   int b = candidate_table[src].update_bbs.first_member[i];
2206
2207                   SET_REGNO_REG_SET (basic_block_live_at_start[b], regno + j);
2208                 }
2209             }
2210         }
2211       else
2212         {
2213           for (i = 0; i < candidate_table[src].update_bbs.nr_members; i++)
2214             {
2215               int b = candidate_table[src].update_bbs.first_member[i];
2216
2217               SET_REGNO_REG_SET (basic_block_live_at_start[b], regno);
2218             }
2219         }
2220     }
2221 }
2222
2223
2224 /* Return 1 if insn can be speculatively moved from block src to trg,
2225    otherwise return 0.  Called before first insertion of insn to
2226    ready-list or before the scheduling.  */
2227
2228 static int
2229 check_live (insn, src)
2230      rtx insn;
2231      int src;
2232 {
2233   /* find the registers set by instruction */
2234   if (GET_CODE (PATTERN (insn)) == SET
2235       || GET_CODE (PATTERN (insn)) == CLOBBER)
2236     return check_live_1 (src, PATTERN (insn));
2237   else if (GET_CODE (PATTERN (insn)) == PARALLEL)
2238     {
2239       int j;
2240       for (j = XVECLEN (PATTERN (insn), 0) - 1; j >= 0; j--)
2241         if ((GET_CODE (XVECEXP (PATTERN (insn), 0, j)) == SET
2242              || GET_CODE (XVECEXP (PATTERN (insn), 0, j)) == CLOBBER)
2243             && !check_live_1 (src, XVECEXP (PATTERN (insn), 0, j)))
2244           return 0;
2245
2246       return 1;
2247     }
2248
2249   return 1;
2250 }
2251
2252
2253 /* Update the live registers info after insn was moved speculatively from
2254    block src to trg.  */
2255
2256 static void
2257 update_live (insn, src)
2258      rtx insn;
2259      int src;
2260 {
2261   /* find the registers set by instruction */
2262   if (GET_CODE (PATTERN (insn)) == SET
2263       || GET_CODE (PATTERN (insn)) == CLOBBER)
2264     update_live_1 (src, PATTERN (insn));
2265   else if (GET_CODE (PATTERN (insn)) == PARALLEL)
2266     {
2267       int j;
2268       for (j = XVECLEN (PATTERN (insn), 0) - 1; j >= 0; j--)
2269         if (GET_CODE (XVECEXP (PATTERN (insn), 0, j)) == SET
2270             || GET_CODE (XVECEXP (PATTERN (insn), 0, j)) == CLOBBER)
2271           update_live_1 (src, XVECEXP (PATTERN (insn), 0, j));
2272     }
2273 }
2274
2275 /* Exception Free Loads:
2276
2277    We define five classes of speculative loads: IFREE, IRISKY,
2278    PFREE, PRISKY, and MFREE.
2279
2280    IFREE loads are loads that are proved to be exception-free, just
2281    by examining the load insn.  Examples for such loads are loads
2282    from TOC and loads of global data.
2283
2284    IRISKY loads are loads that are proved to be exception-risky,
2285    just by examining the load insn.  Examples for such loads are
2286    volatile loads and loads from shared memory.
2287
2288    PFREE loads are loads for which we can prove, by examining other
2289    insns, that they are exception-free.  Currently, this class consists
2290    of loads for which we are able to find a "similar load", either in
2291    the target block, or, if only one split-block exists, in that split
2292    block.  Load2 is similar to load1 if both have same single base
2293    register.  We identify only part of the similar loads, by finding
2294    an insn upon which both load1 and load2 have a DEF-USE dependence.
2295
2296    PRISKY loads are loads for which we can prove, by examining other
2297    insns, that they are exception-risky.  Currently we have two proofs for
2298    such loads.  The first proof detects loads that are probably guarded by a
2299    test on the memory address.  This proof is based on the
2300    backward and forward data dependence information for the region.
2301    Let load-insn be the examined load.
2302    Load-insn is PRISKY iff ALL the following hold:
2303
2304    - insn1 is not in the same block as load-insn
2305    - there is a DEF-USE dependence chain (insn1, ..., load-insn)
2306    - test-insn is either a compare or a branch, not in the same block as load-insn
2307    - load-insn is reachable from test-insn
2308    - there is a DEF-USE dependence chain (insn1, ..., test-insn)
2309
2310    This proof might fail when the compare and the load are fed
2311    by an insn not in the region.  To solve this, we will add to this
2312    group all loads that have no input DEF-USE dependence.
2313
2314    The second proof detects loads that are directly or indirectly
2315    fed by a speculative load.  This proof is affected by the
2316    scheduling process.  We will use the flag  fed_by_spec_load.
2317    Initially, all insns have this flag reset.  After a speculative
2318    motion of an insn, if insn is either a load, or marked as
2319    fed_by_spec_load, we will also mark as fed_by_spec_load every
2320    insn1 for which a DEF-USE dependence (insn, insn1) exists.  A
2321    load which is fed_by_spec_load is also PRISKY.
2322
2323    MFREE (maybe-free) loads are all the remaining loads. They may be
2324    exception-free, but we cannot prove it.
2325
2326    Now, all loads in IFREE and PFREE classes are considered
2327    exception-free, while all loads in IRISKY and PRISKY classes are
2328    considered exception-risky.  As for loads in the MFREE class,
2329    these are considered either exception-free or exception-risky,
2330    depending on whether we are pessimistic or optimistic.  We have
2331    to take the pessimistic approach to assure the safety of
2332    speculative scheduling, but we can take the optimistic approach
2333    by invoking the -fsched_spec_load_dangerous option.  */
2334
2335 enum INSN_TRAP_CLASS
2336 {
2337   TRAP_FREE = 0, IFREE = 1, PFREE_CANDIDATE = 2,
2338   PRISKY_CANDIDATE = 3, IRISKY = 4, TRAP_RISKY = 5
2339 };
2340
2341 #define WORST_CLASS(class1, class2) \
2342 ((class1 > class2) ? class1 : class2)
2343
2344 /* Indexed by INSN_UID, and set if there's DEF-USE dependence between */
2345 /* some speculatively moved load insn and this one.  */
2346 char *fed_by_spec_load;
2347 char *is_load_insn;
2348
2349 /* Non-zero if block bb_to is equal to, or reachable from block bb_from.  */
2350 #define IS_REACHABLE(bb_from, bb_to)                                    \
2351 (bb_from == bb_to                                                       \
2352    || IS_RGN_ENTRY (bb_from)                                            \
2353    || (bitset_member (ancestor_edges[bb_to],                            \
2354                       EDGE_TO_BIT (IN_EDGES (BB_TO_BLOCK (bb_from))),   \
2355                       edgeset_size)))
2356 #define FED_BY_SPEC_LOAD(insn) (fed_by_spec_load[INSN_UID (insn)])
2357 #define IS_LOAD_INSN(insn) (is_load_insn[INSN_UID (insn)])
2358
2359 /* Non-zero iff the address is comprised from at most 1 register */
2360 #define CONST_BASED_ADDRESS_P(x)                        \
2361   (GET_CODE (x) == REG                                  \
2362    || ((GET_CODE (x) == PLUS || GET_CODE (x) == MINUS   \
2363         || (GET_CODE (x) == LO_SUM))                    \
2364        && (GET_CODE (XEXP (x, 0)) == CONST_INT          \
2365            || GET_CODE (XEXP (x, 1)) == CONST_INT)))
2366
2367 /* Turns on the fed_by_spec_load flag for insns fed by load_insn.  */
2368
2369 static void
2370 set_spec_fed (load_insn)
2371      rtx load_insn;
2372 {
2373   rtx link;
2374
2375   for (link = INSN_DEPEND (load_insn); link; link = XEXP (link, 1))
2376     if (GET_MODE (link) == VOIDmode)
2377       FED_BY_SPEC_LOAD (XEXP (link, 0)) = 1;
2378 }                               /* set_spec_fed */
2379
2380 /* On the path from the insn to load_insn_bb, find a conditional branch */
2381 /* depending on insn, that guards the speculative load.  */
2382
2383 static int
2384 find_conditional_protection (insn, load_insn_bb)
2385      rtx insn;
2386      int load_insn_bb;
2387 {
2388   rtx link;
2389
2390   /* iterate through DEF-USE forward dependences */
2391   for (link = INSN_DEPEND (insn); link; link = XEXP (link, 1))
2392     {
2393       rtx next = XEXP (link, 0);
2394       if ((CONTAINING_RGN (INSN_BLOCK (next)) ==
2395            CONTAINING_RGN (BB_TO_BLOCK (load_insn_bb)))
2396           && IS_REACHABLE (INSN_BB (next), load_insn_bb)
2397           && load_insn_bb != INSN_BB (next)
2398           && GET_MODE (link) == VOIDmode
2399           && (GET_CODE (next) == JUMP_INSN
2400               || find_conditional_protection (next, load_insn_bb)))
2401         return 1;
2402     }
2403   return 0;
2404 }                               /* find_conditional_protection */
2405
2406 /* Returns 1 if the same insn1 that participates in the computation
2407    of load_insn's address is feeding a conditional branch that is
2408    guarding on load_insn. This is true if we find a the two DEF-USE
2409    chains:
2410    insn1 -> ... -> conditional-branch
2411    insn1 -> ... -> load_insn,
2412    and if a flow path exist:
2413    insn1 -> ... -> conditional-branch -> ... -> load_insn,
2414    and if insn1 is on the path
2415    region-entry -> ... -> bb_trg -> ... load_insn.
2416
2417    Locate insn1 by climbing on LOG_LINKS from load_insn.
2418    Locate the branch by following INSN_DEPEND from insn1.  */
2419
2420 static int
2421 is_conditionally_protected (load_insn, bb_src, bb_trg)
2422      rtx load_insn;
2423      int bb_src, bb_trg;
2424 {
2425   rtx link;
2426
2427   for (link = LOG_LINKS (load_insn); link; link = XEXP (link, 1))
2428     {
2429       rtx insn1 = XEXP (link, 0);
2430
2431       /* must be a DEF-USE dependence upon non-branch */
2432       if (GET_MODE (link) != VOIDmode
2433           || GET_CODE (insn1) == JUMP_INSN)
2434         continue;
2435
2436       /* must exist a path: region-entry -> ... -> bb_trg -> ... load_insn */
2437       if (INSN_BB (insn1) == bb_src
2438           || (CONTAINING_RGN (INSN_BLOCK (insn1))
2439               != CONTAINING_RGN (BB_TO_BLOCK (bb_src)))
2440           || (!IS_REACHABLE (bb_trg, INSN_BB (insn1))
2441               && !IS_REACHABLE (INSN_BB (insn1), bb_trg)))
2442         continue;
2443
2444       /* now search for the conditional-branch */
2445       if (find_conditional_protection (insn1, bb_src))
2446         return 1;
2447
2448       /* recursive step: search another insn1, "above" current insn1.  */
2449       return is_conditionally_protected (insn1, bb_src, bb_trg);
2450     }
2451
2452   /* the chain does not exsist */
2453   return 0;
2454 }                               /* is_conditionally_protected */
2455
2456 /* Returns 1 if a clue for "similar load" 'insn2' is found, and hence
2457    load_insn can move speculatively from bb_src to bb_trg.  All the
2458    following must hold:
2459
2460    (1) both loads have 1 base register (PFREE_CANDIDATEs).
2461    (2) load_insn and load1 have a def-use dependence upon
2462    the same insn 'insn1'.
2463    (3) either load2 is in bb_trg, or:
2464    - there's only one split-block, and
2465    - load1 is on the escape path, and
2466
2467    From all these we can conclude that the two loads access memory
2468    addresses that differ at most by a constant, and hence if moving
2469    load_insn would cause an exception, it would have been caused by
2470    load2 anyhow.  */
2471
2472 static int
2473 is_pfree (load_insn, bb_src, bb_trg)
2474      rtx load_insn;
2475      int bb_src, bb_trg;
2476 {
2477   rtx back_link;
2478   register candidate *candp = candidate_table + bb_src;
2479
2480   if (candp->split_bbs.nr_members != 1)
2481     /* must have exactly one escape block */
2482     return 0;
2483
2484   for (back_link = LOG_LINKS (load_insn);
2485        back_link; back_link = XEXP (back_link, 1))
2486     {
2487       rtx insn1 = XEXP (back_link, 0);
2488
2489       if (GET_MODE (back_link) == VOIDmode)
2490         {
2491           /* found a DEF-USE dependence (insn1, load_insn) */
2492           rtx fore_link;
2493
2494           for (fore_link = INSN_DEPEND (insn1);
2495                fore_link; fore_link = XEXP (fore_link, 1))
2496             {
2497               rtx insn2 = XEXP (fore_link, 0);
2498               if (GET_MODE (fore_link) == VOIDmode)
2499                 {
2500                   /* found a DEF-USE dependence (insn1, insn2) */
2501                   if (haifa_classify_insn (insn2) != PFREE_CANDIDATE)
2502                     /* insn2 not guaranteed to be a 1 base reg load */
2503                     continue;
2504
2505                   if (INSN_BB (insn2) == bb_trg)
2506                     /* insn2 is the similar load, in the target block */
2507                     return 1;
2508
2509                   if (*(candp->split_bbs.first_member) == INSN_BLOCK (insn2))
2510                     /* insn2 is a similar load, in a split-block */
2511                     return 1;
2512                 }
2513             }
2514         }
2515     }
2516
2517   /* couldn't find a similar load */
2518   return 0;
2519 }                               /* is_pfree */
2520
2521 /* Returns a class that insn with GET_DEST(insn)=x may belong to,
2522    as found by analyzing insn's expression.  */
2523
2524 static int
2525 may_trap_exp (x, is_store)
2526      rtx x;
2527      int is_store;
2528 {
2529   enum rtx_code code;
2530
2531   if (x == 0)
2532     return TRAP_FREE;
2533   code = GET_CODE (x);
2534   if (is_store)
2535     {
2536       if (code == MEM)
2537         return TRAP_RISKY;
2538       else
2539         return TRAP_FREE;
2540     }
2541   if (code == MEM)
2542     {
2543       /* The insn uses memory */
2544       /* a volatile load */
2545       if (MEM_VOLATILE_P (x))
2546         return IRISKY;
2547       /* an exception-free load */
2548       if (!may_trap_p (x))
2549         return IFREE;
2550       /* a load with 1 base register, to be further checked */
2551       if (CONST_BASED_ADDRESS_P (XEXP (x, 0)))
2552         return PFREE_CANDIDATE;
2553       /* no info on the load, to be further checked */
2554       return PRISKY_CANDIDATE;
2555     }
2556   else
2557     {
2558       char *fmt;
2559       int i, insn_class = TRAP_FREE;
2560
2561       /* neither store nor load, check if it may cause a trap */
2562       if (may_trap_p (x))
2563         return TRAP_RISKY;
2564       /* recursive step: walk the insn...  */
2565       fmt = GET_RTX_FORMAT (code);
2566       for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
2567         {
2568           if (fmt[i] == 'e')
2569             {
2570               int tmp_class = may_trap_exp (XEXP (x, i), is_store);
2571               insn_class = WORST_CLASS (insn_class, tmp_class);
2572             }
2573           else if (fmt[i] == 'E')
2574             {
2575               int j;
2576               for (j = 0; j < XVECLEN (x, i); j++)
2577                 {
2578                   int tmp_class = may_trap_exp (XVECEXP (x, i, j), is_store);
2579                   insn_class = WORST_CLASS (insn_class, tmp_class);
2580                   if (insn_class == TRAP_RISKY || insn_class == IRISKY)
2581                     break;
2582                 }
2583             }
2584           if (insn_class == TRAP_RISKY || insn_class == IRISKY)
2585             break;
2586         }
2587       return insn_class;
2588     }
2589 }                               /* may_trap_exp */
2590
2591
2592 /* Classifies insn for the purpose of verifying that it can be
2593    moved speculatively, by examining it's patterns, returning:
2594    TRAP_RISKY: store, or risky non-load insn (e.g. division by variable).
2595    TRAP_FREE: non-load insn.
2596    IFREE: load from a globaly safe location.
2597    IRISKY: volatile load.
2598    PFREE_CANDIDATE, PRISKY_CANDIDATE: load that need to be checked for
2599    being either PFREE or PRISKY.  */
2600
2601 static int
2602 haifa_classify_insn (insn)
2603      rtx insn;
2604 {
2605   rtx pat = PATTERN (insn);
2606   int tmp_class = TRAP_FREE;
2607   int insn_class = TRAP_FREE;
2608   enum rtx_code code;
2609
2610   if (GET_CODE (pat) == PARALLEL)
2611     {
2612       int i, len = XVECLEN (pat, 0);
2613
2614       for (i = len - 1; i >= 0; i--)
2615         {
2616           code = GET_CODE (XVECEXP (pat, 0, i));
2617           switch (code)
2618             {
2619             case CLOBBER:
2620               /* test if it is a 'store' */
2621               tmp_class = may_trap_exp (XEXP (XVECEXP (pat, 0, i), 0), 1);
2622               break;
2623             case SET:
2624               /* test if it is a store */
2625               tmp_class = may_trap_exp (SET_DEST (XVECEXP (pat, 0, i)), 1);
2626               if (tmp_class == TRAP_RISKY)
2627                 break;
2628               /* test if it is a load  */
2629               tmp_class =
2630                 WORST_CLASS (tmp_class,
2631                            may_trap_exp (SET_SRC (XVECEXP (pat, 0, i)), 0));
2632               break;
2633             case TRAP_IF:
2634               tmp_class = TRAP_RISKY;
2635               break;
2636             default:;
2637             }
2638           insn_class = WORST_CLASS (insn_class, tmp_class);
2639           if (insn_class == TRAP_RISKY || insn_class == IRISKY)
2640             break;
2641         }
2642     }
2643   else
2644     {
2645       code = GET_CODE (pat);
2646       switch (code)
2647         {
2648         case CLOBBER:
2649           /* test if it is a 'store' */
2650           tmp_class = may_trap_exp (XEXP (pat, 0), 1);
2651           break;
2652         case SET:
2653           /* test if it is a store */
2654           tmp_class = may_trap_exp (SET_DEST (pat), 1);
2655           if (tmp_class == TRAP_RISKY)
2656             break;
2657           /* test if it is a load  */
2658           tmp_class =
2659             WORST_CLASS (tmp_class,
2660                          may_trap_exp (SET_SRC (pat), 0));
2661           break;
2662         case TRAP_IF:
2663           tmp_class = TRAP_RISKY;
2664           break;
2665         default:;
2666         }
2667       insn_class = tmp_class;
2668     }
2669
2670   return insn_class;
2671
2672 }                               /* haifa_classify_insn */
2673
2674 /* Return 1 if load_insn is prisky (i.e. if load_insn is fed by
2675    a load moved speculatively, or if load_insn is protected by
2676    a compare on load_insn's address).  */
2677
2678 static int
2679 is_prisky (load_insn, bb_src, bb_trg)
2680      rtx load_insn;
2681      int bb_src, bb_trg;
2682 {
2683   if (FED_BY_SPEC_LOAD (load_insn))
2684     return 1;
2685
2686   if (LOG_LINKS (load_insn) == NULL)
2687     /* dependence may 'hide' out of the region.  */
2688     return 1;
2689
2690   if (is_conditionally_protected (load_insn, bb_src, bb_trg))
2691     return 1;
2692
2693   return 0;
2694 }                               /* is_prisky */
2695
2696 /* Insn is a candidate to be moved speculatively from bb_src to bb_trg.
2697    Return 1 if insn is exception-free (and the motion is valid)
2698    and 0 otherwise.  */
2699
2700 static int
2701 is_exception_free (insn, bb_src, bb_trg)
2702      rtx insn;
2703      int bb_src, bb_trg;
2704 {
2705   int insn_class = haifa_classify_insn (insn);
2706
2707   /* handle non-load insns */
2708   switch (insn_class)
2709     {
2710     case TRAP_FREE:
2711       return 1;
2712     case TRAP_RISKY:
2713       return 0;
2714     default:;
2715     }
2716
2717   /* handle loads */
2718   if (!flag_schedule_speculative_load)
2719     return 0;
2720   IS_LOAD_INSN (insn) = 1;
2721   switch (insn_class)
2722     {
2723     case IFREE:
2724       return (1);
2725     case IRISKY:
2726       return 0;
2727     case PFREE_CANDIDATE:
2728       if (is_pfree (insn, bb_src, bb_trg))
2729         return 1;
2730       /* don't 'break' here: PFREE-candidate is also PRISKY-candidate */
2731     case PRISKY_CANDIDATE:
2732       if (!flag_schedule_speculative_load_dangerous
2733           || is_prisky (insn, bb_src, bb_trg))
2734         return 0;
2735       break;
2736     default:;
2737     }
2738
2739   return flag_schedule_speculative_load_dangerous;
2740 }                               /* is_exception_free */
2741
2742
2743 /* Process an insn's memory dependencies.  There are four kinds of
2744    dependencies:
2745
2746    (0) read dependence: read follows read
2747    (1) true dependence: read follows write
2748    (2) anti dependence: write follows read
2749    (3) output dependence: write follows write
2750
2751    We are careful to build only dependencies which actually exist, and
2752    use transitivity to avoid building too many links.  */
2753 \f
2754 /* Return the INSN_LIST containing INSN in LIST, or NULL
2755    if LIST does not contain INSN.  */
2756
2757 HAIFA_INLINE static rtx
2758 find_insn_list (insn, list)
2759      rtx insn;
2760      rtx list;
2761 {
2762   while (list)
2763     {
2764       if (XEXP (list, 0) == insn)
2765         return list;
2766       list = XEXP (list, 1);
2767     }
2768   return 0;
2769 }
2770
2771
2772 /* Return 1 if the pair (insn, x) is found in (LIST, LIST1), or 0 otherwise.  */
2773
2774 HAIFA_INLINE static char
2775 find_insn_mem_list (insn, x, list, list1)
2776      rtx insn, x;
2777      rtx list, list1;
2778 {
2779   while (list)
2780     {
2781       if (XEXP (list, 0) == insn
2782           && XEXP (list1, 0) == x)
2783         return 1;
2784       list = XEXP (list, 1);
2785       list1 = XEXP (list1, 1);
2786     }
2787   return 0;
2788 }
2789
2790
2791 /* Compute the function units used by INSN.  This caches the value
2792    returned by function_units_used.  A function unit is encoded as the
2793    unit number if the value is non-negative and the compliment of a
2794    mask if the value is negative.  A function unit index is the
2795    non-negative encoding.  */
2796
2797 HAIFA_INLINE static int
2798 insn_unit (insn)
2799      rtx insn;
2800 {
2801   register int unit = INSN_UNIT (insn);
2802
2803   if (unit == 0)
2804     {
2805       recog_memoized (insn);
2806
2807       /* A USE insn, or something else we don't need to understand.
2808          We can't pass these directly to function_units_used because it will
2809          trigger a fatal error for unrecognizable insns.  */
2810       if (INSN_CODE (insn) < 0)
2811         unit = -1;
2812       else
2813         {
2814           unit = function_units_used (insn);
2815           /* Increment non-negative values so we can cache zero.  */
2816           if (unit >= 0)
2817             unit++;
2818         }
2819       /* We only cache 16 bits of the result, so if the value is out of
2820          range, don't cache it.  */
2821       if (FUNCTION_UNITS_SIZE < HOST_BITS_PER_SHORT
2822           || unit >= 0
2823           || (~unit & ((1 << (HOST_BITS_PER_SHORT - 1)) - 1)) == 0)
2824         INSN_UNIT (insn) = unit;
2825     }
2826   return (unit > 0 ? unit - 1 : unit);
2827 }
2828
2829 /* Compute the blockage range for executing INSN on UNIT.  This caches
2830    the value returned by the blockage_range_function for the unit.
2831    These values are encoded in an int where the upper half gives the
2832    minimum value and the lower half gives the maximum value.  */
2833
2834 HAIFA_INLINE static unsigned int
2835 blockage_range (unit, insn)
2836      int unit;
2837      rtx insn;
2838 {
2839   unsigned int blockage = INSN_BLOCKAGE (insn);
2840   unsigned int range;
2841
2842   if (UNIT_BLOCKED (blockage) != unit + 1)
2843     {
2844       range = function_units[unit].blockage_range_function (insn);
2845       /* We only cache the blockage range for one unit and then only if
2846          the values fit.  */
2847       if (HOST_BITS_PER_INT >= UNIT_BITS + 2 * BLOCKAGE_BITS)
2848         INSN_BLOCKAGE (insn) = ENCODE_BLOCKAGE (unit + 1, range);
2849     }
2850   else
2851     range = BLOCKAGE_RANGE (blockage);
2852
2853   return range;
2854 }
2855
2856 /* A vector indexed by function unit instance giving the last insn to use
2857    the unit.  The value of the function unit instance index for unit U
2858    instance I is (U + I * FUNCTION_UNITS_SIZE).  */
2859 static rtx unit_last_insn[FUNCTION_UNITS_SIZE * MAX_MULTIPLICITY];
2860
2861 /* A vector indexed by function unit instance giving the minimum time when
2862    the unit will unblock based on the maximum blockage cost.  */
2863 static int unit_tick[FUNCTION_UNITS_SIZE * MAX_MULTIPLICITY];
2864
2865 /* A vector indexed by function unit number giving the number of insns
2866    that remain to use the unit.  */
2867 static int unit_n_insns[FUNCTION_UNITS_SIZE];
2868
2869 /* Reset the function unit state to the null state.  */
2870
2871 static void
2872 clear_units ()
2873 {
2874   bzero ((char *) unit_last_insn, sizeof (unit_last_insn));
2875   bzero ((char *) unit_tick, sizeof (unit_tick));
2876   bzero ((char *) unit_n_insns, sizeof (unit_n_insns));
2877 }
2878
2879 /* Return the issue-delay of an insn */
2880
2881 HAIFA_INLINE static int
2882 insn_issue_delay (insn)
2883      rtx insn;
2884 {
2885   int i, delay = 0;
2886   int unit = insn_unit (insn);
2887
2888   /* efficiency note: in fact, we are working 'hard' to compute a
2889      value that was available in md file, and is not available in
2890      function_units[] structure.  It would be nice to have this
2891      value there, too.  */
2892   if (unit >= 0)
2893     {
2894       if (function_units[unit].blockage_range_function &&
2895           function_units[unit].blockage_function)
2896         delay = function_units[unit].blockage_function (insn, insn);
2897     }
2898   else
2899     for (i = 0, unit = ~unit; unit; i++, unit >>= 1)
2900       if ((unit & 1) != 0 && function_units[i].blockage_range_function
2901           && function_units[i].blockage_function)
2902         delay = MAX (delay, function_units[i].blockage_function (insn, insn));
2903
2904   return delay;
2905 }
2906
2907 /* Return the actual hazard cost of executing INSN on the unit UNIT,
2908    instance INSTANCE at time CLOCK if the previous actual hazard cost
2909    was COST.  */
2910
2911 HAIFA_INLINE static int
2912 actual_hazard_this_instance (unit, instance, insn, clock, cost)
2913      int unit, instance, clock, cost;
2914      rtx insn;
2915 {
2916   int tick = unit_tick[instance];       /* issue time of the last issued insn */
2917
2918   if (tick - clock > cost)
2919     {
2920       /* The scheduler is operating forward, so unit's last insn is the
2921          executing insn and INSN is the candidate insn.  We want a
2922          more exact measure of the blockage if we execute INSN at CLOCK
2923          given when we committed the execution of the unit's last insn.
2924
2925          The blockage value is given by either the unit's max blockage
2926          constant, blockage range function, or blockage function.  Use
2927          the most exact form for the given unit.  */
2928
2929       if (function_units[unit].blockage_range_function)
2930         {
2931           if (function_units[unit].blockage_function)
2932             tick += (function_units[unit].blockage_function
2933                      (unit_last_insn[instance], insn)
2934                      - function_units[unit].max_blockage);
2935           else
2936             tick += ((int) MAX_BLOCKAGE_COST (blockage_range (unit, insn))
2937                      - function_units[unit].max_blockage);
2938         }
2939       if (tick - clock > cost)
2940         cost = tick - clock;
2941     }
2942   return cost;
2943 }
2944
2945 /* Record INSN as having begun execution on the units encoded by UNIT at
2946    time CLOCK.  */
2947
2948 HAIFA_INLINE static void
2949 schedule_unit (unit, insn, clock)
2950      int unit, clock;
2951      rtx insn;
2952 {
2953   int i;
2954
2955   if (unit >= 0)
2956     {
2957       int instance = unit;
2958 #if MAX_MULTIPLICITY > 1
2959       /* Find the first free instance of the function unit and use that
2960          one.  We assume that one is free.  */
2961       for (i = function_units[unit].multiplicity - 1; i > 0; i--)
2962         {
2963           if (!actual_hazard_this_instance (unit, instance, insn, clock, 0))
2964             break;
2965           instance += FUNCTION_UNITS_SIZE;
2966         }
2967 #endif
2968       unit_last_insn[instance] = insn;
2969       unit_tick[instance] = (clock + function_units[unit].max_blockage);
2970     }
2971   else
2972     for (i = 0, unit = ~unit; unit; i++, unit >>= 1)
2973       if ((unit & 1) != 0)
2974         schedule_unit (i, insn, clock);
2975 }
2976
2977 /* Return the actual hazard cost of executing INSN on the units encoded by
2978    UNIT at time CLOCK if the previous actual hazard cost was COST.  */
2979
2980 HAIFA_INLINE static int
2981 actual_hazard (unit, insn, clock, cost)
2982      int unit, clock, cost;
2983      rtx insn;
2984 {
2985   int i;
2986
2987   if (unit >= 0)
2988     {
2989       /* Find the instance of the function unit with the minimum hazard.  */
2990       int instance = unit;
2991       int best_cost = actual_hazard_this_instance (unit, instance, insn,
2992                                                    clock, cost);
2993       int this_cost;
2994
2995 #if MAX_MULTIPLICITY > 1
2996       if (best_cost > cost)
2997         {
2998           for (i = function_units[unit].multiplicity - 1; i > 0; i--)
2999             {
3000               instance += FUNCTION_UNITS_SIZE;
3001               this_cost = actual_hazard_this_instance (unit, instance, insn,
3002                                                        clock, cost);
3003               if (this_cost < best_cost)
3004                 {
3005                   best_cost = this_cost;
3006                   if (this_cost <= cost)
3007                     break;
3008                 }
3009             }
3010         }
3011 #endif
3012       cost = MAX (cost, best_cost);
3013     }
3014   else
3015     for (i = 0, unit = ~unit; unit; i++, unit >>= 1)
3016       if ((unit & 1) != 0)
3017         cost = actual_hazard (i, insn, clock, cost);
3018
3019   return cost;
3020 }
3021
3022 /* Return the potential hazard cost of executing an instruction on the
3023    units encoded by UNIT if the previous potential hazard cost was COST.
3024    An insn with a large blockage time is chosen in preference to one
3025    with a smaller time; an insn that uses a unit that is more likely
3026    to be used is chosen in preference to one with a unit that is less
3027    used.  We are trying to minimize a subsequent actual hazard.  */
3028
3029 HAIFA_INLINE static int
3030 potential_hazard (unit, insn, cost)
3031      int unit, cost;
3032      rtx insn;
3033 {
3034   int i, ncost;
3035   unsigned int minb, maxb;
3036
3037   if (unit >= 0)
3038     {
3039       minb = maxb = function_units[unit].max_blockage;
3040       if (maxb > 1)
3041         {
3042           if (function_units[unit].blockage_range_function)
3043             {
3044               maxb = minb = blockage_range (unit, insn);
3045               maxb = MAX_BLOCKAGE_COST (maxb);
3046               minb = MIN_BLOCKAGE_COST (minb);
3047             }
3048
3049           if (maxb > 1)
3050             {
3051               /* Make the number of instructions left dominate.  Make the
3052                  minimum delay dominate the maximum delay.  If all these
3053                  are the same, use the unit number to add an arbitrary
3054                  ordering.  Other terms can be added.  */
3055               ncost = minb * 0x40 + maxb;
3056               ncost *= (unit_n_insns[unit] - 1) * 0x1000 + unit;
3057               if (ncost > cost)
3058                 cost = ncost;
3059             }
3060         }
3061     }
3062   else
3063     for (i = 0, unit = ~unit; unit; i++, unit >>= 1)
3064       if ((unit & 1) != 0)
3065         cost = potential_hazard (i, insn, cost);
3066
3067   return cost;
3068 }
3069
3070 /* Compute cost of executing INSN given the dependence LINK on the insn USED.
3071    This is the number of cycles between instruction issue and
3072    instruction results.  */
3073
3074 HAIFA_INLINE static int
3075 insn_cost (insn, link, used)
3076      rtx insn, link, used;
3077 {
3078   register int cost = INSN_COST (insn);
3079
3080   if (cost == 0)
3081     {
3082       recog_memoized (insn);
3083
3084       /* A USE insn, or something else we don't need to understand.
3085          We can't pass these directly to result_ready_cost because it will
3086          trigger a fatal error for unrecognizable insns.  */
3087       if (INSN_CODE (insn) < 0)
3088         {
3089           INSN_COST (insn) = 1;
3090           return 1;
3091         }
3092       else
3093         {
3094           cost = result_ready_cost (insn);
3095
3096           if (cost < 1)
3097             cost = 1;
3098
3099           INSN_COST (insn) = cost;
3100         }
3101     }
3102
3103   /* in this case estimate cost without caring how insn is used.  */
3104   if (link == 0 && used == 0)
3105     return cost;
3106
3107   /* A USE insn should never require the value used to be computed.  This
3108      allows the computation of a function's result and parameter values to
3109      overlap the return and call.  */
3110   recog_memoized (used);
3111   if (INSN_CODE (used) < 0)
3112     LINK_COST_FREE (link) = 1;
3113
3114   /* If some dependencies vary the cost, compute the adjustment.  Most
3115      commonly, the adjustment is complete: either the cost is ignored
3116      (in the case of an output- or anti-dependence), or the cost is
3117      unchanged.  These values are cached in the link as LINK_COST_FREE
3118      and LINK_COST_ZERO.  */
3119
3120   if (LINK_COST_FREE (link))
3121     cost = 1;
3122 #ifdef ADJUST_COST
3123   else if (!LINK_COST_ZERO (link))
3124     {
3125       int ncost = cost;
3126
3127       ADJUST_COST (used, link, insn, ncost);
3128       if (ncost <= 1)
3129         LINK_COST_FREE (link) = ncost = 1;
3130       if (cost == ncost)
3131         LINK_COST_ZERO (link) = 1;
3132       cost = ncost;
3133     }
3134 #endif
3135   return cost;
3136 }
3137
3138 /* Compute the priority number for INSN.  */
3139
3140 static int
3141 priority (insn)
3142      rtx insn;
3143 {
3144   int this_priority;
3145   rtx link;
3146
3147   if (GET_RTX_CLASS (GET_CODE (insn)) != 'i')
3148     return 0;
3149
3150   if ((this_priority = INSN_PRIORITY (insn)) == 0)
3151     {
3152       if (INSN_DEPEND (insn) == 0)
3153         this_priority = insn_cost (insn, 0, 0);
3154       else
3155         for (link = INSN_DEPEND (insn); link; link = XEXP (link, 1))
3156           {
3157             rtx next;
3158             int next_priority;
3159
3160             if (RTX_INTEGRATED_P (link))
3161               continue;
3162
3163             next = XEXP (link, 0);
3164
3165             /* critical path is meaningful in block boundaries only */
3166             if (INSN_BLOCK (next) != INSN_BLOCK (insn))
3167               continue;
3168
3169             next_priority = insn_cost (insn, link, next) + priority (next);
3170             if (next_priority > this_priority)
3171               this_priority = next_priority;
3172           }
3173       INSN_PRIORITY (insn) = this_priority;
3174     }
3175   return this_priority;
3176 }
3177 \f
3178
3179 /* Remove all INSN_LISTs and EXPR_LISTs from the pending lists and add
3180    them to the unused_*_list variables, so that they can be reused.  */
3181
3182 static void
3183 free_pending_lists ()
3184 {
3185   if (current_nr_blocks <= 1)
3186     {
3187       free_list (&pending_read_insns, &unused_insn_list);
3188       free_list (&pending_write_insns, &unused_insn_list);
3189       free_list (&pending_read_mems, &unused_expr_list);
3190       free_list (&pending_write_mems, &unused_expr_list);
3191     }
3192   else
3193     {
3194       /* interblock scheduling */
3195       int bb;
3196
3197       for (bb = 0; bb < current_nr_blocks; bb++)
3198         {
3199           free_list (&bb_pending_read_insns[bb], &unused_insn_list);
3200           free_list (&bb_pending_write_insns[bb], &unused_insn_list);
3201           free_list (&bb_pending_read_mems[bb], &unused_expr_list);
3202           free_list (&bb_pending_write_mems[bb], &unused_expr_list);
3203         }
3204     }
3205 }
3206
3207 /* Add an INSN and MEM reference pair to a pending INSN_LIST and MEM_LIST.
3208    The MEM is a memory reference contained within INSN, which we are saving
3209    so that we can do memory aliasing on it.  */
3210
3211 static void
3212 add_insn_mem_dependence (insn_list, mem_list, insn, mem)
3213      rtx *insn_list, *mem_list, insn, mem;
3214 {
3215   register rtx link;
3216
3217   link = alloc_INSN_LIST (insn, *insn_list);
3218   *insn_list = link;
3219
3220   link = alloc_EXPR_LIST (VOIDmode, mem, *mem_list);
3221   *mem_list = link;
3222
3223   pending_lists_length++;
3224 }
3225 \f
3226
3227 /* Make a dependency between every memory reference on the pending lists
3228    and INSN, thus flushing the pending lists.  If ONLY_WRITE, don't flush
3229    the read list.  */
3230
3231 static void
3232 flush_pending_lists (insn, only_write)
3233      rtx insn;
3234      int only_write;
3235 {
3236   rtx u;
3237   rtx link;
3238
3239   while (pending_read_insns && ! only_write)
3240     {
3241       add_dependence (insn, XEXP (pending_read_insns, 0), REG_DEP_ANTI);
3242
3243       link = pending_read_insns;
3244       pending_read_insns = XEXP (pending_read_insns, 1);
3245       XEXP (link, 1) = unused_insn_list;
3246       unused_insn_list = link;
3247
3248       link = pending_read_mems;
3249       pending_read_mems = XEXP (pending_read_mems, 1);
3250       XEXP (link, 1) = unused_expr_list;
3251       unused_expr_list = link;
3252     }
3253   while (pending_write_insns)
3254     {
3255       add_dependence (insn, XEXP (pending_write_insns, 0), REG_DEP_ANTI);
3256
3257       link = pending_write_insns;
3258       pending_write_insns = XEXP (pending_write_insns, 1);
3259       XEXP (link, 1) = unused_insn_list;
3260       unused_insn_list = link;
3261
3262       link = pending_write_mems;
3263       pending_write_mems = XEXP (pending_write_mems, 1);
3264       XEXP (link, 1) = unused_expr_list;
3265       unused_expr_list = link;
3266     }
3267   pending_lists_length = 0;
3268
3269   /* last_pending_memory_flush is now a list of insns */
3270   for (u = last_pending_memory_flush; u; u = XEXP (u, 1))
3271     add_dependence (insn, XEXP (u, 0), REG_DEP_ANTI);
3272
3273   free_list (&last_pending_memory_flush, &unused_insn_list);
3274   last_pending_memory_flush = alloc_INSN_LIST (insn, NULL_RTX);
3275 }
3276
3277 /* Analyze a single SET or CLOBBER rtx, X, creating all dependencies generated
3278    by the write to the destination of X, and reads of everything mentioned.  */
3279
3280 static void
3281 sched_analyze_1 (x, insn)
3282      rtx x;
3283      rtx insn;
3284 {
3285   register int regno;
3286   register rtx dest = SET_DEST (x);
3287
3288   if (dest == 0)
3289     return;
3290
3291   while (GET_CODE (dest) == STRICT_LOW_PART || GET_CODE (dest) == SUBREG
3292       || GET_CODE (dest) == ZERO_EXTRACT || GET_CODE (dest) == SIGN_EXTRACT)
3293     {
3294       if (GET_CODE (dest) == ZERO_EXTRACT || GET_CODE (dest) == SIGN_EXTRACT)
3295         {
3296           /* The second and third arguments are values read by this insn.  */
3297           sched_analyze_2 (XEXP (dest, 1), insn);
3298           sched_analyze_2 (XEXP (dest, 2), insn);
3299         }
3300       dest = SUBREG_REG (dest);
3301     }
3302
3303   if (GET_CODE (dest) == REG)
3304     {
3305       register int i;
3306
3307       regno = REGNO (dest);
3308
3309       /* A hard reg in a wide mode may really be multiple registers.
3310          If so, mark all of them just like the first.  */
3311       if (regno < FIRST_PSEUDO_REGISTER)
3312         {
3313           i = HARD_REGNO_NREGS (regno, GET_MODE (dest));
3314           while (--i >= 0)
3315             {
3316               rtx u;
3317
3318               for (u = reg_last_uses[regno + i]; u; u = XEXP (u, 1))
3319                 add_dependence (insn, XEXP (u, 0), REG_DEP_ANTI);
3320               reg_last_uses[regno + i] = 0;
3321
3322               for (u = reg_last_sets[regno + i]; u; u = XEXP (u, 1))
3323                 add_dependence (insn, XEXP (u, 0), REG_DEP_OUTPUT);
3324
3325               SET_REGNO_REG_SET (reg_pending_sets, regno + i);
3326
3327               if ((call_used_regs[regno + i] || global_regs[regno + i]))
3328                 /* Function calls clobber all call_used regs.  */
3329                 for (u = last_function_call; u; u = XEXP (u, 1))
3330                   add_dependence (insn, XEXP (u, 0), REG_DEP_ANTI);
3331             }
3332         }
3333       else
3334         {
3335           rtx u;
3336
3337           for (u = reg_last_uses[regno]; u; u = XEXP (u, 1))
3338             add_dependence (insn, XEXP (u, 0), REG_DEP_ANTI);
3339           reg_last_uses[regno] = 0;
3340
3341           for (u = reg_last_sets[regno]; u; u = XEXP (u, 1))
3342             add_dependence (insn, XEXP (u, 0), REG_DEP_OUTPUT);
3343
3344           SET_REGNO_REG_SET (reg_pending_sets, regno);
3345
3346           /* Pseudos that are REG_EQUIV to something may be replaced
3347              by that during reloading.  We need only add dependencies for
3348              the address in the REG_EQUIV note.  */
3349           if (!reload_completed
3350               && reg_known_equiv_p[regno]
3351               && GET_CODE (reg_known_value[regno]) == MEM)
3352             sched_analyze_2 (XEXP (reg_known_value[regno], 0), insn);
3353
3354           /* Don't let it cross a call after scheduling if it doesn't
3355              already cross one.  */
3356
3357           if (REG_N_CALLS_CROSSED (regno) == 0)
3358             for (u = last_function_call; u; u = XEXP (u, 1))
3359               add_dependence (insn, XEXP (u, 0), REG_DEP_ANTI);
3360         }
3361     }
3362   else if (GET_CODE (dest) == MEM)
3363     {
3364       /* Writing memory.  */
3365
3366       if (pending_lists_length > 32)
3367         {
3368           /* Flush all pending reads and writes to prevent the pending lists
3369              from getting any larger.  Insn scheduling runs too slowly when
3370              these lists get long.  The number 32 was chosen because it
3371              seems like a reasonable number.  When compiling GCC with itself,
3372              this flush occurs 8 times for sparc, and 10 times for m88k using
3373              the number 32.  */
3374           flush_pending_lists (insn, 0);
3375         }
3376       else
3377         {
3378           rtx u;
3379           rtx pending, pending_mem;
3380
3381           pending = pending_read_insns;
3382           pending_mem = pending_read_mems;
3383           while (pending)
3384             {
3385               /* If a dependency already exists, don't create a new one.  */
3386               if (!find_insn_list (XEXP (pending, 0), LOG_LINKS (insn)))
3387                 if (anti_dependence (XEXP (pending_mem, 0), dest))
3388                   add_dependence (insn, XEXP (pending, 0), REG_DEP_ANTI);
3389
3390               pending = XEXP (pending, 1);
3391               pending_mem = XEXP (pending_mem, 1);
3392             }
3393
3394           pending = pending_write_insns;
3395           pending_mem = pending_write_mems;
3396           while (pending)
3397             {
3398               /* If a dependency already exists, don't create a new one.  */
3399               if (!find_insn_list (XEXP (pending, 0), LOG_LINKS (insn)))
3400                 if (output_dependence (XEXP (pending_mem, 0), dest))
3401                   add_dependence (insn, XEXP (pending, 0), REG_DEP_OUTPUT);
3402
3403               pending = XEXP (pending, 1);
3404               pending_mem = XEXP (pending_mem, 1);
3405             }
3406
3407           for (u = last_pending_memory_flush; u; u = XEXP (u, 1))
3408             add_dependence (insn, XEXP (u, 0), REG_DEP_ANTI);
3409
3410           add_insn_mem_dependence (&pending_write_insns, &pending_write_mems,
3411                                    insn, dest);
3412         }
3413       sched_analyze_2 (XEXP (dest, 0), insn);
3414     }
3415
3416   /* Analyze reads.  */
3417   if (GET_CODE (x) == SET)
3418     sched_analyze_2 (SET_SRC (x), insn);
3419 }
3420
3421 /* Analyze the uses of memory and registers in rtx X in INSN.  */
3422
3423 static void
3424 sched_analyze_2 (x, insn)
3425      rtx x;
3426      rtx insn;
3427 {
3428   register int i;
3429   register int j;
3430   register enum rtx_code code;
3431   register char *fmt;
3432
3433   if (x == 0)
3434     return;
3435
3436   code = GET_CODE (x);
3437
3438   switch (code)
3439     {
3440     case CONST_INT:
3441     case CONST_DOUBLE:
3442     case SYMBOL_REF:
3443     case CONST:
3444     case LABEL_REF:
3445       /* Ignore constants.  Note that we must handle CONST_DOUBLE here
3446          because it may have a cc0_rtx in its CONST_DOUBLE_CHAIN field, but
3447          this does not mean that this insn is using cc0.  */
3448       return;
3449
3450 #ifdef HAVE_cc0
3451     case CC0:
3452       {
3453         rtx link, prev;
3454
3455         /* User of CC0 depends on immediately preceding insn.  */
3456         SCHED_GROUP_P (insn) = 1;
3457
3458         /* There may be a note before this insn now, but all notes will
3459            be removed before we actually try to schedule the insns, so
3460            it won't cause a problem later.  We must avoid it here though.  */
3461         prev = prev_nonnote_insn (insn);
3462
3463         /* Make a copy of all dependencies on the immediately previous insn,
3464            and add to this insn.  This is so that all the dependencies will
3465            apply to the group.  Remove an explicit dependence on this insn
3466            as SCHED_GROUP_P now represents it.  */
3467
3468         if (find_insn_list (prev, LOG_LINKS (insn)))
3469           remove_dependence (insn, prev);
3470
3471         for (link = LOG_LINKS (prev); link; link = XEXP (link, 1))
3472           add_dependence (insn, XEXP (link, 0), REG_NOTE_KIND (link));
3473
3474         return;
3475       }
3476 #endif
3477
3478     case REG:
3479       {
3480         rtx u;
3481         int regno = REGNO (x);
3482         if (regno < FIRST_PSEUDO_REGISTER)
3483           {
3484             int i;
3485
3486             i = HARD_REGNO_NREGS (regno, GET_MODE (x));
3487             while (--i >= 0)
3488               {
3489                 reg_last_uses[regno + i]
3490                   = alloc_INSN_LIST (insn, reg_last_uses[regno + i]);
3491
3492                 for (u = reg_last_sets[regno + i]; u; u = XEXP (u, 1))
3493                   add_dependence (insn, XEXP (u, 0), 0);
3494
3495                 if ((call_used_regs[regno + i] || global_regs[regno + i]))
3496                   /* Function calls clobber all call_used regs.  */
3497                   for (u = last_function_call; u; u = XEXP (u, 1))
3498                     add_dependence (insn, XEXP (u, 0), REG_DEP_ANTI);
3499               }
3500           }
3501         else
3502           {
3503             reg_last_uses[regno] = alloc_INSN_LIST (insn, reg_last_uses[regno]);
3504
3505             for (u = reg_last_sets[regno]; u; u = XEXP (u, 1))
3506               add_dependence (insn, XEXP (u, 0), 0);
3507
3508             /* Pseudos that are REG_EQUIV to something may be replaced
3509                by that during reloading.  We need only add dependencies for
3510                the address in the REG_EQUIV note.  */
3511             if (!reload_completed
3512                 && reg_known_equiv_p[regno]
3513                 && GET_CODE (reg_known_value[regno]) == MEM)
3514               sched_analyze_2 (XEXP (reg_known_value[regno], 0), insn);
3515
3516             /* If the register does not already cross any calls, then add this
3517                insn to the sched_before_next_call list so that it will still
3518                not cross calls after scheduling.  */
3519             if (REG_N_CALLS_CROSSED (regno) == 0)
3520               add_dependence (sched_before_next_call, insn, REG_DEP_ANTI);
3521           }
3522         return;
3523       }
3524
3525     case MEM:
3526       {
3527         /* Reading memory.  */
3528         rtx u;
3529         rtx pending, pending_mem;
3530
3531         pending = pending_read_insns;
3532         pending_mem = pending_read_mems;
3533         while (pending)
3534           {
3535             /* If a dependency already exists, don't create a new one.  */
3536             if (!find_insn_list (XEXP (pending, 0), LOG_LINKS (insn)))
3537               if (read_dependence (XEXP (pending_mem, 0), x))
3538                 add_dependence (insn, XEXP (pending, 0), REG_DEP_ANTI);
3539
3540             pending = XEXP (pending, 1);
3541             pending_mem = XEXP (pending_mem, 1);
3542           }
3543
3544         pending = pending_write_insns;
3545         pending_mem = pending_write_mems;
3546         while (pending)
3547           {
3548             /* If a dependency already exists, don't create a new one.  */
3549             if (!find_insn_list (XEXP (pending, 0), LOG_LINKS (insn)))
3550               if (true_dependence (XEXP (pending_mem, 0), VOIDmode,
3551                   x, rtx_varies_p))
3552                 add_dependence (insn, XEXP (pending, 0), 0);
3553
3554             pending = XEXP (pending, 1);
3555             pending_mem = XEXP (pending_mem, 1);
3556           }
3557
3558         for (u = last_pending_memory_flush; u; u = XEXP (u, 1))
3559           add_dependence (insn, XEXP (u, 0), REG_DEP_ANTI);
3560
3561         /* Always add these dependencies to pending_reads, since
3562            this insn may be followed by a write.  */
3563         add_insn_mem_dependence (&pending_read_insns, &pending_read_mems,
3564                                  insn, x);
3565
3566         /* Take advantage of tail recursion here.  */
3567         sched_analyze_2 (XEXP (x, 0), insn);
3568         return;
3569       }
3570
3571     /* Force pending stores to memory in case a trap handler needs them.  */
3572     case TRAP_IF:
3573       flush_pending_lists (insn, 1);
3574       break;
3575
3576     case ASM_OPERANDS:
3577     case ASM_INPUT:
3578     case UNSPEC_VOLATILE:
3579       {
3580         rtx u;
3581
3582         /* Traditional and volatile asm instructions must be considered to use
3583            and clobber all hard registers, all pseudo-registers and all of
3584            memory.  So must TRAP_IF and UNSPEC_VOLATILE operations.
3585
3586            Consider for instance a volatile asm that changes the fpu rounding
3587            mode.  An insn should not be moved across this even if it only uses
3588            pseudo-regs because it might give an incorrectly rounded result.  */
3589         if (code != ASM_OPERANDS || MEM_VOLATILE_P (x))
3590           {
3591             int max_reg = max_reg_num ();
3592             for (i = 0; i < max_reg; i++)
3593               {
3594                 for (u = reg_last_uses[i]; u; u = XEXP (u, 1))
3595                   add_dependence (insn, XEXP (u, 0), REG_DEP_ANTI);
3596                 reg_last_uses[i] = 0;
3597
3598                 /* reg_last_sets[r] is now a list of insns */
3599                 for (u = reg_last_sets[i]; u; u = XEXP (u, 1))
3600                   add_dependence (insn, XEXP (u, 0), 0);
3601               }
3602             reg_pending_sets_all = 1;
3603
3604             flush_pending_lists (insn, 0);
3605           }
3606
3607         /* For all ASM_OPERANDS, we must traverse the vector of input operands.
3608            We can not just fall through here since then we would be confused
3609            by the ASM_INPUT rtx inside ASM_OPERANDS, which do not indicate
3610            traditional asms unlike their normal usage.  */
3611
3612         if (code == ASM_OPERANDS)
3613           {
3614             for (j = 0; j < ASM_OPERANDS_INPUT_LENGTH (x); j++)
3615               sched_analyze_2 (ASM_OPERANDS_INPUT (x, j), insn);
3616             return;
3617           }
3618         break;
3619       }
3620
3621     case PRE_DEC:
3622     case POST_DEC:
3623     case PRE_INC:
3624     case POST_INC:
3625       /* These both read and modify the result.  We must handle them as writes
3626          to get proper dependencies for following instructions.  We must handle
3627          them as reads to get proper dependencies from this to previous
3628          instructions.  Thus we need to pass them to both sched_analyze_1
3629          and sched_analyze_2.  We must call sched_analyze_2 first in order
3630          to get the proper antecedent for the read.  */
3631       sched_analyze_2 (XEXP (x, 0), insn);
3632       sched_analyze_1 (x, insn);
3633       return;
3634
3635     default:
3636       break;
3637     }
3638
3639   /* Other cases: walk the insn.  */
3640   fmt = GET_RTX_FORMAT (code);
3641   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
3642     {
3643       if (fmt[i] == 'e')
3644         sched_analyze_2 (XEXP (x, i), insn);
3645       else if (fmt[i] == 'E')
3646         for (j = 0; j < XVECLEN (x, i); j++)
3647           sched_analyze_2 (XVECEXP (x, i, j), insn);
3648     }
3649 }
3650
3651 /* Analyze an INSN with pattern X to find all dependencies.  */
3652
3653 static void
3654 sched_analyze_insn (x, insn, loop_notes)
3655      rtx x, insn;
3656      rtx loop_notes;
3657 {
3658   register RTX_CODE code = GET_CODE (x);
3659   rtx link;
3660   int maxreg = max_reg_num ();
3661   int i;
3662
3663   if (code == SET || code == CLOBBER)
3664     sched_analyze_1 (x, insn);
3665   else if (code == PARALLEL)
3666     {
3667       register int i;
3668       for (i = XVECLEN (x, 0) - 1; i >= 0; i--)
3669         {
3670           code = GET_CODE (XVECEXP (x, 0, i));
3671           if (code == SET || code == CLOBBER)
3672             sched_analyze_1 (XVECEXP (x, 0, i), insn);
3673           else
3674             sched_analyze_2 (XVECEXP (x, 0, i), insn);
3675         }
3676     }
3677   else
3678     sched_analyze_2 (x, insn);
3679
3680   /* Mark registers CLOBBERED or used by called function.  */
3681   if (GET_CODE (insn) == CALL_INSN)
3682     for (link = CALL_INSN_FUNCTION_USAGE (insn); link; link = XEXP (link, 1))
3683       {
3684         if (GET_CODE (XEXP (link, 0)) == CLOBBER)
3685           sched_analyze_1 (XEXP (link, 0), insn);
3686         else
3687           sched_analyze_2 (XEXP (link, 0), insn);
3688       }
3689
3690   /* If there is a {LOOP,EHREGION}_{BEG,END} note in the middle of a basic block, then
3691      we must be sure that no instructions are scheduled across it.
3692      Otherwise, the reg_n_refs info (which depends on loop_depth) would
3693      become incorrect.  */
3694
3695   if (loop_notes)
3696     {
3697       int max_reg = max_reg_num ();
3698       rtx link;
3699
3700       for (i = 0; i < max_reg; i++)
3701         {
3702           rtx u;
3703           for (u = reg_last_uses[i]; u; u = XEXP (u, 1))
3704             add_dependence (insn, XEXP (u, 0), REG_DEP_ANTI);
3705           reg_last_uses[i] = 0;
3706
3707           /* reg_last_sets[r] is now a list of insns */
3708           for (u = reg_last_sets[i]; u; u = XEXP (u, 1))
3709             add_dependence (insn, XEXP (u, 0), 0);
3710         }
3711       reg_pending_sets_all = 1;
3712
3713       flush_pending_lists (insn, 0);
3714
3715       link = loop_notes;
3716       while (XEXP (link, 1))
3717         link = XEXP (link, 1);
3718       XEXP (link, 1) = REG_NOTES (insn);
3719       REG_NOTES (insn) = loop_notes;
3720     }
3721
3722   /* After reload, it is possible for an instruction to have a REG_DEAD note
3723      for a register that actually dies a few instructions earlier.  For
3724      example, this can happen with SECONDARY_MEMORY_NEEDED reloads.
3725      In this case, we must consider the insn to use the register mentioned
3726      in the REG_DEAD note.  Otherwise, we may accidentally move this insn
3727      after another insn that sets the register, thus getting obviously invalid
3728      rtl.  This confuses reorg which believes that REG_DEAD notes are still
3729      meaningful.
3730
3731      ??? We would get better code if we fixed reload to put the REG_DEAD
3732      notes in the right places, but that may not be worth the effort.  */
3733
3734   if (reload_completed)
3735     {
3736       rtx note;
3737
3738       for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
3739         if (REG_NOTE_KIND (note) == REG_DEAD)
3740           sched_analyze_2 (XEXP (note, 0), insn);
3741     }
3742
3743   EXECUTE_IF_SET_IN_REG_SET (reg_pending_sets, 0, i,
3744                              {
3745                                /* reg_last_sets[r] is now a list of insns */
3746                                free_list (&reg_last_sets[i], &unused_insn_list);
3747                                reg_last_sets[i]
3748                                  = alloc_INSN_LIST (insn, NULL_RTX);
3749                              });
3750   CLEAR_REG_SET (reg_pending_sets);
3751
3752   if (reg_pending_sets_all)
3753     {
3754       for (i = 0; i < maxreg; i++)
3755         {
3756           /* reg_last_sets[r] is now a list of insns */
3757           free_list (&reg_last_sets[i], &unused_insn_list);
3758           reg_last_sets[i] = alloc_INSN_LIST (insn, NULL_RTX);
3759         }
3760
3761       reg_pending_sets_all = 0;
3762     }
3763
3764   /* Handle function calls and function returns created by the epilogue
3765      threading code.  */
3766   if (GET_CODE (insn) == CALL_INSN || GET_CODE (insn) == JUMP_INSN)
3767     {
3768       rtx dep_insn;
3769       rtx prev_dep_insn;
3770
3771       /* When scheduling instructions, we make sure calls don't lose their
3772          accompanying USE insns by depending them one on another in order.
3773
3774          Also, we must do the same thing for returns created by the epilogue
3775          threading code.  Note this code works only in this special case,
3776          because other passes make no guarantee that they will never emit
3777          an instruction between a USE and a RETURN.  There is such a guarantee
3778          for USE instructions immediately before a call.  */
3779
3780       prev_dep_insn = insn;
3781       dep_insn = PREV_INSN (insn);
3782       while (GET_CODE (dep_insn) == INSN
3783              && GET_CODE (PATTERN (dep_insn)) == USE
3784              && GET_CODE (XEXP (PATTERN (dep_insn), 0)) == REG)
3785         {
3786           SCHED_GROUP_P (prev_dep_insn) = 1;
3787
3788           /* Make a copy of all dependencies on dep_insn, and add to insn.
3789              This is so that all of the dependencies will apply to the
3790              group.  */
3791
3792           for (link = LOG_LINKS (dep_insn); link; link = XEXP (link, 1))
3793             add_dependence (insn, XEXP (link, 0), REG_NOTE_KIND (link));
3794
3795           prev_dep_insn = dep_insn;
3796           dep_insn = PREV_INSN (dep_insn);
3797         }
3798     }
3799 }
3800
3801 /* Analyze every insn between HEAD and TAIL inclusive, creating LOG_LINKS
3802    for every dependency.  */
3803
3804 static void
3805 sched_analyze (head, tail)
3806      rtx head, tail;
3807 {
3808   register rtx insn;
3809   register rtx u;
3810   rtx loop_notes = 0;
3811
3812   for (insn = head;; insn = NEXT_INSN (insn))
3813     {
3814       if (GET_CODE (insn) == INSN || GET_CODE (insn) == JUMP_INSN)
3815         {
3816           sched_analyze_insn (PATTERN (insn), insn, loop_notes);
3817           loop_notes = 0;
3818         }
3819       else if (GET_CODE (insn) == CALL_INSN)
3820         {
3821           rtx x;
3822           register int i;
3823
3824           CANT_MOVE (insn) = 1;
3825
3826           /* Any instruction using a hard register which may get clobbered
3827              by a call needs to be marked as dependent on this call.
3828              This prevents a use of a hard return reg from being moved
3829              past a void call (i.e. it does not explicitly set the hard
3830              return reg).  */
3831
3832           /* If this call is followed by a NOTE_INSN_SETJMP, then assume that
3833              all registers, not just hard registers, may be clobbered by this
3834              call.  */
3835
3836           /* Insn, being a CALL_INSN, magically depends on
3837              `last_function_call' already.  */
3838
3839           if (NEXT_INSN (insn) && GET_CODE (NEXT_INSN (insn)) == NOTE
3840               && NOTE_LINE_NUMBER (NEXT_INSN (insn)) == NOTE_INSN_SETJMP)
3841             {
3842               int max_reg = max_reg_num ();
3843               for (i = 0; i < max_reg; i++)
3844                 {
3845                   for (u = reg_last_uses[i]; u; u = XEXP (u, 1))
3846                     add_dependence (insn, XEXP (u, 0), REG_DEP_ANTI);
3847
3848                   reg_last_uses[i] = 0;
3849
3850                   /* reg_last_sets[r] is now a list of insns */
3851                   for (u = reg_last_sets[i]; u; u = XEXP (u, 1))
3852                     add_dependence (insn, XEXP (u, 0), 0);
3853                 }
3854               reg_pending_sets_all = 1;
3855
3856               /* Add a pair of fake REG_NOTE which we will later
3857                  convert back into a NOTE_INSN_SETJMP note.  See
3858                  reemit_notes for why we use a pair of NOTEs.  */
3859               REG_NOTES (insn) = alloc_EXPR_LIST (REG_DEAD,
3860                                                   GEN_INT (0),
3861                                                   REG_NOTES (insn));
3862               REG_NOTES (insn) = alloc_EXPR_LIST (REG_DEAD,
3863                                                   GEN_INT (NOTE_INSN_SETJMP),
3864                                                   REG_NOTES (insn));
3865             }
3866           else
3867             {
3868               for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
3869                 if (call_used_regs[i] || global_regs[i])
3870                   {
3871                     for (u = reg_last_uses[i]; u; u = XEXP (u, 1))
3872                       add_dependence (insn, XEXP (u, 0), REG_DEP_ANTI);
3873                     reg_last_uses[i] = 0;
3874
3875                     /* reg_last_sets[r] is now a list of insns */
3876                     for (u = reg_last_sets[i]; u; u = XEXP (u, 1))
3877                       add_dependence (insn, XEXP (u, 0), REG_DEP_ANTI);
3878
3879                     SET_REGNO_REG_SET (reg_pending_sets, i);
3880                   }
3881             }
3882
3883           /* For each insn which shouldn't cross a call, add a dependence
3884              between that insn and this call insn.  */
3885           x = LOG_LINKS (sched_before_next_call);
3886           while (x)
3887             {
3888               add_dependence (insn, XEXP (x, 0), REG_DEP_ANTI);
3889               x = XEXP (x, 1);
3890             }
3891           LOG_LINKS (sched_before_next_call) = 0;
3892
3893           sched_analyze_insn (PATTERN (insn), insn, loop_notes);
3894           loop_notes = 0;
3895
3896           /* In the absence of interprocedural alias analysis, we must flush
3897              all pending reads and writes, and start new dependencies starting
3898              from here.  But only flush writes for constant calls (which may
3899              be passed a pointer to something we haven't written yet).  */
3900           flush_pending_lists (insn, CONST_CALL_P (insn));
3901
3902           /* Depend this function call (actually, the user of this
3903              function call) on all hard register clobberage.  */
3904
3905           /* last_function_call is now a list of insns */
3906           free_list(&last_function_call, &unused_insn_list);
3907           last_function_call = alloc_INSN_LIST (insn, NULL_RTX);
3908         }
3909
3910       /* See comments on reemit_notes as to why we do this.  */
3911       else if (GET_CODE (insn) == NOTE
3912                && (NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_BEG
3913                    || NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_END
3914                    || NOTE_LINE_NUMBER (insn) == NOTE_INSN_EH_REGION_BEG
3915                    || NOTE_LINE_NUMBER (insn) == NOTE_INSN_EH_REGION_END
3916                    || NOTE_LINE_NUMBER (insn) == NOTE_INSN_RANGE_START
3917                    || NOTE_LINE_NUMBER (insn) == NOTE_INSN_RANGE_END
3918                    || (NOTE_LINE_NUMBER (insn) == NOTE_INSN_SETJMP
3919                        && GET_CODE (PREV_INSN (insn)) != CALL_INSN)))
3920         {
3921           loop_notes = alloc_EXPR_LIST (REG_DEAD,
3922                                         GEN_INT (NOTE_BLOCK_NUMBER (insn)),
3923                                         loop_notes);
3924           loop_notes = alloc_EXPR_LIST (REG_DEAD,
3925                                         GEN_INT (NOTE_LINE_NUMBER (insn)),
3926                                         loop_notes);
3927           CONST_CALL_P (loop_notes) = CONST_CALL_P (insn);
3928         }
3929
3930       if (insn == tail)
3931         return;
3932     }
3933   abort ();
3934 }
3935 \f
3936 /* Called when we see a set of a register.  If death is true, then we are
3937    scanning backwards.  Mark that register as unborn.  If nobody says
3938    otherwise, that is how things will remain.  If death is false, then we
3939    are scanning forwards.  Mark that register as being born.  */
3940
3941 static void
3942 sched_note_set (x, death)
3943      rtx x;
3944      int death;
3945 {
3946   register int regno;
3947   register rtx reg = SET_DEST (x);
3948   int subreg_p = 0;
3949
3950   if (reg == 0)
3951     return;
3952
3953   while (GET_CODE (reg) == SUBREG || GET_CODE (reg) == STRICT_LOW_PART
3954          || GET_CODE (reg) == SIGN_EXTRACT || GET_CODE (reg) == ZERO_EXTRACT)
3955     {
3956       /* Must treat modification of just one hardware register of a multi-reg
3957          value or just a byte field of a register exactly the same way that
3958          mark_set_1 in flow.c does, i.e. anything except a paradoxical subreg
3959          does not kill the entire register.  */
3960       if (GET_CODE (reg) != SUBREG
3961           || REG_SIZE (SUBREG_REG (reg)) > REG_SIZE (reg))
3962         subreg_p = 1;
3963
3964       reg = SUBREG_REG (reg);
3965     }
3966
3967   if (GET_CODE (reg) != REG)
3968     return;
3969
3970   /* Global registers are always live, so the code below does not apply
3971      to them.  */
3972
3973   regno = REGNO (reg);
3974   if (regno >= FIRST_PSEUDO_REGISTER || !global_regs[regno])
3975     {
3976       if (death)
3977         {
3978           /* If we only set part of the register, then this set does not
3979              kill it.  */
3980           if (subreg_p)
3981             return;
3982
3983           /* Try killing this register.  */
3984           if (regno < FIRST_PSEUDO_REGISTER)
3985             {
3986               int j = HARD_REGNO_NREGS (regno, GET_MODE (reg));
3987               while (--j >= 0)
3988                 {
3989                   CLEAR_REGNO_REG_SET (bb_live_regs, regno + j);
3990                 }
3991             }
3992           else
3993             {
3994               /* Recompute REG_BASIC_BLOCK as we update all the other
3995                  dataflow information.  */
3996               if (sched_reg_basic_block[regno] == REG_BLOCK_UNKNOWN)
3997                 sched_reg_basic_block[regno] = current_block_num;
3998               else if (sched_reg_basic_block[regno] != current_block_num)
3999                 sched_reg_basic_block[regno] = REG_BLOCK_GLOBAL;
4000
4001               CLEAR_REGNO_REG_SET (bb_live_regs, regno);
4002             }
4003         }
4004       else
4005         {
4006           /* Make the register live again.  */
4007           if (regno < FIRST_PSEUDO_REGISTER)
4008             {
4009               int j = HARD_REGNO_NREGS (regno, GET_MODE (reg));
4010               while (--j >= 0)
4011                 {
4012                   SET_REGNO_REG_SET (bb_live_regs, regno + j);
4013                 }
4014             }
4015           else
4016             {
4017               SET_REGNO_REG_SET (bb_live_regs, regno);
4018             }
4019         }
4020     }
4021 }
4022 \f
4023 /* Macros and functions for keeping the priority queue sorted, and
4024    dealing with queueing and dequeueing of instructions.  */
4025
4026 #define SCHED_SORT(READY, N_READY)                                   \
4027 do { if ((N_READY) == 2)                                             \
4028        swap_sort (READY, N_READY);                                   \
4029      else if ((N_READY) > 2)                                         \
4030          qsort (READY, N_READY, sizeof (rtx), rank_for_schedule); }  \
4031 while (0)
4032
4033 /* Returns a positive value if x is preferred; returns a negative value if
4034    y is preferred.  Should never return 0, since that will make the sort
4035    unstable.  */
4036
4037 static int
4038 rank_for_schedule (x, y)
4039      const GENERIC_PTR x;
4040      const GENERIC_PTR y;
4041 {
4042   rtx tmp = *(rtx *)y;
4043   rtx tmp2 = *(rtx *)x;
4044   rtx link;
4045   int tmp_class, tmp2_class, depend_count1, depend_count2;
4046   int val, priority_val, spec_val, prob_val, weight_val;
4047
4048
4049   /* prefer insn with higher priority */
4050   priority_val = INSN_PRIORITY (tmp2) - INSN_PRIORITY (tmp);
4051   if (priority_val)
4052     return priority_val;
4053
4054   /* prefer an insn with smaller contribution to registers-pressure */
4055   if (!reload_completed &&
4056       (weight_val = INSN_REG_WEIGHT (tmp) - INSN_REG_WEIGHT (tmp2)))
4057     return (weight_val);
4058
4059   /* some comparison make sense in interblock scheduling only */
4060   if (INSN_BB (tmp) != INSN_BB (tmp2))
4061     {
4062       /* prefer an inblock motion on an interblock motion */
4063       if ((INSN_BB (tmp2) == target_bb) && (INSN_BB (tmp) != target_bb))
4064         return 1;
4065       if ((INSN_BB (tmp) == target_bb) && (INSN_BB (tmp2) != target_bb))
4066         return -1;
4067
4068       /* prefer a useful motion on a speculative one */
4069       if ((spec_val = IS_SPECULATIVE_INSN (tmp) - IS_SPECULATIVE_INSN (tmp2)))
4070         return (spec_val);
4071
4072       /* prefer a more probable (speculative) insn */
4073       prob_val = INSN_PROBABILITY (tmp2) - INSN_PROBABILITY (tmp);
4074       if (prob_val)
4075         return (prob_val);
4076     }
4077
4078   /* compare insns based on their relation to the last-scheduled-insn */
4079   if (last_scheduled_insn)
4080     {
4081       /* Classify the instructions into three classes:
4082          1) Data dependent on last schedule insn.
4083          2) Anti/Output dependent on last scheduled insn.
4084          3) Independent of last scheduled insn, or has latency of one.
4085          Choose the insn from the highest numbered class if different.  */
4086       link = find_insn_list (tmp, INSN_DEPEND (last_scheduled_insn));
4087       if (link == 0 || insn_cost (last_scheduled_insn, link, tmp) == 1)
4088         tmp_class = 3;
4089       else if (REG_NOTE_KIND (link) == 0)       /* Data dependence.  */
4090         tmp_class = 1;
4091       else
4092         tmp_class = 2;
4093
4094       link = find_insn_list (tmp2, INSN_DEPEND (last_scheduled_insn));
4095       if (link == 0 || insn_cost (last_scheduled_insn, link, tmp2) == 1)
4096         tmp2_class = 3;
4097       else if (REG_NOTE_KIND (link) == 0)       /* Data dependence.  */
4098         tmp2_class = 1;
4099       else
4100         tmp2_class = 2;
4101
4102       if ((val = tmp2_class - tmp_class))
4103         return val;
4104     }
4105
4106   /* Prefer the insn which has more later insns that depend on it. 
4107      This gives the scheduler more freedom when scheduling later
4108      instructions at the expense of added register pressure.  */
4109   depend_count1 = 0;
4110   for (link = INSN_DEPEND (tmp); link; link = XEXP (link, 1))
4111     depend_count1++;
4112
4113   depend_count2 = 0;
4114   for (link = INSN_DEPEND (tmp2); link; link = XEXP (link, 1))
4115     depend_count2++;
4116
4117   val = depend_count2 - depend_count1;
4118   if (val)
4119     return val;
4120   
4121   /* If insns are equally good, sort by INSN_LUID (original insn order),
4122      so that we make the sort stable.  This minimizes instruction movement,
4123      thus minimizing sched's effect on debugging and cross-jumping.  */
4124   return INSN_LUID (tmp) - INSN_LUID (tmp2);
4125 }
4126
4127 /* Resort the array A in which only element at index N may be out of order.  */
4128
4129 HAIFA_INLINE static void
4130 swap_sort (a, n)
4131      rtx *a;
4132      int n;
4133 {
4134   rtx insn = a[n - 1];
4135   int i = n - 2;
4136
4137   while (i >= 0 && rank_for_schedule (a + i, &insn) >= 0)
4138     {
4139       a[i + 1] = a[i];
4140       i -= 1;
4141     }
4142   a[i + 1] = insn;
4143 }
4144
4145 static int max_priority;
4146
4147 /* Add INSN to the insn queue so that it can be executed at least
4148    N_CYCLES after the currently executing insn.  Preserve insns
4149    chain for debugging purposes.  */
4150
4151 HAIFA_INLINE static void
4152 queue_insn (insn, n_cycles)
4153      rtx insn;
4154      int n_cycles;
4155 {
4156   int next_q = NEXT_Q_AFTER (q_ptr, n_cycles);
4157   rtx link = alloc_INSN_LIST (insn, insn_queue[next_q]);
4158   insn_queue[next_q] = link;
4159   q_size += 1;
4160
4161   if (sched_verbose >= 2)
4162     {
4163       fprintf (dump, ";;\t\tReady-->Q: insn %d: ", INSN_UID (insn));
4164
4165       if (INSN_BB (insn) != target_bb)
4166         fprintf (dump, "(b%d) ", INSN_BLOCK (insn));
4167
4168       fprintf (dump, "queued for %d cycles.\n", n_cycles);
4169     }
4170
4171 }
4172
4173 /* Return nonzero if PAT is the pattern of an insn which makes a
4174    register live.  */
4175
4176 HAIFA_INLINE static int
4177 birthing_insn_p (pat)
4178      rtx pat;
4179 {
4180   int j;
4181
4182   if (reload_completed == 1)
4183     return 0;
4184
4185   if (GET_CODE (pat) == SET
4186       && GET_CODE (SET_DEST (pat)) == REG)
4187     {
4188       rtx dest = SET_DEST (pat);
4189       int i = REGNO (dest);
4190
4191       /* It would be more accurate to use refers_to_regno_p or
4192          reg_mentioned_p to determine when the dest is not live before this
4193          insn.  */
4194
4195       if (REGNO_REG_SET_P (bb_live_regs, i))
4196         return (REG_N_SETS (i) == 1);
4197
4198       return 0;
4199     }
4200   if (GET_CODE (pat) == PARALLEL)
4201     {
4202       for (j = 0; j < XVECLEN (pat, 0); j++)
4203         if (birthing_insn_p (XVECEXP (pat, 0, j)))
4204           return 1;
4205     }
4206   return 0;
4207 }
4208
4209 /* PREV is an insn that is ready to execute.  Adjust its priority if that
4210    will help shorten register lifetimes.  */
4211
4212 HAIFA_INLINE static void
4213 adjust_priority (prev)
4214      rtx prev;
4215 {
4216   /* Trying to shorten register lives after reload has completed
4217      is useless and wrong.  It gives inaccurate schedules.  */
4218   if (reload_completed == 0)
4219     {
4220       rtx note;
4221       int n_deaths = 0;
4222
4223       /* ??? This code has no effect, because REG_DEAD notes are removed
4224          before we ever get here.  */
4225       for (note = REG_NOTES (prev); note; note = XEXP (note, 1))
4226         if (REG_NOTE_KIND (note) == REG_DEAD)
4227           n_deaths += 1;
4228
4229       /* Defer scheduling insns which kill registers, since that
4230          shortens register lives.  Prefer scheduling insns which
4231          make registers live for the same reason.  */
4232       switch (n_deaths)
4233         {
4234         default:
4235           INSN_PRIORITY (prev) >>= 3;
4236           break;
4237         case 3:
4238           INSN_PRIORITY (prev) >>= 2;
4239           break;
4240         case 2:
4241         case 1:
4242           INSN_PRIORITY (prev) >>= 1;
4243           break;
4244         case 0:
4245           if (birthing_insn_p (PATTERN (prev)))
4246             {
4247               int max = max_priority;
4248
4249               if (max > INSN_PRIORITY (prev))
4250                 INSN_PRIORITY (prev) = max;
4251             }
4252           break;
4253         }
4254 #ifdef ADJUST_PRIORITY
4255       ADJUST_PRIORITY (prev);
4256 #endif
4257     }
4258 }
4259
4260 /* INSN is the "currently executing insn".  Launch each insn which was
4261    waiting on INSN.  READY is a vector of insns which are ready to fire.
4262    N_READY is the number of elements in READY.  CLOCK is the current
4263    cycle.  */
4264
4265 static int
4266 schedule_insn (insn, ready, n_ready, clock)
4267      rtx insn;
4268      rtx *ready;
4269      int n_ready;
4270      int clock;
4271 {
4272   rtx link;
4273   int unit;
4274
4275   unit = insn_unit (insn);
4276
4277   if (sched_verbose >= 2)
4278     {
4279       fprintf (dump, ";;\t\t--> scheduling insn <<<%d>>> on unit ", INSN_UID (insn));
4280       insn_print_units (insn);
4281       fprintf (dump, "\n");
4282     }
4283
4284   if (sched_verbose && unit == -1)
4285     visualize_no_unit (insn);
4286
4287   if (MAX_BLOCKAGE > 1 || issue_rate > 1 || sched_verbose)
4288     schedule_unit (unit, insn, clock);
4289
4290   if (INSN_DEPEND (insn) == 0)
4291     return n_ready;
4292
4293   /* This is used by the function adjust_priority above.  */
4294   if (n_ready > 0)
4295     max_priority = MAX (INSN_PRIORITY (ready[0]), INSN_PRIORITY (insn));
4296   else
4297     max_priority = INSN_PRIORITY (insn);
4298
4299   for (link = INSN_DEPEND (insn); link != 0; link = XEXP (link, 1))
4300     {
4301       rtx next = XEXP (link, 0);
4302       int cost = insn_cost (insn, link, next);
4303
4304       INSN_TICK (next) = MAX (INSN_TICK (next), clock + cost);
4305
4306       if ((INSN_DEP_COUNT (next) -= 1) == 0)
4307         {
4308           int effective_cost = INSN_TICK (next) - clock;
4309
4310           /* For speculative insns, before inserting to ready/queue,
4311              check live, exception-free, and issue-delay */
4312           if (INSN_BB (next) != target_bb
4313               && (!IS_VALID (INSN_BB (next))
4314                   || CANT_MOVE (next)
4315                   || (IS_SPECULATIVE_INSN (next)
4316                       && (insn_issue_delay (next) > 3
4317                           || !check_live (next, INSN_BB (next))
4318                  || !is_exception_free (next, INSN_BB (next), target_bb)))))
4319             continue;
4320
4321           if (sched_verbose >= 2)
4322             {
4323               fprintf (dump, ";;\t\tdependences resolved: insn %d ", INSN_UID (next));
4324
4325               if (current_nr_blocks > 1 && INSN_BB (next) != target_bb)
4326                 fprintf (dump, "/b%d ", INSN_BLOCK (next));
4327
4328               if (effective_cost <= 1)
4329                 fprintf (dump, "into ready\n");
4330               else
4331                 fprintf (dump, "into queue with cost=%d\n", effective_cost);
4332             }
4333
4334           /* Adjust the priority of NEXT and either put it on the ready
4335              list or queue it.  */
4336           adjust_priority (next);
4337           if (effective_cost <= 1)
4338             ready[n_ready++] = next;
4339           else
4340             queue_insn (next, effective_cost);
4341         }
4342     }
4343
4344   return n_ready;
4345 }
4346
4347
4348 /* Add a REG_DEAD note for REG to INSN, reusing a REG_DEAD note from the
4349    dead_notes list.  */
4350
4351 static void
4352 create_reg_dead_note (reg, insn)
4353      rtx reg, insn;
4354 {
4355   rtx link;
4356
4357   /* The number of registers killed after scheduling must be the same as the
4358      number of registers killed before scheduling.  The number of REG_DEAD
4359      notes may not be conserved, i.e. two SImode hard register REG_DEAD notes
4360      might become one DImode hard register REG_DEAD note, but the number of
4361      registers killed will be conserved.
4362
4363      We carefully remove REG_DEAD notes from the dead_notes list, so that
4364      there will be none left at the end.  If we run out early, then there
4365      is a bug somewhere in flow, combine and/or sched.  */
4366
4367   if (dead_notes == 0)
4368     {
4369       if (current_nr_blocks <= 1)
4370         abort ();
4371       else
4372         link = alloc_EXPR_LIST (REG_DEAD, NULL_RTX, NULL_RTX);
4373     }
4374   else
4375     {
4376       /* Number of regs killed by REG.  */
4377       int regs_killed = (REGNO (reg) >= FIRST_PSEUDO_REGISTER ? 1
4378                          : HARD_REGNO_NREGS (REGNO (reg), GET_MODE (reg)));
4379       /* Number of regs killed by REG_DEAD notes taken off the list.  */
4380       int reg_note_regs;
4381
4382       link = dead_notes;
4383       reg_note_regs = (REGNO (XEXP (link, 0)) >= FIRST_PSEUDO_REGISTER ? 1
4384                        : HARD_REGNO_NREGS (REGNO (XEXP (link, 0)),
4385                                            GET_MODE (XEXP (link, 0))));
4386       while (reg_note_regs < regs_killed)
4387         {
4388           link = XEXP (link, 1);
4389
4390           /* LINK might be zero if we killed more registers after scheduling
4391              than before, and the last hard register we kill is actually
4392              multiple hard regs. 
4393
4394              This is normal for interblock scheduling, so deal with it in
4395              that case, else abort.  */
4396           if (link == NULL_RTX && current_nr_blocks <= 1)
4397             abort ();
4398           else if (link == NULL_RTX)
4399             link = alloc_EXPR_LIST (REG_DEAD, gen_rtx_REG (word_mode, 0),
4400                                     NULL_RTX);
4401              
4402           reg_note_regs += (REGNO (XEXP (link, 0)) >= FIRST_PSEUDO_REGISTER ? 1
4403                             : HARD_REGNO_NREGS (REGNO (XEXP (link, 0)),
4404                                                 GET_MODE (XEXP (link, 0))));
4405         }
4406       dead_notes = XEXP (link, 1);
4407
4408       /* If we took too many regs kills off, put the extra ones back.  */
4409       while (reg_note_regs > regs_killed)
4410         {
4411           rtx temp_reg, temp_link;
4412
4413           temp_reg = gen_rtx_REG (word_mode, 0);
4414           temp_link = alloc_EXPR_LIST (REG_DEAD, temp_reg, dead_notes);
4415           dead_notes = temp_link;
4416           reg_note_regs--;
4417         }
4418     }
4419
4420   XEXP (link, 0) = reg;
4421   XEXP (link, 1) = REG_NOTES (insn);
4422   REG_NOTES (insn) = link;
4423 }
4424
4425 /* Subroutine on attach_deaths_insn--handles the recursive search
4426    through INSN.  If SET_P is true, then x is being modified by the insn.  */
4427
4428 static void
4429 attach_deaths (x, insn, set_p)
4430      rtx x;
4431      rtx insn;
4432      int set_p;
4433 {
4434   register int i;
4435   register int j;
4436   register enum rtx_code code;
4437   register char *fmt;
4438
4439   if (x == 0)
4440     return;
4441
4442   code = GET_CODE (x);
4443
4444   switch (code)
4445     {
4446     case CONST_INT:
4447     case CONST_DOUBLE:
4448     case LABEL_REF:
4449     case SYMBOL_REF:
4450     case CONST:
4451     case CODE_LABEL:
4452     case PC:
4453     case CC0:
4454       /* Get rid of the easy cases first.  */
4455       return;
4456
4457     case REG:
4458       {
4459         /* If the register dies in this insn, queue that note, and mark
4460            this register as needing to die.  */
4461         /* This code is very similar to mark_used_1 (if set_p is false)
4462            and mark_set_1 (if set_p is true) in flow.c.  */
4463
4464         register int regno;
4465         int some_needed;
4466         int all_needed;
4467
4468         if (set_p)
4469           return;
4470
4471         regno = REGNO (x);
4472         all_needed = some_needed = REGNO_REG_SET_P (old_live_regs, regno);
4473         if (regno < FIRST_PSEUDO_REGISTER)
4474           {
4475             int n;
4476
4477             n = HARD_REGNO_NREGS (regno, GET_MODE (x));
4478             while (--n > 0)
4479               {
4480                 int needed = (REGNO_REG_SET_P (old_live_regs, regno + n));
4481                 some_needed |= needed;
4482                 all_needed &= needed;
4483               }
4484           }
4485
4486         /* If it wasn't live before we started, then add a REG_DEAD note.
4487            We must check the previous lifetime info not the current info,
4488            because we may have to execute this code several times, e.g.
4489            once for a clobber (which doesn't add a note) and later
4490            for a use (which does add a note).
4491
4492            Always make the register live.  We must do this even if it was
4493            live before, because this may be an insn which sets and uses
4494            the same register, in which case the register has already been
4495            killed, so we must make it live again.
4496
4497            Global registers are always live, and should never have a REG_DEAD
4498            note added for them, so none of the code below applies to them.  */
4499
4500         if (regno >= FIRST_PSEUDO_REGISTER || ! global_regs[regno])
4501           {
4502             /* Never add REG_DEAD notes for the FRAME_POINTER_REGNUM or the
4503                STACK_POINTER_REGNUM, since these are always considered to be
4504                live.  Similarly for ARG_POINTER_REGNUM if it is fixed.  */
4505             if (regno != FRAME_POINTER_REGNUM
4506 #if HARD_FRAME_POINTER_REGNUM != FRAME_POINTER_REGNUM
4507                 && ! (regno == HARD_FRAME_POINTER_REGNUM)
4508 #endif
4509 #if ARG_POINTER_REGNUM != FRAME_POINTER_REGNUM
4510                 && ! (regno == ARG_POINTER_REGNUM && fixed_regs[regno])
4511 #endif
4512                 && regno != STACK_POINTER_REGNUM)
4513               {
4514                 if (! all_needed && ! dead_or_set_p (insn, x))
4515                   {
4516                     /* Check for the case where the register dying partially
4517                        overlaps the register set by this insn.  */
4518                     if (regno < FIRST_PSEUDO_REGISTER
4519                         && HARD_REGNO_NREGS (regno, GET_MODE (x)) > 1)
4520                       {
4521                         int n = HARD_REGNO_NREGS (regno, GET_MODE (x));
4522                         while (--n >= 0)
4523                           some_needed |= dead_or_set_regno_p (insn, regno + n);
4524                       }
4525
4526                     /* If none of the words in X is needed, make a REG_DEAD
4527                        note.  Otherwise, we must make partial REG_DEAD
4528                        notes.  */
4529                     if (! some_needed)
4530                       create_reg_dead_note (x, insn);
4531                     else
4532                       {
4533                         int i;
4534
4535                         /* Don't make a REG_DEAD note for a part of a
4536                            register that is set in the insn.  */
4537                         for (i = HARD_REGNO_NREGS (regno, GET_MODE (x)) - 1;
4538                              i >= 0; i--)
4539                           if (! REGNO_REG_SET_P (old_live_regs, regno+i)
4540                               && ! dead_or_set_regno_p (insn, regno + i))
4541                             create_reg_dead_note (gen_rtx_REG (reg_raw_mode[regno + i],
4542                                                                regno + i),
4543                                                   insn);
4544                       }
4545                   }
4546               }
4547
4548             if (regno < FIRST_PSEUDO_REGISTER)
4549               {
4550                 int j = HARD_REGNO_NREGS (regno, GET_MODE (x));
4551                 while (--j >= 0)
4552                   {
4553                     SET_REGNO_REG_SET (bb_live_regs, regno + j);
4554                   }
4555               }
4556             else
4557               {
4558                 /* Recompute REG_BASIC_BLOCK as we update all the other
4559                    dataflow information.  */
4560                 if (sched_reg_basic_block[regno] == REG_BLOCK_UNKNOWN)
4561                   sched_reg_basic_block[regno] = current_block_num;
4562                 else if (sched_reg_basic_block[regno] != current_block_num)
4563                   sched_reg_basic_block[regno] = REG_BLOCK_GLOBAL;
4564
4565                 SET_REGNO_REG_SET (bb_live_regs, regno);
4566               }
4567           }
4568         return;
4569       }
4570
4571     case MEM:
4572       /* Handle tail-recursive case.  */
4573       attach_deaths (XEXP (x, 0), insn, 0);
4574       return;
4575
4576     case SUBREG:
4577       attach_deaths (SUBREG_REG (x), insn,
4578                      set_p && ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (x)))
4579                                 <= UNITS_PER_WORD)
4580                                || (GET_MODE_SIZE (GET_MODE (SUBREG_REG (x)))
4581                                    == GET_MODE_SIZE (GET_MODE ((x))))));
4582       return;
4583
4584     case STRICT_LOW_PART:
4585       attach_deaths (XEXP (x, 0), insn, 0);
4586       return;
4587
4588     case ZERO_EXTRACT:
4589     case SIGN_EXTRACT:
4590       attach_deaths (XEXP (x, 0), insn, 0);
4591       attach_deaths (XEXP (x, 1), insn, 0);
4592       attach_deaths (XEXP (x, 2), insn, 0);
4593       return;
4594
4595     default:
4596       /* Other cases: walk the insn.  */
4597       fmt = GET_RTX_FORMAT (code);
4598       for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
4599         {
4600           if (fmt[i] == 'e')
4601             attach_deaths (XEXP (x, i), insn, 0);
4602           else if (fmt[i] == 'E')
4603             for (j = 0; j < XVECLEN (x, i); j++)
4604               attach_deaths (XVECEXP (x, i, j), insn, 0);
4605         }
4606     }
4607 }
4608
4609 /* After INSN has executed, add register death notes for each register
4610    that is dead after INSN.  */
4611
4612 static void
4613 attach_deaths_insn (insn)
4614      rtx insn;
4615 {
4616   rtx x = PATTERN (insn);
4617   register RTX_CODE code = GET_CODE (x);
4618   rtx link;
4619
4620   if (code == SET)
4621     {
4622       attach_deaths (SET_SRC (x), insn, 0);
4623
4624       /* A register might die here even if it is the destination, e.g.
4625          it is the target of a volatile read and is otherwise unused.
4626          Hence we must always call attach_deaths for the SET_DEST.  */
4627       attach_deaths (SET_DEST (x), insn, 1);
4628     }
4629   else if (code == PARALLEL)
4630     {
4631       register int i;
4632       for (i = XVECLEN (x, 0) - 1; i >= 0; i--)
4633         {
4634           code = GET_CODE (XVECEXP (x, 0, i));
4635           if (code == SET)
4636             {
4637               attach_deaths (SET_SRC (XVECEXP (x, 0, i)), insn, 0);
4638
4639               attach_deaths (SET_DEST (XVECEXP (x, 0, i)), insn, 1);
4640             }
4641           /* Flow does not add REG_DEAD notes to registers that die in
4642              clobbers, so we can't either.  */
4643           else if (code != CLOBBER)
4644             attach_deaths (XVECEXP (x, 0, i), insn, 0);
4645         }
4646     }
4647   /* If this is a CLOBBER, only add REG_DEAD notes to registers inside a
4648      MEM being clobbered, just like flow.  */
4649   else if (code == CLOBBER && GET_CODE (XEXP (x, 0)) == MEM)
4650     attach_deaths (XEXP (XEXP (x, 0), 0), insn, 0);
4651   /* Otherwise don't add a death note to things being clobbered.  */
4652   else if (code != CLOBBER)
4653     attach_deaths (x, insn, 0);
4654
4655   /* Make death notes for things used in the called function.  */
4656   if (GET_CODE (insn) == CALL_INSN)
4657     for (link = CALL_INSN_FUNCTION_USAGE (insn); link; link = XEXP (link, 1))
4658       attach_deaths (XEXP (XEXP (link, 0), 0), insn,
4659                      GET_CODE (XEXP (link, 0)) == CLOBBER);
4660 }
4661
4662 /* functions for handlnig of notes */
4663
4664 /* Delete notes beginning with INSN and put them in the chain
4665    of notes ended by NOTE_LIST.
4666    Returns the insn following the notes.  */
4667
4668 static rtx
4669 unlink_other_notes (insn, tail)
4670      rtx insn, tail;
4671 {
4672   rtx prev = PREV_INSN (insn);
4673
4674   while (insn != tail && GET_CODE (insn) == NOTE)
4675     {
4676       rtx next = NEXT_INSN (insn);
4677       /* Delete the note from its current position.  */
4678       if (prev)
4679         NEXT_INSN (prev) = next;
4680       if (next)
4681         PREV_INSN (next) = prev;
4682
4683       /* Don't save away NOTE_INSN_SETJMPs, because they must remain
4684          immediately after the call they follow.  We use a fake
4685          (REG_DEAD (const_int -1)) note to remember them.
4686          Likewise with NOTE_INSN_{LOOP,EHREGION}_{BEG, END}.  */
4687       if (NOTE_LINE_NUMBER (insn) != NOTE_INSN_SETJMP
4688           && NOTE_LINE_NUMBER (insn) != NOTE_INSN_LOOP_BEG
4689           && NOTE_LINE_NUMBER (insn) != NOTE_INSN_LOOP_END
4690           && NOTE_LINE_NUMBER (insn) != NOTE_INSN_RANGE_START
4691           && NOTE_LINE_NUMBER (insn) != NOTE_INSN_RANGE_END
4692           && NOTE_LINE_NUMBER (insn) != NOTE_INSN_EH_REGION_BEG
4693           && NOTE_LINE_NUMBER (insn) != NOTE_INSN_EH_REGION_END)
4694         {
4695           /* Insert the note at the end of the notes list.  */
4696           PREV_INSN (insn) = note_list;
4697           if (note_list)
4698             NEXT_INSN (note_list) = insn;
4699           note_list = insn;
4700         }
4701
4702       insn = next;
4703     }
4704   return insn;
4705 }
4706
4707 /* Delete line notes beginning with INSN. Record line-number notes so
4708    they can be reused.  Returns the insn following the notes.  */
4709
4710 static rtx
4711 unlink_line_notes (insn, tail)
4712      rtx insn, tail;
4713 {
4714   rtx prev = PREV_INSN (insn);
4715
4716   while (insn != tail && GET_CODE (insn) == NOTE)
4717     {
4718       rtx next = NEXT_INSN (insn);
4719
4720       if (write_symbols != NO_DEBUG && NOTE_LINE_NUMBER (insn) > 0)
4721         {
4722           /* Delete the note from its current position.  */
4723           if (prev)
4724             NEXT_INSN (prev) = next;
4725           if (next)
4726             PREV_INSN (next) = prev;
4727
4728           /* Record line-number notes so they can be reused.  */
4729           LINE_NOTE (insn) = insn;
4730         }
4731       else
4732         prev = insn;
4733
4734       insn = next;
4735     }
4736   return insn;
4737 }
4738
4739 /* Return the head and tail pointers of BB.  */
4740
4741 HAIFA_INLINE static void
4742 get_block_head_tail (bb, headp, tailp)
4743      int bb;
4744      rtx *headp;
4745      rtx *tailp;
4746 {
4747
4748   rtx head;
4749   rtx tail;
4750   int b;
4751
4752   b = BB_TO_BLOCK (bb);
4753
4754   /* HEAD and TAIL delimit the basic block being scheduled.  */
4755   head = basic_block_head[b];
4756   tail = basic_block_end[b];
4757
4758   /* Don't include any notes or labels at the beginning of the
4759      basic block, or notes at the ends of basic blocks.  */
4760   while (head != tail)
4761     {
4762       if (GET_CODE (head) == NOTE)
4763         head = NEXT_INSN (head);
4764       else if (GET_CODE (tail) == NOTE)
4765         tail = PREV_INSN (tail);
4766       else if (GET_CODE (head) == CODE_LABEL)
4767         head = NEXT_INSN (head);
4768       else
4769         break;
4770     }
4771
4772   *headp = head;
4773   *tailp = tail;
4774 }
4775
4776 /* Delete line notes from bb. Save them so they can be later restored
4777    (in restore_line_notes ()).  */
4778
4779 static void
4780 rm_line_notes (bb)
4781      int bb;
4782 {
4783   rtx next_tail;
4784   rtx tail;
4785   rtx head;
4786   rtx insn;
4787
4788   get_block_head_tail (bb, &head, &tail);
4789
4790   if (head == tail
4791       && (GET_RTX_CLASS (GET_CODE (head)) != 'i'))
4792     return;
4793
4794   next_tail = NEXT_INSN (tail);
4795   for (insn = head; insn != next_tail; insn = NEXT_INSN (insn))
4796     {
4797       rtx prev;
4798
4799       /* Farm out notes, and maybe save them in NOTE_LIST.
4800          This is needed to keep the debugger from
4801          getting completely deranged.  */
4802       if (GET_CODE (insn) == NOTE)
4803         {
4804           prev = insn;
4805           insn = unlink_line_notes (insn, next_tail);
4806
4807           if (prev == tail)
4808             abort ();
4809           if (prev == head)
4810             abort ();
4811           if (insn == next_tail)
4812             abort ();
4813         }
4814     }
4815 }
4816
4817 /* Save line number notes for each insn in bb.  */
4818
4819 static void
4820 save_line_notes (bb)
4821      int bb;
4822 {
4823   rtx head, tail;
4824   rtx next_tail;
4825
4826   /* We must use the true line number for the first insn in the block
4827      that was computed and saved at the start of this pass.  We can't
4828      use the current line number, because scheduling of the previous
4829      block may have changed the current line number.  */
4830
4831   rtx line = line_note_head[BB_TO_BLOCK (bb)];
4832   rtx insn;
4833
4834   get_block_head_tail (bb, &head, &tail);
4835   next_tail = NEXT_INSN (tail);
4836
4837   for (insn = basic_block_head[BB_TO_BLOCK (bb)];
4838        insn != next_tail;
4839        insn = NEXT_INSN (insn))
4840     if (GET_CODE (insn) == NOTE && NOTE_LINE_NUMBER (insn) > 0)
4841       line = insn;
4842     else
4843       LINE_NOTE (insn) = line;
4844 }
4845
4846
4847 /* After bb was scheduled, insert line notes into the insns list.  */
4848
4849 static void
4850 restore_line_notes (bb)
4851      int bb;
4852 {
4853   rtx line, note, prev, new;
4854   int added_notes = 0;
4855   int b;
4856   rtx head, next_tail, insn;
4857
4858   b = BB_TO_BLOCK (bb);
4859
4860   head = basic_block_head[b];
4861   next_tail = NEXT_INSN (basic_block_end[b]);
4862
4863   /* Determine the current line-number.  We want to know the current
4864      line number of the first insn of the block here, in case it is
4865      different from the true line number that was saved earlier.  If
4866      different, then we need a line number note before the first insn
4867      of this block.  If it happens to be the same, then we don't want to
4868      emit another line number note here.  */
4869   for (line = head; line; line = PREV_INSN (line))
4870     if (GET_CODE (line) == NOTE && NOTE_LINE_NUMBER (line) > 0)
4871       break;
4872
4873   /* Walk the insns keeping track of the current line-number and inserting
4874      the line-number notes as needed.  */
4875   for (insn = head; insn != next_tail; insn = NEXT_INSN (insn))
4876     if (GET_CODE (insn) == NOTE && NOTE_LINE_NUMBER (insn) > 0)
4877       line = insn;
4878   /* This used to emit line number notes before every non-deleted note.
4879      However, this confuses a debugger, because line notes not separated
4880      by real instructions all end up at the same address.  I can find no
4881      use for line number notes before other notes, so none are emitted.  */
4882     else if (GET_CODE (insn) != NOTE
4883              && (note = LINE_NOTE (insn)) != 0
4884              && note != line
4885              && (line == 0
4886                  || NOTE_LINE_NUMBER (note) != NOTE_LINE_NUMBER (line)
4887                  || NOTE_SOURCE_FILE (note) != NOTE_SOURCE_FILE (line)))
4888       {
4889         line = note;
4890         prev = PREV_INSN (insn);
4891         if (LINE_NOTE (note))
4892           {
4893             /* Re-use the original line-number note.  */
4894             LINE_NOTE (note) = 0;
4895             PREV_INSN (note) = prev;
4896             NEXT_INSN (prev) = note;
4897             PREV_INSN (insn) = note;
4898             NEXT_INSN (note) = insn;
4899           }
4900         else
4901           {
4902             added_notes++;
4903             new = emit_note_after (NOTE_LINE_NUMBER (note), prev);
4904             NOTE_SOURCE_FILE (new) = NOTE_SOURCE_FILE (note);
4905             RTX_INTEGRATED_P (new) = RTX_INTEGRATED_P (note);
4906           }
4907       }
4908   if (sched_verbose && added_notes)
4909     fprintf (dump, ";; added %d line-number notes\n", added_notes);
4910 }
4911
4912 /* After scheduling the function, delete redundant line notes from the
4913    insns list.  */
4914
4915 static void
4916 rm_redundant_line_notes ()
4917 {
4918   rtx line = 0;
4919   rtx insn = get_insns ();
4920   int active_insn = 0;
4921   int notes = 0;
4922
4923   /* Walk the insns deleting redundant line-number notes.  Many of these
4924      are already present.  The remainder tend to occur at basic
4925      block boundaries.  */
4926   for (insn = get_last_insn (); insn; insn = PREV_INSN (insn))
4927     if (GET_CODE (insn) == NOTE && NOTE_LINE_NUMBER (insn) > 0)
4928       {
4929         /* If there are no active insns following, INSN is redundant.  */
4930         if (active_insn == 0)
4931           {
4932             notes++;
4933             NOTE_SOURCE_FILE (insn) = 0;
4934             NOTE_LINE_NUMBER (insn) = NOTE_INSN_DELETED;
4935           }
4936         /* If the line number is unchanged, LINE is redundant.  */
4937         else if (line
4938                  && NOTE_LINE_NUMBER (line) == NOTE_LINE_NUMBER (insn)
4939                  && NOTE_SOURCE_FILE (line) == NOTE_SOURCE_FILE (insn))
4940           {
4941             notes++;
4942             NOTE_SOURCE_FILE (line) = 0;
4943             NOTE_LINE_NUMBER (line) = NOTE_INSN_DELETED;
4944             line = insn;
4945           }
4946         else
4947           line = insn;
4948         active_insn = 0;
4949       }
4950     else if (!((GET_CODE (insn) == NOTE
4951                 && NOTE_LINE_NUMBER (insn) == NOTE_INSN_DELETED)
4952                || (GET_CODE (insn) == INSN
4953                    && (GET_CODE (PATTERN (insn)) == USE
4954                        || GET_CODE (PATTERN (insn)) == CLOBBER))))
4955       active_insn++;
4956
4957   if (sched_verbose && notes)
4958     fprintf (dump, ";; deleted %d line-number notes\n", notes);
4959 }
4960
4961 /* Delete notes between head and tail and put them in the chain
4962    of notes ended by NOTE_LIST.  */
4963
4964 static void
4965 rm_other_notes (head, tail)
4966      rtx head;
4967      rtx tail;
4968 {
4969   rtx next_tail;
4970   rtx insn;
4971
4972   if (head == tail
4973       && (GET_RTX_CLASS (GET_CODE (head)) != 'i'))
4974     return;
4975
4976   next_tail = NEXT_INSN (tail);
4977   for (insn = head; insn != next_tail; insn = NEXT_INSN (insn))
4978     {
4979       rtx prev;
4980
4981       /* Farm out notes, and maybe save them in NOTE_LIST.
4982          This is needed to keep the debugger from
4983          getting completely deranged.  */
4984       if (GET_CODE (insn) == NOTE)
4985         {
4986           prev = insn;
4987
4988           insn = unlink_other_notes (insn, next_tail);
4989
4990           if (prev == tail)
4991             abort ();
4992           if (prev == head)
4993             abort ();
4994           if (insn == next_tail)
4995             abort ();
4996         }
4997     }
4998 }
4999
5000 /* Constructor for `sometimes' data structure.  */
5001
5002 static int
5003 new_sometimes_live (regs_sometimes_live, regno, sometimes_max)
5004      struct sometimes *regs_sometimes_live;
5005      int regno;
5006      int sometimes_max;
5007 {
5008   register struct sometimes *p;
5009
5010   /* There should never be a register greater than max_regno here.  If there
5011      is, it means that a define_split has created a new pseudo reg.  This
5012      is not allowed, since there will not be flow info available for any
5013      new register, so catch the error here.  */
5014   if (regno >= max_regno)
5015     abort ();
5016
5017   p = &regs_sometimes_live[sometimes_max];
5018   p->regno = regno;
5019   p->live_length = 0;
5020   p->calls_crossed = 0;
5021   sometimes_max++;
5022   return sometimes_max;
5023 }
5024
5025 /* Count lengths of all regs we are currently tracking,
5026    and find new registers no longer live.  */
5027
5028 static void
5029 finish_sometimes_live (regs_sometimes_live, sometimes_max)
5030      struct sometimes *regs_sometimes_live;
5031      int sometimes_max;
5032 {
5033   int i;
5034
5035   for (i = 0; i < sometimes_max; i++)
5036     {
5037       register struct sometimes *p = &regs_sometimes_live[i];
5038       int regno = p->regno;
5039
5040       sched_reg_live_length[regno] += p->live_length;
5041       sched_reg_n_calls_crossed[regno] += p->calls_crossed;
5042     }
5043 }
5044
5045 /* functions for computation of registers live/usage info */
5046
5047 /* It is assumed that prior to scheduling basic_block_live_at_start (b)
5048    contains the registers that are alive at the entry to b.
5049
5050    Two passes follow: The first pass is performed before the scheduling
5051    of a region. It scans each block of the region forward, computing
5052    the set of registers alive at the end of the basic block and
5053    discard REG_DEAD notes (done by find_pre_sched_live ()).
5054
5055    The second path is invoked after scheduling all region blocks.
5056    It scans each block of the region backward, a block being traversed
5057    only after its succesors in the region. When the set of registers
5058    live at the end of a basic block may be changed by the scheduling
5059    (this may happen for multiple blocks region), it is computed as
5060    the union of the registers live at the start of its succesors.
5061    The last-use information is updated by inserting REG_DEAD notes.
5062    (done by find_post_sched_live ()) */
5063
5064 /* Scan all the insns to be scheduled, removing register death notes.
5065    Register death notes end up in DEAD_NOTES.
5066    Recreate the register life information for the end of this basic
5067    block.  */
5068
5069 static void
5070 find_pre_sched_live (bb)
5071      int bb;
5072 {
5073   rtx insn, next_tail, head, tail;
5074   int b = BB_TO_BLOCK (bb);
5075
5076   get_block_head_tail (bb, &head, &tail);
5077   COPY_REG_SET (bb_live_regs, basic_block_live_at_start[b]);
5078   next_tail = NEXT_INSN (tail);
5079
5080   for (insn = head; insn != next_tail; insn = NEXT_INSN (insn))
5081     {
5082       rtx prev, next, link;
5083       int reg_weight = 0;
5084
5085       /* Handle register life information.  */
5086       if (GET_RTX_CLASS (GET_CODE (insn)) == 'i')
5087         {
5088           /* See if the register gets born here.  */
5089           /* We must check for registers being born before we check for
5090              registers dying.  It is possible for a register to be born and
5091              die in the same insn, e.g. reading from a volatile memory
5092              location into an otherwise unused register.  Such a register
5093              must be marked as dead after this insn.  */
5094           if (GET_CODE (PATTERN (insn)) == SET
5095               || GET_CODE (PATTERN (insn)) == CLOBBER)
5096             {
5097               sched_note_set (PATTERN (insn), 0);
5098               reg_weight++;
5099             }
5100
5101           else if (GET_CODE (PATTERN (insn)) == PARALLEL)
5102             {
5103               int j;
5104               for (j = XVECLEN (PATTERN (insn), 0) - 1; j >= 0; j--)
5105                 if (GET_CODE (XVECEXP (PATTERN (insn), 0, j)) == SET
5106                     || GET_CODE (XVECEXP (PATTERN (insn), 0, j)) == CLOBBER)
5107                   {
5108                     sched_note_set (XVECEXP (PATTERN (insn), 0, j), 0);
5109                     reg_weight++;
5110                   }
5111
5112               /* ??? This code is obsolete and should be deleted.  It
5113                  is harmless though, so we will leave it in for now.  */
5114               for (j = XVECLEN (PATTERN (insn), 0) - 1; j >= 0; j--)
5115                 if (GET_CODE (XVECEXP (PATTERN (insn), 0, j)) == USE)
5116                   sched_note_set (XVECEXP (PATTERN (insn), 0, j), 0);
5117             }
5118
5119           /* Each call cobbers (makes live) all call-clobbered regs
5120              that are not global or fixed.  Note that the function-value
5121              reg is a call_clobbered reg.  */
5122           if (GET_CODE (insn) == CALL_INSN)
5123             {
5124               int j;
5125               for (j = 0; j < FIRST_PSEUDO_REGISTER; j++)
5126                 if (call_used_regs[j] && !global_regs[j]
5127                     && ! fixed_regs[j])
5128                   {
5129                     SET_REGNO_REG_SET (bb_live_regs, j);
5130                   }
5131             }
5132
5133           /* Need to know what registers this insn kills.  */
5134           for (prev = 0, link = REG_NOTES (insn); link; link = next)
5135             {
5136               next = XEXP (link, 1);
5137               if ((REG_NOTE_KIND (link) == REG_DEAD
5138                    || REG_NOTE_KIND (link) == REG_UNUSED)
5139               /* Verify that the REG_NOTE has a valid value.  */
5140                   && GET_CODE (XEXP (link, 0)) == REG)
5141                 {
5142                   register int regno = REGNO (XEXP (link, 0));
5143
5144                   reg_weight--;
5145
5146                   /* Only unlink REG_DEAD notes; leave REG_UNUSED notes
5147                      alone.  */
5148                   if (REG_NOTE_KIND (link) == REG_DEAD)
5149                     {
5150                       if (prev)
5151                         XEXP (prev, 1) = next;
5152                       else
5153                         REG_NOTES (insn) = next;
5154                       XEXP (link, 1) = dead_notes;
5155                       dead_notes = link;
5156                     }
5157                   else
5158                     prev = link;
5159
5160                   if (regno < FIRST_PSEUDO_REGISTER)
5161                     {
5162                       int j = HARD_REGNO_NREGS (regno,
5163                                                 GET_MODE (XEXP (link, 0)));
5164                       while (--j >= 0)
5165                         {
5166                           CLEAR_REGNO_REG_SET (bb_live_regs, regno+j);
5167                         }
5168                     }
5169                   else
5170                     {
5171                       CLEAR_REGNO_REG_SET (bb_live_regs, regno);
5172                     }
5173                 }
5174               else
5175                 prev = link;
5176             }
5177         }
5178
5179       INSN_REG_WEIGHT (insn) = reg_weight;
5180     }
5181 }
5182
5183 /* Update register life and usage information for block bb
5184    after scheduling.  Put register dead notes back in the code.  */
5185
5186 static void
5187 find_post_sched_live (bb)
5188      int bb;
5189 {
5190   int sometimes_max;
5191   int j, i;
5192   int b;
5193   rtx insn;
5194   rtx head, tail, prev_head, next_tail;
5195
5196   register struct sometimes *regs_sometimes_live;
5197
5198   b = BB_TO_BLOCK (bb);
5199
5200   /* compute live regs at the end of bb as a function of its successors.  */
5201   if (current_nr_blocks > 1)
5202     {
5203       int e;
5204       int first_edge;
5205
5206       first_edge = e = OUT_EDGES (b);
5207       CLEAR_REG_SET (bb_live_regs);
5208
5209       if (e)
5210         do
5211           {
5212             int b_succ;
5213
5214             b_succ = TO_BLOCK (e);
5215             IOR_REG_SET (bb_live_regs, basic_block_live_at_start[b_succ]);
5216             e = NEXT_OUT (e);
5217           }
5218         while (e != first_edge);
5219     }
5220
5221   get_block_head_tail (bb, &head, &tail);
5222   next_tail = NEXT_INSN (tail);
5223   prev_head = PREV_INSN (head);
5224
5225   EXECUTE_IF_SET_IN_REG_SET (bb_live_regs, FIRST_PSEUDO_REGISTER, i,
5226                              {
5227                                sched_reg_basic_block[i] = REG_BLOCK_GLOBAL;
5228                              });
5229
5230   /* if the block is empty, same regs are alive at its end and its start.
5231      since this is not guaranteed after interblock scheduling, make sure they
5232      are truly identical.  */
5233   if (NEXT_INSN (prev_head) == tail
5234       && (GET_RTX_CLASS (GET_CODE (tail)) != 'i'))
5235     {
5236       if (current_nr_blocks > 1)
5237         COPY_REG_SET (basic_block_live_at_start[b], bb_live_regs);
5238
5239       return;
5240     }
5241
5242   b = BB_TO_BLOCK (bb);
5243   current_block_num = b;
5244
5245   /* Keep track of register lives.  */
5246   old_live_regs = ALLOCA_REG_SET ();
5247   regs_sometimes_live
5248     = (struct sometimes *) alloca (max_regno * sizeof (struct sometimes));
5249   sometimes_max = 0;
5250
5251   /* initiate "sometimes" data, starting with registers live at end */
5252   sometimes_max = 0;
5253   COPY_REG_SET (old_live_regs, bb_live_regs);
5254   EXECUTE_IF_SET_IN_REG_SET (bb_live_regs, 0, j,
5255                              {
5256                                sometimes_max
5257                                  = new_sometimes_live (regs_sometimes_live,
5258                                                        j, sometimes_max);
5259                              });
5260
5261   /* scan insns back, computing regs live info */
5262   for (insn = tail; insn != prev_head; insn = PREV_INSN (insn))
5263     {
5264       /* First we kill registers set by this insn, and then we
5265          make registers used by this insn live.  This is the opposite
5266          order used above because we are traversing the instructions
5267          backwards.  */
5268
5269       /* Strictly speaking, we should scan REG_UNUSED notes and make
5270          every register mentioned there live, however, we will just
5271          kill them again immediately below, so there doesn't seem to
5272          be any reason why we bother to do this.  */
5273
5274       /* See if this is the last notice we must take of a register.  */
5275       if (GET_RTX_CLASS (GET_CODE (insn)) != 'i')
5276         continue;
5277
5278       if (GET_CODE (PATTERN (insn)) == SET
5279           || GET_CODE (PATTERN (insn)) == CLOBBER)
5280         sched_note_set (PATTERN (insn), 1);
5281       else if (GET_CODE (PATTERN (insn)) == PARALLEL)
5282         {
5283           for (j = XVECLEN (PATTERN (insn), 0) - 1; j >= 0; j--)
5284             if (GET_CODE (XVECEXP (PATTERN (insn), 0, j)) == SET
5285                 || GET_CODE (XVECEXP (PATTERN (insn), 0, j)) == CLOBBER)
5286               sched_note_set (XVECEXP (PATTERN (insn), 0, j), 1);
5287         }
5288
5289       /* This code keeps life analysis information up to date.  */
5290       if (GET_CODE (insn) == CALL_INSN)
5291         {
5292           register struct sometimes *p;
5293
5294           /* A call kills all call used registers that are not
5295              global or fixed, except for those mentioned in the call
5296              pattern which will be made live again later.  */
5297           for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
5298             if (call_used_regs[i] && ! global_regs[i]
5299                 && ! fixed_regs[i])
5300               {
5301                 CLEAR_REGNO_REG_SET (bb_live_regs, i);
5302               }
5303
5304           /* Regs live at the time of a call instruction must not
5305              go in a register clobbered by calls.  Record this for
5306              all regs now live.  Note that insns which are born or
5307              die in a call do not cross a call, so this must be done
5308              after the killings (above) and before the births
5309              (below).  */
5310           p = regs_sometimes_live;
5311           for (i = 0; i < sometimes_max; i++, p++)
5312             if (REGNO_REG_SET_P (bb_live_regs, p->regno))
5313               p->calls_crossed += 1;
5314         }
5315
5316       /* Make every register used live, and add REG_DEAD notes for
5317          registers which were not live before we started.  */
5318       attach_deaths_insn (insn);
5319
5320       /* Find registers now made live by that instruction.  */
5321       EXECUTE_IF_AND_COMPL_IN_REG_SET (bb_live_regs, old_live_regs, 0, j,
5322                                  {
5323                                    sometimes_max
5324                                      = new_sometimes_live (regs_sometimes_live,
5325                                                            j, sometimes_max);
5326                                  });
5327       IOR_REG_SET (old_live_regs, bb_live_regs);
5328
5329       /* Count lengths of all regs we are worrying about now,
5330          and handle registers no longer live.  */
5331
5332       for (i = 0; i < sometimes_max; i++)
5333         {
5334           register struct sometimes *p = &regs_sometimes_live[i];
5335           int regno = p->regno;
5336
5337           p->live_length += 1;
5338
5339           if (!REGNO_REG_SET_P (bb_live_regs, regno))
5340             {
5341               /* This is the end of one of this register's lifetime
5342                  segments.  Save the lifetime info collected so far,
5343                  and clear its bit in the old_live_regs entry.  */
5344               sched_reg_live_length[regno] += p->live_length;
5345               sched_reg_n_calls_crossed[regno] += p->calls_crossed;
5346               CLEAR_REGNO_REG_SET (old_live_regs, p->regno);
5347
5348               /* Delete the reg_sometimes_live entry for this reg by
5349                  copying the last entry over top of it.  */
5350               *p = regs_sometimes_live[--sometimes_max];
5351               /* ...and decrement i so that this newly copied entry
5352                  will be processed.  */
5353               i--;
5354             }
5355         }
5356     }
5357
5358   finish_sometimes_live (regs_sometimes_live, sometimes_max);
5359
5360   /* In interblock scheduling, basic_block_live_at_start may have changed.  */
5361   if (current_nr_blocks > 1)
5362     COPY_REG_SET (basic_block_live_at_start[b], bb_live_regs);
5363
5364
5365   FREE_REG_SET (old_live_regs);
5366 }                               /* find_post_sched_live */
5367
5368 /* After scheduling the subroutine, restore information about uses of
5369    registers.  */
5370
5371 static void
5372 update_reg_usage ()
5373 {
5374   int regno;
5375
5376   if (n_basic_blocks > 0)
5377     EXECUTE_IF_SET_IN_REG_SET (bb_live_regs, FIRST_PSEUDO_REGISTER, regno,
5378                                {
5379                                  sched_reg_basic_block[regno]
5380                                    = REG_BLOCK_GLOBAL;
5381                                });
5382
5383   for (regno = 0; regno < max_regno; regno++)
5384     if (sched_reg_live_length[regno])
5385       {
5386         if (sched_verbose)
5387           {
5388             if (REG_LIVE_LENGTH (regno) > sched_reg_live_length[regno])
5389               fprintf (dump,
5390                        ";; register %d life shortened from %d to %d\n",
5391                        regno, REG_LIVE_LENGTH (regno),
5392                        sched_reg_live_length[regno]);
5393             /* Negative values are special; don't overwrite the current
5394                reg_live_length value if it is negative.  */
5395             else if (REG_LIVE_LENGTH (regno) < sched_reg_live_length[regno]
5396                      && REG_LIVE_LENGTH (regno) >= 0)
5397               fprintf (dump,
5398                        ";; register %d life extended from %d to %d\n",
5399                        regno, REG_LIVE_LENGTH (regno),
5400                        sched_reg_live_length[regno]);
5401
5402             if (!REG_N_CALLS_CROSSED (regno)
5403                 && sched_reg_n_calls_crossed[regno])
5404               fprintf (dump,
5405                        ";; register %d now crosses calls\n", regno);
5406             else if (REG_N_CALLS_CROSSED (regno)
5407                      && !sched_reg_n_calls_crossed[regno]
5408                      && REG_BASIC_BLOCK (regno) != REG_BLOCK_GLOBAL)
5409               fprintf (dump,
5410                        ";; register %d no longer crosses calls\n", regno);
5411
5412             if (REG_BASIC_BLOCK (regno) != sched_reg_basic_block[regno]
5413                 && sched_reg_basic_block[regno] != REG_BLOCK_UNKNOWN
5414                 && REG_BASIC_BLOCK(regno) != REG_BLOCK_UNKNOWN)
5415               fprintf (dump,
5416                        ";; register %d changed basic block from %d to %d\n",
5417                         regno, REG_BASIC_BLOCK(regno),
5418                         sched_reg_basic_block[regno]);
5419
5420           }
5421         /* Negative values are special; don't overwrite the current
5422            reg_live_length value if it is negative.  */
5423         if (REG_LIVE_LENGTH (regno) >= 0)
5424           REG_LIVE_LENGTH (regno) = sched_reg_live_length[regno];
5425
5426         if (sched_reg_basic_block[regno] != REG_BLOCK_UNKNOWN
5427             && REG_BASIC_BLOCK(regno) != REG_BLOCK_UNKNOWN)
5428           REG_BASIC_BLOCK(regno) = sched_reg_basic_block[regno];
5429
5430         /* We can't change the value of reg_n_calls_crossed to zero for
5431            pseudos which are live in more than one block.
5432
5433            This is because combine might have made an optimization which
5434            invalidated basic_block_live_at_start and reg_n_calls_crossed,
5435            but it does not update them.  If we update reg_n_calls_crossed
5436            here, the two variables are now inconsistent, and this might
5437            confuse the caller-save code into saving a register that doesn't
5438            need to be saved.  This is only a problem when we zero calls
5439            crossed for a pseudo live in multiple basic blocks.
5440
5441            Alternatively, we could try to correctly update basic block live
5442            at start here in sched, but that seems complicated.
5443
5444            Note: it is possible that a global register became local, as result
5445            of interblock motion, but will remain marked as a global register.  */
5446         if (sched_reg_n_calls_crossed[regno]
5447             || REG_BASIC_BLOCK (regno) != REG_BLOCK_GLOBAL)
5448           REG_N_CALLS_CROSSED (regno) = sched_reg_n_calls_crossed[regno];
5449
5450       }
5451 }
5452
5453 /* Scheduling clock, modified in schedule_block() and queue_to_ready () */
5454 static int clock_var;
5455
5456 /* Move insns that became ready to fire from queue to ready list.  */
5457
5458 static int
5459 queue_to_ready (ready, n_ready)
5460      rtx ready[];
5461      int n_ready;
5462 {
5463   rtx insn;
5464   rtx link;
5465
5466   q_ptr = NEXT_Q (q_ptr);
5467
5468   /* Add all pending insns that can be scheduled without stalls to the
5469      ready list.  */
5470   for (link = insn_queue[q_ptr]; link; link = XEXP (link, 1))
5471     {
5472
5473       insn = XEXP (link, 0);
5474       q_size -= 1;
5475
5476       if (sched_verbose >= 2)
5477         fprintf (dump, ";;\t\tQ-->Ready: insn %d: ", INSN_UID (insn));
5478
5479       if (sched_verbose >= 2 && INSN_BB (insn) != target_bb)
5480         fprintf (dump, "(b%d) ", INSN_BLOCK (insn));
5481
5482       ready[n_ready++] = insn;
5483       if (sched_verbose >= 2)
5484         fprintf (dump, "moving to ready without stalls\n");
5485     }
5486   insn_queue[q_ptr] = 0;
5487
5488   /* If there are no ready insns, stall until one is ready and add all
5489      of the pending insns at that point to the ready list.  */
5490   if (n_ready == 0)
5491     {
5492       register int stalls;
5493
5494       for (stalls = 1; stalls < INSN_QUEUE_SIZE; stalls++)
5495         {
5496           if ((link = insn_queue[NEXT_Q_AFTER (q_ptr, stalls)]))
5497             {
5498               for (; link; link = XEXP (link, 1))
5499                 {
5500                   insn = XEXP (link, 0);
5501                   q_size -= 1;
5502
5503                   if (sched_verbose >= 2)
5504                     fprintf (dump, ";;\t\tQ-->Ready: insn %d: ", INSN_UID (insn));
5505
5506                   if (sched_verbose >= 2 && INSN_BB (insn) != target_bb)
5507                     fprintf (dump, "(b%d) ", INSN_BLOCK (insn));
5508
5509                   ready[n_ready++] = insn;
5510                   if (sched_verbose >= 2)
5511                     fprintf (dump, "moving to ready with %d stalls\n", stalls);
5512                 }
5513               insn_queue[NEXT_Q_AFTER (q_ptr, stalls)] = 0;
5514
5515               if (n_ready)
5516                 break;
5517             }
5518         }
5519
5520       if (sched_verbose && stalls)
5521         visualize_stall_cycles (BB_TO_BLOCK (target_bb), stalls);
5522       q_ptr = NEXT_Q_AFTER (q_ptr, stalls);
5523       clock_var += stalls;
5524     }
5525   return n_ready;
5526 }
5527
5528 /* Print the ready list for debugging purposes. Callable from debugger.  */
5529
5530 static void
5531 debug_ready_list (ready, n_ready)
5532      rtx ready[];
5533      int n_ready;
5534 {
5535   int i;
5536
5537   for (i = 0; i < n_ready; i++)
5538     {
5539       fprintf (dump, "  %d", INSN_UID (ready[i]));
5540       if (current_nr_blocks > 1 && INSN_BB (ready[i]) != target_bb)
5541         fprintf (dump, "/b%d", INSN_BLOCK (ready[i]));
5542     }
5543   fprintf (dump, "\n");
5544 }
5545
5546 /* Print names of units on which insn can/should execute, for debugging.  */
5547
5548 static void
5549 insn_print_units (insn)
5550      rtx insn;
5551 {
5552   int i;
5553   int unit = insn_unit (insn);
5554
5555   if (unit == -1)
5556     fprintf (dump, "none");
5557   else if (unit >= 0)
5558     fprintf (dump, "%s", function_units[unit].name);
5559   else
5560     {
5561       fprintf (dump, "[");
5562       for (i = 0, unit = ~unit; unit; i++, unit >>= 1)
5563         if (unit & 1)
5564           {
5565             fprintf (dump, "%s", function_units[i].name);
5566             if (unit != 1)
5567               fprintf (dump, " ");
5568           }
5569       fprintf (dump, "]");
5570     }
5571 }
5572
5573 /* MAX_VISUAL_LINES is the maximum number of lines in visualization table
5574    of a basic block.  If more lines are needed, table is splitted to two.
5575    n_visual_lines is the number of lines printed so far for a block.
5576    visual_tbl contains the block visualization info.
5577    vis_no_unit holds insns in a cycle that are not mapped to any unit.  */
5578 #define MAX_VISUAL_LINES 100
5579 #define INSN_LEN 30
5580 int n_visual_lines;
5581 char *visual_tbl;
5582 int n_vis_no_unit;
5583 rtx vis_no_unit[10];
5584
5585 /* Finds units that are in use in this fuction. Required only
5586    for visualization.  */
5587
5588 static void
5589 init_target_units ()
5590 {
5591   rtx insn;
5592   int unit;
5593
5594   for (insn = get_last_insn (); insn; insn = PREV_INSN (insn))
5595     {
5596       if (GET_RTX_CLASS (GET_CODE (insn)) != 'i')
5597         continue;
5598
5599       unit = insn_unit (insn);
5600
5601       if (unit < 0)
5602         target_units |= ~unit;
5603       else
5604         target_units |= (1 << unit);
5605     }
5606 }
5607
5608 /* Return the length of the visualization table */
5609
5610 static int
5611 get_visual_tbl_length ()
5612 {
5613   int unit, i;
5614   int n, n1;
5615   char *s;
5616
5617   /* compute length of one field in line */
5618   s = (char *) alloca (INSN_LEN + 5);
5619   sprintf (s, "  %33s", "uname");
5620   n1 = strlen (s);
5621
5622   /* compute length of one line */
5623   n = strlen (";; ");
5624   n += n1;
5625   for (unit = 0; unit < FUNCTION_UNITS_SIZE; unit++)
5626     if (function_units[unit].bitmask & target_units)
5627       for (i = 0; i < function_units[unit].multiplicity; i++)
5628         n += n1;
5629   n += n1;
5630   n += strlen ("\n") + 2;
5631
5632   /* compute length of visualization string */
5633   return (MAX_VISUAL_LINES * n);
5634 }
5635
5636 /* Init block visualization debugging info */
5637
5638 static void
5639 init_block_visualization ()
5640 {
5641   strcpy (visual_tbl, "");
5642   n_visual_lines = 0;
5643   n_vis_no_unit = 0;
5644 }
5645
5646 #define BUF_LEN 256
5647
5648 static char *
5649 safe_concat (buf, cur, str)
5650      char *buf;
5651      char *cur;
5652      char *str;
5653 {
5654   char *end = buf + BUF_LEN - 2;        /* leave room for null */
5655   int c;
5656
5657   if (cur > end)
5658     {
5659       *end = '\0';
5660       return end;
5661     }
5662
5663   while (cur < end && (c = *str++) != '\0')
5664     *cur++ = c;
5665
5666   *cur = '\0';
5667   return cur;
5668 }
5669
5670 /* This recognizes rtx, I classified as expressions. These are always */
5671 /* represent some action on values or results of other expression, */
5672 /* that may be stored in objects representing values.  */
5673
5674 static void
5675 print_exp (buf, x, verbose)
5676      char *buf;
5677      rtx x;
5678      int verbose;
5679 {
5680   char tmp[BUF_LEN];
5681   char *st[4];
5682   char *cur = buf;
5683   char *fun = (char *)0;
5684   char *sep;
5685   rtx op[4];
5686   int i;
5687
5688   for (i = 0; i < 4; i++)
5689     {
5690       st[i] = (char *)0;
5691       op[i] = NULL_RTX;
5692     }
5693
5694   switch (GET_CODE (x))
5695     {
5696     case PLUS:
5697       op[0] = XEXP (x, 0);
5698       st[1] = "+";
5699       op[1] = XEXP (x, 1);
5700       break;
5701     case LO_SUM:
5702       op[0] = XEXP (x, 0);
5703       st[1] = "+low(";
5704       op[1] = XEXP (x, 1);
5705       st[2] = ")";
5706       break;
5707     case MINUS:
5708       op[0] = XEXP (x, 0);
5709       st[1] = "-";
5710       op[1] = XEXP (x, 1);
5711       break;
5712     case COMPARE:
5713       fun = "cmp";
5714       op[0] = XEXP (x, 0);
5715       op[1] = XEXP (x, 1);
5716       break;
5717     case NEG:
5718       st[0] = "-";
5719       op[0] = XEXP (x, 0);
5720       break;
5721     case MULT:
5722       op[0] = XEXP (x, 0);
5723       st[1] = "*";
5724       op[1] = XEXP (x, 1);
5725       break;
5726     case DIV:
5727       op[0] = XEXP (x, 0);
5728       st[1] = "/";
5729       op[1] = XEXP (x, 1);
5730       break;
5731     case UDIV:
5732       fun = "udiv";
5733       op[0] = XEXP (x, 0);
5734       op[1] = XEXP (x, 1);
5735       break;
5736     case MOD:
5737       op[0] = XEXP (x, 0);
5738       st[1] = "%";
5739       op[1] = XEXP (x, 1);
5740       break;
5741     case UMOD:
5742       fun = "umod";
5743       op[0] = XEXP (x, 0);
5744       op[1] = XEXP (x, 1);
5745       break;
5746     case SMIN:
5747       fun = "smin";
5748       op[0] = XEXP (x, 0);
5749       op[1] = XEXP (x, 1);
5750       break;
5751     case SMAX:
5752       fun = "smax";
5753       op[0] = XEXP (x, 0);
5754       op[1] = XEXP (x, 1);
5755       break;
5756     case UMIN:
5757       fun = "umin";
5758       op[0] = XEXP (x, 0);
5759       op[1] = XEXP (x, 1);
5760       break;
5761     case UMAX:
5762       fun = "umax";
5763       op[0] = XEXP (x, 0);
5764       op[1] = XEXP (x, 1);
5765       break;
5766     case NOT:
5767       st[0] = "!";
5768       op[0] = XEXP (x, 0);
5769       break;
5770     case AND:
5771       op[0] = XEXP (x, 0);
5772       st[1] = "&";
5773       op[1] = XEXP (x, 1);
5774       break;
5775     case IOR:
5776       op[0] = XEXP (x, 0);
5777       st[1] = "|";
5778       op[1] = XEXP (x, 1);
5779       break;
5780     case XOR:
5781       op[0] = XEXP (x, 0);
5782       st[1] = "^";
5783       op[1] = XEXP (x, 1);
5784       break;
5785     case ASHIFT:
5786       op[0] = XEXP (x, 0);
5787       st[1] = "<<";
5788       op[1] = XEXP (x, 1);
5789       break;
5790     case LSHIFTRT:
5791       op[0] = XEXP (x, 0);
5792       st[1] = " 0>>";
5793       op[1] = XEXP (x, 1);
5794       break;
5795     case ASHIFTRT:
5796       op[0] = XEXP (x, 0);
5797       st[1] = ">>";
5798       op[1] = XEXP (x, 1);
5799       break;
5800     case ROTATE:
5801       op[0] = XEXP (x, 0);
5802       st[1] = "<-<";
5803       op[1] = XEXP (x, 1);
5804       break;
5805     case ROTATERT:
5806       op[0] = XEXP (x, 0);
5807       st[1] = ">->";
5808       op[1] = XEXP (x, 1);
5809       break;
5810     case ABS:
5811       fun = "abs";
5812       op[0] = XEXP (x, 0);
5813       break;
5814     case SQRT:
5815       fun = "sqrt";
5816       op[0] = XEXP (x, 0);
5817       break;
5818     case FFS:
5819       fun = "ffs";
5820       op[0] = XEXP (x, 0);
5821       break;
5822     case EQ:
5823       op[0] = XEXP (x, 0);
5824       st[1] = "==";
5825       op[1] = XEXP (x, 1);
5826       break;
5827     case NE:
5828       op[0] = XEXP (x, 0);
5829       st[1] = "!=";
5830       op[1] = XEXP (x, 1);
5831       break;
5832     case GT:
5833       op[0] = XEXP (x, 0);
5834       st[1] = ">";
5835       op[1] = XEXP (x, 1);
5836       break;
5837     case GTU:
5838       fun = "gtu";
5839       op[0] = XEXP (x, 0);
5840       op[1] = XEXP (x, 1);
5841       break;
5842     case LT:
5843       op[0] = XEXP (x, 0);
5844       st[1] = "<";
5845       op[1] = XEXP (x, 1);
5846       break;
5847     case LTU:
5848       fun = "ltu";
5849       op[0] = XEXP (x, 0);
5850       op[1] = XEXP (x, 1);
5851       break;
5852     case GE:
5853       op[0] = XEXP (x, 0);
5854       st[1] = ">=";
5855       op[1] = XEXP (x, 1);
5856       break;
5857     case GEU:
5858       fun = "geu";
5859       op[0] = XEXP (x, 0);
5860       op[1] = XEXP (x, 1);
5861       break;
5862     case LE:
5863       op[0] = XEXP (x, 0);
5864       st[1] = "<=";
5865       op[1] = XEXP (x, 1);
5866       break;
5867     case LEU:
5868       fun = "leu";
5869       op[0] = XEXP (x, 0);
5870       op[1] = XEXP (x, 1);
5871       break;
5872     case SIGN_EXTRACT:
5873       fun = (verbose) ? "sign_extract" : "sxt";
5874       op[0] = XEXP (x, 0);
5875       op[1] = XEXP (x, 1);
5876       op[2] = XEXP (x, 2);
5877       break;
5878     case ZERO_EXTRACT:
5879       fun = (verbose) ? "zero_extract" : "zxt";
5880       op[0] = XEXP (x, 0);
5881       op[1] = XEXP (x, 1);
5882       op[2] = XEXP (x, 2);
5883       break;
5884     case SIGN_EXTEND:
5885       fun = (verbose) ? "sign_extend" : "sxn";
5886       op[0] = XEXP (x, 0);
5887       break;
5888     case ZERO_EXTEND:
5889       fun = (verbose) ? "zero_extend" : "zxn";
5890       op[0] = XEXP (x, 0);
5891       break;
5892     case FLOAT_EXTEND:
5893       fun = (verbose) ? "float_extend" : "fxn";
5894       op[0] = XEXP (x, 0);
5895       break;
5896     case TRUNCATE:
5897       fun = (verbose) ? "trunc" : "trn";
5898       op[0] = XEXP (x, 0);
5899       break;
5900     case FLOAT_TRUNCATE:
5901       fun = (verbose) ? "float_trunc" : "ftr";
5902       op[0] = XEXP (x, 0);
5903       break;
5904     case FLOAT:
5905       fun = (verbose) ? "float" : "flt";
5906       op[0] = XEXP (x, 0);
5907       break;
5908     case UNSIGNED_FLOAT:
5909       fun = (verbose) ? "uns_float" : "ufl";
5910       op[0] = XEXP (x, 0);
5911       break;
5912     case FIX:
5913       fun = "fix";
5914       op[0] = XEXP (x, 0);
5915       break;
5916     case UNSIGNED_FIX:
5917       fun = (verbose) ? "uns_fix" : "ufx";
5918       op[0] = XEXP (x, 0);
5919       break;
5920     case PRE_DEC:
5921       st[0] = "--";
5922       op[0] = XEXP (x, 0);
5923       break;
5924     case PRE_INC:
5925       st[0] = "++";
5926       op[0] = XEXP (x, 0);
5927       break;
5928     case POST_DEC:
5929       op[0] = XEXP (x, 0);
5930       st[1] = "--";
5931       break;
5932     case POST_INC:
5933       op[0] = XEXP (x, 0);
5934       st[1] = "++";
5935       break;
5936     case CALL:
5937       st[0] = "call ";
5938       op[0] = XEXP (x, 0);
5939       if (verbose)
5940         {
5941           st[1] = " argc:";
5942           op[1] = XEXP (x, 1);
5943         }
5944       break;
5945     case IF_THEN_ELSE:
5946       st[0] = "{(";
5947       op[0] = XEXP (x, 0);
5948       st[1] = ")?";
5949       op[1] = XEXP (x, 1);
5950       st[2] = ":";
5951       op[2] = XEXP (x, 2);
5952       st[3] = "}";
5953       break;
5954     case TRAP_IF:
5955       fun = "trap_if";
5956       op[0] = TRAP_CONDITION (x);
5957       break;
5958     case UNSPEC:
5959     case UNSPEC_VOLATILE:
5960       {
5961         cur = safe_concat (buf, cur, "unspec");
5962         if (GET_CODE (x) == UNSPEC_VOLATILE)
5963           cur = safe_concat (buf, cur, "/v");
5964         cur = safe_concat (buf, cur, "[");
5965         sep = "";
5966         for (i = 0; i < XVECLEN (x, 0); i++)
5967           {
5968             print_pattern (tmp, XVECEXP (x, 0, i), verbose);
5969             cur = safe_concat (buf, cur, sep);
5970             cur = safe_concat (buf, cur, tmp);
5971             sep = ",";
5972           }
5973         cur = safe_concat (buf, cur, "] ");
5974         sprintf (tmp, "%d", XINT (x, 1));
5975         cur = safe_concat (buf, cur, tmp);
5976       }
5977       break;
5978     default:
5979       /* if (verbose) debug_rtx (x); */
5980       st[0] = GET_RTX_NAME (GET_CODE (x));
5981       break;
5982     }
5983
5984   /* Print this as a function? */
5985   if (fun)
5986     {
5987       cur = safe_concat (buf, cur, fun);
5988       cur = safe_concat (buf, cur, "(");
5989     }
5990
5991   for (i = 0; i < 4; i++)
5992     {
5993       if (st[i])
5994         cur = safe_concat (buf, cur, st[i]);
5995
5996       if (op[i])
5997         {
5998           if (fun && i != 0)
5999             cur = safe_concat (buf, cur, ",");
6000
6001           print_value (tmp, op[i], verbose);
6002           cur = safe_concat (buf, cur, tmp);
6003         }
6004     }
6005
6006   if (fun)
6007     cur = safe_concat (buf, cur, ")");
6008 }               /* print_exp */
6009
6010 /* Prints rtxes, i customly classified as values. They're constants, */
6011 /* registers, labels, symbols and memory accesses.  */
6012
6013 static void
6014 print_value (buf, x, verbose)
6015      char *buf;
6016      rtx x;
6017      int verbose;
6018 {
6019   char t[BUF_LEN];
6020   char *cur = buf;
6021
6022   switch (GET_CODE (x))
6023     {
6024     case CONST_INT:
6025       sprintf (t, "0x%lx", (long)INTVAL (x));
6026       cur = safe_concat (buf, cur, t);
6027       break;
6028     case CONST_DOUBLE:
6029       sprintf (t, "<0x%lx,0x%lx>", (long)XWINT (x, 2), (long)XWINT (x, 3));
6030       cur = safe_concat (buf, cur, t);
6031       break;
6032     case CONST_STRING:
6033       cur = safe_concat (buf, cur, "\"");
6034       cur = safe_concat (buf, cur, XSTR (x, 0));
6035       cur = safe_concat (buf, cur, "\"");
6036       break;
6037     case SYMBOL_REF:
6038       cur = safe_concat (buf, cur, "`");
6039       cur = safe_concat (buf, cur, XSTR (x, 0));
6040       cur = safe_concat (buf, cur, "'");
6041       break;
6042     case LABEL_REF:
6043       sprintf (t, "L%d", INSN_UID (XEXP (x, 0)));
6044       cur = safe_concat (buf, cur, t);
6045       break;
6046     case CONST:
6047       print_value (t, XEXP (x, 0), verbose);
6048       cur = safe_concat (buf, cur, "const(");
6049       cur = safe_concat (buf, cur, t);
6050       cur = safe_concat (buf, cur, ")");
6051       break;
6052     case HIGH:
6053       print_value (t, XEXP (x, 0), verbose);
6054       cur = safe_concat (buf, cur, "high(");
6055       cur = safe_concat (buf, cur, t);
6056       cur = safe_concat (buf, cur, ")");
6057       break;
6058     case REG:
6059       if (REGNO (x) < FIRST_PSEUDO_REGISTER)
6060         {
6061           int c = reg_names[ REGNO (x) ][0];
6062           if (c >= '0' && c <= '9')
6063             cur = safe_concat (buf, cur, "%");
6064
6065           cur = safe_concat (buf, cur, reg_names[ REGNO (x) ]);
6066         }
6067       else
6068         {
6069           sprintf (t, "r%d", REGNO (x));
6070           cur = safe_concat (buf, cur, t);
6071         }
6072       break;
6073     case SUBREG:
6074       print_value (t, SUBREG_REG (x), verbose);
6075       cur = safe_concat (buf, cur, t);
6076       sprintf (t, "#%d", SUBREG_WORD (x));
6077       cur = safe_concat (buf, cur, t);
6078       break;
6079     case SCRATCH:
6080       cur = safe_concat (buf, cur, "scratch");
6081       break;
6082     case CC0:
6083       cur = safe_concat (buf, cur, "cc0");
6084       break;
6085     case PC:
6086       cur = safe_concat (buf, cur, "pc");
6087       break;
6088     case MEM:
6089       print_value (t, XEXP (x, 0), verbose);
6090       cur = safe_concat (buf, cur, "[");
6091       cur = safe_concat (buf, cur, t);
6092       cur = safe_concat (buf, cur, "]");
6093       break;
6094     default:
6095       print_exp (t, x, verbose);
6096       cur = safe_concat (buf, cur, t);
6097       break;
6098     }
6099 }                               /* print_value */
6100
6101 /* The next step in insn detalization, its pattern recognition */
6102
6103 static void
6104 print_pattern (buf, x, verbose)
6105      char *buf;
6106      rtx x;
6107      int verbose;
6108 {
6109   char t1[BUF_LEN], t2[BUF_LEN], t3[BUF_LEN];
6110
6111   switch (GET_CODE (x))
6112     {
6113     case SET:
6114       print_value (t1, SET_DEST (x), verbose);
6115       print_value (t2, SET_SRC (x), verbose);
6116       sprintf (buf, "%s=%s", t1, t2);
6117       break;
6118     case RETURN:
6119       sprintf (buf, "return");
6120       break;
6121     case CALL:
6122       print_exp (buf, x, verbose);
6123       break;
6124     case CLOBBER:
6125       print_value (t1, XEXP (x, 0), verbose);
6126       sprintf (buf, "clobber %s", t1);
6127       break;
6128     case USE:
6129       print_value (t1, XEXP (x, 0), verbose);
6130       sprintf (buf, "use %s", t1);
6131       break;
6132     case PARALLEL:
6133       {
6134         int i;
6135
6136         sprintf (t1, "{");
6137         for (i = 0; i < XVECLEN (x, 0); i++)
6138           {
6139             print_pattern (t2, XVECEXP (x, 0, i), verbose);
6140             sprintf (t3, "%s%s;", t1, t2);
6141             strcpy (t1, t3);
6142           }
6143         sprintf (buf, "%s}", t1);
6144       }
6145       break;
6146     case SEQUENCE:
6147       {
6148         int i;
6149
6150         sprintf (t1, "%%{");
6151         for (i = 0; i < XVECLEN (x, 0); i++)
6152           {
6153             print_insn (t2, XVECEXP (x, 0, i), verbose);
6154             sprintf (t3, "%s%s;", t1, t2);
6155             strcpy (t1, t3);
6156           }
6157         sprintf (buf, "%s%%}", t1);
6158       }
6159       break;
6160     case ASM_INPUT:
6161       sprintf (buf, "asm {%s}", XSTR (x, 0));
6162       break;
6163     case ADDR_VEC:
6164       break;
6165     case ADDR_DIFF_VEC:
6166       print_value (buf, XEXP (x, 0), verbose);
6167       break;
6168     case TRAP_IF:
6169       print_value (t1, TRAP_CONDITION (x), verbose);
6170       sprintf (buf, "trap_if %s", t1);
6171       break;
6172     case UNSPEC:
6173       {
6174         int i;
6175
6176         sprintf (t1, "unspec{");
6177         for (i = 0; i < XVECLEN (x, 0); i++)
6178           {
6179             print_pattern (t2, XVECEXP (x, 0, i), verbose);
6180             sprintf (t3, "%s%s;", t1, t2);
6181             strcpy (t1, t3);
6182           }
6183         sprintf (buf, "%s}", t1);
6184       }
6185       break;
6186     case UNSPEC_VOLATILE:
6187       {
6188         int i;
6189
6190         sprintf (t1, "unspec/v{");
6191         for (i = 0; i < XVECLEN (x, 0); i++)
6192           {
6193             print_pattern (t2, XVECEXP (x, 0, i), verbose);
6194             sprintf (t3, "%s%s;", t1, t2);
6195             strcpy (t1, t3);
6196           }
6197         sprintf (buf, "%s}", t1);
6198       }
6199       break;
6200     default:
6201       print_value (buf, x, verbose);
6202     }
6203 }                               /* print_pattern */
6204
6205 /* This is the main function in rtl visualization mechanism. It
6206    accepts an rtx and tries to recognize it as an insn, then prints it
6207    properly in human readable form, resembling assembler mnemonics.  */
6208 /* For every insn it prints its UID and BB the insn belongs */
6209 /* too. (probably the last "option" should be extended somehow, since */
6210 /* it depends now on sched.c inner variables ...) */
6211
6212 static void
6213 print_insn (buf, x, verbose)
6214      char *buf;
6215      rtx x;
6216      int verbose;
6217 {
6218   char t[BUF_LEN];
6219   rtx insn = x;
6220
6221   switch (GET_CODE (x))
6222     {
6223     case INSN:
6224       print_pattern (t, PATTERN (x), verbose);
6225       if (verbose)
6226         sprintf (buf, "b%d: i% 4d: %s", INSN_BB (x),
6227                  INSN_UID (x), t);
6228       else
6229         sprintf (buf, "%-4d %s", INSN_UID (x), t);
6230       break;
6231     case JUMP_INSN:
6232       print_pattern (t, PATTERN (x), verbose);
6233       if (verbose)
6234         sprintf (buf, "b%d: i% 4d: jump %s", INSN_BB (x),
6235                  INSN_UID (x), t);
6236       else
6237         sprintf (buf, "%-4d %s", INSN_UID (x), t);
6238       break;
6239     case CALL_INSN:
6240       x = PATTERN (insn);
6241       if (GET_CODE (x) == PARALLEL)
6242         {
6243           x = XVECEXP (x, 0, 0);
6244           print_pattern (t, x, verbose);
6245         }
6246       else
6247         strcpy (t, "call <...>");
6248       if (verbose)
6249         sprintf (buf, "b%d: i% 4d: %s", INSN_BB (insn),
6250                  INSN_UID (insn), t);
6251       else
6252         sprintf (buf, "%-4d %s", INSN_UID (insn), t);
6253       break;
6254     case CODE_LABEL:
6255       sprintf (buf, "L%d:", INSN_UID (x));
6256       break;
6257     case BARRIER:
6258       sprintf (buf, "i% 4d: barrier", INSN_UID (x));
6259       break;
6260     case NOTE:
6261       if (NOTE_LINE_NUMBER (x) > 0)
6262         sprintf (buf, "%4d note \"%s\" %d", INSN_UID (x),
6263                  NOTE_SOURCE_FILE (x), NOTE_LINE_NUMBER (x));
6264       else
6265         sprintf (buf, "%4d %s", INSN_UID (x),
6266                  GET_NOTE_INSN_NAME (NOTE_LINE_NUMBER (x)));
6267       break;
6268     default:
6269       if (verbose)
6270         {
6271           sprintf (buf, "Not an INSN at all\n");
6272           debug_rtx (x);
6273         }
6274       else
6275         sprintf (buf, "i%-4d  <What?>", INSN_UID (x));
6276     }
6277 }                               /* print_insn */
6278
6279 /* Print visualization debugging info */
6280
6281 static void
6282 print_block_visualization (b, s)
6283      int b;
6284      char *s;
6285 {
6286   int unit, i;
6287
6288   /* print header */
6289   fprintf (dump, "\n;;   ==================== scheduling visualization for block %d %s \n", b, s);
6290
6291   /* Print names of units */
6292   fprintf (dump, ";;   %-8s", "clock");
6293   for (unit = 0; unit < FUNCTION_UNITS_SIZE; unit++)
6294     if (function_units[unit].bitmask & target_units)
6295       for (i = 0; i < function_units[unit].multiplicity; i++)
6296         fprintf (dump, "  %-33s", function_units[unit].name);
6297   fprintf (dump, "  %-8s\n", "no-unit");
6298
6299   fprintf (dump, ";;   %-8s", "=====");
6300   for (unit = 0; unit < FUNCTION_UNITS_SIZE; unit++)
6301     if (function_units[unit].bitmask & target_units)
6302       for (i = 0; i < function_units[unit].multiplicity; i++)
6303         fprintf (dump, "  %-33s", "==============================");
6304   fprintf (dump, "  %-8s\n", "=======");
6305
6306   /* Print insns in each cycle */
6307   fprintf (dump, "%s\n", visual_tbl);
6308 }
6309
6310 /* Print insns in the 'no_unit' column of visualization */
6311
6312 static void
6313 visualize_no_unit (insn)
6314      rtx insn;
6315 {
6316   vis_no_unit[n_vis_no_unit] = insn;
6317   n_vis_no_unit++;
6318 }
6319
6320 /* Print insns scheduled in clock, for visualization.  */
6321
6322 static void
6323 visualize_scheduled_insns (b, clock)
6324      int b, clock;
6325 {
6326   int i, unit;
6327
6328   /* if no more room, split table into two */
6329   if (n_visual_lines >= MAX_VISUAL_LINES)
6330     {
6331       print_block_visualization (b, "(incomplete)");
6332       init_block_visualization ();
6333     }
6334
6335   n_visual_lines++;
6336
6337   sprintf (visual_tbl + strlen (visual_tbl), ";;   %-8d", clock);
6338   for (unit = 0; unit < FUNCTION_UNITS_SIZE; unit++)
6339     if (function_units[unit].bitmask & target_units)
6340       for (i = 0; i < function_units[unit].multiplicity; i++)
6341         {
6342           int instance = unit + i * FUNCTION_UNITS_SIZE;
6343           rtx insn = unit_last_insn[instance];
6344
6345           /* print insns that still keep the unit busy */
6346           if (insn &&
6347               actual_hazard_this_instance (unit, instance, insn, clock, 0))
6348             {
6349               char str[BUF_LEN];
6350               print_insn (str, insn, 0);
6351               str[INSN_LEN] = '\0';
6352               sprintf (visual_tbl + strlen (visual_tbl), "  %-33s", str);
6353             }
6354           else
6355             sprintf (visual_tbl + strlen (visual_tbl), "  %-33s", "------------------------------");
6356         }
6357
6358   /* print insns that are not assigned to any unit */
6359   for (i = 0; i < n_vis_no_unit; i++)
6360     sprintf (visual_tbl + strlen (visual_tbl), "  %-8d",
6361              INSN_UID (vis_no_unit[i]));
6362   n_vis_no_unit = 0;
6363
6364   sprintf (visual_tbl + strlen (visual_tbl), "\n");
6365 }
6366
6367 /* Print stalled cycles */
6368
6369 static void
6370 visualize_stall_cycles (b, stalls)
6371      int b, stalls;
6372 {
6373   int i;
6374
6375   /* if no more room, split table into two */
6376   if (n_visual_lines >= MAX_VISUAL_LINES)
6377     {
6378       print_block_visualization (b, "(incomplete)");
6379       init_block_visualization ();
6380     }
6381
6382   n_visual_lines++;
6383
6384   sprintf (visual_tbl + strlen (visual_tbl), ";;       ");
6385   for (i = 0; i < stalls; i++)
6386     sprintf (visual_tbl + strlen (visual_tbl), ".");
6387   sprintf (visual_tbl + strlen (visual_tbl), "\n");
6388 }
6389
6390 /* move_insn1: Remove INSN from insn chain, and link it after LAST insn */
6391
6392 static rtx
6393 move_insn1 (insn, last)
6394      rtx insn, last;
6395 {
6396   NEXT_INSN (PREV_INSN (insn)) = NEXT_INSN (insn);
6397   PREV_INSN (NEXT_INSN (insn)) = PREV_INSN (insn);
6398
6399   NEXT_INSN (insn) = NEXT_INSN (last);
6400   PREV_INSN (NEXT_INSN (last)) = insn;
6401
6402   NEXT_INSN (last) = insn;
6403   PREV_INSN (insn) = last;
6404
6405   return insn;
6406 }
6407
6408 /* Search INSN for fake REG_DEAD note pairs for NOTE_INSN_SETJMP,
6409    NOTE_INSN_{LOOP,EHREGION}_{BEG,END}; and convert them back into
6410    NOTEs.  The REG_DEAD note following first one is contains the saved
6411    value for NOTE_BLOCK_NUMBER which is useful for
6412    NOTE_INSN_EH_REGION_{BEG,END} NOTEs.  LAST is the last instruction
6413    output by the instruction scheduler.  Return the new value of LAST.  */
6414
6415 static rtx
6416 reemit_notes (insn, last)
6417      rtx insn;
6418      rtx last;
6419 {
6420   rtx note, retval;
6421
6422   retval = last;
6423   for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
6424     {
6425       if (REG_NOTE_KIND (note) == REG_DEAD
6426           && GET_CODE (XEXP (note, 0)) == CONST_INT)
6427         {
6428           if (INTVAL (XEXP (note, 0)) == NOTE_INSN_SETJMP)
6429             {
6430               retval = emit_note_after (INTVAL (XEXP (note, 0)), insn);
6431               CONST_CALL_P (retval) = CONST_CALL_P (note);
6432               remove_note (insn, note);
6433               note = XEXP (note, 1);
6434             }
6435           else
6436             {
6437               last = emit_note_before (INTVAL (XEXP (note, 0)), last);
6438               remove_note (insn, note);
6439               note = XEXP (note, 1);
6440               NOTE_BLOCK_NUMBER (last) = INTVAL (XEXP (note, 0));
6441             }
6442           remove_note (insn, note);
6443         }
6444     }
6445   return retval;
6446 }
6447
6448 /* Move INSN, and all insns which should be issued before it,
6449    due to SCHED_GROUP_P flag.  Reemit notes if needed.
6450
6451    Return the last insn emitted by the scheduler, which is the
6452    return value from the first call to reemit_notes.  */
6453
6454 static rtx
6455 move_insn (insn, last)
6456      rtx insn, last;
6457 {
6458   rtx retval = NULL;
6459
6460   /* If INSN has SCHED_GROUP_P set, then issue it and any other
6461      insns with SCHED_GROUP_P set first.  */
6462   while (SCHED_GROUP_P (insn))
6463     {
6464       rtx prev = PREV_INSN (insn);
6465
6466       /* Move a SCHED_GROUP_P insn.  */
6467       move_insn1 (insn, last);
6468       /* If this is the first call to reemit_notes, then record
6469          its return value.  */
6470       if (retval == NULL_RTX)
6471         retval = reemit_notes (insn, insn);
6472       else
6473         reemit_notes (insn, insn);
6474       insn = prev;
6475     }
6476
6477   /* Now move the first non SCHED_GROUP_P insn.  */
6478   move_insn1 (insn, last);
6479
6480   /* If this is the first call to reemit_notes, then record
6481      its return value.  */
6482   if (retval == NULL_RTX)
6483     retval = reemit_notes (insn, insn);
6484   else
6485     reemit_notes (insn, insn);
6486
6487   return retval;
6488 }
6489
6490 /* Return an insn which represents a SCHED_GROUP, which is
6491    the last insn in the group.  */
6492
6493 static rtx
6494 group_leader (insn)
6495      rtx insn;
6496 {
6497   rtx prev;
6498
6499   do
6500     {
6501       prev = insn;
6502       insn = next_nonnote_insn (insn);
6503     }
6504   while (insn && SCHED_GROUP_P (insn) && (GET_CODE (insn) != CODE_LABEL));
6505
6506   return prev;
6507 }
6508
6509 /* Use forward list scheduling to rearrange insns of block BB in region RGN,
6510    possibly bringing insns from subsequent blocks in the same region.
6511    Return number of insns scheduled.  */
6512
6513 static int
6514 schedule_block (bb, rgn_n_insns)
6515      int bb;
6516      int rgn_n_insns;
6517 {
6518   /* Local variables.  */
6519   rtx insn, last;
6520   rtx *ready;
6521   int i;
6522   int n_ready = 0;
6523   int can_issue_more;
6524
6525   /* flow block of this bb */
6526   int b = BB_TO_BLOCK (bb);
6527
6528   /* target_n_insns == number of insns in b before scheduling starts.
6529      sched_target_n_insns == how many of b's insns were scheduled.
6530      sched_n_insns == how many insns were scheduled in b */
6531   int target_n_insns = 0;
6532   int sched_target_n_insns = 0;
6533   int sched_n_insns = 0;
6534
6535 #define NEED_NOTHING    0
6536 #define NEED_HEAD       1
6537 #define NEED_TAIL       2
6538   int new_needs;
6539
6540   /* head/tail info for this block */
6541   rtx prev_head;
6542   rtx next_tail;
6543   rtx head;
6544   rtx tail;
6545   int bb_src;
6546
6547   /* We used to have code to avoid getting parameters moved from hard
6548      argument registers into pseudos.
6549
6550      However, it was removed when it proved to be of marginal benefit
6551      and caused problems because schedule_block and compute_forward_dependences
6552      had different notions of what the "head" insn was.  */
6553   get_block_head_tail (bb, &head, &tail);
6554
6555   /* Interblock scheduling could have moved the original head insn from this
6556      block into a proceeding block.  This may also cause schedule_block and
6557      compute_forward_dependences to have different notions of what the
6558      "head" insn was.
6559
6560      If the interblock movement happened to make this block start with
6561      some notes (LOOP, EH or SETJMP) before the first real insn, then
6562      HEAD will have various special notes attached to it which must be
6563      removed so that we don't end up with extra copies of the notes.  */
6564   if (GET_RTX_CLASS (GET_CODE (head)) == 'i')
6565     {
6566       rtx note;
6567
6568       for (note = REG_NOTES (head); note; note = XEXP (note, 1))
6569         if (REG_NOTE_KIND (note) == REG_DEAD
6570             && GET_CODE (XEXP (note, 0)) == CONST_INT)
6571           remove_note (head, note);
6572     }
6573
6574   next_tail = NEXT_INSN (tail);
6575   prev_head = PREV_INSN (head);
6576
6577   /* If the only insn left is a NOTE or a CODE_LABEL, then there is no need
6578      to schedule this block.  */
6579   if (head == tail
6580       && (GET_RTX_CLASS (GET_CODE (head)) != 'i'))
6581     return (sched_n_insns);
6582
6583   /* debug info */
6584   if (sched_verbose)
6585     {
6586       fprintf (dump, ";;   ======================================================\n");
6587       fprintf (dump,
6588                ";;   -- basic block %d from %d to %d -- %s reload\n",
6589                b, INSN_UID (basic_block_head[b]),
6590                INSN_UID (basic_block_end[b]),
6591                (reload_completed ? "after" : "before"));
6592       fprintf (dump, ";;   ======================================================\n");
6593       fprintf (dump, "\n");
6594
6595       visual_tbl = (char *) alloca (get_visual_tbl_length ());
6596       init_block_visualization ();
6597     }
6598
6599   /* remove remaining note insns from the block, save them in
6600      note_list.  These notes are restored at the end of
6601      schedule_block ().  */
6602   note_list = 0;
6603   rm_other_notes (head, tail);
6604
6605   target_bb = bb;
6606
6607   /* prepare current target block info */
6608   if (current_nr_blocks > 1)
6609     {
6610       candidate_table = (candidate *) alloca (current_nr_blocks * sizeof (candidate));
6611
6612       bblst_last = 0;
6613       /* ??? It is not clear why bblst_size is computed this way.  The original
6614          number was clearly too small as it resulted in compiler failures.
6615          Multiplying by the original number by 2 (to account for update_bbs
6616          members) seems to be a reasonable solution.  */
6617       /* ??? Or perhaps there is a bug somewhere else in this file?  */
6618       bblst_size = (current_nr_blocks - bb) * rgn_nr_edges * 2;
6619       bblst_table = (int *) alloca (bblst_size * sizeof (int));
6620
6621       bitlst_table_last = 0;
6622       bitlst_table_size = rgn_nr_edges;
6623       bitlst_table = (int *) alloca (rgn_nr_edges * sizeof (int));
6624
6625       compute_trg_info (bb);
6626     }
6627
6628   clear_units ();
6629
6630   /* Allocate the ready list */
6631   ready = (rtx *) alloca ((rgn_n_insns + 1) * sizeof (rtx));
6632
6633   /* Print debugging information.  */
6634   if (sched_verbose >= 5)
6635     debug_dependencies ();
6636
6637
6638   /* Initialize ready list with all 'ready' insns in target block.
6639      Count number of insns in the target block being scheduled.  */
6640   n_ready = 0;
6641   for (insn = head; insn != next_tail; insn = NEXT_INSN (insn))
6642     {
6643       rtx next;
6644
6645       if (GET_RTX_CLASS (GET_CODE (insn)) != 'i')
6646         continue;
6647       next = NEXT_INSN (insn);
6648
6649       if (INSN_DEP_COUNT (insn) == 0
6650           && (SCHED_GROUP_P (next) == 0 || GET_RTX_CLASS (GET_CODE (next)) != 'i'))
6651         ready[n_ready++] = insn;
6652       if (!(SCHED_GROUP_P (insn)))
6653         target_n_insns++;
6654     }
6655
6656   /* Add to ready list all 'ready' insns in valid source blocks.
6657      For speculative insns, check-live, exception-free, and
6658      issue-delay.  */
6659   for (bb_src = bb + 1; bb_src < current_nr_blocks; bb_src++)
6660     if (IS_VALID (bb_src))
6661       {
6662         rtx src_head;
6663         rtx src_next_tail;
6664         rtx tail, head;
6665
6666         get_block_head_tail (bb_src, &head, &tail);
6667         src_next_tail = NEXT_INSN (tail);
6668         src_head = head;
6669
6670         if (head == tail
6671             && (GET_RTX_CLASS (GET_CODE (head)) != 'i'))
6672           continue;
6673
6674         for (insn = src_head; insn != src_next_tail; insn = NEXT_INSN (insn))
6675           {
6676             if (GET_RTX_CLASS (GET_CODE (insn)) != 'i')
6677               continue;
6678
6679             if (!CANT_MOVE (insn)
6680                 && (!IS_SPECULATIVE_INSN (insn)
6681                     || (insn_issue_delay (insn) <= 3
6682                         && check_live (insn, bb_src)
6683                         && is_exception_free (insn, bb_src, target_bb))))
6684
6685               {
6686                 rtx next;
6687
6688                 next = NEXT_INSN (insn);
6689                 if (INSN_DEP_COUNT (insn) == 0
6690                     && (SCHED_GROUP_P (next) == 0
6691                         || GET_RTX_CLASS (GET_CODE (next)) != 'i'))
6692                   ready[n_ready++] = insn;
6693               }
6694           }
6695       }
6696
6697 #ifdef MD_SCHED_INIT
6698   MD_SCHED_INIT (dump, sched_verbose);
6699 #endif
6700
6701   /* no insns scheduled in this block yet */
6702   last_scheduled_insn = 0;
6703
6704   /* Sort the ready list */
6705   SCHED_SORT (ready, n_ready);
6706 #ifdef MD_SCHED_REORDER
6707   MD_SCHED_REORDER (dump, sched_verbose, ready, n_ready);
6708 #endif
6709
6710   if (sched_verbose >= 2)
6711     {
6712       fprintf (dump, ";;\t\tReady list initially:             ");
6713       debug_ready_list (ready, n_ready);
6714     }
6715
6716   /* Q_SIZE is the total number of insns in the queue.  */
6717   q_ptr = 0;
6718   q_size = 0;
6719   clock_var = 0;
6720   bzero ((char *) insn_queue, sizeof (insn_queue));
6721
6722   /* We start inserting insns after PREV_HEAD.  */
6723   last = prev_head;
6724
6725   /* Initialize INSN_QUEUE, LIST and NEW_NEEDS.  */
6726   new_needs = (NEXT_INSN (prev_head) == basic_block_head[b]
6727                ? NEED_HEAD : NEED_NOTHING);
6728   if (PREV_INSN (next_tail) == basic_block_end[b])
6729     new_needs |= NEED_TAIL;
6730
6731   /* loop until all the insns in BB are scheduled.  */
6732   while (sched_target_n_insns < target_n_insns)
6733     {
6734       int b1;
6735
6736       clock_var++;
6737
6738       /* Add to the ready list all pending insns that can be issued now.
6739          If there are no ready insns, increment clock until one
6740          is ready and add all pending insns at that point to the ready
6741          list.  */
6742       n_ready = queue_to_ready (ready, n_ready);
6743
6744       if (n_ready == 0)
6745         abort ();
6746
6747       if (sched_verbose >= 2)
6748         {
6749           fprintf (dump, ";;\t\tReady list after queue_to_ready:  ");
6750           debug_ready_list (ready, n_ready);
6751         }
6752
6753       /* Sort the ready list.  */
6754       SCHED_SORT (ready, n_ready);
6755 #ifdef MD_SCHED_REORDER
6756       MD_SCHED_REORDER (dump, sched_verbose, ready, n_ready);
6757 #endif
6758
6759       if (sched_verbose)
6760         {
6761           fprintf (dump, "\n;;\tReady list (t =%3d):  ", clock_var);
6762           debug_ready_list (ready, n_ready);
6763         }
6764
6765       /* Issue insns from ready list.
6766          It is important to count down from n_ready, because n_ready may change
6767          as insns are issued.  */
6768       can_issue_more = issue_rate;
6769       for (i = n_ready - 1; i >= 0 && can_issue_more; i--)
6770         {
6771           rtx insn = ready[i];
6772           int cost = actual_hazard (insn_unit (insn), insn, clock_var, 0);
6773
6774           if (cost > 1)
6775             {
6776               queue_insn (insn, cost);
6777               ready[i] = ready[--n_ready];      /* remove insn from ready list */
6778             }
6779           else if (cost == 0)
6780             {
6781               /* an interblock motion? */
6782               if (INSN_BB (insn) != target_bb)
6783                 {
6784                   rtx temp;
6785
6786                   if (IS_SPECULATIVE_INSN (insn))
6787                     {
6788
6789                       if (!check_live (insn, INSN_BB (insn)))
6790                         {
6791                           /* speculative motion, live check failed, remove
6792                              insn from ready list */
6793                           ready[i] = ready[--n_ready];
6794                           continue;
6795                         }
6796                       update_live (insn, INSN_BB (insn));
6797
6798                       /* for speculative load, mark insns fed by it.  */
6799                       if (IS_LOAD_INSN (insn) || FED_BY_SPEC_LOAD (insn))
6800                         set_spec_fed (insn);
6801
6802                       nr_spec++;
6803                     }
6804                   nr_inter++;
6805
6806                   temp = insn;
6807                   while (SCHED_GROUP_P (temp))
6808                     temp = PREV_INSN (temp);
6809
6810                   /* Update source block boundaries.   */
6811                   b1 = INSN_BLOCK (temp);
6812                   if (temp == basic_block_head[b1]
6813                       && insn == basic_block_end[b1])
6814                     {
6815                       /* We moved all the insns in the basic block.
6816                          Emit a note after the last insn and update the
6817                          begin/end boundaries to point to the note.  */
6818                       emit_note_after (NOTE_INSN_DELETED, insn);
6819                       basic_block_end[b1] = NEXT_INSN (insn);
6820                       basic_block_head[b1] = NEXT_INSN (insn);
6821                     }
6822                   else if (insn == basic_block_end[b1])
6823                     {
6824                       /* We took insns from the end of the basic block,
6825                          so update the end of block boundary so that it
6826                          points to the first insn we did not move.  */
6827                       basic_block_end[b1] = PREV_INSN (temp);
6828                     }
6829                   else if (temp == basic_block_head[b1])
6830                     {
6831                       /* We took insns from the start of the basic block,
6832                          so update the start of block boundary so that
6833                          it points to the first insn we did not move.  */
6834                       basic_block_head[b1] = NEXT_INSN (insn);
6835                     }
6836                 }
6837               else
6838                 {
6839                   /* in block motion */
6840                   sched_target_n_insns++;
6841                 }
6842
6843               last_scheduled_insn = insn;
6844               last = move_insn (insn, last);
6845               sched_n_insns++;
6846
6847 #ifdef MD_SCHED_VARIABLE_ISSUE
6848               MD_SCHED_VARIABLE_ISSUE (dump, sched_verbose, insn, can_issue_more);
6849 #else
6850               can_issue_more--;
6851 #endif
6852
6853               n_ready = schedule_insn (insn, ready, n_ready, clock_var);
6854
6855               /* remove insn from ready list */
6856               ready[i] = ready[--n_ready];
6857
6858               /* close this block after scheduling its jump */
6859               if (GET_CODE (last_scheduled_insn) == JUMP_INSN)
6860                 break;
6861             }
6862         }
6863
6864       /* debug info */
6865       if (sched_verbose)
6866         {
6867           visualize_scheduled_insns (b, clock_var);
6868         }
6869     }
6870
6871   /* debug info */
6872   if (sched_verbose)
6873     {
6874       fprintf (dump, ";;\tReady list (final):  ");
6875       debug_ready_list (ready, n_ready);
6876       print_block_visualization (b, "");
6877     }
6878
6879   /* Sanity check -- queue must be empty now.  Meaningless if region has
6880      multiple bbs.  */
6881   if (current_nr_blocks > 1)
6882     if (!flag_schedule_interblock && q_size != 0)
6883       abort ();
6884
6885   /* update head/tail boundaries.  */
6886   head = NEXT_INSN (prev_head);
6887   tail = last;
6888
6889   /* Restore-other-notes: NOTE_LIST is the end of a chain of notes
6890      previously found among the insns.  Insert them at the beginning
6891      of the insns.  */
6892   if (note_list != 0)
6893     {
6894       rtx note_head = note_list;
6895
6896       while (PREV_INSN (note_head))
6897         {
6898           note_head = PREV_INSN (note_head);
6899         }
6900
6901       PREV_INSN (note_head) = PREV_INSN (head);
6902       NEXT_INSN (PREV_INSN (head)) = note_head;
6903       PREV_INSN (head) = note_list;
6904       NEXT_INSN (note_list) = head;
6905       head = note_head;
6906     }
6907
6908   /* update target block boundaries.  */
6909   if (new_needs & NEED_HEAD)
6910     basic_block_head[b] = head;
6911
6912   if (new_needs & NEED_TAIL)
6913     basic_block_end[b] = tail;
6914
6915   /* debugging */
6916   if (sched_verbose)
6917     {
6918       fprintf (dump, ";;   total time = %d\n;;   new basic block head = %d\n",
6919                clock_var, INSN_UID (basic_block_head[b]));
6920       fprintf (dump, ";;   new basic block end = %d\n\n",
6921                INSN_UID (basic_block_end[b]));
6922     }
6923
6924   return (sched_n_insns);
6925 }                               /* schedule_block () */
6926 \f
6927
6928 /* print the bit-set of registers, S.  callable from debugger */
6929
6930 extern void
6931 debug_reg_vector (s)
6932      regset s;
6933 {
6934   int regno;
6935
6936   EXECUTE_IF_SET_IN_REG_SET (s, 0, regno,
6937                              {
6938                                fprintf (dump, " %d", regno);
6939                              });
6940
6941   fprintf (dump, "\n");
6942 }
6943
6944 /* Use the backward dependences from LOG_LINKS to build
6945    forward dependences in INSN_DEPEND.  */
6946
6947 static void
6948 compute_block_forward_dependences (bb)
6949      int bb;
6950 {
6951   rtx insn, link;
6952   rtx tail, head;
6953   rtx next_tail;
6954   enum reg_note dep_type;
6955
6956   get_block_head_tail (bb, &head, &tail);
6957   next_tail = NEXT_INSN (tail);
6958   for (insn = head; insn != next_tail; insn = NEXT_INSN (insn))
6959     {
6960       if (GET_RTX_CLASS (GET_CODE (insn)) != 'i')
6961         continue;
6962
6963       insn = group_leader (insn);
6964
6965       for (link = LOG_LINKS (insn); link; link = XEXP (link, 1))
6966         {
6967           rtx x = group_leader (XEXP (link, 0));
6968           rtx new_link;
6969
6970           if (x != XEXP (link, 0))
6971             continue;
6972
6973           /* Ignore dependences upon deleted insn */
6974           if (GET_CODE (x) == NOTE || INSN_DELETED_P (x))
6975             continue;
6976           if (find_insn_list (insn, INSN_DEPEND (x)))
6977             continue;
6978
6979           new_link = alloc_INSN_LIST (insn, INSN_DEPEND (x));
6980
6981           dep_type = REG_NOTE_KIND (link);
6982           PUT_REG_NOTE_KIND (new_link, dep_type);
6983
6984           INSN_DEPEND (x) = new_link;
6985           INSN_DEP_COUNT (insn) += 1;
6986         }
6987     }
6988 }
6989
6990 /* Initialize variables for region data dependence analysis.
6991    n_bbs is the number of region blocks */
6992
6993 __inline static void
6994 init_rgn_data_dependences (n_bbs)
6995      int n_bbs;
6996 {
6997   int bb;
6998
6999   /* variables for which one copy exists for each block */
7000   bzero ((char *) bb_pending_read_insns, n_bbs * sizeof (rtx));
7001   bzero ((char *) bb_pending_read_mems, n_bbs * sizeof (rtx));
7002   bzero ((char *) bb_pending_write_insns, n_bbs * sizeof (rtx));
7003   bzero ((char *) bb_pending_write_mems, n_bbs * sizeof (rtx));
7004   bzero ((char *) bb_pending_lists_length, n_bbs * sizeof (rtx));
7005   bzero ((char *) bb_last_pending_memory_flush, n_bbs * sizeof (rtx));
7006   bzero ((char *) bb_last_function_call, n_bbs * sizeof (rtx));
7007   bzero ((char *) bb_sched_before_next_call, n_bbs * sizeof (rtx));
7008
7009   /* Create an insn here so that we can hang dependencies off of it later.  */
7010   for (bb = 0; bb < n_bbs; bb++)
7011     {
7012       bb_sched_before_next_call[bb] =
7013         gen_rtx_INSN (VOIDmode, 0, NULL_RTX, NULL_RTX,
7014                       NULL_RTX, 0, NULL_RTX, NULL_RTX);
7015       LOG_LINKS (bb_sched_before_next_call[bb]) = 0;
7016     }
7017 }
7018
7019 /* Add dependences so that branches are scheduled to run last in their block */
7020
7021 static void
7022 add_branch_dependences (head, tail)
7023      rtx head, tail;
7024 {
7025
7026   rtx insn, last;
7027
7028   /* For all branches, calls, uses, and cc0 setters, force them to remain
7029      in order at the end of the block by adding dependencies and giving
7030      the last a high priority.  There may be notes present, and prev_head
7031      may also be a note.
7032
7033      Branches must obviously remain at the end.  Calls should remain at the
7034      end since moving them results in worse register allocation.  Uses remain
7035      at the end to ensure proper register allocation.  cc0 setters remaim
7036      at the end because they can't be moved away from their cc0 user.  */
7037   insn = tail;
7038   last = 0;
7039   while (GET_CODE (insn) == CALL_INSN || GET_CODE (insn) == JUMP_INSN
7040          || (GET_CODE (insn) == INSN
7041              && (GET_CODE (PATTERN (insn)) == USE
7042 #ifdef HAVE_cc0
7043                  || sets_cc0_p (PATTERN (insn))
7044 #endif
7045              ))
7046          || GET_CODE (insn) == NOTE)
7047     {
7048       if (GET_CODE (insn) != NOTE)
7049         {
7050           if (last != 0
7051               && !find_insn_list (insn, LOG_LINKS (last)))
7052             {
7053               add_dependence (last, insn, REG_DEP_ANTI);
7054               INSN_REF_COUNT (insn)++;
7055             }
7056
7057           CANT_MOVE (insn) = 1;
7058
7059           last = insn;
7060           /* Skip over insns that are part of a group.
7061              Make each insn explicitly depend on the previous insn.
7062              This ensures that only the group header will ever enter
7063              the ready queue (and, when scheduled, will automatically
7064              schedule the SCHED_GROUP_P block).  */
7065           while (SCHED_GROUP_P (insn))
7066             {
7067               rtx temp = prev_nonnote_insn (insn);
7068               add_dependence (insn, temp, REG_DEP_ANTI);
7069               insn = temp;
7070             }
7071         }
7072
7073       /* Don't overrun the bounds of the basic block.  */
7074       if (insn == head)
7075         break;
7076
7077       insn = PREV_INSN (insn);
7078     }
7079
7080   /* make sure these insns are scheduled last in their block */
7081   insn = last;
7082   if (insn != 0)
7083     while (insn != head)
7084       {
7085         insn = prev_nonnote_insn (insn);
7086
7087         if (INSN_REF_COUNT (insn) != 0)
7088           continue;
7089
7090         if (!find_insn_list (last, LOG_LINKS (insn)))
7091           add_dependence (last, insn, REG_DEP_ANTI);
7092         INSN_REF_COUNT (insn) = 1;
7093
7094         /* Skip over insns that are part of a group.  */
7095         while (SCHED_GROUP_P (insn))
7096           insn = prev_nonnote_insn (insn);
7097       }
7098 }
7099
7100 /* Compute bacward dependences inside BB.  In a multiple blocks region:
7101    (1) a bb is analyzed after its predecessors, and (2) the lists in
7102    effect at the end of bb (after analyzing for bb) are inherited by
7103    bb's successrs.
7104
7105    Specifically for reg-reg data dependences, the block insns are
7106    scanned by sched_analyze () top-to-bottom.  Two lists are
7107    naintained by sched_analyze (): reg_last_defs[] for register DEFs,
7108    and reg_last_uses[] for register USEs.
7109
7110    When analysis is completed for bb, we update for its successors:
7111    ;  - DEFS[succ] = Union (DEFS [succ], DEFS [bb])
7112    ;  - USES[succ] = Union (USES [succ], DEFS [bb])
7113
7114    The mechanism for computing mem-mem data dependence is very
7115    similar, and the result is interblock dependences in the region.  */
7116
7117 static void
7118 compute_block_backward_dependences (bb)
7119      int bb;
7120 {
7121   int b;
7122   rtx x;
7123   rtx head, tail;
7124   int max_reg = max_reg_num ();
7125
7126   b = BB_TO_BLOCK (bb);
7127
7128   if (current_nr_blocks == 1)
7129     {
7130       reg_last_uses = (rtx *) alloca (max_reg * sizeof (rtx));
7131       reg_last_sets = (rtx *) alloca (max_reg * sizeof (rtx));
7132
7133       bzero ((char *) reg_last_uses, max_reg * sizeof (rtx));
7134       bzero ((char *) reg_last_sets, max_reg * sizeof (rtx));
7135
7136       pending_read_insns = 0;
7137       pending_read_mems = 0;
7138       pending_write_insns = 0;
7139       pending_write_mems = 0;
7140       pending_lists_length = 0;
7141       last_function_call = 0;
7142       last_pending_memory_flush = 0;
7143       sched_before_next_call
7144         = gen_rtx_INSN (VOIDmode, 0, NULL_RTX, NULL_RTX,
7145                         NULL_RTX, 0, NULL_RTX, NULL_RTX);
7146       LOG_LINKS (sched_before_next_call) = 0;
7147     }
7148   else
7149     {
7150       reg_last_uses = bb_reg_last_uses[bb];
7151       reg_last_sets = bb_reg_last_sets[bb];
7152
7153       pending_read_insns = bb_pending_read_insns[bb];
7154       pending_read_mems = bb_pending_read_mems[bb];
7155       pending_write_insns = bb_pending_write_insns[bb];
7156       pending_write_mems = bb_pending_write_mems[bb];
7157       pending_lists_length = bb_pending_lists_length[bb];
7158       last_function_call = bb_last_function_call[bb];
7159       last_pending_memory_flush = bb_last_pending_memory_flush[bb];
7160
7161       sched_before_next_call = bb_sched_before_next_call[bb];
7162     }
7163
7164   /* do the analysis for this block */
7165   get_block_head_tail (bb, &head, &tail);
7166   sched_analyze (head, tail);
7167   add_branch_dependences (head, tail);
7168
7169   if (current_nr_blocks > 1)
7170     {
7171       int e, first_edge;
7172       int b_succ, bb_succ;
7173       int reg;
7174       rtx link_insn, link_mem;
7175       rtx u;
7176
7177       /* these lists should point to the right place, for correct freeing later.  */
7178       bb_pending_read_insns[bb] = pending_read_insns;
7179       bb_pending_read_mems[bb] = pending_read_mems;
7180       bb_pending_write_insns[bb] = pending_write_insns;
7181       bb_pending_write_mems[bb] = pending_write_mems;
7182
7183       /* bb's structures are inherited by it's successors */
7184       first_edge = e = OUT_EDGES (b);
7185       if (e > 0)
7186         do
7187           {
7188             b_succ = TO_BLOCK (e);
7189             bb_succ = BLOCK_TO_BB (b_succ);
7190
7191             /* only bbs "below" bb, in the same region, are interesting */
7192             if (CONTAINING_RGN (b) != CONTAINING_RGN (b_succ)
7193                 || bb_succ <= bb)
7194               {
7195                 e = NEXT_OUT (e);
7196                 continue;
7197               }
7198
7199             for (reg = 0; reg < max_reg; reg++)
7200               {
7201
7202                 /* reg-last-uses lists are inherited by bb_succ */
7203                 for (u = reg_last_uses[reg]; u; u = XEXP (u, 1))
7204                   {
7205                     if (find_insn_list (XEXP (u, 0), (bb_reg_last_uses[bb_succ])[reg]))
7206                       continue;
7207
7208                     (bb_reg_last_uses[bb_succ])[reg]
7209                       = alloc_INSN_LIST (XEXP (u, 0),
7210                                          (bb_reg_last_uses[bb_succ])[reg]);
7211                   }
7212
7213                 /* reg-last-defs lists are inherited by bb_succ */
7214                 for (u = reg_last_sets[reg]; u; u = XEXP (u, 1))
7215                   {
7216                     if (find_insn_list (XEXP (u, 0), (bb_reg_last_sets[bb_succ])[reg]))
7217                       continue;
7218
7219                     (bb_reg_last_sets[bb_succ])[reg]
7220                       = alloc_INSN_LIST (XEXP (u, 0),
7221                                          (bb_reg_last_sets[bb_succ])[reg]);
7222                   }
7223               }
7224
7225             /* mem read/write lists are inherited by bb_succ */
7226             link_insn = pending_read_insns;
7227             link_mem = pending_read_mems;
7228             while (link_insn)
7229               {
7230                 if (!(find_insn_mem_list (XEXP (link_insn, 0), XEXP (link_mem, 0),
7231                                           bb_pending_read_insns[bb_succ],
7232                                           bb_pending_read_mems[bb_succ])))
7233                   add_insn_mem_dependence (&bb_pending_read_insns[bb_succ],
7234                                            &bb_pending_read_mems[bb_succ],
7235                                    XEXP (link_insn, 0), XEXP (link_mem, 0));
7236                 link_insn = XEXP (link_insn, 1);
7237                 link_mem = XEXP (link_mem, 1);
7238               }
7239
7240             link_insn = pending_write_insns;
7241             link_mem = pending_write_mems;
7242             while (link_insn)
7243               {
7244                 if (!(find_insn_mem_list (XEXP (link_insn, 0), XEXP (link_mem, 0),
7245                                           bb_pending_write_insns[bb_succ],
7246                                           bb_pending_write_mems[bb_succ])))
7247                   add_insn_mem_dependence (&bb_pending_write_insns[bb_succ],
7248                                            &bb_pending_write_mems[bb_succ],
7249                                    XEXP (link_insn, 0), XEXP (link_mem, 0));
7250
7251                 link_insn = XEXP (link_insn, 1);
7252                 link_mem = XEXP (link_mem, 1);
7253               }
7254
7255             /* last_function_call is inherited by bb_succ */
7256             for (u = last_function_call; u; u = XEXP (u, 1))
7257               {
7258                 if (find_insn_list (XEXP (u, 0), bb_last_function_call[bb_succ]))
7259                   continue;
7260
7261                 bb_last_function_call[bb_succ]
7262                   = alloc_INSN_LIST (XEXP (u, 0),
7263                                      bb_last_function_call[bb_succ]);
7264               }
7265
7266             /* last_pending_memory_flush is inherited by bb_succ */
7267             for (u = last_pending_memory_flush; u; u = XEXP (u, 1))
7268               {
7269                 if (find_insn_list (XEXP (u, 0), bb_last_pending_memory_flush[bb_succ]))
7270                   continue;
7271
7272                 bb_last_pending_memory_flush[bb_succ]
7273                   = alloc_INSN_LIST (XEXP (u, 0),
7274                                      bb_last_pending_memory_flush[bb_succ]);
7275               }
7276
7277             /* sched_before_next_call is inherited by bb_succ */
7278             x = LOG_LINKS (sched_before_next_call);
7279             for (; x; x = XEXP (x, 1))
7280               add_dependence (bb_sched_before_next_call[bb_succ],
7281                               XEXP (x, 0), REG_DEP_ANTI);
7282
7283             e = NEXT_OUT (e);
7284           }
7285         while (e != first_edge);
7286     }
7287
7288   /* Free up the INSN_LISTs 
7289
7290      Note this loop is executed max_reg * nr_regions times.  It's first 
7291      implementation accounted for over 90% of the calls to free_list.
7292      The list was empty for the vast majority of those calls.  On the PA,
7293      not calling free_list in those cases improves -O2 compile times by
7294      3-5% on average.  */
7295   for (b = 0; b < max_reg; ++b)
7296     {
7297       if (reg_last_sets[b])
7298         free_list (&reg_last_sets[b], &unused_insn_list);
7299       if (reg_last_uses[b])
7300         free_list (&reg_last_uses[b], &unused_insn_list);
7301     }
7302
7303   /* Assert that we won't need bb_reg_last_* for this block anymore.  */
7304   if (current_nr_blocks > 1)
7305     {
7306       bb_reg_last_uses[bb] = (rtx *) NULL_RTX;
7307       bb_reg_last_sets[bb] = (rtx *) NULL_RTX;
7308     }
7309 }
7310
7311 /* Print dependences for debugging, callable from debugger */
7312
7313 void
7314 debug_dependencies ()
7315 {
7316   int bb;
7317
7318   fprintf (dump, ";;   --------------- forward dependences: ------------ \n");
7319   for (bb = 0; bb < current_nr_blocks; bb++)
7320     {
7321       if (1)
7322         {
7323           rtx head, tail;
7324           rtx next_tail;
7325           rtx insn;
7326
7327           get_block_head_tail (bb, &head, &tail);
7328           next_tail = NEXT_INSN (tail);
7329           fprintf (dump, "\n;;   --- Region Dependences --- b %d bb %d \n",
7330                    BB_TO_BLOCK (bb), bb);
7331
7332           fprintf (dump, ";;   %7s%6s%6s%6s%6s%6s%11s%6s\n",
7333           "insn", "code", "bb", "dep", "prio", "cost", "blockage", "units");
7334           fprintf (dump, ";;   %7s%6s%6s%6s%6s%6s%11s%6s\n",
7335           "----", "----", "--", "---", "----", "----", "--------", "-----");
7336           for (insn = head; insn != next_tail; insn = NEXT_INSN (insn))
7337             {
7338               rtx link;
7339               int unit, range;
7340
7341               if (GET_RTX_CLASS (GET_CODE (insn)) != 'i')
7342                 {
7343                   int n;
7344                   fprintf (dump, ";;   %6d ", INSN_UID (insn));
7345                   if (GET_CODE (insn) == NOTE)
7346                     {
7347                       n = NOTE_LINE_NUMBER (insn);
7348                       if (n < 0)
7349                         fprintf (dump, "%s\n", GET_NOTE_INSN_NAME (n));
7350                       else
7351                         fprintf (dump, "line %d, file %s\n", n,
7352                                  NOTE_SOURCE_FILE (insn));
7353                     }
7354                   else
7355                     fprintf (dump, " {%s}\n", GET_RTX_NAME (GET_CODE (insn)));
7356                   continue;
7357                 }
7358
7359               unit = insn_unit (insn);
7360               range = (unit < 0
7361                  || function_units[unit].blockage_range_function == 0) ? 0 :
7362                 function_units[unit].blockage_range_function (insn);
7363               fprintf (dump,
7364                        ";;   %s%5d%6d%6d%6d%6d%6d  %3d -%3d   ",
7365                        (SCHED_GROUP_P (insn) ? "+" : " "),
7366                        INSN_UID (insn),
7367                        INSN_CODE (insn),
7368                        INSN_BB (insn),
7369                        INSN_DEP_COUNT (insn),
7370                        INSN_PRIORITY (insn),
7371                        insn_cost (insn, 0, 0),
7372                        (int) MIN_BLOCKAGE_COST (range),
7373                        (int) MAX_BLOCKAGE_COST (range));
7374               insn_print_units (insn);
7375               fprintf (dump, "\t: ");
7376               for (link = INSN_DEPEND (insn); link; link = XEXP (link, 1))
7377                 fprintf (dump, "%d ", INSN_UID (XEXP (link, 0)));
7378               fprintf (dump, "\n");
7379             }
7380         }
7381     }
7382   fprintf (dump, "\n");
7383 }
7384
7385 /* Set_priorities: compute priority of each insn in the block */
7386
7387 static int
7388 set_priorities (bb)
7389      int bb;
7390 {
7391   rtx insn;
7392   int n_insn;
7393
7394   rtx tail;
7395   rtx prev_head;
7396   rtx head;
7397
7398   get_block_head_tail (bb, &head, &tail);
7399   prev_head = PREV_INSN (head);
7400
7401   if (head == tail
7402       && (GET_RTX_CLASS (GET_CODE (head)) != 'i'))
7403     return 0;
7404
7405   n_insn = 0;
7406   for (insn = tail; insn != prev_head; insn = PREV_INSN (insn))
7407     {
7408
7409       if (GET_CODE (insn) == NOTE)
7410         continue;
7411
7412       if (!(SCHED_GROUP_P (insn)))
7413         n_insn++;
7414       (void) priority (insn);
7415     }
7416
7417   return n_insn;
7418 }
7419
7420 /* Make each element of VECTOR point at an rtx-vector,
7421    taking the space for all those rtx-vectors from SPACE.
7422    SPACE is of type (rtx *), but it is really as long as NELTS rtx-vectors.
7423    BYTES_PER_ELT is the number of bytes in one rtx-vector.
7424    (this is the same as init_regset_vector () in flow.c) */
7425
7426 static void
7427 init_rtx_vector (vector, space, nelts, bytes_per_elt)
7428      rtx **vector;
7429      rtx *space;
7430      int nelts;
7431      int bytes_per_elt;
7432 {
7433   register int i;
7434   register rtx *p = space;
7435
7436   for (i = 0; i < nelts; i++)
7437     {
7438       vector[i] = p;
7439       p += bytes_per_elt / sizeof (*p);
7440     }
7441 }
7442
7443 /* Schedule a region.  A region is either an inner loop, a loop-free
7444    subroutine, or a single basic block.  Each bb in the region is
7445    scheduled after its flow predecessors.  */
7446
7447 static void
7448 schedule_region (rgn)
7449      int rgn;
7450 {
7451   int bb;
7452   int rgn_n_insns = 0;
7453   int sched_rgn_n_insns = 0;
7454
7455   /* set variables for the current region */
7456   current_nr_blocks = RGN_NR_BLOCKS (rgn);
7457   current_blocks = RGN_BLOCKS (rgn);
7458
7459   reg_pending_sets = ALLOCA_REG_SET ();
7460   reg_pending_sets_all = 0;
7461
7462   /* initializations for region data dependence analyisis */
7463   if (current_nr_blocks > 1)
7464     {
7465       rtx *space;
7466       int maxreg = max_reg_num ();
7467
7468       bb_reg_last_uses = (rtx **) alloca (current_nr_blocks * sizeof (rtx *));
7469       space = (rtx *) alloca (current_nr_blocks * maxreg * sizeof (rtx));
7470       bzero ((char *) space, current_nr_blocks * maxreg * sizeof (rtx));
7471       init_rtx_vector (bb_reg_last_uses, space, current_nr_blocks, maxreg * sizeof (rtx *));
7472
7473       bb_reg_last_sets = (rtx **) alloca (current_nr_blocks * sizeof (rtx *));
7474       space = (rtx *) alloca (current_nr_blocks * maxreg * sizeof (rtx));
7475       bzero ((char *) space, current_nr_blocks * maxreg * sizeof (rtx));
7476       init_rtx_vector (bb_reg_last_sets, space, current_nr_blocks, maxreg * sizeof (rtx *));
7477
7478       bb_pending_read_insns = (rtx *) alloca (current_nr_blocks * sizeof (rtx));
7479       bb_pending_read_mems = (rtx *) alloca (current_nr_blocks * sizeof (rtx));
7480       bb_pending_write_insns = (rtx *) alloca (current_nr_blocks * sizeof (rtx));
7481       bb_pending_write_mems = (rtx *) alloca (current_nr_blocks * sizeof (rtx));
7482       bb_pending_lists_length = (int *) alloca (current_nr_blocks * sizeof (int));
7483       bb_last_pending_memory_flush = (rtx *) alloca (current_nr_blocks * sizeof (rtx));
7484       bb_last_function_call = (rtx *) alloca (current_nr_blocks * sizeof (rtx));
7485       bb_sched_before_next_call = (rtx *) alloca (current_nr_blocks * sizeof (rtx));
7486
7487       init_rgn_data_dependences (current_nr_blocks);
7488     }
7489
7490   /* compute LOG_LINKS */
7491   for (bb = 0; bb < current_nr_blocks; bb++)
7492     compute_block_backward_dependences (bb);
7493
7494   /* compute INSN_DEPEND */
7495   for (bb = current_nr_blocks - 1; bb >= 0; bb--)
7496     compute_block_forward_dependences (bb);
7497
7498   /* Delete line notes, compute live-regs at block end, and set priorities.  */
7499   dead_notes = 0;
7500   for (bb = 0; bb < current_nr_blocks; bb++)
7501     {
7502       if (reload_completed == 0)
7503         find_pre_sched_live (bb);
7504
7505       if (write_symbols != NO_DEBUG)
7506         {
7507           save_line_notes (bb);
7508           rm_line_notes (bb);
7509         }
7510
7511       rgn_n_insns += set_priorities (bb);
7512     }
7513
7514   /* compute interblock info: probabilities, split-edges, dominators, etc.  */
7515   if (current_nr_blocks > 1)
7516     {
7517       int i;
7518
7519       prob = (float *) alloca ((current_nr_blocks) * sizeof (float));
7520
7521       bbset_size = current_nr_blocks / HOST_BITS_PER_WIDE_INT + 1;
7522       dom = (bbset *) alloca (current_nr_blocks * sizeof (bbset));
7523       for (i = 0; i < current_nr_blocks; i++)
7524         {
7525           dom[i] = (bbset) alloca (bbset_size * sizeof (HOST_WIDE_INT));
7526           bzero ((char *) dom[i], bbset_size * sizeof (HOST_WIDE_INT));
7527         }
7528
7529       /* edge to bit */
7530       rgn_nr_edges = 0;
7531       edge_to_bit = (int *) alloca (nr_edges * sizeof (int));
7532       for (i = 1; i < nr_edges; i++)
7533         if (CONTAINING_RGN (FROM_BLOCK (i)) == rgn)
7534           EDGE_TO_BIT (i) = rgn_nr_edges++;
7535       rgn_edges = (int *) alloca (rgn_nr_edges * sizeof (int));
7536
7537       rgn_nr_edges = 0;
7538       for (i = 1; i < nr_edges; i++)
7539         if (CONTAINING_RGN (FROM_BLOCK (i)) == (rgn))
7540           rgn_edges[rgn_nr_edges++] = i;
7541
7542       /* split edges */
7543       edgeset_size = rgn_nr_edges / HOST_BITS_PER_WIDE_INT + 1;
7544       pot_split = (edgeset *) alloca (current_nr_blocks * sizeof (edgeset));
7545       ancestor_edges = (edgeset *) alloca (current_nr_blocks * sizeof (edgeset));
7546       for (i = 0; i < current_nr_blocks; i++)
7547         {
7548           pot_split[i] =
7549             (edgeset) alloca (edgeset_size * sizeof (HOST_WIDE_INT));
7550           bzero ((char *) pot_split[i],
7551                  edgeset_size * sizeof (HOST_WIDE_INT));
7552           ancestor_edges[i] =
7553             (edgeset) alloca (edgeset_size * sizeof (HOST_WIDE_INT));
7554           bzero ((char *) ancestor_edges[i],
7555                  edgeset_size * sizeof (HOST_WIDE_INT));
7556         }
7557
7558       /* compute probabilities, dominators, split_edges */
7559       for (bb = 0; bb < current_nr_blocks; bb++)
7560         compute_dom_prob_ps (bb);
7561     }
7562
7563   /* now we can schedule all blocks */
7564   for (bb = 0; bb < current_nr_blocks; bb++)
7565     {
7566       sched_rgn_n_insns += schedule_block (bb, rgn_n_insns);
7567
7568 #ifdef USE_C_ALLOCA
7569       alloca (0);
7570 #endif
7571     }
7572
7573   /* sanity check: verify that all region insns were scheduled */
7574   if (sched_rgn_n_insns != rgn_n_insns)
7575     abort ();
7576
7577   /* update register life and usage information */
7578   if (reload_completed == 0)
7579     {
7580       for (bb = current_nr_blocks - 1; bb >= 0; bb--)
7581         find_post_sched_live (bb);
7582
7583       if (current_nr_blocks <= 1)
7584         /* Sanity check.  There should be no REG_DEAD notes leftover at the end.
7585            In practice, this can occur as the result of bugs in flow, combine.c,
7586            and/or sched.c.  The values of the REG_DEAD notes remaining are
7587            meaningless, because dead_notes is just used as a free list.  */
7588         if (dead_notes != 0)
7589           abort ();
7590     }
7591
7592   /* restore line notes.  */
7593   if (write_symbols != NO_DEBUG)
7594     {
7595       for (bb = 0; bb < current_nr_blocks; bb++)
7596         restore_line_notes (bb);
7597     }
7598
7599   /* Done with this region */
7600   free_pending_lists ();
7601
7602   FREE_REG_SET (reg_pending_sets);
7603 }
7604
7605 /* Subroutine of split_hard_reg_notes.  Searches X for any reference to
7606    REGNO, returning the rtx of the reference found if any.  Otherwise,
7607    returns 0.  */
7608
7609 static rtx
7610 regno_use_in (regno, x)
7611      int regno;
7612      rtx x;
7613 {
7614   register char *fmt;
7615   int i, j;
7616   rtx tem;
7617
7618   if (GET_CODE (x) == REG && REGNO (x) == regno)
7619     return x;
7620
7621   fmt = GET_RTX_FORMAT (GET_CODE (x));
7622   for (i = GET_RTX_LENGTH (GET_CODE (x)) - 1; i >= 0; i--)
7623     {
7624       if (fmt[i] == 'e')
7625         {
7626           if ((tem = regno_use_in (regno, XEXP (x, i))))
7627             return tem;
7628         }
7629       else if (fmt[i] == 'E')
7630         for (j = XVECLEN (x, i) - 1; j >= 0; j--)
7631           if ((tem = regno_use_in (regno, XVECEXP (x, i, j))))
7632             return tem;
7633     }
7634
7635   return 0;
7636 }
7637
7638 /* Subroutine of update_flow_info.  Determines whether any new REG_NOTEs are
7639    needed for the hard register mentioned in the note.  This can happen
7640    if the reference to the hard register in the original insn was split into
7641    several smaller hard register references in the split insns.  */
7642
7643 static void
7644 split_hard_reg_notes (note, first, last)
7645      rtx note, first, last;
7646 {
7647   rtx reg, temp, link;
7648   int n_regs, i, new_reg;
7649   rtx insn;
7650
7651   /* Assume that this is a REG_DEAD note.  */
7652   if (REG_NOTE_KIND (note) != REG_DEAD)
7653     abort ();
7654
7655   reg = XEXP (note, 0);
7656
7657   n_regs = HARD_REGNO_NREGS (REGNO (reg), GET_MODE (reg));
7658
7659   for (i = 0; i < n_regs; i++)
7660     {
7661       new_reg = REGNO (reg) + i;
7662
7663       /* Check for references to new_reg in the split insns.  */
7664       for (insn = last;; insn = PREV_INSN (insn))
7665         {
7666           if (GET_RTX_CLASS (GET_CODE (insn)) == 'i'
7667               && (temp = regno_use_in (new_reg, PATTERN (insn))))
7668             {
7669               /* Create a new reg dead note ere.  */
7670               link = alloc_EXPR_LIST (REG_DEAD, temp, REG_NOTES (insn));
7671               REG_NOTES (insn) = link;
7672
7673               /* If killed multiple registers here, then add in the excess.  */
7674               i += HARD_REGNO_NREGS (REGNO (temp), GET_MODE (temp)) - 1;
7675
7676               break;
7677             }
7678           /* It isn't mentioned anywhere, so no new reg note is needed for
7679              this register.  */
7680           if (insn == first)
7681             break;
7682         }
7683     }
7684 }
7685
7686 /* Subroutine of update_flow_info.  Determines whether a SET or CLOBBER in an
7687    insn created by splitting needs a REG_DEAD or REG_UNUSED note added.  */
7688
7689 static void
7690 new_insn_dead_notes (pat, insn, last, orig_insn)
7691      rtx pat, insn, last, orig_insn;
7692 {
7693   rtx dest, tem, set;
7694
7695   /* PAT is either a CLOBBER or a SET here.  */
7696   dest = XEXP (pat, 0);
7697
7698   while (GET_CODE (dest) == ZERO_EXTRACT || GET_CODE (dest) == SUBREG
7699          || GET_CODE (dest) == STRICT_LOW_PART
7700          || GET_CODE (dest) == SIGN_EXTRACT)
7701     dest = XEXP (dest, 0);
7702
7703   if (GET_CODE (dest) == REG)
7704     {
7705       /* If the original insn already used this register, we may not add new
7706          notes for it.  One example for a split that needs this test is
7707          when a multi-word memory access with register-indirect addressing
7708          is split into multiple memory accesses with auto-increment and
7709          one adjusting add instruction for the address register.  */
7710       if (reg_referenced_p (dest, PATTERN (orig_insn)))
7711         return;
7712       for (tem = last; tem != insn; tem = PREV_INSN (tem))
7713         {
7714           if (GET_RTX_CLASS (GET_CODE (tem)) == 'i'
7715               && reg_overlap_mentioned_p (dest, PATTERN (tem))
7716               && (set = single_set (tem)))
7717             {
7718               rtx tem_dest = SET_DEST (set);
7719
7720               while (GET_CODE (tem_dest) == ZERO_EXTRACT
7721                      || GET_CODE (tem_dest) == SUBREG
7722                      || GET_CODE (tem_dest) == STRICT_LOW_PART
7723                      || GET_CODE (tem_dest) == SIGN_EXTRACT)
7724                 tem_dest = XEXP (tem_dest, 0);
7725
7726               if (!rtx_equal_p (tem_dest, dest))
7727                 {
7728                   /* Use the same scheme as combine.c, don't put both REG_DEAD
7729                      and REG_UNUSED notes on the same insn.  */
7730                   if (!find_regno_note (tem, REG_UNUSED, REGNO (dest))
7731                       && !find_regno_note (tem, REG_DEAD, REGNO (dest)))
7732                     {
7733                       rtx note = alloc_EXPR_LIST (REG_DEAD, dest,
7734                                                   REG_NOTES (tem));
7735                       REG_NOTES (tem) = note;
7736                     }
7737                   /* The reg only dies in one insn, the last one that uses
7738                      it.  */
7739                   break;
7740                 }
7741               else if (reg_overlap_mentioned_p (dest, SET_SRC (set)))
7742                 /* We found an instruction that both uses the register,
7743                    and sets it, so no new REG_NOTE is needed for this set.  */
7744                 break;
7745             }
7746         }
7747       /* If this is a set, it must die somewhere, unless it is the dest of
7748          the original insn, and hence is live after the original insn.  Abort
7749          if it isn't supposed to be live after the original insn.
7750
7751          If this is a clobber, then just add a REG_UNUSED note.  */
7752       if (tem == insn)
7753         {
7754           int live_after_orig_insn = 0;
7755           rtx pattern = PATTERN (orig_insn);
7756           int i;
7757
7758           if (GET_CODE (pat) == CLOBBER)
7759             {
7760               rtx note = alloc_EXPR_LIST (REG_UNUSED, dest, REG_NOTES (insn));
7761               REG_NOTES (insn) = note;
7762               return;
7763             }
7764
7765           /* The original insn could have multiple sets, so search the
7766              insn for all sets.  */
7767           if (GET_CODE (pattern) == SET)
7768             {
7769               if (reg_overlap_mentioned_p (dest, SET_DEST (pattern)))
7770                 live_after_orig_insn = 1;
7771             }
7772           else if (GET_CODE (pattern) == PARALLEL)
7773             {
7774               for (i = 0; i < XVECLEN (pattern, 0); i++)
7775                 if (GET_CODE (XVECEXP (pattern, 0, i)) == SET
7776                     && reg_overlap_mentioned_p (dest,
7777                                                 SET_DEST (XVECEXP (pattern,
7778                                                                    0, i))))
7779                   live_after_orig_insn = 1;
7780             }
7781
7782           if (!live_after_orig_insn)
7783             abort ();
7784         }
7785     }
7786 }
7787
7788 /* Subroutine of update_flow_info.  Update the value of reg_n_sets for all
7789    registers modified by X.  INC is -1 if the containing insn is being deleted,
7790    and is 1 if the containing insn is a newly generated insn.  */
7791
7792 static void
7793 update_n_sets (x, inc)
7794      rtx x;
7795      int inc;
7796 {
7797   rtx dest = SET_DEST (x);
7798
7799   while (GET_CODE (dest) == STRICT_LOW_PART || GET_CODE (dest) == SUBREG
7800       || GET_CODE (dest) == ZERO_EXTRACT || GET_CODE (dest) == SIGN_EXTRACT)
7801     dest = SUBREG_REG (dest);
7802
7803   if (GET_CODE (dest) == REG)
7804     {
7805       int regno = REGNO (dest);
7806
7807       if (regno < FIRST_PSEUDO_REGISTER)
7808         {
7809           register int i;
7810           int endregno = regno + HARD_REGNO_NREGS (regno, GET_MODE (dest));
7811
7812           for (i = regno; i < endregno; i++)
7813             REG_N_SETS (i) += inc;
7814         }
7815       else
7816         REG_N_SETS (regno) += inc;
7817     }
7818 }
7819
7820 /* Updates all flow-analysis related quantities (including REG_NOTES) for
7821    the insns from FIRST to LAST inclusive that were created by splitting
7822    ORIG_INSN.  NOTES are the original REG_NOTES.  */
7823
7824 static void
7825 update_flow_info (notes, first, last, orig_insn)
7826      rtx notes;
7827      rtx first, last;
7828      rtx orig_insn;
7829 {
7830   rtx insn, note;
7831   rtx next;
7832   rtx orig_dest, temp;
7833   rtx set;
7834
7835   /* Get and save the destination set by the original insn.  */
7836
7837   orig_dest = single_set (orig_insn);
7838   if (orig_dest)
7839     orig_dest = SET_DEST (orig_dest);
7840
7841   /* Move REG_NOTES from the original insn to where they now belong.  */
7842
7843   for (note = notes; note; note = next)
7844     {
7845       next = XEXP (note, 1);
7846       switch (REG_NOTE_KIND (note))
7847         {
7848         case REG_DEAD:
7849         case REG_UNUSED:
7850           /* Move these notes from the original insn to the last new insn where
7851              the register is now set.  */
7852
7853           for (insn = last;; insn = PREV_INSN (insn))
7854             {
7855               if (GET_RTX_CLASS (GET_CODE (insn)) == 'i'
7856                   && reg_mentioned_p (XEXP (note, 0), PATTERN (insn)))
7857                 {
7858                   /* If this note refers to a multiple word hard register, it
7859                      may have been split into several smaller hard register
7860                      references, so handle it specially.  */
7861                   temp = XEXP (note, 0);
7862                   if (REG_NOTE_KIND (note) == REG_DEAD
7863                       && GET_CODE (temp) == REG
7864                       && REGNO (temp) < FIRST_PSEUDO_REGISTER
7865                       && HARD_REGNO_NREGS (REGNO (temp), GET_MODE (temp)) > 1)
7866                     split_hard_reg_notes (note, first, last);
7867                   else
7868                     {
7869                       XEXP (note, 1) = REG_NOTES (insn);
7870                       REG_NOTES (insn) = note;
7871                     }
7872
7873                   /* Sometimes need to convert REG_UNUSED notes to REG_DEAD
7874                      notes.  */
7875                   /* ??? This won't handle multiple word registers correctly,
7876                      but should be good enough for now.  */
7877                   if (REG_NOTE_KIND (note) == REG_UNUSED
7878                       && GET_CODE (XEXP (note, 0)) != SCRATCH
7879                       && !dead_or_set_p (insn, XEXP (note, 0)))
7880                     PUT_REG_NOTE_KIND (note, REG_DEAD);
7881
7882                   /* The reg only dies in one insn, the last one that uses
7883                      it.  */
7884                   break;
7885                 }
7886               /* It must die somewhere, fail it we couldn't find where it died.
7887
7888                  If this is a REG_UNUSED note, then it must be a temporary
7889                  register that was not needed by this instantiation of the
7890                  pattern, so we can safely ignore it.  */
7891               if (insn == first)
7892                 {
7893                   /* After reload, REG_DEAD notes come sometimes an
7894                      instruction after the register actually dies.  */
7895                   if (reload_completed && REG_NOTE_KIND (note) == REG_DEAD)
7896                     {
7897                       XEXP (note, 1) = REG_NOTES (insn);
7898                       REG_NOTES (insn) = note;
7899                       break;
7900                     }
7901                         
7902                   if (REG_NOTE_KIND (note) != REG_UNUSED)
7903                     abort ();
7904
7905                   break;
7906                 }
7907             }
7908           break;
7909
7910         case REG_WAS_0:
7911           /* If the insn that set the register to 0 was deleted, this
7912              note cannot be relied on any longer.  The destination might
7913              even have been moved to memory.
7914              This was observed for SH4 with execute/920501-6.c compilation,
7915              -O2 -fomit-frame-pointer -finline-functions .  */
7916           if (GET_CODE (XEXP (note, 0)) == NOTE
7917               || INSN_DELETED_P (XEXP (note, 0)))
7918             break;
7919           /* This note applies to the dest of the original insn.  Find the
7920              first new insn that now has the same dest, and move the note
7921              there.  */
7922
7923           if (!orig_dest)
7924             abort ();
7925
7926           for (insn = first;; insn = NEXT_INSN (insn))
7927             {
7928               if (GET_RTX_CLASS (GET_CODE (insn)) == 'i'
7929                   && (temp = single_set (insn))
7930                   && rtx_equal_p (SET_DEST (temp), orig_dest))
7931                 {
7932                   XEXP (note, 1) = REG_NOTES (insn);
7933                   REG_NOTES (insn) = note;
7934                   /* The reg is only zero before one insn, the first that
7935                      uses it.  */
7936                   break;
7937                 }
7938               /* If this note refers to a multiple word hard
7939                  register, it may have been split into several smaller
7940                  hard register references.  We could split the notes,
7941                  but simply dropping them is good enough.  */
7942               if (GET_CODE (orig_dest) == REG
7943                   && REGNO (orig_dest) < FIRST_PSEUDO_REGISTER
7944                   && HARD_REGNO_NREGS (REGNO (orig_dest),
7945                                        GET_MODE (orig_dest)) > 1)
7946                     break;
7947               /* It must be set somewhere, fail if we couldn't find where it
7948                  was set.  */
7949               if (insn == last)
7950                 abort ();
7951             }
7952           break;
7953
7954         case REG_EQUAL:
7955         case REG_EQUIV:
7956           /* A REG_EQUIV or REG_EQUAL note on an insn with more than one
7957              set is meaningless.  Just drop the note.  */
7958           if (!orig_dest)
7959             break;
7960
7961         case REG_NO_CONFLICT:
7962           /* These notes apply to the dest of the original insn.  Find the last
7963              new insn that now has the same dest, and move the note there.  */
7964
7965           if (!orig_dest)
7966             abort ();
7967
7968           for (insn = last;; insn = PREV_INSN (insn))
7969             {
7970               if (GET_RTX_CLASS (GET_CODE (insn)) == 'i'
7971                   && (temp = single_set (insn))
7972                   && rtx_equal_p (SET_DEST (temp), orig_dest))
7973                 {
7974                   XEXP (note, 1) = REG_NOTES (insn);
7975                   REG_NOTES (insn) = note;
7976                   /* Only put this note on one of the new insns.  */
7977                   break;
7978                 }
7979
7980               /* The original dest must still be set someplace.  Abort if we
7981                  couldn't find it.  */
7982               if (insn == first)
7983                 {
7984                   /* However, if this note refers to a multiple word hard
7985                      register, it may have been split into several smaller
7986                      hard register references.  We could split the notes,
7987                      but simply dropping them is good enough.  */
7988                   if (GET_CODE (orig_dest) == REG
7989                       && REGNO (orig_dest) < FIRST_PSEUDO_REGISTER
7990                       && HARD_REGNO_NREGS (REGNO (orig_dest),
7991                                            GET_MODE (orig_dest)) > 1)
7992                     break;
7993                   /* Likewise for multi-word memory references.  */
7994                   if (GET_CODE (orig_dest) == MEM
7995                       && SIZE_FOR_MODE (orig_dest) > UNITS_PER_WORD)
7996                     break;
7997                   abort ();
7998                 }
7999             }
8000           break;
8001
8002         case REG_LIBCALL:
8003           /* Move a REG_LIBCALL note to the first insn created, and update
8004              the corresponding REG_RETVAL note.  */
8005           XEXP (note, 1) = REG_NOTES (first);
8006           REG_NOTES (first) = note;
8007
8008           insn = XEXP (note, 0);
8009           note = find_reg_note (insn, REG_RETVAL, NULL_RTX);
8010           if (note)
8011             XEXP (note, 0) = first;
8012           break;
8013
8014         case REG_EXEC_COUNT:
8015           /* Move a REG_EXEC_COUNT note to the first insn created.  */
8016           XEXP (note, 1) = REG_NOTES (first);
8017           REG_NOTES (first) = note;
8018           break;
8019
8020         case REG_RETVAL:
8021           /* Move a REG_RETVAL note to the last insn created, and update
8022              the corresponding REG_LIBCALL note.  */
8023           XEXP (note, 1) = REG_NOTES (last);
8024           REG_NOTES (last) = note;
8025
8026           insn = XEXP (note, 0);
8027           note = find_reg_note (insn, REG_LIBCALL, NULL_RTX);
8028           if (note)
8029             XEXP (note, 0) = last;
8030           break;
8031
8032         case REG_NONNEG:
8033         case REG_BR_PROB:
8034           /* This should be moved to whichever instruction is a JUMP_INSN.  */
8035
8036           for (insn = last;; insn = PREV_INSN (insn))
8037             {
8038               if (GET_CODE (insn) == JUMP_INSN)
8039                 {
8040                   XEXP (note, 1) = REG_NOTES (insn);
8041                   REG_NOTES (insn) = note;
8042                   /* Only put this note on one of the new insns.  */
8043                   break;
8044                 }
8045               /* Fail if we couldn't find a JUMP_INSN.  */
8046               if (insn == first)
8047                 abort ();
8048             }
8049           break;
8050
8051         case REG_INC:
8052           /* reload sometimes leaves obsolete REG_INC notes around.  */
8053           if (reload_completed)
8054             break;
8055           /* This should be moved to whichever instruction now has the
8056              increment operation.  */
8057           abort ();
8058
8059         case REG_LABEL:
8060           /* Should be moved to the new insn(s) which use the label.  */
8061           for (insn = first; insn != NEXT_INSN (last); insn = NEXT_INSN (insn))
8062             if (GET_RTX_CLASS (GET_CODE (insn)) == 'i'
8063                 && reg_mentioned_p (XEXP (note, 0), PATTERN (insn)))
8064               {
8065                 REG_NOTES (insn) = alloc_EXPR_LIST (REG_LABEL,
8066                                                     XEXP (note, 0),
8067                                                     REG_NOTES (insn));
8068               }
8069           break;
8070
8071         case REG_CC_SETTER:
8072         case REG_CC_USER:
8073           /* These two notes will never appear until after reorg, so we don't
8074              have to handle them here.  */
8075         default:
8076           abort ();
8077         }
8078     }
8079
8080   /* Each new insn created, except the last, has a new set.  If the destination
8081      is a register, then this reg is now live across several insns, whereas
8082      previously the dest reg was born and died within the same insn.  To
8083      reflect this, we now need a REG_DEAD note on the insn where this
8084      dest reg dies.
8085
8086      Similarly, the new insns may have clobbers that need REG_UNUSED notes.  */
8087
8088   for (insn = first; insn != last; insn = NEXT_INSN (insn))
8089     {
8090       rtx pat;
8091       int i;
8092
8093       pat = PATTERN (insn);
8094       if (GET_CODE (pat) == SET || GET_CODE (pat) == CLOBBER)
8095         new_insn_dead_notes (pat, insn, last, orig_insn);
8096       else if (GET_CODE (pat) == PARALLEL)
8097         {
8098           for (i = 0; i < XVECLEN (pat, 0); i++)
8099             if (GET_CODE (XVECEXP (pat, 0, i)) == SET
8100                 || GET_CODE (XVECEXP (pat, 0, i)) == CLOBBER)
8101               new_insn_dead_notes (XVECEXP (pat, 0, i), insn, last, orig_insn);
8102         }
8103     }
8104
8105   /* If any insn, except the last, uses the register set by the last insn,
8106      then we need a new REG_DEAD note on that insn.  In this case, there
8107      would not have been a REG_DEAD note for this register in the original
8108      insn because it was used and set within one insn.  */
8109
8110   set = single_set (last);
8111   if (set)
8112     {
8113       rtx dest = SET_DEST (set);
8114
8115       while (GET_CODE (dest) == ZERO_EXTRACT || GET_CODE (dest) == SUBREG
8116              || GET_CODE (dest) == STRICT_LOW_PART
8117              || GET_CODE (dest) == SIGN_EXTRACT)
8118         dest = XEXP (dest, 0);
8119
8120       if (GET_CODE (dest) == REG
8121           /* Global registers are always live, so the code below does not
8122              apply to them.  */
8123           && (REGNO (dest) >= FIRST_PSEUDO_REGISTER
8124               || ! global_regs[REGNO (dest)]))
8125         {
8126           rtx stop_insn = PREV_INSN (first);
8127
8128           /* If the last insn uses the register that it is setting, then
8129              we don't want to put a REG_DEAD note there.  Search backwards
8130              to find the first insn that sets but does not use DEST.  */
8131
8132           insn = last;
8133           if (reg_overlap_mentioned_p (dest, SET_SRC (set)))
8134             {
8135               for (insn = PREV_INSN (insn); insn != first;
8136                    insn = PREV_INSN (insn))
8137                 {
8138                   if ((set = single_set (insn))
8139                       && reg_mentioned_p (dest, SET_DEST (set))
8140                       && ! reg_overlap_mentioned_p (dest, SET_SRC (set)))
8141                     break;
8142                 }
8143             }
8144
8145           /* Now find the first insn that uses but does not set DEST.  */
8146
8147           for (insn = PREV_INSN (insn); insn != stop_insn;
8148                insn = PREV_INSN (insn))
8149             {
8150               if (GET_RTX_CLASS (GET_CODE (insn)) == 'i'
8151                   && reg_mentioned_p (dest, PATTERN (insn))
8152                   && (set = single_set (insn)))
8153                 {
8154                   rtx insn_dest = SET_DEST (set);
8155
8156                   while (GET_CODE (insn_dest) == ZERO_EXTRACT
8157                          || GET_CODE (insn_dest) == SUBREG
8158                          || GET_CODE (insn_dest) == STRICT_LOW_PART
8159                          || GET_CODE (insn_dest) == SIGN_EXTRACT)
8160                     insn_dest = XEXP (insn_dest, 0);
8161
8162                   if (insn_dest != dest)
8163                     {
8164                       note = alloc_EXPR_LIST (REG_DEAD, dest, REG_NOTES (insn));
8165                       REG_NOTES (insn) = note;
8166                       /* The reg only dies in one insn, the last one
8167                          that uses it.  */
8168                       break;
8169                     }
8170                 }
8171             }
8172         }
8173     }
8174
8175   /* If the original dest is modifying a multiple register target, and the
8176      original instruction was split such that the original dest is now set
8177      by two or more SUBREG sets, then the split insns no longer kill the
8178      destination of the original insn.
8179
8180      In this case, if there exists an instruction in the same basic block,
8181      before the split insn, which uses the original dest, and this use is
8182      killed by the original insn, then we must remove the REG_DEAD note on
8183      this insn, because it is now superfluous.
8184
8185      This does not apply when a hard register gets split, because the code
8186      knows how to handle overlapping hard registers properly.  */
8187   if (orig_dest && GET_CODE (orig_dest) == REG)
8188     {
8189       int found_orig_dest = 0;
8190       int found_split_dest = 0;
8191
8192       for (insn = first;; insn = NEXT_INSN (insn))
8193         {
8194           rtx pat;
8195           int i;
8196
8197           /* I'm not sure if this can happen, but let's be safe.  */
8198           if (GET_RTX_CLASS (GET_CODE (insn)) != 'i')
8199             continue;
8200
8201           pat = PATTERN (insn);
8202           i = GET_CODE (pat) == PARALLEL ? XVECLEN (pat, 0) : 0;
8203           set = pat;
8204
8205           for (;;)
8206             {
8207               if (GET_CODE (set) == SET)
8208                 {
8209                   if (GET_CODE (SET_DEST (set)) == REG
8210                       && REGNO (SET_DEST (set)) == REGNO (orig_dest))
8211                     {
8212                       found_orig_dest = 1;
8213                       break;
8214                     }
8215                   else if (GET_CODE (SET_DEST (set)) == SUBREG
8216                            && SUBREG_REG (SET_DEST (set)) == orig_dest)
8217                     {
8218                       found_split_dest = 1;
8219                       break;
8220                     }
8221                 }
8222               if (--i < 0)
8223                 break;
8224               set = XVECEXP (pat, 0, i);
8225             }
8226
8227           if (insn == last)
8228             break;
8229         }
8230
8231       if (found_split_dest)
8232         {
8233           /* Search backwards from FIRST, looking for the first insn that uses
8234              the original dest.  Stop if we pass a CODE_LABEL or a JUMP_INSN.
8235              If we find an insn, and it has a REG_DEAD note, then delete the
8236              note.  */
8237
8238           for (insn = first; insn; insn = PREV_INSN (insn))
8239             {
8240               if (GET_CODE (insn) == CODE_LABEL
8241                   || GET_CODE (insn) == JUMP_INSN)
8242                 break;
8243               else if (GET_RTX_CLASS (GET_CODE (insn)) == 'i'
8244                        && reg_mentioned_p (orig_dest, insn))
8245                 {
8246                   note = find_regno_note (insn, REG_DEAD, REGNO (orig_dest));
8247                   if (note)
8248                     remove_note (insn, note);
8249                 }
8250             }
8251         }
8252       else if (!found_orig_dest)
8253         {
8254           /* This should never happen.  */
8255           abort ();
8256         }
8257     }
8258
8259   /* Update reg_n_sets.  This is necessary to prevent local alloc from
8260      converting REG_EQUAL notes to REG_EQUIV when splitting has modified
8261      a reg from set once to set multiple times.  */
8262
8263   {
8264     rtx x = PATTERN (orig_insn);
8265     RTX_CODE code = GET_CODE (x);
8266
8267     if (code == SET || code == CLOBBER)
8268       update_n_sets (x, -1);
8269     else if (code == PARALLEL)
8270       {
8271         int i;
8272         for (i = XVECLEN (x, 0) - 1; i >= 0; i--)
8273           {
8274             code = GET_CODE (XVECEXP (x, 0, i));
8275             if (code == SET || code == CLOBBER)
8276               update_n_sets (XVECEXP (x, 0, i), -1);
8277           }
8278       }
8279
8280     for (insn = first;; insn = NEXT_INSN (insn))
8281       {
8282         x = PATTERN (insn);
8283         code = GET_CODE (x);
8284
8285         if (code == SET || code == CLOBBER)
8286           update_n_sets (x, 1);
8287         else if (code == PARALLEL)
8288           {
8289             int i;
8290             for (i = XVECLEN (x, 0) - 1; i >= 0; i--)
8291               {
8292                 code = GET_CODE (XVECEXP (x, 0, i));
8293                 if (code == SET || code == CLOBBER)
8294                   update_n_sets (XVECEXP (x, 0, i), 1);
8295               }
8296           }
8297
8298         if (insn == last)
8299           break;
8300       }
8301   }
8302 }
8303
8304 /* Do the splitting of insns in the block b.  */
8305
8306 static void
8307 split_block_insns (b)
8308      int b;
8309 {
8310   rtx insn, next;
8311
8312   for (insn = basic_block_head[b];; insn = next)
8313     {
8314       rtx set, last, first, notes;
8315
8316       /* Can't use `next_real_insn' because that
8317          might go across CODE_LABELS and short-out basic blocks.  */
8318       next = NEXT_INSN (insn);
8319       if (GET_CODE (insn) != INSN)
8320         {
8321           if (insn == basic_block_end[b])
8322             break;
8323
8324           continue;
8325         }
8326
8327       /* Don't split no-op move insns.  These should silently disappear
8328          later in final.  Splitting such insns would break the code
8329          that handles REG_NO_CONFLICT blocks.  */
8330       set = single_set (insn);
8331       if (set && rtx_equal_p (SET_SRC (set), SET_DEST (set)))
8332         {
8333           if (insn == basic_block_end[b])
8334             break;
8335
8336           /* Nops get in the way while scheduling, so delete them now if
8337              register allocation has already been done.  It is too risky
8338              to try to do this before register allocation, and there are
8339              unlikely to be very many nops then anyways.  */
8340           if (reload_completed)
8341             {
8342               PUT_CODE (insn, NOTE);
8343               NOTE_LINE_NUMBER (insn) = NOTE_INSN_DELETED;
8344               NOTE_SOURCE_FILE (insn) = 0;
8345             }
8346
8347           continue;
8348         }
8349
8350       /* Split insns here to get max fine-grain parallelism.  */
8351       first = PREV_INSN (insn);
8352       notes = REG_NOTES (insn);
8353       last = try_split (PATTERN (insn), insn, 1);
8354       if (last != insn)
8355         {
8356           /* try_split returns the NOTE that INSN became.  */
8357           first = NEXT_INSN (first);
8358           update_flow_info (notes, first, last, insn);
8359
8360           PUT_CODE (insn, NOTE);
8361           NOTE_SOURCE_FILE (insn) = 0;
8362           NOTE_LINE_NUMBER (insn) = NOTE_INSN_DELETED;
8363           if (insn == basic_block_head[b])
8364             basic_block_head[b] = first;
8365           if (insn == basic_block_end[b])
8366             {
8367               basic_block_end[b] = last;
8368               break;
8369             }
8370         }
8371
8372       if (insn == basic_block_end[b])
8373         break;
8374     }
8375 }
8376
8377 /* The one entry point in this file.  DUMP_FILE is the dump file for
8378    this pass.  */
8379
8380 void
8381 schedule_insns (dump_file)
8382      FILE *dump_file;
8383 {
8384
8385   int max_uid;
8386   int b;
8387   rtx insn;
8388   int rgn;
8389
8390   int luid;
8391
8392   /* disable speculative loads in their presence if cc0 defined */
8393 #ifdef HAVE_cc0
8394   flag_schedule_speculative_load = 0;
8395 #endif
8396
8397   /* Taking care of this degenerate case makes the rest of
8398      this code simpler.  */
8399   if (n_basic_blocks == 0)
8400     return;
8401
8402   /* set dump and sched_verbose for the desired debugging output.  If no
8403      dump-file was specified, but -fsched-verbose-N (any N), print to stderr.
8404      For -fsched-verbose-N, N>=10, print everything to stderr.  */
8405   sched_verbose = sched_verbose_param;
8406   if (sched_verbose_param == 0 && dump_file)
8407     sched_verbose = 1;
8408   dump = ((sched_verbose_param >= 10 || !dump_file) ? stderr : dump_file);
8409
8410   nr_inter = 0;
8411   nr_spec = 0;
8412
8413   /* Initialize the unused_*_lists.  We can't use the ones left over from
8414      the previous function, because gcc has freed that memory.  We can use
8415      the ones left over from the first sched pass in the second pass however,
8416      so only clear them on the first sched pass.  The first pass is before
8417      reload if flag_schedule_insns is set, otherwise it is afterwards.  */
8418
8419   if (reload_completed == 0 || !flag_schedule_insns)
8420     {
8421       unused_insn_list = 0;
8422       unused_expr_list = 0;
8423     }
8424
8425   /* initialize issue_rate */
8426   issue_rate = ISSUE_RATE;
8427
8428   /* do the splitting first for all blocks */
8429   for (b = 0; b < n_basic_blocks; b++)
8430     split_block_insns (b);
8431
8432   max_uid = (get_max_uid () + 1);
8433
8434   cant_move = (char *) xmalloc (max_uid * sizeof (char));
8435   bzero ((char *) cant_move, max_uid * sizeof (char));
8436
8437   fed_by_spec_load = (char *) xmalloc (max_uid * sizeof (char));
8438   bzero ((char *) fed_by_spec_load, max_uid * sizeof (char));
8439
8440   is_load_insn = (char *) xmalloc (max_uid * sizeof (char));
8441   bzero ((char *) is_load_insn, max_uid * sizeof (char));
8442
8443   insn_orig_block = (int *) xmalloc (max_uid * sizeof (int));
8444   insn_luid = (int *) xmalloc (max_uid * sizeof (int));
8445
8446   luid = 0;
8447   for (b = 0; b < n_basic_blocks; b++)
8448     for (insn = basic_block_head[b];; insn = NEXT_INSN (insn))
8449       {
8450         INSN_BLOCK (insn) = b;
8451         INSN_LUID (insn) = luid++;
8452
8453         if (insn == basic_block_end[b])
8454           break;
8455       }
8456
8457   /* after reload, remove inter-blocks dependences computed before reload.  */
8458   if (reload_completed)
8459     {
8460       int b;
8461       rtx insn;
8462
8463       for (b = 0; b < n_basic_blocks; b++)
8464         for (insn = basic_block_head[b];; insn = NEXT_INSN (insn))
8465           {
8466             rtx link, prev;
8467
8468             if (GET_RTX_CLASS (GET_CODE (insn)) == 'i')
8469               {
8470                 prev = NULL_RTX;
8471                 link = LOG_LINKS (insn);
8472                 while (link)
8473                   {
8474                     rtx x = XEXP (link, 0);
8475
8476                     if (INSN_BLOCK (x) != b)
8477                       {
8478                         remove_dependence (insn, x);
8479                         link = prev ? XEXP (prev, 1) : LOG_LINKS (insn);
8480                       }
8481                     else
8482                       prev = link, link = XEXP (prev, 1);
8483                   }
8484               }
8485
8486             if (insn == basic_block_end[b])
8487               break;
8488           }
8489     }
8490
8491   nr_regions = 0;
8492   rgn_table = (region *) alloca ((n_basic_blocks) * sizeof (region));
8493   rgn_bb_table = (int *) alloca ((n_basic_blocks) * sizeof (int));
8494   block_to_bb = (int *) alloca ((n_basic_blocks) * sizeof (int));
8495   containing_rgn = (int *) alloca ((n_basic_blocks) * sizeof (int));
8496
8497   /* compute regions for scheduling */
8498   if (reload_completed
8499       || n_basic_blocks == 1
8500       || !flag_schedule_interblock)
8501     {
8502       find_single_block_region ();
8503     }
8504   else
8505     {
8506       /* verify that a 'good' control flow graph can be built */
8507       if (is_cfg_nonregular ())
8508         {
8509           find_single_block_region ();
8510         }
8511       else
8512         {
8513           int_list_ptr *s_preds, *s_succs;
8514           int *num_preds, *num_succs;
8515           sbitmap *dom, *pdom;
8516
8517           s_preds = (int_list_ptr *) alloca (n_basic_blocks
8518                                              * sizeof (int_list_ptr));
8519           s_succs = (int_list_ptr *) alloca (n_basic_blocks
8520                                              * sizeof (int_list_ptr));
8521           num_preds = (int *) alloca (n_basic_blocks * sizeof (int));
8522           num_succs = (int *) alloca (n_basic_blocks * sizeof (int));
8523           dom = sbitmap_vector_alloc (n_basic_blocks, n_basic_blocks);
8524           pdom = sbitmap_vector_alloc (n_basic_blocks, n_basic_blocks);
8525
8526           /* The scheduler runs after flow; therefore, we can't blindly call
8527              back into find_basic_blocks since doing so could invalidate the
8528              info in basic_block_live_at_start.
8529
8530              Consider a block consisting entirely of dead stores; after life
8531              analysis it would be a block of NOTE_INSN_DELETED notes.  If
8532              we call find_basic_blocks again, then the block would be removed
8533              entirely and invalidate our the register live information.
8534
8535              We could (should?) recompute register live information.  Doing
8536              so may even be beneficial.  */
8537
8538           compute_preds_succs (s_preds, s_succs, num_preds, num_succs);
8539
8540           /* Compute the dominators and post dominators.  We don't currently use
8541              post dominators, but we should for speculative motion analysis.  */
8542           compute_dominators (dom, pdom, s_preds, s_succs);
8543
8544           /* build_control_flow will return nonzero if it detects unreachable
8545              blocks or any other irregularity with the cfg which prevents
8546              cross block scheduling.  */
8547           if (build_control_flow (s_preds, s_succs, num_preds, num_succs) != 0)
8548             find_single_block_region ();
8549           else
8550             find_rgns (s_preds, s_succs, num_preds, num_succs, dom);
8551
8552           if (sched_verbose >= 3)
8553             debug_regions ();
8554
8555           /* For now.  This will move as more and more of haifa is converted
8556              to using the cfg code in flow.c  */
8557           free_bb_mem ();
8558           free (dom);
8559           free (pdom);
8560         }
8561     }
8562
8563   /* Allocate data for this pass.  See comments, above,
8564      for what these vectors do.
8565
8566      We use xmalloc instead of alloca, because max_uid can be very large
8567      when there is a lot of function inlining.  If we used alloca, we could
8568      exceed stack limits on some hosts for some inputs.  */
8569   insn_priority = (int *) xmalloc (max_uid * sizeof (int));
8570   insn_reg_weight = (int *) xmalloc (max_uid * sizeof (int));
8571   insn_tick = (int *) xmalloc (max_uid * sizeof (int));
8572   insn_costs = (short *) xmalloc (max_uid * sizeof (short));
8573   insn_units = (short *) xmalloc (max_uid * sizeof (short));
8574   insn_blockage = (unsigned int *) xmalloc (max_uid * sizeof (unsigned int));
8575   insn_ref_count = (int *) xmalloc (max_uid * sizeof (int));
8576
8577   /* Allocate for forward dependencies */
8578   insn_dep_count = (int *) xmalloc (max_uid * sizeof (int));
8579   insn_depend = (rtx *) xmalloc (max_uid * sizeof (rtx));
8580
8581   if (reload_completed == 0)
8582     {
8583       int i;
8584
8585       sched_reg_n_calls_crossed = (int *) alloca (max_regno * sizeof (int));
8586       sched_reg_live_length = (int *) alloca (max_regno * sizeof (int));
8587       sched_reg_basic_block = (int *) alloca (max_regno * sizeof (int));
8588       bb_live_regs = ALLOCA_REG_SET ();
8589       bzero ((char *) sched_reg_n_calls_crossed, max_regno * sizeof (int));
8590       bzero ((char *) sched_reg_live_length, max_regno * sizeof (int));
8591
8592       for (i = 0; i < max_regno; i++)
8593         sched_reg_basic_block[i] = REG_BLOCK_UNKNOWN;
8594     }
8595   else
8596     {
8597       sched_reg_n_calls_crossed = 0;
8598       sched_reg_live_length = 0;
8599       bb_live_regs = 0;
8600     }
8601   init_alias_analysis ();
8602
8603   if (write_symbols != NO_DEBUG)
8604     {
8605       rtx line;
8606
8607       line_note = (rtx *) xmalloc (max_uid * sizeof (rtx));
8608       bzero ((char *) line_note, max_uid * sizeof (rtx));
8609       line_note_head = (rtx *) alloca (n_basic_blocks * sizeof (rtx));
8610       bzero ((char *) line_note_head, n_basic_blocks * sizeof (rtx));
8611
8612       /* Save-line-note-head:
8613          Determine the line-number at the start of each basic block.
8614          This must be computed and saved now, because after a basic block's
8615          predecessor has been scheduled, it is impossible to accurately
8616          determine the correct line number for the first insn of the block.  */
8617
8618       for (b = 0; b < n_basic_blocks; b++)
8619         for (line = basic_block_head[b]; line; line = PREV_INSN (line))
8620           if (GET_CODE (line) == NOTE && NOTE_LINE_NUMBER (line) > 0)
8621             {
8622               line_note_head[b] = line;
8623               break;
8624             }
8625     }
8626
8627   bzero ((char *) insn_priority, max_uid * sizeof (int));
8628   bzero ((char *) insn_reg_weight, max_uid * sizeof (int));
8629   bzero ((char *) insn_tick, max_uid * sizeof (int));
8630   bzero ((char *) insn_costs, max_uid * sizeof (short));
8631   bzero ((char *) insn_units, max_uid * sizeof (short));
8632   bzero ((char *) insn_blockage, max_uid * sizeof (unsigned int));
8633   bzero ((char *) insn_ref_count, max_uid * sizeof (int));
8634
8635   /* Initialize for forward dependencies */
8636   bzero ((char *) insn_depend, max_uid * sizeof (rtx));
8637   bzero ((char *) insn_dep_count, max_uid * sizeof (int));
8638
8639   /* Find units used in this fuction, for visualization */
8640   if (sched_verbose)
8641     init_target_units ();
8642
8643   /* ??? Add a NOTE after the last insn of the last basic block.  It is not
8644      known why this is done.  */
8645
8646   insn = basic_block_end[n_basic_blocks - 1];
8647   if (NEXT_INSN (insn) == 0
8648       || (GET_CODE (insn) != NOTE
8649           && GET_CODE (insn) != CODE_LABEL
8650   /* Don't emit a NOTE if it would end up between an unconditional
8651      jump and a BARRIER.  */
8652           && !(GET_CODE (insn) == JUMP_INSN
8653                && GET_CODE (NEXT_INSN (insn)) == BARRIER)))
8654     emit_note_after (NOTE_INSN_DELETED, basic_block_end[n_basic_blocks - 1]);
8655
8656   /* Schedule every region in the subroutine */
8657   for (rgn = 0; rgn < nr_regions; rgn++)
8658     {
8659       schedule_region (rgn);
8660
8661 #ifdef USE_C_ALLOCA
8662       alloca (0);
8663 #endif
8664     }
8665
8666   /* Reposition the prologue and epilogue notes in case we moved the
8667      prologue/epilogue insns.  */
8668   if (reload_completed)
8669     reposition_prologue_and_epilogue_notes (get_insns ());
8670
8671   /* delete redundant line notes.  */
8672   if (write_symbols != NO_DEBUG)
8673     rm_redundant_line_notes ();
8674
8675   /* Update information about uses of registers in the subroutine.  */
8676   if (reload_completed == 0)
8677     update_reg_usage ();
8678
8679   if (sched_verbose)
8680     {
8681       if (reload_completed == 0 && flag_schedule_interblock)
8682         {
8683           fprintf (dump, "\n;; Procedure interblock/speculative motions == %d/%d \n",
8684                    nr_inter, nr_spec);
8685         }
8686       else
8687         {
8688           if (nr_inter > 0)
8689             abort ();
8690         }
8691       fprintf (dump, "\n\n");
8692     }
8693
8694   free (cant_move);
8695   free (fed_by_spec_load);
8696   free (is_load_insn);
8697   free (insn_orig_block);
8698   free (insn_luid);
8699
8700   free (insn_priority);
8701   free (insn_reg_weight);
8702   free (insn_tick);
8703   free (insn_costs);
8704   free (insn_units);
8705   free (insn_blockage);
8706   free (insn_ref_count);
8707
8708   free (insn_dep_count);
8709   free (insn_depend);
8710
8711   if (write_symbols != NO_DEBUG)
8712     free (line_note);
8713
8714   if (bb_live_regs)
8715     FREE_REG_SET (bb_live_regs);
8716
8717   if (edge_table)
8718     {
8719       free (edge_table);
8720       edge_table = NULL;
8721     }
8722
8723   if (in_edges)
8724     {
8725       free (in_edges);
8726       in_edges = NULL;
8727     }
8728   if (out_edges)
8729     {
8730       free (out_edges);
8731       out_edges = NULL;
8732     }
8733 }
8734 #endif /* INSN_SCHEDULING */