OSDN Git Service

Remove trailing white spaces.
[pf3gnuchains/gcc-fork.git] / gcc / haifa-sched.c
1 /* Instruction scheduling pass.
2    Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
3    2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
4    Free Software Foundation, Inc.
5    Contributed by Michael Tiemann (tiemann@cygnus.com) Enhanced by,
6    and currently maintained by, Jim Wilson (wilson@cygnus.com)
7
8 This file is part of GCC.
9
10 GCC is free software; you can redistribute it and/or modify it under
11 the terms of the GNU General Public License as published by the Free
12 Software Foundation; either version 3, or (at your option) any later
13 version.
14
15 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
16 WARRANTY; without even the implied warranty of MERCHANTABILITY or
17 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
18 for more details.
19
20 You should have received a copy of the GNU General Public License
21 along with GCC; see the file COPYING3.  If not see
22 <http://www.gnu.org/licenses/>.  */
23
24 /* Instruction scheduling pass.  This file, along with sched-deps.c,
25    contains the generic parts.  The actual entry point is found for
26    the normal instruction scheduling pass is found in sched-rgn.c.
27
28    We compute insn priorities based on data dependencies.  Flow
29    analysis only creates a fraction of the data-dependencies we must
30    observe: namely, only those dependencies which the combiner can be
31    expected to use.  For this pass, we must therefore create the
32    remaining dependencies we need to observe: register dependencies,
33    memory dependencies, dependencies to keep function calls in order,
34    and the dependence between a conditional branch and the setting of
35    condition codes are all dealt with here.
36
37    The scheduler first traverses the data flow graph, starting with
38    the last instruction, and proceeding to the first, assigning values
39    to insn_priority as it goes.  This sorts the instructions
40    topologically by data dependence.
41
42    Once priorities have been established, we order the insns using
43    list scheduling.  This works as follows: starting with a list of
44    all the ready insns, and sorted according to priority number, we
45    schedule the insn from the end of the list by placing its
46    predecessors in the list according to their priority order.  We
47    consider this insn scheduled by setting the pointer to the "end" of
48    the list to point to the previous insn.  When an insn has no
49    predecessors, we either queue it until sufficient time has elapsed
50    or add it to the ready list.  As the instructions are scheduled or
51    when stalls are introduced, the queue advances and dumps insns into
52    the ready list.  When all insns down to the lowest priority have
53    been scheduled, the critical path of the basic block has been made
54    as short as possible.  The remaining insns are then scheduled in
55    remaining slots.
56
57    The following list shows the order in which we want to break ties
58    among insns in the ready list:
59
60    1.  choose insn with the longest path to end of bb, ties
61    broken by
62    2.  choose insn with least contribution to register pressure,
63    ties broken by
64    3.  prefer in-block upon interblock motion, ties broken by
65    4.  prefer useful upon speculative motion, ties broken by
66    5.  choose insn with largest control flow probability, ties
67    broken by
68    6.  choose insn with the least dependences upon the previously
69    scheduled insn, or finally
70    7   choose the insn which has the most insns dependent on it.
71    8.  choose insn with lowest UID.
72
73    Memory references complicate matters.  Only if we can be certain
74    that memory references are not part of the data dependency graph
75    (via true, anti, or output dependence), can we move operations past
76    memory references.  To first approximation, reads can be done
77    independently, while writes introduce dependencies.  Better
78    approximations will yield fewer dependencies.
79
80    Before reload, an extended analysis of interblock data dependences
81    is required for interblock scheduling.  This is performed in
82    compute_block_backward_dependences ().
83
84    Dependencies set up by memory references are treated in exactly the
85    same way as other dependencies, by using insn backward dependences
86    INSN_BACK_DEPS.  INSN_BACK_DEPS are translated into forward dependences
87    INSN_FORW_DEPS the purpose of forward list scheduling.
88
89    Having optimized the critical path, we may have also unduly
90    extended the lifetimes of some registers.  If an operation requires
91    that constants be loaded into registers, it is certainly desirable
92    to load those constants as early as necessary, but no earlier.
93    I.e., it will not do to load up a bunch of registers at the
94    beginning of a basic block only to use them at the end, if they
95    could be loaded later, since this may result in excessive register
96    utilization.
97
98    Note that since branches are never in basic blocks, but only end
99    basic blocks, this pass will not move branches.  But that is ok,
100    since we can use GNU's delayed branch scheduling pass to take care
101    of this case.
102
103    Also note that no further optimizations based on algebraic
104    identities are performed, so this pass would be a good one to
105    perform instruction splitting, such as breaking up a multiply
106    instruction into shifts and adds where that is profitable.
107
108    Given the memory aliasing analysis that this pass should perform,
109    it should be possible to remove redundant stores to memory, and to
110    load values from registers instead of hitting memory.
111
112    Before reload, speculative insns are moved only if a 'proof' exists
113    that no exception will be caused by this, and if no live registers
114    exist that inhibit the motion (live registers constraints are not
115    represented by data dependence edges).
116
117    This pass must update information that subsequent passes expect to
118    be correct.  Namely: reg_n_refs, reg_n_sets, reg_n_deaths,
119    reg_n_calls_crossed, and reg_live_length.  Also, BB_HEAD, BB_END.
120
121    The information in the line number notes is carefully retained by
122    this pass.  Notes that refer to the starting and ending of
123    exception regions are also carefully retained by this pass.  All
124    other NOTE insns are grouped in their same relative order at the
125    beginning of basic blocks and regions that have been scheduled.  */
126 \f
127 #include "config.h"
128 #include "system.h"
129 #include "coretypes.h"
130 #include "tm.h"
131 #include "toplev.h"
132 #include "rtl.h"
133 #include "tm_p.h"
134 #include "hard-reg-set.h"
135 #include "regs.h"
136 #include "function.h"
137 #include "flags.h"
138 #include "insn-config.h"
139 #include "insn-attr.h"
140 #include "except.h"
141 #include "toplev.h"
142 #include "recog.h"
143 #include "sched-int.h"
144 #include "target.h"
145 #include "output.h"
146 #include "params.h"
147 #include "vecprim.h"
148 #include "dbgcnt.h"
149 #include "cfgloop.h"
150 #include "ira.h"
151
152 #ifdef INSN_SCHEDULING
153
154 /* issue_rate is the number of insns that can be scheduled in the same
155    machine cycle.  It can be defined in the config/mach/mach.h file,
156    otherwise we set it to 1.  */
157
158 int issue_rate;
159
160 /* sched-verbose controls the amount of debugging output the
161    scheduler prints.  It is controlled by -fsched-verbose=N:
162    N>0 and no -DSR : the output is directed to stderr.
163    N>=10 will direct the printouts to stderr (regardless of -dSR).
164    N=1: same as -dSR.
165    N=2: bb's probabilities, detailed ready list info, unit/insn info.
166    N=3: rtl at abort point, control-flow, regions info.
167    N=5: dependences info.  */
168
169 static int sched_verbose_param = 0;
170 int sched_verbose = 0;
171
172 /* Debugging file.  All printouts are sent to dump, which is always set,
173    either to stderr, or to the dump listing file (-dRS).  */
174 FILE *sched_dump = 0;
175
176 /* fix_sched_param() is called from toplev.c upon detection
177    of the -fsched-verbose=N option.  */
178
179 void
180 fix_sched_param (const char *param, const char *val)
181 {
182   if (!strcmp (param, "verbose"))
183     sched_verbose_param = atoi (val);
184   else
185     warning (0, "fix_sched_param: unknown param: %s", param);
186 }
187
188 /* This is a placeholder for the scheduler parameters common
189    to all schedulers.  */
190 struct common_sched_info_def *common_sched_info;
191
192 #define INSN_TICK(INSN) (HID (INSN)->tick)
193 #define INTER_TICK(INSN) (HID (INSN)->inter_tick)
194
195 /* If INSN_TICK of an instruction is equal to INVALID_TICK,
196    then it should be recalculated from scratch.  */
197 #define INVALID_TICK (-(max_insn_queue_index + 1))
198 /* The minimal value of the INSN_TICK of an instruction.  */
199 #define MIN_TICK (-max_insn_queue_index)
200
201 /* Issue points are used to distinguish between instructions in max_issue ().
202    For now, all instructions are equally good.  */
203 #define ISSUE_POINTS(INSN) 1
204
205 /* List of important notes we must keep around.  This is a pointer to the
206    last element in the list.  */
207 rtx note_list;
208
209 static struct spec_info_def spec_info_var;
210 /* Description of the speculative part of the scheduling.
211    If NULL - no speculation.  */
212 spec_info_t spec_info = NULL;
213
214 /* True, if recovery block was added during scheduling of current block.
215    Used to determine, if we need to fix INSN_TICKs.  */
216 static bool haifa_recovery_bb_recently_added_p;
217
218 /* True, if recovery block was added during this scheduling pass.
219    Used to determine if we should have empty memory pools of dependencies
220    after finishing current region.  */
221 bool haifa_recovery_bb_ever_added_p;
222
223 /* Counters of different types of speculative instructions.  */
224 static int nr_begin_data, nr_be_in_data, nr_begin_control, nr_be_in_control;
225
226 /* Array used in {unlink, restore}_bb_notes.  */
227 static rtx *bb_header = 0;
228
229 /* Basic block after which recovery blocks will be created.  */
230 static basic_block before_recovery;
231
232 /* Basic block just before the EXIT_BLOCK and after recovery, if we have
233    created it.  */
234 basic_block after_recovery;
235
236 /* FALSE if we add bb to another region, so we don't need to initialize it.  */
237 bool adding_bb_to_current_region_p = true;
238
239 /* Queues, etc.  */
240
241 /* An instruction is ready to be scheduled when all insns preceding it
242    have already been scheduled.  It is important to ensure that all
243    insns which use its result will not be executed until its result
244    has been computed.  An insn is maintained in one of four structures:
245
246    (P) the "Pending" set of insns which cannot be scheduled until
247    their dependencies have been satisfied.
248    (Q) the "Queued" set of insns that can be scheduled when sufficient
249    time has passed.
250    (R) the "Ready" list of unscheduled, uncommitted insns.
251    (S) the "Scheduled" list of insns.
252
253    Initially, all insns are either "Pending" or "Ready" depending on
254    whether their dependencies are satisfied.
255
256    Insns move from the "Ready" list to the "Scheduled" list as they
257    are committed to the schedule.  As this occurs, the insns in the
258    "Pending" list have their dependencies satisfied and move to either
259    the "Ready" list or the "Queued" set depending on whether
260    sufficient time has passed to make them ready.  As time passes,
261    insns move from the "Queued" set to the "Ready" list.
262
263    The "Pending" list (P) are the insns in the INSN_FORW_DEPS of the
264    unscheduled insns, i.e., those that are ready, queued, and pending.
265    The "Queued" set (Q) is implemented by the variable `insn_queue'.
266    The "Ready" list (R) is implemented by the variables `ready' and
267    `n_ready'.
268    The "Scheduled" list (S) is the new insn chain built by this pass.
269
270    The transition (R->S) is implemented in the scheduling loop in
271    `schedule_block' when the best insn to schedule is chosen.
272    The transitions (P->R and P->Q) are implemented in `schedule_insn' as
273    insns move from the ready list to the scheduled list.
274    The transition (Q->R) is implemented in 'queue_to_insn' as time
275    passes or stalls are introduced.  */
276
277 /* Implement a circular buffer to delay instructions until sufficient
278    time has passed.  For the new pipeline description interface,
279    MAX_INSN_QUEUE_INDEX is a power of two minus one which is not less
280    than maximal time of instruction execution computed by genattr.c on
281    the base maximal time of functional unit reservations and getting a
282    result.  This is the longest time an insn may be queued.  */
283
284 static rtx *insn_queue;
285 static int q_ptr = 0;
286 static int q_size = 0;
287 #define NEXT_Q(X) (((X)+1) & max_insn_queue_index)
288 #define NEXT_Q_AFTER(X, C) (((X)+C) & max_insn_queue_index)
289
290 #define QUEUE_SCHEDULED (-3)
291 #define QUEUE_NOWHERE   (-2)
292 #define QUEUE_READY     (-1)
293 /* QUEUE_SCHEDULED - INSN is scheduled.
294    QUEUE_NOWHERE   - INSN isn't scheduled yet and is neither in
295    queue or ready list.
296    QUEUE_READY     - INSN is in ready list.
297    N >= 0 - INSN queued for X [where NEXT_Q_AFTER (q_ptr, X) == N] cycles.  */
298
299 #define QUEUE_INDEX(INSN) (HID (INSN)->queue_index)
300
301 /* The following variable value refers for all current and future
302    reservations of the processor units.  */
303 state_t curr_state;
304
305 /* The following variable value is size of memory representing all
306    current and future reservations of the processor units.  */
307 size_t dfa_state_size;
308
309 /* The following array is used to find the best insn from ready when
310    the automaton pipeline interface is used.  */
311 char *ready_try = NULL;
312
313 /* The ready list.  */
314 struct ready_list ready = {NULL, 0, 0, 0, 0};
315
316 /* The pointer to the ready list (to be removed).  */
317 static struct ready_list *readyp = &ready;
318
319 /* Scheduling clock.  */
320 static int clock_var;
321
322 static int may_trap_exp (const_rtx, int);
323
324 /* Nonzero iff the address is comprised from at most 1 register.  */
325 #define CONST_BASED_ADDRESS_P(x)                        \
326   (REG_P (x)                                    \
327    || ((GET_CODE (x) == PLUS || GET_CODE (x) == MINUS   \
328         || (GET_CODE (x) == LO_SUM))                    \
329        && (CONSTANT_P (XEXP (x, 0))                     \
330            || CONSTANT_P (XEXP (x, 1)))))
331
332 /* Returns a class that insn with GET_DEST(insn)=x may belong to,
333    as found by analyzing insn's expression.  */
334
335 \f
336 static int haifa_luid_for_non_insn (rtx x);
337
338 /* Haifa version of sched_info hooks common to all headers.  */
339 const struct common_sched_info_def haifa_common_sched_info =
340   {
341     NULL, /* fix_recovery_cfg */
342     NULL, /* add_block */
343     NULL, /* estimate_number_of_insns */
344     haifa_luid_for_non_insn, /* luid_for_non_insn */
345     SCHED_PASS_UNKNOWN /* sched_pass_id */
346   };
347
348 const struct sched_scan_info_def *sched_scan_info;
349
350 /* Mapping from instruction UID to its Logical UID.  */
351 VEC (int, heap) *sched_luids = NULL;
352
353 /* Next LUID to assign to an instruction.  */
354 int sched_max_luid = 1;
355
356 /* Haifa Instruction Data.  */
357 VEC (haifa_insn_data_def, heap) *h_i_d = NULL;
358
359 void (* sched_init_only_bb) (basic_block, basic_block);
360
361 /* Split block function.  Different schedulers might use different functions
362    to handle their internal data consistent.  */
363 basic_block (* sched_split_block) (basic_block, rtx);
364
365 /* Create empty basic block after the specified block.  */
366 basic_block (* sched_create_empty_bb) (basic_block);
367
368 static int
369 may_trap_exp (const_rtx x, int is_store)
370 {
371   enum rtx_code code;
372
373   if (x == 0)
374     return TRAP_FREE;
375   code = GET_CODE (x);
376   if (is_store)
377     {
378       if (code == MEM && may_trap_p (x))
379         return TRAP_RISKY;
380       else
381         return TRAP_FREE;
382     }
383   if (code == MEM)
384     {
385       /* The insn uses memory:  a volatile load.  */
386       if (MEM_VOLATILE_P (x))
387         return IRISKY;
388       /* An exception-free load.  */
389       if (!may_trap_p (x))
390         return IFREE;
391       /* A load with 1 base register, to be further checked.  */
392       if (CONST_BASED_ADDRESS_P (XEXP (x, 0)))
393         return PFREE_CANDIDATE;
394       /* No info on the load, to be further checked.  */
395       return PRISKY_CANDIDATE;
396     }
397   else
398     {
399       const char *fmt;
400       int i, insn_class = TRAP_FREE;
401
402       /* Neither store nor load, check if it may cause a trap.  */
403       if (may_trap_p (x))
404         return TRAP_RISKY;
405       /* Recursive step: walk the insn...  */
406       fmt = GET_RTX_FORMAT (code);
407       for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
408         {
409           if (fmt[i] == 'e')
410             {
411               int tmp_class = may_trap_exp (XEXP (x, i), is_store);
412               insn_class = WORST_CLASS (insn_class, tmp_class);
413             }
414           else if (fmt[i] == 'E')
415             {
416               int j;
417               for (j = 0; j < XVECLEN (x, i); j++)
418                 {
419                   int tmp_class = may_trap_exp (XVECEXP (x, i, j), is_store);
420                   insn_class = WORST_CLASS (insn_class, tmp_class);
421                   if (insn_class == TRAP_RISKY || insn_class == IRISKY)
422                     break;
423                 }
424             }
425           if (insn_class == TRAP_RISKY || insn_class == IRISKY)
426             break;
427         }
428       return insn_class;
429     }
430 }
431
432 /* Classifies rtx X of an insn for the purpose of verifying that X can be
433    executed speculatively (and consequently the insn can be moved
434    speculatively), by examining X, returning:
435    TRAP_RISKY: store, or risky non-load insn (e.g. division by variable).
436    TRAP_FREE: non-load insn.
437    IFREE: load from a globally safe location.
438    IRISKY: volatile load.
439    PFREE_CANDIDATE, PRISKY_CANDIDATE: load that need to be checked for
440    being either PFREE or PRISKY.  */
441
442 static int
443 haifa_classify_rtx (const_rtx x)
444 {
445   int tmp_class = TRAP_FREE;
446   int insn_class = TRAP_FREE;
447   enum rtx_code code;
448
449   if (GET_CODE (x) == PARALLEL)
450     {
451       int i, len = XVECLEN (x, 0);
452
453       for (i = len - 1; i >= 0; i--)
454         {
455           tmp_class = haifa_classify_rtx (XVECEXP (x, 0, i));
456           insn_class = WORST_CLASS (insn_class, tmp_class);
457           if (insn_class == TRAP_RISKY || insn_class == IRISKY)
458             break;
459         }
460     }
461   else
462     {
463       code = GET_CODE (x);
464       switch (code)
465         {
466         case CLOBBER:
467           /* Test if it is a 'store'.  */
468           tmp_class = may_trap_exp (XEXP (x, 0), 1);
469           break;
470         case SET:
471           /* Test if it is a store.  */
472           tmp_class = may_trap_exp (SET_DEST (x), 1);
473           if (tmp_class == TRAP_RISKY)
474             break;
475           /* Test if it is a load.  */
476           tmp_class =
477             WORST_CLASS (tmp_class,
478                          may_trap_exp (SET_SRC (x), 0));
479           break;
480         case COND_EXEC:
481           tmp_class = haifa_classify_rtx (COND_EXEC_CODE (x));
482           if (tmp_class == TRAP_RISKY)
483             break;
484           tmp_class = WORST_CLASS (tmp_class,
485                                    may_trap_exp (COND_EXEC_TEST (x), 0));
486           break;
487         case TRAP_IF:
488           tmp_class = TRAP_RISKY;
489           break;
490         default:;
491         }
492       insn_class = tmp_class;
493     }
494
495   return insn_class;
496 }
497
498 int
499 haifa_classify_insn (const_rtx insn)
500 {
501   return haifa_classify_rtx (PATTERN (insn));
502 }
503
504 /* Forward declarations.  */
505
506 static int priority (rtx);
507 static int rank_for_schedule (const void *, const void *);
508 static void swap_sort (rtx *, int);
509 static void queue_insn (rtx, int);
510 static int schedule_insn (rtx);
511 static void adjust_priority (rtx);
512 static void advance_one_cycle (void);
513 static void extend_h_i_d (void);
514
515
516 /* Notes handling mechanism:
517    =========================
518    Generally, NOTES are saved before scheduling and restored after scheduling.
519    The scheduler distinguishes between two types of notes:
520
521    (1) LOOP_BEGIN, LOOP_END, SETJMP, EHREGION_BEG, EHREGION_END notes:
522    Before scheduling a region, a pointer to the note is added to the insn
523    that follows or precedes it.  (This happens as part of the data dependence
524    computation).  After scheduling an insn, the pointer contained in it is
525    used for regenerating the corresponding note (in reemit_notes).
526
527    (2) All other notes (e.g. INSN_DELETED):  Before scheduling a block,
528    these notes are put in a list (in rm_other_notes() and
529    unlink_other_notes ()).  After scheduling the block, these notes are
530    inserted at the beginning of the block (in schedule_block()).  */
531
532 static void ready_add (struct ready_list *, rtx, bool);
533 static rtx ready_remove_first (struct ready_list *);
534
535 static void queue_to_ready (struct ready_list *);
536 static int early_queue_to_ready (state_t, struct ready_list *);
537
538 static void debug_ready_list (struct ready_list *);
539
540 /* The following functions are used to implement multi-pass scheduling
541    on the first cycle.  */
542 static rtx ready_remove (struct ready_list *, int);
543 static void ready_remove_insn (rtx);
544
545 static int choose_ready (struct ready_list *, rtx *);
546
547 static void fix_inter_tick (rtx, rtx);
548 static int fix_tick_ready (rtx);
549 static void change_queue_index (rtx, int);
550
551 /* The following functions are used to implement scheduling of data/control
552    speculative instructions.  */
553
554 static void extend_h_i_d (void);
555 static void init_h_i_d (rtx);
556 static void generate_recovery_code (rtx);
557 static void process_insn_forw_deps_be_in_spec (rtx, rtx, ds_t);
558 static void begin_speculative_block (rtx);
559 static void add_to_speculative_block (rtx);
560 static void init_before_recovery (basic_block *);
561 static void create_check_block_twin (rtx, bool);
562 static void fix_recovery_deps (basic_block);
563 static void haifa_change_pattern (rtx, rtx);
564 static void dump_new_block_header (int, basic_block, rtx, rtx);
565 static void restore_bb_notes (basic_block);
566 static void fix_jump_move (rtx);
567 static void move_block_after_check (rtx);
568 static void move_succs (VEC(edge,gc) **, basic_block);
569 static void sched_remove_insn (rtx);
570 static void clear_priorities (rtx, rtx_vec_t *);
571 static void calc_priorities (rtx_vec_t);
572 static void add_jump_dependencies (rtx, rtx);
573 #ifdef ENABLE_CHECKING
574 static int has_edge_p (VEC(edge,gc) *, int);
575 static void check_cfg (rtx, rtx);
576 #endif
577
578 #endif /* INSN_SCHEDULING */
579 \f
580 /* Point to state used for the current scheduling pass.  */
581 struct haifa_sched_info *current_sched_info;
582 \f
583 #ifndef INSN_SCHEDULING
584 void
585 schedule_insns (void)
586 {
587 }
588 #else
589
590 /* Do register pressure sensitive insn scheduling if the flag is set
591    up.  */
592 bool sched_pressure_p;
593
594 /* Map regno -> its cover class.  The map defined only when
595    SCHED_PRESSURE_P is true.  */
596 enum reg_class *sched_regno_cover_class;
597
598 /* The current register pressure.  Only elements corresponding cover
599    classes are defined.  */
600 static int curr_reg_pressure[N_REG_CLASSES];
601
602 /* Saved value of the previous array.  */
603 static int saved_reg_pressure[N_REG_CLASSES];
604
605 /* Register living at given scheduling point.  */
606 static bitmap curr_reg_live;
607
608 /* Saved value of the previous array.  */
609 static bitmap saved_reg_live;
610
611 /* Registers mentioned in the current region.  */
612 static bitmap region_ref_regs;
613
614 /* Initiate register pressure relative info for scheduling the current
615    region.  Currently it is only clearing register mentioned in the
616    current region.  */
617 void
618 sched_init_region_reg_pressure_info (void)
619 {
620   bitmap_clear (region_ref_regs);
621 }
622
623 /* Update current register pressure related info after birth (if
624    BIRTH_P) or death of register REGNO.  */
625 static void
626 mark_regno_birth_or_death (int regno, bool birth_p)
627 {
628   enum reg_class cover_class;
629
630   cover_class = sched_regno_cover_class[regno];
631   if (regno >= FIRST_PSEUDO_REGISTER)
632     {
633       if (cover_class != NO_REGS)
634         {
635           if (birth_p)
636             {
637               bitmap_set_bit (curr_reg_live, regno);
638               curr_reg_pressure[cover_class]
639                 += ira_reg_class_nregs[cover_class][PSEUDO_REGNO_MODE (regno)];
640             }
641           else
642             {
643               bitmap_clear_bit (curr_reg_live, regno);
644               curr_reg_pressure[cover_class]
645                 -= ira_reg_class_nregs[cover_class][PSEUDO_REGNO_MODE (regno)];
646             }
647         }
648     }
649   else if (cover_class != NO_REGS
650            && ! TEST_HARD_REG_BIT (ira_no_alloc_regs, regno))
651     {
652       if (birth_p)
653         {
654           bitmap_set_bit (curr_reg_live, regno);
655           curr_reg_pressure[cover_class]++;
656         }
657       else
658         {
659           bitmap_clear_bit (curr_reg_live, regno);
660           curr_reg_pressure[cover_class]--;
661         }
662     }
663 }
664
665 /* Initiate current register pressure related info from living
666    registers given by LIVE.  */
667 static void
668 initiate_reg_pressure_info (bitmap live)
669 {
670   int i;
671   unsigned int j;
672   bitmap_iterator bi;
673
674   for (i = 0; i < ira_reg_class_cover_size; i++)
675     curr_reg_pressure[ira_reg_class_cover[i]] = 0;
676   bitmap_clear (curr_reg_live);
677   EXECUTE_IF_SET_IN_BITMAP (live, 0, j, bi)
678     if (current_nr_blocks == 1 || bitmap_bit_p (region_ref_regs, j))
679       mark_regno_birth_or_death (j, true);
680 }
681
682 /* Mark registers in X as mentioned in the current region.  */
683 static void
684 setup_ref_regs (rtx x)
685 {
686   int i, j, regno;
687   const RTX_CODE code = GET_CODE (x);
688   const char *fmt;
689
690   if (REG_P (x))
691     {
692       regno = REGNO (x);
693       if (regno >= FIRST_PSEUDO_REGISTER)
694         bitmap_set_bit (region_ref_regs, REGNO (x));
695       else
696         for (i = hard_regno_nregs[regno][GET_MODE (x)] - 1; i >= 0; i--)
697           bitmap_set_bit (region_ref_regs, regno + i);
698       return;
699     }
700   fmt = GET_RTX_FORMAT (code);
701   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
702     if (fmt[i] == 'e')
703       setup_ref_regs (XEXP (x, i));
704     else if (fmt[i] == 'E')
705       {
706         for (j = 0; j < XVECLEN (x, i); j++)
707           setup_ref_regs (XVECEXP (x, i, j));
708       }
709 }
710
711 /* Initiate current register pressure related info at the start of
712    basic block BB.  */
713 static void
714 initiate_bb_reg_pressure_info (basic_block bb)
715 {
716   unsigned int i;
717   rtx insn;
718
719   if (current_nr_blocks > 1)
720     FOR_BB_INSNS (bb, insn)
721       if (INSN_P (insn))
722         setup_ref_regs (PATTERN (insn));
723   initiate_reg_pressure_info (df_get_live_in (bb));
724 #ifdef EH_RETURN_DATA_REGNO
725   if (bb_has_eh_pred (bb))
726     for (i = 0; ; ++i)
727       {
728         unsigned int regno = EH_RETURN_DATA_REGNO (i);
729
730         if (regno == INVALID_REGNUM)
731           break;
732         if (! bitmap_bit_p (df_get_live_in (bb), regno))
733           mark_regno_birth_or_death (regno, true);
734       }
735 #endif
736 }
737
738 /* Save current register pressure related info.  */
739 static void
740 save_reg_pressure (void)
741 {
742   int i;
743
744   for (i = 0; i < ira_reg_class_cover_size; i++)
745     saved_reg_pressure[ira_reg_class_cover[i]]
746       = curr_reg_pressure[ira_reg_class_cover[i]];
747   bitmap_copy (saved_reg_live, curr_reg_live);
748 }
749
750 /* Restore saved register pressure related info.  */
751 static void
752 restore_reg_pressure (void)
753 {
754   int i;
755
756   for (i = 0; i < ira_reg_class_cover_size; i++)
757     curr_reg_pressure[ira_reg_class_cover[i]]
758       = saved_reg_pressure[ira_reg_class_cover[i]];
759   bitmap_copy (curr_reg_live, saved_reg_live);
760 }
761
762 /* Return TRUE if the register is dying after its USE.  */
763 static bool
764 dying_use_p (struct reg_use_data *use)
765 {
766   struct reg_use_data *next;
767
768   for (next = use->next_regno_use; next != use; next = next->next_regno_use)
769     if (QUEUE_INDEX (next->insn) != QUEUE_SCHEDULED)
770       return false;
771   return true;
772 }
773
774 /* Print info about the current register pressure and its excess for
775    each cover class.  */
776 static void
777 print_curr_reg_pressure (void)
778 {
779   int i;
780   enum reg_class cl;
781
782   fprintf (sched_dump, ";;\t");
783   for (i = 0; i < ira_reg_class_cover_size; i++)
784     {
785       cl = ira_reg_class_cover[i];
786       gcc_assert (curr_reg_pressure[cl] >= 0);
787       fprintf (sched_dump, "  %s:%d(%d)", reg_class_names[cl],
788                curr_reg_pressure[cl],
789                curr_reg_pressure[cl] - ira_available_class_regs[cl]);
790     }
791   fprintf (sched_dump, "\n");
792 }
793
794 /* Pointer to the last instruction scheduled.  Used by rank_for_schedule,
795    so that insns independent of the last scheduled insn will be preferred
796    over dependent instructions.  */
797
798 static rtx last_scheduled_insn;
799
800 /* Cached cost of the instruction.  Use below function to get cost of the
801    insn.  -1 here means that the field is not initialized.  */
802 #define INSN_COST(INSN) (HID (INSN)->cost)
803
804 /* Compute cost of executing INSN.
805    This is the number of cycles between instruction issue and
806    instruction results.  */
807 int
808 insn_cost (rtx insn)
809 {
810   int cost;
811
812   if (sel_sched_p ())
813     {
814       if (recog_memoized (insn) < 0)
815         return 0;
816
817       cost = insn_default_latency (insn);
818       if (cost < 0)
819         cost = 0;
820
821       return cost;
822     }
823
824   cost = INSN_COST (insn);
825
826   if (cost < 0)
827     {
828       /* A USE insn, or something else we don't need to
829          understand.  We can't pass these directly to
830          result_ready_cost or insn_default_latency because it will
831          trigger a fatal error for unrecognizable insns.  */
832       if (recog_memoized (insn) < 0)
833         {
834           INSN_COST (insn) = 0;
835           return 0;
836         }
837       else
838         {
839           cost = insn_default_latency (insn);
840           if (cost < 0)
841             cost = 0;
842
843           INSN_COST (insn) = cost;
844         }
845     }
846
847   return cost;
848 }
849
850 /* Compute cost of dependence LINK.
851    This is the number of cycles between instruction issue and
852    instruction results.
853    ??? We also use this function to call recog_memoized on all insns.  */
854 int
855 dep_cost_1 (dep_t link, dw_t dw)
856 {
857   rtx insn = DEP_PRO (link);
858   rtx used = DEP_CON (link);
859   int cost;
860
861   /* A USE insn should never require the value used to be computed.
862      This allows the computation of a function's result and parameter
863      values to overlap the return and call.  We don't care about the
864      the dependence cost when only decreasing register pressure.  */
865   if (recog_memoized (used) < 0)
866     {
867       cost = 0;
868       recog_memoized (insn);
869     }
870   else
871     {
872       enum reg_note dep_type = DEP_TYPE (link);
873
874       cost = insn_cost (insn);
875
876       if (INSN_CODE (insn) >= 0)
877         {
878           if (dep_type == REG_DEP_ANTI)
879             cost = 0;
880           else if (dep_type == REG_DEP_OUTPUT)
881             {
882               cost = (insn_default_latency (insn)
883                       - insn_default_latency (used));
884               if (cost <= 0)
885                 cost = 1;
886             }
887           else if (bypass_p (insn))
888             cost = insn_latency (insn, used);
889         }
890
891
892       if (targetm.sched.adjust_cost_2)
893         cost = targetm.sched.adjust_cost_2 (used, (int) dep_type, insn, cost,
894                                             dw);
895       else if (targetm.sched.adjust_cost != NULL)
896         {
897           /* This variable is used for backward compatibility with the
898              targets.  */
899           rtx dep_cost_rtx_link = alloc_INSN_LIST (NULL_RTX, NULL_RTX);
900
901           /* Make it self-cycled, so that if some tries to walk over this
902              incomplete list he/she will be caught in an endless loop.  */
903           XEXP (dep_cost_rtx_link, 1) = dep_cost_rtx_link;
904
905           /* Targets use only REG_NOTE_KIND of the link.  */
906           PUT_REG_NOTE_KIND (dep_cost_rtx_link, DEP_TYPE (link));
907
908           cost = targetm.sched.adjust_cost (used, dep_cost_rtx_link,
909                                             insn, cost);
910
911           free_INSN_LIST_node (dep_cost_rtx_link);
912         }
913
914       if (cost < 0)
915         cost = 0;
916     }
917
918   return cost;
919 }
920
921 /* Compute cost of dependence LINK.
922    This is the number of cycles between instruction issue and
923    instruction results.  */
924 int
925 dep_cost (dep_t link)
926 {
927   return dep_cost_1 (link, 0);
928 }
929
930 /* Use this sel-sched.c friendly function in reorder2 instead of increasing
931    INSN_PRIORITY explicitly.  */
932 void
933 increase_insn_priority (rtx insn, int amount)
934 {
935   if (!sel_sched_p ())
936     {
937       /* We're dealing with haifa-sched.c INSN_PRIORITY.  */
938       if (INSN_PRIORITY_KNOWN (insn))
939           INSN_PRIORITY (insn) += amount;
940     }
941   else
942     {
943       /* In sel-sched.c INSN_PRIORITY is not kept up to date.
944          Use EXPR_PRIORITY instead. */
945       sel_add_to_insn_priority (insn, amount);
946     }
947 }
948
949 /* Return 'true' if DEP should be included in priority calculations.  */
950 static bool
951 contributes_to_priority_p (dep_t dep)
952 {
953   if (DEBUG_INSN_P (DEP_CON (dep))
954       || DEBUG_INSN_P (DEP_PRO (dep)))
955     return false;
956
957   /* Critical path is meaningful in block boundaries only.  */
958   if (!current_sched_info->contributes_to_priority (DEP_CON (dep),
959                                                     DEP_PRO (dep)))
960     return false;
961
962   /* If flag COUNT_SPEC_IN_CRITICAL_PATH is set,
963      then speculative instructions will less likely be
964      scheduled.  That is because the priority of
965      their producers will increase, and, thus, the
966      producers will more likely be scheduled, thus,
967      resolving the dependence.  */
968   if (sched_deps_info->generate_spec_deps
969       && !(spec_info->flags & COUNT_SPEC_IN_CRITICAL_PATH)
970       && (DEP_STATUS (dep) & SPECULATIVE))
971     return false;
972
973   return true;
974 }
975
976 /* Compute the number of nondebug forward deps of an insn.  */
977
978 static int
979 dep_list_size (rtx insn)
980 {
981   sd_iterator_def sd_it;
982   dep_t dep;
983   int dbgcount = 0, nodbgcount = 0;
984
985   if (!MAY_HAVE_DEBUG_INSNS)
986     return sd_lists_size (insn, SD_LIST_FORW);
987
988   FOR_EACH_DEP (insn, SD_LIST_FORW, sd_it, dep)
989     {
990       if (DEBUG_INSN_P (DEP_CON (dep)))
991         dbgcount++;
992       else if (!DEBUG_INSN_P (DEP_PRO (dep)))
993         nodbgcount++;
994     }
995
996   gcc_assert (dbgcount + nodbgcount == sd_lists_size (insn, SD_LIST_FORW));
997
998   return nodbgcount;
999 }
1000
1001 /* Compute the priority number for INSN.  */
1002 static int
1003 priority (rtx insn)
1004 {
1005   if (! INSN_P (insn))
1006     return 0;
1007
1008   /* We should not be interested in priority of an already scheduled insn.  */
1009   gcc_assert (QUEUE_INDEX (insn) != QUEUE_SCHEDULED);
1010
1011   if (!INSN_PRIORITY_KNOWN (insn))
1012     {
1013       int this_priority = -1;
1014
1015       if (dep_list_size (insn) == 0)
1016         /* ??? We should set INSN_PRIORITY to insn_cost when and insn has
1017            some forward deps but all of them are ignored by
1018            contributes_to_priority hook.  At the moment we set priority of
1019            such insn to 0.  */
1020         this_priority = insn_cost (insn);
1021       else
1022         {
1023           rtx prev_first, twin;
1024           basic_block rec;
1025
1026           /* For recovery check instructions we calculate priority slightly
1027              different than that of normal instructions.  Instead of walking
1028              through INSN_FORW_DEPS (check) list, we walk through
1029              INSN_FORW_DEPS list of each instruction in the corresponding
1030              recovery block.  */
1031
1032           /* Selective scheduling does not define RECOVERY_BLOCK macro.  */
1033           rec = sel_sched_p () ? NULL : RECOVERY_BLOCK (insn);
1034           if (!rec || rec == EXIT_BLOCK_PTR)
1035             {
1036               prev_first = PREV_INSN (insn);
1037               twin = insn;
1038             }
1039           else
1040             {
1041               prev_first = NEXT_INSN (BB_HEAD (rec));
1042               twin = PREV_INSN (BB_END (rec));
1043             }
1044
1045           do
1046             {
1047               sd_iterator_def sd_it;
1048               dep_t dep;
1049
1050               FOR_EACH_DEP (twin, SD_LIST_FORW, sd_it, dep)
1051                 {
1052                   rtx next;
1053                   int next_priority;
1054
1055                   next = DEP_CON (dep);
1056
1057                   if (BLOCK_FOR_INSN (next) != rec)
1058                     {
1059                       int cost;
1060
1061                       if (!contributes_to_priority_p (dep))
1062                         continue;
1063
1064                       if (twin == insn)
1065                         cost = dep_cost (dep);
1066                       else
1067                         {
1068                           struct _dep _dep1, *dep1 = &_dep1;
1069
1070                           init_dep (dep1, insn, next, REG_DEP_ANTI);
1071
1072                           cost = dep_cost (dep1);
1073                         }
1074
1075                       next_priority = cost + priority (next);
1076
1077                       if (next_priority > this_priority)
1078                         this_priority = next_priority;
1079                     }
1080                 }
1081
1082               twin = PREV_INSN (twin);
1083             }
1084           while (twin != prev_first);
1085         }
1086
1087       if (this_priority < 0)
1088         {
1089           gcc_assert (this_priority == -1);
1090
1091           this_priority = insn_cost (insn);
1092         }
1093
1094       INSN_PRIORITY (insn) = this_priority;
1095       INSN_PRIORITY_STATUS (insn) = 1;
1096     }
1097
1098   return INSN_PRIORITY (insn);
1099 }
1100 \f
1101 /* Macros and functions for keeping the priority queue sorted, and
1102    dealing with queuing and dequeuing of instructions.  */
1103
1104 #define SCHED_SORT(READY, N_READY)                                   \
1105 do { if ((N_READY) == 2)                                             \
1106        swap_sort (READY, N_READY);                                   \
1107      else if ((N_READY) > 2)                                         \
1108          qsort (READY, N_READY, sizeof (rtx), rank_for_schedule); }  \
1109 while (0)
1110
1111 /* Setup info about the current register pressure impact of scheduling
1112    INSN at the current scheduling point.  */
1113 static void
1114 setup_insn_reg_pressure_info (rtx insn)
1115 {
1116   int i, change, before, after, hard_regno;
1117   int excess_cost_change;
1118   enum machine_mode mode;
1119   enum reg_class cl;
1120   struct reg_pressure_data *pressure_info;
1121   int *max_reg_pressure;
1122   struct reg_use_data *use;
1123   static int death[N_REG_CLASSES];
1124
1125   excess_cost_change = 0;
1126   for (i = 0; i < ira_reg_class_cover_size; i++)
1127     death[ira_reg_class_cover[i]] = 0;
1128   for (use = INSN_REG_USE_LIST (insn); use != NULL; use = use->next_insn_use)
1129     if (dying_use_p (use))
1130       {
1131         cl = sched_regno_cover_class[use->regno];
1132         if (use->regno < FIRST_PSEUDO_REGISTER)
1133           death[cl]++;
1134         else
1135           death[cl] += ira_reg_class_nregs[cl][PSEUDO_REGNO_MODE (use->regno)];
1136       }
1137   pressure_info = INSN_REG_PRESSURE (insn);
1138   max_reg_pressure = INSN_MAX_REG_PRESSURE (insn);
1139   gcc_assert (pressure_info != NULL && max_reg_pressure != NULL);
1140   for (i = 0; i < ira_reg_class_cover_size; i++)
1141     {
1142       cl = ira_reg_class_cover[i];
1143       gcc_assert (curr_reg_pressure[cl] >= 0);
1144       change = (int) pressure_info[i].set_increase - death[cl];
1145       before = MAX (0, max_reg_pressure[i] - ira_available_class_regs[cl]);
1146       after = MAX (0, max_reg_pressure[i] + change
1147                    - ira_available_class_regs[cl]);
1148       hard_regno = ira_class_hard_regs[cl][0];
1149       gcc_assert (hard_regno >= 0);
1150       mode = reg_raw_mode[hard_regno];
1151       excess_cost_change += ((after - before)
1152                              * (ira_memory_move_cost[mode][cl][0]
1153                                 + ira_memory_move_cost[mode][cl][1]));
1154     }
1155   INSN_REG_PRESSURE_EXCESS_COST_CHANGE (insn) = excess_cost_change;
1156 }
1157
1158 /* Returns a positive value if x is preferred; returns a negative value if
1159    y is preferred.  Should never return 0, since that will make the sort
1160    unstable.  */
1161
1162 static int
1163 rank_for_schedule (const void *x, const void *y)
1164 {
1165   rtx tmp = *(const rtx *) y;
1166   rtx tmp2 = *(const rtx *) x;
1167   rtx last;
1168   int tmp_class, tmp2_class;
1169   int val, priority_val, info_val;
1170
1171   if (MAY_HAVE_DEBUG_INSNS)
1172     {
1173       /* Schedule debug insns as early as possible.  */
1174       if (DEBUG_INSN_P (tmp) && !DEBUG_INSN_P (tmp2))
1175         return -1;
1176       else if (DEBUG_INSN_P (tmp2))
1177         return 1;
1178     }
1179
1180   /* The insn in a schedule group should be issued the first.  */
1181   if (flag_sched_group_heuristic &&
1182       SCHED_GROUP_P (tmp) != SCHED_GROUP_P (tmp2))
1183     return SCHED_GROUP_P (tmp2) ? 1 : -1;
1184
1185   /* Make sure that priority of TMP and TMP2 are initialized.  */
1186   gcc_assert (INSN_PRIORITY_KNOWN (tmp) && INSN_PRIORITY_KNOWN (tmp2));
1187
1188   if (sched_pressure_p)
1189     {
1190       int diff;
1191
1192       /* Prefer insn whose scheduling results in the smallest register
1193          pressure excess.  */
1194       if ((diff = (INSN_REG_PRESSURE_EXCESS_COST_CHANGE (tmp)
1195                    + (INSN_TICK (tmp) > clock_var
1196                       ? INSN_TICK (tmp) - clock_var : 0)
1197                    - INSN_REG_PRESSURE_EXCESS_COST_CHANGE (tmp2)
1198                    - (INSN_TICK (tmp2) > clock_var
1199                       ? INSN_TICK (tmp2) - clock_var : 0))) != 0)
1200         return diff;
1201     }
1202
1203
1204   if (sched_pressure_p
1205       && (INSN_TICK (tmp2) > clock_var || INSN_TICK (tmp) > clock_var))
1206     {
1207       if (INSN_TICK (tmp) <= clock_var)
1208         return -1;
1209       else if (INSN_TICK (tmp2) <= clock_var)
1210         return 1;
1211       else
1212         return INSN_TICK (tmp) - INSN_TICK (tmp2);
1213     }
1214   /* Prefer insn with higher priority.  */
1215   priority_val = INSN_PRIORITY (tmp2) - INSN_PRIORITY (tmp);
1216
1217   if (flag_sched_critical_path_heuristic && priority_val)
1218     return priority_val;
1219
1220   /* Prefer speculative insn with greater dependencies weakness.  */
1221   if (flag_sched_spec_insn_heuristic && spec_info)
1222     {
1223       ds_t ds1, ds2;
1224       dw_t dw1, dw2;
1225       int dw;
1226
1227       ds1 = TODO_SPEC (tmp) & SPECULATIVE;
1228       if (ds1)
1229         dw1 = ds_weak (ds1);
1230       else
1231         dw1 = NO_DEP_WEAK;
1232
1233       ds2 = TODO_SPEC (tmp2) & SPECULATIVE;
1234       if (ds2)
1235         dw2 = ds_weak (ds2);
1236       else
1237         dw2 = NO_DEP_WEAK;
1238
1239       dw = dw2 - dw1;
1240       if (dw > (NO_DEP_WEAK / 8) || dw < -(NO_DEP_WEAK / 8))
1241         return dw;
1242     }
1243
1244   info_val = (*current_sched_info->rank) (tmp, tmp2);
1245   if(flag_sched_rank_heuristic && info_val)
1246     return info_val;
1247
1248   if (flag_sched_last_insn_heuristic)
1249     {
1250       last = last_scheduled_insn;
1251
1252       if (DEBUG_INSN_P (last) && last != current_sched_info->prev_head)
1253         do
1254           last = PREV_INSN (last);
1255         while (!NONDEBUG_INSN_P (last)
1256                && last != current_sched_info->prev_head);
1257     }
1258
1259   /* Compare insns based on their relation to the last scheduled
1260      non-debug insn.  */
1261   if (flag_sched_last_insn_heuristic && NONDEBUG_INSN_P (last))
1262     {
1263       dep_t dep1;
1264       dep_t dep2;
1265
1266       /* Classify the instructions into three classes:
1267          1) Data dependent on last schedule insn.
1268          2) Anti/Output dependent on last scheduled insn.
1269          3) Independent of last scheduled insn, or has latency of one.
1270          Choose the insn from the highest numbered class if different.  */
1271       dep1 = sd_find_dep_between (last, tmp, true);
1272
1273       if (dep1 == NULL || dep_cost (dep1) == 1)
1274         tmp_class = 3;
1275       else if (/* Data dependence.  */
1276                DEP_TYPE (dep1) == REG_DEP_TRUE)
1277         tmp_class = 1;
1278       else
1279         tmp_class = 2;
1280
1281       dep2 = sd_find_dep_between (last, tmp2, true);
1282
1283       if (dep2 == NULL || dep_cost (dep2)  == 1)
1284         tmp2_class = 3;
1285       else if (/* Data dependence.  */
1286                DEP_TYPE (dep2) == REG_DEP_TRUE)
1287         tmp2_class = 1;
1288       else
1289         tmp2_class = 2;
1290
1291       if ((val = tmp2_class - tmp_class))
1292         return val;
1293     }
1294
1295   /* Prefer the insn which has more later insns that depend on it.
1296      This gives the scheduler more freedom when scheduling later
1297      instructions at the expense of added register pressure.  */
1298
1299   val = (dep_list_size (tmp2) - dep_list_size (tmp));
1300
1301   if (flag_sched_dep_count_heuristic && val != 0)
1302     return val;
1303
1304   /* If insns are equally good, sort by INSN_LUID (original insn order),
1305      so that we make the sort stable.  This minimizes instruction movement,
1306      thus minimizing sched's effect on debugging and cross-jumping.  */
1307   return INSN_LUID (tmp) - INSN_LUID (tmp2);
1308 }
1309
1310 /* Resort the array A in which only element at index N may be out of order.  */
1311
1312 HAIFA_INLINE static void
1313 swap_sort (rtx *a, int n)
1314 {
1315   rtx insn = a[n - 1];
1316   int i = n - 2;
1317
1318   while (i >= 0 && rank_for_schedule (a + i, &insn) >= 0)
1319     {
1320       a[i + 1] = a[i];
1321       i -= 1;
1322     }
1323   a[i + 1] = insn;
1324 }
1325
1326 /* Add INSN to the insn queue so that it can be executed at least
1327    N_CYCLES after the currently executing insn.  Preserve insns
1328    chain for debugging purposes.  */
1329
1330 HAIFA_INLINE static void
1331 queue_insn (rtx insn, int n_cycles)
1332 {
1333   int next_q = NEXT_Q_AFTER (q_ptr, n_cycles);
1334   rtx link = alloc_INSN_LIST (insn, insn_queue[next_q]);
1335
1336   gcc_assert (n_cycles <= max_insn_queue_index);
1337   gcc_assert (!DEBUG_INSN_P (insn));
1338
1339   insn_queue[next_q] = link;
1340   q_size += 1;
1341
1342   if (sched_verbose >= 2)
1343     {
1344       fprintf (sched_dump, ";;\t\tReady-->Q: insn %s: ",
1345                (*current_sched_info->print_insn) (insn, 0));
1346
1347       fprintf (sched_dump, "queued for %d cycles.\n", n_cycles);
1348     }
1349
1350   QUEUE_INDEX (insn) = next_q;
1351 }
1352
1353 /* Remove INSN from queue.  */
1354 static void
1355 queue_remove (rtx insn)
1356 {
1357   gcc_assert (QUEUE_INDEX (insn) >= 0);
1358   remove_free_INSN_LIST_elem (insn, &insn_queue[QUEUE_INDEX (insn)]);
1359   q_size--;
1360   QUEUE_INDEX (insn) = QUEUE_NOWHERE;
1361 }
1362
1363 /* Return a pointer to the bottom of the ready list, i.e. the insn
1364    with the lowest priority.  */
1365
1366 rtx *
1367 ready_lastpos (struct ready_list *ready)
1368 {
1369   gcc_assert (ready->n_ready >= 1);
1370   return ready->vec + ready->first - ready->n_ready + 1;
1371 }
1372
1373 /* Add an element INSN to the ready list so that it ends up with the
1374    lowest/highest priority depending on FIRST_P.  */
1375
1376 HAIFA_INLINE static void
1377 ready_add (struct ready_list *ready, rtx insn, bool first_p)
1378 {
1379   if (!first_p)
1380     {
1381       if (ready->first == ready->n_ready)
1382         {
1383           memmove (ready->vec + ready->veclen - ready->n_ready,
1384                    ready_lastpos (ready),
1385                    ready->n_ready * sizeof (rtx));
1386           ready->first = ready->veclen - 1;
1387         }
1388       ready->vec[ready->first - ready->n_ready] = insn;
1389     }
1390   else
1391     {
1392       if (ready->first == ready->veclen - 1)
1393         {
1394           if (ready->n_ready)
1395             /* ready_lastpos() fails when called with (ready->n_ready == 0).  */
1396             memmove (ready->vec + ready->veclen - ready->n_ready - 1,
1397                      ready_lastpos (ready),
1398                      ready->n_ready * sizeof (rtx));
1399           ready->first = ready->veclen - 2;
1400         }
1401       ready->vec[++(ready->first)] = insn;
1402     }
1403
1404   ready->n_ready++;
1405   if (DEBUG_INSN_P (insn))
1406     ready->n_debug++;
1407
1408   gcc_assert (QUEUE_INDEX (insn) != QUEUE_READY);
1409   QUEUE_INDEX (insn) = QUEUE_READY;
1410 }
1411
1412 /* Remove the element with the highest priority from the ready list and
1413    return it.  */
1414
1415 HAIFA_INLINE static rtx
1416 ready_remove_first (struct ready_list *ready)
1417 {
1418   rtx t;
1419
1420   gcc_assert (ready->n_ready);
1421   t = ready->vec[ready->first--];
1422   ready->n_ready--;
1423   if (DEBUG_INSN_P (t))
1424     ready->n_debug--;
1425   /* If the queue becomes empty, reset it.  */
1426   if (ready->n_ready == 0)
1427     ready->first = ready->veclen - 1;
1428
1429   gcc_assert (QUEUE_INDEX (t) == QUEUE_READY);
1430   QUEUE_INDEX (t) = QUEUE_NOWHERE;
1431
1432   return t;
1433 }
1434
1435 /* The following code implements multi-pass scheduling for the first
1436    cycle.  In other words, we will try to choose ready insn which
1437    permits to start maximum number of insns on the same cycle.  */
1438
1439 /* Return a pointer to the element INDEX from the ready.  INDEX for
1440    insn with the highest priority is 0, and the lowest priority has
1441    N_READY - 1.  */
1442
1443 rtx
1444 ready_element (struct ready_list *ready, int index)
1445 {
1446   gcc_assert (ready->n_ready && index < ready->n_ready);
1447
1448   return ready->vec[ready->first - index];
1449 }
1450
1451 /* Remove the element INDEX from the ready list and return it.  INDEX
1452    for insn with the highest priority is 0, and the lowest priority
1453    has N_READY - 1.  */
1454
1455 HAIFA_INLINE static rtx
1456 ready_remove (struct ready_list *ready, int index)
1457 {
1458   rtx t;
1459   int i;
1460
1461   if (index == 0)
1462     return ready_remove_first (ready);
1463   gcc_assert (ready->n_ready && index < ready->n_ready);
1464   t = ready->vec[ready->first - index];
1465   ready->n_ready--;
1466   if (DEBUG_INSN_P (t))
1467     ready->n_debug--;
1468   for (i = index; i < ready->n_ready; i++)
1469     ready->vec[ready->first - i] = ready->vec[ready->first - i - 1];
1470   QUEUE_INDEX (t) = QUEUE_NOWHERE;
1471   return t;
1472 }
1473
1474 /* Remove INSN from the ready list.  */
1475 static void
1476 ready_remove_insn (rtx insn)
1477 {
1478   int i;
1479
1480   for (i = 0; i < readyp->n_ready; i++)
1481     if (ready_element (readyp, i) == insn)
1482       {
1483         ready_remove (readyp, i);
1484         return;
1485       }
1486   gcc_unreachable ();
1487 }
1488
1489 /* Sort the ready list READY by ascending priority, using the SCHED_SORT
1490    macro.  */
1491
1492 void
1493 ready_sort (struct ready_list *ready)
1494 {
1495   int i;
1496   rtx *first = ready_lastpos (ready);
1497
1498   if (sched_pressure_p)
1499     {
1500       for (i = 0; i < ready->n_ready; i++)
1501         setup_insn_reg_pressure_info (first[i]);
1502     }
1503   SCHED_SORT (first, ready->n_ready);
1504 }
1505
1506 /* PREV is an insn that is ready to execute.  Adjust its priority if that
1507    will help shorten or lengthen register lifetimes as appropriate.  Also
1508    provide a hook for the target to tweak itself.  */
1509
1510 HAIFA_INLINE static void
1511 adjust_priority (rtx prev)
1512 {
1513   /* ??? There used to be code here to try and estimate how an insn
1514      affected register lifetimes, but it did it by looking at REG_DEAD
1515      notes, which we removed in schedule_region.  Nor did it try to
1516      take into account register pressure or anything useful like that.
1517
1518      Revisit when we have a machine model to work with and not before.  */
1519
1520   if (targetm.sched.adjust_priority)
1521     INSN_PRIORITY (prev) =
1522       targetm.sched.adjust_priority (prev, INSN_PRIORITY (prev));
1523 }
1524
1525 /* Advance DFA state STATE on one cycle.  */
1526 void
1527 advance_state (state_t state)
1528 {
1529   if (targetm.sched.dfa_pre_advance_cycle)
1530     targetm.sched.dfa_pre_advance_cycle ();
1531
1532   if (targetm.sched.dfa_pre_cycle_insn)
1533     state_transition (state,
1534                       targetm.sched.dfa_pre_cycle_insn ());
1535
1536   state_transition (state, NULL);
1537
1538   if (targetm.sched.dfa_post_cycle_insn)
1539     state_transition (state,
1540                       targetm.sched.dfa_post_cycle_insn ());
1541
1542   if (targetm.sched.dfa_post_advance_cycle)
1543     targetm.sched.dfa_post_advance_cycle ();
1544 }
1545
1546 /* Advance time on one cycle.  */
1547 HAIFA_INLINE static void
1548 advance_one_cycle (void)
1549 {
1550   advance_state (curr_state);
1551   if (sched_verbose >= 6)
1552     fprintf (sched_dump, ";;\tAdvanced a state.\n");
1553 }
1554
1555 /* Clock at which the previous instruction was issued.  */
1556 static int last_clock_var;
1557
1558 /* Update register pressure after scheduling INSN.  */
1559 static void
1560 update_register_pressure (rtx insn)
1561 {
1562   struct reg_use_data *use;
1563   struct reg_set_data *set;
1564
1565   for (use = INSN_REG_USE_LIST (insn); use != NULL; use = use->next_insn_use)
1566     if (dying_use_p (use) && bitmap_bit_p (curr_reg_live, use->regno))
1567       mark_regno_birth_or_death (use->regno, false);
1568   for (set = INSN_REG_SET_LIST (insn); set != NULL; set = set->next_insn_set)
1569     mark_regno_birth_or_death (set->regno, true);
1570 }
1571
1572 /* Set up or update (if UPDATE_P) max register pressure (see its
1573    meaning in sched-int.h::_haifa_insn_data) for all current BB insns
1574    after insn AFTER.  */
1575 static void
1576 setup_insn_max_reg_pressure (rtx after, bool update_p)
1577 {
1578   int i, p;
1579   bool eq_p;
1580   rtx insn;
1581   static int max_reg_pressure[N_REG_CLASSES];
1582
1583   save_reg_pressure ();
1584   for (i = 0; i < ira_reg_class_cover_size; i++)
1585     max_reg_pressure[ira_reg_class_cover[i]]
1586       = curr_reg_pressure[ira_reg_class_cover[i]];
1587   for (insn = NEXT_INSN (after);
1588        insn != NULL_RTX && BLOCK_FOR_INSN (insn) == BLOCK_FOR_INSN (after);
1589        insn = NEXT_INSN (insn))
1590     if (NONDEBUG_INSN_P (insn))
1591       {
1592         eq_p = true;
1593         for (i = 0; i < ira_reg_class_cover_size; i++)
1594           {
1595             p = max_reg_pressure[ira_reg_class_cover[i]];
1596             if (INSN_MAX_REG_PRESSURE (insn)[i] != p)
1597               {
1598                 eq_p = false;
1599                 INSN_MAX_REG_PRESSURE (insn)[i]
1600                   = max_reg_pressure[ira_reg_class_cover[i]];
1601               }
1602           }
1603         if (update_p && eq_p)
1604           break;
1605         update_register_pressure (insn);
1606         for (i = 0; i < ira_reg_class_cover_size; i++)
1607           if (max_reg_pressure[ira_reg_class_cover[i]]
1608               < curr_reg_pressure[ira_reg_class_cover[i]])
1609             max_reg_pressure[ira_reg_class_cover[i]]
1610               = curr_reg_pressure[ira_reg_class_cover[i]];
1611       }
1612   restore_reg_pressure ();
1613 }
1614
1615 /* Update the current register pressure after scheduling INSN.  Update
1616    also max register pressure for unscheduled insns of the current
1617    BB.  */
1618 static void
1619 update_reg_and_insn_max_reg_pressure (rtx insn)
1620 {
1621   int i;
1622   int before[N_REG_CLASSES];
1623
1624   for (i = 0; i < ira_reg_class_cover_size; i++)
1625     before[i] = curr_reg_pressure[ira_reg_class_cover[i]];
1626   update_register_pressure (insn);
1627   for (i = 0; i < ira_reg_class_cover_size; i++)
1628     if (curr_reg_pressure[ira_reg_class_cover[i]] != before[i])
1629       break;
1630   if (i < ira_reg_class_cover_size)
1631     setup_insn_max_reg_pressure (insn, true);
1632 }
1633
1634 /* Set up register pressure at the beginning of basic block BB whose
1635    insns starting after insn AFTER.  Set up also max register pressure
1636    for all insns of the basic block.  */
1637 void
1638 sched_setup_bb_reg_pressure_info (basic_block bb, rtx after)
1639 {
1640   gcc_assert (sched_pressure_p);
1641   initiate_bb_reg_pressure_info (bb);
1642   setup_insn_max_reg_pressure (after, false);
1643 }
1644
1645 /* INSN is the "currently executing insn".  Launch each insn which was
1646    waiting on INSN.  READY is the ready list which contains the insns
1647    that are ready to fire.  CLOCK is the current cycle.  The function
1648    returns necessary cycle advance after issuing the insn (it is not
1649    zero for insns in a schedule group).  */
1650
1651 static int
1652 schedule_insn (rtx insn)
1653 {
1654   sd_iterator_def sd_it;
1655   dep_t dep;
1656   int i;
1657   int advance = 0;
1658
1659   if (sched_verbose >= 1)
1660     {
1661       struct reg_pressure_data *pressure_info;
1662       char buf[2048];
1663
1664       print_insn (buf, insn, 0);
1665       buf[40] = 0;
1666       fprintf (sched_dump, ";;\t%3i--> %-40s:", clock_var, buf);
1667
1668       if (recog_memoized (insn) < 0)
1669         fprintf (sched_dump, "nothing");
1670       else
1671         print_reservation (sched_dump, insn);
1672       pressure_info = INSN_REG_PRESSURE (insn);
1673       if (pressure_info != NULL)
1674         {
1675           fputc (':', sched_dump);
1676           for (i = 0; i < ira_reg_class_cover_size; i++)
1677             fprintf (sched_dump, "%s%+d(%d)",
1678                      reg_class_names[ira_reg_class_cover[i]],
1679                      pressure_info[i].set_increase, pressure_info[i].change);
1680         }
1681       fputc ('\n', sched_dump);
1682     }
1683
1684   if (sched_pressure_p)
1685     update_reg_and_insn_max_reg_pressure (insn);
1686
1687   /* Scheduling instruction should have all its dependencies resolved and
1688      should have been removed from the ready list.  */
1689   gcc_assert (sd_lists_empty_p (insn, SD_LIST_BACK));
1690
1691   /* Reset debug insns invalidated by moving this insn.  */
1692   if (MAY_HAVE_DEBUG_INSNS && !DEBUG_INSN_P (insn))
1693     for (sd_it = sd_iterator_start (insn, SD_LIST_BACK);
1694          sd_iterator_cond (&sd_it, &dep);)
1695       {
1696         rtx dbg = DEP_PRO (dep);
1697
1698         gcc_assert (DEBUG_INSN_P (dbg));
1699
1700         if (sched_verbose >= 6)
1701           fprintf (sched_dump, ";;\t\tresetting: debug insn %d\n",
1702                    INSN_UID (dbg));
1703
1704         /* ??? Rather than resetting the debug insn, we might be able
1705            to emit a debug temp before the just-scheduled insn, but
1706            this would involve checking that the expression at the
1707            point of the debug insn is equivalent to the expression
1708            before the just-scheduled insn.  They might not be: the
1709            expression in the debug insn may depend on other insns not
1710            yet scheduled that set MEMs, REGs or even other debug
1711            insns.  It's not clear that attempting to preserve debug
1712            information in these cases is worth the effort, given how
1713            uncommon these resets are and the likelihood that the debug
1714            temps introduced won't survive the schedule change.  */
1715         INSN_VAR_LOCATION_LOC (dbg) = gen_rtx_UNKNOWN_VAR_LOC ();
1716         df_insn_rescan (dbg);
1717
1718         /* We delete rather than resolve these deps, otherwise we
1719            crash in sched_free_deps(), because forward deps are
1720            expected to be released before backward deps.  */
1721         sd_delete_dep (sd_it);
1722       }
1723
1724   gcc_assert (QUEUE_INDEX (insn) == QUEUE_NOWHERE);
1725   QUEUE_INDEX (insn) = QUEUE_SCHEDULED;
1726
1727   gcc_assert (INSN_TICK (insn) >= MIN_TICK);
1728   if (INSN_TICK (insn) > clock_var)
1729     /* INSN has been prematurely moved from the queue to the ready list.
1730        This is possible only if following flag is set.  */
1731     gcc_assert (flag_sched_stalled_insns);
1732
1733   /* ??? Probably, if INSN is scheduled prematurely, we should leave
1734      INSN_TICK untouched.  This is a machine-dependent issue, actually.  */
1735   INSN_TICK (insn) = clock_var;
1736
1737   /* Update dependent instructions.  */
1738   for (sd_it = sd_iterator_start (insn, SD_LIST_FORW);
1739        sd_iterator_cond (&sd_it, &dep);)
1740     {
1741       rtx next = DEP_CON (dep);
1742
1743       /* Resolve the dependence between INSN and NEXT.
1744          sd_resolve_dep () moves current dep to another list thus
1745          advancing the iterator.  */
1746       sd_resolve_dep (sd_it);
1747
1748       /* Don't bother trying to mark next as ready if insn is a debug
1749          insn.  If insn is the last hard dependency, it will have
1750          already been discounted.  */
1751       if (DEBUG_INSN_P (insn) && !DEBUG_INSN_P (next))
1752         continue;
1753
1754       if (!IS_SPECULATION_BRANCHY_CHECK_P (insn))
1755         {
1756           int effective_cost;
1757
1758           effective_cost = try_ready (next);
1759
1760           if (effective_cost >= 0
1761               && SCHED_GROUP_P (next)
1762               && advance < effective_cost)
1763             advance = effective_cost;
1764         }
1765       else
1766         /* Check always has only one forward dependence (to the first insn in
1767            the recovery block), therefore, this will be executed only once.  */
1768         {
1769           gcc_assert (sd_lists_empty_p (insn, SD_LIST_FORW));
1770           fix_recovery_deps (RECOVERY_BLOCK (insn));
1771         }
1772     }
1773
1774   /* This is the place where scheduler doesn't *basically* need backward and
1775      forward dependencies for INSN anymore.  Nevertheless they are used in
1776      heuristics in rank_for_schedule (), early_queue_to_ready () and in
1777      some targets (e.g. rs6000).  Thus the earliest place where we *can*
1778      remove dependencies is after targetm.sched.md_finish () call in
1779      schedule_block ().  But, on the other side, the safest place to remove
1780      dependencies is when we are finishing scheduling entire region.  As we
1781      don't generate [many] dependencies during scheduling itself, we won't
1782      need memory until beginning of next region.
1783      Bottom line: Dependencies are removed for all insns in the end of
1784      scheduling the region.  */
1785
1786   /* Annotate the instruction with issue information -- TImode
1787      indicates that the instruction is expected not to be able
1788      to issue on the same cycle as the previous insn.  A machine
1789      may use this information to decide how the instruction should
1790      be aligned.  */
1791   if (issue_rate > 1
1792       && GET_CODE (PATTERN (insn)) != USE
1793       && GET_CODE (PATTERN (insn)) != CLOBBER
1794       && !DEBUG_INSN_P (insn))
1795     {
1796       if (reload_completed)
1797         PUT_MODE (insn, clock_var > last_clock_var ? TImode : VOIDmode);
1798       last_clock_var = clock_var;
1799     }
1800
1801   return advance;
1802 }
1803
1804 /* Functions for handling of notes.  */
1805
1806 /* Insert the INSN note at the end of the notes list.  */
1807 static void
1808 add_to_note_list (rtx insn, rtx *note_list_end_p)
1809 {
1810   PREV_INSN (insn) = *note_list_end_p;
1811   if (*note_list_end_p)
1812     NEXT_INSN (*note_list_end_p) = insn;
1813   *note_list_end_p = insn;
1814 }
1815
1816 /* Add note list that ends on FROM_END to the end of TO_ENDP.  */
1817 void
1818 concat_note_lists (rtx from_end, rtx *to_endp)
1819 {
1820   rtx from_start;
1821
1822   if (from_end == NULL)
1823     /* It's easy when have nothing to concat.  */
1824     return;
1825
1826   if (*to_endp == NULL)
1827     /* It's also easy when destination is empty.  */
1828     {
1829       *to_endp = from_end;
1830       return;
1831     }
1832
1833   from_start = from_end;
1834   /* A note list should be traversed via PREV_INSN.  */
1835   while (PREV_INSN (from_start) != NULL)
1836     from_start = PREV_INSN (from_start);
1837
1838   add_to_note_list (from_start, to_endp);
1839   *to_endp = from_end;
1840 }
1841
1842 /* Delete notes beginning with INSN and put them in the chain
1843    of notes ended by NOTE_LIST.
1844    Returns the insn following the notes.  */
1845 static rtx
1846 unlink_other_notes (rtx insn, rtx tail)
1847 {
1848   rtx prev = PREV_INSN (insn);
1849
1850   while (insn != tail && NOTE_NOT_BB_P (insn))
1851     {
1852       rtx next = NEXT_INSN (insn);
1853       basic_block bb = BLOCK_FOR_INSN (insn);
1854
1855       /* Delete the note from its current position.  */
1856       if (prev)
1857         NEXT_INSN (prev) = next;
1858       if (next)
1859         PREV_INSN (next) = prev;
1860
1861       if (bb)
1862         {
1863           /* Basic block can begin with either LABEL or
1864              NOTE_INSN_BASIC_BLOCK.  */
1865           gcc_assert (BB_HEAD (bb) != insn);
1866
1867           /* Check if we are removing last insn in the BB.  */
1868           if (BB_END (bb) == insn)
1869             BB_END (bb) = prev;
1870         }
1871
1872       /* See sched_analyze to see how these are handled.  */
1873       if (NOTE_KIND (insn) != NOTE_INSN_EH_REGION_BEG
1874           && NOTE_KIND (insn) != NOTE_INSN_EH_REGION_END)
1875         add_to_note_list (insn, &note_list);
1876
1877       insn = next;
1878     }
1879
1880   if (insn == tail)
1881     {
1882       gcc_assert (sel_sched_p ());
1883       return prev;
1884     }
1885
1886   return insn;
1887 }
1888
1889 /* Return the head and tail pointers of ebb starting at BEG and ending
1890    at END.  */
1891 void
1892 get_ebb_head_tail (basic_block beg, basic_block end, rtx *headp, rtx *tailp)
1893 {
1894   rtx beg_head = BB_HEAD (beg);
1895   rtx beg_tail = BB_END (beg);
1896   rtx end_head = BB_HEAD (end);
1897   rtx end_tail = BB_END (end);
1898
1899   /* Don't include any notes or labels at the beginning of the BEG
1900      basic block, or notes at the end of the END basic blocks.  */
1901
1902   if (LABEL_P (beg_head))
1903     beg_head = NEXT_INSN (beg_head);
1904
1905   while (beg_head != beg_tail)
1906     if (NOTE_P (beg_head) || BOUNDARY_DEBUG_INSN_P (beg_head))
1907       beg_head = NEXT_INSN (beg_head);
1908     else
1909       break;
1910
1911   *headp = beg_head;
1912
1913   if (beg == end)
1914     end_head = beg_head;
1915   else if (LABEL_P (end_head))
1916     end_head = NEXT_INSN (end_head);
1917
1918   while (end_head != end_tail)
1919     if (NOTE_P (end_tail) || BOUNDARY_DEBUG_INSN_P (end_tail))
1920       end_tail = PREV_INSN (end_tail);
1921     else
1922       break;
1923
1924   *tailp = end_tail;
1925 }
1926
1927 /* Return nonzero if there are no real insns in the range [ HEAD, TAIL ].  */
1928
1929 int
1930 no_real_insns_p (const_rtx head, const_rtx tail)
1931 {
1932   while (head != NEXT_INSN (tail))
1933     {
1934       if (!NOTE_P (head) && !LABEL_P (head)
1935           && !BOUNDARY_DEBUG_INSN_P (head))
1936         return 0;
1937       head = NEXT_INSN (head);
1938     }
1939   return 1;
1940 }
1941
1942 /* Delete notes between HEAD and TAIL and put them in the chain
1943    of notes ended by NOTE_LIST.  */
1944 static void
1945 rm_other_notes (rtx head, rtx tail)
1946 {
1947   rtx next_tail;
1948   rtx insn;
1949
1950   note_list = 0;
1951   if (head == tail && (! INSN_P (head)))
1952     return;
1953
1954   next_tail = NEXT_INSN (tail);
1955   for (insn = head; insn != next_tail; insn = NEXT_INSN (insn))
1956     {
1957       rtx prev;
1958
1959       /* Farm out notes, and maybe save them in NOTE_LIST.
1960          This is needed to keep the debugger from
1961          getting completely deranged.  */
1962       if (NOTE_NOT_BB_P (insn))
1963         {
1964           prev = insn;
1965           insn = unlink_other_notes (insn, next_tail);
1966
1967           gcc_assert ((sel_sched_p ()
1968                        || prev != tail) && prev != head && insn != next_tail);
1969         }
1970     }
1971 }
1972
1973 /* Same as above, but also process REG_SAVE_NOTEs of HEAD.  */
1974 void
1975 remove_notes (rtx head, rtx tail)
1976 {
1977   /* rm_other_notes only removes notes which are _inside_ the
1978      block---that is, it won't remove notes before the first real insn
1979      or after the last real insn of the block.  So if the first insn
1980      has a REG_SAVE_NOTE which would otherwise be emitted before the
1981      insn, it is redundant with the note before the start of the
1982      block, and so we have to take it out.  */
1983   if (INSN_P (head))
1984     {
1985       rtx note;
1986
1987       for (note = REG_NOTES (head); note; note = XEXP (note, 1))
1988         if (REG_NOTE_KIND (note) == REG_SAVE_NOTE)
1989           remove_note (head, note);
1990     }
1991
1992   /* Remove remaining note insns from the block, save them in
1993      note_list.  These notes are restored at the end of
1994      schedule_block ().  */
1995   rm_other_notes (head, tail);
1996 }
1997
1998 /* Restore-other-notes: NOTE_LIST is the end of a chain of notes
1999    previously found among the insns.  Insert them just before HEAD.  */
2000 rtx
2001 restore_other_notes (rtx head, basic_block head_bb)
2002 {
2003   if (note_list != 0)
2004     {
2005       rtx note_head = note_list;
2006
2007       if (head)
2008         head_bb = BLOCK_FOR_INSN (head);
2009       else
2010         head = NEXT_INSN (bb_note (head_bb));
2011
2012       while (PREV_INSN (note_head))
2013         {
2014           set_block_for_insn (note_head, head_bb);
2015           note_head = PREV_INSN (note_head);
2016         }
2017       /* In the above cycle we've missed this note.  */
2018       set_block_for_insn (note_head, head_bb);
2019
2020       PREV_INSN (note_head) = PREV_INSN (head);
2021       NEXT_INSN (PREV_INSN (head)) = note_head;
2022       PREV_INSN (head) = note_list;
2023       NEXT_INSN (note_list) = head;
2024
2025       if (BLOCK_FOR_INSN (head) != head_bb)
2026         BB_END (head_bb) = note_list;
2027
2028       head = note_head;
2029     }
2030
2031   return head;
2032 }
2033
2034 /* Move insns that became ready to fire from queue to ready list.  */
2035
2036 static void
2037 queue_to_ready (struct ready_list *ready)
2038 {
2039   rtx insn;
2040   rtx link;
2041   rtx skip_insn;
2042
2043   q_ptr = NEXT_Q (q_ptr);
2044
2045   if (dbg_cnt (sched_insn) == false)
2046     {
2047       /* If debug counter is activated do not requeue insn next after
2048          last_scheduled_insn.  */
2049       skip_insn = next_nonnote_insn (last_scheduled_insn);
2050       while (skip_insn && DEBUG_INSN_P (skip_insn))
2051         skip_insn = next_nonnote_insn (skip_insn);
2052     }
2053   else
2054     skip_insn = NULL_RTX;
2055
2056   /* Add all pending insns that can be scheduled without stalls to the
2057      ready list.  */
2058   for (link = insn_queue[q_ptr]; link; link = XEXP (link, 1))
2059     {
2060       insn = XEXP (link, 0);
2061       q_size -= 1;
2062
2063       if (sched_verbose >= 2)
2064         fprintf (sched_dump, ";;\t\tQ-->Ready: insn %s: ",
2065                  (*current_sched_info->print_insn) (insn, 0));
2066
2067       /* If the ready list is full, delay the insn for 1 cycle.
2068          See the comment in schedule_block for the rationale.  */
2069       if (!reload_completed
2070           && ready->n_ready - ready->n_debug > MAX_SCHED_READY_INSNS
2071           && !SCHED_GROUP_P (insn)
2072           && insn != skip_insn)
2073         {
2074           if (sched_verbose >= 2)
2075             fprintf (sched_dump, "requeued because ready full\n");
2076           queue_insn (insn, 1);
2077         }
2078       else
2079         {
2080           ready_add (ready, insn, false);
2081           if (sched_verbose >= 2)
2082             fprintf (sched_dump, "moving to ready without stalls\n");
2083         }
2084     }
2085   free_INSN_LIST_list (&insn_queue[q_ptr]);
2086
2087   /* If there are no ready insns, stall until one is ready and add all
2088      of the pending insns at that point to the ready list.  */
2089   if (ready->n_ready == 0)
2090     {
2091       int stalls;
2092
2093       for (stalls = 1; stalls <= max_insn_queue_index; stalls++)
2094         {
2095           if ((link = insn_queue[NEXT_Q_AFTER (q_ptr, stalls)]))
2096             {
2097               for (; link; link = XEXP (link, 1))
2098                 {
2099                   insn = XEXP (link, 0);
2100                   q_size -= 1;
2101
2102                   if (sched_verbose >= 2)
2103                     fprintf (sched_dump, ";;\t\tQ-->Ready: insn %s: ",
2104                              (*current_sched_info->print_insn) (insn, 0));
2105
2106                   ready_add (ready, insn, false);
2107                   if (sched_verbose >= 2)
2108                     fprintf (sched_dump, "moving to ready with %d stalls\n", stalls);
2109                 }
2110               free_INSN_LIST_list (&insn_queue[NEXT_Q_AFTER (q_ptr, stalls)]);
2111
2112               advance_one_cycle ();
2113
2114               break;
2115             }
2116
2117           advance_one_cycle ();
2118         }
2119
2120       q_ptr = NEXT_Q_AFTER (q_ptr, stalls);
2121       clock_var += stalls;
2122     }
2123 }
2124
2125 /* Used by early_queue_to_ready.  Determines whether it is "ok" to
2126    prematurely move INSN from the queue to the ready list.  Currently,
2127    if a target defines the hook 'is_costly_dependence', this function
2128    uses the hook to check whether there exist any dependences which are
2129    considered costly by the target, between INSN and other insns that
2130    have already been scheduled.  Dependences are checked up to Y cycles
2131    back, with default Y=1; The flag -fsched-stalled-insns-dep=Y allows
2132    controlling this value.
2133    (Other considerations could be taken into account instead (or in
2134    addition) depending on user flags and target hooks.  */
2135
2136 static bool
2137 ok_for_early_queue_removal (rtx insn)
2138 {
2139   int n_cycles;
2140   rtx prev_insn = last_scheduled_insn;
2141
2142   if (targetm.sched.is_costly_dependence)
2143     {
2144       for (n_cycles = flag_sched_stalled_insns_dep; n_cycles; n_cycles--)
2145         {
2146           for ( ; prev_insn; prev_insn = PREV_INSN (prev_insn))
2147             {
2148               int cost;
2149
2150               if (prev_insn == current_sched_info->prev_head)
2151                 {
2152                   prev_insn = NULL;
2153                   break;
2154                 }
2155
2156               if (!NOTE_P (prev_insn))
2157                 {
2158                   dep_t dep;
2159
2160                   dep = sd_find_dep_between (prev_insn, insn, true);
2161
2162                   if (dep != NULL)
2163                     {
2164                       cost = dep_cost (dep);
2165
2166                       if (targetm.sched.is_costly_dependence (dep, cost,
2167                                 flag_sched_stalled_insns_dep - n_cycles))
2168                         return false;
2169                     }
2170                 }
2171
2172               if (GET_MODE (prev_insn) == TImode) /* end of dispatch group */
2173                 break;
2174             }
2175
2176           if (!prev_insn)
2177             break;
2178           prev_insn = PREV_INSN (prev_insn);
2179         }
2180     }
2181
2182   return true;
2183 }
2184
2185
2186 /* Remove insns from the queue, before they become "ready" with respect
2187    to FU latency considerations.  */
2188
2189 static int
2190 early_queue_to_ready (state_t state, struct ready_list *ready)
2191 {
2192   rtx insn;
2193   rtx link;
2194   rtx next_link;
2195   rtx prev_link;
2196   bool move_to_ready;
2197   int cost;
2198   state_t temp_state = alloca (dfa_state_size);
2199   int stalls;
2200   int insns_removed = 0;
2201
2202   /*
2203      Flag '-fsched-stalled-insns=X' determines the aggressiveness of this
2204      function:
2205
2206      X == 0: There is no limit on how many queued insns can be removed
2207              prematurely.  (flag_sched_stalled_insns = -1).
2208
2209      X >= 1: Only X queued insns can be removed prematurely in each
2210              invocation.  (flag_sched_stalled_insns = X).
2211
2212      Otherwise: Early queue removal is disabled.
2213          (flag_sched_stalled_insns = 0)
2214   */
2215
2216   if (! flag_sched_stalled_insns)
2217     return 0;
2218
2219   for (stalls = 0; stalls <= max_insn_queue_index; stalls++)
2220     {
2221       if ((link = insn_queue[NEXT_Q_AFTER (q_ptr, stalls)]))
2222         {
2223           if (sched_verbose > 6)
2224             fprintf (sched_dump, ";; look at index %d + %d\n", q_ptr, stalls);
2225
2226           prev_link = 0;
2227           while (link)
2228             {
2229               next_link = XEXP (link, 1);
2230               insn = XEXP (link, 0);
2231               if (insn && sched_verbose > 6)
2232                 print_rtl_single (sched_dump, insn);
2233
2234               memcpy (temp_state, state, dfa_state_size);
2235               if (recog_memoized (insn) < 0)
2236                 /* non-negative to indicate that it's not ready
2237                    to avoid infinite Q->R->Q->R... */
2238                 cost = 0;
2239               else
2240                 cost = state_transition (temp_state, insn);
2241
2242               if (sched_verbose >= 6)
2243                 fprintf (sched_dump, "transition cost = %d\n", cost);
2244
2245               move_to_ready = false;
2246               if (cost < 0)
2247                 {
2248                   move_to_ready = ok_for_early_queue_removal (insn);
2249                   if (move_to_ready == true)
2250                     {
2251                       /* move from Q to R */
2252                       q_size -= 1;
2253                       ready_add (ready, insn, false);
2254
2255                       if (prev_link)
2256                         XEXP (prev_link, 1) = next_link;
2257                       else
2258                         insn_queue[NEXT_Q_AFTER (q_ptr, stalls)] = next_link;
2259
2260                       free_INSN_LIST_node (link);
2261
2262                       if (sched_verbose >= 2)
2263                         fprintf (sched_dump, ";;\t\tEarly Q-->Ready: insn %s\n",
2264                                  (*current_sched_info->print_insn) (insn, 0));
2265
2266                       insns_removed++;
2267                       if (insns_removed == flag_sched_stalled_insns)
2268                         /* Remove no more than flag_sched_stalled_insns insns
2269                            from Q at a time.  */
2270                         return insns_removed;
2271                     }
2272                 }
2273
2274               if (move_to_ready == false)
2275                 prev_link = link;
2276
2277               link = next_link;
2278             } /* while link */
2279         } /* if link */
2280
2281     } /* for stalls.. */
2282
2283   return insns_removed;
2284 }
2285
2286
2287 /* Print the ready list for debugging purposes.  Callable from debugger.  */
2288
2289 static void
2290 debug_ready_list (struct ready_list *ready)
2291 {
2292   rtx *p;
2293   int i;
2294
2295   if (ready->n_ready == 0)
2296     {
2297       fprintf (sched_dump, "\n");
2298       return;
2299     }
2300
2301   p = ready_lastpos (ready);
2302   for (i = 0; i < ready->n_ready; i++)
2303     {
2304       fprintf (sched_dump, "  %s:%d",
2305                (*current_sched_info->print_insn) (p[i], 0),
2306                INSN_LUID (p[i]));
2307       if (sched_pressure_p)
2308         fprintf (sched_dump, "(cost=%d",
2309                  INSN_REG_PRESSURE_EXCESS_COST_CHANGE (p[i]));
2310       if (INSN_TICK (p[i]) > clock_var)
2311         fprintf (sched_dump, ":delay=%d", INSN_TICK (p[i]) - clock_var);
2312       if (sched_pressure_p)
2313         fprintf (sched_dump, ")");
2314     }
2315   fprintf (sched_dump, "\n");
2316 }
2317
2318 /* Search INSN for REG_SAVE_NOTE note pairs for
2319    NOTE_INSN_EHREGION_{BEG,END}; and convert them back into
2320    NOTEs.  The REG_SAVE_NOTE note following first one is contains the
2321    saved value for NOTE_BLOCK_NUMBER which is useful for
2322    NOTE_INSN_EH_REGION_{BEG,END} NOTEs.  */
2323 void
2324 reemit_notes (rtx insn)
2325 {
2326   rtx note, last = insn;
2327
2328   for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
2329     {
2330       if (REG_NOTE_KIND (note) == REG_SAVE_NOTE)
2331         {
2332           enum insn_note note_type = (enum insn_note) INTVAL (XEXP (note, 0));
2333
2334           last = emit_note_before (note_type, last);
2335           remove_note (insn, note);
2336         }
2337     }
2338 }
2339
2340 /* Move INSN.  Reemit notes if needed.  Update CFG, if needed.  */
2341 static void
2342 move_insn (rtx insn, rtx last, rtx nt)
2343 {
2344   if (PREV_INSN (insn) != last)
2345     {
2346       basic_block bb;
2347       rtx note;
2348       int jump_p = 0;
2349
2350       bb = BLOCK_FOR_INSN (insn);
2351
2352       /* BB_HEAD is either LABEL or NOTE.  */
2353       gcc_assert (BB_HEAD (bb) != insn);
2354
2355       if (BB_END (bb) == insn)
2356         /* If this is last instruction in BB, move end marker one
2357            instruction up.  */
2358         {
2359           /* Jumps are always placed at the end of basic block.  */
2360           jump_p = control_flow_insn_p (insn);
2361
2362           gcc_assert (!jump_p
2363                       || ((common_sched_info->sched_pass_id == SCHED_RGN_PASS)
2364                           && IS_SPECULATION_BRANCHY_CHECK_P (insn))
2365                       || (common_sched_info->sched_pass_id
2366                           == SCHED_EBB_PASS));
2367
2368           gcc_assert (BLOCK_FOR_INSN (PREV_INSN (insn)) == bb);
2369
2370           BB_END (bb) = PREV_INSN (insn);
2371         }
2372
2373       gcc_assert (BB_END (bb) != last);
2374
2375       if (jump_p)
2376         /* We move the block note along with jump.  */
2377         {
2378           gcc_assert (nt);
2379
2380           note = NEXT_INSN (insn);
2381           while (NOTE_NOT_BB_P (note) && note != nt)
2382             note = NEXT_INSN (note);
2383
2384           if (note != nt
2385               && (LABEL_P (note)
2386                   || BARRIER_P (note)))
2387             note = NEXT_INSN (note);
2388
2389           gcc_assert (NOTE_INSN_BASIC_BLOCK_P (note));
2390         }
2391       else
2392         note = insn;
2393
2394       NEXT_INSN (PREV_INSN (insn)) = NEXT_INSN (note);
2395       PREV_INSN (NEXT_INSN (note)) = PREV_INSN (insn);
2396
2397       NEXT_INSN (note) = NEXT_INSN (last);
2398       PREV_INSN (NEXT_INSN (last)) = note;
2399
2400       NEXT_INSN (last) = insn;
2401       PREV_INSN (insn) = last;
2402
2403       bb = BLOCK_FOR_INSN (last);
2404
2405       if (jump_p)
2406         {
2407           fix_jump_move (insn);
2408
2409           if (BLOCK_FOR_INSN (insn) != bb)
2410             move_block_after_check (insn);
2411
2412           gcc_assert (BB_END (bb) == last);
2413         }
2414
2415       df_insn_change_bb (insn, bb);
2416
2417       /* Update BB_END, if needed.  */
2418       if (BB_END (bb) == last)
2419         BB_END (bb) = insn;
2420     }
2421
2422   SCHED_GROUP_P (insn) = 0;
2423 }
2424
2425 /* Return true if scheduling INSN will finish current clock cycle.  */
2426 static bool
2427 insn_finishes_cycle_p (rtx insn)
2428 {
2429   if (SCHED_GROUP_P (insn))
2430     /* After issuing INSN, rest of the sched_group will be forced to issue
2431        in order.  Don't make any plans for the rest of cycle.  */
2432     return true;
2433
2434   /* Finishing the block will, apparently, finish the cycle.  */
2435   if (current_sched_info->insn_finishes_block_p
2436       && current_sched_info->insn_finishes_block_p (insn))
2437     return true;
2438
2439   return false;
2440 }
2441
2442 /* The following structure describe an entry of the stack of choices.  */
2443 struct choice_entry
2444 {
2445   /* Ordinal number of the issued insn in the ready queue.  */
2446   int index;
2447   /* The number of the rest insns whose issues we should try.  */
2448   int rest;
2449   /* The number of issued essential insns.  */
2450   int n;
2451   /* State after issuing the insn.  */
2452   state_t state;
2453 };
2454
2455 /* The following array is used to implement a stack of choices used in
2456    function max_issue.  */
2457 static struct choice_entry *choice_stack;
2458
2459 /* The following variable value is number of essential insns issued on
2460    the current cycle.  An insn is essential one if it changes the
2461    processors state.  */
2462 int cycle_issued_insns;
2463
2464 /* This holds the value of the target dfa_lookahead hook.  */
2465 int dfa_lookahead;
2466
2467 /* The following variable value is maximal number of tries of issuing
2468    insns for the first cycle multipass insn scheduling.  We define
2469    this value as constant*(DFA_LOOKAHEAD**ISSUE_RATE).  We would not
2470    need this constraint if all real insns (with non-negative codes)
2471    had reservations because in this case the algorithm complexity is
2472    O(DFA_LOOKAHEAD**ISSUE_RATE).  Unfortunately, the dfa descriptions
2473    might be incomplete and such insn might occur.  For such
2474    descriptions, the complexity of algorithm (without the constraint)
2475    could achieve DFA_LOOKAHEAD ** N , where N is the queue length.  */
2476 static int max_lookahead_tries;
2477
2478 /* The following value is value of hook
2479    `first_cycle_multipass_dfa_lookahead' at the last call of
2480    `max_issue'.  */
2481 static int cached_first_cycle_multipass_dfa_lookahead = 0;
2482
2483 /* The following value is value of `issue_rate' at the last call of
2484    `sched_init'.  */
2485 static int cached_issue_rate = 0;
2486
2487 /* The following function returns maximal (or close to maximal) number
2488    of insns which can be issued on the same cycle and one of which
2489    insns is insns with the best rank (the first insn in READY).  To
2490    make this function tries different samples of ready insns.  READY
2491    is current queue `ready'.  Global array READY_TRY reflects what
2492    insns are already issued in this try.  MAX_POINTS is the sum of points
2493    of all instructions in READY.  The function stops immediately,
2494    if it reached the such a solution, that all instruction can be issued.
2495    INDEX will contain index of the best insn in READY.  The following
2496    function is used only for first cycle multipass scheduling.
2497
2498    PRIVILEGED_N >= 0
2499
2500    This function expects recognized insns only.  All USEs,
2501    CLOBBERs, etc must be filtered elsewhere.  */
2502 int
2503 max_issue (struct ready_list *ready, int privileged_n, state_t state,
2504            int *index)
2505 {
2506   int n, i, all, n_ready, best, delay, tries_num, max_points;
2507   int more_issue;
2508   struct choice_entry *top;
2509   rtx insn;
2510
2511   n_ready = ready->n_ready;
2512   gcc_assert (dfa_lookahead >= 1 && privileged_n >= 0
2513               && privileged_n <= n_ready);
2514
2515   /* Init MAX_LOOKAHEAD_TRIES.  */
2516   if (cached_first_cycle_multipass_dfa_lookahead != dfa_lookahead)
2517     {
2518       cached_first_cycle_multipass_dfa_lookahead = dfa_lookahead;
2519       max_lookahead_tries = 100;
2520       for (i = 0; i < issue_rate; i++)
2521         max_lookahead_tries *= dfa_lookahead;
2522     }
2523
2524   /* Init max_points.  */
2525   max_points = 0;
2526   more_issue = issue_rate - cycle_issued_insns;
2527
2528   /* ??? We used to assert here that we never issue more insns than issue_rate.
2529      However, some targets (e.g. MIPS/SB1) claim lower issue rate than can be
2530      achieved to get better performance.  Until these targets are fixed to use
2531      scheduler hooks to manipulate insns priority instead, the assert should
2532      be disabled.
2533
2534      gcc_assert (more_issue >= 0);  */
2535
2536   for (i = 0; i < n_ready; i++)
2537     if (!ready_try [i])
2538       {
2539         if (more_issue-- > 0)
2540           max_points += ISSUE_POINTS (ready_element (ready, i));
2541         else
2542           break;
2543       }
2544
2545   /* The number of the issued insns in the best solution.  */
2546   best = 0;
2547
2548   top = choice_stack;
2549
2550   /* Set initial state of the search.  */
2551   memcpy (top->state, state, dfa_state_size);
2552   top->rest = dfa_lookahead;
2553   top->n = 0;
2554
2555   /* Count the number of the insns to search among.  */
2556   for (all = i = 0; i < n_ready; i++)
2557     if (!ready_try [i])
2558       all++;
2559
2560   /* I is the index of the insn to try next.  */
2561   i = 0;
2562   tries_num = 0;
2563   for (;;)
2564     {
2565       if (/* If we've reached a dead end or searched enough of what we have
2566              been asked...  */
2567           top->rest == 0
2568           /* Or have nothing else to try.  */
2569           || i >= n_ready)
2570         {
2571           /* ??? (... || i == n_ready).  */
2572           gcc_assert (i <= n_ready);
2573
2574           if (top == choice_stack)
2575             break;
2576
2577           if (best < top - choice_stack)
2578             {
2579               if (privileged_n)
2580                 {
2581                   n = privileged_n;
2582                   /* Try to find issued privileged insn.  */
2583                   while (n && !ready_try[--n]);
2584                 }
2585
2586               if (/* If all insns are equally good...  */
2587                   privileged_n == 0
2588                   /* Or a privileged insn will be issued.  */
2589                   || ready_try[n])
2590                 /* Then we have a solution.  */
2591                 {
2592                   best = top - choice_stack;
2593                   /* This is the index of the insn issued first in this
2594                      solution.  */
2595                   *index = choice_stack [1].index;
2596                   if (top->n == max_points || best == all)
2597                     break;
2598                 }
2599             }
2600
2601           /* Set ready-list index to point to the last insn
2602              ('i++' below will advance it to the next insn).  */
2603           i = top->index;
2604
2605           /* Backtrack.  */
2606           ready_try [i] = 0;
2607           top--;
2608           memcpy (state, top->state, dfa_state_size);
2609         }
2610       else if (!ready_try [i])
2611         {
2612           tries_num++;
2613           if (tries_num > max_lookahead_tries)
2614             break;
2615           insn = ready_element (ready, i);
2616           delay = state_transition (state, insn);
2617           if (delay < 0)
2618             {
2619               if (state_dead_lock_p (state)
2620                   || insn_finishes_cycle_p (insn))
2621                 /* We won't issue any more instructions in the next
2622                    choice_state.  */
2623                 top->rest = 0;
2624               else
2625                 top->rest--;
2626
2627               n = top->n;
2628               if (memcmp (top->state, state, dfa_state_size) != 0)
2629                 n += ISSUE_POINTS (insn);
2630
2631               /* Advance to the next choice_entry.  */
2632               top++;
2633               /* Initialize it.  */
2634               top->rest = dfa_lookahead;
2635               top->index = i;
2636               top->n = n;
2637               memcpy (top->state, state, dfa_state_size);
2638
2639               ready_try [i] = 1;
2640               i = -1;
2641             }
2642         }
2643
2644       /* Increase ready-list index.  */
2645       i++;
2646     }
2647
2648   /* Restore the original state of the DFA.  */
2649   memcpy (state, choice_stack->state, dfa_state_size);
2650
2651   return best;
2652 }
2653
2654 /* The following function chooses insn from READY and modifies
2655    READY.  The following function is used only for first
2656    cycle multipass scheduling.
2657    Return:
2658    -1 if cycle should be advanced,
2659    0 if INSN_PTR is set to point to the desirable insn,
2660    1 if choose_ready () should be restarted without advancing the cycle.  */
2661 static int
2662 choose_ready (struct ready_list *ready, rtx *insn_ptr)
2663 {
2664   int lookahead;
2665
2666   if (dbg_cnt (sched_insn) == false)
2667     {
2668       rtx insn;
2669
2670       insn = next_nonnote_insn (last_scheduled_insn);
2671
2672       if (QUEUE_INDEX (insn) == QUEUE_READY)
2673         /* INSN is in the ready_list.  */
2674         {
2675           ready_remove_insn (insn);
2676           *insn_ptr = insn;
2677           return 0;
2678         }
2679
2680       /* INSN is in the queue.  Advance cycle to move it to the ready list.  */
2681       return -1;
2682     }
2683
2684   lookahead = 0;
2685
2686   if (targetm.sched.first_cycle_multipass_dfa_lookahead)
2687     lookahead = targetm.sched.first_cycle_multipass_dfa_lookahead ();
2688   if (lookahead <= 0 || SCHED_GROUP_P (ready_element (ready, 0))
2689       || DEBUG_INSN_P (ready_element (ready, 0)))
2690     {
2691       *insn_ptr = ready_remove_first (ready);
2692       return 0;
2693     }
2694   else
2695     {
2696       /* Try to choose the better insn.  */
2697       int index = 0, i, n;
2698       rtx insn;
2699       int try_data = 1, try_control = 1;
2700       ds_t ts;
2701
2702       insn = ready_element (ready, 0);
2703       if (INSN_CODE (insn) < 0)
2704         {
2705           *insn_ptr = ready_remove_first (ready);
2706           return 0;
2707         }
2708
2709       if (spec_info
2710           && spec_info->flags & (PREFER_NON_DATA_SPEC
2711                                  | PREFER_NON_CONTROL_SPEC))
2712         {
2713           for (i = 0, n = ready->n_ready; i < n; i++)
2714             {
2715               rtx x;
2716               ds_t s;
2717
2718               x = ready_element (ready, i);
2719               s = TODO_SPEC (x);
2720
2721               if (spec_info->flags & PREFER_NON_DATA_SPEC
2722                   && !(s & DATA_SPEC))
2723                 {
2724                   try_data = 0;
2725                   if (!(spec_info->flags & PREFER_NON_CONTROL_SPEC)
2726                       || !try_control)
2727                     break;
2728                 }
2729
2730               if (spec_info->flags & PREFER_NON_CONTROL_SPEC
2731                   && !(s & CONTROL_SPEC))
2732                 {
2733                   try_control = 0;
2734                   if (!(spec_info->flags & PREFER_NON_DATA_SPEC) || !try_data)
2735                     break;
2736                 }
2737             }
2738         }
2739
2740       ts = TODO_SPEC (insn);
2741       if ((ts & SPECULATIVE)
2742           && (((!try_data && (ts & DATA_SPEC))
2743                || (!try_control && (ts & CONTROL_SPEC)))
2744               || (targetm.sched.first_cycle_multipass_dfa_lookahead_guard_spec
2745                   && !targetm.sched
2746                   .first_cycle_multipass_dfa_lookahead_guard_spec (insn))))
2747         /* Discard speculative instruction that stands first in the ready
2748            list.  */
2749         {
2750           change_queue_index (insn, 1);
2751           return 1;
2752         }
2753
2754       ready_try[0] = 0;
2755
2756       for (i = 1; i < ready->n_ready; i++)
2757         {
2758           insn = ready_element (ready, i);
2759
2760           ready_try [i]
2761             = ((!try_data && (TODO_SPEC (insn) & DATA_SPEC))
2762                || (!try_control && (TODO_SPEC (insn) & CONTROL_SPEC)));
2763         }
2764
2765       /* Let the target filter the search space.  */
2766       for (i = 1; i < ready->n_ready; i++)
2767         if (!ready_try[i])
2768           {
2769             insn = ready_element (ready, i);
2770
2771 #ifdef ENABLE_CHECKING
2772             /* If this insn is recognizable we should have already
2773                recognized it earlier.
2774                ??? Not very clear where this is supposed to be done.
2775                See dep_cost_1.  */
2776             gcc_assert (INSN_CODE (insn) >= 0
2777                         || recog_memoized (insn) < 0);
2778 #endif
2779
2780             ready_try [i]
2781               = (/* INSN_CODE check can be omitted here as it is also done later
2782                     in max_issue ().  */
2783                  INSN_CODE (insn) < 0
2784                  || (targetm.sched.first_cycle_multipass_dfa_lookahead_guard
2785                      && !targetm.sched.first_cycle_multipass_dfa_lookahead_guard
2786                      (insn)));
2787           }
2788
2789       if (max_issue (ready, 1, curr_state, &index) == 0)
2790         {
2791           *insn_ptr = ready_remove_first (ready);
2792           if (sched_verbose >= 4)
2793             fprintf (sched_dump, ";;\t\tChosen insn (but can't issue) : %s \n",
2794                      (*current_sched_info->print_insn) (*insn_ptr, 0));
2795           return 0;
2796         }
2797       else
2798         {
2799           if (sched_verbose >= 4)
2800             fprintf (sched_dump, ";;\t\tChosen insn : %s\n",
2801                      (*current_sched_info->print_insn)
2802                      (ready_element (ready, index), 0));
2803
2804           *insn_ptr = ready_remove (ready, index);
2805           return 0;
2806         }
2807     }
2808 }
2809
2810 /* Use forward list scheduling to rearrange insns of block pointed to by
2811    TARGET_BB, possibly bringing insns from subsequent blocks in the same
2812    region.  */
2813
2814 void
2815 schedule_block (basic_block *target_bb)
2816 {
2817   int i, first_cycle_insn_p;
2818   int can_issue_more;
2819   state_t temp_state = NULL;  /* It is used for multipass scheduling.  */
2820   int sort_p, advance, start_clock_var;
2821
2822   /* Head/tail info for this block.  */
2823   rtx prev_head = current_sched_info->prev_head;
2824   rtx next_tail = current_sched_info->next_tail;
2825   rtx head = NEXT_INSN (prev_head);
2826   rtx tail = PREV_INSN (next_tail);
2827
2828   /* We used to have code to avoid getting parameters moved from hard
2829      argument registers into pseudos.
2830
2831      However, it was removed when it proved to be of marginal benefit
2832      and caused problems because schedule_block and compute_forward_dependences
2833      had different notions of what the "head" insn was.  */
2834
2835   gcc_assert (head != tail || INSN_P (head));
2836
2837   haifa_recovery_bb_recently_added_p = false;
2838
2839   /* Debug info.  */
2840   if (sched_verbose)
2841     dump_new_block_header (0, *target_bb, head, tail);
2842
2843   state_reset (curr_state);
2844
2845   /* Clear the ready list.  */
2846   ready.first = ready.veclen - 1;
2847   ready.n_ready = 0;
2848   ready.n_debug = 0;
2849
2850   /* It is used for first cycle multipass scheduling.  */
2851   temp_state = alloca (dfa_state_size);
2852
2853   if (targetm.sched.md_init)
2854     targetm.sched.md_init (sched_dump, sched_verbose, ready.veclen);
2855
2856   /* We start inserting insns after PREV_HEAD.  */
2857   last_scheduled_insn = prev_head;
2858
2859   gcc_assert ((NOTE_P (last_scheduled_insn)
2860                || BOUNDARY_DEBUG_INSN_P (last_scheduled_insn))
2861               && BLOCK_FOR_INSN (last_scheduled_insn) == *target_bb);
2862
2863   /* Initialize INSN_QUEUE.  Q_SIZE is the total number of insns in the
2864      queue.  */
2865   q_ptr = 0;
2866   q_size = 0;
2867
2868   insn_queue = XALLOCAVEC (rtx, max_insn_queue_index + 1);
2869   memset (insn_queue, 0, (max_insn_queue_index + 1) * sizeof (rtx));
2870
2871   /* Start just before the beginning of time.  */
2872   clock_var = -1;
2873
2874   /* We need queue and ready lists and clock_var be initialized
2875      in try_ready () (which is called through init_ready_list ()).  */
2876   (*current_sched_info->init_ready_list) ();
2877
2878   /* The algorithm is O(n^2) in the number of ready insns at any given
2879      time in the worst case.  Before reload we are more likely to have
2880      big lists so truncate them to a reasonable size.  */
2881   if (!reload_completed
2882       && ready.n_ready - ready.n_debug > MAX_SCHED_READY_INSNS)
2883     {
2884       ready_sort (&ready);
2885
2886       /* Find first free-standing insn past MAX_SCHED_READY_INSNS.
2887          If there are debug insns, we know they're first.  */
2888       for (i = MAX_SCHED_READY_INSNS + ready.n_debug; i < ready.n_ready; i++)
2889         if (!SCHED_GROUP_P (ready_element (&ready, i)))
2890           break;
2891
2892       if (sched_verbose >= 2)
2893         {
2894           fprintf (sched_dump,
2895                    ";;\t\tReady list on entry: %d insns\n", ready.n_ready);
2896           fprintf (sched_dump,
2897                    ";;\t\t before reload => truncated to %d insns\n", i);
2898         }
2899
2900       /* Delay all insns past it for 1 cycle.  If debug counter is
2901          activated make an exception for the insn right after
2902          last_scheduled_insn.  */
2903       {
2904         rtx skip_insn;
2905
2906         if (dbg_cnt (sched_insn) == false)
2907           skip_insn = next_nonnote_insn (last_scheduled_insn);
2908         else
2909           skip_insn = NULL_RTX;
2910
2911         while (i < ready.n_ready)
2912           {
2913             rtx insn;
2914
2915             insn = ready_remove (&ready, i);
2916
2917             if (insn != skip_insn)
2918               queue_insn (insn, 1);
2919           }
2920       }
2921     }
2922
2923   /* Now we can restore basic block notes and maintain precise cfg.  */
2924   restore_bb_notes (*target_bb);
2925
2926   last_clock_var = -1;
2927
2928   advance = 0;
2929
2930   sort_p = TRUE;
2931   /* Loop until all the insns in BB are scheduled.  */
2932   while ((*current_sched_info->schedule_more_p) ())
2933     {
2934       do
2935         {
2936           start_clock_var = clock_var;
2937
2938           clock_var++;
2939
2940           advance_one_cycle ();
2941
2942           /* Add to the ready list all pending insns that can be issued now.
2943              If there are no ready insns, increment clock until one
2944              is ready and add all pending insns at that point to the ready
2945              list.  */
2946           queue_to_ready (&ready);
2947
2948           gcc_assert (ready.n_ready);
2949
2950           if (sched_verbose >= 2)
2951             {
2952               fprintf (sched_dump, ";;\t\tReady list after queue_to_ready:  ");
2953               debug_ready_list (&ready);
2954             }
2955           advance -= clock_var - start_clock_var;
2956         }
2957       while (advance > 0);
2958
2959       if (sort_p)
2960         {
2961           /* Sort the ready list based on priority.  */
2962           ready_sort (&ready);
2963
2964           if (sched_verbose >= 2)
2965             {
2966               fprintf (sched_dump, ";;\t\tReady list after ready_sort:  ");
2967               debug_ready_list (&ready);
2968             }
2969         }
2970
2971       /* We don't want md sched reorder to even see debug isns, so put
2972          them out right away.  */
2973       if (ready.n_ready && DEBUG_INSN_P (ready_element (&ready, 0)))
2974         {
2975           if (control_flow_insn_p (last_scheduled_insn))
2976             {
2977               *target_bb = current_sched_info->advance_target_bb
2978                 (*target_bb, 0);
2979
2980               if (sched_verbose)
2981                 {
2982                   rtx x;
2983
2984                   x = next_real_insn (last_scheduled_insn);
2985                   gcc_assert (x);
2986                   dump_new_block_header (1, *target_bb, x, tail);
2987                 }
2988
2989               last_scheduled_insn = bb_note (*target_bb);
2990             }
2991
2992           while (ready.n_ready && DEBUG_INSN_P (ready_element (&ready, 0)))
2993             {
2994               rtx insn = ready_remove_first (&ready);
2995               gcc_assert (DEBUG_INSN_P (insn));
2996               (*current_sched_info->begin_schedule_ready) (insn,
2997                                                            last_scheduled_insn);
2998               move_insn (insn, last_scheduled_insn,
2999                          current_sched_info->next_tail);
3000               last_scheduled_insn = insn;
3001               advance = schedule_insn (insn);
3002               gcc_assert (advance == 0);
3003               if (ready.n_ready > 0)
3004                 ready_sort (&ready);
3005             }
3006
3007           if (!ready.n_ready)
3008             continue;
3009         }
3010
3011       /* Allow the target to reorder the list, typically for
3012          better instruction bundling.  */
3013       if (sort_p && targetm.sched.reorder
3014           && (ready.n_ready == 0
3015               || !SCHED_GROUP_P (ready_element (&ready, 0))))
3016         can_issue_more =
3017           targetm.sched.reorder (sched_dump, sched_verbose,
3018                                  ready_lastpos (&ready),
3019                                  &ready.n_ready, clock_var);
3020       else
3021         can_issue_more = issue_rate;
3022
3023       first_cycle_insn_p = 1;
3024       cycle_issued_insns = 0;
3025       for (;;)
3026         {
3027           rtx insn;
3028           int cost;
3029           bool asm_p = false;
3030
3031           if (sched_verbose >= 2)
3032             {
3033               fprintf (sched_dump, ";;\tReady list (t = %3d):  ",
3034                        clock_var);
3035               debug_ready_list (&ready);
3036               if (sched_pressure_p)
3037                 print_curr_reg_pressure ();
3038             }
3039
3040           if (ready.n_ready == 0
3041               && can_issue_more
3042               && reload_completed)
3043             {
3044               /* Allow scheduling insns directly from the queue in case
3045                  there's nothing better to do (ready list is empty) but
3046                  there are still vacant dispatch slots in the current cycle.  */
3047               if (sched_verbose >= 6)
3048                 fprintf (sched_dump,";;\t\tSecond chance\n");
3049               memcpy (temp_state, curr_state, dfa_state_size);
3050               if (early_queue_to_ready (temp_state, &ready))
3051                 ready_sort (&ready);
3052             }
3053
3054           if (ready.n_ready == 0
3055               || !can_issue_more
3056               || state_dead_lock_p (curr_state)
3057               || !(*current_sched_info->schedule_more_p) ())
3058             break;
3059
3060           /* Select and remove the insn from the ready list.  */
3061           if (sort_p)
3062             {
3063               int res;
3064
3065               insn = NULL_RTX;
3066               res = choose_ready (&ready, &insn);
3067
3068               if (res < 0)
3069                 /* Finish cycle.  */
3070                 break;
3071               if (res > 0)
3072                 /* Restart choose_ready ().  */
3073                 continue;
3074
3075               gcc_assert (insn != NULL_RTX);
3076             }
3077           else
3078             insn = ready_remove_first (&ready);
3079
3080           if (sched_pressure_p && INSN_TICK (insn) > clock_var)
3081             {
3082               ready_add (&ready, insn, true);
3083               advance = 1;
3084               break;
3085             }
3086
3087           if (targetm.sched.dfa_new_cycle
3088               && targetm.sched.dfa_new_cycle (sched_dump, sched_verbose,
3089                                               insn, last_clock_var,
3090                                               clock_var, &sort_p))
3091             /* SORT_P is used by the target to override sorting
3092                of the ready list.  This is needed when the target
3093                has modified its internal structures expecting that
3094                the insn will be issued next.  As we need the insn
3095                to have the highest priority (so it will be returned by
3096                the ready_remove_first call above), we invoke
3097                ready_add (&ready, insn, true).
3098                But, still, there is one issue: INSN can be later
3099                discarded by scheduler's front end through
3100                current_sched_info->can_schedule_ready_p, hence, won't
3101                be issued next.  */
3102             {
3103               ready_add (&ready, insn, true);
3104               break;
3105             }
3106
3107           sort_p = TRUE;
3108           memcpy (temp_state, curr_state, dfa_state_size);
3109           if (recog_memoized (insn) < 0)
3110             {
3111               asm_p = (GET_CODE (PATTERN (insn)) == ASM_INPUT
3112                        || asm_noperands (PATTERN (insn)) >= 0);
3113               if (!first_cycle_insn_p && asm_p)
3114                 /* This is asm insn which is tried to be issued on the
3115                    cycle not first.  Issue it on the next cycle.  */
3116                 cost = 1;
3117               else
3118                 /* A USE insn, or something else we don't need to
3119                    understand.  We can't pass these directly to
3120                    state_transition because it will trigger a
3121                    fatal error for unrecognizable insns.  */
3122                 cost = 0;
3123             }
3124           else if (sched_pressure_p)
3125             cost = 0;
3126           else
3127             {
3128               cost = state_transition (temp_state, insn);
3129               if (cost < 0)
3130                 cost = 0;
3131               else if (cost == 0)
3132                 cost = 1;
3133             }
3134
3135           if (cost >= 1)
3136             {
3137               queue_insn (insn, cost);
3138               if (SCHED_GROUP_P (insn))
3139                 {
3140                   advance = cost;
3141                   break;
3142                 }
3143
3144               continue;
3145             }
3146
3147           if (current_sched_info->can_schedule_ready_p
3148               && ! (*current_sched_info->can_schedule_ready_p) (insn))
3149             /* We normally get here only if we don't want to move
3150                insn from the split block.  */
3151             {
3152               TODO_SPEC (insn) = (TODO_SPEC (insn) & ~SPECULATIVE) | HARD_DEP;
3153               continue;
3154             }
3155
3156           /* DECISION is made.  */
3157
3158           if (TODO_SPEC (insn) & SPECULATIVE)
3159             generate_recovery_code (insn);
3160
3161           if (control_flow_insn_p (last_scheduled_insn)
3162               /* This is used to switch basic blocks by request
3163                  from scheduler front-end (actually, sched-ebb.c only).
3164                  This is used to process blocks with single fallthru
3165                  edge.  If succeeding block has jump, it [jump] will try
3166                  move at the end of current bb, thus corrupting CFG.  */
3167               || current_sched_info->advance_target_bb (*target_bb, insn))
3168             {
3169               *target_bb = current_sched_info->advance_target_bb
3170                 (*target_bb, 0);
3171
3172               if (sched_verbose)
3173                 {
3174                   rtx x;
3175
3176                   x = next_real_insn (last_scheduled_insn);
3177                   gcc_assert (x);
3178                   dump_new_block_header (1, *target_bb, x, tail);
3179                 }
3180
3181               last_scheduled_insn = bb_note (*target_bb);
3182             }
3183
3184           /* Update counters, etc in the scheduler's front end.  */
3185           (*current_sched_info->begin_schedule_ready) (insn,
3186                                                        last_scheduled_insn);
3187
3188           move_insn (insn, last_scheduled_insn, current_sched_info->next_tail);
3189           reemit_notes (insn);
3190           last_scheduled_insn = insn;
3191
3192           if (memcmp (curr_state, temp_state, dfa_state_size) != 0)
3193             {
3194               cycle_issued_insns++;
3195               memcpy (curr_state, temp_state, dfa_state_size);
3196             }
3197
3198           if (targetm.sched.variable_issue)
3199             can_issue_more =
3200               targetm.sched.variable_issue (sched_dump, sched_verbose,
3201                                             insn, can_issue_more);
3202           /* A naked CLOBBER or USE generates no instruction, so do
3203              not count them against the issue rate.  */
3204           else if (GET_CODE (PATTERN (insn)) != USE
3205                    && GET_CODE (PATTERN (insn)) != CLOBBER)
3206             can_issue_more--;
3207           advance = schedule_insn (insn);
3208
3209           /* After issuing an asm insn we should start a new cycle.  */
3210           if (advance == 0 && asm_p)
3211             advance = 1;
3212           if (advance != 0)
3213             break;
3214
3215           first_cycle_insn_p = 0;
3216
3217           /* Sort the ready list based on priority.  This must be
3218              redone here, as schedule_insn may have readied additional
3219              insns that will not be sorted correctly.  */
3220           if (ready.n_ready > 0)
3221             ready_sort (&ready);
3222
3223           /* Quickly go through debug insns such that md sched
3224              reorder2 doesn't have to deal with debug insns.  */
3225           if (ready.n_ready && DEBUG_INSN_P (ready_element (&ready, 0))
3226               && (*current_sched_info->schedule_more_p) ())
3227             {
3228               if (control_flow_insn_p (last_scheduled_insn))
3229                 {
3230                   *target_bb = current_sched_info->advance_target_bb
3231                     (*target_bb, 0);
3232
3233                   if (sched_verbose)
3234                     {
3235                       rtx x;
3236
3237                       x = next_real_insn (last_scheduled_insn);
3238                       gcc_assert (x);
3239                       dump_new_block_header (1, *target_bb, x, tail);
3240                     }
3241
3242                   last_scheduled_insn = bb_note (*target_bb);
3243                 }
3244
3245               while (ready.n_ready && DEBUG_INSN_P (ready_element (&ready, 0)))
3246                 {
3247                   insn = ready_remove_first (&ready);
3248                   gcc_assert (DEBUG_INSN_P (insn));
3249                   (*current_sched_info->begin_schedule_ready)
3250                     (insn, last_scheduled_insn);
3251                   move_insn (insn, last_scheduled_insn,
3252                              current_sched_info->next_tail);
3253                   advance = schedule_insn (insn);
3254                   last_scheduled_insn = insn;
3255                   gcc_assert (advance == 0);
3256                   if (ready.n_ready > 0)
3257                     ready_sort (&ready);
3258                 }
3259             }
3260
3261           if (targetm.sched.reorder2
3262               && (ready.n_ready == 0
3263                   || !SCHED_GROUP_P (ready_element (&ready, 0))))
3264             {
3265               can_issue_more =
3266                 targetm.sched.reorder2 (sched_dump, sched_verbose,
3267                                         ready.n_ready
3268                                         ? ready_lastpos (&ready) : NULL,
3269                                         &ready.n_ready, clock_var);
3270             }
3271         }
3272     }
3273
3274   /* Debug info.  */
3275   if (sched_verbose)
3276     {
3277       fprintf (sched_dump, ";;\tReady list (final):  ");
3278       debug_ready_list (&ready);
3279     }
3280
3281   if (current_sched_info->queue_must_finish_empty)
3282     /* Sanity check -- queue must be empty now.  Meaningless if region has
3283        multiple bbs.  */
3284     gcc_assert (!q_size && !ready.n_ready && !ready.n_debug);
3285   else
3286     {
3287       /* We must maintain QUEUE_INDEX between blocks in region.  */
3288       for (i = ready.n_ready - 1; i >= 0; i--)
3289         {
3290           rtx x;
3291
3292           x = ready_element (&ready, i);
3293           QUEUE_INDEX (x) = QUEUE_NOWHERE;
3294           TODO_SPEC (x) = (TODO_SPEC (x) & ~SPECULATIVE) | HARD_DEP;
3295         }
3296
3297       if (q_size)
3298         for (i = 0; i <= max_insn_queue_index; i++)
3299           {
3300             rtx link;
3301             for (link = insn_queue[i]; link; link = XEXP (link, 1))
3302               {
3303                 rtx x;
3304
3305                 x = XEXP (link, 0);
3306                 QUEUE_INDEX (x) = QUEUE_NOWHERE;
3307                 TODO_SPEC (x) = (TODO_SPEC (x) & ~SPECULATIVE) | HARD_DEP;
3308               }
3309             free_INSN_LIST_list (&insn_queue[i]);
3310           }
3311     }
3312
3313   if (sched_verbose)
3314     fprintf (sched_dump, ";;   total time = %d\n", clock_var);
3315
3316   if (!current_sched_info->queue_must_finish_empty
3317       || haifa_recovery_bb_recently_added_p)
3318     {
3319       /* INSN_TICK (minimum clock tick at which the insn becomes
3320          ready) may be not correct for the insn in the subsequent
3321          blocks of the region.  We should use a correct value of
3322          `clock_var' or modify INSN_TICK.  It is better to keep
3323          clock_var value equal to 0 at the start of a basic block.
3324          Therefore we modify INSN_TICK here.  */
3325       fix_inter_tick (NEXT_INSN (prev_head), last_scheduled_insn);
3326     }
3327
3328   if (targetm.sched.md_finish)
3329     {
3330       targetm.sched.md_finish (sched_dump, sched_verbose);
3331       /* Target might have added some instructions to the scheduled block
3332          in its md_finish () hook.  These new insns don't have any data
3333          initialized and to identify them we extend h_i_d so that they'll
3334          get zero luids.  */
3335       sched_init_luids (NULL, NULL, NULL, NULL);
3336     }
3337
3338   if (sched_verbose)
3339     fprintf (sched_dump, ";;   new head = %d\n;;   new tail = %d\n\n",
3340              INSN_UID (head), INSN_UID (tail));
3341
3342   /* Update head/tail boundaries.  */
3343   head = NEXT_INSN (prev_head);
3344   tail = last_scheduled_insn;
3345
3346   head = restore_other_notes (head, NULL);
3347
3348   current_sched_info->head = head;
3349   current_sched_info->tail = tail;
3350 }
3351 \f
3352 /* Set_priorities: compute priority of each insn in the block.  */
3353
3354 int
3355 set_priorities (rtx head, rtx tail)
3356 {
3357   rtx insn;
3358   int n_insn;
3359   int sched_max_insns_priority =
3360         current_sched_info->sched_max_insns_priority;
3361   rtx prev_head;
3362
3363   if (head == tail && (! INSN_P (head) || BOUNDARY_DEBUG_INSN_P (head)))
3364     gcc_unreachable ();
3365
3366   n_insn = 0;
3367
3368   prev_head = PREV_INSN (head);
3369   for (insn = tail; insn != prev_head; insn = PREV_INSN (insn))
3370     {
3371       if (!INSN_P (insn))
3372         continue;
3373
3374       n_insn++;
3375       (void) priority (insn);
3376
3377       gcc_assert (INSN_PRIORITY_KNOWN (insn));
3378
3379       sched_max_insns_priority = MAX (sched_max_insns_priority,
3380                                       INSN_PRIORITY (insn));
3381     }
3382
3383   current_sched_info->sched_max_insns_priority = sched_max_insns_priority;
3384
3385   return n_insn;
3386 }
3387
3388 /* Set dump and sched_verbose for the desired debugging output.  If no
3389    dump-file was specified, but -fsched-verbose=N (any N), print to stderr.
3390    For -fsched-verbose=N, N>=10, print everything to stderr.  */
3391 void
3392 setup_sched_dump (void)
3393 {
3394   sched_verbose = sched_verbose_param;
3395   if (sched_verbose_param == 0 && dump_file)
3396     sched_verbose = 1;
3397   sched_dump = ((sched_verbose_param >= 10 || !dump_file)
3398                 ? stderr : dump_file);
3399 }
3400
3401 /* Initialize some global state for the scheduler.  This function works
3402    with the common data shared between all the schedulers.  It is called
3403    from the scheduler specific initialization routine.  */
3404
3405 void
3406 sched_init (void)
3407 {
3408   /* Disable speculative loads in their presence if cc0 defined.  */
3409 #ifdef HAVE_cc0
3410   flag_schedule_speculative_load = 0;
3411 #endif
3412
3413   sched_pressure_p = (flag_sched_pressure && ! reload_completed
3414                       && common_sched_info->sched_pass_id == SCHED_RGN_PASS);
3415   if (sched_pressure_p)
3416     ira_setup_eliminable_regset ();
3417
3418   /* Initialize SPEC_INFO.  */
3419   if (targetm.sched.set_sched_flags)
3420     {
3421       spec_info = &spec_info_var;
3422       targetm.sched.set_sched_flags (spec_info);
3423
3424       if (spec_info->mask != 0)
3425         {
3426           spec_info->data_weakness_cutoff =
3427             (PARAM_VALUE (PARAM_SCHED_SPEC_PROB_CUTOFF) * MAX_DEP_WEAK) / 100;
3428           spec_info->control_weakness_cutoff =
3429             (PARAM_VALUE (PARAM_SCHED_SPEC_PROB_CUTOFF)
3430              * REG_BR_PROB_BASE) / 100;
3431         }
3432       else
3433         /* So we won't read anything accidentally.  */
3434         spec_info = NULL;
3435
3436     }
3437   else
3438     /* So we won't read anything accidentally.  */
3439     spec_info = 0;
3440
3441   /* Initialize issue_rate.  */
3442   if (targetm.sched.issue_rate)
3443     issue_rate = targetm.sched.issue_rate ();
3444   else
3445     issue_rate = 1;
3446
3447   if (cached_issue_rate != issue_rate)
3448     {
3449       cached_issue_rate = issue_rate;
3450       /* To invalidate max_lookahead_tries:  */
3451       cached_first_cycle_multipass_dfa_lookahead = 0;
3452     }
3453
3454   if (targetm.sched.first_cycle_multipass_dfa_lookahead)
3455     dfa_lookahead = targetm.sched.first_cycle_multipass_dfa_lookahead ();
3456   else
3457     dfa_lookahead = 0;
3458
3459   if (targetm.sched.init_dfa_pre_cycle_insn)
3460     targetm.sched.init_dfa_pre_cycle_insn ();
3461
3462   if (targetm.sched.init_dfa_post_cycle_insn)
3463     targetm.sched.init_dfa_post_cycle_insn ();
3464
3465   dfa_start ();
3466   dfa_state_size = state_size ();
3467
3468   init_alias_analysis ();
3469
3470   df_set_flags (DF_LR_RUN_DCE);
3471   df_note_add_problem ();
3472
3473   /* More problems needed for interloop dep calculation in SMS.  */
3474   if (common_sched_info->sched_pass_id == SCHED_SMS_PASS)
3475     {
3476       df_rd_add_problem ();
3477       df_chain_add_problem (DF_DU_CHAIN + DF_UD_CHAIN);
3478     }
3479
3480   df_analyze ();
3481
3482   /* Do not run DCE after reload, as this can kill nops inserted
3483      by bundling.  */
3484   if (reload_completed)
3485     df_clear_flags (DF_LR_RUN_DCE);
3486
3487   regstat_compute_calls_crossed ();
3488
3489   if (targetm.sched.md_init_global)
3490     targetm.sched.md_init_global (sched_dump, sched_verbose,
3491                                   get_max_uid () + 1);
3492
3493   if (sched_pressure_p)
3494     {
3495       int i, max_regno = max_reg_num ();
3496
3497       ira_set_pseudo_classes (sched_verbose ? sched_dump : NULL);
3498       sched_regno_cover_class
3499         = (enum reg_class *) xmalloc (max_regno * sizeof (enum reg_class));
3500       for (i = 0; i < max_regno; i++)
3501         sched_regno_cover_class[i]
3502           = (i < FIRST_PSEUDO_REGISTER
3503              ? ira_class_translate[REGNO_REG_CLASS (i)]
3504              : reg_cover_class (i));
3505       curr_reg_live = BITMAP_ALLOC (NULL);
3506       saved_reg_live = BITMAP_ALLOC (NULL);
3507       region_ref_regs = BITMAP_ALLOC (NULL);
3508     }
3509
3510   curr_state = xmalloc (dfa_state_size);
3511 }
3512
3513 static void haifa_init_only_bb (basic_block, basic_block);
3514
3515 /* Initialize data structures specific to the Haifa scheduler.  */
3516 void
3517 haifa_sched_init (void)
3518 {
3519   setup_sched_dump ();
3520   sched_init ();
3521
3522   if (spec_info != NULL)
3523     {
3524       sched_deps_info->use_deps_list = 1;
3525       sched_deps_info->generate_spec_deps = 1;
3526     }
3527
3528   /* Initialize luids, dependency caches, target and h_i_d for the
3529      whole function.  */
3530   {
3531     bb_vec_t bbs = VEC_alloc (basic_block, heap, n_basic_blocks);
3532     basic_block bb;
3533
3534     sched_init_bbs ();
3535
3536     FOR_EACH_BB (bb)
3537       VEC_quick_push (basic_block, bbs, bb);
3538     sched_init_luids (bbs, NULL, NULL, NULL);
3539     sched_deps_init (true);
3540     sched_extend_target ();
3541     haifa_init_h_i_d (bbs, NULL, NULL, NULL);
3542
3543     VEC_free (basic_block, heap, bbs);
3544   }
3545
3546   sched_init_only_bb = haifa_init_only_bb;
3547   sched_split_block = sched_split_block_1;
3548   sched_create_empty_bb = sched_create_empty_bb_1;
3549   haifa_recovery_bb_ever_added_p = false;
3550
3551 #ifdef ENABLE_CHECKING
3552   /* This is used preferably for finding bugs in check_cfg () itself.
3553      We must call sched_bbs_init () before check_cfg () because check_cfg ()
3554      assumes that the last insn in the last bb has a non-null successor.  */
3555   check_cfg (0, 0);
3556 #endif
3557
3558   nr_begin_data = nr_begin_control = nr_be_in_data = nr_be_in_control = 0;
3559   before_recovery = 0;
3560   after_recovery = 0;
3561 }
3562
3563 /* Finish work with the data specific to the Haifa scheduler.  */
3564 void
3565 haifa_sched_finish (void)
3566 {
3567   sched_create_empty_bb = NULL;
3568   sched_split_block = NULL;
3569   sched_init_only_bb = NULL;
3570
3571   if (spec_info && spec_info->dump)
3572     {
3573       char c = reload_completed ? 'a' : 'b';
3574
3575       fprintf (spec_info->dump,
3576                ";; %s:\n", current_function_name ());
3577
3578       fprintf (spec_info->dump,
3579                ";; Procedure %cr-begin-data-spec motions == %d\n",
3580                c, nr_begin_data);
3581       fprintf (spec_info->dump,
3582                ";; Procedure %cr-be-in-data-spec motions == %d\n",
3583                c, nr_be_in_data);
3584       fprintf (spec_info->dump,
3585                ";; Procedure %cr-begin-control-spec motions == %d\n",
3586                c, nr_begin_control);
3587       fprintf (spec_info->dump,
3588                ";; Procedure %cr-be-in-control-spec motions == %d\n",
3589                c, nr_be_in_control);
3590     }
3591
3592   /* Finalize h_i_d, dependency caches, and luids for the whole
3593      function.  Target will be finalized in md_global_finish ().  */
3594   sched_deps_finish ();
3595   sched_finish_luids ();
3596   current_sched_info = NULL;
3597   sched_finish ();
3598 }
3599
3600 /* Free global data used during insn scheduling.  This function works with
3601    the common data shared between the schedulers.  */
3602
3603 void
3604 sched_finish (void)
3605 {
3606   haifa_finish_h_i_d ();
3607   if (sched_pressure_p)
3608     {
3609       free (sched_regno_cover_class);
3610       BITMAP_FREE (region_ref_regs);
3611       BITMAP_FREE (saved_reg_live);
3612       BITMAP_FREE (curr_reg_live);
3613     }
3614   free (curr_state);
3615
3616   if (targetm.sched.md_finish_global)
3617     targetm.sched.md_finish_global (sched_dump, sched_verbose);
3618
3619   end_alias_analysis ();
3620
3621   regstat_free_calls_crossed ();
3622
3623   dfa_finish ();
3624
3625 #ifdef ENABLE_CHECKING
3626   /* After reload ia64 backend clobbers CFG, so can't check anything.  */
3627   if (!reload_completed)
3628     check_cfg (0, 0);
3629 #endif
3630 }
3631
3632 /* Fix INSN_TICKs of the instructions in the current block as well as
3633    INSN_TICKs of their dependents.
3634    HEAD and TAIL are the begin and the end of the current scheduled block.  */
3635 static void
3636 fix_inter_tick (rtx head, rtx tail)
3637 {
3638   /* Set of instructions with corrected INSN_TICK.  */
3639   bitmap_head processed;
3640   /* ??? It is doubtful if we should assume that cycle advance happens on
3641      basic block boundaries.  Basically insns that are unconditionally ready
3642      on the start of the block are more preferable then those which have
3643      a one cycle dependency over insn from the previous block.  */
3644   int next_clock = clock_var + 1;
3645
3646   bitmap_initialize (&processed, 0);
3647
3648   /* Iterates over scheduled instructions and fix their INSN_TICKs and
3649      INSN_TICKs of dependent instructions, so that INSN_TICKs are consistent
3650      across different blocks.  */
3651   for (tail = NEXT_INSN (tail); head != tail; head = NEXT_INSN (head))
3652     {
3653       if (INSN_P (head))
3654         {
3655           int tick;
3656           sd_iterator_def sd_it;
3657           dep_t dep;
3658
3659           tick = INSN_TICK (head);
3660           gcc_assert (tick >= MIN_TICK);
3661
3662           /* Fix INSN_TICK of instruction from just scheduled block.  */
3663           if (!bitmap_bit_p (&processed, INSN_LUID (head)))
3664             {
3665               bitmap_set_bit (&processed, INSN_LUID (head));
3666               tick -= next_clock;
3667
3668               if (tick < MIN_TICK)
3669                 tick = MIN_TICK;
3670
3671               INSN_TICK (head) = tick;
3672             }
3673
3674           FOR_EACH_DEP (head, SD_LIST_RES_FORW, sd_it, dep)
3675             {
3676               rtx next;
3677
3678               next = DEP_CON (dep);
3679               tick = INSN_TICK (next);
3680
3681               if (tick != INVALID_TICK
3682                   /* If NEXT has its INSN_TICK calculated, fix it.
3683                      If not - it will be properly calculated from
3684                      scratch later in fix_tick_ready.  */
3685                   && !bitmap_bit_p (&processed, INSN_LUID (next)))
3686                 {
3687                   bitmap_set_bit (&processed, INSN_LUID (next));
3688                   tick -= next_clock;
3689
3690                   if (tick < MIN_TICK)
3691                     tick = MIN_TICK;
3692
3693                   if (tick > INTER_TICK (next))
3694                     INTER_TICK (next) = tick;
3695                   else
3696                     tick = INTER_TICK (next);
3697
3698                   INSN_TICK (next) = tick;
3699                 }
3700             }
3701         }
3702     }
3703   bitmap_clear (&processed);
3704 }
3705
3706 static int haifa_speculate_insn (rtx, ds_t, rtx *);
3707
3708 /* Check if NEXT is ready to be added to the ready or queue list.
3709    If "yes", add it to the proper list.
3710    Returns:
3711       -1 - is not ready yet,
3712        0 - added to the ready list,
3713    0 < N - queued for N cycles.  */
3714 int
3715 try_ready (rtx next)
3716 {
3717   ds_t old_ts, *ts;
3718
3719   ts = &TODO_SPEC (next);
3720   old_ts = *ts;
3721
3722   gcc_assert (!(old_ts & ~(SPECULATIVE | HARD_DEP))
3723               && ((old_ts & HARD_DEP)
3724                   || (old_ts & SPECULATIVE)));
3725
3726   if (sd_lists_empty_p (next, SD_LIST_BACK))
3727     /* NEXT has all its dependencies resolved.  */
3728     {
3729       /* Remove HARD_DEP bit from NEXT's status.  */
3730       *ts &= ~HARD_DEP;
3731
3732       if (current_sched_info->flags & DO_SPECULATION)
3733         /* Remove all speculative bits from NEXT's status.  */
3734         *ts &= ~SPECULATIVE;
3735     }
3736   else
3737     {
3738       /* One of the NEXT's dependencies has been resolved.
3739          Recalculate NEXT's status.  */
3740
3741       *ts &= ~SPECULATIVE & ~HARD_DEP;
3742
3743       if (sd_lists_empty_p (next, SD_LIST_HARD_BACK))
3744         /* Now we've got NEXT with speculative deps only.
3745            1. Look at the deps to see what we have to do.
3746            2. Check if we can do 'todo'.  */
3747         {
3748           sd_iterator_def sd_it;
3749           dep_t dep;
3750           bool first_p = true;
3751
3752           FOR_EACH_DEP (next, SD_LIST_BACK, sd_it, dep)
3753             {
3754               ds_t ds = DEP_STATUS (dep) & SPECULATIVE;
3755
3756               if (DEBUG_INSN_P (DEP_PRO (dep))
3757                   && !DEBUG_INSN_P (next))
3758                 continue;
3759
3760               if (first_p)
3761                 {
3762                   first_p = false;
3763
3764                   *ts = ds;
3765                 }
3766               else
3767                 *ts = ds_merge (*ts, ds);
3768             }
3769
3770           if (ds_weak (*ts) < spec_info->data_weakness_cutoff)
3771             /* Too few points.  */
3772             *ts = (*ts & ~SPECULATIVE) | HARD_DEP;
3773         }
3774       else
3775         *ts |= HARD_DEP;
3776     }
3777
3778   if (*ts & HARD_DEP)
3779     gcc_assert (*ts == old_ts
3780                 && QUEUE_INDEX (next) == QUEUE_NOWHERE);
3781   else if (current_sched_info->new_ready)
3782     *ts = current_sched_info->new_ready (next, *ts);
3783
3784   /* * if !(old_ts & SPECULATIVE) (e.g. HARD_DEP or 0), then insn might
3785      have its original pattern or changed (speculative) one.  This is due
3786      to changing ebb in region scheduling.
3787      * But if (old_ts & SPECULATIVE), then we are pretty sure that insn
3788      has speculative pattern.
3789
3790      We can't assert (!(*ts & HARD_DEP) || *ts == old_ts) here because
3791      control-speculative NEXT could have been discarded by sched-rgn.c
3792      (the same case as when discarded by can_schedule_ready_p ()).  */
3793
3794   if ((*ts & SPECULATIVE)
3795       /* If (old_ts == *ts), then (old_ts & SPECULATIVE) and we don't
3796          need to change anything.  */
3797       && *ts != old_ts)
3798     {
3799       int res;
3800       rtx new_pat;
3801
3802       gcc_assert ((*ts & SPECULATIVE) && !(*ts & ~SPECULATIVE));
3803
3804       res = haifa_speculate_insn (next, *ts, &new_pat);
3805
3806       switch (res)
3807         {
3808         case -1:
3809           /* It would be nice to change DEP_STATUS of all dependences,
3810              which have ((DEP_STATUS & SPECULATIVE) == *ts) to HARD_DEP,
3811              so we won't reanalyze anything.  */
3812           *ts = (*ts & ~SPECULATIVE) | HARD_DEP;
3813           break;
3814
3815         case 0:
3816           /* We follow the rule, that every speculative insn
3817              has non-null ORIG_PAT.  */
3818           if (!ORIG_PAT (next))
3819             ORIG_PAT (next) = PATTERN (next);
3820           break;
3821
3822         case 1:
3823           if (!ORIG_PAT (next))
3824             /* If we gonna to overwrite the original pattern of insn,
3825                save it.  */
3826             ORIG_PAT (next) = PATTERN (next);
3827
3828           haifa_change_pattern (next, new_pat);
3829           break;
3830
3831         default:
3832           gcc_unreachable ();
3833         }
3834     }
3835
3836   /* We need to restore pattern only if (*ts == 0), because otherwise it is
3837      either correct (*ts & SPECULATIVE),
3838      or we simply don't care (*ts & HARD_DEP).  */
3839
3840   gcc_assert (!ORIG_PAT (next)
3841               || !IS_SPECULATION_BRANCHY_CHECK_P (next));
3842
3843   if (*ts & HARD_DEP)
3844     {
3845       /* We can't assert (QUEUE_INDEX (next) == QUEUE_NOWHERE) here because
3846          control-speculative NEXT could have been discarded by sched-rgn.c
3847          (the same case as when discarded by can_schedule_ready_p ()).  */
3848       /*gcc_assert (QUEUE_INDEX (next) == QUEUE_NOWHERE);*/
3849
3850       change_queue_index (next, QUEUE_NOWHERE);
3851       return -1;
3852     }
3853   else if (!(*ts & BEGIN_SPEC) && ORIG_PAT (next) && !IS_SPECULATION_CHECK_P (next))
3854     /* We should change pattern of every previously speculative
3855        instruction - and we determine if NEXT was speculative by using
3856        ORIG_PAT field.  Except one case - speculation checks have ORIG_PAT
3857        pat too, so skip them.  */
3858     {
3859       haifa_change_pattern (next, ORIG_PAT (next));
3860       ORIG_PAT (next) = 0;
3861     }
3862
3863   if (sched_verbose >= 2)
3864     {
3865       int s = TODO_SPEC (next);
3866
3867       fprintf (sched_dump, ";;\t\tdependencies resolved: insn %s",
3868                (*current_sched_info->print_insn) (next, 0));
3869
3870       if (spec_info && spec_info->dump)
3871         {
3872           if (s & BEGIN_DATA)
3873             fprintf (spec_info->dump, "; data-spec;");
3874           if (s & BEGIN_CONTROL)
3875             fprintf (spec_info->dump, "; control-spec;");
3876           if (s & BE_IN_CONTROL)
3877             fprintf (spec_info->dump, "; in-control-spec;");
3878         }
3879
3880       fprintf (sched_dump, "\n");
3881     }
3882
3883   adjust_priority (next);
3884
3885   return fix_tick_ready (next);
3886 }
3887
3888 /* Calculate INSN_TICK of NEXT and add it to either ready or queue list.  */
3889 static int
3890 fix_tick_ready (rtx next)
3891 {
3892   int tick, delay;
3893
3894   if (!sd_lists_empty_p (next, SD_LIST_RES_BACK))
3895     {
3896       int full_p;
3897       sd_iterator_def sd_it;
3898       dep_t dep;
3899
3900       tick = INSN_TICK (next);
3901       /* if tick is not equal to INVALID_TICK, then update
3902          INSN_TICK of NEXT with the most recent resolved dependence
3903          cost.  Otherwise, recalculate from scratch.  */
3904       full_p = (tick == INVALID_TICK);
3905
3906       FOR_EACH_DEP (next, SD_LIST_RES_BACK, sd_it, dep)
3907         {
3908           rtx pro = DEP_PRO (dep);
3909           int tick1;
3910
3911           gcc_assert (INSN_TICK (pro) >= MIN_TICK);
3912
3913           tick1 = INSN_TICK (pro) + dep_cost (dep);
3914           if (tick1 > tick)
3915             tick = tick1;
3916
3917           if (!full_p)
3918             break;
3919         }
3920     }
3921   else
3922     tick = -1;
3923
3924   INSN_TICK (next) = tick;
3925
3926   delay = tick - clock_var;
3927   if (delay <= 0 || sched_pressure_p)
3928     delay = QUEUE_READY;
3929
3930   change_queue_index (next, delay);
3931
3932   return delay;
3933 }
3934
3935 /* Move NEXT to the proper queue list with (DELAY >= 1),
3936    or add it to the ready list (DELAY == QUEUE_READY),
3937    or remove it from ready and queue lists at all (DELAY == QUEUE_NOWHERE).  */
3938 static void
3939 change_queue_index (rtx next, int delay)
3940 {
3941   int i = QUEUE_INDEX (next);
3942
3943   gcc_assert (QUEUE_NOWHERE <= delay && delay <= max_insn_queue_index
3944               && delay != 0);
3945   gcc_assert (i != QUEUE_SCHEDULED);
3946
3947   if ((delay > 0 && NEXT_Q_AFTER (q_ptr, delay) == i)
3948       || (delay < 0 && delay == i))
3949     /* We have nothing to do.  */
3950     return;
3951
3952   /* Remove NEXT from wherever it is now.  */
3953   if (i == QUEUE_READY)
3954     ready_remove_insn (next);
3955   else if (i >= 0)
3956     queue_remove (next);
3957
3958   /* Add it to the proper place.  */
3959   if (delay == QUEUE_READY)
3960     ready_add (readyp, next, false);
3961   else if (delay >= 1)
3962     queue_insn (next, delay);
3963
3964   if (sched_verbose >= 2)
3965     {
3966       fprintf (sched_dump, ";;\t\ttick updated: insn %s",
3967                (*current_sched_info->print_insn) (next, 0));
3968
3969       if (delay == QUEUE_READY)
3970         fprintf (sched_dump, " into ready\n");
3971       else if (delay >= 1)
3972         fprintf (sched_dump, " into queue with cost=%d\n", delay);
3973       else
3974         fprintf (sched_dump, " removed from ready or queue lists\n");
3975     }
3976 }
3977
3978 static int sched_ready_n_insns = -1;
3979
3980 /* Initialize per region data structures.  */
3981 void
3982 sched_extend_ready_list (int new_sched_ready_n_insns)
3983 {
3984   int i;
3985
3986   if (sched_ready_n_insns == -1)
3987     /* At the first call we need to initialize one more choice_stack
3988        entry.  */
3989     {
3990       i = 0;
3991       sched_ready_n_insns = 0;
3992     }
3993   else
3994     i = sched_ready_n_insns + 1;
3995
3996   ready.veclen = new_sched_ready_n_insns + issue_rate;
3997   ready.vec = XRESIZEVEC (rtx, ready.vec, ready.veclen);
3998
3999   gcc_assert (new_sched_ready_n_insns >= sched_ready_n_insns);
4000
4001   ready_try = (char *) xrecalloc (ready_try, new_sched_ready_n_insns,
4002                                   sched_ready_n_insns, sizeof (*ready_try));
4003
4004   /* We allocate +1 element to save initial state in the choice_stack[0]
4005      entry.  */
4006   choice_stack = XRESIZEVEC (struct choice_entry, choice_stack,
4007                              new_sched_ready_n_insns + 1);
4008
4009   for (; i <= new_sched_ready_n_insns; i++)
4010     choice_stack[i].state = xmalloc (dfa_state_size);
4011
4012   sched_ready_n_insns = new_sched_ready_n_insns;
4013 }
4014
4015 /* Free per region data structures.  */
4016 void
4017 sched_finish_ready_list (void)
4018 {
4019   int i;
4020
4021   free (ready.vec);
4022   ready.vec = NULL;
4023   ready.veclen = 0;
4024
4025   free (ready_try);
4026   ready_try = NULL;
4027
4028   for (i = 0; i <= sched_ready_n_insns; i++)
4029     free (choice_stack [i].state);
4030   free (choice_stack);
4031   choice_stack = NULL;
4032
4033   sched_ready_n_insns = -1;
4034 }
4035
4036 static int
4037 haifa_luid_for_non_insn (rtx x)
4038 {
4039   gcc_assert (NOTE_P (x) || LABEL_P (x));
4040
4041   return 0;
4042 }
4043
4044 /* Generates recovery code for INSN.  */
4045 static void
4046 generate_recovery_code (rtx insn)
4047 {
4048   if (TODO_SPEC (insn) & BEGIN_SPEC)
4049     begin_speculative_block (insn);
4050
4051   /* Here we have insn with no dependencies to
4052      instructions other then CHECK_SPEC ones.  */
4053
4054   if (TODO_SPEC (insn) & BE_IN_SPEC)
4055     add_to_speculative_block (insn);
4056 }
4057
4058 /* Helper function.
4059    Tries to add speculative dependencies of type FS between instructions
4060    in deps_list L and TWIN.  */
4061 static void
4062 process_insn_forw_deps_be_in_spec (rtx insn, rtx twin, ds_t fs)
4063 {
4064   sd_iterator_def sd_it;
4065   dep_t dep;
4066
4067   FOR_EACH_DEP (insn, SD_LIST_FORW, sd_it, dep)
4068     {
4069       ds_t ds;
4070       rtx consumer;
4071
4072       consumer = DEP_CON (dep);
4073
4074       ds = DEP_STATUS (dep);
4075
4076       if (/* If we want to create speculative dep.  */
4077           fs
4078           /* And we can do that because this is a true dep.  */
4079           && (ds & DEP_TYPES) == DEP_TRUE)
4080         {
4081           gcc_assert (!(ds & BE_IN_SPEC));
4082
4083           if (/* If this dep can be overcome with 'begin speculation'.  */
4084               ds & BEGIN_SPEC)
4085             /* Then we have a choice: keep the dep 'begin speculative'
4086                or transform it into 'be in speculative'.  */
4087             {
4088               if (/* In try_ready we assert that if insn once became ready
4089                      it can be removed from the ready (or queue) list only
4090                      due to backend decision.  Hence we can't let the
4091                      probability of the speculative dep to decrease.  */
4092                   ds_weak (ds) <= ds_weak (fs))
4093                 {
4094                   ds_t new_ds;
4095
4096                   new_ds = (ds & ~BEGIN_SPEC) | fs;
4097
4098                   if (/* consumer can 'be in speculative'.  */
4099                       sched_insn_is_legitimate_for_speculation_p (consumer,
4100                                                                   new_ds))
4101                     /* Transform it to be in speculative.  */
4102                     ds = new_ds;
4103                 }
4104             }
4105           else
4106             /* Mark the dep as 'be in speculative'.  */
4107             ds |= fs;
4108         }
4109
4110       {
4111         dep_def _new_dep, *new_dep = &_new_dep;
4112
4113         init_dep_1 (new_dep, twin, consumer, DEP_TYPE (dep), ds);
4114         sd_add_dep (new_dep, false);
4115       }
4116     }
4117 }
4118
4119 /* Generates recovery code for BEGIN speculative INSN.  */
4120 static void
4121 begin_speculative_block (rtx insn)
4122 {
4123   if (TODO_SPEC (insn) & BEGIN_DATA)
4124     nr_begin_data++;
4125   if (TODO_SPEC (insn) & BEGIN_CONTROL)
4126     nr_begin_control++;
4127
4128   create_check_block_twin (insn, false);
4129
4130   TODO_SPEC (insn) &= ~BEGIN_SPEC;
4131 }
4132
4133 static void haifa_init_insn (rtx);
4134
4135 /* Generates recovery code for BE_IN speculative INSN.  */
4136 static void
4137 add_to_speculative_block (rtx insn)
4138 {
4139   ds_t ts;
4140   sd_iterator_def sd_it;
4141   dep_t dep;
4142   rtx twins = NULL;
4143   rtx_vec_t priorities_roots;
4144
4145   ts = TODO_SPEC (insn);
4146   gcc_assert (!(ts & ~BE_IN_SPEC));
4147
4148   if (ts & BE_IN_DATA)
4149     nr_be_in_data++;
4150   if (ts & BE_IN_CONTROL)
4151     nr_be_in_control++;
4152
4153   TODO_SPEC (insn) &= ~BE_IN_SPEC;
4154   gcc_assert (!TODO_SPEC (insn));
4155
4156   DONE_SPEC (insn) |= ts;
4157
4158   /* First we convert all simple checks to branchy.  */
4159   for (sd_it = sd_iterator_start (insn, SD_LIST_SPEC_BACK);
4160        sd_iterator_cond (&sd_it, &dep);)
4161     {
4162       rtx check = DEP_PRO (dep);
4163
4164       if (IS_SPECULATION_SIMPLE_CHECK_P (check))
4165         {
4166           create_check_block_twin (check, true);
4167
4168           /* Restart search.  */
4169           sd_it = sd_iterator_start (insn, SD_LIST_SPEC_BACK);
4170         }
4171       else
4172         /* Continue search.  */
4173         sd_iterator_next (&sd_it);
4174     }
4175
4176   priorities_roots = NULL;
4177   clear_priorities (insn, &priorities_roots);
4178
4179   while (1)
4180     {
4181       rtx check, twin;
4182       basic_block rec;
4183
4184       /* Get the first backward dependency of INSN.  */
4185       sd_it = sd_iterator_start (insn, SD_LIST_SPEC_BACK);
4186       if (!sd_iterator_cond (&sd_it, &dep))
4187         /* INSN has no backward dependencies left.  */
4188         break;
4189
4190       gcc_assert ((DEP_STATUS (dep) & BEGIN_SPEC) == 0
4191                   && (DEP_STATUS (dep) & BE_IN_SPEC) != 0
4192                   && (DEP_STATUS (dep) & DEP_TYPES) == DEP_TRUE);
4193
4194       check = DEP_PRO (dep);
4195
4196       gcc_assert (!IS_SPECULATION_CHECK_P (check) && !ORIG_PAT (check)
4197                   && QUEUE_INDEX (check) == QUEUE_NOWHERE);
4198
4199       rec = BLOCK_FOR_INSN (check);
4200
4201       twin = emit_insn_before (copy_insn (PATTERN (insn)), BB_END (rec));
4202       haifa_init_insn (twin);
4203
4204       sd_copy_back_deps (twin, insn, true);
4205
4206       if (sched_verbose && spec_info->dump)
4207         /* INSN_BB (insn) isn't determined for twin insns yet.
4208            So we can't use current_sched_info->print_insn.  */
4209         fprintf (spec_info->dump, ";;\t\tGenerated twin insn : %d/rec%d\n",
4210                  INSN_UID (twin), rec->index);
4211
4212       twins = alloc_INSN_LIST (twin, twins);
4213
4214       /* Add dependences between TWIN and all appropriate
4215          instructions from REC.  */
4216       FOR_EACH_DEP (insn, SD_LIST_SPEC_BACK, sd_it, dep)
4217         {
4218           rtx pro = DEP_PRO (dep);
4219
4220           gcc_assert (DEP_TYPE (dep) == REG_DEP_TRUE);
4221
4222           /* INSN might have dependencies from the instructions from
4223              several recovery blocks.  At this iteration we process those
4224              producers that reside in REC.  */
4225           if (BLOCK_FOR_INSN (pro) == rec)
4226             {
4227               dep_def _new_dep, *new_dep = &_new_dep;
4228
4229               init_dep (new_dep, pro, twin, REG_DEP_TRUE);
4230               sd_add_dep (new_dep, false);
4231             }
4232         }
4233
4234       process_insn_forw_deps_be_in_spec (insn, twin, ts);
4235
4236       /* Remove all dependencies between INSN and insns in REC.  */
4237       for (sd_it = sd_iterator_start (insn, SD_LIST_SPEC_BACK);
4238            sd_iterator_cond (&sd_it, &dep);)
4239         {
4240           rtx pro = DEP_PRO (dep);
4241
4242           if (BLOCK_FOR_INSN (pro) == rec)
4243             sd_delete_dep (sd_it);
4244           else
4245             sd_iterator_next (&sd_it);
4246         }
4247     }
4248
4249   /* We couldn't have added the dependencies between INSN and TWINS earlier
4250      because that would make TWINS appear in the INSN_BACK_DEPS (INSN).  */
4251   while (twins)
4252     {
4253       rtx twin;
4254
4255       twin = XEXP (twins, 0);
4256
4257       {
4258         dep_def _new_dep, *new_dep = &_new_dep;
4259
4260         init_dep (new_dep, insn, twin, REG_DEP_OUTPUT);
4261         sd_add_dep (new_dep, false);
4262       }
4263
4264       twin = XEXP (twins, 1);
4265       free_INSN_LIST_node (twins);
4266       twins = twin;
4267     }
4268
4269   calc_priorities (priorities_roots);
4270   VEC_free (rtx, heap, priorities_roots);
4271 }
4272
4273 /* Extends and fills with zeros (only the new part) array pointed to by P.  */
4274 void *
4275 xrecalloc (void *p, size_t new_nmemb, size_t old_nmemb, size_t size)
4276 {
4277   gcc_assert (new_nmemb >= old_nmemb);
4278   p = XRESIZEVAR (void, p, new_nmemb * size);
4279   memset (((char *) p) + old_nmemb * size, 0, (new_nmemb - old_nmemb) * size);
4280   return p;
4281 }
4282
4283 /* Helper function.
4284    Find fallthru edge from PRED.  */
4285 edge
4286 find_fallthru_edge (basic_block pred)
4287 {
4288   edge e;
4289   edge_iterator ei;
4290   basic_block succ;
4291
4292   succ = pred->next_bb;
4293   gcc_assert (succ->prev_bb == pred);
4294
4295   if (EDGE_COUNT (pred->succs) <= EDGE_COUNT (succ->preds))
4296     {
4297       FOR_EACH_EDGE (e, ei, pred->succs)
4298         if (e->flags & EDGE_FALLTHRU)
4299           {
4300             gcc_assert (e->dest == succ);
4301             return e;
4302           }
4303     }
4304   else
4305     {
4306       FOR_EACH_EDGE (e, ei, succ->preds)
4307         if (e->flags & EDGE_FALLTHRU)
4308           {
4309             gcc_assert (e->src == pred);
4310             return e;
4311           }
4312     }
4313
4314   return NULL;
4315 }
4316
4317 /* Extend per basic block data structures.  */
4318 static void
4319 sched_extend_bb (void)
4320 {
4321   rtx insn;
4322
4323   /* The following is done to keep current_sched_info->next_tail non null.  */
4324   insn = BB_END (EXIT_BLOCK_PTR->prev_bb);
4325   if (NEXT_INSN (insn) == 0
4326       || (!NOTE_P (insn)
4327           && !LABEL_P (insn)
4328           /* Don't emit a NOTE if it would end up before a BARRIER.  */
4329           && !BARRIER_P (NEXT_INSN (insn))))
4330     {
4331       rtx note = emit_note_after (NOTE_INSN_DELETED, insn);
4332       /* Make insn appear outside BB.  */
4333       set_block_for_insn (note, NULL);
4334       BB_END (EXIT_BLOCK_PTR->prev_bb) = insn;
4335     }
4336 }
4337
4338 /* Init per basic block data structures.  */
4339 void
4340 sched_init_bbs (void)
4341 {
4342   sched_extend_bb ();
4343 }
4344
4345 /* Initialize BEFORE_RECOVERY variable.  */
4346 static void
4347 init_before_recovery (basic_block *before_recovery_ptr)
4348 {
4349   basic_block last;
4350   edge e;
4351
4352   last = EXIT_BLOCK_PTR->prev_bb;
4353   e = find_fallthru_edge (last);
4354
4355   if (e)
4356     {
4357       /* We create two basic blocks:
4358          1. Single instruction block is inserted right after E->SRC
4359          and has jump to
4360          2. Empty block right before EXIT_BLOCK.
4361          Between these two blocks recovery blocks will be emitted.  */
4362
4363       basic_block single, empty;
4364       rtx x, label;
4365
4366       /* If the fallthrough edge to exit we've found is from the block we've
4367          created before, don't do anything more.  */
4368       if (last == after_recovery)
4369         return;
4370
4371       adding_bb_to_current_region_p = false;
4372
4373       single = sched_create_empty_bb (last);
4374       empty = sched_create_empty_bb (single);
4375
4376       /* Add new blocks to the root loop.  */
4377       if (current_loops != NULL)
4378         {
4379           add_bb_to_loop (single, VEC_index (loop_p, current_loops->larray, 0));
4380           add_bb_to_loop (empty, VEC_index (loop_p, current_loops->larray, 0));
4381         }
4382
4383       single->count = last->count;
4384       empty->count = last->count;
4385       single->frequency = last->frequency;
4386       empty->frequency = last->frequency;
4387       BB_COPY_PARTITION (single, last);
4388       BB_COPY_PARTITION (empty, last);
4389
4390       redirect_edge_succ (e, single);
4391       make_single_succ_edge (single, empty, 0);
4392       make_single_succ_edge (empty, EXIT_BLOCK_PTR,
4393                              EDGE_FALLTHRU | EDGE_CAN_FALLTHRU);
4394
4395       label = block_label (empty);
4396       x = emit_jump_insn_after (gen_jump (label), BB_END (single));
4397       JUMP_LABEL (x) = label;
4398       LABEL_NUSES (label)++;
4399       haifa_init_insn (x);
4400
4401       emit_barrier_after (x);
4402
4403       sched_init_only_bb (empty, NULL);
4404       sched_init_only_bb (single, NULL);
4405       sched_extend_bb ();
4406
4407       adding_bb_to_current_region_p = true;
4408       before_recovery = single;
4409       after_recovery = empty;
4410
4411       if (before_recovery_ptr)
4412         *before_recovery_ptr = before_recovery;
4413
4414       if (sched_verbose >= 2 && spec_info->dump)
4415         fprintf (spec_info->dump,
4416                  ";;\t\tFixed fallthru to EXIT : %d->>%d->%d->>EXIT\n",
4417                  last->index, single->index, empty->index);
4418     }
4419   else
4420     before_recovery = last;
4421 }
4422
4423 /* Returns new recovery block.  */
4424 basic_block
4425 sched_create_recovery_block (basic_block *before_recovery_ptr)
4426 {
4427   rtx label;
4428   rtx barrier;
4429   basic_block rec;
4430
4431   haifa_recovery_bb_recently_added_p = true;
4432   haifa_recovery_bb_ever_added_p = true;
4433
4434   init_before_recovery (before_recovery_ptr);
4435
4436   barrier = get_last_bb_insn (before_recovery);
4437   gcc_assert (BARRIER_P (barrier));
4438
4439   label = emit_label_after (gen_label_rtx (), barrier);
4440
4441   rec = create_basic_block (label, label, before_recovery);
4442
4443   /* A recovery block always ends with an unconditional jump.  */
4444   emit_barrier_after (BB_END (rec));
4445
4446   if (BB_PARTITION (before_recovery) != BB_UNPARTITIONED)
4447     BB_SET_PARTITION (rec, BB_COLD_PARTITION);
4448
4449   if (sched_verbose && spec_info->dump)
4450     fprintf (spec_info->dump, ";;\t\tGenerated recovery block rec%d\n",
4451              rec->index);
4452
4453   return rec;
4454 }
4455
4456 /* Create edges: FIRST_BB -> REC; FIRST_BB -> SECOND_BB; REC -> SECOND_BB
4457    and emit necessary jumps.  */
4458 void
4459 sched_create_recovery_edges (basic_block first_bb, basic_block rec,
4460                              basic_block second_bb)
4461 {
4462   rtx label;
4463   rtx jump;
4464   int edge_flags;
4465
4466   /* This is fixing of incoming edge.  */
4467   /* ??? Which other flags should be specified?  */
4468   if (BB_PARTITION (first_bb) != BB_PARTITION (rec))
4469     /* Partition type is the same, if it is "unpartitioned".  */
4470     edge_flags = EDGE_CROSSING;
4471   else
4472     edge_flags = 0;
4473
4474   make_edge (first_bb, rec, edge_flags);
4475   label = block_label (second_bb);
4476   jump = emit_jump_insn_after (gen_jump (label), BB_END (rec));
4477   JUMP_LABEL (jump) = label;
4478   LABEL_NUSES (label)++;
4479
4480   if (BB_PARTITION (second_bb) != BB_PARTITION (rec))
4481     /* Partition type is the same, if it is "unpartitioned".  */
4482     {
4483       /* Rewritten from cfgrtl.c.  */
4484       if (flag_reorder_blocks_and_partition
4485           && targetm.have_named_sections)
4486         {
4487           /* We don't need the same note for the check because
4488              any_condjump_p (check) == true.  */
4489           add_reg_note (jump, REG_CROSSING_JUMP, NULL_RTX);
4490         }
4491       edge_flags = EDGE_CROSSING;
4492     }
4493   else
4494     edge_flags = 0;
4495
4496   make_single_succ_edge (rec, second_bb, edge_flags);
4497 }
4498
4499 /* This function creates recovery code for INSN.  If MUTATE_P is nonzero,
4500    INSN is a simple check, that should be converted to branchy one.  */
4501 static void
4502 create_check_block_twin (rtx insn, bool mutate_p)
4503 {
4504   basic_block rec;
4505   rtx label, check, twin;
4506   ds_t fs;
4507   sd_iterator_def sd_it;
4508   dep_t dep;
4509   dep_def _new_dep, *new_dep = &_new_dep;
4510   ds_t todo_spec;
4511
4512   gcc_assert (ORIG_PAT (insn) != NULL_RTX);
4513
4514   if (!mutate_p)
4515     todo_spec = TODO_SPEC (insn);
4516   else
4517     {
4518       gcc_assert (IS_SPECULATION_SIMPLE_CHECK_P (insn)
4519                   && (TODO_SPEC (insn) & SPECULATIVE) == 0);
4520
4521       todo_spec = CHECK_SPEC (insn);
4522     }
4523
4524   todo_spec &= SPECULATIVE;
4525
4526   /* Create recovery block.  */
4527   if (mutate_p || targetm.sched.needs_block_p (todo_spec))
4528     {
4529       rec = sched_create_recovery_block (NULL);
4530       label = BB_HEAD (rec);
4531     }
4532   else
4533     {
4534       rec = EXIT_BLOCK_PTR;
4535       label = NULL_RTX;
4536     }
4537
4538   /* Emit CHECK.  */
4539   check = targetm.sched.gen_spec_check (insn, label, todo_spec);
4540
4541   if (rec != EXIT_BLOCK_PTR)
4542     {
4543       /* To have mem_reg alive at the beginning of second_bb,
4544          we emit check BEFORE insn, so insn after splitting
4545          insn will be at the beginning of second_bb, which will
4546          provide us with the correct life information.  */
4547       check = emit_jump_insn_before (check, insn);
4548       JUMP_LABEL (check) = label;
4549       LABEL_NUSES (label)++;
4550     }
4551   else
4552     check = emit_insn_before (check, insn);
4553
4554   /* Extend data structures.  */
4555   haifa_init_insn (check);
4556
4557   /* CHECK is being added to current region.  Extend ready list.  */
4558   gcc_assert (sched_ready_n_insns != -1);
4559   sched_extend_ready_list (sched_ready_n_insns + 1);
4560
4561   if (current_sched_info->add_remove_insn)
4562     current_sched_info->add_remove_insn (insn, 0);
4563
4564   RECOVERY_BLOCK (check) = rec;
4565
4566   if (sched_verbose && spec_info->dump)
4567     fprintf (spec_info->dump, ";;\t\tGenerated check insn : %s\n",
4568              (*current_sched_info->print_insn) (check, 0));
4569
4570   gcc_assert (ORIG_PAT (insn));
4571
4572   /* Initialize TWIN (twin is a duplicate of original instruction
4573      in the recovery block).  */
4574   if (rec != EXIT_BLOCK_PTR)
4575     {
4576       sd_iterator_def sd_it;
4577       dep_t dep;
4578
4579       FOR_EACH_DEP (insn, SD_LIST_RES_BACK, sd_it, dep)
4580         if ((DEP_STATUS (dep) & DEP_OUTPUT) != 0)
4581           {
4582             struct _dep _dep2, *dep2 = &_dep2;
4583
4584             init_dep (dep2, DEP_PRO (dep), check, REG_DEP_TRUE);
4585
4586             sd_add_dep (dep2, true);
4587           }
4588
4589       twin = emit_insn_after (ORIG_PAT (insn), BB_END (rec));
4590       haifa_init_insn (twin);
4591
4592       if (sched_verbose && spec_info->dump)
4593         /* INSN_BB (insn) isn't determined for twin insns yet.
4594            So we can't use current_sched_info->print_insn.  */
4595         fprintf (spec_info->dump, ";;\t\tGenerated twin insn : %d/rec%d\n",
4596                  INSN_UID (twin), rec->index);
4597     }
4598   else
4599     {
4600       ORIG_PAT (check) = ORIG_PAT (insn);
4601       HAS_INTERNAL_DEP (check) = 1;
4602       twin = check;
4603       /* ??? We probably should change all OUTPUT dependencies to
4604          (TRUE | OUTPUT).  */
4605     }
4606
4607   /* Copy all resolved back dependencies of INSN to TWIN.  This will
4608      provide correct value for INSN_TICK (TWIN).  */
4609   sd_copy_back_deps (twin, insn, true);
4610
4611   if (rec != EXIT_BLOCK_PTR)
4612     /* In case of branchy check, fix CFG.  */
4613     {
4614       basic_block first_bb, second_bb;
4615       rtx jump;
4616
4617       first_bb = BLOCK_FOR_INSN (check);
4618       second_bb = sched_split_block (first_bb, check);
4619
4620       sched_create_recovery_edges (first_bb, rec, second_bb);
4621
4622       sched_init_only_bb (second_bb, first_bb);
4623       sched_init_only_bb (rec, EXIT_BLOCK_PTR);
4624
4625       jump = BB_END (rec);
4626       haifa_init_insn (jump);
4627     }
4628
4629   /* Move backward dependences from INSN to CHECK and
4630      move forward dependences from INSN to TWIN.  */
4631
4632   /* First, create dependencies between INSN's producers and CHECK & TWIN.  */
4633   FOR_EACH_DEP (insn, SD_LIST_BACK, sd_it, dep)
4634     {
4635       rtx pro = DEP_PRO (dep);
4636       ds_t ds;
4637
4638       /* If BEGIN_DATA: [insn ~~TRUE~~> producer]:
4639          check --TRUE--> producer  ??? or ANTI ???
4640          twin  --TRUE--> producer
4641          twin  --ANTI--> check
4642
4643          If BEGIN_CONTROL: [insn ~~ANTI~~> producer]:
4644          check --ANTI--> producer
4645          twin  --ANTI--> producer
4646          twin  --ANTI--> check
4647
4648          If BE_IN_SPEC: [insn ~~TRUE~~> producer]:
4649          check ~~TRUE~~> producer
4650          twin  ~~TRUE~~> producer
4651          twin  --ANTI--> check  */
4652
4653       ds = DEP_STATUS (dep);
4654
4655       if (ds & BEGIN_SPEC)
4656         {
4657           gcc_assert (!mutate_p);
4658           ds &= ~BEGIN_SPEC;
4659         }
4660
4661       init_dep_1 (new_dep, pro, check, DEP_TYPE (dep), ds);
4662       sd_add_dep (new_dep, false);
4663
4664       if (rec != EXIT_BLOCK_PTR)
4665         {
4666           DEP_CON (new_dep) = twin;
4667           sd_add_dep (new_dep, false);
4668         }
4669     }
4670
4671   /* Second, remove backward dependencies of INSN.  */
4672   for (sd_it = sd_iterator_start (insn, SD_LIST_SPEC_BACK);
4673        sd_iterator_cond (&sd_it, &dep);)
4674     {
4675       if ((DEP_STATUS (dep) & BEGIN_SPEC)
4676           || mutate_p)
4677         /* We can delete this dep because we overcome it with
4678            BEGIN_SPECULATION.  */
4679         sd_delete_dep (sd_it);
4680       else
4681         sd_iterator_next (&sd_it);
4682     }
4683
4684   /* Future Speculations.  Determine what BE_IN speculations will be like.  */
4685   fs = 0;
4686
4687   /* Fields (DONE_SPEC (x) & BEGIN_SPEC) and CHECK_SPEC (x) are set only
4688      here.  */
4689
4690   gcc_assert (!DONE_SPEC (insn));
4691
4692   if (!mutate_p)
4693     {
4694       ds_t ts = TODO_SPEC (insn);
4695
4696       DONE_SPEC (insn) = ts & BEGIN_SPEC;
4697       CHECK_SPEC (check) = ts & BEGIN_SPEC;
4698
4699       /* Luckiness of future speculations solely depends upon initial
4700          BEGIN speculation.  */
4701       if (ts & BEGIN_DATA)
4702         fs = set_dep_weak (fs, BE_IN_DATA, get_dep_weak (ts, BEGIN_DATA));
4703       if (ts & BEGIN_CONTROL)
4704         fs = set_dep_weak (fs, BE_IN_CONTROL,
4705                            get_dep_weak (ts, BEGIN_CONTROL));
4706     }
4707   else
4708     CHECK_SPEC (check) = CHECK_SPEC (insn);
4709
4710   /* Future speculations: call the helper.  */
4711   process_insn_forw_deps_be_in_spec (insn, twin, fs);
4712
4713   if (rec != EXIT_BLOCK_PTR)
4714     {
4715       /* Which types of dependencies should we use here is,
4716          generally, machine-dependent question...  But, for now,
4717          it is not.  */
4718
4719       if (!mutate_p)
4720         {
4721           init_dep (new_dep, insn, check, REG_DEP_TRUE);
4722           sd_add_dep (new_dep, false);
4723
4724           init_dep (new_dep, insn, twin, REG_DEP_OUTPUT);
4725           sd_add_dep (new_dep, false);
4726         }
4727       else
4728         {
4729           if (spec_info->dump)
4730             fprintf (spec_info->dump, ";;\t\tRemoved simple check : %s\n",
4731                      (*current_sched_info->print_insn) (insn, 0));
4732
4733           /* Remove all dependencies of the INSN.  */
4734           {
4735             sd_it = sd_iterator_start (insn, (SD_LIST_FORW
4736                                               | SD_LIST_BACK
4737                                               | SD_LIST_RES_BACK));
4738             while (sd_iterator_cond (&sd_it, &dep))
4739               sd_delete_dep (sd_it);
4740           }
4741
4742           /* If former check (INSN) already was moved to the ready (or queue)
4743              list, add new check (CHECK) there too.  */
4744           if (QUEUE_INDEX (insn) != QUEUE_NOWHERE)
4745             try_ready (check);
4746
4747           /* Remove old check from instruction stream and free its
4748              data.  */
4749           sched_remove_insn (insn);
4750         }
4751
4752       init_dep (new_dep, check, twin, REG_DEP_ANTI);
4753       sd_add_dep (new_dep, false);
4754     }
4755   else
4756     {
4757       init_dep_1 (new_dep, insn, check, REG_DEP_TRUE, DEP_TRUE | DEP_OUTPUT);
4758       sd_add_dep (new_dep, false);
4759     }
4760
4761   if (!mutate_p)
4762     /* Fix priorities.  If MUTATE_P is nonzero, this is not necessary,
4763        because it'll be done later in add_to_speculative_block.  */
4764     {
4765       rtx_vec_t priorities_roots = NULL;
4766
4767       clear_priorities (twin, &priorities_roots);
4768       calc_priorities (priorities_roots);
4769       VEC_free (rtx, heap, priorities_roots);
4770     }
4771 }
4772
4773 /* Removes dependency between instructions in the recovery block REC
4774    and usual region instructions.  It keeps inner dependences so it
4775    won't be necessary to recompute them.  */
4776 static void
4777 fix_recovery_deps (basic_block rec)
4778 {
4779   rtx note, insn, jump, ready_list = 0;
4780   bitmap_head in_ready;
4781   rtx link;
4782
4783   bitmap_initialize (&in_ready, 0);
4784
4785   /* NOTE - a basic block note.  */
4786   note = NEXT_INSN (BB_HEAD (rec));
4787   gcc_assert (NOTE_INSN_BASIC_BLOCK_P (note));
4788   insn = BB_END (rec);
4789   gcc_assert (JUMP_P (insn));
4790   insn = PREV_INSN (insn);
4791
4792   do
4793     {
4794       sd_iterator_def sd_it;
4795       dep_t dep;
4796
4797       for (sd_it = sd_iterator_start (insn, SD_LIST_FORW);
4798            sd_iterator_cond (&sd_it, &dep);)
4799         {
4800           rtx consumer = DEP_CON (dep);
4801
4802           if (BLOCK_FOR_INSN (consumer) != rec)
4803             {
4804               sd_delete_dep (sd_it);
4805
4806               if (!bitmap_bit_p (&in_ready, INSN_LUID (consumer)))
4807                 {
4808                   ready_list = alloc_INSN_LIST (consumer, ready_list);
4809                   bitmap_set_bit (&in_ready, INSN_LUID (consumer));
4810                 }
4811             }
4812           else
4813             {
4814               gcc_assert ((DEP_STATUS (dep) & DEP_TYPES) == DEP_TRUE);
4815
4816               sd_iterator_next (&sd_it);
4817             }
4818         }
4819
4820       insn = PREV_INSN (insn);
4821     }
4822   while (insn != note);
4823
4824   bitmap_clear (&in_ready);
4825
4826   /* Try to add instructions to the ready or queue list.  */
4827   for (link = ready_list; link; link = XEXP (link, 1))
4828     try_ready (XEXP (link, 0));
4829   free_INSN_LIST_list (&ready_list);
4830
4831   /* Fixing jump's dependences.  */
4832   insn = BB_HEAD (rec);
4833   jump = BB_END (rec);
4834
4835   gcc_assert (LABEL_P (insn));
4836   insn = NEXT_INSN (insn);
4837
4838   gcc_assert (NOTE_INSN_BASIC_BLOCK_P (insn));
4839   add_jump_dependencies (insn, jump);
4840 }
4841
4842 /* Change pattern of INSN to NEW_PAT.  */
4843 void
4844 sched_change_pattern (rtx insn, rtx new_pat)
4845 {
4846   int t;
4847
4848   t = validate_change (insn, &PATTERN (insn), new_pat, 0);
4849   gcc_assert (t);
4850   dfa_clear_single_insn_cache (insn);
4851 }
4852
4853 /* Change pattern of INSN to NEW_PAT.  Invalidate cached haifa
4854    instruction data.  */
4855 static void
4856 haifa_change_pattern (rtx insn, rtx new_pat)
4857 {
4858   sched_change_pattern (insn, new_pat);
4859
4860   /* Invalidate INSN_COST, so it'll be recalculated.  */
4861   INSN_COST (insn) = -1;
4862   /* Invalidate INSN_TICK, so it'll be recalculated.  */
4863   INSN_TICK (insn) = INVALID_TICK;
4864 }
4865
4866 /* -1 - can't speculate,
4867    0 - for speculation with REQUEST mode it is OK to use
4868    current instruction pattern,
4869    1 - need to change pattern for *NEW_PAT to be speculative.  */
4870 int
4871 sched_speculate_insn (rtx insn, ds_t request, rtx *new_pat)
4872 {
4873   gcc_assert (current_sched_info->flags & DO_SPECULATION
4874               && (request & SPECULATIVE)
4875               && sched_insn_is_legitimate_for_speculation_p (insn, request));
4876
4877   if ((request & spec_info->mask) != request)
4878     return -1;
4879
4880   if (request & BE_IN_SPEC
4881       && !(request & BEGIN_SPEC))
4882     return 0;
4883
4884   return targetm.sched.speculate_insn (insn, request, new_pat);
4885 }
4886
4887 static int
4888 haifa_speculate_insn (rtx insn, ds_t request, rtx *new_pat)
4889 {
4890   gcc_assert (sched_deps_info->generate_spec_deps
4891               && !IS_SPECULATION_CHECK_P (insn));
4892
4893   if (HAS_INTERNAL_DEP (insn)
4894       || SCHED_GROUP_P (insn))
4895     return -1;
4896
4897   return sched_speculate_insn (insn, request, new_pat);
4898 }
4899
4900 /* Print some information about block BB, which starts with HEAD and
4901    ends with TAIL, before scheduling it.
4902    I is zero, if scheduler is about to start with the fresh ebb.  */
4903 static void
4904 dump_new_block_header (int i, basic_block bb, rtx head, rtx tail)
4905 {
4906   if (!i)
4907     fprintf (sched_dump,
4908              ";;   ======================================================\n");
4909   else
4910     fprintf (sched_dump,
4911              ";;   =====================ADVANCING TO=====================\n");
4912   fprintf (sched_dump,
4913            ";;   -- basic block %d from %d to %d -- %s reload\n",
4914            bb->index, INSN_UID (head), INSN_UID (tail),
4915            (reload_completed ? "after" : "before"));
4916   fprintf (sched_dump,
4917            ";;   ======================================================\n");
4918   fprintf (sched_dump, "\n");
4919 }
4920
4921 /* Unlink basic block notes and labels and saves them, so they
4922    can be easily restored.  We unlink basic block notes in EBB to
4923    provide back-compatibility with the previous code, as target backends
4924    assume, that there'll be only instructions between
4925    current_sched_info->{head and tail}.  We restore these notes as soon
4926    as we can.
4927    FIRST (LAST) is the first (last) basic block in the ebb.
4928    NB: In usual case (FIRST == LAST) nothing is really done.  */
4929 void
4930 unlink_bb_notes (basic_block first, basic_block last)
4931 {
4932   /* We DON'T unlink basic block notes of the first block in the ebb.  */
4933   if (first == last)
4934     return;
4935
4936   bb_header = XNEWVEC (rtx, last_basic_block);
4937
4938   /* Make a sentinel.  */
4939   if (last->next_bb != EXIT_BLOCK_PTR)
4940     bb_header[last->next_bb->index] = 0;
4941
4942   first = first->next_bb;
4943   do
4944     {
4945       rtx prev, label, note, next;
4946
4947       label = BB_HEAD (last);
4948       if (LABEL_P (label))
4949         note = NEXT_INSN (label);
4950       else
4951         note = label;
4952       gcc_assert (NOTE_INSN_BASIC_BLOCK_P (note));
4953
4954       prev = PREV_INSN (label);
4955       next = NEXT_INSN (note);
4956       gcc_assert (prev && next);
4957
4958       NEXT_INSN (prev) = next;
4959       PREV_INSN (next) = prev;
4960
4961       bb_header[last->index] = label;
4962
4963       if (last == first)
4964         break;
4965
4966       last = last->prev_bb;
4967     }
4968   while (1);
4969 }
4970
4971 /* Restore basic block notes.
4972    FIRST is the first basic block in the ebb.  */
4973 static void
4974 restore_bb_notes (basic_block first)
4975 {
4976   if (!bb_header)
4977     return;
4978
4979   /* We DON'T unlink basic block notes of the first block in the ebb.  */
4980   first = first->next_bb;
4981   /* Remember: FIRST is actually a second basic block in the ebb.  */
4982
4983   while (first != EXIT_BLOCK_PTR
4984          && bb_header[first->index])
4985     {
4986       rtx prev, label, note, next;
4987
4988       label = bb_header[first->index];
4989       prev = PREV_INSN (label);
4990       next = NEXT_INSN (prev);
4991
4992       if (LABEL_P (label))
4993         note = NEXT_INSN (label);
4994       else
4995         note = label;
4996       gcc_assert (NOTE_INSN_BASIC_BLOCK_P (note));
4997
4998       bb_header[first->index] = 0;
4999
5000       NEXT_INSN (prev) = label;
5001       NEXT_INSN (note) = next;
5002       PREV_INSN (next) = note;
5003
5004       first = first->next_bb;
5005     }
5006
5007   free (bb_header);
5008   bb_header = 0;
5009 }
5010
5011 /* Helper function.
5012    Fix CFG after both in- and inter-block movement of
5013    control_flow_insn_p JUMP.  */
5014 static void
5015 fix_jump_move (rtx jump)
5016 {
5017   basic_block bb, jump_bb, jump_bb_next;
5018
5019   bb = BLOCK_FOR_INSN (PREV_INSN (jump));
5020   jump_bb = BLOCK_FOR_INSN (jump);
5021   jump_bb_next = jump_bb->next_bb;
5022
5023   gcc_assert (common_sched_info->sched_pass_id == SCHED_EBB_PASS
5024               || IS_SPECULATION_BRANCHY_CHECK_P (jump));
5025
5026   if (!NOTE_INSN_BASIC_BLOCK_P (BB_END (jump_bb_next)))
5027     /* if jump_bb_next is not empty.  */
5028     BB_END (jump_bb) = BB_END (jump_bb_next);
5029
5030   if (BB_END (bb) != PREV_INSN (jump))
5031     /* Then there are instruction after jump that should be placed
5032        to jump_bb_next.  */
5033     BB_END (jump_bb_next) = BB_END (bb);
5034   else
5035     /* Otherwise jump_bb_next is empty.  */
5036     BB_END (jump_bb_next) = NEXT_INSN (BB_HEAD (jump_bb_next));
5037
5038   /* To make assertion in move_insn happy.  */
5039   BB_END (bb) = PREV_INSN (jump);
5040
5041   update_bb_for_insn (jump_bb_next);
5042 }
5043
5044 /* Fix CFG after interblock movement of control_flow_insn_p JUMP.  */
5045 static void
5046 move_block_after_check (rtx jump)
5047 {
5048   basic_block bb, jump_bb, jump_bb_next;
5049   VEC(edge,gc) *t;
5050
5051   bb = BLOCK_FOR_INSN (PREV_INSN (jump));
5052   jump_bb = BLOCK_FOR_INSN (jump);
5053   jump_bb_next = jump_bb->next_bb;
5054
5055   update_bb_for_insn (jump_bb);
5056
5057   gcc_assert (IS_SPECULATION_CHECK_P (jump)
5058               || IS_SPECULATION_CHECK_P (BB_END (jump_bb_next)));
5059
5060   unlink_block (jump_bb_next);
5061   link_block (jump_bb_next, bb);
5062
5063   t = bb->succs;
5064   bb->succs = 0;
5065   move_succs (&(jump_bb->succs), bb);
5066   move_succs (&(jump_bb_next->succs), jump_bb);
5067   move_succs (&t, jump_bb_next);
5068
5069   df_mark_solutions_dirty ();
5070
5071   common_sched_info->fix_recovery_cfg
5072     (bb->index, jump_bb->index, jump_bb_next->index);
5073 }
5074
5075 /* Helper function for move_block_after_check.
5076    This functions attaches edge vector pointed to by SUCCSP to
5077    block TO.  */
5078 static void
5079 move_succs (VEC(edge,gc) **succsp, basic_block to)
5080 {
5081   edge e;
5082   edge_iterator ei;
5083
5084   gcc_assert (to->succs == 0);
5085
5086   to->succs = *succsp;
5087
5088   FOR_EACH_EDGE (e, ei, to->succs)
5089     e->src = to;
5090
5091   *succsp = 0;
5092 }
5093
5094 /* Remove INSN from the instruction stream.
5095    INSN should have any dependencies.  */
5096 static void
5097 sched_remove_insn (rtx insn)
5098 {
5099   sd_finish_insn (insn);
5100
5101   change_queue_index (insn, QUEUE_NOWHERE);
5102   current_sched_info->add_remove_insn (insn, 1);
5103   remove_insn (insn);
5104 }
5105
5106 /* Clear priorities of all instructions, that are forward dependent on INSN.
5107    Store in vector pointed to by ROOTS_PTR insns on which priority () should
5108    be invoked to initialize all cleared priorities.  */
5109 static void
5110 clear_priorities (rtx insn, rtx_vec_t *roots_ptr)
5111 {
5112   sd_iterator_def sd_it;
5113   dep_t dep;
5114   bool insn_is_root_p = true;
5115
5116   gcc_assert (QUEUE_INDEX (insn) != QUEUE_SCHEDULED);
5117
5118   FOR_EACH_DEP (insn, SD_LIST_BACK, sd_it, dep)
5119     {
5120       rtx pro = DEP_PRO (dep);
5121
5122       if (INSN_PRIORITY_STATUS (pro) >= 0
5123           && QUEUE_INDEX (insn) != QUEUE_SCHEDULED)
5124         {
5125           /* If DEP doesn't contribute to priority then INSN itself should
5126              be added to priority roots.  */
5127           if (contributes_to_priority_p (dep))
5128             insn_is_root_p = false;
5129
5130           INSN_PRIORITY_STATUS (pro) = -1;
5131           clear_priorities (pro, roots_ptr);
5132         }
5133     }
5134
5135   if (insn_is_root_p)
5136     VEC_safe_push (rtx, heap, *roots_ptr, insn);
5137 }
5138
5139 /* Recompute priorities of instructions, whose priorities might have been
5140    changed.  ROOTS is a vector of instructions whose priority computation will
5141    trigger initialization of all cleared priorities.  */
5142 static void
5143 calc_priorities (rtx_vec_t roots)
5144 {
5145   int i;
5146   rtx insn;
5147
5148   for (i = 0; VEC_iterate (rtx, roots, i, insn); i++)
5149     priority (insn);
5150 }
5151
5152
5153 /* Add dependences between JUMP and other instructions in the recovery
5154    block.  INSN is the first insn the recovery block.  */
5155 static void
5156 add_jump_dependencies (rtx insn, rtx jump)
5157 {
5158   do
5159     {
5160       insn = NEXT_INSN (insn);
5161       if (insn == jump)
5162         break;
5163
5164       if (dep_list_size (insn) == 0)
5165         {
5166           dep_def _new_dep, *new_dep = &_new_dep;
5167
5168           init_dep (new_dep, insn, jump, REG_DEP_ANTI);
5169           sd_add_dep (new_dep, false);
5170         }
5171     }
5172   while (1);
5173
5174   gcc_assert (!sd_lists_empty_p (jump, SD_LIST_BACK));
5175 }
5176
5177 /* Return the NOTE_INSN_BASIC_BLOCK of BB.  */
5178 rtx
5179 bb_note (basic_block bb)
5180 {
5181   rtx note;
5182
5183   note = BB_HEAD (bb);
5184   if (LABEL_P (note))
5185     note = NEXT_INSN (note);
5186
5187   gcc_assert (NOTE_INSN_BASIC_BLOCK_P (note));
5188   return note;
5189 }
5190
5191 #ifdef ENABLE_CHECKING
5192 /* Helper function for check_cfg.
5193    Return nonzero, if edge vector pointed to by EL has edge with TYPE in
5194    its flags.  */
5195 static int
5196 has_edge_p (VEC(edge,gc) *el, int type)
5197 {
5198   edge e;
5199   edge_iterator ei;
5200
5201   FOR_EACH_EDGE (e, ei, el)
5202     if (e->flags & type)
5203       return 1;
5204   return 0;
5205 }
5206
5207 /* Search back, starting at INSN, for an insn that is not a
5208    NOTE_INSN_VAR_LOCATION.  Don't search beyond HEAD, and return it if
5209    no such insn can be found.  */
5210 static inline rtx
5211 prev_non_location_insn (rtx insn, rtx head)
5212 {
5213   while (insn != head && NOTE_P (insn)
5214          && NOTE_KIND (insn) == NOTE_INSN_VAR_LOCATION)
5215     insn = PREV_INSN (insn);
5216
5217   return insn;
5218 }
5219
5220 /* Check few properties of CFG between HEAD and TAIL.
5221    If HEAD (TAIL) is NULL check from the beginning (till the end) of the
5222    instruction stream.  */
5223 static void
5224 check_cfg (rtx head, rtx tail)
5225 {
5226   rtx next_tail;
5227   basic_block bb = 0;
5228   int not_first = 0, not_last;
5229
5230   if (head == NULL)
5231     head = get_insns ();
5232   if (tail == NULL)
5233     tail = get_last_insn ();
5234   next_tail = NEXT_INSN (tail);
5235
5236   do
5237     {
5238       not_last = head != tail;
5239
5240       if (not_first)
5241         gcc_assert (NEXT_INSN (PREV_INSN (head)) == head);
5242       if (not_last)
5243         gcc_assert (PREV_INSN (NEXT_INSN (head)) == head);
5244
5245       if (LABEL_P (head)
5246           || (NOTE_INSN_BASIC_BLOCK_P (head)
5247               && (!not_first
5248                   || (not_first && !LABEL_P (PREV_INSN (head))))))
5249         {
5250           gcc_assert (bb == 0);
5251           bb = BLOCK_FOR_INSN (head);
5252           if (bb != 0)
5253             gcc_assert (BB_HEAD (bb) == head);
5254           else
5255             /* This is the case of jump table.  See inside_basic_block_p ().  */
5256             gcc_assert (LABEL_P (head) && !inside_basic_block_p (head));
5257         }
5258
5259       if (bb == 0)
5260         {
5261           gcc_assert (!inside_basic_block_p (head));
5262           head = NEXT_INSN (head);
5263         }
5264       else
5265         {
5266           gcc_assert (inside_basic_block_p (head)
5267                       || NOTE_P (head));
5268           gcc_assert (BLOCK_FOR_INSN (head) == bb);
5269
5270           if (LABEL_P (head))
5271             {
5272               head = NEXT_INSN (head);
5273               gcc_assert (NOTE_INSN_BASIC_BLOCK_P (head));
5274             }
5275           else
5276             {
5277               if (control_flow_insn_p (head))
5278                 {
5279                   gcc_assert (prev_non_location_insn (BB_END (bb), head)
5280                               == head);
5281
5282                   if (any_uncondjump_p (head))
5283                     gcc_assert (EDGE_COUNT (bb->succs) == 1
5284                                 && BARRIER_P (NEXT_INSN (head)));
5285                   else if (any_condjump_p (head))
5286                     gcc_assert (/* Usual case.  */
5287                                 (EDGE_COUNT (bb->succs) > 1
5288                                  && !BARRIER_P (NEXT_INSN (head)))
5289                                 /* Or jump to the next instruction.  */
5290                                 || (EDGE_COUNT (bb->succs) == 1
5291                                     && (BB_HEAD (EDGE_I (bb->succs, 0)->dest)
5292                                         == JUMP_LABEL (head))));
5293                 }
5294               if (BB_END (bb) == head)
5295                 {
5296                   if (EDGE_COUNT (bb->succs) > 1)
5297                     gcc_assert (control_flow_insn_p (prev_non_location_insn
5298                                                      (head, BB_HEAD (bb)))
5299                                 || has_edge_p (bb->succs, EDGE_COMPLEX));
5300                   bb = 0;
5301                 }
5302
5303               head = NEXT_INSN (head);
5304             }
5305         }
5306
5307       not_first = 1;
5308     }
5309   while (head != next_tail);
5310
5311   gcc_assert (bb == 0);
5312 }
5313
5314 #endif /* ENABLE_CHECKING */
5315
5316 /* Extend per basic block data structures.  */
5317 static void
5318 extend_bb (void)
5319 {
5320   if (sched_scan_info->extend_bb)
5321     sched_scan_info->extend_bb ();
5322 }
5323
5324 /* Init data for BB.  */
5325 static void
5326 init_bb (basic_block bb)
5327 {
5328   if (sched_scan_info->init_bb)
5329     sched_scan_info->init_bb (bb);
5330 }
5331
5332 /* Extend per insn data structures.  */
5333 static void
5334 extend_insn (void)
5335 {
5336   if (sched_scan_info->extend_insn)
5337     sched_scan_info->extend_insn ();
5338 }
5339
5340 /* Init data structures for INSN.  */
5341 static void
5342 init_insn (rtx insn)
5343 {
5344   if (sched_scan_info->init_insn)
5345     sched_scan_info->init_insn (insn);
5346 }
5347
5348 /* Init all insns in BB.  */
5349 static void
5350 init_insns_in_bb (basic_block bb)
5351 {
5352   rtx insn;
5353
5354   FOR_BB_INSNS (bb, insn)
5355     init_insn (insn);
5356 }
5357
5358 /* A driver function to add a set of basic blocks (BBS),
5359    a single basic block (BB), a set of insns (INSNS) or a single insn (INSN)
5360    to the scheduling region.  */
5361 void
5362 sched_scan (const struct sched_scan_info_def *ssi,
5363             bb_vec_t bbs, basic_block bb, insn_vec_t insns, rtx insn)
5364 {
5365   sched_scan_info = ssi;
5366
5367   if (bbs != NULL || bb != NULL)
5368     {
5369       extend_bb ();
5370
5371       if (bbs != NULL)
5372         {
5373           unsigned i;
5374           basic_block x;
5375
5376           for (i = 0; VEC_iterate (basic_block, bbs, i, x); i++)
5377             init_bb (x);
5378         }
5379
5380       if (bb != NULL)
5381         init_bb (bb);
5382     }
5383
5384   extend_insn ();
5385
5386   if (bbs != NULL)
5387     {
5388       unsigned i;
5389       basic_block x;
5390
5391       for (i = 0; VEC_iterate (basic_block, bbs, i, x); i++)
5392         init_insns_in_bb (x);
5393     }
5394
5395   if (bb != NULL)
5396     init_insns_in_bb (bb);
5397
5398   if (insns != NULL)
5399     {
5400       unsigned i;
5401       rtx x;
5402
5403       for (i = 0; VEC_iterate (rtx, insns, i, x); i++)
5404         init_insn (x);
5405     }
5406
5407   if (insn != NULL)
5408     init_insn (insn);
5409 }
5410
5411
5412 /* Extend data structures for logical insn UID.  */
5413 static void
5414 luids_extend_insn (void)
5415 {
5416   int new_luids_max_uid = get_max_uid () + 1;
5417
5418   VEC_safe_grow_cleared (int, heap, sched_luids, new_luids_max_uid);
5419 }
5420
5421 /* Initialize LUID for INSN.  */
5422 static void
5423 luids_init_insn (rtx insn)
5424 {
5425   int i = INSN_P (insn) ? 1 : common_sched_info->luid_for_non_insn (insn);
5426   int luid;
5427
5428   if (i >= 0)
5429     {
5430       luid = sched_max_luid;
5431       sched_max_luid += i;
5432     }
5433   else
5434     luid = -1;
5435
5436   SET_INSN_LUID (insn, luid);
5437 }
5438
5439 /* Initialize luids for BBS, BB, INSNS and INSN.
5440    The hook common_sched_info->luid_for_non_insn () is used to determine
5441    if notes, labels, etc. need luids.  */
5442 void
5443 sched_init_luids (bb_vec_t bbs, basic_block bb, insn_vec_t insns, rtx insn)
5444 {
5445   const struct sched_scan_info_def ssi =
5446     {
5447       NULL, /* extend_bb */
5448       NULL, /* init_bb */
5449       luids_extend_insn, /* extend_insn */
5450       luids_init_insn /* init_insn */
5451     };
5452
5453   sched_scan (&ssi, bbs, bb, insns, insn);
5454 }
5455
5456 /* Free LUIDs.  */
5457 void
5458 sched_finish_luids (void)
5459 {
5460   VEC_free (int, heap, sched_luids);
5461   sched_max_luid = 1;
5462 }
5463
5464 /* Return logical uid of INSN.  Helpful while debugging.  */
5465 int
5466 insn_luid (rtx insn)
5467 {
5468   return INSN_LUID (insn);
5469 }
5470
5471 /* Extend per insn data in the target.  */
5472 void
5473 sched_extend_target (void)
5474 {
5475   if (targetm.sched.h_i_d_extended)
5476     targetm.sched.h_i_d_extended ();
5477 }
5478
5479 /* Extend global scheduler structures (those, that live across calls to
5480    schedule_block) to include information about just emitted INSN.  */
5481 static void
5482 extend_h_i_d (void)
5483 {
5484   int reserve = (get_max_uid () + 1
5485                  - VEC_length (haifa_insn_data_def, h_i_d));
5486   if (reserve > 0
5487       && ! VEC_space (haifa_insn_data_def, h_i_d, reserve))
5488     {
5489       VEC_safe_grow_cleared (haifa_insn_data_def, heap, h_i_d,
5490                              3 * get_max_uid () / 2);
5491       sched_extend_target ();
5492     }
5493 }
5494
5495 /* Initialize h_i_d entry of the INSN with default values.
5496    Values, that are not explicitly initialized here, hold zero.  */
5497 static void
5498 init_h_i_d (rtx insn)
5499 {
5500   if (INSN_LUID (insn) > 0)
5501     {
5502       INSN_COST (insn) = -1;
5503       QUEUE_INDEX (insn) = QUEUE_NOWHERE;
5504       INSN_TICK (insn) = INVALID_TICK;
5505       INTER_TICK (insn) = INVALID_TICK;
5506       TODO_SPEC (insn) = HARD_DEP;
5507     }
5508 }
5509
5510 /* Initialize haifa_insn_data for BBS, BB, INSNS and INSN.  */
5511 void
5512 haifa_init_h_i_d (bb_vec_t bbs, basic_block bb, insn_vec_t insns, rtx insn)
5513 {
5514   const struct sched_scan_info_def ssi =
5515     {
5516       NULL, /* extend_bb */
5517       NULL, /* init_bb */
5518       extend_h_i_d, /* extend_insn */
5519       init_h_i_d /* init_insn */
5520     };
5521
5522   sched_scan (&ssi, bbs, bb, insns, insn);
5523 }
5524
5525 /* Finalize haifa_insn_data.  */
5526 void
5527 haifa_finish_h_i_d (void)
5528 {
5529   int i;
5530   haifa_insn_data_t data;
5531   struct reg_use_data *use, *next;
5532
5533   for (i = 0; VEC_iterate (haifa_insn_data_def, h_i_d, i, data); i++)
5534     {
5535       if (data->reg_pressure != NULL)
5536         free (data->reg_pressure);
5537       for (use = data->reg_use_list; use != NULL; use = next)
5538         {
5539           next = use->next_insn_use;
5540           free (use);
5541         }
5542     }
5543   VEC_free (haifa_insn_data_def, heap, h_i_d);
5544 }
5545
5546 /* Init data for the new insn INSN.  */
5547 static void
5548 haifa_init_insn (rtx insn)
5549 {
5550   gcc_assert (insn != NULL);
5551
5552   sched_init_luids (NULL, NULL, NULL, insn);
5553   sched_extend_target ();
5554   sched_deps_init (false);
5555   haifa_init_h_i_d (NULL, NULL, NULL, insn);
5556
5557   if (adding_bb_to_current_region_p)
5558     {
5559       sd_init_insn (insn);
5560
5561       /* Extend dependency caches by one element.  */
5562       extend_dependency_caches (1, false);
5563     }
5564 }
5565
5566 /* Init data for the new basic block BB which comes after AFTER.  */
5567 static void
5568 haifa_init_only_bb (basic_block bb, basic_block after)
5569 {
5570   gcc_assert (bb != NULL);
5571
5572   sched_init_bbs ();
5573
5574   if (common_sched_info->add_block)
5575     /* This changes only data structures of the front-end.  */
5576     common_sched_info->add_block (bb, after);
5577 }
5578
5579 /* A generic version of sched_split_block ().  */
5580 basic_block
5581 sched_split_block_1 (basic_block first_bb, rtx after)
5582 {
5583   edge e;
5584
5585   e = split_block (first_bb, after);
5586   gcc_assert (e->src == first_bb);
5587
5588   /* sched_split_block emits note if *check == BB_END.  Probably it
5589      is better to rip that note off.  */
5590
5591   return e->dest;
5592 }
5593
5594 /* A generic version of sched_create_empty_bb ().  */
5595 basic_block
5596 sched_create_empty_bb_1 (basic_block after)
5597 {
5598   return create_empty_bb (after);
5599 }
5600
5601 /* Insert PAT as an INSN into the schedule and update the necessary data
5602    structures to account for it. */
5603 rtx
5604 sched_emit_insn (rtx pat)
5605 {
5606   rtx insn = emit_insn_after (pat, last_scheduled_insn);
5607   last_scheduled_insn = insn;
5608   haifa_init_insn (insn);
5609   return insn;
5610 }
5611
5612 #endif /* INSN_SCHEDULING */