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