OSDN Git Service

Fix stack overflow found by glibc compile with max optimizations.
[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
457 /* Main entry point of this file.  */
458 void schedule_insns PROTO ((FILE *));
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 void debug_ready_list PROTO ((rtx[], int));
747 static void init_target_units PROTO (());
748 static void insn_print_units PROTO ((rtx));
749 static int get_visual_tbl_length PROTO (());
750 static void init_block_visualization PROTO (());
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_insn_list)
836     {
837       r = unused_insn_list;
838       unused_insn_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 extern 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 void
6280 print_insn_chain (rtx_first)
6281      rtx rtx_first;
6282 {
6283   register rtx tmp_rtx;
6284   char str[BUF_LEN];
6285
6286   strcpy (str, "(nil)\n");
6287   if (rtx_first != 0)
6288     switch (GET_CODE (rtx_first))
6289       {
6290       case INSN:
6291       case JUMP_INSN:
6292       case CALL_INSN:
6293       case NOTE:
6294       case CODE_LABEL:
6295       case BARRIER:
6296         for (tmp_rtx = rtx_first; tmp_rtx != NULL;
6297              tmp_rtx = NEXT_INSN (tmp_rtx))
6298           {
6299             print_insn (str, tmp_rtx, 0);
6300             printf ("%s\n", str);
6301           }
6302         break;
6303       default:
6304         print_insn (str, rtx_first, 0);
6305         printf ("%s\n", str);
6306       }
6307 }                               /* print_insn_chain */
6308
6309 /* Print visualization debugging info */
6310
6311 static void
6312 print_block_visualization (b, s)
6313      int b;
6314      char *s;
6315 {
6316   int unit, i;
6317
6318   /* print header */
6319   fprintf (dump, "\n;;   ==================== scheduling visualization for block %d %s \n", b, s);
6320
6321   /* Print names of units */
6322   fprintf (dump, ";;   %-8s", "clock");
6323   for (unit = 0; unit < FUNCTION_UNITS_SIZE; unit++)
6324     if (function_units[unit].bitmask & target_units)
6325       for (i = 0; i < function_units[unit].multiplicity; i++)
6326         fprintf (dump, "  %-33s", function_units[unit].name);
6327   fprintf (dump, "  %-8s\n", "no-unit");
6328
6329   fprintf (dump, ";;   %-8s", "=====");
6330   for (unit = 0; unit < FUNCTION_UNITS_SIZE; unit++)
6331     if (function_units[unit].bitmask & target_units)
6332       for (i = 0; i < function_units[unit].multiplicity; i++)
6333         fprintf (dump, "  %-33s", "==============================");
6334   fprintf (dump, "  %-8s\n", "=======");
6335
6336   /* Print insns in each cycle */
6337   fprintf (dump, "%s\n", visual_tbl);
6338 }
6339
6340 /* Print insns in the 'no_unit' column of visualization */
6341
6342 static void
6343 visualize_no_unit (insn)
6344      rtx insn;
6345 {
6346   vis_no_unit[n_vis_no_unit] = insn;
6347   n_vis_no_unit++;
6348 }
6349
6350 /* Print insns scheduled in clock, for visualization.  */
6351
6352 static void
6353 visualize_scheduled_insns (b, clock)
6354      int b, clock;
6355 {
6356   int i, unit;
6357
6358   /* if no more room, split table into two */
6359   if (n_visual_lines >= MAX_VISUAL_LINES)
6360     {
6361       print_block_visualization (b, "(incomplete)");
6362       init_block_visualization ();
6363     }
6364
6365   n_visual_lines++;
6366
6367   sprintf (visual_tbl + strlen (visual_tbl), ";;   %-8d", clock);
6368   for (unit = 0; unit < FUNCTION_UNITS_SIZE; unit++)
6369     if (function_units[unit].bitmask & target_units)
6370       for (i = 0; i < function_units[unit].multiplicity; i++)
6371         {
6372           int instance = unit + i * FUNCTION_UNITS_SIZE;
6373           rtx insn = unit_last_insn[instance];
6374
6375           /* print insns that still keep the unit busy */
6376           if (insn &&
6377               actual_hazard_this_instance (unit, instance, insn, clock, 0))
6378             {
6379               char str[BUF_LEN];
6380               print_insn (str, insn, 0);
6381               str[INSN_LEN] = '\0';
6382               sprintf (visual_tbl + strlen (visual_tbl), "  %-33s", str);
6383             }
6384           else
6385             sprintf (visual_tbl + strlen (visual_tbl), "  %-33s", "------------------------------");
6386         }
6387
6388   /* print insns that are not assigned to any unit */
6389   for (i = 0; i < n_vis_no_unit; i++)
6390     sprintf (visual_tbl + strlen (visual_tbl), "  %-8d",
6391              INSN_UID (vis_no_unit[i]));
6392   n_vis_no_unit = 0;
6393
6394   sprintf (visual_tbl + strlen (visual_tbl), "\n");
6395 }
6396
6397 /* Print stalled cycles */
6398
6399 static void
6400 visualize_stall_cycles (b, stalls)
6401      int b, stalls;
6402 {
6403   int i;
6404
6405   /* if no more room, split table into two */
6406   if (n_visual_lines >= MAX_VISUAL_LINES)
6407     {
6408       print_block_visualization (b, "(incomplete)");
6409       init_block_visualization ();
6410     }
6411
6412   n_visual_lines++;
6413
6414   sprintf (visual_tbl + strlen (visual_tbl), ";;       ");
6415   for (i = 0; i < stalls; i++)
6416     sprintf (visual_tbl + strlen (visual_tbl), ".");
6417   sprintf (visual_tbl + strlen (visual_tbl), "\n");
6418 }
6419
6420 /* move_insn1: Remove INSN from insn chain, and link it after LAST insn */
6421
6422 static rtx
6423 move_insn1 (insn, last)
6424      rtx insn, last;
6425 {
6426   NEXT_INSN (PREV_INSN (insn)) = NEXT_INSN (insn);
6427   PREV_INSN (NEXT_INSN (insn)) = PREV_INSN (insn);
6428
6429   NEXT_INSN (insn) = NEXT_INSN (last);
6430   PREV_INSN (NEXT_INSN (last)) = insn;
6431
6432   NEXT_INSN (last) = insn;
6433   PREV_INSN (insn) = last;
6434
6435   return insn;
6436 }
6437
6438 /* Search INSN for fake REG_DEAD note pairs for NOTE_INSN_SETJMP,
6439    NOTE_INSN_{LOOP,EHREGION}_{BEG,END}; and convert them back into
6440    NOTEs.  The REG_DEAD note following first one is contains the saved
6441    value for NOTE_BLOCK_NUMBER which is useful for
6442    NOTE_INSN_EH_REGION_{BEG,END} NOTEs.  LAST is the last instruction
6443    output by the instruction scheduler.  Return the new value of LAST.  */
6444
6445 static rtx
6446 reemit_notes (insn, last)
6447      rtx insn;
6448      rtx last;
6449 {
6450   rtx note, retval;
6451
6452   retval = last;
6453   for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
6454     {
6455       if (REG_NOTE_KIND (note) == REG_DEAD
6456           && GET_CODE (XEXP (note, 0)) == CONST_INT)
6457         {
6458           if (INTVAL (XEXP (note, 0)) == NOTE_INSN_SETJMP)
6459             {
6460               retval = emit_note_after (INTVAL (XEXP (note, 0)), insn);
6461               CONST_CALL_P (retval) = CONST_CALL_P (note);
6462               remove_note (insn, note);
6463               note = XEXP (note, 1);
6464             }
6465           else
6466             {
6467               last = emit_note_before (INTVAL (XEXP (note, 0)), last);
6468               remove_note (insn, note);
6469               note = XEXP (note, 1);
6470               NOTE_BLOCK_NUMBER (last) = INTVAL (XEXP (note, 0));
6471             }
6472           remove_note (insn, note);
6473         }
6474     }
6475   return retval;
6476 }
6477
6478 /* Move INSN, and all insns which should be issued before it,
6479    due to SCHED_GROUP_P flag.  Reemit notes if needed.
6480
6481    Return the last insn emitted by the scheduler, which is the
6482    return value from the first call to reemit_notes.  */
6483
6484 static rtx
6485 move_insn (insn, last)
6486      rtx insn, last;
6487 {
6488   rtx retval = NULL;
6489
6490   /* If INSN has SCHED_GROUP_P set, then issue it and any other
6491      insns with SCHED_GROUP_P set first.  */
6492   while (SCHED_GROUP_P (insn))
6493     {
6494       rtx prev = PREV_INSN (insn);
6495
6496       /* Move a SCHED_GROUP_P insn.  */
6497       move_insn1 (insn, last);
6498       /* If this is the first call to reemit_notes, then record
6499          its return value.  */
6500       if (retval == NULL_RTX)
6501         retval = reemit_notes (insn, insn);
6502       else
6503         reemit_notes (insn, insn);
6504       insn = prev;
6505     }
6506
6507   /* Now move the first non SCHED_GROUP_P insn.  */
6508   move_insn1 (insn, last);
6509
6510   /* If this is the first call to reemit_notes, then record
6511      its return value.  */
6512   if (retval == NULL_RTX)
6513     retval = reemit_notes (insn, insn);
6514   else
6515     reemit_notes (insn, insn);
6516
6517   return retval;
6518 }
6519
6520 /* Return an insn which represents a SCHED_GROUP, which is
6521    the last insn in the group.  */
6522
6523 static rtx
6524 group_leader (insn)
6525      rtx insn;
6526 {
6527   rtx prev;
6528
6529   do
6530     {
6531       prev = insn;
6532       insn = next_nonnote_insn (insn);
6533     }
6534   while (insn && SCHED_GROUP_P (insn) && (GET_CODE (insn) != CODE_LABEL));
6535
6536   return prev;
6537 }
6538
6539 /* Use forward list scheduling to rearrange insns of block BB in region RGN,
6540    possibly bringing insns from subsequent blocks in the same region.
6541    Return number of insns scheduled.  */
6542
6543 static int
6544 schedule_block (bb, rgn_n_insns)
6545      int bb;
6546      int rgn_n_insns;
6547 {
6548   /* Local variables.  */
6549   rtx insn, last;
6550   rtx *ready;
6551   int i;
6552   int n_ready = 0;
6553   int can_issue_more;
6554
6555   /* flow block of this bb */
6556   int b = BB_TO_BLOCK (bb);
6557
6558   /* target_n_insns == number of insns in b before scheduling starts.
6559      sched_target_n_insns == how many of b's insns were scheduled.
6560      sched_n_insns == how many insns were scheduled in b */
6561   int target_n_insns = 0;
6562   int sched_target_n_insns = 0;
6563   int sched_n_insns = 0;
6564
6565 #define NEED_NOTHING    0
6566 #define NEED_HEAD       1
6567 #define NEED_TAIL       2
6568   int new_needs;
6569
6570   /* head/tail info for this block */
6571   rtx prev_head;
6572   rtx next_tail;
6573   rtx head;
6574   rtx tail;
6575   int bb_src;
6576
6577   /* We used to have code to avoid getting parameters moved from hard
6578      argument registers into pseudos.
6579
6580      However, it was removed when it proved to be of marginal benefit
6581      and caused problems because schedule_block and compute_forward_dependences
6582      had different notions of what the "head" insn was.  */
6583   get_block_head_tail (bb, &head, &tail);
6584
6585   /* Interblock scheduling could have moved the original head insn from this
6586      block into a proceeding block.  This may also cause schedule_block and
6587      compute_forward_dependences to have different notions of what the
6588      "head" insn was.
6589
6590      If the interblock movement happened to make this block start with
6591      some notes (LOOP, EH or SETJMP) before the first real insn, then
6592      HEAD will have various special notes attached to it which must be
6593      removed so that we don't end up with extra copies of the notes.  */
6594   if (GET_RTX_CLASS (GET_CODE (head)) == 'i')
6595     {
6596       rtx note;
6597
6598       for (note = REG_NOTES (head); note; note = XEXP (note, 1))
6599         if (REG_NOTE_KIND (note) == REG_DEAD
6600             && GET_CODE (XEXP (note, 0)) == CONST_INT)
6601           remove_note (head, note);
6602     }
6603
6604   next_tail = NEXT_INSN (tail);
6605   prev_head = PREV_INSN (head);
6606
6607   /* If the only insn left is a NOTE or a CODE_LABEL, then there is no need
6608      to schedule this block.  */
6609   if (head == tail
6610       && (GET_RTX_CLASS (GET_CODE (head)) != 'i'))
6611     return (sched_n_insns);
6612
6613   /* debug info */
6614   if (sched_verbose)
6615     {
6616       fprintf (dump, ";;   ======================================================\n");
6617       fprintf (dump,
6618                ";;   -- basic block %d from %d to %d -- %s reload\n",
6619                b, INSN_UID (basic_block_head[b]),
6620                INSN_UID (basic_block_end[b]),
6621                (reload_completed ? "after" : "before"));
6622       fprintf (dump, ";;   ======================================================\n");
6623       fprintf (dump, "\n");
6624
6625       visual_tbl = (char *) alloca (get_visual_tbl_length ());
6626       init_block_visualization ();
6627     }
6628
6629   /* remove remaining note insns from the block, save them in
6630      note_list.  These notes are restored at the end of
6631      schedule_block ().  */
6632   note_list = 0;
6633   rm_other_notes (head, tail);
6634
6635   target_bb = bb;
6636
6637   /* prepare current target block info */
6638   if (current_nr_blocks > 1)
6639     {
6640       candidate_table = (candidate *) alloca (current_nr_blocks * sizeof (candidate));
6641
6642       bblst_last = 0;
6643       /* ??? It is not clear why bblst_size is computed this way.  The original
6644          number was clearly too small as it resulted in compiler failures.
6645          Multiplying by the original number by 2 (to account for update_bbs
6646          members) seems to be a reasonable solution.  */
6647       /* ??? Or perhaps there is a bug somewhere else in this file?  */
6648       bblst_size = (current_nr_blocks - bb) * rgn_nr_edges * 2;
6649       bblst_table = (int *) alloca (bblst_size * sizeof (int));
6650
6651       bitlst_table_last = 0;
6652       bitlst_table_size = rgn_nr_edges;
6653       bitlst_table = (int *) alloca (rgn_nr_edges * sizeof (int));
6654
6655       compute_trg_info (bb);
6656     }
6657
6658   clear_units ();
6659
6660   /* Allocate the ready list */
6661   ready = (rtx *) alloca ((rgn_n_insns + 1) * sizeof (rtx));
6662
6663   /* Print debugging information.  */
6664   if (sched_verbose >= 5)
6665     debug_dependencies ();
6666
6667
6668   /* Initialize ready list with all 'ready' insns in target block.
6669      Count number of insns in the target block being scheduled.  */
6670   n_ready = 0;
6671   for (insn = head; insn != next_tail; insn = NEXT_INSN (insn))
6672     {
6673       rtx next;
6674
6675       if (GET_RTX_CLASS (GET_CODE (insn)) != 'i')
6676         continue;
6677       next = NEXT_INSN (insn);
6678
6679       if (INSN_DEP_COUNT (insn) == 0
6680           && (SCHED_GROUP_P (next) == 0 || GET_RTX_CLASS (GET_CODE (next)) != 'i'))
6681         ready[n_ready++] = insn;
6682       if (!(SCHED_GROUP_P (insn)))
6683         target_n_insns++;
6684     }
6685
6686   /* Add to ready list all 'ready' insns in valid source blocks.
6687      For speculative insns, check-live, exception-free, and
6688      issue-delay.  */
6689   for (bb_src = bb + 1; bb_src < current_nr_blocks; bb_src++)
6690     if (IS_VALID (bb_src))
6691       {
6692         rtx src_head;
6693         rtx src_next_tail;
6694         rtx tail, head;
6695
6696         get_block_head_tail (bb_src, &head, &tail);
6697         src_next_tail = NEXT_INSN (tail);
6698         src_head = head;
6699
6700         if (head == tail
6701             && (GET_RTX_CLASS (GET_CODE (head)) != 'i'))
6702           continue;
6703
6704         for (insn = src_head; insn != src_next_tail; insn = NEXT_INSN (insn))
6705           {
6706             if (GET_RTX_CLASS (GET_CODE (insn)) != 'i')
6707               continue;
6708
6709             if (!CANT_MOVE (insn)
6710                 && (!IS_SPECULATIVE_INSN (insn)
6711                     || (insn_issue_delay (insn) <= 3
6712                         && check_live (insn, bb_src)
6713                         && is_exception_free (insn, bb_src, target_bb))))
6714
6715               {
6716                 rtx next;
6717
6718                 next = NEXT_INSN (insn);
6719                 if (INSN_DEP_COUNT (insn) == 0
6720                     && (SCHED_GROUP_P (next) == 0
6721                         || GET_RTX_CLASS (GET_CODE (next)) != 'i'))
6722                   ready[n_ready++] = insn;
6723               }
6724           }
6725       }
6726
6727   /* no insns scheduled in this block yet */
6728   last_scheduled_insn = 0;
6729
6730   /* Sort the ready list */
6731   SCHED_SORT (ready, n_ready);
6732
6733   if (sched_verbose >= 2)
6734     {
6735       fprintf (dump, ";;\t\tReady list initially:             ");
6736       debug_ready_list (ready, n_ready);
6737     }
6738
6739   /* Q_SIZE is the total number of insns in the queue.  */
6740   q_ptr = 0;
6741   q_size = 0;
6742   clock_var = 0;
6743   bzero ((char *) insn_queue, sizeof (insn_queue));
6744
6745   /* We start inserting insns after PREV_HEAD.  */
6746   last = prev_head;
6747
6748   /* Initialize INSN_QUEUE, LIST and NEW_NEEDS.  */
6749   new_needs = (NEXT_INSN (prev_head) == basic_block_head[b]
6750                ? NEED_HEAD : NEED_NOTHING);
6751   if (PREV_INSN (next_tail) == basic_block_end[b])
6752     new_needs |= NEED_TAIL;
6753
6754   /* loop until all the insns in BB are scheduled.  */
6755   while (sched_target_n_insns < target_n_insns)
6756     {
6757       int b1;
6758
6759       clock_var++;
6760
6761       /* Add to the ready list all pending insns that can be issued now.
6762          If there are no ready insns, increment clock until one
6763          is ready and add all pending insns at that point to the ready
6764          list.  */
6765       n_ready = queue_to_ready (ready, n_ready);
6766
6767       if (n_ready == 0)
6768         abort ();
6769
6770       if (sched_verbose >= 2)
6771         {
6772           fprintf (dump, ";;\t\tReady list after queue_to_ready:  ");
6773           debug_ready_list (ready, n_ready);
6774         }
6775
6776       /* Sort the ready list.  */
6777       SCHED_SORT (ready, n_ready);
6778
6779       if (sched_verbose)
6780         {
6781           fprintf (dump, "\n;;\tReady list (t =%3d):  ", clock_var);
6782           debug_ready_list (ready, n_ready);
6783         }
6784
6785       /* Issue insns from ready list.
6786          It is important to count down from n_ready, because n_ready may change
6787          as insns are issued.  */
6788       can_issue_more = issue_rate;
6789       for (i = n_ready - 1; i >= 0 && can_issue_more; i--)
6790         {
6791           rtx insn = ready[i];
6792           int cost = actual_hazard (insn_unit (insn), insn, clock_var, 0);
6793
6794           if (cost > 1)
6795             {
6796               queue_insn (insn, cost);
6797               ready[i] = ready[--n_ready];      /* remove insn from ready list */
6798             }
6799           else if (cost == 0)
6800             {
6801               /* an interblock motion? */
6802               if (INSN_BB (insn) != target_bb)
6803                 {
6804                   rtx temp;
6805
6806                   if (IS_SPECULATIVE_INSN (insn))
6807                     {
6808
6809                       if (!check_live (insn, INSN_BB (insn)))
6810                         {
6811                           /* speculative motion, live check failed, remove
6812                              insn from ready list */
6813                           ready[i] = ready[--n_ready];
6814                           continue;
6815                         }
6816                       update_live (insn, INSN_BB (insn));
6817
6818                       /* for speculative load, mark insns fed by it.  */
6819                       if (IS_LOAD_INSN (insn) || FED_BY_SPEC_LOAD (insn))
6820                         set_spec_fed (insn);
6821
6822                       nr_spec++;
6823                     }
6824                   nr_inter++;
6825
6826                   temp = insn;
6827                   while (SCHED_GROUP_P (temp))
6828                     temp = PREV_INSN (temp);
6829
6830                   /* Update source block boundaries.   */
6831                   b1 = INSN_BLOCK (temp);
6832                   if (temp == basic_block_head[b1]
6833                       && insn == basic_block_end[b1])
6834                     {
6835                       /* We moved all the insns in the basic block.
6836                          Emit a note after the last insn and update the
6837                          begin/end boundaries to point to the note.  */
6838                       emit_note_after (NOTE_INSN_DELETED, insn);
6839                       basic_block_end[b1] = NEXT_INSN (insn);
6840                       basic_block_head[b1] = NEXT_INSN (insn);
6841                     }
6842                   else if (insn == basic_block_end[b1])
6843                     {
6844                       /* We took insns from the end of the basic block,
6845                          so update the end of block boundary so that it
6846                          points to the first insn we did not move.  */
6847                       basic_block_end[b1] = PREV_INSN (temp);
6848                     }
6849                   else if (temp == basic_block_head[b1])
6850                     {
6851                       /* We took insns from the start of the basic block,
6852                          so update the start of block boundary so that
6853                          it points to the first insn we did not move.  */
6854                       basic_block_head[b1] = NEXT_INSN (insn);
6855                     }
6856                 }
6857               else
6858                 {
6859                   /* in block motion */
6860                   sched_target_n_insns++;
6861                 }
6862
6863               last_scheduled_insn = insn;
6864               last = move_insn (insn, last);
6865               sched_n_insns++;
6866
6867               can_issue_more--;
6868
6869               n_ready = schedule_insn (insn, ready, n_ready, clock_var);
6870
6871               /* remove insn from ready list */
6872               ready[i] = ready[--n_ready];
6873
6874               /* close this block after scheduling its jump */
6875               if (GET_CODE (last_scheduled_insn) == JUMP_INSN)
6876                 break;
6877             }
6878         }
6879
6880       /* debug info */
6881       if (sched_verbose)
6882         {
6883           visualize_scheduled_insns (b, clock_var);
6884         }
6885     }
6886
6887   /* debug info */
6888   if (sched_verbose)
6889     {
6890       fprintf (dump, ";;\tReady list (final):  ");
6891       debug_ready_list (ready, n_ready);
6892       print_block_visualization (b, "");
6893     }
6894
6895   /* Sanity check -- queue must be empty now.  Meaningless if region has
6896      multiple bbs.  */
6897   if (current_nr_blocks > 1)
6898     if (!flag_schedule_interblock && q_size != 0)
6899       abort ();
6900
6901   /* update head/tail boundaries.  */
6902   head = NEXT_INSN (prev_head);
6903   tail = last;
6904
6905   /* Restore-other-notes: NOTE_LIST is the end of a chain of notes
6906      previously found among the insns.  Insert them at the beginning
6907      of the insns.  */
6908   if (note_list != 0)
6909     {
6910       rtx note_head = note_list;
6911
6912       while (PREV_INSN (note_head))
6913         {
6914           note_head = PREV_INSN (note_head);
6915         }
6916
6917       PREV_INSN (note_head) = PREV_INSN (head);
6918       NEXT_INSN (PREV_INSN (head)) = note_head;
6919       PREV_INSN (head) = note_list;
6920       NEXT_INSN (note_list) = head;
6921       head = note_head;
6922     }
6923
6924   /* update target block boundaries.  */
6925   if (new_needs & NEED_HEAD)
6926     basic_block_head[b] = head;
6927
6928   if (new_needs & NEED_TAIL)
6929     basic_block_end[b] = tail;
6930
6931   /* debugging */
6932   if (sched_verbose)
6933     {
6934       fprintf (dump, ";;   total time = %d\n;;   new basic block head = %d\n",
6935                clock_var, INSN_UID (basic_block_head[b]));
6936       fprintf (dump, ";;   new basic block end = %d\n\n",
6937                INSN_UID (basic_block_end[b]));
6938     }
6939
6940   return (sched_n_insns);
6941 }                               /* schedule_block () */
6942 \f
6943
6944 /* print the bit-set of registers, S.  callable from debugger */
6945
6946 extern void
6947 debug_reg_vector (s)
6948      regset s;
6949 {
6950   int regno;
6951
6952   EXECUTE_IF_SET_IN_REG_SET (s, 0, regno,
6953                              {
6954                                fprintf (dump, " %d", regno);
6955                              });
6956
6957   fprintf (dump, "\n");
6958 }
6959
6960 /* Use the backward dependences from LOG_LINKS to build
6961    forward dependences in INSN_DEPEND.  */
6962
6963 static void
6964 compute_block_forward_dependences (bb)
6965      int bb;
6966 {
6967   rtx insn, link;
6968   rtx tail, head;
6969   rtx next_tail;
6970   enum reg_note dep_type;
6971
6972   get_block_head_tail (bb, &head, &tail);
6973   next_tail = NEXT_INSN (tail);
6974   for (insn = head; insn != next_tail; insn = NEXT_INSN (insn))
6975     {
6976       if (GET_RTX_CLASS (GET_CODE (insn)) != 'i')
6977         continue;
6978
6979       insn = group_leader (insn);
6980
6981       for (link = LOG_LINKS (insn); link; link = XEXP (link, 1))
6982         {
6983           rtx x = group_leader (XEXP (link, 0));
6984           rtx new_link;
6985
6986           if (x != XEXP (link, 0))
6987             continue;
6988
6989           /* Ignore dependences upon deleted insn */
6990           if (GET_CODE (x) == NOTE || INSN_DELETED_P (x))
6991             continue;
6992           if (find_insn_list (insn, INSN_DEPEND (x)))
6993             continue;
6994
6995           new_link = alloc_INSN_LIST (insn, INSN_DEPEND (x));
6996
6997           dep_type = REG_NOTE_KIND (link);
6998           PUT_REG_NOTE_KIND (new_link, dep_type);
6999
7000           INSN_DEPEND (x) = new_link;
7001           INSN_DEP_COUNT (insn) += 1;
7002         }
7003     }
7004 }
7005
7006 /* Initialize variables for region data dependence analysis.
7007    n_bbs is the number of region blocks */
7008
7009 __inline static void
7010 init_rgn_data_dependences (n_bbs)
7011      int n_bbs;
7012 {
7013   int bb;
7014
7015   /* variables for which one copy exists for each block */
7016   bzero ((char *) bb_pending_read_insns, n_bbs * sizeof (rtx));
7017   bzero ((char *) bb_pending_read_mems, n_bbs * sizeof (rtx));
7018   bzero ((char *) bb_pending_write_insns, n_bbs * sizeof (rtx));
7019   bzero ((char *) bb_pending_write_mems, n_bbs * sizeof (rtx));
7020   bzero ((char *) bb_pending_lists_length, n_bbs * sizeof (rtx));
7021   bzero ((char *) bb_last_pending_memory_flush, n_bbs * sizeof (rtx));
7022   bzero ((char *) bb_last_function_call, n_bbs * sizeof (rtx));
7023   bzero ((char *) bb_sched_before_next_call, n_bbs * sizeof (rtx));
7024
7025   /* Create an insn here so that we can hang dependencies off of it later.  */
7026   for (bb = 0; bb < n_bbs; bb++)
7027     {
7028       bb_sched_before_next_call[bb] =
7029         gen_rtx_INSN (VOIDmode, 0, NULL_RTX, NULL_RTX,
7030                       NULL_RTX, 0, NULL_RTX, NULL_RTX);
7031       LOG_LINKS (bb_sched_before_next_call[bb]) = 0;
7032     }
7033 }
7034
7035 /* Add dependences so that branches are scheduled to run last in their block */
7036
7037 static void
7038 add_branch_dependences (head, tail)
7039      rtx head, tail;
7040 {
7041
7042   rtx insn, last;
7043
7044   /* For all branches, calls, uses, and cc0 setters, force them to remain
7045      in order at the end of the block by adding dependencies and giving
7046      the last a high priority.  There may be notes present, and prev_head
7047      may also be a note.
7048
7049      Branches must obviously remain at the end.  Calls should remain at the
7050      end since moving them results in worse register allocation.  Uses remain
7051      at the end to ensure proper register allocation.  cc0 setters remaim
7052      at the end because they can't be moved away from their cc0 user.  */
7053   insn = tail;
7054   last = 0;
7055   while (GET_CODE (insn) == CALL_INSN || GET_CODE (insn) == JUMP_INSN
7056          || (GET_CODE (insn) == INSN
7057              && (GET_CODE (PATTERN (insn)) == USE
7058 #ifdef HAVE_cc0
7059                  || sets_cc0_p (PATTERN (insn))
7060 #endif
7061              ))
7062          || GET_CODE (insn) == NOTE)
7063     {
7064       if (GET_CODE (insn) != NOTE)
7065         {
7066           if (last != 0
7067               && !find_insn_list (insn, LOG_LINKS (last)))
7068             {
7069               add_dependence (last, insn, REG_DEP_ANTI);
7070               INSN_REF_COUNT (insn)++;
7071             }
7072
7073           CANT_MOVE (insn) = 1;
7074
7075           last = insn;
7076           /* Skip over insns that are part of a group.
7077              Make each insn explicitly depend on the previous insn.
7078              This ensures that only the group header will ever enter
7079              the ready queue (and, when scheduled, will automatically
7080              schedule the SCHED_GROUP_P block).  */
7081           while (SCHED_GROUP_P (insn))
7082             {
7083               rtx temp = prev_nonnote_insn (insn);
7084               add_dependence (insn, temp, REG_DEP_ANTI);
7085               insn = temp;
7086             }
7087         }
7088
7089       /* Don't overrun the bounds of the basic block.  */
7090       if (insn == head)
7091         break;
7092
7093       insn = PREV_INSN (insn);
7094     }
7095
7096   /* make sure these insns are scheduled last in their block */
7097   insn = last;
7098   if (insn != 0)
7099     while (insn != head)
7100       {
7101         insn = prev_nonnote_insn (insn);
7102
7103         if (INSN_REF_COUNT (insn) != 0)
7104           continue;
7105
7106         if (!find_insn_list (last, LOG_LINKS (insn)))
7107           add_dependence (last, insn, REG_DEP_ANTI);
7108         INSN_REF_COUNT (insn) = 1;
7109
7110         /* Skip over insns that are part of a group.  */
7111         while (SCHED_GROUP_P (insn))
7112           insn = prev_nonnote_insn (insn);
7113       }
7114 }
7115
7116 /* Compute bacward dependences inside BB.  In a multiple blocks region:
7117    (1) a bb is analyzed after its predecessors, and (2) the lists in
7118    effect at the end of bb (after analyzing for bb) are inherited by
7119    bb's successrs.
7120
7121    Specifically for reg-reg data dependences, the block insns are
7122    scanned by sched_analyze () top-to-bottom.  Two lists are
7123    naintained by sched_analyze (): reg_last_defs[] for register DEFs,
7124    and reg_last_uses[] for register USEs.
7125
7126    When analysis is completed for bb, we update for its successors:
7127    ;  - DEFS[succ] = Union (DEFS [succ], DEFS [bb])
7128    ;  - USES[succ] = Union (USES [succ], DEFS [bb])
7129
7130    The mechanism for computing mem-mem data dependence is very
7131    similar, and the result is interblock dependences in the region.  */
7132
7133 static void
7134 compute_block_backward_dependences (bb)
7135      int bb;
7136 {
7137   int b;
7138   rtx x;
7139   rtx head, tail;
7140   int max_reg = max_reg_num ();
7141
7142   b = BB_TO_BLOCK (bb);
7143
7144   if (current_nr_blocks == 1)
7145     {
7146       reg_last_uses = (rtx *) alloca (max_reg * sizeof (rtx));
7147       reg_last_sets = (rtx *) alloca (max_reg * sizeof (rtx));
7148
7149       bzero ((char *) reg_last_uses, max_reg * sizeof (rtx));
7150       bzero ((char *) reg_last_sets, max_reg * sizeof (rtx));
7151
7152       pending_read_insns = 0;
7153       pending_read_mems = 0;
7154       pending_write_insns = 0;
7155       pending_write_mems = 0;
7156       pending_lists_length = 0;
7157       last_function_call = 0;
7158       last_pending_memory_flush = 0;
7159       sched_before_next_call
7160         = gen_rtx_INSN (VOIDmode, 0, NULL_RTX, NULL_RTX,
7161                         NULL_RTX, 0, NULL_RTX, NULL_RTX);
7162       LOG_LINKS (sched_before_next_call) = 0;
7163     }
7164   else
7165     {
7166       reg_last_uses = bb_reg_last_uses[bb];
7167       reg_last_sets = bb_reg_last_sets[bb];
7168
7169       pending_read_insns = bb_pending_read_insns[bb];
7170       pending_read_mems = bb_pending_read_mems[bb];
7171       pending_write_insns = bb_pending_write_insns[bb];
7172       pending_write_mems = bb_pending_write_mems[bb];
7173       pending_lists_length = bb_pending_lists_length[bb];
7174       last_function_call = bb_last_function_call[bb];
7175       last_pending_memory_flush = bb_last_pending_memory_flush[bb];
7176
7177       sched_before_next_call = bb_sched_before_next_call[bb];
7178     }
7179
7180   /* do the analysis for this block */
7181   get_block_head_tail (bb, &head, &tail);
7182   sched_analyze (head, tail);
7183   add_branch_dependences (head, tail);
7184
7185   if (current_nr_blocks > 1)
7186     {
7187       int e, first_edge;
7188       int b_succ, bb_succ;
7189       int reg;
7190       rtx link_insn, link_mem;
7191       rtx u;
7192
7193       /* these lists should point to the right place, for correct freeing later.  */
7194       bb_pending_read_insns[bb] = pending_read_insns;
7195       bb_pending_read_mems[bb] = pending_read_mems;
7196       bb_pending_write_insns[bb] = pending_write_insns;
7197       bb_pending_write_mems[bb] = pending_write_mems;
7198
7199       /* bb's structures are inherited by it's successors */
7200       first_edge = e = OUT_EDGES (b);
7201       if (e > 0)
7202         do
7203           {
7204             b_succ = TO_BLOCK (e);
7205             bb_succ = BLOCK_TO_BB (b_succ);
7206
7207             /* only bbs "below" bb, in the same region, are interesting */
7208             if (CONTAINING_RGN (b) != CONTAINING_RGN (b_succ)
7209                 || bb_succ <= bb)
7210               {
7211                 e = NEXT_OUT (e);
7212                 continue;
7213               }
7214
7215             for (reg = 0; reg < max_reg; reg++)
7216               {
7217
7218                 /* reg-last-uses lists are inherited by bb_succ */
7219                 for (u = reg_last_uses[reg]; u; u = XEXP (u, 1))
7220                   {
7221                     if (find_insn_list (XEXP (u, 0), (bb_reg_last_uses[bb_succ])[reg]))
7222                       continue;
7223
7224                     (bb_reg_last_uses[bb_succ])[reg]
7225                       = alloc_INSN_LIST (XEXP (u, 0),
7226                                          (bb_reg_last_uses[bb_succ])[reg]);
7227                   }
7228
7229                 /* reg-last-defs lists are inherited by bb_succ */
7230                 for (u = reg_last_sets[reg]; u; u = XEXP (u, 1))
7231                   {
7232                     if (find_insn_list (XEXP (u, 0), (bb_reg_last_sets[bb_succ])[reg]))
7233                       continue;
7234
7235                     (bb_reg_last_sets[bb_succ])[reg]
7236                       = alloc_INSN_LIST (XEXP (u, 0),
7237                                          (bb_reg_last_sets[bb_succ])[reg]);
7238                   }
7239               }
7240
7241             /* mem read/write lists are inherited by bb_succ */
7242             link_insn = pending_read_insns;
7243             link_mem = pending_read_mems;
7244             while (link_insn)
7245               {
7246                 if (!(find_insn_mem_list (XEXP (link_insn, 0), XEXP (link_mem, 0),
7247                                           bb_pending_read_insns[bb_succ],
7248                                           bb_pending_read_mems[bb_succ])))
7249                   add_insn_mem_dependence (&bb_pending_read_insns[bb_succ],
7250                                            &bb_pending_read_mems[bb_succ],
7251                                    XEXP (link_insn, 0), XEXP (link_mem, 0));
7252                 link_insn = XEXP (link_insn, 1);
7253                 link_mem = XEXP (link_mem, 1);
7254               }
7255
7256             link_insn = pending_write_insns;
7257             link_mem = pending_write_mems;
7258             while (link_insn)
7259               {
7260                 if (!(find_insn_mem_list (XEXP (link_insn, 0), XEXP (link_mem, 0),
7261                                           bb_pending_write_insns[bb_succ],
7262                                           bb_pending_write_mems[bb_succ])))
7263                   add_insn_mem_dependence (&bb_pending_write_insns[bb_succ],
7264                                            &bb_pending_write_mems[bb_succ],
7265                                    XEXP (link_insn, 0), XEXP (link_mem, 0));
7266
7267                 link_insn = XEXP (link_insn, 1);
7268                 link_mem = XEXP (link_mem, 1);
7269               }
7270
7271             /* last_function_call is inherited by bb_succ */
7272             for (u = last_function_call; u; u = XEXP (u, 1))
7273               {
7274                 if (find_insn_list (XEXP (u, 0), bb_last_function_call[bb_succ]))
7275                   continue;
7276
7277                 bb_last_function_call[bb_succ]
7278                   = alloc_INSN_LIST (XEXP (u, 0),
7279                                      bb_last_function_call[bb_succ]);
7280               }
7281
7282             /* last_pending_memory_flush is inherited by bb_succ */
7283             for (u = last_pending_memory_flush; u; u = XEXP (u, 1))
7284               {
7285                 if (find_insn_list (XEXP (u, 0), bb_last_pending_memory_flush[bb_succ]))
7286                   continue;
7287
7288                 bb_last_pending_memory_flush[bb_succ]
7289                   = alloc_INSN_LIST (XEXP (u, 0),
7290                                      bb_last_pending_memory_flush[bb_succ]);
7291               }
7292
7293             /* sched_before_next_call is inherited by bb_succ */
7294             x = LOG_LINKS (sched_before_next_call);
7295             for (; x; x = XEXP (x, 1))
7296               add_dependence (bb_sched_before_next_call[bb_succ],
7297                               XEXP (x, 0), REG_DEP_ANTI);
7298
7299             e = NEXT_OUT (e);
7300           }
7301         while (e != first_edge);
7302     }
7303
7304   /* Free up the INSN_LISTs 
7305
7306      Note this loop is executed max_reg * nr_regions times.  It's first 
7307      implementation accounted for over 90% of the calls to free_list.
7308      The list was empty for the vast majority of those calls.  On the PA,
7309      not calling free_list in those cases improves -O2 compile times by
7310      3-5% on average.  */
7311   for (b = 0; b < max_reg; ++b)
7312     {
7313       if (reg_last_sets[b])
7314         free_list (&reg_last_sets[b], &unused_insn_list);
7315       if (reg_last_uses[b])
7316         free_list (&reg_last_uses[b], &unused_insn_list);
7317     }
7318
7319   /* Assert that we won't need bb_reg_last_* for this block anymore.  */
7320   if (current_nr_blocks > 1)
7321     {
7322       bb_reg_last_uses[bb] = (rtx *) NULL_RTX;
7323       bb_reg_last_sets[bb] = (rtx *) NULL_RTX;
7324     }
7325 }
7326
7327 /* Print dependences for debugging, callable from debugger */
7328
7329 void
7330 debug_dependencies ()
7331 {
7332   int bb;
7333
7334   fprintf (dump, ";;   --------------- forward dependences: ------------ \n");
7335   for (bb = 0; bb < current_nr_blocks; bb++)
7336     {
7337       if (1)
7338         {
7339           rtx head, tail;
7340           rtx next_tail;
7341           rtx insn;
7342
7343           get_block_head_tail (bb, &head, &tail);
7344           next_tail = NEXT_INSN (tail);
7345           fprintf (dump, "\n;;   --- Region Dependences --- b %d bb %d \n",
7346                    BB_TO_BLOCK (bb), bb);
7347
7348           fprintf (dump, ";;   %7s%6s%6s%6s%6s%6s%11s%6s\n",
7349           "insn", "code", "bb", "dep", "prio", "cost", "blockage", "units");
7350           fprintf (dump, ";;   %7s%6s%6s%6s%6s%6s%11s%6s\n",
7351           "----", "----", "--", "---", "----", "----", "--------", "-----");
7352           for (insn = head; insn != next_tail; insn = NEXT_INSN (insn))
7353             {
7354               rtx link;
7355               int unit, range;
7356
7357               if (GET_RTX_CLASS (GET_CODE (insn)) != 'i')
7358                 {
7359                   int n;
7360                   fprintf (dump, ";;   %6d ", INSN_UID (insn));
7361                   if (GET_CODE (insn) == NOTE)
7362                     {
7363                       n = NOTE_LINE_NUMBER (insn);
7364                       if (n < 0)
7365                         fprintf (dump, "%s\n", GET_NOTE_INSN_NAME (n));
7366                       else
7367                         fprintf (dump, "line %d, file %s\n", n,
7368                                  NOTE_SOURCE_FILE (insn));
7369                     }
7370                   else
7371                     fprintf (dump, " {%s}\n", GET_RTX_NAME (GET_CODE (insn)));
7372                   continue;
7373                 }
7374
7375               unit = insn_unit (insn);
7376               range = (unit < 0
7377                  || function_units[unit].blockage_range_function == 0) ? 0 :
7378                 function_units[unit].blockage_range_function (insn);
7379               fprintf (dump,
7380                        ";;   %s%5d%6d%6d%6d%6d%6d  %3d -%3d   ",
7381                        (SCHED_GROUP_P (insn) ? "+" : " "),
7382                        INSN_UID (insn),
7383                        INSN_CODE (insn),
7384                        INSN_BB (insn),
7385                        INSN_DEP_COUNT (insn),
7386                        INSN_PRIORITY (insn),
7387                        insn_cost (insn, 0, 0),
7388                        (int) MIN_BLOCKAGE_COST (range),
7389                        (int) MAX_BLOCKAGE_COST (range));
7390               insn_print_units (insn);
7391               fprintf (dump, "\t: ");
7392               for (link = INSN_DEPEND (insn); link; link = XEXP (link, 1))
7393                 fprintf (dump, "%d ", INSN_UID (XEXP (link, 0)));
7394               fprintf (dump, "\n");
7395             }
7396         }
7397     }
7398   fprintf (dump, "\n");
7399 }
7400
7401 /* Set_priorities: compute priority of each insn in the block */
7402
7403 static int
7404 set_priorities (bb)
7405      int bb;
7406 {
7407   rtx insn;
7408   int n_insn;
7409
7410   rtx tail;
7411   rtx prev_head;
7412   rtx head;
7413
7414   get_block_head_tail (bb, &head, &tail);
7415   prev_head = PREV_INSN (head);
7416
7417   if (head == tail
7418       && (GET_RTX_CLASS (GET_CODE (head)) != 'i'))
7419     return 0;
7420
7421   n_insn = 0;
7422   for (insn = tail; insn != prev_head; insn = PREV_INSN (insn))
7423     {
7424
7425       if (GET_CODE (insn) == NOTE)
7426         continue;
7427
7428       if (!(SCHED_GROUP_P (insn)))
7429         n_insn++;
7430       (void) priority (insn);
7431     }
7432
7433   return n_insn;
7434 }
7435
7436 /* Make each element of VECTOR point at an rtx-vector,
7437    taking the space for all those rtx-vectors from SPACE.
7438    SPACE is of type (rtx *), but it is really as long as NELTS rtx-vectors.
7439    BYTES_PER_ELT is the number of bytes in one rtx-vector.
7440    (this is the same as init_regset_vector () in flow.c) */
7441
7442 static void
7443 init_rtx_vector (vector, space, nelts, bytes_per_elt)
7444      rtx **vector;
7445      rtx *space;
7446      int nelts;
7447      int bytes_per_elt;
7448 {
7449   register int i;
7450   register rtx *p = space;
7451
7452   for (i = 0; i < nelts; i++)
7453     {
7454       vector[i] = p;
7455       p += bytes_per_elt / sizeof (*p);
7456     }
7457 }
7458
7459 /* Schedule a region.  A region is either an inner loop, a loop-free
7460    subroutine, or a single basic block.  Each bb in the region is
7461    scheduled after its flow predecessors.  */
7462
7463 static void
7464 schedule_region (rgn)
7465      int rgn;
7466 {
7467   int bb;
7468   int rgn_n_insns = 0;
7469   int sched_rgn_n_insns = 0;
7470
7471   /* set variables for the current region */
7472   current_nr_blocks = RGN_NR_BLOCKS (rgn);
7473   current_blocks = RGN_BLOCKS (rgn);
7474
7475   reg_pending_sets = ALLOCA_REG_SET ();
7476   reg_pending_sets_all = 0;
7477
7478   /* initializations for region data dependence analyisis */
7479   if (current_nr_blocks > 1)
7480     {
7481       rtx *space;
7482       int maxreg = max_reg_num ();
7483
7484       bb_reg_last_uses = (rtx **) alloca (current_nr_blocks * sizeof (rtx *));
7485       space = (rtx *) alloca (current_nr_blocks * maxreg * sizeof (rtx));
7486       bzero ((char *) space, current_nr_blocks * maxreg * sizeof (rtx));
7487       init_rtx_vector (bb_reg_last_uses, space, current_nr_blocks, maxreg * sizeof (rtx *));
7488
7489       bb_reg_last_sets = (rtx **) alloca (current_nr_blocks * sizeof (rtx *));
7490       space = (rtx *) alloca (current_nr_blocks * maxreg * sizeof (rtx));
7491       bzero ((char *) space, current_nr_blocks * maxreg * sizeof (rtx));
7492       init_rtx_vector (bb_reg_last_sets, space, current_nr_blocks, maxreg * sizeof (rtx *));
7493
7494       bb_pending_read_insns = (rtx *) alloca (current_nr_blocks * sizeof (rtx));
7495       bb_pending_read_mems = (rtx *) alloca (current_nr_blocks * sizeof (rtx));
7496       bb_pending_write_insns = (rtx *) alloca (current_nr_blocks * sizeof (rtx));
7497       bb_pending_write_mems = (rtx *) alloca (current_nr_blocks * sizeof (rtx));
7498       bb_pending_lists_length = (int *) alloca (current_nr_blocks * sizeof (int));
7499       bb_last_pending_memory_flush = (rtx *) alloca (current_nr_blocks * sizeof (rtx));
7500       bb_last_function_call = (rtx *) alloca (current_nr_blocks * sizeof (rtx));
7501       bb_sched_before_next_call = (rtx *) alloca (current_nr_blocks * sizeof (rtx));
7502
7503       init_rgn_data_dependences (current_nr_blocks);
7504     }
7505
7506   /* compute LOG_LINKS */
7507   for (bb = 0; bb < current_nr_blocks; bb++)
7508     compute_block_backward_dependences (bb);
7509
7510   /* compute INSN_DEPEND */
7511   for (bb = current_nr_blocks - 1; bb >= 0; bb--)
7512     compute_block_forward_dependences (bb);
7513
7514   /* Delete line notes, compute live-regs at block end, and set priorities.  */
7515   dead_notes = 0;
7516   for (bb = 0; bb < current_nr_blocks; bb++)
7517     {
7518       if (reload_completed == 0)
7519         find_pre_sched_live (bb);
7520
7521       if (write_symbols != NO_DEBUG)
7522         {
7523           save_line_notes (bb);
7524           rm_line_notes (bb);
7525         }
7526
7527       rgn_n_insns += set_priorities (bb);
7528     }
7529
7530   /* compute interblock info: probabilities, split-edges, dominators, etc.  */
7531   if (current_nr_blocks > 1)
7532     {
7533       int i;
7534
7535       prob = (float *) alloca ((current_nr_blocks) * sizeof (float));
7536
7537       bbset_size = current_nr_blocks / HOST_BITS_PER_WIDE_INT + 1;
7538       dom = (bbset *) alloca (current_nr_blocks * sizeof (bbset));
7539       for (i = 0; i < current_nr_blocks; i++)
7540         {
7541           dom[i] = (bbset) alloca (bbset_size * sizeof (HOST_WIDE_INT));
7542           bzero ((char *) dom[i], bbset_size * sizeof (HOST_WIDE_INT));
7543         }
7544
7545       /* edge to bit */
7546       rgn_nr_edges = 0;
7547       edge_to_bit = (int *) alloca (nr_edges * sizeof (int));
7548       for (i = 1; i < nr_edges; i++)
7549         if (CONTAINING_RGN (FROM_BLOCK (i)) == rgn)
7550           EDGE_TO_BIT (i) = rgn_nr_edges++;
7551       rgn_edges = (int *) alloca (rgn_nr_edges * sizeof (int));
7552
7553       rgn_nr_edges = 0;
7554       for (i = 1; i < nr_edges; i++)
7555         if (CONTAINING_RGN (FROM_BLOCK (i)) == (rgn))
7556           rgn_edges[rgn_nr_edges++] = i;
7557
7558       /* split edges */
7559       edgeset_size = rgn_nr_edges / HOST_BITS_PER_WIDE_INT + 1;
7560       pot_split = (edgeset *) alloca (current_nr_blocks * sizeof (edgeset));
7561       ancestor_edges = (edgeset *) alloca (current_nr_blocks * sizeof (edgeset));
7562       for (i = 0; i < current_nr_blocks; i++)
7563         {
7564           pot_split[i] =
7565             (edgeset) alloca (edgeset_size * sizeof (HOST_WIDE_INT));
7566           bzero ((char *) pot_split[i],
7567                  edgeset_size * sizeof (HOST_WIDE_INT));
7568           ancestor_edges[i] =
7569             (edgeset) alloca (edgeset_size * sizeof (HOST_WIDE_INT));
7570           bzero ((char *) ancestor_edges[i],
7571                  edgeset_size * sizeof (HOST_WIDE_INT));
7572         }
7573
7574       /* compute probabilities, dominators, split_edges */
7575       for (bb = 0; bb < current_nr_blocks; bb++)
7576         compute_dom_prob_ps (bb);
7577     }
7578
7579   /* now we can schedule all blocks */
7580   for (bb = 0; bb < current_nr_blocks; bb++)
7581     {
7582       sched_rgn_n_insns += schedule_block (bb, rgn_n_insns);
7583
7584 #ifdef USE_C_ALLOCA
7585       alloca (0);
7586 #endif
7587     }
7588
7589   /* sanity check: verify that all region insns were scheduled */
7590   if (sched_rgn_n_insns != rgn_n_insns)
7591     abort ();
7592
7593   /* update register life and usage information */
7594   if (reload_completed == 0)
7595     {
7596       for (bb = current_nr_blocks - 1; bb >= 0; bb--)
7597         find_post_sched_live (bb);
7598
7599       if (current_nr_blocks <= 1)
7600         /* Sanity check.  There should be no REG_DEAD notes leftover at the end.
7601            In practice, this can occur as the result of bugs in flow, combine.c,
7602            and/or sched.c.  The values of the REG_DEAD notes remaining are
7603            meaningless, because dead_notes is just used as a free list.  */
7604         if (dead_notes != 0)
7605           abort ();
7606     }
7607
7608   /* restore line notes.  */
7609   if (write_symbols != NO_DEBUG)
7610     {
7611       for (bb = 0; bb < current_nr_blocks; bb++)
7612         restore_line_notes (bb);
7613     }
7614
7615   /* Done with this region */
7616   free_pending_lists ();
7617
7618   FREE_REG_SET (reg_pending_sets);
7619 }
7620
7621 /* Subroutine of split_hard_reg_notes.  Searches X for any reference to
7622    REGNO, returning the rtx of the reference found if any.  Otherwise,
7623    returns 0.  */
7624
7625 static rtx
7626 regno_use_in (regno, x)
7627      int regno;
7628      rtx x;
7629 {
7630   register char *fmt;
7631   int i, j;
7632   rtx tem;
7633
7634   if (GET_CODE (x) == REG && REGNO (x) == regno)
7635     return x;
7636
7637   fmt = GET_RTX_FORMAT (GET_CODE (x));
7638   for (i = GET_RTX_LENGTH (GET_CODE (x)) - 1; i >= 0; i--)
7639     {
7640       if (fmt[i] == 'e')
7641         {
7642           if ((tem = regno_use_in (regno, XEXP (x, i))))
7643             return tem;
7644         }
7645       else if (fmt[i] == 'E')
7646         for (j = XVECLEN (x, i) - 1; j >= 0; j--)
7647           if ((tem = regno_use_in (regno, XVECEXP (x, i, j))))
7648             return tem;
7649     }
7650
7651   return 0;
7652 }
7653
7654 /* Subroutine of update_flow_info.  Determines whether any new REG_NOTEs are
7655    needed for the hard register mentioned in the note.  This can happen
7656    if the reference to the hard register in the original insn was split into
7657    several smaller hard register references in the split insns.  */
7658
7659 static void
7660 split_hard_reg_notes (note, first, last)
7661      rtx note, first, last;
7662 {
7663   rtx reg, temp, link;
7664   int n_regs, i, new_reg;
7665   rtx insn;
7666
7667   /* Assume that this is a REG_DEAD note.  */
7668   if (REG_NOTE_KIND (note) != REG_DEAD)
7669     abort ();
7670
7671   reg = XEXP (note, 0);
7672
7673   n_regs = HARD_REGNO_NREGS (REGNO (reg), GET_MODE (reg));
7674
7675   for (i = 0; i < n_regs; i++)
7676     {
7677       new_reg = REGNO (reg) + i;
7678
7679       /* Check for references to new_reg in the split insns.  */
7680       for (insn = last;; insn = PREV_INSN (insn))
7681         {
7682           if (GET_RTX_CLASS (GET_CODE (insn)) == 'i'
7683               && (temp = regno_use_in (new_reg, PATTERN (insn))))
7684             {
7685               /* Create a new reg dead note ere.  */
7686               link = alloc_EXPR_LIST (REG_DEAD, temp, REG_NOTES (insn));
7687               REG_NOTES (insn) = link;
7688
7689               /* If killed multiple registers here, then add in the excess.  */
7690               i += HARD_REGNO_NREGS (REGNO (temp), GET_MODE (temp)) - 1;
7691
7692               break;
7693             }
7694           /* It isn't mentioned anywhere, so no new reg note is needed for
7695              this register.  */
7696           if (insn == first)
7697             break;
7698         }
7699     }
7700 }
7701
7702 /* Subroutine of update_flow_info.  Determines whether a SET or CLOBBER in an
7703    insn created by splitting needs a REG_DEAD or REG_UNUSED note added.  */
7704
7705 static void
7706 new_insn_dead_notes (pat, insn, last, orig_insn)
7707      rtx pat, insn, last, orig_insn;
7708 {
7709   rtx dest, tem, set;
7710
7711   /* PAT is either a CLOBBER or a SET here.  */
7712   dest = XEXP (pat, 0);
7713
7714   while (GET_CODE (dest) == ZERO_EXTRACT || GET_CODE (dest) == SUBREG
7715          || GET_CODE (dest) == STRICT_LOW_PART
7716          || GET_CODE (dest) == SIGN_EXTRACT)
7717     dest = XEXP (dest, 0);
7718
7719   if (GET_CODE (dest) == REG)
7720     {
7721       /* If the original insn already used this register, we may not add new
7722          notes for it.  One example for a split that needs this test is
7723          when a multi-word memory access with register-indirect addressing
7724          is split into multiple memory accesses with auto-increment and
7725          one adjusting add instruction for the address register.  */
7726       if (reg_referenced_p (dest, PATTERN (orig_insn)))
7727         return;
7728       for (tem = last; tem != insn; tem = PREV_INSN (tem))
7729         {
7730           if (GET_RTX_CLASS (GET_CODE (tem)) == 'i'
7731               && reg_overlap_mentioned_p (dest, PATTERN (tem))
7732               && (set = single_set (tem)))
7733             {
7734               rtx tem_dest = SET_DEST (set);
7735
7736               while (GET_CODE (tem_dest) == ZERO_EXTRACT
7737                      || GET_CODE (tem_dest) == SUBREG
7738                      || GET_CODE (tem_dest) == STRICT_LOW_PART
7739                      || GET_CODE (tem_dest) == SIGN_EXTRACT)
7740                 tem_dest = XEXP (tem_dest, 0);
7741
7742               if (!rtx_equal_p (tem_dest, dest))
7743                 {
7744                   /* Use the same scheme as combine.c, don't put both REG_DEAD
7745                      and REG_UNUSED notes on the same insn.  */
7746                   if (!find_regno_note (tem, REG_UNUSED, REGNO (dest))
7747                       && !find_regno_note (tem, REG_DEAD, REGNO (dest)))
7748                     {
7749                       rtx note = alloc_EXPR_LIST (REG_DEAD, dest,
7750                                                   REG_NOTES (tem));
7751                       REG_NOTES (tem) = note;
7752                     }
7753                   /* The reg only dies in one insn, the last one that uses
7754                      it.  */
7755                   break;
7756                 }
7757               else if (reg_overlap_mentioned_p (dest, SET_SRC (set)))
7758                 /* We found an instruction that both uses the register,
7759                    and sets it, so no new REG_NOTE is needed for this set.  */
7760                 break;
7761             }
7762         }
7763       /* If this is a set, it must die somewhere, unless it is the dest of
7764          the original insn, and hence is live after the original insn.  Abort
7765          if it isn't supposed to be live after the original insn.
7766
7767          If this is a clobber, then just add a REG_UNUSED note.  */
7768       if (tem == insn)
7769         {
7770           int live_after_orig_insn = 0;
7771           rtx pattern = PATTERN (orig_insn);
7772           int i;
7773
7774           if (GET_CODE (pat) == CLOBBER)
7775             {
7776               rtx note = alloc_EXPR_LIST (REG_UNUSED, dest, REG_NOTES (insn));
7777               REG_NOTES (insn) = note;
7778               return;
7779             }
7780
7781           /* The original insn could have multiple sets, so search the
7782              insn for all sets.  */
7783           if (GET_CODE (pattern) == SET)
7784             {
7785               if (reg_overlap_mentioned_p (dest, SET_DEST (pattern)))
7786                 live_after_orig_insn = 1;
7787             }
7788           else if (GET_CODE (pattern) == PARALLEL)
7789             {
7790               for (i = 0; i < XVECLEN (pattern, 0); i++)
7791                 if (GET_CODE (XVECEXP (pattern, 0, i)) == SET
7792                     && reg_overlap_mentioned_p (dest,
7793                                                 SET_DEST (XVECEXP (pattern,
7794                                                                    0, i))))
7795                   live_after_orig_insn = 1;
7796             }
7797
7798           if (!live_after_orig_insn)
7799             abort ();
7800         }
7801     }
7802 }
7803
7804 /* Subroutine of update_flow_info.  Update the value of reg_n_sets for all
7805    registers modified by X.  INC is -1 if the containing insn is being deleted,
7806    and is 1 if the containing insn is a newly generated insn.  */
7807
7808 static void
7809 update_n_sets (x, inc)
7810      rtx x;
7811      int inc;
7812 {
7813   rtx dest = SET_DEST (x);
7814
7815   while (GET_CODE (dest) == STRICT_LOW_PART || GET_CODE (dest) == SUBREG
7816       || GET_CODE (dest) == ZERO_EXTRACT || GET_CODE (dest) == SIGN_EXTRACT)
7817     dest = SUBREG_REG (dest);
7818
7819   if (GET_CODE (dest) == REG)
7820     {
7821       int regno = REGNO (dest);
7822
7823       if (regno < FIRST_PSEUDO_REGISTER)
7824         {
7825           register int i;
7826           int endregno = regno + HARD_REGNO_NREGS (regno, GET_MODE (dest));
7827
7828           for (i = regno; i < endregno; i++)
7829             REG_N_SETS (i) += inc;
7830         }
7831       else
7832         REG_N_SETS (regno) += inc;
7833     }
7834 }
7835
7836 /* Updates all flow-analysis related quantities (including REG_NOTES) for
7837    the insns from FIRST to LAST inclusive that were created by splitting
7838    ORIG_INSN.  NOTES are the original REG_NOTES.  */
7839
7840 static void
7841 update_flow_info (notes, first, last, orig_insn)
7842      rtx notes;
7843      rtx first, last;
7844      rtx orig_insn;
7845 {
7846   rtx insn, note;
7847   rtx next;
7848   rtx orig_dest, temp;
7849   rtx set;
7850
7851   /* Get and save the destination set by the original insn.  */
7852
7853   orig_dest = single_set (orig_insn);
7854   if (orig_dest)
7855     orig_dest = SET_DEST (orig_dest);
7856
7857   /* Move REG_NOTES from the original insn to where they now belong.  */
7858
7859   for (note = notes; note; note = next)
7860     {
7861       next = XEXP (note, 1);
7862       switch (REG_NOTE_KIND (note))
7863         {
7864         case REG_DEAD:
7865         case REG_UNUSED:
7866           /* Move these notes from the original insn to the last new insn where
7867              the register is now set.  */
7868
7869           for (insn = last;; insn = PREV_INSN (insn))
7870             {
7871               if (GET_RTX_CLASS (GET_CODE (insn)) == 'i'
7872                   && reg_mentioned_p (XEXP (note, 0), PATTERN (insn)))
7873                 {
7874                   /* If this note refers to a multiple word hard register, it
7875                      may have been split into several smaller hard register
7876                      references, so handle it specially.  */
7877                   temp = XEXP (note, 0);
7878                   if (REG_NOTE_KIND (note) == REG_DEAD
7879                       && GET_CODE (temp) == REG
7880                       && REGNO (temp) < FIRST_PSEUDO_REGISTER
7881                       && HARD_REGNO_NREGS (REGNO (temp), GET_MODE (temp)) > 1)
7882                     split_hard_reg_notes (note, first, last);
7883                   else
7884                     {
7885                       XEXP (note, 1) = REG_NOTES (insn);
7886                       REG_NOTES (insn) = note;
7887                     }
7888
7889                   /* Sometimes need to convert REG_UNUSED notes to REG_DEAD
7890                      notes.  */
7891                   /* ??? This won't handle multiple word registers correctly,
7892                      but should be good enough for now.  */
7893                   if (REG_NOTE_KIND (note) == REG_UNUSED
7894                       && GET_CODE (XEXP (note, 0)) != SCRATCH
7895                       && !dead_or_set_p (insn, XEXP (note, 0)))
7896                     PUT_REG_NOTE_KIND (note, REG_DEAD);
7897
7898                   /* The reg only dies in one insn, the last one that uses
7899                      it.  */
7900                   break;
7901                 }
7902               /* It must die somewhere, fail it we couldn't find where it died.
7903
7904                  If this is a REG_UNUSED note, then it must be a temporary
7905                  register that was not needed by this instantiation of the
7906                  pattern, so we can safely ignore it.  */
7907               if (insn == first)
7908                 {
7909                   /* After reload, REG_DEAD notes come sometimes an
7910                      instruction after the register actually dies.  */
7911                   if (reload_completed && REG_NOTE_KIND (note) == REG_DEAD)
7912                     {
7913                       XEXP (note, 1) = REG_NOTES (insn);
7914                       REG_NOTES (insn) = note;
7915                       break;
7916                     }
7917                         
7918                   if (REG_NOTE_KIND (note) != REG_UNUSED)
7919                     abort ();
7920
7921                   break;
7922                 }
7923             }
7924           break;
7925
7926         case REG_WAS_0:
7927           /* If the insn that set the register to 0 was deleted, this
7928              note cannot be relied on any longer.  The destination might
7929              even have been moved to memory.
7930              This was observed for SH4 with execute/920501-6.c compilation,
7931              -O2 -fomit-frame-pointer -finline-functions .  */
7932           if (GET_CODE (XEXP (note, 0)) == NOTE
7933               || INSN_DELETED_P (XEXP (note, 0)))
7934             break;
7935           /* This note applies to the dest of the original insn.  Find the
7936              first new insn that now has the same dest, and move the note
7937              there.  */
7938
7939           if (!orig_dest)
7940             abort ();
7941
7942           for (insn = first;; insn = NEXT_INSN (insn))
7943             {
7944               if (GET_RTX_CLASS (GET_CODE (insn)) == 'i'
7945                   && (temp = single_set (insn))
7946                   && rtx_equal_p (SET_DEST (temp), orig_dest))
7947                 {
7948                   XEXP (note, 1) = REG_NOTES (insn);
7949                   REG_NOTES (insn) = note;
7950                   /* The reg is only zero before one insn, the first that
7951                      uses it.  */
7952                   break;
7953                 }
7954               /* If this note refers to a multiple word hard
7955                  register, it may have been split into several smaller
7956                  hard register references.  We could split the notes,
7957                  but simply dropping them is good enough.  */
7958               if (GET_CODE (orig_dest) == REG
7959                   && REGNO (orig_dest) < FIRST_PSEUDO_REGISTER
7960                   && HARD_REGNO_NREGS (REGNO (orig_dest),
7961                                        GET_MODE (orig_dest)) > 1)
7962                     break;
7963               /* It must be set somewhere, fail if we couldn't find where it
7964                  was set.  */
7965               if (insn == last)
7966                 abort ();
7967             }
7968           break;
7969
7970         case REG_EQUAL:
7971         case REG_EQUIV:
7972           /* A REG_EQUIV or REG_EQUAL note on an insn with more than one
7973              set is meaningless.  Just drop the note.  */
7974           if (!orig_dest)
7975             break;
7976
7977         case REG_NO_CONFLICT:
7978           /* These notes apply to the dest of the original insn.  Find the last
7979              new insn that now has the same dest, and move the note there.  */
7980
7981           if (!orig_dest)
7982             abort ();
7983
7984           for (insn = last;; insn = PREV_INSN (insn))
7985             {
7986               if (GET_RTX_CLASS (GET_CODE (insn)) == 'i'
7987                   && (temp = single_set (insn))
7988                   && rtx_equal_p (SET_DEST (temp), orig_dest))
7989                 {
7990                   XEXP (note, 1) = REG_NOTES (insn);
7991                   REG_NOTES (insn) = note;
7992                   /* Only put this note on one of the new insns.  */
7993                   break;
7994                 }
7995
7996               /* The original dest must still be set someplace.  Abort if we
7997                  couldn't find it.  */
7998               if (insn == first)
7999                 {
8000                   /* However, if this note refers to a multiple word hard
8001                      register, it may have been split into several smaller
8002                      hard register references.  We could split the notes,
8003                      but simply dropping them is good enough.  */
8004                   if (GET_CODE (orig_dest) == REG
8005                       && REGNO (orig_dest) < FIRST_PSEUDO_REGISTER
8006                       && HARD_REGNO_NREGS (REGNO (orig_dest),
8007                                            GET_MODE (orig_dest)) > 1)
8008                     break;
8009                   /* Likewise for multi-word memory references.  */
8010                   if (GET_CODE (orig_dest) == MEM
8011                       && SIZE_FOR_MODE (orig_dest) > UNITS_PER_WORD)
8012                     break;
8013                   abort ();
8014                 }
8015             }
8016           break;
8017
8018         case REG_LIBCALL:
8019           /* Move a REG_LIBCALL note to the first insn created, and update
8020              the corresponding REG_RETVAL note.  */
8021           XEXP (note, 1) = REG_NOTES (first);
8022           REG_NOTES (first) = note;
8023
8024           insn = XEXP (note, 0);
8025           note = find_reg_note (insn, REG_RETVAL, NULL_RTX);
8026           if (note)
8027             XEXP (note, 0) = first;
8028           break;
8029
8030         case REG_EXEC_COUNT:
8031           /* Move a REG_EXEC_COUNT note to the first insn created.  */
8032           XEXP (note, 1) = REG_NOTES (first);
8033           REG_NOTES (first) = note;
8034           break;
8035
8036         case REG_RETVAL:
8037           /* Move a REG_RETVAL note to the last insn created, and update
8038              the corresponding REG_LIBCALL note.  */
8039           XEXP (note, 1) = REG_NOTES (last);
8040           REG_NOTES (last) = note;
8041
8042           insn = XEXP (note, 0);
8043           note = find_reg_note (insn, REG_LIBCALL, NULL_RTX);
8044           if (note)
8045             XEXP (note, 0) = last;
8046           break;
8047
8048         case REG_NONNEG:
8049         case REG_BR_PROB:
8050           /* This should be moved to whichever instruction is a JUMP_INSN.  */
8051
8052           for (insn = last;; insn = PREV_INSN (insn))
8053             {
8054               if (GET_CODE (insn) == JUMP_INSN)
8055                 {
8056                   XEXP (note, 1) = REG_NOTES (insn);
8057                   REG_NOTES (insn) = note;
8058                   /* Only put this note on one of the new insns.  */
8059                   break;
8060                 }
8061               /* Fail if we couldn't find a JUMP_INSN.  */
8062               if (insn == first)
8063                 abort ();
8064             }
8065           break;
8066
8067         case REG_INC:
8068           /* reload sometimes leaves obsolete REG_INC notes around.  */
8069           if (reload_completed)
8070             break;
8071           /* This should be moved to whichever instruction now has the
8072              increment operation.  */
8073           abort ();
8074
8075         case REG_LABEL:
8076           /* Should be moved to the new insn(s) which use the label.  */
8077           for (insn = first; insn != NEXT_INSN (last); insn = NEXT_INSN (insn))
8078             if (GET_RTX_CLASS (GET_CODE (insn)) == 'i'
8079                 && reg_mentioned_p (XEXP (note, 0), PATTERN (insn)))
8080               {
8081                 REG_NOTES (insn) = alloc_EXPR_LIST (REG_LABEL,
8082                                                     XEXP (note, 0),
8083                                                     REG_NOTES (insn));
8084               }
8085           break;
8086
8087         case REG_CC_SETTER:
8088         case REG_CC_USER:
8089           /* These two notes will never appear until after reorg, so we don't
8090              have to handle them here.  */
8091         default:
8092           abort ();
8093         }
8094     }
8095
8096   /* Each new insn created, except the last, has a new set.  If the destination
8097      is a register, then this reg is now live across several insns, whereas
8098      previously the dest reg was born and died within the same insn.  To
8099      reflect this, we now need a REG_DEAD note on the insn where this
8100      dest reg dies.
8101
8102      Similarly, the new insns may have clobbers that need REG_UNUSED notes.  */
8103
8104   for (insn = first; insn != last; insn = NEXT_INSN (insn))
8105     {
8106       rtx pat;
8107       int i;
8108
8109       pat = PATTERN (insn);
8110       if (GET_CODE (pat) == SET || GET_CODE (pat) == CLOBBER)
8111         new_insn_dead_notes (pat, insn, last, orig_insn);
8112       else if (GET_CODE (pat) == PARALLEL)
8113         {
8114           for (i = 0; i < XVECLEN (pat, 0); i++)
8115             if (GET_CODE (XVECEXP (pat, 0, i)) == SET
8116                 || GET_CODE (XVECEXP (pat, 0, i)) == CLOBBER)
8117               new_insn_dead_notes (XVECEXP (pat, 0, i), insn, last, orig_insn);
8118         }
8119     }
8120
8121   /* If any insn, except the last, uses the register set by the last insn,
8122      then we need a new REG_DEAD note on that insn.  In this case, there
8123      would not have been a REG_DEAD note for this register in the original
8124      insn because it was used and set within one insn.  */
8125
8126   set = single_set (last);
8127   if (set)
8128     {
8129       rtx dest = SET_DEST (set);
8130
8131       while (GET_CODE (dest) == ZERO_EXTRACT || GET_CODE (dest) == SUBREG
8132              || GET_CODE (dest) == STRICT_LOW_PART
8133              || GET_CODE (dest) == SIGN_EXTRACT)
8134         dest = XEXP (dest, 0);
8135
8136       if (GET_CODE (dest) == REG
8137           /* Global registers are always live, so the code below does not
8138              apply to them.  */
8139           && (REGNO (dest) >= FIRST_PSEUDO_REGISTER
8140               || ! global_regs[REGNO (dest)]))
8141         {
8142           rtx stop_insn = PREV_INSN (first);
8143
8144           /* If the last insn uses the register that it is setting, then
8145              we don't want to put a REG_DEAD note there.  Search backwards
8146              to find the first insn that sets but does not use DEST.  */
8147
8148           insn = last;
8149           if (reg_overlap_mentioned_p (dest, SET_SRC (set)))
8150             {
8151               for (insn = PREV_INSN (insn); insn != first;
8152                    insn = PREV_INSN (insn))
8153                 {
8154                   if ((set = single_set (insn))
8155                       && reg_mentioned_p (dest, SET_DEST (set))
8156                       && ! reg_overlap_mentioned_p (dest, SET_SRC (set)))
8157                     break;
8158                 }
8159             }
8160
8161           /* Now find the first insn that uses but does not set DEST.  */
8162
8163           for (insn = PREV_INSN (insn); insn != stop_insn;
8164                insn = PREV_INSN (insn))
8165             {
8166               if (GET_RTX_CLASS (GET_CODE (insn)) == 'i'
8167                   && reg_mentioned_p (dest, PATTERN (insn))
8168                   && (set = single_set (insn)))
8169                 {
8170                   rtx insn_dest = SET_DEST (set);
8171
8172                   while (GET_CODE (insn_dest) == ZERO_EXTRACT
8173                          || GET_CODE (insn_dest) == SUBREG
8174                          || GET_CODE (insn_dest) == STRICT_LOW_PART
8175                          || GET_CODE (insn_dest) == SIGN_EXTRACT)
8176                     insn_dest = XEXP (insn_dest, 0);
8177
8178                   if (insn_dest != dest)
8179                     {
8180                       note = alloc_EXPR_LIST (REG_DEAD, dest, REG_NOTES (insn));
8181                       REG_NOTES (insn) = note;
8182                       /* The reg only dies in one insn, the last one
8183                          that uses it.  */
8184                       break;
8185                     }
8186                 }
8187             }
8188         }
8189     }
8190
8191   /* If the original dest is modifying a multiple register target, and the
8192      original instruction was split such that the original dest is now set
8193      by two or more SUBREG sets, then the split insns no longer kill the
8194      destination of the original insn.
8195
8196      In this case, if there exists an instruction in the same basic block,
8197      before the split insn, which uses the original dest, and this use is
8198      killed by the original insn, then we must remove the REG_DEAD note on
8199      this insn, because it is now superfluous.
8200
8201      This does not apply when a hard register gets split, because the code
8202      knows how to handle overlapping hard registers properly.  */
8203   if (orig_dest && GET_CODE (orig_dest) == REG)
8204     {
8205       int found_orig_dest = 0;
8206       int found_split_dest = 0;
8207
8208       for (insn = first;; insn = NEXT_INSN (insn))
8209         {
8210           rtx pat;
8211           int i;
8212
8213           /* I'm not sure if this can happen, but let's be safe.  */
8214           if (GET_RTX_CLASS (GET_CODE (insn)) != 'i')
8215             continue;
8216
8217           pat = PATTERN (insn);
8218           i = GET_CODE (pat) == PARALLEL ? XVECLEN (pat, 0) : 0;
8219           set = pat;
8220
8221           for (;;)
8222             {
8223               if (GET_CODE (set) == SET)
8224                 {
8225                   if (GET_CODE (SET_DEST (set)) == REG
8226                       && REGNO (SET_DEST (set)) == REGNO (orig_dest))
8227                     {
8228                       found_orig_dest = 1;
8229                       break;
8230                     }
8231                   else if (GET_CODE (SET_DEST (set)) == SUBREG
8232                            && SUBREG_REG (SET_DEST (set)) == orig_dest)
8233                     {
8234                       found_split_dest = 1;
8235                       break;
8236                     }
8237                 }
8238               if (--i < 0)
8239                 break;
8240               set = XVECEXP (pat, 0, i);
8241             }
8242
8243           if (insn == last)
8244             break;
8245         }
8246
8247       if (found_split_dest)
8248         {
8249           /* Search backwards from FIRST, looking for the first insn that uses
8250              the original dest.  Stop if we pass a CODE_LABEL or a JUMP_INSN.
8251              If we find an insn, and it has a REG_DEAD note, then delete the
8252              note.  */
8253
8254           for (insn = first; insn; insn = PREV_INSN (insn))
8255             {
8256               if (GET_CODE (insn) == CODE_LABEL
8257                   || GET_CODE (insn) == JUMP_INSN)
8258                 break;
8259               else if (GET_RTX_CLASS (GET_CODE (insn)) == 'i'
8260                        && reg_mentioned_p (orig_dest, insn))
8261                 {
8262                   note = find_regno_note (insn, REG_DEAD, REGNO (orig_dest));
8263                   if (note)
8264                     remove_note (insn, note);
8265                 }
8266             }
8267         }
8268       else if (!found_orig_dest)
8269         {
8270           /* This should never happen.  */
8271           abort ();
8272         }
8273     }
8274
8275   /* Update reg_n_sets.  This is necessary to prevent local alloc from
8276      converting REG_EQUAL notes to REG_EQUIV when splitting has modified
8277      a reg from set once to set multiple times.  */
8278
8279   {
8280     rtx x = PATTERN (orig_insn);
8281     RTX_CODE code = GET_CODE (x);
8282
8283     if (code == SET || code == CLOBBER)
8284       update_n_sets (x, -1);
8285     else if (code == PARALLEL)
8286       {
8287         int i;
8288         for (i = XVECLEN (x, 0) - 1; i >= 0; i--)
8289           {
8290             code = GET_CODE (XVECEXP (x, 0, i));
8291             if (code == SET || code == CLOBBER)
8292               update_n_sets (XVECEXP (x, 0, i), -1);
8293           }
8294       }
8295
8296     for (insn = first;; insn = NEXT_INSN (insn))
8297       {
8298         x = PATTERN (insn);
8299         code = GET_CODE (x);
8300
8301         if (code == SET || code == CLOBBER)
8302           update_n_sets (x, 1);
8303         else if (code == PARALLEL)
8304           {
8305             int i;
8306             for (i = XVECLEN (x, 0) - 1; i >= 0; i--)
8307               {
8308                 code = GET_CODE (XVECEXP (x, 0, i));
8309                 if (code == SET || code == CLOBBER)
8310                   update_n_sets (XVECEXP (x, 0, i), 1);
8311               }
8312           }
8313
8314         if (insn == last)
8315           break;
8316       }
8317   }
8318 }
8319
8320 /* Do the splitting of insns in the block b.  */
8321
8322 static void
8323 split_block_insns (b)
8324      int b;
8325 {
8326   rtx insn, next;
8327
8328   for (insn = basic_block_head[b];; insn = next)
8329     {
8330       rtx set, last, first, notes;
8331
8332       /* Can't use `next_real_insn' because that
8333          might go across CODE_LABELS and short-out basic blocks.  */
8334       next = NEXT_INSN (insn);
8335       if (GET_CODE (insn) != INSN)
8336         {
8337           if (insn == basic_block_end[b])
8338             break;
8339
8340           continue;
8341         }
8342
8343       /* Don't split no-op move insns.  These should silently disappear
8344          later in final.  Splitting such insns would break the code
8345          that handles REG_NO_CONFLICT blocks.  */
8346       set = single_set (insn);
8347       if (set && rtx_equal_p (SET_SRC (set), SET_DEST (set)))
8348         {
8349           if (insn == basic_block_end[b])
8350             break;
8351
8352           /* Nops get in the way while scheduling, so delete them now if
8353              register allocation has already been done.  It is too risky
8354              to try to do this before register allocation, and there are
8355              unlikely to be very many nops then anyways.  */
8356           if (reload_completed)
8357             {
8358               PUT_CODE (insn, NOTE);
8359               NOTE_LINE_NUMBER (insn) = NOTE_INSN_DELETED;
8360               NOTE_SOURCE_FILE (insn) = 0;
8361             }
8362
8363           continue;
8364         }
8365
8366       /* Split insns here to get max fine-grain parallelism.  */
8367       first = PREV_INSN (insn);
8368       notes = REG_NOTES (insn);
8369       last = try_split (PATTERN (insn), insn, 1);
8370       if (last != insn)
8371         {
8372           /* try_split returns the NOTE that INSN became.  */
8373           first = NEXT_INSN (first);
8374           update_flow_info (notes, first, last, insn);
8375
8376           PUT_CODE (insn, NOTE);
8377           NOTE_SOURCE_FILE (insn) = 0;
8378           NOTE_LINE_NUMBER (insn) = NOTE_INSN_DELETED;
8379           if (insn == basic_block_head[b])
8380             basic_block_head[b] = first;
8381           if (insn == basic_block_end[b])
8382             {
8383               basic_block_end[b] = last;
8384               break;
8385             }
8386         }
8387
8388       if (insn == basic_block_end[b])
8389         break;
8390     }
8391 }
8392
8393 /* The one entry point in this file.  DUMP_FILE is the dump file for
8394    this pass.  */
8395
8396 void
8397 schedule_insns (dump_file)
8398      FILE *dump_file;
8399 {
8400
8401   int max_uid;
8402   int b;
8403   rtx insn;
8404   int rgn;
8405
8406   int luid;
8407
8408   /* disable speculative loads in their presence if cc0 defined */
8409 #ifdef HAVE_cc0
8410   flag_schedule_speculative_load = 0;
8411 #endif
8412
8413   /* Taking care of this degenerate case makes the rest of
8414      this code simpler.  */
8415   if (n_basic_blocks == 0)
8416     return;
8417
8418   /* set dump and sched_verbose for the desired debugging output.  If no
8419      dump-file was specified, but -fsched-verbose-N (any N), print to stderr.
8420      For -fsched-verbose-N, N>=10, print everything to stderr.  */
8421   sched_verbose = sched_verbose_param;
8422   if (sched_verbose_param == 0 && dump_file)
8423     sched_verbose = 1;
8424   dump = ((sched_verbose_param >= 10 || !dump_file) ? stderr : dump_file);
8425
8426   nr_inter = 0;
8427   nr_spec = 0;
8428
8429   /* Initialize the unused_*_lists.  We can't use the ones left over from
8430      the previous function, because gcc has freed that memory.  We can use
8431      the ones left over from the first sched pass in the second pass however,
8432      so only clear them on the first sched pass.  The first pass is before
8433      reload if flag_schedule_insns is set, otherwise it is afterwards.  */
8434
8435   if (reload_completed == 0 || !flag_schedule_insns)
8436     {
8437       unused_insn_list = 0;
8438       unused_expr_list = 0;
8439     }
8440
8441   /* initialize issue_rate */
8442   issue_rate = ISSUE_RATE;
8443
8444   /* do the splitting first for all blocks */
8445   for (b = 0; b < n_basic_blocks; b++)
8446     split_block_insns (b);
8447
8448   max_uid = (get_max_uid () + 1);
8449
8450   cant_move = (char *) xmalloc (max_uid * sizeof (char));
8451   bzero ((char *) cant_move, max_uid * sizeof (char));
8452
8453   fed_by_spec_load = (char *) xmalloc (max_uid * sizeof (char));
8454   bzero ((char *) fed_by_spec_load, max_uid * sizeof (char));
8455
8456   is_load_insn = (char *) xmalloc (max_uid * sizeof (char));
8457   bzero ((char *) is_load_insn, max_uid * sizeof (char));
8458
8459   insn_orig_block = (int *) xmalloc (max_uid * sizeof (int));
8460   insn_luid = (int *) xmalloc (max_uid * sizeof (int));
8461
8462   luid = 0;
8463   for (b = 0; b < n_basic_blocks; b++)
8464     for (insn = basic_block_head[b];; insn = NEXT_INSN (insn))
8465       {
8466         INSN_BLOCK (insn) = b;
8467         INSN_LUID (insn) = luid++;
8468
8469         if (insn == basic_block_end[b])
8470           break;
8471       }
8472
8473   /* after reload, remove inter-blocks dependences computed before reload.  */
8474   if (reload_completed)
8475     {
8476       int b;
8477       rtx insn;
8478
8479       for (b = 0; b < n_basic_blocks; b++)
8480         for (insn = basic_block_head[b];; insn = NEXT_INSN (insn))
8481           {
8482             rtx link, prev;
8483
8484             if (GET_RTX_CLASS (GET_CODE (insn)) == 'i')
8485               {
8486                 prev = NULL_RTX;
8487                 link = LOG_LINKS (insn);
8488                 while (link)
8489                   {
8490                     rtx x = XEXP (link, 0);
8491
8492                     if (INSN_BLOCK (x) != b)
8493                       {
8494                         remove_dependence (insn, x);
8495                         link = prev ? XEXP (prev, 1) : LOG_LINKS (insn);
8496                       }
8497                     else
8498                       prev = link, link = XEXP (prev, 1);
8499                   }
8500               }
8501
8502             if (insn == basic_block_end[b])
8503               break;
8504           }
8505     }
8506
8507   nr_regions = 0;
8508   rgn_table = (region *) alloca ((n_basic_blocks) * sizeof (region));
8509   rgn_bb_table = (int *) alloca ((n_basic_blocks) * sizeof (int));
8510   block_to_bb = (int *) alloca ((n_basic_blocks) * sizeof (int));
8511   containing_rgn = (int *) alloca ((n_basic_blocks) * sizeof (int));
8512
8513   /* compute regions for scheduling */
8514   if (reload_completed
8515       || n_basic_blocks == 1
8516       || !flag_schedule_interblock)
8517     {
8518       find_single_block_region ();
8519     }
8520   else
8521     {
8522       /* verify that a 'good' control flow graph can be built */
8523       if (is_cfg_nonregular ())
8524         {
8525           find_single_block_region ();
8526         }
8527       else
8528         {
8529           int_list_ptr *s_preds, *s_succs;
8530           int *num_preds, *num_succs;
8531           sbitmap *dom, *pdom;
8532
8533           s_preds = (int_list_ptr *) alloca (n_basic_blocks
8534                                              * sizeof (int_list_ptr));
8535           s_succs = (int_list_ptr *) alloca (n_basic_blocks
8536                                              * sizeof (int_list_ptr));
8537           num_preds = (int *) alloca (n_basic_blocks * sizeof (int));
8538           num_succs = (int *) alloca (n_basic_blocks * sizeof (int));
8539           dom = sbitmap_vector_alloc (n_basic_blocks, n_basic_blocks);
8540           pdom = sbitmap_vector_alloc (n_basic_blocks, n_basic_blocks);
8541
8542           /* The scheduler runs after flow; therefore, we can't blindly call
8543              back into find_basic_blocks since doing so could invalidate the
8544              info in basic_block_live_at_start.
8545
8546              Consider a block consisting entirely of dead stores; after life
8547              analysis it would be a block of NOTE_INSN_DELETED notes.  If
8548              we call find_basic_blocks again, then the block would be removed
8549              entirely and invalidate our the register live information.
8550
8551              We could (should?) recompute register live information.  Doing
8552              so may even be beneficial.  */
8553
8554           compute_preds_succs (s_preds, s_succs, num_preds, num_succs);
8555
8556           /* Compute the dominators and post dominators.  We don't currently use
8557              post dominators, but we should for speculative motion analysis.  */
8558           compute_dominators (dom, pdom, s_preds, s_succs);
8559
8560           /* build_control_flow will return nonzero if it detects unreachable
8561              blocks or any other irregularity with the cfg which prevents
8562              cross block scheduling.  */
8563           if (build_control_flow (s_preds, s_succs, num_preds, num_succs) != 0)
8564             find_single_block_region ();
8565           else
8566             find_rgns (s_preds, s_succs, num_preds, num_succs, dom);
8567
8568           if (sched_verbose >= 3)
8569             debug_regions ();
8570
8571           /* For now.  This will move as more and more of haifa is converted
8572              to using the cfg code in flow.c  */
8573           free_bb_mem ();
8574           free (dom);
8575           free (pdom);
8576         }
8577     }
8578
8579   /* Allocate data for this pass.  See comments, above,
8580      for what these vectors do.
8581
8582      We use xmalloc instead of alloca, because max_uid can be very large
8583      when there is a lot of function inlining.  If we used alloca, we could
8584      exceed stack limits on some hosts for some inputs.  */
8585   insn_priority = (int *) xmalloc (max_uid * sizeof (int));
8586   insn_reg_weight = (int *) xmalloc (max_uid * sizeof (int));
8587   insn_tick = (int *) xmalloc (max_uid * sizeof (int));
8588   insn_costs = (short *) xmalloc (max_uid * sizeof (short));
8589   insn_units = (short *) xmalloc (max_uid * sizeof (short));
8590   insn_blockage = (unsigned int *) xmalloc (max_uid * sizeof (unsigned int));
8591   insn_ref_count = (int *) xmalloc (max_uid * sizeof (int));
8592
8593   /* Allocate for forward dependencies */
8594   insn_dep_count = (int *) xmalloc (max_uid * sizeof (int));
8595   insn_depend = (rtx *) xmalloc (max_uid * sizeof (rtx));
8596
8597   if (reload_completed == 0)
8598     {
8599       int i;
8600
8601       sched_reg_n_calls_crossed = (int *) alloca (max_regno * sizeof (int));
8602       sched_reg_live_length = (int *) alloca (max_regno * sizeof (int));
8603       sched_reg_basic_block = (int *) alloca (max_regno * sizeof (int));
8604       bb_live_regs = ALLOCA_REG_SET ();
8605       bzero ((char *) sched_reg_n_calls_crossed, max_regno * sizeof (int));
8606       bzero ((char *) sched_reg_live_length, max_regno * sizeof (int));
8607
8608       for (i = 0; i < max_regno; i++)
8609         sched_reg_basic_block[i] = REG_BLOCK_UNKNOWN;
8610     }
8611   else
8612     {
8613       sched_reg_n_calls_crossed = 0;
8614       sched_reg_live_length = 0;
8615       bb_live_regs = 0;
8616     }
8617   init_alias_analysis ();
8618
8619   if (write_symbols != NO_DEBUG)
8620     {
8621       rtx line;
8622
8623       line_note = (rtx *) xmalloc (max_uid * sizeof (rtx));
8624       bzero ((char *) line_note, max_uid * sizeof (rtx));
8625       line_note_head = (rtx *) alloca (n_basic_blocks * sizeof (rtx));
8626       bzero ((char *) line_note_head, n_basic_blocks * sizeof (rtx));
8627
8628       /* Save-line-note-head:
8629          Determine the line-number at the start of each basic block.
8630          This must be computed and saved now, because after a basic block's
8631          predecessor has been scheduled, it is impossible to accurately
8632          determine the correct line number for the first insn of the block.  */
8633
8634       for (b = 0; b < n_basic_blocks; b++)
8635         for (line = basic_block_head[b]; line; line = PREV_INSN (line))
8636           if (GET_CODE (line) == NOTE && NOTE_LINE_NUMBER (line) > 0)
8637             {
8638               line_note_head[b] = line;
8639               break;
8640             }
8641     }
8642
8643   bzero ((char *) insn_priority, max_uid * sizeof (int));
8644   bzero ((char *) insn_reg_weight, max_uid * sizeof (int));
8645   bzero ((char *) insn_tick, max_uid * sizeof (int));
8646   bzero ((char *) insn_costs, max_uid * sizeof (short));
8647   bzero ((char *) insn_units, max_uid * sizeof (short));
8648   bzero ((char *) insn_blockage, max_uid * sizeof (unsigned int));
8649   bzero ((char *) insn_ref_count, max_uid * sizeof (int));
8650
8651   /* Initialize for forward dependencies */
8652   bzero ((char *) insn_depend, max_uid * sizeof (rtx));
8653   bzero ((char *) insn_dep_count, max_uid * sizeof (int));
8654
8655   /* Find units used in this fuction, for visualization */
8656   if (sched_verbose)
8657     init_target_units ();
8658
8659   /* ??? Add a NOTE after the last insn of the last basic block.  It is not
8660      known why this is done.  */
8661
8662   insn = basic_block_end[n_basic_blocks - 1];
8663   if (NEXT_INSN (insn) == 0
8664       || (GET_CODE (insn) != NOTE
8665           && GET_CODE (insn) != CODE_LABEL
8666   /* Don't emit a NOTE if it would end up between an unconditional
8667      jump and a BARRIER.  */
8668           && !(GET_CODE (insn) == JUMP_INSN
8669                && GET_CODE (NEXT_INSN (insn)) == BARRIER)))
8670     emit_note_after (NOTE_INSN_DELETED, basic_block_end[n_basic_blocks - 1]);
8671
8672   /* Schedule every region in the subroutine */
8673   for (rgn = 0; rgn < nr_regions; rgn++)
8674     {
8675       schedule_region (rgn);
8676
8677 #ifdef USE_C_ALLOCA
8678       alloca (0);
8679 #endif
8680     }
8681
8682   /* Reposition the prologue and epilogue notes in case we moved the
8683      prologue/epilogue insns.  */
8684   if (reload_completed)
8685     reposition_prologue_and_epilogue_notes (get_insns ());
8686
8687   /* delete redundant line notes.  */
8688   if (write_symbols != NO_DEBUG)
8689     rm_redundant_line_notes ();
8690
8691   /* Update information about uses of registers in the subroutine.  */
8692   if (reload_completed == 0)
8693     update_reg_usage ();
8694
8695   if (sched_verbose)
8696     {
8697       if (reload_completed == 0 && flag_schedule_interblock)
8698         {
8699           fprintf (dump, "\n;; Procedure interblock/speculative motions == %d/%d \n",
8700                    nr_inter, nr_spec);
8701         }
8702       else
8703         {
8704           if (nr_inter > 0)
8705             abort ();
8706         }
8707       fprintf (dump, "\n\n");
8708     }
8709
8710   free (cant_move);
8711   free (fed_by_spec_load);
8712   free (is_load_insn);
8713   free (insn_orig_block);
8714   free (insn_luid);
8715
8716   free (insn_priority);
8717   free (insn_reg_weight);
8718   free (insn_tick);
8719   free (insn_costs);
8720   free (insn_units);
8721   free (insn_blockage);
8722   free (insn_ref_count);
8723
8724   free (insn_dep_count);
8725   free (insn_depend);
8726
8727   if (write_symbols != NO_DEBUG)
8728     free (line_note);
8729
8730   if (bb_live_regs)
8731     FREE_REG_SET (bb_live_regs);
8732
8733   if (edge_table)
8734     {
8735       free (edge_table);
8736       edge_table = NULL;
8737     }
8738
8739   if (in_edges)
8740     {
8741       free (in_edges);
8742       in_edges = NULL;
8743     }
8744   if (out_edges)
8745     {
8746       free (out_edges);
8747       out_edges = NULL;
8748     }
8749 }
8750 #endif /* INSN_SCHEDULING */