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