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