OSDN Git Service

* Makefile.in (html): Add html generation support.
[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, 2002, 2003, 2004 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 GCC.
8
9 GCC is free software; you can redistribute it and/or modify it under
10 the terms of the GNU General Public License as published by the Free
11 Software Foundation; either version 2, or (at your option) any later
12 version.
13
14 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
15 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 GCC; see the file COPYING.  If not, write to the Free
21 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    The following list shows the order in which we want to break ties
58    among insns in the ready list:
59
60    1.  choose insn with the longest path to end of bb, ties
61    broken by
62    2.  choose insn with least contribution to register pressure,
63    ties broken by
64    3.  prefer in-block upon interblock motion, ties broken by
65    4.  prefer useful upon speculative motion, ties broken by
66    5.  choose insn with largest control flow probability, ties
67    broken by
68    6.  choose insn with the least dependences upon the previously
69    scheduled insn, or finally
70    7   choose the insn which has the most insns dependent on it.
71    8.  choose insn with lowest UID.
72
73    Memory references complicate matters.  Only if we can be certain
74    that memory references are not part of the data dependency graph
75    (via true, anti, or output dependence), can we move operations past
76    memory references.  To first approximation, reads can be done
77    independently, while writes introduce dependencies.  Better
78    approximations will yield fewer dependencies.
79
80    Before reload, an extended analysis of interblock data dependences
81    is required for interblock scheduling.  This is performed in
82    compute_block_backward_dependences ().
83
84    Dependencies set up by memory references are treated in exactly the
85    same way as other dependencies, by using LOG_LINKS backward
86    dependences.  LOG_LINKS are translated into INSN_DEPEND forward
87    dependences for the purpose of forward list scheduling.
88
89    Having optimized the critical path, we may have also unduly
90    extended the lifetimes of some registers.  If an operation requires
91    that constants be loaded into registers, it is certainly desirable
92    to load those constants as early as necessary, but no earlier.
93    I.e., it will not do to load up a bunch of registers at the
94    beginning of a basic block only to use them at the end, if they
95    could be loaded later, since this may result in excessive register
96    utilization.
97
98    Note that since branches are never in basic blocks, but only end
99    basic blocks, this pass will not move branches.  But that is ok,
100    since we can use GNU's delayed branch scheduling pass to take care
101    of this case.
102
103    Also note that no further optimizations based on algebraic
104    identities are performed, so this pass would be a good one to
105    perform instruction splitting, such as breaking up a multiply
106    instruction into shifts and adds where that is profitable.
107
108    Given the memory aliasing analysis that this pass should perform,
109    it should be possible to remove redundant stores to memory, and to
110    load values from registers instead of hitting memory.
111
112    Before reload, speculative insns are moved only if a 'proof' exists
113    that no exception will be caused by this, and if no live registers
114    exist that inhibit the motion (live registers constraints are not
115    represented by data dependence edges).
116
117    This pass must update information that subsequent passes expect to
118    be correct.  Namely: reg_n_refs, reg_n_sets, reg_n_deaths,
119    reg_n_calls_crossed, and reg_live_length.  Also, BB_HEAD, BB_END.
120
121    The information in the line number notes is carefully retained by
122    this pass.  Notes that refer to the starting and ending of
123    exception regions are also carefully retained by this pass.  All
124    other NOTE insns are grouped in their same relative order at the
125    beginning of basic blocks and regions that have been scheduled.  */
126 \f
127 #include "config.h"
128 #include "system.h"
129 #include "coretypes.h"
130 #include "tm.h"
131 #include "toplev.h"
132 #include "rtl.h"
133 #include "tm_p.h"
134 #include "hard-reg-set.h"
135 #include "basic-block.h"
136 #include "regs.h"
137 #include "function.h"
138 #include "flags.h"
139 #include "insn-config.h"
140 #include "insn-attr.h"
141 #include "except.h"
142 #include "toplev.h"
143 #include "recog.h"
144 #include "sched-int.h"
145 #include "target.h"
146
147 #ifdef INSN_SCHEDULING
148
149 /* issue_rate is the number of insns that can be scheduled in the same
150    machine cycle.  It can be defined in the config/mach/mach.h file,
151    otherwise we set it to 1.  */
152
153 static int issue_rate;
154
155 /* sched-verbose controls the amount of debugging output the
156    scheduler prints.  It is controlled by -fsched-verbose=N:
157    N>0 and no -DSR : the output is directed to stderr.
158    N>=10 will direct the printouts to stderr (regardless of -dSR).
159    N=1: same as -dSR.
160    N=2: bb's probabilities, detailed ready list info, unit/insn info.
161    N=3: rtl at abort point, control-flow, regions info.
162    N=5: dependences info.  */
163
164 static int sched_verbose_param = 0;
165 int sched_verbose = 0;
166
167 /* Debugging file.  All printouts are sent to dump, which is always set,
168    either to stderr, or to the dump listing file (-dRS).  */
169 FILE *sched_dump = 0;
170
171 /* Highest uid before scheduling.  */
172 static int old_max_uid;
173
174 /* fix_sched_param() is called from toplev.c upon detection
175    of the -fsched-verbose=N option.  */
176
177 void
178 fix_sched_param (const char *param, const char *val)
179 {
180   if (!strcmp (param, "verbose"))
181     sched_verbose_param = atoi (val);
182   else
183     warning ("fix_sched_param: unknown param: %s", param);
184 }
185
186 struct haifa_insn_data *h_i_d;
187
188 #define LINE_NOTE(INSN)         (h_i_d[INSN_UID (INSN)].line_note)
189 #define INSN_TICK(INSN)         (h_i_d[INSN_UID (INSN)].tick)
190
191 /* Vector indexed by basic block number giving the starting line-number
192    for each basic block.  */
193 static rtx *line_note_head;
194
195 /* List of important notes we must keep around.  This is a pointer to the
196    last element in the list.  */
197 static rtx note_list;
198
199 /* Queues, etc.  */
200
201 /* An instruction is ready to be scheduled when all insns preceding it
202    have already been scheduled.  It is important to ensure that all
203    insns which use its result will not be executed until its result
204    has been computed.  An insn is maintained in one of four structures:
205
206    (P) the "Pending" set of insns which cannot be scheduled until
207    their dependencies have been satisfied.
208    (Q) the "Queued" set of insns that can be scheduled when sufficient
209    time has passed.
210    (R) the "Ready" list of unscheduled, uncommitted insns.
211    (S) the "Scheduled" list of insns.
212
213    Initially, all insns are either "Pending" or "Ready" depending on
214    whether their dependencies are satisfied.
215
216    Insns move from the "Ready" list to the "Scheduled" list as they
217    are committed to the schedule.  As this occurs, the insns in the
218    "Pending" list have their dependencies satisfied and move to either
219    the "Ready" list or the "Queued" set depending on whether
220    sufficient time has passed to make them ready.  As time passes,
221    insns move from the "Queued" set to the "Ready" list.
222
223    The "Pending" list (P) are the insns in the INSN_DEPEND of the unscheduled
224    insns, i.e., those that are ready, queued, and pending.
225    The "Queued" set (Q) is implemented by the variable `insn_queue'.
226    The "Ready" list (R) is implemented by the variables `ready' and
227    `n_ready'.
228    The "Scheduled" list (S) is the new insn chain built by this pass.
229
230    The transition (R->S) is implemented in the scheduling loop in
231    `schedule_block' when the best insn to schedule is chosen.
232    The transitions (P->R and P->Q) are implemented in `schedule_insn' as
233    insns move from the ready list to the scheduled list.
234    The transition (Q->R) is implemented in 'queue_to_insn' as time
235    passes or stalls are introduced.  */
236
237 /* Implement a circular buffer to delay instructions until sufficient
238    time has passed.  For the new pipeline description interface,
239    MAX_INSN_QUEUE_INDEX is a power of two minus one which is larger
240    than maximal time of instruction execution computed by genattr.c on
241    the base maximal time of functional unit reservations and getting a
242    result.  This is the longest time an insn may be queued.  */
243
244 static rtx *insn_queue;
245 static int q_ptr = 0;
246 static int q_size = 0;
247 #define NEXT_Q(X) (((X)+1) & max_insn_queue_index)
248 #define NEXT_Q_AFTER(X, C) (((X)+C) & max_insn_queue_index)
249
250 /* The following variable value refers for all current and future
251    reservations of the processor units.  */
252 state_t curr_state;
253
254 /* The following variable value is size of memory representing all
255    current and future reservations of the processor units.  */
256 static size_t dfa_state_size;
257
258 /* The following array is used to find the best insn from ready when
259    the automaton pipeline interface is used.  */
260 static char *ready_try;
261
262 /* Describe the ready list of the scheduler.
263    VEC holds space enough for all insns in the current region.  VECLEN
264    says how many exactly.
265    FIRST is the index of the element with the highest priority; i.e. the
266    last one in the ready list, since elements are ordered by ascending
267    priority.
268    N_READY determines how many insns are on the ready list.  */
269
270 struct ready_list
271 {
272   rtx *vec;
273   int veclen;
274   int first;
275   int n_ready;
276 };
277
278 static int may_trap_exp (rtx, int);
279
280 /* Nonzero iff the address is comprised from at most 1 register.  */
281 #define CONST_BASED_ADDRESS_P(x)                        \
282   (REG_P (x)                                    \
283    || ((GET_CODE (x) == PLUS || GET_CODE (x) == MINUS   \
284         || (GET_CODE (x) == LO_SUM))                    \
285        && (CONSTANT_P (XEXP (x, 0))                     \
286            || CONSTANT_P (XEXP (x, 1)))))
287
288 /* Returns a class that insn with GET_DEST(insn)=x may belong to,
289    as found by analyzing insn's expression.  */
290
291 static int
292 may_trap_exp (rtx x, int is_store)
293 {
294   enum rtx_code code;
295
296   if (x == 0)
297     return TRAP_FREE;
298   code = GET_CODE (x);
299   if (is_store)
300     {
301       if (code == MEM && may_trap_p (x))
302         return TRAP_RISKY;
303       else
304         return TRAP_FREE;
305     }
306   if (code == MEM)
307     {
308       /* The insn uses memory:  a volatile load.  */
309       if (MEM_VOLATILE_P (x))
310         return IRISKY;
311       /* An exception-free load.  */
312       if (!may_trap_p (x))
313         return IFREE;
314       /* A load with 1 base register, to be further checked.  */
315       if (CONST_BASED_ADDRESS_P (XEXP (x, 0)))
316         return PFREE_CANDIDATE;
317       /* No info on the load, to be further checked.  */
318       return PRISKY_CANDIDATE;
319     }
320   else
321     {
322       const char *fmt;
323       int i, insn_class = TRAP_FREE;
324
325       /* Neither store nor load, check if it may cause a trap.  */
326       if (may_trap_p (x))
327         return TRAP_RISKY;
328       /* Recursive step: walk the insn...  */
329       fmt = GET_RTX_FORMAT (code);
330       for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
331         {
332           if (fmt[i] == 'e')
333             {
334               int tmp_class = may_trap_exp (XEXP (x, i), is_store);
335               insn_class = WORST_CLASS (insn_class, tmp_class);
336             }
337           else if (fmt[i] == 'E')
338             {
339               int j;
340               for (j = 0; j < XVECLEN (x, i); j++)
341                 {
342                   int tmp_class = may_trap_exp (XVECEXP (x, i, j), is_store);
343                   insn_class = WORST_CLASS (insn_class, tmp_class);
344                   if (insn_class == TRAP_RISKY || insn_class == IRISKY)
345                     break;
346                 }
347             }
348           if (insn_class == TRAP_RISKY || insn_class == IRISKY)
349             break;
350         }
351       return insn_class;
352     }
353 }
354
355 /* Classifies insn for the purpose of verifying that it can be
356    moved speculatively, by examining it's patterns, returning:
357    TRAP_RISKY: store, or risky non-load insn (e.g. division by variable).
358    TRAP_FREE: non-load insn.
359    IFREE: load from a globally safe location.
360    IRISKY: volatile load.
361    PFREE_CANDIDATE, PRISKY_CANDIDATE: load that need to be checked for
362    being either PFREE or PRISKY.  */
363
364 int
365 haifa_classify_insn (rtx insn)
366 {
367   rtx pat = PATTERN (insn);
368   int tmp_class = TRAP_FREE;
369   int insn_class = TRAP_FREE;
370   enum rtx_code code;
371
372   if (GET_CODE (pat) == PARALLEL)
373     {
374       int i, len = XVECLEN (pat, 0);
375
376       for (i = len - 1; i >= 0; i--)
377         {
378           code = GET_CODE (XVECEXP (pat, 0, i));
379           switch (code)
380             {
381             case CLOBBER:
382               /* Test if it is a 'store'.  */
383               tmp_class = may_trap_exp (XEXP (XVECEXP (pat, 0, i), 0), 1);
384               break;
385             case SET:
386               /* Test if it is a store.  */
387               tmp_class = may_trap_exp (SET_DEST (XVECEXP (pat, 0, i)), 1);
388               if (tmp_class == TRAP_RISKY)
389                 break;
390               /* Test if it is a load.  */
391               tmp_class
392                 = WORST_CLASS (tmp_class,
393                                may_trap_exp (SET_SRC (XVECEXP (pat, 0, i)),
394                                              0));
395               break;
396             case COND_EXEC:
397             case TRAP_IF:
398               tmp_class = TRAP_RISKY;
399               break;
400             default:
401               ;
402             }
403           insn_class = WORST_CLASS (insn_class, tmp_class);
404           if (insn_class == TRAP_RISKY || insn_class == IRISKY)
405             break;
406         }
407     }
408   else
409     {
410       code = GET_CODE (pat);
411       switch (code)
412         {
413         case CLOBBER:
414           /* Test if it is a 'store'.  */
415           tmp_class = may_trap_exp (XEXP (pat, 0), 1);
416           break;
417         case SET:
418           /* Test if it is a store.  */
419           tmp_class = may_trap_exp (SET_DEST (pat), 1);
420           if (tmp_class == TRAP_RISKY)
421             break;
422           /* Test if it is a load.  */
423           tmp_class =
424             WORST_CLASS (tmp_class,
425                          may_trap_exp (SET_SRC (pat), 0));
426           break;
427         case COND_EXEC:
428         case TRAP_IF:
429           tmp_class = TRAP_RISKY;
430           break;
431         default:;
432         }
433       insn_class = tmp_class;
434     }
435
436   return insn_class;
437 }
438
439 /* Forward declarations.  */
440
441 static int priority (rtx);
442 static int rank_for_schedule (const void *, const void *);
443 static void swap_sort (rtx *, int);
444 static void queue_insn (rtx, int);
445 static int schedule_insn (rtx, struct ready_list *, int);
446 static int find_set_reg_weight (rtx);
447 static void find_insn_reg_weight (int);
448 static void adjust_priority (rtx);
449 static void advance_one_cycle (void);
450
451 /* Notes handling mechanism:
452    =========================
453    Generally, NOTES are saved before scheduling and restored after scheduling.
454    The scheduler distinguishes between three types of notes:
455
456    (1) LINE_NUMBER notes, generated and used for debugging.  Here,
457    before scheduling a region, a pointer to the LINE_NUMBER note is
458    added to the insn following it (in save_line_notes()), and the note
459    is removed (in rm_line_notes() and unlink_line_notes()).  After
460    scheduling the region, this pointer is used for regeneration of
461    the LINE_NUMBER note (in restore_line_notes()).
462
463    (2) LOOP_BEGIN, LOOP_END, SETJMP, EHREGION_BEG, EHREGION_END notes:
464    Before scheduling a region, a pointer to the note is added to the insn
465    that follows or precedes it.  (This happens as part of the data dependence
466    computation).  After scheduling an insn, the pointer contained in it is
467    used for regenerating the corresponding note (in reemit_notes).
468
469    (3) All other notes (e.g. INSN_DELETED):  Before scheduling a block,
470    these notes are put in a list (in rm_other_notes() and
471    unlink_other_notes ()).  After scheduling the block, these notes are
472    inserted at the beginning of the block (in schedule_block()).  */
473
474 static rtx unlink_other_notes (rtx, rtx);
475 static rtx unlink_line_notes (rtx, rtx);
476 static rtx reemit_notes (rtx, rtx);
477
478 static rtx *ready_lastpos (struct ready_list *);
479 static void ready_sort (struct ready_list *);
480 static rtx ready_remove_first (struct ready_list *);
481
482 static void queue_to_ready (struct ready_list *);
483 static int early_queue_to_ready (state_t, struct ready_list *);
484
485 static void debug_ready_list (struct ready_list *);
486
487 static rtx move_insn1 (rtx, rtx);
488 static rtx move_insn (rtx, rtx);
489
490 /* The following functions are used to implement multi-pass scheduling
491    on the first cycle.  */
492 static rtx ready_element (struct ready_list *, int);
493 static rtx ready_remove (struct ready_list *, int);
494 static int max_issue (struct ready_list *, int *);
495
496 static rtx choose_ready (struct ready_list *);
497
498 #endif /* INSN_SCHEDULING */
499 \f
500 /* Point to state used for the current scheduling pass.  */
501 struct sched_info *current_sched_info;
502 \f
503 #ifndef INSN_SCHEDULING
504 void
505 schedule_insns (FILE *dump_file ATTRIBUTE_UNUSED)
506 {
507 }
508 #else
509
510 /* Pointer to the last instruction scheduled.  Used by rank_for_schedule,
511    so that insns independent of the last scheduled insn will be preferred
512    over dependent instructions.  */
513
514 static rtx last_scheduled_insn;
515
516 /* Compute cost of executing INSN given the dependence LINK on the insn USED.
517    This is the number of cycles between instruction issue and
518    instruction results.  */
519
520 HAIFA_INLINE int
521 insn_cost (rtx insn, rtx link, rtx used)
522 {
523   int cost = INSN_COST (insn);
524
525   if (cost < 0)
526     {
527       /* A USE insn, or something else we don't need to
528          understand.  We can't pass these directly to
529          result_ready_cost or insn_default_latency because it will
530          trigger a fatal error for unrecognizable insns.  */
531       if (recog_memoized (insn) < 0)
532         {
533           INSN_COST (insn) = 0;
534           return 0;
535         }
536       else
537         {
538           cost = insn_default_latency (insn);
539           if (cost < 0)
540             cost = 0;
541
542           INSN_COST (insn) = cost;
543         }
544     }
545
546   /* In this case estimate cost without caring how insn is used.  */
547   if (link == 0 || used == 0)
548     return cost;
549
550   /* A USE insn should never require the value used to be computed.
551      This allows the computation of a function's result and parameter
552      values to overlap the return and call.  */
553   if (recog_memoized (used) < 0)
554     cost = 0;
555   else
556     {
557       if (INSN_CODE (insn) >= 0)
558         {
559           if (REG_NOTE_KIND (link) == REG_DEP_ANTI)
560             cost = 0;
561           else if (REG_NOTE_KIND (link) == REG_DEP_OUTPUT)
562             {
563               cost = (insn_default_latency (insn)
564                       - insn_default_latency (used));
565               if (cost <= 0)
566                 cost = 1;
567             }
568           else if (bypass_p (insn))
569             cost = insn_latency (insn, used);
570         }
571
572       if (targetm.sched.adjust_cost)
573         cost = targetm.sched.adjust_cost (used, link, insn, cost);
574
575       if (cost < 0)
576         cost = 0;
577     }
578
579   return cost;
580 }
581
582 /* Compute the priority number for INSN.  */
583
584 static int
585 priority (rtx insn)
586 {
587   rtx link;
588
589   if (! INSN_P (insn))
590     return 0;
591
592   if (! INSN_PRIORITY_KNOWN (insn))
593     {
594       int this_priority = 0;
595
596       if (INSN_DEPEND (insn) == 0)
597         this_priority = insn_cost (insn, 0, 0);
598       else
599         {
600           for (link = INSN_DEPEND (insn); link; link = XEXP (link, 1))
601             {
602               rtx next;
603               int next_priority;
604
605               next = XEXP (link, 0);
606
607               /* Critical path is meaningful in block boundaries only.  */
608               if (! (*current_sched_info->contributes_to_priority) (next, insn))
609                 continue;
610
611               next_priority = insn_cost (insn, link, next) + priority (next);
612               if (next_priority > this_priority)
613                 this_priority = next_priority;
614             }
615         }
616       INSN_PRIORITY (insn) = this_priority;
617       INSN_PRIORITY_KNOWN (insn) = 1;
618     }
619
620   return INSN_PRIORITY (insn);
621 }
622 \f
623 /* Macros and functions for keeping the priority queue sorted, and
624    dealing with queuing and dequeuing of instructions.  */
625
626 #define SCHED_SORT(READY, N_READY)                                   \
627 do { if ((N_READY) == 2)                                             \
628        swap_sort (READY, N_READY);                                   \
629      else if ((N_READY) > 2)                                         \
630          qsort (READY, N_READY, sizeof (rtx), rank_for_schedule); }  \
631 while (0)
632
633 /* Returns a positive value if x is preferred; returns a negative value if
634    y is preferred.  Should never return 0, since that will make the sort
635    unstable.  */
636
637 static int
638 rank_for_schedule (const void *x, const void *y)
639 {
640   rtx tmp = *(const rtx *) y;
641   rtx tmp2 = *(const rtx *) x;
642   rtx link;
643   int tmp_class, tmp2_class, depend_count1, depend_count2;
644   int val, priority_val, weight_val, info_val;
645
646   /* The insn in a schedule group should be issued the first.  */
647   if (SCHED_GROUP_P (tmp) != SCHED_GROUP_P (tmp2))
648     return SCHED_GROUP_P (tmp2) ? 1 : -1;
649
650   /* Prefer insn with higher priority.  */
651   priority_val = INSN_PRIORITY (tmp2) - INSN_PRIORITY (tmp);
652
653   if (priority_val)
654     return priority_val;
655
656   /* Prefer an insn with smaller contribution to registers-pressure.  */
657   if (!reload_completed &&
658       (weight_val = INSN_REG_WEIGHT (tmp) - INSN_REG_WEIGHT (tmp2)))
659     return weight_val;
660
661   info_val = (*current_sched_info->rank) (tmp, tmp2);
662   if (info_val)
663     return info_val;
664
665   /* Compare insns based on their relation to the last-scheduled-insn.  */
666   if (last_scheduled_insn)
667     {
668       /* Classify the instructions into three classes:
669          1) Data dependent on last schedule insn.
670          2) Anti/Output dependent on last scheduled insn.
671          3) Independent of last scheduled insn, or has latency of one.
672          Choose the insn from the highest numbered class if different.  */
673       link = find_insn_list (tmp, INSN_DEPEND (last_scheduled_insn));
674       if (link == 0 || insn_cost (last_scheduled_insn, link, tmp) == 1)
675         tmp_class = 3;
676       else if (REG_NOTE_KIND (link) == 0)       /* Data dependence.  */
677         tmp_class = 1;
678       else
679         tmp_class = 2;
680
681       link = find_insn_list (tmp2, INSN_DEPEND (last_scheduled_insn));
682       if (link == 0 || insn_cost (last_scheduled_insn, link, tmp2) == 1)
683         tmp2_class = 3;
684       else if (REG_NOTE_KIND (link) == 0)       /* Data dependence.  */
685         tmp2_class = 1;
686       else
687         tmp2_class = 2;
688
689       if ((val = tmp2_class - tmp_class))
690         return val;
691     }
692
693   /* Prefer the insn which has more later insns that depend on it.
694      This gives the scheduler more freedom when scheduling later
695      instructions at the expense of added register pressure.  */
696   depend_count1 = 0;
697   for (link = INSN_DEPEND (tmp); link; link = XEXP (link, 1))
698     depend_count1++;
699
700   depend_count2 = 0;
701   for (link = INSN_DEPEND (tmp2); link; link = XEXP (link, 1))
702     depend_count2++;
703
704   val = depend_count2 - depend_count1;
705   if (val)
706     return val;
707
708   /* If insns are equally good, sort by INSN_LUID (original insn order),
709      so that we make the sort stable.  This minimizes instruction movement,
710      thus minimizing sched's effect on debugging and cross-jumping.  */
711   return INSN_LUID (tmp) - INSN_LUID (tmp2);
712 }
713
714 /* Resort the array A in which only element at index N may be out of order.  */
715
716 HAIFA_INLINE static void
717 swap_sort (rtx *a, int n)
718 {
719   rtx insn = a[n - 1];
720   int i = n - 2;
721
722   while (i >= 0 && rank_for_schedule (a + i, &insn) >= 0)
723     {
724       a[i + 1] = a[i];
725       i -= 1;
726     }
727   a[i + 1] = insn;
728 }
729
730 /* Add INSN to the insn queue so that it can be executed at least
731    N_CYCLES after the currently executing insn.  Preserve insns
732    chain for debugging purposes.  */
733
734 HAIFA_INLINE static void
735 queue_insn (rtx insn, int n_cycles)
736 {
737   int next_q = NEXT_Q_AFTER (q_ptr, n_cycles);
738   rtx link = alloc_INSN_LIST (insn, insn_queue[next_q]);
739   insn_queue[next_q] = link;
740   q_size += 1;
741
742   if (sched_verbose >= 2)
743     {
744       fprintf (sched_dump, ";;\t\tReady-->Q: insn %s: ",
745                (*current_sched_info->print_insn) (insn, 0));
746
747       fprintf (sched_dump, "queued for %d cycles.\n", n_cycles);
748     }
749 }
750
751 /* Return a pointer to the bottom of the ready list, i.e. the insn
752    with the lowest priority.  */
753
754 HAIFA_INLINE static rtx *
755 ready_lastpos (struct ready_list *ready)
756 {
757   if (ready->n_ready == 0)
758     abort ();
759   return ready->vec + ready->first - ready->n_ready + 1;
760 }
761
762 /* Add an element INSN to the ready list so that it ends up with the lowest
763    priority.  */
764
765 HAIFA_INLINE void
766 ready_add (struct ready_list *ready, rtx insn)
767 {
768   if (ready->first == ready->n_ready)
769     {
770       memmove (ready->vec + ready->veclen - ready->n_ready,
771                ready_lastpos (ready),
772                ready->n_ready * sizeof (rtx));
773       ready->first = ready->veclen - 1;
774     }
775   ready->vec[ready->first - ready->n_ready] = insn;
776   ready->n_ready++;
777 }
778
779 /* Remove the element with the highest priority from the ready list and
780    return it.  */
781
782 HAIFA_INLINE static rtx
783 ready_remove_first (struct ready_list *ready)
784 {
785   rtx t;
786   if (ready->n_ready == 0)
787     abort ();
788   t = ready->vec[ready->first--];
789   ready->n_ready--;
790   /* If the queue becomes empty, reset it.  */
791   if (ready->n_ready == 0)
792     ready->first = ready->veclen - 1;
793   return t;
794 }
795
796 /* The following code implements multi-pass scheduling for the first
797    cycle.  In other words, we will try to choose ready insn which
798    permits to start maximum number of insns on the same cycle.  */
799
800 /* Return a pointer to the element INDEX from the ready.  INDEX for
801    insn with the highest priority is 0, and the lowest priority has
802    N_READY - 1.  */
803
804 HAIFA_INLINE static rtx
805 ready_element (struct ready_list *ready, int index)
806 {
807 #ifdef ENABLE_CHECKING
808   if (ready->n_ready == 0 || index >= ready->n_ready)
809     abort ();
810 #endif
811   return ready->vec[ready->first - index];
812 }
813
814 /* Remove the element INDEX from the ready list and return it.  INDEX
815    for insn with the highest priority is 0, and the lowest priority
816    has N_READY - 1.  */
817
818 HAIFA_INLINE static rtx
819 ready_remove (struct ready_list *ready, int index)
820 {
821   rtx t;
822   int i;
823
824   if (index == 0)
825     return ready_remove_first (ready);
826   if (ready->n_ready == 0 || index >= ready->n_ready)
827     abort ();
828   t = ready->vec[ready->first - index];
829   ready->n_ready--;
830   for (i = index; i < ready->n_ready; i++)
831     ready->vec[ready->first - i] = ready->vec[ready->first - i - 1];
832   return t;
833 }
834
835
836 /* Sort the ready list READY by ascending priority, using the SCHED_SORT
837    macro.  */
838
839 HAIFA_INLINE static void
840 ready_sort (struct ready_list *ready)
841 {
842   rtx *first = ready_lastpos (ready);
843   SCHED_SORT (first, ready->n_ready);
844 }
845
846 /* PREV is an insn that is ready to execute.  Adjust its priority if that
847    will help shorten or lengthen register lifetimes as appropriate.  Also
848    provide a hook for the target to tweek itself.  */
849
850 HAIFA_INLINE static void
851 adjust_priority (rtx prev)
852 {
853   /* ??? There used to be code here to try and estimate how an insn
854      affected register lifetimes, but it did it by looking at REG_DEAD
855      notes, which we removed in schedule_region.  Nor did it try to
856      take into account register pressure or anything useful like that.
857
858      Revisit when we have a machine model to work with and not before.  */
859
860   if (targetm.sched.adjust_priority)
861     INSN_PRIORITY (prev) =
862       targetm.sched.adjust_priority (prev, INSN_PRIORITY (prev));
863 }
864
865 /* Advance time on one cycle.  */
866 HAIFA_INLINE static void
867 advance_one_cycle (void)
868 {
869   if (targetm.sched.dfa_pre_cycle_insn)
870     state_transition (curr_state,
871                       targetm.sched.dfa_pre_cycle_insn ());
872
873   state_transition (curr_state, NULL);
874   
875   if (targetm.sched.dfa_post_cycle_insn)
876     state_transition (curr_state,
877                       targetm.sched.dfa_post_cycle_insn ());
878 }
879
880 /* Clock at which the previous instruction was issued.  */
881 static int last_clock_var;
882
883 /* INSN is the "currently executing insn".  Launch each insn which was
884    waiting on INSN.  READY is the ready list which contains the insns
885    that are ready to fire.  CLOCK is the current cycle.  The function
886    returns necessary cycle advance after issuing the insn (it is not
887    zero for insns in a schedule group).  */
888
889 static int
890 schedule_insn (rtx insn, struct ready_list *ready, int clock)
891 {
892   rtx link;
893   int advance = 0;
894   int premature_issue = 0;
895
896   if (sched_verbose >= 1)
897     {
898       char buf[2048];
899
900       print_insn (buf, insn, 0);
901       buf[40] = 0;
902       fprintf (sched_dump, ";;\t%3i--> %-40s:", clock, buf);
903
904       if (recog_memoized (insn) < 0)
905         fprintf (sched_dump, "nothing");
906       else
907         print_reservation (sched_dump, insn);
908       fputc ('\n', sched_dump);
909     }
910
911   if (INSN_TICK (insn) > clock)
912     {
913       /* 'insn' has been prematurely moved from the queue to the
914          ready list.  */
915       premature_issue = INSN_TICK (insn) - clock;
916     }
917
918   for (link = INSN_DEPEND (insn); link != 0; link = XEXP (link, 1))
919     {
920       rtx next = XEXP (link, 0);
921       int cost = insn_cost (insn, link, next);
922
923       INSN_TICK (next) = MAX (INSN_TICK (next), clock + cost + premature_issue);
924
925       if ((INSN_DEP_COUNT (next) -= 1) == 0)
926         {
927           int effective_cost = INSN_TICK (next) - clock;
928
929           if (! (*current_sched_info->new_ready) (next))
930             continue;
931
932           if (sched_verbose >= 2)
933             {
934               fprintf (sched_dump, ";;\t\tdependences resolved: insn %s ",
935                        (*current_sched_info->print_insn) (next, 0));
936
937               if (effective_cost < 1)
938                 fprintf (sched_dump, "into ready\n");
939               else
940                 fprintf (sched_dump, "into queue with cost=%d\n",
941                          effective_cost);
942             }
943
944           /* Adjust the priority of NEXT and either put it on the ready
945              list or queue it.  */
946           adjust_priority (next);
947           if (effective_cost < 1)
948             ready_add (ready, next);
949           else
950             {
951               queue_insn (next, effective_cost);
952
953               if (SCHED_GROUP_P (next) && advance < effective_cost)
954                 advance = effective_cost;
955             }
956         }
957     }
958
959   /* Annotate the instruction with issue information -- TImode
960      indicates that the instruction is expected not to be able
961      to issue on the same cycle as the previous insn.  A machine
962      may use this information to decide how the instruction should
963      be aligned.  */
964   if (issue_rate > 1
965       && GET_CODE (PATTERN (insn)) != USE
966       && GET_CODE (PATTERN (insn)) != CLOBBER)
967     {
968       if (reload_completed)
969         PUT_MODE (insn, clock > last_clock_var ? TImode : VOIDmode);
970       last_clock_var = clock;
971     }
972   return advance;
973 }
974
975 /* Functions for handling of notes.  */
976
977 /* Delete notes beginning with INSN and put them in the chain
978    of notes ended by NOTE_LIST.
979    Returns the insn following the notes.  */
980
981 static rtx
982 unlink_other_notes (rtx insn, rtx tail)
983 {
984   rtx prev = PREV_INSN (insn);
985
986   while (insn != tail && NOTE_P (insn))
987     {
988       rtx next = NEXT_INSN (insn);
989       /* Delete the note from its current position.  */
990       if (prev)
991         NEXT_INSN (prev) = next;
992       if (next)
993         PREV_INSN (next) = prev;
994
995       /* See sched_analyze to see how these are handled.  */
996       if (NOTE_LINE_NUMBER (insn) != NOTE_INSN_LOOP_BEG
997           && NOTE_LINE_NUMBER (insn) != NOTE_INSN_LOOP_END
998           && NOTE_LINE_NUMBER (insn) != NOTE_INSN_BASIC_BLOCK
999           && NOTE_LINE_NUMBER (insn) != NOTE_INSN_EH_REGION_BEG
1000           && NOTE_LINE_NUMBER (insn) != NOTE_INSN_EH_REGION_END)
1001         {
1002           /* Insert the note at the end of the notes list.  */
1003           PREV_INSN (insn) = note_list;
1004           if (note_list)
1005             NEXT_INSN (note_list) = insn;
1006           note_list = insn;
1007         }
1008
1009       insn = next;
1010     }
1011   return insn;
1012 }
1013
1014 /* Delete line notes beginning with INSN. Record line-number notes so
1015    they can be reused.  Returns the insn following the notes.  */
1016
1017 static rtx
1018 unlink_line_notes (rtx insn, rtx tail)
1019 {
1020   rtx prev = PREV_INSN (insn);
1021
1022   while (insn != tail && NOTE_P (insn))
1023     {
1024       rtx next = NEXT_INSN (insn);
1025
1026       if (write_symbols != NO_DEBUG && NOTE_LINE_NUMBER (insn) > 0)
1027         {
1028           /* Delete the note from its current position.  */
1029           if (prev)
1030             NEXT_INSN (prev) = next;
1031           if (next)
1032             PREV_INSN (next) = prev;
1033
1034           /* Record line-number notes so they can be reused.  */
1035           LINE_NOTE (insn) = insn;
1036         }
1037       else
1038         prev = insn;
1039
1040       insn = next;
1041     }
1042   return insn;
1043 }
1044
1045 /* Return the head and tail pointers of BB.  */
1046
1047 void
1048 get_block_head_tail (int b, rtx *headp, rtx *tailp)
1049 {
1050   /* HEAD and TAIL delimit the basic block being scheduled.  */
1051   rtx head = BB_HEAD (BASIC_BLOCK (b));
1052   rtx tail = BB_END (BASIC_BLOCK (b));
1053
1054   /* Don't include any notes or labels at the beginning of the
1055      basic block, or notes at the ends of basic blocks.  */
1056   while (head != tail)
1057     {
1058       if (NOTE_P (head))
1059         head = NEXT_INSN (head);
1060       else if (NOTE_P (tail))
1061         tail = PREV_INSN (tail);
1062       else if (LABEL_P (head))
1063         head = NEXT_INSN (head);
1064       else
1065         break;
1066     }
1067
1068   *headp = head;
1069   *tailp = tail;
1070 }
1071
1072 /* Return nonzero if there are no real insns in the range [ HEAD, TAIL ].  */
1073
1074 int
1075 no_real_insns_p (rtx head, rtx tail)
1076 {
1077   while (head != NEXT_INSN (tail))
1078     {
1079       if (!NOTE_P (head) && !LABEL_P (head))
1080         return 0;
1081       head = NEXT_INSN (head);
1082     }
1083   return 1;
1084 }
1085
1086 /* Delete line notes from one block. Save them so they can be later restored
1087    (in restore_line_notes).  HEAD and TAIL are the boundaries of the
1088    block in which notes should be processed.  */
1089
1090 void
1091 rm_line_notes (rtx head, rtx tail)
1092 {
1093   rtx next_tail;
1094   rtx insn;
1095
1096   next_tail = NEXT_INSN (tail);
1097   for (insn = head; insn != next_tail; insn = NEXT_INSN (insn))
1098     {
1099       rtx prev;
1100
1101       /* Farm out notes, and maybe save them in NOTE_LIST.
1102          This is needed to keep the debugger from
1103          getting completely deranged.  */
1104       if (NOTE_P (insn))
1105         {
1106           prev = insn;
1107           insn = unlink_line_notes (insn, next_tail);
1108
1109           if (prev == tail)
1110             abort ();
1111           if (prev == head)
1112             abort ();
1113           if (insn == next_tail)
1114             abort ();
1115         }
1116     }
1117 }
1118
1119 /* Save line number notes for each insn in block B.  HEAD and TAIL are
1120    the boundaries of the block in which notes should be processed.  */
1121
1122 void
1123 save_line_notes (int b, rtx head, rtx tail)
1124 {
1125   rtx next_tail;
1126
1127   /* We must use the true line number for the first insn in the block
1128      that was computed and saved at the start of this pass.  We can't
1129      use the current line number, because scheduling of the previous
1130      block may have changed the current line number.  */
1131
1132   rtx line = line_note_head[b];
1133   rtx insn;
1134
1135   next_tail = NEXT_INSN (tail);
1136
1137   for (insn = head; insn != next_tail; insn = NEXT_INSN (insn))
1138     if (NOTE_P (insn) && NOTE_LINE_NUMBER (insn) > 0)
1139       line = insn;
1140     else
1141       LINE_NOTE (insn) = line;
1142 }
1143
1144 /* After a block was scheduled, insert line notes into the insns list.
1145    HEAD and TAIL are the boundaries of the block in which notes should
1146    be processed.  */
1147
1148 void
1149 restore_line_notes (rtx head, rtx tail)
1150 {
1151   rtx line, note, prev, new;
1152   int added_notes = 0;
1153   rtx next_tail, insn;
1154
1155   head = head;
1156   next_tail = NEXT_INSN (tail);
1157
1158   /* Determine the current line-number.  We want to know the current
1159      line number of the first insn of the block here, in case it is
1160      different from the true line number that was saved earlier.  If
1161      different, then we need a line number note before the first insn
1162      of this block.  If it happens to be the same, then we don't want to
1163      emit another line number note here.  */
1164   for (line = head; line; line = PREV_INSN (line))
1165     if (NOTE_P (line) && NOTE_LINE_NUMBER (line) > 0)
1166       break;
1167
1168   /* Walk the insns keeping track of the current line-number and inserting
1169      the line-number notes as needed.  */
1170   for (insn = head; insn != next_tail; insn = NEXT_INSN (insn))
1171     if (NOTE_P (insn) && NOTE_LINE_NUMBER (insn) > 0)
1172       line = insn;
1173   /* This used to emit line number notes before every non-deleted note.
1174      However, this confuses a debugger, because line notes not separated
1175      by real instructions all end up at the same address.  I can find no
1176      use for line number notes before other notes, so none are emitted.  */
1177     else if (!NOTE_P (insn)
1178              && INSN_UID (insn) < old_max_uid
1179              && (note = LINE_NOTE (insn)) != 0
1180              && note != line
1181              && (line == 0
1182 #ifdef USE_MAPPED_LOCATION
1183                  || NOTE_SOURCE_LOCATION (note) != NOTE_SOURCE_LOCATION (line)
1184 #else
1185                  || NOTE_LINE_NUMBER (note) != NOTE_LINE_NUMBER (line)
1186                  || NOTE_SOURCE_FILE (note) != NOTE_SOURCE_FILE (line)
1187 #endif
1188                  ))
1189       {
1190         line = note;
1191         prev = PREV_INSN (insn);
1192         if (LINE_NOTE (note))
1193           {
1194             /* Re-use the original line-number note.  */
1195             LINE_NOTE (note) = 0;
1196             PREV_INSN (note) = prev;
1197             NEXT_INSN (prev) = note;
1198             PREV_INSN (insn) = note;
1199             NEXT_INSN (note) = insn;
1200           }
1201         else
1202           {
1203             added_notes++;
1204             new = emit_note_after (NOTE_LINE_NUMBER (note), prev);
1205 #ifndef USE_MAPPED_LOCATION
1206             NOTE_SOURCE_FILE (new) = NOTE_SOURCE_FILE (note);
1207 #endif
1208           }
1209       }
1210   if (sched_verbose && added_notes)
1211     fprintf (sched_dump, ";; added %d line-number notes\n", added_notes);
1212 }
1213
1214 /* After scheduling the function, delete redundant line notes from the
1215    insns list.  */
1216
1217 void
1218 rm_redundant_line_notes (void)
1219 {
1220   rtx line = 0;
1221   rtx insn = get_insns ();
1222   int active_insn = 0;
1223   int notes = 0;
1224
1225   /* Walk the insns deleting redundant line-number notes.  Many of these
1226      are already present.  The remainder tend to occur at basic
1227      block boundaries.  */
1228   for (insn = get_last_insn (); insn; insn = PREV_INSN (insn))
1229     if (NOTE_P (insn) && NOTE_LINE_NUMBER (insn) > 0)
1230       {
1231         /* If there are no active insns following, INSN is redundant.  */
1232         if (active_insn == 0)
1233           {
1234             notes++;
1235             SET_INSN_DELETED (insn);
1236           }
1237         /* If the line number is unchanged, LINE is redundant.  */
1238         else if (line
1239 #ifdef USE_MAPPED_LOCATION
1240                  && NOTE_SOURCE_LOCATION (line) == NOTE_SOURCE_LOCATION (insn)
1241 #else
1242                  && NOTE_LINE_NUMBER (line) == NOTE_LINE_NUMBER (insn)
1243                  && NOTE_SOURCE_FILE (line) == NOTE_SOURCE_FILE (insn)
1244 #endif
1245 )
1246           {
1247             notes++;
1248             SET_INSN_DELETED (line);
1249             line = insn;
1250           }
1251         else
1252           line = insn;
1253         active_insn = 0;
1254       }
1255     else if (!((NOTE_P (insn)
1256                 && NOTE_LINE_NUMBER (insn) == NOTE_INSN_DELETED)
1257                || (NONJUMP_INSN_P (insn)
1258                    && (GET_CODE (PATTERN (insn)) == USE
1259                        || GET_CODE (PATTERN (insn)) == CLOBBER))))
1260       active_insn++;
1261
1262   if (sched_verbose && notes)
1263     fprintf (sched_dump, ";; deleted %d line-number notes\n", notes);
1264 }
1265
1266 /* Delete notes between HEAD and TAIL and put them in the chain
1267    of notes ended by NOTE_LIST.  */
1268
1269 void
1270 rm_other_notes (rtx head, rtx tail)
1271 {
1272   rtx next_tail;
1273   rtx insn;
1274
1275   note_list = 0;
1276   if (head == tail && (! INSN_P (head)))
1277     return;
1278
1279   next_tail = NEXT_INSN (tail);
1280   for (insn = head; insn != next_tail; insn = NEXT_INSN (insn))
1281     {
1282       rtx prev;
1283
1284       /* Farm out notes, and maybe save them in NOTE_LIST.
1285          This is needed to keep the debugger from
1286          getting completely deranged.  */
1287       if (NOTE_P (insn))
1288         {
1289           prev = insn;
1290
1291           insn = unlink_other_notes (insn, next_tail);
1292
1293           if (prev == tail)
1294             abort ();
1295           if (prev == head)
1296             abort ();
1297           if (insn == next_tail)
1298             abort ();
1299         }
1300     }
1301 }
1302
1303 /* Functions for computation of registers live/usage info.  */
1304
1305 /* This function looks for a new register being defined.
1306    If the destination register is already used by the source,
1307    a new register is not needed.  */
1308
1309 static int
1310 find_set_reg_weight (rtx x)
1311 {
1312   if (GET_CODE (x) == CLOBBER
1313       && register_operand (SET_DEST (x), VOIDmode))
1314     return 1;
1315   if (GET_CODE (x) == SET
1316       && register_operand (SET_DEST (x), VOIDmode))
1317     {
1318       if (REG_P (SET_DEST (x)))
1319         {
1320           if (!reg_mentioned_p (SET_DEST (x), SET_SRC (x)))
1321             return 1;
1322           else
1323             return 0;
1324         }
1325       return 1;
1326     }
1327   return 0;
1328 }
1329
1330 /* Calculate INSN_REG_WEIGHT for all insns of a block.  */
1331
1332 static void
1333 find_insn_reg_weight (int b)
1334 {
1335   rtx insn, next_tail, head, tail;
1336
1337   get_block_head_tail (b, &head, &tail);
1338   next_tail = NEXT_INSN (tail);
1339
1340   for (insn = head; insn != next_tail; insn = NEXT_INSN (insn))
1341     {
1342       int reg_weight = 0;
1343       rtx x;
1344
1345       /* Handle register life information.  */
1346       if (! INSN_P (insn))
1347         continue;
1348
1349       /* Increment weight for each register born here.  */
1350       x = PATTERN (insn);
1351       reg_weight += find_set_reg_weight (x);
1352       if (GET_CODE (x) == PARALLEL)
1353         {
1354           int j;
1355           for (j = XVECLEN (x, 0) - 1; j >= 0; j--)
1356             {
1357               x = XVECEXP (PATTERN (insn), 0, j);
1358               reg_weight += find_set_reg_weight (x);
1359             }
1360         }
1361       /* Decrement weight for each register that dies here.  */
1362       for (x = REG_NOTES (insn); x; x = XEXP (x, 1))
1363         {
1364           if (REG_NOTE_KIND (x) == REG_DEAD
1365               || REG_NOTE_KIND (x) == REG_UNUSED)
1366             reg_weight--;
1367         }
1368
1369       INSN_REG_WEIGHT (insn) = reg_weight;
1370     }
1371 }
1372
1373 /* Scheduling clock, modified in schedule_block() and queue_to_ready ().  */
1374 static int clock_var;
1375
1376 /* Move insns that became ready to fire from queue to ready list.  */
1377
1378 static void
1379 queue_to_ready (struct ready_list *ready)
1380 {
1381   rtx insn;
1382   rtx link;
1383
1384   q_ptr = NEXT_Q (q_ptr);
1385
1386   /* Add all pending insns that can be scheduled without stalls to the
1387      ready list.  */
1388   for (link = insn_queue[q_ptr]; link; link = XEXP (link, 1))
1389     {
1390       insn = XEXP (link, 0);
1391       q_size -= 1;
1392
1393       if (sched_verbose >= 2)
1394         fprintf (sched_dump, ";;\t\tQ-->Ready: insn %s: ",
1395                  (*current_sched_info->print_insn) (insn, 0));
1396
1397       ready_add (ready, insn);
1398       if (sched_verbose >= 2)
1399         fprintf (sched_dump, "moving to ready without stalls\n");
1400     }
1401   insn_queue[q_ptr] = 0;
1402
1403   /* If there are no ready insns, stall until one is ready and add all
1404      of the pending insns at that point to the ready list.  */
1405   if (ready->n_ready == 0)
1406     {
1407       int stalls;
1408
1409       for (stalls = 1; stalls <= max_insn_queue_index; stalls++)
1410         {
1411           if ((link = insn_queue[NEXT_Q_AFTER (q_ptr, stalls)]))
1412             {
1413               for (; link; link = XEXP (link, 1))
1414                 {
1415                   insn = XEXP (link, 0);
1416                   q_size -= 1;
1417
1418                   if (sched_verbose >= 2)
1419                     fprintf (sched_dump, ";;\t\tQ-->Ready: insn %s: ",
1420                              (*current_sched_info->print_insn) (insn, 0));
1421
1422                   ready_add (ready, insn);
1423                   if (sched_verbose >= 2)
1424                     fprintf (sched_dump, "moving to ready with %d stalls\n", stalls);
1425                 }
1426               insn_queue[NEXT_Q_AFTER (q_ptr, stalls)] = 0;
1427
1428               advance_one_cycle ();
1429
1430               break;
1431             }
1432
1433           advance_one_cycle ();
1434         }
1435
1436       q_ptr = NEXT_Q_AFTER (q_ptr, stalls);
1437       clock_var += stalls;
1438     }
1439 }
1440
1441 /* Used by early_queue_to_ready.  Determines whether it is "ok" to
1442    prematurely move INSN from the queue to the ready list.  Currently, 
1443    if a target defines the hook 'is_costly_dependence', this function 
1444    uses the hook to check whether there exist any dependences which are
1445    considered costly by the target, between INSN and other insns that 
1446    have already been scheduled.  Dependences are checked up to Y cycles
1447    back, with default Y=1; The flag -fsched-stalled-insns-dep=Y allows
1448    controlling this value. 
1449    (Other considerations could be taken into account instead (or in 
1450    addition) depending on user flags and target hooks.  */
1451
1452 static bool 
1453 ok_for_early_queue_removal (rtx insn)
1454 {
1455   int n_cycles;
1456   rtx prev_insn = last_scheduled_insn;
1457
1458   if (targetm.sched.is_costly_dependence)
1459     {
1460       for (n_cycles = flag_sched_stalled_insns_dep; n_cycles; n_cycles--)
1461         {
1462           for ( ; prev_insn; prev_insn = PREV_INSN (prev_insn))
1463             {
1464               rtx dep_link = 0;
1465               int dep_cost;
1466
1467               if (!NOTE_P (prev_insn))
1468                 {
1469                   dep_link = find_insn_list (insn, INSN_DEPEND (prev_insn));
1470                   if (dep_link)
1471                     {
1472                       dep_cost = insn_cost (prev_insn, dep_link, insn) ;
1473                       if (targetm.sched.is_costly_dependence (prev_insn, insn, 
1474                                 dep_link, dep_cost, 
1475                                 flag_sched_stalled_insns_dep - n_cycles))
1476                         return false;
1477                     }
1478                 }
1479
1480               if (GET_MODE (prev_insn) == TImode) /* end of dispatch group */
1481                 break;
1482             }
1483
1484           if (!prev_insn) 
1485             break;
1486           prev_insn = PREV_INSN (prev_insn);     
1487         }
1488     }
1489
1490   return true;
1491 }
1492
1493
1494 /* Remove insns from the queue, before they become "ready" with respect
1495    to FU latency considerations.  */
1496
1497 static int 
1498 early_queue_to_ready (state_t state, struct ready_list *ready)
1499 {
1500   rtx insn;
1501   rtx link;
1502   rtx next_link;
1503   rtx prev_link;
1504   bool move_to_ready;
1505   int cost;
1506   state_t temp_state = alloca (dfa_state_size);
1507   int stalls;
1508   int insns_removed = 0;
1509
1510   /*
1511      Flag '-fsched-stalled-insns=X' determines the aggressiveness of this 
1512      function: 
1513
1514      X == 0: There is no limit on how many queued insns can be removed          
1515              prematurely.  (flag_sched_stalled_insns = -1).
1516
1517      X >= 1: Only X queued insns can be removed prematurely in each 
1518              invocation.  (flag_sched_stalled_insns = X).
1519
1520      Otherwise: Early queue removal is disabled.
1521          (flag_sched_stalled_insns = 0)
1522   */
1523
1524   if (! flag_sched_stalled_insns)   
1525     return 0;
1526
1527   for (stalls = 0; stalls <= max_insn_queue_index; stalls++)
1528     {
1529       if ((link = insn_queue[NEXT_Q_AFTER (q_ptr, stalls)]))
1530         {
1531           if (sched_verbose > 6)
1532             fprintf (sched_dump, ";; look at index %d + %d\n", q_ptr, stalls);
1533
1534           prev_link = 0;
1535           while (link)
1536             {
1537               next_link = XEXP (link, 1);
1538               insn = XEXP (link, 0);
1539               if (insn && sched_verbose > 6)
1540                 print_rtl_single (sched_dump, insn);
1541
1542               memcpy (temp_state, state, dfa_state_size);
1543               if (recog_memoized (insn) < 0) 
1544                 /* non-negative to indicate that it's not ready
1545                    to avoid infinite Q->R->Q->R... */
1546                 cost = 0;
1547               else
1548                 cost = state_transition (temp_state, insn);
1549
1550               if (sched_verbose >= 6)
1551                 fprintf (sched_dump, "transition cost = %d\n", cost);
1552
1553               move_to_ready = false;
1554               if (cost < 0) 
1555                 {
1556                   move_to_ready = ok_for_early_queue_removal (insn);
1557                   if (move_to_ready == true)
1558                     {
1559                       /* move from Q to R */
1560                       q_size -= 1;
1561                       ready_add (ready, insn);
1562
1563                       if (prev_link)   
1564                         XEXP (prev_link, 1) = next_link;
1565                       else
1566                         insn_queue[NEXT_Q_AFTER (q_ptr, stalls)] = next_link;
1567
1568                       free_INSN_LIST_node (link);
1569
1570                       if (sched_verbose >= 2)
1571                         fprintf (sched_dump, ";;\t\tEarly Q-->Ready: insn %s\n",
1572                                  (*current_sched_info->print_insn) (insn, 0));
1573
1574                       insns_removed++;
1575                       if (insns_removed == flag_sched_stalled_insns)
1576                         /* Remove only one insn from Q at a time.  */
1577                         return insns_removed;
1578                     }
1579                 }
1580
1581               if (move_to_ready == false)
1582                 prev_link = link;
1583
1584               link = next_link;
1585             } /* while link */
1586         } /* if link */    
1587
1588     } /* for stalls.. */
1589
1590   return insns_removed; 
1591 }
1592
1593
1594 /* Print the ready list for debugging purposes.  Callable from debugger.  */
1595
1596 static void
1597 debug_ready_list (struct ready_list *ready)
1598 {
1599   rtx *p;
1600   int i;
1601
1602   if (ready->n_ready == 0)
1603     {
1604       fprintf (sched_dump, "\n");
1605       return;
1606     }
1607
1608   p = ready_lastpos (ready);
1609   for (i = 0; i < ready->n_ready; i++)
1610     fprintf (sched_dump, "  %s", (*current_sched_info->print_insn) (p[i], 0));
1611   fprintf (sched_dump, "\n");
1612 }
1613
1614 /* move_insn1: Remove INSN from insn chain, and link it after LAST insn.  */
1615
1616 static rtx
1617 move_insn1 (rtx insn, rtx last)
1618 {
1619   NEXT_INSN (PREV_INSN (insn)) = NEXT_INSN (insn);
1620   PREV_INSN (NEXT_INSN (insn)) = PREV_INSN (insn);
1621
1622   NEXT_INSN (insn) = NEXT_INSN (last);
1623   PREV_INSN (NEXT_INSN (last)) = insn;
1624
1625   NEXT_INSN (last) = insn;
1626   PREV_INSN (insn) = last;
1627
1628   return insn;
1629 }
1630
1631 /* Search INSN for REG_SAVE_NOTE note pairs for
1632    NOTE_INSN_{LOOP,EHREGION}_{BEG,END}; and convert them back into
1633    NOTEs.  The REG_SAVE_NOTE note following first one is contains the
1634    saved value for NOTE_BLOCK_NUMBER which is useful for
1635    NOTE_INSN_EH_REGION_{BEG,END} NOTEs.  LAST is the last instruction
1636    output by the instruction scheduler.  Return the new value of LAST.  */
1637
1638 static rtx
1639 reemit_notes (rtx insn, rtx last)
1640 {
1641   rtx note, retval;
1642
1643   retval = last;
1644   for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
1645     {
1646       if (REG_NOTE_KIND (note) == REG_SAVE_NOTE)
1647         {
1648           enum insn_note note_type = INTVAL (XEXP (note, 0));
1649
1650           last = emit_note_before (note_type, last);
1651           remove_note (insn, note);
1652           note = XEXP (note, 1);
1653           if (note_type == NOTE_INSN_EH_REGION_BEG
1654               || note_type == NOTE_INSN_EH_REGION_END)
1655             NOTE_EH_HANDLER (last) = INTVAL (XEXP (note, 0));
1656           remove_note (insn, note);
1657         }
1658     }
1659   return retval;
1660 }
1661
1662 /* Move INSN.  Reemit notes if needed.
1663
1664    Return the last insn emitted by the scheduler, which is the
1665    return value from the first call to reemit_notes.  */
1666
1667 static rtx
1668 move_insn (rtx insn, rtx last)
1669 {
1670   rtx retval = NULL;
1671
1672   move_insn1 (insn, last);
1673
1674   /* If this is the first call to reemit_notes, then record
1675      its return value.  */
1676   if (retval == NULL_RTX)
1677     retval = reemit_notes (insn, insn);
1678   else
1679     reemit_notes (insn, insn);
1680
1681   SCHED_GROUP_P (insn) = 0;
1682
1683   return retval;
1684 }
1685
1686 /* The following structure describe an entry of the stack of choices.  */
1687 struct choice_entry
1688 {
1689   /* Ordinal number of the issued insn in the ready queue.  */
1690   int index;
1691   /* The number of the rest insns whose issues we should try.  */
1692   int rest;
1693   /* The number of issued essential insns.  */
1694   int n;
1695   /* State after issuing the insn.  */
1696   state_t state;
1697 };
1698
1699 /* The following array is used to implement a stack of choices used in
1700    function max_issue.  */
1701 static struct choice_entry *choice_stack;
1702
1703 /* The following variable value is number of essential insns issued on
1704    the current cycle.  An insn is essential one if it changes the
1705    processors state.  */
1706 static int cycle_issued_insns;
1707
1708 /* The following variable value is maximal number of tries of issuing
1709    insns for the first cycle multipass insn scheduling.  We define
1710    this value as constant*(DFA_LOOKAHEAD**ISSUE_RATE).  We would not
1711    need this constraint if all real insns (with non-negative codes)
1712    had reservations because in this case the algorithm complexity is
1713    O(DFA_LOOKAHEAD**ISSUE_RATE).  Unfortunately, the dfa descriptions
1714    might be incomplete and such insn might occur.  For such
1715    descriptions, the complexity of algorithm (without the constraint)
1716    could achieve DFA_LOOKAHEAD ** N , where N is the queue length.  */
1717 static int max_lookahead_tries;
1718
1719 /* The following value is value of hook
1720    `first_cycle_multipass_dfa_lookahead' at the last call of
1721    `max_issue'.  */
1722 static int cached_first_cycle_multipass_dfa_lookahead = 0;
1723
1724 /* The following value is value of `issue_rate' at the last call of
1725    `sched_init'.  */
1726 static int cached_issue_rate = 0;
1727
1728 /* The following function returns maximal (or close to maximal) number
1729    of insns which can be issued on the same cycle and one of which
1730    insns is insns with the best rank (the first insn in READY).  To
1731    make this function tries different samples of ready insns.  READY
1732    is current queue `ready'.  Global array READY_TRY reflects what
1733    insns are already issued in this try.  INDEX will contain index
1734    of the best insn in READY.  The following function is used only for
1735    first cycle multipass scheduling.  */
1736 static int
1737 max_issue (struct ready_list *ready, int *index)
1738 {
1739   int n, i, all, n_ready, best, delay, tries_num;
1740   struct choice_entry *top;
1741   rtx insn;
1742
1743   best = 0;
1744   memcpy (choice_stack->state, curr_state, dfa_state_size);
1745   top = choice_stack;
1746   top->rest = cached_first_cycle_multipass_dfa_lookahead;
1747   top->n = 0;
1748   n_ready = ready->n_ready;
1749   for (all = i = 0; i < n_ready; i++)
1750     if (!ready_try [i])
1751       all++;
1752   i = 0;
1753   tries_num = 0;
1754   for (;;)
1755     {
1756       if (top->rest == 0 || i >= n_ready)
1757         {
1758           if (top == choice_stack)
1759             break;
1760           if (best < top - choice_stack && ready_try [0])
1761             {
1762               best = top - choice_stack;
1763               *index = choice_stack [1].index;
1764               if (top->n == issue_rate - cycle_issued_insns || best == all)
1765                 break;
1766             }
1767           i = top->index;
1768           ready_try [i] = 0;
1769           top--;
1770           memcpy (curr_state, top->state, dfa_state_size);
1771         }
1772       else if (!ready_try [i])
1773         {
1774           tries_num++;
1775           if (tries_num > max_lookahead_tries)
1776             break;
1777           insn = ready_element (ready, i);
1778           delay = state_transition (curr_state, insn);
1779           if (delay < 0)
1780             {
1781               if (state_dead_lock_p (curr_state))
1782                 top->rest = 0;
1783               else
1784                 top->rest--;
1785               n = top->n;
1786               if (memcmp (top->state, curr_state, dfa_state_size) != 0)
1787                 n++;
1788               top++;
1789               top->rest = cached_first_cycle_multipass_dfa_lookahead;
1790               top->index = i;
1791               top->n = n;
1792               memcpy (top->state, curr_state, dfa_state_size);
1793               ready_try [i] = 1;
1794               i = -1;
1795             }
1796         }
1797       i++;
1798     }
1799   while (top != choice_stack)
1800     {
1801       ready_try [top->index] = 0;
1802       top--;
1803     }
1804   memcpy (curr_state, choice_stack->state, dfa_state_size);
1805   return best;
1806 }
1807
1808 /* The following function chooses insn from READY and modifies
1809    *N_READY and READY.  The following function is used only for first
1810    cycle multipass scheduling.  */
1811
1812 static rtx
1813 choose_ready (struct ready_list *ready)
1814 {
1815   int lookahead = 0;
1816
1817   if (targetm.sched.first_cycle_multipass_dfa_lookahead)
1818     lookahead = targetm.sched.first_cycle_multipass_dfa_lookahead ();
1819   if (lookahead <= 0 || SCHED_GROUP_P (ready_element (ready, 0)))
1820     return ready_remove_first (ready);
1821   else
1822     {
1823       /* Try to choose the better insn.  */
1824       int index = 0, i;
1825       rtx insn;
1826
1827       if (cached_first_cycle_multipass_dfa_lookahead != lookahead)
1828         {
1829           cached_first_cycle_multipass_dfa_lookahead = lookahead;
1830           max_lookahead_tries = 100;
1831           for (i = 0; i < issue_rate; i++)
1832             max_lookahead_tries *= lookahead;
1833         }
1834       insn = ready_element (ready, 0);
1835       if (INSN_CODE (insn) < 0)
1836         return ready_remove_first (ready);
1837       for (i = 1; i < ready->n_ready; i++)
1838         {
1839           insn = ready_element (ready, i);
1840           ready_try [i]
1841             = (INSN_CODE (insn) < 0
1842                || (targetm.sched.first_cycle_multipass_dfa_lookahead_guard
1843                    && !targetm.sched.first_cycle_multipass_dfa_lookahead_guard (insn)));
1844         }
1845       if (max_issue (ready, &index) == 0)
1846         return ready_remove_first (ready);
1847       else
1848         return ready_remove (ready, index);
1849     }
1850 }
1851
1852 /* Use forward list scheduling to rearrange insns of block B in region RGN,
1853    possibly bringing insns from subsequent blocks in the same region.  */
1854
1855 void
1856 schedule_block (int b, int rgn_n_insns)
1857 {
1858   struct ready_list ready;
1859   int i, first_cycle_insn_p;
1860   int can_issue_more;
1861   state_t temp_state = NULL;  /* It is used for multipass scheduling.  */
1862   int sort_p, advance, start_clock_var;
1863
1864   /* Head/tail info for this block.  */
1865   rtx prev_head = current_sched_info->prev_head;
1866   rtx next_tail = current_sched_info->next_tail;
1867   rtx head = NEXT_INSN (prev_head);
1868   rtx tail = PREV_INSN (next_tail);
1869
1870   /* We used to have code to avoid getting parameters moved from hard
1871      argument registers into pseudos.
1872
1873      However, it was removed when it proved to be of marginal benefit
1874      and caused problems because schedule_block and compute_forward_dependences
1875      had different notions of what the "head" insn was.  */
1876
1877   if (head == tail && (! INSN_P (head)))
1878     abort ();
1879
1880   /* Debug info.  */
1881   if (sched_verbose)
1882     {
1883       fprintf (sched_dump, ";;   ======================================================\n");
1884       fprintf (sched_dump,
1885                ";;   -- basic block %d from %d to %d -- %s reload\n",
1886                b, INSN_UID (head), INSN_UID (tail),
1887                (reload_completed ? "after" : "before"));
1888       fprintf (sched_dump, ";;   ======================================================\n");
1889       fprintf (sched_dump, "\n");
1890     }
1891
1892   state_reset (curr_state);
1893
1894   /* Allocate the ready list.  */
1895   ready.veclen = rgn_n_insns + 1 + issue_rate;
1896   ready.first = ready.veclen - 1;
1897   ready.vec = xmalloc (ready.veclen * sizeof (rtx));
1898   ready.n_ready = 0;
1899
1900   /* It is used for first cycle multipass scheduling.  */
1901   temp_state = alloca (dfa_state_size);
1902   ready_try = xcalloc ((rgn_n_insns + 1), sizeof (char));
1903   choice_stack = xmalloc ((rgn_n_insns + 1)
1904                           * sizeof (struct choice_entry));
1905   for (i = 0; i <= rgn_n_insns; i++)
1906     choice_stack[i].state = xmalloc (dfa_state_size);
1907
1908   (*current_sched_info->init_ready_list) (&ready);
1909
1910   if (targetm.sched.md_init)
1911     targetm.sched.md_init (sched_dump, sched_verbose, ready.veclen);
1912
1913   /* We start inserting insns after PREV_HEAD.  */
1914   last_scheduled_insn = prev_head;
1915
1916   /* Initialize INSN_QUEUE.  Q_SIZE is the total number of insns in the
1917      queue.  */
1918   q_ptr = 0;
1919   q_size = 0;
1920
1921   insn_queue = alloca ((max_insn_queue_index + 1) * sizeof (rtx));
1922   memset (insn_queue, 0, (max_insn_queue_index + 1) * sizeof (rtx));
1923   last_clock_var = -1;
1924
1925   /* Start just before the beginning of time.  */
1926   clock_var = -1;
1927   advance = 0;
1928
1929   sort_p = TRUE;
1930   /* Loop until all the insns in BB are scheduled.  */
1931   while ((*current_sched_info->schedule_more_p) ())
1932     {
1933       do
1934         {
1935           start_clock_var = clock_var;
1936
1937           clock_var++;
1938
1939           advance_one_cycle ();
1940
1941           /* Add to the ready list all pending insns that can be issued now.
1942              If there are no ready insns, increment clock until one
1943              is ready and add all pending insns at that point to the ready
1944              list.  */
1945           queue_to_ready (&ready);
1946
1947           if (ready.n_ready == 0)
1948             abort ();
1949
1950           if (sched_verbose >= 2)
1951             {
1952               fprintf (sched_dump, ";;\t\tReady list after queue_to_ready:  ");
1953               debug_ready_list (&ready);
1954             }
1955           advance -= clock_var - start_clock_var;
1956         }
1957       while (advance > 0);
1958
1959       if (sort_p)
1960         {
1961           /* Sort the ready list based on priority.  */
1962           ready_sort (&ready);
1963
1964           if (sched_verbose >= 2)
1965             {
1966               fprintf (sched_dump, ";;\t\tReady list after ready_sort:  ");
1967               debug_ready_list (&ready);
1968             }
1969         }
1970
1971       /* Allow the target to reorder the list, typically for
1972          better instruction bundling.  */
1973       if (sort_p && targetm.sched.reorder
1974           && (ready.n_ready == 0
1975               || !SCHED_GROUP_P (ready_element (&ready, 0))))
1976         can_issue_more =
1977           targetm.sched.reorder (sched_dump, sched_verbose,
1978                                  ready_lastpos (&ready),
1979                                  &ready.n_ready, clock_var);
1980       else
1981         can_issue_more = issue_rate;
1982
1983       first_cycle_insn_p = 1;
1984       cycle_issued_insns = 0;
1985       for (;;)
1986         {
1987           rtx insn;
1988           int cost;
1989           bool asm_p = false;
1990
1991           if (sched_verbose >= 2)
1992             {
1993               fprintf (sched_dump, ";;\tReady list (t =%3d):  ",
1994                        clock_var);
1995               debug_ready_list (&ready);
1996             }
1997
1998           if (ready.n_ready == 0 
1999               && can_issue_more 
2000               && reload_completed) 
2001             {
2002               /* Allow scheduling insns directly from the queue in case
2003                  there's nothing better to do (ready list is empty) but
2004                  there are still vacant dispatch slots in the current cycle.  */
2005               if (sched_verbose >= 6)
2006                 fprintf(sched_dump,";;\t\tSecond chance\n");
2007               memcpy (temp_state, curr_state, dfa_state_size);
2008               if (early_queue_to_ready (temp_state, &ready))
2009                 ready_sort (&ready);
2010             }
2011
2012           if (ready.n_ready == 0 || !can_issue_more
2013               || state_dead_lock_p (curr_state)
2014               || !(*current_sched_info->schedule_more_p) ())
2015             break;
2016
2017           /* Select and remove the insn from the ready list.  */
2018           if (sort_p)
2019             insn = choose_ready (&ready);
2020           else
2021             insn = ready_remove_first (&ready);
2022
2023           if (targetm.sched.dfa_new_cycle
2024               && targetm.sched.dfa_new_cycle (sched_dump, sched_verbose,
2025                                               insn, last_clock_var,
2026                                               clock_var, &sort_p))
2027             {
2028               ready_add (&ready, insn);
2029               break;
2030             }
2031
2032           sort_p = TRUE;
2033           memcpy (temp_state, curr_state, dfa_state_size);
2034           if (recog_memoized (insn) < 0)
2035             {
2036               asm_p = (GET_CODE (PATTERN (insn)) == ASM_INPUT
2037                        || asm_noperands (PATTERN (insn)) >= 0);
2038               if (!first_cycle_insn_p && asm_p)
2039                 /* This is asm insn which is tryed to be issued on the
2040                    cycle not first.  Issue it on the next cycle.  */
2041                 cost = 1;
2042               else
2043                 /* A USE insn, or something else we don't need to
2044                    understand.  We can't pass these directly to
2045                    state_transition because it will trigger a
2046                    fatal error for unrecognizable insns.  */
2047                 cost = 0;
2048             }
2049           else
2050             {
2051               cost = state_transition (temp_state, insn);
2052               if (cost < 0)
2053                 cost = 0;
2054               else if (cost == 0)
2055                 cost = 1;
2056             }
2057
2058           if (cost >= 1)
2059             {
2060               queue_insn (insn, cost);
2061               continue;
2062             }
2063
2064           if (! (*current_sched_info->can_schedule_ready_p) (insn))
2065             goto next;
2066
2067           last_scheduled_insn = move_insn (insn, last_scheduled_insn);
2068
2069           if (memcmp (curr_state, temp_state, dfa_state_size) != 0)
2070             cycle_issued_insns++;
2071           memcpy (curr_state, temp_state, dfa_state_size);
2072
2073           if (targetm.sched.variable_issue)
2074             can_issue_more =
2075               targetm.sched.variable_issue (sched_dump, sched_verbose,
2076                                                insn, can_issue_more);
2077           /* A naked CLOBBER or USE generates no instruction, so do
2078              not count them against the issue rate.  */
2079           else if (GET_CODE (PATTERN (insn)) != USE
2080                    && GET_CODE (PATTERN (insn)) != CLOBBER)
2081             can_issue_more--;
2082
2083           advance = schedule_insn (insn, &ready, clock_var);
2084
2085           /* After issuing an asm insn we should start a new cycle.  */
2086           if (advance == 0 && asm_p)
2087             advance = 1;
2088           if (advance != 0)
2089             break;
2090
2091         next:
2092           first_cycle_insn_p = 0;
2093
2094           /* Sort the ready list based on priority.  This must be
2095              redone here, as schedule_insn may have readied additional
2096              insns that will not be sorted correctly.  */
2097           if (ready.n_ready > 0)
2098             ready_sort (&ready);
2099
2100           if (targetm.sched.reorder2
2101               && (ready.n_ready == 0
2102                   || !SCHED_GROUP_P (ready_element (&ready, 0))))
2103             {
2104               can_issue_more =
2105                 targetm.sched.reorder2 (sched_dump, sched_verbose,
2106                                         ready.n_ready
2107                                         ? ready_lastpos (&ready) : NULL,
2108                                         &ready.n_ready, clock_var);
2109             }
2110         }
2111     }
2112
2113   if (targetm.sched.md_finish)
2114     targetm.sched.md_finish (sched_dump, sched_verbose);
2115
2116   /* Debug info.  */
2117   if (sched_verbose)
2118     {
2119       fprintf (sched_dump, ";;\tReady list (final):  ");
2120       debug_ready_list (&ready);
2121     }
2122
2123   /* Sanity check -- queue must be empty now.  Meaningless if region has
2124      multiple bbs.  */
2125   if (current_sched_info->queue_must_finish_empty && q_size != 0)
2126       abort ();
2127
2128   /* Update head/tail boundaries.  */
2129   head = NEXT_INSN (prev_head);
2130   tail = last_scheduled_insn;
2131
2132   if (!reload_completed)
2133     {
2134       rtx insn, link, next;
2135
2136       /* INSN_TICK (minimum clock tick at which the insn becomes
2137          ready) may be not correct for the insn in the subsequent
2138          blocks of the region.  We should use a correct value of
2139          `clock_var' or modify INSN_TICK.  It is better to keep
2140          clock_var value equal to 0 at the start of a basic block.
2141          Therefore we modify INSN_TICK here.  */
2142       for (insn = head; insn != tail; insn = NEXT_INSN (insn))
2143         if (INSN_P (insn))
2144           {
2145             for (link = INSN_DEPEND (insn); link != 0; link = XEXP (link, 1))
2146               {
2147                 next = XEXP (link, 0);
2148                 INSN_TICK (next) -= clock_var;
2149               }
2150           }
2151     }
2152
2153   /* Restore-other-notes: NOTE_LIST is the end of a chain of notes
2154      previously found among the insns.  Insert them at the beginning
2155      of the insns.  */
2156   if (note_list != 0)
2157     {
2158       rtx note_head = note_list;
2159
2160       while (PREV_INSN (note_head))
2161         {
2162           note_head = PREV_INSN (note_head);
2163         }
2164
2165       PREV_INSN (note_head) = PREV_INSN (head);
2166       NEXT_INSN (PREV_INSN (head)) = note_head;
2167       PREV_INSN (head) = note_list;
2168       NEXT_INSN (note_list) = head;
2169       head = note_head;
2170     }
2171
2172   /* Debugging.  */
2173   if (sched_verbose)
2174     {
2175       fprintf (sched_dump, ";;   total time = %d\n;;   new head = %d\n",
2176                clock_var, INSN_UID (head));
2177       fprintf (sched_dump, ";;   new tail = %d\n\n",
2178                INSN_UID (tail));
2179     }
2180
2181   current_sched_info->head = head;
2182   current_sched_info->tail = tail;
2183
2184   free (ready.vec);
2185
2186   free (ready_try);
2187   for (i = 0; i <= rgn_n_insns; i++)
2188     free (choice_stack [i].state);
2189   free (choice_stack);
2190 }
2191 \f
2192 /* Set_priorities: compute priority of each insn in the block.  */
2193
2194 int
2195 set_priorities (rtx head, rtx tail)
2196 {
2197   rtx insn;
2198   int n_insn;
2199   int sched_max_insns_priority = 
2200         current_sched_info->sched_max_insns_priority;
2201   rtx prev_head;
2202
2203   prev_head = PREV_INSN (head);
2204
2205   if (head == tail && (! INSN_P (head)))
2206     return 0;
2207
2208   n_insn = 0;
2209   sched_max_insns_priority = 0;
2210   for (insn = tail; insn != prev_head; insn = PREV_INSN (insn))
2211     {
2212       if (NOTE_P (insn))
2213         continue;
2214
2215       n_insn++;
2216       (void) priority (insn);
2217
2218       if (INSN_PRIORITY_KNOWN (insn))
2219         sched_max_insns_priority =
2220           MAX (sched_max_insns_priority, INSN_PRIORITY (insn)); 
2221     }
2222   sched_max_insns_priority += 1;
2223   current_sched_info->sched_max_insns_priority =
2224         sched_max_insns_priority;
2225
2226   return n_insn;
2227 }
2228
2229 /* Initialize some global state for the scheduler.  DUMP_FILE is to be used
2230    for debugging output.  */
2231
2232 void
2233 sched_init (FILE *dump_file)
2234 {
2235   int luid;
2236   basic_block b;
2237   rtx insn;
2238   int i;
2239
2240   /* Disable speculative loads in their presence if cc0 defined.  */
2241 #ifdef HAVE_cc0
2242   flag_schedule_speculative_load = 0;
2243 #endif
2244
2245   /* Set dump and sched_verbose for the desired debugging output.  If no
2246      dump-file was specified, but -fsched-verbose=N (any N), print to stderr.
2247      For -fsched-verbose=N, N>=10, print everything to stderr.  */
2248   sched_verbose = sched_verbose_param;
2249   if (sched_verbose_param == 0 && dump_file)
2250     sched_verbose = 1;
2251   sched_dump = ((sched_verbose_param >= 10 || !dump_file)
2252                 ? stderr : dump_file);
2253
2254   /* Initialize issue_rate.  */
2255   if (targetm.sched.issue_rate)
2256     issue_rate = targetm.sched.issue_rate ();
2257   else
2258     issue_rate = 1;
2259
2260   if (cached_issue_rate != issue_rate)
2261     {
2262       cached_issue_rate = issue_rate;
2263       /* To invalidate max_lookahead_tries:  */
2264       cached_first_cycle_multipass_dfa_lookahead = 0;
2265     }
2266
2267   /* We use LUID 0 for the fake insn (UID 0) which holds dependencies for
2268      pseudos which do not cross calls.  */
2269   old_max_uid = get_max_uid () + 1;
2270
2271   h_i_d = xcalloc (old_max_uid, sizeof (*h_i_d));
2272
2273   for (i = 0; i < old_max_uid; i++)
2274     h_i_d [i].cost = -1;
2275
2276   if (targetm.sched.init_dfa_pre_cycle_insn)
2277     targetm.sched.init_dfa_pre_cycle_insn ();
2278
2279   if (targetm.sched.init_dfa_post_cycle_insn)
2280     targetm.sched.init_dfa_post_cycle_insn ();
2281
2282   dfa_start ();
2283   dfa_state_size = state_size ();
2284   curr_state = xmalloc (dfa_state_size);
2285
2286   h_i_d[0].luid = 0;
2287   luid = 1;
2288   FOR_EACH_BB (b)
2289     for (insn = BB_HEAD (b); ; insn = NEXT_INSN (insn))
2290       {
2291         INSN_LUID (insn) = luid;
2292
2293         /* Increment the next luid, unless this is a note.  We don't
2294            really need separate IDs for notes and we don't want to
2295            schedule differently depending on whether or not there are
2296            line-number notes, i.e., depending on whether or not we're
2297            generating debugging information.  */
2298         if (!NOTE_P (insn))
2299           ++luid;
2300
2301         if (insn == BB_END (b))
2302           break;
2303       }
2304
2305   init_dependency_caches (luid);
2306
2307   init_alias_analysis ();
2308
2309   if (write_symbols != NO_DEBUG)
2310     {
2311       rtx line;
2312
2313       line_note_head = xcalloc (last_basic_block, sizeof (rtx));
2314
2315       /* Save-line-note-head:
2316          Determine the line-number at the start of each basic block.
2317          This must be computed and saved now, because after a basic block's
2318          predecessor has been scheduled, it is impossible to accurately
2319          determine the correct line number for the first insn of the block.  */
2320
2321       FOR_EACH_BB (b)
2322         {
2323           for (line = BB_HEAD (b); line; line = PREV_INSN (line))
2324             if (NOTE_P (line) && NOTE_LINE_NUMBER (line) > 0)
2325               {
2326                 line_note_head[b->index] = line;
2327                 break;
2328               }
2329           /* Do a forward search as well, since we won't get to see the first
2330              notes in a basic block.  */
2331           for (line = BB_HEAD (b); line; line = NEXT_INSN (line))
2332             {
2333               if (INSN_P (line))
2334                 break;
2335               if (NOTE_P (line) && NOTE_LINE_NUMBER (line) > 0)
2336                 line_note_head[b->index] = line;
2337             }
2338         }
2339     }
2340
2341   /* ??? Add a NOTE after the last insn of the last basic block.  It is not
2342      known why this is done.  */
2343
2344   insn = BB_END (EXIT_BLOCK_PTR->prev_bb);
2345   if (NEXT_INSN (insn) == 0
2346       || (!NOTE_P (insn)
2347           && !LABEL_P (insn)
2348           /* Don't emit a NOTE if it would end up before a BARRIER.  */
2349           && !BARRIER_P (NEXT_INSN (insn))))
2350     {
2351       emit_note_after (NOTE_INSN_DELETED, BB_END (EXIT_BLOCK_PTR->prev_bb));
2352       /* Make insn to appear outside BB.  */
2353       BB_END (EXIT_BLOCK_PTR->prev_bb) = PREV_INSN (BB_END (EXIT_BLOCK_PTR->prev_bb));
2354     }
2355
2356   /* Compute INSN_REG_WEIGHT for all blocks.  We must do this before
2357      removing death notes.  */
2358   FOR_EACH_BB_REVERSE (b)
2359     find_insn_reg_weight (b->index);
2360
2361   if (targetm.sched.md_init_global)
2362       targetm.sched.md_init_global (sched_dump, sched_verbose, old_max_uid);
2363 }
2364
2365 /* Free global data used during insn scheduling.  */
2366
2367 void
2368 sched_finish (void)
2369 {
2370   free (h_i_d);
2371   free (curr_state);
2372   dfa_finish ();
2373   free_dependency_caches ();
2374   end_alias_analysis ();
2375   if (write_symbols != NO_DEBUG)
2376     free (line_note_head);
2377
2378   if (targetm.sched.md_finish_global)
2379       targetm.sched.md_finish_global (sched_dump, sched_verbose);
2380 }
2381 #endif /* INSN_SCHEDULING */