Eliminate BB_NOTE_LIST scaffolding
[platform/upstream/gcc.git] / gcc / haifa-sched.c
1 /* Instruction scheduling pass.
2    Copyright (C) 1992-2014 Free Software Foundation, Inc.
3    Contributed by Michael Tiemann (tiemann@cygnus.com) Enhanced by,
4    and currently maintained by, Jim Wilson (wilson@cygnus.com)
5
6 This file is part of GCC.
7
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
11 version.
12
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16 for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3.  If not see
20 <http://www.gnu.org/licenses/>.  */
21
22 /* Instruction scheduling pass.  This file, along with sched-deps.c,
23    contains the generic parts.  The actual entry point for
24    the normal instruction scheduling pass is found in sched-rgn.c.
25
26    We compute insn priorities based on data dependencies.  Flow
27    analysis only creates a fraction of the data-dependencies we must
28    observe: namely, only those dependencies which the combiner can be
29    expected to use.  For this pass, we must therefore create the
30    remaining dependencies we need to observe: register dependencies,
31    memory dependencies, dependencies to keep function calls in order,
32    and the dependence between a conditional branch and the setting of
33    condition codes are all dealt with here.
34
35    The scheduler first traverses the data flow graph, starting with
36    the last instruction, and proceeding to the first, assigning values
37    to insn_priority as it goes.  This sorts the instructions
38    topologically by data dependence.
39
40    Once priorities have been established, we order the insns using
41    list scheduling.  This works as follows: starting with a list of
42    all the ready insns, and sorted according to priority number, we
43    schedule the insn from the end of the list by placing its
44    predecessors in the list according to their priority order.  We
45    consider this insn scheduled by setting the pointer to the "end" of
46    the list to point to the previous insn.  When an insn has no
47    predecessors, we either queue it until sufficient time has elapsed
48    or add it to the ready list.  As the instructions are scheduled or
49    when stalls are introduced, the queue advances and dumps insns into
50    the ready list.  When all insns down to the lowest priority have
51    been scheduled, the critical path of the basic block has been made
52    as short as possible.  The remaining insns are then scheduled in
53    remaining slots.
54
55    The following list shows the order in which we want to break ties
56    among insns in the ready list:
57
58    1.  choose insn with the longest path to end of bb, ties
59    broken by
60    2.  choose insn with least contribution to register pressure,
61    ties broken by
62    3.  prefer in-block upon interblock motion, ties broken by
63    4.  prefer useful upon speculative motion, ties broken by
64    5.  choose insn with largest control flow probability, ties
65    broken by
66    6.  choose insn with the least dependences upon the previously
67    scheduled insn, or finally
68    7   choose the insn which has the most insns dependent on it.
69    8.  choose insn with lowest UID.
70
71    Memory references complicate matters.  Only if we can be certain
72    that memory references are not part of the data dependency graph
73    (via true, anti, or output dependence), can we move operations past
74    memory references.  To first approximation, reads can be done
75    independently, while writes introduce dependencies.  Better
76    approximations will yield fewer dependencies.
77
78    Before reload, an extended analysis of interblock data dependences
79    is required for interblock scheduling.  This is performed in
80    compute_block_dependences ().
81
82    Dependencies set up by memory references are treated in exactly the
83    same way as other dependencies, by using insn backward dependences
84    INSN_BACK_DEPS.  INSN_BACK_DEPS are translated into forward dependences
85    INSN_FORW_DEPS for the purpose of forward list scheduling.
86
87    Having optimized the critical path, we may have also unduly
88    extended the lifetimes of some registers.  If an operation requires
89    that constants be loaded into registers, it is certainly desirable
90    to load those constants as early as necessary, but no earlier.
91    I.e., it will not do to load up a bunch of registers at the
92    beginning of a basic block only to use them at the end, if they
93    could be loaded later, since this may result in excessive register
94    utilization.
95
96    Note that since branches are never in basic blocks, but only end
97    basic blocks, this pass will not move branches.  But that is ok,
98    since we can use GNU's delayed branch scheduling pass to take care
99    of this case.
100
101    Also note that no further optimizations based on algebraic
102    identities are performed, so this pass would be a good one to
103    perform instruction splitting, such as breaking up a multiply
104    instruction into shifts and adds where that is profitable.
105
106    Given the memory aliasing analysis that this pass should perform,
107    it should be possible to remove redundant stores to memory, and to
108    load values from registers instead of hitting memory.
109
110    Before reload, speculative insns are moved only if a 'proof' exists
111    that no exception will be caused by this, and if no live registers
112    exist that inhibit the motion (live registers constraints are not
113    represented by data dependence edges).
114
115    This pass must update information that subsequent passes expect to
116    be correct.  Namely: reg_n_refs, reg_n_sets, reg_n_deaths,
117    reg_n_calls_crossed, and reg_live_length.  Also, BB_HEAD, BB_END.
118
119    The information in the line number notes is carefully retained by
120    this pass.  Notes that refer to the starting and ending of
121    exception regions are also carefully retained by this pass.  All
122    other NOTE insns are grouped in their same relative order at the
123    beginning of basic blocks and regions that have been scheduled.  */
124 \f
125 #include "config.h"
126 #include "system.h"
127 #include "coretypes.h"
128 #include "tm.h"
129 #include "diagnostic-core.h"
130 #include "hard-reg-set.h"
131 #include "rtl.h"
132 #include "tm_p.h"
133 #include "regs.h"
134 #include "function.h"
135 #include "flags.h"
136 #include "insn-config.h"
137 #include "insn-attr.h"
138 #include "except.h"
139 #include "recog.h"
140 #include "sched-int.h"
141 #include "target.h"
142 #include "common/common-target.h"
143 #include "params.h"
144 #include "dbgcnt.h"
145 #include "cfgloop.h"
146 #include "ira.h"
147 #include "emit-rtl.h"  /* FIXME: Can go away once crtl is moved to rtl.h.  */
148 #include "hash-table.h"
149 #include "dumpfile.h"
150
151 #ifdef INSN_SCHEDULING
152
153 /* True if we do register pressure relief through live-range
154    shrinkage.  */
155 static bool live_range_shrinkage_p;
156
157 /* Switch on live range shrinkage.  */
158 void
159 initialize_live_range_shrinkage (void)
160 {
161   live_range_shrinkage_p = true;
162 }
163
164 /* Switch off live range shrinkage.  */
165 void
166 finish_live_range_shrinkage (void)
167 {
168   live_range_shrinkage_p = false;
169 }
170
171 /* issue_rate is the number of insns that can be scheduled in the same
172    machine cycle.  It can be defined in the config/mach/mach.h file,
173    otherwise we set it to 1.  */
174
175 int issue_rate;
176
177 /* This can be set to true by a backend if the scheduler should not
178    enable a DCE pass.  */
179 bool sched_no_dce;
180
181 /* The current initiation interval used when modulo scheduling.  */
182 static int modulo_ii;
183
184 /* The maximum number of stages we are prepared to handle.  */
185 static int modulo_max_stages;
186
187 /* The number of insns that exist in each iteration of the loop.  We use this
188    to detect when we've scheduled all insns from the first iteration.  */
189 static int modulo_n_insns;
190
191 /* The current count of insns in the first iteration of the loop that have
192    already been scheduled.  */
193 static int modulo_insns_scheduled;
194
195 /* The maximum uid of insns from the first iteration of the loop.  */
196 static int modulo_iter0_max_uid;
197
198 /* The number of times we should attempt to backtrack when modulo scheduling.
199    Decreased each time we have to backtrack.  */
200 static int modulo_backtracks_left;
201
202 /* The stage in which the last insn from the original loop was
203    scheduled.  */
204 static int modulo_last_stage;
205
206 /* sched-verbose controls the amount of debugging output the
207    scheduler prints.  It is controlled by -fsched-verbose=N:
208    N>0 and no -DSR : the output is directed to stderr.
209    N>=10 will direct the printouts to stderr (regardless of -dSR).
210    N=1: same as -dSR.
211    N=2: bb's probabilities, detailed ready list info, unit/insn info.
212    N=3: rtl at abort point, control-flow, regions info.
213    N=5: dependences info.  */
214
215 int sched_verbose = 0;
216
217 /* Debugging file.  All printouts are sent to dump, which is always set,
218    either to stderr, or to the dump listing file (-dRS).  */
219 FILE *sched_dump = 0;
220
221 /* This is a placeholder for the scheduler parameters common
222    to all schedulers.  */
223 struct common_sched_info_def *common_sched_info;
224
225 #define INSN_TICK(INSN) (HID (INSN)->tick)
226 #define INSN_EXACT_TICK(INSN) (HID (INSN)->exact_tick)
227 #define INSN_TICK_ESTIMATE(INSN) (HID (INSN)->tick_estimate)
228 #define INTER_TICK(INSN) (HID (INSN)->inter_tick)
229 #define FEEDS_BACKTRACK_INSN(INSN) (HID (INSN)->feeds_backtrack_insn)
230 #define SHADOW_P(INSN) (HID (INSN)->shadow_p)
231 #define MUST_RECOMPUTE_SPEC_P(INSN) (HID (INSN)->must_recompute_spec)
232 /* Cached cost of the instruction.  Use insn_cost to get cost of the
233    insn.  -1 here means that the field is not initialized.  */
234 #define INSN_COST(INSN) (HID (INSN)->cost)
235
236 /* If INSN_TICK of an instruction is equal to INVALID_TICK,
237    then it should be recalculated from scratch.  */
238 #define INVALID_TICK (-(max_insn_queue_index + 1))
239 /* The minimal value of the INSN_TICK of an instruction.  */
240 #define MIN_TICK (-max_insn_queue_index)
241
242 /* List of important notes we must keep around.  This is a pointer to the
243    last element in the list.  */
244 rtx_insn *note_list;
245
246 static struct spec_info_def spec_info_var;
247 /* Description of the speculative part of the scheduling.
248    If NULL - no speculation.  */
249 spec_info_t spec_info = NULL;
250
251 /* True, if recovery block was added during scheduling of current block.
252    Used to determine, if we need to fix INSN_TICKs.  */
253 static bool haifa_recovery_bb_recently_added_p;
254
255 /* True, if recovery block was added during this scheduling pass.
256    Used to determine if we should have empty memory pools of dependencies
257    after finishing current region.  */
258 bool haifa_recovery_bb_ever_added_p;
259
260 /* Counters of different types of speculative instructions.  */
261 static int nr_begin_data, nr_be_in_data, nr_begin_control, nr_be_in_control;
262
263 /* Array used in {unlink, restore}_bb_notes.  */
264 static rtx_insn **bb_header = 0;
265
266 /* Basic block after which recovery blocks will be created.  */
267 static basic_block before_recovery;
268
269 /* Basic block just before the EXIT_BLOCK and after recovery, if we have
270    created it.  */
271 basic_block after_recovery;
272
273 /* FALSE if we add bb to another region, so we don't need to initialize it.  */
274 bool adding_bb_to_current_region_p = true;
275
276 /* Queues, etc.  */
277
278 /* An instruction is ready to be scheduled when all insns preceding it
279    have already been scheduled.  It is important to ensure that all
280    insns which use its result will not be executed until its result
281    has been computed.  An insn is maintained in one of four structures:
282
283    (P) the "Pending" set of insns which cannot be scheduled until
284    their dependencies have been satisfied.
285    (Q) the "Queued" set of insns that can be scheduled when sufficient
286    time has passed.
287    (R) the "Ready" list of unscheduled, uncommitted insns.
288    (S) the "Scheduled" list of insns.
289
290    Initially, all insns are either "Pending" or "Ready" depending on
291    whether their dependencies are satisfied.
292
293    Insns move from the "Ready" list to the "Scheduled" list as they
294    are committed to the schedule.  As this occurs, the insns in the
295    "Pending" list have their dependencies satisfied and move to either
296    the "Ready" list or the "Queued" set depending on whether
297    sufficient time has passed to make them ready.  As time passes,
298    insns move from the "Queued" set to the "Ready" list.
299
300    The "Pending" list (P) are the insns in the INSN_FORW_DEPS of the
301    unscheduled insns, i.e., those that are ready, queued, and pending.
302    The "Queued" set (Q) is implemented by the variable `insn_queue'.
303    The "Ready" list (R) is implemented by the variables `ready' and
304    `n_ready'.
305    The "Scheduled" list (S) is the new insn chain built by this pass.
306
307    The transition (R->S) is implemented in the scheduling loop in
308    `schedule_block' when the best insn to schedule is chosen.
309    The transitions (P->R and P->Q) are implemented in `schedule_insn' as
310    insns move from the ready list to the scheduled list.
311    The transition (Q->R) is implemented in 'queue_to_insn' as time
312    passes or stalls are introduced.  */
313
314 /* Implement a circular buffer to delay instructions until sufficient
315    time has passed.  For the new pipeline description interface,
316    MAX_INSN_QUEUE_INDEX is a power of two minus one which is not less
317    than maximal time of instruction execution computed by genattr.c on
318    the base maximal time of functional unit reservations and getting a
319    result.  This is the longest time an insn may be queued.  */
320
321 static rtx *insn_queue;
322 static int q_ptr = 0;
323 static int q_size = 0;
324 #define NEXT_Q(X) (((X)+1) & max_insn_queue_index)
325 #define NEXT_Q_AFTER(X, C) (((X)+C) & max_insn_queue_index)
326
327 #define QUEUE_SCHEDULED (-3)
328 #define QUEUE_NOWHERE   (-2)
329 #define QUEUE_READY     (-1)
330 /* QUEUE_SCHEDULED - INSN is scheduled.
331    QUEUE_NOWHERE   - INSN isn't scheduled yet and is neither in
332    queue or ready list.
333    QUEUE_READY     - INSN is in ready list.
334    N >= 0 - INSN queued for X [where NEXT_Q_AFTER (q_ptr, X) == N] cycles.  */
335
336 #define QUEUE_INDEX(INSN) (HID (INSN)->queue_index)
337
338 /* The following variable value refers for all current and future
339    reservations of the processor units.  */
340 state_t curr_state;
341
342 /* The following variable value is size of memory representing all
343    current and future reservations of the processor units.  */
344 size_t dfa_state_size;
345
346 /* The following array is used to find the best insn from ready when
347    the automaton pipeline interface is used.  */
348 signed char *ready_try = NULL;
349
350 /* The ready list.  */
351 struct ready_list ready = {NULL, 0, 0, 0, 0};
352
353 /* The pointer to the ready list (to be removed).  */
354 static struct ready_list *readyp = &ready;
355
356 /* Scheduling clock.  */
357 static int clock_var;
358
359 /* Clock at which the previous instruction was issued.  */
360 static int last_clock_var;
361
362 /* Set to true if, when queuing a shadow insn, we discover that it would be
363    scheduled too late.  */
364 static bool must_backtrack;
365
366 /* The following variable value is number of essential insns issued on
367    the current cycle.  An insn is essential one if it changes the
368    processors state.  */
369 int cycle_issued_insns;
370
371 /* This records the actual schedule.  It is built up during the main phase
372    of schedule_block, and afterwards used to reorder the insns in the RTL.  */
373 static vec<rtx_insn *> scheduled_insns;
374
375 static int may_trap_exp (const_rtx, int);
376
377 /* Nonzero iff the address is comprised from at most 1 register.  */
378 #define CONST_BASED_ADDRESS_P(x)                        \
379   (REG_P (x)                                    \
380    || ((GET_CODE (x) == PLUS || GET_CODE (x) == MINUS   \
381         || (GET_CODE (x) == LO_SUM))                    \
382        && (CONSTANT_P (XEXP (x, 0))                     \
383            || CONSTANT_P (XEXP (x, 1)))))
384
385 /* Returns a class that insn with GET_DEST(insn)=x may belong to,
386    as found by analyzing insn's expression.  */
387
388 \f
389 static int haifa_luid_for_non_insn (rtx x);
390
391 /* Haifa version of sched_info hooks common to all headers.  */
392 const struct common_sched_info_def haifa_common_sched_info =
393   {
394     NULL, /* fix_recovery_cfg */
395     NULL, /* add_block */
396     NULL, /* estimate_number_of_insns */
397     haifa_luid_for_non_insn, /* luid_for_non_insn */
398     SCHED_PASS_UNKNOWN /* sched_pass_id */
399   };
400
401 /* Mapping from instruction UID to its Logical UID.  */
402 vec<int> sched_luids = vNULL;
403
404 /* Next LUID to assign to an instruction.  */
405 int sched_max_luid = 1;
406
407 /* Haifa Instruction Data.  */
408 vec<haifa_insn_data_def> h_i_d = vNULL;
409
410 void (* sched_init_only_bb) (basic_block, basic_block);
411
412 /* Split block function.  Different schedulers might use different functions
413    to handle their internal data consistent.  */
414 basic_block (* sched_split_block) (basic_block, rtx);
415
416 /* Create empty basic block after the specified block.  */
417 basic_block (* sched_create_empty_bb) (basic_block);
418
419 /* Return the number of cycles until INSN is expected to be ready.
420    Return zero if it already is.  */
421 static int
422 insn_delay (rtx insn)
423 {
424   return MAX (INSN_TICK (insn) - clock_var, 0);
425 }
426
427 static int
428 may_trap_exp (const_rtx x, int is_store)
429 {
430   enum rtx_code code;
431
432   if (x == 0)
433     return TRAP_FREE;
434   code = GET_CODE (x);
435   if (is_store)
436     {
437       if (code == MEM && may_trap_p (x))
438         return TRAP_RISKY;
439       else
440         return TRAP_FREE;
441     }
442   if (code == MEM)
443     {
444       /* The insn uses memory:  a volatile load.  */
445       if (MEM_VOLATILE_P (x))
446         return IRISKY;
447       /* An exception-free load.  */
448       if (!may_trap_p (x))
449         return IFREE;
450       /* A load with 1 base register, to be further checked.  */
451       if (CONST_BASED_ADDRESS_P (XEXP (x, 0)))
452         return PFREE_CANDIDATE;
453       /* No info on the load, to be further checked.  */
454       return PRISKY_CANDIDATE;
455     }
456   else
457     {
458       const char *fmt;
459       int i, insn_class = TRAP_FREE;
460
461       /* Neither store nor load, check if it may cause a trap.  */
462       if (may_trap_p (x))
463         return TRAP_RISKY;
464       /* Recursive step: walk the insn...  */
465       fmt = GET_RTX_FORMAT (code);
466       for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
467         {
468           if (fmt[i] == 'e')
469             {
470               int tmp_class = may_trap_exp (XEXP (x, i), is_store);
471               insn_class = WORST_CLASS (insn_class, tmp_class);
472             }
473           else if (fmt[i] == 'E')
474             {
475               int j;
476               for (j = 0; j < XVECLEN (x, i); j++)
477                 {
478                   int tmp_class = may_trap_exp (XVECEXP (x, i, j), is_store);
479                   insn_class = WORST_CLASS (insn_class, tmp_class);
480                   if (insn_class == TRAP_RISKY || insn_class == IRISKY)
481                     break;
482                 }
483             }
484           if (insn_class == TRAP_RISKY || insn_class == IRISKY)
485             break;
486         }
487       return insn_class;
488     }
489 }
490
491 /* Classifies rtx X of an insn for the purpose of verifying that X can be
492    executed speculatively (and consequently the insn can be moved
493    speculatively), by examining X, returning:
494    TRAP_RISKY: store, or risky non-load insn (e.g. division by variable).
495    TRAP_FREE: non-load insn.
496    IFREE: load from a globally safe location.
497    IRISKY: volatile load.
498    PFREE_CANDIDATE, PRISKY_CANDIDATE: load that need to be checked for
499    being either PFREE or PRISKY.  */
500
501 static int
502 haifa_classify_rtx (const_rtx x)
503 {
504   int tmp_class = TRAP_FREE;
505   int insn_class = TRAP_FREE;
506   enum rtx_code code;
507
508   if (GET_CODE (x) == PARALLEL)
509     {
510       int i, len = XVECLEN (x, 0);
511
512       for (i = len - 1; i >= 0; i--)
513         {
514           tmp_class = haifa_classify_rtx (XVECEXP (x, 0, i));
515           insn_class = WORST_CLASS (insn_class, tmp_class);
516           if (insn_class == TRAP_RISKY || insn_class == IRISKY)
517             break;
518         }
519     }
520   else
521     {
522       code = GET_CODE (x);
523       switch (code)
524         {
525         case CLOBBER:
526           /* Test if it is a 'store'.  */
527           tmp_class = may_trap_exp (XEXP (x, 0), 1);
528           break;
529         case SET:
530           /* Test if it is a store.  */
531           tmp_class = may_trap_exp (SET_DEST (x), 1);
532           if (tmp_class == TRAP_RISKY)
533             break;
534           /* Test if it is a load.  */
535           tmp_class =
536             WORST_CLASS (tmp_class,
537                          may_trap_exp (SET_SRC (x), 0));
538           break;
539         case COND_EXEC:
540           tmp_class = haifa_classify_rtx (COND_EXEC_CODE (x));
541           if (tmp_class == TRAP_RISKY)
542             break;
543           tmp_class = WORST_CLASS (tmp_class,
544                                    may_trap_exp (COND_EXEC_TEST (x), 0));
545           break;
546         case TRAP_IF:
547           tmp_class = TRAP_RISKY;
548           break;
549         default:;
550         }
551       insn_class = tmp_class;
552     }
553
554   return insn_class;
555 }
556
557 int
558 haifa_classify_insn (const_rtx insn)
559 {
560   return haifa_classify_rtx (PATTERN (insn));
561 }
562 \f
563 /* After the scheduler initialization function has been called, this function
564    can be called to enable modulo scheduling.  II is the initiation interval
565    we should use, it affects the delays for delay_pairs that were recorded as
566    separated by a given number of stages.
567
568    MAX_STAGES provides us with a limit
569    after which we give up scheduling; the caller must have unrolled at least
570    as many copies of the loop body and recorded delay_pairs for them.
571    
572    INSNS is the number of real (non-debug) insns in one iteration of
573    the loop.  MAX_UID can be used to test whether an insn belongs to
574    the first iteration of the loop; all of them have a uid lower than
575    MAX_UID.  */
576 void
577 set_modulo_params (int ii, int max_stages, int insns, int max_uid)
578 {
579   modulo_ii = ii;
580   modulo_max_stages = max_stages;
581   modulo_n_insns = insns;
582   modulo_iter0_max_uid = max_uid;
583   modulo_backtracks_left = PARAM_VALUE (PARAM_MAX_MODULO_BACKTRACK_ATTEMPTS);
584 }
585
586 /* A structure to record a pair of insns where the first one is a real
587    insn that has delay slots, and the second is its delayed shadow.
588    I1 is scheduled normally and will emit an assembly instruction,
589    while I2 describes the side effect that takes place at the
590    transition between cycles CYCLES and (CYCLES + 1) after I1.  */
591 struct delay_pair
592 {
593   struct delay_pair *next_same_i1;
594   rtx_insn *i1, *i2;
595   int cycles;
596   /* When doing modulo scheduling, we a delay_pair can also be used to
597      show that I1 and I2 are the same insn in a different stage.  If that
598      is the case, STAGES will be nonzero.  */
599   int stages;
600 };
601
602 /* Helpers for delay hashing.  */
603
604 struct delay_i1_hasher : typed_noop_remove <delay_pair>
605 {
606   typedef delay_pair value_type;
607   typedef void compare_type;
608   static inline hashval_t hash (const value_type *);
609   static inline bool equal (const value_type *, const compare_type *);
610 };
611
612 /* Returns a hash value for X, based on hashing just I1.  */
613
614 inline hashval_t
615 delay_i1_hasher::hash (const value_type *x)
616 {
617   return htab_hash_pointer (x->i1);
618 }
619
620 /* Return true if I1 of pair X is the same as that of pair Y.  */
621
622 inline bool
623 delay_i1_hasher::equal (const value_type *x, const compare_type *y)
624 {
625   return x->i1 == y;
626 }
627
628 struct delay_i2_hasher : typed_free_remove <delay_pair>
629 {
630   typedef delay_pair value_type;
631   typedef void compare_type;
632   static inline hashval_t hash (const value_type *);
633   static inline bool equal (const value_type *, const compare_type *);
634 };
635
636 /* Returns a hash value for X, based on hashing just I2.  */
637
638 inline hashval_t
639 delay_i2_hasher::hash (const value_type *x)
640 {
641   return htab_hash_pointer (x->i2);
642 }
643
644 /* Return true if I2 of pair X is the same as that of pair Y.  */
645
646 inline bool
647 delay_i2_hasher::equal (const value_type *x, const compare_type *y)
648 {
649   return x->i2 == y;
650 }
651
652 /* Two hash tables to record delay_pairs, one indexed by I1 and the other
653    indexed by I2.  */
654 static hash_table<delay_i1_hasher> *delay_htab;
655 static hash_table<delay_i2_hasher> *delay_htab_i2;
656
657 /* Called through htab_traverse.  Walk the hashtable using I2 as
658    index, and delete all elements involving an UID higher than
659    that pointed to by *DATA.  */
660 int
661 haifa_htab_i2_traverse (delay_pair **slot, int *data)
662 {
663   int maxuid = *data;
664   struct delay_pair *p = *slot;
665   if (INSN_UID (p->i2) >= maxuid || INSN_UID (p->i1) >= maxuid)
666     {
667       delay_htab_i2->clear_slot (slot);
668     }
669   return 1;
670 }
671
672 /* Called through htab_traverse.  Walk the hashtable using I2 as
673    index, and delete all elements involving an UID higher than
674    that pointed to by *DATA.  */
675 int
676 haifa_htab_i1_traverse (delay_pair **pslot, int *data)
677 {
678   int maxuid = *data;
679   struct delay_pair *p, *first, **pprev;
680
681   if (INSN_UID ((*pslot)->i1) >= maxuid)
682     {
683       delay_htab->clear_slot (pslot);
684       return 1;
685     }
686   pprev = &first;
687   for (p = *pslot; p; p = p->next_same_i1)
688     {
689       if (INSN_UID (p->i2) < maxuid)
690         {
691           *pprev = p;
692           pprev = &p->next_same_i1;
693         }
694     }
695   *pprev = NULL;
696   if (first == NULL)
697     delay_htab->clear_slot (pslot);
698   else
699     *pslot = first;
700   return 1;
701 }
702
703 /* Discard all delay pairs which involve an insn with an UID higher
704    than MAX_UID.  */
705 void
706 discard_delay_pairs_above (int max_uid)
707 {
708   delay_htab->traverse <int *, haifa_htab_i1_traverse> (&max_uid);
709   delay_htab_i2->traverse <int *, haifa_htab_i2_traverse> (&max_uid);
710 }
711
712 /* This function can be called by a port just before it starts the final
713    scheduling pass.  It records the fact that an instruction with delay
714    slots has been split into two insns, I1 and I2.  The first one will be
715    scheduled normally and initiates the operation.  The second one is a
716    shadow which must follow a specific number of cycles after I1; its only
717    purpose is to show the side effect that occurs at that cycle in the RTL.
718    If a JUMP_INSN or a CALL_INSN has been split, I1 should be a normal INSN,
719    while I2 retains the original insn type.
720
721    There are two ways in which the number of cycles can be specified,
722    involving the CYCLES and STAGES arguments to this function.  If STAGES
723    is zero, we just use the value of CYCLES.  Otherwise, STAGES is a factor
724    which is multiplied by MODULO_II to give the number of cycles.  This is
725    only useful if the caller also calls set_modulo_params to enable modulo
726    scheduling.  */
727
728 void
729 record_delay_slot_pair (rtx_insn *i1, rtx_insn *i2, int cycles, int stages)
730 {
731   struct delay_pair *p = XNEW (struct delay_pair);
732   struct delay_pair **slot;
733
734   p->i1 = i1;
735   p->i2 = i2;
736   p->cycles = cycles;
737   p->stages = stages;
738
739   if (!delay_htab)
740     {
741       delay_htab = new hash_table<delay_i1_hasher> (10);
742       delay_htab_i2 = new hash_table<delay_i2_hasher> (10);
743     }
744   slot = delay_htab->find_slot_with_hash (i1, htab_hash_pointer (i1), INSERT);
745   p->next_same_i1 = *slot;
746   *slot = p;
747   slot = delay_htab_i2->find_slot (p, INSERT);
748   *slot = p;
749 }
750
751 /* Examine the delay pair hashtable to see if INSN is a shadow for another,
752    and return the other insn if so.  Return NULL otherwise.  */
753 rtx
754 real_insn_for_shadow (rtx insn)
755 {
756   struct delay_pair *pair;
757
758   if (!delay_htab)
759     return NULL_RTX;
760
761   pair = delay_htab_i2->find_with_hash (insn, htab_hash_pointer (insn));
762   if (!pair || pair->stages > 0)
763     return NULL_RTX;
764   return pair->i1;
765 }
766
767 /* For a pair P of insns, return the fixed distance in cycles from the first
768    insn after which the second must be scheduled.  */
769 static int
770 pair_delay (struct delay_pair *p)
771 {
772   if (p->stages == 0)
773     return p->cycles;
774   else
775     return p->stages * modulo_ii;
776 }
777
778 /* Given an insn INSN, add a dependence on its delayed shadow if it
779    has one.  Also try to find situations where shadows depend on each other
780    and add dependencies to the real insns to limit the amount of backtracking
781    needed.  */
782 void
783 add_delay_dependencies (rtx_insn *insn)
784 {
785   struct delay_pair *pair;
786   sd_iterator_def sd_it;
787   dep_t dep;
788
789   if (!delay_htab)
790     return;
791
792   pair = delay_htab_i2->find_with_hash (insn, htab_hash_pointer (insn));
793   if (!pair)
794     return;
795   add_dependence (insn, pair->i1, REG_DEP_ANTI);
796   if (pair->stages)
797     return;
798
799   FOR_EACH_DEP (pair->i2, SD_LIST_BACK, sd_it, dep)
800     {
801       rtx_insn *pro = DEP_PRO (dep);
802       struct delay_pair *other_pair
803         = delay_htab_i2->find_with_hash (pro, htab_hash_pointer (pro));
804       if (!other_pair || other_pair->stages)
805         continue;
806       if (pair_delay (other_pair) >= pair_delay (pair))
807         {
808           if (sched_verbose >= 4)
809             {
810               fprintf (sched_dump, ";;\tadding dependence %d <- %d\n",
811                        INSN_UID (other_pair->i1),
812                        INSN_UID (pair->i1));
813               fprintf (sched_dump, ";;\tpair1 %d <- %d, cost %d\n",
814                        INSN_UID (pair->i1),
815                        INSN_UID (pair->i2),
816                        pair_delay (pair));
817               fprintf (sched_dump, ";;\tpair2 %d <- %d, cost %d\n",
818                        INSN_UID (other_pair->i1),
819                        INSN_UID (other_pair->i2),
820                        pair_delay (other_pair));
821             }
822           add_dependence (pair->i1, other_pair->i1, REG_DEP_ANTI);
823         }
824     }
825 }
826 \f
827 /* Forward declarations.  */
828
829 static int priority (rtx);
830 static int rank_for_schedule (const void *, const void *);
831 static void swap_sort (rtx_insn **, int);
832 static void queue_insn (rtx_insn *, int, const char *);
833 static int schedule_insn (rtx_insn *);
834 static void adjust_priority (rtx);
835 static void advance_one_cycle (void);
836 static void extend_h_i_d (void);
837
838
839 /* Notes handling mechanism:
840    =========================
841    Generally, NOTES are saved before scheduling and restored after scheduling.
842    The scheduler distinguishes between two types of notes:
843
844    (1) LOOP_BEGIN, LOOP_END, SETJMP, EHREGION_BEG, EHREGION_END notes:
845    Before scheduling a region, a pointer to the note is added to the insn
846    that follows or precedes it.  (This happens as part of the data dependence
847    computation).  After scheduling an insn, the pointer contained in it is
848    used for regenerating the corresponding note (in reemit_notes).
849
850    (2) All other notes (e.g. INSN_DELETED):  Before scheduling a block,
851    these notes are put in a list (in rm_other_notes() and
852    unlink_other_notes ()).  After scheduling the block, these notes are
853    inserted at the beginning of the block (in schedule_block()).  */
854
855 static void ready_add (struct ready_list *, rtx_insn *, bool);
856 static rtx_insn *ready_remove_first (struct ready_list *);
857 static rtx_insn *ready_remove_first_dispatch (struct ready_list *ready);
858
859 static void queue_to_ready (struct ready_list *);
860 static int early_queue_to_ready (state_t, struct ready_list *);
861
862 /* The following functions are used to implement multi-pass scheduling
863    on the first cycle.  */
864 static rtx_insn *ready_remove (struct ready_list *, int);
865 static void ready_remove_insn (rtx);
866
867 static void fix_inter_tick (rtx, rtx);
868 static int fix_tick_ready (rtx_insn *);
869 static void change_queue_index (rtx_insn *, int);
870
871 /* The following functions are used to implement scheduling of data/control
872    speculative instructions.  */
873
874 static void extend_h_i_d (void);
875 static void init_h_i_d (rtx);
876 static int haifa_speculate_insn (rtx, ds_t, rtx *);
877 static void generate_recovery_code (rtx_insn *);
878 static void process_insn_forw_deps_be_in_spec (rtx, rtx, ds_t);
879 static void begin_speculative_block (rtx_insn *);
880 static void add_to_speculative_block (rtx);
881 static void init_before_recovery (basic_block *);
882 static void create_check_block_twin (rtx_insn *, bool);
883 static void fix_recovery_deps (basic_block);
884 static bool haifa_change_pattern (rtx, rtx);
885 static void dump_new_block_header (int, basic_block, rtx, rtx);
886 static void restore_bb_notes (basic_block);
887 static void fix_jump_move (rtx);
888 static void move_block_after_check (rtx);
889 static void move_succs (vec<edge, va_gc> **, basic_block);
890 static void sched_remove_insn (rtx_insn *);
891 static void clear_priorities (rtx, rtx_vec_t *);
892 static void calc_priorities (rtx_vec_t);
893 static void add_jump_dependencies (rtx, rtx);
894
895 #endif /* INSN_SCHEDULING */
896 \f
897 /* Point to state used for the current scheduling pass.  */
898 struct haifa_sched_info *current_sched_info;
899 \f
900 #ifndef INSN_SCHEDULING
901 void
902 schedule_insns (void)
903 {
904 }
905 #else
906
907 /* Do register pressure sensitive insn scheduling if the flag is set
908    up.  */
909 enum sched_pressure_algorithm sched_pressure;
910
911 /* Map regno -> its pressure class.  The map defined only when
912    SCHED_PRESSURE != SCHED_PRESSURE_NONE.  */
913 enum reg_class *sched_regno_pressure_class;
914
915 /* The current register pressure.  Only elements corresponding pressure
916    classes are defined.  */
917 static int curr_reg_pressure[N_REG_CLASSES];
918
919 /* Saved value of the previous array.  */
920 static int saved_reg_pressure[N_REG_CLASSES];
921
922 /* Register living at given scheduling point.  */
923 static bitmap curr_reg_live;
924
925 /* Saved value of the previous array.  */
926 static bitmap saved_reg_live;
927
928 /* Registers mentioned in the current region.  */
929 static bitmap region_ref_regs;
930
931 /* Initiate register pressure relative info for scheduling the current
932    region.  Currently it is only clearing register mentioned in the
933    current region.  */
934 void
935 sched_init_region_reg_pressure_info (void)
936 {
937   bitmap_clear (region_ref_regs);
938 }
939
940 /* PRESSURE[CL] describes the pressure on register class CL.  Update it
941    for the birth (if BIRTH_P) or death (if !BIRTH_P) of register REGNO.
942    LIVE tracks the set of live registers; if it is null, assume that
943    every birth or death is genuine.  */
944 static inline void
945 mark_regno_birth_or_death (bitmap live, int *pressure, int regno, bool birth_p)
946 {
947   enum reg_class pressure_class;
948
949   pressure_class = sched_regno_pressure_class[regno];
950   if (regno >= FIRST_PSEUDO_REGISTER)
951     {
952       if (pressure_class != NO_REGS)
953         {
954           if (birth_p)
955             {
956               if (!live || bitmap_set_bit (live, regno))
957                 pressure[pressure_class]
958                   += (ira_reg_class_max_nregs
959                       [pressure_class][PSEUDO_REGNO_MODE (regno)]);
960             }
961           else
962             {
963               if (!live || bitmap_clear_bit (live, regno))
964                 pressure[pressure_class]
965                   -= (ira_reg_class_max_nregs
966                       [pressure_class][PSEUDO_REGNO_MODE (regno)]);
967             }
968         }
969     }
970   else if (pressure_class != NO_REGS
971            && ! TEST_HARD_REG_BIT (ira_no_alloc_regs, regno))
972     {
973       if (birth_p)
974         {
975           if (!live || bitmap_set_bit (live, regno))
976             pressure[pressure_class]++;
977         }
978       else
979         {
980           if (!live || bitmap_clear_bit (live, regno))
981             pressure[pressure_class]--;
982         }
983     }
984 }
985
986 /* Initiate current register pressure related info from living
987    registers given by LIVE.  */
988 static void
989 initiate_reg_pressure_info (bitmap live)
990 {
991   int i;
992   unsigned int j;
993   bitmap_iterator bi;
994
995   for (i = 0; i < ira_pressure_classes_num; i++)
996     curr_reg_pressure[ira_pressure_classes[i]] = 0;
997   bitmap_clear (curr_reg_live);
998   EXECUTE_IF_SET_IN_BITMAP (live, 0, j, bi)
999     if (sched_pressure == SCHED_PRESSURE_MODEL
1000         || current_nr_blocks == 1
1001         || bitmap_bit_p (region_ref_regs, j))
1002       mark_regno_birth_or_death (curr_reg_live, curr_reg_pressure, j, true);
1003 }
1004
1005 /* Mark registers in X as mentioned in the current region.  */
1006 static void
1007 setup_ref_regs (rtx x)
1008 {
1009   int i, j, regno;
1010   const RTX_CODE code = GET_CODE (x);
1011   const char *fmt;
1012
1013   if (REG_P (x))
1014     {
1015       regno = REGNO (x);
1016       if (HARD_REGISTER_NUM_P (regno))
1017         bitmap_set_range (region_ref_regs, regno,
1018                           hard_regno_nregs[regno][GET_MODE (x)]);
1019       else
1020         bitmap_set_bit (region_ref_regs, REGNO (x));
1021       return;
1022     }
1023   fmt = GET_RTX_FORMAT (code);
1024   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1025     if (fmt[i] == 'e')
1026       setup_ref_regs (XEXP (x, i));
1027     else if (fmt[i] == 'E')
1028       {
1029         for (j = 0; j < XVECLEN (x, i); j++)
1030           setup_ref_regs (XVECEXP (x, i, j));
1031       }
1032 }
1033
1034 /* Initiate current register pressure related info at the start of
1035    basic block BB.  */
1036 static void
1037 initiate_bb_reg_pressure_info (basic_block bb)
1038 {
1039   unsigned int i ATTRIBUTE_UNUSED;
1040   rtx insn;
1041
1042   if (current_nr_blocks > 1)
1043     FOR_BB_INSNS (bb, insn)
1044       if (NONDEBUG_INSN_P (insn))
1045         setup_ref_regs (PATTERN (insn));
1046   initiate_reg_pressure_info (df_get_live_in (bb));
1047 #ifdef EH_RETURN_DATA_REGNO
1048   if (bb_has_eh_pred (bb))
1049     for (i = 0; ; ++i)
1050       {
1051         unsigned int regno = EH_RETURN_DATA_REGNO (i);
1052
1053         if (regno == INVALID_REGNUM)
1054           break;
1055         if (! bitmap_bit_p (df_get_live_in (bb), regno))
1056           mark_regno_birth_or_death (curr_reg_live, curr_reg_pressure,
1057                                      regno, true);
1058       }
1059 #endif
1060 }
1061
1062 /* Save current register pressure related info.  */
1063 static void
1064 save_reg_pressure (void)
1065 {
1066   int i;
1067
1068   for (i = 0; i < ira_pressure_classes_num; i++)
1069     saved_reg_pressure[ira_pressure_classes[i]]
1070       = curr_reg_pressure[ira_pressure_classes[i]];
1071   bitmap_copy (saved_reg_live, curr_reg_live);
1072 }
1073
1074 /* Restore saved register pressure related info.  */
1075 static void
1076 restore_reg_pressure (void)
1077 {
1078   int i;
1079
1080   for (i = 0; i < ira_pressure_classes_num; i++)
1081     curr_reg_pressure[ira_pressure_classes[i]]
1082       = saved_reg_pressure[ira_pressure_classes[i]];
1083   bitmap_copy (curr_reg_live, saved_reg_live);
1084 }
1085
1086 /* Return TRUE if the register is dying after its USE.  */
1087 static bool
1088 dying_use_p (struct reg_use_data *use)
1089 {
1090   struct reg_use_data *next;
1091
1092   for (next = use->next_regno_use; next != use; next = next->next_regno_use)
1093     if (NONDEBUG_INSN_P (next->insn)
1094         && QUEUE_INDEX (next->insn) != QUEUE_SCHEDULED)
1095       return false;
1096   return true;
1097 }
1098
1099 /* Print info about the current register pressure and its excess for
1100    each pressure class.  */
1101 static void
1102 print_curr_reg_pressure (void)
1103 {
1104   int i;
1105   enum reg_class cl;
1106
1107   fprintf (sched_dump, ";;\t");
1108   for (i = 0; i < ira_pressure_classes_num; i++)
1109     {
1110       cl = ira_pressure_classes[i];
1111       gcc_assert (curr_reg_pressure[cl] >= 0);
1112       fprintf (sched_dump, "  %s:%d(%d)", reg_class_names[cl],
1113                curr_reg_pressure[cl],
1114                curr_reg_pressure[cl] - ira_class_hard_regs_num[cl]);
1115     }
1116   fprintf (sched_dump, "\n");
1117 }
1118 \f
1119 /* Determine if INSN has a condition that is clobbered if a register
1120    in SET_REGS is modified.  */
1121 static bool
1122 cond_clobbered_p (rtx_insn *insn, HARD_REG_SET set_regs)
1123 {
1124   rtx pat = PATTERN (insn);
1125   gcc_assert (GET_CODE (pat) == COND_EXEC);
1126   if (TEST_HARD_REG_BIT (set_regs, REGNO (XEXP (COND_EXEC_TEST (pat), 0))))
1127     {
1128       sd_iterator_def sd_it;
1129       dep_t dep;
1130       haifa_change_pattern (insn, ORIG_PAT (insn));
1131       FOR_EACH_DEP (insn, SD_LIST_BACK, sd_it, dep)
1132         DEP_STATUS (dep) &= ~DEP_CANCELLED;
1133       TODO_SPEC (insn) = HARD_DEP;
1134       if (sched_verbose >= 2)
1135         fprintf (sched_dump,
1136                  ";;\t\tdequeue insn %s because of clobbered condition\n",
1137                  (*current_sched_info->print_insn) (insn, 0));
1138       return true;
1139     }
1140
1141   return false;
1142 }
1143
1144 /* This function should be called after modifying the pattern of INSN,
1145    to update scheduler data structures as needed.  */
1146 static void
1147 update_insn_after_change (rtx insn)
1148 {
1149   sd_iterator_def sd_it;
1150   dep_t dep;
1151
1152   dfa_clear_single_insn_cache (insn);
1153
1154   sd_it = sd_iterator_start (insn,
1155                              SD_LIST_FORW | SD_LIST_BACK | SD_LIST_RES_BACK);
1156   while (sd_iterator_cond (&sd_it, &dep))
1157     {
1158       DEP_COST (dep) = UNKNOWN_DEP_COST;
1159       sd_iterator_next (&sd_it);
1160     }
1161
1162   /* Invalidate INSN_COST, so it'll be recalculated.  */
1163   INSN_COST (insn) = -1;
1164   /* Invalidate INSN_TICK, so it'll be recalculated.  */
1165   INSN_TICK (insn) = INVALID_TICK;
1166 }
1167
1168
1169 /* Two VECs, one to hold dependencies for which pattern replacements
1170    need to be applied or restored at the start of the next cycle, and
1171    another to hold an integer that is either one, to apply the
1172    corresponding replacement, or zero to restore it.  */
1173 static vec<dep_t> next_cycle_replace_deps;
1174 static vec<int> next_cycle_apply;
1175
1176 static void apply_replacement (dep_t, bool);
1177 static void restore_pattern (dep_t, bool);
1178
1179 /* Look at the remaining dependencies for insn NEXT, and compute and return
1180    the TODO_SPEC value we should use for it.  This is called after one of
1181    NEXT's dependencies has been resolved.
1182    We also perform pattern replacements for predication, and for broken
1183    replacement dependencies.  The latter is only done if FOR_BACKTRACK is
1184    false.  */
1185
1186 static ds_t
1187 recompute_todo_spec (rtx next, bool for_backtrack)
1188 {
1189   ds_t new_ds;
1190   sd_iterator_def sd_it;
1191   dep_t dep, modify_dep = NULL;
1192   int n_spec = 0;
1193   int n_control = 0;
1194   int n_replace = 0;
1195   bool first_p = true;
1196
1197   if (sd_lists_empty_p (next, SD_LIST_BACK))
1198     /* NEXT has all its dependencies resolved.  */
1199     return 0;
1200
1201   if (!sd_lists_empty_p (next, SD_LIST_HARD_BACK))
1202     return HARD_DEP;
1203
1204   /* Now we've got NEXT with speculative deps only.
1205      1. Look at the deps to see what we have to do.
1206      2. Check if we can do 'todo'.  */
1207   new_ds = 0;
1208
1209   FOR_EACH_DEP (next, SD_LIST_BACK, sd_it, dep)
1210     {
1211       rtx_insn *pro = DEP_PRO (dep);
1212       ds_t ds = DEP_STATUS (dep) & SPECULATIVE;
1213
1214       if (DEBUG_INSN_P (pro) && !DEBUG_INSN_P (next))
1215         continue;
1216
1217       if (ds)
1218         {
1219           n_spec++;
1220           if (first_p)
1221             {
1222               first_p = false;
1223
1224               new_ds = ds;
1225             }
1226           else
1227             new_ds = ds_merge (new_ds, ds);
1228         }
1229       else if (DEP_TYPE (dep) == REG_DEP_CONTROL)
1230         {
1231           if (QUEUE_INDEX (pro) != QUEUE_SCHEDULED)
1232             {
1233               n_control++;
1234               modify_dep = dep;
1235             }
1236           DEP_STATUS (dep) &= ~DEP_CANCELLED;
1237         }
1238       else if (DEP_REPLACE (dep) != NULL)
1239         {
1240           if (QUEUE_INDEX (pro) != QUEUE_SCHEDULED)
1241             {
1242               n_replace++;
1243               modify_dep = dep;
1244             }
1245           DEP_STATUS (dep) &= ~DEP_CANCELLED;
1246         }
1247     }
1248
1249   if (n_replace > 0 && n_control == 0 && n_spec == 0)
1250     {
1251       if (!dbg_cnt (sched_breakdep))
1252         return HARD_DEP;
1253       FOR_EACH_DEP (next, SD_LIST_BACK, sd_it, dep)
1254         {
1255           struct dep_replacement *desc = DEP_REPLACE (dep);
1256           if (desc != NULL)
1257             {
1258               if (desc->insn == next && !for_backtrack)
1259                 {
1260                   gcc_assert (n_replace == 1);
1261                   apply_replacement (dep, true);
1262                 }
1263               DEP_STATUS (dep) |= DEP_CANCELLED;
1264             }
1265         }
1266       return 0;
1267     }
1268   
1269   else if (n_control == 1 && n_replace == 0 && n_spec == 0)
1270     {
1271       rtx pro, other, new_pat;
1272       rtx cond = NULL_RTX;
1273       bool success;
1274       rtx_insn *prev = NULL;
1275       int i;
1276       unsigned regno;
1277   
1278       if ((current_sched_info->flags & DO_PREDICATION) == 0
1279           || (ORIG_PAT (next) != NULL_RTX
1280               && PREDICATED_PAT (next) == NULL_RTX))
1281         return HARD_DEP;
1282
1283       pro = DEP_PRO (modify_dep);
1284       other = real_insn_for_shadow (pro);
1285       if (other != NULL_RTX)
1286         pro = other;
1287
1288       cond = sched_get_reverse_condition_uncached (pro);
1289       regno = REGNO (XEXP (cond, 0));
1290
1291       /* Find the last scheduled insn that modifies the condition register.
1292          We can stop looking once we find the insn we depend on through the
1293          REG_DEP_CONTROL; if the condition register isn't modified after it,
1294          we know that it still has the right value.  */
1295       if (QUEUE_INDEX (pro) == QUEUE_SCHEDULED)
1296         FOR_EACH_VEC_ELT_REVERSE (scheduled_insns, i, prev)
1297           {
1298             HARD_REG_SET t;
1299
1300             find_all_hard_reg_sets (prev, &t, true);
1301             if (TEST_HARD_REG_BIT (t, regno))
1302               return HARD_DEP;
1303             if (prev == pro)
1304               break;
1305           }
1306       if (ORIG_PAT (next) == NULL_RTX)
1307         {
1308           ORIG_PAT (next) = PATTERN (next);
1309
1310           new_pat = gen_rtx_COND_EXEC (VOIDmode, cond, PATTERN (next));
1311           success = haifa_change_pattern (next, new_pat);
1312           if (!success)
1313             return HARD_DEP;
1314           PREDICATED_PAT (next) = new_pat;
1315         }
1316       else if (PATTERN (next) != PREDICATED_PAT (next))
1317         {
1318           bool success = haifa_change_pattern (next,
1319                                                PREDICATED_PAT (next));
1320           gcc_assert (success);
1321         }
1322       DEP_STATUS (modify_dep) |= DEP_CANCELLED;
1323       return DEP_CONTROL;
1324     }
1325
1326   if (PREDICATED_PAT (next) != NULL_RTX)
1327     {
1328       int tick = INSN_TICK (next);
1329       bool success = haifa_change_pattern (next,
1330                                            ORIG_PAT (next));
1331       INSN_TICK (next) = tick;
1332       gcc_assert (success);
1333     }
1334
1335   /* We can't handle the case where there are both speculative and control
1336      dependencies, so we return HARD_DEP in such a case.  Also fail if
1337      we have speculative dependencies with not enough points, or more than
1338      one control dependency.  */
1339   if ((n_spec > 0 && (n_control > 0 || n_replace > 0))
1340       || (n_spec > 0
1341           /* Too few points?  */
1342           && ds_weak (new_ds) < spec_info->data_weakness_cutoff)
1343       || n_control > 0
1344       || n_replace > 0)
1345     return HARD_DEP;
1346
1347   return new_ds;
1348 }
1349 \f
1350 /* Pointer to the last instruction scheduled.  */
1351 static rtx_insn *last_scheduled_insn;
1352
1353 /* Pointer to the last nondebug instruction scheduled within the
1354    block, or the prev_head of the scheduling block.  Used by
1355    rank_for_schedule, so that insns independent of the last scheduled
1356    insn will be preferred over dependent instructions.  */
1357 static rtx last_nondebug_scheduled_insn;
1358
1359 /* Pointer that iterates through the list of unscheduled insns if we
1360    have a dbg_cnt enabled.  It always points at an insn prior to the
1361    first unscheduled one.  */
1362 static rtx_insn *nonscheduled_insns_begin;
1363
1364 /* Compute cost of executing INSN.
1365    This is the number of cycles between instruction issue and
1366    instruction results.  */
1367 int
1368 insn_cost (rtx insn)
1369 {
1370   int cost;
1371
1372   if (sel_sched_p ())
1373     {
1374       if (recog_memoized (insn) < 0)
1375         return 0;
1376
1377       cost = insn_default_latency (insn);
1378       if (cost < 0)
1379         cost = 0;
1380
1381       return cost;
1382     }
1383
1384   cost = INSN_COST (insn);
1385
1386   if (cost < 0)
1387     {
1388       /* A USE insn, or something else we don't need to
1389          understand.  We can't pass these directly to
1390          result_ready_cost or insn_default_latency because it will
1391          trigger a fatal error for unrecognizable insns.  */
1392       if (recog_memoized (insn) < 0)
1393         {
1394           INSN_COST (insn) = 0;
1395           return 0;
1396         }
1397       else
1398         {
1399           cost = insn_default_latency (insn);
1400           if (cost < 0)
1401             cost = 0;
1402
1403           INSN_COST (insn) = cost;
1404         }
1405     }
1406
1407   return cost;
1408 }
1409
1410 /* Compute cost of dependence LINK.
1411    This is the number of cycles between instruction issue and
1412    instruction results.
1413    ??? We also use this function to call recog_memoized on all insns.  */
1414 int
1415 dep_cost_1 (dep_t link, dw_t dw)
1416 {
1417   rtx_insn *insn = DEP_PRO (link);
1418   rtx_insn *used = DEP_CON (link);
1419   int cost;
1420
1421   if (DEP_COST (link) != UNKNOWN_DEP_COST)
1422     return DEP_COST (link);
1423
1424   if (delay_htab)
1425     {
1426       struct delay_pair *delay_entry;
1427       delay_entry
1428         = delay_htab_i2->find_with_hash (used, htab_hash_pointer (used));
1429       if (delay_entry)
1430         {
1431           if (delay_entry->i1 == insn)
1432             {
1433               DEP_COST (link) = pair_delay (delay_entry);
1434               return DEP_COST (link);
1435             }
1436         }
1437     }
1438
1439   /* A USE insn should never require the value used to be computed.
1440      This allows the computation of a function's result and parameter
1441      values to overlap the return and call.  We don't care about the
1442      dependence cost when only decreasing register pressure.  */
1443   if (recog_memoized (used) < 0)
1444     {
1445       cost = 0;
1446       recog_memoized (insn);
1447     }
1448   else
1449     {
1450       enum reg_note dep_type = DEP_TYPE (link);
1451
1452       cost = insn_cost (insn);
1453
1454       if (INSN_CODE (insn) >= 0)
1455         {
1456           if (dep_type == REG_DEP_ANTI)
1457             cost = 0;
1458           else if (dep_type == REG_DEP_OUTPUT)
1459             {
1460               cost = (insn_default_latency (insn)
1461                       - insn_default_latency (used));
1462               if (cost <= 0)
1463                 cost = 1;
1464             }
1465           else if (bypass_p (insn))
1466             cost = insn_latency (insn, used);
1467         }
1468
1469
1470       if (targetm.sched.adjust_cost_2)
1471         cost = targetm.sched.adjust_cost_2 (used, (int) dep_type, insn, cost,
1472                                             dw);
1473       else if (targetm.sched.adjust_cost != NULL)
1474         {
1475           /* This variable is used for backward compatibility with the
1476              targets.  */
1477           rtx dep_cost_rtx_link = alloc_INSN_LIST (NULL_RTX, NULL_RTX);
1478
1479           /* Make it self-cycled, so that if some tries to walk over this
1480              incomplete list he/she will be caught in an endless loop.  */
1481           XEXP (dep_cost_rtx_link, 1) = dep_cost_rtx_link;
1482
1483           /* Targets use only REG_NOTE_KIND of the link.  */
1484           PUT_REG_NOTE_KIND (dep_cost_rtx_link, DEP_TYPE (link));
1485
1486           cost = targetm.sched.adjust_cost (used, dep_cost_rtx_link,
1487                                             insn, cost);
1488
1489           free_INSN_LIST_node (dep_cost_rtx_link);
1490         }
1491
1492       if (cost < 0)
1493         cost = 0;
1494     }
1495
1496   DEP_COST (link) = cost;
1497   return cost;
1498 }
1499
1500 /* Compute cost of dependence LINK.
1501    This is the number of cycles between instruction issue and
1502    instruction results.  */
1503 int
1504 dep_cost (dep_t link)
1505 {
1506   return dep_cost_1 (link, 0);
1507 }
1508
1509 /* Use this sel-sched.c friendly function in reorder2 instead of increasing
1510    INSN_PRIORITY explicitly.  */
1511 void
1512 increase_insn_priority (rtx insn, int amount)
1513 {
1514   if (!sel_sched_p ())
1515     {
1516       /* We're dealing with haifa-sched.c INSN_PRIORITY.  */
1517       if (INSN_PRIORITY_KNOWN (insn))
1518           INSN_PRIORITY (insn) += amount;
1519     }
1520   else
1521     {
1522       /* In sel-sched.c INSN_PRIORITY is not kept up to date.
1523          Use EXPR_PRIORITY instead. */
1524       sel_add_to_insn_priority (insn, amount);
1525     }
1526 }
1527
1528 /* Return 'true' if DEP should be included in priority calculations.  */
1529 static bool
1530 contributes_to_priority_p (dep_t dep)
1531 {
1532   if (DEBUG_INSN_P (DEP_CON (dep))
1533       || DEBUG_INSN_P (DEP_PRO (dep)))
1534     return false;
1535
1536   /* Critical path is meaningful in block boundaries only.  */
1537   if (!current_sched_info->contributes_to_priority (DEP_CON (dep),
1538                                                     DEP_PRO (dep)))
1539     return false;
1540
1541   if (DEP_REPLACE (dep) != NULL)
1542     return false;
1543
1544   /* If flag COUNT_SPEC_IN_CRITICAL_PATH is set,
1545      then speculative instructions will less likely be
1546      scheduled.  That is because the priority of
1547      their producers will increase, and, thus, the
1548      producers will more likely be scheduled, thus,
1549      resolving the dependence.  */
1550   if (sched_deps_info->generate_spec_deps
1551       && !(spec_info->flags & COUNT_SPEC_IN_CRITICAL_PATH)
1552       && (DEP_STATUS (dep) & SPECULATIVE))
1553     return false;
1554
1555   return true;
1556 }
1557
1558 /* Compute the number of nondebug deps in list LIST for INSN.  */
1559
1560 static int
1561 dep_list_size (rtx insn, sd_list_types_def list)
1562 {
1563   sd_iterator_def sd_it;
1564   dep_t dep;
1565   int dbgcount = 0, nodbgcount = 0;
1566
1567   if (!MAY_HAVE_DEBUG_INSNS)
1568     return sd_lists_size (insn, list);
1569
1570   FOR_EACH_DEP (insn, list, sd_it, dep)
1571     {
1572       if (DEBUG_INSN_P (DEP_CON (dep)))
1573         dbgcount++;
1574       else if (!DEBUG_INSN_P (DEP_PRO (dep)))
1575         nodbgcount++;
1576     }
1577
1578   gcc_assert (dbgcount + nodbgcount == sd_lists_size (insn, list));
1579
1580   return nodbgcount;
1581 }
1582
1583 /* Compute the priority number for INSN.  */
1584 static int
1585 priority (rtx insn)
1586 {
1587   if (! INSN_P (insn))
1588     return 0;
1589
1590   /* We should not be interested in priority of an already scheduled insn.  */
1591   gcc_assert (QUEUE_INDEX (insn) != QUEUE_SCHEDULED);
1592
1593   if (!INSN_PRIORITY_KNOWN (insn))
1594     {
1595       int this_priority = -1;
1596
1597       if (dep_list_size (insn, SD_LIST_FORW) == 0)
1598         /* ??? We should set INSN_PRIORITY to insn_cost when and insn has
1599            some forward deps but all of them are ignored by
1600            contributes_to_priority hook.  At the moment we set priority of
1601            such insn to 0.  */
1602         this_priority = insn_cost (insn);
1603       else
1604         {
1605           rtx prev_first, twin;
1606           basic_block rec;
1607
1608           /* For recovery check instructions we calculate priority slightly
1609              different than that of normal instructions.  Instead of walking
1610              through INSN_FORW_DEPS (check) list, we walk through
1611              INSN_FORW_DEPS list of each instruction in the corresponding
1612              recovery block.  */
1613
1614           /* Selective scheduling does not define RECOVERY_BLOCK macro.  */
1615           rec = sel_sched_p () ? NULL : RECOVERY_BLOCK (insn);
1616           if (!rec || rec == EXIT_BLOCK_PTR_FOR_FN (cfun))
1617             {
1618               prev_first = PREV_INSN (insn);
1619               twin = insn;
1620             }
1621           else
1622             {
1623               prev_first = NEXT_INSN (BB_HEAD (rec));
1624               twin = PREV_INSN (BB_END (rec));
1625             }
1626
1627           do
1628             {
1629               sd_iterator_def sd_it;
1630               dep_t dep;
1631
1632               FOR_EACH_DEP (twin, SD_LIST_FORW, sd_it, dep)
1633                 {
1634                   rtx next;
1635                   int next_priority;
1636
1637                   next = DEP_CON (dep);
1638
1639                   if (BLOCK_FOR_INSN (next) != rec)
1640                     {
1641                       int cost;
1642
1643                       if (!contributes_to_priority_p (dep))
1644                         continue;
1645
1646                       if (twin == insn)
1647                         cost = dep_cost (dep);
1648                       else
1649                         {
1650                           struct _dep _dep1, *dep1 = &_dep1;
1651
1652                           init_dep (dep1, insn, next, REG_DEP_ANTI);
1653
1654                           cost = dep_cost (dep1);
1655                         }
1656
1657                       next_priority = cost + priority (next);
1658
1659                       if (next_priority > this_priority)
1660                         this_priority = next_priority;
1661                     }
1662                 }
1663
1664               twin = PREV_INSN (twin);
1665             }
1666           while (twin != prev_first);
1667         }
1668
1669       if (this_priority < 0)
1670         {
1671           gcc_assert (this_priority == -1);
1672
1673           this_priority = insn_cost (insn);
1674         }
1675
1676       INSN_PRIORITY (insn) = this_priority;
1677       INSN_PRIORITY_STATUS (insn) = 1;
1678     }
1679
1680   return INSN_PRIORITY (insn);
1681 }
1682 \f
1683 /* Macros and functions for keeping the priority queue sorted, and
1684    dealing with queuing and dequeuing of instructions.  */
1685
1686 /* For each pressure class CL, set DEATH[CL] to the number of registers
1687    in that class that die in INSN.  */
1688
1689 static void
1690 calculate_reg_deaths (rtx insn, int *death)
1691 {
1692   int i;
1693   struct reg_use_data *use;
1694
1695   for (i = 0; i < ira_pressure_classes_num; i++)
1696     death[ira_pressure_classes[i]] = 0;
1697   for (use = INSN_REG_USE_LIST (insn); use != NULL; use = use->next_insn_use)
1698     if (dying_use_p (use))
1699       mark_regno_birth_or_death (0, death, use->regno, true);
1700 }
1701
1702 /* Setup info about the current register pressure impact of scheduling
1703    INSN at the current scheduling point.  */
1704 static void
1705 setup_insn_reg_pressure_info (rtx insn)
1706 {
1707   int i, change, before, after, hard_regno;
1708   int excess_cost_change;
1709   enum machine_mode mode;
1710   enum reg_class cl;
1711   struct reg_pressure_data *pressure_info;
1712   int *max_reg_pressure;
1713   static int death[N_REG_CLASSES];
1714
1715   gcc_checking_assert (!DEBUG_INSN_P (insn));
1716
1717   excess_cost_change = 0;
1718   calculate_reg_deaths (insn, death);
1719   pressure_info = INSN_REG_PRESSURE (insn);
1720   max_reg_pressure = INSN_MAX_REG_PRESSURE (insn);
1721   gcc_assert (pressure_info != NULL && max_reg_pressure != NULL);
1722   for (i = 0; i < ira_pressure_classes_num; i++)
1723     {
1724       cl = ira_pressure_classes[i];
1725       gcc_assert (curr_reg_pressure[cl] >= 0);
1726       change = (int) pressure_info[i].set_increase - death[cl];
1727       before = MAX (0, max_reg_pressure[i] - ira_class_hard_regs_num[cl]);
1728       after = MAX (0, max_reg_pressure[i] + change
1729                    - ira_class_hard_regs_num[cl]);
1730       hard_regno = ira_class_hard_regs[cl][0];
1731       gcc_assert (hard_regno >= 0);
1732       mode = reg_raw_mode[hard_regno];
1733       excess_cost_change += ((after - before)
1734                              * (ira_memory_move_cost[mode][cl][0]
1735                                 + ira_memory_move_cost[mode][cl][1]));
1736     }
1737   INSN_REG_PRESSURE_EXCESS_COST_CHANGE (insn) = excess_cost_change;
1738 }
1739 \f
1740 /* This is the first page of code related to SCHED_PRESSURE_MODEL.
1741    It tries to make the scheduler take register pressure into account
1742    without introducing too many unnecessary stalls.  It hooks into the
1743    main scheduling algorithm at several points:
1744
1745     - Before scheduling starts, model_start_schedule constructs a
1746       "model schedule" for the current block.  This model schedule is
1747       chosen solely to keep register pressure down.  It does not take the
1748       target's pipeline or the original instruction order into account,
1749       except as a tie-breaker.  It also doesn't work to a particular
1750       pressure limit.
1751
1752       This model schedule gives us an idea of what pressure can be
1753       achieved for the block and gives us an example of a schedule that
1754       keeps to that pressure.  It also makes the final schedule less
1755       dependent on the original instruction order.  This is important
1756       because the original order can either be "wide" (many values live
1757       at once, such as in user-scheduled code) or "narrow" (few values
1758       live at once, such as after loop unrolling, where several
1759       iterations are executed sequentially).
1760
1761       We do not apply this model schedule to the rtx stream.  We simply
1762       record it in model_schedule.  We also compute the maximum pressure,
1763       MP, that was seen during this schedule.
1764
1765     - Instructions are added to the ready queue even if they require
1766       a stall.  The length of the stall is instead computed as:
1767
1768          MAX (INSN_TICK (INSN) - clock_var, 0)
1769
1770       (= insn_delay).  This allows rank_for_schedule to choose between
1771       introducing a deliberate stall or increasing pressure.
1772
1773     - Before sorting the ready queue, model_set_excess_costs assigns
1774       a pressure-based cost to each ready instruction in the queue.
1775       This is the instruction's INSN_REG_PRESSURE_EXCESS_COST_CHANGE
1776       (ECC for short) and is effectively measured in cycles.
1777
1778     - rank_for_schedule ranks instructions based on:
1779
1780         ECC (insn) + insn_delay (insn)
1781
1782       then as:
1783
1784         insn_delay (insn)
1785
1786       So, for example, an instruction X1 with an ECC of 1 that can issue
1787       now will win over an instruction X0 with an ECC of zero that would
1788       introduce a stall of one cycle.  However, an instruction X2 with an
1789       ECC of 2 that can issue now will lose to both X0 and X1.
1790
1791     - When an instruction is scheduled, model_recompute updates the model
1792       schedule with the new pressures (some of which might now exceed the
1793       original maximum pressure MP).  model_update_limit_points then searches
1794       for the new point of maximum pressure, if not already known.  */
1795
1796 /* Used to separate high-verbosity debug information for SCHED_PRESSURE_MODEL
1797    from surrounding debug information.  */
1798 #define MODEL_BAR \
1799   ";;\t\t+------------------------------------------------------\n"
1800
1801 /* Information about the pressure on a particular register class at a
1802    particular point of the model schedule.  */
1803 struct model_pressure_data {
1804   /* The pressure at this point of the model schedule, or -1 if the
1805      point is associated with an instruction that has already been
1806      scheduled.  */
1807   int ref_pressure;
1808
1809   /* The maximum pressure during or after this point of the model schedule.  */
1810   int max_pressure;
1811 };
1812
1813 /* Per-instruction information that is used while building the model
1814    schedule.  Here, "schedule" refers to the model schedule rather
1815    than the main schedule.  */
1816 struct model_insn_info {
1817   /* The instruction itself.  */
1818   rtx insn;
1819
1820   /* If this instruction is in model_worklist, these fields link to the
1821      previous (higher-priority) and next (lower-priority) instructions
1822      in the list.  */
1823   struct model_insn_info *prev;
1824   struct model_insn_info *next;
1825
1826   /* While constructing the schedule, QUEUE_INDEX describes whether an
1827      instruction has already been added to the schedule (QUEUE_SCHEDULED),
1828      is in model_worklist (QUEUE_READY), or neither (QUEUE_NOWHERE).
1829      old_queue records the value that QUEUE_INDEX had before scheduling
1830      started, so that we can restore it once the schedule is complete.  */
1831   int old_queue;
1832
1833   /* The relative importance of an unscheduled instruction.  Higher
1834      values indicate greater importance.  */
1835   unsigned int model_priority;
1836
1837   /* The length of the longest path of satisfied true dependencies
1838      that leads to this instruction.  */
1839   unsigned int depth;
1840
1841   /* The length of the longest path of dependencies of any kind
1842      that leads from this instruction.  */
1843   unsigned int alap;
1844
1845   /* The number of predecessor nodes that must still be scheduled.  */
1846   int unscheduled_preds;
1847 };
1848
1849 /* Information about the pressure limit for a particular register class.
1850    This structure is used when applying a model schedule to the main
1851    schedule.  */
1852 struct model_pressure_limit {
1853   /* The maximum register pressure seen in the original model schedule.  */
1854   int orig_pressure;
1855
1856   /* The maximum register pressure seen in the current model schedule
1857      (which excludes instructions that have already been scheduled).  */
1858   int pressure;
1859
1860   /* The point of the current model schedule at which PRESSURE is first
1861      reached.  It is set to -1 if the value needs to be recomputed.  */
1862   int point;
1863 };
1864
1865 /* Describes a particular way of measuring register pressure.  */
1866 struct model_pressure_group {
1867   /* Index PCI describes the maximum pressure on ira_pressure_classes[PCI].  */
1868   struct model_pressure_limit limits[N_REG_CLASSES];
1869
1870   /* Index (POINT * ira_num_pressure_classes + PCI) describes the pressure
1871      on register class ira_pressure_classes[PCI] at point POINT of the
1872      current model schedule.  A POINT of model_num_insns describes the
1873      pressure at the end of the schedule.  */
1874   struct model_pressure_data *model;
1875 };
1876
1877 /* Index POINT gives the instruction at point POINT of the model schedule.
1878    This array doesn't change during main scheduling.  */
1879 static vec<rtx> model_schedule;
1880
1881 /* The list of instructions in the model worklist, sorted in order of
1882    decreasing priority.  */
1883 static struct model_insn_info *model_worklist;
1884
1885 /* Index I describes the instruction with INSN_LUID I.  */
1886 static struct model_insn_info *model_insns;
1887
1888 /* The number of instructions in the model schedule.  */
1889 static int model_num_insns;
1890
1891 /* The index of the first instruction in model_schedule that hasn't yet been
1892    added to the main schedule, or model_num_insns if all of them have.  */
1893 static int model_curr_point;
1894
1895 /* Describes the pressure before each instruction in the model schedule.  */
1896 static struct model_pressure_group model_before_pressure;
1897
1898 /* The first unused model_priority value (as used in model_insn_info).  */
1899 static unsigned int model_next_priority;
1900
1901
1902 /* The model_pressure_data for ira_pressure_classes[PCI] in GROUP
1903    at point POINT of the model schedule.  */
1904 #define MODEL_PRESSURE_DATA(GROUP, POINT, PCI) \
1905   (&(GROUP)->model[(POINT) * ira_pressure_classes_num + (PCI)])
1906
1907 /* The maximum pressure on ira_pressure_classes[PCI] in GROUP at or
1908    after point POINT of the model schedule.  */
1909 #define MODEL_MAX_PRESSURE(GROUP, POINT, PCI) \
1910   (MODEL_PRESSURE_DATA (GROUP, POINT, PCI)->max_pressure)
1911
1912 /* The pressure on ira_pressure_classes[PCI] in GROUP at point POINT
1913    of the model schedule.  */
1914 #define MODEL_REF_PRESSURE(GROUP, POINT, PCI) \
1915   (MODEL_PRESSURE_DATA (GROUP, POINT, PCI)->ref_pressure)
1916
1917 /* Information about INSN that is used when creating the model schedule.  */
1918 #define MODEL_INSN_INFO(INSN) \
1919   (&model_insns[INSN_LUID (INSN)])
1920
1921 /* The instruction at point POINT of the model schedule.  */
1922 #define MODEL_INSN(POINT) \
1923   (model_schedule[POINT])
1924
1925
1926 /* Return INSN's index in the model schedule, or model_num_insns if it
1927    doesn't belong to that schedule.  */
1928
1929 static int
1930 model_index (rtx insn)
1931 {
1932   if (INSN_MODEL_INDEX (insn) == 0)
1933     return model_num_insns;
1934   return INSN_MODEL_INDEX (insn) - 1;
1935 }
1936
1937 /* Make sure that GROUP->limits is up-to-date for the current point
1938    of the model schedule.  */
1939
1940 static void
1941 model_update_limit_points_in_group (struct model_pressure_group *group)
1942 {
1943   int pci, max_pressure, point;
1944
1945   for (pci = 0; pci < ira_pressure_classes_num; pci++)
1946     {
1947       /* We may have passed the final point at which the pressure in
1948          group->limits[pci].pressure was reached.  Update the limit if so.  */
1949       max_pressure = MODEL_MAX_PRESSURE (group, model_curr_point, pci);
1950       group->limits[pci].pressure = max_pressure;
1951
1952       /* Find the point at which MAX_PRESSURE is first reached.  We need
1953          to search in three cases:
1954
1955          - We've already moved past the previous pressure point.
1956            In this case we search forward from model_curr_point.
1957
1958          - We scheduled the previous point of maximum pressure ahead of
1959            its position in the model schedule, but doing so didn't bring
1960            the pressure point earlier.  In this case we search forward
1961            from that previous pressure point.
1962
1963          - Scheduling an instruction early caused the maximum pressure
1964            to decrease.  In this case we will have set the pressure
1965            point to -1, and we search forward from model_curr_point.  */
1966       point = MAX (group->limits[pci].point, model_curr_point);
1967       while (point < model_num_insns
1968              && MODEL_REF_PRESSURE (group, point, pci) < max_pressure)
1969         point++;
1970       group->limits[pci].point = point;
1971
1972       gcc_assert (MODEL_REF_PRESSURE (group, point, pci) == max_pressure);
1973       gcc_assert (MODEL_MAX_PRESSURE (group, point, pci) == max_pressure);
1974     }
1975 }
1976
1977 /* Make sure that all register-pressure limits are up-to-date for the
1978    current position in the model schedule.  */
1979
1980 static void
1981 model_update_limit_points (void)
1982 {
1983   model_update_limit_points_in_group (&model_before_pressure);
1984 }
1985
1986 /* Return the model_index of the last unscheduled use in chain USE
1987    outside of USE's instruction.  Return -1 if there are no other uses,
1988    or model_num_insns if the register is live at the end of the block.  */
1989
1990 static int
1991 model_last_use_except (struct reg_use_data *use)
1992 {
1993   struct reg_use_data *next;
1994   int last, index;
1995
1996   last = -1;
1997   for (next = use->next_regno_use; next != use; next = next->next_regno_use)
1998     if (NONDEBUG_INSN_P (next->insn)
1999         && QUEUE_INDEX (next->insn) != QUEUE_SCHEDULED)
2000       {
2001         index = model_index (next->insn);
2002         if (index == model_num_insns)
2003           return model_num_insns;
2004         if (last < index)
2005           last = index;
2006       }
2007   return last;
2008 }
2009
2010 /* An instruction with model_index POINT has just been scheduled, and it
2011    adds DELTA to the pressure on ira_pressure_classes[PCI] after POINT - 1.
2012    Update MODEL_REF_PRESSURE (GROUP, POINT, PCI) and
2013    MODEL_MAX_PRESSURE (GROUP, POINT, PCI) accordingly.  */
2014
2015 static void
2016 model_start_update_pressure (struct model_pressure_group *group,
2017                              int point, int pci, int delta)
2018 {
2019   int next_max_pressure;
2020
2021   if (point == model_num_insns)
2022     {
2023       /* The instruction wasn't part of the model schedule; it was moved
2024          from a different block.  Update the pressure for the end of
2025          the model schedule.  */
2026       MODEL_REF_PRESSURE (group, point, pci) += delta;
2027       MODEL_MAX_PRESSURE (group, point, pci) += delta;
2028     }
2029   else
2030     {
2031       /* Record that this instruction has been scheduled.  Nothing now
2032          changes between POINT and POINT + 1, so get the maximum pressure
2033          from the latter.  If the maximum pressure decreases, the new
2034          pressure point may be before POINT.  */
2035       MODEL_REF_PRESSURE (group, point, pci) = -1;
2036       next_max_pressure = MODEL_MAX_PRESSURE (group, point + 1, pci);
2037       if (MODEL_MAX_PRESSURE (group, point, pci) > next_max_pressure)
2038         {
2039           MODEL_MAX_PRESSURE (group, point, pci) = next_max_pressure;
2040           if (group->limits[pci].point == point)
2041             group->limits[pci].point = -1;
2042         }
2043     }
2044 }
2045
2046 /* Record that scheduling a later instruction has changed the pressure
2047    at point POINT of the model schedule by DELTA (which might be 0).
2048    Update GROUP accordingly.  Return nonzero if these changes might
2049    trigger changes to previous points as well.  */
2050
2051 static int
2052 model_update_pressure (struct model_pressure_group *group,
2053                        int point, int pci, int delta)
2054 {
2055   int ref_pressure, max_pressure, next_max_pressure;
2056
2057   /* If POINT hasn't yet been scheduled, update its pressure.  */
2058   ref_pressure = MODEL_REF_PRESSURE (group, point, pci);
2059   if (ref_pressure >= 0 && delta != 0)
2060     {
2061       ref_pressure += delta;
2062       MODEL_REF_PRESSURE (group, point, pci) = ref_pressure;
2063
2064       /* Check whether the maximum pressure in the overall schedule
2065          has increased.  (This means that the MODEL_MAX_PRESSURE of
2066          every point <= POINT will need to increae too; see below.)  */
2067       if (group->limits[pci].pressure < ref_pressure)
2068         group->limits[pci].pressure = ref_pressure;
2069
2070       /* If we are at maximum pressure, and the maximum pressure
2071          point was previously unknown or later than POINT,
2072          bring it forward.  */
2073       if (group->limits[pci].pressure == ref_pressure
2074           && !IN_RANGE (group->limits[pci].point, 0, point))
2075         group->limits[pci].point = point;
2076
2077       /* If POINT used to be the point of maximum pressure, but isn't
2078          any longer, we need to recalculate it using a forward walk.  */
2079       if (group->limits[pci].pressure > ref_pressure
2080           && group->limits[pci].point == point)
2081         group->limits[pci].point = -1;
2082     }
2083
2084   /* Update the maximum pressure at POINT.  Changes here might also
2085      affect the maximum pressure at POINT - 1.  */
2086   next_max_pressure = MODEL_MAX_PRESSURE (group, point + 1, pci);
2087   max_pressure = MAX (ref_pressure, next_max_pressure);
2088   if (MODEL_MAX_PRESSURE (group, point, pci) != max_pressure)
2089     {
2090       MODEL_MAX_PRESSURE (group, point, pci) = max_pressure;
2091       return 1;
2092     }
2093   return 0;
2094 }
2095
2096 /* INSN has just been scheduled.  Update the model schedule accordingly.  */
2097
2098 static void
2099 model_recompute (rtx insn)
2100 {
2101   struct {
2102     int last_use;
2103     int regno;
2104   } uses[FIRST_PSEUDO_REGISTER + MAX_RECOG_OPERANDS];
2105   struct reg_use_data *use;
2106   struct reg_pressure_data *reg_pressure;
2107   int delta[N_REG_CLASSES];
2108   int pci, point, mix, new_last, cl, ref_pressure, queue;
2109   unsigned int i, num_uses, num_pending_births;
2110   bool print_p;
2111
2112   /* The destinations of INSN were previously live from POINT onwards, but are
2113      now live from model_curr_point onwards.  Set up DELTA accordingly.  */
2114   point = model_index (insn);
2115   reg_pressure = INSN_REG_PRESSURE (insn);
2116   for (pci = 0; pci < ira_pressure_classes_num; pci++)
2117     {
2118       cl = ira_pressure_classes[pci];
2119       delta[cl] = reg_pressure[pci].set_increase;
2120     }
2121
2122   /* Record which registers previously died at POINT, but which now die
2123      before POINT.  Adjust DELTA so that it represents the effect of
2124      this change after POINT - 1.  Set NUM_PENDING_BIRTHS to the number of
2125      registers that will be born in the range [model_curr_point, POINT).  */
2126   num_uses = 0;
2127   num_pending_births = 0;
2128   for (use = INSN_REG_USE_LIST (insn); use != NULL; use = use->next_insn_use)
2129     {
2130       new_last = model_last_use_except (use);
2131       if (new_last < point)
2132         {
2133           gcc_assert (num_uses < ARRAY_SIZE (uses));
2134           uses[num_uses].last_use = new_last;
2135           uses[num_uses].regno = use->regno;
2136           /* This register is no longer live after POINT - 1.  */
2137           mark_regno_birth_or_death (NULL, delta, use->regno, false);
2138           num_uses++;
2139           if (new_last >= 0)
2140             num_pending_births++;
2141         }
2142     }
2143
2144   /* Update the MODEL_REF_PRESSURE and MODEL_MAX_PRESSURE for POINT.
2145      Also set each group pressure limit for POINT.  */
2146   for (pci = 0; pci < ira_pressure_classes_num; pci++)
2147     {
2148       cl = ira_pressure_classes[pci];
2149       model_start_update_pressure (&model_before_pressure,
2150                                    point, pci, delta[cl]);
2151     }
2152
2153   /* Walk the model schedule backwards, starting immediately before POINT.  */
2154   print_p = false;
2155   if (point != model_curr_point)
2156     do
2157       {
2158         point--;
2159         insn = MODEL_INSN (point);
2160         queue = QUEUE_INDEX (insn);
2161
2162         if (queue != QUEUE_SCHEDULED)
2163           {
2164             /* DELTA describes the effect of the move on the register pressure
2165                after POINT.  Make it describe the effect on the pressure
2166                before POINT.  */
2167             i = 0;
2168             while (i < num_uses)
2169               {
2170                 if (uses[i].last_use == point)
2171                   {
2172                     /* This register is now live again.  */
2173                     mark_regno_birth_or_death (NULL, delta,
2174                                                uses[i].regno, true);
2175
2176                     /* Remove this use from the array.  */
2177                     uses[i] = uses[num_uses - 1];
2178                     num_uses--;
2179                     num_pending_births--;
2180                   }
2181                 else
2182                   i++;
2183               }
2184
2185             if (sched_verbose >= 5)
2186               {
2187                 if (!print_p)
2188                   {
2189                     fprintf (sched_dump, MODEL_BAR);
2190                     fprintf (sched_dump, ";;\t\t| New pressure for model"
2191                              " schedule\n");
2192                     fprintf (sched_dump, MODEL_BAR);
2193                     print_p = true;
2194                   }
2195
2196                 fprintf (sched_dump, ";;\t\t| %3d %4d %-30s ",
2197                          point, INSN_UID (insn),
2198                          str_pattern_slim (PATTERN (insn)));
2199                 for (pci = 0; pci < ira_pressure_classes_num; pci++)
2200                   {
2201                     cl = ira_pressure_classes[pci];
2202                     ref_pressure = MODEL_REF_PRESSURE (&model_before_pressure,
2203                                                        point, pci);
2204                     fprintf (sched_dump, " %s:[%d->%d]",
2205                              reg_class_names[ira_pressure_classes[pci]],
2206                              ref_pressure, ref_pressure + delta[cl]);
2207                   }
2208                 fprintf (sched_dump, "\n");
2209               }
2210           }
2211
2212         /* Adjust the pressure at POINT.  Set MIX to nonzero if POINT - 1
2213            might have changed as well.  */
2214         mix = num_pending_births;
2215         for (pci = 0; pci < ira_pressure_classes_num; pci++)
2216           {
2217             cl = ira_pressure_classes[pci];
2218             mix |= delta[cl];
2219             mix |= model_update_pressure (&model_before_pressure,
2220                                           point, pci, delta[cl]);
2221           }
2222       }
2223     while (mix && point > model_curr_point);
2224
2225   if (print_p)
2226     fprintf (sched_dump, MODEL_BAR);
2227 }
2228
2229 /* After DEP, which was cancelled, has been resolved for insn NEXT,
2230    check whether the insn's pattern needs restoring.  */
2231 static bool
2232 must_restore_pattern_p (rtx next, dep_t dep)
2233 {
2234   if (QUEUE_INDEX (next) == QUEUE_SCHEDULED)
2235     return false;
2236
2237   if (DEP_TYPE (dep) == REG_DEP_CONTROL)
2238     {
2239       gcc_assert (ORIG_PAT (next) != NULL_RTX);
2240       gcc_assert (next == DEP_CON (dep));
2241     }
2242   else
2243     {
2244       struct dep_replacement *desc = DEP_REPLACE (dep);
2245       if (desc->insn != next)
2246         {
2247           gcc_assert (*desc->loc == desc->orig);
2248           return false;
2249         }
2250     }
2251   return true;
2252 }
2253 \f
2254 /* model_spill_cost (CL, P, P') returns the cost of increasing the
2255    pressure on CL from P to P'.  We use this to calculate a "base ECC",
2256    baseECC (CL, X), for each pressure class CL and each instruction X.
2257    Supposing X changes the pressure on CL from P to P', and that the
2258    maximum pressure on CL in the current model schedule is MP', then:
2259
2260    * if X occurs before or at the next point of maximum pressure in
2261      the model schedule and P' > MP', then:
2262
2263        baseECC (CL, X) = model_spill_cost (CL, MP, P')
2264
2265      The idea is that the pressure after scheduling a fixed set of
2266      instructions -- in this case, the set up to and including the
2267      next maximum pressure point -- is going to be the same regardless
2268      of the order; we simply want to keep the intermediate pressure
2269      under control.  Thus X has a cost of zero unless scheduling it
2270      now would exceed MP'.
2271
2272      If all increases in the set are by the same amount, no zero-cost
2273      instruction will ever cause the pressure to exceed MP'.  However,
2274      if X is instead moved past an instruction X' with pressure in the
2275      range (MP' - (P' - P), MP'), the pressure at X' will increase
2276      beyond MP'.  Since baseECC is very much a heuristic anyway,
2277      it doesn't seem worth the overhead of tracking cases like these.
2278
2279      The cost of exceeding MP' is always based on the original maximum
2280      pressure MP.  This is so that going 2 registers over the original
2281      limit has the same cost regardless of whether it comes from two
2282      separate +1 deltas or from a single +2 delta.
2283
2284    * if X occurs after the next point of maximum pressure in the model
2285      schedule and P' > P, then:
2286
2287        baseECC (CL, X) = model_spill_cost (CL, MP, MP' + (P' - P))
2288
2289      That is, if we move X forward across a point of maximum pressure,
2290      and if X increases the pressure by P' - P, then we conservatively
2291      assume that scheduling X next would increase the maximum pressure
2292      by P' - P.  Again, the cost of doing this is based on the original
2293      maximum pressure MP, for the same reason as above.
2294
2295    * if P' < P, P > MP, and X occurs at or after the next point of
2296      maximum pressure, then:
2297
2298        baseECC (CL, X) = -model_spill_cost (CL, MAX (MP, P'), P)
2299
2300      That is, if we have already exceeded the original maximum pressure MP,
2301      and if X might reduce the maximum pressure again -- or at least push
2302      it further back, and thus allow more scheduling freedom -- it is given
2303      a negative cost to reflect the improvement.
2304
2305    * otherwise,
2306
2307        baseECC (CL, X) = 0
2308
2309      In this case, X is not expected to affect the maximum pressure MP',
2310      so it has zero cost.
2311
2312    We then create a combined value baseECC (X) that is the sum of
2313    baseECC (CL, X) for each pressure class CL.
2314
2315    baseECC (X) could itself be used as the ECC value described above.
2316    However, this is often too conservative, in the sense that it
2317    tends to make high-priority instructions that increase pressure
2318    wait too long in cases where introducing a spill would be better.
2319    For this reason the final ECC is a priority-adjusted form of
2320    baseECC (X).  Specifically, we calculate:
2321
2322      P (X) = INSN_PRIORITY (X) - insn_delay (X) - baseECC (X)
2323      baseP = MAX { P (X) | baseECC (X) <= 0 }
2324
2325    Then:
2326
2327      ECC (X) = MAX (MIN (baseP - P (X), baseECC (X)), 0)
2328
2329    Thus an instruction's effect on pressure is ignored if it has a high
2330    enough priority relative to the ones that don't increase pressure.
2331    Negative values of baseECC (X) do not increase the priority of X
2332    itself, but they do make it harder for other instructions to
2333    increase the pressure further.
2334
2335    This pressure cost is deliberately timid.  The intention has been
2336    to choose a heuristic that rarely interferes with the normal list
2337    scheduler in cases where that scheduler would produce good code.
2338    We simply want to curb some of its worst excesses.  */
2339
2340 /* Return the cost of increasing the pressure in class CL from FROM to TO.
2341
2342    Here we use the very simplistic cost model that every register above
2343    ira_class_hard_regs_num[CL] has a spill cost of 1.  We could use other
2344    measures instead, such as one based on MEMORY_MOVE_COST.  However:
2345
2346       (1) In order for an instruction to be scheduled, the higher cost
2347           would need to be justified in a single saving of that many stalls.
2348           This is overly pessimistic, because the benefit of spilling is
2349           often to avoid a sequence of several short stalls rather than
2350           a single long one.
2351
2352       (2) The cost is still arbitrary.  Because we are not allocating
2353           registers during scheduling, we have no way of knowing for
2354           sure how many memory accesses will be required by each spill,
2355           where the spills will be placed within the block, or even
2356           which block(s) will contain the spills.
2357
2358    So a higher cost than 1 is often too conservative in practice,
2359    forcing blocks to contain unnecessary stalls instead of spill code.
2360    The simple cost below seems to be the best compromise.  It reduces
2361    the interference with the normal list scheduler, which helps make
2362    it more suitable for a default-on option.  */
2363
2364 static int
2365 model_spill_cost (int cl, int from, int to)
2366 {
2367   from = MAX (from, ira_class_hard_regs_num[cl]);
2368   return MAX (to, from) - from;
2369 }
2370
2371 /* Return baseECC (ira_pressure_classes[PCI], POINT), given that
2372    P = curr_reg_pressure[ira_pressure_classes[PCI]] and that
2373    P' = P + DELTA.  */
2374
2375 static int
2376 model_excess_group_cost (struct model_pressure_group *group,
2377                          int point, int pci, int delta)
2378 {
2379   int pressure, cl;
2380
2381   cl = ira_pressure_classes[pci];
2382   if (delta < 0 && point >= group->limits[pci].point)
2383     {
2384       pressure = MAX (group->limits[pci].orig_pressure,
2385                       curr_reg_pressure[cl] + delta);
2386       return -model_spill_cost (cl, pressure, curr_reg_pressure[cl]);
2387     }
2388
2389   if (delta > 0)
2390     {
2391       if (point > group->limits[pci].point)
2392         pressure = group->limits[pci].pressure + delta;
2393       else
2394         pressure = curr_reg_pressure[cl] + delta;
2395
2396       if (pressure > group->limits[pci].pressure)
2397         return model_spill_cost (cl, group->limits[pci].orig_pressure,
2398                                  pressure);
2399     }
2400
2401   return 0;
2402 }
2403
2404 /* Return baseECC (MODEL_INSN (INSN)).  Dump the costs to sched_dump
2405    if PRINT_P.  */
2406
2407 static int
2408 model_excess_cost (rtx insn, bool print_p)
2409 {
2410   int point, pci, cl, cost, this_cost, delta;
2411   struct reg_pressure_data *insn_reg_pressure;
2412   int insn_death[N_REG_CLASSES];
2413
2414   calculate_reg_deaths (insn, insn_death);
2415   point = model_index (insn);
2416   insn_reg_pressure = INSN_REG_PRESSURE (insn);
2417   cost = 0;
2418
2419   if (print_p)
2420     fprintf (sched_dump, ";;\t\t| %3d %4d | %4d %+3d |", point,
2421              INSN_UID (insn), INSN_PRIORITY (insn), insn_delay (insn));
2422
2423   /* Sum up the individual costs for each register class.  */
2424   for (pci = 0; pci < ira_pressure_classes_num; pci++)
2425     {
2426       cl = ira_pressure_classes[pci];
2427       delta = insn_reg_pressure[pci].set_increase - insn_death[cl];
2428       this_cost = model_excess_group_cost (&model_before_pressure,
2429                                            point, pci, delta);
2430       cost += this_cost;
2431       if (print_p)
2432         fprintf (sched_dump, " %s:[%d base cost %d]",
2433                  reg_class_names[cl], delta, this_cost);
2434     }
2435
2436   if (print_p)
2437     fprintf (sched_dump, "\n");
2438
2439   return cost;
2440 }
2441
2442 /* Dump the next points of maximum pressure for GROUP.  */
2443
2444 static void
2445 model_dump_pressure_points (struct model_pressure_group *group)
2446 {
2447   int pci, cl;
2448
2449   fprintf (sched_dump, ";;\t\t|  pressure points");
2450   for (pci = 0; pci < ira_pressure_classes_num; pci++)
2451     {
2452       cl = ira_pressure_classes[pci];
2453       fprintf (sched_dump, " %s:[%d->%d at ", reg_class_names[cl],
2454                curr_reg_pressure[cl], group->limits[pci].pressure);
2455       if (group->limits[pci].point < model_num_insns)
2456         fprintf (sched_dump, "%d:%d]", group->limits[pci].point,
2457                  INSN_UID (MODEL_INSN (group->limits[pci].point)));
2458       else
2459         fprintf (sched_dump, "end]");
2460     }
2461   fprintf (sched_dump, "\n");
2462 }
2463
2464 /* Set INSN_REG_PRESSURE_EXCESS_COST_CHANGE for INSNS[0...COUNT-1].  */
2465
2466 static void
2467 model_set_excess_costs (rtx_insn **insns, int count)
2468 {
2469   int i, cost, priority_base, priority;
2470   bool print_p;
2471
2472   /* Record the baseECC value for each instruction in the model schedule,
2473      except that negative costs are converted to zero ones now rather thatn
2474      later.  Do not assign a cost to debug instructions, since they must
2475      not change code-generation decisions.  Experiments suggest we also
2476      get better results by not assigning a cost to instructions from
2477      a different block.
2478
2479      Set PRIORITY_BASE to baseP in the block comment above.  This is the
2480      maximum priority of the "cheap" instructions, which should always
2481      include the next model instruction.  */
2482   priority_base = 0;
2483   print_p = false;
2484   for (i = 0; i < count; i++)
2485     if (INSN_MODEL_INDEX (insns[i]))
2486       {
2487         if (sched_verbose >= 6 && !print_p)
2488           {
2489             fprintf (sched_dump, MODEL_BAR);
2490             fprintf (sched_dump, ";;\t\t| Pressure costs for ready queue\n");
2491             model_dump_pressure_points (&model_before_pressure);
2492             fprintf (sched_dump, MODEL_BAR);
2493             print_p = true;
2494           }
2495         cost = model_excess_cost (insns[i], print_p);
2496         if (cost <= 0)
2497           {
2498             priority = INSN_PRIORITY (insns[i]) - insn_delay (insns[i]) - cost;
2499             priority_base = MAX (priority_base, priority);
2500             cost = 0;
2501           }
2502         INSN_REG_PRESSURE_EXCESS_COST_CHANGE (insns[i]) = cost;
2503       }
2504   if (print_p)
2505     fprintf (sched_dump, MODEL_BAR);
2506
2507   /* Use MAX (baseECC, 0) and baseP to calculcate ECC for each
2508      instruction.  */
2509   for (i = 0; i < count; i++)
2510     {
2511       cost = INSN_REG_PRESSURE_EXCESS_COST_CHANGE (insns[i]);
2512       priority = INSN_PRIORITY (insns[i]) - insn_delay (insns[i]);
2513       if (cost > 0 && priority > priority_base)
2514         {
2515           cost += priority_base - priority;
2516           INSN_REG_PRESSURE_EXCESS_COST_CHANGE (insns[i]) = MAX (cost, 0);
2517         }
2518     }
2519 }
2520 \f
2521
2522 /* Enum of rank_for_schedule heuristic decisions.  */
2523 enum rfs_decision {
2524   RFS_DEBUG, RFS_LIVE_RANGE_SHRINK1, RFS_LIVE_RANGE_SHRINK2,
2525   RFS_SCHED_GROUP, RFS_PRESSURE_DELAY, RFS_PRESSURE_TICK,
2526   RFS_FEEDS_BACKTRACK_INSN, RFS_PRIORITY, RFS_SPECULATION,
2527   RFS_SCHED_RANK, RFS_LAST_INSN, RFS_PRESSURE_INDEX,
2528   RFS_DEP_COUNT, RFS_TIE, RFS_N };
2529
2530 /* Corresponding strings for print outs.  */
2531 static const char *rfs_str[RFS_N] = {
2532   "RFS_DEBUG", "RFS_LIVE_RANGE_SHRINK1", "RFS_LIVE_RANGE_SHRINK2",
2533   "RFS_SCHED_GROUP", "RFS_PRESSURE_DELAY", "RFS_PRESSURE_TICK",
2534   "RFS_FEEDS_BACKTRACK_INSN", "RFS_PRIORITY", "RFS_SPECULATION",
2535   "RFS_SCHED_RANK", "RFS_LAST_INSN", "RFS_PRESSURE_INDEX",
2536   "RFS_DEP_COUNT", "RFS_TIE" };
2537
2538 /* Statistical breakdown of rank_for_schedule decisions.  */
2539 typedef struct { unsigned stats[RFS_N]; } rank_for_schedule_stats_t;
2540 static rank_for_schedule_stats_t rank_for_schedule_stats;
2541
2542 static int
2543 rfs_result (enum rfs_decision decision, int result)
2544 {
2545   ++rank_for_schedule_stats.stats[decision];
2546   return result;
2547 }
2548
2549 /* Returns a positive value if x is preferred; returns a negative value if
2550    y is preferred.  Should never return 0, since that will make the sort
2551    unstable.  */
2552
2553 static int
2554 rank_for_schedule (const void *x, const void *y)
2555 {
2556   rtx_insn *tmp = *(rtx_insn * const *) y;
2557   rtx_insn *tmp2 = *(rtx_insn * const *) x;
2558   int tmp_class, tmp2_class;
2559   int val, priority_val, info_val, diff;
2560
2561   if (MAY_HAVE_DEBUG_INSNS)
2562     {
2563       /* Schedule debug insns as early as possible.  */
2564       if (DEBUG_INSN_P (tmp) && !DEBUG_INSN_P (tmp2))
2565         return rfs_result (RFS_DEBUG, -1);
2566       else if (!DEBUG_INSN_P (tmp) && DEBUG_INSN_P (tmp2))
2567         return rfs_result (RFS_DEBUG, 1);
2568       else if (DEBUG_INSN_P (tmp) && DEBUG_INSN_P (tmp2))
2569         return rfs_result (RFS_DEBUG, INSN_LUID (tmp) - INSN_LUID (tmp2));
2570     }
2571
2572   if (live_range_shrinkage_p)
2573     {
2574       /* Don't use SCHED_PRESSURE_MODEL -- it results in much worse
2575          code.  */
2576       gcc_assert (sched_pressure == SCHED_PRESSURE_WEIGHTED);
2577       if ((INSN_REG_PRESSURE_EXCESS_COST_CHANGE (tmp) < 0
2578            || INSN_REG_PRESSURE_EXCESS_COST_CHANGE (tmp2) < 0)
2579           && (diff = (INSN_REG_PRESSURE_EXCESS_COST_CHANGE (tmp)
2580                       - INSN_REG_PRESSURE_EXCESS_COST_CHANGE (tmp2))) != 0)
2581         return rfs_result (RFS_LIVE_RANGE_SHRINK1, diff);
2582       /* Sort by INSN_LUID (original insn order), so that we make the
2583          sort stable.  This minimizes instruction movement, thus
2584          minimizing sched's effect on debugging and cross-jumping.  */
2585       return rfs_result (RFS_LIVE_RANGE_SHRINK2,
2586                          INSN_LUID (tmp) - INSN_LUID (tmp2));
2587     }
2588
2589   /* The insn in a schedule group should be issued the first.  */
2590   if (flag_sched_group_heuristic &&
2591       SCHED_GROUP_P (tmp) != SCHED_GROUP_P (tmp2))
2592     return rfs_result (RFS_SCHED_GROUP, SCHED_GROUP_P (tmp2) ? 1 : -1);
2593
2594   /* Make sure that priority of TMP and TMP2 are initialized.  */
2595   gcc_assert (INSN_PRIORITY_KNOWN (tmp) && INSN_PRIORITY_KNOWN (tmp2));
2596
2597   if (sched_pressure != SCHED_PRESSURE_NONE)
2598     {
2599       /* Prefer insn whose scheduling results in the smallest register
2600          pressure excess.  */
2601       if ((diff = (INSN_REG_PRESSURE_EXCESS_COST_CHANGE (tmp)
2602                    + insn_delay (tmp)
2603                    - INSN_REG_PRESSURE_EXCESS_COST_CHANGE (tmp2)
2604                    - insn_delay (tmp2))))
2605         return rfs_result (RFS_PRESSURE_DELAY, diff);
2606     }
2607
2608   if (sched_pressure != SCHED_PRESSURE_NONE
2609       && (INSN_TICK (tmp2) > clock_var || INSN_TICK (tmp) > clock_var)
2610       && INSN_TICK (tmp2) != INSN_TICK (tmp))
2611     {
2612       diff = INSN_TICK (tmp) - INSN_TICK (tmp2);
2613       return rfs_result (RFS_PRESSURE_TICK, diff);
2614     }
2615
2616   /* If we are doing backtracking in this schedule, prefer insns that
2617      have forward dependencies with negative cost against an insn that
2618      was already scheduled.  */
2619   if (current_sched_info->flags & DO_BACKTRACKING)
2620     {
2621       priority_val = FEEDS_BACKTRACK_INSN (tmp2) - FEEDS_BACKTRACK_INSN (tmp);
2622       if (priority_val)
2623         return rfs_result (RFS_FEEDS_BACKTRACK_INSN, priority_val);
2624     }
2625
2626   /* Prefer insn with higher priority.  */
2627   priority_val = INSN_PRIORITY (tmp2) - INSN_PRIORITY (tmp);
2628
2629   if (flag_sched_critical_path_heuristic && priority_val)
2630     return rfs_result (RFS_PRIORITY, priority_val);
2631
2632   /* Prefer speculative insn with greater dependencies weakness.  */
2633   if (flag_sched_spec_insn_heuristic && spec_info)
2634     {
2635       ds_t ds1, ds2;
2636       dw_t dw1, dw2;
2637       int dw;
2638
2639       ds1 = TODO_SPEC (tmp) & SPECULATIVE;
2640       if (ds1)
2641         dw1 = ds_weak (ds1);
2642       else
2643         dw1 = NO_DEP_WEAK;
2644
2645       ds2 = TODO_SPEC (tmp2) & SPECULATIVE;
2646       if (ds2)
2647         dw2 = ds_weak (ds2);
2648       else
2649         dw2 = NO_DEP_WEAK;
2650
2651       dw = dw2 - dw1;
2652       if (dw > (NO_DEP_WEAK / 8) || dw < -(NO_DEP_WEAK / 8))
2653         return rfs_result (RFS_SPECULATION, dw);
2654     }
2655
2656   info_val = (*current_sched_info->rank) (tmp, tmp2);
2657   if (flag_sched_rank_heuristic && info_val)
2658     return rfs_result (RFS_SCHED_RANK, info_val);
2659
2660   /* Compare insns based on their relation to the last scheduled
2661      non-debug insn.  */
2662   if (flag_sched_last_insn_heuristic && last_nondebug_scheduled_insn)
2663     {
2664       dep_t dep1;
2665       dep_t dep2;
2666       rtx last = last_nondebug_scheduled_insn;
2667
2668       /* Classify the instructions into three classes:
2669          1) Data dependent on last schedule insn.
2670          2) Anti/Output dependent on last scheduled insn.
2671          3) Independent of last scheduled insn, or has latency of one.
2672          Choose the insn from the highest numbered class if different.  */
2673       dep1 = sd_find_dep_between (last, tmp, true);
2674
2675       if (dep1 == NULL || dep_cost (dep1) == 1)
2676         tmp_class = 3;
2677       else if (/* Data dependence.  */
2678                DEP_TYPE (dep1) == REG_DEP_TRUE)
2679         tmp_class = 1;
2680       else
2681         tmp_class = 2;
2682
2683       dep2 = sd_find_dep_between (last, tmp2, true);
2684
2685       if (dep2 == NULL || dep_cost (dep2)  == 1)
2686         tmp2_class = 3;
2687       else if (/* Data dependence.  */
2688                DEP_TYPE (dep2) == REG_DEP_TRUE)
2689         tmp2_class = 1;
2690       else
2691         tmp2_class = 2;
2692
2693       if ((val = tmp2_class - tmp_class))
2694         return rfs_result (RFS_LAST_INSN, val);
2695     }
2696
2697   /* Prefer instructions that occur earlier in the model schedule.  */
2698   if (sched_pressure == SCHED_PRESSURE_MODEL
2699       && INSN_BB (tmp) == target_bb && INSN_BB (tmp2) == target_bb)
2700     {
2701       diff = model_index (tmp) - model_index (tmp2);
2702       gcc_assert (diff != 0);
2703       return rfs_result (RFS_PRESSURE_INDEX, diff);
2704     }
2705
2706   /* Prefer the insn which has more later insns that depend on it.
2707      This gives the scheduler more freedom when scheduling later
2708      instructions at the expense of added register pressure.  */
2709
2710   val = (dep_list_size (tmp2, SD_LIST_FORW)
2711          - dep_list_size (tmp, SD_LIST_FORW));
2712
2713   if (flag_sched_dep_count_heuristic && val != 0)
2714     return rfs_result (RFS_DEP_COUNT, val);
2715
2716   /* If insns are equally good, sort by INSN_LUID (original insn order),
2717      so that we make the sort stable.  This minimizes instruction movement,
2718      thus minimizing sched's effect on debugging and cross-jumping.  */
2719   return rfs_result (RFS_TIE, INSN_LUID (tmp) - INSN_LUID (tmp2));
2720 }
2721
2722 /* Resort the array A in which only element at index N may be out of order.  */
2723
2724 HAIFA_INLINE static void
2725 swap_sort (rtx_insn **a, int n)
2726 {
2727   rtx_insn *insn = a[n - 1];
2728   int i = n - 2;
2729
2730   while (i >= 0 && rank_for_schedule (a + i, &insn) >= 0)
2731     {
2732       a[i + 1] = a[i];
2733       i -= 1;
2734     }
2735   a[i + 1] = insn;
2736 }
2737
2738 /* Add INSN to the insn queue so that it can be executed at least
2739    N_CYCLES after the currently executing insn.  Preserve insns
2740    chain for debugging purposes.  REASON will be printed in debugging
2741    output.  */
2742
2743 HAIFA_INLINE static void
2744 queue_insn (rtx_insn *insn, int n_cycles, const char *reason)
2745 {
2746   int next_q = NEXT_Q_AFTER (q_ptr, n_cycles);
2747   rtx link = alloc_INSN_LIST (insn, insn_queue[next_q]);
2748   int new_tick;
2749
2750   gcc_assert (n_cycles <= max_insn_queue_index);
2751   gcc_assert (!DEBUG_INSN_P (insn));
2752
2753   insn_queue[next_q] = link;
2754   q_size += 1;
2755
2756   if (sched_verbose >= 2)
2757     {
2758       fprintf (sched_dump, ";;\t\tReady-->Q: insn %s: ",
2759                (*current_sched_info->print_insn) (insn, 0));
2760
2761       fprintf (sched_dump, "queued for %d cycles (%s).\n", n_cycles, reason);
2762     }
2763
2764   QUEUE_INDEX (insn) = next_q;
2765
2766   if (current_sched_info->flags & DO_BACKTRACKING)
2767     {
2768       new_tick = clock_var + n_cycles;
2769       if (INSN_TICK (insn) == INVALID_TICK || INSN_TICK (insn) < new_tick)
2770         INSN_TICK (insn) = new_tick;
2771
2772       if (INSN_EXACT_TICK (insn) != INVALID_TICK
2773           && INSN_EXACT_TICK (insn) < clock_var + n_cycles)
2774         {
2775           must_backtrack = true;
2776           if (sched_verbose >= 2)
2777             fprintf (sched_dump, ";;\t\tcausing a backtrack.\n");
2778         }
2779     }
2780 }
2781
2782 /* Remove INSN from queue.  */
2783 static void
2784 queue_remove (rtx insn)
2785 {
2786   gcc_assert (QUEUE_INDEX (insn) >= 0);
2787   remove_free_INSN_LIST_elem (insn, &insn_queue[QUEUE_INDEX (insn)]);
2788   q_size--;
2789   QUEUE_INDEX (insn) = QUEUE_NOWHERE;
2790 }
2791
2792 /* Return a pointer to the bottom of the ready list, i.e. the insn
2793    with the lowest priority.  */
2794
2795 rtx_insn **
2796 ready_lastpos (struct ready_list *ready)
2797 {
2798   gcc_assert (ready->n_ready >= 1);
2799   return ready->vec + ready->first - ready->n_ready + 1;
2800 }
2801
2802 /* Add an element INSN to the ready list so that it ends up with the
2803    lowest/highest priority depending on FIRST_P.  */
2804
2805 HAIFA_INLINE static void
2806 ready_add (struct ready_list *ready, rtx_insn *insn, bool first_p)
2807 {
2808   if (!first_p)
2809     {
2810       if (ready->first == ready->n_ready)
2811         {
2812           memmove (ready->vec + ready->veclen - ready->n_ready,
2813                    ready_lastpos (ready),
2814                    ready->n_ready * sizeof (rtx));
2815           ready->first = ready->veclen - 1;
2816         }
2817       ready->vec[ready->first - ready->n_ready] = insn;
2818     }
2819   else
2820     {
2821       if (ready->first == ready->veclen - 1)
2822         {
2823           if (ready->n_ready)
2824             /* ready_lastpos() fails when called with (ready->n_ready == 0).  */
2825             memmove (ready->vec + ready->veclen - ready->n_ready - 1,
2826                      ready_lastpos (ready),
2827                      ready->n_ready * sizeof (rtx));
2828           ready->first = ready->veclen - 2;
2829         }
2830       ready->vec[++(ready->first)] = insn;
2831     }
2832
2833   ready->n_ready++;
2834   if (DEBUG_INSN_P (insn))
2835     ready->n_debug++;
2836
2837   gcc_assert (QUEUE_INDEX (insn) != QUEUE_READY);
2838   QUEUE_INDEX (insn) = QUEUE_READY;
2839
2840   if (INSN_EXACT_TICK (insn) != INVALID_TICK
2841       && INSN_EXACT_TICK (insn) < clock_var)
2842     {
2843       must_backtrack = true;
2844     }
2845 }
2846
2847 /* Remove the element with the highest priority from the ready list and
2848    return it.  */
2849
2850 HAIFA_INLINE static rtx_insn *
2851 ready_remove_first (struct ready_list *ready)
2852 {
2853   rtx_insn *t;
2854
2855   gcc_assert (ready->n_ready);
2856   t = ready->vec[ready->first--];
2857   ready->n_ready--;
2858   if (DEBUG_INSN_P (t))
2859     ready->n_debug--;
2860   /* If the queue becomes empty, reset it.  */
2861   if (ready->n_ready == 0)
2862     ready->first = ready->veclen - 1;
2863
2864   gcc_assert (QUEUE_INDEX (t) == QUEUE_READY);
2865   QUEUE_INDEX (t) = QUEUE_NOWHERE;
2866
2867   return t;
2868 }
2869
2870 /* The following code implements multi-pass scheduling for the first
2871    cycle.  In other words, we will try to choose ready insn which
2872    permits to start maximum number of insns on the same cycle.  */
2873
2874 /* Return a pointer to the element INDEX from the ready.  INDEX for
2875    insn with the highest priority is 0, and the lowest priority has
2876    N_READY - 1.  */
2877
2878 rtx_insn *
2879 ready_element (struct ready_list *ready, int index)
2880 {
2881   gcc_assert (ready->n_ready && index < ready->n_ready);
2882
2883   return ready->vec[ready->first - index];
2884 }
2885
2886 /* Remove the element INDEX from the ready list and return it.  INDEX
2887    for insn with the highest priority is 0, and the lowest priority
2888    has N_READY - 1.  */
2889
2890 HAIFA_INLINE static rtx_insn *
2891 ready_remove (struct ready_list *ready, int index)
2892 {
2893   rtx_insn *t;
2894   int i;
2895
2896   if (index == 0)
2897     return ready_remove_first (ready);
2898   gcc_assert (ready->n_ready && index < ready->n_ready);
2899   t = ready->vec[ready->first - index];
2900   ready->n_ready--;
2901   if (DEBUG_INSN_P (t))
2902     ready->n_debug--;
2903   for (i = index; i < ready->n_ready; i++)
2904     ready->vec[ready->first - i] = ready->vec[ready->first - i - 1];
2905   QUEUE_INDEX (t) = QUEUE_NOWHERE;
2906   return t;
2907 }
2908
2909 /* Remove INSN from the ready list.  */
2910 static void
2911 ready_remove_insn (rtx insn)
2912 {
2913   int i;
2914
2915   for (i = 0; i < readyp->n_ready; i++)
2916     if (ready_element (readyp, i) == insn)
2917       {
2918         ready_remove (readyp, i);
2919         return;
2920       }
2921   gcc_unreachable ();
2922 }
2923
2924 /* Calculate difference of two statistics set WAS and NOW.
2925    Result returned in WAS.  */
2926 static void
2927 rank_for_schedule_stats_diff (rank_for_schedule_stats_t *was,
2928                               const rank_for_schedule_stats_t *now)
2929 {
2930   for (int i = 0; i < RFS_N; ++i)
2931     was->stats[i] = now->stats[i] - was->stats[i];
2932 }
2933
2934 /* Print rank_for_schedule statistics.  */
2935 static void
2936 print_rank_for_schedule_stats (const char *prefix,
2937                                const rank_for_schedule_stats_t *stats)
2938 {
2939   for (int i = 0; i < RFS_N; ++i)
2940     if (stats->stats[i])
2941       fprintf (sched_dump, "%s%20s: %u\n", prefix, rfs_str[i], stats->stats[i]);
2942 }
2943
2944 /* Sort the ready list READY by ascending priority, using the SCHED_SORT
2945    macro.  */
2946
2947 void
2948 ready_sort (struct ready_list *ready)
2949 {
2950   int i;
2951   rtx_insn **first = ready_lastpos (ready);
2952
2953   if (sched_pressure == SCHED_PRESSURE_WEIGHTED)
2954     {
2955       for (i = 0; i < ready->n_ready; i++)
2956         if (!DEBUG_INSN_P (first[i]))
2957           setup_insn_reg_pressure_info (first[i]);
2958     }
2959   if (sched_pressure == SCHED_PRESSURE_MODEL
2960       && model_curr_point < model_num_insns)
2961     model_set_excess_costs (first, ready->n_ready);
2962
2963   rank_for_schedule_stats_t stats1;
2964   if (sched_verbose >= 4)
2965     stats1 = rank_for_schedule_stats;
2966
2967   if (ready->n_ready == 2)
2968     swap_sort (first, ready->n_ready);
2969   else if (ready->n_ready > 2)
2970     qsort (first, ready->n_ready, sizeof (rtx), rank_for_schedule);
2971
2972   if (sched_verbose >= 4)
2973     {
2974       rank_for_schedule_stats_diff (&stats1, &rank_for_schedule_stats);
2975       print_rank_for_schedule_stats (";;\t\t", &stats1);
2976     }
2977 }
2978
2979 /* PREV is an insn that is ready to execute.  Adjust its priority if that
2980    will help shorten or lengthen register lifetimes as appropriate.  Also
2981    provide a hook for the target to tweak itself.  */
2982
2983 HAIFA_INLINE static void
2984 adjust_priority (rtx prev)
2985 {
2986   /* ??? There used to be code here to try and estimate how an insn
2987      affected register lifetimes, but it did it by looking at REG_DEAD
2988      notes, which we removed in schedule_region.  Nor did it try to
2989      take into account register pressure or anything useful like that.
2990
2991      Revisit when we have a machine model to work with and not before.  */
2992
2993   if (targetm.sched.adjust_priority)
2994     INSN_PRIORITY (prev) =
2995       targetm.sched.adjust_priority (prev, INSN_PRIORITY (prev));
2996 }
2997
2998 /* Advance DFA state STATE on one cycle.  */
2999 void
3000 advance_state (state_t state)
3001 {
3002   if (targetm.sched.dfa_pre_advance_cycle)
3003     targetm.sched.dfa_pre_advance_cycle ();
3004
3005   if (targetm.sched.dfa_pre_cycle_insn)
3006     state_transition (state,
3007                       targetm.sched.dfa_pre_cycle_insn ());
3008
3009   state_transition (state, NULL);
3010
3011   if (targetm.sched.dfa_post_cycle_insn)
3012     state_transition (state,
3013                       targetm.sched.dfa_post_cycle_insn ());
3014
3015   if (targetm.sched.dfa_post_advance_cycle)
3016     targetm.sched.dfa_post_advance_cycle ();
3017 }
3018
3019 /* Advance time on one cycle.  */
3020 HAIFA_INLINE static void
3021 advance_one_cycle (void)
3022 {
3023   advance_state (curr_state);
3024   if (sched_verbose >= 4)
3025     fprintf (sched_dump, ";;\tAdvance the current state.\n");
3026 }
3027
3028 /* Update register pressure after scheduling INSN.  */
3029 static void
3030 update_register_pressure (rtx insn)
3031 {
3032   struct reg_use_data *use;
3033   struct reg_set_data *set;
3034
3035   gcc_checking_assert (!DEBUG_INSN_P (insn));
3036
3037   for (use = INSN_REG_USE_LIST (insn); use != NULL; use = use->next_insn_use)
3038     if (dying_use_p (use))
3039       mark_regno_birth_or_death (curr_reg_live, curr_reg_pressure,
3040                                  use->regno, false);
3041   for (set = INSN_REG_SET_LIST (insn); set != NULL; set = set->next_insn_set)
3042     mark_regno_birth_or_death (curr_reg_live, curr_reg_pressure,
3043                                set->regno, true);
3044 }
3045
3046 /* Set up or update (if UPDATE_P) max register pressure (see its
3047    meaning in sched-int.h::_haifa_insn_data) for all current BB insns
3048    after insn AFTER.  */
3049 static void
3050 setup_insn_max_reg_pressure (rtx after, bool update_p)
3051 {
3052   int i, p;
3053   bool eq_p;
3054   rtx insn;
3055   static int max_reg_pressure[N_REG_CLASSES];
3056
3057   save_reg_pressure ();
3058   for (i = 0; i < ira_pressure_classes_num; i++)
3059     max_reg_pressure[ira_pressure_classes[i]]
3060       = curr_reg_pressure[ira_pressure_classes[i]];
3061   for (insn = NEXT_INSN (after);
3062        insn != NULL_RTX && ! BARRIER_P (insn)
3063          && BLOCK_FOR_INSN (insn) == BLOCK_FOR_INSN (after);
3064        insn = NEXT_INSN (insn))
3065     if (NONDEBUG_INSN_P (insn))
3066       {
3067         eq_p = true;
3068         for (i = 0; i < ira_pressure_classes_num; i++)
3069           {
3070             p = max_reg_pressure[ira_pressure_classes[i]];
3071             if (INSN_MAX_REG_PRESSURE (insn)[i] != p)
3072               {
3073                 eq_p = false;
3074                 INSN_MAX_REG_PRESSURE (insn)[i]
3075                   = max_reg_pressure[ira_pressure_classes[i]];
3076               }
3077           }
3078         if (update_p && eq_p)
3079           break;
3080         update_register_pressure (insn);
3081         for (i = 0; i < ira_pressure_classes_num; i++)
3082           if (max_reg_pressure[ira_pressure_classes[i]]
3083               < curr_reg_pressure[ira_pressure_classes[i]])
3084             max_reg_pressure[ira_pressure_classes[i]]
3085               = curr_reg_pressure[ira_pressure_classes[i]];
3086       }
3087   restore_reg_pressure ();
3088 }
3089
3090 /* Update the current register pressure after scheduling INSN.  Update
3091    also max register pressure for unscheduled insns of the current
3092    BB.  */
3093 static void
3094 update_reg_and_insn_max_reg_pressure (rtx insn)
3095 {
3096   int i;
3097   int before[N_REG_CLASSES];
3098
3099   for (i = 0; i < ira_pressure_classes_num; i++)
3100     before[i] = curr_reg_pressure[ira_pressure_classes[i]];
3101   update_register_pressure (insn);
3102   for (i = 0; i < ira_pressure_classes_num; i++)
3103     if (curr_reg_pressure[ira_pressure_classes[i]] != before[i])
3104       break;
3105   if (i < ira_pressure_classes_num)
3106     setup_insn_max_reg_pressure (insn, true);
3107 }
3108
3109 /* Set up register pressure at the beginning of basic block BB whose
3110    insns starting after insn AFTER.  Set up also max register pressure
3111    for all insns of the basic block.  */
3112 void
3113 sched_setup_bb_reg_pressure_info (basic_block bb, rtx after)
3114 {
3115   gcc_assert (sched_pressure == SCHED_PRESSURE_WEIGHTED);
3116   initiate_bb_reg_pressure_info (bb);
3117   setup_insn_max_reg_pressure (after, false);
3118 }
3119 \f
3120 /* If doing predication while scheduling, verify whether INSN, which
3121    has just been scheduled, clobbers the conditions of any
3122    instructions that must be predicated in order to break their
3123    dependencies.  If so, remove them from the queues so that they will
3124    only be scheduled once their control dependency is resolved.  */
3125
3126 static void
3127 check_clobbered_conditions (rtx insn)
3128 {
3129   HARD_REG_SET t;
3130   int i;
3131
3132   if ((current_sched_info->flags & DO_PREDICATION) == 0)
3133     return;
3134
3135   find_all_hard_reg_sets (insn, &t, true);
3136
3137  restart:
3138   for (i = 0; i < ready.n_ready; i++)
3139     {
3140       rtx_insn *x = ready_element (&ready, i);
3141       if (TODO_SPEC (x) == DEP_CONTROL && cond_clobbered_p (x, t))
3142         {
3143           ready_remove_insn (x);
3144           goto restart;
3145         }
3146     }
3147   for (i = 0; i <= max_insn_queue_index; i++)
3148     {
3149       rtx link;
3150       int q = NEXT_Q_AFTER (q_ptr, i);
3151
3152     restart_queue:
3153       for (link = insn_queue[q]; link; link = XEXP (link, 1))
3154         {
3155           rtx_insn *x = as_a <rtx_insn *> (XEXP (link, 0));
3156           if (TODO_SPEC (x) == DEP_CONTROL && cond_clobbered_p (x, t))
3157             {
3158               queue_remove (x);
3159               goto restart_queue;
3160             }
3161         }
3162     }
3163 }
3164 \f
3165 /* Return (in order):
3166
3167    - positive if INSN adversely affects the pressure on one
3168      register class
3169
3170    - negative if INSN reduces the pressure on one register class
3171
3172    - 0 if INSN doesn't affect the pressure on any register class.  */
3173
3174 static int
3175 model_classify_pressure (struct model_insn_info *insn)
3176 {
3177   struct reg_pressure_data *reg_pressure;
3178   int death[N_REG_CLASSES];
3179   int pci, cl, sum;
3180
3181   calculate_reg_deaths (insn->insn, death);
3182   reg_pressure = INSN_REG_PRESSURE (insn->insn);
3183   sum = 0;
3184   for (pci = 0; pci < ira_pressure_classes_num; pci++)
3185     {
3186       cl = ira_pressure_classes[pci];
3187       if (death[cl] < reg_pressure[pci].set_increase)
3188         return 1;
3189       sum += reg_pressure[pci].set_increase - death[cl];
3190     }
3191   return sum;
3192 }
3193
3194 /* Return true if INSN1 should come before INSN2 in the model schedule.  */
3195
3196 static int
3197 model_order_p (struct model_insn_info *insn1, struct model_insn_info *insn2)
3198 {
3199   unsigned int height1, height2;
3200   unsigned int priority1, priority2;
3201
3202   /* Prefer instructions with a higher model priority.  */
3203   if (insn1->model_priority != insn2->model_priority)
3204     return insn1->model_priority > insn2->model_priority;
3205
3206   /* Combine the length of the longest path of satisfied true dependencies
3207      that leads to each instruction (depth) with the length of the longest
3208      path of any dependencies that leads from the instruction (alap).
3209      Prefer instructions with the greatest combined length.  If the combined
3210      lengths are equal, prefer instructions with the greatest depth.
3211
3212      The idea is that, if we have a set S of "equal" instructions that each
3213      have ALAP value X, and we pick one such instruction I, any true-dependent
3214      successors of I that have ALAP value X - 1 should be preferred over S.
3215      This encourages the schedule to be "narrow" rather than "wide".
3216      However, if I is a low-priority instruction that we decided to
3217      schedule because of its model_classify_pressure, and if there
3218      is a set of higher-priority instructions T, the aforementioned
3219      successors of I should not have the edge over T.  */
3220   height1 = insn1->depth + insn1->alap;
3221   height2 = insn2->depth + insn2->alap;
3222   if (height1 != height2)
3223     return height1 > height2;
3224   if (insn1->depth != insn2->depth)
3225     return insn1->depth > insn2->depth;
3226
3227   /* We have no real preference between INSN1 an INSN2 as far as attempts
3228      to reduce pressure go.  Prefer instructions with higher priorities.  */
3229   priority1 = INSN_PRIORITY (insn1->insn);
3230   priority2 = INSN_PRIORITY (insn2->insn);
3231   if (priority1 != priority2)
3232     return priority1 > priority2;
3233
3234   /* Use the original rtl sequence as a tie-breaker.  */
3235   return insn1 < insn2;
3236 }
3237
3238 /* Add INSN to the model worklist immediately after PREV.  Add it to the
3239    beginning of the list if PREV is null.  */
3240
3241 static void
3242 model_add_to_worklist_at (struct model_insn_info *insn,
3243                           struct model_insn_info *prev)
3244 {
3245   gcc_assert (QUEUE_INDEX (insn->insn) == QUEUE_NOWHERE);
3246   QUEUE_INDEX (insn->insn) = QUEUE_READY;
3247
3248   insn->prev = prev;
3249   if (prev)
3250     {
3251       insn->next = prev->next;
3252       prev->next = insn;
3253     }
3254   else
3255     {
3256       insn->next = model_worklist;
3257       model_worklist = insn;
3258     }
3259   if (insn->next)
3260     insn->next->prev = insn;
3261 }
3262
3263 /* Remove INSN from the model worklist.  */
3264
3265 static void
3266 model_remove_from_worklist (struct model_insn_info *insn)
3267 {
3268   gcc_assert (QUEUE_INDEX (insn->insn) == QUEUE_READY);
3269   QUEUE_INDEX (insn->insn) = QUEUE_NOWHERE;
3270
3271   if (insn->prev)
3272     insn->prev->next = insn->next;
3273   else
3274     model_worklist = insn->next;
3275   if (insn->next)
3276     insn->next->prev = insn->prev;
3277 }
3278
3279 /* Add INSN to the model worklist.  Start looking for a suitable position
3280    between neighbors PREV and NEXT, testing at most MAX_SCHED_READY_INSNS
3281    insns either side.  A null PREV indicates the beginning of the list and
3282    a null NEXT indicates the end.  */
3283
3284 static void
3285 model_add_to_worklist (struct model_insn_info *insn,
3286                        struct model_insn_info *prev,
3287                        struct model_insn_info *next)
3288 {
3289   int count;
3290
3291   count = MAX_SCHED_READY_INSNS;
3292   if (count > 0 && prev && model_order_p (insn, prev))
3293     do
3294       {
3295         count--;
3296         prev = prev->prev;
3297       }
3298     while (count > 0 && prev && model_order_p (insn, prev));
3299   else
3300     while (count > 0 && next && model_order_p (next, insn))
3301       {
3302         count--;
3303         prev = next;
3304         next = next->next;
3305       }
3306   model_add_to_worklist_at (insn, prev);
3307 }
3308
3309 /* INSN may now have a higher priority (in the model_order_p sense)
3310    than before.  Move it up the worklist if necessary.  */
3311
3312 static void
3313 model_promote_insn (struct model_insn_info *insn)
3314 {
3315   struct model_insn_info *prev;
3316   int count;
3317
3318   prev = insn->prev;
3319   count = MAX_SCHED_READY_INSNS;
3320   while (count > 0 && prev && model_order_p (insn, prev))
3321     {
3322       count--;
3323       prev = prev->prev;
3324     }
3325   if (prev != insn->prev)
3326     {
3327       model_remove_from_worklist (insn);
3328       model_add_to_worklist_at (insn, prev);
3329     }
3330 }
3331
3332 /* Add INSN to the end of the model schedule.  */
3333
3334 static void
3335 model_add_to_schedule (rtx insn)
3336 {
3337   unsigned int point;
3338
3339   gcc_assert (QUEUE_INDEX (insn) == QUEUE_NOWHERE);
3340   QUEUE_INDEX (insn) = QUEUE_SCHEDULED;
3341
3342   point = model_schedule.length ();
3343   model_schedule.quick_push (insn);
3344   INSN_MODEL_INDEX (insn) = point + 1;
3345 }
3346
3347 /* Analyze the instructions that are to be scheduled, setting up
3348    MODEL_INSN_INFO (...) and model_num_insns accordingly.  Add ready
3349    instructions to model_worklist.  */
3350
3351 static void
3352 model_analyze_insns (void)
3353 {
3354   rtx start, end, iter;
3355   sd_iterator_def sd_it;
3356   dep_t dep;
3357   struct model_insn_info *insn, *con;
3358
3359   model_num_insns = 0;
3360   start = PREV_INSN (current_sched_info->next_tail);
3361   end = current_sched_info->prev_head;
3362   for (iter = start; iter != end; iter = PREV_INSN (iter))
3363     if (NONDEBUG_INSN_P (iter))
3364       {
3365         insn = MODEL_INSN_INFO (iter);
3366         insn->insn = iter;
3367         FOR_EACH_DEP (iter, SD_LIST_FORW, sd_it, dep)
3368           {
3369             con = MODEL_INSN_INFO (DEP_CON (dep));
3370             if (con->insn && insn->alap < con->alap + 1)
3371               insn->alap = con->alap + 1;
3372           }
3373
3374         insn->old_queue = QUEUE_INDEX (iter);
3375         QUEUE_INDEX (iter) = QUEUE_NOWHERE;
3376
3377         insn->unscheduled_preds = dep_list_size (iter, SD_LIST_HARD_BACK);
3378         if (insn->unscheduled_preds == 0)
3379           model_add_to_worklist (insn, NULL, model_worklist);
3380
3381         model_num_insns++;
3382       }
3383 }
3384
3385 /* The global state describes the register pressure at the start of the
3386    model schedule.  Initialize GROUP accordingly.  */
3387
3388 static void
3389 model_init_pressure_group (struct model_pressure_group *group)
3390 {
3391   int pci, cl;
3392
3393   for (pci = 0; pci < ira_pressure_classes_num; pci++)
3394     {
3395       cl = ira_pressure_classes[pci];
3396       group->limits[pci].pressure = curr_reg_pressure[cl];
3397       group->limits[pci].point = 0;
3398     }
3399   /* Use index model_num_insns to record the state after the last
3400      instruction in the model schedule.  */
3401   group->model = XNEWVEC (struct model_pressure_data,
3402                           (model_num_insns + 1) * ira_pressure_classes_num);
3403 }
3404
3405 /* Record that MODEL_REF_PRESSURE (GROUP, POINT, PCI) is PRESSURE.
3406    Update the maximum pressure for the whole schedule.  */
3407
3408 static void
3409 model_record_pressure (struct model_pressure_group *group,
3410                        int point, int pci, int pressure)
3411 {
3412   MODEL_REF_PRESSURE (group, point, pci) = pressure;
3413   if (group->limits[pci].pressure < pressure)
3414     {
3415       group->limits[pci].pressure = pressure;
3416       group->limits[pci].point = point;
3417     }
3418 }
3419
3420 /* INSN has just been added to the end of the model schedule.  Record its
3421    register-pressure information.  */
3422
3423 static void
3424 model_record_pressures (struct model_insn_info *insn)
3425 {
3426   struct reg_pressure_data *reg_pressure;
3427   int point, pci, cl, delta;
3428   int death[N_REG_CLASSES];
3429
3430   point = model_index (insn->insn);
3431   if (sched_verbose >= 2)
3432     {
3433       if (point == 0)
3434         {
3435           fprintf (sched_dump, "\n;;\tModel schedule:\n;;\n");
3436           fprintf (sched_dump, ";;\t| idx insn | mpri hght dpth prio |\n");
3437         }
3438       fprintf (sched_dump, ";;\t| %3d %4d | %4d %4d %4d %4d | %-30s ",
3439                point, INSN_UID (insn->insn), insn->model_priority,
3440                insn->depth + insn->alap, insn->depth,
3441                INSN_PRIORITY (insn->insn),
3442                str_pattern_slim (PATTERN (insn->insn)));
3443     }
3444   calculate_reg_deaths (insn->insn, death);
3445   reg_pressure = INSN_REG_PRESSURE (insn->insn);
3446   for (pci = 0; pci < ira_pressure_classes_num; pci++)
3447     {
3448       cl = ira_pressure_classes[pci];
3449       delta = reg_pressure[pci].set_increase - death[cl];
3450       if (sched_verbose >= 2)
3451         fprintf (sched_dump, " %s:[%d,%+d]", reg_class_names[cl],
3452                  curr_reg_pressure[cl], delta);
3453       model_record_pressure (&model_before_pressure, point, pci,
3454                              curr_reg_pressure[cl]);
3455     }
3456   if (sched_verbose >= 2)
3457     fprintf (sched_dump, "\n");
3458 }
3459
3460 /* All instructions have been added to the model schedule.  Record the
3461    final register pressure in GROUP and set up all MODEL_MAX_PRESSUREs.  */
3462
3463 static void
3464 model_record_final_pressures (struct model_pressure_group *group)
3465 {
3466   int point, pci, max_pressure, ref_pressure, cl;
3467
3468   for (pci = 0; pci < ira_pressure_classes_num; pci++)
3469     {
3470       /* Record the final pressure for this class.  */
3471       cl = ira_pressure_classes[pci];
3472       point = model_num_insns;
3473       ref_pressure = curr_reg_pressure[cl];
3474       model_record_pressure (group, point, pci, ref_pressure);
3475
3476       /* Record the original maximum pressure.  */
3477       group->limits[pci].orig_pressure = group->limits[pci].pressure;
3478
3479       /* Update the MODEL_MAX_PRESSURE for every point of the schedule.  */
3480       max_pressure = ref_pressure;
3481       MODEL_MAX_PRESSURE (group, point, pci) = max_pressure;
3482       while (point > 0)
3483         {
3484           point--;
3485           ref_pressure = MODEL_REF_PRESSURE (group, point, pci);
3486           max_pressure = MAX (max_pressure, ref_pressure);
3487           MODEL_MAX_PRESSURE (group, point, pci) = max_pressure;
3488         }
3489     }
3490 }
3491
3492 /* Update all successors of INSN, given that INSN has just been scheduled.  */
3493
3494 static void
3495 model_add_successors_to_worklist (struct model_insn_info *insn)
3496 {
3497   sd_iterator_def sd_it;
3498   struct model_insn_info *con;
3499   dep_t dep;
3500
3501   FOR_EACH_DEP (insn->insn, SD_LIST_FORW, sd_it, dep)
3502     {
3503       con = MODEL_INSN_INFO (DEP_CON (dep));
3504       /* Ignore debug instructions, and instructions from other blocks.  */
3505       if (con->insn)
3506         {
3507           con->unscheduled_preds--;
3508
3509           /* Update the depth field of each true-dependent successor.
3510              Increasing the depth gives them a higher priority than
3511              before.  */
3512           if (DEP_TYPE (dep) == REG_DEP_TRUE && con->depth < insn->depth + 1)
3513             {
3514               con->depth = insn->depth + 1;
3515               if (QUEUE_INDEX (con->insn) == QUEUE_READY)
3516                 model_promote_insn (con);
3517             }
3518
3519           /* If this is a true dependency, or if there are no remaining
3520              dependencies for CON (meaning that CON only had non-true
3521              dependencies), make sure that CON is on the worklist.
3522              We don't bother otherwise because it would tend to fill the
3523              worklist with a lot of low-priority instructions that are not
3524              yet ready to issue.  */
3525           if ((con->depth > 0 || con->unscheduled_preds == 0)
3526               && QUEUE_INDEX (con->insn) == QUEUE_NOWHERE)
3527             model_add_to_worklist (con, insn, insn->next);
3528         }
3529     }
3530 }
3531
3532 /* Give INSN a higher priority than any current instruction, then give
3533    unscheduled predecessors of INSN a higher priority still.  If any of
3534    those predecessors are not on the model worklist, do the same for its
3535    predecessors, and so on.  */
3536
3537 static void
3538 model_promote_predecessors (struct model_insn_info *insn)
3539 {
3540   struct model_insn_info *pro, *first;
3541   sd_iterator_def sd_it;
3542   dep_t dep;
3543
3544   if (sched_verbose >= 7)
3545     fprintf (sched_dump, ";;\t+--- priority of %d = %d, priority of",
3546              INSN_UID (insn->insn), model_next_priority);
3547   insn->model_priority = model_next_priority++;
3548   model_remove_from_worklist (insn);
3549   model_add_to_worklist_at (insn, NULL);
3550
3551   first = NULL;
3552   for (;;)
3553     {
3554       FOR_EACH_DEP (insn->insn, SD_LIST_HARD_BACK, sd_it, dep)
3555         {
3556           pro = MODEL_INSN_INFO (DEP_PRO (dep));
3557           /* The first test is to ignore debug instructions, and instructions
3558              from other blocks.  */
3559           if (pro->insn
3560               && pro->model_priority != model_next_priority
3561               && QUEUE_INDEX (pro->insn) != QUEUE_SCHEDULED)
3562             {
3563               pro->model_priority = model_next_priority;
3564               if (sched_verbose >= 7)
3565                 fprintf (sched_dump, " %d", INSN_UID (pro->insn));
3566               if (QUEUE_INDEX (pro->insn) == QUEUE_READY)
3567                 {
3568                   /* PRO is already in the worklist, but it now has
3569                      a higher priority than before.  Move it at the
3570                      appropriate place.  */
3571                   model_remove_from_worklist (pro);
3572                   model_add_to_worklist (pro, NULL, model_worklist);
3573                 }
3574               else
3575                 {
3576                   /* PRO isn't in the worklist.  Recursively process
3577                      its predecessors until we find one that is.  */
3578                   pro->next = first;
3579                   first = pro;
3580                 }
3581             }
3582         }
3583       if (!first)
3584         break;
3585       insn = first;
3586       first = insn->next;
3587     }
3588   if (sched_verbose >= 7)
3589     fprintf (sched_dump, " = %d\n", model_next_priority);
3590   model_next_priority++;
3591 }
3592
3593 /* Pick one instruction from model_worklist and process it.  */
3594
3595 static void
3596 model_choose_insn (void)
3597 {
3598   struct model_insn_info *insn, *fallback;
3599   int count;
3600
3601   if (sched_verbose >= 7)
3602     {
3603       fprintf (sched_dump, ";;\t+--- worklist:\n");
3604       insn = model_worklist;
3605       count = MAX_SCHED_READY_INSNS;
3606       while (count > 0 && insn)
3607         {
3608           fprintf (sched_dump, ";;\t+---   %d [%d, %d, %d, %d]\n",
3609                    INSN_UID (insn->insn), insn->model_priority,
3610                    insn->depth + insn->alap, insn->depth,
3611                    INSN_PRIORITY (insn->insn));
3612           count--;
3613           insn = insn->next;
3614         }
3615     }
3616
3617   /* Look for a ready instruction whose model_classify_priority is zero
3618      or negative, picking the highest-priority one.  Adding such an
3619      instruction to the schedule now should do no harm, and may actually
3620      do some good.
3621
3622      Failing that, see whether there is an instruction with the highest
3623      extant model_priority that is not yet ready, but which would reduce
3624      pressure if it became ready.  This is designed to catch cases like:
3625
3626        (set (mem (reg R1)) (reg R2))
3627
3628      where the instruction is the last remaining use of R1 and where the
3629      value of R2 is not yet available (or vice versa).  The death of R1
3630      means that this instruction already reduces pressure.  It is of
3631      course possible that the computation of R2 involves other registers
3632      that are hard to kill, but such cases are rare enough for this
3633      heuristic to be a win in general.
3634
3635      Failing that, just pick the highest-priority instruction in the
3636      worklist.  */
3637   count = MAX_SCHED_READY_INSNS;
3638   insn = model_worklist;
3639   fallback = 0;
3640   for (;;)
3641     {
3642       if (count == 0 || !insn)
3643         {
3644           insn = fallback ? fallback : model_worklist;
3645           break;
3646         }
3647       if (insn->unscheduled_preds)
3648         {
3649           if (model_worklist->model_priority == insn->model_priority
3650               && !fallback
3651               && model_classify_pressure (insn) < 0)
3652             fallback = insn;
3653         }
3654       else
3655         {
3656           if (model_classify_pressure (insn) <= 0)
3657             break;
3658         }
3659       count--;
3660       insn = insn->next;
3661     }
3662
3663   if (sched_verbose >= 7 && insn != model_worklist)
3664     {
3665       if (insn->unscheduled_preds)
3666         fprintf (sched_dump, ";;\t+--- promoting insn %d, with dependencies\n",
3667                  INSN_UID (insn->insn));
3668       else
3669         fprintf (sched_dump, ";;\t+--- promoting insn %d, which is ready\n",
3670                  INSN_UID (insn->insn));
3671     }
3672   if (insn->unscheduled_preds)
3673     /* INSN isn't yet ready to issue.  Give all its predecessors the
3674        highest priority.  */
3675     model_promote_predecessors (insn);
3676   else
3677     {
3678       /* INSN is ready.  Add it to the end of model_schedule and
3679          process its successors.  */
3680       model_add_successors_to_worklist (insn);
3681       model_remove_from_worklist (insn);
3682       model_add_to_schedule (insn->insn);
3683       model_record_pressures (insn);
3684       update_register_pressure (insn->insn);
3685     }
3686 }
3687
3688 /* Restore all QUEUE_INDEXs to the values that they had before
3689    model_start_schedule was called.  */
3690
3691 static void
3692 model_reset_queue_indices (void)
3693 {
3694   unsigned int i;
3695   rtx insn;
3696
3697   FOR_EACH_VEC_ELT (model_schedule, i, insn)
3698     QUEUE_INDEX (insn) = MODEL_INSN_INFO (insn)->old_queue;
3699 }
3700
3701 /* We have calculated the model schedule and spill costs.  Print a summary
3702    to sched_dump.  */
3703
3704 static void
3705 model_dump_pressure_summary (void)
3706 {
3707   int pci, cl;
3708
3709   fprintf (sched_dump, ";; Pressure summary:");
3710   for (pci = 0; pci < ira_pressure_classes_num; pci++)
3711     {
3712       cl = ira_pressure_classes[pci];
3713       fprintf (sched_dump, " %s:%d", reg_class_names[cl],
3714                model_before_pressure.limits[pci].pressure);
3715     }
3716   fprintf (sched_dump, "\n\n");
3717 }
3718
3719 /* Initialize the SCHED_PRESSURE_MODEL information for the current
3720    scheduling region.  */
3721
3722 static void
3723 model_start_schedule (void)
3724 {
3725   basic_block bb;
3726
3727   model_next_priority = 1;
3728   model_schedule.create (sched_max_luid);
3729   model_insns = XCNEWVEC (struct model_insn_info, sched_max_luid);
3730
3731   bb = BLOCK_FOR_INSN (NEXT_INSN (current_sched_info->prev_head));
3732   initiate_reg_pressure_info (df_get_live_in (bb));
3733
3734   model_analyze_insns ();
3735   model_init_pressure_group (&model_before_pressure);
3736   while (model_worklist)
3737     model_choose_insn ();
3738   gcc_assert (model_num_insns == (int) model_schedule.length ());
3739   if (sched_verbose >= 2)
3740     fprintf (sched_dump, "\n");
3741
3742   model_record_final_pressures (&model_before_pressure);
3743   model_reset_queue_indices ();
3744
3745   XDELETEVEC (model_insns);
3746
3747   model_curr_point = 0;
3748   initiate_reg_pressure_info (df_get_live_in (bb));
3749   if (sched_verbose >= 1)
3750     model_dump_pressure_summary ();
3751 }
3752
3753 /* Free the information associated with GROUP.  */
3754
3755 static void
3756 model_finalize_pressure_group (struct model_pressure_group *group)
3757 {
3758   XDELETEVEC (group->model);
3759 }
3760
3761 /* Free the information created by model_start_schedule.  */
3762
3763 static void
3764 model_end_schedule (void)
3765 {
3766   model_finalize_pressure_group (&model_before_pressure);
3767   model_schedule.release ();
3768 }
3769 \f
3770 /* A structure that holds local state for the loop in schedule_block.  */
3771 struct sched_block_state
3772 {
3773   /* True if no real insns have been scheduled in the current cycle.  */
3774   bool first_cycle_insn_p;
3775   /* True if a shadow insn has been scheduled in the current cycle, which
3776      means that no more normal insns can be issued.  */
3777   bool shadows_only_p;
3778   /* True if we're winding down a modulo schedule, which means that we only
3779      issue insns with INSN_EXACT_TICK set.  */
3780   bool modulo_epilogue;
3781   /* Initialized with the machine's issue rate every cycle, and updated
3782      by calls to the variable_issue hook.  */
3783   int can_issue_more;
3784 };
3785
3786 /* INSN is the "currently executing insn".  Launch each insn which was
3787    waiting on INSN.  READY is the ready list which contains the insns
3788    that are ready to fire.  CLOCK is the current cycle.  The function
3789    returns necessary cycle advance after issuing the insn (it is not
3790    zero for insns in a schedule group).  */
3791
3792 static int
3793 schedule_insn (rtx_insn *insn)
3794 {
3795   sd_iterator_def sd_it;
3796   dep_t dep;
3797   int i;
3798   int advance = 0;
3799
3800   if (sched_verbose >= 1)
3801     {
3802       struct reg_pressure_data *pressure_info;
3803       fprintf (sched_dump, ";;\t%3i--> %s %-40s:",
3804                clock_var, (*current_sched_info->print_insn) (insn, 1),
3805                str_pattern_slim (PATTERN (insn)));
3806
3807       if (recog_memoized (insn) < 0)
3808         fprintf (sched_dump, "nothing");
3809       else
3810         print_reservation (sched_dump, insn);
3811       pressure_info = INSN_REG_PRESSURE (insn);
3812       if (pressure_info != NULL)
3813         {
3814           fputc (':', sched_dump);
3815           for (i = 0; i < ira_pressure_classes_num; i++)
3816             fprintf (sched_dump, "%s%s%+d(%d)",
3817                      scheduled_insns.length () > 1
3818                      && INSN_LUID (insn)
3819                      < INSN_LUID (scheduled_insns[scheduled_insns.length () - 2]) ? "@" : "",
3820                      reg_class_names[ira_pressure_classes[i]],
3821                      pressure_info[i].set_increase, pressure_info[i].change);
3822         }
3823       if (sched_pressure == SCHED_PRESSURE_MODEL
3824           && model_curr_point < model_num_insns
3825           && model_index (insn) == model_curr_point)
3826         fprintf (sched_dump, ":model %d", model_curr_point);
3827       fputc ('\n', sched_dump);
3828     }
3829
3830   if (sched_pressure == SCHED_PRESSURE_WEIGHTED && !DEBUG_INSN_P (insn))
3831     update_reg_and_insn_max_reg_pressure (insn);
3832
3833   /* Scheduling instruction should have all its dependencies resolved and
3834      should have been removed from the ready list.  */
3835   gcc_assert (sd_lists_empty_p (insn, SD_LIST_HARD_BACK));
3836
3837   /* Reset debug insns invalidated by moving this insn.  */
3838   if (MAY_HAVE_DEBUG_INSNS && !DEBUG_INSN_P (insn))
3839     for (sd_it = sd_iterator_start (insn, SD_LIST_BACK);
3840          sd_iterator_cond (&sd_it, &dep);)
3841       {
3842         rtx_insn *dbg = DEP_PRO (dep);
3843         struct reg_use_data *use, *next;
3844
3845         if (DEP_STATUS (dep) & DEP_CANCELLED)
3846           {
3847             sd_iterator_next (&sd_it);
3848             continue;
3849           }
3850
3851         gcc_assert (DEBUG_INSN_P (dbg));
3852
3853         if (sched_verbose >= 6)
3854           fprintf (sched_dump, ";;\t\tresetting: debug insn %d\n",
3855                    INSN_UID (dbg));
3856
3857         /* ??? Rather than resetting the debug insn, we might be able
3858            to emit a debug temp before the just-scheduled insn, but
3859            this would involve checking that the expression at the
3860            point of the debug insn is equivalent to the expression
3861            before the just-scheduled insn.  They might not be: the
3862            expression in the debug insn may depend on other insns not
3863            yet scheduled that set MEMs, REGs or even other debug
3864            insns.  It's not clear that attempting to preserve debug
3865            information in these cases is worth the effort, given how
3866            uncommon these resets are and the likelihood that the debug
3867            temps introduced won't survive the schedule change.  */
3868         INSN_VAR_LOCATION_LOC (dbg) = gen_rtx_UNKNOWN_VAR_LOC ();
3869         df_insn_rescan (dbg);
3870
3871         /* Unknown location doesn't use any registers.  */
3872         for (use = INSN_REG_USE_LIST (dbg); use != NULL; use = next)
3873           {
3874             struct reg_use_data *prev = use;
3875
3876             /* Remove use from the cyclic next_regno_use chain first.  */
3877             while (prev->next_regno_use != use)
3878               prev = prev->next_regno_use;
3879             prev->next_regno_use = use->next_regno_use;
3880             next = use->next_insn_use;
3881             free (use);
3882           }
3883         INSN_REG_USE_LIST (dbg) = NULL;
3884
3885         /* We delete rather than resolve these deps, otherwise we
3886            crash in sched_free_deps(), because forward deps are
3887            expected to be released before backward deps.  */
3888         sd_delete_dep (sd_it);
3889       }
3890
3891   gcc_assert (QUEUE_INDEX (insn) == QUEUE_NOWHERE);
3892   QUEUE_INDEX (insn) = QUEUE_SCHEDULED;
3893
3894   if (sched_pressure == SCHED_PRESSURE_MODEL
3895       && model_curr_point < model_num_insns
3896       && NONDEBUG_INSN_P (insn))
3897     {
3898       if (model_index (insn) == model_curr_point)
3899         do
3900           model_curr_point++;
3901         while (model_curr_point < model_num_insns
3902                && (QUEUE_INDEX (MODEL_INSN (model_curr_point))
3903                    == QUEUE_SCHEDULED));
3904       else
3905         model_recompute (insn);
3906       model_update_limit_points ();
3907       update_register_pressure (insn);
3908       if (sched_verbose >= 2)
3909         print_curr_reg_pressure ();
3910     }
3911
3912   gcc_assert (INSN_TICK (insn) >= MIN_TICK);
3913   if (INSN_TICK (insn) > clock_var)
3914     /* INSN has been prematurely moved from the queue to the ready list.
3915        This is possible only if following flag is set.  */
3916     gcc_assert (flag_sched_stalled_insns);
3917
3918   /* ??? Probably, if INSN is scheduled prematurely, we should leave
3919      INSN_TICK untouched.  This is a machine-dependent issue, actually.  */
3920   INSN_TICK (insn) = clock_var;
3921
3922   check_clobbered_conditions (insn);
3923
3924   /* Update dependent instructions.  First, see if by scheduling this insn
3925      now we broke a dependence in a way that requires us to change another
3926      insn.  */
3927   for (sd_it = sd_iterator_start (insn, SD_LIST_SPEC_BACK);
3928        sd_iterator_cond (&sd_it, &dep); sd_iterator_next (&sd_it))
3929     {
3930       struct dep_replacement *desc = DEP_REPLACE (dep);
3931       rtx_insn *pro = DEP_PRO (dep);
3932       if (QUEUE_INDEX (pro) != QUEUE_SCHEDULED
3933           && desc != NULL && desc->insn == pro)
3934         apply_replacement (dep, false);
3935     }
3936
3937   /* Go through and resolve forward dependencies.  */
3938   for (sd_it = sd_iterator_start (insn, SD_LIST_FORW);
3939        sd_iterator_cond (&sd_it, &dep);)
3940     {
3941       rtx_insn *next = DEP_CON (dep);
3942       bool cancelled = (DEP_STATUS (dep) & DEP_CANCELLED) != 0;
3943
3944       /* Resolve the dependence between INSN and NEXT.
3945          sd_resolve_dep () moves current dep to another list thus
3946          advancing the iterator.  */
3947       sd_resolve_dep (sd_it);
3948
3949       if (cancelled)
3950         {
3951           if (must_restore_pattern_p (next, dep))
3952             restore_pattern (dep, false);
3953           continue;
3954         }
3955
3956       /* Don't bother trying to mark next as ready if insn is a debug
3957          insn.  If insn is the last hard dependency, it will have
3958          already been discounted.  */
3959       if (DEBUG_INSN_P (insn) && !DEBUG_INSN_P (next))
3960         continue;
3961
3962       if (!IS_SPECULATION_BRANCHY_CHECK_P (insn))
3963         {
3964           int effective_cost;
3965
3966           effective_cost = try_ready (next);
3967
3968           if (effective_cost >= 0
3969               && SCHED_GROUP_P (next)
3970               && advance < effective_cost)
3971             advance = effective_cost;
3972         }
3973       else
3974         /* Check always has only one forward dependence (to the first insn in
3975            the recovery block), therefore, this will be executed only once.  */
3976         {
3977           gcc_assert (sd_lists_empty_p (insn, SD_LIST_FORW));
3978           fix_recovery_deps (RECOVERY_BLOCK (insn));
3979         }
3980     }
3981
3982   /* Annotate the instruction with issue information -- TImode
3983      indicates that the instruction is expected not to be able
3984      to issue on the same cycle as the previous insn.  A machine
3985      may use this information to decide how the instruction should
3986      be aligned.  */
3987   if (issue_rate > 1
3988       && GET_CODE (PATTERN (insn)) != USE
3989       && GET_CODE (PATTERN (insn)) != CLOBBER
3990       && !DEBUG_INSN_P (insn))
3991     {
3992       if (reload_completed)
3993         PUT_MODE (insn, clock_var > last_clock_var ? TImode : VOIDmode);
3994       last_clock_var = clock_var;
3995     }
3996
3997   if (nonscheduled_insns_begin != NULL_RTX)
3998     /* Indicate to debug counters that INSN is scheduled.  */
3999     nonscheduled_insns_begin = insn;
4000
4001   return advance;
4002 }
4003
4004 /* Functions for handling of notes.  */
4005
4006 /* Add note list that ends on FROM_END to the end of TO_ENDP.  */
4007 void
4008 concat_note_lists (rtx_insn *from_end, rtx_insn **to_endp)
4009 {
4010   rtx_insn *from_start;
4011
4012   /* It's easy when have nothing to concat.  */
4013   if (from_end == NULL)
4014     return;
4015
4016   /* It's also easy when destination is empty.  */
4017   if (*to_endp == NULL)
4018     {
4019       *to_endp = from_end;
4020       return;
4021     }
4022
4023   from_start = from_end;
4024   while (PREV_INSN (from_start) != NULL)
4025     from_start = PREV_INSN (from_start);
4026
4027   SET_PREV_INSN (from_start) = *to_endp;
4028   SET_NEXT_INSN (*to_endp) = from_start;
4029   *to_endp = from_end;
4030 }
4031
4032 /* Delete notes between HEAD and TAIL and put them in the chain
4033    of notes ended by NOTE_LIST.  */
4034 void
4035 remove_notes (rtx_insn *head, rtx_insn *tail)
4036 {
4037   rtx_insn *next_tail, *insn, *next;
4038
4039   note_list = 0;
4040   if (head == tail && !INSN_P (head))
4041     return;
4042
4043   next_tail = NEXT_INSN (tail);
4044   for (insn = head; insn != next_tail; insn = next)
4045     {
4046       next = NEXT_INSN (insn);
4047       if (!NOTE_P (insn))
4048         continue;
4049
4050       switch (NOTE_KIND (insn))
4051         {
4052         case NOTE_INSN_BASIC_BLOCK:
4053           continue;
4054
4055         case NOTE_INSN_EPILOGUE_BEG:
4056           if (insn != tail)
4057             {
4058               remove_insn (insn);
4059               add_reg_note (next, REG_SAVE_NOTE,
4060                             GEN_INT (NOTE_INSN_EPILOGUE_BEG));
4061               break;
4062             }
4063           /* FALLTHRU */
4064
4065         default:
4066           remove_insn (insn);
4067
4068           /* Add the note to list that ends at NOTE_LIST.  */
4069           SET_PREV_INSN (insn) = note_list;
4070           SET_NEXT_INSN (insn) = NULL_RTX;
4071           if (note_list)
4072             SET_NEXT_INSN (note_list) = insn;
4073           note_list = insn;
4074           break;
4075         }
4076
4077       gcc_assert ((sel_sched_p () || insn != tail) && insn != head);
4078     }
4079 }
4080
4081 /* A structure to record enough data to allow us to backtrack the scheduler to
4082    a previous state.  */
4083 struct haifa_saved_data
4084 {
4085   /* Next entry on the list.  */
4086   struct haifa_saved_data *next;
4087
4088   /* Backtracking is associated with scheduling insns that have delay slots.
4089      DELAY_PAIR points to the structure that contains the insns involved, and
4090      the number of cycles between them.  */
4091   struct delay_pair *delay_pair;
4092
4093   /* Data used by the frontend (e.g. sched-ebb or sched-rgn).  */
4094   void *fe_saved_data;
4095   /* Data used by the backend.  */
4096   void *be_saved_data;
4097
4098   /* Copies of global state.  */
4099   int clock_var, last_clock_var;
4100   struct ready_list ready;
4101   state_t curr_state;
4102
4103   rtx_insn *last_scheduled_insn;
4104   rtx last_nondebug_scheduled_insn;
4105   rtx_insn *nonscheduled_insns_begin;
4106   int cycle_issued_insns;
4107
4108   /* Copies of state used in the inner loop of schedule_block.  */
4109   struct sched_block_state sched_block;
4110
4111   /* We don't need to save q_ptr, as its value is arbitrary and we can set it
4112      to 0 when restoring.  */
4113   int q_size;
4114   rtx *insn_queue;
4115
4116   /* Describe pattern replacements that occurred since this backtrack point
4117      was queued.  */
4118   vec<dep_t> replacement_deps;
4119   vec<int> replace_apply;
4120
4121   /* A copy of the next-cycle replacement vectors at the time of the backtrack
4122      point.  */
4123   vec<dep_t> next_cycle_deps;
4124   vec<int> next_cycle_apply;
4125 };
4126
4127 /* A record, in reverse order, of all scheduled insns which have delay slots
4128    and may require backtracking.  */
4129 static struct haifa_saved_data *backtrack_queue;
4130
4131 /* For every dependency of INSN, set the FEEDS_BACKTRACK_INSN bit according
4132    to SET_P.  */
4133 static void
4134 mark_backtrack_feeds (rtx insn, int set_p)
4135 {
4136   sd_iterator_def sd_it;
4137   dep_t dep;
4138   FOR_EACH_DEP (insn, SD_LIST_HARD_BACK, sd_it, dep)
4139     {
4140       FEEDS_BACKTRACK_INSN (DEP_PRO (dep)) = set_p;
4141     }
4142 }
4143
4144 /* Save the current scheduler state so that we can backtrack to it
4145    later if necessary.  PAIR gives the insns that make it necessary to
4146    save this point.  SCHED_BLOCK is the local state of schedule_block
4147    that need to be saved.  */
4148 static void
4149 save_backtrack_point (struct delay_pair *pair,
4150                       struct sched_block_state sched_block)
4151 {
4152   int i;
4153   struct haifa_saved_data *save = XNEW (struct haifa_saved_data);
4154
4155   save->curr_state = xmalloc (dfa_state_size);
4156   memcpy (save->curr_state, curr_state, dfa_state_size);
4157
4158   save->ready.first = ready.first;
4159   save->ready.n_ready = ready.n_ready;
4160   save->ready.n_debug = ready.n_debug;
4161   save->ready.veclen = ready.veclen;
4162   save->ready.vec = XNEWVEC (rtx_insn *, ready.veclen);
4163   memcpy (save->ready.vec, ready.vec, ready.veclen * sizeof (rtx));
4164
4165   save->insn_queue = XNEWVEC (rtx, max_insn_queue_index + 1);
4166   save->q_size = q_size;
4167   for (i = 0; i <= max_insn_queue_index; i++)
4168     {
4169       int q = NEXT_Q_AFTER (q_ptr, i);
4170       save->insn_queue[i] = copy_INSN_LIST (insn_queue[q]);
4171     }
4172
4173   save->clock_var = clock_var;
4174   save->last_clock_var = last_clock_var;
4175   save->cycle_issued_insns = cycle_issued_insns;
4176   save->last_scheduled_insn = last_scheduled_insn;
4177   save->last_nondebug_scheduled_insn = last_nondebug_scheduled_insn;
4178   save->nonscheduled_insns_begin = nonscheduled_insns_begin;
4179
4180   save->sched_block = sched_block;
4181
4182   save->replacement_deps.create (0);
4183   save->replace_apply.create (0);
4184   save->next_cycle_deps = next_cycle_replace_deps.copy ();
4185   save->next_cycle_apply = next_cycle_apply.copy ();
4186
4187   if (current_sched_info->save_state)
4188     save->fe_saved_data = (*current_sched_info->save_state) ();
4189
4190   if (targetm.sched.alloc_sched_context)
4191     {
4192       save->be_saved_data = targetm.sched.alloc_sched_context ();
4193       targetm.sched.init_sched_context (save->be_saved_data, false);
4194     }
4195   else
4196     save->be_saved_data = NULL;
4197
4198   save->delay_pair = pair;
4199
4200   save->next = backtrack_queue;
4201   backtrack_queue = save;
4202
4203   while (pair)
4204     {
4205       mark_backtrack_feeds (pair->i2, 1);
4206       INSN_TICK (pair->i2) = INVALID_TICK;
4207       INSN_EXACT_TICK (pair->i2) = clock_var + pair_delay (pair);
4208       SHADOW_P (pair->i2) = pair->stages == 0;
4209       pair = pair->next_same_i1;
4210     }
4211 }
4212
4213 /* Walk the ready list and all queues. If any insns have unresolved backwards
4214    dependencies, these must be cancelled deps, broken by predication.  Set or
4215    clear (depending on SET) the DEP_CANCELLED bit in DEP_STATUS.  */
4216
4217 static void
4218 toggle_cancelled_flags (bool set)
4219 {
4220   int i;
4221   sd_iterator_def sd_it;
4222   dep_t dep;
4223
4224   if (ready.n_ready > 0)
4225     {
4226       rtx_insn **first = ready_lastpos (&ready);
4227       for (i = 0; i < ready.n_ready; i++)
4228         FOR_EACH_DEP (first[i], SD_LIST_BACK, sd_it, dep)
4229           if (!DEBUG_INSN_P (DEP_PRO (dep)))
4230             {
4231               if (set)
4232                 DEP_STATUS (dep) |= DEP_CANCELLED;
4233               else
4234                 DEP_STATUS (dep) &= ~DEP_CANCELLED;
4235             }
4236     }
4237   for (i = 0; i <= max_insn_queue_index; i++)
4238     {
4239       int q = NEXT_Q_AFTER (q_ptr, i);
4240       rtx link;
4241       for (link = insn_queue[q]; link; link = XEXP (link, 1))
4242         {
4243           rtx insn = XEXP (link, 0);
4244           FOR_EACH_DEP (insn, SD_LIST_BACK, sd_it, dep)
4245             if (!DEBUG_INSN_P (DEP_PRO (dep)))
4246               {
4247                 if (set)
4248                   DEP_STATUS (dep) |= DEP_CANCELLED;
4249                 else
4250                   DEP_STATUS (dep) &= ~DEP_CANCELLED;
4251               }
4252         }
4253     }
4254 }
4255
4256 /* Undo the replacements that have occurred after backtrack point SAVE
4257    was placed.  */
4258 static void
4259 undo_replacements_for_backtrack (struct haifa_saved_data *save)
4260 {
4261   while (!save->replacement_deps.is_empty ())
4262     {
4263       dep_t dep = save->replacement_deps.pop ();
4264       int apply_p = save->replace_apply.pop ();
4265
4266       if (apply_p)
4267         restore_pattern (dep, true);
4268       else
4269         apply_replacement (dep, true);
4270     }
4271   save->replacement_deps.release ();
4272   save->replace_apply.release ();
4273 }
4274
4275 /* Pop entries from the SCHEDULED_INSNS vector up to and including INSN.
4276    Restore their dependencies to an unresolved state, and mark them as
4277    queued nowhere.  */
4278
4279 static void
4280 unschedule_insns_until (rtx insn)
4281 {
4282   auto_vec<rtx> recompute_vec;
4283
4284   /* Make two passes over the insns to be unscheduled.  First, we clear out
4285      dependencies and other trivial bookkeeping.  */
4286   for (;;)
4287     {
4288       rtx last;
4289       sd_iterator_def sd_it;
4290       dep_t dep;
4291
4292       last = scheduled_insns.pop ();
4293
4294       /* This will be changed by restore_backtrack_point if the insn is in
4295          any queue.  */
4296       QUEUE_INDEX (last) = QUEUE_NOWHERE;
4297       if (last != insn)
4298         INSN_TICK (last) = INVALID_TICK;
4299
4300       if (modulo_ii > 0 && INSN_UID (last) < modulo_iter0_max_uid)
4301         modulo_insns_scheduled--;
4302
4303       for (sd_it = sd_iterator_start (last, SD_LIST_RES_FORW);
4304            sd_iterator_cond (&sd_it, &dep);)
4305         {
4306           rtx_insn *con = DEP_CON (dep);
4307           sd_unresolve_dep (sd_it);
4308           if (!MUST_RECOMPUTE_SPEC_P (con))
4309             {
4310               MUST_RECOMPUTE_SPEC_P (con) = 1;
4311               recompute_vec.safe_push (con);
4312             }
4313         }
4314
4315       if (last == insn)
4316         break;
4317     }
4318
4319   /* A second pass, to update ready and speculation status for insns
4320      depending on the unscheduled ones.  The first pass must have
4321      popped the scheduled_insns vector up to the point where we
4322      restart scheduling, as recompute_todo_spec requires it to be
4323      up-to-date.  */
4324   while (!recompute_vec.is_empty ())
4325     {
4326       rtx con;
4327
4328       con = recompute_vec.pop ();
4329       MUST_RECOMPUTE_SPEC_P (con) = 0;
4330       if (!sd_lists_empty_p (con, SD_LIST_HARD_BACK))
4331         {
4332           TODO_SPEC (con) = HARD_DEP;
4333           INSN_TICK (con) = INVALID_TICK;
4334           if (PREDICATED_PAT (con) != NULL_RTX)
4335             haifa_change_pattern (con, ORIG_PAT (con));
4336         }
4337       else if (QUEUE_INDEX (con) != QUEUE_SCHEDULED)
4338         TODO_SPEC (con) = recompute_todo_spec (con, true);
4339     }
4340 }
4341
4342 /* Restore scheduler state from the topmost entry on the backtracking queue.
4343    PSCHED_BLOCK_P points to the local data of schedule_block that we must
4344    overwrite with the saved data.
4345    The caller must already have called unschedule_insns_until.  */
4346
4347 static void
4348 restore_last_backtrack_point (struct sched_block_state *psched_block)
4349 {
4350   rtx link;
4351   int i;
4352   struct haifa_saved_data *save = backtrack_queue;
4353
4354   backtrack_queue = save->next;
4355
4356   if (current_sched_info->restore_state)
4357     (*current_sched_info->restore_state) (save->fe_saved_data);
4358
4359   if (targetm.sched.alloc_sched_context)
4360     {
4361       targetm.sched.set_sched_context (save->be_saved_data);
4362       targetm.sched.free_sched_context (save->be_saved_data);
4363     }
4364
4365   /* Do this first since it clobbers INSN_TICK of the involved
4366      instructions.  */
4367   undo_replacements_for_backtrack (save);
4368
4369   /* Clear the QUEUE_INDEX of everything in the ready list or one
4370      of the queues.  */
4371   if (ready.n_ready > 0)
4372     {
4373       rtx_insn **first = ready_lastpos (&ready);
4374       for (i = 0; i < ready.n_ready; i++)
4375         {
4376           rtx_insn *insn = first[i];
4377           QUEUE_INDEX (insn) = QUEUE_NOWHERE;
4378           INSN_TICK (insn) = INVALID_TICK;
4379         }
4380     }
4381   for (i = 0; i <= max_insn_queue_index; i++)
4382     {
4383       int q = NEXT_Q_AFTER (q_ptr, i);
4384
4385       for (link = insn_queue[q]; link; link = XEXP (link, 1))
4386         {
4387           rtx x = XEXP (link, 0);
4388           QUEUE_INDEX (x) = QUEUE_NOWHERE;
4389           INSN_TICK (x) = INVALID_TICK;
4390         }
4391       free_INSN_LIST_list (&insn_queue[q]);
4392     }
4393
4394   free (ready.vec);
4395   ready = save->ready;
4396
4397   if (ready.n_ready > 0)
4398     {
4399       rtx_insn **first = ready_lastpos (&ready);
4400       for (i = 0; i < ready.n_ready; i++)
4401         {
4402           rtx_insn *insn = first[i];
4403           QUEUE_INDEX (insn) = QUEUE_READY;
4404           TODO_SPEC (insn) = recompute_todo_spec (insn, true);
4405           INSN_TICK (insn) = save->clock_var;
4406         }
4407     }
4408
4409   q_ptr = 0;
4410   q_size = save->q_size;
4411   for (i = 0; i <= max_insn_queue_index; i++)
4412     {
4413       int q = NEXT_Q_AFTER (q_ptr, i);
4414
4415       insn_queue[q] = save->insn_queue[q];
4416
4417       for (link = insn_queue[q]; link; link = XEXP (link, 1))
4418         {
4419           rtx x = XEXP (link, 0);
4420           QUEUE_INDEX (x) = i;
4421           TODO_SPEC (x) = recompute_todo_spec (x, true);
4422           INSN_TICK (x) = save->clock_var + i;
4423         }
4424     }
4425   free (save->insn_queue);
4426
4427   toggle_cancelled_flags (true);
4428
4429   clock_var = save->clock_var;
4430   last_clock_var = save->last_clock_var;
4431   cycle_issued_insns = save->cycle_issued_insns;
4432   last_scheduled_insn = save->last_scheduled_insn;
4433   last_nondebug_scheduled_insn = save->last_nondebug_scheduled_insn;
4434   nonscheduled_insns_begin = save->nonscheduled_insns_begin;
4435
4436   *psched_block = save->sched_block;
4437
4438   memcpy (curr_state, save->curr_state, dfa_state_size);
4439   free (save->curr_state);
4440
4441   mark_backtrack_feeds (save->delay_pair->i2, 0);
4442
4443   gcc_assert (next_cycle_replace_deps.is_empty ());
4444   next_cycle_replace_deps = save->next_cycle_deps.copy ();
4445   next_cycle_apply = save->next_cycle_apply.copy ();
4446
4447   free (save);
4448
4449   for (save = backtrack_queue; save; save = save->next)
4450     {
4451       mark_backtrack_feeds (save->delay_pair->i2, 1);
4452     }
4453 }
4454
4455 /* Discard all data associated with the topmost entry in the backtrack
4456    queue.  If RESET_TICK is false, we just want to free the data.  If true,
4457    we are doing this because we discovered a reason to backtrack.  In the
4458    latter case, also reset the INSN_TICK for the shadow insn.  */
4459 static void
4460 free_topmost_backtrack_point (bool reset_tick)
4461 {
4462   struct haifa_saved_data *save = backtrack_queue;
4463   int i;
4464
4465   backtrack_queue = save->next;
4466
4467   if (reset_tick)
4468     {
4469       struct delay_pair *pair = save->delay_pair;
4470       while (pair)
4471         {
4472           INSN_TICK (pair->i2) = INVALID_TICK;
4473           INSN_EXACT_TICK (pair->i2) = INVALID_TICK;
4474           pair = pair->next_same_i1;
4475         }
4476       undo_replacements_for_backtrack (save);
4477     }
4478   else
4479     {
4480       save->replacement_deps.release ();
4481       save->replace_apply.release ();
4482     }
4483
4484   if (targetm.sched.free_sched_context)
4485     targetm.sched.free_sched_context (save->be_saved_data);
4486   if (current_sched_info->restore_state)
4487     free (save->fe_saved_data);
4488   for (i = 0; i <= max_insn_queue_index; i++)
4489     free_INSN_LIST_list (&save->insn_queue[i]);
4490   free (save->insn_queue);
4491   free (save->curr_state);
4492   free (save->ready.vec);
4493   free (save);
4494 }
4495
4496 /* Free the entire backtrack queue.  */
4497 static void
4498 free_backtrack_queue (void)
4499 {
4500   while (backtrack_queue)
4501     free_topmost_backtrack_point (false);
4502 }
4503
4504 /* Apply a replacement described by DESC.  If IMMEDIATELY is false, we
4505    may have to postpone the replacement until the start of the next cycle,
4506    at which point we will be called again with IMMEDIATELY true.  This is
4507    only done for machines which have instruction packets with explicit
4508    parallelism however.  */
4509 static void
4510 apply_replacement (dep_t dep, bool immediately)
4511 {
4512   struct dep_replacement *desc = DEP_REPLACE (dep);
4513   if (!immediately && targetm.sched.exposed_pipeline && reload_completed)
4514     {
4515       next_cycle_replace_deps.safe_push (dep);
4516       next_cycle_apply.safe_push (1);
4517     }
4518   else
4519     {
4520       bool success;
4521
4522       if (QUEUE_INDEX (desc->insn) == QUEUE_SCHEDULED)
4523         return;
4524
4525       if (sched_verbose >= 5)
4526         fprintf (sched_dump, "applying replacement for insn %d\n",
4527                  INSN_UID (desc->insn));
4528
4529       success = validate_change (desc->insn, desc->loc, desc->newval, 0);
4530       gcc_assert (success);
4531
4532       update_insn_after_change (desc->insn);
4533       if ((TODO_SPEC (desc->insn) & (HARD_DEP | DEP_POSTPONED)) == 0)
4534         fix_tick_ready (desc->insn);
4535
4536       if (backtrack_queue != NULL)
4537         {
4538           backtrack_queue->replacement_deps.safe_push (dep);
4539           backtrack_queue->replace_apply.safe_push (1);
4540         }
4541     }
4542 }
4543
4544 /* We have determined that a pattern involved in DEP must be restored.
4545    If IMMEDIATELY is false, we may have to postpone the replacement
4546    until the start of the next cycle, at which point we will be called
4547    again with IMMEDIATELY true.  */
4548 static void
4549 restore_pattern (dep_t dep, bool immediately)
4550 {
4551   rtx_insn *next = DEP_CON (dep);
4552   int tick = INSN_TICK (next);
4553
4554   /* If we already scheduled the insn, the modified version is
4555      correct.  */
4556   if (QUEUE_INDEX (next) == QUEUE_SCHEDULED)
4557     return;
4558
4559   if (!immediately && targetm.sched.exposed_pipeline && reload_completed)
4560     {
4561       next_cycle_replace_deps.safe_push (dep);
4562       next_cycle_apply.safe_push (0);
4563       return;
4564     }
4565
4566
4567   if (DEP_TYPE (dep) == REG_DEP_CONTROL)
4568     {
4569       if (sched_verbose >= 5)
4570         fprintf (sched_dump, "restoring pattern for insn %d\n",
4571                  INSN_UID (next));
4572       haifa_change_pattern (next, ORIG_PAT (next));
4573     }
4574   else
4575     {
4576       struct dep_replacement *desc = DEP_REPLACE (dep);
4577       bool success;
4578
4579       if (sched_verbose >= 5)
4580         fprintf (sched_dump, "restoring pattern for insn %d\n",
4581                  INSN_UID (desc->insn));
4582       tick = INSN_TICK (desc->insn);
4583
4584       success = validate_change (desc->insn, desc->loc, desc->orig, 0);
4585       gcc_assert (success);
4586       update_insn_after_change (desc->insn);
4587       if (backtrack_queue != NULL)
4588         {
4589           backtrack_queue->replacement_deps.safe_push (dep);
4590           backtrack_queue->replace_apply.safe_push (0);
4591         }
4592     }
4593   INSN_TICK (next) = tick;
4594   if (TODO_SPEC (next) == DEP_POSTPONED)
4595     return;
4596
4597   if (sd_lists_empty_p (next, SD_LIST_BACK))
4598     TODO_SPEC (next) = 0;
4599   else if (!sd_lists_empty_p (next, SD_LIST_HARD_BACK))
4600     TODO_SPEC (next) = HARD_DEP;
4601 }
4602
4603 /* Perform pattern replacements that were queued up until the next
4604    cycle.  */
4605 static void
4606 perform_replacements_new_cycle (void)
4607 {
4608   int i;
4609   dep_t dep;
4610   FOR_EACH_VEC_ELT (next_cycle_replace_deps, i, dep)
4611     {
4612       int apply_p = next_cycle_apply[i];
4613       if (apply_p)
4614         apply_replacement (dep, true);
4615       else
4616         restore_pattern (dep, true);
4617     }
4618   next_cycle_replace_deps.truncate (0);
4619   next_cycle_apply.truncate (0);
4620 }
4621
4622 /* Compute INSN_TICK_ESTIMATE for INSN.  PROCESSED is a bitmap of
4623    instructions we've previously encountered, a set bit prevents
4624    recursion.  BUDGET is a limit on how far ahead we look, it is
4625    reduced on recursive calls.  Return true if we produced a good
4626    estimate, or false if we exceeded the budget.  */
4627 static bool
4628 estimate_insn_tick (bitmap processed, rtx insn, int budget)
4629 {
4630   sd_iterator_def sd_it;
4631   dep_t dep;
4632   int earliest = INSN_TICK (insn);
4633
4634   FOR_EACH_DEP (insn, SD_LIST_BACK, sd_it, dep)
4635     {
4636       rtx_insn *pro = DEP_PRO (dep);
4637       int t;
4638
4639       if (DEP_STATUS (dep) & DEP_CANCELLED)
4640         continue;
4641
4642       if (QUEUE_INDEX (pro) == QUEUE_SCHEDULED)
4643         gcc_assert (INSN_TICK (pro) + dep_cost (dep) <= INSN_TICK (insn));
4644       else
4645         {
4646           int cost = dep_cost (dep);
4647           if (cost >= budget)
4648             return false;
4649           if (!bitmap_bit_p (processed, INSN_LUID (pro)))
4650             {
4651               if (!estimate_insn_tick (processed, pro, budget - cost))
4652                 return false;
4653             }
4654           gcc_assert (INSN_TICK_ESTIMATE (pro) != INVALID_TICK);
4655           t = INSN_TICK_ESTIMATE (pro) + cost;
4656           if (earliest == INVALID_TICK || t > earliest)
4657             earliest = t;
4658         }
4659     }
4660   bitmap_set_bit (processed, INSN_LUID (insn));
4661   INSN_TICK_ESTIMATE (insn) = earliest;
4662   return true;
4663 }
4664
4665 /* Examine the pair of insns in P, and estimate (optimistically, assuming
4666    infinite resources) the cycle in which the delayed shadow can be issued.
4667    Return the number of cycles that must pass before the real insn can be
4668    issued in order to meet this constraint.  */
4669 static int
4670 estimate_shadow_tick (struct delay_pair *p)
4671 {
4672   bitmap_head processed;
4673   int t;
4674   bool cutoff;
4675   bitmap_initialize (&processed, 0);
4676
4677   cutoff = !estimate_insn_tick (&processed, p->i2,
4678                                 max_insn_queue_index + pair_delay (p));
4679   bitmap_clear (&processed);
4680   if (cutoff)
4681     return max_insn_queue_index;
4682   t = INSN_TICK_ESTIMATE (p->i2) - (clock_var + pair_delay (p) + 1);
4683   if (t > 0)
4684     return t;
4685   return 0;
4686 }
4687
4688 /* If INSN has no unresolved backwards dependencies, add it to the schedule and
4689    recursively resolve all its forward dependencies.  */
4690 static void
4691 resolve_dependencies (rtx_insn *insn)
4692 {
4693   sd_iterator_def sd_it;
4694   dep_t dep;
4695
4696   /* Don't use sd_lists_empty_p; it ignores debug insns.  */
4697   if (DEPS_LIST_FIRST (INSN_HARD_BACK_DEPS (insn)) != NULL
4698       || DEPS_LIST_FIRST (INSN_SPEC_BACK_DEPS (insn)) != NULL)
4699     return;
4700
4701   if (sched_verbose >= 4)
4702     fprintf (sched_dump, ";;\tquickly resolving %d\n", INSN_UID (insn));
4703
4704   if (QUEUE_INDEX (insn) >= 0)
4705     queue_remove (insn);
4706
4707   scheduled_insns.safe_push (insn);
4708
4709   /* Update dependent instructions.  */
4710   for (sd_it = sd_iterator_start (insn, SD_LIST_FORW);
4711        sd_iterator_cond (&sd_it, &dep);)
4712     {
4713       rtx_insn *next = DEP_CON (dep);
4714
4715       if (sched_verbose >= 4)
4716         fprintf (sched_dump, ";;\t\tdep %d against %d\n", INSN_UID (insn),
4717                  INSN_UID (next));
4718
4719       /* Resolve the dependence between INSN and NEXT.
4720          sd_resolve_dep () moves current dep to another list thus
4721          advancing the iterator.  */
4722       sd_resolve_dep (sd_it);
4723
4724       if (!IS_SPECULATION_BRANCHY_CHECK_P (insn))
4725         {
4726           resolve_dependencies (next);
4727         }
4728       else
4729         /* Check always has only one forward dependence (to the first insn in
4730            the recovery block), therefore, this will be executed only once.  */
4731         {
4732           gcc_assert (sd_lists_empty_p (insn, SD_LIST_FORW));
4733         }
4734     }
4735 }
4736
4737
4738 /* Return the head and tail pointers of ebb starting at BEG and ending
4739    at END.  */
4740 void
4741 get_ebb_head_tail (basic_block beg, basic_block end,
4742                    rtx_insn **headp, rtx_insn **tailp)
4743 {
4744   rtx_insn *beg_head = BB_HEAD (beg);
4745   rtx_insn * beg_tail = BB_END (beg);
4746   rtx_insn * end_head = BB_HEAD (end);
4747   rtx_insn * end_tail = BB_END (end);
4748
4749   /* Don't include any notes or labels at the beginning of the BEG
4750      basic block, or notes at the end of the END basic blocks.  */
4751
4752   if (LABEL_P (beg_head))
4753     beg_head = NEXT_INSN (beg_head);
4754
4755   while (beg_head != beg_tail)
4756     if (NOTE_P (beg_head))
4757       beg_head = NEXT_INSN (beg_head);
4758     else if (DEBUG_INSN_P (beg_head))
4759       {
4760         rtx_insn * note, *next;
4761
4762         for (note = NEXT_INSN (beg_head);
4763              note != beg_tail;
4764              note = next)
4765           {
4766             next = NEXT_INSN (note);
4767             if (NOTE_P (note))
4768               {
4769                 if (sched_verbose >= 9)
4770                   fprintf (sched_dump, "reorder %i\n", INSN_UID (note));
4771
4772                 reorder_insns_nobb (note, note, PREV_INSN (beg_head));
4773
4774                 if (BLOCK_FOR_INSN (note) != beg)
4775                   df_insn_change_bb (note, beg);
4776               }
4777             else if (!DEBUG_INSN_P (note))
4778               break;
4779           }
4780
4781         break;
4782       }
4783     else
4784       break;
4785
4786   *headp = beg_head;
4787
4788   if (beg == end)
4789     end_head = beg_head;
4790   else if (LABEL_P (end_head))
4791     end_head = NEXT_INSN (end_head);
4792
4793   while (end_head != end_tail)
4794     if (NOTE_P (end_tail))
4795       end_tail = PREV_INSN (end_tail);
4796     else if (DEBUG_INSN_P (end_tail))
4797       {
4798         rtx_insn * note, *prev;
4799
4800         for (note = PREV_INSN (end_tail);
4801              note != end_head;
4802              note = prev)
4803           {
4804             prev = PREV_INSN (note);
4805             if (NOTE_P (note))
4806               {
4807                 if (sched_verbose >= 9)
4808                   fprintf (sched_dump, "reorder %i\n", INSN_UID (note));
4809
4810                 reorder_insns_nobb (note, note, end_tail);
4811
4812                 if (end_tail == BB_END (end))
4813                   SET_BB_END (end) = note;
4814
4815                 if (BLOCK_FOR_INSN (note) != end)
4816                   df_insn_change_bb (note, end);
4817               }
4818             else if (!DEBUG_INSN_P (note))
4819               break;
4820           }
4821
4822         break;
4823       }
4824     else
4825       break;
4826
4827   *tailp = end_tail;
4828 }
4829
4830 /* Return nonzero if there are no real insns in the range [ HEAD, TAIL ].  */
4831
4832 int
4833 no_real_insns_p (const_rtx head, const_rtx tail)
4834 {
4835   while (head != NEXT_INSN (tail))
4836     {
4837       if (!NOTE_P (head) && !LABEL_P (head))
4838         return 0;
4839       head = NEXT_INSN (head);
4840     }
4841   return 1;
4842 }
4843
4844 /* Restore-other-notes: NOTE_LIST is the end of a chain of notes
4845    previously found among the insns.  Insert them just before HEAD.  */
4846 rtx_insn *
4847 restore_other_notes (rtx_insn *head, basic_block head_bb)
4848 {
4849   if (note_list != 0)
4850     {
4851       rtx_insn *note_head = note_list;
4852
4853       if (head)
4854         head_bb = BLOCK_FOR_INSN (head);
4855       else
4856         head = NEXT_INSN (bb_note (head_bb));
4857
4858       while (PREV_INSN (note_head))
4859         {
4860           set_block_for_insn (note_head, head_bb);
4861           note_head = PREV_INSN (note_head);
4862         }
4863       /* In the above cycle we've missed this note.  */
4864       set_block_for_insn (note_head, head_bb);
4865
4866       SET_PREV_INSN (note_head) = PREV_INSN (head);
4867       SET_NEXT_INSN (PREV_INSN (head)) = note_head;
4868       SET_PREV_INSN (head) = note_list;
4869       SET_NEXT_INSN (note_list) = head;
4870
4871       if (BLOCK_FOR_INSN (head) != head_bb)
4872         SET_BB_END (head_bb) = note_list;
4873
4874       head = note_head;
4875     }
4876
4877   return head;
4878 }
4879
4880 /* When we know we are going to discard the schedule due to a failed attempt
4881    at modulo scheduling, undo all replacements.  */
4882 static void
4883 undo_all_replacements (void)
4884 {
4885   rtx_insn *insn;
4886   int i;
4887
4888   FOR_EACH_VEC_ELT (scheduled_insns, i, insn)
4889     {
4890       sd_iterator_def sd_it;
4891       dep_t dep;
4892
4893       /* See if we must undo a replacement.  */
4894       for (sd_it = sd_iterator_start (insn, SD_LIST_RES_FORW);
4895            sd_iterator_cond (&sd_it, &dep); sd_iterator_next (&sd_it))
4896         {
4897           struct dep_replacement *desc = DEP_REPLACE (dep);
4898           if (desc != NULL)
4899             validate_change (desc->insn, desc->loc, desc->orig, 0);
4900         }
4901     }
4902 }
4903
4904 /* Return first non-scheduled insn in the current scheduling block.
4905    This is mostly used for debug-counter purposes.  */
4906 static rtx_insn *
4907 first_nonscheduled_insn (void)
4908 {
4909   rtx_insn *insn = (nonscheduled_insns_begin != NULL_RTX
4910                     ? nonscheduled_insns_begin
4911                     : current_sched_info->prev_head);
4912
4913   do
4914     {
4915       insn = next_nonnote_nondebug_insn (insn);
4916     }
4917   while (QUEUE_INDEX (insn) == QUEUE_SCHEDULED);
4918
4919   return insn;
4920 }
4921
4922 /* Move insns that became ready to fire from queue to ready list.  */
4923
4924 static void
4925 queue_to_ready (struct ready_list *ready)
4926 {
4927   rtx_insn *insn;
4928   rtx link;
4929   rtx skip_insn;
4930
4931   q_ptr = NEXT_Q (q_ptr);
4932
4933   if (dbg_cnt (sched_insn) == false)
4934     /* If debug counter is activated do not requeue the first
4935        nonscheduled insn.  */
4936     skip_insn = first_nonscheduled_insn ();
4937   else
4938     skip_insn = NULL_RTX;
4939
4940   /* Add all pending insns that can be scheduled without stalls to the
4941      ready list.  */
4942   for (link = insn_queue[q_ptr]; link; link = XEXP (link, 1))
4943     {
4944       insn = as_a <rtx_insn *> (XEXP (link, 0));
4945       q_size -= 1;
4946
4947       if (sched_verbose >= 2)
4948         fprintf (sched_dump, ";;\t\tQ-->Ready: insn %s: ",
4949                  (*current_sched_info->print_insn) (insn, 0));
4950
4951       /* If the ready list is full, delay the insn for 1 cycle.
4952          See the comment in schedule_block for the rationale.  */
4953       if (!reload_completed
4954           && (ready->n_ready - ready->n_debug > MAX_SCHED_READY_INSNS
4955               || (sched_pressure == SCHED_PRESSURE_MODEL
4956                   /* Limit pressure recalculations to MAX_SCHED_READY_INSNS
4957                      instructions too.  */
4958                   && model_index (insn) > (model_curr_point
4959                                            + MAX_SCHED_READY_INSNS)))
4960           && !(sched_pressure == SCHED_PRESSURE_MODEL
4961                && model_curr_point < model_num_insns
4962                /* Always allow the next model instruction to issue.  */
4963                && model_index (insn) == model_curr_point)
4964           && !SCHED_GROUP_P (insn)
4965           && insn != skip_insn)
4966         {
4967           if (sched_verbose >= 2)
4968             fprintf (sched_dump, "keeping in queue, ready full\n");
4969           queue_insn (insn, 1, "ready full");
4970         }
4971       else
4972         {
4973           ready_add (ready, insn, false);
4974           if (sched_verbose >= 2)
4975             fprintf (sched_dump, "moving to ready without stalls\n");
4976         }
4977     }
4978   free_INSN_LIST_list (&insn_queue[q_ptr]);
4979
4980   /* If there are no ready insns, stall until one is ready and add all
4981      of the pending insns at that point to the ready list.  */
4982   if (ready->n_ready == 0)
4983     {
4984       int stalls;
4985
4986       for (stalls = 1; stalls <= max_insn_queue_index; stalls++)
4987         {
4988           if ((link = insn_queue[NEXT_Q_AFTER (q_ptr, stalls)]))
4989             {
4990               for (; link; link = XEXP (link, 1))
4991                 {
4992                   insn = as_a <rtx_insn *> (XEXP (link, 0));
4993                   q_size -= 1;
4994
4995                   if (sched_verbose >= 2)
4996                     fprintf (sched_dump, ";;\t\tQ-->Ready: insn %s: ",
4997                              (*current_sched_info->print_insn) (insn, 0));
4998
4999                   ready_add (ready, insn, false);
5000                   if (sched_verbose >= 2)
5001                     fprintf (sched_dump, "moving to ready with %d stalls\n", stalls);
5002                 }
5003               free_INSN_LIST_list (&insn_queue[NEXT_Q_AFTER (q_ptr, stalls)]);
5004
5005               advance_one_cycle ();
5006
5007               break;
5008             }
5009
5010           advance_one_cycle ();
5011         }
5012
5013       q_ptr = NEXT_Q_AFTER (q_ptr, stalls);
5014       clock_var += stalls;
5015       if (sched_verbose >= 2)
5016         fprintf (sched_dump, ";;\tAdvancing clock by %d cycle[s] to %d\n",
5017                  stalls, clock_var);
5018     }
5019 }
5020
5021 /* Used by early_queue_to_ready.  Determines whether it is "ok" to
5022    prematurely move INSN from the queue to the ready list.  Currently,
5023    if a target defines the hook 'is_costly_dependence', this function
5024    uses the hook to check whether there exist any dependences which are
5025    considered costly by the target, between INSN and other insns that
5026    have already been scheduled.  Dependences are checked up to Y cycles
5027    back, with default Y=1; The flag -fsched-stalled-insns-dep=Y allows
5028    controlling this value.
5029    (Other considerations could be taken into account instead (or in
5030    addition) depending on user flags and target hooks.  */
5031
5032 static bool
5033 ok_for_early_queue_removal (rtx insn)
5034 {
5035   if (targetm.sched.is_costly_dependence)
5036     {
5037       rtx prev_insn;
5038       int n_cycles;
5039       int i = scheduled_insns.length ();
5040       for (n_cycles = flag_sched_stalled_insns_dep; n_cycles; n_cycles--)
5041         {
5042           while (i-- > 0)
5043             {
5044               int cost;
5045
5046               prev_insn = scheduled_insns[i];
5047
5048               if (!NOTE_P (prev_insn))
5049                 {
5050                   dep_t dep;
5051
5052                   dep = sd_find_dep_between (prev_insn, insn, true);
5053
5054                   if (dep != NULL)
5055                     {
5056                       cost = dep_cost (dep);
5057
5058                       if (targetm.sched.is_costly_dependence (dep, cost,
5059                                 flag_sched_stalled_insns_dep - n_cycles))
5060                         return false;
5061                     }
5062                 }
5063
5064               if (GET_MODE (prev_insn) == TImode) /* end of dispatch group */
5065                 break;
5066             }
5067
5068           if (i == 0)
5069             break;
5070         }
5071     }
5072
5073   return true;
5074 }
5075
5076
5077 /* Remove insns from the queue, before they become "ready" with respect
5078    to FU latency considerations.  */
5079
5080 static int
5081 early_queue_to_ready (state_t state, struct ready_list *ready)
5082 {
5083   rtx_insn *insn;
5084   rtx link;
5085   rtx next_link;
5086   rtx prev_link;
5087   bool move_to_ready;
5088   int cost;
5089   state_t temp_state = alloca (dfa_state_size);
5090   int stalls;
5091   int insns_removed = 0;
5092
5093   /*
5094      Flag '-fsched-stalled-insns=X' determines the aggressiveness of this
5095      function:
5096
5097      X == 0: There is no limit on how many queued insns can be removed
5098              prematurely.  (flag_sched_stalled_insns = -1).
5099
5100      X >= 1: Only X queued insns can be removed prematurely in each
5101              invocation.  (flag_sched_stalled_insns = X).
5102
5103      Otherwise: Early queue removal is disabled.
5104          (flag_sched_stalled_insns = 0)
5105   */
5106
5107   if (! flag_sched_stalled_insns)
5108     return 0;
5109
5110   for (stalls = 0; stalls <= max_insn_queue_index; stalls++)
5111     {
5112       if ((link = insn_queue[NEXT_Q_AFTER (q_ptr, stalls)]))
5113         {
5114           if (sched_verbose > 6)
5115             fprintf (sched_dump, ";; look at index %d + %d\n", q_ptr, stalls);
5116
5117           prev_link = 0;
5118           while (link)
5119             {
5120               next_link = XEXP (link, 1);
5121               insn = as_a <rtx_insn *> (XEXP (link, 0));
5122               if (insn && sched_verbose > 6)
5123                 print_rtl_single (sched_dump, insn);
5124
5125               memcpy (temp_state, state, dfa_state_size);
5126               if (recog_memoized (insn) < 0)
5127                 /* non-negative to indicate that it's not ready
5128                    to avoid infinite Q->R->Q->R... */
5129                 cost = 0;
5130               else
5131                 cost = state_transition (temp_state, insn);
5132
5133               if (sched_verbose >= 6)
5134                 fprintf (sched_dump, "transition cost = %d\n", cost);
5135
5136               move_to_ready = false;
5137               if (cost < 0)
5138                 {
5139                   move_to_ready = ok_for_early_queue_removal (insn);
5140                   if (move_to_ready == true)
5141                     {
5142                       /* move from Q to R */
5143                       q_size -= 1;
5144                       ready_add (ready, insn, false);
5145
5146                       if (prev_link)
5147                         XEXP (prev_link, 1) = next_link;
5148                       else
5149                         insn_queue[NEXT_Q_AFTER (q_ptr, stalls)] = next_link;
5150
5151                       free_INSN_LIST_node (link);
5152
5153                       if (sched_verbose >= 2)
5154                         fprintf (sched_dump, ";;\t\tEarly Q-->Ready: insn %s\n",
5155                                  (*current_sched_info->print_insn) (insn, 0));
5156
5157                       insns_removed++;
5158                       if (insns_removed == flag_sched_stalled_insns)
5159                         /* Remove no more than flag_sched_stalled_insns insns
5160                            from Q at a time.  */
5161                         return insns_removed;
5162                     }
5163                 }
5164
5165               if (move_to_ready == false)
5166                 prev_link = link;
5167
5168               link = next_link;
5169             } /* while link */
5170         } /* if link */
5171
5172     } /* for stalls.. */
5173
5174   return insns_removed;
5175 }
5176
5177
5178 /* Print the ready list for debugging purposes.
5179    If READY_TRY is non-zero then only print insns that max_issue
5180    will consider.  */
5181 static void
5182 debug_ready_list_1 (struct ready_list *ready, signed char *ready_try)
5183 {
5184   rtx_insn **p;
5185   int i;
5186
5187   if (ready->n_ready == 0)
5188     {
5189       fprintf (sched_dump, "\n");
5190       return;
5191     }
5192
5193   p = ready_lastpos (ready);
5194   for (i = 0; i < ready->n_ready; i++)
5195     {
5196       if (ready_try != NULL && ready_try[ready->n_ready - i - 1])
5197         continue;
5198
5199       fprintf (sched_dump, "  %s:%d",
5200                (*current_sched_info->print_insn) (p[i], 0),
5201                INSN_LUID (p[i]));
5202       if (sched_pressure != SCHED_PRESSURE_NONE)
5203         fprintf (sched_dump, "(cost=%d",
5204                  INSN_REG_PRESSURE_EXCESS_COST_CHANGE (p[i]));
5205       fprintf (sched_dump, ":prio=%d", INSN_PRIORITY (p[i]));
5206       if (INSN_TICK (p[i]) > clock_var)
5207         fprintf (sched_dump, ":delay=%d", INSN_TICK (p[i]) - clock_var);
5208       if (sched_pressure != SCHED_PRESSURE_NONE)
5209         fprintf (sched_dump, ")");
5210     }
5211   fprintf (sched_dump, "\n");
5212 }
5213
5214 /* Print the ready list.  Callable from debugger.  */
5215 static void
5216 debug_ready_list (struct ready_list *ready)
5217 {
5218   debug_ready_list_1 (ready, NULL);
5219 }
5220
5221 /* Search INSN for REG_SAVE_NOTE notes and convert them back into insn
5222    NOTEs.  This is used for NOTE_INSN_EPILOGUE_BEG, so that sched-ebb
5223    replaces the epilogue note in the correct basic block.  */
5224 void
5225 reemit_notes (rtx insn)
5226 {
5227   rtx note, last = insn;
5228
5229   for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
5230     {
5231       if (REG_NOTE_KIND (note) == REG_SAVE_NOTE)
5232         {
5233           enum insn_note note_type = (enum insn_note) INTVAL (XEXP (note, 0));
5234
5235           last = emit_note_before (note_type, last);
5236           remove_note (insn, note);
5237         }
5238     }
5239 }
5240
5241 /* Move INSN.  Reemit notes if needed.  Update CFG, if needed.  */
5242 static void
5243 move_insn (rtx_insn *insn, rtx last, rtx nt)
5244 {
5245   if (PREV_INSN (insn) != last)
5246     {
5247       basic_block bb;
5248       rtx_insn *note;
5249       int jump_p = 0;
5250
5251       bb = BLOCK_FOR_INSN (insn);
5252
5253       /* BB_HEAD is either LABEL or NOTE.  */
5254       gcc_assert (BB_HEAD (bb) != insn);
5255
5256       if (BB_END (bb) == insn)
5257         /* If this is last instruction in BB, move end marker one
5258            instruction up.  */
5259         {
5260           /* Jumps are always placed at the end of basic block.  */
5261           jump_p = control_flow_insn_p (insn);
5262
5263           gcc_assert (!jump_p
5264                       || ((common_sched_info->sched_pass_id == SCHED_RGN_PASS)
5265                           && IS_SPECULATION_BRANCHY_CHECK_P (insn))
5266                       || (common_sched_info->sched_pass_id
5267                           == SCHED_EBB_PASS));
5268
5269           gcc_assert (BLOCK_FOR_INSN (PREV_INSN (insn)) == bb);
5270
5271           SET_BB_END (bb) = PREV_INSN (insn);
5272         }
5273
5274       gcc_assert (BB_END (bb) != last);
5275
5276       if (jump_p)
5277         /* We move the block note along with jump.  */
5278         {
5279           gcc_assert (nt);
5280
5281           note = NEXT_INSN (insn);
5282           while (NOTE_NOT_BB_P (note) && note != nt)
5283             note = NEXT_INSN (note);
5284
5285           if (note != nt
5286               && (LABEL_P (note)
5287                   || BARRIER_P (note)))
5288             note = NEXT_INSN (note);
5289
5290           gcc_assert (NOTE_INSN_BASIC_BLOCK_P (note));
5291         }
5292       else
5293         note = insn;
5294
5295       SET_NEXT_INSN (PREV_INSN (insn)) = NEXT_INSN (note);
5296       SET_PREV_INSN (NEXT_INSN (note)) = PREV_INSN (insn);
5297
5298       SET_NEXT_INSN (note) = NEXT_INSN (last);
5299       SET_PREV_INSN (NEXT_INSN (last)) = note;
5300
5301       SET_NEXT_INSN (last) = insn;
5302       SET_PREV_INSN (insn) = last;
5303
5304       bb = BLOCK_FOR_INSN (last);
5305
5306       if (jump_p)
5307         {
5308           fix_jump_move (insn);
5309
5310           if (BLOCK_FOR_INSN (insn) != bb)
5311             move_block_after_check (insn);
5312
5313           gcc_assert (BB_END (bb) == last);
5314         }
5315
5316       df_insn_change_bb (insn, bb);
5317
5318       /* Update BB_END, if needed.  */
5319       if (BB_END (bb) == last)
5320         SET_BB_END (bb) = insn;
5321     }
5322
5323   SCHED_GROUP_P (insn) = 0;
5324 }
5325
5326 /* Return true if scheduling INSN will finish current clock cycle.  */
5327 static bool
5328 insn_finishes_cycle_p (rtx_insn *insn)
5329 {
5330   if (SCHED_GROUP_P (insn))
5331     /* After issuing INSN, rest of the sched_group will be forced to issue
5332        in order.  Don't make any plans for the rest of cycle.  */
5333     return true;
5334
5335   /* Finishing the block will, apparently, finish the cycle.  */
5336   if (current_sched_info->insn_finishes_block_p
5337       && current_sched_info->insn_finishes_block_p (insn))
5338     return true;
5339
5340   return false;
5341 }
5342
5343 /* Define type for target data used in multipass scheduling.  */
5344 #ifndef TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DATA_T
5345 # define TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DATA_T int
5346 #endif
5347 typedef TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DATA_T first_cycle_multipass_data_t;
5348
5349 /* The following structure describe an entry of the stack of choices.  */
5350 struct choice_entry
5351 {
5352   /* Ordinal number of the issued insn in the ready queue.  */
5353   int index;
5354   /* The number of the rest insns whose issues we should try.  */
5355   int rest;
5356   /* The number of issued essential insns.  */
5357   int n;
5358   /* State after issuing the insn.  */
5359   state_t state;
5360   /* Target-specific data.  */
5361   first_cycle_multipass_data_t target_data;
5362 };
5363
5364 /* The following array is used to implement a stack of choices used in
5365    function max_issue.  */
5366 static struct choice_entry *choice_stack;
5367
5368 /* This holds the value of the target dfa_lookahead hook.  */
5369 int dfa_lookahead;
5370
5371 /* The following variable value is maximal number of tries of issuing
5372    insns for the first cycle multipass insn scheduling.  We define
5373    this value as constant*(DFA_LOOKAHEAD**ISSUE_RATE).  We would not
5374    need this constraint if all real insns (with non-negative codes)
5375    had reservations because in this case the algorithm complexity is
5376    O(DFA_LOOKAHEAD**ISSUE_RATE).  Unfortunately, the dfa descriptions
5377    might be incomplete and such insn might occur.  For such
5378    descriptions, the complexity of algorithm (without the constraint)
5379    could achieve DFA_LOOKAHEAD ** N , where N is the queue length.  */
5380 static int max_lookahead_tries;
5381
5382 /* The following value is value of hook
5383    `first_cycle_multipass_dfa_lookahead' at the last call of
5384    `max_issue'.  */
5385 static int cached_first_cycle_multipass_dfa_lookahead = 0;
5386
5387 /* The following value is value of `issue_rate' at the last call of
5388    `sched_init'.  */
5389 static int cached_issue_rate = 0;
5390
5391 /* The following function returns maximal (or close to maximal) number
5392    of insns which can be issued on the same cycle and one of which
5393    insns is insns with the best rank (the first insn in READY).  To
5394    make this function tries different samples of ready insns.  READY
5395    is current queue `ready'.  Global array READY_TRY reflects what
5396    insns are already issued in this try.  The function stops immediately,
5397    if it reached the such a solution, that all instruction can be issued.
5398    INDEX will contain index of the best insn in READY.  The following
5399    function is used only for first cycle multipass scheduling.
5400
5401    PRIVILEGED_N >= 0
5402
5403    This function expects recognized insns only.  All USEs,
5404    CLOBBERs, etc must be filtered elsewhere.  */
5405 int
5406 max_issue (struct ready_list *ready, int privileged_n, state_t state,
5407            bool first_cycle_insn_p, int *index)
5408 {
5409   int n, i, all, n_ready, best, delay, tries_num;
5410   int more_issue;
5411   struct choice_entry *top;
5412   rtx_insn *insn;
5413
5414   n_ready = ready->n_ready;
5415   gcc_assert (dfa_lookahead >= 1 && privileged_n >= 0
5416               && privileged_n <= n_ready);
5417
5418   /* Init MAX_LOOKAHEAD_TRIES.  */
5419   if (cached_first_cycle_multipass_dfa_lookahead != dfa_lookahead)
5420     {
5421       cached_first_cycle_multipass_dfa_lookahead = dfa_lookahead;
5422       max_lookahead_tries = 100;
5423       for (i = 0; i < issue_rate; i++)
5424         max_lookahead_tries *= dfa_lookahead;
5425     }
5426
5427   /* Init max_points.  */
5428   more_issue = issue_rate - cycle_issued_insns;
5429   gcc_assert (more_issue >= 0);
5430
5431   /* The number of the issued insns in the best solution.  */
5432   best = 0;
5433
5434   top = choice_stack;
5435
5436   /* Set initial state of the search.  */
5437   memcpy (top->state, state, dfa_state_size);
5438   top->rest = dfa_lookahead;
5439   top->n = 0;
5440   if (targetm.sched.first_cycle_multipass_begin)
5441     targetm.sched.first_cycle_multipass_begin (&top->target_data,
5442                                                ready_try, n_ready,
5443                                                first_cycle_insn_p);
5444
5445   /* Count the number of the insns to search among.  */
5446   for (all = i = 0; i < n_ready; i++)
5447     if (!ready_try [i])
5448       all++;
5449
5450   if (sched_verbose >= 2)
5451     {
5452       fprintf (sched_dump, ";;\t\tmax_issue among %d insns:", all);
5453       debug_ready_list_1 (ready, ready_try);
5454     }
5455
5456   /* I is the index of the insn to try next.  */
5457   i = 0;
5458   tries_num = 0;
5459   for (;;)
5460     {
5461       if (/* If we've reached a dead end or searched enough of what we have
5462              been asked...  */
5463           top->rest == 0
5464           /* or have nothing else to try...  */
5465           || i >= n_ready
5466           /* or should not issue more.  */
5467           || top->n >= more_issue)
5468         {
5469           /* ??? (... || i == n_ready).  */
5470           gcc_assert (i <= n_ready);
5471
5472           /* We should not issue more than issue_rate instructions.  */
5473           gcc_assert (top->n <= more_issue);
5474
5475           if (top == choice_stack)
5476             break;
5477
5478           if (best < top - choice_stack)
5479             {
5480               if (privileged_n)
5481                 {
5482                   n = privileged_n;
5483                   /* Try to find issued privileged insn.  */
5484                   while (n && !ready_try[--n])
5485                     ;
5486                 }
5487
5488               if (/* If all insns are equally good...  */
5489                   privileged_n == 0
5490                   /* Or a privileged insn will be issued.  */
5491                   || ready_try[n])
5492                 /* Then we have a solution.  */
5493                 {
5494                   best = top - choice_stack;
5495                   /* This is the index of the insn issued first in this
5496                      solution.  */
5497                   *index = choice_stack [1].index;
5498                   if (top->n == more_issue || best == all)
5499                     break;
5500                 }
5501             }
5502
5503           /* Set ready-list index to point to the last insn
5504              ('i++' below will advance it to the next insn).  */
5505           i = top->index;
5506
5507           /* Backtrack.  */
5508           ready_try [i] = 0;
5509
5510           if (targetm.sched.first_cycle_multipass_backtrack)
5511             targetm.sched.first_cycle_multipass_backtrack (&top->target_data,
5512                                                            ready_try, n_ready);
5513
5514           top--;
5515           memcpy (state, top->state, dfa_state_size);
5516         }
5517       else if (!ready_try [i])
5518         {
5519           tries_num++;
5520           if (tries_num > max_lookahead_tries)
5521             break;
5522           insn = ready_element (ready, i);
5523           delay = state_transition (state, insn);
5524           if (delay < 0)
5525             {
5526               if (state_dead_lock_p (state)
5527                   || insn_finishes_cycle_p (insn))
5528                 /* We won't issue any more instructions in the next
5529                    choice_state.  */
5530                 top->rest = 0;
5531               else
5532                 top->rest--;
5533
5534               n = top->n;
5535               if (memcmp (top->state, state, dfa_state_size) != 0)
5536                 n++;
5537
5538               /* Advance to the next choice_entry.  */
5539               top++;
5540               /* Initialize it.  */
5541               top->rest = dfa_lookahead;
5542               top->index = i;
5543               top->n = n;
5544               memcpy (top->state, state, dfa_state_size);
5545               ready_try [i] = 1;
5546
5547               if (targetm.sched.first_cycle_multipass_issue)
5548                 targetm.sched.first_cycle_multipass_issue (&top->target_data,
5549                                                            ready_try, n_ready,
5550                                                            insn,
5551                                                            &((top - 1)
5552                                                              ->target_data));
5553
5554               i = -1;
5555             }
5556         }
5557
5558       /* Increase ready-list index.  */
5559       i++;
5560     }
5561
5562   if (targetm.sched.first_cycle_multipass_end)
5563     targetm.sched.first_cycle_multipass_end (best != 0
5564                                              ? &choice_stack[1].target_data
5565                                              : NULL);
5566
5567   /* Restore the original state of the DFA.  */
5568   memcpy (state, choice_stack->state, dfa_state_size);
5569
5570   return best;
5571 }
5572
5573 /* The following function chooses insn from READY and modifies
5574    READY.  The following function is used only for first
5575    cycle multipass scheduling.
5576    Return:
5577    -1 if cycle should be advanced,
5578    0 if INSN_PTR is set to point to the desirable insn,
5579    1 if choose_ready () should be restarted without advancing the cycle.  */
5580 static int
5581 choose_ready (struct ready_list *ready, bool first_cycle_insn_p,
5582               rtx_insn **insn_ptr)
5583 {
5584   int lookahead;
5585
5586   if (dbg_cnt (sched_insn) == false)
5587     {
5588       if (nonscheduled_insns_begin == NULL_RTX)
5589         nonscheduled_insns_begin = current_sched_info->prev_head;
5590
5591       rtx_insn *insn = first_nonscheduled_insn ();
5592
5593       if (QUEUE_INDEX (insn) == QUEUE_READY)
5594         /* INSN is in the ready_list.  */
5595         {
5596           ready_remove_insn (insn);
5597           *insn_ptr = insn;
5598           return 0;
5599         }
5600
5601       /* INSN is in the queue.  Advance cycle to move it to the ready list.  */
5602       gcc_assert (QUEUE_INDEX (insn) >= 0);
5603       return -1;
5604     }
5605
5606   lookahead = 0;
5607
5608   if (targetm.sched.first_cycle_multipass_dfa_lookahead)
5609     lookahead = targetm.sched.first_cycle_multipass_dfa_lookahead ();
5610   if (lookahead <= 0 || SCHED_GROUP_P (ready_element (ready, 0))
5611       || DEBUG_INSN_P (ready_element (ready, 0)))
5612     {
5613       if (targetm.sched.dispatch (NULL_RTX, IS_DISPATCH_ON))
5614         *insn_ptr = ready_remove_first_dispatch (ready);
5615       else
5616         *insn_ptr = ready_remove_first (ready);
5617
5618       return 0;
5619     }
5620   else
5621     {
5622       /* Try to choose the best insn.  */
5623       int index = 0, i;
5624       rtx_insn *insn;
5625
5626       insn = ready_element (ready, 0);
5627       if (INSN_CODE (insn) < 0)
5628         {
5629           *insn_ptr = ready_remove_first (ready);
5630           return 0;
5631         }
5632
5633       /* Filter the search space.  */
5634       for (i = 0; i < ready->n_ready; i++)
5635         {
5636           ready_try[i] = 0;
5637
5638           insn = ready_element (ready, i);
5639
5640           /* If this insn is recognizable we should have already
5641              recognized it earlier.
5642              ??? Not very clear where this is supposed to be done.
5643              See dep_cost_1.  */
5644           gcc_checking_assert (INSN_CODE (insn) >= 0
5645                                || recog_memoized (insn) < 0);
5646           if (INSN_CODE (insn) < 0)
5647             {
5648               /* Non-recognized insns at position 0 are handled above.  */
5649               gcc_assert (i > 0);
5650               ready_try[i] = 1;
5651               continue;
5652             }
5653
5654           if (targetm.sched.first_cycle_multipass_dfa_lookahead_guard)
5655             {
5656               ready_try[i]
5657                 = (targetm.sched.first_cycle_multipass_dfa_lookahead_guard
5658                     (insn, i));
5659
5660               if (ready_try[i] < 0)
5661                 /* Queue instruction for several cycles.
5662                    We need to restart choose_ready as we have changed
5663                    the ready list.  */
5664                 {
5665                   change_queue_index (insn, -ready_try[i]);
5666                   return 1;
5667                 }
5668
5669               /* Make sure that we didn't end up with 0'th insn filtered out.
5670                  Don't be tempted to make life easier for backends and just
5671                  requeue 0'th insn if (ready_try[0] == 0) and restart
5672                  choose_ready.  Backends should be very considerate about
5673                  requeueing instructions -- especially the highest priority
5674                  one at position 0.  */
5675               gcc_assert (ready_try[i] == 0 || i > 0);
5676               if (ready_try[i])
5677                 continue;
5678             }
5679
5680           gcc_assert (ready_try[i] == 0);
5681           /* INSN made it through the scrutiny of filters!  */
5682         }
5683
5684       if (max_issue (ready, 1, curr_state, first_cycle_insn_p, &index) == 0)
5685         {
5686           *insn_ptr = ready_remove_first (ready);
5687           if (sched_verbose >= 4)
5688             fprintf (sched_dump, ";;\t\tChosen insn (but can't issue) : %s \n",
5689                      (*current_sched_info->print_insn) (*insn_ptr, 0));
5690           return 0;
5691         }
5692       else
5693         {
5694           if (sched_verbose >= 4)
5695             fprintf (sched_dump, ";;\t\tChosen insn : %s\n",
5696                      (*current_sched_info->print_insn)
5697                      (ready_element (ready, index), 0));
5698
5699           *insn_ptr = ready_remove (ready, index);
5700           return 0;
5701         }
5702     }
5703 }
5704
5705 /* This function is called when we have successfully scheduled a
5706    block.  It uses the schedule stored in the scheduled_insns vector
5707    to rearrange the RTL.  PREV_HEAD is used as the anchor to which we
5708    append the scheduled insns; TAIL is the insn after the scheduled
5709    block.  TARGET_BB is the argument passed to schedule_block.  */
5710
5711 static void
5712 commit_schedule (rtx_insn *prev_head, rtx tail, basic_block *target_bb)
5713 {
5714   unsigned int i;
5715   rtx_insn *insn;
5716
5717   last_scheduled_insn = prev_head;
5718   for (i = 0;
5719        scheduled_insns.iterate (i, &insn);
5720        i++)
5721     {
5722       if (control_flow_insn_p (last_scheduled_insn)
5723           || current_sched_info->advance_target_bb (*target_bb, insn))
5724         {
5725           *target_bb = current_sched_info->advance_target_bb (*target_bb, 0);
5726
5727           if (sched_verbose)
5728             {
5729               rtx x;
5730
5731               x = next_real_insn (last_scheduled_insn);
5732               gcc_assert (x);
5733               dump_new_block_header (1, *target_bb, x, tail);
5734             }
5735
5736           last_scheduled_insn = bb_note (*target_bb);
5737         }
5738
5739       if (current_sched_info->begin_move_insn)
5740         (*current_sched_info->begin_move_insn) (insn, last_scheduled_insn);
5741       move_insn (insn, last_scheduled_insn,
5742                  current_sched_info->next_tail);
5743       if (!DEBUG_INSN_P (insn))
5744         reemit_notes (insn);
5745       last_scheduled_insn = insn;
5746     }
5747
5748   scheduled_insns.truncate (0);
5749 }
5750
5751 /* Examine all insns on the ready list and queue those which can't be
5752    issued in this cycle.  TEMP_STATE is temporary scheduler state we
5753    can use as scratch space.  If FIRST_CYCLE_INSN_P is true, no insns
5754    have been issued for the current cycle, which means it is valid to
5755    issue an asm statement.
5756
5757    If SHADOWS_ONLY_P is true, we eliminate all real insns and only
5758    leave those for which SHADOW_P is true.  If MODULO_EPILOGUE is true,
5759    we only leave insns which have an INSN_EXACT_TICK.  */
5760
5761 static void
5762 prune_ready_list (state_t temp_state, bool first_cycle_insn_p,
5763                   bool shadows_only_p, bool modulo_epilogue_p)
5764 {
5765   int i, pass;
5766   bool sched_group_found = false;
5767   int min_cost_group = 1;
5768
5769   for (i = 0; i < ready.n_ready; i++)
5770     {
5771       rtx_insn *insn = ready_element (&ready, i);
5772       if (SCHED_GROUP_P (insn))
5773         {
5774           sched_group_found = true;
5775           break;
5776         }
5777     }
5778
5779   /* Make two passes if there's a SCHED_GROUP_P insn; make sure to handle
5780      such an insn first and note its cost, then schedule all other insns
5781      for one cycle later.  */
5782   for (pass = sched_group_found ? 0 : 1; pass < 2; )
5783     {
5784       int n = ready.n_ready;
5785       for (i = 0; i < n; i++)
5786         {
5787           rtx_insn *insn = ready_element (&ready, i);
5788           int cost = 0;
5789           const char *reason = "resource conflict";
5790
5791           if (DEBUG_INSN_P (insn))
5792             continue;
5793
5794           if (sched_group_found && !SCHED_GROUP_P (insn))
5795             {
5796               if (pass == 0)
5797                 continue;
5798               cost = min_cost_group;
5799               reason = "not in sched group";
5800             }
5801           else if (modulo_epilogue_p
5802                    && INSN_EXACT_TICK (insn) == INVALID_TICK)
5803             {
5804               cost = max_insn_queue_index;
5805               reason = "not an epilogue insn";
5806             }
5807           else if (shadows_only_p && !SHADOW_P (insn))
5808             {
5809               cost = 1;
5810               reason = "not a shadow";
5811             }
5812           else if (recog_memoized (insn) < 0)
5813             {
5814               if (!first_cycle_insn_p
5815                   && (GET_CODE (PATTERN (insn)) == ASM_INPUT
5816                       || asm_noperands (PATTERN (insn)) >= 0))
5817                 cost = 1;
5818               reason = "asm";
5819             }
5820           else if (sched_pressure != SCHED_PRESSURE_NONE)
5821             {
5822               if (sched_pressure == SCHED_PRESSURE_MODEL
5823                   && INSN_TICK (insn) <= clock_var)
5824                 {
5825                   memcpy (temp_state, curr_state, dfa_state_size);
5826                   if (state_transition (temp_state, insn) >= 0)
5827                     INSN_TICK (insn) = clock_var + 1;
5828                 }
5829               cost = 0;
5830             }
5831           else
5832             {
5833               int delay_cost = 0;
5834
5835               if (delay_htab)
5836                 {
5837                   struct delay_pair *delay_entry;
5838                   delay_entry
5839                     = delay_htab->find_with_hash (insn,
5840                                                   htab_hash_pointer (insn));
5841                   while (delay_entry && delay_cost == 0)
5842                     {
5843                       delay_cost = estimate_shadow_tick (delay_entry);
5844                       if (delay_cost > max_insn_queue_index)
5845                         delay_cost = max_insn_queue_index;
5846                       delay_entry = delay_entry->next_same_i1;
5847                     }
5848                 }
5849
5850               memcpy (temp_state, curr_state, dfa_state_size);
5851               cost = state_transition (temp_state, insn);
5852               if (cost < 0)
5853                 cost = 0;
5854               else if (cost == 0)
5855                 cost = 1;
5856               if (cost < delay_cost)
5857                 {
5858                   cost = delay_cost;
5859                   reason = "shadow tick";
5860                 }
5861             }
5862           if (cost >= 1)
5863             {
5864               if (SCHED_GROUP_P (insn) && cost > min_cost_group)
5865                 min_cost_group = cost;
5866               ready_remove (&ready, i);
5867               queue_insn (insn, cost, reason);
5868               if (i + 1 < n)
5869                 break;
5870             }
5871         }
5872       if (i == n)
5873         pass++;
5874     }
5875 }
5876
5877 /* Called when we detect that the schedule is impossible.  We examine the
5878    backtrack queue to find the earliest insn that caused this condition.  */
5879
5880 static struct haifa_saved_data *
5881 verify_shadows (void)
5882 {
5883   struct haifa_saved_data *save, *earliest_fail = NULL;
5884   for (save = backtrack_queue; save; save = save->next)
5885     {
5886       int t;
5887       struct delay_pair *pair = save->delay_pair;
5888       rtx i1 = pair->i1;
5889
5890       for (; pair; pair = pair->next_same_i1)
5891         {
5892           rtx i2 = pair->i2;
5893
5894           if (QUEUE_INDEX (i2) == QUEUE_SCHEDULED)
5895             continue;
5896
5897           t = INSN_TICK (i1) + pair_delay (pair);
5898           if (t < clock_var)
5899             {
5900               if (sched_verbose >= 2)
5901                 fprintf (sched_dump,
5902                          ";;\t\tfailed delay requirements for %d/%d (%d->%d)"
5903                          ", not ready\n",
5904                          INSN_UID (pair->i1), INSN_UID (pair->i2),
5905                          INSN_TICK (pair->i1), INSN_EXACT_TICK (pair->i2));
5906               earliest_fail = save;
5907               break;
5908             }
5909           if (QUEUE_INDEX (i2) >= 0)
5910             {
5911               int queued_for = INSN_TICK (i2);
5912
5913               if (t < queued_for)
5914                 {
5915                   if (sched_verbose >= 2)
5916                     fprintf (sched_dump,
5917                              ";;\t\tfailed delay requirements for %d/%d"
5918                              " (%d->%d), queued too late\n",
5919                              INSN_UID (pair->i1), INSN_UID (pair->i2),
5920                              INSN_TICK (pair->i1), INSN_EXACT_TICK (pair->i2));
5921                   earliest_fail = save;
5922                   break;
5923                 }
5924             }
5925         }
5926     }
5927
5928   return earliest_fail;
5929 }
5930
5931 /* Print instructions together with useful scheduling information between
5932    HEAD and TAIL (inclusive).  */
5933 static void
5934 dump_insn_stream (rtx head, rtx tail)
5935 {
5936   fprintf (sched_dump, ";;\t| insn | prio |\n");
5937
5938   rtx next_tail = NEXT_INSN (tail);
5939   for (rtx insn = head; insn != next_tail; insn = NEXT_INSN (insn))
5940     {
5941       int priority = NOTE_P (insn) ? 0 : INSN_PRIORITY (insn);
5942       const char *pattern = (NOTE_P (insn)
5943                              ? "note"
5944                              : str_pattern_slim (PATTERN (insn)));
5945
5946       fprintf (sched_dump, ";;\t| %4d | %4d | %-30s ",
5947                INSN_UID (insn), priority, pattern);
5948
5949       if (sched_verbose >= 4)
5950         {
5951           if (NOTE_P (insn) || recog_memoized (insn) < 0)
5952             fprintf (sched_dump, "nothing");
5953           else
5954             print_reservation (sched_dump, insn);
5955         }
5956       fprintf (sched_dump, "\n");
5957     }
5958 }
5959
5960 /* Use forward list scheduling to rearrange insns of block pointed to by
5961    TARGET_BB, possibly bringing insns from subsequent blocks in the same
5962    region.  */
5963
5964 bool
5965 schedule_block (basic_block *target_bb, state_t init_state)
5966 {
5967   int i;
5968   bool success = modulo_ii == 0;
5969   struct sched_block_state ls;
5970   state_t temp_state = NULL;  /* It is used for multipass scheduling.  */
5971   int sort_p, advance, start_clock_var;
5972
5973   /* Head/tail info for this block.  */
5974   rtx_insn *prev_head = current_sched_info->prev_head;
5975   rtx next_tail = current_sched_info->next_tail;
5976   rtx_insn *head = NEXT_INSN (prev_head);
5977   rtx_insn *tail = PREV_INSN (next_tail);
5978
5979   if ((current_sched_info->flags & DONT_BREAK_DEPENDENCIES) == 0
5980       && sched_pressure != SCHED_PRESSURE_MODEL)
5981     find_modifiable_mems (head, tail);
5982
5983   /* We used to have code to avoid getting parameters moved from hard
5984      argument registers into pseudos.
5985
5986      However, it was removed when it proved to be of marginal benefit
5987      and caused problems because schedule_block and compute_forward_dependences
5988      had different notions of what the "head" insn was.  */
5989
5990   gcc_assert (head != tail || INSN_P (head));
5991
5992   haifa_recovery_bb_recently_added_p = false;
5993
5994   backtrack_queue = NULL;
5995
5996   /* Debug info.  */
5997   if (sched_verbose)
5998     {
5999       dump_new_block_header (0, *target_bb, head, tail);
6000
6001       if (sched_verbose >= 2)
6002         {
6003           dump_insn_stream (head, tail);
6004           memset (&rank_for_schedule_stats, 0,
6005                   sizeof (rank_for_schedule_stats));
6006         }
6007     }
6008
6009   if (init_state == NULL)
6010     state_reset (curr_state);
6011   else
6012     memcpy (curr_state, init_state, dfa_state_size);
6013
6014   /* Clear the ready list.  */
6015   ready.first = ready.veclen - 1;
6016   ready.n_ready = 0;
6017   ready.n_debug = 0;
6018
6019   /* It is used for first cycle multipass scheduling.  */
6020   temp_state = alloca (dfa_state_size);
6021
6022   if (targetm.sched.init)
6023     targetm.sched.init (sched_dump, sched_verbose, ready.veclen);
6024
6025   /* We start inserting insns after PREV_HEAD.  */
6026   last_scheduled_insn = prev_head;
6027   last_nondebug_scheduled_insn = NULL_RTX;
6028   nonscheduled_insns_begin = NULL;
6029
6030   gcc_assert ((NOTE_P (last_scheduled_insn)
6031                || DEBUG_INSN_P (last_scheduled_insn))
6032               && BLOCK_FOR_INSN (last_scheduled_insn) == *target_bb);
6033
6034   /* Initialize INSN_QUEUE.  Q_SIZE is the total number of insns in the
6035      queue.  */
6036   q_ptr = 0;
6037   q_size = 0;
6038
6039   insn_queue = XALLOCAVEC (rtx, max_insn_queue_index + 1);
6040   memset (insn_queue, 0, (max_insn_queue_index + 1) * sizeof (rtx));
6041
6042   /* Start just before the beginning of time.  */
6043   clock_var = -1;
6044
6045   /* We need queue and ready lists and clock_var be initialized
6046      in try_ready () (which is called through init_ready_list ()).  */
6047   (*current_sched_info->init_ready_list) ();
6048
6049   if (sched_pressure == SCHED_PRESSURE_MODEL)
6050     model_start_schedule ();
6051
6052   /* The algorithm is O(n^2) in the number of ready insns at any given
6053      time in the worst case.  Before reload we are more likely to have
6054      big lists so truncate them to a reasonable size.  */
6055   if (!reload_completed
6056       && ready.n_ready - ready.n_debug > MAX_SCHED_READY_INSNS)
6057     {
6058       ready_sort (&ready);
6059
6060       /* Find first free-standing insn past MAX_SCHED_READY_INSNS.
6061          If there are debug insns, we know they're first.  */
6062       for (i = MAX_SCHED_READY_INSNS + ready.n_debug; i < ready.n_ready; i++)
6063         if (!SCHED_GROUP_P (ready_element (&ready, i)))
6064           break;
6065
6066       if (sched_verbose >= 2)
6067         {
6068           fprintf (sched_dump,
6069                    ";;\t\tReady list on entry: %d insns\n", ready.n_ready);
6070           fprintf (sched_dump,
6071                    ";;\t\t before reload => truncated to %d insns\n", i);
6072         }
6073
6074       /* Delay all insns past it for 1 cycle.  If debug counter is
6075          activated make an exception for the insn right after
6076          nonscheduled_insns_begin.  */
6077       {
6078         rtx_insn *skip_insn;
6079
6080         if (dbg_cnt (sched_insn) == false)
6081           skip_insn = first_nonscheduled_insn ();
6082         else
6083           skip_insn = NULL;
6084
6085         while (i < ready.n_ready)
6086           {
6087             rtx_insn *insn;
6088
6089             insn = ready_remove (&ready, i);
6090
6091             if (insn != skip_insn)
6092               queue_insn (insn, 1, "list truncated");
6093           }
6094         if (skip_insn)
6095           ready_add (&ready, skip_insn, true);
6096       }
6097     }
6098
6099   /* Now we can restore basic block notes and maintain precise cfg.  */
6100   restore_bb_notes (*target_bb);
6101
6102   last_clock_var = -1;
6103
6104   advance = 0;
6105
6106   gcc_assert (scheduled_insns.length () == 0);
6107   sort_p = TRUE;
6108   must_backtrack = false;
6109   modulo_insns_scheduled = 0;
6110
6111   ls.modulo_epilogue = false;
6112   ls.first_cycle_insn_p = true;
6113
6114   /* Loop until all the insns in BB are scheduled.  */
6115   while ((*current_sched_info->schedule_more_p) ())
6116     {
6117       perform_replacements_new_cycle ();
6118       do
6119         {
6120           start_clock_var = clock_var;
6121
6122           clock_var++;
6123
6124           advance_one_cycle ();
6125
6126           /* Add to the ready list all pending insns that can be issued now.
6127              If there are no ready insns, increment clock until one
6128              is ready and add all pending insns at that point to the ready
6129              list.  */
6130           queue_to_ready (&ready);
6131
6132           gcc_assert (ready.n_ready);
6133
6134           if (sched_verbose >= 2)
6135             {
6136               fprintf (sched_dump, ";;\t\tReady list after queue_to_ready:");
6137               debug_ready_list (&ready);
6138             }
6139           advance -= clock_var - start_clock_var;
6140         }
6141       while (advance > 0);
6142
6143       if (ls.modulo_epilogue)
6144         {
6145           int stage = clock_var / modulo_ii;
6146           if (stage > modulo_last_stage * 2 + 2)
6147             {
6148               if (sched_verbose >= 2)
6149                 fprintf (sched_dump,
6150                          ";;\t\tmodulo scheduled succeeded at II %d\n",
6151                          modulo_ii);
6152               success = true;
6153               goto end_schedule;
6154             }
6155         }
6156       else if (modulo_ii > 0)
6157         {
6158           int stage = clock_var / modulo_ii;
6159           if (stage > modulo_max_stages)
6160             {
6161               if (sched_verbose >= 2)
6162                 fprintf (sched_dump,
6163                          ";;\t\tfailing schedule due to excessive stages\n");
6164               goto end_schedule;
6165             }
6166           if (modulo_n_insns == modulo_insns_scheduled
6167               && stage > modulo_last_stage)
6168             {
6169               if (sched_verbose >= 2)
6170                 fprintf (sched_dump,
6171                          ";;\t\tfound kernel after %d stages, II %d\n",
6172                          stage, modulo_ii);
6173               ls.modulo_epilogue = true;
6174             }
6175         }
6176
6177       prune_ready_list (temp_state, true, false, ls.modulo_epilogue);
6178       if (ready.n_ready == 0)
6179         continue;
6180       if (must_backtrack)
6181         goto do_backtrack;
6182
6183       ls.shadows_only_p = false;
6184       cycle_issued_insns = 0;
6185       ls.can_issue_more = issue_rate;
6186       for (;;)
6187         {
6188           rtx_insn *insn;
6189           int cost;
6190           bool asm_p;
6191
6192           if (sort_p && ready.n_ready > 0)
6193             {
6194               /* Sort the ready list based on priority.  This must be
6195                  done every iteration through the loop, as schedule_insn
6196                  may have readied additional insns that will not be
6197                  sorted correctly.  */
6198               ready_sort (&ready);
6199
6200               if (sched_verbose >= 2)
6201                 {
6202                   fprintf (sched_dump,
6203                            ";;\t\tReady list after ready_sort:    ");
6204                   debug_ready_list (&ready);
6205                 }
6206             }
6207
6208           /* We don't want md sched reorder to even see debug isns, so put
6209              them out right away.  */
6210           if (ready.n_ready && DEBUG_INSN_P (ready_element (&ready, 0))
6211               && (*current_sched_info->schedule_more_p) ())
6212             {
6213               while (ready.n_ready && DEBUG_INSN_P (ready_element (&ready, 0)))
6214                 {
6215                   rtx_insn *insn = ready_remove_first (&ready);
6216                   gcc_assert (DEBUG_INSN_P (insn));
6217                   (*current_sched_info->begin_schedule_ready) (insn);
6218                   scheduled_insns.safe_push (insn);
6219                   last_scheduled_insn = insn;
6220                   advance = schedule_insn (insn);
6221                   gcc_assert (advance == 0);
6222                   if (ready.n_ready > 0)
6223                     ready_sort (&ready);
6224                 }
6225             }
6226
6227           if (ls.first_cycle_insn_p && !ready.n_ready)
6228             break;
6229
6230         resume_after_backtrack:
6231           /* Allow the target to reorder the list, typically for
6232              better instruction bundling.  */
6233           if (sort_p
6234               && (ready.n_ready == 0
6235                   || !SCHED_GROUP_P (ready_element (&ready, 0))))
6236             {
6237               if (ls.first_cycle_insn_p && targetm.sched.reorder)
6238                 ls.can_issue_more
6239                   = targetm.sched.reorder (sched_dump, sched_verbose,
6240                                            ready_lastpos (&ready),
6241                                            &ready.n_ready, clock_var);
6242               else if (!ls.first_cycle_insn_p && targetm.sched.reorder2)
6243                 ls.can_issue_more
6244                   = targetm.sched.reorder2 (sched_dump, sched_verbose,
6245                                             ready.n_ready
6246                                             ? ready_lastpos (&ready) : NULL,
6247                                             &ready.n_ready, clock_var);
6248             }
6249
6250         restart_choose_ready:
6251           if (sched_verbose >= 2)
6252             {
6253               fprintf (sched_dump, ";;\tReady list (t = %3d):  ",
6254                        clock_var);
6255               debug_ready_list (&ready);
6256               if (sched_pressure == SCHED_PRESSURE_WEIGHTED)
6257                 print_curr_reg_pressure ();
6258             }
6259
6260           if (ready.n_ready == 0
6261               && ls.can_issue_more
6262               && reload_completed)
6263             {
6264               /* Allow scheduling insns directly from the queue in case
6265                  there's nothing better to do (ready list is empty) but
6266                  there are still vacant dispatch slots in the current cycle.  */
6267               if (sched_verbose >= 6)
6268                 fprintf (sched_dump,";;\t\tSecond chance\n");
6269               memcpy (temp_state, curr_state, dfa_state_size);
6270               if (early_queue_to_ready (temp_state, &ready))
6271                 ready_sort (&ready);
6272             }
6273
6274           if (ready.n_ready == 0
6275               || !ls.can_issue_more
6276               || state_dead_lock_p (curr_state)
6277               || !(*current_sched_info->schedule_more_p) ())
6278             break;
6279
6280           /* Select and remove the insn from the ready list.  */
6281           if (sort_p)
6282             {
6283               int res;
6284
6285               insn = NULL;
6286               res = choose_ready (&ready, ls.first_cycle_insn_p, &insn);
6287
6288               if (res < 0)
6289                 /* Finish cycle.  */
6290                 break;
6291               if (res > 0)
6292                 goto restart_choose_ready;
6293
6294               gcc_assert (insn != NULL_RTX);
6295             }
6296           else
6297             insn = ready_remove_first (&ready);
6298
6299           if (sched_pressure != SCHED_PRESSURE_NONE
6300               && INSN_TICK (insn) > clock_var)
6301             {
6302               ready_add (&ready, insn, true);
6303               advance = 1;
6304               break;
6305             }
6306
6307           if (targetm.sched.dfa_new_cycle
6308               && targetm.sched.dfa_new_cycle (sched_dump, sched_verbose,
6309                                               insn, last_clock_var,
6310                                               clock_var, &sort_p))
6311             /* SORT_P is used by the target to override sorting
6312                of the ready list.  This is needed when the target
6313                has modified its internal structures expecting that
6314                the insn will be issued next.  As we need the insn
6315                to have the highest priority (so it will be returned by
6316                the ready_remove_first call above), we invoke
6317                ready_add (&ready, insn, true).
6318                But, still, there is one issue: INSN can be later
6319                discarded by scheduler's front end through
6320                current_sched_info->can_schedule_ready_p, hence, won't
6321                be issued next.  */
6322             {
6323               ready_add (&ready, insn, true);
6324               break;
6325             }
6326
6327           sort_p = TRUE;
6328
6329           if (current_sched_info->can_schedule_ready_p
6330               && ! (*current_sched_info->can_schedule_ready_p) (insn))
6331             /* We normally get here only if we don't want to move
6332                insn from the split block.  */
6333             {
6334               TODO_SPEC (insn) = DEP_POSTPONED;
6335               goto restart_choose_ready;
6336             }
6337
6338           if (delay_htab)
6339             {
6340               /* If this insn is the first part of a delay-slot pair, record a
6341                  backtrack point.  */
6342               struct delay_pair *delay_entry;
6343               delay_entry
6344                 = delay_htab->find_with_hash (insn, htab_hash_pointer (insn));
6345               if (delay_entry)
6346                 {
6347                   save_backtrack_point (delay_entry, ls);
6348                   if (sched_verbose >= 2)
6349                     fprintf (sched_dump, ";;\t\tsaving backtrack point\n");
6350                 }
6351             }
6352
6353           /* DECISION is made.  */
6354
6355           if (modulo_ii > 0 && INSN_UID (insn) < modulo_iter0_max_uid)
6356             {
6357               modulo_insns_scheduled++;
6358               modulo_last_stage = clock_var / modulo_ii;
6359             }
6360           if (TODO_SPEC (insn) & SPECULATIVE)
6361             generate_recovery_code (insn);
6362
6363           if (targetm.sched.dispatch (NULL_RTX, IS_DISPATCH_ON))
6364             targetm.sched.dispatch_do (insn, ADD_TO_DISPATCH_WINDOW);
6365
6366           /* Update counters, etc in the scheduler's front end.  */
6367           (*current_sched_info->begin_schedule_ready) (insn);
6368           scheduled_insns.safe_push (insn);
6369           gcc_assert (NONDEBUG_INSN_P (insn));
6370           last_nondebug_scheduled_insn = last_scheduled_insn = insn;
6371
6372           if (recog_memoized (insn) >= 0)
6373             {
6374               memcpy (temp_state, curr_state, dfa_state_size);
6375               cost = state_transition (curr_state, insn);
6376               if (sched_pressure != SCHED_PRESSURE_WEIGHTED)
6377                 gcc_assert (cost < 0);
6378               if (memcmp (temp_state, curr_state, dfa_state_size) != 0)
6379                 cycle_issued_insns++;
6380               asm_p = false;
6381             }
6382           else
6383             asm_p = (GET_CODE (PATTERN (insn)) == ASM_INPUT
6384                      || asm_noperands (PATTERN (insn)) >= 0);
6385
6386           if (targetm.sched.variable_issue)
6387             ls.can_issue_more =
6388               targetm.sched.variable_issue (sched_dump, sched_verbose,
6389                                             insn, ls.can_issue_more);
6390           /* A naked CLOBBER or USE generates no instruction, so do
6391              not count them against the issue rate.  */
6392           else if (GET_CODE (PATTERN (insn)) != USE
6393                    && GET_CODE (PATTERN (insn)) != CLOBBER)
6394             ls.can_issue_more--;
6395           advance = schedule_insn (insn);
6396
6397           if (SHADOW_P (insn))
6398             ls.shadows_only_p = true;
6399
6400           /* After issuing an asm insn we should start a new cycle.  */
6401           if (advance == 0 && asm_p)
6402             advance = 1;
6403
6404           if (must_backtrack)
6405             break;
6406
6407           if (advance != 0)
6408             break;
6409
6410           ls.first_cycle_insn_p = false;
6411           if (ready.n_ready > 0)
6412             prune_ready_list (temp_state, false, ls.shadows_only_p,
6413                               ls.modulo_epilogue);
6414         }
6415
6416     do_backtrack:
6417       if (!must_backtrack)
6418         for (i = 0; i < ready.n_ready; i++)
6419           {
6420             rtx insn = ready_element (&ready, i);
6421             if (INSN_EXACT_TICK (insn) == clock_var)
6422               {
6423                 must_backtrack = true;
6424                 clock_var++;
6425                 break;
6426               }
6427           }
6428       if (must_backtrack && modulo_ii > 0)
6429         {
6430           if (modulo_backtracks_left == 0)
6431             goto end_schedule;
6432           modulo_backtracks_left--;
6433         }
6434       while (must_backtrack)
6435         {
6436           struct haifa_saved_data *failed;
6437           rtx_insn *failed_insn;
6438
6439           must_backtrack = false;
6440           failed = verify_shadows ();
6441           gcc_assert (failed);
6442
6443           failed_insn = failed->delay_pair->i1;
6444           /* Clear these queues.  */
6445           perform_replacements_new_cycle ();
6446           toggle_cancelled_flags (false);
6447           unschedule_insns_until (failed_insn);
6448           while (failed != backtrack_queue)
6449             free_topmost_backtrack_point (true);
6450           restore_last_backtrack_point (&ls);
6451           if (sched_verbose >= 2)
6452             fprintf (sched_dump, ";;\t\trewind to cycle %d\n", clock_var);
6453           /* Delay by at least a cycle.  This could cause additional
6454              backtracking.  */
6455           queue_insn (failed_insn, 1, "backtracked");
6456           advance = 0;
6457           if (must_backtrack)
6458             continue;
6459           if (ready.n_ready > 0)
6460             goto resume_after_backtrack;
6461           else
6462             {
6463               if (clock_var == 0 && ls.first_cycle_insn_p)
6464                 goto end_schedule;
6465               advance = 1;
6466               break;
6467             }
6468         }
6469       ls.first_cycle_insn_p = true;
6470     }
6471   if (ls.modulo_epilogue)
6472     success = true;
6473  end_schedule:
6474   if (!ls.first_cycle_insn_p)
6475     advance_one_cycle ();
6476   perform_replacements_new_cycle ();
6477   if (modulo_ii > 0)
6478     {
6479       /* Once again, debug insn suckiness: they can be on the ready list
6480          even if they have unresolved dependencies.  To make our view
6481          of the world consistent, remove such "ready" insns.  */
6482     restart_debug_insn_loop:
6483       for (i = ready.n_ready - 1; i >= 0; i--)
6484         {
6485           rtx x;
6486
6487           x = ready_element (&ready, i);
6488           if (DEPS_LIST_FIRST (INSN_HARD_BACK_DEPS (x)) != NULL
6489               || DEPS_LIST_FIRST (INSN_SPEC_BACK_DEPS (x)) != NULL)
6490             {
6491               ready_remove (&ready, i);
6492               goto restart_debug_insn_loop;
6493             }
6494         }
6495       for (i = ready.n_ready - 1; i >= 0; i--)
6496         {
6497           rtx_insn *x;
6498
6499           x = ready_element (&ready, i);
6500           resolve_dependencies (x);
6501         }
6502       for (i = 0; i <= max_insn_queue_index; i++)
6503         {
6504           rtx link;
6505           while ((link = insn_queue[i]) != NULL)
6506             {
6507               rtx_insn *x = as_a <rtx_insn *> (XEXP (link, 0));
6508               insn_queue[i] = XEXP (link, 1);
6509               QUEUE_INDEX (x) = QUEUE_NOWHERE;
6510               free_INSN_LIST_node (link);
6511               resolve_dependencies (x);
6512             }
6513         }
6514     }
6515
6516   if (!success)
6517     undo_all_replacements ();
6518
6519   /* Debug info.  */
6520   if (sched_verbose)
6521     {
6522       fprintf (sched_dump, ";;\tReady list (final):  ");
6523       debug_ready_list (&ready);
6524     }
6525
6526   if (modulo_ii == 0 && current_sched_info->queue_must_finish_empty)
6527     /* Sanity check -- queue must be empty now.  Meaningless if region has
6528        multiple bbs.  */
6529     gcc_assert (!q_size && !ready.n_ready && !ready.n_debug);
6530   else if (modulo_ii == 0)
6531     {
6532       /* We must maintain QUEUE_INDEX between blocks in region.  */
6533       for (i = ready.n_ready - 1; i >= 0; i--)
6534         {
6535           rtx x;
6536
6537           x = ready_element (&ready, i);
6538           QUEUE_INDEX (x) = QUEUE_NOWHERE;
6539           TODO_SPEC (x) = HARD_DEP;
6540         }
6541
6542       if (q_size)
6543         for (i = 0; i <= max_insn_queue_index; i++)
6544           {
6545             rtx link;
6546             for (link = insn_queue[i]; link; link = XEXP (link, 1))
6547               {
6548                 rtx x;
6549
6550                 x = XEXP (link, 0);
6551                 QUEUE_INDEX (x) = QUEUE_NOWHERE;
6552                 TODO_SPEC (x) = HARD_DEP;
6553               }
6554             free_INSN_LIST_list (&insn_queue[i]);
6555           }
6556     }
6557
6558   if (sched_pressure == SCHED_PRESSURE_MODEL)
6559     model_end_schedule ();
6560
6561   if (success)
6562     {
6563       commit_schedule (prev_head, tail, target_bb);
6564       if (sched_verbose)
6565         fprintf (sched_dump, ";;   total time = %d\n", clock_var);
6566     }
6567   else
6568     last_scheduled_insn = tail;
6569
6570   scheduled_insns.truncate (0);
6571
6572   if (!current_sched_info->queue_must_finish_empty
6573       || haifa_recovery_bb_recently_added_p)
6574     {
6575       /* INSN_TICK (minimum clock tick at which the insn becomes
6576          ready) may be not correct for the insn in the subsequent
6577          blocks of the region.  We should use a correct value of
6578          `clock_var' or modify INSN_TICK.  It is better to keep
6579          clock_var value equal to 0 at the start of a basic block.
6580          Therefore we modify INSN_TICK here.  */
6581       fix_inter_tick (NEXT_INSN (prev_head), last_scheduled_insn);
6582     }
6583
6584   if (targetm.sched.finish)
6585     {
6586       targetm.sched.finish (sched_dump, sched_verbose);
6587       /* Target might have added some instructions to the scheduled block
6588          in its md_finish () hook.  These new insns don't have any data
6589          initialized and to identify them we extend h_i_d so that they'll
6590          get zero luids.  */
6591       sched_extend_luids ();
6592     }
6593
6594   /* Update head/tail boundaries.  */
6595   head = NEXT_INSN (prev_head);
6596   tail = last_scheduled_insn;
6597
6598   if (sched_verbose)
6599     {
6600       fprintf (sched_dump, ";;   new head = %d\n;;   new tail = %d\n",
6601                INSN_UID (head), INSN_UID (tail));
6602
6603       if (sched_verbose >= 2)
6604         {
6605           dump_insn_stream (head, tail);
6606           print_rank_for_schedule_stats (";; TOTAL ", &rank_for_schedule_stats);
6607         }
6608
6609       fprintf (sched_dump, "\n");
6610     }
6611
6612   head = restore_other_notes (head, NULL);
6613
6614   current_sched_info->head = head;
6615   current_sched_info->tail = tail;
6616
6617   free_backtrack_queue ();
6618
6619   return success;
6620 }
6621 \f
6622 /* Set_priorities: compute priority of each insn in the block.  */
6623
6624 int
6625 set_priorities (rtx head, rtx tail)
6626 {
6627   rtx insn;
6628   int n_insn;
6629   int sched_max_insns_priority =
6630         current_sched_info->sched_max_insns_priority;
6631   rtx_insn *prev_head;
6632
6633   if (head == tail && ! INSN_P (head))
6634     gcc_unreachable ();
6635
6636   n_insn = 0;
6637
6638   prev_head = PREV_INSN (head);
6639   for (insn = tail; insn != prev_head; insn = PREV_INSN (insn))
6640     {
6641       if (!INSN_P (insn))
6642         continue;
6643
6644       n_insn++;
6645       (void) priority (insn);
6646
6647       gcc_assert (INSN_PRIORITY_KNOWN (insn));
6648
6649       sched_max_insns_priority = MAX (sched_max_insns_priority,
6650                                       INSN_PRIORITY (insn));
6651     }
6652
6653   current_sched_info->sched_max_insns_priority = sched_max_insns_priority;
6654
6655   return n_insn;
6656 }
6657
6658 /* Set dump and sched_verbose for the desired debugging output.  If no
6659    dump-file was specified, but -fsched-verbose=N (any N), print to stderr.
6660    For -fsched-verbose=N, N>=10, print everything to stderr.  */
6661 void
6662 setup_sched_dump (void)
6663 {
6664   sched_verbose = sched_verbose_param;
6665   if (sched_verbose_param == 0 && dump_file)
6666     sched_verbose = 1;
6667   sched_dump = ((sched_verbose_param >= 10 || !dump_file)
6668                 ? stderr : dump_file);
6669 }
6670
6671 /* Allocate data for register pressure sensitive scheduling.  */
6672 static void
6673 alloc_global_sched_pressure_data (void)
6674 {
6675   if (sched_pressure != SCHED_PRESSURE_NONE)
6676     {
6677       int i, max_regno = max_reg_num ();
6678
6679       if (sched_dump != NULL)
6680         /* We need info about pseudos for rtl dumps about pseudo
6681            classes and costs.  */
6682         regstat_init_n_sets_and_refs ();
6683       ira_set_pseudo_classes (true, sched_verbose ? sched_dump : NULL);
6684       sched_regno_pressure_class
6685         = (enum reg_class *) xmalloc (max_regno * sizeof (enum reg_class));
6686       for (i = 0; i < max_regno; i++)
6687         sched_regno_pressure_class[i]
6688           = (i < FIRST_PSEUDO_REGISTER
6689              ? ira_pressure_class_translate[REGNO_REG_CLASS (i)]
6690              : ira_pressure_class_translate[reg_allocno_class (i)]);
6691       curr_reg_live = BITMAP_ALLOC (NULL);
6692       if (sched_pressure == SCHED_PRESSURE_WEIGHTED)
6693         {
6694           saved_reg_live = BITMAP_ALLOC (NULL);
6695           region_ref_regs = BITMAP_ALLOC (NULL);
6696         }
6697     }
6698 }
6699
6700 /*  Free data for register pressure sensitive scheduling.  Also called
6701     from schedule_region when stopping sched-pressure early.  */
6702 void
6703 free_global_sched_pressure_data (void)
6704 {
6705   if (sched_pressure != SCHED_PRESSURE_NONE)
6706     {
6707       if (regstat_n_sets_and_refs != NULL)
6708         regstat_free_n_sets_and_refs ();
6709       if (sched_pressure == SCHED_PRESSURE_WEIGHTED)
6710         {
6711           BITMAP_FREE (region_ref_regs);
6712           BITMAP_FREE (saved_reg_live);
6713         }
6714       BITMAP_FREE (curr_reg_live);
6715       free (sched_regno_pressure_class);
6716     }
6717 }
6718
6719 /* Initialize some global state for the scheduler.  This function works
6720    with the common data shared between all the schedulers.  It is called
6721    from the scheduler specific initialization routine.  */
6722
6723 void
6724 sched_init (void)
6725 {
6726   /* Disable speculative loads in their presence if cc0 defined.  */
6727 #ifdef HAVE_cc0
6728   flag_schedule_speculative_load = 0;
6729 #endif
6730
6731   if (targetm.sched.dispatch (NULL_RTX, IS_DISPATCH_ON))
6732     targetm.sched.dispatch_do (NULL_RTX, DISPATCH_INIT);
6733
6734   if (live_range_shrinkage_p)
6735     sched_pressure = SCHED_PRESSURE_WEIGHTED;
6736   else if (flag_sched_pressure
6737            && !reload_completed
6738            && common_sched_info->sched_pass_id == SCHED_RGN_PASS)
6739     sched_pressure = ((enum sched_pressure_algorithm)
6740                       PARAM_VALUE (PARAM_SCHED_PRESSURE_ALGORITHM));
6741   else
6742     sched_pressure = SCHED_PRESSURE_NONE;
6743
6744   if (sched_pressure != SCHED_PRESSURE_NONE)
6745     ira_setup_eliminable_regset ();
6746
6747   /* Initialize SPEC_INFO.  */
6748   if (targetm.sched.set_sched_flags)
6749     {
6750       spec_info = &spec_info_var;
6751       targetm.sched.set_sched_flags (spec_info);
6752
6753       if (spec_info->mask != 0)
6754         {
6755           spec_info->data_weakness_cutoff =
6756             (PARAM_VALUE (PARAM_SCHED_SPEC_PROB_CUTOFF) * MAX_DEP_WEAK) / 100;
6757           spec_info->control_weakness_cutoff =
6758             (PARAM_VALUE (PARAM_SCHED_SPEC_PROB_CUTOFF)
6759              * REG_BR_PROB_BASE) / 100;
6760         }
6761       else
6762         /* So we won't read anything accidentally.  */
6763         spec_info = NULL;
6764
6765     }
6766   else
6767     /* So we won't read anything accidentally.  */
6768     spec_info = 0;
6769
6770   /* Initialize issue_rate.  */
6771   if (targetm.sched.issue_rate)
6772     issue_rate = targetm.sched.issue_rate ();
6773   else
6774     issue_rate = 1;
6775
6776   if (cached_issue_rate != issue_rate)
6777     {
6778       cached_issue_rate = issue_rate;
6779       /* To invalidate max_lookahead_tries:  */
6780       cached_first_cycle_multipass_dfa_lookahead = 0;
6781     }
6782
6783   if (targetm.sched.first_cycle_multipass_dfa_lookahead)
6784     dfa_lookahead = targetm.sched.first_cycle_multipass_dfa_lookahead ();
6785   else
6786     dfa_lookahead = 0;
6787
6788   if (targetm.sched.init_dfa_pre_cycle_insn)
6789     targetm.sched.init_dfa_pre_cycle_insn ();
6790
6791   if (targetm.sched.init_dfa_post_cycle_insn)
6792     targetm.sched.init_dfa_post_cycle_insn ();
6793
6794   dfa_start ();
6795   dfa_state_size = state_size ();
6796
6797   init_alias_analysis ();
6798
6799   if (!sched_no_dce)
6800     df_set_flags (DF_LR_RUN_DCE);
6801   df_note_add_problem ();
6802
6803   /* More problems needed for interloop dep calculation in SMS.  */
6804   if (common_sched_info->sched_pass_id == SCHED_SMS_PASS)
6805     {
6806       df_rd_add_problem ();
6807       df_chain_add_problem (DF_DU_CHAIN + DF_UD_CHAIN);
6808     }
6809
6810   df_analyze ();
6811
6812   /* Do not run DCE after reload, as this can kill nops inserted
6813      by bundling.  */
6814   if (reload_completed)
6815     df_clear_flags (DF_LR_RUN_DCE);
6816
6817   regstat_compute_calls_crossed ();
6818
6819   if (targetm.sched.init_global)
6820     targetm.sched.init_global (sched_dump, sched_verbose, get_max_uid () + 1);
6821
6822   alloc_global_sched_pressure_data ();
6823
6824   curr_state = xmalloc (dfa_state_size);
6825 }
6826
6827 static void haifa_init_only_bb (basic_block, basic_block);
6828
6829 /* Initialize data structures specific to the Haifa scheduler.  */
6830 void
6831 haifa_sched_init (void)
6832 {
6833   setup_sched_dump ();
6834   sched_init ();
6835
6836   scheduled_insns.create (0);
6837
6838   if (spec_info != NULL)
6839     {
6840       sched_deps_info->use_deps_list = 1;
6841       sched_deps_info->generate_spec_deps = 1;
6842     }
6843
6844   /* Initialize luids, dependency caches, target and h_i_d for the
6845      whole function.  */
6846   {
6847     bb_vec_t bbs;
6848     bbs.create (n_basic_blocks_for_fn (cfun));
6849     basic_block bb;
6850
6851     sched_init_bbs ();
6852
6853     FOR_EACH_BB_FN (bb, cfun)
6854       bbs.quick_push (bb);
6855     sched_init_luids (bbs);
6856     sched_deps_init (true);
6857     sched_extend_target ();
6858     haifa_init_h_i_d (bbs);
6859
6860     bbs.release ();
6861   }
6862
6863   sched_init_only_bb = haifa_init_only_bb;
6864   sched_split_block = sched_split_block_1;
6865   sched_create_empty_bb = sched_create_empty_bb_1;
6866   haifa_recovery_bb_ever_added_p = false;
6867
6868   nr_begin_data = nr_begin_control = nr_be_in_data = nr_be_in_control = 0;
6869   before_recovery = 0;
6870   after_recovery = 0;
6871
6872   modulo_ii = 0;
6873 }
6874
6875 /* Finish work with the data specific to the Haifa scheduler.  */
6876 void
6877 haifa_sched_finish (void)
6878 {
6879   sched_create_empty_bb = NULL;
6880   sched_split_block = NULL;
6881   sched_init_only_bb = NULL;
6882
6883   if (spec_info && spec_info->dump)
6884     {
6885       char c = reload_completed ? 'a' : 'b';
6886
6887       fprintf (spec_info->dump,
6888                ";; %s:\n", current_function_name ());
6889
6890       fprintf (spec_info->dump,
6891                ";; Procedure %cr-begin-data-spec motions == %d\n",
6892                c, nr_begin_data);
6893       fprintf (spec_info->dump,
6894                ";; Procedure %cr-be-in-data-spec motions == %d\n",
6895                c, nr_be_in_data);
6896       fprintf (spec_info->dump,
6897                ";; Procedure %cr-begin-control-spec motions == %d\n",
6898                c, nr_begin_control);
6899       fprintf (spec_info->dump,
6900                ";; Procedure %cr-be-in-control-spec motions == %d\n",
6901                c, nr_be_in_control);
6902     }
6903
6904   scheduled_insns.release ();
6905
6906   /* Finalize h_i_d, dependency caches, and luids for the whole
6907      function.  Target will be finalized in md_global_finish ().  */
6908   sched_deps_finish ();
6909   sched_finish_luids ();
6910   current_sched_info = NULL;
6911   sched_finish ();
6912 }
6913
6914 /* Free global data used during insn scheduling.  This function works with
6915    the common data shared between the schedulers.  */
6916
6917 void
6918 sched_finish (void)
6919 {
6920   haifa_finish_h_i_d ();
6921   free_global_sched_pressure_data ();
6922   free (curr_state);
6923
6924   if (targetm.sched.finish_global)
6925     targetm.sched.finish_global (sched_dump, sched_verbose);
6926
6927   end_alias_analysis ();
6928
6929   regstat_free_calls_crossed ();
6930
6931   dfa_finish ();
6932 }
6933
6934 /* Free all delay_pair structures that were recorded.  */
6935 void
6936 free_delay_pairs (void)
6937 {
6938   if (delay_htab)
6939     {
6940       delay_htab->empty ();
6941       delay_htab_i2->empty ();
6942     }
6943 }
6944
6945 /* Fix INSN_TICKs of the instructions in the current block as well as
6946    INSN_TICKs of their dependents.
6947    HEAD and TAIL are the begin and the end of the current scheduled block.  */
6948 static void
6949 fix_inter_tick (rtx head, rtx tail)
6950 {
6951   /* Set of instructions with corrected INSN_TICK.  */
6952   bitmap_head processed;
6953   /* ??? It is doubtful if we should assume that cycle advance happens on
6954      basic block boundaries.  Basically insns that are unconditionally ready
6955      on the start of the block are more preferable then those which have
6956      a one cycle dependency over insn from the previous block.  */
6957   int next_clock = clock_var + 1;
6958
6959   bitmap_initialize (&processed, 0);
6960
6961   /* Iterates over scheduled instructions and fix their INSN_TICKs and
6962      INSN_TICKs of dependent instructions, so that INSN_TICKs are consistent
6963      across different blocks.  */
6964   for (tail = NEXT_INSN (tail); head != tail; head = NEXT_INSN (head))
6965     {
6966       if (INSN_P (head))
6967         {
6968           int tick;
6969           sd_iterator_def sd_it;
6970           dep_t dep;
6971
6972           tick = INSN_TICK (head);
6973           gcc_assert (tick >= MIN_TICK);
6974
6975           /* Fix INSN_TICK of instruction from just scheduled block.  */
6976           if (bitmap_set_bit (&processed, INSN_LUID (head)))
6977             {
6978               tick -= next_clock;
6979
6980               if (tick < MIN_TICK)
6981                 tick = MIN_TICK;
6982
6983               INSN_TICK (head) = tick;
6984             }
6985
6986           if (DEBUG_INSN_P (head))
6987             continue;
6988
6989           FOR_EACH_DEP (head, SD_LIST_RES_FORW, sd_it, dep)
6990             {
6991               rtx_insn *next;
6992
6993               next = DEP_CON (dep);
6994               tick = INSN_TICK (next);
6995
6996               if (tick != INVALID_TICK
6997                   /* If NEXT has its INSN_TICK calculated, fix it.
6998                      If not - it will be properly calculated from
6999                      scratch later in fix_tick_ready.  */
7000                   && bitmap_set_bit (&processed, INSN_LUID (next)))
7001                 {
7002                   tick -= next_clock;
7003
7004                   if (tick < MIN_TICK)
7005                     tick = MIN_TICK;
7006
7007                   if (tick > INTER_TICK (next))
7008                     INTER_TICK (next) = tick;
7009                   else
7010                     tick = INTER_TICK (next);
7011
7012                   INSN_TICK (next) = tick;
7013                 }
7014             }
7015         }
7016     }
7017   bitmap_clear (&processed);
7018 }
7019
7020 /* Check if NEXT is ready to be added to the ready or queue list.
7021    If "yes", add it to the proper list.
7022    Returns:
7023       -1 - is not ready yet,
7024        0 - added to the ready list,
7025    0 < N - queued for N cycles.  */
7026 int
7027 try_ready (rtx_insn *next)
7028 {
7029   ds_t old_ts, new_ts;
7030
7031   old_ts = TODO_SPEC (next);
7032
7033   gcc_assert (!(old_ts & ~(SPECULATIVE | HARD_DEP | DEP_CONTROL | DEP_POSTPONED))
7034               && (old_ts == HARD_DEP
7035                   || old_ts == DEP_POSTPONED
7036                   || (old_ts & SPECULATIVE)
7037                   || old_ts == DEP_CONTROL));
7038
7039   new_ts = recompute_todo_spec (next, false);
7040
7041   if (new_ts & (HARD_DEP | DEP_POSTPONED))
7042     gcc_assert (new_ts == old_ts
7043                 && QUEUE_INDEX (next) == QUEUE_NOWHERE);
7044   else if (current_sched_info->new_ready)
7045     new_ts = current_sched_info->new_ready (next, new_ts);
7046
7047   /* * if !(old_ts & SPECULATIVE) (e.g. HARD_DEP or 0), then insn might
7048      have its original pattern or changed (speculative) one.  This is due
7049      to changing ebb in region scheduling.
7050      * But if (old_ts & SPECULATIVE), then we are pretty sure that insn
7051      has speculative pattern.
7052
7053      We can't assert (!(new_ts & HARD_DEP) || new_ts == old_ts) here because
7054      control-speculative NEXT could have been discarded by sched-rgn.c
7055      (the same case as when discarded by can_schedule_ready_p ()).  */
7056
7057   if ((new_ts & SPECULATIVE)
7058       /* If (old_ts == new_ts), then (old_ts & SPECULATIVE) and we don't
7059          need to change anything.  */
7060       && new_ts != old_ts)
7061     {
7062       int res;
7063       rtx new_pat;
7064
7065       gcc_assert ((new_ts & SPECULATIVE) && !(new_ts & ~SPECULATIVE));
7066
7067       res = haifa_speculate_insn (next, new_ts, &new_pat);
7068
7069       switch (res)
7070         {
7071         case -1:
7072           /* It would be nice to change DEP_STATUS of all dependences,
7073              which have ((DEP_STATUS & SPECULATIVE) == new_ts) to HARD_DEP,
7074              so we won't reanalyze anything.  */
7075           new_ts = HARD_DEP;
7076           break;
7077
7078         case 0:
7079           /* We follow the rule, that every speculative insn
7080              has non-null ORIG_PAT.  */
7081           if (!ORIG_PAT (next))
7082             ORIG_PAT (next) = PATTERN (next);
7083           break;
7084
7085         case 1:
7086           if (!ORIG_PAT (next))
7087             /* If we gonna to overwrite the original pattern of insn,
7088                save it.  */
7089             ORIG_PAT (next) = PATTERN (next);
7090
7091           res = haifa_change_pattern (next, new_pat);
7092           gcc_assert (res);
7093           break;
7094
7095         default:
7096           gcc_unreachable ();
7097         }
7098     }
7099
7100   /* We need to restore pattern only if (new_ts == 0), because otherwise it is
7101      either correct (new_ts & SPECULATIVE),
7102      or we simply don't care (new_ts & HARD_DEP).  */
7103
7104   gcc_assert (!ORIG_PAT (next)
7105               || !IS_SPECULATION_BRANCHY_CHECK_P (next));
7106
7107   TODO_SPEC (next) = new_ts;
7108
7109   if (new_ts & (HARD_DEP | DEP_POSTPONED))
7110     {
7111       /* We can't assert (QUEUE_INDEX (next) == QUEUE_NOWHERE) here because
7112          control-speculative NEXT could have been discarded by sched-rgn.c
7113          (the same case as when discarded by can_schedule_ready_p ()).  */
7114       /*gcc_assert (QUEUE_INDEX (next) == QUEUE_NOWHERE);*/
7115
7116       change_queue_index (next, QUEUE_NOWHERE);
7117
7118       return -1;
7119     }
7120   else if (!(new_ts & BEGIN_SPEC)
7121            && ORIG_PAT (next) && PREDICATED_PAT (next) == NULL_RTX
7122            && !IS_SPECULATION_CHECK_P (next))
7123     /* We should change pattern of every previously speculative
7124        instruction - and we determine if NEXT was speculative by using
7125        ORIG_PAT field.  Except one case - speculation checks have ORIG_PAT
7126        pat too, so skip them.  */
7127     {
7128       bool success = haifa_change_pattern (next, ORIG_PAT (next));
7129       gcc_assert (success);
7130       ORIG_PAT (next) = 0;
7131     }
7132
7133   if (sched_verbose >= 2)
7134     {
7135       fprintf (sched_dump, ";;\t\tdependencies resolved: insn %s",
7136                (*current_sched_info->print_insn) (next, 0));
7137
7138       if (spec_info && spec_info->dump)
7139         {
7140           if (new_ts & BEGIN_DATA)
7141             fprintf (spec_info->dump, "; data-spec;");
7142           if (new_ts & BEGIN_CONTROL)
7143             fprintf (spec_info->dump, "; control-spec;");
7144           if (new_ts & BE_IN_CONTROL)
7145             fprintf (spec_info->dump, "; in-control-spec;");
7146         }
7147       if (TODO_SPEC (next) & DEP_CONTROL)
7148         fprintf (sched_dump, " predicated");
7149       fprintf (sched_dump, "\n");
7150     }
7151
7152   adjust_priority (next);
7153
7154   return fix_tick_ready (next);
7155 }
7156
7157 /* Calculate INSN_TICK of NEXT and add it to either ready or queue list.  */
7158 static int
7159 fix_tick_ready (rtx_insn *next)
7160 {
7161   int tick, delay;
7162
7163   if (!DEBUG_INSN_P (next) && !sd_lists_empty_p (next, SD_LIST_RES_BACK))
7164     {
7165       int full_p;
7166       sd_iterator_def sd_it;
7167       dep_t dep;
7168
7169       tick = INSN_TICK (next);
7170       /* if tick is not equal to INVALID_TICK, then update
7171          INSN_TICK of NEXT with the most recent resolved dependence
7172          cost.  Otherwise, recalculate from scratch.  */
7173       full_p = (tick == INVALID_TICK);
7174
7175       FOR_EACH_DEP (next, SD_LIST_RES_BACK, sd_it, dep)
7176         {
7177           rtx_insn *pro = DEP_PRO (dep);
7178           int tick1;
7179
7180           gcc_assert (INSN_TICK (pro) >= MIN_TICK);
7181
7182           tick1 = INSN_TICK (pro) + dep_cost (dep);
7183           if (tick1 > tick)
7184             tick = tick1;
7185
7186           if (!full_p)
7187             break;
7188         }
7189     }
7190   else
7191     tick = -1;
7192
7193   INSN_TICK (next) = tick;
7194
7195   delay = tick - clock_var;
7196   if (delay <= 0 || sched_pressure != SCHED_PRESSURE_NONE)
7197     delay = QUEUE_READY;
7198
7199   change_queue_index (next, delay);
7200
7201   return delay;
7202 }
7203
7204 /* Move NEXT to the proper queue list with (DELAY >= 1),
7205    or add it to the ready list (DELAY == QUEUE_READY),
7206    or remove it from ready and queue lists at all (DELAY == QUEUE_NOWHERE).  */
7207 static void
7208 change_queue_index (rtx_insn *next, int delay)
7209 {
7210   int i = QUEUE_INDEX (next);
7211
7212   gcc_assert (QUEUE_NOWHERE <= delay && delay <= max_insn_queue_index
7213               && delay != 0);
7214   gcc_assert (i != QUEUE_SCHEDULED);
7215
7216   if ((delay > 0 && NEXT_Q_AFTER (q_ptr, delay) == i)
7217       || (delay < 0 && delay == i))
7218     /* We have nothing to do.  */
7219     return;
7220
7221   /* Remove NEXT from wherever it is now.  */
7222   if (i == QUEUE_READY)
7223     ready_remove_insn (next);
7224   else if (i >= 0)
7225     queue_remove (next);
7226
7227   /* Add it to the proper place.  */
7228   if (delay == QUEUE_READY)
7229     ready_add (readyp, next, false);
7230   else if (delay >= 1)
7231     queue_insn (next, delay, "change queue index");
7232
7233   if (sched_verbose >= 2)
7234     {
7235       fprintf (sched_dump, ";;\t\ttick updated: insn %s",
7236                (*current_sched_info->print_insn) (next, 0));
7237
7238       if (delay == QUEUE_READY)
7239         fprintf (sched_dump, " into ready\n");
7240       else if (delay >= 1)
7241         fprintf (sched_dump, " into queue with cost=%d\n", delay);
7242       else
7243         fprintf (sched_dump, " removed from ready or queue lists\n");
7244     }
7245 }
7246
7247 static int sched_ready_n_insns = -1;
7248
7249 /* Initialize per region data structures.  */
7250 void
7251 sched_extend_ready_list (int new_sched_ready_n_insns)
7252 {
7253   int i;
7254
7255   if (sched_ready_n_insns == -1)
7256     /* At the first call we need to initialize one more choice_stack
7257        entry.  */
7258     {
7259       i = 0;
7260       sched_ready_n_insns = 0;
7261       scheduled_insns.reserve (new_sched_ready_n_insns);
7262     }
7263   else
7264     i = sched_ready_n_insns + 1;
7265
7266   ready.veclen = new_sched_ready_n_insns + issue_rate;
7267   ready.vec = XRESIZEVEC (rtx_insn *, ready.vec, ready.veclen);
7268
7269   gcc_assert (new_sched_ready_n_insns >= sched_ready_n_insns);
7270
7271   ready_try = (signed char *) xrecalloc (ready_try, new_sched_ready_n_insns,
7272                                          sched_ready_n_insns,
7273                                          sizeof (*ready_try));
7274
7275   /* We allocate +1 element to save initial state in the choice_stack[0]
7276      entry.  */
7277   choice_stack = XRESIZEVEC (struct choice_entry, choice_stack,
7278                              new_sched_ready_n_insns + 1);
7279
7280   for (; i <= new_sched_ready_n_insns; i++)
7281     {
7282       choice_stack[i].state = xmalloc (dfa_state_size);
7283
7284       if (targetm.sched.first_cycle_multipass_init)
7285         targetm.sched.first_cycle_multipass_init (&(choice_stack[i]
7286                                                     .target_data));
7287     }
7288
7289   sched_ready_n_insns = new_sched_ready_n_insns;
7290 }
7291
7292 /* Free per region data structures.  */
7293 void
7294 sched_finish_ready_list (void)
7295 {
7296   int i;
7297
7298   free (ready.vec);
7299   ready.vec = NULL;
7300   ready.veclen = 0;
7301
7302   free (ready_try);
7303   ready_try = NULL;
7304
7305   for (i = 0; i <= sched_ready_n_insns; i++)
7306     {
7307       if (targetm.sched.first_cycle_multipass_fini)
7308         targetm.sched.first_cycle_multipass_fini (&(choice_stack[i]
7309                                                     .target_data));
7310
7311       free (choice_stack [i].state);
7312     }
7313   free (choice_stack);
7314   choice_stack = NULL;
7315
7316   sched_ready_n_insns = -1;
7317 }
7318
7319 static int
7320 haifa_luid_for_non_insn (rtx x)
7321 {
7322   gcc_assert (NOTE_P (x) || LABEL_P (x));
7323
7324   return 0;
7325 }
7326
7327 /* Generates recovery code for INSN.  */
7328 static void
7329 generate_recovery_code (rtx_insn *insn)
7330 {
7331   if (TODO_SPEC (insn) & BEGIN_SPEC)
7332     begin_speculative_block (insn);
7333
7334   /* Here we have insn with no dependencies to
7335      instructions other then CHECK_SPEC ones.  */
7336
7337   if (TODO_SPEC (insn) & BE_IN_SPEC)
7338     add_to_speculative_block (insn);
7339 }
7340
7341 /* Helper function.
7342    Tries to add speculative dependencies of type FS between instructions
7343    in deps_list L and TWIN.  */
7344 static void
7345 process_insn_forw_deps_be_in_spec (rtx insn, rtx twin, ds_t fs)
7346 {
7347   sd_iterator_def sd_it;
7348   dep_t dep;
7349
7350   FOR_EACH_DEP (insn, SD_LIST_FORW, sd_it, dep)
7351     {
7352       ds_t ds;
7353       rtx consumer;
7354
7355       consumer = DEP_CON (dep);
7356
7357       ds = DEP_STATUS (dep);
7358
7359       if (/* If we want to create speculative dep.  */
7360           fs
7361           /* And we can do that because this is a true dep.  */
7362           && (ds & DEP_TYPES) == DEP_TRUE)
7363         {
7364           gcc_assert (!(ds & BE_IN_SPEC));
7365
7366           if (/* If this dep can be overcome with 'begin speculation'.  */
7367               ds & BEGIN_SPEC)
7368             /* Then we have a choice: keep the dep 'begin speculative'
7369                or transform it into 'be in speculative'.  */
7370             {
7371               if (/* In try_ready we assert that if insn once became ready
7372                      it can be removed from the ready (or queue) list only
7373                      due to backend decision.  Hence we can't let the
7374                      probability of the speculative dep to decrease.  */
7375                   ds_weak (ds) <= ds_weak (fs))
7376                 {
7377                   ds_t new_ds;
7378
7379                   new_ds = (ds & ~BEGIN_SPEC) | fs;
7380
7381                   if (/* consumer can 'be in speculative'.  */
7382                       sched_insn_is_legitimate_for_speculation_p (consumer,
7383                                                                   new_ds))
7384                     /* Transform it to be in speculative.  */
7385                     ds = new_ds;
7386                 }
7387             }
7388           else
7389             /* Mark the dep as 'be in speculative'.  */
7390             ds |= fs;
7391         }
7392
7393       {
7394         dep_def _new_dep, *new_dep = &_new_dep;
7395
7396         init_dep_1 (new_dep, twin, consumer, DEP_TYPE (dep), ds);
7397         sd_add_dep (new_dep, false);
7398       }
7399     }
7400 }
7401
7402 /* Generates recovery code for BEGIN speculative INSN.  */
7403 static void
7404 begin_speculative_block (rtx_insn *insn)
7405 {
7406   if (TODO_SPEC (insn) & BEGIN_DATA)
7407     nr_begin_data++;
7408   if (TODO_SPEC (insn) & BEGIN_CONTROL)
7409     nr_begin_control++;
7410
7411   create_check_block_twin (insn, false);
7412
7413   TODO_SPEC (insn) &= ~BEGIN_SPEC;
7414 }
7415
7416 static void haifa_init_insn (rtx);
7417
7418 /* Generates recovery code for BE_IN speculative INSN.  */
7419 static void
7420 add_to_speculative_block (rtx insn)
7421 {
7422   ds_t ts;
7423   sd_iterator_def sd_it;
7424   dep_t dep;
7425   rtx twins = NULL;
7426   rtx_vec_t priorities_roots;
7427
7428   ts = TODO_SPEC (insn);
7429   gcc_assert (!(ts & ~BE_IN_SPEC));
7430
7431   if (ts & BE_IN_DATA)
7432     nr_be_in_data++;
7433   if (ts & BE_IN_CONTROL)
7434     nr_be_in_control++;
7435
7436   TODO_SPEC (insn) &= ~BE_IN_SPEC;
7437   gcc_assert (!TODO_SPEC (insn));
7438
7439   DONE_SPEC (insn) |= ts;
7440
7441   /* First we convert all simple checks to branchy.  */
7442   for (sd_it = sd_iterator_start (insn, SD_LIST_SPEC_BACK);
7443        sd_iterator_cond (&sd_it, &dep);)
7444     {
7445       rtx_insn *check = DEP_PRO (dep);
7446
7447       if (IS_SPECULATION_SIMPLE_CHECK_P (check))
7448         {
7449           create_check_block_twin (check, true);
7450
7451           /* Restart search.  */
7452           sd_it = sd_iterator_start (insn, SD_LIST_SPEC_BACK);
7453         }
7454       else
7455         /* Continue search.  */
7456         sd_iterator_next (&sd_it);
7457     }
7458
7459   priorities_roots.create (0);
7460   clear_priorities (insn, &priorities_roots);
7461
7462   while (1)
7463     {
7464       rtx_insn *check, *twin;
7465       basic_block rec;
7466
7467       /* Get the first backward dependency of INSN.  */
7468       sd_it = sd_iterator_start (insn, SD_LIST_SPEC_BACK);
7469       if (!sd_iterator_cond (&sd_it, &dep))
7470         /* INSN has no backward dependencies left.  */
7471         break;
7472
7473       gcc_assert ((DEP_STATUS (dep) & BEGIN_SPEC) == 0
7474                   && (DEP_STATUS (dep) & BE_IN_SPEC) != 0
7475                   && (DEP_STATUS (dep) & DEP_TYPES) == DEP_TRUE);
7476
7477       check = DEP_PRO (dep);
7478
7479       gcc_assert (!IS_SPECULATION_CHECK_P (check) && !ORIG_PAT (check)
7480                   && QUEUE_INDEX (check) == QUEUE_NOWHERE);
7481
7482       rec = BLOCK_FOR_INSN (check);
7483
7484       twin = emit_insn_before (copy_insn (PATTERN (insn)), BB_END (rec));
7485       haifa_init_insn (twin);
7486
7487       sd_copy_back_deps (twin, insn, true);
7488
7489       if (sched_verbose && spec_info->dump)
7490         /* INSN_BB (insn) isn't determined for twin insns yet.
7491            So we can't use current_sched_info->print_insn.  */
7492         fprintf (spec_info->dump, ";;\t\tGenerated twin insn : %d/rec%d\n",
7493                  INSN_UID (twin), rec->index);
7494
7495       twins = alloc_INSN_LIST (twin, twins);
7496
7497       /* Add dependences between TWIN and all appropriate
7498          instructions from REC.  */
7499       FOR_EACH_DEP (insn, SD_LIST_SPEC_BACK, sd_it, dep)
7500         {
7501           rtx_insn *pro = DEP_PRO (dep);
7502
7503           gcc_assert (DEP_TYPE (dep) == REG_DEP_TRUE);
7504
7505           /* INSN might have dependencies from the instructions from
7506              several recovery blocks.  At this iteration we process those
7507              producers that reside in REC.  */
7508           if (BLOCK_FOR_INSN (pro) == rec)
7509             {
7510               dep_def _new_dep, *new_dep = &_new_dep;
7511
7512               init_dep (new_dep, pro, twin, REG_DEP_TRUE);
7513               sd_add_dep (new_dep, false);
7514             }
7515         }
7516
7517       process_insn_forw_deps_be_in_spec (insn, twin, ts);
7518
7519       /* Remove all dependencies between INSN and insns in REC.  */
7520       for (sd_it = sd_iterator_start (insn, SD_LIST_SPEC_BACK);
7521            sd_iterator_cond (&sd_it, &dep);)
7522         {
7523           rtx_insn *pro = DEP_PRO (dep);
7524
7525           if (BLOCK_FOR_INSN (pro) == rec)
7526             sd_delete_dep (sd_it);
7527           else
7528             sd_iterator_next (&sd_it);
7529         }
7530     }
7531
7532   /* We couldn't have added the dependencies between INSN and TWINS earlier
7533      because that would make TWINS appear in the INSN_BACK_DEPS (INSN).  */
7534   while (twins)
7535     {
7536       rtx twin;
7537
7538       twin = XEXP (twins, 0);
7539
7540       {
7541         dep_def _new_dep, *new_dep = &_new_dep;
7542
7543         init_dep (new_dep, insn, twin, REG_DEP_OUTPUT);
7544         sd_add_dep (new_dep, false);
7545       }
7546
7547       twin = XEXP (twins, 1);
7548       free_INSN_LIST_node (twins);
7549       twins = twin;
7550     }
7551
7552   calc_priorities (priorities_roots);
7553   priorities_roots.release ();
7554 }
7555
7556 /* Extends and fills with zeros (only the new part) array pointed to by P.  */
7557 void *
7558 xrecalloc (void *p, size_t new_nmemb, size_t old_nmemb, size_t size)
7559 {
7560   gcc_assert (new_nmemb >= old_nmemb);
7561   p = XRESIZEVAR (void, p, new_nmemb * size);
7562   memset (((char *) p) + old_nmemb * size, 0, (new_nmemb - old_nmemb) * size);
7563   return p;
7564 }
7565
7566 /* Helper function.
7567    Find fallthru edge from PRED.  */
7568 edge
7569 find_fallthru_edge_from (basic_block pred)
7570 {
7571   edge e;
7572   basic_block succ;
7573
7574   succ = pred->next_bb;
7575   gcc_assert (succ->prev_bb == pred);
7576
7577   if (EDGE_COUNT (pred->succs) <= EDGE_COUNT (succ->preds))
7578     {
7579       e = find_fallthru_edge (pred->succs);
7580
7581       if (e)
7582         {
7583           gcc_assert (e->dest == succ);
7584           return e;
7585         }
7586     }
7587   else
7588     {
7589       e = find_fallthru_edge (succ->preds);
7590
7591       if (e)
7592         {
7593           gcc_assert (e->src == pred);
7594           return e;
7595         }
7596     }
7597
7598   return NULL;
7599 }
7600
7601 /* Extend per basic block data structures.  */
7602 static void
7603 sched_extend_bb (void)
7604 {
7605   /* The following is done to keep current_sched_info->next_tail non null.  */
7606   rtx_insn *end = BB_END (EXIT_BLOCK_PTR_FOR_FN (cfun)->prev_bb);
7607   rtx_insn *insn = DEBUG_INSN_P (end) ? prev_nondebug_insn (end) : end;
7608   if (NEXT_INSN (end) == 0
7609       || (!NOTE_P (insn)
7610           && !LABEL_P (insn)
7611           /* Don't emit a NOTE if it would end up before a BARRIER.  */
7612           && !BARRIER_P (NEXT_INSN (end))))
7613     {
7614       rtx_note *note = emit_note_after (NOTE_INSN_DELETED, end);
7615       /* Make note appear outside BB.  */
7616       set_block_for_insn (note, NULL);
7617       SET_BB_END (EXIT_BLOCK_PTR_FOR_FN (cfun)->prev_bb) = end;
7618     }
7619 }
7620
7621 /* Init per basic block data structures.  */
7622 void
7623 sched_init_bbs (void)
7624 {
7625   sched_extend_bb ();
7626 }
7627
7628 /* Initialize BEFORE_RECOVERY variable.  */
7629 static void
7630 init_before_recovery (basic_block *before_recovery_ptr)
7631 {
7632   basic_block last;
7633   edge e;
7634
7635   last = EXIT_BLOCK_PTR_FOR_FN (cfun)->prev_bb;
7636   e = find_fallthru_edge_from (last);
7637
7638   if (e)
7639     {
7640       /* We create two basic blocks:
7641          1. Single instruction block is inserted right after E->SRC
7642          and has jump to
7643          2. Empty block right before EXIT_BLOCK.
7644          Between these two blocks recovery blocks will be emitted.  */
7645
7646       basic_block single, empty;
7647       rtx_insn *x;
7648       rtx label;
7649
7650       /* If the fallthrough edge to exit we've found is from the block we've
7651          created before, don't do anything more.  */
7652       if (last == after_recovery)
7653         return;
7654
7655       adding_bb_to_current_region_p = false;
7656
7657       single = sched_create_empty_bb (last);
7658       empty = sched_create_empty_bb (single);
7659
7660       /* Add new blocks to the root loop.  */
7661       if (current_loops != NULL)
7662         {
7663           add_bb_to_loop (single, (*current_loops->larray)[0]);
7664           add_bb_to_loop (empty, (*current_loops->larray)[0]);
7665         }
7666
7667       single->count = last->count;
7668       empty->count = last->count;
7669       single->frequency = last->frequency;
7670       empty->frequency = last->frequency;
7671       BB_COPY_PARTITION (single, last);
7672       BB_COPY_PARTITION (empty, last);
7673
7674       redirect_edge_succ (e, single);
7675       make_single_succ_edge (single, empty, 0);
7676       make_single_succ_edge (empty, EXIT_BLOCK_PTR_FOR_FN (cfun),
7677                              EDGE_FALLTHRU);
7678
7679       label = block_label (empty);
7680       x = emit_jump_insn_after (gen_jump (label), BB_END (single));
7681       JUMP_LABEL (x) = label;
7682       LABEL_NUSES (label)++;
7683       haifa_init_insn (x);
7684
7685       emit_barrier_after (x);
7686
7687       sched_init_only_bb (empty, NULL);
7688       sched_init_only_bb (single, NULL);
7689       sched_extend_bb ();
7690
7691       adding_bb_to_current_region_p = true;
7692       before_recovery = single;
7693       after_recovery = empty;
7694
7695       if (before_recovery_ptr)
7696         *before_recovery_ptr = before_recovery;
7697
7698       if (sched_verbose >= 2 && spec_info->dump)
7699         fprintf (spec_info->dump,
7700                  ";;\t\tFixed fallthru to EXIT : %d->>%d->%d->>EXIT\n",
7701                  last->index, single->index, empty->index);
7702     }
7703   else
7704     before_recovery = last;
7705 }
7706
7707 /* Returns new recovery block.  */
7708 basic_block
7709 sched_create_recovery_block (basic_block *before_recovery_ptr)
7710 {
7711   rtx label;
7712   rtx_insn *barrier;
7713   basic_block rec;
7714
7715   haifa_recovery_bb_recently_added_p = true;
7716   haifa_recovery_bb_ever_added_p = true;
7717
7718   init_before_recovery (before_recovery_ptr);
7719
7720   barrier = get_last_bb_insn (before_recovery);
7721   gcc_assert (BARRIER_P (barrier));
7722
7723   label = emit_label_after (gen_label_rtx (), barrier);
7724
7725   rec = create_basic_block (label, label, before_recovery);
7726
7727   /* A recovery block always ends with an unconditional jump.  */
7728   emit_barrier_after (BB_END (rec));
7729
7730   if (BB_PARTITION (before_recovery) != BB_UNPARTITIONED)
7731     BB_SET_PARTITION (rec, BB_COLD_PARTITION);
7732
7733   if (sched_verbose && spec_info->dump)
7734     fprintf (spec_info->dump, ";;\t\tGenerated recovery block rec%d\n",
7735              rec->index);
7736
7737   return rec;
7738 }
7739
7740 /* Create edges: FIRST_BB -> REC; FIRST_BB -> SECOND_BB; REC -> SECOND_BB
7741    and emit necessary jumps.  */
7742 void
7743 sched_create_recovery_edges (basic_block first_bb, basic_block rec,
7744                              basic_block second_bb)
7745 {
7746   rtx label;
7747   rtx jump;
7748   int edge_flags;
7749
7750   /* This is fixing of incoming edge.  */
7751   /* ??? Which other flags should be specified?  */
7752   if (BB_PARTITION (first_bb) != BB_PARTITION (rec))
7753     /* Partition type is the same, if it is "unpartitioned".  */
7754     edge_flags = EDGE_CROSSING;
7755   else
7756     edge_flags = 0;
7757
7758   make_edge (first_bb, rec, edge_flags);
7759   label = block_label (second_bb);
7760   jump = emit_jump_insn_after (gen_jump (label), BB_END (rec));
7761   JUMP_LABEL (jump) = label;
7762   LABEL_NUSES (label)++;
7763
7764   if (BB_PARTITION (second_bb) != BB_PARTITION (rec))
7765     /* Partition type is the same, if it is "unpartitioned".  */
7766     {
7767       /* Rewritten from cfgrtl.c.  */
7768       if (flag_reorder_blocks_and_partition
7769           && targetm_common.have_named_sections)
7770         {
7771           /* We don't need the same note for the check because
7772              any_condjump_p (check) == true.  */
7773           CROSSING_JUMP_P (jump) = 1;
7774         }
7775       edge_flags = EDGE_CROSSING;
7776     }
7777   else
7778     edge_flags = 0;
7779
7780   make_single_succ_edge (rec, second_bb, edge_flags);
7781   if (dom_info_available_p (CDI_DOMINATORS))
7782     set_immediate_dominator (CDI_DOMINATORS, rec, first_bb);
7783 }
7784
7785 /* This function creates recovery code for INSN.  If MUTATE_P is nonzero,
7786    INSN is a simple check, that should be converted to branchy one.  */
7787 static void
7788 create_check_block_twin (rtx_insn *insn, bool mutate_p)
7789 {
7790   basic_block rec;
7791   rtx_insn *label, *check, *twin;
7792   rtx check_pat;
7793   ds_t fs;
7794   sd_iterator_def sd_it;
7795   dep_t dep;
7796   dep_def _new_dep, *new_dep = &_new_dep;
7797   ds_t todo_spec;
7798
7799   gcc_assert (ORIG_PAT (insn) != NULL_RTX);
7800
7801   if (!mutate_p)
7802     todo_spec = TODO_SPEC (insn);
7803   else
7804     {
7805       gcc_assert (IS_SPECULATION_SIMPLE_CHECK_P (insn)
7806                   && (TODO_SPEC (insn) & SPECULATIVE) == 0);
7807
7808       todo_spec = CHECK_SPEC (insn);
7809     }
7810
7811   todo_spec &= SPECULATIVE;
7812
7813   /* Create recovery block.  */
7814   if (mutate_p || targetm.sched.needs_block_p (todo_spec))
7815     {
7816       rec = sched_create_recovery_block (NULL);
7817       label = BB_HEAD (rec);
7818     }
7819   else
7820     {
7821       rec = EXIT_BLOCK_PTR_FOR_FN (cfun);
7822       label = NULL;
7823     }
7824
7825   /* Emit CHECK.  */
7826   check_pat = targetm.sched.gen_spec_check (insn, label, todo_spec);
7827
7828   if (rec != EXIT_BLOCK_PTR_FOR_FN (cfun))
7829     {
7830       /* To have mem_reg alive at the beginning of second_bb,
7831          we emit check BEFORE insn, so insn after splitting
7832          insn will be at the beginning of second_bb, which will
7833          provide us with the correct life information.  */
7834       check = emit_jump_insn_before (check_pat, insn);
7835       JUMP_LABEL (check) = label;
7836       LABEL_NUSES (label)++;
7837     }
7838   else
7839     check = emit_insn_before (check_pat, insn);
7840
7841   /* Extend data structures.  */
7842   haifa_init_insn (check);
7843
7844   /* CHECK is being added to current region.  Extend ready list.  */
7845   gcc_assert (sched_ready_n_insns != -1);
7846   sched_extend_ready_list (sched_ready_n_insns + 1);
7847
7848   if (current_sched_info->add_remove_insn)
7849     current_sched_info->add_remove_insn (insn, 0);
7850
7851   RECOVERY_BLOCK (check) = rec;
7852
7853   if (sched_verbose && spec_info->dump)
7854     fprintf (spec_info->dump, ";;\t\tGenerated check insn : %s\n",
7855              (*current_sched_info->print_insn) (check, 0));
7856
7857   gcc_assert (ORIG_PAT (insn));
7858
7859   /* Initialize TWIN (twin is a duplicate of original instruction
7860      in the recovery block).  */
7861   if (rec != EXIT_BLOCK_PTR_FOR_FN (cfun))
7862     {
7863       sd_iterator_def sd_it;
7864       dep_t dep;
7865
7866       FOR_EACH_DEP (insn, SD_LIST_RES_BACK, sd_it, dep)
7867         if ((DEP_STATUS (dep) & DEP_OUTPUT) != 0)
7868           {
7869             struct _dep _dep2, *dep2 = &_dep2;
7870
7871             init_dep (dep2, DEP_PRO (dep), check, REG_DEP_TRUE);
7872
7873             sd_add_dep (dep2, true);
7874           }
7875
7876       twin = emit_insn_after (ORIG_PAT (insn), BB_END (rec));
7877       haifa_init_insn (twin);
7878
7879       if (sched_verbose && spec_info->dump)
7880         /* INSN_BB (insn) isn't determined for twin insns yet.
7881            So we can't use current_sched_info->print_insn.  */
7882         fprintf (spec_info->dump, ";;\t\tGenerated twin insn : %d/rec%d\n",
7883                  INSN_UID (twin), rec->index);
7884     }
7885   else
7886     {
7887       ORIG_PAT (check) = ORIG_PAT (insn);
7888       HAS_INTERNAL_DEP (check) = 1;
7889       twin = check;
7890       /* ??? We probably should change all OUTPUT dependencies to
7891          (TRUE | OUTPUT).  */
7892     }
7893
7894   /* Copy all resolved back dependencies of INSN to TWIN.  This will
7895      provide correct value for INSN_TICK (TWIN).  */
7896   sd_copy_back_deps (twin, insn, true);
7897
7898   if (rec != EXIT_BLOCK_PTR_FOR_FN (cfun))
7899     /* In case of branchy check, fix CFG.  */
7900     {
7901       basic_block first_bb, second_bb;
7902       rtx jump;
7903
7904       first_bb = BLOCK_FOR_INSN (check);
7905       second_bb = sched_split_block (first_bb, check);
7906
7907       sched_create_recovery_edges (first_bb, rec, second_bb);
7908
7909       sched_init_only_bb (second_bb, first_bb);
7910       sched_init_only_bb (rec, EXIT_BLOCK_PTR_FOR_FN (cfun));
7911
7912       jump = BB_END (rec);
7913       haifa_init_insn (jump);
7914     }
7915
7916   /* Move backward dependences from INSN to CHECK and
7917      move forward dependences from INSN to TWIN.  */
7918
7919   /* First, create dependencies between INSN's producers and CHECK & TWIN.  */
7920   FOR_EACH_DEP (insn, SD_LIST_BACK, sd_it, dep)
7921     {
7922       rtx_insn *pro = DEP_PRO (dep);
7923       ds_t ds;
7924
7925       /* If BEGIN_DATA: [insn ~~TRUE~~> producer]:
7926          check --TRUE--> producer  ??? or ANTI ???
7927          twin  --TRUE--> producer
7928          twin  --ANTI--> check
7929
7930          If BEGIN_CONTROL: [insn ~~ANTI~~> producer]:
7931          check --ANTI--> producer
7932          twin  --ANTI--> producer
7933          twin  --ANTI--> check
7934
7935          If BE_IN_SPEC: [insn ~~TRUE~~> producer]:
7936          check ~~TRUE~~> producer
7937          twin  ~~TRUE~~> producer
7938          twin  --ANTI--> check  */
7939
7940       ds = DEP_STATUS (dep);
7941
7942       if (ds & BEGIN_SPEC)
7943         {
7944           gcc_assert (!mutate_p);
7945           ds &= ~BEGIN_SPEC;
7946         }
7947
7948       init_dep_1 (new_dep, pro, check, DEP_TYPE (dep), ds);
7949       sd_add_dep (new_dep, false);
7950
7951       if (rec != EXIT_BLOCK_PTR_FOR_FN (cfun))
7952         {
7953           SET_DEP_CON (new_dep) = twin;
7954           sd_add_dep (new_dep, false);
7955         }
7956     }
7957
7958   /* Second, remove backward dependencies of INSN.  */
7959   for (sd_it = sd_iterator_start (insn, SD_LIST_SPEC_BACK);
7960        sd_iterator_cond (&sd_it, &dep);)
7961     {
7962       if ((DEP_STATUS (dep) & BEGIN_SPEC)
7963           || mutate_p)
7964         /* We can delete this dep because we overcome it with
7965            BEGIN_SPECULATION.  */
7966         sd_delete_dep (sd_it);
7967       else
7968         sd_iterator_next (&sd_it);
7969     }
7970
7971   /* Future Speculations.  Determine what BE_IN speculations will be like.  */
7972   fs = 0;
7973
7974   /* Fields (DONE_SPEC (x) & BEGIN_SPEC) and CHECK_SPEC (x) are set only
7975      here.  */
7976
7977   gcc_assert (!DONE_SPEC (insn));
7978
7979   if (!mutate_p)
7980     {
7981       ds_t ts = TODO_SPEC (insn);
7982
7983       DONE_SPEC (insn) = ts & BEGIN_SPEC;
7984       CHECK_SPEC (check) = ts & BEGIN_SPEC;
7985
7986       /* Luckiness of future speculations solely depends upon initial
7987          BEGIN speculation.  */
7988       if (ts & BEGIN_DATA)
7989         fs = set_dep_weak (fs, BE_IN_DATA, get_dep_weak (ts, BEGIN_DATA));
7990       if (ts & BEGIN_CONTROL)
7991         fs = set_dep_weak (fs, BE_IN_CONTROL,
7992                            get_dep_weak (ts, BEGIN_CONTROL));
7993     }
7994   else
7995     CHECK_SPEC (check) = CHECK_SPEC (insn);
7996
7997   /* Future speculations: call the helper.  */
7998   process_insn_forw_deps_be_in_spec (insn, twin, fs);
7999
8000   if (rec != EXIT_BLOCK_PTR_FOR_FN (cfun))
8001     {
8002       /* Which types of dependencies should we use here is,
8003          generally, machine-dependent question...  But, for now,
8004          it is not.  */
8005
8006       if (!mutate_p)
8007         {
8008           init_dep (new_dep, insn, check, REG_DEP_TRUE);
8009           sd_add_dep (new_dep, false);
8010
8011           init_dep (new_dep, insn, twin, REG_DEP_OUTPUT);
8012           sd_add_dep (new_dep, false);
8013         }
8014       else
8015         {
8016           if (spec_info->dump)
8017             fprintf (spec_info->dump, ";;\t\tRemoved simple check : %s\n",
8018                      (*current_sched_info->print_insn) (insn, 0));
8019
8020           /* Remove all dependencies of the INSN.  */
8021           {
8022             sd_it = sd_iterator_start (insn, (SD_LIST_FORW
8023                                               | SD_LIST_BACK
8024                                               | SD_LIST_RES_BACK));
8025             while (sd_iterator_cond (&sd_it, &dep))
8026               sd_delete_dep (sd_it);
8027           }
8028
8029           /* If former check (INSN) already was moved to the ready (or queue)
8030              list, add new check (CHECK) there too.  */
8031           if (QUEUE_INDEX (insn) != QUEUE_NOWHERE)
8032             try_ready (check);
8033
8034           /* Remove old check from instruction stream and free its
8035              data.  */
8036           sched_remove_insn (insn);
8037         }
8038
8039       init_dep (new_dep, check, twin, REG_DEP_ANTI);
8040       sd_add_dep (new_dep, false);
8041     }
8042   else
8043     {
8044       init_dep_1 (new_dep, insn, check, REG_DEP_TRUE, DEP_TRUE | DEP_OUTPUT);
8045       sd_add_dep (new_dep, false);
8046     }
8047
8048   if (!mutate_p)
8049     /* Fix priorities.  If MUTATE_P is nonzero, this is not necessary,
8050        because it'll be done later in add_to_speculative_block.  */
8051     {
8052       rtx_vec_t priorities_roots = rtx_vec_t ();
8053
8054       clear_priorities (twin, &priorities_roots);
8055       calc_priorities (priorities_roots);
8056       priorities_roots.release ();
8057     }
8058 }
8059
8060 /* Removes dependency between instructions in the recovery block REC
8061    and usual region instructions.  It keeps inner dependences so it
8062    won't be necessary to recompute them.  */
8063 static void
8064 fix_recovery_deps (basic_block rec)
8065 {
8066   rtx_insn *note, *insn, *jump;
8067   rtx ready_list = 0;
8068   bitmap_head in_ready;
8069   rtx link;
8070
8071   bitmap_initialize (&in_ready, 0);
8072
8073   /* NOTE - a basic block note.  */
8074   note = NEXT_INSN (BB_HEAD (rec));
8075   gcc_assert (NOTE_INSN_BASIC_BLOCK_P (note));
8076   insn = BB_END (rec);
8077   gcc_assert (JUMP_P (insn));
8078   insn = PREV_INSN (insn);
8079
8080   do
8081     {
8082       sd_iterator_def sd_it;
8083       dep_t dep;
8084
8085       for (sd_it = sd_iterator_start (insn, SD_LIST_FORW);
8086            sd_iterator_cond (&sd_it, &dep);)
8087         {
8088           rtx_insn *consumer = DEP_CON (dep);
8089
8090           if (BLOCK_FOR_INSN (consumer) != rec)
8091             {
8092               sd_delete_dep (sd_it);
8093
8094               if (bitmap_set_bit (&in_ready, INSN_LUID (consumer)))
8095                 ready_list = alloc_INSN_LIST (consumer, ready_list);
8096             }
8097           else
8098             {
8099               gcc_assert ((DEP_STATUS (dep) & DEP_TYPES) == DEP_TRUE);
8100
8101               sd_iterator_next (&sd_it);
8102             }
8103         }
8104
8105       insn = PREV_INSN (insn);
8106     }
8107   while (insn != note);
8108
8109   bitmap_clear (&in_ready);
8110
8111   /* Try to add instructions to the ready or queue list.  */
8112   for (link = ready_list; link; link = XEXP (link, 1))
8113     try_ready (as_a <rtx_insn *> (XEXP (link, 0)));
8114   free_INSN_LIST_list (&ready_list);
8115
8116   /* Fixing jump's dependences.  */
8117   insn = BB_HEAD (rec);
8118   jump = BB_END (rec);
8119
8120   gcc_assert (LABEL_P (insn));
8121   insn = NEXT_INSN (insn);
8122
8123   gcc_assert (NOTE_INSN_BASIC_BLOCK_P (insn));
8124   add_jump_dependencies (insn, jump);
8125 }
8126
8127 /* Change pattern of INSN to NEW_PAT.  Invalidate cached haifa
8128    instruction data.  */
8129 static bool
8130 haifa_change_pattern (rtx insn, rtx new_pat)
8131 {
8132   int t;
8133
8134   t = validate_change (insn, &PATTERN (insn), new_pat, 0);
8135   if (!t)
8136     return false;
8137
8138   update_insn_after_change (insn);
8139   return true;
8140 }
8141
8142 /* -1 - can't speculate,
8143    0 - for speculation with REQUEST mode it is OK to use
8144    current instruction pattern,
8145    1 - need to change pattern for *NEW_PAT to be speculative.  */
8146 int
8147 sched_speculate_insn (rtx insn, ds_t request, rtx *new_pat)
8148 {
8149   gcc_assert (current_sched_info->flags & DO_SPECULATION
8150               && (request & SPECULATIVE)
8151               && sched_insn_is_legitimate_for_speculation_p (insn, request));
8152
8153   if ((request & spec_info->mask) != request)
8154     return -1;
8155
8156   if (request & BE_IN_SPEC
8157       && !(request & BEGIN_SPEC))
8158     return 0;
8159
8160   return targetm.sched.speculate_insn (insn, request, new_pat);
8161 }
8162
8163 static int
8164 haifa_speculate_insn (rtx insn, ds_t request, rtx *new_pat)
8165 {
8166   gcc_assert (sched_deps_info->generate_spec_deps
8167               && !IS_SPECULATION_CHECK_P (insn));
8168
8169   if (HAS_INTERNAL_DEP (insn)
8170       || SCHED_GROUP_P (insn))
8171     return -1;
8172
8173   return sched_speculate_insn (insn, request, new_pat);
8174 }
8175
8176 /* Print some information about block BB, which starts with HEAD and
8177    ends with TAIL, before scheduling it.
8178    I is zero, if scheduler is about to start with the fresh ebb.  */
8179 static void
8180 dump_new_block_header (int i, basic_block bb, rtx head, rtx tail)
8181 {
8182   if (!i)
8183     fprintf (sched_dump,
8184              ";;   ======================================================\n");
8185   else
8186     fprintf (sched_dump,
8187              ";;   =====================ADVANCING TO=====================\n");
8188   fprintf (sched_dump,
8189            ";;   -- basic block %d from %d to %d -- %s reload\n",
8190            bb->index, INSN_UID (head), INSN_UID (tail),
8191            (reload_completed ? "after" : "before"));
8192   fprintf (sched_dump,
8193            ";;   ======================================================\n");
8194   fprintf (sched_dump, "\n");
8195 }
8196
8197 /* Unlink basic block notes and labels and saves them, so they
8198    can be easily restored.  We unlink basic block notes in EBB to
8199    provide back-compatibility with the previous code, as target backends
8200    assume, that there'll be only instructions between
8201    current_sched_info->{head and tail}.  We restore these notes as soon
8202    as we can.
8203    FIRST (LAST) is the first (last) basic block in the ebb.
8204    NB: In usual case (FIRST == LAST) nothing is really done.  */
8205 void
8206 unlink_bb_notes (basic_block first, basic_block last)
8207 {
8208   /* We DON'T unlink basic block notes of the first block in the ebb.  */
8209   if (first == last)
8210     return;
8211
8212   bb_header = XNEWVEC (rtx_insn *, last_basic_block_for_fn (cfun));
8213
8214   /* Make a sentinel.  */
8215   if (last->next_bb != EXIT_BLOCK_PTR_FOR_FN (cfun))
8216     bb_header[last->next_bb->index] = 0;
8217
8218   first = first->next_bb;
8219   do
8220     {
8221       rtx_insn *prev, *label, *note, *next;
8222
8223       label = BB_HEAD (last);
8224       if (LABEL_P (label))
8225         note = NEXT_INSN (label);
8226       else
8227         note = label;
8228       gcc_assert (NOTE_INSN_BASIC_BLOCK_P (note));
8229
8230       prev = PREV_INSN (label);
8231       next = NEXT_INSN (note);
8232       gcc_assert (prev && next);
8233
8234       SET_NEXT_INSN (prev) = next;
8235       SET_PREV_INSN (next) = prev;
8236
8237       bb_header[last->index] = label;
8238
8239       if (last == first)
8240         break;
8241
8242       last = last->prev_bb;
8243     }
8244   while (1);
8245 }
8246
8247 /* Restore basic block notes.
8248    FIRST is the first basic block in the ebb.  */
8249 static void
8250 restore_bb_notes (basic_block first)
8251 {
8252   if (!bb_header)
8253     return;
8254
8255   /* We DON'T unlink basic block notes of the first block in the ebb.  */
8256   first = first->next_bb;
8257   /* Remember: FIRST is actually a second basic block in the ebb.  */
8258
8259   while (first != EXIT_BLOCK_PTR_FOR_FN (cfun)
8260          && bb_header[first->index])
8261     {
8262       rtx_insn *prev, *label, *note, *next;
8263
8264       label = bb_header[first->index];
8265       prev = PREV_INSN (label);
8266       next = NEXT_INSN (prev);
8267
8268       if (LABEL_P (label))
8269         note = NEXT_INSN (label);
8270       else
8271         note = label;
8272       gcc_assert (NOTE_INSN_BASIC_BLOCK_P (note));
8273
8274       bb_header[first->index] = 0;
8275
8276       SET_NEXT_INSN (prev) = label;
8277       SET_NEXT_INSN (note) = next;
8278       SET_PREV_INSN (next) = note;
8279
8280       first = first->next_bb;
8281     }
8282
8283   free (bb_header);
8284   bb_header = 0;
8285 }
8286
8287 /* Helper function.
8288    Fix CFG after both in- and inter-block movement of
8289    control_flow_insn_p JUMP.  */
8290 static void
8291 fix_jump_move (rtx jump)
8292 {
8293   basic_block bb, jump_bb, jump_bb_next;
8294
8295   bb = BLOCK_FOR_INSN (PREV_INSN (jump));
8296   jump_bb = BLOCK_FOR_INSN (jump);
8297   jump_bb_next = jump_bb->next_bb;
8298
8299   gcc_assert (common_sched_info->sched_pass_id == SCHED_EBB_PASS
8300               || IS_SPECULATION_BRANCHY_CHECK_P (jump));
8301
8302   if (!NOTE_INSN_BASIC_BLOCK_P (BB_END (jump_bb_next)))
8303     /* if jump_bb_next is not empty.  */
8304     SET_BB_END (jump_bb) = BB_END (jump_bb_next);
8305
8306   if (BB_END (bb) != PREV_INSN (jump))
8307     /* Then there are instruction after jump that should be placed
8308        to jump_bb_next.  */
8309     SET_BB_END (jump_bb_next) = BB_END (bb);
8310   else
8311     /* Otherwise jump_bb_next is empty.  */
8312     SET_BB_END (jump_bb_next) = NEXT_INSN (BB_HEAD (jump_bb_next));
8313
8314   /* To make assertion in move_insn happy.  */
8315   SET_BB_END (bb) = PREV_INSN (jump);
8316
8317   update_bb_for_insn (jump_bb_next);
8318 }
8319
8320 /* Fix CFG after interblock movement of control_flow_insn_p JUMP.  */
8321 static void
8322 move_block_after_check (rtx jump)
8323 {
8324   basic_block bb, jump_bb, jump_bb_next;
8325   vec<edge, va_gc> *t;
8326
8327   bb = BLOCK_FOR_INSN (PREV_INSN (jump));
8328   jump_bb = BLOCK_FOR_INSN (jump);
8329   jump_bb_next = jump_bb->next_bb;
8330
8331   update_bb_for_insn (jump_bb);
8332
8333   gcc_assert (IS_SPECULATION_CHECK_P (jump)
8334               || IS_SPECULATION_CHECK_P (BB_END (jump_bb_next)));
8335
8336   unlink_block (jump_bb_next);
8337   link_block (jump_bb_next, bb);
8338
8339   t = bb->succs;
8340   bb->succs = 0;
8341   move_succs (&(jump_bb->succs), bb);
8342   move_succs (&(jump_bb_next->succs), jump_bb);
8343   move_succs (&t, jump_bb_next);
8344
8345   df_mark_solutions_dirty ();
8346
8347   common_sched_info->fix_recovery_cfg
8348     (bb->index, jump_bb->index, jump_bb_next->index);
8349 }
8350
8351 /* Helper function for move_block_after_check.
8352    This functions attaches edge vector pointed to by SUCCSP to
8353    block TO.  */
8354 static void
8355 move_succs (vec<edge, va_gc> **succsp, basic_block to)
8356 {
8357   edge e;
8358   edge_iterator ei;
8359
8360   gcc_assert (to->succs == 0);
8361
8362   to->succs = *succsp;
8363
8364   FOR_EACH_EDGE (e, ei, to->succs)
8365     e->src = to;
8366
8367   *succsp = 0;
8368 }
8369
8370 /* Remove INSN from the instruction stream.
8371    INSN should have any dependencies.  */
8372 static void
8373 sched_remove_insn (rtx_insn *insn)
8374 {
8375   sd_finish_insn (insn);
8376
8377   change_queue_index (insn, QUEUE_NOWHERE);
8378   current_sched_info->add_remove_insn (insn, 1);
8379   delete_insn (insn);
8380 }
8381
8382 /* Clear priorities of all instructions, that are forward dependent on INSN.
8383    Store in vector pointed to by ROOTS_PTR insns on which priority () should
8384    be invoked to initialize all cleared priorities.  */
8385 static void
8386 clear_priorities (rtx insn, rtx_vec_t *roots_ptr)
8387 {
8388   sd_iterator_def sd_it;
8389   dep_t dep;
8390   bool insn_is_root_p = true;
8391
8392   gcc_assert (QUEUE_INDEX (insn) != QUEUE_SCHEDULED);
8393
8394   FOR_EACH_DEP (insn, SD_LIST_BACK, sd_it, dep)
8395     {
8396       rtx_insn *pro = DEP_PRO (dep);
8397
8398       if (INSN_PRIORITY_STATUS (pro) >= 0
8399           && QUEUE_INDEX (insn) != QUEUE_SCHEDULED)
8400         {
8401           /* If DEP doesn't contribute to priority then INSN itself should
8402              be added to priority roots.  */
8403           if (contributes_to_priority_p (dep))
8404             insn_is_root_p = false;
8405
8406           INSN_PRIORITY_STATUS (pro) = -1;
8407           clear_priorities (pro, roots_ptr);
8408         }
8409     }
8410
8411   if (insn_is_root_p)
8412     roots_ptr->safe_push (insn);
8413 }
8414
8415 /* Recompute priorities of instructions, whose priorities might have been
8416    changed.  ROOTS is a vector of instructions whose priority computation will
8417    trigger initialization of all cleared priorities.  */
8418 static void
8419 calc_priorities (rtx_vec_t roots)
8420 {
8421   int i;
8422   rtx insn;
8423
8424   FOR_EACH_VEC_ELT (roots, i, insn)
8425     priority (insn);
8426 }
8427
8428
8429 /* Add dependences between JUMP and other instructions in the recovery
8430    block.  INSN is the first insn the recovery block.  */
8431 static void
8432 add_jump_dependencies (rtx insn, rtx jump)
8433 {
8434   do
8435     {
8436       insn = NEXT_INSN (insn);
8437       if (insn == jump)
8438         break;
8439
8440       if (dep_list_size (insn, SD_LIST_FORW) == 0)
8441         {
8442           dep_def _new_dep, *new_dep = &_new_dep;
8443
8444           init_dep (new_dep, insn, jump, REG_DEP_ANTI);
8445           sd_add_dep (new_dep, false);
8446         }
8447     }
8448   while (1);
8449
8450   gcc_assert (!sd_lists_empty_p (jump, SD_LIST_BACK));
8451 }
8452
8453 /* Extend data structures for logical insn UID.  */
8454 void
8455 sched_extend_luids (void)
8456 {
8457   int new_luids_max_uid = get_max_uid () + 1;
8458
8459   sched_luids.safe_grow_cleared (new_luids_max_uid);
8460 }
8461
8462 /* Initialize LUID for INSN.  */
8463 void
8464 sched_init_insn_luid (rtx insn)
8465 {
8466   int i = INSN_P (insn) ? 1 : common_sched_info->luid_for_non_insn (insn);
8467   int luid;
8468
8469   if (i >= 0)
8470     {
8471       luid = sched_max_luid;
8472       sched_max_luid += i;
8473     }
8474   else
8475     luid = -1;
8476
8477   SET_INSN_LUID (insn, luid);
8478 }
8479
8480 /* Initialize luids for BBS.
8481    The hook common_sched_info->luid_for_non_insn () is used to determine
8482    if notes, labels, etc. need luids.  */
8483 void
8484 sched_init_luids (bb_vec_t bbs)
8485 {
8486   int i;
8487   basic_block bb;
8488
8489   sched_extend_luids ();
8490   FOR_EACH_VEC_ELT (bbs, i, bb)
8491     {
8492       rtx insn;
8493
8494       FOR_BB_INSNS (bb, insn)
8495         sched_init_insn_luid (insn);
8496     }
8497 }
8498
8499 /* Free LUIDs.  */
8500 void
8501 sched_finish_luids (void)
8502 {
8503   sched_luids.release ();
8504   sched_max_luid = 1;
8505 }
8506
8507 /* Return logical uid of INSN.  Helpful while debugging.  */
8508 int
8509 insn_luid (rtx insn)
8510 {
8511   return INSN_LUID (insn);
8512 }
8513
8514 /* Extend per insn data in the target.  */
8515 void
8516 sched_extend_target (void)
8517 {
8518   if (targetm.sched.h_i_d_extended)
8519     targetm.sched.h_i_d_extended ();
8520 }
8521
8522 /* Extend global scheduler structures (those, that live across calls to
8523    schedule_block) to include information about just emitted INSN.  */
8524 static void
8525 extend_h_i_d (void)
8526 {
8527   int reserve = (get_max_uid () + 1 - h_i_d.length ());
8528   if (reserve > 0
8529       && ! h_i_d.space (reserve))
8530     {
8531       h_i_d.safe_grow_cleared (3 * get_max_uid () / 2);
8532       sched_extend_target ();
8533     }
8534 }
8535
8536 /* Initialize h_i_d entry of the INSN with default values.
8537    Values, that are not explicitly initialized here, hold zero.  */
8538 static void
8539 init_h_i_d (rtx insn)
8540 {
8541   if (INSN_LUID (insn) > 0)
8542     {
8543       INSN_COST (insn) = -1;
8544       QUEUE_INDEX (insn) = QUEUE_NOWHERE;
8545       INSN_TICK (insn) = INVALID_TICK;
8546       INSN_EXACT_TICK (insn) = INVALID_TICK;
8547       INTER_TICK (insn) = INVALID_TICK;
8548       TODO_SPEC (insn) = HARD_DEP;
8549     }
8550 }
8551
8552 /* Initialize haifa_insn_data for BBS.  */
8553 void
8554 haifa_init_h_i_d (bb_vec_t bbs)
8555 {
8556   int i;
8557   basic_block bb;
8558
8559   extend_h_i_d ();
8560   FOR_EACH_VEC_ELT (bbs, i, bb)
8561     {
8562       rtx insn;
8563
8564       FOR_BB_INSNS (bb, insn)
8565         init_h_i_d (insn);
8566     }
8567 }
8568
8569 /* Finalize haifa_insn_data.  */
8570 void
8571 haifa_finish_h_i_d (void)
8572 {
8573   int i;
8574   haifa_insn_data_t data;
8575   struct reg_use_data *use, *next;
8576
8577   FOR_EACH_VEC_ELT (h_i_d, i, data)
8578     {
8579       free (data->max_reg_pressure);
8580       free (data->reg_pressure);
8581       for (use = data->reg_use_list; use != NULL; use = next)
8582         {
8583           next = use->next_insn_use;
8584           free (use);
8585         }
8586     }
8587   h_i_d.release ();
8588 }
8589
8590 /* Init data for the new insn INSN.  */
8591 static void
8592 haifa_init_insn (rtx insn)
8593 {
8594   gcc_assert (insn != NULL);
8595
8596   sched_extend_luids ();
8597   sched_init_insn_luid (insn);
8598   sched_extend_target ();
8599   sched_deps_init (false);
8600   extend_h_i_d ();
8601   init_h_i_d (insn);
8602
8603   if (adding_bb_to_current_region_p)
8604     {
8605       sd_init_insn (insn);
8606
8607       /* Extend dependency caches by one element.  */
8608       extend_dependency_caches (1, false);
8609     }
8610   if (sched_pressure != SCHED_PRESSURE_NONE)
8611     init_insn_reg_pressure_info (insn);
8612 }
8613
8614 /* Init data for the new basic block BB which comes after AFTER.  */
8615 static void
8616 haifa_init_only_bb (basic_block bb, basic_block after)
8617 {
8618   gcc_assert (bb != NULL);
8619
8620   sched_init_bbs ();
8621
8622   if (common_sched_info->add_block)
8623     /* This changes only data structures of the front-end.  */
8624     common_sched_info->add_block (bb, after);
8625 }
8626
8627 /* A generic version of sched_split_block ().  */
8628 basic_block
8629 sched_split_block_1 (basic_block first_bb, rtx after)
8630 {
8631   edge e;
8632
8633   e = split_block (first_bb, after);
8634   gcc_assert (e->src == first_bb);
8635
8636   /* sched_split_block emits note if *check == BB_END.  Probably it
8637      is better to rip that note off.  */
8638
8639   return e->dest;
8640 }
8641
8642 /* A generic version of sched_create_empty_bb ().  */
8643 basic_block
8644 sched_create_empty_bb_1 (basic_block after)
8645 {
8646   return create_empty_bb (after);
8647 }
8648
8649 /* Insert PAT as an INSN into the schedule and update the necessary data
8650    structures to account for it. */
8651 rtx_insn *
8652 sched_emit_insn (rtx pat)
8653 {
8654   rtx_insn *insn = emit_insn_before (pat, first_nonscheduled_insn ());
8655   haifa_init_insn (insn);
8656
8657   if (current_sched_info->add_remove_insn)
8658     current_sched_info->add_remove_insn (insn, 0);
8659
8660   (*current_sched_info->begin_schedule_ready) (insn);
8661   scheduled_insns.safe_push (insn);
8662
8663   last_scheduled_insn = insn;
8664   return insn;
8665 }
8666
8667 /* This function returns a candidate satisfying dispatch constraints from
8668    the ready list.  */
8669
8670 static rtx_insn *
8671 ready_remove_first_dispatch (struct ready_list *ready)
8672 {
8673   int i;
8674   rtx_insn *insn = ready_element (ready, 0);
8675
8676   if (ready->n_ready == 1
8677       || !INSN_P (insn)
8678       || INSN_CODE (insn) < 0
8679       || !active_insn_p (insn)
8680       || targetm.sched.dispatch (insn, FITS_DISPATCH_WINDOW))
8681     return ready_remove_first (ready);
8682
8683   for (i = 1; i < ready->n_ready; i++)
8684     {
8685       insn = ready_element (ready, i);
8686
8687       if (!INSN_P (insn)
8688           || INSN_CODE (insn) < 0
8689           || !active_insn_p (insn))
8690         continue;
8691
8692       if (targetm.sched.dispatch (insn, FITS_DISPATCH_WINDOW))
8693         {
8694           /* Return ith element of ready.  */
8695           insn = ready_remove (ready, i);
8696           return insn;
8697         }
8698     }
8699
8700   if (targetm.sched.dispatch (NULL_RTX, DISPATCH_VIOLATION))
8701     return ready_remove_first (ready);
8702
8703   for (i = 1; i < ready->n_ready; i++)
8704     {
8705       insn = ready_element (ready, i);
8706
8707       if (!INSN_P (insn)
8708           || INSN_CODE (insn) < 0
8709           || !active_insn_p (insn))
8710         continue;
8711
8712       /* Return i-th element of ready.  */
8713       if (targetm.sched.dispatch (insn, IS_CMP))
8714         return ready_remove (ready, i);
8715     }
8716
8717   return ready_remove_first (ready);
8718 }
8719
8720 /* Get number of ready insn in the ready list.  */
8721
8722 int
8723 number_in_ready (void)
8724 {
8725   return ready.n_ready;
8726 }
8727
8728 /* Get number of ready's in the ready list.  */
8729
8730 rtx
8731 get_ready_element (int i)
8732 {
8733   return ready_element (&ready, i);
8734 }
8735
8736 #endif /* INSN_SCHEDULING */