OSDN Git Service

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