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