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