OSDN Git Service

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