OSDN Git Service

Daily bump.
[pf3gnuchains/gcc-fork.git] / gcc / haifa-sched.c
1 /* Instruction scheduling pass.
2    Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998,
3    1999, 2000, 2001 Free Software Foundation, Inc.
4    Contributed by Michael Tiemann (tiemann@cygnus.com) Enhanced by,
5    and currently maintained by, Jim Wilson (wilson@cygnus.com)
6
7 This file is part of GNU CC.
8
9 GNU CC is free software; you can redistribute it and/or modify it
10 under the terms of the GNU General Public License as published by the
11 Free Software Foundation; either version 2, or (at your option) any
12 later version.
13
14 GNU CC is distributed in the hope that it will be useful, but WITHOUT
15 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
16 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
17 for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with GNU CC; see the file COPYING.  If not, write to the Free
21 the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
22 02111-1307, USA.  */
23
24 /* Instruction scheduling pass.  This file, along with sched-deps.c,
25    contains the generic parts.  The actual entry point is found for
26    the normal instruction scheduling pass is found in sched-rgn.c.
27
28    We compute insn priorities based on data dependencies.  Flow
29    analysis only creates a fraction of the data-dependencies we must
30    observe: namely, only those dependencies which the combiner can be
31    expected to use.  For this pass, we must therefore create the
32    remaining dependencies we need to observe: register dependencies,
33    memory dependencies, dependencies to keep function calls in order,
34    and the dependence between a conditional branch and the setting of
35    condition codes are all dealt with here.
36
37    The scheduler first traverses the data flow graph, starting with
38    the last instruction, and proceeding to the first, assigning values
39    to insn_priority as it goes.  This sorts the instructions
40    topologically by data dependence.
41
42    Once priorities have been established, we order the insns using
43    list scheduling.  This works as follows: starting with a list of
44    all the ready insns, and sorted according to priority number, we
45    schedule the insn from the end of the list by placing its
46    predecessors in the list according to their priority order.  We
47    consider this insn scheduled by setting the pointer to the "end" of
48    the list to point to the previous insn.  When an insn has no
49    predecessors, we either queue it until sufficient time has elapsed
50    or add it to the ready list.  As the instructions are scheduled or
51    when stalls are introduced, the queue advances and dumps insns into
52    the ready list.  When all insns down to the lowest priority have
53    been scheduled, the critical path of the basic block has been made
54    as short as possible.  The remaining insns are then scheduled in
55    remaining slots.
56
57    Function unit conflicts are resolved during forward list scheduling
58    by tracking the time when each insn is committed to the schedule
59    and from that, the time the function units it uses must be free.
60    As insns on the ready list are considered for scheduling, those
61    that would result in a blockage of the already committed insns are
62    queued until no blockage will result.
63
64    The following list shows the order in which we want to break ties
65    among insns in the ready list:
66
67    1.  choose insn with the longest path to end of bb, ties
68    broken by
69    2.  choose insn with least contribution to register pressure,
70    ties broken by
71    3.  prefer in-block upon interblock motion, ties broken by
72    4.  prefer useful upon speculative motion, ties broken by
73    5.  choose insn with largest control flow probability, ties
74    broken by
75    6.  choose insn with the least dependences upon the previously
76    scheduled insn, or finally
77    7   choose the insn which has the most insns dependent on it.
78    8.  choose insn with lowest UID.
79
80    Memory references complicate matters.  Only if we can be certain
81    that memory references are not part of the data dependency graph
82    (via true, anti, or output dependence), can we move operations past
83    memory references.  To first approximation, reads can be done
84    independently, while writes introduce dependencies.  Better
85    approximations will yield fewer dependencies.
86
87    Before reload, an extended analysis of interblock data dependences
88    is required for interblock scheduling.  This is performed in
89    compute_block_backward_dependences ().
90
91    Dependencies set up by memory references are treated in exactly the
92    same way as other dependencies, by using LOG_LINKS backward
93    dependences.  LOG_LINKS are translated into INSN_DEPEND forward
94    dependences for the purpose of forward list scheduling.
95
96    Having optimized the critical path, we may have also unduly
97    extended the lifetimes of some registers.  If an operation requires
98    that constants be loaded into registers, it is certainly desirable
99    to load those constants as early as necessary, but no earlier.
100    I.e., it will not do to load up a bunch of registers at the
101    beginning of a basic block only to use them at the end, if they
102    could be loaded later, since this may result in excessive register
103    utilization.
104
105    Note that since branches are never in basic blocks, but only end
106    basic blocks, this pass will not move branches.  But that is ok,
107    since we can use GNU's delayed branch scheduling pass to take care
108    of this case.
109
110    Also note that no further optimizations based on algebraic
111    identities are performed, so this pass would be a good one to
112    perform instruction splitting, such as breaking up a multiply
113    instruction into shifts and adds where that is profitable.
114
115    Given the memory aliasing analysis that this pass should perform,
116    it should be possible to remove redundant stores to memory, and to
117    load values from registers instead of hitting memory.
118
119    Before reload, speculative insns are moved only if a 'proof' exists
120    that no exception will be caused by this, and if no live registers
121    exist that inhibit the motion (live registers constraints are not
122    represented by data dependence edges).
123
124    This pass must update information that subsequent passes expect to
125    be correct.  Namely: reg_n_refs, reg_n_sets, reg_n_deaths,
126    reg_n_calls_crossed, and reg_live_length.  Also, BLOCK_HEAD,
127    BLOCK_END.
128
129    The information in the line number notes is carefully retained by
130    this pass.  Notes that refer to the starting and ending of
131    exception regions are also carefully retained by this pass.  All
132    other NOTE insns are grouped in their same relative order at the
133    beginning of basic blocks and regions that have been scheduled.  */
134 \f
135 #include "config.h"
136 #include "system.h"
137 #include "toplev.h"
138 #include "rtl.h"
139 #include "tm_p.h"
140 #include "hard-reg-set.h"
141 #include "basic-block.h"
142 #include "regs.h"
143 #include "function.h"
144 #include "flags.h"
145 #include "insn-config.h"
146 #include "insn-attr.h"
147 #include "insn-flags.h"
148 #include "except.h"
149 #include "toplev.h"
150 #include "recog.h"
151 #include "sched-int.h"
152
153 #ifdef INSN_SCHEDULING
154
155 /* issue_rate is the number of insns that can be scheduled in the same
156    machine cycle.  It can be defined in the config/mach/mach.h file,
157    otherwise we set it to 1.  */
158
159 static int issue_rate;
160
161 #ifndef ISSUE_RATE
162 #define ISSUE_RATE 1
163 #endif
164
165 /* sched-verbose controls the amount of debugging output the
166    scheduler prints.  It is controlled by -fsched-verbose=N:
167    N>0 and no -DSR : the output is directed to stderr.
168    N>=10 will direct the printouts to stderr (regardless of -dSR).
169    N=1: same as -dSR.
170    N=2: bb's probabilities, detailed ready list info, unit/insn info.
171    N=3: rtl at abort point, control-flow, regions info.
172    N=5: dependences info.  */
173
174 static int sched_verbose_param = 0;
175 int sched_verbose = 0;
176
177 /* Debugging file.  All printouts are sent to dump, which is always set,
178    either to stderr, or to the dump listing file (-dRS).  */
179 FILE *sched_dump = 0;
180
181 /* Highest uid before scheduling.  */
182 static int old_max_uid;
183
184 /* fix_sched_param() is called from toplev.c upon detection
185    of the -fsched-verbose=N option.  */
186
187 void
188 fix_sched_param (param, val)
189      const char *param, *val;
190 {
191   if (!strcmp (param, "verbose"))
192     sched_verbose_param = atoi (val);
193   else
194     warning ("fix_sched_param: unknown param: %s", param);
195 }
196
197 struct haifa_insn_data *h_i_d;
198
199 #define DONE_PRIORITY   -1
200 #define MAX_PRIORITY    0x7fffffff
201 #define TAIL_PRIORITY   0x7ffffffe
202 #define LAUNCH_PRIORITY 0x7f000001
203 #define DONE_PRIORITY_P(INSN) (INSN_PRIORITY (INSN) < 0)
204 #define LOW_PRIORITY_P(INSN) ((INSN_PRIORITY (INSN) & 0x7f000000) == 0)
205
206 #define LINE_NOTE(INSN)         (h_i_d[INSN_UID (INSN)].line_note)
207 #define INSN_TICK(INSN)         (h_i_d[INSN_UID (INSN)].tick)
208
209 /* Vector indexed by basic block number giving the starting line-number
210    for each basic block.  */
211 static rtx *line_note_head;
212
213 /* List of important notes we must keep around.  This is a pointer to the
214    last element in the list.  */
215 static rtx note_list;
216
217 /* Queues, etc.  */
218
219 /* An instruction is ready to be scheduled when all insns preceding it
220    have already been scheduled.  It is important to ensure that all
221    insns which use its result will not be executed until its result
222    has been computed.  An insn is maintained in one of four structures:
223
224    (P) the "Pending" set of insns which cannot be scheduled until
225    their dependencies have been satisfied.
226    (Q) the "Queued" set of insns that can be scheduled when sufficient
227    time has passed.
228    (R) the "Ready" list of unscheduled, uncommitted insns.
229    (S) the "Scheduled" list of insns.
230
231    Initially, all insns are either "Pending" or "Ready" depending on
232    whether their dependencies are satisfied.
233
234    Insns move from the "Ready" list to the "Scheduled" list as they
235    are committed to the schedule.  As this occurs, the insns in the
236    "Pending" list have their dependencies satisfied and move to either
237    the "Ready" list or the "Queued" set depending on whether
238    sufficient time has passed to make them ready.  As time passes,
239    insns move from the "Queued" set to the "Ready" list.  Insns may
240    move from the "Ready" list to the "Queued" set if they are blocked
241    due to a function unit conflict.
242
243    The "Pending" list (P) are the insns in the INSN_DEPEND of the unscheduled
244    insns, i.e., those that are ready, queued, and pending.
245    The "Queued" set (Q) is implemented by the variable `insn_queue'.
246    The "Ready" list (R) is implemented by the variables `ready' and
247    `n_ready'.
248    The "Scheduled" list (S) is the new insn chain built by this pass.
249
250    The transition (R->S) is implemented in the scheduling loop in
251    `schedule_block' when the best insn to schedule is chosen.
252    The transition (R->Q) is implemented in `queue_insn' when an
253    insn is found to have a function unit conflict with the already
254    committed insns.
255    The transitions (P->R and P->Q) are implemented in `schedule_insn' as
256    insns move from the ready list to the scheduled list.
257    The transition (Q->R) is implemented in 'queue_to_insn' as time
258    passes or stalls are introduced.  */
259
260 /* Implement a circular buffer to delay instructions until sufficient
261    time has passed.  INSN_QUEUE_SIZE is a power of two larger than
262    MAX_BLOCKAGE and MAX_READY_COST computed by genattr.c.  This is the
263    longest time an isnsn may be queued.  */
264 static rtx insn_queue[INSN_QUEUE_SIZE];
265 static int q_ptr = 0;
266 static int q_size = 0;
267 #define NEXT_Q(X) (((X)+1) & (INSN_QUEUE_SIZE-1))
268 #define NEXT_Q_AFTER(X, C) (((X)+C) & (INSN_QUEUE_SIZE-1))
269
270 /* Describe the ready list of the scheduler.
271    VEC holds space enough for all insns in the current region.  VECLEN
272    says how many exactly.
273    FIRST is the index of the element with the highest priority; i.e. the
274    last one in the ready list, since elements are ordered by ascending
275    priority.
276    N_READY determines how many insns are on the ready list.  */
277
278 struct ready_list
279 {
280   rtx *vec;
281   int veclen;
282   int first;
283   int n_ready;
284 };
285
286 /* Forward declarations.  */
287 static unsigned int blockage_range PARAMS ((int, rtx));
288 static void clear_units PARAMS ((void));
289 static void schedule_unit PARAMS ((int, rtx, int));
290 static int actual_hazard PARAMS ((int, rtx, int, int));
291 static int potential_hazard PARAMS ((int, rtx, int));
292 static int priority PARAMS ((rtx));
293 static int rank_for_schedule PARAMS ((const PTR, const PTR));
294 static void swap_sort PARAMS ((rtx *, int));
295 static void queue_insn PARAMS ((rtx, int));
296 static void schedule_insn PARAMS ((rtx, struct ready_list *, int));
297 static void find_insn_reg_weight PARAMS ((int));
298 static void adjust_priority PARAMS ((rtx));
299
300 /* Notes handling mechanism:
301    =========================
302    Generally, NOTES are saved before scheduling and restored after scheduling.
303    The scheduler distinguishes between three types of notes:
304
305    (1) LINE_NUMBER notes, generated and used for debugging.  Here,
306    before scheduling a region, a pointer to the LINE_NUMBER note is
307    added to the insn following it (in save_line_notes()), and the note
308    is removed (in rm_line_notes() and unlink_line_notes()).  After
309    scheduling the region, this pointer is used for regeneration of
310    the LINE_NUMBER note (in restore_line_notes()).
311
312    (2) LOOP_BEGIN, LOOP_END, SETJMP, EHREGION_BEG, EHREGION_END notes:
313    Before scheduling a region, a pointer to the note is added to the insn
314    that follows or precedes it.  (This happens as part of the data dependence
315    computation).  After scheduling an insn, the pointer contained in it is
316    used for regenerating the corresponding note (in reemit_notes).
317
318    (3) All other notes (e.g. INSN_DELETED):  Before scheduling a block,
319    these notes are put in a list (in rm_other_notes() and
320    unlink_other_notes ()).  After scheduling the block, these notes are
321    inserted at the beginning of the block (in schedule_block()).  */
322
323 static rtx unlink_other_notes PARAMS ((rtx, rtx));
324 static rtx unlink_line_notes PARAMS ((rtx, rtx));
325 static rtx reemit_notes PARAMS ((rtx, rtx));
326
327 static rtx *ready_lastpos PARAMS ((struct ready_list *));
328 static void ready_sort PARAMS ((struct ready_list *));
329 static rtx ready_remove_first PARAMS ((struct ready_list *));
330
331 static void queue_to_ready PARAMS ((struct ready_list *));
332
333 static void debug_ready_list PARAMS ((struct ready_list *));
334
335 static rtx move_insn1 PARAMS ((rtx, rtx));
336 static rtx move_insn PARAMS ((rtx, rtx));
337
338 #endif /* INSN_SCHEDULING */
339 \f
340 /* Point to state used for the current scheduling pass.  */
341 struct sched_info *current_sched_info;
342 \f
343 #ifndef INSN_SCHEDULING
344 void
345 schedule_insns (dump_file)
346      FILE *dump_file ATTRIBUTE_UNUSED;
347 {
348 }
349 #else
350
351 /* Pointer to the last instruction scheduled.  Used by rank_for_schedule,
352    so that insns independent of the last scheduled insn will be preferred
353    over dependent instructions.  */
354
355 static rtx last_scheduled_insn;
356
357 /* Compute the function units used by INSN.  This caches the value
358    returned by function_units_used.  A function unit is encoded as the
359    unit number if the value is non-negative and the compliment of a
360    mask if the value is negative.  A function unit index is the
361    non-negative encoding.  */
362
363 HAIFA_INLINE int
364 insn_unit (insn)
365      rtx insn;
366 {
367   register int unit = INSN_UNIT (insn);
368
369   if (unit == 0)
370     {
371       recog_memoized (insn);
372
373       /* A USE insn, or something else we don't need to understand.
374          We can't pass these directly to function_units_used because it will
375          trigger a fatal error for unrecognizable insns.  */
376       if (INSN_CODE (insn) < 0)
377         unit = -1;
378       else
379         {
380           unit = function_units_used (insn);
381           /* Increment non-negative values so we can cache zero.  */
382           if (unit >= 0)
383             unit++;
384         }
385       /* We only cache 16 bits of the result, so if the value is out of
386          range, don't cache it.  */
387       if (FUNCTION_UNITS_SIZE < HOST_BITS_PER_SHORT
388           || unit >= 0
389           || (unit & ~((1 << (HOST_BITS_PER_SHORT - 1)) - 1)) == 0)
390         INSN_UNIT (insn) = unit;
391     }
392   return (unit > 0 ? unit - 1 : unit);
393 }
394
395 /* Compute the blockage range for executing INSN on UNIT.  This caches
396    the value returned by the blockage_range_function for the unit.
397    These values are encoded in an int where the upper half gives the
398    minimum value and the lower half gives the maximum value.  */
399
400 HAIFA_INLINE static unsigned int
401 blockage_range (unit, insn)
402      int unit;
403      rtx insn;
404 {
405   unsigned int blockage = INSN_BLOCKAGE (insn);
406   unsigned int range;
407
408   if ((int) UNIT_BLOCKED (blockage) != unit + 1)
409     {
410       range = function_units[unit].blockage_range_function (insn);
411       /* We only cache the blockage range for one unit and then only if
412          the values fit.  */
413       if (HOST_BITS_PER_INT >= UNIT_BITS + 2 * BLOCKAGE_BITS)
414         INSN_BLOCKAGE (insn) = ENCODE_BLOCKAGE (unit + 1, range);
415     }
416   else
417     range = BLOCKAGE_RANGE (blockage);
418
419   return range;
420 }
421
422 /* A vector indexed by function unit instance giving the last insn to use
423    the unit.  The value of the function unit instance index for unit U
424    instance I is (U + I * FUNCTION_UNITS_SIZE).  */
425 static rtx unit_last_insn[FUNCTION_UNITS_SIZE * MAX_MULTIPLICITY];
426
427 /* A vector indexed by function unit instance giving the minimum time when
428    the unit will unblock based on the maximum blockage cost.  */
429 static int unit_tick[FUNCTION_UNITS_SIZE * MAX_MULTIPLICITY];
430
431 /* A vector indexed by function unit number giving the number of insns
432    that remain to use the unit.  */
433 static int unit_n_insns[FUNCTION_UNITS_SIZE];
434
435 /* Access the unit_last_insn array.  Used by the visualization code.  */
436
437 rtx
438 get_unit_last_insn (instance)
439      int instance;
440 {
441   return unit_last_insn[instance];
442 }
443
444 /* Reset the function unit state to the null state.  */
445
446 static void
447 clear_units ()
448 {
449   memset ((char *) unit_last_insn, 0, sizeof (unit_last_insn));
450   memset ((char *) unit_tick, 0, sizeof (unit_tick));
451   memset ((char *) unit_n_insns, 0, sizeof (unit_n_insns));
452 }
453
454 /* Return the issue-delay of an insn.  */
455
456 HAIFA_INLINE int
457 insn_issue_delay (insn)
458      rtx insn;
459 {
460   int i, delay = 0;
461   int unit = insn_unit (insn);
462
463   /* Efficiency note: in fact, we are working 'hard' to compute a
464      value that was available in md file, and is not available in
465      function_units[] structure.  It would be nice to have this
466      value there, too.  */
467   if (unit >= 0)
468     {
469       if (function_units[unit].blockage_range_function &&
470           function_units[unit].blockage_function)
471         delay = function_units[unit].blockage_function (insn, insn);
472     }
473   else
474     for (i = 0, unit = ~unit; unit; i++, unit >>= 1)
475       if ((unit & 1) != 0 && function_units[i].blockage_range_function
476           && function_units[i].blockage_function)
477         delay = MAX (delay, function_units[i].blockage_function (insn, insn));
478
479   return delay;
480 }
481
482 /* Return the actual hazard cost of executing INSN on the unit UNIT,
483    instance INSTANCE at time CLOCK if the previous actual hazard cost
484    was COST.  */
485
486 HAIFA_INLINE int
487 actual_hazard_this_instance (unit, instance, insn, clock, cost)
488      int unit, instance, clock, cost;
489      rtx insn;
490 {
491   int tick = unit_tick[instance]; /* Issue time of the last issued insn.  */
492
493   if (tick - clock > cost)
494     {
495       /* The scheduler is operating forward, so unit's last insn is the
496          executing insn and INSN is the candidate insn.  We want a
497          more exact measure of the blockage if we execute INSN at CLOCK
498          given when we committed the execution of the unit's last insn.
499
500          The blockage value is given by either the unit's max blockage
501          constant, blockage range function, or blockage function.  Use
502          the most exact form for the given unit.  */
503
504       if (function_units[unit].blockage_range_function)
505         {
506           if (function_units[unit].blockage_function)
507             tick += (function_units[unit].blockage_function
508                      (unit_last_insn[instance], insn)
509                      - function_units[unit].max_blockage);
510           else
511             tick += ((int) MAX_BLOCKAGE_COST (blockage_range (unit, insn))
512                      - function_units[unit].max_blockage);
513         }
514       if (tick - clock > cost)
515         cost = tick - clock;
516     }
517   return cost;
518 }
519
520 /* Record INSN as having begun execution on the units encoded by UNIT at
521    time CLOCK.  */
522
523 HAIFA_INLINE static void
524 schedule_unit (unit, insn, clock)
525      int unit, clock;
526      rtx insn;
527 {
528   int i;
529
530   if (unit >= 0)
531     {
532       int instance = unit;
533 #if MAX_MULTIPLICITY > 1
534       /* Find the first free instance of the function unit and use that
535          one.  We assume that one is free.  */
536       for (i = function_units[unit].multiplicity - 1; i > 0; i--)
537         {
538           if (!actual_hazard_this_instance (unit, instance, insn, clock, 0))
539             break;
540           instance += FUNCTION_UNITS_SIZE;
541         }
542 #endif
543       unit_last_insn[instance] = insn;
544       unit_tick[instance] = (clock + function_units[unit].max_blockage);
545     }
546   else
547     for (i = 0, unit = ~unit; unit; i++, unit >>= 1)
548       if ((unit & 1) != 0)
549         schedule_unit (i, insn, clock);
550 }
551
552 /* Return the actual hazard cost of executing INSN on the units encoded by
553    UNIT at time CLOCK if the previous actual hazard cost was COST.  */
554
555 HAIFA_INLINE static int
556 actual_hazard (unit, insn, clock, cost)
557      int unit, clock, cost;
558      rtx insn;
559 {
560   int i;
561
562   if (unit >= 0)
563     {
564       /* Find the instance of the function unit with the minimum hazard.  */
565       int instance = unit;
566       int best_cost = actual_hazard_this_instance (unit, instance, insn,
567                                                    clock, cost);
568 #if MAX_MULTIPLICITY > 1
569       int this_cost;
570
571       if (best_cost > cost)
572         {
573           for (i = function_units[unit].multiplicity - 1; i > 0; i--)
574             {
575               instance += FUNCTION_UNITS_SIZE;
576               this_cost = actual_hazard_this_instance (unit, instance, insn,
577                                                        clock, cost);
578               if (this_cost < best_cost)
579                 {
580                   best_cost = this_cost;
581                   if (this_cost <= cost)
582                     break;
583                 }
584             }
585         }
586 #endif
587       cost = MAX (cost, best_cost);
588     }
589   else
590     for (i = 0, unit = ~unit; unit; i++, unit >>= 1)
591       if ((unit & 1) != 0)
592         cost = actual_hazard (i, insn, clock, cost);
593
594   return cost;
595 }
596
597 /* Return the potential hazard cost of executing an instruction on the
598    units encoded by UNIT if the previous potential hazard cost was COST.
599    An insn with a large blockage time is chosen in preference to one
600    with a smaller time; an insn that uses a unit that is more likely
601    to be used is chosen in preference to one with a unit that is less
602    used.  We are trying to minimize a subsequent actual hazard.  */
603
604 HAIFA_INLINE static int
605 potential_hazard (unit, insn, cost)
606      int unit, cost;
607      rtx insn;
608 {
609   int i, ncost;
610   unsigned int minb, maxb;
611
612   if (unit >= 0)
613     {
614       minb = maxb = function_units[unit].max_blockage;
615       if (maxb > 1)
616         {
617           if (function_units[unit].blockage_range_function)
618             {
619               maxb = minb = blockage_range (unit, insn);
620               maxb = MAX_BLOCKAGE_COST (maxb);
621               minb = MIN_BLOCKAGE_COST (minb);
622             }
623
624           if (maxb > 1)
625             {
626               /* Make the number of instructions left dominate.  Make the
627                  minimum delay dominate the maximum delay.  If all these
628                  are the same, use the unit number to add an arbitrary
629                  ordering.  Other terms can be added.  */
630               ncost = minb * 0x40 + maxb;
631               ncost *= (unit_n_insns[unit] - 1) * 0x1000 + unit;
632               if (ncost > cost)
633                 cost = ncost;
634             }
635         }
636     }
637   else
638     for (i = 0, unit = ~unit; unit; i++, unit >>= 1)
639       if ((unit & 1) != 0)
640         cost = potential_hazard (i, insn, cost);
641
642   return cost;
643 }
644
645 /* Compute cost of executing INSN given the dependence LINK on the insn USED.
646    This is the number of cycles between instruction issue and
647    instruction results.  */
648
649 HAIFA_INLINE int
650 insn_cost (insn, link, used)
651      rtx insn, link, used;
652 {
653   register int cost = INSN_COST (insn);
654
655   if (cost == 0)
656     {
657       recog_memoized (insn);
658
659       /* A USE insn, or something else we don't need to understand.
660          We can't pass these directly to result_ready_cost because it will
661          trigger a fatal error for unrecognizable insns.  */
662       if (INSN_CODE (insn) < 0)
663         {
664           INSN_COST (insn) = 1;
665           return 1;
666         }
667       else
668         {
669           cost = result_ready_cost (insn);
670
671           if (cost < 1)
672             cost = 1;
673
674           INSN_COST (insn) = cost;
675         }
676     }
677
678   /* In this case estimate cost without caring how insn is used.  */
679   if (link == 0 && used == 0)
680     return cost;
681
682   /* A USE insn should never require the value used to be computed.  This
683      allows the computation of a function's result and parameter values to
684      overlap the return and call.  */
685   recog_memoized (used);
686   if (INSN_CODE (used) < 0)
687     LINK_COST_FREE (link) = 1;
688
689   /* If some dependencies vary the cost, compute the adjustment.  Most
690      commonly, the adjustment is complete: either the cost is ignored
691      (in the case of an output- or anti-dependence), or the cost is
692      unchanged.  These values are cached in the link as LINK_COST_FREE
693      and LINK_COST_ZERO.  */
694
695   if (LINK_COST_FREE (link))
696     cost = 0;
697 #ifdef ADJUST_COST
698   else if (!LINK_COST_ZERO (link))
699     {
700       int ncost = cost;
701
702       ADJUST_COST (used, link, insn, ncost);
703       if (ncost < 1)
704         {
705           LINK_COST_FREE (link) = 1;
706           ncost = 0;
707         }
708       if (cost == ncost)
709         LINK_COST_ZERO (link) = 1;
710       cost = ncost;
711     }
712 #endif
713   return cost;
714 }
715
716 /* Compute the priority number for INSN.  */
717
718 static int
719 priority (insn)
720      rtx insn;
721 {
722   rtx link;
723
724   if (! INSN_P (insn))
725     return 0;
726
727   if (! INSN_PRIORITY_KNOWN (insn))
728     {
729       int this_priority = 0;
730
731       if (INSN_DEPEND (insn) == 0)
732         this_priority = insn_cost (insn, 0, 0);
733       else
734         {
735           for (link = INSN_DEPEND (insn); link; link = XEXP (link, 1))
736             {
737               rtx next;
738               int next_priority;
739
740               if (RTX_INTEGRATED_P (link))
741                 continue;
742
743               next = XEXP (link, 0);
744
745               /* Critical path is meaningful in block boundaries only.  */
746               if (! (*current_sched_info->contributes_to_priority) (next, insn))
747                 continue;
748
749               next_priority = insn_cost (insn, link, next) + priority (next);
750               if (next_priority > this_priority)
751                 this_priority = next_priority;
752             }
753         }
754       INSN_PRIORITY (insn) = this_priority;
755       INSN_PRIORITY_KNOWN (insn) = 1;
756     }
757
758   return INSN_PRIORITY (insn);
759 }
760 \f
761 /* Macros and functions for keeping the priority queue sorted, and
762    dealing with queueing and dequeueing of instructions.  */
763
764 #define SCHED_SORT(READY, N_READY)                                   \
765 do { if ((N_READY) == 2)                                             \
766        swap_sort (READY, N_READY);                                   \
767      else if ((N_READY) > 2)                                         \
768          qsort (READY, N_READY, sizeof (rtx), rank_for_schedule); }  \
769 while (0)
770
771 /* Returns a positive value if x is preferred; returns a negative value if
772    y is preferred.  Should never return 0, since that will make the sort
773    unstable.  */
774
775 static int
776 rank_for_schedule (x, y)
777      const PTR x;
778      const PTR y;
779 {
780   rtx tmp = *(const rtx *) y;
781   rtx tmp2 = *(const rtx *) x;
782   rtx link;
783   int tmp_class, tmp2_class, depend_count1, depend_count2;
784   int val, priority_val, weight_val, info_val;
785
786   /* Prefer insn with higher priority.  */
787   priority_val = INSN_PRIORITY (tmp2) - INSN_PRIORITY (tmp);
788   if (priority_val)
789     return priority_val;
790
791   /* Prefer an insn with smaller contribution to registers-pressure.  */
792   if (!reload_completed &&
793       (weight_val = INSN_REG_WEIGHT (tmp) - INSN_REG_WEIGHT (tmp2)))
794     return (weight_val);
795
796   info_val = (*current_sched_info->rank) (tmp, tmp2);
797   if (info_val)
798     return info_val;
799
800   /* Compare insns based on their relation to the last-scheduled-insn.  */
801   if (last_scheduled_insn)
802     {
803       /* Classify the instructions into three classes:
804          1) Data dependent on last schedule insn.
805          2) Anti/Output dependent on last scheduled insn.
806          3) Independent of last scheduled insn, or has latency of one.
807          Choose the insn from the highest numbered class if different.  */
808       link = find_insn_list (tmp, INSN_DEPEND (last_scheduled_insn));
809       if (link == 0 || insn_cost (last_scheduled_insn, link, tmp) == 1)
810         tmp_class = 3;
811       else if (REG_NOTE_KIND (link) == 0)       /* Data dependence.  */
812         tmp_class = 1;
813       else
814         tmp_class = 2;
815
816       link = find_insn_list (tmp2, INSN_DEPEND (last_scheduled_insn));
817       if (link == 0 || insn_cost (last_scheduled_insn, link, tmp2) == 1)
818         tmp2_class = 3;
819       else if (REG_NOTE_KIND (link) == 0)       /* Data dependence.  */
820         tmp2_class = 1;
821       else
822         tmp2_class = 2;
823
824       if ((val = tmp2_class - tmp_class))
825         return val;
826     }
827
828   /* Prefer the insn which has more later insns that depend on it.
829      This gives the scheduler more freedom when scheduling later
830      instructions at the expense of added register pressure.  */
831   depend_count1 = 0;
832   for (link = INSN_DEPEND (tmp); link; link = XEXP (link, 1))
833     depend_count1++;
834
835   depend_count2 = 0;
836   for (link = INSN_DEPEND (tmp2); link; link = XEXP (link, 1))
837     depend_count2++;
838
839   val = depend_count2 - depend_count1;
840   if (val)
841     return val;
842
843   /* If insns are equally good, sort by INSN_LUID (original insn order),
844      so that we make the sort stable.  This minimizes instruction movement,
845      thus minimizing sched's effect on debugging and cross-jumping.  */
846   return INSN_LUID (tmp) - INSN_LUID (tmp2);
847 }
848
849 /* Resort the array A in which only element at index N may be out of order.  */
850
851 HAIFA_INLINE static void
852 swap_sort (a, n)
853      rtx *a;
854      int n;
855 {
856   rtx insn = a[n - 1];
857   int i = n - 2;
858
859   while (i >= 0 && rank_for_schedule (a + i, &insn) >= 0)
860     {
861       a[i + 1] = a[i];
862       i -= 1;
863     }
864   a[i + 1] = insn;
865 }
866
867 /* Add INSN to the insn queue so that it can be executed at least
868    N_CYCLES after the currently executing insn.  Preserve insns
869    chain for debugging purposes.  */
870
871 HAIFA_INLINE static void
872 queue_insn (insn, n_cycles)
873      rtx insn;
874      int n_cycles;
875 {
876   int next_q = NEXT_Q_AFTER (q_ptr, n_cycles);
877   rtx link = alloc_INSN_LIST (insn, insn_queue[next_q]);
878   insn_queue[next_q] = link;
879   q_size += 1;
880
881   if (sched_verbose >= 2)
882     {
883       fprintf (sched_dump, ";;\t\tReady-->Q: insn %s: ",
884                (*current_sched_info->print_insn) (insn, 0));
885
886       fprintf (sched_dump, "queued for %d cycles.\n", n_cycles);
887     }
888 }
889
890 /* Return a pointer to the bottom of the ready list, i.e. the insn
891    with the lowest priority.  */
892
893 HAIFA_INLINE static rtx *
894 ready_lastpos (ready)
895      struct ready_list *ready;
896 {
897   if (ready->n_ready == 0)
898     abort ();
899   return ready->vec + ready->first - ready->n_ready + 1;
900 }
901
902 /* Add an element INSN to the ready list so that it ends up with the lowest
903    priority.  */
904
905 HAIFA_INLINE void
906 ready_add (ready, insn)
907      struct ready_list *ready;
908      rtx insn;
909 {
910   if (ready->first == ready->n_ready)
911     {
912       memmove (ready->vec + ready->veclen - ready->n_ready,
913                ready_lastpos (ready),
914                ready->n_ready * sizeof (rtx));
915       ready->first = ready->veclen - 1;
916     }
917   ready->vec[ready->first - ready->n_ready] = insn;
918   ready->n_ready++;
919 }
920
921 /* Remove the element with the highest priority from the ready list and
922    return it.  */
923
924 HAIFA_INLINE static rtx
925 ready_remove_first (ready)
926      struct ready_list *ready;
927 {
928   rtx t;
929   if (ready->n_ready == 0)
930     abort ();
931   t = ready->vec[ready->first--];
932   ready->n_ready--;
933   /* If the queue becomes empty, reset it.  */
934   if (ready->n_ready == 0)
935     ready->first = ready->veclen - 1;
936   return t;
937 }
938
939 /* Sort the ready list READY by ascending priority, using the SCHED_SORT
940    macro.  */
941
942 HAIFA_INLINE static void
943 ready_sort (ready)
944      struct ready_list *ready;
945 {
946   rtx *first = ready_lastpos (ready);
947   SCHED_SORT (first, ready->n_ready);
948 }
949
950 /* PREV is an insn that is ready to execute.  Adjust its priority if that
951    will help shorten or lengthen register lifetimes as appropriate.  Also
952    provide a hook for the target to tweek itself.  */
953
954 HAIFA_INLINE static void
955 adjust_priority (prev)
956      rtx prev ATTRIBUTE_UNUSED;
957 {
958   /* ??? There used to be code here to try and estimate how an insn
959      affected register lifetimes, but it did it by looking at REG_DEAD
960      notes, which we removed in schedule_region.  Nor did it try to
961      take into account register pressure or anything useful like that.
962
963      Revisit when we have a machine model to work with and not before.  */
964
965 #ifdef ADJUST_PRIORITY
966   ADJUST_PRIORITY (prev);
967 #endif
968 }
969
970 /* Clock at which the previous instruction was issued.  */
971 static int last_clock_var;
972
973 /* INSN is the "currently executing insn".  Launch each insn which was
974    waiting on INSN.  READY is the ready list which contains the insns
975    that are ready to fire.  CLOCK is the current cycle.
976    */
977
978 static void
979 schedule_insn (insn, ready, clock)
980      rtx insn;
981      struct ready_list *ready;
982      int clock;
983 {
984   rtx link;
985   int unit;
986
987   unit = insn_unit (insn);
988
989   if (sched_verbose >= 2)
990     {
991       fprintf (sched_dump, ";;\t\t--> scheduling insn <<<%d>>> on unit ",
992                INSN_UID (insn));
993       insn_print_units (insn);
994       fprintf (sched_dump, "\n");
995     }
996
997   if (sched_verbose && unit == -1)
998     visualize_no_unit (insn);
999
1000   if (MAX_BLOCKAGE > 1 || issue_rate > 1 || sched_verbose)
1001     schedule_unit (unit, insn, clock);
1002
1003   if (INSN_DEPEND (insn) == 0)
1004     return;
1005
1006   for (link = INSN_DEPEND (insn); link != 0; link = XEXP (link, 1))
1007     {
1008       rtx next = XEXP (link, 0);
1009       int cost = insn_cost (insn, link, next);
1010
1011       INSN_TICK (next) = MAX (INSN_TICK (next), clock + cost);
1012
1013       if ((INSN_DEP_COUNT (next) -= 1) == 0)
1014         {
1015           int effective_cost = INSN_TICK (next) - clock;
1016
1017           if (! (*current_sched_info->new_ready) (next))
1018             continue;
1019
1020           if (sched_verbose >= 2)
1021             {
1022               fprintf (sched_dump, ";;\t\tdependences resolved: insn %s ",
1023                        (*current_sched_info->print_insn) (next, 0));
1024
1025               if (effective_cost < 1)
1026                 fprintf (sched_dump, "into ready\n");
1027               else
1028                 fprintf (sched_dump, "into queue with cost=%d\n", effective_cost);
1029             }
1030
1031           /* Adjust the priority of NEXT and either put it on the ready
1032              list or queue it.  */
1033           adjust_priority (next);
1034           if (effective_cost < 1)
1035             ready_add (ready, next);
1036           else
1037             queue_insn (next, effective_cost);
1038         }
1039     }
1040
1041   /* Annotate the instruction with issue information -- TImode
1042      indicates that the instruction is expected not to be able
1043      to issue on the same cycle as the previous insn.  A machine
1044      may use this information to decide how the instruction should
1045      be aligned.  */
1046   if (reload_completed && issue_rate > 1)
1047     {
1048       PUT_MODE (insn, clock > last_clock_var ? TImode : VOIDmode);
1049       last_clock_var = clock;
1050     }
1051 }
1052
1053 /* Functions for handling of notes.  */
1054
1055 /* Delete notes beginning with INSN and put them in the chain
1056    of notes ended by NOTE_LIST.
1057    Returns the insn following the notes.  */
1058
1059 static rtx
1060 unlink_other_notes (insn, tail)
1061      rtx insn, tail;
1062 {
1063   rtx prev = PREV_INSN (insn);
1064
1065   while (insn != tail && GET_CODE (insn) == NOTE)
1066     {
1067       rtx next = NEXT_INSN (insn);
1068       /* Delete the note from its current position.  */
1069       if (prev)
1070         NEXT_INSN (prev) = next;
1071       if (next)
1072         PREV_INSN (next) = prev;
1073
1074       /* See sched_analyze to see how these are handled.  */
1075       if (NOTE_LINE_NUMBER (insn) != NOTE_INSN_SETJMP
1076           && NOTE_LINE_NUMBER (insn) != NOTE_INSN_LOOP_BEG
1077           && NOTE_LINE_NUMBER (insn) != NOTE_INSN_LOOP_END
1078           && NOTE_LINE_NUMBER (insn) != NOTE_INSN_RANGE_BEG
1079           && NOTE_LINE_NUMBER (insn) != NOTE_INSN_RANGE_END
1080           && NOTE_LINE_NUMBER (insn) != NOTE_INSN_EH_REGION_BEG
1081           && NOTE_LINE_NUMBER (insn) != NOTE_INSN_EH_REGION_END)
1082         {
1083           /* Insert the note at the end of the notes list.  */
1084           PREV_INSN (insn) = note_list;
1085           if (note_list)
1086             NEXT_INSN (note_list) = insn;
1087           note_list = insn;
1088         }
1089
1090       insn = next;
1091     }
1092   return insn;
1093 }
1094
1095 /* Delete line notes beginning with INSN. Record line-number notes so
1096    they can be reused.  Returns the insn following the notes.  */
1097
1098 static rtx
1099 unlink_line_notes (insn, tail)
1100      rtx insn, tail;
1101 {
1102   rtx prev = PREV_INSN (insn);
1103
1104   while (insn != tail && GET_CODE (insn) == NOTE)
1105     {
1106       rtx next = NEXT_INSN (insn);
1107
1108       if (write_symbols != NO_DEBUG && NOTE_LINE_NUMBER (insn) > 0)
1109         {
1110           /* Delete the note from its current position.  */
1111           if (prev)
1112             NEXT_INSN (prev) = next;
1113           if (next)
1114             PREV_INSN (next) = prev;
1115
1116           /* Record line-number notes so they can be reused.  */
1117           LINE_NOTE (insn) = insn;
1118         }
1119       else
1120         prev = insn;
1121
1122       insn = next;
1123     }
1124   return insn;
1125 }
1126
1127 /* Return the head and tail pointers of BB.  */
1128
1129 void
1130 get_block_head_tail (b, headp, tailp)
1131      int b;
1132      rtx *headp;
1133      rtx *tailp;
1134 {
1135   /* HEAD and TAIL delimit the basic block being scheduled.  */
1136   rtx head = BLOCK_HEAD (b);
1137   rtx tail = BLOCK_END (b);
1138
1139   /* Don't include any notes or labels at the beginning of the
1140      basic block, or notes at the ends of basic blocks.  */
1141   while (head != tail)
1142     {
1143       if (GET_CODE (head) == NOTE)
1144         head = NEXT_INSN (head);
1145       else if (GET_CODE (tail) == NOTE)
1146         tail = PREV_INSN (tail);
1147       else if (GET_CODE (head) == CODE_LABEL)
1148         head = NEXT_INSN (head);
1149       else
1150         break;
1151     }
1152
1153   *headp = head;
1154   *tailp = tail;
1155 }
1156
1157 /* Return nonzero if there are no real insns in the range [ HEAD, TAIL ].  */
1158
1159 int
1160 no_real_insns_p (head, tail)
1161      rtx head, tail;
1162 {
1163   while (head != NEXT_INSN (tail))
1164     {
1165       if (GET_CODE (head) != NOTE && GET_CODE (head) != CODE_LABEL)
1166         return 0;
1167       head = NEXT_INSN (head);
1168     }
1169   return 1;
1170 }
1171
1172 /* Delete line notes from one block. Save them so they can be later restored
1173    (in restore_line_notes).  HEAD and TAIL are the boundaries of the
1174    block in which notes should be processed.  */
1175
1176 void
1177 rm_line_notes (head, tail)
1178      rtx head, tail;
1179 {
1180   rtx next_tail;
1181   rtx insn;
1182
1183   next_tail = NEXT_INSN (tail);
1184   for (insn = head; insn != next_tail; insn = NEXT_INSN (insn))
1185     {
1186       rtx prev;
1187
1188       /* Farm out notes, and maybe save them in NOTE_LIST.
1189          This is needed to keep the debugger from
1190          getting completely deranged.  */
1191       if (GET_CODE (insn) == NOTE)
1192         {
1193           prev = insn;
1194           insn = unlink_line_notes (insn, next_tail);
1195
1196           if (prev == tail)
1197             abort ();
1198           if (prev == head)
1199             abort ();
1200           if (insn == next_tail)
1201             abort ();
1202         }
1203     }
1204 }
1205
1206 /* Save line number notes for each insn in block B.  HEAD and TAIL are
1207    the boundaries of the block in which notes should be processed.*/
1208
1209 void
1210 save_line_notes (b, head, tail)
1211      int b;
1212      rtx head, tail;
1213 {
1214   rtx next_tail;
1215
1216   /* We must use the true line number for the first insn in the block
1217      that was computed and saved at the start of this pass.  We can't
1218      use the current line number, because scheduling of the previous
1219      block may have changed the current line number.  */
1220
1221   rtx line = line_note_head[b];
1222   rtx insn;
1223
1224   next_tail = NEXT_INSN (tail);
1225
1226   for (insn = head; insn != next_tail; insn = NEXT_INSN (insn))
1227     if (GET_CODE (insn) == NOTE && NOTE_LINE_NUMBER (insn) > 0)
1228       line = insn;
1229     else
1230       LINE_NOTE (insn) = line;
1231 }
1232
1233 /* After a block was scheduled, insert line notes into the insns list.
1234    HEAD and TAIL are the boundaries of the block in which notes should
1235    be processed.*/
1236
1237 void
1238 restore_line_notes (head, tail)
1239      rtx head, tail;
1240 {
1241   rtx line, note, prev, new;
1242   int added_notes = 0;
1243   rtx next_tail, insn;
1244
1245   head = head;
1246   next_tail = NEXT_INSN (tail);
1247
1248   /* Determine the current line-number.  We want to know the current
1249      line number of the first insn of the block here, in case it is
1250      different from the true line number that was saved earlier.  If
1251      different, then we need a line number note before the first insn
1252      of this block.  If it happens to be the same, then we don't want to
1253      emit another line number note here.  */
1254   for (line = head; line; line = PREV_INSN (line))
1255     if (GET_CODE (line) == NOTE && NOTE_LINE_NUMBER (line) > 0)
1256       break;
1257
1258   /* Walk the insns keeping track of the current line-number and inserting
1259      the line-number notes as needed.  */
1260   for (insn = head; insn != next_tail; insn = NEXT_INSN (insn))
1261     if (GET_CODE (insn) == NOTE && NOTE_LINE_NUMBER (insn) > 0)
1262       line = insn;
1263   /* This used to emit line number notes before every non-deleted note.
1264      However, this confuses a debugger, because line notes not separated
1265      by real instructions all end up at the same address.  I can find no
1266      use for line number notes before other notes, so none are emitted.  */
1267     else if (GET_CODE (insn) != NOTE
1268              && INSN_UID (insn) < old_max_uid
1269              && (note = LINE_NOTE (insn)) != 0
1270              && note != line
1271              && (line == 0
1272                  || NOTE_LINE_NUMBER (note) != NOTE_LINE_NUMBER (line)
1273                  || NOTE_SOURCE_FILE (note) != NOTE_SOURCE_FILE (line)))
1274       {
1275         line = note;
1276         prev = PREV_INSN (insn);
1277         if (LINE_NOTE (note))
1278           {
1279             /* Re-use the original line-number note.  */
1280             LINE_NOTE (note) = 0;
1281             PREV_INSN (note) = prev;
1282             NEXT_INSN (prev) = note;
1283             PREV_INSN (insn) = note;
1284             NEXT_INSN (note) = insn;
1285           }
1286         else
1287           {
1288             added_notes++;
1289             new = emit_note_after (NOTE_LINE_NUMBER (note), prev);
1290             NOTE_SOURCE_FILE (new) = NOTE_SOURCE_FILE (note);
1291             RTX_INTEGRATED_P (new) = RTX_INTEGRATED_P (note);
1292           }
1293       }
1294   if (sched_verbose && added_notes)
1295     fprintf (sched_dump, ";; added %d line-number notes\n", added_notes);
1296 }
1297
1298 /* After scheduling the function, delete redundant line notes from the
1299    insns list.  */
1300
1301 void
1302 rm_redundant_line_notes ()
1303 {
1304   rtx line = 0;
1305   rtx insn = get_insns ();
1306   int active_insn = 0;
1307   int notes = 0;
1308
1309   /* Walk the insns deleting redundant line-number notes.  Many of these
1310      are already present.  The remainder tend to occur at basic
1311      block boundaries.  */
1312   for (insn = get_last_insn (); insn; insn = PREV_INSN (insn))
1313     if (GET_CODE (insn) == NOTE && NOTE_LINE_NUMBER (insn) > 0)
1314       {
1315         /* If there are no active insns following, INSN is redundant.  */
1316         if (active_insn == 0)
1317           {
1318             notes++;
1319             NOTE_SOURCE_FILE (insn) = 0;
1320             NOTE_LINE_NUMBER (insn) = NOTE_INSN_DELETED;
1321           }
1322         /* If the line number is unchanged, LINE is redundant.  */
1323         else if (line
1324                  && NOTE_LINE_NUMBER (line) == NOTE_LINE_NUMBER (insn)
1325                  && NOTE_SOURCE_FILE (line) == NOTE_SOURCE_FILE (insn))
1326           {
1327             notes++;
1328             NOTE_SOURCE_FILE (line) = 0;
1329             NOTE_LINE_NUMBER (line) = NOTE_INSN_DELETED;
1330             line = insn;
1331           }
1332         else
1333           line = insn;
1334         active_insn = 0;
1335       }
1336     else if (!((GET_CODE (insn) == NOTE
1337                 && NOTE_LINE_NUMBER (insn) == NOTE_INSN_DELETED)
1338                || (GET_CODE (insn) == INSN
1339                    && (GET_CODE (PATTERN (insn)) == USE
1340                        || GET_CODE (PATTERN (insn)) == CLOBBER))))
1341       active_insn++;
1342
1343   if (sched_verbose && notes)
1344     fprintf (sched_dump, ";; deleted %d line-number notes\n", notes);
1345 }
1346
1347 /* Delete notes between HEAD and TAIL and put them in the chain
1348    of notes ended by NOTE_LIST.  */
1349
1350 void
1351 rm_other_notes (head, tail)
1352      rtx head;
1353      rtx tail;
1354 {
1355   rtx next_tail;
1356   rtx insn;
1357
1358   note_list = 0;
1359   if (head == tail && (! INSN_P (head)))
1360     return;
1361
1362   next_tail = NEXT_INSN (tail);
1363   for (insn = head; insn != next_tail; insn = NEXT_INSN (insn))
1364     {
1365       rtx prev;
1366
1367       /* Farm out notes, and maybe save them in NOTE_LIST.
1368          This is needed to keep the debugger from
1369          getting completely deranged.  */
1370       if (GET_CODE (insn) == NOTE)
1371         {
1372           prev = insn;
1373
1374           insn = unlink_other_notes (insn, next_tail);
1375
1376           if (prev == tail)
1377             abort ();
1378           if (prev == head)
1379             abort ();
1380           if (insn == next_tail)
1381             abort ();
1382         }
1383     }
1384 }
1385
1386 /* Functions for computation of registers live/usage info.  */
1387
1388 /* Calculate INSN_REG_WEIGHT for all insns of a block.  */
1389
1390 static void
1391 find_insn_reg_weight (b)
1392      int b;
1393 {
1394   rtx insn, next_tail, head, tail;
1395
1396   get_block_head_tail (b, &head, &tail);
1397   next_tail = NEXT_INSN (tail);
1398
1399   for (insn = head; insn != next_tail; insn = NEXT_INSN (insn))
1400     {
1401       int reg_weight = 0;
1402       rtx x;
1403
1404       /* Handle register life information.  */
1405       if (! INSN_P (insn))
1406         continue;
1407
1408       /* Increment weight for each register born here.  */
1409       x = PATTERN (insn);
1410       if ((GET_CODE (x) == SET || GET_CODE (x) == CLOBBER)
1411           && register_operand (SET_DEST (x), VOIDmode))
1412         reg_weight++;
1413       else if (GET_CODE (x) == PARALLEL)
1414         {
1415           int j;
1416           for (j = XVECLEN (x, 0) - 1; j >= 0; j--)
1417             {
1418               x = XVECEXP (PATTERN (insn), 0, j);
1419               if ((GET_CODE (x) == SET || GET_CODE (x) == CLOBBER)
1420                   && register_operand (SET_DEST (x), VOIDmode))
1421                 reg_weight++;
1422             }
1423         }
1424
1425       /* Decrement weight for each register that dies here.  */
1426       for (x = REG_NOTES (insn); x; x = XEXP (x, 1))
1427         {
1428           if (REG_NOTE_KIND (x) == REG_DEAD
1429               || REG_NOTE_KIND (x) == REG_UNUSED)
1430             reg_weight--;
1431         }
1432
1433       INSN_REG_WEIGHT (insn) = reg_weight;
1434     }
1435 }
1436
1437 /* Scheduling clock, modified in schedule_block() and queue_to_ready ().  */
1438 static int clock_var;
1439
1440 /* Move insns that became ready to fire from queue to ready list.  */
1441
1442 static void
1443 queue_to_ready (ready)
1444      struct ready_list *ready;
1445 {
1446   rtx insn;
1447   rtx link;
1448
1449   q_ptr = NEXT_Q (q_ptr);
1450
1451   /* Add all pending insns that can be scheduled without stalls to the
1452      ready list.  */
1453   for (link = insn_queue[q_ptr]; link; link = XEXP (link, 1))
1454     {
1455       insn = XEXP (link, 0);
1456       q_size -= 1;
1457
1458       if (sched_verbose >= 2)
1459         fprintf (sched_dump, ";;\t\tQ-->Ready: insn %s: ",
1460                  (*current_sched_info->print_insn) (insn, 0));
1461
1462       ready_add (ready, insn);
1463       if (sched_verbose >= 2)
1464         fprintf (sched_dump, "moving to ready without stalls\n");
1465     }
1466   insn_queue[q_ptr] = 0;
1467
1468   /* If there are no ready insns, stall until one is ready and add all
1469      of the pending insns at that point to the ready list.  */
1470   if (ready->n_ready == 0)
1471     {
1472       register int stalls;
1473
1474       for (stalls = 1; stalls < INSN_QUEUE_SIZE; stalls++)
1475         {
1476           if ((link = insn_queue[NEXT_Q_AFTER (q_ptr, stalls)]))
1477             {
1478               for (; link; link = XEXP (link, 1))
1479                 {
1480                   insn = XEXP (link, 0);
1481                   q_size -= 1;
1482
1483                   if (sched_verbose >= 2)
1484                     fprintf (sched_dump, ";;\t\tQ-->Ready: insn %s: ",
1485                              (*current_sched_info->print_insn) (insn, 0));
1486
1487                   ready_add (ready, insn);
1488                   if (sched_verbose >= 2)
1489                     fprintf (sched_dump, "moving to ready with %d stalls\n", stalls);
1490                 }
1491               insn_queue[NEXT_Q_AFTER (q_ptr, stalls)] = 0;
1492
1493               if (ready->n_ready)
1494                 break;
1495             }
1496         }
1497
1498       if (sched_verbose && stalls)
1499         visualize_stall_cycles (stalls);
1500       q_ptr = NEXT_Q_AFTER (q_ptr, stalls);
1501       clock_var += stalls;
1502     }
1503 }
1504
1505 /* Print the ready list for debugging purposes.  Callable from debugger.  */
1506
1507 static void
1508 debug_ready_list (ready)
1509      struct ready_list *ready;
1510 {
1511   rtx *p;
1512   int i;
1513
1514   if (ready->n_ready == 0)
1515     return;
1516
1517   p = ready_lastpos (ready);
1518   for (i = 0; i < ready->n_ready; i++)
1519     fprintf (sched_dump, "  %s", (*current_sched_info->print_insn) (p[i], 0));
1520   fprintf (sched_dump, "\n");
1521 }
1522
1523 /* move_insn1: Remove INSN from insn chain, and link it after LAST insn.  */
1524
1525 static rtx
1526 move_insn1 (insn, last)
1527      rtx insn, last;
1528 {
1529   NEXT_INSN (PREV_INSN (insn)) = NEXT_INSN (insn);
1530   PREV_INSN (NEXT_INSN (insn)) = PREV_INSN (insn);
1531
1532   NEXT_INSN (insn) = NEXT_INSN (last);
1533   PREV_INSN (NEXT_INSN (last)) = insn;
1534
1535   NEXT_INSN (last) = insn;
1536   PREV_INSN (insn) = last;
1537
1538   return insn;
1539 }
1540
1541 /* Search INSN for REG_SAVE_NOTE note pairs for NOTE_INSN_SETJMP,
1542    NOTE_INSN_{LOOP,EHREGION}_{BEG,END}; and convert them back into
1543    NOTEs.  The REG_SAVE_NOTE note following first one is contains the
1544    saved value for NOTE_BLOCK_NUMBER which is useful for
1545    NOTE_INSN_EH_REGION_{BEG,END} NOTEs.  LAST is the last instruction
1546    output by the instruction scheduler.  Return the new value of LAST.  */
1547
1548 static rtx
1549 reemit_notes (insn, last)
1550      rtx insn;
1551      rtx last;
1552 {
1553   rtx note, retval;
1554
1555   retval = last;
1556   for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
1557     {
1558       if (REG_NOTE_KIND (note) == REG_SAVE_NOTE)
1559         {
1560           enum insn_note note_type = INTVAL (XEXP (note, 0));
1561
1562           if (note_type == NOTE_INSN_SETJMP)
1563             {
1564               retval = emit_note_after (NOTE_INSN_SETJMP, insn);
1565               CONST_CALL_P (retval) = CONST_CALL_P (note);
1566               remove_note (insn, note);
1567               note = XEXP (note, 1);
1568             }
1569           else if (note_type == NOTE_INSN_RANGE_BEG
1570                    || note_type == NOTE_INSN_RANGE_END)
1571             {
1572               last = emit_note_before (note_type, last);
1573               remove_note (insn, note);
1574               note = XEXP (note, 1);
1575               NOTE_RANGE_INFO (last) = XEXP (note, 0);
1576             }
1577           else
1578             {
1579               last = emit_note_before (note_type, last);
1580               remove_note (insn, note);
1581               note = XEXP (note, 1);
1582               if (note_type == NOTE_INSN_EH_REGION_BEG
1583                   || note_type == NOTE_INSN_EH_REGION_END)
1584                 NOTE_EH_HANDLER (last) = INTVAL (XEXP (note, 0));
1585             }
1586           remove_note (insn, note);
1587         }
1588     }
1589   return retval;
1590 }
1591
1592 /* Move INSN, and all insns which should be issued before it,
1593    due to SCHED_GROUP_P flag.  Reemit notes if needed.
1594
1595    Return the last insn emitted by the scheduler, which is the
1596    return value from the first call to reemit_notes.  */
1597
1598 static rtx
1599 move_insn (insn, last)
1600      rtx insn, last;
1601 {
1602   rtx retval = NULL;
1603
1604   /* If INSN has SCHED_GROUP_P set, then issue it and any other
1605      insns with SCHED_GROUP_P set first.  */
1606   while (SCHED_GROUP_P (insn))
1607     {
1608       rtx prev = PREV_INSN (insn);
1609
1610       /* Move a SCHED_GROUP_P insn.  */
1611       move_insn1 (insn, last);
1612       /* If this is the first call to reemit_notes, then record
1613          its return value.  */
1614       if (retval == NULL_RTX)
1615         retval = reemit_notes (insn, insn);
1616       else
1617         reemit_notes (insn, insn);
1618       insn = prev;
1619     }
1620
1621   /* Now move the first non SCHED_GROUP_P insn.  */
1622   move_insn1 (insn, last);
1623
1624   /* If this is the first call to reemit_notes, then record
1625      its return value.  */
1626   if (retval == NULL_RTX)
1627     retval = reemit_notes (insn, insn);
1628   else
1629     reemit_notes (insn, insn);
1630
1631   return retval;
1632 }
1633
1634 /* Use forward list scheduling to rearrange insns of block B in region RGN,
1635    possibly bringing insns from subsequent blocks in the same region.  */
1636
1637 void
1638 schedule_block (b, rgn_n_insns)
1639      int b;
1640      int rgn_n_insns;
1641 {
1642   rtx last;
1643   struct ready_list ready;
1644   int can_issue_more;
1645
1646   /* Head/tail info for this block.  */
1647   rtx prev_head = current_sched_info->prev_head;
1648   rtx next_tail = current_sched_info->next_tail;
1649   rtx head = NEXT_INSN (prev_head);
1650   rtx tail = PREV_INSN (next_tail);
1651
1652   /* We used to have code to avoid getting parameters moved from hard
1653      argument registers into pseudos.
1654
1655      However, it was removed when it proved to be of marginal benefit
1656      and caused problems because schedule_block and compute_forward_dependences
1657      had different notions of what the "head" insn was.  */
1658
1659   if (head == tail && (! INSN_P (head)))
1660     abort ();
1661
1662   /* Debug info.  */
1663   if (sched_verbose)
1664     {
1665       fprintf (sched_dump, ";;   ======================================================\n");
1666       fprintf (sched_dump,
1667                ";;   -- basic block %d from %d to %d -- %s reload\n",
1668                b, INSN_UID (head), INSN_UID (tail),
1669                (reload_completed ? "after" : "before"));
1670       fprintf (sched_dump, ";;   ======================================================\n");
1671       fprintf (sched_dump, "\n");
1672
1673       visualize_alloc ();
1674       init_block_visualization ();
1675     }
1676
1677   clear_units ();
1678
1679   /* Allocate the ready list.  */
1680   ready.veclen = rgn_n_insns + 1 + ISSUE_RATE;
1681   ready.first = ready.veclen - 1;
1682   ready.vec = (rtx *) xmalloc (ready.veclen * sizeof (rtx));
1683   ready.n_ready = 0;
1684
1685   (*current_sched_info->init_ready_list) (&ready);
1686
1687 #ifdef MD_SCHED_INIT
1688   MD_SCHED_INIT (sched_dump, sched_verbose, ready.veclen);
1689 #endif
1690
1691   /* No insns scheduled in this block yet.  */
1692   last_scheduled_insn = 0;
1693
1694   /* Initialize INSN_QUEUE.  Q_SIZE is the total number of insns in the
1695      queue.  */
1696   q_ptr = 0;
1697   q_size = 0;
1698   last_clock_var = 0;
1699   memset ((char *) insn_queue, 0, sizeof (insn_queue));
1700
1701   /* Start just before the beginning of time.  */
1702   clock_var = -1;
1703
1704   /* We start inserting insns after PREV_HEAD.  */
1705   last = prev_head;
1706
1707   /* Loop until all the insns in BB are scheduled.  */
1708   while ((*current_sched_info->schedule_more_p) ())
1709     {
1710       clock_var++;
1711
1712       /* Add to the ready list all pending insns that can be issued now.
1713          If there are no ready insns, increment clock until one
1714          is ready and add all pending insns at that point to the ready
1715          list.  */
1716       queue_to_ready (&ready);
1717
1718 #ifdef HAVE_cycle_display
1719       if (HAVE_cycle_display)
1720         last = emit_insn_after (gen_cycle_display (GEN_INT (clock_var)), last);
1721 #endif
1722
1723       if (ready.n_ready == 0)
1724         abort ();
1725
1726       if (sched_verbose >= 2)
1727         {
1728           fprintf (sched_dump, ";;\t\tReady list after queue_to_ready:  ");
1729           debug_ready_list (&ready);
1730         }
1731
1732       /* Sort the ready list based on priority.  */
1733       ready_sort (&ready);
1734
1735       /* Allow the target to reorder the list, typically for
1736          better instruction bundling.  */
1737 #ifdef MD_SCHED_REORDER
1738       MD_SCHED_REORDER (sched_dump, sched_verbose, ready_lastpos (&ready),
1739                         ready.n_ready, clock_var, can_issue_more);
1740 #else
1741       can_issue_more = issue_rate;
1742 #endif
1743
1744       if (sched_verbose)
1745         {
1746           fprintf (sched_dump, "\n;;\tReady list (t =%3d):  ", clock_var);
1747           debug_ready_list (&ready);
1748         }
1749
1750       /* Issue insns from ready list.  */
1751       while (ready.n_ready != 0
1752              && can_issue_more
1753              && (*current_sched_info->schedule_more_p) ())
1754         {
1755           /* Select and remove the insn from the ready list.  */
1756           rtx insn = ready_remove_first (&ready);
1757           int cost = actual_hazard (insn_unit (insn), insn, clock_var, 0);
1758
1759           if (cost >= 1)
1760             {
1761               queue_insn (insn, cost);
1762               continue;
1763             }
1764
1765           if (! (*current_sched_info->can_schedule_ready_p) (insn))
1766             goto next;
1767
1768           last_scheduled_insn = insn;
1769           last = move_insn (insn, last);
1770
1771 #ifdef MD_SCHED_VARIABLE_ISSUE
1772           MD_SCHED_VARIABLE_ISSUE (sched_dump, sched_verbose, insn,
1773                                    can_issue_more);
1774 #else
1775           can_issue_more--;
1776 #endif
1777
1778           schedule_insn (insn, &ready, clock_var);
1779
1780         next:
1781           ;
1782 #ifdef MD_SCHED_REORDER2
1783           /* Sort the ready list based on priority.  */
1784           if (ready.n_ready > 0)
1785             ready_sort (&ready);
1786           MD_SCHED_REORDER2 (sched_dump, sched_verbose,
1787                              ready.n_ready ? ready_lastpos (&ready) : NULL,
1788                              ready.n_ready, clock_var, can_issue_more);
1789 #endif
1790         }
1791
1792       /* Debug info.  */
1793       if (sched_verbose)
1794         visualize_scheduled_insns (clock_var);
1795     }
1796
1797 #ifdef MD_SCHED_FINISH
1798   MD_SCHED_FINISH (sched_dump, sched_verbose);
1799 #endif
1800
1801   /* Debug info.  */
1802   if (sched_verbose)
1803     {
1804       fprintf (sched_dump, ";;\tReady list (final):  ");
1805       debug_ready_list (&ready);
1806       print_block_visualization ("");
1807     }
1808
1809   /* Sanity check -- queue must be empty now.  Meaningless if region has
1810      multiple bbs.  */
1811   if (current_sched_info->queue_must_finish_empty && q_size != 0)
1812       abort ();
1813
1814   /* Update head/tail boundaries.  */
1815   head = NEXT_INSN (prev_head);
1816   tail = last;
1817
1818   /* Restore-other-notes: NOTE_LIST is the end of a chain of notes
1819      previously found among the insns.  Insert them at the beginning
1820      of the insns.  */
1821   if (note_list != 0)
1822     {
1823       rtx note_head = note_list;
1824
1825       while (PREV_INSN (note_head))
1826         {
1827           note_head = PREV_INSN (note_head);
1828         }
1829
1830       PREV_INSN (note_head) = PREV_INSN (head);
1831       NEXT_INSN (PREV_INSN (head)) = note_head;
1832       PREV_INSN (head) = note_list;
1833       NEXT_INSN (note_list) = head;
1834       head = note_head;
1835     }
1836
1837   /* Debugging.  */
1838   if (sched_verbose)
1839     {
1840       fprintf (sched_dump, ";;   total time = %d\n;;   new head = %d\n",
1841                clock_var, INSN_UID (head));
1842       fprintf (sched_dump, ";;   new tail = %d\n\n",
1843                INSN_UID (tail));
1844       visualize_free ();
1845     }
1846
1847   current_sched_info->head = head;
1848   current_sched_info->tail = tail;
1849
1850   free (ready.vec);
1851 }
1852 \f
1853 /* Set_priorities: compute priority of each insn in the block.  */
1854
1855 int
1856 set_priorities (head, tail)
1857      rtx head, tail;
1858 {
1859   rtx insn;
1860   int n_insn;
1861
1862   rtx prev_head;
1863
1864   prev_head = PREV_INSN (head);
1865
1866   if (head == tail && (! INSN_P (head)))
1867     return 0;
1868
1869   n_insn = 0;
1870   for (insn = tail; insn != prev_head; insn = PREV_INSN (insn))
1871     {
1872       if (GET_CODE (insn) == NOTE)
1873         continue;
1874
1875       if (!(SCHED_GROUP_P (insn)))
1876         n_insn++;
1877       (void) priority (insn);
1878     }
1879
1880   return n_insn;
1881 }
1882
1883 /* Initialize some global state for the scheduler.  DUMP_FILE is to be used
1884    for debugging output.  */
1885
1886 void
1887 sched_init (dump_file)
1888      FILE *dump_file;
1889 {
1890   int luid, b;
1891   rtx insn;
1892
1893   /* Disable speculative loads in their presence if cc0 defined.  */
1894 #ifdef HAVE_cc0
1895   flag_schedule_speculative_load = 0;
1896 #endif
1897
1898   /* Set dump and sched_verbose for the desired debugging output.  If no
1899      dump-file was specified, but -fsched-verbose=N (any N), print to stderr.
1900      For -fsched-verbose=N, N>=10, print everything to stderr.  */
1901   sched_verbose = sched_verbose_param;
1902   if (sched_verbose_param == 0 && dump_file)
1903     sched_verbose = 1;
1904   sched_dump = ((sched_verbose_param >= 10 || !dump_file)
1905                 ? stderr : dump_file);
1906
1907   /* Initialize issue_rate.  */
1908   issue_rate = ISSUE_RATE;
1909
1910   split_all_insns (1);
1911
1912   /* We use LUID 0 for the fake insn (UID 0) which holds dependencies for
1913      pseudos which do not cross calls.  */
1914   old_max_uid = get_max_uid () + 1;
1915
1916   h_i_d = (struct haifa_insn_data *) xcalloc (old_max_uid, sizeof (*h_i_d));
1917
1918   h_i_d[0].luid = 0;
1919   luid = 1;
1920   for (b = 0; b < n_basic_blocks; b++)
1921     for (insn = BLOCK_HEAD (b);; insn = NEXT_INSN (insn))
1922       {
1923         INSN_LUID (insn) = luid;
1924
1925         /* Increment the next luid, unless this is a note.  We don't
1926            really need separate IDs for notes and we don't want to
1927            schedule differently depending on whether or not there are
1928            line-number notes, i.e., depending on whether or not we're
1929            generating debugging information.  */
1930         if (GET_CODE (insn) != NOTE)
1931           ++luid;
1932
1933         if (insn == BLOCK_END (b))
1934           break;
1935       }
1936
1937   init_dependency_caches (luid);
1938
1939   compute_bb_for_insn (old_max_uid);
1940
1941   init_alias_analysis ();
1942
1943   if (write_symbols != NO_DEBUG)
1944     {
1945       rtx line;
1946
1947       line_note_head = (rtx *) xcalloc (n_basic_blocks, sizeof (rtx));
1948
1949       /* Save-line-note-head:
1950          Determine the line-number at the start of each basic block.
1951          This must be computed and saved now, because after a basic block's
1952          predecessor has been scheduled, it is impossible to accurately
1953          determine the correct line number for the first insn of the block.  */
1954
1955       for (b = 0; b < n_basic_blocks; b++)
1956         {
1957           for (line = BLOCK_HEAD (b); line; line = PREV_INSN (line))
1958             if (GET_CODE (line) == NOTE && NOTE_LINE_NUMBER (line) > 0)
1959               {
1960                 line_note_head[b] = line;
1961                 break;
1962               }
1963           /* Do a forward search as well, since we won't get to see the first
1964              notes in a basic block.  */
1965           for (line = BLOCK_HEAD (b); line; line = NEXT_INSN (line))
1966             {
1967               if (INSN_P (line))
1968                 break;
1969               if (GET_CODE (line) == NOTE && NOTE_LINE_NUMBER (line) > 0)
1970                 line_note_head[b] = line;
1971             }
1972         }
1973     }
1974
1975   /* Find units used in this fuction, for visualization.  */
1976   if (sched_verbose)
1977     init_target_units ();
1978
1979   /* ??? Add a NOTE after the last insn of the last basic block.  It is not
1980      known why this is done.  */
1981
1982   insn = BLOCK_END (n_basic_blocks - 1);
1983   if (NEXT_INSN (insn) == 0
1984       || (GET_CODE (insn) != NOTE
1985           && GET_CODE (insn) != CODE_LABEL
1986           /* Don't emit a NOTE if it would end up before a BARRIER.  */
1987           && GET_CODE (NEXT_INSN (insn)) != BARRIER))
1988     emit_note_after (NOTE_INSN_DELETED, BLOCK_END (n_basic_blocks - 1));
1989
1990   /* Compute INSN_REG_WEIGHT for all blocks.  We must do this before
1991      removing death notes.  */
1992   for (b = n_basic_blocks - 1; b >= 0; b--)
1993     find_insn_reg_weight (b);
1994 }
1995
1996 /* Free global data used during insn scheduling.  */
1997
1998 void
1999 sched_finish ()
2000 {
2001   free (h_i_d);
2002   free_dependency_caches ();
2003   end_alias_analysis ();
2004   if (write_symbols != NO_DEBUG)
2005     free (line_note_head);
2006 }
2007 #endif /* INSN_SCHEDULING */