Fix bootstrap/PR63632
[official-gcc.git] / gcc / haifa-sched.c
blobdb8a45cf5ecc2f5eeeb59dbbe20434a0815112c5
1 /* Instruction scheduling pass.
2 Copyright (C) 1992-2014 Free Software Foundation, Inc.
3 Contributed by Michael Tiemann (tiemann@cygnus.com) Enhanced by,
4 and currently maintained by, Jim Wilson (wilson@cygnus.com)
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
11 version.
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 for more details.
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
22 /* Instruction scheduling pass. This file, along with sched-deps.c,
23 contains the generic parts. The actual entry point for
24 the normal instruction scheduling pass is found in sched-rgn.c.
26 We compute insn priorities based on data dependencies. Flow
27 analysis only creates a fraction of the data-dependencies we must
28 observe: namely, only those dependencies which the combiner can be
29 expected to use. For this pass, we must therefore create the
30 remaining dependencies we need to observe: register dependencies,
31 memory dependencies, dependencies to keep function calls in order,
32 and the dependence between a conditional branch and the setting of
33 condition codes are all dealt with here.
35 The scheduler first traverses the data flow graph, starting with
36 the last instruction, and proceeding to the first, assigning values
37 to insn_priority as it goes. This sorts the instructions
38 topologically by data dependence.
40 Once priorities have been established, we order the insns using
41 list scheduling. This works as follows: starting with a list of
42 all the ready insns, and sorted according to priority number, we
43 schedule the insn from the end of the list by placing its
44 predecessors in the list according to their priority order. We
45 consider this insn scheduled by setting the pointer to the "end" of
46 the list to point to the previous insn. When an insn has no
47 predecessors, we either queue it until sufficient time has elapsed
48 or add it to the ready list. As the instructions are scheduled or
49 when stalls are introduced, the queue advances and dumps insns into
50 the ready list. When all insns down to the lowest priority have
51 been scheduled, the critical path of the basic block has been made
52 as short as possible. The remaining insns are then scheduled in
53 remaining slots.
55 The following list shows the order in which we want to break ties
56 among insns in the ready list:
58 1. choose insn with the longest path to end of bb, ties
59 broken by
60 2. choose insn with least contribution to register pressure,
61 ties broken by
62 3. prefer in-block upon interblock motion, ties broken by
63 4. prefer useful upon speculative motion, ties broken by
64 5. choose insn with largest control flow probability, ties
65 broken by
66 6. choose insn with the least dependences upon the previously
67 scheduled insn, or finally
68 7 choose the insn which has the most insns dependent on it.
69 8. choose insn with lowest UID.
71 Memory references complicate matters. Only if we can be certain
72 that memory references are not part of the data dependency graph
73 (via true, anti, or output dependence), can we move operations past
74 memory references. To first approximation, reads can be done
75 independently, while writes introduce dependencies. Better
76 approximations will yield fewer dependencies.
78 Before reload, an extended analysis of interblock data dependences
79 is required for interblock scheduling. This is performed in
80 compute_block_dependences ().
82 Dependencies set up by memory references are treated in exactly the
83 same way as other dependencies, by using insn backward dependences
84 INSN_BACK_DEPS. INSN_BACK_DEPS are translated into forward dependences
85 INSN_FORW_DEPS for the purpose of forward list scheduling.
87 Having optimized the critical path, we may have also unduly
88 extended the lifetimes of some registers. If an operation requires
89 that constants be loaded into registers, it is certainly desirable
90 to load those constants as early as necessary, but no earlier.
91 I.e., it will not do to load up a bunch of registers at the
92 beginning of a basic block only to use them at the end, if they
93 could be loaded later, since this may result in excessive register
94 utilization.
96 Note that since branches are never in basic blocks, but only end
97 basic blocks, this pass will not move branches. But that is ok,
98 since we can use GNU's delayed branch scheduling pass to take care
99 of this case.
101 Also note that no further optimizations based on algebraic
102 identities are performed, so this pass would be a good one to
103 perform instruction splitting, such as breaking up a multiply
104 instruction into shifts and adds where that is profitable.
106 Given the memory aliasing analysis that this pass should perform,
107 it should be possible to remove redundant stores to memory, and to
108 load values from registers instead of hitting memory.
110 Before reload, speculative insns are moved only if a 'proof' exists
111 that no exception will be caused by this, and if no live registers
112 exist that inhibit the motion (live registers constraints are not
113 represented by data dependence edges).
115 This pass must update information that subsequent passes expect to
116 be correct. Namely: reg_n_refs, reg_n_sets, reg_n_deaths,
117 reg_n_calls_crossed, and reg_live_length. Also, BB_HEAD, BB_END.
119 The information in the line number notes is carefully retained by
120 this pass. Notes that refer to the starting and ending of
121 exception regions are also carefully retained by this pass. All
122 other NOTE insns are grouped in their same relative order at the
123 beginning of basic blocks and regions that have been scheduled. */
125 #include "config.h"
126 #include "system.h"
127 #include "coretypes.h"
128 #include "tm.h"
129 #include "diagnostic-core.h"
130 #include "hard-reg-set.h"
131 #include "rtl.h"
132 #include "tm_p.h"
133 #include "regs.h"
134 #include "hashtab.h"
135 #include "hash-set.h"
136 #include "vec.h"
137 #include "machmode.h"
138 #include "input.h"
139 #include "function.h"
140 #include "flags.h"
141 #include "insn-config.h"
142 #include "insn-attr.h"
143 #include "except.h"
144 #include "recog.h"
145 #include "sched-int.h"
146 #include "target.h"
147 #include "common/common-target.h"
148 #include "params.h"
149 #include "dbgcnt.h"
150 #include "cfgloop.h"
151 #include "ira.h"
152 #include "emit-rtl.h" /* FIXME: Can go away once crtl is moved to rtl.h. */
153 #include "hash-table.h"
154 #include "dumpfile.h"
156 #ifdef INSN_SCHEDULING
158 /* True if we do register pressure relief through live-range
159 shrinkage. */
160 static bool live_range_shrinkage_p;
162 /* Switch on live range shrinkage. */
163 void
164 initialize_live_range_shrinkage (void)
166 live_range_shrinkage_p = true;
169 /* Switch off live range shrinkage. */
170 void
171 finish_live_range_shrinkage (void)
173 live_range_shrinkage_p = false;
176 /* issue_rate is the number of insns that can be scheduled in the same
177 machine cycle. It can be defined in the config/mach/mach.h file,
178 otherwise we set it to 1. */
180 int issue_rate;
182 /* This can be set to true by a backend if the scheduler should not
183 enable a DCE pass. */
184 bool sched_no_dce;
186 /* The current initiation interval used when modulo scheduling. */
187 static int modulo_ii;
189 /* The maximum number of stages we are prepared to handle. */
190 static int modulo_max_stages;
192 /* The number of insns that exist in each iteration of the loop. We use this
193 to detect when we've scheduled all insns from the first iteration. */
194 static int modulo_n_insns;
196 /* The current count of insns in the first iteration of the loop that have
197 already been scheduled. */
198 static int modulo_insns_scheduled;
200 /* The maximum uid of insns from the first iteration of the loop. */
201 static int modulo_iter0_max_uid;
203 /* The number of times we should attempt to backtrack when modulo scheduling.
204 Decreased each time we have to backtrack. */
205 static int modulo_backtracks_left;
207 /* The stage in which the last insn from the original loop was
208 scheduled. */
209 static int modulo_last_stage;
211 /* sched-verbose controls the amount of debugging output the
212 scheduler prints. It is controlled by -fsched-verbose=N:
213 N>0 and no -DSR : the output is directed to stderr.
214 N>=10 will direct the printouts to stderr (regardless of -dSR).
215 N=1: same as -dSR.
216 N=2: bb's probabilities, detailed ready list info, unit/insn info.
217 N=3: rtl at abort point, control-flow, regions info.
218 N=5: dependences info. */
220 int sched_verbose = 0;
222 /* Debugging file. All printouts are sent to dump, which is always set,
223 either to stderr, or to the dump listing file (-dRS). */
224 FILE *sched_dump = 0;
226 /* This is a placeholder for the scheduler parameters common
227 to all schedulers. */
228 struct common_sched_info_def *common_sched_info;
230 #define INSN_TICK(INSN) (HID (INSN)->tick)
231 #define INSN_EXACT_TICK(INSN) (HID (INSN)->exact_tick)
232 #define INSN_TICK_ESTIMATE(INSN) (HID (INSN)->tick_estimate)
233 #define INTER_TICK(INSN) (HID (INSN)->inter_tick)
234 #define FEEDS_BACKTRACK_INSN(INSN) (HID (INSN)->feeds_backtrack_insn)
235 #define SHADOW_P(INSN) (HID (INSN)->shadow_p)
236 #define MUST_RECOMPUTE_SPEC_P(INSN) (HID (INSN)->must_recompute_spec)
237 /* Cached cost of the instruction. Use insn_cost to get cost of the
238 insn. -1 here means that the field is not initialized. */
239 #define INSN_COST(INSN) (HID (INSN)->cost)
241 /* If INSN_TICK of an instruction is equal to INVALID_TICK,
242 then it should be recalculated from scratch. */
243 #define INVALID_TICK (-(max_insn_queue_index + 1))
244 /* The minimal value of the INSN_TICK of an instruction. */
245 #define MIN_TICK (-max_insn_queue_index)
247 /* List of important notes we must keep around. This is a pointer to the
248 last element in the list. */
249 rtx_insn *note_list;
251 static struct spec_info_def spec_info_var;
252 /* Description of the speculative part of the scheduling.
253 If NULL - no speculation. */
254 spec_info_t spec_info = NULL;
256 /* True, if recovery block was added during scheduling of current block.
257 Used to determine, if we need to fix INSN_TICKs. */
258 static bool haifa_recovery_bb_recently_added_p;
260 /* True, if recovery block was added during this scheduling pass.
261 Used to determine if we should have empty memory pools of dependencies
262 after finishing current region. */
263 bool haifa_recovery_bb_ever_added_p;
265 /* Counters of different types of speculative instructions. */
266 static int nr_begin_data, nr_be_in_data, nr_begin_control, nr_be_in_control;
268 /* Array used in {unlink, restore}_bb_notes. */
269 static rtx_insn **bb_header = 0;
271 /* Basic block after which recovery blocks will be created. */
272 static basic_block before_recovery;
274 /* Basic block just before the EXIT_BLOCK and after recovery, if we have
275 created it. */
276 basic_block after_recovery;
278 /* FALSE if we add bb to another region, so we don't need to initialize it. */
279 bool adding_bb_to_current_region_p = true;
281 /* Queues, etc. */
283 /* An instruction is ready to be scheduled when all insns preceding it
284 have already been scheduled. It is important to ensure that all
285 insns which use its result will not be executed until its result
286 has been computed. An insn is maintained in one of four structures:
288 (P) the "Pending" set of insns which cannot be scheduled until
289 their dependencies have been satisfied.
290 (Q) the "Queued" set of insns that can be scheduled when sufficient
291 time has passed.
292 (R) the "Ready" list of unscheduled, uncommitted insns.
293 (S) the "Scheduled" list of insns.
295 Initially, all insns are either "Pending" or "Ready" depending on
296 whether their dependencies are satisfied.
298 Insns move from the "Ready" list to the "Scheduled" list as they
299 are committed to the schedule. As this occurs, the insns in the
300 "Pending" list have their dependencies satisfied and move to either
301 the "Ready" list or the "Queued" set depending on whether
302 sufficient time has passed to make them ready. As time passes,
303 insns move from the "Queued" set to the "Ready" list.
305 The "Pending" list (P) are the insns in the INSN_FORW_DEPS of the
306 unscheduled insns, i.e., those that are ready, queued, and pending.
307 The "Queued" set (Q) is implemented by the variable `insn_queue'.
308 The "Ready" list (R) is implemented by the variables `ready' and
309 `n_ready'.
310 The "Scheduled" list (S) is the new insn chain built by this pass.
312 The transition (R->S) is implemented in the scheduling loop in
313 `schedule_block' when the best insn to schedule is chosen.
314 The transitions (P->R and P->Q) are implemented in `schedule_insn' as
315 insns move from the ready list to the scheduled list.
316 The transition (Q->R) is implemented in 'queue_to_insn' as time
317 passes or stalls are introduced. */
319 /* Implement a circular buffer to delay instructions until sufficient
320 time has passed. For the new pipeline description interface,
321 MAX_INSN_QUEUE_INDEX is a power of two minus one which is not less
322 than maximal time of instruction execution computed by genattr.c on
323 the base maximal time of functional unit reservations and getting a
324 result. This is the longest time an insn may be queued. */
326 static rtx_insn_list **insn_queue;
327 static int q_ptr = 0;
328 static int q_size = 0;
329 #define NEXT_Q(X) (((X)+1) & max_insn_queue_index)
330 #define NEXT_Q_AFTER(X, C) (((X)+C) & max_insn_queue_index)
332 #define QUEUE_SCHEDULED (-3)
333 #define QUEUE_NOWHERE (-2)
334 #define QUEUE_READY (-1)
335 /* QUEUE_SCHEDULED - INSN is scheduled.
336 QUEUE_NOWHERE - INSN isn't scheduled yet and is neither in
337 queue or ready list.
338 QUEUE_READY - INSN is in ready list.
339 N >= 0 - INSN queued for X [where NEXT_Q_AFTER (q_ptr, X) == N] cycles. */
341 #define QUEUE_INDEX(INSN) (HID (INSN)->queue_index)
343 /* The following variable value refers for all current and future
344 reservations of the processor units. */
345 state_t curr_state;
347 /* The following variable value is size of memory representing all
348 current and future reservations of the processor units. */
349 size_t dfa_state_size;
351 /* The following array is used to find the best insn from ready when
352 the automaton pipeline interface is used. */
353 signed char *ready_try = NULL;
355 /* The ready list. */
356 struct ready_list ready = {NULL, 0, 0, 0, 0};
358 /* The pointer to the ready list (to be removed). */
359 static struct ready_list *readyp = &ready;
361 /* Scheduling clock. */
362 static int clock_var;
364 /* Clock at which the previous instruction was issued. */
365 static int last_clock_var;
367 /* Set to true if, when queuing a shadow insn, we discover that it would be
368 scheduled too late. */
369 static bool must_backtrack;
371 /* The following variable value is number of essential insns issued on
372 the current cycle. An insn is essential one if it changes the
373 processors state. */
374 int cycle_issued_insns;
376 /* This records the actual schedule. It is built up during the main phase
377 of schedule_block, and afterwards used to reorder the insns in the RTL. */
378 static vec<rtx_insn *> scheduled_insns;
380 static int may_trap_exp (const_rtx, int);
382 /* Nonzero iff the address is comprised from at most 1 register. */
383 #define CONST_BASED_ADDRESS_P(x) \
384 (REG_P (x) \
385 || ((GET_CODE (x) == PLUS || GET_CODE (x) == MINUS \
386 || (GET_CODE (x) == LO_SUM)) \
387 && (CONSTANT_P (XEXP (x, 0)) \
388 || CONSTANT_P (XEXP (x, 1)))))
390 /* Returns a class that insn with GET_DEST(insn)=x may belong to,
391 as found by analyzing insn's expression. */
394 static int haifa_luid_for_non_insn (rtx x);
396 /* Haifa version of sched_info hooks common to all headers. */
397 const struct common_sched_info_def haifa_common_sched_info =
399 NULL, /* fix_recovery_cfg */
400 NULL, /* add_block */
401 NULL, /* estimate_number_of_insns */
402 haifa_luid_for_non_insn, /* luid_for_non_insn */
403 SCHED_PASS_UNKNOWN /* sched_pass_id */
406 /* Mapping from instruction UID to its Logical UID. */
407 vec<int> sched_luids = vNULL;
409 /* Next LUID to assign to an instruction. */
410 int sched_max_luid = 1;
412 /* Haifa Instruction Data. */
413 vec<haifa_insn_data_def> h_i_d = vNULL;
415 void (* sched_init_only_bb) (basic_block, basic_block);
417 /* Split block function. Different schedulers might use different functions
418 to handle their internal data consistent. */
419 basic_block (* sched_split_block) (basic_block, rtx);
421 /* Create empty basic block after the specified block. */
422 basic_block (* sched_create_empty_bb) (basic_block);
424 /* Return the number of cycles until INSN is expected to be ready.
425 Return zero if it already is. */
426 static int
427 insn_delay (rtx_insn *insn)
429 return MAX (INSN_TICK (insn) - clock_var, 0);
432 static int
433 may_trap_exp (const_rtx x, int is_store)
435 enum rtx_code code;
437 if (x == 0)
438 return TRAP_FREE;
439 code = GET_CODE (x);
440 if (is_store)
442 if (code == MEM && may_trap_p (x))
443 return TRAP_RISKY;
444 else
445 return TRAP_FREE;
447 if (code == MEM)
449 /* The insn uses memory: a volatile load. */
450 if (MEM_VOLATILE_P (x))
451 return IRISKY;
452 /* An exception-free load. */
453 if (!may_trap_p (x))
454 return IFREE;
455 /* A load with 1 base register, to be further checked. */
456 if (CONST_BASED_ADDRESS_P (XEXP (x, 0)))
457 return PFREE_CANDIDATE;
458 /* No info on the load, to be further checked. */
459 return PRISKY_CANDIDATE;
461 else
463 const char *fmt;
464 int i, insn_class = TRAP_FREE;
466 /* Neither store nor load, check if it may cause a trap. */
467 if (may_trap_p (x))
468 return TRAP_RISKY;
469 /* Recursive step: walk the insn... */
470 fmt = GET_RTX_FORMAT (code);
471 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
473 if (fmt[i] == 'e')
475 int tmp_class = may_trap_exp (XEXP (x, i), is_store);
476 insn_class = WORST_CLASS (insn_class, tmp_class);
478 else if (fmt[i] == 'E')
480 int j;
481 for (j = 0; j < XVECLEN (x, i); j++)
483 int tmp_class = may_trap_exp (XVECEXP (x, i, j), is_store);
484 insn_class = WORST_CLASS (insn_class, tmp_class);
485 if (insn_class == TRAP_RISKY || insn_class == IRISKY)
486 break;
489 if (insn_class == TRAP_RISKY || insn_class == IRISKY)
490 break;
492 return insn_class;
496 /* Classifies rtx X of an insn for the purpose of verifying that X can be
497 executed speculatively (and consequently the insn can be moved
498 speculatively), by examining X, returning:
499 TRAP_RISKY: store, or risky non-load insn (e.g. division by variable).
500 TRAP_FREE: non-load insn.
501 IFREE: load from a globally safe location.
502 IRISKY: volatile load.
503 PFREE_CANDIDATE, PRISKY_CANDIDATE: load that need to be checked for
504 being either PFREE or PRISKY. */
506 static int
507 haifa_classify_rtx (const_rtx x)
509 int tmp_class = TRAP_FREE;
510 int insn_class = TRAP_FREE;
511 enum rtx_code code;
513 if (GET_CODE (x) == PARALLEL)
515 int i, len = XVECLEN (x, 0);
517 for (i = len - 1; i >= 0; i--)
519 tmp_class = haifa_classify_rtx (XVECEXP (x, 0, i));
520 insn_class = WORST_CLASS (insn_class, tmp_class);
521 if (insn_class == TRAP_RISKY || insn_class == IRISKY)
522 break;
525 else
527 code = GET_CODE (x);
528 switch (code)
530 case CLOBBER:
531 /* Test if it is a 'store'. */
532 tmp_class = may_trap_exp (XEXP (x, 0), 1);
533 break;
534 case SET:
535 /* Test if it is a store. */
536 tmp_class = may_trap_exp (SET_DEST (x), 1);
537 if (tmp_class == TRAP_RISKY)
538 break;
539 /* Test if it is a load. */
540 tmp_class =
541 WORST_CLASS (tmp_class,
542 may_trap_exp (SET_SRC (x), 0));
543 break;
544 case COND_EXEC:
545 tmp_class = haifa_classify_rtx (COND_EXEC_CODE (x));
546 if (tmp_class == TRAP_RISKY)
547 break;
548 tmp_class = WORST_CLASS (tmp_class,
549 may_trap_exp (COND_EXEC_TEST (x), 0));
550 break;
551 case TRAP_IF:
552 tmp_class = TRAP_RISKY;
553 break;
554 default:;
556 insn_class = tmp_class;
559 return insn_class;
563 haifa_classify_insn (const_rtx insn)
565 return haifa_classify_rtx (PATTERN (insn));
568 /* After the scheduler initialization function has been called, this function
569 can be called to enable modulo scheduling. II is the initiation interval
570 we should use, it affects the delays for delay_pairs that were recorded as
571 separated by a given number of stages.
573 MAX_STAGES provides us with a limit
574 after which we give up scheduling; the caller must have unrolled at least
575 as many copies of the loop body and recorded delay_pairs for them.
577 INSNS is the number of real (non-debug) insns in one iteration of
578 the loop. MAX_UID can be used to test whether an insn belongs to
579 the first iteration of the loop; all of them have a uid lower than
580 MAX_UID. */
581 void
582 set_modulo_params (int ii, int max_stages, int insns, int max_uid)
584 modulo_ii = ii;
585 modulo_max_stages = max_stages;
586 modulo_n_insns = insns;
587 modulo_iter0_max_uid = max_uid;
588 modulo_backtracks_left = PARAM_VALUE (PARAM_MAX_MODULO_BACKTRACK_ATTEMPTS);
591 /* A structure to record a pair of insns where the first one is a real
592 insn that has delay slots, and the second is its delayed shadow.
593 I1 is scheduled normally and will emit an assembly instruction,
594 while I2 describes the side effect that takes place at the
595 transition between cycles CYCLES and (CYCLES + 1) after I1. */
596 struct delay_pair
598 struct delay_pair *next_same_i1;
599 rtx_insn *i1, *i2;
600 int cycles;
601 /* When doing modulo scheduling, we a delay_pair can also be used to
602 show that I1 and I2 are the same insn in a different stage. If that
603 is the case, STAGES will be nonzero. */
604 int stages;
607 /* Helpers for delay hashing. */
609 struct delay_i1_hasher : typed_noop_remove <delay_pair>
611 typedef delay_pair value_type;
612 typedef void compare_type;
613 static inline hashval_t hash (const value_type *);
614 static inline bool equal (const value_type *, const compare_type *);
617 /* Returns a hash value for X, based on hashing just I1. */
619 inline hashval_t
620 delay_i1_hasher::hash (const value_type *x)
622 return htab_hash_pointer (x->i1);
625 /* Return true if I1 of pair X is the same as that of pair Y. */
627 inline bool
628 delay_i1_hasher::equal (const value_type *x, const compare_type *y)
630 return x->i1 == y;
633 struct delay_i2_hasher : typed_free_remove <delay_pair>
635 typedef delay_pair value_type;
636 typedef void compare_type;
637 static inline hashval_t hash (const value_type *);
638 static inline bool equal (const value_type *, const compare_type *);
641 /* Returns a hash value for X, based on hashing just I2. */
643 inline hashval_t
644 delay_i2_hasher::hash (const value_type *x)
646 return htab_hash_pointer (x->i2);
649 /* Return true if I2 of pair X is the same as that of pair Y. */
651 inline bool
652 delay_i2_hasher::equal (const value_type *x, const compare_type *y)
654 return x->i2 == y;
657 /* Two hash tables to record delay_pairs, one indexed by I1 and the other
658 indexed by I2. */
659 static hash_table<delay_i1_hasher> *delay_htab;
660 static hash_table<delay_i2_hasher> *delay_htab_i2;
662 /* Called through htab_traverse. Walk the hashtable using I2 as
663 index, and delete all elements involving an UID higher than
664 that pointed to by *DATA. */
666 haifa_htab_i2_traverse (delay_pair **slot, int *data)
668 int maxuid = *data;
669 struct delay_pair *p = *slot;
670 if (INSN_UID (p->i2) >= maxuid || INSN_UID (p->i1) >= maxuid)
672 delay_htab_i2->clear_slot (slot);
674 return 1;
677 /* Called through htab_traverse. Walk the hashtable using I2 as
678 index, and delete all elements involving an UID higher than
679 that pointed to by *DATA. */
681 haifa_htab_i1_traverse (delay_pair **pslot, int *data)
683 int maxuid = *data;
684 struct delay_pair *p, *first, **pprev;
686 if (INSN_UID ((*pslot)->i1) >= maxuid)
688 delay_htab->clear_slot (pslot);
689 return 1;
691 pprev = &first;
692 for (p = *pslot; p; p = p->next_same_i1)
694 if (INSN_UID (p->i2) < maxuid)
696 *pprev = p;
697 pprev = &p->next_same_i1;
700 *pprev = NULL;
701 if (first == NULL)
702 delay_htab->clear_slot (pslot);
703 else
704 *pslot = first;
705 return 1;
708 /* Discard all delay pairs which involve an insn with an UID higher
709 than MAX_UID. */
710 void
711 discard_delay_pairs_above (int max_uid)
713 delay_htab->traverse <int *, haifa_htab_i1_traverse> (&max_uid);
714 delay_htab_i2->traverse <int *, haifa_htab_i2_traverse> (&max_uid);
717 /* This function can be called by a port just before it starts the final
718 scheduling pass. It records the fact that an instruction with delay
719 slots has been split into two insns, I1 and I2. The first one will be
720 scheduled normally and initiates the operation. The second one is a
721 shadow which must follow a specific number of cycles after I1; its only
722 purpose is to show the side effect that occurs at that cycle in the RTL.
723 If a JUMP_INSN or a CALL_INSN has been split, I1 should be a normal INSN,
724 while I2 retains the original insn type.
726 There are two ways in which the number of cycles can be specified,
727 involving the CYCLES and STAGES arguments to this function. If STAGES
728 is zero, we just use the value of CYCLES. Otherwise, STAGES is a factor
729 which is multiplied by MODULO_II to give the number of cycles. This is
730 only useful if the caller also calls set_modulo_params to enable modulo
731 scheduling. */
733 void
734 record_delay_slot_pair (rtx_insn *i1, rtx_insn *i2, int cycles, int stages)
736 struct delay_pair *p = XNEW (struct delay_pair);
737 struct delay_pair **slot;
739 p->i1 = i1;
740 p->i2 = i2;
741 p->cycles = cycles;
742 p->stages = stages;
744 if (!delay_htab)
746 delay_htab = new hash_table<delay_i1_hasher> (10);
747 delay_htab_i2 = new hash_table<delay_i2_hasher> (10);
749 slot = delay_htab->find_slot_with_hash (i1, htab_hash_pointer (i1), INSERT);
750 p->next_same_i1 = *slot;
751 *slot = p;
752 slot = delay_htab_i2->find_slot (p, INSERT);
753 *slot = p;
756 /* Examine the delay pair hashtable to see if INSN is a shadow for another,
757 and return the other insn if so. Return NULL otherwise. */
758 rtx_insn *
759 real_insn_for_shadow (rtx_insn *insn)
761 struct delay_pair *pair;
763 if (!delay_htab)
764 return NULL;
766 pair = delay_htab_i2->find_with_hash (insn, htab_hash_pointer (insn));
767 if (!pair || pair->stages > 0)
768 return NULL;
769 return pair->i1;
772 /* For a pair P of insns, return the fixed distance in cycles from the first
773 insn after which the second must be scheduled. */
774 static int
775 pair_delay (struct delay_pair *p)
777 if (p->stages == 0)
778 return p->cycles;
779 else
780 return p->stages * modulo_ii;
783 /* Given an insn INSN, add a dependence on its delayed shadow if it
784 has one. Also try to find situations where shadows depend on each other
785 and add dependencies to the real insns to limit the amount of backtracking
786 needed. */
787 void
788 add_delay_dependencies (rtx_insn *insn)
790 struct delay_pair *pair;
791 sd_iterator_def sd_it;
792 dep_t dep;
794 if (!delay_htab)
795 return;
797 pair = delay_htab_i2->find_with_hash (insn, htab_hash_pointer (insn));
798 if (!pair)
799 return;
800 add_dependence (insn, pair->i1, REG_DEP_ANTI);
801 if (pair->stages)
802 return;
804 FOR_EACH_DEP (pair->i2, SD_LIST_BACK, sd_it, dep)
806 rtx_insn *pro = DEP_PRO (dep);
807 struct delay_pair *other_pair
808 = delay_htab_i2->find_with_hash (pro, htab_hash_pointer (pro));
809 if (!other_pair || other_pair->stages)
810 continue;
811 if (pair_delay (other_pair) >= pair_delay (pair))
813 if (sched_verbose >= 4)
815 fprintf (sched_dump, ";;\tadding dependence %d <- %d\n",
816 INSN_UID (other_pair->i1),
817 INSN_UID (pair->i1));
818 fprintf (sched_dump, ";;\tpair1 %d <- %d, cost %d\n",
819 INSN_UID (pair->i1),
820 INSN_UID (pair->i2),
821 pair_delay (pair));
822 fprintf (sched_dump, ";;\tpair2 %d <- %d, cost %d\n",
823 INSN_UID (other_pair->i1),
824 INSN_UID (other_pair->i2),
825 pair_delay (other_pair));
827 add_dependence (pair->i1, other_pair->i1, REG_DEP_ANTI);
832 /* Forward declarations. */
834 static int priority (rtx_insn *);
835 static int rank_for_schedule (const void *, const void *);
836 static void swap_sort (rtx_insn **, int);
837 static void queue_insn (rtx_insn *, int, const char *);
838 static int schedule_insn (rtx_insn *);
839 static void adjust_priority (rtx_insn *);
840 static void advance_one_cycle (void);
841 static void extend_h_i_d (void);
844 /* Notes handling mechanism:
845 =========================
846 Generally, NOTES are saved before scheduling and restored after scheduling.
847 The scheduler distinguishes between two types of notes:
849 (1) LOOP_BEGIN, LOOP_END, SETJMP, EHREGION_BEG, EHREGION_END notes:
850 Before scheduling a region, a pointer to the note is added to the insn
851 that follows or precedes it. (This happens as part of the data dependence
852 computation). After scheduling an insn, the pointer contained in it is
853 used for regenerating the corresponding note (in reemit_notes).
855 (2) All other notes (e.g. INSN_DELETED): Before scheduling a block,
856 these notes are put in a list (in rm_other_notes() and
857 unlink_other_notes ()). After scheduling the block, these notes are
858 inserted at the beginning of the block (in schedule_block()). */
860 static void ready_add (struct ready_list *, rtx_insn *, bool);
861 static rtx_insn *ready_remove_first (struct ready_list *);
862 static rtx_insn *ready_remove_first_dispatch (struct ready_list *ready);
864 static void queue_to_ready (struct ready_list *);
865 static int early_queue_to_ready (state_t, struct ready_list *);
867 /* The following functions are used to implement multi-pass scheduling
868 on the first cycle. */
869 static rtx_insn *ready_remove (struct ready_list *, int);
870 static void ready_remove_insn (rtx);
872 static void fix_inter_tick (rtx_insn *, rtx_insn *);
873 static int fix_tick_ready (rtx_insn *);
874 static void change_queue_index (rtx_insn *, int);
876 /* The following functions are used to implement scheduling of data/control
877 speculative instructions. */
879 static void extend_h_i_d (void);
880 static void init_h_i_d (rtx_insn *);
881 static int haifa_speculate_insn (rtx_insn *, ds_t, rtx *);
882 static void generate_recovery_code (rtx_insn *);
883 static void process_insn_forw_deps_be_in_spec (rtx, rtx_insn *, ds_t);
884 static void begin_speculative_block (rtx_insn *);
885 static void add_to_speculative_block (rtx_insn *);
886 static void init_before_recovery (basic_block *);
887 static void create_check_block_twin (rtx_insn *, bool);
888 static void fix_recovery_deps (basic_block);
889 static bool haifa_change_pattern (rtx_insn *, rtx);
890 static void dump_new_block_header (int, basic_block, rtx_insn *, rtx_insn *);
891 static void restore_bb_notes (basic_block);
892 static void fix_jump_move (rtx_insn *);
893 static void move_block_after_check (rtx_insn *);
894 static void move_succs (vec<edge, va_gc> **, basic_block);
895 static void sched_remove_insn (rtx_insn *);
896 static void clear_priorities (rtx_insn *, rtx_vec_t *);
897 static void calc_priorities (rtx_vec_t);
898 static void add_jump_dependencies (rtx_insn *, rtx_insn *);
900 #endif /* INSN_SCHEDULING */
902 /* Point to state used for the current scheduling pass. */
903 struct haifa_sched_info *current_sched_info;
905 #ifndef INSN_SCHEDULING
906 void
907 schedule_insns (void)
910 #else
912 /* Do register pressure sensitive insn scheduling if the flag is set
913 up. */
914 enum sched_pressure_algorithm sched_pressure;
916 /* Map regno -> its pressure class. The map defined only when
917 SCHED_PRESSURE != SCHED_PRESSURE_NONE. */
918 enum reg_class *sched_regno_pressure_class;
920 /* The current register pressure. Only elements corresponding pressure
921 classes are defined. */
922 static int curr_reg_pressure[N_REG_CLASSES];
924 /* Saved value of the previous array. */
925 static int saved_reg_pressure[N_REG_CLASSES];
927 /* Register living at given scheduling point. */
928 static bitmap curr_reg_live;
930 /* Saved value of the previous array. */
931 static bitmap saved_reg_live;
933 /* Registers mentioned in the current region. */
934 static bitmap region_ref_regs;
936 /* Initiate register pressure relative info for scheduling the current
937 region. Currently it is only clearing register mentioned in the
938 current region. */
939 void
940 sched_init_region_reg_pressure_info (void)
942 bitmap_clear (region_ref_regs);
945 /* PRESSURE[CL] describes the pressure on register class CL. Update it
946 for the birth (if BIRTH_P) or death (if !BIRTH_P) of register REGNO.
947 LIVE tracks the set of live registers; if it is null, assume that
948 every birth or death is genuine. */
949 static inline void
950 mark_regno_birth_or_death (bitmap live, int *pressure, int regno, bool birth_p)
952 enum reg_class pressure_class;
954 pressure_class = sched_regno_pressure_class[regno];
955 if (regno >= FIRST_PSEUDO_REGISTER)
957 if (pressure_class != NO_REGS)
959 if (birth_p)
961 if (!live || bitmap_set_bit (live, regno))
962 pressure[pressure_class]
963 += (ira_reg_class_max_nregs
964 [pressure_class][PSEUDO_REGNO_MODE (regno)]);
966 else
968 if (!live || bitmap_clear_bit (live, regno))
969 pressure[pressure_class]
970 -= (ira_reg_class_max_nregs
971 [pressure_class][PSEUDO_REGNO_MODE (regno)]);
975 else if (pressure_class != NO_REGS
976 && ! TEST_HARD_REG_BIT (ira_no_alloc_regs, regno))
978 if (birth_p)
980 if (!live || bitmap_set_bit (live, regno))
981 pressure[pressure_class]++;
983 else
985 if (!live || bitmap_clear_bit (live, regno))
986 pressure[pressure_class]--;
991 /* Initiate current register pressure related info from living
992 registers given by LIVE. */
993 static void
994 initiate_reg_pressure_info (bitmap live)
996 int i;
997 unsigned int j;
998 bitmap_iterator bi;
1000 for (i = 0; i < ira_pressure_classes_num; i++)
1001 curr_reg_pressure[ira_pressure_classes[i]] = 0;
1002 bitmap_clear (curr_reg_live);
1003 EXECUTE_IF_SET_IN_BITMAP (live, 0, j, bi)
1004 if (sched_pressure == SCHED_PRESSURE_MODEL
1005 || current_nr_blocks == 1
1006 || bitmap_bit_p (region_ref_regs, j))
1007 mark_regno_birth_or_death (curr_reg_live, curr_reg_pressure, j, true);
1010 /* Mark registers in X as mentioned in the current region. */
1011 static void
1012 setup_ref_regs (rtx x)
1014 int i, j, regno;
1015 const RTX_CODE code = GET_CODE (x);
1016 const char *fmt;
1018 if (REG_P (x))
1020 regno = REGNO (x);
1021 if (HARD_REGISTER_NUM_P (regno))
1022 bitmap_set_range (region_ref_regs, regno,
1023 hard_regno_nregs[regno][GET_MODE (x)]);
1024 else
1025 bitmap_set_bit (region_ref_regs, REGNO (x));
1026 return;
1028 fmt = GET_RTX_FORMAT (code);
1029 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1030 if (fmt[i] == 'e')
1031 setup_ref_regs (XEXP (x, i));
1032 else if (fmt[i] == 'E')
1034 for (j = 0; j < XVECLEN (x, i); j++)
1035 setup_ref_regs (XVECEXP (x, i, j));
1039 /* Initiate current register pressure related info at the start of
1040 basic block BB. */
1041 static void
1042 initiate_bb_reg_pressure_info (basic_block bb)
1044 unsigned int i ATTRIBUTE_UNUSED;
1045 rtx_insn *insn;
1047 if (current_nr_blocks > 1)
1048 FOR_BB_INSNS (bb, insn)
1049 if (NONDEBUG_INSN_P (insn))
1050 setup_ref_regs (PATTERN (insn));
1051 initiate_reg_pressure_info (df_get_live_in (bb));
1052 #ifdef EH_RETURN_DATA_REGNO
1053 if (bb_has_eh_pred (bb))
1054 for (i = 0; ; ++i)
1056 unsigned int regno = EH_RETURN_DATA_REGNO (i);
1058 if (regno == INVALID_REGNUM)
1059 break;
1060 if (! bitmap_bit_p (df_get_live_in (bb), regno))
1061 mark_regno_birth_or_death (curr_reg_live, curr_reg_pressure,
1062 regno, true);
1064 #endif
1067 /* Save current register pressure related info. */
1068 static void
1069 save_reg_pressure (void)
1071 int i;
1073 for (i = 0; i < ira_pressure_classes_num; i++)
1074 saved_reg_pressure[ira_pressure_classes[i]]
1075 = curr_reg_pressure[ira_pressure_classes[i]];
1076 bitmap_copy (saved_reg_live, curr_reg_live);
1079 /* Restore saved register pressure related info. */
1080 static void
1081 restore_reg_pressure (void)
1083 int i;
1085 for (i = 0; i < ira_pressure_classes_num; i++)
1086 curr_reg_pressure[ira_pressure_classes[i]]
1087 = saved_reg_pressure[ira_pressure_classes[i]];
1088 bitmap_copy (curr_reg_live, saved_reg_live);
1091 /* Return TRUE if the register is dying after its USE. */
1092 static bool
1093 dying_use_p (struct reg_use_data *use)
1095 struct reg_use_data *next;
1097 for (next = use->next_regno_use; next != use; next = next->next_regno_use)
1098 if (NONDEBUG_INSN_P (next->insn)
1099 && QUEUE_INDEX (next->insn) != QUEUE_SCHEDULED)
1100 return false;
1101 return true;
1104 /* Print info about the current register pressure and its excess for
1105 each pressure class. */
1106 static void
1107 print_curr_reg_pressure (void)
1109 int i;
1110 enum reg_class cl;
1112 fprintf (sched_dump, ";;\t");
1113 for (i = 0; i < ira_pressure_classes_num; i++)
1115 cl = ira_pressure_classes[i];
1116 gcc_assert (curr_reg_pressure[cl] >= 0);
1117 fprintf (sched_dump, " %s:%d(%d)", reg_class_names[cl],
1118 curr_reg_pressure[cl],
1119 curr_reg_pressure[cl] - ira_class_hard_regs_num[cl]);
1121 fprintf (sched_dump, "\n");
1124 /* Determine if INSN has a condition that is clobbered if a register
1125 in SET_REGS is modified. */
1126 static bool
1127 cond_clobbered_p (rtx_insn *insn, HARD_REG_SET set_regs)
1129 rtx pat = PATTERN (insn);
1130 gcc_assert (GET_CODE (pat) == COND_EXEC);
1131 if (TEST_HARD_REG_BIT (set_regs, REGNO (XEXP (COND_EXEC_TEST (pat), 0))))
1133 sd_iterator_def sd_it;
1134 dep_t dep;
1135 haifa_change_pattern (insn, ORIG_PAT (insn));
1136 FOR_EACH_DEP (insn, SD_LIST_BACK, sd_it, dep)
1137 DEP_STATUS (dep) &= ~DEP_CANCELLED;
1138 TODO_SPEC (insn) = HARD_DEP;
1139 if (sched_verbose >= 2)
1140 fprintf (sched_dump,
1141 ";;\t\tdequeue insn %s because of clobbered condition\n",
1142 (*current_sched_info->print_insn) (insn, 0));
1143 return true;
1146 return false;
1149 /* This function should be called after modifying the pattern of INSN,
1150 to update scheduler data structures as needed. */
1151 static void
1152 update_insn_after_change (rtx_insn *insn)
1154 sd_iterator_def sd_it;
1155 dep_t dep;
1157 dfa_clear_single_insn_cache (insn);
1159 sd_it = sd_iterator_start (insn,
1160 SD_LIST_FORW | SD_LIST_BACK | SD_LIST_RES_BACK);
1161 while (sd_iterator_cond (&sd_it, &dep))
1163 DEP_COST (dep) = UNKNOWN_DEP_COST;
1164 sd_iterator_next (&sd_it);
1167 /* Invalidate INSN_COST, so it'll be recalculated. */
1168 INSN_COST (insn) = -1;
1169 /* Invalidate INSN_TICK, so it'll be recalculated. */
1170 INSN_TICK (insn) = INVALID_TICK;
1174 /* Two VECs, one to hold dependencies for which pattern replacements
1175 need to be applied or restored at the start of the next cycle, and
1176 another to hold an integer that is either one, to apply the
1177 corresponding replacement, or zero to restore it. */
1178 static vec<dep_t> next_cycle_replace_deps;
1179 static vec<int> next_cycle_apply;
1181 static void apply_replacement (dep_t, bool);
1182 static void restore_pattern (dep_t, bool);
1184 /* Look at the remaining dependencies for insn NEXT, and compute and return
1185 the TODO_SPEC value we should use for it. This is called after one of
1186 NEXT's dependencies has been resolved.
1187 We also perform pattern replacements for predication, and for broken
1188 replacement dependencies. The latter is only done if FOR_BACKTRACK is
1189 false. */
1191 static ds_t
1192 recompute_todo_spec (rtx_insn *next, bool for_backtrack)
1194 ds_t new_ds;
1195 sd_iterator_def sd_it;
1196 dep_t dep, modify_dep = NULL;
1197 int n_spec = 0;
1198 int n_control = 0;
1199 int n_replace = 0;
1200 bool first_p = true;
1202 if (sd_lists_empty_p (next, SD_LIST_BACK))
1203 /* NEXT has all its dependencies resolved. */
1204 return 0;
1206 if (!sd_lists_empty_p (next, SD_LIST_HARD_BACK))
1207 return HARD_DEP;
1209 /* Now we've got NEXT with speculative deps only.
1210 1. Look at the deps to see what we have to do.
1211 2. Check if we can do 'todo'. */
1212 new_ds = 0;
1214 FOR_EACH_DEP (next, SD_LIST_BACK, sd_it, dep)
1216 rtx_insn *pro = DEP_PRO (dep);
1217 ds_t ds = DEP_STATUS (dep) & SPECULATIVE;
1219 if (DEBUG_INSN_P (pro) && !DEBUG_INSN_P (next))
1220 continue;
1222 if (ds)
1224 n_spec++;
1225 if (first_p)
1227 first_p = false;
1229 new_ds = ds;
1231 else
1232 new_ds = ds_merge (new_ds, ds);
1234 else if (DEP_TYPE (dep) == REG_DEP_CONTROL)
1236 if (QUEUE_INDEX (pro) != QUEUE_SCHEDULED)
1238 n_control++;
1239 modify_dep = dep;
1241 DEP_STATUS (dep) &= ~DEP_CANCELLED;
1243 else if (DEP_REPLACE (dep) != NULL)
1245 if (QUEUE_INDEX (pro) != QUEUE_SCHEDULED)
1247 n_replace++;
1248 modify_dep = dep;
1250 DEP_STATUS (dep) &= ~DEP_CANCELLED;
1254 if (n_replace > 0 && n_control == 0 && n_spec == 0)
1256 if (!dbg_cnt (sched_breakdep))
1257 return HARD_DEP;
1258 FOR_EACH_DEP (next, SD_LIST_BACK, sd_it, dep)
1260 struct dep_replacement *desc = DEP_REPLACE (dep);
1261 if (desc != NULL)
1263 if (desc->insn == next && !for_backtrack)
1265 gcc_assert (n_replace == 1);
1266 apply_replacement (dep, true);
1268 DEP_STATUS (dep) |= DEP_CANCELLED;
1271 return 0;
1274 else if (n_control == 1 && n_replace == 0 && n_spec == 0)
1276 rtx_insn *pro, *other;
1277 rtx new_pat;
1278 rtx cond = NULL_RTX;
1279 bool success;
1280 rtx_insn *prev = NULL;
1281 int i;
1282 unsigned regno;
1284 if ((current_sched_info->flags & DO_PREDICATION) == 0
1285 || (ORIG_PAT (next) != NULL_RTX
1286 && PREDICATED_PAT (next) == NULL_RTX))
1287 return HARD_DEP;
1289 pro = DEP_PRO (modify_dep);
1290 other = real_insn_for_shadow (pro);
1291 if (other != NULL_RTX)
1292 pro = other;
1294 cond = sched_get_reverse_condition_uncached (pro);
1295 regno = REGNO (XEXP (cond, 0));
1297 /* Find the last scheduled insn that modifies the condition register.
1298 We can stop looking once we find the insn we depend on through the
1299 REG_DEP_CONTROL; if the condition register isn't modified after it,
1300 we know that it still has the right value. */
1301 if (QUEUE_INDEX (pro) == QUEUE_SCHEDULED)
1302 FOR_EACH_VEC_ELT_REVERSE (scheduled_insns, i, prev)
1304 HARD_REG_SET t;
1306 find_all_hard_reg_sets (prev, &t, true);
1307 if (TEST_HARD_REG_BIT (t, regno))
1308 return HARD_DEP;
1309 if (prev == pro)
1310 break;
1312 if (ORIG_PAT (next) == NULL_RTX)
1314 ORIG_PAT (next) = PATTERN (next);
1316 new_pat = gen_rtx_COND_EXEC (VOIDmode, cond, PATTERN (next));
1317 success = haifa_change_pattern (next, new_pat);
1318 if (!success)
1319 return HARD_DEP;
1320 PREDICATED_PAT (next) = new_pat;
1322 else if (PATTERN (next) != PREDICATED_PAT (next))
1324 bool success = haifa_change_pattern (next,
1325 PREDICATED_PAT (next));
1326 gcc_assert (success);
1328 DEP_STATUS (modify_dep) |= DEP_CANCELLED;
1329 return DEP_CONTROL;
1332 if (PREDICATED_PAT (next) != NULL_RTX)
1334 int tick = INSN_TICK (next);
1335 bool success = haifa_change_pattern (next,
1336 ORIG_PAT (next));
1337 INSN_TICK (next) = tick;
1338 gcc_assert (success);
1341 /* We can't handle the case where there are both speculative and control
1342 dependencies, so we return HARD_DEP in such a case. Also fail if
1343 we have speculative dependencies with not enough points, or more than
1344 one control dependency. */
1345 if ((n_spec > 0 && (n_control > 0 || n_replace > 0))
1346 || (n_spec > 0
1347 /* Too few points? */
1348 && ds_weak (new_ds) < spec_info->data_weakness_cutoff)
1349 || n_control > 0
1350 || n_replace > 0)
1351 return HARD_DEP;
1353 return new_ds;
1356 /* Pointer to the last instruction scheduled. */
1357 static rtx_insn *last_scheduled_insn;
1359 /* Pointer to the last nondebug instruction scheduled within the
1360 block, or the prev_head of the scheduling block. Used by
1361 rank_for_schedule, so that insns independent of the last scheduled
1362 insn will be preferred over dependent instructions. */
1363 static rtx last_nondebug_scheduled_insn;
1365 /* Pointer that iterates through the list of unscheduled insns if we
1366 have a dbg_cnt enabled. It always points at an insn prior to the
1367 first unscheduled one. */
1368 static rtx_insn *nonscheduled_insns_begin;
1370 /* Compute cost of executing INSN.
1371 This is the number of cycles between instruction issue and
1372 instruction results. */
1374 insn_cost (rtx_insn *insn)
1376 int cost;
1378 if (sel_sched_p ())
1380 if (recog_memoized (insn) < 0)
1381 return 0;
1383 cost = insn_default_latency (insn);
1384 if (cost < 0)
1385 cost = 0;
1387 return cost;
1390 cost = INSN_COST (insn);
1392 if (cost < 0)
1394 /* A USE insn, or something else we don't need to
1395 understand. We can't pass these directly to
1396 result_ready_cost or insn_default_latency because it will
1397 trigger a fatal error for unrecognizable insns. */
1398 if (recog_memoized (insn) < 0)
1400 INSN_COST (insn) = 0;
1401 return 0;
1403 else
1405 cost = insn_default_latency (insn);
1406 if (cost < 0)
1407 cost = 0;
1409 INSN_COST (insn) = cost;
1413 return cost;
1416 /* Compute cost of dependence LINK.
1417 This is the number of cycles between instruction issue and
1418 instruction results.
1419 ??? We also use this function to call recog_memoized on all insns. */
1421 dep_cost_1 (dep_t link, dw_t dw)
1423 rtx_insn *insn = DEP_PRO (link);
1424 rtx_insn *used = DEP_CON (link);
1425 int cost;
1427 if (DEP_COST (link) != UNKNOWN_DEP_COST)
1428 return DEP_COST (link);
1430 if (delay_htab)
1432 struct delay_pair *delay_entry;
1433 delay_entry
1434 = delay_htab_i2->find_with_hash (used, htab_hash_pointer (used));
1435 if (delay_entry)
1437 if (delay_entry->i1 == insn)
1439 DEP_COST (link) = pair_delay (delay_entry);
1440 return DEP_COST (link);
1445 /* A USE insn should never require the value used to be computed.
1446 This allows the computation of a function's result and parameter
1447 values to overlap the return and call. We don't care about the
1448 dependence cost when only decreasing register pressure. */
1449 if (recog_memoized (used) < 0)
1451 cost = 0;
1452 recog_memoized (insn);
1454 else
1456 enum reg_note dep_type = DEP_TYPE (link);
1458 cost = insn_cost (insn);
1460 if (INSN_CODE (insn) >= 0)
1462 if (dep_type == REG_DEP_ANTI)
1463 cost = 0;
1464 else if (dep_type == REG_DEP_OUTPUT)
1466 cost = (insn_default_latency (insn)
1467 - insn_default_latency (used));
1468 if (cost <= 0)
1469 cost = 1;
1471 else if (bypass_p (insn))
1472 cost = insn_latency (insn, used);
1476 if (targetm.sched.adjust_cost_2)
1477 cost = targetm.sched.adjust_cost_2 (used, (int) dep_type, insn, cost,
1478 dw);
1479 else if (targetm.sched.adjust_cost != NULL)
1481 /* This variable is used for backward compatibility with the
1482 targets. */
1483 rtx_insn_list *dep_cost_rtx_link =
1484 alloc_INSN_LIST (NULL_RTX, NULL);
1486 /* Make it self-cycled, so that if some tries to walk over this
1487 incomplete list he/she will be caught in an endless loop. */
1488 XEXP (dep_cost_rtx_link, 1) = dep_cost_rtx_link;
1490 /* Targets use only REG_NOTE_KIND of the link. */
1491 PUT_REG_NOTE_KIND (dep_cost_rtx_link, DEP_TYPE (link));
1493 cost = targetm.sched.adjust_cost (used, dep_cost_rtx_link,
1494 insn, cost);
1496 free_INSN_LIST_node (dep_cost_rtx_link);
1499 if (cost < 0)
1500 cost = 0;
1503 DEP_COST (link) = cost;
1504 return cost;
1507 /* Compute cost of dependence LINK.
1508 This is the number of cycles between instruction issue and
1509 instruction results. */
1511 dep_cost (dep_t link)
1513 return dep_cost_1 (link, 0);
1516 /* Use this sel-sched.c friendly function in reorder2 instead of increasing
1517 INSN_PRIORITY explicitly. */
1518 void
1519 increase_insn_priority (rtx_insn *insn, int amount)
1521 if (!sel_sched_p ())
1523 /* We're dealing with haifa-sched.c INSN_PRIORITY. */
1524 if (INSN_PRIORITY_KNOWN (insn))
1525 INSN_PRIORITY (insn) += amount;
1527 else
1529 /* In sel-sched.c INSN_PRIORITY is not kept up to date.
1530 Use EXPR_PRIORITY instead. */
1531 sel_add_to_insn_priority (insn, amount);
1535 /* Return 'true' if DEP should be included in priority calculations. */
1536 static bool
1537 contributes_to_priority_p (dep_t dep)
1539 if (DEBUG_INSN_P (DEP_CON (dep))
1540 || DEBUG_INSN_P (DEP_PRO (dep)))
1541 return false;
1543 /* Critical path is meaningful in block boundaries only. */
1544 if (!current_sched_info->contributes_to_priority (DEP_CON (dep),
1545 DEP_PRO (dep)))
1546 return false;
1548 if (DEP_REPLACE (dep) != NULL)
1549 return false;
1551 /* If flag COUNT_SPEC_IN_CRITICAL_PATH is set,
1552 then speculative instructions will less likely be
1553 scheduled. That is because the priority of
1554 their producers will increase, and, thus, the
1555 producers will more likely be scheduled, thus,
1556 resolving the dependence. */
1557 if (sched_deps_info->generate_spec_deps
1558 && !(spec_info->flags & COUNT_SPEC_IN_CRITICAL_PATH)
1559 && (DEP_STATUS (dep) & SPECULATIVE))
1560 return false;
1562 return true;
1565 /* Compute the number of nondebug deps in list LIST for INSN. */
1567 static int
1568 dep_list_size (rtx insn, sd_list_types_def list)
1570 sd_iterator_def sd_it;
1571 dep_t dep;
1572 int dbgcount = 0, nodbgcount = 0;
1574 if (!MAY_HAVE_DEBUG_INSNS)
1575 return sd_lists_size (insn, list);
1577 FOR_EACH_DEP (insn, list, sd_it, dep)
1579 if (DEBUG_INSN_P (DEP_CON (dep)))
1580 dbgcount++;
1581 else if (!DEBUG_INSN_P (DEP_PRO (dep)))
1582 nodbgcount++;
1585 gcc_assert (dbgcount + nodbgcount == sd_lists_size (insn, list));
1587 return nodbgcount;
1590 /* Compute the priority number for INSN. */
1591 static int
1592 priority (rtx_insn *insn)
1594 if (! INSN_P (insn))
1595 return 0;
1597 /* We should not be interested in priority of an already scheduled insn. */
1598 gcc_assert (QUEUE_INDEX (insn) != QUEUE_SCHEDULED);
1600 if (!INSN_PRIORITY_KNOWN (insn))
1602 int this_priority = -1;
1604 if (dep_list_size (insn, SD_LIST_FORW) == 0)
1605 /* ??? We should set INSN_PRIORITY to insn_cost when and insn has
1606 some forward deps but all of them are ignored by
1607 contributes_to_priority hook. At the moment we set priority of
1608 such insn to 0. */
1609 this_priority = insn_cost (insn);
1610 else
1612 rtx_insn *prev_first, *twin;
1613 basic_block rec;
1615 /* For recovery check instructions we calculate priority slightly
1616 different than that of normal instructions. Instead of walking
1617 through INSN_FORW_DEPS (check) list, we walk through
1618 INSN_FORW_DEPS list of each instruction in the corresponding
1619 recovery block. */
1621 /* Selective scheduling does not define RECOVERY_BLOCK macro. */
1622 rec = sel_sched_p () ? NULL : RECOVERY_BLOCK (insn);
1623 if (!rec || rec == EXIT_BLOCK_PTR_FOR_FN (cfun))
1625 prev_first = PREV_INSN (insn);
1626 twin = insn;
1628 else
1630 prev_first = NEXT_INSN (BB_HEAD (rec));
1631 twin = PREV_INSN (BB_END (rec));
1636 sd_iterator_def sd_it;
1637 dep_t dep;
1639 FOR_EACH_DEP (twin, SD_LIST_FORW, sd_it, dep)
1641 rtx_insn *next;
1642 int next_priority;
1644 next = DEP_CON (dep);
1646 if (BLOCK_FOR_INSN (next) != rec)
1648 int cost;
1650 if (!contributes_to_priority_p (dep))
1651 continue;
1653 if (twin == insn)
1654 cost = dep_cost (dep);
1655 else
1657 struct _dep _dep1, *dep1 = &_dep1;
1659 init_dep (dep1, insn, next, REG_DEP_ANTI);
1661 cost = dep_cost (dep1);
1664 next_priority = cost + priority (next);
1666 if (next_priority > this_priority)
1667 this_priority = next_priority;
1671 twin = PREV_INSN (twin);
1673 while (twin != prev_first);
1676 if (this_priority < 0)
1678 gcc_assert (this_priority == -1);
1680 this_priority = insn_cost (insn);
1683 INSN_PRIORITY (insn) = this_priority;
1684 INSN_PRIORITY_STATUS (insn) = 1;
1687 return INSN_PRIORITY (insn);
1690 /* Macros and functions for keeping the priority queue sorted, and
1691 dealing with queuing and dequeuing of instructions. */
1693 /* For each pressure class CL, set DEATH[CL] to the number of registers
1694 in that class that die in INSN. */
1696 static void
1697 calculate_reg_deaths (rtx_insn *insn, int *death)
1699 int i;
1700 struct reg_use_data *use;
1702 for (i = 0; i < ira_pressure_classes_num; i++)
1703 death[ira_pressure_classes[i]] = 0;
1704 for (use = INSN_REG_USE_LIST (insn); use != NULL; use = use->next_insn_use)
1705 if (dying_use_p (use))
1706 mark_regno_birth_or_death (0, death, use->regno, true);
1709 /* Setup info about the current register pressure impact of scheduling
1710 INSN at the current scheduling point. */
1711 static void
1712 setup_insn_reg_pressure_info (rtx_insn *insn)
1714 int i, change, before, after, hard_regno;
1715 int excess_cost_change;
1716 enum machine_mode mode;
1717 enum reg_class cl;
1718 struct reg_pressure_data *pressure_info;
1719 int *max_reg_pressure;
1720 static int death[N_REG_CLASSES];
1722 gcc_checking_assert (!DEBUG_INSN_P (insn));
1724 excess_cost_change = 0;
1725 calculate_reg_deaths (insn, death);
1726 pressure_info = INSN_REG_PRESSURE (insn);
1727 max_reg_pressure = INSN_MAX_REG_PRESSURE (insn);
1728 gcc_assert (pressure_info != NULL && max_reg_pressure != NULL);
1729 for (i = 0; i < ira_pressure_classes_num; i++)
1731 cl = ira_pressure_classes[i];
1732 gcc_assert (curr_reg_pressure[cl] >= 0);
1733 change = (int) pressure_info[i].set_increase - death[cl];
1734 before = MAX (0, max_reg_pressure[i] - ira_class_hard_regs_num[cl]);
1735 after = MAX (0, max_reg_pressure[i] + change
1736 - ira_class_hard_regs_num[cl]);
1737 hard_regno = ira_class_hard_regs[cl][0];
1738 gcc_assert (hard_regno >= 0);
1739 mode = reg_raw_mode[hard_regno];
1740 excess_cost_change += ((after - before)
1741 * (ira_memory_move_cost[mode][cl][0]
1742 + ira_memory_move_cost[mode][cl][1]));
1744 INSN_REG_PRESSURE_EXCESS_COST_CHANGE (insn) = excess_cost_change;
1747 /* This is the first page of code related to SCHED_PRESSURE_MODEL.
1748 It tries to make the scheduler take register pressure into account
1749 without introducing too many unnecessary stalls. It hooks into the
1750 main scheduling algorithm at several points:
1752 - Before scheduling starts, model_start_schedule constructs a
1753 "model schedule" for the current block. This model schedule is
1754 chosen solely to keep register pressure down. It does not take the
1755 target's pipeline or the original instruction order into account,
1756 except as a tie-breaker. It also doesn't work to a particular
1757 pressure limit.
1759 This model schedule gives us an idea of what pressure can be
1760 achieved for the block and gives us an example of a schedule that
1761 keeps to that pressure. It also makes the final schedule less
1762 dependent on the original instruction order. This is important
1763 because the original order can either be "wide" (many values live
1764 at once, such as in user-scheduled code) or "narrow" (few values
1765 live at once, such as after loop unrolling, where several
1766 iterations are executed sequentially).
1768 We do not apply this model schedule to the rtx stream. We simply
1769 record it in model_schedule. We also compute the maximum pressure,
1770 MP, that was seen during this schedule.
1772 - Instructions are added to the ready queue even if they require
1773 a stall. The length of the stall is instead computed as:
1775 MAX (INSN_TICK (INSN) - clock_var, 0)
1777 (= insn_delay). This allows rank_for_schedule to choose between
1778 introducing a deliberate stall or increasing pressure.
1780 - Before sorting the ready queue, model_set_excess_costs assigns
1781 a pressure-based cost to each ready instruction in the queue.
1782 This is the instruction's INSN_REG_PRESSURE_EXCESS_COST_CHANGE
1783 (ECC for short) and is effectively measured in cycles.
1785 - rank_for_schedule ranks instructions based on:
1787 ECC (insn) + insn_delay (insn)
1789 then as:
1791 insn_delay (insn)
1793 So, for example, an instruction X1 with an ECC of 1 that can issue
1794 now will win over an instruction X0 with an ECC of zero that would
1795 introduce a stall of one cycle. However, an instruction X2 with an
1796 ECC of 2 that can issue now will lose to both X0 and X1.
1798 - When an instruction is scheduled, model_recompute updates the model
1799 schedule with the new pressures (some of which might now exceed the
1800 original maximum pressure MP). model_update_limit_points then searches
1801 for the new point of maximum pressure, if not already known. */
1803 /* Used to separate high-verbosity debug information for SCHED_PRESSURE_MODEL
1804 from surrounding debug information. */
1805 #define MODEL_BAR \
1806 ";;\t\t+------------------------------------------------------\n"
1808 /* Information about the pressure on a particular register class at a
1809 particular point of the model schedule. */
1810 struct model_pressure_data {
1811 /* The pressure at this point of the model schedule, or -1 if the
1812 point is associated with an instruction that has already been
1813 scheduled. */
1814 int ref_pressure;
1816 /* The maximum pressure during or after this point of the model schedule. */
1817 int max_pressure;
1820 /* Per-instruction information that is used while building the model
1821 schedule. Here, "schedule" refers to the model schedule rather
1822 than the main schedule. */
1823 struct model_insn_info {
1824 /* The instruction itself. */
1825 rtx_insn *insn;
1827 /* If this instruction is in model_worklist, these fields link to the
1828 previous (higher-priority) and next (lower-priority) instructions
1829 in the list. */
1830 struct model_insn_info *prev;
1831 struct model_insn_info *next;
1833 /* While constructing the schedule, QUEUE_INDEX describes whether an
1834 instruction has already been added to the schedule (QUEUE_SCHEDULED),
1835 is in model_worklist (QUEUE_READY), or neither (QUEUE_NOWHERE).
1836 old_queue records the value that QUEUE_INDEX had before scheduling
1837 started, so that we can restore it once the schedule is complete. */
1838 int old_queue;
1840 /* The relative importance of an unscheduled instruction. Higher
1841 values indicate greater importance. */
1842 unsigned int model_priority;
1844 /* The length of the longest path of satisfied true dependencies
1845 that leads to this instruction. */
1846 unsigned int depth;
1848 /* The length of the longest path of dependencies of any kind
1849 that leads from this instruction. */
1850 unsigned int alap;
1852 /* The number of predecessor nodes that must still be scheduled. */
1853 int unscheduled_preds;
1856 /* Information about the pressure limit for a particular register class.
1857 This structure is used when applying a model schedule to the main
1858 schedule. */
1859 struct model_pressure_limit {
1860 /* The maximum register pressure seen in the original model schedule. */
1861 int orig_pressure;
1863 /* The maximum register pressure seen in the current model schedule
1864 (which excludes instructions that have already been scheduled). */
1865 int pressure;
1867 /* The point of the current model schedule at which PRESSURE is first
1868 reached. It is set to -1 if the value needs to be recomputed. */
1869 int point;
1872 /* Describes a particular way of measuring register pressure. */
1873 struct model_pressure_group {
1874 /* Index PCI describes the maximum pressure on ira_pressure_classes[PCI]. */
1875 struct model_pressure_limit limits[N_REG_CLASSES];
1877 /* Index (POINT * ira_num_pressure_classes + PCI) describes the pressure
1878 on register class ira_pressure_classes[PCI] at point POINT of the
1879 current model schedule. A POINT of model_num_insns describes the
1880 pressure at the end of the schedule. */
1881 struct model_pressure_data *model;
1884 /* Index POINT gives the instruction at point POINT of the model schedule.
1885 This array doesn't change during main scheduling. */
1886 static vec<rtx_insn *> model_schedule;
1888 /* The list of instructions in the model worklist, sorted in order of
1889 decreasing priority. */
1890 static struct model_insn_info *model_worklist;
1892 /* Index I describes the instruction with INSN_LUID I. */
1893 static struct model_insn_info *model_insns;
1895 /* The number of instructions in the model schedule. */
1896 static int model_num_insns;
1898 /* The index of the first instruction in model_schedule that hasn't yet been
1899 added to the main schedule, or model_num_insns if all of them have. */
1900 static int model_curr_point;
1902 /* Describes the pressure before each instruction in the model schedule. */
1903 static struct model_pressure_group model_before_pressure;
1905 /* The first unused model_priority value (as used in model_insn_info). */
1906 static unsigned int model_next_priority;
1909 /* The model_pressure_data for ira_pressure_classes[PCI] in GROUP
1910 at point POINT of the model schedule. */
1911 #define MODEL_PRESSURE_DATA(GROUP, POINT, PCI) \
1912 (&(GROUP)->model[(POINT) * ira_pressure_classes_num + (PCI)])
1914 /* The maximum pressure on ira_pressure_classes[PCI] in GROUP at or
1915 after point POINT of the model schedule. */
1916 #define MODEL_MAX_PRESSURE(GROUP, POINT, PCI) \
1917 (MODEL_PRESSURE_DATA (GROUP, POINT, PCI)->max_pressure)
1919 /* The pressure on ira_pressure_classes[PCI] in GROUP at point POINT
1920 of the model schedule. */
1921 #define MODEL_REF_PRESSURE(GROUP, POINT, PCI) \
1922 (MODEL_PRESSURE_DATA (GROUP, POINT, PCI)->ref_pressure)
1924 /* Information about INSN that is used when creating the model schedule. */
1925 #define MODEL_INSN_INFO(INSN) \
1926 (&model_insns[INSN_LUID (INSN)])
1928 /* The instruction at point POINT of the model schedule. */
1929 #define MODEL_INSN(POINT) \
1930 (model_schedule[POINT])
1933 /* Return INSN's index in the model schedule, or model_num_insns if it
1934 doesn't belong to that schedule. */
1936 static int
1937 model_index (rtx_insn *insn)
1939 if (INSN_MODEL_INDEX (insn) == 0)
1940 return model_num_insns;
1941 return INSN_MODEL_INDEX (insn) - 1;
1944 /* Make sure that GROUP->limits is up-to-date for the current point
1945 of the model schedule. */
1947 static void
1948 model_update_limit_points_in_group (struct model_pressure_group *group)
1950 int pci, max_pressure, point;
1952 for (pci = 0; pci < ira_pressure_classes_num; pci++)
1954 /* We may have passed the final point at which the pressure in
1955 group->limits[pci].pressure was reached. Update the limit if so. */
1956 max_pressure = MODEL_MAX_PRESSURE (group, model_curr_point, pci);
1957 group->limits[pci].pressure = max_pressure;
1959 /* Find the point at which MAX_PRESSURE is first reached. We need
1960 to search in three cases:
1962 - We've already moved past the previous pressure point.
1963 In this case we search forward from model_curr_point.
1965 - We scheduled the previous point of maximum pressure ahead of
1966 its position in the model schedule, but doing so didn't bring
1967 the pressure point earlier. In this case we search forward
1968 from that previous pressure point.
1970 - Scheduling an instruction early caused the maximum pressure
1971 to decrease. In this case we will have set the pressure
1972 point to -1, and we search forward from model_curr_point. */
1973 point = MAX (group->limits[pci].point, model_curr_point);
1974 while (point < model_num_insns
1975 && MODEL_REF_PRESSURE (group, point, pci) < max_pressure)
1976 point++;
1977 group->limits[pci].point = point;
1979 gcc_assert (MODEL_REF_PRESSURE (group, point, pci) == max_pressure);
1980 gcc_assert (MODEL_MAX_PRESSURE (group, point, pci) == max_pressure);
1984 /* Make sure that all register-pressure limits are up-to-date for the
1985 current position in the model schedule. */
1987 static void
1988 model_update_limit_points (void)
1990 model_update_limit_points_in_group (&model_before_pressure);
1993 /* Return the model_index of the last unscheduled use in chain USE
1994 outside of USE's instruction. Return -1 if there are no other uses,
1995 or model_num_insns if the register is live at the end of the block. */
1997 static int
1998 model_last_use_except (struct reg_use_data *use)
2000 struct reg_use_data *next;
2001 int last, index;
2003 last = -1;
2004 for (next = use->next_regno_use; next != use; next = next->next_regno_use)
2005 if (NONDEBUG_INSN_P (next->insn)
2006 && QUEUE_INDEX (next->insn) != QUEUE_SCHEDULED)
2008 index = model_index (next->insn);
2009 if (index == model_num_insns)
2010 return model_num_insns;
2011 if (last < index)
2012 last = index;
2014 return last;
2017 /* An instruction with model_index POINT has just been scheduled, and it
2018 adds DELTA to the pressure on ira_pressure_classes[PCI] after POINT - 1.
2019 Update MODEL_REF_PRESSURE (GROUP, POINT, PCI) and
2020 MODEL_MAX_PRESSURE (GROUP, POINT, PCI) accordingly. */
2022 static void
2023 model_start_update_pressure (struct model_pressure_group *group,
2024 int point, int pci, int delta)
2026 int next_max_pressure;
2028 if (point == model_num_insns)
2030 /* The instruction wasn't part of the model schedule; it was moved
2031 from a different block. Update the pressure for the end of
2032 the model schedule. */
2033 MODEL_REF_PRESSURE (group, point, pci) += delta;
2034 MODEL_MAX_PRESSURE (group, point, pci) += delta;
2036 else
2038 /* Record that this instruction has been scheduled. Nothing now
2039 changes between POINT and POINT + 1, so get the maximum pressure
2040 from the latter. If the maximum pressure decreases, the new
2041 pressure point may be before POINT. */
2042 MODEL_REF_PRESSURE (group, point, pci) = -1;
2043 next_max_pressure = MODEL_MAX_PRESSURE (group, point + 1, pci);
2044 if (MODEL_MAX_PRESSURE (group, point, pci) > next_max_pressure)
2046 MODEL_MAX_PRESSURE (group, point, pci) = next_max_pressure;
2047 if (group->limits[pci].point == point)
2048 group->limits[pci].point = -1;
2053 /* Record that scheduling a later instruction has changed the pressure
2054 at point POINT of the model schedule by DELTA (which might be 0).
2055 Update GROUP accordingly. Return nonzero if these changes might
2056 trigger changes to previous points as well. */
2058 static int
2059 model_update_pressure (struct model_pressure_group *group,
2060 int point, int pci, int delta)
2062 int ref_pressure, max_pressure, next_max_pressure;
2064 /* If POINT hasn't yet been scheduled, update its pressure. */
2065 ref_pressure = MODEL_REF_PRESSURE (group, point, pci);
2066 if (ref_pressure >= 0 && delta != 0)
2068 ref_pressure += delta;
2069 MODEL_REF_PRESSURE (group, point, pci) = ref_pressure;
2071 /* Check whether the maximum pressure in the overall schedule
2072 has increased. (This means that the MODEL_MAX_PRESSURE of
2073 every point <= POINT will need to increae too; see below.) */
2074 if (group->limits[pci].pressure < ref_pressure)
2075 group->limits[pci].pressure = ref_pressure;
2077 /* If we are at maximum pressure, and the maximum pressure
2078 point was previously unknown or later than POINT,
2079 bring it forward. */
2080 if (group->limits[pci].pressure == ref_pressure
2081 && !IN_RANGE (group->limits[pci].point, 0, point))
2082 group->limits[pci].point = point;
2084 /* If POINT used to be the point of maximum pressure, but isn't
2085 any longer, we need to recalculate it using a forward walk. */
2086 if (group->limits[pci].pressure > ref_pressure
2087 && group->limits[pci].point == point)
2088 group->limits[pci].point = -1;
2091 /* Update the maximum pressure at POINT. Changes here might also
2092 affect the maximum pressure at POINT - 1. */
2093 next_max_pressure = MODEL_MAX_PRESSURE (group, point + 1, pci);
2094 max_pressure = MAX (ref_pressure, next_max_pressure);
2095 if (MODEL_MAX_PRESSURE (group, point, pci) != max_pressure)
2097 MODEL_MAX_PRESSURE (group, point, pci) = max_pressure;
2098 return 1;
2100 return 0;
2103 /* INSN has just been scheduled. Update the model schedule accordingly. */
2105 static void
2106 model_recompute (rtx_insn *insn)
2108 struct {
2109 int last_use;
2110 int regno;
2111 } uses[FIRST_PSEUDO_REGISTER + MAX_RECOG_OPERANDS];
2112 struct reg_use_data *use;
2113 struct reg_pressure_data *reg_pressure;
2114 int delta[N_REG_CLASSES];
2115 int pci, point, mix, new_last, cl, ref_pressure, queue;
2116 unsigned int i, num_uses, num_pending_births;
2117 bool print_p;
2119 /* The destinations of INSN were previously live from POINT onwards, but are
2120 now live from model_curr_point onwards. Set up DELTA accordingly. */
2121 point = model_index (insn);
2122 reg_pressure = INSN_REG_PRESSURE (insn);
2123 for (pci = 0; pci < ira_pressure_classes_num; pci++)
2125 cl = ira_pressure_classes[pci];
2126 delta[cl] = reg_pressure[pci].set_increase;
2129 /* Record which registers previously died at POINT, but which now die
2130 before POINT. Adjust DELTA so that it represents the effect of
2131 this change after POINT - 1. Set NUM_PENDING_BIRTHS to the number of
2132 registers that will be born in the range [model_curr_point, POINT). */
2133 num_uses = 0;
2134 num_pending_births = 0;
2135 for (use = INSN_REG_USE_LIST (insn); use != NULL; use = use->next_insn_use)
2137 new_last = model_last_use_except (use);
2138 if (new_last < point)
2140 gcc_assert (num_uses < ARRAY_SIZE (uses));
2141 uses[num_uses].last_use = new_last;
2142 uses[num_uses].regno = use->regno;
2143 /* This register is no longer live after POINT - 1. */
2144 mark_regno_birth_or_death (NULL, delta, use->regno, false);
2145 num_uses++;
2146 if (new_last >= 0)
2147 num_pending_births++;
2151 /* Update the MODEL_REF_PRESSURE and MODEL_MAX_PRESSURE for POINT.
2152 Also set each group pressure limit for POINT. */
2153 for (pci = 0; pci < ira_pressure_classes_num; pci++)
2155 cl = ira_pressure_classes[pci];
2156 model_start_update_pressure (&model_before_pressure,
2157 point, pci, delta[cl]);
2160 /* Walk the model schedule backwards, starting immediately before POINT. */
2161 print_p = false;
2162 if (point != model_curr_point)
2165 point--;
2166 insn = MODEL_INSN (point);
2167 queue = QUEUE_INDEX (insn);
2169 if (queue != QUEUE_SCHEDULED)
2171 /* DELTA describes the effect of the move on the register pressure
2172 after POINT. Make it describe the effect on the pressure
2173 before POINT. */
2174 i = 0;
2175 while (i < num_uses)
2177 if (uses[i].last_use == point)
2179 /* This register is now live again. */
2180 mark_regno_birth_or_death (NULL, delta,
2181 uses[i].regno, true);
2183 /* Remove this use from the array. */
2184 uses[i] = uses[num_uses - 1];
2185 num_uses--;
2186 num_pending_births--;
2188 else
2189 i++;
2192 if (sched_verbose >= 5)
2194 if (!print_p)
2196 fprintf (sched_dump, MODEL_BAR);
2197 fprintf (sched_dump, ";;\t\t| New pressure for model"
2198 " schedule\n");
2199 fprintf (sched_dump, MODEL_BAR);
2200 print_p = true;
2203 fprintf (sched_dump, ";;\t\t| %3d %4d %-30s ",
2204 point, INSN_UID (insn),
2205 str_pattern_slim (PATTERN (insn)));
2206 for (pci = 0; pci < ira_pressure_classes_num; pci++)
2208 cl = ira_pressure_classes[pci];
2209 ref_pressure = MODEL_REF_PRESSURE (&model_before_pressure,
2210 point, pci);
2211 fprintf (sched_dump, " %s:[%d->%d]",
2212 reg_class_names[ira_pressure_classes[pci]],
2213 ref_pressure, ref_pressure + delta[cl]);
2215 fprintf (sched_dump, "\n");
2219 /* Adjust the pressure at POINT. Set MIX to nonzero if POINT - 1
2220 might have changed as well. */
2221 mix = num_pending_births;
2222 for (pci = 0; pci < ira_pressure_classes_num; pci++)
2224 cl = ira_pressure_classes[pci];
2225 mix |= delta[cl];
2226 mix |= model_update_pressure (&model_before_pressure,
2227 point, pci, delta[cl]);
2230 while (mix && point > model_curr_point);
2232 if (print_p)
2233 fprintf (sched_dump, MODEL_BAR);
2236 /* After DEP, which was cancelled, has been resolved for insn NEXT,
2237 check whether the insn's pattern needs restoring. */
2238 static bool
2239 must_restore_pattern_p (rtx_insn *next, dep_t dep)
2241 if (QUEUE_INDEX (next) == QUEUE_SCHEDULED)
2242 return false;
2244 if (DEP_TYPE (dep) == REG_DEP_CONTROL)
2246 gcc_assert (ORIG_PAT (next) != NULL_RTX);
2247 gcc_assert (next == DEP_CON (dep));
2249 else
2251 struct dep_replacement *desc = DEP_REPLACE (dep);
2252 if (desc->insn != next)
2254 gcc_assert (*desc->loc == desc->orig);
2255 return false;
2258 return true;
2261 /* model_spill_cost (CL, P, P') returns the cost of increasing the
2262 pressure on CL from P to P'. We use this to calculate a "base ECC",
2263 baseECC (CL, X), for each pressure class CL and each instruction X.
2264 Supposing X changes the pressure on CL from P to P', and that the
2265 maximum pressure on CL in the current model schedule is MP', then:
2267 * if X occurs before or at the next point of maximum pressure in
2268 the model schedule and P' > MP', then:
2270 baseECC (CL, X) = model_spill_cost (CL, MP, P')
2272 The idea is that the pressure after scheduling a fixed set of
2273 instructions -- in this case, the set up to and including the
2274 next maximum pressure point -- is going to be the same regardless
2275 of the order; we simply want to keep the intermediate pressure
2276 under control. Thus X has a cost of zero unless scheduling it
2277 now would exceed MP'.
2279 If all increases in the set are by the same amount, no zero-cost
2280 instruction will ever cause the pressure to exceed MP'. However,
2281 if X is instead moved past an instruction X' with pressure in the
2282 range (MP' - (P' - P), MP'), the pressure at X' will increase
2283 beyond MP'. Since baseECC is very much a heuristic anyway,
2284 it doesn't seem worth the overhead of tracking cases like these.
2286 The cost of exceeding MP' is always based on the original maximum
2287 pressure MP. This is so that going 2 registers over the original
2288 limit has the same cost regardless of whether it comes from two
2289 separate +1 deltas or from a single +2 delta.
2291 * if X occurs after the next point of maximum pressure in the model
2292 schedule and P' > P, then:
2294 baseECC (CL, X) = model_spill_cost (CL, MP, MP' + (P' - P))
2296 That is, if we move X forward across a point of maximum pressure,
2297 and if X increases the pressure by P' - P, then we conservatively
2298 assume that scheduling X next would increase the maximum pressure
2299 by P' - P. Again, the cost of doing this is based on the original
2300 maximum pressure MP, for the same reason as above.
2302 * if P' < P, P > MP, and X occurs at or after the next point of
2303 maximum pressure, then:
2305 baseECC (CL, X) = -model_spill_cost (CL, MAX (MP, P'), P)
2307 That is, if we have already exceeded the original maximum pressure MP,
2308 and if X might reduce the maximum pressure again -- or at least push
2309 it further back, and thus allow more scheduling freedom -- it is given
2310 a negative cost to reflect the improvement.
2312 * otherwise,
2314 baseECC (CL, X) = 0
2316 In this case, X is not expected to affect the maximum pressure MP',
2317 so it has zero cost.
2319 We then create a combined value baseECC (X) that is the sum of
2320 baseECC (CL, X) for each pressure class CL.
2322 baseECC (X) could itself be used as the ECC value described above.
2323 However, this is often too conservative, in the sense that it
2324 tends to make high-priority instructions that increase pressure
2325 wait too long in cases where introducing a spill would be better.
2326 For this reason the final ECC is a priority-adjusted form of
2327 baseECC (X). Specifically, we calculate:
2329 P (X) = INSN_PRIORITY (X) - insn_delay (X) - baseECC (X)
2330 baseP = MAX { P (X) | baseECC (X) <= 0 }
2332 Then:
2334 ECC (X) = MAX (MIN (baseP - P (X), baseECC (X)), 0)
2336 Thus an instruction's effect on pressure is ignored if it has a high
2337 enough priority relative to the ones that don't increase pressure.
2338 Negative values of baseECC (X) do not increase the priority of X
2339 itself, but they do make it harder for other instructions to
2340 increase the pressure further.
2342 This pressure cost is deliberately timid. The intention has been
2343 to choose a heuristic that rarely interferes with the normal list
2344 scheduler in cases where that scheduler would produce good code.
2345 We simply want to curb some of its worst excesses. */
2347 /* Return the cost of increasing the pressure in class CL from FROM to TO.
2349 Here we use the very simplistic cost model that every register above
2350 ira_class_hard_regs_num[CL] has a spill cost of 1. We could use other
2351 measures instead, such as one based on MEMORY_MOVE_COST. However:
2353 (1) In order for an instruction to be scheduled, the higher cost
2354 would need to be justified in a single saving of that many stalls.
2355 This is overly pessimistic, because the benefit of spilling is
2356 often to avoid a sequence of several short stalls rather than
2357 a single long one.
2359 (2) The cost is still arbitrary. Because we are not allocating
2360 registers during scheduling, we have no way of knowing for
2361 sure how many memory accesses will be required by each spill,
2362 where the spills will be placed within the block, or even
2363 which block(s) will contain the spills.
2365 So a higher cost than 1 is often too conservative in practice,
2366 forcing blocks to contain unnecessary stalls instead of spill code.
2367 The simple cost below seems to be the best compromise. It reduces
2368 the interference with the normal list scheduler, which helps make
2369 it more suitable for a default-on option. */
2371 static int
2372 model_spill_cost (int cl, int from, int to)
2374 from = MAX (from, ira_class_hard_regs_num[cl]);
2375 return MAX (to, from) - from;
2378 /* Return baseECC (ira_pressure_classes[PCI], POINT), given that
2379 P = curr_reg_pressure[ira_pressure_classes[PCI]] and that
2380 P' = P + DELTA. */
2382 static int
2383 model_excess_group_cost (struct model_pressure_group *group,
2384 int point, int pci, int delta)
2386 int pressure, cl;
2388 cl = ira_pressure_classes[pci];
2389 if (delta < 0 && point >= group->limits[pci].point)
2391 pressure = MAX (group->limits[pci].orig_pressure,
2392 curr_reg_pressure[cl] + delta);
2393 return -model_spill_cost (cl, pressure, curr_reg_pressure[cl]);
2396 if (delta > 0)
2398 if (point > group->limits[pci].point)
2399 pressure = group->limits[pci].pressure + delta;
2400 else
2401 pressure = curr_reg_pressure[cl] + delta;
2403 if (pressure > group->limits[pci].pressure)
2404 return model_spill_cost (cl, group->limits[pci].orig_pressure,
2405 pressure);
2408 return 0;
2411 /* Return baseECC (MODEL_INSN (INSN)). Dump the costs to sched_dump
2412 if PRINT_P. */
2414 static int
2415 model_excess_cost (rtx_insn *insn, bool print_p)
2417 int point, pci, cl, cost, this_cost, delta;
2418 struct reg_pressure_data *insn_reg_pressure;
2419 int insn_death[N_REG_CLASSES];
2421 calculate_reg_deaths (insn, insn_death);
2422 point = model_index (insn);
2423 insn_reg_pressure = INSN_REG_PRESSURE (insn);
2424 cost = 0;
2426 if (print_p)
2427 fprintf (sched_dump, ";;\t\t| %3d %4d | %4d %+3d |", point,
2428 INSN_UID (insn), INSN_PRIORITY (insn), insn_delay (insn));
2430 /* Sum up the individual costs for each register class. */
2431 for (pci = 0; pci < ira_pressure_classes_num; pci++)
2433 cl = ira_pressure_classes[pci];
2434 delta = insn_reg_pressure[pci].set_increase - insn_death[cl];
2435 this_cost = model_excess_group_cost (&model_before_pressure,
2436 point, pci, delta);
2437 cost += this_cost;
2438 if (print_p)
2439 fprintf (sched_dump, " %s:[%d base cost %d]",
2440 reg_class_names[cl], delta, this_cost);
2443 if (print_p)
2444 fprintf (sched_dump, "\n");
2446 return cost;
2449 /* Dump the next points of maximum pressure for GROUP. */
2451 static void
2452 model_dump_pressure_points (struct model_pressure_group *group)
2454 int pci, cl;
2456 fprintf (sched_dump, ";;\t\t| pressure points");
2457 for (pci = 0; pci < ira_pressure_classes_num; pci++)
2459 cl = ira_pressure_classes[pci];
2460 fprintf (sched_dump, " %s:[%d->%d at ", reg_class_names[cl],
2461 curr_reg_pressure[cl], group->limits[pci].pressure);
2462 if (group->limits[pci].point < model_num_insns)
2463 fprintf (sched_dump, "%d:%d]", group->limits[pci].point,
2464 INSN_UID (MODEL_INSN (group->limits[pci].point)));
2465 else
2466 fprintf (sched_dump, "end]");
2468 fprintf (sched_dump, "\n");
2471 /* Set INSN_REG_PRESSURE_EXCESS_COST_CHANGE for INSNS[0...COUNT-1]. */
2473 static void
2474 model_set_excess_costs (rtx_insn **insns, int count)
2476 int i, cost, priority_base, priority;
2477 bool print_p;
2479 /* Record the baseECC value for each instruction in the model schedule,
2480 except that negative costs are converted to zero ones now rather thatn
2481 later. Do not assign a cost to debug instructions, since they must
2482 not change code-generation decisions. Experiments suggest we also
2483 get better results by not assigning a cost to instructions from
2484 a different block.
2486 Set PRIORITY_BASE to baseP in the block comment above. This is the
2487 maximum priority of the "cheap" instructions, which should always
2488 include the next model instruction. */
2489 priority_base = 0;
2490 print_p = false;
2491 for (i = 0; i < count; i++)
2492 if (INSN_MODEL_INDEX (insns[i]))
2494 if (sched_verbose >= 6 && !print_p)
2496 fprintf (sched_dump, MODEL_BAR);
2497 fprintf (sched_dump, ";;\t\t| Pressure costs for ready queue\n");
2498 model_dump_pressure_points (&model_before_pressure);
2499 fprintf (sched_dump, MODEL_BAR);
2500 print_p = true;
2502 cost = model_excess_cost (insns[i], print_p);
2503 if (cost <= 0)
2505 priority = INSN_PRIORITY (insns[i]) - insn_delay (insns[i]) - cost;
2506 priority_base = MAX (priority_base, priority);
2507 cost = 0;
2509 INSN_REG_PRESSURE_EXCESS_COST_CHANGE (insns[i]) = cost;
2511 if (print_p)
2512 fprintf (sched_dump, MODEL_BAR);
2514 /* Use MAX (baseECC, 0) and baseP to calculcate ECC for each
2515 instruction. */
2516 for (i = 0; i < count; i++)
2518 cost = INSN_REG_PRESSURE_EXCESS_COST_CHANGE (insns[i]);
2519 priority = INSN_PRIORITY (insns[i]) - insn_delay (insns[i]);
2520 if (cost > 0 && priority > priority_base)
2522 cost += priority_base - priority;
2523 INSN_REG_PRESSURE_EXCESS_COST_CHANGE (insns[i]) = MAX (cost, 0);
2529 /* Enum of rank_for_schedule heuristic decisions. */
2530 enum rfs_decision {
2531 RFS_DEBUG, RFS_LIVE_RANGE_SHRINK1, RFS_LIVE_RANGE_SHRINK2,
2532 RFS_SCHED_GROUP, RFS_PRESSURE_DELAY, RFS_PRESSURE_TICK,
2533 RFS_FEEDS_BACKTRACK_INSN, RFS_PRIORITY, RFS_SPECULATION,
2534 RFS_SCHED_RANK, RFS_LAST_INSN, RFS_PRESSURE_INDEX,
2535 RFS_DEP_COUNT, RFS_TIE, RFS_N };
2537 /* Corresponding strings for print outs. */
2538 static const char *rfs_str[RFS_N] = {
2539 "RFS_DEBUG", "RFS_LIVE_RANGE_SHRINK1", "RFS_LIVE_RANGE_SHRINK2",
2540 "RFS_SCHED_GROUP", "RFS_PRESSURE_DELAY", "RFS_PRESSURE_TICK",
2541 "RFS_FEEDS_BACKTRACK_INSN", "RFS_PRIORITY", "RFS_SPECULATION",
2542 "RFS_SCHED_RANK", "RFS_LAST_INSN", "RFS_PRESSURE_INDEX",
2543 "RFS_DEP_COUNT", "RFS_TIE" };
2545 /* Statistical breakdown of rank_for_schedule decisions. */
2546 typedef struct { unsigned stats[RFS_N]; } rank_for_schedule_stats_t;
2547 static rank_for_schedule_stats_t rank_for_schedule_stats;
2549 static int
2550 rfs_result (enum rfs_decision decision, int result)
2552 ++rank_for_schedule_stats.stats[decision];
2553 return result;
2556 /* Returns a positive value if x is preferred; returns a negative value if
2557 y is preferred. Should never return 0, since that will make the sort
2558 unstable. */
2560 static int
2561 rank_for_schedule (const void *x, const void *y)
2563 rtx_insn *tmp = *(rtx_insn * const *) y;
2564 rtx_insn *tmp2 = *(rtx_insn * const *) x;
2565 int tmp_class, tmp2_class;
2566 int val, priority_val, info_val, diff;
2568 if (MAY_HAVE_DEBUG_INSNS)
2570 /* Schedule debug insns as early as possible. */
2571 if (DEBUG_INSN_P (tmp) && !DEBUG_INSN_P (tmp2))
2572 return rfs_result (RFS_DEBUG, -1);
2573 else if (!DEBUG_INSN_P (tmp) && DEBUG_INSN_P (tmp2))
2574 return rfs_result (RFS_DEBUG, 1);
2575 else if (DEBUG_INSN_P (tmp) && DEBUG_INSN_P (tmp2))
2576 return rfs_result (RFS_DEBUG, INSN_LUID (tmp) - INSN_LUID (tmp2));
2579 if (live_range_shrinkage_p)
2581 /* Don't use SCHED_PRESSURE_MODEL -- it results in much worse
2582 code. */
2583 gcc_assert (sched_pressure == SCHED_PRESSURE_WEIGHTED);
2584 if ((INSN_REG_PRESSURE_EXCESS_COST_CHANGE (tmp) < 0
2585 || INSN_REG_PRESSURE_EXCESS_COST_CHANGE (tmp2) < 0)
2586 && (diff = (INSN_REG_PRESSURE_EXCESS_COST_CHANGE (tmp)
2587 - INSN_REG_PRESSURE_EXCESS_COST_CHANGE (tmp2))) != 0)
2588 return rfs_result (RFS_LIVE_RANGE_SHRINK1, diff);
2589 /* Sort by INSN_LUID (original insn order), so that we make the
2590 sort stable. This minimizes instruction movement, thus
2591 minimizing sched's effect on debugging and cross-jumping. */
2592 return rfs_result (RFS_LIVE_RANGE_SHRINK2,
2593 INSN_LUID (tmp) - INSN_LUID (tmp2));
2596 /* The insn in a schedule group should be issued the first. */
2597 if (flag_sched_group_heuristic &&
2598 SCHED_GROUP_P (tmp) != SCHED_GROUP_P (tmp2))
2599 return rfs_result (RFS_SCHED_GROUP, SCHED_GROUP_P (tmp2) ? 1 : -1);
2601 /* Make sure that priority of TMP and TMP2 are initialized. */
2602 gcc_assert (INSN_PRIORITY_KNOWN (tmp) && INSN_PRIORITY_KNOWN (tmp2));
2604 if (sched_pressure != SCHED_PRESSURE_NONE)
2606 /* Prefer insn whose scheduling results in the smallest register
2607 pressure excess. */
2608 if ((diff = (INSN_REG_PRESSURE_EXCESS_COST_CHANGE (tmp)
2609 + insn_delay (tmp)
2610 - INSN_REG_PRESSURE_EXCESS_COST_CHANGE (tmp2)
2611 - insn_delay (tmp2))))
2612 return rfs_result (RFS_PRESSURE_DELAY, diff);
2615 if (sched_pressure != SCHED_PRESSURE_NONE
2616 && (INSN_TICK (tmp2) > clock_var || INSN_TICK (tmp) > clock_var)
2617 && INSN_TICK (tmp2) != INSN_TICK (tmp))
2619 diff = INSN_TICK (tmp) - INSN_TICK (tmp2);
2620 return rfs_result (RFS_PRESSURE_TICK, diff);
2623 /* If we are doing backtracking in this schedule, prefer insns that
2624 have forward dependencies with negative cost against an insn that
2625 was already scheduled. */
2626 if (current_sched_info->flags & DO_BACKTRACKING)
2628 priority_val = FEEDS_BACKTRACK_INSN (tmp2) - FEEDS_BACKTRACK_INSN (tmp);
2629 if (priority_val)
2630 return rfs_result (RFS_FEEDS_BACKTRACK_INSN, priority_val);
2633 /* Prefer insn with higher priority. */
2634 priority_val = INSN_PRIORITY (tmp2) - INSN_PRIORITY (tmp);
2636 if (flag_sched_critical_path_heuristic && priority_val)
2637 return rfs_result (RFS_PRIORITY, priority_val);
2639 /* Prefer speculative insn with greater dependencies weakness. */
2640 if (flag_sched_spec_insn_heuristic && spec_info)
2642 ds_t ds1, ds2;
2643 dw_t dw1, dw2;
2644 int dw;
2646 ds1 = TODO_SPEC (tmp) & SPECULATIVE;
2647 if (ds1)
2648 dw1 = ds_weak (ds1);
2649 else
2650 dw1 = NO_DEP_WEAK;
2652 ds2 = TODO_SPEC (tmp2) & SPECULATIVE;
2653 if (ds2)
2654 dw2 = ds_weak (ds2);
2655 else
2656 dw2 = NO_DEP_WEAK;
2658 dw = dw2 - dw1;
2659 if (dw > (NO_DEP_WEAK / 8) || dw < -(NO_DEP_WEAK / 8))
2660 return rfs_result (RFS_SPECULATION, dw);
2663 info_val = (*current_sched_info->rank) (tmp, tmp2);
2664 if (flag_sched_rank_heuristic && info_val)
2665 return rfs_result (RFS_SCHED_RANK, info_val);
2667 /* Compare insns based on their relation to the last scheduled
2668 non-debug insn. */
2669 if (flag_sched_last_insn_heuristic && last_nondebug_scheduled_insn)
2671 dep_t dep1;
2672 dep_t dep2;
2673 rtx last = last_nondebug_scheduled_insn;
2675 /* Classify the instructions into three classes:
2676 1) Data dependent on last schedule insn.
2677 2) Anti/Output dependent on last scheduled insn.
2678 3) Independent of last scheduled insn, or has latency of one.
2679 Choose the insn from the highest numbered class if different. */
2680 dep1 = sd_find_dep_between (last, tmp, true);
2682 if (dep1 == NULL || dep_cost (dep1) == 1)
2683 tmp_class = 3;
2684 else if (/* Data dependence. */
2685 DEP_TYPE (dep1) == REG_DEP_TRUE)
2686 tmp_class = 1;
2687 else
2688 tmp_class = 2;
2690 dep2 = sd_find_dep_between (last, tmp2, true);
2692 if (dep2 == NULL || dep_cost (dep2) == 1)
2693 tmp2_class = 3;
2694 else if (/* Data dependence. */
2695 DEP_TYPE (dep2) == REG_DEP_TRUE)
2696 tmp2_class = 1;
2697 else
2698 tmp2_class = 2;
2700 if ((val = tmp2_class - tmp_class))
2701 return rfs_result (RFS_LAST_INSN, val);
2704 /* Prefer instructions that occur earlier in the model schedule. */
2705 if (sched_pressure == SCHED_PRESSURE_MODEL
2706 && INSN_BB (tmp) == target_bb && INSN_BB (tmp2) == target_bb)
2708 diff = model_index (tmp) - model_index (tmp2);
2709 gcc_assert (diff != 0);
2710 return rfs_result (RFS_PRESSURE_INDEX, diff);
2713 /* Prefer the insn which has more later insns that depend on it.
2714 This gives the scheduler more freedom when scheduling later
2715 instructions at the expense of added register pressure. */
2717 val = (dep_list_size (tmp2, SD_LIST_FORW)
2718 - dep_list_size (tmp, SD_LIST_FORW));
2720 if (flag_sched_dep_count_heuristic && val != 0)
2721 return rfs_result (RFS_DEP_COUNT, val);
2723 /* If insns are equally good, sort by INSN_LUID (original insn order),
2724 so that we make the sort stable. This minimizes instruction movement,
2725 thus minimizing sched's effect on debugging and cross-jumping. */
2726 return rfs_result (RFS_TIE, INSN_LUID (tmp) - INSN_LUID (tmp2));
2729 /* Resort the array A in which only element at index N may be out of order. */
2731 HAIFA_INLINE static void
2732 swap_sort (rtx_insn **a, int n)
2734 rtx_insn *insn = a[n - 1];
2735 int i = n - 2;
2737 while (i >= 0 && rank_for_schedule (a + i, &insn) >= 0)
2739 a[i + 1] = a[i];
2740 i -= 1;
2742 a[i + 1] = insn;
2745 /* Add INSN to the insn queue so that it can be executed at least
2746 N_CYCLES after the currently executing insn. Preserve insns
2747 chain for debugging purposes. REASON will be printed in debugging
2748 output. */
2750 HAIFA_INLINE static void
2751 queue_insn (rtx_insn *insn, int n_cycles, const char *reason)
2753 int next_q = NEXT_Q_AFTER (q_ptr, n_cycles);
2754 rtx_insn_list *link = alloc_INSN_LIST (insn, insn_queue[next_q]);
2755 int new_tick;
2757 gcc_assert (n_cycles <= max_insn_queue_index);
2758 gcc_assert (!DEBUG_INSN_P (insn));
2760 insn_queue[next_q] = link;
2761 q_size += 1;
2763 if (sched_verbose >= 2)
2765 fprintf (sched_dump, ";;\t\tReady-->Q: insn %s: ",
2766 (*current_sched_info->print_insn) (insn, 0));
2768 fprintf (sched_dump, "queued for %d cycles (%s).\n", n_cycles, reason);
2771 QUEUE_INDEX (insn) = next_q;
2773 if (current_sched_info->flags & DO_BACKTRACKING)
2775 new_tick = clock_var + n_cycles;
2776 if (INSN_TICK (insn) == INVALID_TICK || INSN_TICK (insn) < new_tick)
2777 INSN_TICK (insn) = new_tick;
2779 if (INSN_EXACT_TICK (insn) != INVALID_TICK
2780 && INSN_EXACT_TICK (insn) < clock_var + n_cycles)
2782 must_backtrack = true;
2783 if (sched_verbose >= 2)
2784 fprintf (sched_dump, ";;\t\tcausing a backtrack.\n");
2789 /* Remove INSN from queue. */
2790 static void
2791 queue_remove (rtx_insn *insn)
2793 gcc_assert (QUEUE_INDEX (insn) >= 0);
2794 remove_free_INSN_LIST_elem (insn, &insn_queue[QUEUE_INDEX (insn)]);
2795 q_size--;
2796 QUEUE_INDEX (insn) = QUEUE_NOWHERE;
2799 /* Return a pointer to the bottom of the ready list, i.e. the insn
2800 with the lowest priority. */
2802 rtx_insn **
2803 ready_lastpos (struct ready_list *ready)
2805 gcc_assert (ready->n_ready >= 1);
2806 return ready->vec + ready->first - ready->n_ready + 1;
2809 /* Add an element INSN to the ready list so that it ends up with the
2810 lowest/highest priority depending on FIRST_P. */
2812 HAIFA_INLINE static void
2813 ready_add (struct ready_list *ready, rtx_insn *insn, bool first_p)
2815 if (!first_p)
2817 if (ready->first == ready->n_ready)
2819 memmove (ready->vec + ready->veclen - ready->n_ready,
2820 ready_lastpos (ready),
2821 ready->n_ready * sizeof (rtx));
2822 ready->first = ready->veclen - 1;
2824 ready->vec[ready->first - ready->n_ready] = insn;
2826 else
2828 if (ready->first == ready->veclen - 1)
2830 if (ready->n_ready)
2831 /* ready_lastpos() fails when called with (ready->n_ready == 0). */
2832 memmove (ready->vec + ready->veclen - ready->n_ready - 1,
2833 ready_lastpos (ready),
2834 ready->n_ready * sizeof (rtx));
2835 ready->first = ready->veclen - 2;
2837 ready->vec[++(ready->first)] = insn;
2840 ready->n_ready++;
2841 if (DEBUG_INSN_P (insn))
2842 ready->n_debug++;
2844 gcc_assert (QUEUE_INDEX (insn) != QUEUE_READY);
2845 QUEUE_INDEX (insn) = QUEUE_READY;
2847 if (INSN_EXACT_TICK (insn) != INVALID_TICK
2848 && INSN_EXACT_TICK (insn) < clock_var)
2850 must_backtrack = true;
2854 /* Remove the element with the highest priority from the ready list and
2855 return it. */
2857 HAIFA_INLINE static rtx_insn *
2858 ready_remove_first (struct ready_list *ready)
2860 rtx_insn *t;
2862 gcc_assert (ready->n_ready);
2863 t = ready->vec[ready->first--];
2864 ready->n_ready--;
2865 if (DEBUG_INSN_P (t))
2866 ready->n_debug--;
2867 /* If the queue becomes empty, reset it. */
2868 if (ready->n_ready == 0)
2869 ready->first = ready->veclen - 1;
2871 gcc_assert (QUEUE_INDEX (t) == QUEUE_READY);
2872 QUEUE_INDEX (t) = QUEUE_NOWHERE;
2874 return t;
2877 /* The following code implements multi-pass scheduling for the first
2878 cycle. In other words, we will try to choose ready insn which
2879 permits to start maximum number of insns on the same cycle. */
2881 /* Return a pointer to the element INDEX from the ready. INDEX for
2882 insn with the highest priority is 0, and the lowest priority has
2883 N_READY - 1. */
2885 rtx_insn *
2886 ready_element (struct ready_list *ready, int index)
2888 gcc_assert (ready->n_ready && index < ready->n_ready);
2890 return ready->vec[ready->first - index];
2893 /* Remove the element INDEX from the ready list and return it. INDEX
2894 for insn with the highest priority is 0, and the lowest priority
2895 has N_READY - 1. */
2897 HAIFA_INLINE static rtx_insn *
2898 ready_remove (struct ready_list *ready, int index)
2900 rtx_insn *t;
2901 int i;
2903 if (index == 0)
2904 return ready_remove_first (ready);
2905 gcc_assert (ready->n_ready && index < ready->n_ready);
2906 t = ready->vec[ready->first - index];
2907 ready->n_ready--;
2908 if (DEBUG_INSN_P (t))
2909 ready->n_debug--;
2910 for (i = index; i < ready->n_ready; i++)
2911 ready->vec[ready->first - i] = ready->vec[ready->first - i - 1];
2912 QUEUE_INDEX (t) = QUEUE_NOWHERE;
2913 return t;
2916 /* Remove INSN from the ready list. */
2917 static void
2918 ready_remove_insn (rtx insn)
2920 int i;
2922 for (i = 0; i < readyp->n_ready; i++)
2923 if (ready_element (readyp, i) == insn)
2925 ready_remove (readyp, i);
2926 return;
2928 gcc_unreachable ();
2931 /* Calculate difference of two statistics set WAS and NOW.
2932 Result returned in WAS. */
2933 static void
2934 rank_for_schedule_stats_diff (rank_for_schedule_stats_t *was,
2935 const rank_for_schedule_stats_t *now)
2937 for (int i = 0; i < RFS_N; ++i)
2938 was->stats[i] = now->stats[i] - was->stats[i];
2941 /* Print rank_for_schedule statistics. */
2942 static void
2943 print_rank_for_schedule_stats (const char *prefix,
2944 const rank_for_schedule_stats_t *stats)
2946 for (int i = 0; i < RFS_N; ++i)
2947 if (stats->stats[i])
2948 fprintf (sched_dump, "%s%20s: %u\n", prefix, rfs_str[i], stats->stats[i]);
2951 /* Sort the ready list READY by ascending priority, using the SCHED_SORT
2952 macro. */
2954 void
2955 ready_sort (struct ready_list *ready)
2957 int i;
2958 rtx_insn **first = ready_lastpos (ready);
2960 if (sched_pressure == SCHED_PRESSURE_WEIGHTED)
2962 for (i = 0; i < ready->n_ready; i++)
2963 if (!DEBUG_INSN_P (first[i]))
2964 setup_insn_reg_pressure_info (first[i]);
2966 if (sched_pressure == SCHED_PRESSURE_MODEL
2967 && model_curr_point < model_num_insns)
2968 model_set_excess_costs (first, ready->n_ready);
2970 rank_for_schedule_stats_t stats1;
2971 if (sched_verbose >= 4)
2972 stats1 = rank_for_schedule_stats;
2974 if (ready->n_ready == 2)
2975 swap_sort (first, ready->n_ready);
2976 else if (ready->n_ready > 2)
2977 qsort (first, ready->n_ready, sizeof (rtx), rank_for_schedule);
2979 if (sched_verbose >= 4)
2981 rank_for_schedule_stats_diff (&stats1, &rank_for_schedule_stats);
2982 print_rank_for_schedule_stats (";;\t\t", &stats1);
2986 /* PREV is an insn that is ready to execute. Adjust its priority if that
2987 will help shorten or lengthen register lifetimes as appropriate. Also
2988 provide a hook for the target to tweak itself. */
2990 HAIFA_INLINE static void
2991 adjust_priority (rtx_insn *prev)
2993 /* ??? There used to be code here to try and estimate how an insn
2994 affected register lifetimes, but it did it by looking at REG_DEAD
2995 notes, which we removed in schedule_region. Nor did it try to
2996 take into account register pressure or anything useful like that.
2998 Revisit when we have a machine model to work with and not before. */
3000 if (targetm.sched.adjust_priority)
3001 INSN_PRIORITY (prev) =
3002 targetm.sched.adjust_priority (prev, INSN_PRIORITY (prev));
3005 /* Advance DFA state STATE on one cycle. */
3006 void
3007 advance_state (state_t state)
3009 if (targetm.sched.dfa_pre_advance_cycle)
3010 targetm.sched.dfa_pre_advance_cycle ();
3012 if (targetm.sched.dfa_pre_cycle_insn)
3013 state_transition (state,
3014 targetm.sched.dfa_pre_cycle_insn ());
3016 state_transition (state, NULL);
3018 if (targetm.sched.dfa_post_cycle_insn)
3019 state_transition (state,
3020 targetm.sched.dfa_post_cycle_insn ());
3022 if (targetm.sched.dfa_post_advance_cycle)
3023 targetm.sched.dfa_post_advance_cycle ();
3026 /* Advance time on one cycle. */
3027 HAIFA_INLINE static void
3028 advance_one_cycle (void)
3030 advance_state (curr_state);
3031 if (sched_verbose >= 4)
3032 fprintf (sched_dump, ";;\tAdvance the current state.\n");
3035 /* Update register pressure after scheduling INSN. */
3036 static void
3037 update_register_pressure (rtx_insn *insn)
3039 struct reg_use_data *use;
3040 struct reg_set_data *set;
3042 gcc_checking_assert (!DEBUG_INSN_P (insn));
3044 for (use = INSN_REG_USE_LIST (insn); use != NULL; use = use->next_insn_use)
3045 if (dying_use_p (use))
3046 mark_regno_birth_or_death (curr_reg_live, curr_reg_pressure,
3047 use->regno, false);
3048 for (set = INSN_REG_SET_LIST (insn); set != NULL; set = set->next_insn_set)
3049 mark_regno_birth_or_death (curr_reg_live, curr_reg_pressure,
3050 set->regno, true);
3053 /* Set up or update (if UPDATE_P) max register pressure (see its
3054 meaning in sched-int.h::_haifa_insn_data) for all current BB insns
3055 after insn AFTER. */
3056 static void
3057 setup_insn_max_reg_pressure (rtx_insn *after, bool update_p)
3059 int i, p;
3060 bool eq_p;
3061 rtx_insn *insn;
3062 static int max_reg_pressure[N_REG_CLASSES];
3064 save_reg_pressure ();
3065 for (i = 0; i < ira_pressure_classes_num; i++)
3066 max_reg_pressure[ira_pressure_classes[i]]
3067 = curr_reg_pressure[ira_pressure_classes[i]];
3068 for (insn = NEXT_INSN (after);
3069 insn != NULL_RTX && ! BARRIER_P (insn)
3070 && BLOCK_FOR_INSN (insn) == BLOCK_FOR_INSN (after);
3071 insn = NEXT_INSN (insn))
3072 if (NONDEBUG_INSN_P (insn))
3074 eq_p = true;
3075 for (i = 0; i < ira_pressure_classes_num; i++)
3077 p = max_reg_pressure[ira_pressure_classes[i]];
3078 if (INSN_MAX_REG_PRESSURE (insn)[i] != p)
3080 eq_p = false;
3081 INSN_MAX_REG_PRESSURE (insn)[i]
3082 = max_reg_pressure[ira_pressure_classes[i]];
3085 if (update_p && eq_p)
3086 break;
3087 update_register_pressure (insn);
3088 for (i = 0; i < ira_pressure_classes_num; i++)
3089 if (max_reg_pressure[ira_pressure_classes[i]]
3090 < curr_reg_pressure[ira_pressure_classes[i]])
3091 max_reg_pressure[ira_pressure_classes[i]]
3092 = curr_reg_pressure[ira_pressure_classes[i]];
3094 restore_reg_pressure ();
3097 /* Update the current register pressure after scheduling INSN. Update
3098 also max register pressure for unscheduled insns of the current
3099 BB. */
3100 static void
3101 update_reg_and_insn_max_reg_pressure (rtx_insn *insn)
3103 int i;
3104 int before[N_REG_CLASSES];
3106 for (i = 0; i < ira_pressure_classes_num; i++)
3107 before[i] = curr_reg_pressure[ira_pressure_classes[i]];
3108 update_register_pressure (insn);
3109 for (i = 0; i < ira_pressure_classes_num; i++)
3110 if (curr_reg_pressure[ira_pressure_classes[i]] != before[i])
3111 break;
3112 if (i < ira_pressure_classes_num)
3113 setup_insn_max_reg_pressure (insn, true);
3116 /* Set up register pressure at the beginning of basic block BB whose
3117 insns starting after insn AFTER. Set up also max register pressure
3118 for all insns of the basic block. */
3119 void
3120 sched_setup_bb_reg_pressure_info (basic_block bb, rtx_insn *after)
3122 gcc_assert (sched_pressure == SCHED_PRESSURE_WEIGHTED);
3123 initiate_bb_reg_pressure_info (bb);
3124 setup_insn_max_reg_pressure (after, false);
3127 /* If doing predication while scheduling, verify whether INSN, which
3128 has just been scheduled, clobbers the conditions of any
3129 instructions that must be predicated in order to break their
3130 dependencies. If so, remove them from the queues so that they will
3131 only be scheduled once their control dependency is resolved. */
3133 static void
3134 check_clobbered_conditions (rtx insn)
3136 HARD_REG_SET t;
3137 int i;
3139 if ((current_sched_info->flags & DO_PREDICATION) == 0)
3140 return;
3142 find_all_hard_reg_sets (insn, &t, true);
3144 restart:
3145 for (i = 0; i < ready.n_ready; i++)
3147 rtx_insn *x = ready_element (&ready, i);
3148 if (TODO_SPEC (x) == DEP_CONTROL && cond_clobbered_p (x, t))
3150 ready_remove_insn (x);
3151 goto restart;
3154 for (i = 0; i <= max_insn_queue_index; i++)
3156 rtx_insn_list *link;
3157 int q = NEXT_Q_AFTER (q_ptr, i);
3159 restart_queue:
3160 for (link = insn_queue[q]; link; link = link->next ())
3162 rtx_insn *x = link->insn ();
3163 if (TODO_SPEC (x) == DEP_CONTROL && cond_clobbered_p (x, t))
3165 queue_remove (x);
3166 goto restart_queue;
3172 /* Return (in order):
3174 - positive if INSN adversely affects the pressure on one
3175 register class
3177 - negative if INSN reduces the pressure on one register class
3179 - 0 if INSN doesn't affect the pressure on any register class. */
3181 static int
3182 model_classify_pressure (struct model_insn_info *insn)
3184 struct reg_pressure_data *reg_pressure;
3185 int death[N_REG_CLASSES];
3186 int pci, cl, sum;
3188 calculate_reg_deaths (insn->insn, death);
3189 reg_pressure = INSN_REG_PRESSURE (insn->insn);
3190 sum = 0;
3191 for (pci = 0; pci < ira_pressure_classes_num; pci++)
3193 cl = ira_pressure_classes[pci];
3194 if (death[cl] < reg_pressure[pci].set_increase)
3195 return 1;
3196 sum += reg_pressure[pci].set_increase - death[cl];
3198 return sum;
3201 /* Return true if INSN1 should come before INSN2 in the model schedule. */
3203 static int
3204 model_order_p (struct model_insn_info *insn1, struct model_insn_info *insn2)
3206 unsigned int height1, height2;
3207 unsigned int priority1, priority2;
3209 /* Prefer instructions with a higher model priority. */
3210 if (insn1->model_priority != insn2->model_priority)
3211 return insn1->model_priority > insn2->model_priority;
3213 /* Combine the length of the longest path of satisfied true dependencies
3214 that leads to each instruction (depth) with the length of the longest
3215 path of any dependencies that leads from the instruction (alap).
3216 Prefer instructions with the greatest combined length. If the combined
3217 lengths are equal, prefer instructions with the greatest depth.
3219 The idea is that, if we have a set S of "equal" instructions that each
3220 have ALAP value X, and we pick one such instruction I, any true-dependent
3221 successors of I that have ALAP value X - 1 should be preferred over S.
3222 This encourages the schedule to be "narrow" rather than "wide".
3223 However, if I is a low-priority instruction that we decided to
3224 schedule because of its model_classify_pressure, and if there
3225 is a set of higher-priority instructions T, the aforementioned
3226 successors of I should not have the edge over T. */
3227 height1 = insn1->depth + insn1->alap;
3228 height2 = insn2->depth + insn2->alap;
3229 if (height1 != height2)
3230 return height1 > height2;
3231 if (insn1->depth != insn2->depth)
3232 return insn1->depth > insn2->depth;
3234 /* We have no real preference between INSN1 an INSN2 as far as attempts
3235 to reduce pressure go. Prefer instructions with higher priorities. */
3236 priority1 = INSN_PRIORITY (insn1->insn);
3237 priority2 = INSN_PRIORITY (insn2->insn);
3238 if (priority1 != priority2)
3239 return priority1 > priority2;
3241 /* Use the original rtl sequence as a tie-breaker. */
3242 return insn1 < insn2;
3245 /* Add INSN to the model worklist immediately after PREV. Add it to the
3246 beginning of the list if PREV is null. */
3248 static void
3249 model_add_to_worklist_at (struct model_insn_info *insn,
3250 struct model_insn_info *prev)
3252 gcc_assert (QUEUE_INDEX (insn->insn) == QUEUE_NOWHERE);
3253 QUEUE_INDEX (insn->insn) = QUEUE_READY;
3255 insn->prev = prev;
3256 if (prev)
3258 insn->next = prev->next;
3259 prev->next = insn;
3261 else
3263 insn->next = model_worklist;
3264 model_worklist = insn;
3266 if (insn->next)
3267 insn->next->prev = insn;
3270 /* Remove INSN from the model worklist. */
3272 static void
3273 model_remove_from_worklist (struct model_insn_info *insn)
3275 gcc_assert (QUEUE_INDEX (insn->insn) == QUEUE_READY);
3276 QUEUE_INDEX (insn->insn) = QUEUE_NOWHERE;
3278 if (insn->prev)
3279 insn->prev->next = insn->next;
3280 else
3281 model_worklist = insn->next;
3282 if (insn->next)
3283 insn->next->prev = insn->prev;
3286 /* Add INSN to the model worklist. Start looking for a suitable position
3287 between neighbors PREV and NEXT, testing at most MAX_SCHED_READY_INSNS
3288 insns either side. A null PREV indicates the beginning of the list and
3289 a null NEXT indicates the end. */
3291 static void
3292 model_add_to_worklist (struct model_insn_info *insn,
3293 struct model_insn_info *prev,
3294 struct model_insn_info *next)
3296 int count;
3298 count = MAX_SCHED_READY_INSNS;
3299 if (count > 0 && prev && model_order_p (insn, prev))
3302 count--;
3303 prev = prev->prev;
3305 while (count > 0 && prev && model_order_p (insn, prev));
3306 else
3307 while (count > 0 && next && model_order_p (next, insn))
3309 count--;
3310 prev = next;
3311 next = next->next;
3313 model_add_to_worklist_at (insn, prev);
3316 /* INSN may now have a higher priority (in the model_order_p sense)
3317 than before. Move it up the worklist if necessary. */
3319 static void
3320 model_promote_insn (struct model_insn_info *insn)
3322 struct model_insn_info *prev;
3323 int count;
3325 prev = insn->prev;
3326 count = MAX_SCHED_READY_INSNS;
3327 while (count > 0 && prev && model_order_p (insn, prev))
3329 count--;
3330 prev = prev->prev;
3332 if (prev != insn->prev)
3334 model_remove_from_worklist (insn);
3335 model_add_to_worklist_at (insn, prev);
3339 /* Add INSN to the end of the model schedule. */
3341 static void
3342 model_add_to_schedule (rtx_insn *insn)
3344 unsigned int point;
3346 gcc_assert (QUEUE_INDEX (insn) == QUEUE_NOWHERE);
3347 QUEUE_INDEX (insn) = QUEUE_SCHEDULED;
3349 point = model_schedule.length ();
3350 model_schedule.quick_push (insn);
3351 INSN_MODEL_INDEX (insn) = point + 1;
3354 /* Analyze the instructions that are to be scheduled, setting up
3355 MODEL_INSN_INFO (...) and model_num_insns accordingly. Add ready
3356 instructions to model_worklist. */
3358 static void
3359 model_analyze_insns (void)
3361 rtx_insn *start, *end, *iter;
3362 sd_iterator_def sd_it;
3363 dep_t dep;
3364 struct model_insn_info *insn, *con;
3366 model_num_insns = 0;
3367 start = PREV_INSN (current_sched_info->next_tail);
3368 end = current_sched_info->prev_head;
3369 for (iter = start; iter != end; iter = PREV_INSN (iter))
3370 if (NONDEBUG_INSN_P (iter))
3372 insn = MODEL_INSN_INFO (iter);
3373 insn->insn = iter;
3374 FOR_EACH_DEP (iter, SD_LIST_FORW, sd_it, dep)
3376 con = MODEL_INSN_INFO (DEP_CON (dep));
3377 if (con->insn && insn->alap < con->alap + 1)
3378 insn->alap = con->alap + 1;
3381 insn->old_queue = QUEUE_INDEX (iter);
3382 QUEUE_INDEX (iter) = QUEUE_NOWHERE;
3384 insn->unscheduled_preds = dep_list_size (iter, SD_LIST_HARD_BACK);
3385 if (insn->unscheduled_preds == 0)
3386 model_add_to_worklist (insn, NULL, model_worklist);
3388 model_num_insns++;
3392 /* The global state describes the register pressure at the start of the
3393 model schedule. Initialize GROUP accordingly. */
3395 static void
3396 model_init_pressure_group (struct model_pressure_group *group)
3398 int pci, cl;
3400 for (pci = 0; pci < ira_pressure_classes_num; pci++)
3402 cl = ira_pressure_classes[pci];
3403 group->limits[pci].pressure = curr_reg_pressure[cl];
3404 group->limits[pci].point = 0;
3406 /* Use index model_num_insns to record the state after the last
3407 instruction in the model schedule. */
3408 group->model = XNEWVEC (struct model_pressure_data,
3409 (model_num_insns + 1) * ira_pressure_classes_num);
3412 /* Record that MODEL_REF_PRESSURE (GROUP, POINT, PCI) is PRESSURE.
3413 Update the maximum pressure for the whole schedule. */
3415 static void
3416 model_record_pressure (struct model_pressure_group *group,
3417 int point, int pci, int pressure)
3419 MODEL_REF_PRESSURE (group, point, pci) = pressure;
3420 if (group->limits[pci].pressure < pressure)
3422 group->limits[pci].pressure = pressure;
3423 group->limits[pci].point = point;
3427 /* INSN has just been added to the end of the model schedule. Record its
3428 register-pressure information. */
3430 static void
3431 model_record_pressures (struct model_insn_info *insn)
3433 struct reg_pressure_data *reg_pressure;
3434 int point, pci, cl, delta;
3435 int death[N_REG_CLASSES];
3437 point = model_index (insn->insn);
3438 if (sched_verbose >= 2)
3440 if (point == 0)
3442 fprintf (sched_dump, "\n;;\tModel schedule:\n;;\n");
3443 fprintf (sched_dump, ";;\t| idx insn | mpri hght dpth prio |\n");
3445 fprintf (sched_dump, ";;\t| %3d %4d | %4d %4d %4d %4d | %-30s ",
3446 point, INSN_UID (insn->insn), insn->model_priority,
3447 insn->depth + insn->alap, insn->depth,
3448 INSN_PRIORITY (insn->insn),
3449 str_pattern_slim (PATTERN (insn->insn)));
3451 calculate_reg_deaths (insn->insn, death);
3452 reg_pressure = INSN_REG_PRESSURE (insn->insn);
3453 for (pci = 0; pci < ira_pressure_classes_num; pci++)
3455 cl = ira_pressure_classes[pci];
3456 delta = reg_pressure[pci].set_increase - death[cl];
3457 if (sched_verbose >= 2)
3458 fprintf (sched_dump, " %s:[%d,%+d]", reg_class_names[cl],
3459 curr_reg_pressure[cl], delta);
3460 model_record_pressure (&model_before_pressure, point, pci,
3461 curr_reg_pressure[cl]);
3463 if (sched_verbose >= 2)
3464 fprintf (sched_dump, "\n");
3467 /* All instructions have been added to the model schedule. Record the
3468 final register pressure in GROUP and set up all MODEL_MAX_PRESSUREs. */
3470 static void
3471 model_record_final_pressures (struct model_pressure_group *group)
3473 int point, pci, max_pressure, ref_pressure, cl;
3475 for (pci = 0; pci < ira_pressure_classes_num; pci++)
3477 /* Record the final pressure for this class. */
3478 cl = ira_pressure_classes[pci];
3479 point = model_num_insns;
3480 ref_pressure = curr_reg_pressure[cl];
3481 model_record_pressure (group, point, pci, ref_pressure);
3483 /* Record the original maximum pressure. */
3484 group->limits[pci].orig_pressure = group->limits[pci].pressure;
3486 /* Update the MODEL_MAX_PRESSURE for every point of the schedule. */
3487 max_pressure = ref_pressure;
3488 MODEL_MAX_PRESSURE (group, point, pci) = max_pressure;
3489 while (point > 0)
3491 point--;
3492 ref_pressure = MODEL_REF_PRESSURE (group, point, pci);
3493 max_pressure = MAX (max_pressure, ref_pressure);
3494 MODEL_MAX_PRESSURE (group, point, pci) = max_pressure;
3499 /* Update all successors of INSN, given that INSN has just been scheduled. */
3501 static void
3502 model_add_successors_to_worklist (struct model_insn_info *insn)
3504 sd_iterator_def sd_it;
3505 struct model_insn_info *con;
3506 dep_t dep;
3508 FOR_EACH_DEP (insn->insn, SD_LIST_FORW, sd_it, dep)
3510 con = MODEL_INSN_INFO (DEP_CON (dep));
3511 /* Ignore debug instructions, and instructions from other blocks. */
3512 if (con->insn)
3514 con->unscheduled_preds--;
3516 /* Update the depth field of each true-dependent successor.
3517 Increasing the depth gives them a higher priority than
3518 before. */
3519 if (DEP_TYPE (dep) == REG_DEP_TRUE && con->depth < insn->depth + 1)
3521 con->depth = insn->depth + 1;
3522 if (QUEUE_INDEX (con->insn) == QUEUE_READY)
3523 model_promote_insn (con);
3526 /* If this is a true dependency, or if there are no remaining
3527 dependencies for CON (meaning that CON only had non-true
3528 dependencies), make sure that CON is on the worklist.
3529 We don't bother otherwise because it would tend to fill the
3530 worklist with a lot of low-priority instructions that are not
3531 yet ready to issue. */
3532 if ((con->depth > 0 || con->unscheduled_preds == 0)
3533 && QUEUE_INDEX (con->insn) == QUEUE_NOWHERE)
3534 model_add_to_worklist (con, insn, insn->next);
3539 /* Give INSN a higher priority than any current instruction, then give
3540 unscheduled predecessors of INSN a higher priority still. If any of
3541 those predecessors are not on the model worklist, do the same for its
3542 predecessors, and so on. */
3544 static void
3545 model_promote_predecessors (struct model_insn_info *insn)
3547 struct model_insn_info *pro, *first;
3548 sd_iterator_def sd_it;
3549 dep_t dep;
3551 if (sched_verbose >= 7)
3552 fprintf (sched_dump, ";;\t+--- priority of %d = %d, priority of",
3553 INSN_UID (insn->insn), model_next_priority);
3554 insn->model_priority = model_next_priority++;
3555 model_remove_from_worklist (insn);
3556 model_add_to_worklist_at (insn, NULL);
3558 first = NULL;
3559 for (;;)
3561 FOR_EACH_DEP (insn->insn, SD_LIST_HARD_BACK, sd_it, dep)
3563 pro = MODEL_INSN_INFO (DEP_PRO (dep));
3564 /* The first test is to ignore debug instructions, and instructions
3565 from other blocks. */
3566 if (pro->insn
3567 && pro->model_priority != model_next_priority
3568 && QUEUE_INDEX (pro->insn) != QUEUE_SCHEDULED)
3570 pro->model_priority = model_next_priority;
3571 if (sched_verbose >= 7)
3572 fprintf (sched_dump, " %d", INSN_UID (pro->insn));
3573 if (QUEUE_INDEX (pro->insn) == QUEUE_READY)
3575 /* PRO is already in the worklist, but it now has
3576 a higher priority than before. Move it at the
3577 appropriate place. */
3578 model_remove_from_worklist (pro);
3579 model_add_to_worklist (pro, NULL, model_worklist);
3581 else
3583 /* PRO isn't in the worklist. Recursively process
3584 its predecessors until we find one that is. */
3585 pro->next = first;
3586 first = pro;
3590 if (!first)
3591 break;
3592 insn = first;
3593 first = insn->next;
3595 if (sched_verbose >= 7)
3596 fprintf (sched_dump, " = %d\n", model_next_priority);
3597 model_next_priority++;
3600 /* Pick one instruction from model_worklist and process it. */
3602 static void
3603 model_choose_insn (void)
3605 struct model_insn_info *insn, *fallback;
3606 int count;
3608 if (sched_verbose >= 7)
3610 fprintf (sched_dump, ";;\t+--- worklist:\n");
3611 insn = model_worklist;
3612 count = MAX_SCHED_READY_INSNS;
3613 while (count > 0 && insn)
3615 fprintf (sched_dump, ";;\t+--- %d [%d, %d, %d, %d]\n",
3616 INSN_UID (insn->insn), insn->model_priority,
3617 insn->depth + insn->alap, insn->depth,
3618 INSN_PRIORITY (insn->insn));
3619 count--;
3620 insn = insn->next;
3624 /* Look for a ready instruction whose model_classify_priority is zero
3625 or negative, picking the highest-priority one. Adding such an
3626 instruction to the schedule now should do no harm, and may actually
3627 do some good.
3629 Failing that, see whether there is an instruction with the highest
3630 extant model_priority that is not yet ready, but which would reduce
3631 pressure if it became ready. This is designed to catch cases like:
3633 (set (mem (reg R1)) (reg R2))
3635 where the instruction is the last remaining use of R1 and where the
3636 value of R2 is not yet available (or vice versa). The death of R1
3637 means that this instruction already reduces pressure. It is of
3638 course possible that the computation of R2 involves other registers
3639 that are hard to kill, but such cases are rare enough for this
3640 heuristic to be a win in general.
3642 Failing that, just pick the highest-priority instruction in the
3643 worklist. */
3644 count = MAX_SCHED_READY_INSNS;
3645 insn = model_worklist;
3646 fallback = 0;
3647 for (;;)
3649 if (count == 0 || !insn)
3651 insn = fallback ? fallback : model_worklist;
3652 break;
3654 if (insn->unscheduled_preds)
3656 if (model_worklist->model_priority == insn->model_priority
3657 && !fallback
3658 && model_classify_pressure (insn) < 0)
3659 fallback = insn;
3661 else
3663 if (model_classify_pressure (insn) <= 0)
3664 break;
3666 count--;
3667 insn = insn->next;
3670 if (sched_verbose >= 7 && insn != model_worklist)
3672 if (insn->unscheduled_preds)
3673 fprintf (sched_dump, ";;\t+--- promoting insn %d, with dependencies\n",
3674 INSN_UID (insn->insn));
3675 else
3676 fprintf (sched_dump, ";;\t+--- promoting insn %d, which is ready\n",
3677 INSN_UID (insn->insn));
3679 if (insn->unscheduled_preds)
3680 /* INSN isn't yet ready to issue. Give all its predecessors the
3681 highest priority. */
3682 model_promote_predecessors (insn);
3683 else
3685 /* INSN is ready. Add it to the end of model_schedule and
3686 process its successors. */
3687 model_add_successors_to_worklist (insn);
3688 model_remove_from_worklist (insn);
3689 model_add_to_schedule (insn->insn);
3690 model_record_pressures (insn);
3691 update_register_pressure (insn->insn);
3695 /* Restore all QUEUE_INDEXs to the values that they had before
3696 model_start_schedule was called. */
3698 static void
3699 model_reset_queue_indices (void)
3701 unsigned int i;
3702 rtx_insn *insn;
3704 FOR_EACH_VEC_ELT (model_schedule, i, insn)
3705 QUEUE_INDEX (insn) = MODEL_INSN_INFO (insn)->old_queue;
3708 /* We have calculated the model schedule and spill costs. Print a summary
3709 to sched_dump. */
3711 static void
3712 model_dump_pressure_summary (void)
3714 int pci, cl;
3716 fprintf (sched_dump, ";; Pressure summary:");
3717 for (pci = 0; pci < ira_pressure_classes_num; pci++)
3719 cl = ira_pressure_classes[pci];
3720 fprintf (sched_dump, " %s:%d", reg_class_names[cl],
3721 model_before_pressure.limits[pci].pressure);
3723 fprintf (sched_dump, "\n\n");
3726 /* Initialize the SCHED_PRESSURE_MODEL information for the current
3727 scheduling region. */
3729 static void
3730 model_start_schedule (void)
3732 basic_block bb;
3734 model_next_priority = 1;
3735 model_schedule.create (sched_max_luid);
3736 model_insns = XCNEWVEC (struct model_insn_info, sched_max_luid);
3738 bb = BLOCK_FOR_INSN (NEXT_INSN (current_sched_info->prev_head));
3739 initiate_reg_pressure_info (df_get_live_in (bb));
3741 model_analyze_insns ();
3742 model_init_pressure_group (&model_before_pressure);
3743 while (model_worklist)
3744 model_choose_insn ();
3745 gcc_assert (model_num_insns == (int) model_schedule.length ());
3746 if (sched_verbose >= 2)
3747 fprintf (sched_dump, "\n");
3749 model_record_final_pressures (&model_before_pressure);
3750 model_reset_queue_indices ();
3752 XDELETEVEC (model_insns);
3754 model_curr_point = 0;
3755 initiate_reg_pressure_info (df_get_live_in (bb));
3756 if (sched_verbose >= 1)
3757 model_dump_pressure_summary ();
3760 /* Free the information associated with GROUP. */
3762 static void
3763 model_finalize_pressure_group (struct model_pressure_group *group)
3765 XDELETEVEC (group->model);
3768 /* Free the information created by model_start_schedule. */
3770 static void
3771 model_end_schedule (void)
3773 model_finalize_pressure_group (&model_before_pressure);
3774 model_schedule.release ();
3777 /* A structure that holds local state for the loop in schedule_block. */
3778 struct sched_block_state
3780 /* True if no real insns have been scheduled in the current cycle. */
3781 bool first_cycle_insn_p;
3782 /* True if a shadow insn has been scheduled in the current cycle, which
3783 means that no more normal insns can be issued. */
3784 bool shadows_only_p;
3785 /* True if we're winding down a modulo schedule, which means that we only
3786 issue insns with INSN_EXACT_TICK set. */
3787 bool modulo_epilogue;
3788 /* Initialized with the machine's issue rate every cycle, and updated
3789 by calls to the variable_issue hook. */
3790 int can_issue_more;
3793 /* INSN is the "currently executing insn". Launch each insn which was
3794 waiting on INSN. READY is the ready list which contains the insns
3795 that are ready to fire. CLOCK is the current cycle. The function
3796 returns necessary cycle advance after issuing the insn (it is not
3797 zero for insns in a schedule group). */
3799 static int
3800 schedule_insn (rtx_insn *insn)
3802 sd_iterator_def sd_it;
3803 dep_t dep;
3804 int i;
3805 int advance = 0;
3807 if (sched_verbose >= 1)
3809 struct reg_pressure_data *pressure_info;
3810 fprintf (sched_dump, ";;\t%3i--> %s %-40s:",
3811 clock_var, (*current_sched_info->print_insn) (insn, 1),
3812 str_pattern_slim (PATTERN (insn)));
3814 if (recog_memoized (insn) < 0)
3815 fprintf (sched_dump, "nothing");
3816 else
3817 print_reservation (sched_dump, insn);
3818 pressure_info = INSN_REG_PRESSURE (insn);
3819 if (pressure_info != NULL)
3821 fputc (':', sched_dump);
3822 for (i = 0; i < ira_pressure_classes_num; i++)
3823 fprintf (sched_dump, "%s%s%+d(%d)",
3824 scheduled_insns.length () > 1
3825 && INSN_LUID (insn)
3826 < INSN_LUID (scheduled_insns[scheduled_insns.length () - 2]) ? "@" : "",
3827 reg_class_names[ira_pressure_classes[i]],
3828 pressure_info[i].set_increase, pressure_info[i].change);
3830 if (sched_pressure == SCHED_PRESSURE_MODEL
3831 && model_curr_point < model_num_insns
3832 && model_index (insn) == model_curr_point)
3833 fprintf (sched_dump, ":model %d", model_curr_point);
3834 fputc ('\n', sched_dump);
3837 if (sched_pressure == SCHED_PRESSURE_WEIGHTED && !DEBUG_INSN_P (insn))
3838 update_reg_and_insn_max_reg_pressure (insn);
3840 /* Scheduling instruction should have all its dependencies resolved and
3841 should have been removed from the ready list. */
3842 gcc_assert (sd_lists_empty_p (insn, SD_LIST_HARD_BACK));
3844 /* Reset debug insns invalidated by moving this insn. */
3845 if (MAY_HAVE_DEBUG_INSNS && !DEBUG_INSN_P (insn))
3846 for (sd_it = sd_iterator_start (insn, SD_LIST_BACK);
3847 sd_iterator_cond (&sd_it, &dep);)
3849 rtx_insn *dbg = DEP_PRO (dep);
3850 struct reg_use_data *use, *next;
3852 if (DEP_STATUS (dep) & DEP_CANCELLED)
3854 sd_iterator_next (&sd_it);
3855 continue;
3858 gcc_assert (DEBUG_INSN_P (dbg));
3860 if (sched_verbose >= 6)
3861 fprintf (sched_dump, ";;\t\tresetting: debug insn %d\n",
3862 INSN_UID (dbg));
3864 /* ??? Rather than resetting the debug insn, we might be able
3865 to emit a debug temp before the just-scheduled insn, but
3866 this would involve checking that the expression at the
3867 point of the debug insn is equivalent to the expression
3868 before the just-scheduled insn. They might not be: the
3869 expression in the debug insn may depend on other insns not
3870 yet scheduled that set MEMs, REGs or even other debug
3871 insns. It's not clear that attempting to preserve debug
3872 information in these cases is worth the effort, given how
3873 uncommon these resets are and the likelihood that the debug
3874 temps introduced won't survive the schedule change. */
3875 INSN_VAR_LOCATION_LOC (dbg) = gen_rtx_UNKNOWN_VAR_LOC ();
3876 df_insn_rescan (dbg);
3878 /* Unknown location doesn't use any registers. */
3879 for (use = INSN_REG_USE_LIST (dbg); use != NULL; use = next)
3881 struct reg_use_data *prev = use;
3883 /* Remove use from the cyclic next_regno_use chain first. */
3884 while (prev->next_regno_use != use)
3885 prev = prev->next_regno_use;
3886 prev->next_regno_use = use->next_regno_use;
3887 next = use->next_insn_use;
3888 free (use);
3890 INSN_REG_USE_LIST (dbg) = NULL;
3892 /* We delete rather than resolve these deps, otherwise we
3893 crash in sched_free_deps(), because forward deps are
3894 expected to be released before backward deps. */
3895 sd_delete_dep (sd_it);
3898 gcc_assert (QUEUE_INDEX (insn) == QUEUE_NOWHERE);
3899 QUEUE_INDEX (insn) = QUEUE_SCHEDULED;
3901 if (sched_pressure == SCHED_PRESSURE_MODEL
3902 && model_curr_point < model_num_insns
3903 && NONDEBUG_INSN_P (insn))
3905 if (model_index (insn) == model_curr_point)
3907 model_curr_point++;
3908 while (model_curr_point < model_num_insns
3909 && (QUEUE_INDEX (MODEL_INSN (model_curr_point))
3910 == QUEUE_SCHEDULED));
3911 else
3912 model_recompute (insn);
3913 model_update_limit_points ();
3914 update_register_pressure (insn);
3915 if (sched_verbose >= 2)
3916 print_curr_reg_pressure ();
3919 gcc_assert (INSN_TICK (insn) >= MIN_TICK);
3920 if (INSN_TICK (insn) > clock_var)
3921 /* INSN has been prematurely moved from the queue to the ready list.
3922 This is possible only if following flag is set. */
3923 gcc_assert (flag_sched_stalled_insns);
3925 /* ??? Probably, if INSN is scheduled prematurely, we should leave
3926 INSN_TICK untouched. This is a machine-dependent issue, actually. */
3927 INSN_TICK (insn) = clock_var;
3929 check_clobbered_conditions (insn);
3931 /* Update dependent instructions. First, see if by scheduling this insn
3932 now we broke a dependence in a way that requires us to change another
3933 insn. */
3934 for (sd_it = sd_iterator_start (insn, SD_LIST_SPEC_BACK);
3935 sd_iterator_cond (&sd_it, &dep); sd_iterator_next (&sd_it))
3937 struct dep_replacement *desc = DEP_REPLACE (dep);
3938 rtx_insn *pro = DEP_PRO (dep);
3939 if (QUEUE_INDEX (pro) != QUEUE_SCHEDULED
3940 && desc != NULL && desc->insn == pro)
3941 apply_replacement (dep, false);
3944 /* Go through and resolve forward dependencies. */
3945 for (sd_it = sd_iterator_start (insn, SD_LIST_FORW);
3946 sd_iterator_cond (&sd_it, &dep);)
3948 rtx_insn *next = DEP_CON (dep);
3949 bool cancelled = (DEP_STATUS (dep) & DEP_CANCELLED) != 0;
3951 /* Resolve the dependence between INSN and NEXT.
3952 sd_resolve_dep () moves current dep to another list thus
3953 advancing the iterator. */
3954 sd_resolve_dep (sd_it);
3956 if (cancelled)
3958 if (must_restore_pattern_p (next, dep))
3959 restore_pattern (dep, false);
3960 continue;
3963 /* Don't bother trying to mark next as ready if insn is a debug
3964 insn. If insn is the last hard dependency, it will have
3965 already been discounted. */
3966 if (DEBUG_INSN_P (insn) && !DEBUG_INSN_P (next))
3967 continue;
3969 if (!IS_SPECULATION_BRANCHY_CHECK_P (insn))
3971 int effective_cost;
3973 effective_cost = try_ready (next);
3975 if (effective_cost >= 0
3976 && SCHED_GROUP_P (next)
3977 && advance < effective_cost)
3978 advance = effective_cost;
3980 else
3981 /* Check always has only one forward dependence (to the first insn in
3982 the recovery block), therefore, this will be executed only once. */
3984 gcc_assert (sd_lists_empty_p (insn, SD_LIST_FORW));
3985 fix_recovery_deps (RECOVERY_BLOCK (insn));
3989 /* Annotate the instruction with issue information -- TImode
3990 indicates that the instruction is expected not to be able
3991 to issue on the same cycle as the previous insn. A machine
3992 may use this information to decide how the instruction should
3993 be aligned. */
3994 if (issue_rate > 1
3995 && GET_CODE (PATTERN (insn)) != USE
3996 && GET_CODE (PATTERN (insn)) != CLOBBER
3997 && !DEBUG_INSN_P (insn))
3999 if (reload_completed)
4000 PUT_MODE (insn, clock_var > last_clock_var ? TImode : VOIDmode);
4001 last_clock_var = clock_var;
4004 if (nonscheduled_insns_begin != NULL_RTX)
4005 /* Indicate to debug counters that INSN is scheduled. */
4006 nonscheduled_insns_begin = insn;
4008 return advance;
4011 /* Functions for handling of notes. */
4013 /* Add note list that ends on FROM_END to the end of TO_ENDP. */
4014 void
4015 concat_note_lists (rtx_insn *from_end, rtx_insn **to_endp)
4017 rtx_insn *from_start;
4019 /* It's easy when have nothing to concat. */
4020 if (from_end == NULL)
4021 return;
4023 /* It's also easy when destination is empty. */
4024 if (*to_endp == NULL)
4026 *to_endp = from_end;
4027 return;
4030 from_start = from_end;
4031 while (PREV_INSN (from_start) != NULL)
4032 from_start = PREV_INSN (from_start);
4034 SET_PREV_INSN (from_start) = *to_endp;
4035 SET_NEXT_INSN (*to_endp) = from_start;
4036 *to_endp = from_end;
4039 /* Delete notes between HEAD and TAIL and put them in the chain
4040 of notes ended by NOTE_LIST. */
4041 void
4042 remove_notes (rtx_insn *head, rtx_insn *tail)
4044 rtx_insn *next_tail, *insn, *next;
4046 note_list = 0;
4047 if (head == tail && !INSN_P (head))
4048 return;
4050 next_tail = NEXT_INSN (tail);
4051 for (insn = head; insn != next_tail; insn = next)
4053 next = NEXT_INSN (insn);
4054 if (!NOTE_P (insn))
4055 continue;
4057 switch (NOTE_KIND (insn))
4059 case NOTE_INSN_BASIC_BLOCK:
4060 continue;
4062 case NOTE_INSN_EPILOGUE_BEG:
4063 if (insn != tail)
4065 remove_insn (insn);
4066 add_reg_note (next, REG_SAVE_NOTE,
4067 GEN_INT (NOTE_INSN_EPILOGUE_BEG));
4068 break;
4070 /* FALLTHRU */
4072 default:
4073 remove_insn (insn);
4075 /* Add the note to list that ends at NOTE_LIST. */
4076 SET_PREV_INSN (insn) = note_list;
4077 SET_NEXT_INSN (insn) = NULL_RTX;
4078 if (note_list)
4079 SET_NEXT_INSN (note_list) = insn;
4080 note_list = insn;
4081 break;
4084 gcc_assert ((sel_sched_p () || insn != tail) && insn != head);
4088 /* A structure to record enough data to allow us to backtrack the scheduler to
4089 a previous state. */
4090 struct haifa_saved_data
4092 /* Next entry on the list. */
4093 struct haifa_saved_data *next;
4095 /* Backtracking is associated with scheduling insns that have delay slots.
4096 DELAY_PAIR points to the structure that contains the insns involved, and
4097 the number of cycles between them. */
4098 struct delay_pair *delay_pair;
4100 /* Data used by the frontend (e.g. sched-ebb or sched-rgn). */
4101 void *fe_saved_data;
4102 /* Data used by the backend. */
4103 void *be_saved_data;
4105 /* Copies of global state. */
4106 int clock_var, last_clock_var;
4107 struct ready_list ready;
4108 state_t curr_state;
4110 rtx_insn *last_scheduled_insn;
4111 rtx last_nondebug_scheduled_insn;
4112 rtx_insn *nonscheduled_insns_begin;
4113 int cycle_issued_insns;
4115 /* Copies of state used in the inner loop of schedule_block. */
4116 struct sched_block_state sched_block;
4118 /* We don't need to save q_ptr, as its value is arbitrary and we can set it
4119 to 0 when restoring. */
4120 int q_size;
4121 rtx_insn_list **insn_queue;
4123 /* Describe pattern replacements that occurred since this backtrack point
4124 was queued. */
4125 vec<dep_t> replacement_deps;
4126 vec<int> replace_apply;
4128 /* A copy of the next-cycle replacement vectors at the time of the backtrack
4129 point. */
4130 vec<dep_t> next_cycle_deps;
4131 vec<int> next_cycle_apply;
4134 /* A record, in reverse order, of all scheduled insns which have delay slots
4135 and may require backtracking. */
4136 static struct haifa_saved_data *backtrack_queue;
4138 /* For every dependency of INSN, set the FEEDS_BACKTRACK_INSN bit according
4139 to SET_P. */
4140 static void
4141 mark_backtrack_feeds (rtx insn, int set_p)
4143 sd_iterator_def sd_it;
4144 dep_t dep;
4145 FOR_EACH_DEP (insn, SD_LIST_HARD_BACK, sd_it, dep)
4147 FEEDS_BACKTRACK_INSN (DEP_PRO (dep)) = set_p;
4151 /* Save the current scheduler state so that we can backtrack to it
4152 later if necessary. PAIR gives the insns that make it necessary to
4153 save this point. SCHED_BLOCK is the local state of schedule_block
4154 that need to be saved. */
4155 static void
4156 save_backtrack_point (struct delay_pair *pair,
4157 struct sched_block_state sched_block)
4159 int i;
4160 struct haifa_saved_data *save = XNEW (struct haifa_saved_data);
4162 save->curr_state = xmalloc (dfa_state_size);
4163 memcpy (save->curr_state, curr_state, dfa_state_size);
4165 save->ready.first = ready.first;
4166 save->ready.n_ready = ready.n_ready;
4167 save->ready.n_debug = ready.n_debug;
4168 save->ready.veclen = ready.veclen;
4169 save->ready.vec = XNEWVEC (rtx_insn *, ready.veclen);
4170 memcpy (save->ready.vec, ready.vec, ready.veclen * sizeof (rtx));
4172 save->insn_queue = XNEWVEC (rtx_insn_list *, max_insn_queue_index + 1);
4173 save->q_size = q_size;
4174 for (i = 0; i <= max_insn_queue_index; i++)
4176 int q = NEXT_Q_AFTER (q_ptr, i);
4177 save->insn_queue[i] = copy_INSN_LIST (insn_queue[q]);
4180 save->clock_var = clock_var;
4181 save->last_clock_var = last_clock_var;
4182 save->cycle_issued_insns = cycle_issued_insns;
4183 save->last_scheduled_insn = last_scheduled_insn;
4184 save->last_nondebug_scheduled_insn = last_nondebug_scheduled_insn;
4185 save->nonscheduled_insns_begin = nonscheduled_insns_begin;
4187 save->sched_block = sched_block;
4189 save->replacement_deps.create (0);
4190 save->replace_apply.create (0);
4191 save->next_cycle_deps = next_cycle_replace_deps.copy ();
4192 save->next_cycle_apply = next_cycle_apply.copy ();
4194 if (current_sched_info->save_state)
4195 save->fe_saved_data = (*current_sched_info->save_state) ();
4197 if (targetm.sched.alloc_sched_context)
4199 save->be_saved_data = targetm.sched.alloc_sched_context ();
4200 targetm.sched.init_sched_context (save->be_saved_data, false);
4202 else
4203 save->be_saved_data = NULL;
4205 save->delay_pair = pair;
4207 save->next = backtrack_queue;
4208 backtrack_queue = save;
4210 while (pair)
4212 mark_backtrack_feeds (pair->i2, 1);
4213 INSN_TICK (pair->i2) = INVALID_TICK;
4214 INSN_EXACT_TICK (pair->i2) = clock_var + pair_delay (pair);
4215 SHADOW_P (pair->i2) = pair->stages == 0;
4216 pair = pair->next_same_i1;
4220 /* Walk the ready list and all queues. If any insns have unresolved backwards
4221 dependencies, these must be cancelled deps, broken by predication. Set or
4222 clear (depending on SET) the DEP_CANCELLED bit in DEP_STATUS. */
4224 static void
4225 toggle_cancelled_flags (bool set)
4227 int i;
4228 sd_iterator_def sd_it;
4229 dep_t dep;
4231 if (ready.n_ready > 0)
4233 rtx_insn **first = ready_lastpos (&ready);
4234 for (i = 0; i < ready.n_ready; i++)
4235 FOR_EACH_DEP (first[i], SD_LIST_BACK, sd_it, dep)
4236 if (!DEBUG_INSN_P (DEP_PRO (dep)))
4238 if (set)
4239 DEP_STATUS (dep) |= DEP_CANCELLED;
4240 else
4241 DEP_STATUS (dep) &= ~DEP_CANCELLED;
4244 for (i = 0; i <= max_insn_queue_index; i++)
4246 int q = NEXT_Q_AFTER (q_ptr, i);
4247 rtx_insn_list *link;
4248 for (link = insn_queue[q]; link; link = link->next ())
4250 rtx_insn *insn = link->insn ();
4251 FOR_EACH_DEP (insn, SD_LIST_BACK, sd_it, dep)
4252 if (!DEBUG_INSN_P (DEP_PRO (dep)))
4254 if (set)
4255 DEP_STATUS (dep) |= DEP_CANCELLED;
4256 else
4257 DEP_STATUS (dep) &= ~DEP_CANCELLED;
4263 /* Undo the replacements that have occurred after backtrack point SAVE
4264 was placed. */
4265 static void
4266 undo_replacements_for_backtrack (struct haifa_saved_data *save)
4268 while (!save->replacement_deps.is_empty ())
4270 dep_t dep = save->replacement_deps.pop ();
4271 int apply_p = save->replace_apply.pop ();
4273 if (apply_p)
4274 restore_pattern (dep, true);
4275 else
4276 apply_replacement (dep, true);
4278 save->replacement_deps.release ();
4279 save->replace_apply.release ();
4282 /* Pop entries from the SCHEDULED_INSNS vector up to and including INSN.
4283 Restore their dependencies to an unresolved state, and mark them as
4284 queued nowhere. */
4286 static void
4287 unschedule_insns_until (rtx insn)
4289 auto_vec<rtx_insn *> recompute_vec;
4291 /* Make two passes over the insns to be unscheduled. First, we clear out
4292 dependencies and other trivial bookkeeping. */
4293 for (;;)
4295 rtx_insn *last;
4296 sd_iterator_def sd_it;
4297 dep_t dep;
4299 last = scheduled_insns.pop ();
4301 /* This will be changed by restore_backtrack_point if the insn is in
4302 any queue. */
4303 QUEUE_INDEX (last) = QUEUE_NOWHERE;
4304 if (last != insn)
4305 INSN_TICK (last) = INVALID_TICK;
4307 if (modulo_ii > 0 && INSN_UID (last) < modulo_iter0_max_uid)
4308 modulo_insns_scheduled--;
4310 for (sd_it = sd_iterator_start (last, SD_LIST_RES_FORW);
4311 sd_iterator_cond (&sd_it, &dep);)
4313 rtx_insn *con = DEP_CON (dep);
4314 sd_unresolve_dep (sd_it);
4315 if (!MUST_RECOMPUTE_SPEC_P (con))
4317 MUST_RECOMPUTE_SPEC_P (con) = 1;
4318 recompute_vec.safe_push (con);
4322 if (last == insn)
4323 break;
4326 /* A second pass, to update ready and speculation status for insns
4327 depending on the unscheduled ones. The first pass must have
4328 popped the scheduled_insns vector up to the point where we
4329 restart scheduling, as recompute_todo_spec requires it to be
4330 up-to-date. */
4331 while (!recompute_vec.is_empty ())
4333 rtx_insn *con;
4335 con = recompute_vec.pop ();
4336 MUST_RECOMPUTE_SPEC_P (con) = 0;
4337 if (!sd_lists_empty_p (con, SD_LIST_HARD_BACK))
4339 TODO_SPEC (con) = HARD_DEP;
4340 INSN_TICK (con) = INVALID_TICK;
4341 if (PREDICATED_PAT (con) != NULL_RTX)
4342 haifa_change_pattern (con, ORIG_PAT (con));
4344 else if (QUEUE_INDEX (con) != QUEUE_SCHEDULED)
4345 TODO_SPEC (con) = recompute_todo_spec (con, true);
4349 /* Restore scheduler state from the topmost entry on the backtracking queue.
4350 PSCHED_BLOCK_P points to the local data of schedule_block that we must
4351 overwrite with the saved data.
4352 The caller must already have called unschedule_insns_until. */
4354 static void
4355 restore_last_backtrack_point (struct sched_block_state *psched_block)
4357 int i;
4358 struct haifa_saved_data *save = backtrack_queue;
4360 backtrack_queue = save->next;
4362 if (current_sched_info->restore_state)
4363 (*current_sched_info->restore_state) (save->fe_saved_data);
4365 if (targetm.sched.alloc_sched_context)
4367 targetm.sched.set_sched_context (save->be_saved_data);
4368 targetm.sched.free_sched_context (save->be_saved_data);
4371 /* Do this first since it clobbers INSN_TICK of the involved
4372 instructions. */
4373 undo_replacements_for_backtrack (save);
4375 /* Clear the QUEUE_INDEX of everything in the ready list or one
4376 of the queues. */
4377 if (ready.n_ready > 0)
4379 rtx_insn **first = ready_lastpos (&ready);
4380 for (i = 0; i < ready.n_ready; i++)
4382 rtx_insn *insn = first[i];
4383 QUEUE_INDEX (insn) = QUEUE_NOWHERE;
4384 INSN_TICK (insn) = INVALID_TICK;
4387 for (i = 0; i <= max_insn_queue_index; i++)
4389 int q = NEXT_Q_AFTER (q_ptr, i);
4391 for (rtx_insn_list *link = insn_queue[q]; link; link = link->next ())
4393 rtx_insn *x = link->insn ();
4394 QUEUE_INDEX (x) = QUEUE_NOWHERE;
4395 INSN_TICK (x) = INVALID_TICK;
4397 free_INSN_LIST_list (&insn_queue[q]);
4400 free (ready.vec);
4401 ready = save->ready;
4403 if (ready.n_ready > 0)
4405 rtx_insn **first = ready_lastpos (&ready);
4406 for (i = 0; i < ready.n_ready; i++)
4408 rtx_insn *insn = first[i];
4409 QUEUE_INDEX (insn) = QUEUE_READY;
4410 TODO_SPEC (insn) = recompute_todo_spec (insn, true);
4411 INSN_TICK (insn) = save->clock_var;
4415 q_ptr = 0;
4416 q_size = save->q_size;
4417 for (i = 0; i <= max_insn_queue_index; i++)
4419 int q = NEXT_Q_AFTER (q_ptr, i);
4421 insn_queue[q] = save->insn_queue[q];
4423 for (rtx_insn_list *link = insn_queue[q]; link; link = link->next ())
4425 rtx_insn *x = link->insn ();
4426 QUEUE_INDEX (x) = i;
4427 TODO_SPEC (x) = recompute_todo_spec (x, true);
4428 INSN_TICK (x) = save->clock_var + i;
4431 free (save->insn_queue);
4433 toggle_cancelled_flags (true);
4435 clock_var = save->clock_var;
4436 last_clock_var = save->last_clock_var;
4437 cycle_issued_insns = save->cycle_issued_insns;
4438 last_scheduled_insn = save->last_scheduled_insn;
4439 last_nondebug_scheduled_insn = save->last_nondebug_scheduled_insn;
4440 nonscheduled_insns_begin = save->nonscheduled_insns_begin;
4442 *psched_block = save->sched_block;
4444 memcpy (curr_state, save->curr_state, dfa_state_size);
4445 free (save->curr_state);
4447 mark_backtrack_feeds (save->delay_pair->i2, 0);
4449 gcc_assert (next_cycle_replace_deps.is_empty ());
4450 next_cycle_replace_deps = save->next_cycle_deps.copy ();
4451 next_cycle_apply = save->next_cycle_apply.copy ();
4453 free (save);
4455 for (save = backtrack_queue; save; save = save->next)
4457 mark_backtrack_feeds (save->delay_pair->i2, 1);
4461 /* Discard all data associated with the topmost entry in the backtrack
4462 queue. If RESET_TICK is false, we just want to free the data. If true,
4463 we are doing this because we discovered a reason to backtrack. In the
4464 latter case, also reset the INSN_TICK for the shadow insn. */
4465 static void
4466 free_topmost_backtrack_point (bool reset_tick)
4468 struct haifa_saved_data *save = backtrack_queue;
4469 int i;
4471 backtrack_queue = save->next;
4473 if (reset_tick)
4475 struct delay_pair *pair = save->delay_pair;
4476 while (pair)
4478 INSN_TICK (pair->i2) = INVALID_TICK;
4479 INSN_EXACT_TICK (pair->i2) = INVALID_TICK;
4480 pair = pair->next_same_i1;
4482 undo_replacements_for_backtrack (save);
4484 else
4486 save->replacement_deps.release ();
4487 save->replace_apply.release ();
4490 if (targetm.sched.free_sched_context)
4491 targetm.sched.free_sched_context (save->be_saved_data);
4492 if (current_sched_info->restore_state)
4493 free (save->fe_saved_data);
4494 for (i = 0; i <= max_insn_queue_index; i++)
4495 free_INSN_LIST_list (&save->insn_queue[i]);
4496 free (save->insn_queue);
4497 free (save->curr_state);
4498 free (save->ready.vec);
4499 free (save);
4502 /* Free the entire backtrack queue. */
4503 static void
4504 free_backtrack_queue (void)
4506 while (backtrack_queue)
4507 free_topmost_backtrack_point (false);
4510 /* Apply a replacement described by DESC. If IMMEDIATELY is false, we
4511 may have to postpone the replacement until the start of the next cycle,
4512 at which point we will be called again with IMMEDIATELY true. This is
4513 only done for machines which have instruction packets with explicit
4514 parallelism however. */
4515 static void
4516 apply_replacement (dep_t dep, bool immediately)
4518 struct dep_replacement *desc = DEP_REPLACE (dep);
4519 if (!immediately && targetm.sched.exposed_pipeline && reload_completed)
4521 next_cycle_replace_deps.safe_push (dep);
4522 next_cycle_apply.safe_push (1);
4524 else
4526 bool success;
4528 if (QUEUE_INDEX (desc->insn) == QUEUE_SCHEDULED)
4529 return;
4531 if (sched_verbose >= 5)
4532 fprintf (sched_dump, "applying replacement for insn %d\n",
4533 INSN_UID (desc->insn));
4535 success = validate_change (desc->insn, desc->loc, desc->newval, 0);
4536 gcc_assert (success);
4538 update_insn_after_change (desc->insn);
4539 if ((TODO_SPEC (desc->insn) & (HARD_DEP | DEP_POSTPONED)) == 0)
4540 fix_tick_ready (desc->insn);
4542 if (backtrack_queue != NULL)
4544 backtrack_queue->replacement_deps.safe_push (dep);
4545 backtrack_queue->replace_apply.safe_push (1);
4550 /* We have determined that a pattern involved in DEP must be restored.
4551 If IMMEDIATELY is false, we may have to postpone the replacement
4552 until the start of the next cycle, at which point we will be called
4553 again with IMMEDIATELY true. */
4554 static void
4555 restore_pattern (dep_t dep, bool immediately)
4557 rtx_insn *next = DEP_CON (dep);
4558 int tick = INSN_TICK (next);
4560 /* If we already scheduled the insn, the modified version is
4561 correct. */
4562 if (QUEUE_INDEX (next) == QUEUE_SCHEDULED)
4563 return;
4565 if (!immediately && targetm.sched.exposed_pipeline && reload_completed)
4567 next_cycle_replace_deps.safe_push (dep);
4568 next_cycle_apply.safe_push (0);
4569 return;
4573 if (DEP_TYPE (dep) == REG_DEP_CONTROL)
4575 if (sched_verbose >= 5)
4576 fprintf (sched_dump, "restoring pattern for insn %d\n",
4577 INSN_UID (next));
4578 haifa_change_pattern (next, ORIG_PAT (next));
4580 else
4582 struct dep_replacement *desc = DEP_REPLACE (dep);
4583 bool success;
4585 if (sched_verbose >= 5)
4586 fprintf (sched_dump, "restoring pattern for insn %d\n",
4587 INSN_UID (desc->insn));
4588 tick = INSN_TICK (desc->insn);
4590 success = validate_change (desc->insn, desc->loc, desc->orig, 0);
4591 gcc_assert (success);
4592 update_insn_after_change (desc->insn);
4593 if (backtrack_queue != NULL)
4595 backtrack_queue->replacement_deps.safe_push (dep);
4596 backtrack_queue->replace_apply.safe_push (0);
4599 INSN_TICK (next) = tick;
4600 if (TODO_SPEC (next) == DEP_POSTPONED)
4601 return;
4603 if (sd_lists_empty_p (next, SD_LIST_BACK))
4604 TODO_SPEC (next) = 0;
4605 else if (!sd_lists_empty_p (next, SD_LIST_HARD_BACK))
4606 TODO_SPEC (next) = HARD_DEP;
4609 /* Perform pattern replacements that were queued up until the next
4610 cycle. */
4611 static void
4612 perform_replacements_new_cycle (void)
4614 int i;
4615 dep_t dep;
4616 FOR_EACH_VEC_ELT (next_cycle_replace_deps, i, dep)
4618 int apply_p = next_cycle_apply[i];
4619 if (apply_p)
4620 apply_replacement (dep, true);
4621 else
4622 restore_pattern (dep, true);
4624 next_cycle_replace_deps.truncate (0);
4625 next_cycle_apply.truncate (0);
4628 /* Compute INSN_TICK_ESTIMATE for INSN. PROCESSED is a bitmap of
4629 instructions we've previously encountered, a set bit prevents
4630 recursion. BUDGET is a limit on how far ahead we look, it is
4631 reduced on recursive calls. Return true if we produced a good
4632 estimate, or false if we exceeded the budget. */
4633 static bool
4634 estimate_insn_tick (bitmap processed, rtx_insn *insn, int budget)
4636 sd_iterator_def sd_it;
4637 dep_t dep;
4638 int earliest = INSN_TICK (insn);
4640 FOR_EACH_DEP (insn, SD_LIST_BACK, sd_it, dep)
4642 rtx_insn *pro = DEP_PRO (dep);
4643 int t;
4645 if (DEP_STATUS (dep) & DEP_CANCELLED)
4646 continue;
4648 if (QUEUE_INDEX (pro) == QUEUE_SCHEDULED)
4649 gcc_assert (INSN_TICK (pro) + dep_cost (dep) <= INSN_TICK (insn));
4650 else
4652 int cost = dep_cost (dep);
4653 if (cost >= budget)
4654 return false;
4655 if (!bitmap_bit_p (processed, INSN_LUID (pro)))
4657 if (!estimate_insn_tick (processed, pro, budget - cost))
4658 return false;
4660 gcc_assert (INSN_TICK_ESTIMATE (pro) != INVALID_TICK);
4661 t = INSN_TICK_ESTIMATE (pro) + cost;
4662 if (earliest == INVALID_TICK || t > earliest)
4663 earliest = t;
4666 bitmap_set_bit (processed, INSN_LUID (insn));
4667 INSN_TICK_ESTIMATE (insn) = earliest;
4668 return true;
4671 /* Examine the pair of insns in P, and estimate (optimistically, assuming
4672 infinite resources) the cycle in which the delayed shadow can be issued.
4673 Return the number of cycles that must pass before the real insn can be
4674 issued in order to meet this constraint. */
4675 static int
4676 estimate_shadow_tick (struct delay_pair *p)
4678 bitmap_head processed;
4679 int t;
4680 bool cutoff;
4681 bitmap_initialize (&processed, 0);
4683 cutoff = !estimate_insn_tick (&processed, p->i2,
4684 max_insn_queue_index + pair_delay (p));
4685 bitmap_clear (&processed);
4686 if (cutoff)
4687 return max_insn_queue_index;
4688 t = INSN_TICK_ESTIMATE (p->i2) - (clock_var + pair_delay (p) + 1);
4689 if (t > 0)
4690 return t;
4691 return 0;
4694 /* If INSN has no unresolved backwards dependencies, add it to the schedule and
4695 recursively resolve all its forward dependencies. */
4696 static void
4697 resolve_dependencies (rtx_insn *insn)
4699 sd_iterator_def sd_it;
4700 dep_t dep;
4702 /* Don't use sd_lists_empty_p; it ignores debug insns. */
4703 if (DEPS_LIST_FIRST (INSN_HARD_BACK_DEPS (insn)) != NULL
4704 || DEPS_LIST_FIRST (INSN_SPEC_BACK_DEPS (insn)) != NULL)
4705 return;
4707 if (sched_verbose >= 4)
4708 fprintf (sched_dump, ";;\tquickly resolving %d\n", INSN_UID (insn));
4710 if (QUEUE_INDEX (insn) >= 0)
4711 queue_remove (insn);
4713 scheduled_insns.safe_push (insn);
4715 /* Update dependent instructions. */
4716 for (sd_it = sd_iterator_start (insn, SD_LIST_FORW);
4717 sd_iterator_cond (&sd_it, &dep);)
4719 rtx_insn *next = DEP_CON (dep);
4721 if (sched_verbose >= 4)
4722 fprintf (sched_dump, ";;\t\tdep %d against %d\n", INSN_UID (insn),
4723 INSN_UID (next));
4725 /* Resolve the dependence between INSN and NEXT.
4726 sd_resolve_dep () moves current dep to another list thus
4727 advancing the iterator. */
4728 sd_resolve_dep (sd_it);
4730 if (!IS_SPECULATION_BRANCHY_CHECK_P (insn))
4732 resolve_dependencies (next);
4734 else
4735 /* Check always has only one forward dependence (to the first insn in
4736 the recovery block), therefore, this will be executed only once. */
4738 gcc_assert (sd_lists_empty_p (insn, SD_LIST_FORW));
4744 /* Return the head and tail pointers of ebb starting at BEG and ending
4745 at END. */
4746 void
4747 get_ebb_head_tail (basic_block beg, basic_block end,
4748 rtx_insn **headp, rtx_insn **tailp)
4750 rtx_insn *beg_head = BB_HEAD (beg);
4751 rtx_insn * beg_tail = BB_END (beg);
4752 rtx_insn * end_head = BB_HEAD (end);
4753 rtx_insn * end_tail = BB_END (end);
4755 /* Don't include any notes or labels at the beginning of the BEG
4756 basic block, or notes at the end of the END basic blocks. */
4758 if (LABEL_P (beg_head))
4759 beg_head = NEXT_INSN (beg_head);
4761 while (beg_head != beg_tail)
4762 if (NOTE_P (beg_head))
4763 beg_head = NEXT_INSN (beg_head);
4764 else if (DEBUG_INSN_P (beg_head))
4766 rtx_insn * note, *next;
4768 for (note = NEXT_INSN (beg_head);
4769 note != beg_tail;
4770 note = next)
4772 next = NEXT_INSN (note);
4773 if (NOTE_P (note))
4775 if (sched_verbose >= 9)
4776 fprintf (sched_dump, "reorder %i\n", INSN_UID (note));
4778 reorder_insns_nobb (note, note, PREV_INSN (beg_head));
4780 if (BLOCK_FOR_INSN (note) != beg)
4781 df_insn_change_bb (note, beg);
4783 else if (!DEBUG_INSN_P (note))
4784 break;
4787 break;
4789 else
4790 break;
4792 *headp = beg_head;
4794 if (beg == end)
4795 end_head = beg_head;
4796 else if (LABEL_P (end_head))
4797 end_head = NEXT_INSN (end_head);
4799 while (end_head != end_tail)
4800 if (NOTE_P (end_tail))
4801 end_tail = PREV_INSN (end_tail);
4802 else if (DEBUG_INSN_P (end_tail))
4804 rtx_insn * note, *prev;
4806 for (note = PREV_INSN (end_tail);
4807 note != end_head;
4808 note = prev)
4810 prev = PREV_INSN (note);
4811 if (NOTE_P (note))
4813 if (sched_verbose >= 9)
4814 fprintf (sched_dump, "reorder %i\n", INSN_UID (note));
4816 reorder_insns_nobb (note, note, end_tail);
4818 if (end_tail == BB_END (end))
4819 BB_END (end) = note;
4821 if (BLOCK_FOR_INSN (note) != end)
4822 df_insn_change_bb (note, end);
4824 else if (!DEBUG_INSN_P (note))
4825 break;
4828 break;
4830 else
4831 break;
4833 *tailp = end_tail;
4836 /* Return nonzero if there are no real insns in the range [ HEAD, TAIL ]. */
4839 no_real_insns_p (const rtx_insn *head, const rtx_insn *tail)
4841 while (head != NEXT_INSN (tail))
4843 if (!NOTE_P (head) && !LABEL_P (head))
4844 return 0;
4845 head = NEXT_INSN (head);
4847 return 1;
4850 /* Restore-other-notes: NOTE_LIST is the end of a chain of notes
4851 previously found among the insns. Insert them just before HEAD. */
4852 rtx_insn *
4853 restore_other_notes (rtx_insn *head, basic_block head_bb)
4855 if (note_list != 0)
4857 rtx_insn *note_head = note_list;
4859 if (head)
4860 head_bb = BLOCK_FOR_INSN (head);
4861 else
4862 head = NEXT_INSN (bb_note (head_bb));
4864 while (PREV_INSN (note_head))
4866 set_block_for_insn (note_head, head_bb);
4867 note_head = PREV_INSN (note_head);
4869 /* In the above cycle we've missed this note. */
4870 set_block_for_insn (note_head, head_bb);
4872 SET_PREV_INSN (note_head) = PREV_INSN (head);
4873 SET_NEXT_INSN (PREV_INSN (head)) = note_head;
4874 SET_PREV_INSN (head) = note_list;
4875 SET_NEXT_INSN (note_list) = head;
4877 if (BLOCK_FOR_INSN (head) != head_bb)
4878 BB_END (head_bb) = note_list;
4880 head = note_head;
4883 return head;
4886 /* When we know we are going to discard the schedule due to a failed attempt
4887 at modulo scheduling, undo all replacements. */
4888 static void
4889 undo_all_replacements (void)
4891 rtx_insn *insn;
4892 int i;
4894 FOR_EACH_VEC_ELT (scheduled_insns, i, insn)
4896 sd_iterator_def sd_it;
4897 dep_t dep;
4899 /* See if we must undo a replacement. */
4900 for (sd_it = sd_iterator_start (insn, SD_LIST_RES_FORW);
4901 sd_iterator_cond (&sd_it, &dep); sd_iterator_next (&sd_it))
4903 struct dep_replacement *desc = DEP_REPLACE (dep);
4904 if (desc != NULL)
4905 validate_change (desc->insn, desc->loc, desc->orig, 0);
4910 /* Return first non-scheduled insn in the current scheduling block.
4911 This is mostly used for debug-counter purposes. */
4912 static rtx_insn *
4913 first_nonscheduled_insn (void)
4915 rtx_insn *insn = (nonscheduled_insns_begin != NULL_RTX
4916 ? nonscheduled_insns_begin
4917 : current_sched_info->prev_head);
4921 insn = next_nonnote_nondebug_insn (insn);
4923 while (QUEUE_INDEX (insn) == QUEUE_SCHEDULED);
4925 return insn;
4928 /* Move insns that became ready to fire from queue to ready list. */
4930 static void
4931 queue_to_ready (struct ready_list *ready)
4933 rtx_insn *insn;
4934 rtx_insn_list *link;
4935 rtx skip_insn;
4937 q_ptr = NEXT_Q (q_ptr);
4939 if (dbg_cnt (sched_insn) == false)
4940 /* If debug counter is activated do not requeue the first
4941 nonscheduled insn. */
4942 skip_insn = first_nonscheduled_insn ();
4943 else
4944 skip_insn = NULL_RTX;
4946 /* Add all pending insns that can be scheduled without stalls to the
4947 ready list. */
4948 for (link = insn_queue[q_ptr]; link; link = link->next ())
4950 insn = link->insn ();
4951 q_size -= 1;
4953 if (sched_verbose >= 2)
4954 fprintf (sched_dump, ";;\t\tQ-->Ready: insn %s: ",
4955 (*current_sched_info->print_insn) (insn, 0));
4957 /* If the ready list is full, delay the insn for 1 cycle.
4958 See the comment in schedule_block for the rationale. */
4959 if (!reload_completed
4960 && (ready->n_ready - ready->n_debug > MAX_SCHED_READY_INSNS
4961 || (sched_pressure == SCHED_PRESSURE_MODEL
4962 /* Limit pressure recalculations to MAX_SCHED_READY_INSNS
4963 instructions too. */
4964 && model_index (insn) > (model_curr_point
4965 + MAX_SCHED_READY_INSNS)))
4966 && !(sched_pressure == SCHED_PRESSURE_MODEL
4967 && model_curr_point < model_num_insns
4968 /* Always allow the next model instruction to issue. */
4969 && model_index (insn) == model_curr_point)
4970 && !SCHED_GROUP_P (insn)
4971 && insn != skip_insn)
4973 if (sched_verbose >= 2)
4974 fprintf (sched_dump, "keeping in queue, ready full\n");
4975 queue_insn (insn, 1, "ready full");
4977 else
4979 ready_add (ready, insn, false);
4980 if (sched_verbose >= 2)
4981 fprintf (sched_dump, "moving to ready without stalls\n");
4984 free_INSN_LIST_list (&insn_queue[q_ptr]);
4986 /* If there are no ready insns, stall until one is ready and add all
4987 of the pending insns at that point to the ready list. */
4988 if (ready->n_ready == 0)
4990 int stalls;
4992 for (stalls = 1; stalls <= max_insn_queue_index; stalls++)
4994 if ((link = insn_queue[NEXT_Q_AFTER (q_ptr, stalls)]))
4996 for (; link; link = link->next ())
4998 insn = link->insn ();
4999 q_size -= 1;
5001 if (sched_verbose >= 2)
5002 fprintf (sched_dump, ";;\t\tQ-->Ready: insn %s: ",
5003 (*current_sched_info->print_insn) (insn, 0));
5005 ready_add (ready, insn, false);
5006 if (sched_verbose >= 2)
5007 fprintf (sched_dump, "moving to ready with %d stalls\n", stalls);
5009 free_INSN_LIST_list (&insn_queue[NEXT_Q_AFTER (q_ptr, stalls)]);
5011 advance_one_cycle ();
5013 break;
5016 advance_one_cycle ();
5019 q_ptr = NEXT_Q_AFTER (q_ptr, stalls);
5020 clock_var += stalls;
5021 if (sched_verbose >= 2)
5022 fprintf (sched_dump, ";;\tAdvancing clock by %d cycle[s] to %d\n",
5023 stalls, clock_var);
5027 /* Used by early_queue_to_ready. Determines whether it is "ok" to
5028 prematurely move INSN from the queue to the ready list. Currently,
5029 if a target defines the hook 'is_costly_dependence', this function
5030 uses the hook to check whether there exist any dependences which are
5031 considered costly by the target, between INSN and other insns that
5032 have already been scheduled. Dependences are checked up to Y cycles
5033 back, with default Y=1; The flag -fsched-stalled-insns-dep=Y allows
5034 controlling this value.
5035 (Other considerations could be taken into account instead (or in
5036 addition) depending on user flags and target hooks. */
5038 static bool
5039 ok_for_early_queue_removal (rtx insn)
5041 if (targetm.sched.is_costly_dependence)
5043 rtx prev_insn;
5044 int n_cycles;
5045 int i = scheduled_insns.length ();
5046 for (n_cycles = flag_sched_stalled_insns_dep; n_cycles; n_cycles--)
5048 while (i-- > 0)
5050 int cost;
5052 prev_insn = scheduled_insns[i];
5054 if (!NOTE_P (prev_insn))
5056 dep_t dep;
5058 dep = sd_find_dep_between (prev_insn, insn, true);
5060 if (dep != NULL)
5062 cost = dep_cost (dep);
5064 if (targetm.sched.is_costly_dependence (dep, cost,
5065 flag_sched_stalled_insns_dep - n_cycles))
5066 return false;
5070 if (GET_MODE (prev_insn) == TImode) /* end of dispatch group */
5071 break;
5074 if (i == 0)
5075 break;
5079 return true;
5083 /* Remove insns from the queue, before they become "ready" with respect
5084 to FU latency considerations. */
5086 static int
5087 early_queue_to_ready (state_t state, struct ready_list *ready)
5089 rtx_insn *insn;
5090 rtx_insn_list *link;
5091 rtx_insn_list *next_link;
5092 rtx_insn_list *prev_link;
5093 bool move_to_ready;
5094 int cost;
5095 state_t temp_state = alloca (dfa_state_size);
5096 int stalls;
5097 int insns_removed = 0;
5100 Flag '-fsched-stalled-insns=X' determines the aggressiveness of this
5101 function:
5103 X == 0: There is no limit on how many queued insns can be removed
5104 prematurely. (flag_sched_stalled_insns = -1).
5106 X >= 1: Only X queued insns can be removed prematurely in each
5107 invocation. (flag_sched_stalled_insns = X).
5109 Otherwise: Early queue removal is disabled.
5110 (flag_sched_stalled_insns = 0)
5113 if (! flag_sched_stalled_insns)
5114 return 0;
5116 for (stalls = 0; stalls <= max_insn_queue_index; stalls++)
5118 if ((link = insn_queue[NEXT_Q_AFTER (q_ptr, stalls)]))
5120 if (sched_verbose > 6)
5121 fprintf (sched_dump, ";; look at index %d + %d\n", q_ptr, stalls);
5123 prev_link = 0;
5124 while (link)
5126 next_link = link->next ();
5127 insn = link->insn ();
5128 if (insn && sched_verbose > 6)
5129 print_rtl_single (sched_dump, insn);
5131 memcpy (temp_state, state, dfa_state_size);
5132 if (recog_memoized (insn) < 0)
5133 /* non-negative to indicate that it's not ready
5134 to avoid infinite Q->R->Q->R... */
5135 cost = 0;
5136 else
5137 cost = state_transition (temp_state, insn);
5139 if (sched_verbose >= 6)
5140 fprintf (sched_dump, "transition cost = %d\n", cost);
5142 move_to_ready = false;
5143 if (cost < 0)
5145 move_to_ready = ok_for_early_queue_removal (insn);
5146 if (move_to_ready == true)
5148 /* move from Q to R */
5149 q_size -= 1;
5150 ready_add (ready, insn, false);
5152 if (prev_link)
5153 XEXP (prev_link, 1) = next_link;
5154 else
5155 insn_queue[NEXT_Q_AFTER (q_ptr, stalls)] = next_link;
5157 free_INSN_LIST_node (link);
5159 if (sched_verbose >= 2)
5160 fprintf (sched_dump, ";;\t\tEarly Q-->Ready: insn %s\n",
5161 (*current_sched_info->print_insn) (insn, 0));
5163 insns_removed++;
5164 if (insns_removed == flag_sched_stalled_insns)
5165 /* Remove no more than flag_sched_stalled_insns insns
5166 from Q at a time. */
5167 return insns_removed;
5171 if (move_to_ready == false)
5172 prev_link = link;
5174 link = next_link;
5175 } /* while link */
5176 } /* if link */
5178 } /* for stalls.. */
5180 return insns_removed;
5184 /* Print the ready list for debugging purposes.
5185 If READY_TRY is non-zero then only print insns that max_issue
5186 will consider. */
5187 static void
5188 debug_ready_list_1 (struct ready_list *ready, signed char *ready_try)
5190 rtx_insn **p;
5191 int i;
5193 if (ready->n_ready == 0)
5195 fprintf (sched_dump, "\n");
5196 return;
5199 p = ready_lastpos (ready);
5200 for (i = 0; i < ready->n_ready; i++)
5202 if (ready_try != NULL && ready_try[ready->n_ready - i - 1])
5203 continue;
5205 fprintf (sched_dump, " %s:%d",
5206 (*current_sched_info->print_insn) (p[i], 0),
5207 INSN_LUID (p[i]));
5208 if (sched_pressure != SCHED_PRESSURE_NONE)
5209 fprintf (sched_dump, "(cost=%d",
5210 INSN_REG_PRESSURE_EXCESS_COST_CHANGE (p[i]));
5211 fprintf (sched_dump, ":prio=%d", INSN_PRIORITY (p[i]));
5212 if (INSN_TICK (p[i]) > clock_var)
5213 fprintf (sched_dump, ":delay=%d", INSN_TICK (p[i]) - clock_var);
5214 if (sched_pressure != SCHED_PRESSURE_NONE)
5215 fprintf (sched_dump, ")");
5217 fprintf (sched_dump, "\n");
5220 /* Print the ready list. Callable from debugger. */
5221 static void
5222 debug_ready_list (struct ready_list *ready)
5224 debug_ready_list_1 (ready, NULL);
5227 /* Search INSN for REG_SAVE_NOTE notes and convert them back into insn
5228 NOTEs. This is used for NOTE_INSN_EPILOGUE_BEG, so that sched-ebb
5229 replaces the epilogue note in the correct basic block. */
5230 void
5231 reemit_notes (rtx_insn *insn)
5233 rtx note;
5234 rtx_insn *last = insn;
5236 for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
5238 if (REG_NOTE_KIND (note) == REG_SAVE_NOTE)
5240 enum insn_note note_type = (enum insn_note) INTVAL (XEXP (note, 0));
5242 last = emit_note_before (note_type, last);
5243 remove_note (insn, note);
5248 /* Move INSN. Reemit notes if needed. Update CFG, if needed. */
5249 static void
5250 move_insn (rtx_insn *insn, rtx_insn *last, rtx nt)
5252 if (PREV_INSN (insn) != last)
5254 basic_block bb;
5255 rtx_insn *note;
5256 int jump_p = 0;
5258 bb = BLOCK_FOR_INSN (insn);
5260 /* BB_HEAD is either LABEL or NOTE. */
5261 gcc_assert (BB_HEAD (bb) != insn);
5263 if (BB_END (bb) == insn)
5264 /* If this is last instruction in BB, move end marker one
5265 instruction up. */
5267 /* Jumps are always placed at the end of basic block. */
5268 jump_p = control_flow_insn_p (insn);
5270 gcc_assert (!jump_p
5271 || ((common_sched_info->sched_pass_id == SCHED_RGN_PASS)
5272 && IS_SPECULATION_BRANCHY_CHECK_P (insn))
5273 || (common_sched_info->sched_pass_id
5274 == SCHED_EBB_PASS));
5276 gcc_assert (BLOCK_FOR_INSN (PREV_INSN (insn)) == bb);
5278 BB_END (bb) = PREV_INSN (insn);
5281 gcc_assert (BB_END (bb) != last);
5283 if (jump_p)
5284 /* We move the block note along with jump. */
5286 gcc_assert (nt);
5288 note = NEXT_INSN (insn);
5289 while (NOTE_NOT_BB_P (note) && note != nt)
5290 note = NEXT_INSN (note);
5292 if (note != nt
5293 && (LABEL_P (note)
5294 || BARRIER_P (note)))
5295 note = NEXT_INSN (note);
5297 gcc_assert (NOTE_INSN_BASIC_BLOCK_P (note));
5299 else
5300 note = insn;
5302 SET_NEXT_INSN (PREV_INSN (insn)) = NEXT_INSN (note);
5303 SET_PREV_INSN (NEXT_INSN (note)) = PREV_INSN (insn);
5305 SET_NEXT_INSN (note) = NEXT_INSN (last);
5306 SET_PREV_INSN (NEXT_INSN (last)) = note;
5308 SET_NEXT_INSN (last) = insn;
5309 SET_PREV_INSN (insn) = last;
5311 bb = BLOCK_FOR_INSN (last);
5313 if (jump_p)
5315 fix_jump_move (insn);
5317 if (BLOCK_FOR_INSN (insn) != bb)
5318 move_block_after_check (insn);
5320 gcc_assert (BB_END (bb) == last);
5323 df_insn_change_bb (insn, bb);
5325 /* Update BB_END, if needed. */
5326 if (BB_END (bb) == last)
5327 BB_END (bb) = insn;
5330 SCHED_GROUP_P (insn) = 0;
5333 /* Return true if scheduling INSN will finish current clock cycle. */
5334 static bool
5335 insn_finishes_cycle_p (rtx_insn *insn)
5337 if (SCHED_GROUP_P (insn))
5338 /* After issuing INSN, rest of the sched_group will be forced to issue
5339 in order. Don't make any plans for the rest of cycle. */
5340 return true;
5342 /* Finishing the block will, apparently, finish the cycle. */
5343 if (current_sched_info->insn_finishes_block_p
5344 && current_sched_info->insn_finishes_block_p (insn))
5345 return true;
5347 return false;
5350 /* Define type for target data used in multipass scheduling. */
5351 #ifndef TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DATA_T
5352 # define TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DATA_T int
5353 #endif
5354 typedef TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DATA_T first_cycle_multipass_data_t;
5356 /* The following structure describe an entry of the stack of choices. */
5357 struct choice_entry
5359 /* Ordinal number of the issued insn in the ready queue. */
5360 int index;
5361 /* The number of the rest insns whose issues we should try. */
5362 int rest;
5363 /* The number of issued essential insns. */
5364 int n;
5365 /* State after issuing the insn. */
5366 state_t state;
5367 /* Target-specific data. */
5368 first_cycle_multipass_data_t target_data;
5371 /* The following array is used to implement a stack of choices used in
5372 function max_issue. */
5373 static struct choice_entry *choice_stack;
5375 /* This holds the value of the target dfa_lookahead hook. */
5376 int dfa_lookahead;
5378 /* The following variable value is maximal number of tries of issuing
5379 insns for the first cycle multipass insn scheduling. We define
5380 this value as constant*(DFA_LOOKAHEAD**ISSUE_RATE). We would not
5381 need this constraint if all real insns (with non-negative codes)
5382 had reservations because in this case the algorithm complexity is
5383 O(DFA_LOOKAHEAD**ISSUE_RATE). Unfortunately, the dfa descriptions
5384 might be incomplete and such insn might occur. For such
5385 descriptions, the complexity of algorithm (without the constraint)
5386 could achieve DFA_LOOKAHEAD ** N , where N is the queue length. */
5387 static int max_lookahead_tries;
5389 /* The following value is value of hook
5390 `first_cycle_multipass_dfa_lookahead' at the last call of
5391 `max_issue'. */
5392 static int cached_first_cycle_multipass_dfa_lookahead = 0;
5394 /* The following value is value of `issue_rate' at the last call of
5395 `sched_init'. */
5396 static int cached_issue_rate = 0;
5398 /* The following function returns maximal (or close to maximal) number
5399 of insns which can be issued on the same cycle and one of which
5400 insns is insns with the best rank (the first insn in READY). To
5401 make this function tries different samples of ready insns. READY
5402 is current queue `ready'. Global array READY_TRY reflects what
5403 insns are already issued in this try. The function stops immediately,
5404 if it reached the such a solution, that all instruction can be issued.
5405 INDEX will contain index of the best insn in READY. The following
5406 function is used only for first cycle multipass scheduling.
5408 PRIVILEGED_N >= 0
5410 This function expects recognized insns only. All USEs,
5411 CLOBBERs, etc must be filtered elsewhere. */
5413 max_issue (struct ready_list *ready, int privileged_n, state_t state,
5414 bool first_cycle_insn_p, int *index)
5416 int n, i, all, n_ready, best, delay, tries_num;
5417 int more_issue;
5418 struct choice_entry *top;
5419 rtx_insn *insn;
5421 n_ready = ready->n_ready;
5422 gcc_assert (dfa_lookahead >= 1 && privileged_n >= 0
5423 && privileged_n <= n_ready);
5425 /* Init MAX_LOOKAHEAD_TRIES. */
5426 if (cached_first_cycle_multipass_dfa_lookahead != dfa_lookahead)
5428 cached_first_cycle_multipass_dfa_lookahead = dfa_lookahead;
5429 max_lookahead_tries = 100;
5430 for (i = 0; i < issue_rate; i++)
5431 max_lookahead_tries *= dfa_lookahead;
5434 /* Init max_points. */
5435 more_issue = issue_rate - cycle_issued_insns;
5436 gcc_assert (more_issue >= 0);
5438 /* The number of the issued insns in the best solution. */
5439 best = 0;
5441 top = choice_stack;
5443 /* Set initial state of the search. */
5444 memcpy (top->state, state, dfa_state_size);
5445 top->rest = dfa_lookahead;
5446 top->n = 0;
5447 if (targetm.sched.first_cycle_multipass_begin)
5448 targetm.sched.first_cycle_multipass_begin (&top->target_data,
5449 ready_try, n_ready,
5450 first_cycle_insn_p);
5452 /* Count the number of the insns to search among. */
5453 for (all = i = 0; i < n_ready; i++)
5454 if (!ready_try [i])
5455 all++;
5457 if (sched_verbose >= 2)
5459 fprintf (sched_dump, ";;\t\tmax_issue among %d insns:", all);
5460 debug_ready_list_1 (ready, ready_try);
5463 /* I is the index of the insn to try next. */
5464 i = 0;
5465 tries_num = 0;
5466 for (;;)
5468 if (/* If we've reached a dead end or searched enough of what we have
5469 been asked... */
5470 top->rest == 0
5471 /* or have nothing else to try... */
5472 || i >= n_ready
5473 /* or should not issue more. */
5474 || top->n >= more_issue)
5476 /* ??? (... || i == n_ready). */
5477 gcc_assert (i <= n_ready);
5479 /* We should not issue more than issue_rate instructions. */
5480 gcc_assert (top->n <= more_issue);
5482 if (top == choice_stack)
5483 break;
5485 if (best < top - choice_stack)
5487 if (privileged_n)
5489 n = privileged_n;
5490 /* Try to find issued privileged insn. */
5491 while (n && !ready_try[--n])
5495 if (/* If all insns are equally good... */
5496 privileged_n == 0
5497 /* Or a privileged insn will be issued. */
5498 || ready_try[n])
5499 /* Then we have a solution. */
5501 best = top - choice_stack;
5502 /* This is the index of the insn issued first in this
5503 solution. */
5504 *index = choice_stack [1].index;
5505 if (top->n == more_issue || best == all)
5506 break;
5510 /* Set ready-list index to point to the last insn
5511 ('i++' below will advance it to the next insn). */
5512 i = top->index;
5514 /* Backtrack. */
5515 ready_try [i] = 0;
5517 if (targetm.sched.first_cycle_multipass_backtrack)
5518 targetm.sched.first_cycle_multipass_backtrack (&top->target_data,
5519 ready_try, n_ready);
5521 top--;
5522 memcpy (state, top->state, dfa_state_size);
5524 else if (!ready_try [i])
5526 tries_num++;
5527 if (tries_num > max_lookahead_tries)
5528 break;
5529 insn = ready_element (ready, i);
5530 delay = state_transition (state, insn);
5531 if (delay < 0)
5533 if (state_dead_lock_p (state)
5534 || insn_finishes_cycle_p (insn))
5535 /* We won't issue any more instructions in the next
5536 choice_state. */
5537 top->rest = 0;
5538 else
5539 top->rest--;
5541 n = top->n;
5542 if (memcmp (top->state, state, dfa_state_size) != 0)
5543 n++;
5545 /* Advance to the next choice_entry. */
5546 top++;
5547 /* Initialize it. */
5548 top->rest = dfa_lookahead;
5549 top->index = i;
5550 top->n = n;
5551 memcpy (top->state, state, dfa_state_size);
5552 ready_try [i] = 1;
5554 if (targetm.sched.first_cycle_multipass_issue)
5555 targetm.sched.first_cycle_multipass_issue (&top->target_data,
5556 ready_try, n_ready,
5557 insn,
5558 &((top - 1)
5559 ->target_data));
5561 i = -1;
5565 /* Increase ready-list index. */
5566 i++;
5569 if (targetm.sched.first_cycle_multipass_end)
5570 targetm.sched.first_cycle_multipass_end (best != 0
5571 ? &choice_stack[1].target_data
5572 : NULL);
5574 /* Restore the original state of the DFA. */
5575 memcpy (state, choice_stack->state, dfa_state_size);
5577 return best;
5580 /* The following function chooses insn from READY and modifies
5581 READY. The following function is used only for first
5582 cycle multipass scheduling.
5583 Return:
5584 -1 if cycle should be advanced,
5585 0 if INSN_PTR is set to point to the desirable insn,
5586 1 if choose_ready () should be restarted without advancing the cycle. */
5587 static int
5588 choose_ready (struct ready_list *ready, bool first_cycle_insn_p,
5589 rtx_insn **insn_ptr)
5591 int lookahead;
5593 if (dbg_cnt (sched_insn) == false)
5595 if (nonscheduled_insns_begin == NULL_RTX)
5596 nonscheduled_insns_begin = current_sched_info->prev_head;
5598 rtx_insn *insn = first_nonscheduled_insn ();
5600 if (QUEUE_INDEX (insn) == QUEUE_READY)
5601 /* INSN is in the ready_list. */
5603 ready_remove_insn (insn);
5604 *insn_ptr = insn;
5605 return 0;
5608 /* INSN is in the queue. Advance cycle to move it to the ready list. */
5609 gcc_assert (QUEUE_INDEX (insn) >= 0);
5610 return -1;
5613 lookahead = 0;
5615 if (targetm.sched.first_cycle_multipass_dfa_lookahead)
5616 lookahead = targetm.sched.first_cycle_multipass_dfa_lookahead ();
5617 if (lookahead <= 0 || SCHED_GROUP_P (ready_element (ready, 0))
5618 || DEBUG_INSN_P (ready_element (ready, 0)))
5620 if (targetm.sched.dispatch (NULL, IS_DISPATCH_ON))
5621 *insn_ptr = ready_remove_first_dispatch (ready);
5622 else
5623 *insn_ptr = ready_remove_first (ready);
5625 return 0;
5627 else
5629 /* Try to choose the best insn. */
5630 int index = 0, i;
5631 rtx_insn *insn;
5633 insn = ready_element (ready, 0);
5634 if (INSN_CODE (insn) < 0)
5636 *insn_ptr = ready_remove_first (ready);
5637 return 0;
5640 /* Filter the search space. */
5641 for (i = 0; i < ready->n_ready; i++)
5643 ready_try[i] = 0;
5645 insn = ready_element (ready, i);
5647 /* If this insn is recognizable we should have already
5648 recognized it earlier.
5649 ??? Not very clear where this is supposed to be done.
5650 See dep_cost_1. */
5651 gcc_checking_assert (INSN_CODE (insn) >= 0
5652 || recog_memoized (insn) < 0);
5653 if (INSN_CODE (insn) < 0)
5655 /* Non-recognized insns at position 0 are handled above. */
5656 gcc_assert (i > 0);
5657 ready_try[i] = 1;
5658 continue;
5661 if (targetm.sched.first_cycle_multipass_dfa_lookahead_guard)
5663 ready_try[i]
5664 = (targetm.sched.first_cycle_multipass_dfa_lookahead_guard
5665 (insn, i));
5667 if (ready_try[i] < 0)
5668 /* Queue instruction for several cycles.
5669 We need to restart choose_ready as we have changed
5670 the ready list. */
5672 change_queue_index (insn, -ready_try[i]);
5673 return 1;
5676 /* Make sure that we didn't end up with 0'th insn filtered out.
5677 Don't be tempted to make life easier for backends and just
5678 requeue 0'th insn if (ready_try[0] == 0) and restart
5679 choose_ready. Backends should be very considerate about
5680 requeueing instructions -- especially the highest priority
5681 one at position 0. */
5682 gcc_assert (ready_try[i] == 0 || i > 0);
5683 if (ready_try[i])
5684 continue;
5687 gcc_assert (ready_try[i] == 0);
5688 /* INSN made it through the scrutiny of filters! */
5691 if (max_issue (ready, 1, curr_state, first_cycle_insn_p, &index) == 0)
5693 *insn_ptr = ready_remove_first (ready);
5694 if (sched_verbose >= 4)
5695 fprintf (sched_dump, ";;\t\tChosen insn (but can't issue) : %s \n",
5696 (*current_sched_info->print_insn) (*insn_ptr, 0));
5697 return 0;
5699 else
5701 if (sched_verbose >= 4)
5702 fprintf (sched_dump, ";;\t\tChosen insn : %s\n",
5703 (*current_sched_info->print_insn)
5704 (ready_element (ready, index), 0));
5706 *insn_ptr = ready_remove (ready, index);
5707 return 0;
5712 /* This function is called when we have successfully scheduled a
5713 block. It uses the schedule stored in the scheduled_insns vector
5714 to rearrange the RTL. PREV_HEAD is used as the anchor to which we
5715 append the scheduled insns; TAIL is the insn after the scheduled
5716 block. TARGET_BB is the argument passed to schedule_block. */
5718 static void
5719 commit_schedule (rtx_insn *prev_head, rtx_insn *tail, basic_block *target_bb)
5721 unsigned int i;
5722 rtx_insn *insn;
5724 last_scheduled_insn = prev_head;
5725 for (i = 0;
5726 scheduled_insns.iterate (i, &insn);
5727 i++)
5729 if (control_flow_insn_p (last_scheduled_insn)
5730 || current_sched_info->advance_target_bb (*target_bb, insn))
5732 *target_bb = current_sched_info->advance_target_bb (*target_bb, 0);
5734 if (sched_verbose)
5736 rtx_insn *x;
5738 x = next_real_insn (last_scheduled_insn);
5739 gcc_assert (x);
5740 dump_new_block_header (1, *target_bb, x, tail);
5743 last_scheduled_insn = bb_note (*target_bb);
5746 if (current_sched_info->begin_move_insn)
5747 (*current_sched_info->begin_move_insn) (insn, last_scheduled_insn);
5748 move_insn (insn, last_scheduled_insn,
5749 current_sched_info->next_tail);
5750 if (!DEBUG_INSN_P (insn))
5751 reemit_notes (insn);
5752 last_scheduled_insn = insn;
5755 scheduled_insns.truncate (0);
5758 /* Examine all insns on the ready list and queue those which can't be
5759 issued in this cycle. TEMP_STATE is temporary scheduler state we
5760 can use as scratch space. If FIRST_CYCLE_INSN_P is true, no insns
5761 have been issued for the current cycle, which means it is valid to
5762 issue an asm statement.
5764 If SHADOWS_ONLY_P is true, we eliminate all real insns and only
5765 leave those for which SHADOW_P is true. If MODULO_EPILOGUE is true,
5766 we only leave insns which have an INSN_EXACT_TICK. */
5768 static void
5769 prune_ready_list (state_t temp_state, bool first_cycle_insn_p,
5770 bool shadows_only_p, bool modulo_epilogue_p)
5772 int i, pass;
5773 bool sched_group_found = false;
5774 int min_cost_group = 1;
5776 for (i = 0; i < ready.n_ready; i++)
5778 rtx_insn *insn = ready_element (&ready, i);
5779 if (SCHED_GROUP_P (insn))
5781 sched_group_found = true;
5782 break;
5786 /* Make two passes if there's a SCHED_GROUP_P insn; make sure to handle
5787 such an insn first and note its cost, then schedule all other insns
5788 for one cycle later. */
5789 for (pass = sched_group_found ? 0 : 1; pass < 2; )
5791 int n = ready.n_ready;
5792 for (i = 0; i < n; i++)
5794 rtx_insn *insn = ready_element (&ready, i);
5795 int cost = 0;
5796 const char *reason = "resource conflict";
5798 if (DEBUG_INSN_P (insn))
5799 continue;
5801 if (sched_group_found && !SCHED_GROUP_P (insn))
5803 if (pass == 0)
5804 continue;
5805 cost = min_cost_group;
5806 reason = "not in sched group";
5808 else if (modulo_epilogue_p
5809 && INSN_EXACT_TICK (insn) == INVALID_TICK)
5811 cost = max_insn_queue_index;
5812 reason = "not an epilogue insn";
5814 else if (shadows_only_p && !SHADOW_P (insn))
5816 cost = 1;
5817 reason = "not a shadow";
5819 else if (recog_memoized (insn) < 0)
5821 if (!first_cycle_insn_p
5822 && (GET_CODE (PATTERN (insn)) == ASM_INPUT
5823 || asm_noperands (PATTERN (insn)) >= 0))
5824 cost = 1;
5825 reason = "asm";
5827 else if (sched_pressure != SCHED_PRESSURE_NONE)
5829 if (sched_pressure == SCHED_PRESSURE_MODEL
5830 && INSN_TICK (insn) <= clock_var)
5832 memcpy (temp_state, curr_state, dfa_state_size);
5833 if (state_transition (temp_state, insn) >= 0)
5834 INSN_TICK (insn) = clock_var + 1;
5836 cost = 0;
5838 else
5840 int delay_cost = 0;
5842 if (delay_htab)
5844 struct delay_pair *delay_entry;
5845 delay_entry
5846 = delay_htab->find_with_hash (insn,
5847 htab_hash_pointer (insn));
5848 while (delay_entry && delay_cost == 0)
5850 delay_cost = estimate_shadow_tick (delay_entry);
5851 if (delay_cost > max_insn_queue_index)
5852 delay_cost = max_insn_queue_index;
5853 delay_entry = delay_entry->next_same_i1;
5857 memcpy (temp_state, curr_state, dfa_state_size);
5858 cost = state_transition (temp_state, insn);
5859 if (cost < 0)
5860 cost = 0;
5861 else if (cost == 0)
5862 cost = 1;
5863 if (cost < delay_cost)
5865 cost = delay_cost;
5866 reason = "shadow tick";
5869 if (cost >= 1)
5871 if (SCHED_GROUP_P (insn) && cost > min_cost_group)
5872 min_cost_group = cost;
5873 ready_remove (&ready, i);
5874 queue_insn (insn, cost, reason);
5875 if (i + 1 < n)
5876 break;
5879 if (i == n)
5880 pass++;
5884 /* Called when we detect that the schedule is impossible. We examine the
5885 backtrack queue to find the earliest insn that caused this condition. */
5887 static struct haifa_saved_data *
5888 verify_shadows (void)
5890 struct haifa_saved_data *save, *earliest_fail = NULL;
5891 for (save = backtrack_queue; save; save = save->next)
5893 int t;
5894 struct delay_pair *pair = save->delay_pair;
5895 rtx_insn *i1 = pair->i1;
5897 for (; pair; pair = pair->next_same_i1)
5899 rtx_insn *i2 = pair->i2;
5901 if (QUEUE_INDEX (i2) == QUEUE_SCHEDULED)
5902 continue;
5904 t = INSN_TICK (i1) + pair_delay (pair);
5905 if (t < clock_var)
5907 if (sched_verbose >= 2)
5908 fprintf (sched_dump,
5909 ";;\t\tfailed delay requirements for %d/%d (%d->%d)"
5910 ", not ready\n",
5911 INSN_UID (pair->i1), INSN_UID (pair->i2),
5912 INSN_TICK (pair->i1), INSN_EXACT_TICK (pair->i2));
5913 earliest_fail = save;
5914 break;
5916 if (QUEUE_INDEX (i2) >= 0)
5918 int queued_for = INSN_TICK (i2);
5920 if (t < queued_for)
5922 if (sched_verbose >= 2)
5923 fprintf (sched_dump,
5924 ";;\t\tfailed delay requirements for %d/%d"
5925 " (%d->%d), queued too late\n",
5926 INSN_UID (pair->i1), INSN_UID (pair->i2),
5927 INSN_TICK (pair->i1), INSN_EXACT_TICK (pair->i2));
5928 earliest_fail = save;
5929 break;
5935 return earliest_fail;
5938 /* Print instructions together with useful scheduling information between
5939 HEAD and TAIL (inclusive). */
5940 static void
5941 dump_insn_stream (rtx_insn *head, rtx_insn *tail)
5943 fprintf (sched_dump, ";;\t| insn | prio |\n");
5945 rtx_insn *next_tail = NEXT_INSN (tail);
5946 for (rtx_insn *insn = head; insn != next_tail; insn = NEXT_INSN (insn))
5948 int priority = NOTE_P (insn) ? 0 : INSN_PRIORITY (insn);
5949 const char *pattern = (NOTE_P (insn)
5950 ? "note"
5951 : str_pattern_slim (PATTERN (insn)));
5953 fprintf (sched_dump, ";;\t| %4d | %4d | %-30s ",
5954 INSN_UID (insn), priority, pattern);
5956 if (sched_verbose >= 4)
5958 if (NOTE_P (insn) || recog_memoized (insn) < 0)
5959 fprintf (sched_dump, "nothing");
5960 else
5961 print_reservation (sched_dump, insn);
5963 fprintf (sched_dump, "\n");
5967 /* Use forward list scheduling to rearrange insns of block pointed to by
5968 TARGET_BB, possibly bringing insns from subsequent blocks in the same
5969 region. */
5971 bool
5972 schedule_block (basic_block *target_bb, state_t init_state)
5974 int i;
5975 bool success = modulo_ii == 0;
5976 struct sched_block_state ls;
5977 state_t temp_state = NULL; /* It is used for multipass scheduling. */
5978 int sort_p, advance, start_clock_var;
5980 /* Head/tail info for this block. */
5981 rtx_insn *prev_head = current_sched_info->prev_head;
5982 rtx_insn *next_tail = current_sched_info->next_tail;
5983 rtx_insn *head = NEXT_INSN (prev_head);
5984 rtx_insn *tail = PREV_INSN (next_tail);
5986 if ((current_sched_info->flags & DONT_BREAK_DEPENDENCIES) == 0
5987 && sched_pressure != SCHED_PRESSURE_MODEL)
5988 find_modifiable_mems (head, tail);
5990 /* We used to have code to avoid getting parameters moved from hard
5991 argument registers into pseudos.
5993 However, it was removed when it proved to be of marginal benefit
5994 and caused problems because schedule_block and compute_forward_dependences
5995 had different notions of what the "head" insn was. */
5997 gcc_assert (head != tail || INSN_P (head));
5999 haifa_recovery_bb_recently_added_p = false;
6001 backtrack_queue = NULL;
6003 /* Debug info. */
6004 if (sched_verbose)
6006 dump_new_block_header (0, *target_bb, head, tail);
6008 if (sched_verbose >= 2)
6010 dump_insn_stream (head, tail);
6011 memset (&rank_for_schedule_stats, 0,
6012 sizeof (rank_for_schedule_stats));
6016 if (init_state == NULL)
6017 state_reset (curr_state);
6018 else
6019 memcpy (curr_state, init_state, dfa_state_size);
6021 /* Clear the ready list. */
6022 ready.first = ready.veclen - 1;
6023 ready.n_ready = 0;
6024 ready.n_debug = 0;
6026 /* It is used for first cycle multipass scheduling. */
6027 temp_state = alloca (dfa_state_size);
6029 if (targetm.sched.init)
6030 targetm.sched.init (sched_dump, sched_verbose, ready.veclen);
6032 /* We start inserting insns after PREV_HEAD. */
6033 last_scheduled_insn = prev_head;
6034 last_nondebug_scheduled_insn = NULL_RTX;
6035 nonscheduled_insns_begin = NULL;
6037 gcc_assert ((NOTE_P (last_scheduled_insn)
6038 || DEBUG_INSN_P (last_scheduled_insn))
6039 && BLOCK_FOR_INSN (last_scheduled_insn) == *target_bb);
6041 /* Initialize INSN_QUEUE. Q_SIZE is the total number of insns in the
6042 queue. */
6043 q_ptr = 0;
6044 q_size = 0;
6046 insn_queue = XALLOCAVEC (rtx_insn_list *, max_insn_queue_index + 1);
6047 memset (insn_queue, 0, (max_insn_queue_index + 1) * sizeof (rtx));
6049 /* Start just before the beginning of time. */
6050 clock_var = -1;
6052 /* We need queue and ready lists and clock_var be initialized
6053 in try_ready () (which is called through init_ready_list ()). */
6054 (*current_sched_info->init_ready_list) ();
6056 if (sched_pressure == SCHED_PRESSURE_MODEL)
6057 model_start_schedule ();
6059 /* The algorithm is O(n^2) in the number of ready insns at any given
6060 time in the worst case. Before reload we are more likely to have
6061 big lists so truncate them to a reasonable size. */
6062 if (!reload_completed
6063 && ready.n_ready - ready.n_debug > MAX_SCHED_READY_INSNS)
6065 ready_sort (&ready);
6067 /* Find first free-standing insn past MAX_SCHED_READY_INSNS.
6068 If there are debug insns, we know they're first. */
6069 for (i = MAX_SCHED_READY_INSNS + ready.n_debug; i < ready.n_ready; i++)
6070 if (!SCHED_GROUP_P (ready_element (&ready, i)))
6071 break;
6073 if (sched_verbose >= 2)
6075 fprintf (sched_dump,
6076 ";;\t\tReady list on entry: %d insns\n", ready.n_ready);
6077 fprintf (sched_dump,
6078 ";;\t\t before reload => truncated to %d insns\n", i);
6081 /* Delay all insns past it for 1 cycle. If debug counter is
6082 activated make an exception for the insn right after
6083 nonscheduled_insns_begin. */
6085 rtx_insn *skip_insn;
6087 if (dbg_cnt (sched_insn) == false)
6088 skip_insn = first_nonscheduled_insn ();
6089 else
6090 skip_insn = NULL;
6092 while (i < ready.n_ready)
6094 rtx_insn *insn;
6096 insn = ready_remove (&ready, i);
6098 if (insn != skip_insn)
6099 queue_insn (insn, 1, "list truncated");
6101 if (skip_insn)
6102 ready_add (&ready, skip_insn, true);
6106 /* Now we can restore basic block notes and maintain precise cfg. */
6107 restore_bb_notes (*target_bb);
6109 last_clock_var = -1;
6111 advance = 0;
6113 gcc_assert (scheduled_insns.length () == 0);
6114 sort_p = TRUE;
6115 must_backtrack = false;
6116 modulo_insns_scheduled = 0;
6118 ls.modulo_epilogue = false;
6119 ls.first_cycle_insn_p = true;
6121 /* Loop until all the insns in BB are scheduled. */
6122 while ((*current_sched_info->schedule_more_p) ())
6124 perform_replacements_new_cycle ();
6127 start_clock_var = clock_var;
6129 clock_var++;
6131 advance_one_cycle ();
6133 /* Add to the ready list all pending insns that can be issued now.
6134 If there are no ready insns, increment clock until one
6135 is ready and add all pending insns at that point to the ready
6136 list. */
6137 queue_to_ready (&ready);
6139 gcc_assert (ready.n_ready);
6141 if (sched_verbose >= 2)
6143 fprintf (sched_dump, ";;\t\tReady list after queue_to_ready:");
6144 debug_ready_list (&ready);
6146 advance -= clock_var - start_clock_var;
6148 while (advance > 0);
6150 if (ls.modulo_epilogue)
6152 int stage = clock_var / modulo_ii;
6153 if (stage > modulo_last_stage * 2 + 2)
6155 if (sched_verbose >= 2)
6156 fprintf (sched_dump,
6157 ";;\t\tmodulo scheduled succeeded at II %d\n",
6158 modulo_ii);
6159 success = true;
6160 goto end_schedule;
6163 else if (modulo_ii > 0)
6165 int stage = clock_var / modulo_ii;
6166 if (stage > modulo_max_stages)
6168 if (sched_verbose >= 2)
6169 fprintf (sched_dump,
6170 ";;\t\tfailing schedule due to excessive stages\n");
6171 goto end_schedule;
6173 if (modulo_n_insns == modulo_insns_scheduled
6174 && stage > modulo_last_stage)
6176 if (sched_verbose >= 2)
6177 fprintf (sched_dump,
6178 ";;\t\tfound kernel after %d stages, II %d\n",
6179 stage, modulo_ii);
6180 ls.modulo_epilogue = true;
6184 prune_ready_list (temp_state, true, false, ls.modulo_epilogue);
6185 if (ready.n_ready == 0)
6186 continue;
6187 if (must_backtrack)
6188 goto do_backtrack;
6190 ls.shadows_only_p = false;
6191 cycle_issued_insns = 0;
6192 ls.can_issue_more = issue_rate;
6193 for (;;)
6195 rtx_insn *insn;
6196 int cost;
6197 bool asm_p;
6199 if (sort_p && ready.n_ready > 0)
6201 /* Sort the ready list based on priority. This must be
6202 done every iteration through the loop, as schedule_insn
6203 may have readied additional insns that will not be
6204 sorted correctly. */
6205 ready_sort (&ready);
6207 if (sched_verbose >= 2)
6209 fprintf (sched_dump,
6210 ";;\t\tReady list after ready_sort: ");
6211 debug_ready_list (&ready);
6215 /* We don't want md sched reorder to even see debug isns, so put
6216 them out right away. */
6217 if (ready.n_ready && DEBUG_INSN_P (ready_element (&ready, 0))
6218 && (*current_sched_info->schedule_more_p) ())
6220 while (ready.n_ready && DEBUG_INSN_P (ready_element (&ready, 0)))
6222 rtx_insn *insn = ready_remove_first (&ready);
6223 gcc_assert (DEBUG_INSN_P (insn));
6224 (*current_sched_info->begin_schedule_ready) (insn);
6225 scheduled_insns.safe_push (insn);
6226 last_scheduled_insn = insn;
6227 advance = schedule_insn (insn);
6228 gcc_assert (advance == 0);
6229 if (ready.n_ready > 0)
6230 ready_sort (&ready);
6234 if (ls.first_cycle_insn_p && !ready.n_ready)
6235 break;
6237 resume_after_backtrack:
6238 /* Allow the target to reorder the list, typically for
6239 better instruction bundling. */
6240 if (sort_p
6241 && (ready.n_ready == 0
6242 || !SCHED_GROUP_P (ready_element (&ready, 0))))
6244 if (ls.first_cycle_insn_p && targetm.sched.reorder)
6245 ls.can_issue_more
6246 = targetm.sched.reorder (sched_dump, sched_verbose,
6247 ready_lastpos (&ready),
6248 &ready.n_ready, clock_var);
6249 else if (!ls.first_cycle_insn_p && targetm.sched.reorder2)
6250 ls.can_issue_more
6251 = targetm.sched.reorder2 (sched_dump, sched_verbose,
6252 ready.n_ready
6253 ? ready_lastpos (&ready) : NULL,
6254 &ready.n_ready, clock_var);
6257 restart_choose_ready:
6258 if (sched_verbose >= 2)
6260 fprintf (sched_dump, ";;\tReady list (t = %3d): ",
6261 clock_var);
6262 debug_ready_list (&ready);
6263 if (sched_pressure == SCHED_PRESSURE_WEIGHTED)
6264 print_curr_reg_pressure ();
6267 if (ready.n_ready == 0
6268 && ls.can_issue_more
6269 && reload_completed)
6271 /* Allow scheduling insns directly from the queue in case
6272 there's nothing better to do (ready list is empty) but
6273 there are still vacant dispatch slots in the current cycle. */
6274 if (sched_verbose >= 6)
6275 fprintf (sched_dump,";;\t\tSecond chance\n");
6276 memcpy (temp_state, curr_state, dfa_state_size);
6277 if (early_queue_to_ready (temp_state, &ready))
6278 ready_sort (&ready);
6281 if (ready.n_ready == 0
6282 || !ls.can_issue_more
6283 || state_dead_lock_p (curr_state)
6284 || !(*current_sched_info->schedule_more_p) ())
6285 break;
6287 /* Select and remove the insn from the ready list. */
6288 if (sort_p)
6290 int res;
6292 insn = NULL;
6293 res = choose_ready (&ready, ls.first_cycle_insn_p, &insn);
6295 if (res < 0)
6296 /* Finish cycle. */
6297 break;
6298 if (res > 0)
6299 goto restart_choose_ready;
6301 gcc_assert (insn != NULL_RTX);
6303 else
6304 insn = ready_remove_first (&ready);
6306 if (sched_pressure != SCHED_PRESSURE_NONE
6307 && INSN_TICK (insn) > clock_var)
6309 ready_add (&ready, insn, true);
6310 advance = 1;
6311 break;
6314 if (targetm.sched.dfa_new_cycle
6315 && targetm.sched.dfa_new_cycle (sched_dump, sched_verbose,
6316 insn, last_clock_var,
6317 clock_var, &sort_p))
6318 /* SORT_P is used by the target to override sorting
6319 of the ready list. This is needed when the target
6320 has modified its internal structures expecting that
6321 the insn will be issued next. As we need the insn
6322 to have the highest priority (so it will be returned by
6323 the ready_remove_first call above), we invoke
6324 ready_add (&ready, insn, true).
6325 But, still, there is one issue: INSN can be later
6326 discarded by scheduler's front end through
6327 current_sched_info->can_schedule_ready_p, hence, won't
6328 be issued next. */
6330 ready_add (&ready, insn, true);
6331 break;
6334 sort_p = TRUE;
6336 if (current_sched_info->can_schedule_ready_p
6337 && ! (*current_sched_info->can_schedule_ready_p) (insn))
6338 /* We normally get here only if we don't want to move
6339 insn from the split block. */
6341 TODO_SPEC (insn) = DEP_POSTPONED;
6342 goto restart_choose_ready;
6345 if (delay_htab)
6347 /* If this insn is the first part of a delay-slot pair, record a
6348 backtrack point. */
6349 struct delay_pair *delay_entry;
6350 delay_entry
6351 = delay_htab->find_with_hash (insn, htab_hash_pointer (insn));
6352 if (delay_entry)
6354 save_backtrack_point (delay_entry, ls);
6355 if (sched_verbose >= 2)
6356 fprintf (sched_dump, ";;\t\tsaving backtrack point\n");
6360 /* DECISION is made. */
6362 if (modulo_ii > 0 && INSN_UID (insn) < modulo_iter0_max_uid)
6364 modulo_insns_scheduled++;
6365 modulo_last_stage = clock_var / modulo_ii;
6367 if (TODO_SPEC (insn) & SPECULATIVE)
6368 generate_recovery_code (insn);
6370 if (targetm.sched.dispatch (NULL, IS_DISPATCH_ON))
6371 targetm.sched.dispatch_do (insn, ADD_TO_DISPATCH_WINDOW);
6373 /* Update counters, etc in the scheduler's front end. */
6374 (*current_sched_info->begin_schedule_ready) (insn);
6375 scheduled_insns.safe_push (insn);
6376 gcc_assert (NONDEBUG_INSN_P (insn));
6377 last_nondebug_scheduled_insn = last_scheduled_insn = insn;
6379 if (recog_memoized (insn) >= 0)
6381 memcpy (temp_state, curr_state, dfa_state_size);
6382 cost = state_transition (curr_state, insn);
6383 if (sched_pressure != SCHED_PRESSURE_WEIGHTED)
6384 gcc_assert (cost < 0);
6385 if (memcmp (temp_state, curr_state, dfa_state_size) != 0)
6386 cycle_issued_insns++;
6387 asm_p = false;
6389 else
6390 asm_p = (GET_CODE (PATTERN (insn)) == ASM_INPUT
6391 || asm_noperands (PATTERN (insn)) >= 0);
6393 if (targetm.sched.variable_issue)
6394 ls.can_issue_more =
6395 targetm.sched.variable_issue (sched_dump, sched_verbose,
6396 insn, ls.can_issue_more);
6397 /* A naked CLOBBER or USE generates no instruction, so do
6398 not count them against the issue rate. */
6399 else if (GET_CODE (PATTERN (insn)) != USE
6400 && GET_CODE (PATTERN (insn)) != CLOBBER)
6401 ls.can_issue_more--;
6402 advance = schedule_insn (insn);
6404 if (SHADOW_P (insn))
6405 ls.shadows_only_p = true;
6407 /* After issuing an asm insn we should start a new cycle. */
6408 if (advance == 0 && asm_p)
6409 advance = 1;
6411 if (must_backtrack)
6412 break;
6414 if (advance != 0)
6415 break;
6417 ls.first_cycle_insn_p = false;
6418 if (ready.n_ready > 0)
6419 prune_ready_list (temp_state, false, ls.shadows_only_p,
6420 ls.modulo_epilogue);
6423 do_backtrack:
6424 if (!must_backtrack)
6425 for (i = 0; i < ready.n_ready; i++)
6427 rtx_insn *insn = ready_element (&ready, i);
6428 if (INSN_EXACT_TICK (insn) == clock_var)
6430 must_backtrack = true;
6431 clock_var++;
6432 break;
6435 if (must_backtrack && modulo_ii > 0)
6437 if (modulo_backtracks_left == 0)
6438 goto end_schedule;
6439 modulo_backtracks_left--;
6441 while (must_backtrack)
6443 struct haifa_saved_data *failed;
6444 rtx_insn *failed_insn;
6446 must_backtrack = false;
6447 failed = verify_shadows ();
6448 gcc_assert (failed);
6450 failed_insn = failed->delay_pair->i1;
6451 /* Clear these queues. */
6452 perform_replacements_new_cycle ();
6453 toggle_cancelled_flags (false);
6454 unschedule_insns_until (failed_insn);
6455 while (failed != backtrack_queue)
6456 free_topmost_backtrack_point (true);
6457 restore_last_backtrack_point (&ls);
6458 if (sched_verbose >= 2)
6459 fprintf (sched_dump, ";;\t\trewind to cycle %d\n", clock_var);
6460 /* Delay by at least a cycle. This could cause additional
6461 backtracking. */
6462 queue_insn (failed_insn, 1, "backtracked");
6463 advance = 0;
6464 if (must_backtrack)
6465 continue;
6466 if (ready.n_ready > 0)
6467 goto resume_after_backtrack;
6468 else
6470 if (clock_var == 0 && ls.first_cycle_insn_p)
6471 goto end_schedule;
6472 advance = 1;
6473 break;
6476 ls.first_cycle_insn_p = true;
6478 if (ls.modulo_epilogue)
6479 success = true;
6480 end_schedule:
6481 if (!ls.first_cycle_insn_p || advance)
6482 advance_one_cycle ();
6483 perform_replacements_new_cycle ();
6484 if (modulo_ii > 0)
6486 /* Once again, debug insn suckiness: they can be on the ready list
6487 even if they have unresolved dependencies. To make our view
6488 of the world consistent, remove such "ready" insns. */
6489 restart_debug_insn_loop:
6490 for (i = ready.n_ready - 1; i >= 0; i--)
6492 rtx_insn *x;
6494 x = ready_element (&ready, i);
6495 if (DEPS_LIST_FIRST (INSN_HARD_BACK_DEPS (x)) != NULL
6496 || DEPS_LIST_FIRST (INSN_SPEC_BACK_DEPS (x)) != NULL)
6498 ready_remove (&ready, i);
6499 goto restart_debug_insn_loop;
6502 for (i = ready.n_ready - 1; i >= 0; i--)
6504 rtx_insn *x;
6506 x = ready_element (&ready, i);
6507 resolve_dependencies (x);
6509 for (i = 0; i <= max_insn_queue_index; i++)
6511 rtx_insn_list *link;
6512 while ((link = insn_queue[i]) != NULL)
6514 rtx_insn *x = link->insn ();
6515 insn_queue[i] = link->next ();
6516 QUEUE_INDEX (x) = QUEUE_NOWHERE;
6517 free_INSN_LIST_node (link);
6518 resolve_dependencies (x);
6523 if (!success)
6524 undo_all_replacements ();
6526 /* Debug info. */
6527 if (sched_verbose)
6529 fprintf (sched_dump, ";;\tReady list (final): ");
6530 debug_ready_list (&ready);
6533 if (modulo_ii == 0 && current_sched_info->queue_must_finish_empty)
6534 /* Sanity check -- queue must be empty now. Meaningless if region has
6535 multiple bbs. */
6536 gcc_assert (!q_size && !ready.n_ready && !ready.n_debug);
6537 else if (modulo_ii == 0)
6539 /* We must maintain QUEUE_INDEX between blocks in region. */
6540 for (i = ready.n_ready - 1; i >= 0; i--)
6542 rtx_insn *x;
6544 x = ready_element (&ready, i);
6545 QUEUE_INDEX (x) = QUEUE_NOWHERE;
6546 TODO_SPEC (x) = HARD_DEP;
6549 if (q_size)
6550 for (i = 0; i <= max_insn_queue_index; i++)
6552 rtx_insn_list *link;
6553 for (link = insn_queue[i]; link; link = link->next ())
6555 rtx_insn *x;
6557 x = link->insn ();
6558 QUEUE_INDEX (x) = QUEUE_NOWHERE;
6559 TODO_SPEC (x) = HARD_DEP;
6561 free_INSN_LIST_list (&insn_queue[i]);
6565 if (sched_pressure == SCHED_PRESSURE_MODEL)
6566 model_end_schedule ();
6568 if (success)
6570 commit_schedule (prev_head, tail, target_bb);
6571 if (sched_verbose)
6572 fprintf (sched_dump, ";; total time = %d\n", clock_var);
6574 else
6575 last_scheduled_insn = tail;
6577 scheduled_insns.truncate (0);
6579 if (!current_sched_info->queue_must_finish_empty
6580 || haifa_recovery_bb_recently_added_p)
6582 /* INSN_TICK (minimum clock tick at which the insn becomes
6583 ready) may be not correct for the insn in the subsequent
6584 blocks of the region. We should use a correct value of
6585 `clock_var' or modify INSN_TICK. It is better to keep
6586 clock_var value equal to 0 at the start of a basic block.
6587 Therefore we modify INSN_TICK here. */
6588 fix_inter_tick (NEXT_INSN (prev_head), last_scheduled_insn);
6591 if (targetm.sched.finish)
6593 targetm.sched.finish (sched_dump, sched_verbose);
6594 /* Target might have added some instructions to the scheduled block
6595 in its md_finish () hook. These new insns don't have any data
6596 initialized and to identify them we extend h_i_d so that they'll
6597 get zero luids. */
6598 sched_extend_luids ();
6601 /* Update head/tail boundaries. */
6602 head = NEXT_INSN (prev_head);
6603 tail = last_scheduled_insn;
6605 if (sched_verbose)
6607 fprintf (sched_dump, ";; new head = %d\n;; new tail = %d\n",
6608 INSN_UID (head), INSN_UID (tail));
6610 if (sched_verbose >= 2)
6612 dump_insn_stream (head, tail);
6613 print_rank_for_schedule_stats (";; TOTAL ", &rank_for_schedule_stats);
6616 fprintf (sched_dump, "\n");
6619 head = restore_other_notes (head, NULL);
6621 current_sched_info->head = head;
6622 current_sched_info->tail = tail;
6624 free_backtrack_queue ();
6626 return success;
6629 /* Set_priorities: compute priority of each insn in the block. */
6632 set_priorities (rtx_insn *head, rtx_insn *tail)
6634 rtx_insn *insn;
6635 int n_insn;
6636 int sched_max_insns_priority =
6637 current_sched_info->sched_max_insns_priority;
6638 rtx_insn *prev_head;
6640 if (head == tail && ! INSN_P (head))
6641 gcc_unreachable ();
6643 n_insn = 0;
6645 prev_head = PREV_INSN (head);
6646 for (insn = tail; insn != prev_head; insn = PREV_INSN (insn))
6648 if (!INSN_P (insn))
6649 continue;
6651 n_insn++;
6652 (void) priority (insn);
6654 gcc_assert (INSN_PRIORITY_KNOWN (insn));
6656 sched_max_insns_priority = MAX (sched_max_insns_priority,
6657 INSN_PRIORITY (insn));
6660 current_sched_info->sched_max_insns_priority = sched_max_insns_priority;
6662 return n_insn;
6665 /* Set dump and sched_verbose for the desired debugging output. If no
6666 dump-file was specified, but -fsched-verbose=N (any N), print to stderr.
6667 For -fsched-verbose=N, N>=10, print everything to stderr. */
6668 void
6669 setup_sched_dump (void)
6671 sched_verbose = sched_verbose_param;
6672 if (sched_verbose_param == 0 && dump_file)
6673 sched_verbose = 1;
6674 sched_dump = ((sched_verbose_param >= 10 || !dump_file)
6675 ? stderr : dump_file);
6678 /* Allocate data for register pressure sensitive scheduling. */
6679 static void
6680 alloc_global_sched_pressure_data (void)
6682 if (sched_pressure != SCHED_PRESSURE_NONE)
6684 int i, max_regno = max_reg_num ();
6686 if (sched_dump != NULL)
6687 /* We need info about pseudos for rtl dumps about pseudo
6688 classes and costs. */
6689 regstat_init_n_sets_and_refs ();
6690 ira_set_pseudo_classes (true, sched_verbose ? sched_dump : NULL);
6691 sched_regno_pressure_class
6692 = (enum reg_class *) xmalloc (max_regno * sizeof (enum reg_class));
6693 for (i = 0; i < max_regno; i++)
6694 sched_regno_pressure_class[i]
6695 = (i < FIRST_PSEUDO_REGISTER
6696 ? ira_pressure_class_translate[REGNO_REG_CLASS (i)]
6697 : ira_pressure_class_translate[reg_allocno_class (i)]);
6698 curr_reg_live = BITMAP_ALLOC (NULL);
6699 if (sched_pressure == SCHED_PRESSURE_WEIGHTED)
6701 saved_reg_live = BITMAP_ALLOC (NULL);
6702 region_ref_regs = BITMAP_ALLOC (NULL);
6707 /* Free data for register pressure sensitive scheduling. Also called
6708 from schedule_region when stopping sched-pressure early. */
6709 void
6710 free_global_sched_pressure_data (void)
6712 if (sched_pressure != SCHED_PRESSURE_NONE)
6714 if (regstat_n_sets_and_refs != NULL)
6715 regstat_free_n_sets_and_refs ();
6716 if (sched_pressure == SCHED_PRESSURE_WEIGHTED)
6718 BITMAP_FREE (region_ref_regs);
6719 BITMAP_FREE (saved_reg_live);
6721 BITMAP_FREE (curr_reg_live);
6722 free (sched_regno_pressure_class);
6726 /* Initialize some global state for the scheduler. This function works
6727 with the common data shared between all the schedulers. It is called
6728 from the scheduler specific initialization routine. */
6730 void
6731 sched_init (void)
6733 /* Disable speculative loads in their presence if cc0 defined. */
6734 #ifdef HAVE_cc0
6735 flag_schedule_speculative_load = 0;
6736 #endif
6738 if (targetm.sched.dispatch (NULL, IS_DISPATCH_ON))
6739 targetm.sched.dispatch_do (NULL, DISPATCH_INIT);
6741 if (live_range_shrinkage_p)
6742 sched_pressure = SCHED_PRESSURE_WEIGHTED;
6743 else if (flag_sched_pressure
6744 && !reload_completed
6745 && common_sched_info->sched_pass_id == SCHED_RGN_PASS)
6746 sched_pressure = ((enum sched_pressure_algorithm)
6747 PARAM_VALUE (PARAM_SCHED_PRESSURE_ALGORITHM));
6748 else
6749 sched_pressure = SCHED_PRESSURE_NONE;
6751 if (sched_pressure != SCHED_PRESSURE_NONE)
6752 ira_setup_eliminable_regset ();
6754 /* Initialize SPEC_INFO. */
6755 if (targetm.sched.set_sched_flags)
6757 spec_info = &spec_info_var;
6758 targetm.sched.set_sched_flags (spec_info);
6760 if (spec_info->mask != 0)
6762 spec_info->data_weakness_cutoff =
6763 (PARAM_VALUE (PARAM_SCHED_SPEC_PROB_CUTOFF) * MAX_DEP_WEAK) / 100;
6764 spec_info->control_weakness_cutoff =
6765 (PARAM_VALUE (PARAM_SCHED_SPEC_PROB_CUTOFF)
6766 * REG_BR_PROB_BASE) / 100;
6768 else
6769 /* So we won't read anything accidentally. */
6770 spec_info = NULL;
6773 else
6774 /* So we won't read anything accidentally. */
6775 spec_info = 0;
6777 /* Initialize issue_rate. */
6778 if (targetm.sched.issue_rate)
6779 issue_rate = targetm.sched.issue_rate ();
6780 else
6781 issue_rate = 1;
6783 if (cached_issue_rate != issue_rate)
6785 cached_issue_rate = issue_rate;
6786 /* To invalidate max_lookahead_tries: */
6787 cached_first_cycle_multipass_dfa_lookahead = 0;
6790 if (targetm.sched.first_cycle_multipass_dfa_lookahead)
6791 dfa_lookahead = targetm.sched.first_cycle_multipass_dfa_lookahead ();
6792 else
6793 dfa_lookahead = 0;
6795 if (targetm.sched.init_dfa_pre_cycle_insn)
6796 targetm.sched.init_dfa_pre_cycle_insn ();
6798 if (targetm.sched.init_dfa_post_cycle_insn)
6799 targetm.sched.init_dfa_post_cycle_insn ();
6801 dfa_start ();
6802 dfa_state_size = state_size ();
6804 init_alias_analysis ();
6806 if (!sched_no_dce)
6807 df_set_flags (DF_LR_RUN_DCE);
6808 df_note_add_problem ();
6810 /* More problems needed for interloop dep calculation in SMS. */
6811 if (common_sched_info->sched_pass_id == SCHED_SMS_PASS)
6813 df_rd_add_problem ();
6814 df_chain_add_problem (DF_DU_CHAIN + DF_UD_CHAIN);
6817 df_analyze ();
6819 /* Do not run DCE after reload, as this can kill nops inserted
6820 by bundling. */
6821 if (reload_completed)
6822 df_clear_flags (DF_LR_RUN_DCE);
6824 regstat_compute_calls_crossed ();
6826 if (targetm.sched.init_global)
6827 targetm.sched.init_global (sched_dump, sched_verbose, get_max_uid () + 1);
6829 alloc_global_sched_pressure_data ();
6831 curr_state = xmalloc (dfa_state_size);
6834 static void haifa_init_only_bb (basic_block, basic_block);
6836 /* Initialize data structures specific to the Haifa scheduler. */
6837 void
6838 haifa_sched_init (void)
6840 setup_sched_dump ();
6841 sched_init ();
6843 scheduled_insns.create (0);
6845 if (spec_info != NULL)
6847 sched_deps_info->use_deps_list = 1;
6848 sched_deps_info->generate_spec_deps = 1;
6851 /* Initialize luids, dependency caches, target and h_i_d for the
6852 whole function. */
6854 bb_vec_t bbs;
6855 bbs.create (n_basic_blocks_for_fn (cfun));
6856 basic_block bb;
6858 sched_init_bbs ();
6860 FOR_EACH_BB_FN (bb, cfun)
6861 bbs.quick_push (bb);
6862 sched_init_luids (bbs);
6863 sched_deps_init (true);
6864 sched_extend_target ();
6865 haifa_init_h_i_d (bbs);
6867 bbs.release ();
6870 sched_init_only_bb = haifa_init_only_bb;
6871 sched_split_block = sched_split_block_1;
6872 sched_create_empty_bb = sched_create_empty_bb_1;
6873 haifa_recovery_bb_ever_added_p = false;
6875 nr_begin_data = nr_begin_control = nr_be_in_data = nr_be_in_control = 0;
6876 before_recovery = 0;
6877 after_recovery = 0;
6879 modulo_ii = 0;
6882 /* Finish work with the data specific to the Haifa scheduler. */
6883 void
6884 haifa_sched_finish (void)
6886 sched_create_empty_bb = NULL;
6887 sched_split_block = NULL;
6888 sched_init_only_bb = NULL;
6890 if (spec_info && spec_info->dump)
6892 char c = reload_completed ? 'a' : 'b';
6894 fprintf (spec_info->dump,
6895 ";; %s:\n", current_function_name ());
6897 fprintf (spec_info->dump,
6898 ";; Procedure %cr-begin-data-spec motions == %d\n",
6899 c, nr_begin_data);
6900 fprintf (spec_info->dump,
6901 ";; Procedure %cr-be-in-data-spec motions == %d\n",
6902 c, nr_be_in_data);
6903 fprintf (spec_info->dump,
6904 ";; Procedure %cr-begin-control-spec motions == %d\n",
6905 c, nr_begin_control);
6906 fprintf (spec_info->dump,
6907 ";; Procedure %cr-be-in-control-spec motions == %d\n",
6908 c, nr_be_in_control);
6911 scheduled_insns.release ();
6913 /* Finalize h_i_d, dependency caches, and luids for the whole
6914 function. Target will be finalized in md_global_finish (). */
6915 sched_deps_finish ();
6916 sched_finish_luids ();
6917 current_sched_info = NULL;
6918 sched_finish ();
6921 /* Free global data used during insn scheduling. This function works with
6922 the common data shared between the schedulers. */
6924 void
6925 sched_finish (void)
6927 haifa_finish_h_i_d ();
6928 free_global_sched_pressure_data ();
6929 free (curr_state);
6931 if (targetm.sched.finish_global)
6932 targetm.sched.finish_global (sched_dump, sched_verbose);
6934 end_alias_analysis ();
6936 regstat_free_calls_crossed ();
6938 dfa_finish ();
6941 /* Free all delay_pair structures that were recorded. */
6942 void
6943 free_delay_pairs (void)
6945 if (delay_htab)
6947 delay_htab->empty ();
6948 delay_htab_i2->empty ();
6952 /* Fix INSN_TICKs of the instructions in the current block as well as
6953 INSN_TICKs of their dependents.
6954 HEAD and TAIL are the begin and the end of the current scheduled block. */
6955 static void
6956 fix_inter_tick (rtx_insn *head, rtx_insn *tail)
6958 /* Set of instructions with corrected INSN_TICK. */
6959 bitmap_head processed;
6960 /* ??? It is doubtful if we should assume that cycle advance happens on
6961 basic block boundaries. Basically insns that are unconditionally ready
6962 on the start of the block are more preferable then those which have
6963 a one cycle dependency over insn from the previous block. */
6964 int next_clock = clock_var + 1;
6966 bitmap_initialize (&processed, 0);
6968 /* Iterates over scheduled instructions and fix their INSN_TICKs and
6969 INSN_TICKs of dependent instructions, so that INSN_TICKs are consistent
6970 across different blocks. */
6971 for (tail = NEXT_INSN (tail); head != tail; head = NEXT_INSN (head))
6973 if (INSN_P (head))
6975 int tick;
6976 sd_iterator_def sd_it;
6977 dep_t dep;
6979 tick = INSN_TICK (head);
6980 gcc_assert (tick >= MIN_TICK);
6982 /* Fix INSN_TICK of instruction from just scheduled block. */
6983 if (bitmap_set_bit (&processed, INSN_LUID (head)))
6985 tick -= next_clock;
6987 if (tick < MIN_TICK)
6988 tick = MIN_TICK;
6990 INSN_TICK (head) = tick;
6993 if (DEBUG_INSN_P (head))
6994 continue;
6996 FOR_EACH_DEP (head, SD_LIST_RES_FORW, sd_it, dep)
6998 rtx_insn *next;
7000 next = DEP_CON (dep);
7001 tick = INSN_TICK (next);
7003 if (tick != INVALID_TICK
7004 /* If NEXT has its INSN_TICK calculated, fix it.
7005 If not - it will be properly calculated from
7006 scratch later in fix_tick_ready. */
7007 && bitmap_set_bit (&processed, INSN_LUID (next)))
7009 tick -= next_clock;
7011 if (tick < MIN_TICK)
7012 tick = MIN_TICK;
7014 if (tick > INTER_TICK (next))
7015 INTER_TICK (next) = tick;
7016 else
7017 tick = INTER_TICK (next);
7019 INSN_TICK (next) = tick;
7024 bitmap_clear (&processed);
7027 /* Check if NEXT is ready to be added to the ready or queue list.
7028 If "yes", add it to the proper list.
7029 Returns:
7030 -1 - is not ready yet,
7031 0 - added to the ready list,
7032 0 < N - queued for N cycles. */
7034 try_ready (rtx_insn *next)
7036 ds_t old_ts, new_ts;
7038 old_ts = TODO_SPEC (next);
7040 gcc_assert (!(old_ts & ~(SPECULATIVE | HARD_DEP | DEP_CONTROL | DEP_POSTPONED))
7041 && (old_ts == HARD_DEP
7042 || old_ts == DEP_POSTPONED
7043 || (old_ts & SPECULATIVE)
7044 || old_ts == DEP_CONTROL));
7046 new_ts = recompute_todo_spec (next, false);
7048 if (new_ts & (HARD_DEP | DEP_POSTPONED))
7049 gcc_assert (new_ts == old_ts
7050 && QUEUE_INDEX (next) == QUEUE_NOWHERE);
7051 else if (current_sched_info->new_ready)
7052 new_ts = current_sched_info->new_ready (next, new_ts);
7054 /* * if !(old_ts & SPECULATIVE) (e.g. HARD_DEP or 0), then insn might
7055 have its original pattern or changed (speculative) one. This is due
7056 to changing ebb in region scheduling.
7057 * But if (old_ts & SPECULATIVE), then we are pretty sure that insn
7058 has speculative pattern.
7060 We can't assert (!(new_ts & HARD_DEP) || new_ts == old_ts) here because
7061 control-speculative NEXT could have been discarded by sched-rgn.c
7062 (the same case as when discarded by can_schedule_ready_p ()). */
7064 if ((new_ts & SPECULATIVE)
7065 /* If (old_ts == new_ts), then (old_ts & SPECULATIVE) and we don't
7066 need to change anything. */
7067 && new_ts != old_ts)
7069 int res;
7070 rtx new_pat;
7072 gcc_assert ((new_ts & SPECULATIVE) && !(new_ts & ~SPECULATIVE));
7074 res = haifa_speculate_insn (next, new_ts, &new_pat);
7076 switch (res)
7078 case -1:
7079 /* It would be nice to change DEP_STATUS of all dependences,
7080 which have ((DEP_STATUS & SPECULATIVE) == new_ts) to HARD_DEP,
7081 so we won't reanalyze anything. */
7082 new_ts = HARD_DEP;
7083 break;
7085 case 0:
7086 /* We follow the rule, that every speculative insn
7087 has non-null ORIG_PAT. */
7088 if (!ORIG_PAT (next))
7089 ORIG_PAT (next) = PATTERN (next);
7090 break;
7092 case 1:
7093 if (!ORIG_PAT (next))
7094 /* If we gonna to overwrite the original pattern of insn,
7095 save it. */
7096 ORIG_PAT (next) = PATTERN (next);
7098 res = haifa_change_pattern (next, new_pat);
7099 gcc_assert (res);
7100 break;
7102 default:
7103 gcc_unreachable ();
7107 /* We need to restore pattern only if (new_ts == 0), because otherwise it is
7108 either correct (new_ts & SPECULATIVE),
7109 or we simply don't care (new_ts & HARD_DEP). */
7111 gcc_assert (!ORIG_PAT (next)
7112 || !IS_SPECULATION_BRANCHY_CHECK_P (next));
7114 TODO_SPEC (next) = new_ts;
7116 if (new_ts & (HARD_DEP | DEP_POSTPONED))
7118 /* We can't assert (QUEUE_INDEX (next) == QUEUE_NOWHERE) here because
7119 control-speculative NEXT could have been discarded by sched-rgn.c
7120 (the same case as when discarded by can_schedule_ready_p ()). */
7121 /*gcc_assert (QUEUE_INDEX (next) == QUEUE_NOWHERE);*/
7123 change_queue_index (next, QUEUE_NOWHERE);
7125 return -1;
7127 else if (!(new_ts & BEGIN_SPEC)
7128 && ORIG_PAT (next) && PREDICATED_PAT (next) == NULL_RTX
7129 && !IS_SPECULATION_CHECK_P (next))
7130 /* We should change pattern of every previously speculative
7131 instruction - and we determine if NEXT was speculative by using
7132 ORIG_PAT field. Except one case - speculation checks have ORIG_PAT
7133 pat too, so skip them. */
7135 bool success = haifa_change_pattern (next, ORIG_PAT (next));
7136 gcc_assert (success);
7137 ORIG_PAT (next) = 0;
7140 if (sched_verbose >= 2)
7142 fprintf (sched_dump, ";;\t\tdependencies resolved: insn %s",
7143 (*current_sched_info->print_insn) (next, 0));
7145 if (spec_info && spec_info->dump)
7147 if (new_ts & BEGIN_DATA)
7148 fprintf (spec_info->dump, "; data-spec;");
7149 if (new_ts & BEGIN_CONTROL)
7150 fprintf (spec_info->dump, "; control-spec;");
7151 if (new_ts & BE_IN_CONTROL)
7152 fprintf (spec_info->dump, "; in-control-spec;");
7154 if (TODO_SPEC (next) & DEP_CONTROL)
7155 fprintf (sched_dump, " predicated");
7156 fprintf (sched_dump, "\n");
7159 adjust_priority (next);
7161 return fix_tick_ready (next);
7164 /* Calculate INSN_TICK of NEXT and add it to either ready or queue list. */
7165 static int
7166 fix_tick_ready (rtx_insn *next)
7168 int tick, delay;
7170 if (!DEBUG_INSN_P (next) && !sd_lists_empty_p (next, SD_LIST_RES_BACK))
7172 int full_p;
7173 sd_iterator_def sd_it;
7174 dep_t dep;
7176 tick = INSN_TICK (next);
7177 /* if tick is not equal to INVALID_TICK, then update
7178 INSN_TICK of NEXT with the most recent resolved dependence
7179 cost. Otherwise, recalculate from scratch. */
7180 full_p = (tick == INVALID_TICK);
7182 FOR_EACH_DEP (next, SD_LIST_RES_BACK, sd_it, dep)
7184 rtx_insn *pro = DEP_PRO (dep);
7185 int tick1;
7187 gcc_assert (INSN_TICK (pro) >= MIN_TICK);
7189 tick1 = INSN_TICK (pro) + dep_cost (dep);
7190 if (tick1 > tick)
7191 tick = tick1;
7193 if (!full_p)
7194 break;
7197 else
7198 tick = -1;
7200 INSN_TICK (next) = tick;
7202 delay = tick - clock_var;
7203 if (delay <= 0 || sched_pressure != SCHED_PRESSURE_NONE)
7204 delay = QUEUE_READY;
7206 change_queue_index (next, delay);
7208 return delay;
7211 /* Move NEXT to the proper queue list with (DELAY >= 1),
7212 or add it to the ready list (DELAY == QUEUE_READY),
7213 or remove it from ready and queue lists at all (DELAY == QUEUE_NOWHERE). */
7214 static void
7215 change_queue_index (rtx_insn *next, int delay)
7217 int i = QUEUE_INDEX (next);
7219 gcc_assert (QUEUE_NOWHERE <= delay && delay <= max_insn_queue_index
7220 && delay != 0);
7221 gcc_assert (i != QUEUE_SCHEDULED);
7223 if ((delay > 0 && NEXT_Q_AFTER (q_ptr, delay) == i)
7224 || (delay < 0 && delay == i))
7225 /* We have nothing to do. */
7226 return;
7228 /* Remove NEXT from wherever it is now. */
7229 if (i == QUEUE_READY)
7230 ready_remove_insn (next);
7231 else if (i >= 0)
7232 queue_remove (next);
7234 /* Add it to the proper place. */
7235 if (delay == QUEUE_READY)
7236 ready_add (readyp, next, false);
7237 else if (delay >= 1)
7238 queue_insn (next, delay, "change queue index");
7240 if (sched_verbose >= 2)
7242 fprintf (sched_dump, ";;\t\ttick updated: insn %s",
7243 (*current_sched_info->print_insn) (next, 0));
7245 if (delay == QUEUE_READY)
7246 fprintf (sched_dump, " into ready\n");
7247 else if (delay >= 1)
7248 fprintf (sched_dump, " into queue with cost=%d\n", delay);
7249 else
7250 fprintf (sched_dump, " removed from ready or queue lists\n");
7254 static int sched_ready_n_insns = -1;
7256 /* Initialize per region data structures. */
7257 void
7258 sched_extend_ready_list (int new_sched_ready_n_insns)
7260 int i;
7262 if (sched_ready_n_insns == -1)
7263 /* At the first call we need to initialize one more choice_stack
7264 entry. */
7266 i = 0;
7267 sched_ready_n_insns = 0;
7268 scheduled_insns.reserve (new_sched_ready_n_insns);
7270 else
7271 i = sched_ready_n_insns + 1;
7273 ready.veclen = new_sched_ready_n_insns + issue_rate;
7274 ready.vec = XRESIZEVEC (rtx_insn *, ready.vec, ready.veclen);
7276 gcc_assert (new_sched_ready_n_insns >= sched_ready_n_insns);
7278 ready_try = (signed char *) xrecalloc (ready_try, new_sched_ready_n_insns,
7279 sched_ready_n_insns,
7280 sizeof (*ready_try));
7282 /* We allocate +1 element to save initial state in the choice_stack[0]
7283 entry. */
7284 choice_stack = XRESIZEVEC (struct choice_entry, choice_stack,
7285 new_sched_ready_n_insns + 1);
7287 for (; i <= new_sched_ready_n_insns; i++)
7289 choice_stack[i].state = xmalloc (dfa_state_size);
7291 if (targetm.sched.first_cycle_multipass_init)
7292 targetm.sched.first_cycle_multipass_init (&(choice_stack[i]
7293 .target_data));
7296 sched_ready_n_insns = new_sched_ready_n_insns;
7299 /* Free per region data structures. */
7300 void
7301 sched_finish_ready_list (void)
7303 int i;
7305 free (ready.vec);
7306 ready.vec = NULL;
7307 ready.veclen = 0;
7309 free (ready_try);
7310 ready_try = NULL;
7312 for (i = 0; i <= sched_ready_n_insns; i++)
7314 if (targetm.sched.first_cycle_multipass_fini)
7315 targetm.sched.first_cycle_multipass_fini (&(choice_stack[i]
7316 .target_data));
7318 free (choice_stack [i].state);
7320 free (choice_stack);
7321 choice_stack = NULL;
7323 sched_ready_n_insns = -1;
7326 static int
7327 haifa_luid_for_non_insn (rtx x)
7329 gcc_assert (NOTE_P (x) || LABEL_P (x));
7331 return 0;
7334 /* Generates recovery code for INSN. */
7335 static void
7336 generate_recovery_code (rtx_insn *insn)
7338 if (TODO_SPEC (insn) & BEGIN_SPEC)
7339 begin_speculative_block (insn);
7341 /* Here we have insn with no dependencies to
7342 instructions other then CHECK_SPEC ones. */
7344 if (TODO_SPEC (insn) & BE_IN_SPEC)
7345 add_to_speculative_block (insn);
7348 /* Helper function.
7349 Tries to add speculative dependencies of type FS between instructions
7350 in deps_list L and TWIN. */
7351 static void
7352 process_insn_forw_deps_be_in_spec (rtx insn, rtx_insn *twin, ds_t fs)
7354 sd_iterator_def sd_it;
7355 dep_t dep;
7357 FOR_EACH_DEP (insn, SD_LIST_FORW, sd_it, dep)
7359 ds_t ds;
7360 rtx_insn *consumer;
7362 consumer = DEP_CON (dep);
7364 ds = DEP_STATUS (dep);
7366 if (/* If we want to create speculative dep. */
7368 /* And we can do that because this is a true dep. */
7369 && (ds & DEP_TYPES) == DEP_TRUE)
7371 gcc_assert (!(ds & BE_IN_SPEC));
7373 if (/* If this dep can be overcome with 'begin speculation'. */
7374 ds & BEGIN_SPEC)
7375 /* Then we have a choice: keep the dep 'begin speculative'
7376 or transform it into 'be in speculative'. */
7378 if (/* In try_ready we assert that if insn once became ready
7379 it can be removed from the ready (or queue) list only
7380 due to backend decision. Hence we can't let the
7381 probability of the speculative dep to decrease. */
7382 ds_weak (ds) <= ds_weak (fs))
7384 ds_t new_ds;
7386 new_ds = (ds & ~BEGIN_SPEC) | fs;
7388 if (/* consumer can 'be in speculative'. */
7389 sched_insn_is_legitimate_for_speculation_p (consumer,
7390 new_ds))
7391 /* Transform it to be in speculative. */
7392 ds = new_ds;
7395 else
7396 /* Mark the dep as 'be in speculative'. */
7397 ds |= fs;
7401 dep_def _new_dep, *new_dep = &_new_dep;
7403 init_dep_1 (new_dep, twin, consumer, DEP_TYPE (dep), ds);
7404 sd_add_dep (new_dep, false);
7409 /* Generates recovery code for BEGIN speculative INSN. */
7410 static void
7411 begin_speculative_block (rtx_insn *insn)
7413 if (TODO_SPEC (insn) & BEGIN_DATA)
7414 nr_begin_data++;
7415 if (TODO_SPEC (insn) & BEGIN_CONTROL)
7416 nr_begin_control++;
7418 create_check_block_twin (insn, false);
7420 TODO_SPEC (insn) &= ~BEGIN_SPEC;
7423 static void haifa_init_insn (rtx_insn *);
7425 /* Generates recovery code for BE_IN speculative INSN. */
7426 static void
7427 add_to_speculative_block (rtx_insn *insn)
7429 ds_t ts;
7430 sd_iterator_def sd_it;
7431 dep_t dep;
7432 rtx_insn_list *twins = NULL;
7433 rtx_vec_t priorities_roots;
7435 ts = TODO_SPEC (insn);
7436 gcc_assert (!(ts & ~BE_IN_SPEC));
7438 if (ts & BE_IN_DATA)
7439 nr_be_in_data++;
7440 if (ts & BE_IN_CONTROL)
7441 nr_be_in_control++;
7443 TODO_SPEC (insn) &= ~BE_IN_SPEC;
7444 gcc_assert (!TODO_SPEC (insn));
7446 DONE_SPEC (insn) |= ts;
7448 /* First we convert all simple checks to branchy. */
7449 for (sd_it = sd_iterator_start (insn, SD_LIST_SPEC_BACK);
7450 sd_iterator_cond (&sd_it, &dep);)
7452 rtx_insn *check = DEP_PRO (dep);
7454 if (IS_SPECULATION_SIMPLE_CHECK_P (check))
7456 create_check_block_twin (check, true);
7458 /* Restart search. */
7459 sd_it = sd_iterator_start (insn, SD_LIST_SPEC_BACK);
7461 else
7462 /* Continue search. */
7463 sd_iterator_next (&sd_it);
7466 priorities_roots.create (0);
7467 clear_priorities (insn, &priorities_roots);
7469 while (1)
7471 rtx_insn *check, *twin;
7472 basic_block rec;
7474 /* Get the first backward dependency of INSN. */
7475 sd_it = sd_iterator_start (insn, SD_LIST_SPEC_BACK);
7476 if (!sd_iterator_cond (&sd_it, &dep))
7477 /* INSN has no backward dependencies left. */
7478 break;
7480 gcc_assert ((DEP_STATUS (dep) & BEGIN_SPEC) == 0
7481 && (DEP_STATUS (dep) & BE_IN_SPEC) != 0
7482 && (DEP_STATUS (dep) & DEP_TYPES) == DEP_TRUE);
7484 check = DEP_PRO (dep);
7486 gcc_assert (!IS_SPECULATION_CHECK_P (check) && !ORIG_PAT (check)
7487 && QUEUE_INDEX (check) == QUEUE_NOWHERE);
7489 rec = BLOCK_FOR_INSN (check);
7491 twin = emit_insn_before (copy_insn (PATTERN (insn)), BB_END (rec));
7492 haifa_init_insn (twin);
7494 sd_copy_back_deps (twin, insn, true);
7496 if (sched_verbose && spec_info->dump)
7497 /* INSN_BB (insn) isn't determined for twin insns yet.
7498 So we can't use current_sched_info->print_insn. */
7499 fprintf (spec_info->dump, ";;\t\tGenerated twin insn : %d/rec%d\n",
7500 INSN_UID (twin), rec->index);
7502 twins = alloc_INSN_LIST (twin, twins);
7504 /* Add dependences between TWIN and all appropriate
7505 instructions from REC. */
7506 FOR_EACH_DEP (insn, SD_LIST_SPEC_BACK, sd_it, dep)
7508 rtx_insn *pro = DEP_PRO (dep);
7510 gcc_assert (DEP_TYPE (dep) == REG_DEP_TRUE);
7512 /* INSN might have dependencies from the instructions from
7513 several recovery blocks. At this iteration we process those
7514 producers that reside in REC. */
7515 if (BLOCK_FOR_INSN (pro) == rec)
7517 dep_def _new_dep, *new_dep = &_new_dep;
7519 init_dep (new_dep, pro, twin, REG_DEP_TRUE);
7520 sd_add_dep (new_dep, false);
7524 process_insn_forw_deps_be_in_spec (insn, twin, ts);
7526 /* Remove all dependencies between INSN and insns in REC. */
7527 for (sd_it = sd_iterator_start (insn, SD_LIST_SPEC_BACK);
7528 sd_iterator_cond (&sd_it, &dep);)
7530 rtx_insn *pro = DEP_PRO (dep);
7532 if (BLOCK_FOR_INSN (pro) == rec)
7533 sd_delete_dep (sd_it);
7534 else
7535 sd_iterator_next (&sd_it);
7539 /* We couldn't have added the dependencies between INSN and TWINS earlier
7540 because that would make TWINS appear in the INSN_BACK_DEPS (INSN). */
7541 while (twins)
7543 rtx_insn *twin;
7544 rtx_insn_list *next_node;
7546 twin = twins->insn ();
7549 dep_def _new_dep, *new_dep = &_new_dep;
7551 init_dep (new_dep, insn, twin, REG_DEP_OUTPUT);
7552 sd_add_dep (new_dep, false);
7555 next_node = twins->next ();
7556 free_INSN_LIST_node (twins);
7557 twins = next_node;
7560 calc_priorities (priorities_roots);
7561 priorities_roots.release ();
7564 /* Extends and fills with zeros (only the new part) array pointed to by P. */
7565 void *
7566 xrecalloc (void *p, size_t new_nmemb, size_t old_nmemb, size_t size)
7568 gcc_assert (new_nmemb >= old_nmemb);
7569 p = XRESIZEVAR (void, p, new_nmemb * size);
7570 memset (((char *) p) + old_nmemb * size, 0, (new_nmemb - old_nmemb) * size);
7571 return p;
7574 /* Helper function.
7575 Find fallthru edge from PRED. */
7576 edge
7577 find_fallthru_edge_from (basic_block pred)
7579 edge e;
7580 basic_block succ;
7582 succ = pred->next_bb;
7583 gcc_assert (succ->prev_bb == pred);
7585 if (EDGE_COUNT (pred->succs) <= EDGE_COUNT (succ->preds))
7587 e = find_fallthru_edge (pred->succs);
7589 if (e)
7591 gcc_assert (e->dest == succ);
7592 return e;
7595 else
7597 e = find_fallthru_edge (succ->preds);
7599 if (e)
7601 gcc_assert (e->src == pred);
7602 return e;
7606 return NULL;
7609 /* Extend per basic block data structures. */
7610 static void
7611 sched_extend_bb (void)
7613 /* The following is done to keep current_sched_info->next_tail non null. */
7614 rtx_insn *end = BB_END (EXIT_BLOCK_PTR_FOR_FN (cfun)->prev_bb);
7615 rtx_insn *insn = DEBUG_INSN_P (end) ? prev_nondebug_insn (end) : end;
7616 if (NEXT_INSN (end) == 0
7617 || (!NOTE_P (insn)
7618 && !LABEL_P (insn)
7619 /* Don't emit a NOTE if it would end up before a BARRIER. */
7620 && !BARRIER_P (NEXT_INSN (end))))
7622 rtx_note *note = emit_note_after (NOTE_INSN_DELETED, end);
7623 /* Make note appear outside BB. */
7624 set_block_for_insn (note, NULL);
7625 BB_END (EXIT_BLOCK_PTR_FOR_FN (cfun)->prev_bb) = end;
7629 /* Init per basic block data structures. */
7630 void
7631 sched_init_bbs (void)
7633 sched_extend_bb ();
7636 /* Initialize BEFORE_RECOVERY variable. */
7637 static void
7638 init_before_recovery (basic_block *before_recovery_ptr)
7640 basic_block last;
7641 edge e;
7643 last = EXIT_BLOCK_PTR_FOR_FN (cfun)->prev_bb;
7644 e = find_fallthru_edge_from (last);
7646 if (e)
7648 /* We create two basic blocks:
7649 1. Single instruction block is inserted right after E->SRC
7650 and has jump to
7651 2. Empty block right before EXIT_BLOCK.
7652 Between these two blocks recovery blocks will be emitted. */
7654 basic_block single, empty;
7655 rtx_insn *x;
7656 rtx label;
7658 /* If the fallthrough edge to exit we've found is from the block we've
7659 created before, don't do anything more. */
7660 if (last == after_recovery)
7661 return;
7663 adding_bb_to_current_region_p = false;
7665 single = sched_create_empty_bb (last);
7666 empty = sched_create_empty_bb (single);
7668 /* Add new blocks to the root loop. */
7669 if (current_loops != NULL)
7671 add_bb_to_loop (single, (*current_loops->larray)[0]);
7672 add_bb_to_loop (empty, (*current_loops->larray)[0]);
7675 single->count = last->count;
7676 empty->count = last->count;
7677 single->frequency = last->frequency;
7678 empty->frequency = last->frequency;
7679 BB_COPY_PARTITION (single, last);
7680 BB_COPY_PARTITION (empty, last);
7682 redirect_edge_succ (e, single);
7683 make_single_succ_edge (single, empty, 0);
7684 make_single_succ_edge (empty, EXIT_BLOCK_PTR_FOR_FN (cfun),
7685 EDGE_FALLTHRU);
7687 label = block_label (empty);
7688 x = emit_jump_insn_after (gen_jump (label), BB_END (single));
7689 JUMP_LABEL (x) = label;
7690 LABEL_NUSES (label)++;
7691 haifa_init_insn (x);
7693 emit_barrier_after (x);
7695 sched_init_only_bb (empty, NULL);
7696 sched_init_only_bb (single, NULL);
7697 sched_extend_bb ();
7699 adding_bb_to_current_region_p = true;
7700 before_recovery = single;
7701 after_recovery = empty;
7703 if (before_recovery_ptr)
7704 *before_recovery_ptr = before_recovery;
7706 if (sched_verbose >= 2 && spec_info->dump)
7707 fprintf (spec_info->dump,
7708 ";;\t\tFixed fallthru to EXIT : %d->>%d->%d->>EXIT\n",
7709 last->index, single->index, empty->index);
7711 else
7712 before_recovery = last;
7715 /* Returns new recovery block. */
7716 basic_block
7717 sched_create_recovery_block (basic_block *before_recovery_ptr)
7719 rtx label;
7720 rtx_insn *barrier;
7721 basic_block rec;
7723 haifa_recovery_bb_recently_added_p = true;
7724 haifa_recovery_bb_ever_added_p = true;
7726 init_before_recovery (before_recovery_ptr);
7728 barrier = get_last_bb_insn (before_recovery);
7729 gcc_assert (BARRIER_P (barrier));
7731 label = emit_label_after (gen_label_rtx (), barrier);
7733 rec = create_basic_block (label, label, before_recovery);
7735 /* A recovery block always ends with an unconditional jump. */
7736 emit_barrier_after (BB_END (rec));
7738 if (BB_PARTITION (before_recovery) != BB_UNPARTITIONED)
7739 BB_SET_PARTITION (rec, BB_COLD_PARTITION);
7741 if (sched_verbose && spec_info->dump)
7742 fprintf (spec_info->dump, ";;\t\tGenerated recovery block rec%d\n",
7743 rec->index);
7745 return rec;
7748 /* Create edges: FIRST_BB -> REC; FIRST_BB -> SECOND_BB; REC -> SECOND_BB
7749 and emit necessary jumps. */
7750 void
7751 sched_create_recovery_edges (basic_block first_bb, basic_block rec,
7752 basic_block second_bb)
7754 rtx label;
7755 rtx jump;
7756 int edge_flags;
7758 /* This is fixing of incoming edge. */
7759 /* ??? Which other flags should be specified? */
7760 if (BB_PARTITION (first_bb) != BB_PARTITION (rec))
7761 /* Partition type is the same, if it is "unpartitioned". */
7762 edge_flags = EDGE_CROSSING;
7763 else
7764 edge_flags = 0;
7766 make_edge (first_bb, rec, edge_flags);
7767 label = block_label (second_bb);
7768 jump = emit_jump_insn_after (gen_jump (label), BB_END (rec));
7769 JUMP_LABEL (jump) = label;
7770 LABEL_NUSES (label)++;
7772 if (BB_PARTITION (second_bb) != BB_PARTITION (rec))
7773 /* Partition type is the same, if it is "unpartitioned". */
7775 /* Rewritten from cfgrtl.c. */
7776 if (flag_reorder_blocks_and_partition
7777 && targetm_common.have_named_sections)
7779 /* We don't need the same note for the check because
7780 any_condjump_p (check) == true. */
7781 CROSSING_JUMP_P (jump) = 1;
7783 edge_flags = EDGE_CROSSING;
7785 else
7786 edge_flags = 0;
7788 make_single_succ_edge (rec, second_bb, edge_flags);
7789 if (dom_info_available_p (CDI_DOMINATORS))
7790 set_immediate_dominator (CDI_DOMINATORS, rec, first_bb);
7793 /* This function creates recovery code for INSN. If MUTATE_P is nonzero,
7794 INSN is a simple check, that should be converted to branchy one. */
7795 static void
7796 create_check_block_twin (rtx_insn *insn, bool mutate_p)
7798 basic_block rec;
7799 rtx_insn *label, *check, *twin;
7800 rtx check_pat;
7801 ds_t fs;
7802 sd_iterator_def sd_it;
7803 dep_t dep;
7804 dep_def _new_dep, *new_dep = &_new_dep;
7805 ds_t todo_spec;
7807 gcc_assert (ORIG_PAT (insn) != NULL_RTX);
7809 if (!mutate_p)
7810 todo_spec = TODO_SPEC (insn);
7811 else
7813 gcc_assert (IS_SPECULATION_SIMPLE_CHECK_P (insn)
7814 && (TODO_SPEC (insn) & SPECULATIVE) == 0);
7816 todo_spec = CHECK_SPEC (insn);
7819 todo_spec &= SPECULATIVE;
7821 /* Create recovery block. */
7822 if (mutate_p || targetm.sched.needs_block_p (todo_spec))
7824 rec = sched_create_recovery_block (NULL);
7825 label = BB_HEAD (rec);
7827 else
7829 rec = EXIT_BLOCK_PTR_FOR_FN (cfun);
7830 label = NULL;
7833 /* Emit CHECK. */
7834 check_pat = targetm.sched.gen_spec_check (insn, label, todo_spec);
7836 if (rec != EXIT_BLOCK_PTR_FOR_FN (cfun))
7838 /* To have mem_reg alive at the beginning of second_bb,
7839 we emit check BEFORE insn, so insn after splitting
7840 insn will be at the beginning of second_bb, which will
7841 provide us with the correct life information. */
7842 check = emit_jump_insn_before (check_pat, insn);
7843 JUMP_LABEL (check) = label;
7844 LABEL_NUSES (label)++;
7846 else
7847 check = emit_insn_before (check_pat, insn);
7849 /* Extend data structures. */
7850 haifa_init_insn (check);
7852 /* CHECK is being added to current region. Extend ready list. */
7853 gcc_assert (sched_ready_n_insns != -1);
7854 sched_extend_ready_list (sched_ready_n_insns + 1);
7856 if (current_sched_info->add_remove_insn)
7857 current_sched_info->add_remove_insn (insn, 0);
7859 RECOVERY_BLOCK (check) = rec;
7861 if (sched_verbose && spec_info->dump)
7862 fprintf (spec_info->dump, ";;\t\tGenerated check insn : %s\n",
7863 (*current_sched_info->print_insn) (check, 0));
7865 gcc_assert (ORIG_PAT (insn));
7867 /* Initialize TWIN (twin is a duplicate of original instruction
7868 in the recovery block). */
7869 if (rec != EXIT_BLOCK_PTR_FOR_FN (cfun))
7871 sd_iterator_def sd_it;
7872 dep_t dep;
7874 FOR_EACH_DEP (insn, SD_LIST_RES_BACK, sd_it, dep)
7875 if ((DEP_STATUS (dep) & DEP_OUTPUT) != 0)
7877 struct _dep _dep2, *dep2 = &_dep2;
7879 init_dep (dep2, DEP_PRO (dep), check, REG_DEP_TRUE);
7881 sd_add_dep (dep2, true);
7884 twin = emit_insn_after (ORIG_PAT (insn), BB_END (rec));
7885 haifa_init_insn (twin);
7887 if (sched_verbose && spec_info->dump)
7888 /* INSN_BB (insn) isn't determined for twin insns yet.
7889 So we can't use current_sched_info->print_insn. */
7890 fprintf (spec_info->dump, ";;\t\tGenerated twin insn : %d/rec%d\n",
7891 INSN_UID (twin), rec->index);
7893 else
7895 ORIG_PAT (check) = ORIG_PAT (insn);
7896 HAS_INTERNAL_DEP (check) = 1;
7897 twin = check;
7898 /* ??? We probably should change all OUTPUT dependencies to
7899 (TRUE | OUTPUT). */
7902 /* Copy all resolved back dependencies of INSN to TWIN. This will
7903 provide correct value for INSN_TICK (TWIN). */
7904 sd_copy_back_deps (twin, insn, true);
7906 if (rec != EXIT_BLOCK_PTR_FOR_FN (cfun))
7907 /* In case of branchy check, fix CFG. */
7909 basic_block first_bb, second_bb;
7910 rtx_insn *jump;
7912 first_bb = BLOCK_FOR_INSN (check);
7913 second_bb = sched_split_block (first_bb, check);
7915 sched_create_recovery_edges (first_bb, rec, second_bb);
7917 sched_init_only_bb (second_bb, first_bb);
7918 sched_init_only_bb (rec, EXIT_BLOCK_PTR_FOR_FN (cfun));
7920 jump = BB_END (rec);
7921 haifa_init_insn (jump);
7924 /* Move backward dependences from INSN to CHECK and
7925 move forward dependences from INSN to TWIN. */
7927 /* First, create dependencies between INSN's producers and CHECK & TWIN. */
7928 FOR_EACH_DEP (insn, SD_LIST_BACK, sd_it, dep)
7930 rtx_insn *pro = DEP_PRO (dep);
7931 ds_t ds;
7933 /* If BEGIN_DATA: [insn ~~TRUE~~> producer]:
7934 check --TRUE--> producer ??? or ANTI ???
7935 twin --TRUE--> producer
7936 twin --ANTI--> check
7938 If BEGIN_CONTROL: [insn ~~ANTI~~> producer]:
7939 check --ANTI--> producer
7940 twin --ANTI--> producer
7941 twin --ANTI--> check
7943 If BE_IN_SPEC: [insn ~~TRUE~~> producer]:
7944 check ~~TRUE~~> producer
7945 twin ~~TRUE~~> producer
7946 twin --ANTI--> check */
7948 ds = DEP_STATUS (dep);
7950 if (ds & BEGIN_SPEC)
7952 gcc_assert (!mutate_p);
7953 ds &= ~BEGIN_SPEC;
7956 init_dep_1 (new_dep, pro, check, DEP_TYPE (dep), ds);
7957 sd_add_dep (new_dep, false);
7959 if (rec != EXIT_BLOCK_PTR_FOR_FN (cfun))
7961 DEP_CON (new_dep) = twin;
7962 sd_add_dep (new_dep, false);
7966 /* Second, remove backward dependencies of INSN. */
7967 for (sd_it = sd_iterator_start (insn, SD_LIST_SPEC_BACK);
7968 sd_iterator_cond (&sd_it, &dep);)
7970 if ((DEP_STATUS (dep) & BEGIN_SPEC)
7971 || mutate_p)
7972 /* We can delete this dep because we overcome it with
7973 BEGIN_SPECULATION. */
7974 sd_delete_dep (sd_it);
7975 else
7976 sd_iterator_next (&sd_it);
7979 /* Future Speculations. Determine what BE_IN speculations will be like. */
7980 fs = 0;
7982 /* Fields (DONE_SPEC (x) & BEGIN_SPEC) and CHECK_SPEC (x) are set only
7983 here. */
7985 gcc_assert (!DONE_SPEC (insn));
7987 if (!mutate_p)
7989 ds_t ts = TODO_SPEC (insn);
7991 DONE_SPEC (insn) = ts & BEGIN_SPEC;
7992 CHECK_SPEC (check) = ts & BEGIN_SPEC;
7994 /* Luckiness of future speculations solely depends upon initial
7995 BEGIN speculation. */
7996 if (ts & BEGIN_DATA)
7997 fs = set_dep_weak (fs, BE_IN_DATA, get_dep_weak (ts, BEGIN_DATA));
7998 if (ts & BEGIN_CONTROL)
7999 fs = set_dep_weak (fs, BE_IN_CONTROL,
8000 get_dep_weak (ts, BEGIN_CONTROL));
8002 else
8003 CHECK_SPEC (check) = CHECK_SPEC (insn);
8005 /* Future speculations: call the helper. */
8006 process_insn_forw_deps_be_in_spec (insn, twin, fs);
8008 if (rec != EXIT_BLOCK_PTR_FOR_FN (cfun))
8010 /* Which types of dependencies should we use here is,
8011 generally, machine-dependent question... But, for now,
8012 it is not. */
8014 if (!mutate_p)
8016 init_dep (new_dep, insn, check, REG_DEP_TRUE);
8017 sd_add_dep (new_dep, false);
8019 init_dep (new_dep, insn, twin, REG_DEP_OUTPUT);
8020 sd_add_dep (new_dep, false);
8022 else
8024 if (spec_info->dump)
8025 fprintf (spec_info->dump, ";;\t\tRemoved simple check : %s\n",
8026 (*current_sched_info->print_insn) (insn, 0));
8028 /* Remove all dependencies of the INSN. */
8030 sd_it = sd_iterator_start (insn, (SD_LIST_FORW
8031 | SD_LIST_BACK
8032 | SD_LIST_RES_BACK));
8033 while (sd_iterator_cond (&sd_it, &dep))
8034 sd_delete_dep (sd_it);
8037 /* If former check (INSN) already was moved to the ready (or queue)
8038 list, add new check (CHECK) there too. */
8039 if (QUEUE_INDEX (insn) != QUEUE_NOWHERE)
8040 try_ready (check);
8042 /* Remove old check from instruction stream and free its
8043 data. */
8044 sched_remove_insn (insn);
8047 init_dep (new_dep, check, twin, REG_DEP_ANTI);
8048 sd_add_dep (new_dep, false);
8050 else
8052 init_dep_1 (new_dep, insn, check, REG_DEP_TRUE, DEP_TRUE | DEP_OUTPUT);
8053 sd_add_dep (new_dep, false);
8056 if (!mutate_p)
8057 /* Fix priorities. If MUTATE_P is nonzero, this is not necessary,
8058 because it'll be done later in add_to_speculative_block. */
8060 rtx_vec_t priorities_roots = rtx_vec_t ();
8062 clear_priorities (twin, &priorities_roots);
8063 calc_priorities (priorities_roots);
8064 priorities_roots.release ();
8068 /* Removes dependency between instructions in the recovery block REC
8069 and usual region instructions. It keeps inner dependences so it
8070 won't be necessary to recompute them. */
8071 static void
8072 fix_recovery_deps (basic_block rec)
8074 rtx_insn *note, *insn, *jump;
8075 rtx_insn_list *ready_list = 0;
8076 bitmap_head in_ready;
8077 rtx_insn_list *link;
8079 bitmap_initialize (&in_ready, 0);
8081 /* NOTE - a basic block note. */
8082 note = NEXT_INSN (BB_HEAD (rec));
8083 gcc_assert (NOTE_INSN_BASIC_BLOCK_P (note));
8084 insn = BB_END (rec);
8085 gcc_assert (JUMP_P (insn));
8086 insn = PREV_INSN (insn);
8090 sd_iterator_def sd_it;
8091 dep_t dep;
8093 for (sd_it = sd_iterator_start (insn, SD_LIST_FORW);
8094 sd_iterator_cond (&sd_it, &dep);)
8096 rtx_insn *consumer = DEP_CON (dep);
8098 if (BLOCK_FOR_INSN (consumer) != rec)
8100 sd_delete_dep (sd_it);
8102 if (bitmap_set_bit (&in_ready, INSN_LUID (consumer)))
8103 ready_list = alloc_INSN_LIST (consumer, ready_list);
8105 else
8107 gcc_assert ((DEP_STATUS (dep) & DEP_TYPES) == DEP_TRUE);
8109 sd_iterator_next (&sd_it);
8113 insn = PREV_INSN (insn);
8115 while (insn != note);
8117 bitmap_clear (&in_ready);
8119 /* Try to add instructions to the ready or queue list. */
8120 for (link = ready_list; link; link = link->next ())
8121 try_ready (link->insn ());
8122 free_INSN_LIST_list (&ready_list);
8124 /* Fixing jump's dependences. */
8125 insn = BB_HEAD (rec);
8126 jump = BB_END (rec);
8128 gcc_assert (LABEL_P (insn));
8129 insn = NEXT_INSN (insn);
8131 gcc_assert (NOTE_INSN_BASIC_BLOCK_P (insn));
8132 add_jump_dependencies (insn, jump);
8135 /* Change pattern of INSN to NEW_PAT. Invalidate cached haifa
8136 instruction data. */
8137 static bool
8138 haifa_change_pattern (rtx_insn *insn, rtx new_pat)
8140 int t;
8142 t = validate_change (insn, &PATTERN (insn), new_pat, 0);
8143 if (!t)
8144 return false;
8146 update_insn_after_change (insn);
8147 return true;
8150 /* -1 - can't speculate,
8151 0 - for speculation with REQUEST mode it is OK to use
8152 current instruction pattern,
8153 1 - need to change pattern for *NEW_PAT to be speculative. */
8155 sched_speculate_insn (rtx_insn *insn, ds_t request, rtx *new_pat)
8157 gcc_assert (current_sched_info->flags & DO_SPECULATION
8158 && (request & SPECULATIVE)
8159 && sched_insn_is_legitimate_for_speculation_p (insn, request));
8161 if ((request & spec_info->mask) != request)
8162 return -1;
8164 if (request & BE_IN_SPEC
8165 && !(request & BEGIN_SPEC))
8166 return 0;
8168 return targetm.sched.speculate_insn (insn, request, new_pat);
8171 static int
8172 haifa_speculate_insn (rtx_insn *insn, ds_t request, rtx *new_pat)
8174 gcc_assert (sched_deps_info->generate_spec_deps
8175 && !IS_SPECULATION_CHECK_P (insn));
8177 if (HAS_INTERNAL_DEP (insn)
8178 || SCHED_GROUP_P (insn))
8179 return -1;
8181 return sched_speculate_insn (insn, request, new_pat);
8184 /* Print some information about block BB, which starts with HEAD and
8185 ends with TAIL, before scheduling it.
8186 I is zero, if scheduler is about to start with the fresh ebb. */
8187 static void
8188 dump_new_block_header (int i, basic_block bb, rtx_insn *head, rtx_insn *tail)
8190 if (!i)
8191 fprintf (sched_dump,
8192 ";; ======================================================\n");
8193 else
8194 fprintf (sched_dump,
8195 ";; =====================ADVANCING TO=====================\n");
8196 fprintf (sched_dump,
8197 ";; -- basic block %d from %d to %d -- %s reload\n",
8198 bb->index, INSN_UID (head), INSN_UID (tail),
8199 (reload_completed ? "after" : "before"));
8200 fprintf (sched_dump,
8201 ";; ======================================================\n");
8202 fprintf (sched_dump, "\n");
8205 /* Unlink basic block notes and labels and saves them, so they
8206 can be easily restored. We unlink basic block notes in EBB to
8207 provide back-compatibility with the previous code, as target backends
8208 assume, that there'll be only instructions between
8209 current_sched_info->{head and tail}. We restore these notes as soon
8210 as we can.
8211 FIRST (LAST) is the first (last) basic block in the ebb.
8212 NB: In usual case (FIRST == LAST) nothing is really done. */
8213 void
8214 unlink_bb_notes (basic_block first, basic_block last)
8216 /* We DON'T unlink basic block notes of the first block in the ebb. */
8217 if (first == last)
8218 return;
8220 bb_header = XNEWVEC (rtx_insn *, last_basic_block_for_fn (cfun));
8222 /* Make a sentinel. */
8223 if (last->next_bb != EXIT_BLOCK_PTR_FOR_FN (cfun))
8224 bb_header[last->next_bb->index] = 0;
8226 first = first->next_bb;
8229 rtx_insn *prev, *label, *note, *next;
8231 label = BB_HEAD (last);
8232 if (LABEL_P (label))
8233 note = NEXT_INSN (label);
8234 else
8235 note = label;
8236 gcc_assert (NOTE_INSN_BASIC_BLOCK_P (note));
8238 prev = PREV_INSN (label);
8239 next = NEXT_INSN (note);
8240 gcc_assert (prev && next);
8242 SET_NEXT_INSN (prev) = next;
8243 SET_PREV_INSN (next) = prev;
8245 bb_header[last->index] = label;
8247 if (last == first)
8248 break;
8250 last = last->prev_bb;
8252 while (1);
8255 /* Restore basic block notes.
8256 FIRST is the first basic block in the ebb. */
8257 static void
8258 restore_bb_notes (basic_block first)
8260 if (!bb_header)
8261 return;
8263 /* We DON'T unlink basic block notes of the first block in the ebb. */
8264 first = first->next_bb;
8265 /* Remember: FIRST is actually a second basic block in the ebb. */
8267 while (first != EXIT_BLOCK_PTR_FOR_FN (cfun)
8268 && bb_header[first->index])
8270 rtx_insn *prev, *label, *note, *next;
8272 label = bb_header[first->index];
8273 prev = PREV_INSN (label);
8274 next = NEXT_INSN (prev);
8276 if (LABEL_P (label))
8277 note = NEXT_INSN (label);
8278 else
8279 note = label;
8280 gcc_assert (NOTE_INSN_BASIC_BLOCK_P (note));
8282 bb_header[first->index] = 0;
8284 SET_NEXT_INSN (prev) = label;
8285 SET_NEXT_INSN (note) = next;
8286 SET_PREV_INSN (next) = note;
8288 first = first->next_bb;
8291 free (bb_header);
8292 bb_header = 0;
8295 /* Helper function.
8296 Fix CFG after both in- and inter-block movement of
8297 control_flow_insn_p JUMP. */
8298 static void
8299 fix_jump_move (rtx_insn *jump)
8301 basic_block bb, jump_bb, jump_bb_next;
8303 bb = BLOCK_FOR_INSN (PREV_INSN (jump));
8304 jump_bb = BLOCK_FOR_INSN (jump);
8305 jump_bb_next = jump_bb->next_bb;
8307 gcc_assert (common_sched_info->sched_pass_id == SCHED_EBB_PASS
8308 || IS_SPECULATION_BRANCHY_CHECK_P (jump));
8310 if (!NOTE_INSN_BASIC_BLOCK_P (BB_END (jump_bb_next)))
8311 /* if jump_bb_next is not empty. */
8312 BB_END (jump_bb) = BB_END (jump_bb_next);
8314 if (BB_END (bb) != PREV_INSN (jump))
8315 /* Then there are instruction after jump that should be placed
8316 to jump_bb_next. */
8317 BB_END (jump_bb_next) = BB_END (bb);
8318 else
8319 /* Otherwise jump_bb_next is empty. */
8320 BB_END (jump_bb_next) = NEXT_INSN (BB_HEAD (jump_bb_next));
8322 /* To make assertion in move_insn happy. */
8323 BB_END (bb) = PREV_INSN (jump);
8325 update_bb_for_insn (jump_bb_next);
8328 /* Fix CFG after interblock movement of control_flow_insn_p JUMP. */
8329 static void
8330 move_block_after_check (rtx_insn *jump)
8332 basic_block bb, jump_bb, jump_bb_next;
8333 vec<edge, va_gc> *t;
8335 bb = BLOCK_FOR_INSN (PREV_INSN (jump));
8336 jump_bb = BLOCK_FOR_INSN (jump);
8337 jump_bb_next = jump_bb->next_bb;
8339 update_bb_for_insn (jump_bb);
8341 gcc_assert (IS_SPECULATION_CHECK_P (jump)
8342 || IS_SPECULATION_CHECK_P (BB_END (jump_bb_next)));
8344 unlink_block (jump_bb_next);
8345 link_block (jump_bb_next, bb);
8347 t = bb->succs;
8348 bb->succs = 0;
8349 move_succs (&(jump_bb->succs), bb);
8350 move_succs (&(jump_bb_next->succs), jump_bb);
8351 move_succs (&t, jump_bb_next);
8353 df_mark_solutions_dirty ();
8355 common_sched_info->fix_recovery_cfg
8356 (bb->index, jump_bb->index, jump_bb_next->index);
8359 /* Helper function for move_block_after_check.
8360 This functions attaches edge vector pointed to by SUCCSP to
8361 block TO. */
8362 static void
8363 move_succs (vec<edge, va_gc> **succsp, basic_block to)
8365 edge e;
8366 edge_iterator ei;
8368 gcc_assert (to->succs == 0);
8370 to->succs = *succsp;
8372 FOR_EACH_EDGE (e, ei, to->succs)
8373 e->src = to;
8375 *succsp = 0;
8378 /* Remove INSN from the instruction stream.
8379 INSN should have any dependencies. */
8380 static void
8381 sched_remove_insn (rtx_insn *insn)
8383 sd_finish_insn (insn);
8385 change_queue_index (insn, QUEUE_NOWHERE);
8386 current_sched_info->add_remove_insn (insn, 1);
8387 delete_insn (insn);
8390 /* Clear priorities of all instructions, that are forward dependent on INSN.
8391 Store in vector pointed to by ROOTS_PTR insns on which priority () should
8392 be invoked to initialize all cleared priorities. */
8393 static void
8394 clear_priorities (rtx_insn *insn, rtx_vec_t *roots_ptr)
8396 sd_iterator_def sd_it;
8397 dep_t dep;
8398 bool insn_is_root_p = true;
8400 gcc_assert (QUEUE_INDEX (insn) != QUEUE_SCHEDULED);
8402 FOR_EACH_DEP (insn, SD_LIST_BACK, sd_it, dep)
8404 rtx_insn *pro = DEP_PRO (dep);
8406 if (INSN_PRIORITY_STATUS (pro) >= 0
8407 && QUEUE_INDEX (insn) != QUEUE_SCHEDULED)
8409 /* If DEP doesn't contribute to priority then INSN itself should
8410 be added to priority roots. */
8411 if (contributes_to_priority_p (dep))
8412 insn_is_root_p = false;
8414 INSN_PRIORITY_STATUS (pro) = -1;
8415 clear_priorities (pro, roots_ptr);
8419 if (insn_is_root_p)
8420 roots_ptr->safe_push (insn);
8423 /* Recompute priorities of instructions, whose priorities might have been
8424 changed. ROOTS is a vector of instructions whose priority computation will
8425 trigger initialization of all cleared priorities. */
8426 static void
8427 calc_priorities (rtx_vec_t roots)
8429 int i;
8430 rtx_insn *insn;
8432 FOR_EACH_VEC_ELT (roots, i, insn)
8433 priority (insn);
8437 /* Add dependences between JUMP and other instructions in the recovery
8438 block. INSN is the first insn the recovery block. */
8439 static void
8440 add_jump_dependencies (rtx_insn *insn, rtx_insn *jump)
8444 insn = NEXT_INSN (insn);
8445 if (insn == jump)
8446 break;
8448 if (dep_list_size (insn, SD_LIST_FORW) == 0)
8450 dep_def _new_dep, *new_dep = &_new_dep;
8452 init_dep (new_dep, insn, jump, REG_DEP_ANTI);
8453 sd_add_dep (new_dep, false);
8456 while (1);
8458 gcc_assert (!sd_lists_empty_p (jump, SD_LIST_BACK));
8461 /* Extend data structures for logical insn UID. */
8462 void
8463 sched_extend_luids (void)
8465 int new_luids_max_uid = get_max_uid () + 1;
8467 sched_luids.safe_grow_cleared (new_luids_max_uid);
8470 /* Initialize LUID for INSN. */
8471 void
8472 sched_init_insn_luid (rtx_insn *insn)
8474 int i = INSN_P (insn) ? 1 : common_sched_info->luid_for_non_insn (insn);
8475 int luid;
8477 if (i >= 0)
8479 luid = sched_max_luid;
8480 sched_max_luid += i;
8482 else
8483 luid = -1;
8485 SET_INSN_LUID (insn, luid);
8488 /* Initialize luids for BBS.
8489 The hook common_sched_info->luid_for_non_insn () is used to determine
8490 if notes, labels, etc. need luids. */
8491 void
8492 sched_init_luids (bb_vec_t bbs)
8494 int i;
8495 basic_block bb;
8497 sched_extend_luids ();
8498 FOR_EACH_VEC_ELT (bbs, i, bb)
8500 rtx_insn *insn;
8502 FOR_BB_INSNS (bb, insn)
8503 sched_init_insn_luid (insn);
8507 /* Free LUIDs. */
8508 void
8509 sched_finish_luids (void)
8511 sched_luids.release ();
8512 sched_max_luid = 1;
8515 /* Return logical uid of INSN. Helpful while debugging. */
8517 insn_luid (rtx_insn *insn)
8519 return INSN_LUID (insn);
8522 /* Extend per insn data in the target. */
8523 void
8524 sched_extend_target (void)
8526 if (targetm.sched.h_i_d_extended)
8527 targetm.sched.h_i_d_extended ();
8530 /* Extend global scheduler structures (those, that live across calls to
8531 schedule_block) to include information about just emitted INSN. */
8532 static void
8533 extend_h_i_d (void)
8535 int reserve = (get_max_uid () + 1 - h_i_d.length ());
8536 if (reserve > 0
8537 && ! h_i_d.space (reserve))
8539 h_i_d.safe_grow_cleared (3 * get_max_uid () / 2);
8540 sched_extend_target ();
8544 /* Initialize h_i_d entry of the INSN with default values.
8545 Values, that are not explicitly initialized here, hold zero. */
8546 static void
8547 init_h_i_d (rtx_insn *insn)
8549 if (INSN_LUID (insn) > 0)
8551 INSN_COST (insn) = -1;
8552 QUEUE_INDEX (insn) = QUEUE_NOWHERE;
8553 INSN_TICK (insn) = INVALID_TICK;
8554 INSN_EXACT_TICK (insn) = INVALID_TICK;
8555 INTER_TICK (insn) = INVALID_TICK;
8556 TODO_SPEC (insn) = HARD_DEP;
8560 /* Initialize haifa_insn_data for BBS. */
8561 void
8562 haifa_init_h_i_d (bb_vec_t bbs)
8564 int i;
8565 basic_block bb;
8567 extend_h_i_d ();
8568 FOR_EACH_VEC_ELT (bbs, i, bb)
8570 rtx_insn *insn;
8572 FOR_BB_INSNS (bb, insn)
8573 init_h_i_d (insn);
8577 /* Finalize haifa_insn_data. */
8578 void
8579 haifa_finish_h_i_d (void)
8581 int i;
8582 haifa_insn_data_t data;
8583 struct reg_use_data *use, *next;
8585 FOR_EACH_VEC_ELT (h_i_d, i, data)
8587 free (data->max_reg_pressure);
8588 free (data->reg_pressure);
8589 for (use = data->reg_use_list; use != NULL; use = next)
8591 next = use->next_insn_use;
8592 free (use);
8595 h_i_d.release ();
8598 /* Init data for the new insn INSN. */
8599 static void
8600 haifa_init_insn (rtx_insn *insn)
8602 gcc_assert (insn != NULL);
8604 sched_extend_luids ();
8605 sched_init_insn_luid (insn);
8606 sched_extend_target ();
8607 sched_deps_init (false);
8608 extend_h_i_d ();
8609 init_h_i_d (insn);
8611 if (adding_bb_to_current_region_p)
8613 sd_init_insn (insn);
8615 /* Extend dependency caches by one element. */
8616 extend_dependency_caches (1, false);
8618 if (sched_pressure != SCHED_PRESSURE_NONE)
8619 init_insn_reg_pressure_info (insn);
8622 /* Init data for the new basic block BB which comes after AFTER. */
8623 static void
8624 haifa_init_only_bb (basic_block bb, basic_block after)
8626 gcc_assert (bb != NULL);
8628 sched_init_bbs ();
8630 if (common_sched_info->add_block)
8631 /* This changes only data structures of the front-end. */
8632 common_sched_info->add_block (bb, after);
8635 /* A generic version of sched_split_block (). */
8636 basic_block
8637 sched_split_block_1 (basic_block first_bb, rtx after)
8639 edge e;
8641 e = split_block (first_bb, after);
8642 gcc_assert (e->src == first_bb);
8644 /* sched_split_block emits note if *check == BB_END. Probably it
8645 is better to rip that note off. */
8647 return e->dest;
8650 /* A generic version of sched_create_empty_bb (). */
8651 basic_block
8652 sched_create_empty_bb_1 (basic_block after)
8654 return create_empty_bb (after);
8657 /* Insert PAT as an INSN into the schedule and update the necessary data
8658 structures to account for it. */
8659 rtx_insn *
8660 sched_emit_insn (rtx pat)
8662 rtx_insn *insn = emit_insn_before (pat, first_nonscheduled_insn ());
8663 haifa_init_insn (insn);
8665 if (current_sched_info->add_remove_insn)
8666 current_sched_info->add_remove_insn (insn, 0);
8668 (*current_sched_info->begin_schedule_ready) (insn);
8669 scheduled_insns.safe_push (insn);
8671 last_scheduled_insn = insn;
8672 return insn;
8675 /* This function returns a candidate satisfying dispatch constraints from
8676 the ready list. */
8678 static rtx_insn *
8679 ready_remove_first_dispatch (struct ready_list *ready)
8681 int i;
8682 rtx_insn *insn = ready_element (ready, 0);
8684 if (ready->n_ready == 1
8685 || !INSN_P (insn)
8686 || INSN_CODE (insn) < 0
8687 || !active_insn_p (insn)
8688 || targetm.sched.dispatch (insn, FITS_DISPATCH_WINDOW))
8689 return ready_remove_first (ready);
8691 for (i = 1; i < ready->n_ready; i++)
8693 insn = ready_element (ready, i);
8695 if (!INSN_P (insn)
8696 || INSN_CODE (insn) < 0
8697 || !active_insn_p (insn))
8698 continue;
8700 if (targetm.sched.dispatch (insn, FITS_DISPATCH_WINDOW))
8702 /* Return ith element of ready. */
8703 insn = ready_remove (ready, i);
8704 return insn;
8708 if (targetm.sched.dispatch (NULL, DISPATCH_VIOLATION))
8709 return ready_remove_first (ready);
8711 for (i = 1; i < ready->n_ready; i++)
8713 insn = ready_element (ready, i);
8715 if (!INSN_P (insn)
8716 || INSN_CODE (insn) < 0
8717 || !active_insn_p (insn))
8718 continue;
8720 /* Return i-th element of ready. */
8721 if (targetm.sched.dispatch (insn, IS_CMP))
8722 return ready_remove (ready, i);
8725 return ready_remove_first (ready);
8728 /* Get number of ready insn in the ready list. */
8731 number_in_ready (void)
8733 return ready.n_ready;
8736 /* Get number of ready's in the ready list. */
8738 rtx_insn *
8739 get_ready_element (int i)
8741 return ready_element (&ready, i);
8744 #endif /* INSN_SCHEDULING */