1 /* Instruction scheduling pass.
2 Copyright (C) 1992-2014 Free Software Foundation, Inc.
3 Contributed by Michael Tiemann (tiemann@cygnus.com) Enhanced by,
4 and currently maintained by, Jim Wilson (wilson@cygnus.com)
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
22 /* Instruction scheduling pass. This file, along with sched-deps.c,
23 contains the generic parts. The actual entry point for
24 the normal instruction scheduling pass is found in sched-rgn.c.
26 We compute insn priorities based on data dependencies. Flow
27 analysis only creates a fraction of the data-dependencies we must
28 observe: namely, only those dependencies which the combiner can be
29 expected to use. For this pass, we must therefore create the
30 remaining dependencies we need to observe: register dependencies,
31 memory dependencies, dependencies to keep function calls in order,
32 and the dependence between a conditional branch and the setting of
33 condition codes are all dealt with here.
35 The scheduler first traverses the data flow graph, starting with
36 the last instruction, and proceeding to the first, assigning values
37 to insn_priority as it goes. This sorts the instructions
38 topologically by data dependence.
40 Once priorities have been established, we order the insns using
41 list scheduling. This works as follows: starting with a list of
42 all the ready insns, and sorted according to priority number, we
43 schedule the insn from the end of the list by placing its
44 predecessors in the list according to their priority order. We
45 consider this insn scheduled by setting the pointer to the "end" of
46 the list to point to the previous insn. When an insn has no
47 predecessors, we either queue it until sufficient time has elapsed
48 or add it to the ready list. As the instructions are scheduled or
49 when stalls are introduced, the queue advances and dumps insns into
50 the ready list. When all insns down to the lowest priority have
51 been scheduled, the critical path of the basic block has been made
52 as short as possible. The remaining insns are then scheduled in
55 The following list shows the order in which we want to break ties
56 among insns in the ready list:
58 1. choose insn with the longest path to end of bb, ties
60 2. choose insn with least contribution to register pressure,
62 3. prefer in-block upon interblock motion, ties broken by
63 4. prefer useful upon speculative motion, ties broken by
64 5. choose insn with largest control flow probability, ties
66 6. choose insn with the least dependences upon the previously
67 scheduled insn, or finally
68 7 choose the insn which has the most insns dependent on it.
69 8. choose insn with lowest UID.
71 Memory references complicate matters. Only if we can be certain
72 that memory references are not part of the data dependency graph
73 (via true, anti, or output dependence), can we move operations past
74 memory references. To first approximation, reads can be done
75 independently, while writes introduce dependencies. Better
76 approximations will yield fewer dependencies.
78 Before reload, an extended analysis of interblock data dependences
79 is required for interblock scheduling. This is performed in
80 compute_block_dependences ().
82 Dependencies set up by memory references are treated in exactly the
83 same way as other dependencies, by using insn backward dependences
84 INSN_BACK_DEPS. INSN_BACK_DEPS are translated into forward dependences
85 INSN_FORW_DEPS for the purpose of forward list scheduling.
87 Having optimized the critical path, we may have also unduly
88 extended the lifetimes of some registers. If an operation requires
89 that constants be loaded into registers, it is certainly desirable
90 to load those constants as early as necessary, but no earlier.
91 I.e., it will not do to load up a bunch of registers at the
92 beginning of a basic block only to use them at the end, if they
93 could be loaded later, since this may result in excessive register
96 Note that since branches are never in basic blocks, but only end
97 basic blocks, this pass will not move branches. But that is ok,
98 since we can use GNU's delayed branch scheduling pass to take care
101 Also note that no further optimizations based on algebraic
102 identities are performed, so this pass would be a good one to
103 perform instruction splitting, such as breaking up a multiply
104 instruction into shifts and adds where that is profitable.
106 Given the memory aliasing analysis that this pass should perform,
107 it should be possible to remove redundant stores to memory, and to
108 load values from registers instead of hitting memory.
110 Before reload, speculative insns are moved only if a 'proof' exists
111 that no exception will be caused by this, and if no live registers
112 exist that inhibit the motion (live registers constraints are not
113 represented by data dependence edges).
115 This pass must update information that subsequent passes expect to
116 be correct. Namely: reg_n_refs, reg_n_sets, reg_n_deaths,
117 reg_n_calls_crossed, and reg_live_length. Also, BB_HEAD, BB_END.
119 The information in the line number notes is carefully retained by
120 this pass. Notes that refer to the starting and ending of
121 exception regions are also carefully retained by this pass. All
122 other NOTE insns are grouped in their same relative order at the
123 beginning of basic blocks and regions that have been scheduled. */
127 #include "coretypes.h"
129 #include "diagnostic-core.h"
130 #include "hard-reg-set.h"
134 #include "function.h"
136 #include "insn-config.h"
137 #include "insn-attr.h"
140 #include "sched-int.h"
142 #include "common/common-target.h"
147 #include "emit-rtl.h" /* FIXME: Can go away once crtl is moved to rtl.h. */
148 #include "hash-table.h"
149 #include "dumpfile.h"
151 #ifdef INSN_SCHEDULING
153 /* True if we do register pressure relief through live-range
155 static bool live_range_shrinkage_p
;
157 /* Switch on live range shrinkage. */
159 initialize_live_range_shrinkage (void)
161 live_range_shrinkage_p
= true;
164 /* Switch off live range shrinkage. */
166 finish_live_range_shrinkage (void)
168 live_range_shrinkage_p
= false;
171 /* issue_rate is the number of insns that can be scheduled in the same
172 machine cycle. It can be defined in the config/mach/mach.h file,
173 otherwise we set it to 1. */
177 /* This can be set to true by a backend if the scheduler should not
178 enable a DCE pass. */
181 /* The current initiation interval used when modulo scheduling. */
182 static int modulo_ii
;
184 /* The maximum number of stages we are prepared to handle. */
185 static int modulo_max_stages
;
187 /* The number of insns that exist in each iteration of the loop. We use this
188 to detect when we've scheduled all insns from the first iteration. */
189 static int modulo_n_insns
;
191 /* The current count of insns in the first iteration of the loop that have
192 already been scheduled. */
193 static int modulo_insns_scheduled
;
195 /* The maximum uid of insns from the first iteration of the loop. */
196 static int modulo_iter0_max_uid
;
198 /* The number of times we should attempt to backtrack when modulo scheduling.
199 Decreased each time we have to backtrack. */
200 static int modulo_backtracks_left
;
202 /* The stage in which the last insn from the original loop was
204 static int modulo_last_stage
;
206 /* sched-verbose controls the amount of debugging output the
207 scheduler prints. It is controlled by -fsched-verbose=N:
208 N>0 and no -DSR : the output is directed to stderr.
209 N>=10 will direct the printouts to stderr (regardless of -dSR).
211 N=2: bb's probabilities, detailed ready list info, unit/insn info.
212 N=3: rtl at abort point, control-flow, regions info.
213 N=5: dependences info. */
215 int sched_verbose
= 0;
217 /* Debugging file. All printouts are sent to dump, which is always set,
218 either to stderr, or to the dump listing file (-dRS). */
219 FILE *sched_dump
= 0;
221 /* This is a placeholder for the scheduler parameters common
222 to all schedulers. */
223 struct common_sched_info_def
*common_sched_info
;
225 #define INSN_TICK(INSN) (HID (INSN)->tick)
226 #define INSN_EXACT_TICK(INSN) (HID (INSN)->exact_tick)
227 #define INSN_TICK_ESTIMATE(INSN) (HID (INSN)->tick_estimate)
228 #define INTER_TICK(INSN) (HID (INSN)->inter_tick)
229 #define FEEDS_BACKTRACK_INSN(INSN) (HID (INSN)->feeds_backtrack_insn)
230 #define SHADOW_P(INSN) (HID (INSN)->shadow_p)
231 #define MUST_RECOMPUTE_SPEC_P(INSN) (HID (INSN)->must_recompute_spec)
232 /* Cached cost of the instruction. Use insn_cost to get cost of the
233 insn. -1 here means that the field is not initialized. */
234 #define INSN_COST(INSN) (HID (INSN)->cost)
236 /* If INSN_TICK of an instruction is equal to INVALID_TICK,
237 then it should be recalculated from scratch. */
238 #define INVALID_TICK (-(max_insn_queue_index + 1))
239 /* The minimal value of the INSN_TICK of an instruction. */
240 #define MIN_TICK (-max_insn_queue_index)
242 /* List of important notes we must keep around. This is a pointer to the
243 last element in the list. */
246 static struct spec_info_def spec_info_var
;
247 /* Description of the speculative part of the scheduling.
248 If NULL - no speculation. */
249 spec_info_t spec_info
= NULL
;
251 /* True, if recovery block was added during scheduling of current block.
252 Used to determine, if we need to fix INSN_TICKs. */
253 static bool haifa_recovery_bb_recently_added_p
;
255 /* True, if recovery block was added during this scheduling pass.
256 Used to determine if we should have empty memory pools of dependencies
257 after finishing current region. */
258 bool haifa_recovery_bb_ever_added_p
;
260 /* Counters of different types of speculative instructions. */
261 static int nr_begin_data
, nr_be_in_data
, nr_begin_control
, nr_be_in_control
;
263 /* Array used in {unlink, restore}_bb_notes. */
264 static rtx
*bb_header
= 0;
266 /* Basic block after which recovery blocks will be created. */
267 static basic_block before_recovery
;
269 /* Basic block just before the EXIT_BLOCK and after recovery, if we have
271 basic_block after_recovery
;
273 /* FALSE if we add bb to another region, so we don't need to initialize it. */
274 bool adding_bb_to_current_region_p
= true;
278 /* An instruction is ready to be scheduled when all insns preceding it
279 have already been scheduled. It is important to ensure that all
280 insns which use its result will not be executed until its result
281 has been computed. An insn is maintained in one of four structures:
283 (P) the "Pending" set of insns which cannot be scheduled until
284 their dependencies have been satisfied.
285 (Q) the "Queued" set of insns that can be scheduled when sufficient
287 (R) the "Ready" list of unscheduled, uncommitted insns.
288 (S) the "Scheduled" list of insns.
290 Initially, all insns are either "Pending" or "Ready" depending on
291 whether their dependencies are satisfied.
293 Insns move from the "Ready" list to the "Scheduled" list as they
294 are committed to the schedule. As this occurs, the insns in the
295 "Pending" list have their dependencies satisfied and move to either
296 the "Ready" list or the "Queued" set depending on whether
297 sufficient time has passed to make them ready. As time passes,
298 insns move from the "Queued" set to the "Ready" list.
300 The "Pending" list (P) are the insns in the INSN_FORW_DEPS of the
301 unscheduled insns, i.e., those that are ready, queued, and pending.
302 The "Queued" set (Q) is implemented by the variable `insn_queue'.
303 The "Ready" list (R) is implemented by the variables `ready' and
305 The "Scheduled" list (S) is the new insn chain built by this pass.
307 The transition (R->S) is implemented in the scheduling loop in
308 `schedule_block' when the best insn to schedule is chosen.
309 The transitions (P->R and P->Q) are implemented in `schedule_insn' as
310 insns move from the ready list to the scheduled list.
311 The transition (Q->R) is implemented in 'queue_to_insn' as time
312 passes or stalls are introduced. */
314 /* Implement a circular buffer to delay instructions until sufficient
315 time has passed. For the new pipeline description interface,
316 MAX_INSN_QUEUE_INDEX is a power of two minus one which is not less
317 than maximal time of instruction execution computed by genattr.c on
318 the base maximal time of functional unit reservations and getting a
319 result. This is the longest time an insn may be queued. */
321 static rtx
*insn_queue
;
322 static int q_ptr
= 0;
323 static int q_size
= 0;
324 #define NEXT_Q(X) (((X)+1) & max_insn_queue_index)
325 #define NEXT_Q_AFTER(X, C) (((X)+C) & max_insn_queue_index)
327 #define QUEUE_SCHEDULED (-3)
328 #define QUEUE_NOWHERE (-2)
329 #define QUEUE_READY (-1)
330 /* QUEUE_SCHEDULED - INSN is scheduled.
331 QUEUE_NOWHERE - INSN isn't scheduled yet and is neither in
333 QUEUE_READY - INSN is in ready list.
334 N >= 0 - INSN queued for X [where NEXT_Q_AFTER (q_ptr, X) == N] cycles. */
336 #define QUEUE_INDEX(INSN) (HID (INSN)->queue_index)
338 /* The following variable value refers for all current and future
339 reservations of the processor units. */
342 /* The following variable value is size of memory representing all
343 current and future reservations of the processor units. */
344 size_t dfa_state_size
;
346 /* The following array is used to find the best insn from ready when
347 the automaton pipeline interface is used. */
348 signed char *ready_try
= NULL
;
350 /* The ready list. */
351 struct ready_list ready
= {NULL
, 0, 0, 0, 0};
353 /* The pointer to the ready list (to be removed). */
354 static struct ready_list
*readyp
= &ready
;
356 /* Scheduling clock. */
357 static int clock_var
;
359 /* Clock at which the previous instruction was issued. */
360 static int last_clock_var
;
362 /* Set to true if, when queuing a shadow insn, we discover that it would be
363 scheduled too late. */
364 static bool must_backtrack
;
366 /* The following variable value is number of essential insns issued on
367 the current cycle. An insn is essential one if it changes the
369 int cycle_issued_insns
;
371 /* This records the actual schedule. It is built up during the main phase
372 of schedule_block, and afterwards used to reorder the insns in the RTL. */
373 static vec
<rtx
> scheduled_insns
;
375 static int may_trap_exp (const_rtx
, int);
377 /* Nonzero iff the address is comprised from at most 1 register. */
378 #define CONST_BASED_ADDRESS_P(x) \
380 || ((GET_CODE (x) == PLUS || GET_CODE (x) == MINUS \
381 || (GET_CODE (x) == LO_SUM)) \
382 && (CONSTANT_P (XEXP (x, 0)) \
383 || CONSTANT_P (XEXP (x, 1)))))
385 /* Returns a class that insn with GET_DEST(insn)=x may belong to,
386 as found by analyzing insn's expression. */
389 static int haifa_luid_for_non_insn (rtx x
);
391 /* Haifa version of sched_info hooks common to all headers. */
392 const struct common_sched_info_def haifa_common_sched_info
=
394 NULL
, /* fix_recovery_cfg */
395 NULL
, /* add_block */
396 NULL
, /* estimate_number_of_insns */
397 haifa_luid_for_non_insn
, /* luid_for_non_insn */
398 SCHED_PASS_UNKNOWN
/* sched_pass_id */
401 /* Mapping from instruction UID to its Logical UID. */
402 vec
<int> sched_luids
= vNULL
;
404 /* Next LUID to assign to an instruction. */
405 int sched_max_luid
= 1;
407 /* Haifa Instruction Data. */
408 vec
<haifa_insn_data_def
> h_i_d
= vNULL
;
410 void (* sched_init_only_bb
) (basic_block
, basic_block
);
412 /* Split block function. Different schedulers might use different functions
413 to handle their internal data consistent. */
414 basic_block (* sched_split_block
) (basic_block
, rtx
);
416 /* Create empty basic block after the specified block. */
417 basic_block (* sched_create_empty_bb
) (basic_block
);
419 /* Return the number of cycles until INSN is expected to be ready.
420 Return zero if it already is. */
422 insn_delay (rtx insn
)
424 return MAX (INSN_TICK (insn
) - clock_var
, 0);
428 may_trap_exp (const_rtx x
, int is_store
)
437 if (code
== MEM
&& may_trap_p (x
))
444 /* The insn uses memory: a volatile load. */
445 if (MEM_VOLATILE_P (x
))
447 /* An exception-free load. */
450 /* A load with 1 base register, to be further checked. */
451 if (CONST_BASED_ADDRESS_P (XEXP (x
, 0)))
452 return PFREE_CANDIDATE
;
453 /* No info on the load, to be further checked. */
454 return PRISKY_CANDIDATE
;
459 int i
, insn_class
= TRAP_FREE
;
461 /* Neither store nor load, check if it may cause a trap. */
464 /* Recursive step: walk the insn... */
465 fmt
= GET_RTX_FORMAT (code
);
466 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
470 int tmp_class
= may_trap_exp (XEXP (x
, i
), is_store
);
471 insn_class
= WORST_CLASS (insn_class
, tmp_class
);
473 else if (fmt
[i
] == 'E')
476 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
478 int tmp_class
= may_trap_exp (XVECEXP (x
, i
, j
), is_store
);
479 insn_class
= WORST_CLASS (insn_class
, tmp_class
);
480 if (insn_class
== TRAP_RISKY
|| insn_class
== IRISKY
)
484 if (insn_class
== TRAP_RISKY
|| insn_class
== IRISKY
)
491 /* Classifies rtx X of an insn for the purpose of verifying that X can be
492 executed speculatively (and consequently the insn can be moved
493 speculatively), by examining X, returning:
494 TRAP_RISKY: store, or risky non-load insn (e.g. division by variable).
495 TRAP_FREE: non-load insn.
496 IFREE: load from a globally safe location.
497 IRISKY: volatile load.
498 PFREE_CANDIDATE, PRISKY_CANDIDATE: load that need to be checked for
499 being either PFREE or PRISKY. */
502 haifa_classify_rtx (const_rtx x
)
504 int tmp_class
= TRAP_FREE
;
505 int insn_class
= TRAP_FREE
;
508 if (GET_CODE (x
) == PARALLEL
)
510 int i
, len
= XVECLEN (x
, 0);
512 for (i
= len
- 1; i
>= 0; i
--)
514 tmp_class
= haifa_classify_rtx (XVECEXP (x
, 0, i
));
515 insn_class
= WORST_CLASS (insn_class
, tmp_class
);
516 if (insn_class
== TRAP_RISKY
|| insn_class
== IRISKY
)
526 /* Test if it is a 'store'. */
527 tmp_class
= may_trap_exp (XEXP (x
, 0), 1);
530 /* Test if it is a store. */
531 tmp_class
= may_trap_exp (SET_DEST (x
), 1);
532 if (tmp_class
== TRAP_RISKY
)
534 /* Test if it is a load. */
536 WORST_CLASS (tmp_class
,
537 may_trap_exp (SET_SRC (x
), 0));
540 tmp_class
= haifa_classify_rtx (COND_EXEC_CODE (x
));
541 if (tmp_class
== TRAP_RISKY
)
543 tmp_class
= WORST_CLASS (tmp_class
,
544 may_trap_exp (COND_EXEC_TEST (x
), 0));
547 tmp_class
= TRAP_RISKY
;
551 insn_class
= tmp_class
;
558 haifa_classify_insn (const_rtx insn
)
560 return haifa_classify_rtx (PATTERN (insn
));
563 /* After the scheduler initialization function has been called, this function
564 can be called to enable modulo scheduling. II is the initiation interval
565 we should use, it affects the delays for delay_pairs that were recorded as
566 separated by a given number of stages.
568 MAX_STAGES provides us with a limit
569 after which we give up scheduling; the caller must have unrolled at least
570 as many copies of the loop body and recorded delay_pairs for them.
572 INSNS is the number of real (non-debug) insns in one iteration of
573 the loop. MAX_UID can be used to test whether an insn belongs to
574 the first iteration of the loop; all of them have a uid lower than
577 set_modulo_params (int ii
, int max_stages
, int insns
, int max_uid
)
580 modulo_max_stages
= max_stages
;
581 modulo_n_insns
= insns
;
582 modulo_iter0_max_uid
= max_uid
;
583 modulo_backtracks_left
= PARAM_VALUE (PARAM_MAX_MODULO_BACKTRACK_ATTEMPTS
);
586 /* A structure to record a pair of insns where the first one is a real
587 insn that has delay slots, and the second is its delayed shadow.
588 I1 is scheduled normally and will emit an assembly instruction,
589 while I2 describes the side effect that takes place at the
590 transition between cycles CYCLES and (CYCLES + 1) after I1. */
593 struct delay_pair
*next_same_i1
;
596 /* When doing modulo scheduling, we a delay_pair can also be used to
597 show that I1 and I2 are the same insn in a different stage. If that
598 is the case, STAGES will be nonzero. */
602 /* Helpers for delay hashing. */
604 struct delay_i1_hasher
: typed_noop_remove
<delay_pair
>
606 typedef delay_pair value_type
;
607 typedef void compare_type
;
608 static inline hashval_t
hash (const value_type
*);
609 static inline bool equal (const value_type
*, const compare_type
*);
612 /* Returns a hash value for X, based on hashing just I1. */
615 delay_i1_hasher::hash (const value_type
*x
)
617 return htab_hash_pointer (x
->i1
);
620 /* Return true if I1 of pair X is the same as that of pair Y. */
623 delay_i1_hasher::equal (const value_type
*x
, const compare_type
*y
)
628 struct delay_i2_hasher
: typed_free_remove
<delay_pair
>
630 typedef delay_pair value_type
;
631 typedef void compare_type
;
632 static inline hashval_t
hash (const value_type
*);
633 static inline bool equal (const value_type
*, const compare_type
*);
636 /* Returns a hash value for X, based on hashing just I2. */
639 delay_i2_hasher::hash (const value_type
*x
)
641 return htab_hash_pointer (x
->i2
);
644 /* Return true if I2 of pair X is the same as that of pair Y. */
647 delay_i2_hasher::equal (const value_type
*x
, const compare_type
*y
)
652 /* Two hash tables to record delay_pairs, one indexed by I1 and the other
654 static hash_table
<delay_i1_hasher
> *delay_htab
;
655 static hash_table
<delay_i2_hasher
> *delay_htab_i2
;
657 /* Called through htab_traverse. Walk the hashtable using I2 as
658 index, and delete all elements involving an UID higher than
659 that pointed to by *DATA. */
661 haifa_htab_i2_traverse (delay_pair
**slot
, int *data
)
664 struct delay_pair
*p
= *slot
;
665 if (INSN_UID (p
->i2
) >= maxuid
|| INSN_UID (p
->i1
) >= maxuid
)
667 delay_htab_i2
->clear_slot (slot
);
672 /* Called through htab_traverse. Walk the hashtable using I2 as
673 index, and delete all elements involving an UID higher than
674 that pointed to by *DATA. */
676 haifa_htab_i1_traverse (delay_pair
**pslot
, int *data
)
679 struct delay_pair
*p
, *first
, **pprev
;
681 if (INSN_UID ((*pslot
)->i1
) >= maxuid
)
683 delay_htab
->clear_slot (pslot
);
687 for (p
= *pslot
; p
; p
= p
->next_same_i1
)
689 if (INSN_UID (p
->i2
) < maxuid
)
692 pprev
= &p
->next_same_i1
;
697 delay_htab
->clear_slot (pslot
);
703 /* Discard all delay pairs which involve an insn with an UID higher
706 discard_delay_pairs_above (int max_uid
)
708 delay_htab
->traverse
<int *, haifa_htab_i1_traverse
> (&max_uid
);
709 delay_htab_i2
->traverse
<int *, haifa_htab_i2_traverse
> (&max_uid
);
712 /* This function can be called by a port just before it starts the final
713 scheduling pass. It records the fact that an instruction with delay
714 slots has been split into two insns, I1 and I2. The first one will be
715 scheduled normally and initiates the operation. The second one is a
716 shadow which must follow a specific number of cycles after I1; its only
717 purpose is to show the side effect that occurs at that cycle in the RTL.
718 If a JUMP_INSN or a CALL_INSN has been split, I1 should be a normal INSN,
719 while I2 retains the original insn type.
721 There are two ways in which the number of cycles can be specified,
722 involving the CYCLES and STAGES arguments to this function. If STAGES
723 is zero, we just use the value of CYCLES. Otherwise, STAGES is a factor
724 which is multiplied by MODULO_II to give the number of cycles. This is
725 only useful if the caller also calls set_modulo_params to enable modulo
729 record_delay_slot_pair (rtx i1
, rtx i2
, int cycles
, int stages
)
731 struct delay_pair
*p
= XNEW (struct delay_pair
);
732 struct delay_pair
**slot
;
741 delay_htab
= new hash_table
<delay_i1_hasher
> (10);
742 delay_htab_i2
= new hash_table
<delay_i2_hasher
> (10);
744 slot
= delay_htab
->find_slot_with_hash (i1
, htab_hash_pointer (i1
), INSERT
);
745 p
->next_same_i1
= *slot
;
747 slot
= delay_htab_i2
->find_slot (p
, INSERT
);
751 /* Examine the delay pair hashtable to see if INSN is a shadow for another,
752 and return the other insn if so. Return NULL otherwise. */
754 real_insn_for_shadow (rtx insn
)
756 struct delay_pair
*pair
;
761 pair
= delay_htab_i2
->find_with_hash (insn
, htab_hash_pointer (insn
));
762 if (!pair
|| pair
->stages
> 0)
767 /* For a pair P of insns, return the fixed distance in cycles from the first
768 insn after which the second must be scheduled. */
770 pair_delay (struct delay_pair
*p
)
775 return p
->stages
* modulo_ii
;
778 /* Given an insn INSN, add a dependence on its delayed shadow if it
779 has one. Also try to find situations where shadows depend on each other
780 and add dependencies to the real insns to limit the amount of backtracking
783 add_delay_dependencies (rtx insn
)
785 struct delay_pair
*pair
;
786 sd_iterator_def sd_it
;
792 pair
= delay_htab_i2
->find_with_hash (insn
, htab_hash_pointer (insn
));
795 add_dependence (insn
, pair
->i1
, REG_DEP_ANTI
);
799 FOR_EACH_DEP (pair
->i2
, SD_LIST_BACK
, sd_it
, dep
)
801 rtx pro
= DEP_PRO (dep
);
802 struct delay_pair
*other_pair
803 = delay_htab_i2
->find_with_hash (pro
, htab_hash_pointer (pro
));
804 if (!other_pair
|| other_pair
->stages
)
806 if (pair_delay (other_pair
) >= pair_delay (pair
))
808 if (sched_verbose
>= 4)
810 fprintf (sched_dump
, ";;\tadding dependence %d <- %d\n",
811 INSN_UID (other_pair
->i1
),
812 INSN_UID (pair
->i1
));
813 fprintf (sched_dump
, ";;\tpair1 %d <- %d, cost %d\n",
817 fprintf (sched_dump
, ";;\tpair2 %d <- %d, cost %d\n",
818 INSN_UID (other_pair
->i1
),
819 INSN_UID (other_pair
->i2
),
820 pair_delay (other_pair
));
822 add_dependence (pair
->i1
, other_pair
->i1
, REG_DEP_ANTI
);
827 /* Forward declarations. */
829 static int priority (rtx
);
830 static int rank_for_schedule (const void *, const void *);
831 static void swap_sort (rtx
*, int);
832 static void queue_insn (rtx
, int, const char *);
833 static int schedule_insn (rtx
);
834 static void adjust_priority (rtx
);
835 static void advance_one_cycle (void);
836 static void extend_h_i_d (void);
839 /* Notes handling mechanism:
840 =========================
841 Generally, NOTES are saved before scheduling and restored after scheduling.
842 The scheduler distinguishes between two types of notes:
844 (1) LOOP_BEGIN, LOOP_END, SETJMP, EHREGION_BEG, EHREGION_END notes:
845 Before scheduling a region, a pointer to the note is added to the insn
846 that follows or precedes it. (This happens as part of the data dependence
847 computation). After scheduling an insn, the pointer contained in it is
848 used for regenerating the corresponding note (in reemit_notes).
850 (2) All other notes (e.g. INSN_DELETED): Before scheduling a block,
851 these notes are put in a list (in rm_other_notes() and
852 unlink_other_notes ()). After scheduling the block, these notes are
853 inserted at the beginning of the block (in schedule_block()). */
855 static void ready_add (struct ready_list
*, rtx
, bool);
856 static rtx
ready_remove_first (struct ready_list
*);
857 static rtx
ready_remove_first_dispatch (struct ready_list
*ready
);
859 static void queue_to_ready (struct ready_list
*);
860 static int early_queue_to_ready (state_t
, struct ready_list
*);
862 /* The following functions are used to implement multi-pass scheduling
863 on the first cycle. */
864 static rtx
ready_remove (struct ready_list
*, int);
865 static void ready_remove_insn (rtx
);
867 static void fix_inter_tick (rtx
, rtx
);
868 static int fix_tick_ready (rtx
);
869 static void change_queue_index (rtx
, int);
871 /* The following functions are used to implement scheduling of data/control
872 speculative instructions. */
874 static void extend_h_i_d (void);
875 static void init_h_i_d (rtx
);
876 static int haifa_speculate_insn (rtx
, ds_t
, rtx
*);
877 static void generate_recovery_code (rtx
);
878 static void process_insn_forw_deps_be_in_spec (rtx
, rtx
, ds_t
);
879 static void begin_speculative_block (rtx
);
880 static void add_to_speculative_block (rtx
);
881 static void init_before_recovery (basic_block
*);
882 static void create_check_block_twin (rtx
, bool);
883 static void fix_recovery_deps (basic_block
);
884 static bool haifa_change_pattern (rtx
, rtx
);
885 static void dump_new_block_header (int, basic_block
, rtx
, rtx
);
886 static void restore_bb_notes (basic_block
);
887 static void fix_jump_move (rtx
);
888 static void move_block_after_check (rtx
);
889 static void move_succs (vec
<edge
, va_gc
> **, basic_block
);
890 static void sched_remove_insn (rtx
);
891 static void clear_priorities (rtx
, rtx_vec_t
*);
892 static void calc_priorities (rtx_vec_t
);
893 static void add_jump_dependencies (rtx
, rtx
);
895 #endif /* INSN_SCHEDULING */
897 /* Point to state used for the current scheduling pass. */
898 struct haifa_sched_info
*current_sched_info
;
900 #ifndef INSN_SCHEDULING
902 schedule_insns (void)
907 /* Do register pressure sensitive insn scheduling if the flag is set
909 enum sched_pressure_algorithm sched_pressure
;
911 /* Map regno -> its pressure class. The map defined only when
912 SCHED_PRESSURE != SCHED_PRESSURE_NONE. */
913 enum reg_class
*sched_regno_pressure_class
;
915 /* The current register pressure. Only elements corresponding pressure
916 classes are defined. */
917 static int curr_reg_pressure
[N_REG_CLASSES
];
919 /* Saved value of the previous array. */
920 static int saved_reg_pressure
[N_REG_CLASSES
];
922 /* Register living at given scheduling point. */
923 static bitmap curr_reg_live
;
925 /* Saved value of the previous array. */
926 static bitmap saved_reg_live
;
928 /* Registers mentioned in the current region. */
929 static bitmap region_ref_regs
;
931 /* Initiate register pressure relative info for scheduling the current
932 region. Currently it is only clearing register mentioned in the
935 sched_init_region_reg_pressure_info (void)
937 bitmap_clear (region_ref_regs
);
940 /* PRESSURE[CL] describes the pressure on register class CL. Update it
941 for the birth (if BIRTH_P) or death (if !BIRTH_P) of register REGNO.
942 LIVE tracks the set of live registers; if it is null, assume that
943 every birth or death is genuine. */
945 mark_regno_birth_or_death (bitmap live
, int *pressure
, int regno
, bool birth_p
)
947 enum reg_class pressure_class
;
949 pressure_class
= sched_regno_pressure_class
[regno
];
950 if (regno
>= FIRST_PSEUDO_REGISTER
)
952 if (pressure_class
!= NO_REGS
)
956 if (!live
|| bitmap_set_bit (live
, regno
))
957 pressure
[pressure_class
]
958 += (ira_reg_class_max_nregs
959 [pressure_class
][PSEUDO_REGNO_MODE (regno
)]);
963 if (!live
|| bitmap_clear_bit (live
, regno
))
964 pressure
[pressure_class
]
965 -= (ira_reg_class_max_nregs
966 [pressure_class
][PSEUDO_REGNO_MODE (regno
)]);
970 else if (pressure_class
!= NO_REGS
971 && ! TEST_HARD_REG_BIT (ira_no_alloc_regs
, regno
))
975 if (!live
|| bitmap_set_bit (live
, regno
))
976 pressure
[pressure_class
]++;
980 if (!live
|| bitmap_clear_bit (live
, regno
))
981 pressure
[pressure_class
]--;
986 /* Initiate current register pressure related info from living
987 registers given by LIVE. */
989 initiate_reg_pressure_info (bitmap live
)
995 for (i
= 0; i
< ira_pressure_classes_num
; i
++)
996 curr_reg_pressure
[ira_pressure_classes
[i
]] = 0;
997 bitmap_clear (curr_reg_live
);
998 EXECUTE_IF_SET_IN_BITMAP (live
, 0, j
, bi
)
999 if (sched_pressure
== SCHED_PRESSURE_MODEL
1000 || current_nr_blocks
== 1
1001 || bitmap_bit_p (region_ref_regs
, j
))
1002 mark_regno_birth_or_death (curr_reg_live
, curr_reg_pressure
, j
, true);
1005 /* Mark registers in X as mentioned in the current region. */
1007 setup_ref_regs (rtx x
)
1010 const RTX_CODE code
= GET_CODE (x
);
1016 if (HARD_REGISTER_NUM_P (regno
))
1017 bitmap_set_range (region_ref_regs
, regno
,
1018 hard_regno_nregs
[regno
][GET_MODE (x
)]);
1020 bitmap_set_bit (region_ref_regs
, REGNO (x
));
1023 fmt
= GET_RTX_FORMAT (code
);
1024 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
1026 setup_ref_regs (XEXP (x
, i
));
1027 else if (fmt
[i
] == 'E')
1029 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
1030 setup_ref_regs (XVECEXP (x
, i
, j
));
1034 /* Initiate current register pressure related info at the start of
1037 initiate_bb_reg_pressure_info (basic_block bb
)
1039 unsigned int i ATTRIBUTE_UNUSED
;
1042 if (current_nr_blocks
> 1)
1043 FOR_BB_INSNS (bb
, insn
)
1044 if (NONDEBUG_INSN_P (insn
))
1045 setup_ref_regs (PATTERN (insn
));
1046 initiate_reg_pressure_info (df_get_live_in (bb
));
1047 #ifdef EH_RETURN_DATA_REGNO
1048 if (bb_has_eh_pred (bb
))
1051 unsigned int regno
= EH_RETURN_DATA_REGNO (i
);
1053 if (regno
== INVALID_REGNUM
)
1055 if (! bitmap_bit_p (df_get_live_in (bb
), regno
))
1056 mark_regno_birth_or_death (curr_reg_live
, curr_reg_pressure
,
1062 /* Save current register pressure related info. */
1064 save_reg_pressure (void)
1068 for (i
= 0; i
< ira_pressure_classes_num
; i
++)
1069 saved_reg_pressure
[ira_pressure_classes
[i
]]
1070 = curr_reg_pressure
[ira_pressure_classes
[i
]];
1071 bitmap_copy (saved_reg_live
, curr_reg_live
);
1074 /* Restore saved register pressure related info. */
1076 restore_reg_pressure (void)
1080 for (i
= 0; i
< ira_pressure_classes_num
; i
++)
1081 curr_reg_pressure
[ira_pressure_classes
[i
]]
1082 = saved_reg_pressure
[ira_pressure_classes
[i
]];
1083 bitmap_copy (curr_reg_live
, saved_reg_live
);
1086 /* Return TRUE if the register is dying after its USE. */
1088 dying_use_p (struct reg_use_data
*use
)
1090 struct reg_use_data
*next
;
1092 for (next
= use
->next_regno_use
; next
!= use
; next
= next
->next_regno_use
)
1093 if (NONDEBUG_INSN_P (next
->insn
)
1094 && QUEUE_INDEX (next
->insn
) != QUEUE_SCHEDULED
)
1099 /* Print info about the current register pressure and its excess for
1100 each pressure class. */
1102 print_curr_reg_pressure (void)
1107 fprintf (sched_dump
, ";;\t");
1108 for (i
= 0; i
< ira_pressure_classes_num
; i
++)
1110 cl
= ira_pressure_classes
[i
];
1111 gcc_assert (curr_reg_pressure
[cl
] >= 0);
1112 fprintf (sched_dump
, " %s:%d(%d)", reg_class_names
[cl
],
1113 curr_reg_pressure
[cl
],
1114 curr_reg_pressure
[cl
] - ira_class_hard_regs_num
[cl
]);
1116 fprintf (sched_dump
, "\n");
1119 /* Determine if INSN has a condition that is clobbered if a register
1120 in SET_REGS is modified. */
1122 cond_clobbered_p (rtx insn
, HARD_REG_SET set_regs
)
1124 rtx pat
= PATTERN (insn
);
1125 gcc_assert (GET_CODE (pat
) == COND_EXEC
);
1126 if (TEST_HARD_REG_BIT (set_regs
, REGNO (XEXP (COND_EXEC_TEST (pat
), 0))))
1128 sd_iterator_def sd_it
;
1130 haifa_change_pattern (insn
, ORIG_PAT (insn
));
1131 FOR_EACH_DEP (insn
, SD_LIST_BACK
, sd_it
, dep
)
1132 DEP_STATUS (dep
) &= ~DEP_CANCELLED
;
1133 TODO_SPEC (insn
) = HARD_DEP
;
1134 if (sched_verbose
>= 2)
1135 fprintf (sched_dump
,
1136 ";;\t\tdequeue insn %s because of clobbered condition\n",
1137 (*current_sched_info
->print_insn
) (insn
, 0));
1144 /* This function should be called after modifying the pattern of INSN,
1145 to update scheduler data structures as needed. */
1147 update_insn_after_change (rtx insn
)
1149 sd_iterator_def sd_it
;
1152 dfa_clear_single_insn_cache (insn
);
1154 sd_it
= sd_iterator_start (insn
,
1155 SD_LIST_FORW
| SD_LIST_BACK
| SD_LIST_RES_BACK
);
1156 while (sd_iterator_cond (&sd_it
, &dep
))
1158 DEP_COST (dep
) = UNKNOWN_DEP_COST
;
1159 sd_iterator_next (&sd_it
);
1162 /* Invalidate INSN_COST, so it'll be recalculated. */
1163 INSN_COST (insn
) = -1;
1164 /* Invalidate INSN_TICK, so it'll be recalculated. */
1165 INSN_TICK (insn
) = INVALID_TICK
;
1169 /* Two VECs, one to hold dependencies for which pattern replacements
1170 need to be applied or restored at the start of the next cycle, and
1171 another to hold an integer that is either one, to apply the
1172 corresponding replacement, or zero to restore it. */
1173 static vec
<dep_t
> next_cycle_replace_deps
;
1174 static vec
<int> next_cycle_apply
;
1176 static void apply_replacement (dep_t
, bool);
1177 static void restore_pattern (dep_t
, bool);
1179 /* Look at the remaining dependencies for insn NEXT, and compute and return
1180 the TODO_SPEC value we should use for it. This is called after one of
1181 NEXT's dependencies has been resolved.
1182 We also perform pattern replacements for predication, and for broken
1183 replacement dependencies. The latter is only done if FOR_BACKTRACK is
1187 recompute_todo_spec (rtx next
, bool for_backtrack
)
1190 sd_iterator_def sd_it
;
1191 dep_t dep
, modify_dep
= NULL
;
1195 bool first_p
= true;
1197 if (sd_lists_empty_p (next
, SD_LIST_BACK
))
1198 /* NEXT has all its dependencies resolved. */
1201 if (!sd_lists_empty_p (next
, SD_LIST_HARD_BACK
))
1204 /* Now we've got NEXT with speculative deps only.
1205 1. Look at the deps to see what we have to do.
1206 2. Check if we can do 'todo'. */
1209 FOR_EACH_DEP (next
, SD_LIST_BACK
, sd_it
, dep
)
1211 rtx pro
= DEP_PRO (dep
);
1212 ds_t ds
= DEP_STATUS (dep
) & SPECULATIVE
;
1214 if (DEBUG_INSN_P (pro
) && !DEBUG_INSN_P (next
))
1227 new_ds
= ds_merge (new_ds
, ds
);
1229 else if (DEP_TYPE (dep
) == REG_DEP_CONTROL
)
1231 if (QUEUE_INDEX (pro
) != QUEUE_SCHEDULED
)
1236 DEP_STATUS (dep
) &= ~DEP_CANCELLED
;
1238 else if (DEP_REPLACE (dep
) != NULL
)
1240 if (QUEUE_INDEX (pro
) != QUEUE_SCHEDULED
)
1245 DEP_STATUS (dep
) &= ~DEP_CANCELLED
;
1249 if (n_replace
> 0 && n_control
== 0 && n_spec
== 0)
1251 if (!dbg_cnt (sched_breakdep
))
1253 FOR_EACH_DEP (next
, SD_LIST_BACK
, sd_it
, dep
)
1255 struct dep_replacement
*desc
= DEP_REPLACE (dep
);
1258 if (desc
->insn
== next
&& !for_backtrack
)
1260 gcc_assert (n_replace
== 1);
1261 apply_replacement (dep
, true);
1263 DEP_STATUS (dep
) |= DEP_CANCELLED
;
1269 else if (n_control
== 1 && n_replace
== 0 && n_spec
== 0)
1271 rtx pro
, other
, new_pat
;
1272 rtx cond
= NULL_RTX
;
1274 rtx prev
= NULL_RTX
;
1278 if ((current_sched_info
->flags
& DO_PREDICATION
) == 0
1279 || (ORIG_PAT (next
) != NULL_RTX
1280 && PREDICATED_PAT (next
) == NULL_RTX
))
1283 pro
= DEP_PRO (modify_dep
);
1284 other
= real_insn_for_shadow (pro
);
1285 if (other
!= NULL_RTX
)
1288 cond
= sched_get_reverse_condition_uncached (pro
);
1289 regno
= REGNO (XEXP (cond
, 0));
1291 /* Find the last scheduled insn that modifies the condition register.
1292 We can stop looking once we find the insn we depend on through the
1293 REG_DEP_CONTROL; if the condition register isn't modified after it,
1294 we know that it still has the right value. */
1295 if (QUEUE_INDEX (pro
) == QUEUE_SCHEDULED
)
1296 FOR_EACH_VEC_ELT_REVERSE (scheduled_insns
, i
, prev
)
1300 find_all_hard_reg_sets (prev
, &t
, true);
1301 if (TEST_HARD_REG_BIT (t
, regno
))
1306 if (ORIG_PAT (next
) == NULL_RTX
)
1308 ORIG_PAT (next
) = PATTERN (next
);
1310 new_pat
= gen_rtx_COND_EXEC (VOIDmode
, cond
, PATTERN (next
));
1311 success
= haifa_change_pattern (next
, new_pat
);
1314 PREDICATED_PAT (next
) = new_pat
;
1316 else if (PATTERN (next
) != PREDICATED_PAT (next
))
1318 bool success
= haifa_change_pattern (next
,
1319 PREDICATED_PAT (next
));
1320 gcc_assert (success
);
1322 DEP_STATUS (modify_dep
) |= DEP_CANCELLED
;
1326 if (PREDICATED_PAT (next
) != NULL_RTX
)
1328 int tick
= INSN_TICK (next
);
1329 bool success
= haifa_change_pattern (next
,
1331 INSN_TICK (next
) = tick
;
1332 gcc_assert (success
);
1335 /* We can't handle the case where there are both speculative and control
1336 dependencies, so we return HARD_DEP in such a case. Also fail if
1337 we have speculative dependencies with not enough points, or more than
1338 one control dependency. */
1339 if ((n_spec
> 0 && (n_control
> 0 || n_replace
> 0))
1341 /* Too few points? */
1342 && ds_weak (new_ds
) < spec_info
->data_weakness_cutoff
)
1350 /* Pointer to the last instruction scheduled. */
1351 static rtx last_scheduled_insn
;
1353 /* Pointer to the last nondebug instruction scheduled within the
1354 block, or the prev_head of the scheduling block. Used by
1355 rank_for_schedule, so that insns independent of the last scheduled
1356 insn will be preferred over dependent instructions. */
1357 static rtx last_nondebug_scheduled_insn
;
1359 /* Pointer that iterates through the list of unscheduled insns if we
1360 have a dbg_cnt enabled. It always points at an insn prior to the
1361 first unscheduled one. */
1362 static rtx nonscheduled_insns_begin
;
1364 /* Compute cost of executing INSN.
1365 This is the number of cycles between instruction issue and
1366 instruction results. */
1368 insn_cost (rtx insn
)
1374 if (recog_memoized (insn
) < 0)
1377 cost
= insn_default_latency (insn
);
1384 cost
= INSN_COST (insn
);
1388 /* A USE insn, or something else we don't need to
1389 understand. We can't pass these directly to
1390 result_ready_cost or insn_default_latency because it will
1391 trigger a fatal error for unrecognizable insns. */
1392 if (recog_memoized (insn
) < 0)
1394 INSN_COST (insn
) = 0;
1399 cost
= insn_default_latency (insn
);
1403 INSN_COST (insn
) = cost
;
1410 /* Compute cost of dependence LINK.
1411 This is the number of cycles between instruction issue and
1412 instruction results.
1413 ??? We also use this function to call recog_memoized on all insns. */
1415 dep_cost_1 (dep_t link
, dw_t dw
)
1417 rtx insn
= DEP_PRO (link
);
1418 rtx used
= DEP_CON (link
);
1421 if (DEP_COST (link
) != UNKNOWN_DEP_COST
)
1422 return DEP_COST (link
);
1426 struct delay_pair
*delay_entry
;
1428 = delay_htab_i2
->find_with_hash (used
, htab_hash_pointer (used
));
1431 if (delay_entry
->i1
== insn
)
1433 DEP_COST (link
) = pair_delay (delay_entry
);
1434 return DEP_COST (link
);
1439 /* A USE insn should never require the value used to be computed.
1440 This allows the computation of a function's result and parameter
1441 values to overlap the return and call. We don't care about the
1442 dependence cost when only decreasing register pressure. */
1443 if (recog_memoized (used
) < 0)
1446 recog_memoized (insn
);
1450 enum reg_note dep_type
= DEP_TYPE (link
);
1452 cost
= insn_cost (insn
);
1454 if (INSN_CODE (insn
) >= 0)
1456 if (dep_type
== REG_DEP_ANTI
)
1458 else if (dep_type
== REG_DEP_OUTPUT
)
1460 cost
= (insn_default_latency (insn
)
1461 - insn_default_latency (used
));
1465 else if (bypass_p (insn
))
1466 cost
= insn_latency (insn
, used
);
1470 if (targetm
.sched
.adjust_cost_2
)
1471 cost
= targetm
.sched
.adjust_cost_2 (used
, (int) dep_type
, insn
, cost
,
1473 else if (targetm
.sched
.adjust_cost
!= NULL
)
1475 /* This variable is used for backward compatibility with the
1477 rtx dep_cost_rtx_link
= alloc_INSN_LIST (NULL_RTX
, NULL_RTX
);
1479 /* Make it self-cycled, so that if some tries to walk over this
1480 incomplete list he/she will be caught in an endless loop. */
1481 XEXP (dep_cost_rtx_link
, 1) = dep_cost_rtx_link
;
1483 /* Targets use only REG_NOTE_KIND of the link. */
1484 PUT_REG_NOTE_KIND (dep_cost_rtx_link
, DEP_TYPE (link
));
1486 cost
= targetm
.sched
.adjust_cost (used
, dep_cost_rtx_link
,
1489 free_INSN_LIST_node (dep_cost_rtx_link
);
1496 DEP_COST (link
) = cost
;
1500 /* Compute cost of dependence LINK.
1501 This is the number of cycles between instruction issue and
1502 instruction results. */
1504 dep_cost (dep_t link
)
1506 return dep_cost_1 (link
, 0);
1509 /* Use this sel-sched.c friendly function in reorder2 instead of increasing
1510 INSN_PRIORITY explicitly. */
1512 increase_insn_priority (rtx insn
, int amount
)
1514 if (!sel_sched_p ())
1516 /* We're dealing with haifa-sched.c INSN_PRIORITY. */
1517 if (INSN_PRIORITY_KNOWN (insn
))
1518 INSN_PRIORITY (insn
) += amount
;
1522 /* In sel-sched.c INSN_PRIORITY is not kept up to date.
1523 Use EXPR_PRIORITY instead. */
1524 sel_add_to_insn_priority (insn
, amount
);
1528 /* Return 'true' if DEP should be included in priority calculations. */
1530 contributes_to_priority_p (dep_t dep
)
1532 if (DEBUG_INSN_P (DEP_CON (dep
))
1533 || DEBUG_INSN_P (DEP_PRO (dep
)))
1536 /* Critical path is meaningful in block boundaries only. */
1537 if (!current_sched_info
->contributes_to_priority (DEP_CON (dep
),
1541 if (DEP_REPLACE (dep
) != NULL
)
1544 /* If flag COUNT_SPEC_IN_CRITICAL_PATH is set,
1545 then speculative instructions will less likely be
1546 scheduled. That is because the priority of
1547 their producers will increase, and, thus, the
1548 producers will more likely be scheduled, thus,
1549 resolving the dependence. */
1550 if (sched_deps_info
->generate_spec_deps
1551 && !(spec_info
->flags
& COUNT_SPEC_IN_CRITICAL_PATH
)
1552 && (DEP_STATUS (dep
) & SPECULATIVE
))
1558 /* Compute the number of nondebug deps in list LIST for INSN. */
1561 dep_list_size (rtx insn
, sd_list_types_def list
)
1563 sd_iterator_def sd_it
;
1565 int dbgcount
= 0, nodbgcount
= 0;
1567 if (!MAY_HAVE_DEBUG_INSNS
)
1568 return sd_lists_size (insn
, list
);
1570 FOR_EACH_DEP (insn
, list
, sd_it
, dep
)
1572 if (DEBUG_INSN_P (DEP_CON (dep
)))
1574 else if (!DEBUG_INSN_P (DEP_PRO (dep
)))
1578 gcc_assert (dbgcount
+ nodbgcount
== sd_lists_size (insn
, list
));
1583 /* Compute the priority number for INSN. */
1587 if (! INSN_P (insn
))
1590 /* We should not be interested in priority of an already scheduled insn. */
1591 gcc_assert (QUEUE_INDEX (insn
) != QUEUE_SCHEDULED
);
1593 if (!INSN_PRIORITY_KNOWN (insn
))
1595 int this_priority
= -1;
1597 if (dep_list_size (insn
, SD_LIST_FORW
) == 0)
1598 /* ??? We should set INSN_PRIORITY to insn_cost when and insn has
1599 some forward deps but all of them are ignored by
1600 contributes_to_priority hook. At the moment we set priority of
1602 this_priority
= insn_cost (insn
);
1605 rtx prev_first
, twin
;
1608 /* For recovery check instructions we calculate priority slightly
1609 different than that of normal instructions. Instead of walking
1610 through INSN_FORW_DEPS (check) list, we walk through
1611 INSN_FORW_DEPS list of each instruction in the corresponding
1614 /* Selective scheduling does not define RECOVERY_BLOCK macro. */
1615 rec
= sel_sched_p () ? NULL
: RECOVERY_BLOCK (insn
);
1616 if (!rec
|| rec
== EXIT_BLOCK_PTR_FOR_FN (cfun
))
1618 prev_first
= PREV_INSN (insn
);
1623 prev_first
= NEXT_INSN (BB_HEAD (rec
));
1624 twin
= PREV_INSN (BB_END (rec
));
1629 sd_iterator_def sd_it
;
1632 FOR_EACH_DEP (twin
, SD_LIST_FORW
, sd_it
, dep
)
1637 next
= DEP_CON (dep
);
1639 if (BLOCK_FOR_INSN (next
) != rec
)
1643 if (!contributes_to_priority_p (dep
))
1647 cost
= dep_cost (dep
);
1650 struct _dep _dep1
, *dep1
= &_dep1
;
1652 init_dep (dep1
, insn
, next
, REG_DEP_ANTI
);
1654 cost
= dep_cost (dep1
);
1657 next_priority
= cost
+ priority (next
);
1659 if (next_priority
> this_priority
)
1660 this_priority
= next_priority
;
1664 twin
= PREV_INSN (twin
);
1666 while (twin
!= prev_first
);
1669 if (this_priority
< 0)
1671 gcc_assert (this_priority
== -1);
1673 this_priority
= insn_cost (insn
);
1676 INSN_PRIORITY (insn
) = this_priority
;
1677 INSN_PRIORITY_STATUS (insn
) = 1;
1680 return INSN_PRIORITY (insn
);
1683 /* Macros and functions for keeping the priority queue sorted, and
1684 dealing with queuing and dequeuing of instructions. */
1686 /* For each pressure class CL, set DEATH[CL] to the number of registers
1687 in that class that die in INSN. */
1690 calculate_reg_deaths (rtx insn
, int *death
)
1693 struct reg_use_data
*use
;
1695 for (i
= 0; i
< ira_pressure_classes_num
; i
++)
1696 death
[ira_pressure_classes
[i
]] = 0;
1697 for (use
= INSN_REG_USE_LIST (insn
); use
!= NULL
; use
= use
->next_insn_use
)
1698 if (dying_use_p (use
))
1699 mark_regno_birth_or_death (0, death
, use
->regno
, true);
1702 /* Setup info about the current register pressure impact of scheduling
1703 INSN at the current scheduling point. */
1705 setup_insn_reg_pressure_info (rtx insn
)
1707 int i
, change
, before
, after
, hard_regno
;
1708 int excess_cost_change
;
1709 enum machine_mode mode
;
1711 struct reg_pressure_data
*pressure_info
;
1712 int *max_reg_pressure
;
1713 static int death
[N_REG_CLASSES
];
1715 gcc_checking_assert (!DEBUG_INSN_P (insn
));
1717 excess_cost_change
= 0;
1718 calculate_reg_deaths (insn
, death
);
1719 pressure_info
= INSN_REG_PRESSURE (insn
);
1720 max_reg_pressure
= INSN_MAX_REG_PRESSURE (insn
);
1721 gcc_assert (pressure_info
!= NULL
&& max_reg_pressure
!= NULL
);
1722 for (i
= 0; i
< ira_pressure_classes_num
; i
++)
1724 cl
= ira_pressure_classes
[i
];
1725 gcc_assert (curr_reg_pressure
[cl
] >= 0);
1726 change
= (int) pressure_info
[i
].set_increase
- death
[cl
];
1727 before
= MAX (0, max_reg_pressure
[i
] - ira_class_hard_regs_num
[cl
]);
1728 after
= MAX (0, max_reg_pressure
[i
] + change
1729 - ira_class_hard_regs_num
[cl
]);
1730 hard_regno
= ira_class_hard_regs
[cl
][0];
1731 gcc_assert (hard_regno
>= 0);
1732 mode
= reg_raw_mode
[hard_regno
];
1733 excess_cost_change
+= ((after
- before
)
1734 * (ira_memory_move_cost
[mode
][cl
][0]
1735 + ira_memory_move_cost
[mode
][cl
][1]));
1737 INSN_REG_PRESSURE_EXCESS_COST_CHANGE (insn
) = excess_cost_change
;
1740 /* This is the first page of code related to SCHED_PRESSURE_MODEL.
1741 It tries to make the scheduler take register pressure into account
1742 without introducing too many unnecessary stalls. It hooks into the
1743 main scheduling algorithm at several points:
1745 - Before scheduling starts, model_start_schedule constructs a
1746 "model schedule" for the current block. This model schedule is
1747 chosen solely to keep register pressure down. It does not take the
1748 target's pipeline or the original instruction order into account,
1749 except as a tie-breaker. It also doesn't work to a particular
1752 This model schedule gives us an idea of what pressure can be
1753 achieved for the block and gives us an example of a schedule that
1754 keeps to that pressure. It also makes the final schedule less
1755 dependent on the original instruction order. This is important
1756 because the original order can either be "wide" (many values live
1757 at once, such as in user-scheduled code) or "narrow" (few values
1758 live at once, such as after loop unrolling, where several
1759 iterations are executed sequentially).
1761 We do not apply this model schedule to the rtx stream. We simply
1762 record it in model_schedule. We also compute the maximum pressure,
1763 MP, that was seen during this schedule.
1765 - Instructions are added to the ready queue even if they require
1766 a stall. The length of the stall is instead computed as:
1768 MAX (INSN_TICK (INSN) - clock_var, 0)
1770 (= insn_delay). This allows rank_for_schedule to choose between
1771 introducing a deliberate stall or increasing pressure.
1773 - Before sorting the ready queue, model_set_excess_costs assigns
1774 a pressure-based cost to each ready instruction in the queue.
1775 This is the instruction's INSN_REG_PRESSURE_EXCESS_COST_CHANGE
1776 (ECC for short) and is effectively measured in cycles.
1778 - rank_for_schedule ranks instructions based on:
1780 ECC (insn) + insn_delay (insn)
1786 So, for example, an instruction X1 with an ECC of 1 that can issue
1787 now will win over an instruction X0 with an ECC of zero that would
1788 introduce a stall of one cycle. However, an instruction X2 with an
1789 ECC of 2 that can issue now will lose to both X0 and X1.
1791 - When an instruction is scheduled, model_recompute updates the model
1792 schedule with the new pressures (some of which might now exceed the
1793 original maximum pressure MP). model_update_limit_points then searches
1794 for the new point of maximum pressure, if not already known. */
1796 /* Used to separate high-verbosity debug information for SCHED_PRESSURE_MODEL
1797 from surrounding debug information. */
1799 ";;\t\t+------------------------------------------------------\n"
1801 /* Information about the pressure on a particular register class at a
1802 particular point of the model schedule. */
1803 struct model_pressure_data
{
1804 /* The pressure at this point of the model schedule, or -1 if the
1805 point is associated with an instruction that has already been
1809 /* The maximum pressure during or after this point of the model schedule. */
1813 /* Per-instruction information that is used while building the model
1814 schedule. Here, "schedule" refers to the model schedule rather
1815 than the main schedule. */
1816 struct model_insn_info
{
1817 /* The instruction itself. */
1820 /* If this instruction is in model_worklist, these fields link to the
1821 previous (higher-priority) and next (lower-priority) instructions
1823 struct model_insn_info
*prev
;
1824 struct model_insn_info
*next
;
1826 /* While constructing the schedule, QUEUE_INDEX describes whether an
1827 instruction has already been added to the schedule (QUEUE_SCHEDULED),
1828 is in model_worklist (QUEUE_READY), or neither (QUEUE_NOWHERE).
1829 old_queue records the value that QUEUE_INDEX had before scheduling
1830 started, so that we can restore it once the schedule is complete. */
1833 /* The relative importance of an unscheduled instruction. Higher
1834 values indicate greater importance. */
1835 unsigned int model_priority
;
1837 /* The length of the longest path of satisfied true dependencies
1838 that leads to this instruction. */
1841 /* The length of the longest path of dependencies of any kind
1842 that leads from this instruction. */
1845 /* The number of predecessor nodes that must still be scheduled. */
1846 int unscheduled_preds
;
1849 /* Information about the pressure limit for a particular register class.
1850 This structure is used when applying a model schedule to the main
1852 struct model_pressure_limit
{
1853 /* The maximum register pressure seen in the original model schedule. */
1856 /* The maximum register pressure seen in the current model schedule
1857 (which excludes instructions that have already been scheduled). */
1860 /* The point of the current model schedule at which PRESSURE is first
1861 reached. It is set to -1 if the value needs to be recomputed. */
1865 /* Describes a particular way of measuring register pressure. */
1866 struct model_pressure_group
{
1867 /* Index PCI describes the maximum pressure on ira_pressure_classes[PCI]. */
1868 struct model_pressure_limit limits
[N_REG_CLASSES
];
1870 /* Index (POINT * ira_num_pressure_classes + PCI) describes the pressure
1871 on register class ira_pressure_classes[PCI] at point POINT of the
1872 current model schedule. A POINT of model_num_insns describes the
1873 pressure at the end of the schedule. */
1874 struct model_pressure_data
*model
;
1877 /* Index POINT gives the instruction at point POINT of the model schedule.
1878 This array doesn't change during main scheduling. */
1879 static vec
<rtx
> model_schedule
;
1881 /* The list of instructions in the model worklist, sorted in order of
1882 decreasing priority. */
1883 static struct model_insn_info
*model_worklist
;
1885 /* Index I describes the instruction with INSN_LUID I. */
1886 static struct model_insn_info
*model_insns
;
1888 /* The number of instructions in the model schedule. */
1889 static int model_num_insns
;
1891 /* The index of the first instruction in model_schedule that hasn't yet been
1892 added to the main schedule, or model_num_insns if all of them have. */
1893 static int model_curr_point
;
1895 /* Describes the pressure before each instruction in the model schedule. */
1896 static struct model_pressure_group model_before_pressure
;
1898 /* The first unused model_priority value (as used in model_insn_info). */
1899 static unsigned int model_next_priority
;
1902 /* The model_pressure_data for ira_pressure_classes[PCI] in GROUP
1903 at point POINT of the model schedule. */
1904 #define MODEL_PRESSURE_DATA(GROUP, POINT, PCI) \
1905 (&(GROUP)->model[(POINT) * ira_pressure_classes_num + (PCI)])
1907 /* The maximum pressure on ira_pressure_classes[PCI] in GROUP at or
1908 after point POINT of the model schedule. */
1909 #define MODEL_MAX_PRESSURE(GROUP, POINT, PCI) \
1910 (MODEL_PRESSURE_DATA (GROUP, POINT, PCI)->max_pressure)
1912 /* The pressure on ira_pressure_classes[PCI] in GROUP at point POINT
1913 of the model schedule. */
1914 #define MODEL_REF_PRESSURE(GROUP, POINT, PCI) \
1915 (MODEL_PRESSURE_DATA (GROUP, POINT, PCI)->ref_pressure)
1917 /* Information about INSN that is used when creating the model schedule. */
1918 #define MODEL_INSN_INFO(INSN) \
1919 (&model_insns[INSN_LUID (INSN)])
1921 /* The instruction at point POINT of the model schedule. */
1922 #define MODEL_INSN(POINT) \
1923 (model_schedule[POINT])
1926 /* Return INSN's index in the model schedule, or model_num_insns if it
1927 doesn't belong to that schedule. */
1930 model_index (rtx insn
)
1932 if (INSN_MODEL_INDEX (insn
) == 0)
1933 return model_num_insns
;
1934 return INSN_MODEL_INDEX (insn
) - 1;
1937 /* Make sure that GROUP->limits is up-to-date for the current point
1938 of the model schedule. */
1941 model_update_limit_points_in_group (struct model_pressure_group
*group
)
1943 int pci
, max_pressure
, point
;
1945 for (pci
= 0; pci
< ira_pressure_classes_num
; pci
++)
1947 /* We may have passed the final point at which the pressure in
1948 group->limits[pci].pressure was reached. Update the limit if so. */
1949 max_pressure
= MODEL_MAX_PRESSURE (group
, model_curr_point
, pci
);
1950 group
->limits
[pci
].pressure
= max_pressure
;
1952 /* Find the point at which MAX_PRESSURE is first reached. We need
1953 to search in three cases:
1955 - We've already moved past the previous pressure point.
1956 In this case we search forward from model_curr_point.
1958 - We scheduled the previous point of maximum pressure ahead of
1959 its position in the model schedule, but doing so didn't bring
1960 the pressure point earlier. In this case we search forward
1961 from that previous pressure point.
1963 - Scheduling an instruction early caused the maximum pressure
1964 to decrease. In this case we will have set the pressure
1965 point to -1, and we search forward from model_curr_point. */
1966 point
= MAX (group
->limits
[pci
].point
, model_curr_point
);
1967 while (point
< model_num_insns
1968 && MODEL_REF_PRESSURE (group
, point
, pci
) < max_pressure
)
1970 group
->limits
[pci
].point
= point
;
1972 gcc_assert (MODEL_REF_PRESSURE (group
, point
, pci
) == max_pressure
);
1973 gcc_assert (MODEL_MAX_PRESSURE (group
, point
, pci
) == max_pressure
);
1977 /* Make sure that all register-pressure limits are up-to-date for the
1978 current position in the model schedule. */
1981 model_update_limit_points (void)
1983 model_update_limit_points_in_group (&model_before_pressure
);
1986 /* Return the model_index of the last unscheduled use in chain USE
1987 outside of USE's instruction. Return -1 if there are no other uses,
1988 or model_num_insns if the register is live at the end of the block. */
1991 model_last_use_except (struct reg_use_data
*use
)
1993 struct reg_use_data
*next
;
1997 for (next
= use
->next_regno_use
; next
!= use
; next
= next
->next_regno_use
)
1998 if (NONDEBUG_INSN_P (next
->insn
)
1999 && QUEUE_INDEX (next
->insn
) != QUEUE_SCHEDULED
)
2001 index
= model_index (next
->insn
);
2002 if (index
== model_num_insns
)
2003 return model_num_insns
;
2010 /* An instruction with model_index POINT has just been scheduled, and it
2011 adds DELTA to the pressure on ira_pressure_classes[PCI] after POINT - 1.
2012 Update MODEL_REF_PRESSURE (GROUP, POINT, PCI) and
2013 MODEL_MAX_PRESSURE (GROUP, POINT, PCI) accordingly. */
2016 model_start_update_pressure (struct model_pressure_group
*group
,
2017 int point
, int pci
, int delta
)
2019 int next_max_pressure
;
2021 if (point
== model_num_insns
)
2023 /* The instruction wasn't part of the model schedule; it was moved
2024 from a different block. Update the pressure for the end of
2025 the model schedule. */
2026 MODEL_REF_PRESSURE (group
, point
, pci
) += delta
;
2027 MODEL_MAX_PRESSURE (group
, point
, pci
) += delta
;
2031 /* Record that this instruction has been scheduled. Nothing now
2032 changes between POINT and POINT + 1, so get the maximum pressure
2033 from the latter. If the maximum pressure decreases, the new
2034 pressure point may be before POINT. */
2035 MODEL_REF_PRESSURE (group
, point
, pci
) = -1;
2036 next_max_pressure
= MODEL_MAX_PRESSURE (group
, point
+ 1, pci
);
2037 if (MODEL_MAX_PRESSURE (group
, point
, pci
) > next_max_pressure
)
2039 MODEL_MAX_PRESSURE (group
, point
, pci
) = next_max_pressure
;
2040 if (group
->limits
[pci
].point
== point
)
2041 group
->limits
[pci
].point
= -1;
2046 /* Record that scheduling a later instruction has changed the pressure
2047 at point POINT of the model schedule by DELTA (which might be 0).
2048 Update GROUP accordingly. Return nonzero if these changes might
2049 trigger changes to previous points as well. */
2052 model_update_pressure (struct model_pressure_group
*group
,
2053 int point
, int pci
, int delta
)
2055 int ref_pressure
, max_pressure
, next_max_pressure
;
2057 /* If POINT hasn't yet been scheduled, update its pressure. */
2058 ref_pressure
= MODEL_REF_PRESSURE (group
, point
, pci
);
2059 if (ref_pressure
>= 0 && delta
!= 0)
2061 ref_pressure
+= delta
;
2062 MODEL_REF_PRESSURE (group
, point
, pci
) = ref_pressure
;
2064 /* Check whether the maximum pressure in the overall schedule
2065 has increased. (This means that the MODEL_MAX_PRESSURE of
2066 every point <= POINT will need to increae too; see below.) */
2067 if (group
->limits
[pci
].pressure
< ref_pressure
)
2068 group
->limits
[pci
].pressure
= ref_pressure
;
2070 /* If we are at maximum pressure, and the maximum pressure
2071 point was previously unknown or later than POINT,
2072 bring it forward. */
2073 if (group
->limits
[pci
].pressure
== ref_pressure
2074 && !IN_RANGE (group
->limits
[pci
].point
, 0, point
))
2075 group
->limits
[pci
].point
= point
;
2077 /* If POINT used to be the point of maximum pressure, but isn't
2078 any longer, we need to recalculate it using a forward walk. */
2079 if (group
->limits
[pci
].pressure
> ref_pressure
2080 && group
->limits
[pci
].point
== point
)
2081 group
->limits
[pci
].point
= -1;
2084 /* Update the maximum pressure at POINT. Changes here might also
2085 affect the maximum pressure at POINT - 1. */
2086 next_max_pressure
= MODEL_MAX_PRESSURE (group
, point
+ 1, pci
);
2087 max_pressure
= MAX (ref_pressure
, next_max_pressure
);
2088 if (MODEL_MAX_PRESSURE (group
, point
, pci
) != max_pressure
)
2090 MODEL_MAX_PRESSURE (group
, point
, pci
) = max_pressure
;
2096 /* INSN has just been scheduled. Update the model schedule accordingly. */
2099 model_recompute (rtx insn
)
2104 } uses
[FIRST_PSEUDO_REGISTER
+ MAX_RECOG_OPERANDS
];
2105 struct reg_use_data
*use
;
2106 struct reg_pressure_data
*reg_pressure
;
2107 int delta
[N_REG_CLASSES
];
2108 int pci
, point
, mix
, new_last
, cl
, ref_pressure
, queue
;
2109 unsigned int i
, num_uses
, num_pending_births
;
2112 /* The destinations of INSN were previously live from POINT onwards, but are
2113 now live from model_curr_point onwards. Set up DELTA accordingly. */
2114 point
= model_index (insn
);
2115 reg_pressure
= INSN_REG_PRESSURE (insn
);
2116 for (pci
= 0; pci
< ira_pressure_classes_num
; pci
++)
2118 cl
= ira_pressure_classes
[pci
];
2119 delta
[cl
] = reg_pressure
[pci
].set_increase
;
2122 /* Record which registers previously died at POINT, but which now die
2123 before POINT. Adjust DELTA so that it represents the effect of
2124 this change after POINT - 1. Set NUM_PENDING_BIRTHS to the number of
2125 registers that will be born in the range [model_curr_point, POINT). */
2127 num_pending_births
= 0;
2128 for (use
= INSN_REG_USE_LIST (insn
); use
!= NULL
; use
= use
->next_insn_use
)
2130 new_last
= model_last_use_except (use
);
2131 if (new_last
< point
)
2133 gcc_assert (num_uses
< ARRAY_SIZE (uses
));
2134 uses
[num_uses
].last_use
= new_last
;
2135 uses
[num_uses
].regno
= use
->regno
;
2136 /* This register is no longer live after POINT - 1. */
2137 mark_regno_birth_or_death (NULL
, delta
, use
->regno
, false);
2140 num_pending_births
++;
2144 /* Update the MODEL_REF_PRESSURE and MODEL_MAX_PRESSURE for POINT.
2145 Also set each group pressure limit for POINT. */
2146 for (pci
= 0; pci
< ira_pressure_classes_num
; pci
++)
2148 cl
= ira_pressure_classes
[pci
];
2149 model_start_update_pressure (&model_before_pressure
,
2150 point
, pci
, delta
[cl
]);
2153 /* Walk the model schedule backwards, starting immediately before POINT. */
2155 if (point
!= model_curr_point
)
2159 insn
= MODEL_INSN (point
);
2160 queue
= QUEUE_INDEX (insn
);
2162 if (queue
!= QUEUE_SCHEDULED
)
2164 /* DELTA describes the effect of the move on the register pressure
2165 after POINT. Make it describe the effect on the pressure
2168 while (i
< num_uses
)
2170 if (uses
[i
].last_use
== point
)
2172 /* This register is now live again. */
2173 mark_regno_birth_or_death (NULL
, delta
,
2174 uses
[i
].regno
, true);
2176 /* Remove this use from the array. */
2177 uses
[i
] = uses
[num_uses
- 1];
2179 num_pending_births
--;
2185 if (sched_verbose
>= 5)
2189 fprintf (sched_dump
, MODEL_BAR
);
2190 fprintf (sched_dump
, ";;\t\t| New pressure for model"
2192 fprintf (sched_dump
, MODEL_BAR
);
2196 fprintf (sched_dump
, ";;\t\t| %3d %4d %-30s ",
2197 point
, INSN_UID (insn
),
2198 str_pattern_slim (PATTERN (insn
)));
2199 for (pci
= 0; pci
< ira_pressure_classes_num
; pci
++)
2201 cl
= ira_pressure_classes
[pci
];
2202 ref_pressure
= MODEL_REF_PRESSURE (&model_before_pressure
,
2204 fprintf (sched_dump
, " %s:[%d->%d]",
2205 reg_class_names
[ira_pressure_classes
[pci
]],
2206 ref_pressure
, ref_pressure
+ delta
[cl
]);
2208 fprintf (sched_dump
, "\n");
2212 /* Adjust the pressure at POINT. Set MIX to nonzero if POINT - 1
2213 might have changed as well. */
2214 mix
= num_pending_births
;
2215 for (pci
= 0; pci
< ira_pressure_classes_num
; pci
++)
2217 cl
= ira_pressure_classes
[pci
];
2219 mix
|= model_update_pressure (&model_before_pressure
,
2220 point
, pci
, delta
[cl
]);
2223 while (mix
&& point
> model_curr_point
);
2226 fprintf (sched_dump
, MODEL_BAR
);
2229 /* After DEP, which was cancelled, has been resolved for insn NEXT,
2230 check whether the insn's pattern needs restoring. */
2232 must_restore_pattern_p (rtx next
, dep_t dep
)
2234 if (QUEUE_INDEX (next
) == QUEUE_SCHEDULED
)
2237 if (DEP_TYPE (dep
) == REG_DEP_CONTROL
)
2239 gcc_assert (ORIG_PAT (next
) != NULL_RTX
);
2240 gcc_assert (next
== DEP_CON (dep
));
2244 struct dep_replacement
*desc
= DEP_REPLACE (dep
);
2245 if (desc
->insn
!= next
)
2247 gcc_assert (*desc
->loc
== desc
->orig
);
2254 /* model_spill_cost (CL, P, P') returns the cost of increasing the
2255 pressure on CL from P to P'. We use this to calculate a "base ECC",
2256 baseECC (CL, X), for each pressure class CL and each instruction X.
2257 Supposing X changes the pressure on CL from P to P', and that the
2258 maximum pressure on CL in the current model schedule is MP', then:
2260 * if X occurs before or at the next point of maximum pressure in
2261 the model schedule and P' > MP', then:
2263 baseECC (CL, X) = model_spill_cost (CL, MP, P')
2265 The idea is that the pressure after scheduling a fixed set of
2266 instructions -- in this case, the set up to and including the
2267 next maximum pressure point -- is going to be the same regardless
2268 of the order; we simply want to keep the intermediate pressure
2269 under control. Thus X has a cost of zero unless scheduling it
2270 now would exceed MP'.
2272 If all increases in the set are by the same amount, no zero-cost
2273 instruction will ever cause the pressure to exceed MP'. However,
2274 if X is instead moved past an instruction X' with pressure in the
2275 range (MP' - (P' - P), MP'), the pressure at X' will increase
2276 beyond MP'. Since baseECC is very much a heuristic anyway,
2277 it doesn't seem worth the overhead of tracking cases like these.
2279 The cost of exceeding MP' is always based on the original maximum
2280 pressure MP. This is so that going 2 registers over the original
2281 limit has the same cost regardless of whether it comes from two
2282 separate +1 deltas or from a single +2 delta.
2284 * if X occurs after the next point of maximum pressure in the model
2285 schedule and P' > P, then:
2287 baseECC (CL, X) = model_spill_cost (CL, MP, MP' + (P' - P))
2289 That is, if we move X forward across a point of maximum pressure,
2290 and if X increases the pressure by P' - P, then we conservatively
2291 assume that scheduling X next would increase the maximum pressure
2292 by P' - P. Again, the cost of doing this is based on the original
2293 maximum pressure MP, for the same reason as above.
2295 * if P' < P, P > MP, and X occurs at or after the next point of
2296 maximum pressure, then:
2298 baseECC (CL, X) = -model_spill_cost (CL, MAX (MP, P'), P)
2300 That is, if we have already exceeded the original maximum pressure MP,
2301 and if X might reduce the maximum pressure again -- or at least push
2302 it further back, and thus allow more scheduling freedom -- it is given
2303 a negative cost to reflect the improvement.
2309 In this case, X is not expected to affect the maximum pressure MP',
2310 so it has zero cost.
2312 We then create a combined value baseECC (X) that is the sum of
2313 baseECC (CL, X) for each pressure class CL.
2315 baseECC (X) could itself be used as the ECC value described above.
2316 However, this is often too conservative, in the sense that it
2317 tends to make high-priority instructions that increase pressure
2318 wait too long in cases where introducing a spill would be better.
2319 For this reason the final ECC is a priority-adjusted form of
2320 baseECC (X). Specifically, we calculate:
2322 P (X) = INSN_PRIORITY (X) - insn_delay (X) - baseECC (X)
2323 baseP = MAX { P (X) | baseECC (X) <= 0 }
2327 ECC (X) = MAX (MIN (baseP - P (X), baseECC (X)), 0)
2329 Thus an instruction's effect on pressure is ignored if it has a high
2330 enough priority relative to the ones that don't increase pressure.
2331 Negative values of baseECC (X) do not increase the priority of X
2332 itself, but they do make it harder for other instructions to
2333 increase the pressure further.
2335 This pressure cost is deliberately timid. The intention has been
2336 to choose a heuristic that rarely interferes with the normal list
2337 scheduler in cases where that scheduler would produce good code.
2338 We simply want to curb some of its worst excesses. */
2340 /* Return the cost of increasing the pressure in class CL from FROM to TO.
2342 Here we use the very simplistic cost model that every register above
2343 ira_class_hard_regs_num[CL] has a spill cost of 1. We could use other
2344 measures instead, such as one based on MEMORY_MOVE_COST. However:
2346 (1) In order for an instruction to be scheduled, the higher cost
2347 would need to be justified in a single saving of that many stalls.
2348 This is overly pessimistic, because the benefit of spilling is
2349 often to avoid a sequence of several short stalls rather than
2352 (2) The cost is still arbitrary. Because we are not allocating
2353 registers during scheduling, we have no way of knowing for
2354 sure how many memory accesses will be required by each spill,
2355 where the spills will be placed within the block, or even
2356 which block(s) will contain the spills.
2358 So a higher cost than 1 is often too conservative in practice,
2359 forcing blocks to contain unnecessary stalls instead of spill code.
2360 The simple cost below seems to be the best compromise. It reduces
2361 the interference with the normal list scheduler, which helps make
2362 it more suitable for a default-on option. */
2365 model_spill_cost (int cl
, int from
, int to
)
2367 from
= MAX (from
, ira_class_hard_regs_num
[cl
]);
2368 return MAX (to
, from
) - from
;
2371 /* Return baseECC (ira_pressure_classes[PCI], POINT), given that
2372 P = curr_reg_pressure[ira_pressure_classes[PCI]] and that
2376 model_excess_group_cost (struct model_pressure_group
*group
,
2377 int point
, int pci
, int delta
)
2381 cl
= ira_pressure_classes
[pci
];
2382 if (delta
< 0 && point
>= group
->limits
[pci
].point
)
2384 pressure
= MAX (group
->limits
[pci
].orig_pressure
,
2385 curr_reg_pressure
[cl
] + delta
);
2386 return -model_spill_cost (cl
, pressure
, curr_reg_pressure
[cl
]);
2391 if (point
> group
->limits
[pci
].point
)
2392 pressure
= group
->limits
[pci
].pressure
+ delta
;
2394 pressure
= curr_reg_pressure
[cl
] + delta
;
2396 if (pressure
> group
->limits
[pci
].pressure
)
2397 return model_spill_cost (cl
, group
->limits
[pci
].orig_pressure
,
2404 /* Return baseECC (MODEL_INSN (INSN)). Dump the costs to sched_dump
2408 model_excess_cost (rtx insn
, bool print_p
)
2410 int point
, pci
, cl
, cost
, this_cost
, delta
;
2411 struct reg_pressure_data
*insn_reg_pressure
;
2412 int insn_death
[N_REG_CLASSES
];
2414 calculate_reg_deaths (insn
, insn_death
);
2415 point
= model_index (insn
);
2416 insn_reg_pressure
= INSN_REG_PRESSURE (insn
);
2420 fprintf (sched_dump
, ";;\t\t| %3d %4d | %4d %+3d |", point
,
2421 INSN_UID (insn
), INSN_PRIORITY (insn
), insn_delay (insn
));
2423 /* Sum up the individual costs for each register class. */
2424 for (pci
= 0; pci
< ira_pressure_classes_num
; pci
++)
2426 cl
= ira_pressure_classes
[pci
];
2427 delta
= insn_reg_pressure
[pci
].set_increase
- insn_death
[cl
];
2428 this_cost
= model_excess_group_cost (&model_before_pressure
,
2432 fprintf (sched_dump
, " %s:[%d base cost %d]",
2433 reg_class_names
[cl
], delta
, this_cost
);
2437 fprintf (sched_dump
, "\n");
2442 /* Dump the next points of maximum pressure for GROUP. */
2445 model_dump_pressure_points (struct model_pressure_group
*group
)
2449 fprintf (sched_dump
, ";;\t\t| pressure points");
2450 for (pci
= 0; pci
< ira_pressure_classes_num
; pci
++)
2452 cl
= ira_pressure_classes
[pci
];
2453 fprintf (sched_dump
, " %s:[%d->%d at ", reg_class_names
[cl
],
2454 curr_reg_pressure
[cl
], group
->limits
[pci
].pressure
);
2455 if (group
->limits
[pci
].point
< model_num_insns
)
2456 fprintf (sched_dump
, "%d:%d]", group
->limits
[pci
].point
,
2457 INSN_UID (MODEL_INSN (group
->limits
[pci
].point
)));
2459 fprintf (sched_dump
, "end]");
2461 fprintf (sched_dump
, "\n");
2464 /* Set INSN_REG_PRESSURE_EXCESS_COST_CHANGE for INSNS[0...COUNT-1]. */
2467 model_set_excess_costs (rtx
*insns
, int count
)
2469 int i
, cost
, priority_base
, priority
;
2472 /* Record the baseECC value for each instruction in the model schedule,
2473 except that negative costs are converted to zero ones now rather thatn
2474 later. Do not assign a cost to debug instructions, since they must
2475 not change code-generation decisions. Experiments suggest we also
2476 get better results by not assigning a cost to instructions from
2479 Set PRIORITY_BASE to baseP in the block comment above. This is the
2480 maximum priority of the "cheap" instructions, which should always
2481 include the next model instruction. */
2484 for (i
= 0; i
< count
; i
++)
2485 if (INSN_MODEL_INDEX (insns
[i
]))
2487 if (sched_verbose
>= 6 && !print_p
)
2489 fprintf (sched_dump
, MODEL_BAR
);
2490 fprintf (sched_dump
, ";;\t\t| Pressure costs for ready queue\n");
2491 model_dump_pressure_points (&model_before_pressure
);
2492 fprintf (sched_dump
, MODEL_BAR
);
2495 cost
= model_excess_cost (insns
[i
], print_p
);
2498 priority
= INSN_PRIORITY (insns
[i
]) - insn_delay (insns
[i
]) - cost
;
2499 priority_base
= MAX (priority_base
, priority
);
2502 INSN_REG_PRESSURE_EXCESS_COST_CHANGE (insns
[i
]) = cost
;
2505 fprintf (sched_dump
, MODEL_BAR
);
2507 /* Use MAX (baseECC, 0) and baseP to calculcate ECC for each
2509 for (i
= 0; i
< count
; i
++)
2511 cost
= INSN_REG_PRESSURE_EXCESS_COST_CHANGE (insns
[i
]);
2512 priority
= INSN_PRIORITY (insns
[i
]) - insn_delay (insns
[i
]);
2513 if (cost
> 0 && priority
> priority_base
)
2515 cost
+= priority_base
- priority
;
2516 INSN_REG_PRESSURE_EXCESS_COST_CHANGE (insns
[i
]) = MAX (cost
, 0);
2522 /* Enum of rank_for_schedule heuristic decisions. */
2524 RFS_DEBUG
, RFS_LIVE_RANGE_SHRINK1
, RFS_LIVE_RANGE_SHRINK2
,
2525 RFS_SCHED_GROUP
, RFS_PRESSURE_DELAY
, RFS_PRESSURE_TICK
,
2526 RFS_FEEDS_BACKTRACK_INSN
, RFS_PRIORITY
, RFS_SPECULATION
,
2527 RFS_SCHED_RANK
, RFS_LAST_INSN
, RFS_PRESSURE_INDEX
,
2528 RFS_DEP_COUNT
, RFS_TIE
, RFS_N
};
2530 /* Corresponding strings for print outs. */
2531 static const char *rfs_str
[RFS_N
] = {
2532 "RFS_DEBUG", "RFS_LIVE_RANGE_SHRINK1", "RFS_LIVE_RANGE_SHRINK2",
2533 "RFS_SCHED_GROUP", "RFS_PRESSURE_DELAY", "RFS_PRESSURE_TICK",
2534 "RFS_FEEDS_BACKTRACK_INSN", "RFS_PRIORITY", "RFS_SPECULATION",
2535 "RFS_SCHED_RANK", "RFS_LAST_INSN", "RFS_PRESSURE_INDEX",
2536 "RFS_DEP_COUNT", "RFS_TIE" };
2538 /* Statistical breakdown of rank_for_schedule decisions. */
2539 typedef struct { unsigned stats
[RFS_N
]; } rank_for_schedule_stats_t
;
2540 static rank_for_schedule_stats_t rank_for_schedule_stats
;
2543 rfs_result (enum rfs_decision decision
, int result
)
2545 ++rank_for_schedule_stats
.stats
[decision
];
2549 /* Returns a positive value if x is preferred; returns a negative value if
2550 y is preferred. Should never return 0, since that will make the sort
2554 rank_for_schedule (const void *x
, const void *y
)
2556 rtx tmp
= *(const rtx
*) y
;
2557 rtx tmp2
= *(const rtx
*) x
;
2558 int tmp_class
, tmp2_class
;
2559 int val
, priority_val
, info_val
, diff
;
2561 if (MAY_HAVE_DEBUG_INSNS
)
2563 /* Schedule debug insns as early as possible. */
2564 if (DEBUG_INSN_P (tmp
) && !DEBUG_INSN_P (tmp2
))
2565 return rfs_result (RFS_DEBUG
, -1);
2566 else if (!DEBUG_INSN_P (tmp
) && DEBUG_INSN_P (tmp2
))
2567 return rfs_result (RFS_DEBUG
, 1);
2568 else if (DEBUG_INSN_P (tmp
) && DEBUG_INSN_P (tmp2
))
2569 return rfs_result (RFS_DEBUG
, INSN_LUID (tmp
) - INSN_LUID (tmp2
));
2572 if (live_range_shrinkage_p
)
2574 /* Don't use SCHED_PRESSURE_MODEL -- it results in much worse
2576 gcc_assert (sched_pressure
== SCHED_PRESSURE_WEIGHTED
);
2577 if ((INSN_REG_PRESSURE_EXCESS_COST_CHANGE (tmp
) < 0
2578 || INSN_REG_PRESSURE_EXCESS_COST_CHANGE (tmp2
) < 0)
2579 && (diff
= (INSN_REG_PRESSURE_EXCESS_COST_CHANGE (tmp
)
2580 - INSN_REG_PRESSURE_EXCESS_COST_CHANGE (tmp2
))) != 0)
2581 return rfs_result (RFS_LIVE_RANGE_SHRINK1
, diff
);
2582 /* Sort by INSN_LUID (original insn order), so that we make the
2583 sort stable. This minimizes instruction movement, thus
2584 minimizing sched's effect on debugging and cross-jumping. */
2585 return rfs_result (RFS_LIVE_RANGE_SHRINK2
,
2586 INSN_LUID (tmp
) - INSN_LUID (tmp2
));
2589 /* The insn in a schedule group should be issued the first. */
2590 if (flag_sched_group_heuristic
&&
2591 SCHED_GROUP_P (tmp
) != SCHED_GROUP_P (tmp2
))
2592 return rfs_result (RFS_SCHED_GROUP
, SCHED_GROUP_P (tmp2
) ? 1 : -1);
2594 /* Make sure that priority of TMP and TMP2 are initialized. */
2595 gcc_assert (INSN_PRIORITY_KNOWN (tmp
) && INSN_PRIORITY_KNOWN (tmp2
));
2597 if (sched_pressure
!= SCHED_PRESSURE_NONE
)
2599 /* Prefer insn whose scheduling results in the smallest register
2601 if ((diff
= (INSN_REG_PRESSURE_EXCESS_COST_CHANGE (tmp
)
2603 - INSN_REG_PRESSURE_EXCESS_COST_CHANGE (tmp2
)
2604 - insn_delay (tmp2
))))
2605 return rfs_result (RFS_PRESSURE_DELAY
, diff
);
2608 if (sched_pressure
!= SCHED_PRESSURE_NONE
2609 && (INSN_TICK (tmp2
) > clock_var
|| INSN_TICK (tmp
) > clock_var
)
2610 && INSN_TICK (tmp2
) != INSN_TICK (tmp
))
2612 diff
= INSN_TICK (tmp
) - INSN_TICK (tmp2
);
2613 return rfs_result (RFS_PRESSURE_TICK
, diff
);
2616 /* If we are doing backtracking in this schedule, prefer insns that
2617 have forward dependencies with negative cost against an insn that
2618 was already scheduled. */
2619 if (current_sched_info
->flags
& DO_BACKTRACKING
)
2621 priority_val
= FEEDS_BACKTRACK_INSN (tmp2
) - FEEDS_BACKTRACK_INSN (tmp
);
2623 return rfs_result (RFS_FEEDS_BACKTRACK_INSN
, priority_val
);
2626 /* Prefer insn with higher priority. */
2627 priority_val
= INSN_PRIORITY (tmp2
) - INSN_PRIORITY (tmp
);
2629 if (flag_sched_critical_path_heuristic
&& priority_val
)
2630 return rfs_result (RFS_PRIORITY
, priority_val
);
2632 /* Prefer speculative insn with greater dependencies weakness. */
2633 if (flag_sched_spec_insn_heuristic
&& spec_info
)
2639 ds1
= TODO_SPEC (tmp
) & SPECULATIVE
;
2641 dw1
= ds_weak (ds1
);
2645 ds2
= TODO_SPEC (tmp2
) & SPECULATIVE
;
2647 dw2
= ds_weak (ds2
);
2652 if (dw
> (NO_DEP_WEAK
/ 8) || dw
< -(NO_DEP_WEAK
/ 8))
2653 return rfs_result (RFS_SPECULATION
, dw
);
2656 info_val
= (*current_sched_info
->rank
) (tmp
, tmp2
);
2657 if (flag_sched_rank_heuristic
&& info_val
)
2658 return rfs_result (RFS_SCHED_RANK
, info_val
);
2660 /* Compare insns based on their relation to the last scheduled
2662 if (flag_sched_last_insn_heuristic
&& last_nondebug_scheduled_insn
)
2666 rtx last
= last_nondebug_scheduled_insn
;
2668 /* Classify the instructions into three classes:
2669 1) Data dependent on last schedule insn.
2670 2) Anti/Output dependent on last scheduled insn.
2671 3) Independent of last scheduled insn, or has latency of one.
2672 Choose the insn from the highest numbered class if different. */
2673 dep1
= sd_find_dep_between (last
, tmp
, true);
2675 if (dep1
== NULL
|| dep_cost (dep1
) == 1)
2677 else if (/* Data dependence. */
2678 DEP_TYPE (dep1
) == REG_DEP_TRUE
)
2683 dep2
= sd_find_dep_between (last
, tmp2
, true);
2685 if (dep2
== NULL
|| dep_cost (dep2
) == 1)
2687 else if (/* Data dependence. */
2688 DEP_TYPE (dep2
) == REG_DEP_TRUE
)
2693 if ((val
= tmp2_class
- tmp_class
))
2694 return rfs_result (RFS_LAST_INSN
, val
);
2697 /* Prefer instructions that occur earlier in the model schedule. */
2698 if (sched_pressure
== SCHED_PRESSURE_MODEL
2699 && INSN_BB (tmp
) == target_bb
&& INSN_BB (tmp2
) == target_bb
)
2701 diff
= model_index (tmp
) - model_index (tmp2
);
2702 gcc_assert (diff
!= 0);
2703 return rfs_result (RFS_PRESSURE_INDEX
, diff
);
2706 /* Prefer the insn which has more later insns that depend on it.
2707 This gives the scheduler more freedom when scheduling later
2708 instructions at the expense of added register pressure. */
2710 val
= (dep_list_size (tmp2
, SD_LIST_FORW
)
2711 - dep_list_size (tmp
, SD_LIST_FORW
));
2713 if (flag_sched_dep_count_heuristic
&& val
!= 0)
2714 return rfs_result (RFS_DEP_COUNT
, val
);
2716 /* If insns are equally good, sort by INSN_LUID (original insn order),
2717 so that we make the sort stable. This minimizes instruction movement,
2718 thus minimizing sched's effect on debugging and cross-jumping. */
2719 return rfs_result (RFS_TIE
, INSN_LUID (tmp
) - INSN_LUID (tmp2
));
2722 /* Resort the array A in which only element at index N may be out of order. */
2724 HAIFA_INLINE
static void
2725 swap_sort (rtx
*a
, int n
)
2727 rtx insn
= a
[n
- 1];
2730 while (i
>= 0 && rank_for_schedule (a
+ i
, &insn
) >= 0)
2738 /* Add INSN to the insn queue so that it can be executed at least
2739 N_CYCLES after the currently executing insn. Preserve insns
2740 chain for debugging purposes. REASON will be printed in debugging
2743 HAIFA_INLINE
static void
2744 queue_insn (rtx insn
, int n_cycles
, const char *reason
)
2746 int next_q
= NEXT_Q_AFTER (q_ptr
, n_cycles
);
2747 rtx link
= alloc_INSN_LIST (insn
, insn_queue
[next_q
]);
2750 gcc_assert (n_cycles
<= max_insn_queue_index
);
2751 gcc_assert (!DEBUG_INSN_P (insn
));
2753 insn_queue
[next_q
] = link
;
2756 if (sched_verbose
>= 2)
2758 fprintf (sched_dump
, ";;\t\tReady-->Q: insn %s: ",
2759 (*current_sched_info
->print_insn
) (insn
, 0));
2761 fprintf (sched_dump
, "queued for %d cycles (%s).\n", n_cycles
, reason
);
2764 QUEUE_INDEX (insn
) = next_q
;
2766 if (current_sched_info
->flags
& DO_BACKTRACKING
)
2768 new_tick
= clock_var
+ n_cycles
;
2769 if (INSN_TICK (insn
) == INVALID_TICK
|| INSN_TICK (insn
) < new_tick
)
2770 INSN_TICK (insn
) = new_tick
;
2772 if (INSN_EXACT_TICK (insn
) != INVALID_TICK
2773 && INSN_EXACT_TICK (insn
) < clock_var
+ n_cycles
)
2775 must_backtrack
= true;
2776 if (sched_verbose
>= 2)
2777 fprintf (sched_dump
, ";;\t\tcausing a backtrack.\n");
2782 /* Remove INSN from queue. */
2784 queue_remove (rtx insn
)
2786 gcc_assert (QUEUE_INDEX (insn
) >= 0);
2787 remove_free_INSN_LIST_elem (insn
, &insn_queue
[QUEUE_INDEX (insn
)]);
2789 QUEUE_INDEX (insn
) = QUEUE_NOWHERE
;
2792 /* Return a pointer to the bottom of the ready list, i.e. the insn
2793 with the lowest priority. */
2796 ready_lastpos (struct ready_list
*ready
)
2798 gcc_assert (ready
->n_ready
>= 1);
2799 return ready
->vec
+ ready
->first
- ready
->n_ready
+ 1;
2802 /* Add an element INSN to the ready list so that it ends up with the
2803 lowest/highest priority depending on FIRST_P. */
2805 HAIFA_INLINE
static void
2806 ready_add (struct ready_list
*ready
, rtx insn
, bool first_p
)
2810 if (ready
->first
== ready
->n_ready
)
2812 memmove (ready
->vec
+ ready
->veclen
- ready
->n_ready
,
2813 ready_lastpos (ready
),
2814 ready
->n_ready
* sizeof (rtx
));
2815 ready
->first
= ready
->veclen
- 1;
2817 ready
->vec
[ready
->first
- ready
->n_ready
] = insn
;
2821 if (ready
->first
== ready
->veclen
- 1)
2824 /* ready_lastpos() fails when called with (ready->n_ready == 0). */
2825 memmove (ready
->vec
+ ready
->veclen
- ready
->n_ready
- 1,
2826 ready_lastpos (ready
),
2827 ready
->n_ready
* sizeof (rtx
));
2828 ready
->first
= ready
->veclen
- 2;
2830 ready
->vec
[++(ready
->first
)] = insn
;
2834 if (DEBUG_INSN_P (insn
))
2837 gcc_assert (QUEUE_INDEX (insn
) != QUEUE_READY
);
2838 QUEUE_INDEX (insn
) = QUEUE_READY
;
2840 if (INSN_EXACT_TICK (insn
) != INVALID_TICK
2841 && INSN_EXACT_TICK (insn
) < clock_var
)
2843 must_backtrack
= true;
2847 /* Remove the element with the highest priority from the ready list and
2850 HAIFA_INLINE
static rtx
2851 ready_remove_first (struct ready_list
*ready
)
2855 gcc_assert (ready
->n_ready
);
2856 t
= ready
->vec
[ready
->first
--];
2858 if (DEBUG_INSN_P (t
))
2860 /* If the queue becomes empty, reset it. */
2861 if (ready
->n_ready
== 0)
2862 ready
->first
= ready
->veclen
- 1;
2864 gcc_assert (QUEUE_INDEX (t
) == QUEUE_READY
);
2865 QUEUE_INDEX (t
) = QUEUE_NOWHERE
;
2870 /* The following code implements multi-pass scheduling for the first
2871 cycle. In other words, we will try to choose ready insn which
2872 permits to start maximum number of insns on the same cycle. */
2874 /* Return a pointer to the element INDEX from the ready. INDEX for
2875 insn with the highest priority is 0, and the lowest priority has
2879 ready_element (struct ready_list
*ready
, int index
)
2881 gcc_assert (ready
->n_ready
&& index
< ready
->n_ready
);
2883 return ready
->vec
[ready
->first
- index
];
2886 /* Remove the element INDEX from the ready list and return it. INDEX
2887 for insn with the highest priority is 0, and the lowest priority
2890 HAIFA_INLINE
static rtx
2891 ready_remove (struct ready_list
*ready
, int index
)
2897 return ready_remove_first (ready
);
2898 gcc_assert (ready
->n_ready
&& index
< ready
->n_ready
);
2899 t
= ready
->vec
[ready
->first
- index
];
2901 if (DEBUG_INSN_P (t
))
2903 for (i
= index
; i
< ready
->n_ready
; i
++)
2904 ready
->vec
[ready
->first
- i
] = ready
->vec
[ready
->first
- i
- 1];
2905 QUEUE_INDEX (t
) = QUEUE_NOWHERE
;
2909 /* Remove INSN from the ready list. */
2911 ready_remove_insn (rtx insn
)
2915 for (i
= 0; i
< readyp
->n_ready
; i
++)
2916 if (ready_element (readyp
, i
) == insn
)
2918 ready_remove (readyp
, i
);
2924 /* Calculate difference of two statistics set WAS and NOW.
2925 Result returned in WAS. */
2927 rank_for_schedule_stats_diff (rank_for_schedule_stats_t
*was
,
2928 const rank_for_schedule_stats_t
*now
)
2930 for (int i
= 0; i
< RFS_N
; ++i
)
2931 was
->stats
[i
] = now
->stats
[i
] - was
->stats
[i
];
2934 /* Print rank_for_schedule statistics. */
2936 print_rank_for_schedule_stats (const char *prefix
,
2937 const rank_for_schedule_stats_t
*stats
)
2939 for (int i
= 0; i
< RFS_N
; ++i
)
2940 if (stats
->stats
[i
])
2941 fprintf (sched_dump
, "%s%20s: %u\n", prefix
, rfs_str
[i
], stats
->stats
[i
]);
2944 /* Sort the ready list READY by ascending priority, using the SCHED_SORT
2948 ready_sort (struct ready_list
*ready
)
2951 rtx
*first
= ready_lastpos (ready
);
2953 if (sched_pressure
== SCHED_PRESSURE_WEIGHTED
)
2955 for (i
= 0; i
< ready
->n_ready
; i
++)
2956 if (!DEBUG_INSN_P (first
[i
]))
2957 setup_insn_reg_pressure_info (first
[i
]);
2959 if (sched_pressure
== SCHED_PRESSURE_MODEL
2960 && model_curr_point
< model_num_insns
)
2961 model_set_excess_costs (first
, ready
->n_ready
);
2963 rank_for_schedule_stats_t stats1
;
2964 if (sched_verbose
>= 4)
2965 stats1
= rank_for_schedule_stats
;
2967 if (ready
->n_ready
== 2)
2968 swap_sort (first
, ready
->n_ready
);
2969 else if (ready
->n_ready
> 2)
2970 qsort (first
, ready
->n_ready
, sizeof (rtx
), rank_for_schedule
);
2972 if (sched_verbose
>= 4)
2974 rank_for_schedule_stats_diff (&stats1
, &rank_for_schedule_stats
);
2975 print_rank_for_schedule_stats (";;\t\t", &stats1
);
2979 /* PREV is an insn that is ready to execute. Adjust its priority if that
2980 will help shorten or lengthen register lifetimes as appropriate. Also
2981 provide a hook for the target to tweak itself. */
2983 HAIFA_INLINE
static void
2984 adjust_priority (rtx prev
)
2986 /* ??? There used to be code here to try and estimate how an insn
2987 affected register lifetimes, but it did it by looking at REG_DEAD
2988 notes, which we removed in schedule_region. Nor did it try to
2989 take into account register pressure or anything useful like that.
2991 Revisit when we have a machine model to work with and not before. */
2993 if (targetm
.sched
.adjust_priority
)
2994 INSN_PRIORITY (prev
) =
2995 targetm
.sched
.adjust_priority (prev
, INSN_PRIORITY (prev
));
2998 /* Advance DFA state STATE on one cycle. */
3000 advance_state (state_t state
)
3002 if (targetm
.sched
.dfa_pre_advance_cycle
)
3003 targetm
.sched
.dfa_pre_advance_cycle ();
3005 if (targetm
.sched
.dfa_pre_cycle_insn
)
3006 state_transition (state
,
3007 targetm
.sched
.dfa_pre_cycle_insn ());
3009 state_transition (state
, NULL
);
3011 if (targetm
.sched
.dfa_post_cycle_insn
)
3012 state_transition (state
,
3013 targetm
.sched
.dfa_post_cycle_insn ());
3015 if (targetm
.sched
.dfa_post_advance_cycle
)
3016 targetm
.sched
.dfa_post_advance_cycle ();
3019 /* Advance time on one cycle. */
3020 HAIFA_INLINE
static void
3021 advance_one_cycle (void)
3023 advance_state (curr_state
);
3024 if (sched_verbose
>= 4)
3025 fprintf (sched_dump
, ";;\tAdvance the current state.\n");
3028 /* Update register pressure after scheduling INSN. */
3030 update_register_pressure (rtx insn
)
3032 struct reg_use_data
*use
;
3033 struct reg_set_data
*set
;
3035 gcc_checking_assert (!DEBUG_INSN_P (insn
));
3037 for (use
= INSN_REG_USE_LIST (insn
); use
!= NULL
; use
= use
->next_insn_use
)
3038 if (dying_use_p (use
))
3039 mark_regno_birth_or_death (curr_reg_live
, curr_reg_pressure
,
3041 for (set
= INSN_REG_SET_LIST (insn
); set
!= NULL
; set
= set
->next_insn_set
)
3042 mark_regno_birth_or_death (curr_reg_live
, curr_reg_pressure
,
3046 /* Set up or update (if UPDATE_P) max register pressure (see its
3047 meaning in sched-int.h::_haifa_insn_data) for all current BB insns
3048 after insn AFTER. */
3050 setup_insn_max_reg_pressure (rtx after
, bool update_p
)
3055 static int max_reg_pressure
[N_REG_CLASSES
];
3057 save_reg_pressure ();
3058 for (i
= 0; i
< ira_pressure_classes_num
; i
++)
3059 max_reg_pressure
[ira_pressure_classes
[i
]]
3060 = curr_reg_pressure
[ira_pressure_classes
[i
]];
3061 for (insn
= NEXT_INSN (after
);
3062 insn
!= NULL_RTX
&& ! BARRIER_P (insn
)
3063 && BLOCK_FOR_INSN (insn
) == BLOCK_FOR_INSN (after
);
3064 insn
= NEXT_INSN (insn
))
3065 if (NONDEBUG_INSN_P (insn
))
3068 for (i
= 0; i
< ira_pressure_classes_num
; i
++)
3070 p
= max_reg_pressure
[ira_pressure_classes
[i
]];
3071 if (INSN_MAX_REG_PRESSURE (insn
)[i
] != p
)
3074 INSN_MAX_REG_PRESSURE (insn
)[i
]
3075 = max_reg_pressure
[ira_pressure_classes
[i
]];
3078 if (update_p
&& eq_p
)
3080 update_register_pressure (insn
);
3081 for (i
= 0; i
< ira_pressure_classes_num
; i
++)
3082 if (max_reg_pressure
[ira_pressure_classes
[i
]]
3083 < curr_reg_pressure
[ira_pressure_classes
[i
]])
3084 max_reg_pressure
[ira_pressure_classes
[i
]]
3085 = curr_reg_pressure
[ira_pressure_classes
[i
]];
3087 restore_reg_pressure ();
3090 /* Update the current register pressure after scheduling INSN. Update
3091 also max register pressure for unscheduled insns of the current
3094 update_reg_and_insn_max_reg_pressure (rtx insn
)
3097 int before
[N_REG_CLASSES
];
3099 for (i
= 0; i
< ira_pressure_classes_num
; i
++)
3100 before
[i
] = curr_reg_pressure
[ira_pressure_classes
[i
]];
3101 update_register_pressure (insn
);
3102 for (i
= 0; i
< ira_pressure_classes_num
; i
++)
3103 if (curr_reg_pressure
[ira_pressure_classes
[i
]] != before
[i
])
3105 if (i
< ira_pressure_classes_num
)
3106 setup_insn_max_reg_pressure (insn
, true);
3109 /* Set up register pressure at the beginning of basic block BB whose
3110 insns starting after insn AFTER. Set up also max register pressure
3111 for all insns of the basic block. */
3113 sched_setup_bb_reg_pressure_info (basic_block bb
, rtx after
)
3115 gcc_assert (sched_pressure
== SCHED_PRESSURE_WEIGHTED
);
3116 initiate_bb_reg_pressure_info (bb
);
3117 setup_insn_max_reg_pressure (after
, false);
3120 /* If doing predication while scheduling, verify whether INSN, which
3121 has just been scheduled, clobbers the conditions of any
3122 instructions that must be predicated in order to break their
3123 dependencies. If so, remove them from the queues so that they will
3124 only be scheduled once their control dependency is resolved. */
3127 check_clobbered_conditions (rtx insn
)
3132 if ((current_sched_info
->flags
& DO_PREDICATION
) == 0)
3135 find_all_hard_reg_sets (insn
, &t
, true);
3138 for (i
= 0; i
< ready
.n_ready
; i
++)
3140 rtx x
= ready_element (&ready
, i
);
3141 if (TODO_SPEC (x
) == DEP_CONTROL
&& cond_clobbered_p (x
, t
))
3143 ready_remove_insn (x
);
3147 for (i
= 0; i
<= max_insn_queue_index
; i
++)
3150 int q
= NEXT_Q_AFTER (q_ptr
, i
);
3153 for (link
= insn_queue
[q
]; link
; link
= XEXP (link
, 1))
3155 rtx x
= XEXP (link
, 0);
3156 if (TODO_SPEC (x
) == DEP_CONTROL
&& cond_clobbered_p (x
, t
))
3165 /* Return (in order):
3167 - positive if INSN adversely affects the pressure on one
3170 - negative if INSN reduces the pressure on one register class
3172 - 0 if INSN doesn't affect the pressure on any register class. */
3175 model_classify_pressure (struct model_insn_info
*insn
)
3177 struct reg_pressure_data
*reg_pressure
;
3178 int death
[N_REG_CLASSES
];
3181 calculate_reg_deaths (insn
->insn
, death
);
3182 reg_pressure
= INSN_REG_PRESSURE (insn
->insn
);
3184 for (pci
= 0; pci
< ira_pressure_classes_num
; pci
++)
3186 cl
= ira_pressure_classes
[pci
];
3187 if (death
[cl
] < reg_pressure
[pci
].set_increase
)
3189 sum
+= reg_pressure
[pci
].set_increase
- death
[cl
];
3194 /* Return true if INSN1 should come before INSN2 in the model schedule. */
3197 model_order_p (struct model_insn_info
*insn1
, struct model_insn_info
*insn2
)
3199 unsigned int height1
, height2
;
3200 unsigned int priority1
, priority2
;
3202 /* Prefer instructions with a higher model priority. */
3203 if (insn1
->model_priority
!= insn2
->model_priority
)
3204 return insn1
->model_priority
> insn2
->model_priority
;
3206 /* Combine the length of the longest path of satisfied true dependencies
3207 that leads to each instruction (depth) with the length of the longest
3208 path of any dependencies that leads from the instruction (alap).
3209 Prefer instructions with the greatest combined length. If the combined
3210 lengths are equal, prefer instructions with the greatest depth.
3212 The idea is that, if we have a set S of "equal" instructions that each
3213 have ALAP value X, and we pick one such instruction I, any true-dependent
3214 successors of I that have ALAP value X - 1 should be preferred over S.
3215 This encourages the schedule to be "narrow" rather than "wide".
3216 However, if I is a low-priority instruction that we decided to
3217 schedule because of its model_classify_pressure, and if there
3218 is a set of higher-priority instructions T, the aforementioned
3219 successors of I should not have the edge over T. */
3220 height1
= insn1
->depth
+ insn1
->alap
;
3221 height2
= insn2
->depth
+ insn2
->alap
;
3222 if (height1
!= height2
)
3223 return height1
> height2
;
3224 if (insn1
->depth
!= insn2
->depth
)
3225 return insn1
->depth
> insn2
->depth
;
3227 /* We have no real preference between INSN1 an INSN2 as far as attempts
3228 to reduce pressure go. Prefer instructions with higher priorities. */
3229 priority1
= INSN_PRIORITY (insn1
->insn
);
3230 priority2
= INSN_PRIORITY (insn2
->insn
);
3231 if (priority1
!= priority2
)
3232 return priority1
> priority2
;
3234 /* Use the original rtl sequence as a tie-breaker. */
3235 return insn1
< insn2
;
3238 /* Add INSN to the model worklist immediately after PREV. Add it to the
3239 beginning of the list if PREV is null. */
3242 model_add_to_worklist_at (struct model_insn_info
*insn
,
3243 struct model_insn_info
*prev
)
3245 gcc_assert (QUEUE_INDEX (insn
->insn
) == QUEUE_NOWHERE
);
3246 QUEUE_INDEX (insn
->insn
) = QUEUE_READY
;
3251 insn
->next
= prev
->next
;
3256 insn
->next
= model_worklist
;
3257 model_worklist
= insn
;
3260 insn
->next
->prev
= insn
;
3263 /* Remove INSN from the model worklist. */
3266 model_remove_from_worklist (struct model_insn_info
*insn
)
3268 gcc_assert (QUEUE_INDEX (insn
->insn
) == QUEUE_READY
);
3269 QUEUE_INDEX (insn
->insn
) = QUEUE_NOWHERE
;
3272 insn
->prev
->next
= insn
->next
;
3274 model_worklist
= insn
->next
;
3276 insn
->next
->prev
= insn
->prev
;
3279 /* Add INSN to the model worklist. Start looking for a suitable position
3280 between neighbors PREV and NEXT, testing at most MAX_SCHED_READY_INSNS
3281 insns either side. A null PREV indicates the beginning of the list and
3282 a null NEXT indicates the end. */
3285 model_add_to_worklist (struct model_insn_info
*insn
,
3286 struct model_insn_info
*prev
,
3287 struct model_insn_info
*next
)
3291 count
= MAX_SCHED_READY_INSNS
;
3292 if (count
> 0 && prev
&& model_order_p (insn
, prev
))
3298 while (count
> 0 && prev
&& model_order_p (insn
, prev
));
3300 while (count
> 0 && next
&& model_order_p (next
, insn
))
3306 model_add_to_worklist_at (insn
, prev
);
3309 /* INSN may now have a higher priority (in the model_order_p sense)
3310 than before. Move it up the worklist if necessary. */
3313 model_promote_insn (struct model_insn_info
*insn
)
3315 struct model_insn_info
*prev
;
3319 count
= MAX_SCHED_READY_INSNS
;
3320 while (count
> 0 && prev
&& model_order_p (insn
, prev
))
3325 if (prev
!= insn
->prev
)
3327 model_remove_from_worklist (insn
);
3328 model_add_to_worklist_at (insn
, prev
);
3332 /* Add INSN to the end of the model schedule. */
3335 model_add_to_schedule (rtx insn
)
3339 gcc_assert (QUEUE_INDEX (insn
) == QUEUE_NOWHERE
);
3340 QUEUE_INDEX (insn
) = QUEUE_SCHEDULED
;
3342 point
= model_schedule
.length ();
3343 model_schedule
.quick_push (insn
);
3344 INSN_MODEL_INDEX (insn
) = point
+ 1;
3347 /* Analyze the instructions that are to be scheduled, setting up
3348 MODEL_INSN_INFO (...) and model_num_insns accordingly. Add ready
3349 instructions to model_worklist. */
3352 model_analyze_insns (void)
3354 rtx start
, end
, iter
;
3355 sd_iterator_def sd_it
;
3357 struct model_insn_info
*insn
, *con
;
3359 model_num_insns
= 0;
3360 start
= PREV_INSN (current_sched_info
->next_tail
);
3361 end
= current_sched_info
->prev_head
;
3362 for (iter
= start
; iter
!= end
; iter
= PREV_INSN (iter
))
3363 if (NONDEBUG_INSN_P (iter
))
3365 insn
= MODEL_INSN_INFO (iter
);
3367 FOR_EACH_DEP (iter
, SD_LIST_FORW
, sd_it
, dep
)
3369 con
= MODEL_INSN_INFO (DEP_CON (dep
));
3370 if (con
->insn
&& insn
->alap
< con
->alap
+ 1)
3371 insn
->alap
= con
->alap
+ 1;
3374 insn
->old_queue
= QUEUE_INDEX (iter
);
3375 QUEUE_INDEX (iter
) = QUEUE_NOWHERE
;
3377 insn
->unscheduled_preds
= dep_list_size (iter
, SD_LIST_HARD_BACK
);
3378 if (insn
->unscheduled_preds
== 0)
3379 model_add_to_worklist (insn
, NULL
, model_worklist
);
3385 /* The global state describes the register pressure at the start of the
3386 model schedule. Initialize GROUP accordingly. */
3389 model_init_pressure_group (struct model_pressure_group
*group
)
3393 for (pci
= 0; pci
< ira_pressure_classes_num
; pci
++)
3395 cl
= ira_pressure_classes
[pci
];
3396 group
->limits
[pci
].pressure
= curr_reg_pressure
[cl
];
3397 group
->limits
[pci
].point
= 0;
3399 /* Use index model_num_insns to record the state after the last
3400 instruction in the model schedule. */
3401 group
->model
= XNEWVEC (struct model_pressure_data
,
3402 (model_num_insns
+ 1) * ira_pressure_classes_num
);
3405 /* Record that MODEL_REF_PRESSURE (GROUP, POINT, PCI) is PRESSURE.
3406 Update the maximum pressure for the whole schedule. */
3409 model_record_pressure (struct model_pressure_group
*group
,
3410 int point
, int pci
, int pressure
)
3412 MODEL_REF_PRESSURE (group
, point
, pci
) = pressure
;
3413 if (group
->limits
[pci
].pressure
< pressure
)
3415 group
->limits
[pci
].pressure
= pressure
;
3416 group
->limits
[pci
].point
= point
;
3420 /* INSN has just been added to the end of the model schedule. Record its
3421 register-pressure information. */
3424 model_record_pressures (struct model_insn_info
*insn
)
3426 struct reg_pressure_data
*reg_pressure
;
3427 int point
, pci
, cl
, delta
;
3428 int death
[N_REG_CLASSES
];
3430 point
= model_index (insn
->insn
);
3431 if (sched_verbose
>= 2)
3435 fprintf (sched_dump
, "\n;;\tModel schedule:\n;;\n");
3436 fprintf (sched_dump
, ";;\t| idx insn | mpri hght dpth prio |\n");
3438 fprintf (sched_dump
, ";;\t| %3d %4d | %4d %4d %4d %4d | %-30s ",
3439 point
, INSN_UID (insn
->insn
), insn
->model_priority
,
3440 insn
->depth
+ insn
->alap
, insn
->depth
,
3441 INSN_PRIORITY (insn
->insn
),
3442 str_pattern_slim (PATTERN (insn
->insn
)));
3444 calculate_reg_deaths (insn
->insn
, death
);
3445 reg_pressure
= INSN_REG_PRESSURE (insn
->insn
);
3446 for (pci
= 0; pci
< ira_pressure_classes_num
; pci
++)
3448 cl
= ira_pressure_classes
[pci
];
3449 delta
= reg_pressure
[pci
].set_increase
- death
[cl
];
3450 if (sched_verbose
>= 2)
3451 fprintf (sched_dump
, " %s:[%d,%+d]", reg_class_names
[cl
],
3452 curr_reg_pressure
[cl
], delta
);
3453 model_record_pressure (&model_before_pressure
, point
, pci
,
3454 curr_reg_pressure
[cl
]);
3456 if (sched_verbose
>= 2)
3457 fprintf (sched_dump
, "\n");
3460 /* All instructions have been added to the model schedule. Record the
3461 final register pressure in GROUP and set up all MODEL_MAX_PRESSUREs. */
3464 model_record_final_pressures (struct model_pressure_group
*group
)
3466 int point
, pci
, max_pressure
, ref_pressure
, cl
;
3468 for (pci
= 0; pci
< ira_pressure_classes_num
; pci
++)
3470 /* Record the final pressure for this class. */
3471 cl
= ira_pressure_classes
[pci
];
3472 point
= model_num_insns
;
3473 ref_pressure
= curr_reg_pressure
[cl
];
3474 model_record_pressure (group
, point
, pci
, ref_pressure
);
3476 /* Record the original maximum pressure. */
3477 group
->limits
[pci
].orig_pressure
= group
->limits
[pci
].pressure
;
3479 /* Update the MODEL_MAX_PRESSURE for every point of the schedule. */
3480 max_pressure
= ref_pressure
;
3481 MODEL_MAX_PRESSURE (group
, point
, pci
) = max_pressure
;
3485 ref_pressure
= MODEL_REF_PRESSURE (group
, point
, pci
);
3486 max_pressure
= MAX (max_pressure
, ref_pressure
);
3487 MODEL_MAX_PRESSURE (group
, point
, pci
) = max_pressure
;
3492 /* Update all successors of INSN, given that INSN has just been scheduled. */
3495 model_add_successors_to_worklist (struct model_insn_info
*insn
)
3497 sd_iterator_def sd_it
;
3498 struct model_insn_info
*con
;
3501 FOR_EACH_DEP (insn
->insn
, SD_LIST_FORW
, sd_it
, dep
)
3503 con
= MODEL_INSN_INFO (DEP_CON (dep
));
3504 /* Ignore debug instructions, and instructions from other blocks. */
3507 con
->unscheduled_preds
--;
3509 /* Update the depth field of each true-dependent successor.
3510 Increasing the depth gives them a higher priority than
3512 if (DEP_TYPE (dep
) == REG_DEP_TRUE
&& con
->depth
< insn
->depth
+ 1)
3514 con
->depth
= insn
->depth
+ 1;
3515 if (QUEUE_INDEX (con
->insn
) == QUEUE_READY
)
3516 model_promote_insn (con
);
3519 /* If this is a true dependency, or if there are no remaining
3520 dependencies for CON (meaning that CON only had non-true
3521 dependencies), make sure that CON is on the worklist.
3522 We don't bother otherwise because it would tend to fill the
3523 worklist with a lot of low-priority instructions that are not
3524 yet ready to issue. */
3525 if ((con
->depth
> 0 || con
->unscheduled_preds
== 0)
3526 && QUEUE_INDEX (con
->insn
) == QUEUE_NOWHERE
)
3527 model_add_to_worklist (con
, insn
, insn
->next
);
3532 /* Give INSN a higher priority than any current instruction, then give
3533 unscheduled predecessors of INSN a higher priority still. If any of
3534 those predecessors are not on the model worklist, do the same for its
3535 predecessors, and so on. */
3538 model_promote_predecessors (struct model_insn_info
*insn
)
3540 struct model_insn_info
*pro
, *first
;
3541 sd_iterator_def sd_it
;
3544 if (sched_verbose
>= 7)
3545 fprintf (sched_dump
, ";;\t+--- priority of %d = %d, priority of",
3546 INSN_UID (insn
->insn
), model_next_priority
);
3547 insn
->model_priority
= model_next_priority
++;
3548 model_remove_from_worklist (insn
);
3549 model_add_to_worklist_at (insn
, NULL
);
3554 FOR_EACH_DEP (insn
->insn
, SD_LIST_HARD_BACK
, sd_it
, dep
)
3556 pro
= MODEL_INSN_INFO (DEP_PRO (dep
));
3557 /* The first test is to ignore debug instructions, and instructions
3558 from other blocks. */
3560 && pro
->model_priority
!= model_next_priority
3561 && QUEUE_INDEX (pro
->insn
) != QUEUE_SCHEDULED
)
3563 pro
->model_priority
= model_next_priority
;
3564 if (sched_verbose
>= 7)
3565 fprintf (sched_dump
, " %d", INSN_UID (pro
->insn
));
3566 if (QUEUE_INDEX (pro
->insn
) == QUEUE_READY
)
3568 /* PRO is already in the worklist, but it now has
3569 a higher priority than before. Move it at the
3570 appropriate place. */
3571 model_remove_from_worklist (pro
);
3572 model_add_to_worklist (pro
, NULL
, model_worklist
);
3576 /* PRO isn't in the worklist. Recursively process
3577 its predecessors until we find one that is. */
3588 if (sched_verbose
>= 7)
3589 fprintf (sched_dump
, " = %d\n", model_next_priority
);
3590 model_next_priority
++;
3593 /* Pick one instruction from model_worklist and process it. */
3596 model_choose_insn (void)
3598 struct model_insn_info
*insn
, *fallback
;
3601 if (sched_verbose
>= 7)
3603 fprintf (sched_dump
, ";;\t+--- worklist:\n");
3604 insn
= model_worklist
;
3605 count
= MAX_SCHED_READY_INSNS
;
3606 while (count
> 0 && insn
)
3608 fprintf (sched_dump
, ";;\t+--- %d [%d, %d, %d, %d]\n",
3609 INSN_UID (insn
->insn
), insn
->model_priority
,
3610 insn
->depth
+ insn
->alap
, insn
->depth
,
3611 INSN_PRIORITY (insn
->insn
));
3617 /* Look for a ready instruction whose model_classify_priority is zero
3618 or negative, picking the highest-priority one. Adding such an
3619 instruction to the schedule now should do no harm, and may actually
3622 Failing that, see whether there is an instruction with the highest
3623 extant model_priority that is not yet ready, but which would reduce
3624 pressure if it became ready. This is designed to catch cases like:
3626 (set (mem (reg R1)) (reg R2))
3628 where the instruction is the last remaining use of R1 and where the
3629 value of R2 is not yet available (or vice versa). The death of R1
3630 means that this instruction already reduces pressure. It is of
3631 course possible that the computation of R2 involves other registers
3632 that are hard to kill, but such cases are rare enough for this
3633 heuristic to be a win in general.
3635 Failing that, just pick the highest-priority instruction in the
3637 count
= MAX_SCHED_READY_INSNS
;
3638 insn
= model_worklist
;
3642 if (count
== 0 || !insn
)
3644 insn
= fallback
? fallback
: model_worklist
;
3647 if (insn
->unscheduled_preds
)
3649 if (model_worklist
->model_priority
== insn
->model_priority
3651 && model_classify_pressure (insn
) < 0)
3656 if (model_classify_pressure (insn
) <= 0)
3663 if (sched_verbose
>= 7 && insn
!= model_worklist
)
3665 if (insn
->unscheduled_preds
)
3666 fprintf (sched_dump
, ";;\t+--- promoting insn %d, with dependencies\n",
3667 INSN_UID (insn
->insn
));
3669 fprintf (sched_dump
, ";;\t+--- promoting insn %d, which is ready\n",
3670 INSN_UID (insn
->insn
));
3672 if (insn
->unscheduled_preds
)
3673 /* INSN isn't yet ready to issue. Give all its predecessors the
3674 highest priority. */
3675 model_promote_predecessors (insn
);
3678 /* INSN is ready. Add it to the end of model_schedule and
3679 process its successors. */
3680 model_add_successors_to_worklist (insn
);
3681 model_remove_from_worklist (insn
);
3682 model_add_to_schedule (insn
->insn
);
3683 model_record_pressures (insn
);
3684 update_register_pressure (insn
->insn
);
3688 /* Restore all QUEUE_INDEXs to the values that they had before
3689 model_start_schedule was called. */
3692 model_reset_queue_indices (void)
3697 FOR_EACH_VEC_ELT (model_schedule
, i
, insn
)
3698 QUEUE_INDEX (insn
) = MODEL_INSN_INFO (insn
)->old_queue
;
3701 /* We have calculated the model schedule and spill costs. Print a summary
3705 model_dump_pressure_summary (void)
3709 fprintf (sched_dump
, ";; Pressure summary:");
3710 for (pci
= 0; pci
< ira_pressure_classes_num
; pci
++)
3712 cl
= ira_pressure_classes
[pci
];
3713 fprintf (sched_dump
, " %s:%d", reg_class_names
[cl
],
3714 model_before_pressure
.limits
[pci
].pressure
);
3716 fprintf (sched_dump
, "\n\n");
3719 /* Initialize the SCHED_PRESSURE_MODEL information for the current
3720 scheduling region. */
3723 model_start_schedule (void)
3727 model_next_priority
= 1;
3728 model_schedule
.create (sched_max_luid
);
3729 model_insns
= XCNEWVEC (struct model_insn_info
, sched_max_luid
);
3731 bb
= BLOCK_FOR_INSN (NEXT_INSN (current_sched_info
->prev_head
));
3732 initiate_reg_pressure_info (df_get_live_in (bb
));
3734 model_analyze_insns ();
3735 model_init_pressure_group (&model_before_pressure
);
3736 while (model_worklist
)
3737 model_choose_insn ();
3738 gcc_assert (model_num_insns
== (int) model_schedule
.length ());
3739 if (sched_verbose
>= 2)
3740 fprintf (sched_dump
, "\n");
3742 model_record_final_pressures (&model_before_pressure
);
3743 model_reset_queue_indices ();
3745 XDELETEVEC (model_insns
);
3747 model_curr_point
= 0;
3748 initiate_reg_pressure_info (df_get_live_in (bb
));
3749 if (sched_verbose
>= 1)
3750 model_dump_pressure_summary ();
3753 /* Free the information associated with GROUP. */
3756 model_finalize_pressure_group (struct model_pressure_group
*group
)
3758 XDELETEVEC (group
->model
);
3761 /* Free the information created by model_start_schedule. */
3764 model_end_schedule (void)
3766 model_finalize_pressure_group (&model_before_pressure
);
3767 model_schedule
.release ();
3770 /* A structure that holds local state for the loop in schedule_block. */
3771 struct sched_block_state
3773 /* True if no real insns have been scheduled in the current cycle. */
3774 bool first_cycle_insn_p
;
3775 /* True if a shadow insn has been scheduled in the current cycle, which
3776 means that no more normal insns can be issued. */
3777 bool shadows_only_p
;
3778 /* True if we're winding down a modulo schedule, which means that we only
3779 issue insns with INSN_EXACT_TICK set. */
3780 bool modulo_epilogue
;
3781 /* Initialized with the machine's issue rate every cycle, and updated
3782 by calls to the variable_issue hook. */
3786 /* INSN is the "currently executing insn". Launch each insn which was
3787 waiting on INSN. READY is the ready list which contains the insns
3788 that are ready to fire. CLOCK is the current cycle. The function
3789 returns necessary cycle advance after issuing the insn (it is not
3790 zero for insns in a schedule group). */
3793 schedule_insn (rtx insn
)
3795 sd_iterator_def sd_it
;
3800 if (sched_verbose
>= 1)
3802 struct reg_pressure_data
*pressure_info
;
3803 fprintf (sched_dump
, ";;\t%3i--> %s %-40s:",
3804 clock_var
, (*current_sched_info
->print_insn
) (insn
, 1),
3805 str_pattern_slim (PATTERN (insn
)));
3807 if (recog_memoized (insn
) < 0)
3808 fprintf (sched_dump
, "nothing");
3810 print_reservation (sched_dump
, insn
);
3811 pressure_info
= INSN_REG_PRESSURE (insn
);
3812 if (pressure_info
!= NULL
)
3814 fputc (':', sched_dump
);
3815 for (i
= 0; i
< ira_pressure_classes_num
; i
++)
3816 fprintf (sched_dump
, "%s%s%+d(%d)",
3817 scheduled_insns
.length () > 1
3819 < INSN_LUID (scheduled_insns
[scheduled_insns
.length () - 2]) ? "@" : "",
3820 reg_class_names
[ira_pressure_classes
[i
]],
3821 pressure_info
[i
].set_increase
, pressure_info
[i
].change
);
3823 if (sched_pressure
== SCHED_PRESSURE_MODEL
3824 && model_curr_point
< model_num_insns
3825 && model_index (insn
) == model_curr_point
)
3826 fprintf (sched_dump
, ":model %d", model_curr_point
);
3827 fputc ('\n', sched_dump
);
3830 if (sched_pressure
== SCHED_PRESSURE_WEIGHTED
&& !DEBUG_INSN_P (insn
))
3831 update_reg_and_insn_max_reg_pressure (insn
);
3833 /* Scheduling instruction should have all its dependencies resolved and
3834 should have been removed from the ready list. */
3835 gcc_assert (sd_lists_empty_p (insn
, SD_LIST_HARD_BACK
));
3837 /* Reset debug insns invalidated by moving this insn. */
3838 if (MAY_HAVE_DEBUG_INSNS
&& !DEBUG_INSN_P (insn
))
3839 for (sd_it
= sd_iterator_start (insn
, SD_LIST_BACK
);
3840 sd_iterator_cond (&sd_it
, &dep
);)
3842 rtx dbg
= DEP_PRO (dep
);
3843 struct reg_use_data
*use
, *next
;
3845 if (DEP_STATUS (dep
) & DEP_CANCELLED
)
3847 sd_iterator_next (&sd_it
);
3851 gcc_assert (DEBUG_INSN_P (dbg
));
3853 if (sched_verbose
>= 6)
3854 fprintf (sched_dump
, ";;\t\tresetting: debug insn %d\n",
3857 /* ??? Rather than resetting the debug insn, we might be able
3858 to emit a debug temp before the just-scheduled insn, but
3859 this would involve checking that the expression at the
3860 point of the debug insn is equivalent to the expression
3861 before the just-scheduled insn. They might not be: the
3862 expression in the debug insn may depend on other insns not
3863 yet scheduled that set MEMs, REGs or even other debug
3864 insns. It's not clear that attempting to preserve debug
3865 information in these cases is worth the effort, given how
3866 uncommon these resets are and the likelihood that the debug
3867 temps introduced won't survive the schedule change. */
3868 INSN_VAR_LOCATION_LOC (dbg
) = gen_rtx_UNKNOWN_VAR_LOC ();
3869 df_insn_rescan (dbg
);
3871 /* Unknown location doesn't use any registers. */
3872 for (use
= INSN_REG_USE_LIST (dbg
); use
!= NULL
; use
= next
)
3874 struct reg_use_data
*prev
= use
;
3876 /* Remove use from the cyclic next_regno_use chain first. */
3877 while (prev
->next_regno_use
!= use
)
3878 prev
= prev
->next_regno_use
;
3879 prev
->next_regno_use
= use
->next_regno_use
;
3880 next
= use
->next_insn_use
;
3883 INSN_REG_USE_LIST (dbg
) = NULL
;
3885 /* We delete rather than resolve these deps, otherwise we
3886 crash in sched_free_deps(), because forward deps are
3887 expected to be released before backward deps. */
3888 sd_delete_dep (sd_it
);
3891 gcc_assert (QUEUE_INDEX (insn
) == QUEUE_NOWHERE
);
3892 QUEUE_INDEX (insn
) = QUEUE_SCHEDULED
;
3894 if (sched_pressure
== SCHED_PRESSURE_MODEL
3895 && model_curr_point
< model_num_insns
3896 && NONDEBUG_INSN_P (insn
))
3898 if (model_index (insn
) == model_curr_point
)
3901 while (model_curr_point
< model_num_insns
3902 && (QUEUE_INDEX (MODEL_INSN (model_curr_point
))
3903 == QUEUE_SCHEDULED
));
3905 model_recompute (insn
);
3906 model_update_limit_points ();
3907 update_register_pressure (insn
);
3908 if (sched_verbose
>= 2)
3909 print_curr_reg_pressure ();
3912 gcc_assert (INSN_TICK (insn
) >= MIN_TICK
);
3913 if (INSN_TICK (insn
) > clock_var
)
3914 /* INSN has been prematurely moved from the queue to the ready list.
3915 This is possible only if following flag is set. */
3916 gcc_assert (flag_sched_stalled_insns
);
3918 /* ??? Probably, if INSN is scheduled prematurely, we should leave
3919 INSN_TICK untouched. This is a machine-dependent issue, actually. */
3920 INSN_TICK (insn
) = clock_var
;
3922 check_clobbered_conditions (insn
);
3924 /* Update dependent instructions. First, see if by scheduling this insn
3925 now we broke a dependence in a way that requires us to change another
3927 for (sd_it
= sd_iterator_start (insn
, SD_LIST_SPEC_BACK
);
3928 sd_iterator_cond (&sd_it
, &dep
); sd_iterator_next (&sd_it
))
3930 struct dep_replacement
*desc
= DEP_REPLACE (dep
);
3931 rtx pro
= DEP_PRO (dep
);
3932 if (QUEUE_INDEX (pro
) != QUEUE_SCHEDULED
3933 && desc
!= NULL
&& desc
->insn
== pro
)
3934 apply_replacement (dep
, false);
3937 /* Go through and resolve forward dependencies. */
3938 for (sd_it
= sd_iterator_start (insn
, SD_LIST_FORW
);
3939 sd_iterator_cond (&sd_it
, &dep
);)
3941 rtx next
= DEP_CON (dep
);
3942 bool cancelled
= (DEP_STATUS (dep
) & DEP_CANCELLED
) != 0;
3944 /* Resolve the dependence between INSN and NEXT.
3945 sd_resolve_dep () moves current dep to another list thus
3946 advancing the iterator. */
3947 sd_resolve_dep (sd_it
);
3951 if (must_restore_pattern_p (next
, dep
))
3952 restore_pattern (dep
, false);
3956 /* Don't bother trying to mark next as ready if insn is a debug
3957 insn. If insn is the last hard dependency, it will have
3958 already been discounted. */
3959 if (DEBUG_INSN_P (insn
) && !DEBUG_INSN_P (next
))
3962 if (!IS_SPECULATION_BRANCHY_CHECK_P (insn
))
3966 effective_cost
= try_ready (next
);
3968 if (effective_cost
>= 0
3969 && SCHED_GROUP_P (next
)
3970 && advance
< effective_cost
)
3971 advance
= effective_cost
;
3974 /* Check always has only one forward dependence (to the first insn in
3975 the recovery block), therefore, this will be executed only once. */
3977 gcc_assert (sd_lists_empty_p (insn
, SD_LIST_FORW
));
3978 fix_recovery_deps (RECOVERY_BLOCK (insn
));
3982 /* Annotate the instruction with issue information -- TImode
3983 indicates that the instruction is expected not to be able
3984 to issue on the same cycle as the previous insn. A machine
3985 may use this information to decide how the instruction should
3988 && GET_CODE (PATTERN (insn
)) != USE
3989 && GET_CODE (PATTERN (insn
)) != CLOBBER
3990 && !DEBUG_INSN_P (insn
))
3992 if (reload_completed
)
3993 PUT_MODE (insn
, clock_var
> last_clock_var
? TImode
: VOIDmode
);
3994 last_clock_var
= clock_var
;
3997 if (nonscheduled_insns_begin
!= NULL_RTX
)
3998 /* Indicate to debug counters that INSN is scheduled. */
3999 nonscheduled_insns_begin
= insn
;
4004 /* Functions for handling of notes. */
4006 /* Add note list that ends on FROM_END to the end of TO_ENDP. */
4008 concat_note_lists (rtx from_end
, rtx
*to_endp
)
4012 /* It's easy when have nothing to concat. */
4013 if (from_end
== NULL
)
4016 /* It's also easy when destination is empty. */
4017 if (*to_endp
== NULL
)
4019 *to_endp
= from_end
;
4023 from_start
= from_end
;
4024 while (PREV_INSN (from_start
) != NULL
)
4025 from_start
= PREV_INSN (from_start
);
4027 PREV_INSN (from_start
) = *to_endp
;
4028 NEXT_INSN (*to_endp
) = from_start
;
4029 *to_endp
= from_end
;
4032 /* Delete notes between HEAD and TAIL and put them in the chain
4033 of notes ended by NOTE_LIST. */
4035 remove_notes (rtx head
, rtx tail
)
4037 rtx next_tail
, insn
, next
;
4040 if (head
== tail
&& !INSN_P (head
))
4043 next_tail
= NEXT_INSN (tail
);
4044 for (insn
= head
; insn
!= next_tail
; insn
= next
)
4046 next
= NEXT_INSN (insn
);
4050 switch (NOTE_KIND (insn
))
4052 case NOTE_INSN_BASIC_BLOCK
:
4055 case NOTE_INSN_EPILOGUE_BEG
:
4059 add_reg_note (next
, REG_SAVE_NOTE
,
4060 GEN_INT (NOTE_INSN_EPILOGUE_BEG
));
4068 /* Add the note to list that ends at NOTE_LIST. */
4069 PREV_INSN (insn
) = note_list
;
4070 NEXT_INSN (insn
) = NULL_RTX
;
4072 NEXT_INSN (note_list
) = insn
;
4077 gcc_assert ((sel_sched_p () || insn
!= tail
) && insn
!= head
);
4081 /* A structure to record enough data to allow us to backtrack the scheduler to
4082 a previous state. */
4083 struct haifa_saved_data
4085 /* Next entry on the list. */
4086 struct haifa_saved_data
*next
;
4088 /* Backtracking is associated with scheduling insns that have delay slots.
4089 DELAY_PAIR points to the structure that contains the insns involved, and
4090 the number of cycles between them. */
4091 struct delay_pair
*delay_pair
;
4093 /* Data used by the frontend (e.g. sched-ebb or sched-rgn). */
4094 void *fe_saved_data
;
4095 /* Data used by the backend. */
4096 void *be_saved_data
;
4098 /* Copies of global state. */
4099 int clock_var
, last_clock_var
;
4100 struct ready_list ready
;
4103 rtx last_scheduled_insn
;
4104 rtx last_nondebug_scheduled_insn
;
4105 rtx nonscheduled_insns_begin
;
4106 int cycle_issued_insns
;
4108 /* Copies of state used in the inner loop of schedule_block. */
4109 struct sched_block_state sched_block
;
4111 /* We don't need to save q_ptr, as its value is arbitrary and we can set it
4112 to 0 when restoring. */
4116 /* Describe pattern replacements that occurred since this backtrack point
4118 vec
<dep_t
> replacement_deps
;
4119 vec
<int> replace_apply
;
4121 /* A copy of the next-cycle replacement vectors at the time of the backtrack
4123 vec
<dep_t
> next_cycle_deps
;
4124 vec
<int> next_cycle_apply
;
4127 /* A record, in reverse order, of all scheduled insns which have delay slots
4128 and may require backtracking. */
4129 static struct haifa_saved_data
*backtrack_queue
;
4131 /* For every dependency of INSN, set the FEEDS_BACKTRACK_INSN bit according
4134 mark_backtrack_feeds (rtx insn
, int set_p
)
4136 sd_iterator_def sd_it
;
4138 FOR_EACH_DEP (insn
, SD_LIST_HARD_BACK
, sd_it
, dep
)
4140 FEEDS_BACKTRACK_INSN (DEP_PRO (dep
)) = set_p
;
4144 /* Save the current scheduler state so that we can backtrack to it
4145 later if necessary. PAIR gives the insns that make it necessary to
4146 save this point. SCHED_BLOCK is the local state of schedule_block
4147 that need to be saved. */
4149 save_backtrack_point (struct delay_pair
*pair
,
4150 struct sched_block_state sched_block
)
4153 struct haifa_saved_data
*save
= XNEW (struct haifa_saved_data
);
4155 save
->curr_state
= xmalloc (dfa_state_size
);
4156 memcpy (save
->curr_state
, curr_state
, dfa_state_size
);
4158 save
->ready
.first
= ready
.first
;
4159 save
->ready
.n_ready
= ready
.n_ready
;
4160 save
->ready
.n_debug
= ready
.n_debug
;
4161 save
->ready
.veclen
= ready
.veclen
;
4162 save
->ready
.vec
= XNEWVEC (rtx
, ready
.veclen
);
4163 memcpy (save
->ready
.vec
, ready
.vec
, ready
.veclen
* sizeof (rtx
));
4165 save
->insn_queue
= XNEWVEC (rtx
, max_insn_queue_index
+ 1);
4166 save
->q_size
= q_size
;
4167 for (i
= 0; i
<= max_insn_queue_index
; i
++)
4169 int q
= NEXT_Q_AFTER (q_ptr
, i
);
4170 save
->insn_queue
[i
] = copy_INSN_LIST (insn_queue
[q
]);
4173 save
->clock_var
= clock_var
;
4174 save
->last_clock_var
= last_clock_var
;
4175 save
->cycle_issued_insns
= cycle_issued_insns
;
4176 save
->last_scheduled_insn
= last_scheduled_insn
;
4177 save
->last_nondebug_scheduled_insn
= last_nondebug_scheduled_insn
;
4178 save
->nonscheduled_insns_begin
= nonscheduled_insns_begin
;
4180 save
->sched_block
= sched_block
;
4182 save
->replacement_deps
.create (0);
4183 save
->replace_apply
.create (0);
4184 save
->next_cycle_deps
= next_cycle_replace_deps
.copy ();
4185 save
->next_cycle_apply
= next_cycle_apply
.copy ();
4187 if (current_sched_info
->save_state
)
4188 save
->fe_saved_data
= (*current_sched_info
->save_state
) ();
4190 if (targetm
.sched
.alloc_sched_context
)
4192 save
->be_saved_data
= targetm
.sched
.alloc_sched_context ();
4193 targetm
.sched
.init_sched_context (save
->be_saved_data
, false);
4196 save
->be_saved_data
= NULL
;
4198 save
->delay_pair
= pair
;
4200 save
->next
= backtrack_queue
;
4201 backtrack_queue
= save
;
4205 mark_backtrack_feeds (pair
->i2
, 1);
4206 INSN_TICK (pair
->i2
) = INVALID_TICK
;
4207 INSN_EXACT_TICK (pair
->i2
) = clock_var
+ pair_delay (pair
);
4208 SHADOW_P (pair
->i2
) = pair
->stages
== 0;
4209 pair
= pair
->next_same_i1
;
4213 /* Walk the ready list and all queues. If any insns have unresolved backwards
4214 dependencies, these must be cancelled deps, broken by predication. Set or
4215 clear (depending on SET) the DEP_CANCELLED bit in DEP_STATUS. */
4218 toggle_cancelled_flags (bool set
)
4221 sd_iterator_def sd_it
;
4224 if (ready
.n_ready
> 0)
4226 rtx
*first
= ready_lastpos (&ready
);
4227 for (i
= 0; i
< ready
.n_ready
; i
++)
4228 FOR_EACH_DEP (first
[i
], SD_LIST_BACK
, sd_it
, dep
)
4229 if (!DEBUG_INSN_P (DEP_PRO (dep
)))
4232 DEP_STATUS (dep
) |= DEP_CANCELLED
;
4234 DEP_STATUS (dep
) &= ~DEP_CANCELLED
;
4237 for (i
= 0; i
<= max_insn_queue_index
; i
++)
4239 int q
= NEXT_Q_AFTER (q_ptr
, i
);
4241 for (link
= insn_queue
[q
]; link
; link
= XEXP (link
, 1))
4243 rtx insn
= XEXP (link
, 0);
4244 FOR_EACH_DEP (insn
, SD_LIST_BACK
, sd_it
, dep
)
4245 if (!DEBUG_INSN_P (DEP_PRO (dep
)))
4248 DEP_STATUS (dep
) |= DEP_CANCELLED
;
4250 DEP_STATUS (dep
) &= ~DEP_CANCELLED
;
4256 /* Undo the replacements that have occurred after backtrack point SAVE
4259 undo_replacements_for_backtrack (struct haifa_saved_data
*save
)
4261 while (!save
->replacement_deps
.is_empty ())
4263 dep_t dep
= save
->replacement_deps
.pop ();
4264 int apply_p
= save
->replace_apply
.pop ();
4267 restore_pattern (dep
, true);
4269 apply_replacement (dep
, true);
4271 save
->replacement_deps
.release ();
4272 save
->replace_apply
.release ();
4275 /* Pop entries from the SCHEDULED_INSNS vector up to and including INSN.
4276 Restore their dependencies to an unresolved state, and mark them as
4280 unschedule_insns_until (rtx insn
)
4282 auto_vec
<rtx
> recompute_vec
;
4284 /* Make two passes over the insns to be unscheduled. First, we clear out
4285 dependencies and other trivial bookkeeping. */
4289 sd_iterator_def sd_it
;
4292 last
= scheduled_insns
.pop ();
4294 /* This will be changed by restore_backtrack_point if the insn is in
4296 QUEUE_INDEX (last
) = QUEUE_NOWHERE
;
4298 INSN_TICK (last
) = INVALID_TICK
;
4300 if (modulo_ii
> 0 && INSN_UID (last
) < modulo_iter0_max_uid
)
4301 modulo_insns_scheduled
--;
4303 for (sd_it
= sd_iterator_start (last
, SD_LIST_RES_FORW
);
4304 sd_iterator_cond (&sd_it
, &dep
);)
4306 rtx con
= DEP_CON (dep
);
4307 sd_unresolve_dep (sd_it
);
4308 if (!MUST_RECOMPUTE_SPEC_P (con
))
4310 MUST_RECOMPUTE_SPEC_P (con
) = 1;
4311 recompute_vec
.safe_push (con
);
4319 /* A second pass, to update ready and speculation status for insns
4320 depending on the unscheduled ones. The first pass must have
4321 popped the scheduled_insns vector up to the point where we
4322 restart scheduling, as recompute_todo_spec requires it to be
4324 while (!recompute_vec
.is_empty ())
4328 con
= recompute_vec
.pop ();
4329 MUST_RECOMPUTE_SPEC_P (con
) = 0;
4330 if (!sd_lists_empty_p (con
, SD_LIST_HARD_BACK
))
4332 TODO_SPEC (con
) = HARD_DEP
;
4333 INSN_TICK (con
) = INVALID_TICK
;
4334 if (PREDICATED_PAT (con
) != NULL_RTX
)
4335 haifa_change_pattern (con
, ORIG_PAT (con
));
4337 else if (QUEUE_INDEX (con
) != QUEUE_SCHEDULED
)
4338 TODO_SPEC (con
) = recompute_todo_spec (con
, true);
4342 /* Restore scheduler state from the topmost entry on the backtracking queue.
4343 PSCHED_BLOCK_P points to the local data of schedule_block that we must
4344 overwrite with the saved data.
4345 The caller must already have called unschedule_insns_until. */
4348 restore_last_backtrack_point (struct sched_block_state
*psched_block
)
4352 struct haifa_saved_data
*save
= backtrack_queue
;
4354 backtrack_queue
= save
->next
;
4356 if (current_sched_info
->restore_state
)
4357 (*current_sched_info
->restore_state
) (save
->fe_saved_data
);
4359 if (targetm
.sched
.alloc_sched_context
)
4361 targetm
.sched
.set_sched_context (save
->be_saved_data
);
4362 targetm
.sched
.free_sched_context (save
->be_saved_data
);
4365 /* Do this first since it clobbers INSN_TICK of the involved
4367 undo_replacements_for_backtrack (save
);
4369 /* Clear the QUEUE_INDEX of everything in the ready list or one
4371 if (ready
.n_ready
> 0)
4373 rtx
*first
= ready_lastpos (&ready
);
4374 for (i
= 0; i
< ready
.n_ready
; i
++)
4376 rtx insn
= first
[i
];
4377 QUEUE_INDEX (insn
) = QUEUE_NOWHERE
;
4378 INSN_TICK (insn
) = INVALID_TICK
;
4381 for (i
= 0; i
<= max_insn_queue_index
; i
++)
4383 int q
= NEXT_Q_AFTER (q_ptr
, i
);
4385 for (link
= insn_queue
[q
]; link
; link
= XEXP (link
, 1))
4387 rtx x
= XEXP (link
, 0);
4388 QUEUE_INDEX (x
) = QUEUE_NOWHERE
;
4389 INSN_TICK (x
) = INVALID_TICK
;
4391 free_INSN_LIST_list (&insn_queue
[q
]);
4395 ready
= save
->ready
;
4397 if (ready
.n_ready
> 0)
4399 rtx
*first
= ready_lastpos (&ready
);
4400 for (i
= 0; i
< ready
.n_ready
; i
++)
4402 rtx insn
= first
[i
];
4403 QUEUE_INDEX (insn
) = QUEUE_READY
;
4404 TODO_SPEC (insn
) = recompute_todo_spec (insn
, true);
4405 INSN_TICK (insn
) = save
->clock_var
;
4410 q_size
= save
->q_size
;
4411 for (i
= 0; i
<= max_insn_queue_index
; i
++)
4413 int q
= NEXT_Q_AFTER (q_ptr
, i
);
4415 insn_queue
[q
] = save
->insn_queue
[q
];
4417 for (link
= insn_queue
[q
]; link
; link
= XEXP (link
, 1))
4419 rtx x
= XEXP (link
, 0);
4420 QUEUE_INDEX (x
) = i
;
4421 TODO_SPEC (x
) = recompute_todo_spec (x
, true);
4422 INSN_TICK (x
) = save
->clock_var
+ i
;
4425 free (save
->insn_queue
);
4427 toggle_cancelled_flags (true);
4429 clock_var
= save
->clock_var
;
4430 last_clock_var
= save
->last_clock_var
;
4431 cycle_issued_insns
= save
->cycle_issued_insns
;
4432 last_scheduled_insn
= save
->last_scheduled_insn
;
4433 last_nondebug_scheduled_insn
= save
->last_nondebug_scheduled_insn
;
4434 nonscheduled_insns_begin
= save
->nonscheduled_insns_begin
;
4436 *psched_block
= save
->sched_block
;
4438 memcpy (curr_state
, save
->curr_state
, dfa_state_size
);
4439 free (save
->curr_state
);
4441 mark_backtrack_feeds (save
->delay_pair
->i2
, 0);
4443 gcc_assert (next_cycle_replace_deps
.is_empty ());
4444 next_cycle_replace_deps
= save
->next_cycle_deps
.copy ();
4445 next_cycle_apply
= save
->next_cycle_apply
.copy ();
4449 for (save
= backtrack_queue
; save
; save
= save
->next
)
4451 mark_backtrack_feeds (save
->delay_pair
->i2
, 1);
4455 /* Discard all data associated with the topmost entry in the backtrack
4456 queue. If RESET_TICK is false, we just want to free the data. If true,
4457 we are doing this because we discovered a reason to backtrack. In the
4458 latter case, also reset the INSN_TICK for the shadow insn. */
4460 free_topmost_backtrack_point (bool reset_tick
)
4462 struct haifa_saved_data
*save
= backtrack_queue
;
4465 backtrack_queue
= save
->next
;
4469 struct delay_pair
*pair
= save
->delay_pair
;
4472 INSN_TICK (pair
->i2
) = INVALID_TICK
;
4473 INSN_EXACT_TICK (pair
->i2
) = INVALID_TICK
;
4474 pair
= pair
->next_same_i1
;
4476 undo_replacements_for_backtrack (save
);
4480 save
->replacement_deps
.release ();
4481 save
->replace_apply
.release ();
4484 if (targetm
.sched
.free_sched_context
)
4485 targetm
.sched
.free_sched_context (save
->be_saved_data
);
4486 if (current_sched_info
->restore_state
)
4487 free (save
->fe_saved_data
);
4488 for (i
= 0; i
<= max_insn_queue_index
; i
++)
4489 free_INSN_LIST_list (&save
->insn_queue
[i
]);
4490 free (save
->insn_queue
);
4491 free (save
->curr_state
);
4492 free (save
->ready
.vec
);
4496 /* Free the entire backtrack queue. */
4498 free_backtrack_queue (void)
4500 while (backtrack_queue
)
4501 free_topmost_backtrack_point (false);
4504 /* Apply a replacement described by DESC. If IMMEDIATELY is false, we
4505 may have to postpone the replacement until the start of the next cycle,
4506 at which point we will be called again with IMMEDIATELY true. This is
4507 only done for machines which have instruction packets with explicit
4508 parallelism however. */
4510 apply_replacement (dep_t dep
, bool immediately
)
4512 struct dep_replacement
*desc
= DEP_REPLACE (dep
);
4513 if (!immediately
&& targetm
.sched
.exposed_pipeline
&& reload_completed
)
4515 next_cycle_replace_deps
.safe_push (dep
);
4516 next_cycle_apply
.safe_push (1);
4522 if (QUEUE_INDEX (desc
->insn
) == QUEUE_SCHEDULED
)
4525 if (sched_verbose
>= 5)
4526 fprintf (sched_dump
, "applying replacement for insn %d\n",
4527 INSN_UID (desc
->insn
));
4529 success
= validate_change (desc
->insn
, desc
->loc
, desc
->newval
, 0);
4530 gcc_assert (success
);
4532 update_insn_after_change (desc
->insn
);
4533 if ((TODO_SPEC (desc
->insn
) & (HARD_DEP
| DEP_POSTPONED
)) == 0)
4534 fix_tick_ready (desc
->insn
);
4536 if (backtrack_queue
!= NULL
)
4538 backtrack_queue
->replacement_deps
.safe_push (dep
);
4539 backtrack_queue
->replace_apply
.safe_push (1);
4544 /* We have determined that a pattern involved in DEP must be restored.
4545 If IMMEDIATELY is false, we may have to postpone the replacement
4546 until the start of the next cycle, at which point we will be called
4547 again with IMMEDIATELY true. */
4549 restore_pattern (dep_t dep
, bool immediately
)
4551 rtx next
= DEP_CON (dep
);
4552 int tick
= INSN_TICK (next
);
4554 /* If we already scheduled the insn, the modified version is
4556 if (QUEUE_INDEX (next
) == QUEUE_SCHEDULED
)
4559 if (!immediately
&& targetm
.sched
.exposed_pipeline
&& reload_completed
)
4561 next_cycle_replace_deps
.safe_push (dep
);
4562 next_cycle_apply
.safe_push (0);
4567 if (DEP_TYPE (dep
) == REG_DEP_CONTROL
)
4569 if (sched_verbose
>= 5)
4570 fprintf (sched_dump
, "restoring pattern for insn %d\n",
4572 haifa_change_pattern (next
, ORIG_PAT (next
));
4576 struct dep_replacement
*desc
= DEP_REPLACE (dep
);
4579 if (sched_verbose
>= 5)
4580 fprintf (sched_dump
, "restoring pattern for insn %d\n",
4581 INSN_UID (desc
->insn
));
4582 tick
= INSN_TICK (desc
->insn
);
4584 success
= validate_change (desc
->insn
, desc
->loc
, desc
->orig
, 0);
4585 gcc_assert (success
);
4586 update_insn_after_change (desc
->insn
);
4587 if (backtrack_queue
!= NULL
)
4589 backtrack_queue
->replacement_deps
.safe_push (dep
);
4590 backtrack_queue
->replace_apply
.safe_push (0);
4593 INSN_TICK (next
) = tick
;
4594 if (TODO_SPEC (next
) == DEP_POSTPONED
)
4597 if (sd_lists_empty_p (next
, SD_LIST_BACK
))
4598 TODO_SPEC (next
) = 0;
4599 else if (!sd_lists_empty_p (next
, SD_LIST_HARD_BACK
))
4600 TODO_SPEC (next
) = HARD_DEP
;
4603 /* Perform pattern replacements that were queued up until the next
4606 perform_replacements_new_cycle (void)
4610 FOR_EACH_VEC_ELT (next_cycle_replace_deps
, i
, dep
)
4612 int apply_p
= next_cycle_apply
[i
];
4614 apply_replacement (dep
, true);
4616 restore_pattern (dep
, true);
4618 next_cycle_replace_deps
.truncate (0);
4619 next_cycle_apply
.truncate (0);
4622 /* Compute INSN_TICK_ESTIMATE for INSN. PROCESSED is a bitmap of
4623 instructions we've previously encountered, a set bit prevents
4624 recursion. BUDGET is a limit on how far ahead we look, it is
4625 reduced on recursive calls. Return true if we produced a good
4626 estimate, or false if we exceeded the budget. */
4628 estimate_insn_tick (bitmap processed
, rtx insn
, int budget
)
4630 sd_iterator_def sd_it
;
4632 int earliest
= INSN_TICK (insn
);
4634 FOR_EACH_DEP (insn
, SD_LIST_BACK
, sd_it
, dep
)
4636 rtx pro
= DEP_PRO (dep
);
4639 if (DEP_STATUS (dep
) & DEP_CANCELLED
)
4642 if (QUEUE_INDEX (pro
) == QUEUE_SCHEDULED
)
4643 gcc_assert (INSN_TICK (pro
) + dep_cost (dep
) <= INSN_TICK (insn
));
4646 int cost
= dep_cost (dep
);
4649 if (!bitmap_bit_p (processed
, INSN_LUID (pro
)))
4651 if (!estimate_insn_tick (processed
, pro
, budget
- cost
))
4654 gcc_assert (INSN_TICK_ESTIMATE (pro
) != INVALID_TICK
);
4655 t
= INSN_TICK_ESTIMATE (pro
) + cost
;
4656 if (earliest
== INVALID_TICK
|| t
> earliest
)
4660 bitmap_set_bit (processed
, INSN_LUID (insn
));
4661 INSN_TICK_ESTIMATE (insn
) = earliest
;
4665 /* Examine the pair of insns in P, and estimate (optimistically, assuming
4666 infinite resources) the cycle in which the delayed shadow can be issued.
4667 Return the number of cycles that must pass before the real insn can be
4668 issued in order to meet this constraint. */
4670 estimate_shadow_tick (struct delay_pair
*p
)
4672 bitmap_head processed
;
4675 bitmap_initialize (&processed
, 0);
4677 cutoff
= !estimate_insn_tick (&processed
, p
->i2
,
4678 max_insn_queue_index
+ pair_delay (p
));
4679 bitmap_clear (&processed
);
4681 return max_insn_queue_index
;
4682 t
= INSN_TICK_ESTIMATE (p
->i2
) - (clock_var
+ pair_delay (p
) + 1);
4688 /* If INSN has no unresolved backwards dependencies, add it to the schedule and
4689 recursively resolve all its forward dependencies. */
4691 resolve_dependencies (rtx insn
)
4693 sd_iterator_def sd_it
;
4696 /* Don't use sd_lists_empty_p; it ignores debug insns. */
4697 if (DEPS_LIST_FIRST (INSN_HARD_BACK_DEPS (insn
)) != NULL
4698 || DEPS_LIST_FIRST (INSN_SPEC_BACK_DEPS (insn
)) != NULL
)
4701 if (sched_verbose
>= 4)
4702 fprintf (sched_dump
, ";;\tquickly resolving %d\n", INSN_UID (insn
));
4704 if (QUEUE_INDEX (insn
) >= 0)
4705 queue_remove (insn
);
4707 scheduled_insns
.safe_push (insn
);
4709 /* Update dependent instructions. */
4710 for (sd_it
= sd_iterator_start (insn
, SD_LIST_FORW
);
4711 sd_iterator_cond (&sd_it
, &dep
);)
4713 rtx next
= DEP_CON (dep
);
4715 if (sched_verbose
>= 4)
4716 fprintf (sched_dump
, ";;\t\tdep %d against %d\n", INSN_UID (insn
),
4719 /* Resolve the dependence between INSN and NEXT.
4720 sd_resolve_dep () moves current dep to another list thus
4721 advancing the iterator. */
4722 sd_resolve_dep (sd_it
);
4724 if (!IS_SPECULATION_BRANCHY_CHECK_P (insn
))
4726 resolve_dependencies (next
);
4729 /* Check always has only one forward dependence (to the first insn in
4730 the recovery block), therefore, this will be executed only once. */
4732 gcc_assert (sd_lists_empty_p (insn
, SD_LIST_FORW
));
4738 /* Return the head and tail pointers of ebb starting at BEG and ending
4741 get_ebb_head_tail (basic_block beg
, basic_block end
, rtx
*headp
, rtx
*tailp
)
4743 rtx beg_head
= BB_HEAD (beg
);
4744 rtx beg_tail
= BB_END (beg
);
4745 rtx end_head
= BB_HEAD (end
);
4746 rtx end_tail
= BB_END (end
);
4748 /* Don't include any notes or labels at the beginning of the BEG
4749 basic block, or notes at the end of the END basic blocks. */
4751 if (LABEL_P (beg_head
))
4752 beg_head
= NEXT_INSN (beg_head
);
4754 while (beg_head
!= beg_tail
)
4755 if (NOTE_P (beg_head
))
4756 beg_head
= NEXT_INSN (beg_head
);
4757 else if (DEBUG_INSN_P (beg_head
))
4761 for (note
= NEXT_INSN (beg_head
);
4765 next
= NEXT_INSN (note
);
4768 if (sched_verbose
>= 9)
4769 fprintf (sched_dump
, "reorder %i\n", INSN_UID (note
));
4771 reorder_insns_nobb (note
, note
, PREV_INSN (beg_head
));
4773 if (BLOCK_FOR_INSN (note
) != beg
)
4774 df_insn_change_bb (note
, beg
);
4776 else if (!DEBUG_INSN_P (note
))
4788 end_head
= beg_head
;
4789 else if (LABEL_P (end_head
))
4790 end_head
= NEXT_INSN (end_head
);
4792 while (end_head
!= end_tail
)
4793 if (NOTE_P (end_tail
))
4794 end_tail
= PREV_INSN (end_tail
);
4795 else if (DEBUG_INSN_P (end_tail
))
4799 for (note
= PREV_INSN (end_tail
);
4803 prev
= PREV_INSN (note
);
4806 if (sched_verbose
>= 9)
4807 fprintf (sched_dump
, "reorder %i\n", INSN_UID (note
));
4809 reorder_insns_nobb (note
, note
, end_tail
);
4811 if (end_tail
== BB_END (end
))
4812 BB_END (end
) = note
;
4814 if (BLOCK_FOR_INSN (note
) != end
)
4815 df_insn_change_bb (note
, end
);
4817 else if (!DEBUG_INSN_P (note
))
4829 /* Return nonzero if there are no real insns in the range [ HEAD, TAIL ]. */
4832 no_real_insns_p (const_rtx head
, const_rtx tail
)
4834 while (head
!= NEXT_INSN (tail
))
4836 if (!NOTE_P (head
) && !LABEL_P (head
))
4838 head
= NEXT_INSN (head
);
4843 /* Restore-other-notes: NOTE_LIST is the end of a chain of notes
4844 previously found among the insns. Insert them just before HEAD. */
4846 restore_other_notes (rtx head
, basic_block head_bb
)
4850 rtx note_head
= note_list
;
4853 head_bb
= BLOCK_FOR_INSN (head
);
4855 head
= NEXT_INSN (bb_note (head_bb
));
4857 while (PREV_INSN (note_head
))
4859 set_block_for_insn (note_head
, head_bb
);
4860 note_head
= PREV_INSN (note_head
);
4862 /* In the above cycle we've missed this note. */
4863 set_block_for_insn (note_head
, head_bb
);
4865 PREV_INSN (note_head
) = PREV_INSN (head
);
4866 NEXT_INSN (PREV_INSN (head
)) = note_head
;
4867 PREV_INSN (head
) = note_list
;
4868 NEXT_INSN (note_list
) = head
;
4870 if (BLOCK_FOR_INSN (head
) != head_bb
)
4871 BB_END (head_bb
) = note_list
;
4879 /* When we know we are going to discard the schedule due to a failed attempt
4880 at modulo scheduling, undo all replacements. */
4882 undo_all_replacements (void)
4887 FOR_EACH_VEC_ELT (scheduled_insns
, i
, insn
)
4889 sd_iterator_def sd_it
;
4892 /* See if we must undo a replacement. */
4893 for (sd_it
= sd_iterator_start (insn
, SD_LIST_RES_FORW
);
4894 sd_iterator_cond (&sd_it
, &dep
); sd_iterator_next (&sd_it
))
4896 struct dep_replacement
*desc
= DEP_REPLACE (dep
);
4898 validate_change (desc
->insn
, desc
->loc
, desc
->orig
, 0);
4903 /* Return first non-scheduled insn in the current scheduling block.
4904 This is mostly used for debug-counter purposes. */
4906 first_nonscheduled_insn (void)
4908 rtx insn
= (nonscheduled_insns_begin
!= NULL_RTX
4909 ? nonscheduled_insns_begin
4910 : current_sched_info
->prev_head
);
4914 insn
= next_nonnote_nondebug_insn (insn
);
4916 while (QUEUE_INDEX (insn
) == QUEUE_SCHEDULED
);
4921 /* Move insns that became ready to fire from queue to ready list. */
4924 queue_to_ready (struct ready_list
*ready
)
4930 q_ptr
= NEXT_Q (q_ptr
);
4932 if (dbg_cnt (sched_insn
) == false)
4933 /* If debug counter is activated do not requeue the first
4934 nonscheduled insn. */
4935 skip_insn
= first_nonscheduled_insn ();
4937 skip_insn
= NULL_RTX
;
4939 /* Add all pending insns that can be scheduled without stalls to the
4941 for (link
= insn_queue
[q_ptr
]; link
; link
= XEXP (link
, 1))
4943 insn
= XEXP (link
, 0);
4946 if (sched_verbose
>= 2)
4947 fprintf (sched_dump
, ";;\t\tQ-->Ready: insn %s: ",
4948 (*current_sched_info
->print_insn
) (insn
, 0));
4950 /* If the ready list is full, delay the insn for 1 cycle.
4951 See the comment in schedule_block for the rationale. */
4952 if (!reload_completed
4953 && (ready
->n_ready
- ready
->n_debug
> MAX_SCHED_READY_INSNS
4954 || (sched_pressure
== SCHED_PRESSURE_MODEL
4955 /* Limit pressure recalculations to MAX_SCHED_READY_INSNS
4956 instructions too. */
4957 && model_index (insn
) > (model_curr_point
4958 + MAX_SCHED_READY_INSNS
)))
4959 && !(sched_pressure
== SCHED_PRESSURE_MODEL
4960 && model_curr_point
< model_num_insns
4961 /* Always allow the next model instruction to issue. */
4962 && model_index (insn
) == model_curr_point
)
4963 && !SCHED_GROUP_P (insn
)
4964 && insn
!= skip_insn
)
4966 if (sched_verbose
>= 2)
4967 fprintf (sched_dump
, "keeping in queue, ready full\n");
4968 queue_insn (insn
, 1, "ready full");
4972 ready_add (ready
, insn
, false);
4973 if (sched_verbose
>= 2)
4974 fprintf (sched_dump
, "moving to ready without stalls\n");
4977 free_INSN_LIST_list (&insn_queue
[q_ptr
]);
4979 /* If there are no ready insns, stall until one is ready and add all
4980 of the pending insns at that point to the ready list. */
4981 if (ready
->n_ready
== 0)
4985 for (stalls
= 1; stalls
<= max_insn_queue_index
; stalls
++)
4987 if ((link
= insn_queue
[NEXT_Q_AFTER (q_ptr
, stalls
)]))
4989 for (; link
; link
= XEXP (link
, 1))
4991 insn
= XEXP (link
, 0);
4994 if (sched_verbose
>= 2)
4995 fprintf (sched_dump
, ";;\t\tQ-->Ready: insn %s: ",
4996 (*current_sched_info
->print_insn
) (insn
, 0));
4998 ready_add (ready
, insn
, false);
4999 if (sched_verbose
>= 2)
5000 fprintf (sched_dump
, "moving to ready with %d stalls\n", stalls
);
5002 free_INSN_LIST_list (&insn_queue
[NEXT_Q_AFTER (q_ptr
, stalls
)]);
5004 advance_one_cycle ();
5009 advance_one_cycle ();
5012 q_ptr
= NEXT_Q_AFTER (q_ptr
, stalls
);
5013 clock_var
+= stalls
;
5014 if (sched_verbose
>= 2)
5015 fprintf (sched_dump
, ";;\tAdvancing clock by %d cycle[s] to %d\n",
5020 /* Used by early_queue_to_ready. Determines whether it is "ok" to
5021 prematurely move INSN from the queue to the ready list. Currently,
5022 if a target defines the hook 'is_costly_dependence', this function
5023 uses the hook to check whether there exist any dependences which are
5024 considered costly by the target, between INSN and other insns that
5025 have already been scheduled. Dependences are checked up to Y cycles
5026 back, with default Y=1; The flag -fsched-stalled-insns-dep=Y allows
5027 controlling this value.
5028 (Other considerations could be taken into account instead (or in
5029 addition) depending on user flags and target hooks. */
5032 ok_for_early_queue_removal (rtx insn
)
5034 if (targetm
.sched
.is_costly_dependence
)
5038 int i
= scheduled_insns
.length ();
5039 for (n_cycles
= flag_sched_stalled_insns_dep
; n_cycles
; n_cycles
--)
5045 prev_insn
= scheduled_insns
[i
];
5047 if (!NOTE_P (prev_insn
))
5051 dep
= sd_find_dep_between (prev_insn
, insn
, true);
5055 cost
= dep_cost (dep
);
5057 if (targetm
.sched
.is_costly_dependence (dep
, cost
,
5058 flag_sched_stalled_insns_dep
- n_cycles
))
5063 if (GET_MODE (prev_insn
) == TImode
) /* end of dispatch group */
5076 /* Remove insns from the queue, before they become "ready" with respect
5077 to FU latency considerations. */
5080 early_queue_to_ready (state_t state
, struct ready_list
*ready
)
5088 state_t temp_state
= alloca (dfa_state_size
);
5090 int insns_removed
= 0;
5093 Flag '-fsched-stalled-insns=X' determines the aggressiveness of this
5096 X == 0: There is no limit on how many queued insns can be removed
5097 prematurely. (flag_sched_stalled_insns = -1).
5099 X >= 1: Only X queued insns can be removed prematurely in each
5100 invocation. (flag_sched_stalled_insns = X).
5102 Otherwise: Early queue removal is disabled.
5103 (flag_sched_stalled_insns = 0)
5106 if (! flag_sched_stalled_insns
)
5109 for (stalls
= 0; stalls
<= max_insn_queue_index
; stalls
++)
5111 if ((link
= insn_queue
[NEXT_Q_AFTER (q_ptr
, stalls
)]))
5113 if (sched_verbose
> 6)
5114 fprintf (sched_dump
, ";; look at index %d + %d\n", q_ptr
, stalls
);
5119 next_link
= XEXP (link
, 1);
5120 insn
= XEXP (link
, 0);
5121 if (insn
&& sched_verbose
> 6)
5122 print_rtl_single (sched_dump
, insn
);
5124 memcpy (temp_state
, state
, dfa_state_size
);
5125 if (recog_memoized (insn
) < 0)
5126 /* non-negative to indicate that it's not ready
5127 to avoid infinite Q->R->Q->R... */
5130 cost
= state_transition (temp_state
, insn
);
5132 if (sched_verbose
>= 6)
5133 fprintf (sched_dump
, "transition cost = %d\n", cost
);
5135 move_to_ready
= false;
5138 move_to_ready
= ok_for_early_queue_removal (insn
);
5139 if (move_to_ready
== true)
5141 /* move from Q to R */
5143 ready_add (ready
, insn
, false);
5146 XEXP (prev_link
, 1) = next_link
;
5148 insn_queue
[NEXT_Q_AFTER (q_ptr
, stalls
)] = next_link
;
5150 free_INSN_LIST_node (link
);
5152 if (sched_verbose
>= 2)
5153 fprintf (sched_dump
, ";;\t\tEarly Q-->Ready: insn %s\n",
5154 (*current_sched_info
->print_insn
) (insn
, 0));
5157 if (insns_removed
== flag_sched_stalled_insns
)
5158 /* Remove no more than flag_sched_stalled_insns insns
5159 from Q at a time. */
5160 return insns_removed
;
5164 if (move_to_ready
== false)
5171 } /* for stalls.. */
5173 return insns_removed
;
5177 /* Print the ready list for debugging purposes.
5178 If READY_TRY is non-zero then only print insns that max_issue
5181 debug_ready_list_1 (struct ready_list
*ready
, signed char *ready_try
)
5186 if (ready
->n_ready
== 0)
5188 fprintf (sched_dump
, "\n");
5192 p
= ready_lastpos (ready
);
5193 for (i
= 0; i
< ready
->n_ready
; i
++)
5195 if (ready_try
!= NULL
&& ready_try
[ready
->n_ready
- i
- 1])
5198 fprintf (sched_dump
, " %s:%d",
5199 (*current_sched_info
->print_insn
) (p
[i
], 0),
5201 if (sched_pressure
!= SCHED_PRESSURE_NONE
)
5202 fprintf (sched_dump
, "(cost=%d",
5203 INSN_REG_PRESSURE_EXCESS_COST_CHANGE (p
[i
]));
5204 fprintf (sched_dump
, ":prio=%d", INSN_PRIORITY (p
[i
]));
5205 if (INSN_TICK (p
[i
]) > clock_var
)
5206 fprintf (sched_dump
, ":delay=%d", INSN_TICK (p
[i
]) - clock_var
);
5207 if (sched_pressure
!= SCHED_PRESSURE_NONE
)
5208 fprintf (sched_dump
, ")");
5210 fprintf (sched_dump
, "\n");
5213 /* Print the ready list. Callable from debugger. */
5215 debug_ready_list (struct ready_list
*ready
)
5217 debug_ready_list_1 (ready
, NULL
);
5220 /* Search INSN for REG_SAVE_NOTE notes and convert them back into insn
5221 NOTEs. This is used for NOTE_INSN_EPILOGUE_BEG, so that sched-ebb
5222 replaces the epilogue note in the correct basic block. */
5224 reemit_notes (rtx insn
)
5226 rtx note
, last
= insn
;
5228 for (note
= REG_NOTES (insn
); note
; note
= XEXP (note
, 1))
5230 if (REG_NOTE_KIND (note
) == REG_SAVE_NOTE
)
5232 enum insn_note note_type
= (enum insn_note
) INTVAL (XEXP (note
, 0));
5234 last
= emit_note_before (note_type
, last
);
5235 remove_note (insn
, note
);
5240 /* Move INSN. Reemit notes if needed. Update CFG, if needed. */
5242 move_insn (rtx insn
, rtx last
, rtx nt
)
5244 if (PREV_INSN (insn
) != last
)
5250 bb
= BLOCK_FOR_INSN (insn
);
5252 /* BB_HEAD is either LABEL or NOTE. */
5253 gcc_assert (BB_HEAD (bb
) != insn
);
5255 if (BB_END (bb
) == insn
)
5256 /* If this is last instruction in BB, move end marker one
5259 /* Jumps are always placed at the end of basic block. */
5260 jump_p
= control_flow_insn_p (insn
);
5263 || ((common_sched_info
->sched_pass_id
== SCHED_RGN_PASS
)
5264 && IS_SPECULATION_BRANCHY_CHECK_P (insn
))
5265 || (common_sched_info
->sched_pass_id
5266 == SCHED_EBB_PASS
));
5268 gcc_assert (BLOCK_FOR_INSN (PREV_INSN (insn
)) == bb
);
5270 BB_END (bb
) = PREV_INSN (insn
);
5273 gcc_assert (BB_END (bb
) != last
);
5276 /* We move the block note along with jump. */
5280 note
= NEXT_INSN (insn
);
5281 while (NOTE_NOT_BB_P (note
) && note
!= nt
)
5282 note
= NEXT_INSN (note
);
5286 || BARRIER_P (note
)))
5287 note
= NEXT_INSN (note
);
5289 gcc_assert (NOTE_INSN_BASIC_BLOCK_P (note
));
5294 NEXT_INSN (PREV_INSN (insn
)) = NEXT_INSN (note
);
5295 PREV_INSN (NEXT_INSN (note
)) = PREV_INSN (insn
);
5297 NEXT_INSN (note
) = NEXT_INSN (last
);
5298 PREV_INSN (NEXT_INSN (last
)) = note
;
5300 NEXT_INSN (last
) = insn
;
5301 PREV_INSN (insn
) = last
;
5303 bb
= BLOCK_FOR_INSN (last
);
5307 fix_jump_move (insn
);
5309 if (BLOCK_FOR_INSN (insn
) != bb
)
5310 move_block_after_check (insn
);
5312 gcc_assert (BB_END (bb
) == last
);
5315 df_insn_change_bb (insn
, bb
);
5317 /* Update BB_END, if needed. */
5318 if (BB_END (bb
) == last
)
5322 SCHED_GROUP_P (insn
) = 0;
5325 /* Return true if scheduling INSN will finish current clock cycle. */
5327 insn_finishes_cycle_p (rtx insn
)
5329 if (SCHED_GROUP_P (insn
))
5330 /* After issuing INSN, rest of the sched_group will be forced to issue
5331 in order. Don't make any plans for the rest of cycle. */
5334 /* Finishing the block will, apparently, finish the cycle. */
5335 if (current_sched_info
->insn_finishes_block_p
5336 && current_sched_info
->insn_finishes_block_p (insn
))
5342 /* Define type for target data used in multipass scheduling. */
5343 #ifndef TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DATA_T
5344 # define TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DATA_T int
5346 typedef TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DATA_T first_cycle_multipass_data_t
;
5348 /* The following structure describe an entry of the stack of choices. */
5351 /* Ordinal number of the issued insn in the ready queue. */
5353 /* The number of the rest insns whose issues we should try. */
5355 /* The number of issued essential insns. */
5357 /* State after issuing the insn. */
5359 /* Target-specific data. */
5360 first_cycle_multipass_data_t target_data
;
5363 /* The following array is used to implement a stack of choices used in
5364 function max_issue. */
5365 static struct choice_entry
*choice_stack
;
5367 /* This holds the value of the target dfa_lookahead hook. */
5370 /* The following variable value is maximal number of tries of issuing
5371 insns for the first cycle multipass insn scheduling. We define
5372 this value as constant*(DFA_LOOKAHEAD**ISSUE_RATE). We would not
5373 need this constraint if all real insns (with non-negative codes)
5374 had reservations because in this case the algorithm complexity is
5375 O(DFA_LOOKAHEAD**ISSUE_RATE). Unfortunately, the dfa descriptions
5376 might be incomplete and such insn might occur. For such
5377 descriptions, the complexity of algorithm (without the constraint)
5378 could achieve DFA_LOOKAHEAD ** N , where N is the queue length. */
5379 static int max_lookahead_tries
;
5381 /* The following value is value of hook
5382 `first_cycle_multipass_dfa_lookahead' at the last call of
5384 static int cached_first_cycle_multipass_dfa_lookahead
= 0;
5386 /* The following value is value of `issue_rate' at the last call of
5388 static int cached_issue_rate
= 0;
5390 /* The following function returns maximal (or close to maximal) number
5391 of insns which can be issued on the same cycle and one of which
5392 insns is insns with the best rank (the first insn in READY). To
5393 make this function tries different samples of ready insns. READY
5394 is current queue `ready'. Global array READY_TRY reflects what
5395 insns are already issued in this try. The function stops immediately,
5396 if it reached the such a solution, that all instruction can be issued.
5397 INDEX will contain index of the best insn in READY. The following
5398 function is used only for first cycle multipass scheduling.
5402 This function expects recognized insns only. All USEs,
5403 CLOBBERs, etc must be filtered elsewhere. */
5405 max_issue (struct ready_list
*ready
, int privileged_n
, state_t state
,
5406 bool first_cycle_insn_p
, int *index
)
5408 int n
, i
, all
, n_ready
, best
, delay
, tries_num
;
5410 struct choice_entry
*top
;
5413 n_ready
= ready
->n_ready
;
5414 gcc_assert (dfa_lookahead
>= 1 && privileged_n
>= 0
5415 && privileged_n
<= n_ready
);
5417 /* Init MAX_LOOKAHEAD_TRIES. */
5418 if (cached_first_cycle_multipass_dfa_lookahead
!= dfa_lookahead
)
5420 cached_first_cycle_multipass_dfa_lookahead
= dfa_lookahead
;
5421 max_lookahead_tries
= 100;
5422 for (i
= 0; i
< issue_rate
; i
++)
5423 max_lookahead_tries
*= dfa_lookahead
;
5426 /* Init max_points. */
5427 more_issue
= issue_rate
- cycle_issued_insns
;
5428 gcc_assert (more_issue
>= 0);
5430 /* The number of the issued insns in the best solution. */
5435 /* Set initial state of the search. */
5436 memcpy (top
->state
, state
, dfa_state_size
);
5437 top
->rest
= dfa_lookahead
;
5439 if (targetm
.sched
.first_cycle_multipass_begin
)
5440 targetm
.sched
.first_cycle_multipass_begin (&top
->target_data
,
5442 first_cycle_insn_p
);
5444 /* Count the number of the insns to search among. */
5445 for (all
= i
= 0; i
< n_ready
; i
++)
5449 if (sched_verbose
>= 2)
5451 fprintf (sched_dump
, ";;\t\tmax_issue among %d insns:", all
);
5452 debug_ready_list_1 (ready
, ready_try
);
5455 /* I is the index of the insn to try next. */
5460 if (/* If we've reached a dead end or searched enough of what we have
5463 /* or have nothing else to try... */
5465 /* or should not issue more. */
5466 || top
->n
>= more_issue
)
5468 /* ??? (... || i == n_ready). */
5469 gcc_assert (i
<= n_ready
);
5471 /* We should not issue more than issue_rate instructions. */
5472 gcc_assert (top
->n
<= more_issue
);
5474 if (top
== choice_stack
)
5477 if (best
< top
- choice_stack
)
5482 /* Try to find issued privileged insn. */
5483 while (n
&& !ready_try
[--n
])
5487 if (/* If all insns are equally good... */
5489 /* Or a privileged insn will be issued. */
5491 /* Then we have a solution. */
5493 best
= top
- choice_stack
;
5494 /* This is the index of the insn issued first in this
5496 *index
= choice_stack
[1].index
;
5497 if (top
->n
== more_issue
|| best
== all
)
5502 /* Set ready-list index to point to the last insn
5503 ('i++' below will advance it to the next insn). */
5509 if (targetm
.sched
.first_cycle_multipass_backtrack
)
5510 targetm
.sched
.first_cycle_multipass_backtrack (&top
->target_data
,
5511 ready_try
, n_ready
);
5514 memcpy (state
, top
->state
, dfa_state_size
);
5516 else if (!ready_try
[i
])
5519 if (tries_num
> max_lookahead_tries
)
5521 insn
= ready_element (ready
, i
);
5522 delay
= state_transition (state
, insn
);
5525 if (state_dead_lock_p (state
)
5526 || insn_finishes_cycle_p (insn
))
5527 /* We won't issue any more instructions in the next
5534 if (memcmp (top
->state
, state
, dfa_state_size
) != 0)
5537 /* Advance to the next choice_entry. */
5539 /* Initialize it. */
5540 top
->rest
= dfa_lookahead
;
5543 memcpy (top
->state
, state
, dfa_state_size
);
5546 if (targetm
.sched
.first_cycle_multipass_issue
)
5547 targetm
.sched
.first_cycle_multipass_issue (&top
->target_data
,
5557 /* Increase ready-list index. */
5561 if (targetm
.sched
.first_cycle_multipass_end
)
5562 targetm
.sched
.first_cycle_multipass_end (best
!= 0
5563 ? &choice_stack
[1].target_data
5566 /* Restore the original state of the DFA. */
5567 memcpy (state
, choice_stack
->state
, dfa_state_size
);
5572 /* The following function chooses insn from READY and modifies
5573 READY. The following function is used only for first
5574 cycle multipass scheduling.
5576 -1 if cycle should be advanced,
5577 0 if INSN_PTR is set to point to the desirable insn,
5578 1 if choose_ready () should be restarted without advancing the cycle. */
5580 choose_ready (struct ready_list
*ready
, bool first_cycle_insn_p
,
5585 if (dbg_cnt (sched_insn
) == false)
5587 if (nonscheduled_insns_begin
== NULL_RTX
)
5588 nonscheduled_insns_begin
= current_sched_info
->prev_head
;
5590 rtx insn
= first_nonscheduled_insn ();
5592 if (QUEUE_INDEX (insn
) == QUEUE_READY
)
5593 /* INSN is in the ready_list. */
5595 ready_remove_insn (insn
);
5600 /* INSN is in the queue. Advance cycle to move it to the ready list. */
5601 gcc_assert (QUEUE_INDEX (insn
) >= 0);
5607 if (targetm
.sched
.first_cycle_multipass_dfa_lookahead
)
5608 lookahead
= targetm
.sched
.first_cycle_multipass_dfa_lookahead ();
5609 if (lookahead
<= 0 || SCHED_GROUP_P (ready_element (ready
, 0))
5610 || DEBUG_INSN_P (ready_element (ready
, 0)))
5612 if (targetm
.sched
.dispatch (NULL_RTX
, IS_DISPATCH_ON
))
5613 *insn_ptr
= ready_remove_first_dispatch (ready
);
5615 *insn_ptr
= ready_remove_first (ready
);
5621 /* Try to choose the best insn. */
5625 insn
= ready_element (ready
, 0);
5626 if (INSN_CODE (insn
) < 0)
5628 *insn_ptr
= ready_remove_first (ready
);
5632 /* Filter the search space. */
5633 for (i
= 0; i
< ready
->n_ready
; i
++)
5637 insn
= ready_element (ready
, i
);
5639 /* If this insn is recognizable we should have already
5640 recognized it earlier.
5641 ??? Not very clear where this is supposed to be done.
5643 gcc_checking_assert (INSN_CODE (insn
) >= 0
5644 || recog_memoized (insn
) < 0);
5645 if (INSN_CODE (insn
) < 0)
5647 /* Non-recognized insns at position 0 are handled above. */
5653 if (targetm
.sched
.first_cycle_multipass_dfa_lookahead_guard
)
5656 = (targetm
.sched
.first_cycle_multipass_dfa_lookahead_guard
5659 if (ready_try
[i
] < 0)
5660 /* Queue instruction for several cycles.
5661 We need to restart choose_ready as we have changed
5664 change_queue_index (insn
, -ready_try
[i
]);
5668 /* Make sure that we didn't end up with 0'th insn filtered out.
5669 Don't be tempted to make life easier for backends and just
5670 requeue 0'th insn if (ready_try[0] == 0) and restart
5671 choose_ready. Backends should be very considerate about
5672 requeueing instructions -- especially the highest priority
5673 one at position 0. */
5674 gcc_assert (ready_try
[i
] == 0 || i
> 0);
5679 gcc_assert (ready_try
[i
] == 0);
5680 /* INSN made it through the scrutiny of filters! */
5683 if (max_issue (ready
, 1, curr_state
, first_cycle_insn_p
, &index
) == 0)
5685 *insn_ptr
= ready_remove_first (ready
);
5686 if (sched_verbose
>= 4)
5687 fprintf (sched_dump
, ";;\t\tChosen insn (but can't issue) : %s \n",
5688 (*current_sched_info
->print_insn
) (*insn_ptr
, 0));
5693 if (sched_verbose
>= 4)
5694 fprintf (sched_dump
, ";;\t\tChosen insn : %s\n",
5695 (*current_sched_info
->print_insn
)
5696 (ready_element (ready
, index
), 0));
5698 *insn_ptr
= ready_remove (ready
, index
);
5704 /* This function is called when we have successfully scheduled a
5705 block. It uses the schedule stored in the scheduled_insns vector
5706 to rearrange the RTL. PREV_HEAD is used as the anchor to which we
5707 append the scheduled insns; TAIL is the insn after the scheduled
5708 block. TARGET_BB is the argument passed to schedule_block. */
5711 commit_schedule (rtx prev_head
, rtx tail
, basic_block
*target_bb
)
5716 last_scheduled_insn
= prev_head
;
5718 scheduled_insns
.iterate (i
, &insn
);
5721 if (control_flow_insn_p (last_scheduled_insn
)
5722 || current_sched_info
->advance_target_bb (*target_bb
, insn
))
5724 *target_bb
= current_sched_info
->advance_target_bb (*target_bb
, 0);
5730 x
= next_real_insn (last_scheduled_insn
);
5732 dump_new_block_header (1, *target_bb
, x
, tail
);
5735 last_scheduled_insn
= bb_note (*target_bb
);
5738 if (current_sched_info
->begin_move_insn
)
5739 (*current_sched_info
->begin_move_insn
) (insn
, last_scheduled_insn
);
5740 move_insn (insn
, last_scheduled_insn
,
5741 current_sched_info
->next_tail
);
5742 if (!DEBUG_INSN_P (insn
))
5743 reemit_notes (insn
);
5744 last_scheduled_insn
= insn
;
5747 scheduled_insns
.truncate (0);
5750 /* Examine all insns on the ready list and queue those which can't be
5751 issued in this cycle. TEMP_STATE is temporary scheduler state we
5752 can use as scratch space. If FIRST_CYCLE_INSN_P is true, no insns
5753 have been issued for the current cycle, which means it is valid to
5754 issue an asm statement.
5756 If SHADOWS_ONLY_P is true, we eliminate all real insns and only
5757 leave those for which SHADOW_P is true. If MODULO_EPILOGUE is true,
5758 we only leave insns which have an INSN_EXACT_TICK. */
5761 prune_ready_list (state_t temp_state
, bool first_cycle_insn_p
,
5762 bool shadows_only_p
, bool modulo_epilogue_p
)
5765 bool sched_group_found
= false;
5766 int min_cost_group
= 1;
5768 for (i
= 0; i
< ready
.n_ready
; i
++)
5770 rtx insn
= ready_element (&ready
, i
);
5771 if (SCHED_GROUP_P (insn
))
5773 sched_group_found
= true;
5778 /* Make two passes if there's a SCHED_GROUP_P insn; make sure to handle
5779 such an insn first and note its cost, then schedule all other insns
5780 for one cycle later. */
5781 for (pass
= sched_group_found
? 0 : 1; pass
< 2; )
5783 int n
= ready
.n_ready
;
5784 for (i
= 0; i
< n
; i
++)
5786 rtx insn
= ready_element (&ready
, i
);
5788 const char *reason
= "resource conflict";
5790 if (DEBUG_INSN_P (insn
))
5793 if (sched_group_found
&& !SCHED_GROUP_P (insn
))
5797 cost
= min_cost_group
;
5798 reason
= "not in sched group";
5800 else if (modulo_epilogue_p
5801 && INSN_EXACT_TICK (insn
) == INVALID_TICK
)
5803 cost
= max_insn_queue_index
;
5804 reason
= "not an epilogue insn";
5806 else if (shadows_only_p
&& !SHADOW_P (insn
))
5809 reason
= "not a shadow";
5811 else if (recog_memoized (insn
) < 0)
5813 if (!first_cycle_insn_p
5814 && (GET_CODE (PATTERN (insn
)) == ASM_INPUT
5815 || asm_noperands (PATTERN (insn
)) >= 0))
5819 else if (sched_pressure
!= SCHED_PRESSURE_NONE
)
5821 if (sched_pressure
== SCHED_PRESSURE_MODEL
5822 && INSN_TICK (insn
) <= clock_var
)
5824 memcpy (temp_state
, curr_state
, dfa_state_size
);
5825 if (state_transition (temp_state
, insn
) >= 0)
5826 INSN_TICK (insn
) = clock_var
+ 1;
5836 struct delay_pair
*delay_entry
;
5838 = delay_htab
->find_with_hash (insn
,
5839 htab_hash_pointer (insn
));
5840 while (delay_entry
&& delay_cost
== 0)
5842 delay_cost
= estimate_shadow_tick (delay_entry
);
5843 if (delay_cost
> max_insn_queue_index
)
5844 delay_cost
= max_insn_queue_index
;
5845 delay_entry
= delay_entry
->next_same_i1
;
5849 memcpy (temp_state
, curr_state
, dfa_state_size
);
5850 cost
= state_transition (temp_state
, insn
);
5855 if (cost
< delay_cost
)
5858 reason
= "shadow tick";
5863 if (SCHED_GROUP_P (insn
) && cost
> min_cost_group
)
5864 min_cost_group
= cost
;
5865 ready_remove (&ready
, i
);
5866 queue_insn (insn
, cost
, reason
);
5876 /* Called when we detect that the schedule is impossible. We examine the
5877 backtrack queue to find the earliest insn that caused this condition. */
5879 static struct haifa_saved_data
*
5880 verify_shadows (void)
5882 struct haifa_saved_data
*save
, *earliest_fail
= NULL
;
5883 for (save
= backtrack_queue
; save
; save
= save
->next
)
5886 struct delay_pair
*pair
= save
->delay_pair
;
5889 for (; pair
; pair
= pair
->next_same_i1
)
5893 if (QUEUE_INDEX (i2
) == QUEUE_SCHEDULED
)
5896 t
= INSN_TICK (i1
) + pair_delay (pair
);
5899 if (sched_verbose
>= 2)
5900 fprintf (sched_dump
,
5901 ";;\t\tfailed delay requirements for %d/%d (%d->%d)"
5903 INSN_UID (pair
->i1
), INSN_UID (pair
->i2
),
5904 INSN_TICK (pair
->i1
), INSN_EXACT_TICK (pair
->i2
));
5905 earliest_fail
= save
;
5908 if (QUEUE_INDEX (i2
) >= 0)
5910 int queued_for
= INSN_TICK (i2
);
5914 if (sched_verbose
>= 2)
5915 fprintf (sched_dump
,
5916 ";;\t\tfailed delay requirements for %d/%d"
5917 " (%d->%d), queued too late\n",
5918 INSN_UID (pair
->i1
), INSN_UID (pair
->i2
),
5919 INSN_TICK (pair
->i1
), INSN_EXACT_TICK (pair
->i2
));
5920 earliest_fail
= save
;
5927 return earliest_fail
;
5930 /* Print instructions together with useful scheduling information between
5931 HEAD and TAIL (inclusive). */
5933 dump_insn_stream (rtx head
, rtx tail
)
5935 fprintf (sched_dump
, ";;\t| insn | prio |\n");
5937 rtx next_tail
= NEXT_INSN (tail
);
5938 for (rtx insn
= head
; insn
!= next_tail
; insn
= NEXT_INSN (insn
))
5940 int priority
= NOTE_P (insn
) ? 0 : INSN_PRIORITY (insn
);
5941 const char *pattern
= (NOTE_P (insn
)
5943 : str_pattern_slim (PATTERN (insn
)));
5945 fprintf (sched_dump
, ";;\t| %4d | %4d | %-30s ",
5946 INSN_UID (insn
), priority
, pattern
);
5948 if (sched_verbose
>= 4)
5950 if (NOTE_P (insn
) || recog_memoized (insn
) < 0)
5951 fprintf (sched_dump
, "nothing");
5953 print_reservation (sched_dump
, insn
);
5955 fprintf (sched_dump
, "\n");
5959 /* Use forward list scheduling to rearrange insns of block pointed to by
5960 TARGET_BB, possibly bringing insns from subsequent blocks in the same
5964 schedule_block (basic_block
*target_bb
, state_t init_state
)
5967 bool success
= modulo_ii
== 0;
5968 struct sched_block_state ls
;
5969 state_t temp_state
= NULL
; /* It is used for multipass scheduling. */
5970 int sort_p
, advance
, start_clock_var
;
5972 /* Head/tail info for this block. */
5973 rtx prev_head
= current_sched_info
->prev_head
;
5974 rtx next_tail
= current_sched_info
->next_tail
;
5975 rtx head
= NEXT_INSN (prev_head
);
5976 rtx tail
= PREV_INSN (next_tail
);
5978 if ((current_sched_info
->flags
& DONT_BREAK_DEPENDENCIES
) == 0
5979 && sched_pressure
!= SCHED_PRESSURE_MODEL
)
5980 find_modifiable_mems (head
, tail
);
5982 /* We used to have code to avoid getting parameters moved from hard
5983 argument registers into pseudos.
5985 However, it was removed when it proved to be of marginal benefit
5986 and caused problems because schedule_block and compute_forward_dependences
5987 had different notions of what the "head" insn was. */
5989 gcc_assert (head
!= tail
|| INSN_P (head
));
5991 haifa_recovery_bb_recently_added_p
= false;
5993 backtrack_queue
= NULL
;
5998 dump_new_block_header (0, *target_bb
, head
, tail
);
6000 if (sched_verbose
>= 2)
6002 dump_insn_stream (head
, tail
);
6003 memset (&rank_for_schedule_stats
, 0,
6004 sizeof (rank_for_schedule_stats
));
6008 if (init_state
== NULL
)
6009 state_reset (curr_state
);
6011 memcpy (curr_state
, init_state
, dfa_state_size
);
6013 /* Clear the ready list. */
6014 ready
.first
= ready
.veclen
- 1;
6018 /* It is used for first cycle multipass scheduling. */
6019 temp_state
= alloca (dfa_state_size
);
6021 if (targetm
.sched
.init
)
6022 targetm
.sched
.init (sched_dump
, sched_verbose
, ready
.veclen
);
6024 /* We start inserting insns after PREV_HEAD. */
6025 last_scheduled_insn
= prev_head
;
6026 last_nondebug_scheduled_insn
= NULL_RTX
;
6027 nonscheduled_insns_begin
= NULL_RTX
;
6029 gcc_assert ((NOTE_P (last_scheduled_insn
)
6030 || DEBUG_INSN_P (last_scheduled_insn
))
6031 && BLOCK_FOR_INSN (last_scheduled_insn
) == *target_bb
);
6033 /* Initialize INSN_QUEUE. Q_SIZE is the total number of insns in the
6038 insn_queue
= XALLOCAVEC (rtx
, max_insn_queue_index
+ 1);
6039 memset (insn_queue
, 0, (max_insn_queue_index
+ 1) * sizeof (rtx
));
6041 /* Start just before the beginning of time. */
6044 /* We need queue and ready lists and clock_var be initialized
6045 in try_ready () (which is called through init_ready_list ()). */
6046 (*current_sched_info
->init_ready_list
) ();
6048 if (sched_pressure
== SCHED_PRESSURE_MODEL
)
6049 model_start_schedule ();
6051 /* The algorithm is O(n^2) in the number of ready insns at any given
6052 time in the worst case. Before reload we are more likely to have
6053 big lists so truncate them to a reasonable size. */
6054 if (!reload_completed
6055 && ready
.n_ready
- ready
.n_debug
> MAX_SCHED_READY_INSNS
)
6057 ready_sort (&ready
);
6059 /* Find first free-standing insn past MAX_SCHED_READY_INSNS.
6060 If there are debug insns, we know they're first. */
6061 for (i
= MAX_SCHED_READY_INSNS
+ ready
.n_debug
; i
< ready
.n_ready
; i
++)
6062 if (!SCHED_GROUP_P (ready_element (&ready
, i
)))
6065 if (sched_verbose
>= 2)
6067 fprintf (sched_dump
,
6068 ";;\t\tReady list on entry: %d insns\n", ready
.n_ready
);
6069 fprintf (sched_dump
,
6070 ";;\t\t before reload => truncated to %d insns\n", i
);
6073 /* Delay all insns past it for 1 cycle. If debug counter is
6074 activated make an exception for the insn right after
6075 nonscheduled_insns_begin. */
6079 if (dbg_cnt (sched_insn
) == false)
6080 skip_insn
= first_nonscheduled_insn ();
6082 skip_insn
= NULL_RTX
;
6084 while (i
< ready
.n_ready
)
6088 insn
= ready_remove (&ready
, i
);
6090 if (insn
!= skip_insn
)
6091 queue_insn (insn
, 1, "list truncated");
6094 ready_add (&ready
, skip_insn
, true);
6098 /* Now we can restore basic block notes and maintain precise cfg. */
6099 restore_bb_notes (*target_bb
);
6101 last_clock_var
= -1;
6105 gcc_assert (scheduled_insns
.length () == 0);
6107 must_backtrack
= false;
6108 modulo_insns_scheduled
= 0;
6110 ls
.modulo_epilogue
= false;
6111 ls
.first_cycle_insn_p
= true;
6113 /* Loop until all the insns in BB are scheduled. */
6114 while ((*current_sched_info
->schedule_more_p
) ())
6116 perform_replacements_new_cycle ();
6119 start_clock_var
= clock_var
;
6123 advance_one_cycle ();
6125 /* Add to the ready list all pending insns that can be issued now.
6126 If there are no ready insns, increment clock until one
6127 is ready and add all pending insns at that point to the ready
6129 queue_to_ready (&ready
);
6131 gcc_assert (ready
.n_ready
);
6133 if (sched_verbose
>= 2)
6135 fprintf (sched_dump
, ";;\t\tReady list after queue_to_ready:");
6136 debug_ready_list (&ready
);
6138 advance
-= clock_var
- start_clock_var
;
6140 while (advance
> 0);
6142 if (ls
.modulo_epilogue
)
6144 int stage
= clock_var
/ modulo_ii
;
6145 if (stage
> modulo_last_stage
* 2 + 2)
6147 if (sched_verbose
>= 2)
6148 fprintf (sched_dump
,
6149 ";;\t\tmodulo scheduled succeeded at II %d\n",
6155 else if (modulo_ii
> 0)
6157 int stage
= clock_var
/ modulo_ii
;
6158 if (stage
> modulo_max_stages
)
6160 if (sched_verbose
>= 2)
6161 fprintf (sched_dump
,
6162 ";;\t\tfailing schedule due to excessive stages\n");
6165 if (modulo_n_insns
== modulo_insns_scheduled
6166 && stage
> modulo_last_stage
)
6168 if (sched_verbose
>= 2)
6169 fprintf (sched_dump
,
6170 ";;\t\tfound kernel after %d stages, II %d\n",
6172 ls
.modulo_epilogue
= true;
6176 prune_ready_list (temp_state
, true, false, ls
.modulo_epilogue
);
6177 if (ready
.n_ready
== 0)
6182 ls
.shadows_only_p
= false;
6183 cycle_issued_insns
= 0;
6184 ls
.can_issue_more
= issue_rate
;
6191 if (sort_p
&& ready
.n_ready
> 0)
6193 /* Sort the ready list based on priority. This must be
6194 done every iteration through the loop, as schedule_insn
6195 may have readied additional insns that will not be
6196 sorted correctly. */
6197 ready_sort (&ready
);
6199 if (sched_verbose
>= 2)
6201 fprintf (sched_dump
,
6202 ";;\t\tReady list after ready_sort: ");
6203 debug_ready_list (&ready
);
6207 /* We don't want md sched reorder to even see debug isns, so put
6208 them out right away. */
6209 if (ready
.n_ready
&& DEBUG_INSN_P (ready_element (&ready
, 0))
6210 && (*current_sched_info
->schedule_more_p
) ())
6212 while (ready
.n_ready
&& DEBUG_INSN_P (ready_element (&ready
, 0)))
6214 rtx insn
= ready_remove_first (&ready
);
6215 gcc_assert (DEBUG_INSN_P (insn
));
6216 (*current_sched_info
->begin_schedule_ready
) (insn
);
6217 scheduled_insns
.safe_push (insn
);
6218 last_scheduled_insn
= insn
;
6219 advance
= schedule_insn (insn
);
6220 gcc_assert (advance
== 0);
6221 if (ready
.n_ready
> 0)
6222 ready_sort (&ready
);
6226 if (ls
.first_cycle_insn_p
&& !ready
.n_ready
)
6229 resume_after_backtrack
:
6230 /* Allow the target to reorder the list, typically for
6231 better instruction bundling. */
6233 && (ready
.n_ready
== 0
6234 || !SCHED_GROUP_P (ready_element (&ready
, 0))))
6236 if (ls
.first_cycle_insn_p
&& targetm
.sched
.reorder
)
6238 = targetm
.sched
.reorder (sched_dump
, sched_verbose
,
6239 ready_lastpos (&ready
),
6240 &ready
.n_ready
, clock_var
);
6241 else if (!ls
.first_cycle_insn_p
&& targetm
.sched
.reorder2
)
6243 = targetm
.sched
.reorder2 (sched_dump
, sched_verbose
,
6245 ? ready_lastpos (&ready
) : NULL
,
6246 &ready
.n_ready
, clock_var
);
6249 restart_choose_ready
:
6250 if (sched_verbose
>= 2)
6252 fprintf (sched_dump
, ";;\tReady list (t = %3d): ",
6254 debug_ready_list (&ready
);
6255 if (sched_pressure
== SCHED_PRESSURE_WEIGHTED
)
6256 print_curr_reg_pressure ();
6259 if (ready
.n_ready
== 0
6260 && ls
.can_issue_more
6261 && reload_completed
)
6263 /* Allow scheduling insns directly from the queue in case
6264 there's nothing better to do (ready list is empty) but
6265 there are still vacant dispatch slots in the current cycle. */
6266 if (sched_verbose
>= 6)
6267 fprintf (sched_dump
,";;\t\tSecond chance\n");
6268 memcpy (temp_state
, curr_state
, dfa_state_size
);
6269 if (early_queue_to_ready (temp_state
, &ready
))
6270 ready_sort (&ready
);
6273 if (ready
.n_ready
== 0
6274 || !ls
.can_issue_more
6275 || state_dead_lock_p (curr_state
)
6276 || !(*current_sched_info
->schedule_more_p
) ())
6279 /* Select and remove the insn from the ready list. */
6285 res
= choose_ready (&ready
, ls
.first_cycle_insn_p
, &insn
);
6291 goto restart_choose_ready
;
6293 gcc_assert (insn
!= NULL_RTX
);
6296 insn
= ready_remove_first (&ready
);
6298 if (sched_pressure
!= SCHED_PRESSURE_NONE
6299 && INSN_TICK (insn
) > clock_var
)
6301 ready_add (&ready
, insn
, true);
6306 if (targetm
.sched
.dfa_new_cycle
6307 && targetm
.sched
.dfa_new_cycle (sched_dump
, sched_verbose
,
6308 insn
, last_clock_var
,
6309 clock_var
, &sort_p
))
6310 /* SORT_P is used by the target to override sorting
6311 of the ready list. This is needed when the target
6312 has modified its internal structures expecting that
6313 the insn will be issued next. As we need the insn
6314 to have the highest priority (so it will be returned by
6315 the ready_remove_first call above), we invoke
6316 ready_add (&ready, insn, true).
6317 But, still, there is one issue: INSN can be later
6318 discarded by scheduler's front end through
6319 current_sched_info->can_schedule_ready_p, hence, won't
6322 ready_add (&ready
, insn
, true);
6328 if (current_sched_info
->can_schedule_ready_p
6329 && ! (*current_sched_info
->can_schedule_ready_p
) (insn
))
6330 /* We normally get here only if we don't want to move
6331 insn from the split block. */
6333 TODO_SPEC (insn
) = DEP_POSTPONED
;
6334 goto restart_choose_ready
;
6339 /* If this insn is the first part of a delay-slot pair, record a
6341 struct delay_pair
*delay_entry
;
6343 = delay_htab
->find_with_hash (insn
, htab_hash_pointer (insn
));
6346 save_backtrack_point (delay_entry
, ls
);
6347 if (sched_verbose
>= 2)
6348 fprintf (sched_dump
, ";;\t\tsaving backtrack point\n");
6352 /* DECISION is made. */
6354 if (modulo_ii
> 0 && INSN_UID (insn
) < modulo_iter0_max_uid
)
6356 modulo_insns_scheduled
++;
6357 modulo_last_stage
= clock_var
/ modulo_ii
;
6359 if (TODO_SPEC (insn
) & SPECULATIVE
)
6360 generate_recovery_code (insn
);
6362 if (targetm
.sched
.dispatch (NULL_RTX
, IS_DISPATCH_ON
))
6363 targetm
.sched
.dispatch_do (insn
, ADD_TO_DISPATCH_WINDOW
);
6365 /* Update counters, etc in the scheduler's front end. */
6366 (*current_sched_info
->begin_schedule_ready
) (insn
);
6367 scheduled_insns
.safe_push (insn
);
6368 gcc_assert (NONDEBUG_INSN_P (insn
));
6369 last_nondebug_scheduled_insn
= last_scheduled_insn
= insn
;
6371 if (recog_memoized (insn
) >= 0)
6373 memcpy (temp_state
, curr_state
, dfa_state_size
);
6374 cost
= state_transition (curr_state
, insn
);
6375 if (sched_pressure
!= SCHED_PRESSURE_WEIGHTED
)
6376 gcc_assert (cost
< 0);
6377 if (memcmp (temp_state
, curr_state
, dfa_state_size
) != 0)
6378 cycle_issued_insns
++;
6382 asm_p
= (GET_CODE (PATTERN (insn
)) == ASM_INPUT
6383 || asm_noperands (PATTERN (insn
)) >= 0);
6385 if (targetm
.sched
.variable_issue
)
6387 targetm
.sched
.variable_issue (sched_dump
, sched_verbose
,
6388 insn
, ls
.can_issue_more
);
6389 /* A naked CLOBBER or USE generates no instruction, so do
6390 not count them against the issue rate. */
6391 else if (GET_CODE (PATTERN (insn
)) != USE
6392 && GET_CODE (PATTERN (insn
)) != CLOBBER
)
6393 ls
.can_issue_more
--;
6394 advance
= schedule_insn (insn
);
6396 if (SHADOW_P (insn
))
6397 ls
.shadows_only_p
= true;
6399 /* After issuing an asm insn we should start a new cycle. */
6400 if (advance
== 0 && asm_p
)
6409 ls
.first_cycle_insn_p
= false;
6410 if (ready
.n_ready
> 0)
6411 prune_ready_list (temp_state
, false, ls
.shadows_only_p
,
6412 ls
.modulo_epilogue
);
6416 if (!must_backtrack
)
6417 for (i
= 0; i
< ready
.n_ready
; i
++)
6419 rtx insn
= ready_element (&ready
, i
);
6420 if (INSN_EXACT_TICK (insn
) == clock_var
)
6422 must_backtrack
= true;
6427 if (must_backtrack
&& modulo_ii
> 0)
6429 if (modulo_backtracks_left
== 0)
6431 modulo_backtracks_left
--;
6433 while (must_backtrack
)
6435 struct haifa_saved_data
*failed
;
6438 must_backtrack
= false;
6439 failed
= verify_shadows ();
6440 gcc_assert (failed
);
6442 failed_insn
= failed
->delay_pair
->i1
;
6443 /* Clear these queues. */
6444 perform_replacements_new_cycle ();
6445 toggle_cancelled_flags (false);
6446 unschedule_insns_until (failed_insn
);
6447 while (failed
!= backtrack_queue
)
6448 free_topmost_backtrack_point (true);
6449 restore_last_backtrack_point (&ls
);
6450 if (sched_verbose
>= 2)
6451 fprintf (sched_dump
, ";;\t\trewind to cycle %d\n", clock_var
);
6452 /* Delay by at least a cycle. This could cause additional
6454 queue_insn (failed_insn
, 1, "backtracked");
6458 if (ready
.n_ready
> 0)
6459 goto resume_after_backtrack
;
6462 if (clock_var
== 0 && ls
.first_cycle_insn_p
)
6468 ls
.first_cycle_insn_p
= true;
6470 if (ls
.modulo_epilogue
)
6473 if (!ls
.first_cycle_insn_p
)
6474 advance_one_cycle ();
6475 perform_replacements_new_cycle ();
6478 /* Once again, debug insn suckiness: they can be on the ready list
6479 even if they have unresolved dependencies. To make our view
6480 of the world consistent, remove such "ready" insns. */
6481 restart_debug_insn_loop
:
6482 for (i
= ready
.n_ready
- 1; i
>= 0; i
--)
6486 x
= ready_element (&ready
, i
);
6487 if (DEPS_LIST_FIRST (INSN_HARD_BACK_DEPS (x
)) != NULL
6488 || DEPS_LIST_FIRST (INSN_SPEC_BACK_DEPS (x
)) != NULL
)
6490 ready_remove (&ready
, i
);
6491 goto restart_debug_insn_loop
;
6494 for (i
= ready
.n_ready
- 1; i
>= 0; i
--)
6498 x
= ready_element (&ready
, i
);
6499 resolve_dependencies (x
);
6501 for (i
= 0; i
<= max_insn_queue_index
; i
++)
6504 while ((link
= insn_queue
[i
]) != NULL
)
6506 rtx x
= XEXP (link
, 0);
6507 insn_queue
[i
] = XEXP (link
, 1);
6508 QUEUE_INDEX (x
) = QUEUE_NOWHERE
;
6509 free_INSN_LIST_node (link
);
6510 resolve_dependencies (x
);
6516 undo_all_replacements ();
6521 fprintf (sched_dump
, ";;\tReady list (final): ");
6522 debug_ready_list (&ready
);
6525 if (modulo_ii
== 0 && current_sched_info
->queue_must_finish_empty
)
6526 /* Sanity check -- queue must be empty now. Meaningless if region has
6528 gcc_assert (!q_size
&& !ready
.n_ready
&& !ready
.n_debug
);
6529 else if (modulo_ii
== 0)
6531 /* We must maintain QUEUE_INDEX between blocks in region. */
6532 for (i
= ready
.n_ready
- 1; i
>= 0; i
--)
6536 x
= ready_element (&ready
, i
);
6537 QUEUE_INDEX (x
) = QUEUE_NOWHERE
;
6538 TODO_SPEC (x
) = HARD_DEP
;
6542 for (i
= 0; i
<= max_insn_queue_index
; i
++)
6545 for (link
= insn_queue
[i
]; link
; link
= XEXP (link
, 1))
6550 QUEUE_INDEX (x
) = QUEUE_NOWHERE
;
6551 TODO_SPEC (x
) = HARD_DEP
;
6553 free_INSN_LIST_list (&insn_queue
[i
]);
6557 if (sched_pressure
== SCHED_PRESSURE_MODEL
)
6558 model_end_schedule ();
6562 commit_schedule (prev_head
, tail
, target_bb
);
6564 fprintf (sched_dump
, ";; total time = %d\n", clock_var
);
6567 last_scheduled_insn
= tail
;
6569 scheduled_insns
.truncate (0);
6571 if (!current_sched_info
->queue_must_finish_empty
6572 || haifa_recovery_bb_recently_added_p
)
6574 /* INSN_TICK (minimum clock tick at which the insn becomes
6575 ready) may be not correct for the insn in the subsequent
6576 blocks of the region. We should use a correct value of
6577 `clock_var' or modify INSN_TICK. It is better to keep
6578 clock_var value equal to 0 at the start of a basic block.
6579 Therefore we modify INSN_TICK here. */
6580 fix_inter_tick (NEXT_INSN (prev_head
), last_scheduled_insn
);
6583 if (targetm
.sched
.finish
)
6585 targetm
.sched
.finish (sched_dump
, sched_verbose
);
6586 /* Target might have added some instructions to the scheduled block
6587 in its md_finish () hook. These new insns don't have any data
6588 initialized and to identify them we extend h_i_d so that they'll
6590 sched_extend_luids ();
6593 /* Update head/tail boundaries. */
6594 head
= NEXT_INSN (prev_head
);
6595 tail
= last_scheduled_insn
;
6599 fprintf (sched_dump
, ";; new head = %d\n;; new tail = %d\n",
6600 INSN_UID (head
), INSN_UID (tail
));
6602 if (sched_verbose
>= 2)
6604 dump_insn_stream (head
, tail
);
6605 print_rank_for_schedule_stats (";; TOTAL ", &rank_for_schedule_stats
);
6608 fprintf (sched_dump
, "\n");
6611 head
= restore_other_notes (head
, NULL
);
6613 current_sched_info
->head
= head
;
6614 current_sched_info
->tail
= tail
;
6616 free_backtrack_queue ();
6621 /* Set_priorities: compute priority of each insn in the block. */
6624 set_priorities (rtx head
, rtx tail
)
6628 int sched_max_insns_priority
=
6629 current_sched_info
->sched_max_insns_priority
;
6632 if (head
== tail
&& ! INSN_P (head
))
6637 prev_head
= PREV_INSN (head
);
6638 for (insn
= tail
; insn
!= prev_head
; insn
= PREV_INSN (insn
))
6644 (void) priority (insn
);
6646 gcc_assert (INSN_PRIORITY_KNOWN (insn
));
6648 sched_max_insns_priority
= MAX (sched_max_insns_priority
,
6649 INSN_PRIORITY (insn
));
6652 current_sched_info
->sched_max_insns_priority
= sched_max_insns_priority
;
6657 /* Set dump and sched_verbose for the desired debugging output. If no
6658 dump-file was specified, but -fsched-verbose=N (any N), print to stderr.
6659 For -fsched-verbose=N, N>=10, print everything to stderr. */
6661 setup_sched_dump (void)
6663 sched_verbose
= sched_verbose_param
;
6664 if (sched_verbose_param
== 0 && dump_file
)
6666 sched_dump
= ((sched_verbose_param
>= 10 || !dump_file
)
6667 ? stderr
: dump_file
);
6670 /* Allocate data for register pressure sensitive scheduling. */
6672 alloc_global_sched_pressure_data (void)
6674 if (sched_pressure
!= SCHED_PRESSURE_NONE
)
6676 int i
, max_regno
= max_reg_num ();
6678 if (sched_dump
!= NULL
)
6679 /* We need info about pseudos for rtl dumps about pseudo
6680 classes and costs. */
6681 regstat_init_n_sets_and_refs ();
6682 ira_set_pseudo_classes (true, sched_verbose
? sched_dump
: NULL
);
6683 sched_regno_pressure_class
6684 = (enum reg_class
*) xmalloc (max_regno
* sizeof (enum reg_class
));
6685 for (i
= 0; i
< max_regno
; i
++)
6686 sched_regno_pressure_class
[i
]
6687 = (i
< FIRST_PSEUDO_REGISTER
6688 ? ira_pressure_class_translate
[REGNO_REG_CLASS (i
)]
6689 : ira_pressure_class_translate
[reg_allocno_class (i
)]);
6690 curr_reg_live
= BITMAP_ALLOC (NULL
);
6691 if (sched_pressure
== SCHED_PRESSURE_WEIGHTED
)
6693 saved_reg_live
= BITMAP_ALLOC (NULL
);
6694 region_ref_regs
= BITMAP_ALLOC (NULL
);
6699 /* Free data for register pressure sensitive scheduling. Also called
6700 from schedule_region when stopping sched-pressure early. */
6702 free_global_sched_pressure_data (void)
6704 if (sched_pressure
!= SCHED_PRESSURE_NONE
)
6706 if (regstat_n_sets_and_refs
!= NULL
)
6707 regstat_free_n_sets_and_refs ();
6708 if (sched_pressure
== SCHED_PRESSURE_WEIGHTED
)
6710 BITMAP_FREE (region_ref_regs
);
6711 BITMAP_FREE (saved_reg_live
);
6713 BITMAP_FREE (curr_reg_live
);
6714 free (sched_regno_pressure_class
);
6718 /* Initialize some global state for the scheduler. This function works
6719 with the common data shared between all the schedulers. It is called
6720 from the scheduler specific initialization routine. */
6725 /* Disable speculative loads in their presence if cc0 defined. */
6727 flag_schedule_speculative_load
= 0;
6730 if (targetm
.sched
.dispatch (NULL_RTX
, IS_DISPATCH_ON
))
6731 targetm
.sched
.dispatch_do (NULL_RTX
, DISPATCH_INIT
);
6733 if (live_range_shrinkage_p
)
6734 sched_pressure
= SCHED_PRESSURE_WEIGHTED
;
6735 else if (flag_sched_pressure
6736 && !reload_completed
6737 && common_sched_info
->sched_pass_id
== SCHED_RGN_PASS
)
6738 sched_pressure
= ((enum sched_pressure_algorithm
)
6739 PARAM_VALUE (PARAM_SCHED_PRESSURE_ALGORITHM
));
6741 sched_pressure
= SCHED_PRESSURE_NONE
;
6743 if (sched_pressure
!= SCHED_PRESSURE_NONE
)
6744 ira_setup_eliminable_regset ();
6746 /* Initialize SPEC_INFO. */
6747 if (targetm
.sched
.set_sched_flags
)
6749 spec_info
= &spec_info_var
;
6750 targetm
.sched
.set_sched_flags (spec_info
);
6752 if (spec_info
->mask
!= 0)
6754 spec_info
->data_weakness_cutoff
=
6755 (PARAM_VALUE (PARAM_SCHED_SPEC_PROB_CUTOFF
) * MAX_DEP_WEAK
) / 100;
6756 spec_info
->control_weakness_cutoff
=
6757 (PARAM_VALUE (PARAM_SCHED_SPEC_PROB_CUTOFF
)
6758 * REG_BR_PROB_BASE
) / 100;
6761 /* So we won't read anything accidentally. */
6766 /* So we won't read anything accidentally. */
6769 /* Initialize issue_rate. */
6770 if (targetm
.sched
.issue_rate
)
6771 issue_rate
= targetm
.sched
.issue_rate ();
6775 if (cached_issue_rate
!= issue_rate
)
6777 cached_issue_rate
= issue_rate
;
6778 /* To invalidate max_lookahead_tries: */
6779 cached_first_cycle_multipass_dfa_lookahead
= 0;
6782 if (targetm
.sched
.first_cycle_multipass_dfa_lookahead
)
6783 dfa_lookahead
= targetm
.sched
.first_cycle_multipass_dfa_lookahead ();
6787 if (targetm
.sched
.init_dfa_pre_cycle_insn
)
6788 targetm
.sched
.init_dfa_pre_cycle_insn ();
6790 if (targetm
.sched
.init_dfa_post_cycle_insn
)
6791 targetm
.sched
.init_dfa_post_cycle_insn ();
6794 dfa_state_size
= state_size ();
6796 init_alias_analysis ();
6799 df_set_flags (DF_LR_RUN_DCE
);
6800 df_note_add_problem ();
6802 /* More problems needed for interloop dep calculation in SMS. */
6803 if (common_sched_info
->sched_pass_id
== SCHED_SMS_PASS
)
6805 df_rd_add_problem ();
6806 df_chain_add_problem (DF_DU_CHAIN
+ DF_UD_CHAIN
);
6811 /* Do not run DCE after reload, as this can kill nops inserted
6813 if (reload_completed
)
6814 df_clear_flags (DF_LR_RUN_DCE
);
6816 regstat_compute_calls_crossed ();
6818 if (targetm
.sched
.init_global
)
6819 targetm
.sched
.init_global (sched_dump
, sched_verbose
, get_max_uid () + 1);
6821 alloc_global_sched_pressure_data ();
6823 curr_state
= xmalloc (dfa_state_size
);
6826 static void haifa_init_only_bb (basic_block
, basic_block
);
6828 /* Initialize data structures specific to the Haifa scheduler. */
6830 haifa_sched_init (void)
6832 setup_sched_dump ();
6835 scheduled_insns
.create (0);
6837 if (spec_info
!= NULL
)
6839 sched_deps_info
->use_deps_list
= 1;
6840 sched_deps_info
->generate_spec_deps
= 1;
6843 /* Initialize luids, dependency caches, target and h_i_d for the
6847 bbs
.create (n_basic_blocks_for_fn (cfun
));
6852 FOR_EACH_BB_FN (bb
, cfun
)
6853 bbs
.quick_push (bb
);
6854 sched_init_luids (bbs
);
6855 sched_deps_init (true);
6856 sched_extend_target ();
6857 haifa_init_h_i_d (bbs
);
6862 sched_init_only_bb
= haifa_init_only_bb
;
6863 sched_split_block
= sched_split_block_1
;
6864 sched_create_empty_bb
= sched_create_empty_bb_1
;
6865 haifa_recovery_bb_ever_added_p
= false;
6867 nr_begin_data
= nr_begin_control
= nr_be_in_data
= nr_be_in_control
= 0;
6868 before_recovery
= 0;
6874 /* Finish work with the data specific to the Haifa scheduler. */
6876 haifa_sched_finish (void)
6878 sched_create_empty_bb
= NULL
;
6879 sched_split_block
= NULL
;
6880 sched_init_only_bb
= NULL
;
6882 if (spec_info
&& spec_info
->dump
)
6884 char c
= reload_completed
? 'a' : 'b';
6886 fprintf (spec_info
->dump
,
6887 ";; %s:\n", current_function_name ());
6889 fprintf (spec_info
->dump
,
6890 ";; Procedure %cr-begin-data-spec motions == %d\n",
6892 fprintf (spec_info
->dump
,
6893 ";; Procedure %cr-be-in-data-spec motions == %d\n",
6895 fprintf (spec_info
->dump
,
6896 ";; Procedure %cr-begin-control-spec motions == %d\n",
6897 c
, nr_begin_control
);
6898 fprintf (spec_info
->dump
,
6899 ";; Procedure %cr-be-in-control-spec motions == %d\n",
6900 c
, nr_be_in_control
);
6903 scheduled_insns
.release ();
6905 /* Finalize h_i_d, dependency caches, and luids for the whole
6906 function. Target will be finalized in md_global_finish (). */
6907 sched_deps_finish ();
6908 sched_finish_luids ();
6909 current_sched_info
= NULL
;
6913 /* Free global data used during insn scheduling. This function works with
6914 the common data shared between the schedulers. */
6919 haifa_finish_h_i_d ();
6920 free_global_sched_pressure_data ();
6923 if (targetm
.sched
.finish_global
)
6924 targetm
.sched
.finish_global (sched_dump
, sched_verbose
);
6926 end_alias_analysis ();
6928 regstat_free_calls_crossed ();
6933 /* Free all delay_pair structures that were recorded. */
6935 free_delay_pairs (void)
6939 delay_htab
->empty ();
6940 delay_htab_i2
->empty ();
6944 /* Fix INSN_TICKs of the instructions in the current block as well as
6945 INSN_TICKs of their dependents.
6946 HEAD and TAIL are the begin and the end of the current scheduled block. */
6948 fix_inter_tick (rtx head
, rtx tail
)
6950 /* Set of instructions with corrected INSN_TICK. */
6951 bitmap_head processed
;
6952 /* ??? It is doubtful if we should assume that cycle advance happens on
6953 basic block boundaries. Basically insns that are unconditionally ready
6954 on the start of the block are more preferable then those which have
6955 a one cycle dependency over insn from the previous block. */
6956 int next_clock
= clock_var
+ 1;
6958 bitmap_initialize (&processed
, 0);
6960 /* Iterates over scheduled instructions and fix their INSN_TICKs and
6961 INSN_TICKs of dependent instructions, so that INSN_TICKs are consistent
6962 across different blocks. */
6963 for (tail
= NEXT_INSN (tail
); head
!= tail
; head
= NEXT_INSN (head
))
6968 sd_iterator_def sd_it
;
6971 tick
= INSN_TICK (head
);
6972 gcc_assert (tick
>= MIN_TICK
);
6974 /* Fix INSN_TICK of instruction from just scheduled block. */
6975 if (bitmap_set_bit (&processed
, INSN_LUID (head
)))
6979 if (tick
< MIN_TICK
)
6982 INSN_TICK (head
) = tick
;
6985 if (DEBUG_INSN_P (head
))
6988 FOR_EACH_DEP (head
, SD_LIST_RES_FORW
, sd_it
, dep
)
6992 next
= DEP_CON (dep
);
6993 tick
= INSN_TICK (next
);
6995 if (tick
!= INVALID_TICK
6996 /* If NEXT has its INSN_TICK calculated, fix it.
6997 If not - it will be properly calculated from
6998 scratch later in fix_tick_ready. */
6999 && bitmap_set_bit (&processed
, INSN_LUID (next
)))
7003 if (tick
< MIN_TICK
)
7006 if (tick
> INTER_TICK (next
))
7007 INTER_TICK (next
) = tick
;
7009 tick
= INTER_TICK (next
);
7011 INSN_TICK (next
) = tick
;
7016 bitmap_clear (&processed
);
7019 /* Check if NEXT is ready to be added to the ready or queue list.
7020 If "yes", add it to the proper list.
7022 -1 - is not ready yet,
7023 0 - added to the ready list,
7024 0 < N - queued for N cycles. */
7026 try_ready (rtx next
)
7028 ds_t old_ts
, new_ts
;
7030 old_ts
= TODO_SPEC (next
);
7032 gcc_assert (!(old_ts
& ~(SPECULATIVE
| HARD_DEP
| DEP_CONTROL
| DEP_POSTPONED
))
7033 && (old_ts
== HARD_DEP
7034 || old_ts
== DEP_POSTPONED
7035 || (old_ts
& SPECULATIVE
)
7036 || old_ts
== DEP_CONTROL
));
7038 new_ts
= recompute_todo_spec (next
, false);
7040 if (new_ts
& (HARD_DEP
| DEP_POSTPONED
))
7041 gcc_assert (new_ts
== old_ts
7042 && QUEUE_INDEX (next
) == QUEUE_NOWHERE
);
7043 else if (current_sched_info
->new_ready
)
7044 new_ts
= current_sched_info
->new_ready (next
, new_ts
);
7046 /* * if !(old_ts & SPECULATIVE) (e.g. HARD_DEP or 0), then insn might
7047 have its original pattern or changed (speculative) one. This is due
7048 to changing ebb in region scheduling.
7049 * But if (old_ts & SPECULATIVE), then we are pretty sure that insn
7050 has speculative pattern.
7052 We can't assert (!(new_ts & HARD_DEP) || new_ts == old_ts) here because
7053 control-speculative NEXT could have been discarded by sched-rgn.c
7054 (the same case as when discarded by can_schedule_ready_p ()). */
7056 if ((new_ts
& SPECULATIVE
)
7057 /* If (old_ts == new_ts), then (old_ts & SPECULATIVE) and we don't
7058 need to change anything. */
7059 && new_ts
!= old_ts
)
7064 gcc_assert ((new_ts
& SPECULATIVE
) && !(new_ts
& ~SPECULATIVE
));
7066 res
= haifa_speculate_insn (next
, new_ts
, &new_pat
);
7071 /* It would be nice to change DEP_STATUS of all dependences,
7072 which have ((DEP_STATUS & SPECULATIVE) == new_ts) to HARD_DEP,
7073 so we won't reanalyze anything. */
7078 /* We follow the rule, that every speculative insn
7079 has non-null ORIG_PAT. */
7080 if (!ORIG_PAT (next
))
7081 ORIG_PAT (next
) = PATTERN (next
);
7085 if (!ORIG_PAT (next
))
7086 /* If we gonna to overwrite the original pattern of insn,
7088 ORIG_PAT (next
) = PATTERN (next
);
7090 res
= haifa_change_pattern (next
, new_pat
);
7099 /* We need to restore pattern only if (new_ts == 0), because otherwise it is
7100 either correct (new_ts & SPECULATIVE),
7101 or we simply don't care (new_ts & HARD_DEP). */
7103 gcc_assert (!ORIG_PAT (next
)
7104 || !IS_SPECULATION_BRANCHY_CHECK_P (next
));
7106 TODO_SPEC (next
) = new_ts
;
7108 if (new_ts
& (HARD_DEP
| DEP_POSTPONED
))
7110 /* We can't assert (QUEUE_INDEX (next) == QUEUE_NOWHERE) here because
7111 control-speculative NEXT could have been discarded by sched-rgn.c
7112 (the same case as when discarded by can_schedule_ready_p ()). */
7113 /*gcc_assert (QUEUE_INDEX (next) == QUEUE_NOWHERE);*/
7115 change_queue_index (next
, QUEUE_NOWHERE
);
7119 else if (!(new_ts
& BEGIN_SPEC
)
7120 && ORIG_PAT (next
) && PREDICATED_PAT (next
) == NULL_RTX
7121 && !IS_SPECULATION_CHECK_P (next
))
7122 /* We should change pattern of every previously speculative
7123 instruction - and we determine if NEXT was speculative by using
7124 ORIG_PAT field. Except one case - speculation checks have ORIG_PAT
7125 pat too, so skip them. */
7127 bool success
= haifa_change_pattern (next
, ORIG_PAT (next
));
7128 gcc_assert (success
);
7129 ORIG_PAT (next
) = 0;
7132 if (sched_verbose
>= 2)
7134 fprintf (sched_dump
, ";;\t\tdependencies resolved: insn %s",
7135 (*current_sched_info
->print_insn
) (next
, 0));
7137 if (spec_info
&& spec_info
->dump
)
7139 if (new_ts
& BEGIN_DATA
)
7140 fprintf (spec_info
->dump
, "; data-spec;");
7141 if (new_ts
& BEGIN_CONTROL
)
7142 fprintf (spec_info
->dump
, "; control-spec;");
7143 if (new_ts
& BE_IN_CONTROL
)
7144 fprintf (spec_info
->dump
, "; in-control-spec;");
7146 if (TODO_SPEC (next
) & DEP_CONTROL
)
7147 fprintf (sched_dump
, " predicated");
7148 fprintf (sched_dump
, "\n");
7151 adjust_priority (next
);
7153 return fix_tick_ready (next
);
7156 /* Calculate INSN_TICK of NEXT and add it to either ready or queue list. */
7158 fix_tick_ready (rtx next
)
7162 if (!DEBUG_INSN_P (next
) && !sd_lists_empty_p (next
, SD_LIST_RES_BACK
))
7165 sd_iterator_def sd_it
;
7168 tick
= INSN_TICK (next
);
7169 /* if tick is not equal to INVALID_TICK, then update
7170 INSN_TICK of NEXT with the most recent resolved dependence
7171 cost. Otherwise, recalculate from scratch. */
7172 full_p
= (tick
== INVALID_TICK
);
7174 FOR_EACH_DEP (next
, SD_LIST_RES_BACK
, sd_it
, dep
)
7176 rtx pro
= DEP_PRO (dep
);
7179 gcc_assert (INSN_TICK (pro
) >= MIN_TICK
);
7181 tick1
= INSN_TICK (pro
) + dep_cost (dep
);
7192 INSN_TICK (next
) = tick
;
7194 delay
= tick
- clock_var
;
7195 if (delay
<= 0 || sched_pressure
!= SCHED_PRESSURE_NONE
)
7196 delay
= QUEUE_READY
;
7198 change_queue_index (next
, delay
);
7203 /* Move NEXT to the proper queue list with (DELAY >= 1),
7204 or add it to the ready list (DELAY == QUEUE_READY),
7205 or remove it from ready and queue lists at all (DELAY == QUEUE_NOWHERE). */
7207 change_queue_index (rtx next
, int delay
)
7209 int i
= QUEUE_INDEX (next
);
7211 gcc_assert (QUEUE_NOWHERE
<= delay
&& delay
<= max_insn_queue_index
7213 gcc_assert (i
!= QUEUE_SCHEDULED
);
7215 if ((delay
> 0 && NEXT_Q_AFTER (q_ptr
, delay
) == i
)
7216 || (delay
< 0 && delay
== i
))
7217 /* We have nothing to do. */
7220 /* Remove NEXT from wherever it is now. */
7221 if (i
== QUEUE_READY
)
7222 ready_remove_insn (next
);
7224 queue_remove (next
);
7226 /* Add it to the proper place. */
7227 if (delay
== QUEUE_READY
)
7228 ready_add (readyp
, next
, false);
7229 else if (delay
>= 1)
7230 queue_insn (next
, delay
, "change queue index");
7232 if (sched_verbose
>= 2)
7234 fprintf (sched_dump
, ";;\t\ttick updated: insn %s",
7235 (*current_sched_info
->print_insn
) (next
, 0));
7237 if (delay
== QUEUE_READY
)
7238 fprintf (sched_dump
, " into ready\n");
7239 else if (delay
>= 1)
7240 fprintf (sched_dump
, " into queue with cost=%d\n", delay
);
7242 fprintf (sched_dump
, " removed from ready or queue lists\n");
7246 static int sched_ready_n_insns
= -1;
7248 /* Initialize per region data structures. */
7250 sched_extend_ready_list (int new_sched_ready_n_insns
)
7254 if (sched_ready_n_insns
== -1)
7255 /* At the first call we need to initialize one more choice_stack
7259 sched_ready_n_insns
= 0;
7260 scheduled_insns
.reserve (new_sched_ready_n_insns
);
7263 i
= sched_ready_n_insns
+ 1;
7265 ready
.veclen
= new_sched_ready_n_insns
+ issue_rate
;
7266 ready
.vec
= XRESIZEVEC (rtx
, ready
.vec
, ready
.veclen
);
7268 gcc_assert (new_sched_ready_n_insns
>= sched_ready_n_insns
);
7270 ready_try
= (signed char *) xrecalloc (ready_try
, new_sched_ready_n_insns
,
7271 sched_ready_n_insns
,
7272 sizeof (*ready_try
));
7274 /* We allocate +1 element to save initial state in the choice_stack[0]
7276 choice_stack
= XRESIZEVEC (struct choice_entry
, choice_stack
,
7277 new_sched_ready_n_insns
+ 1);
7279 for (; i
<= new_sched_ready_n_insns
; i
++)
7281 choice_stack
[i
].state
= xmalloc (dfa_state_size
);
7283 if (targetm
.sched
.first_cycle_multipass_init
)
7284 targetm
.sched
.first_cycle_multipass_init (&(choice_stack
[i
]
7288 sched_ready_n_insns
= new_sched_ready_n_insns
;
7291 /* Free per region data structures. */
7293 sched_finish_ready_list (void)
7304 for (i
= 0; i
<= sched_ready_n_insns
; i
++)
7306 if (targetm
.sched
.first_cycle_multipass_fini
)
7307 targetm
.sched
.first_cycle_multipass_fini (&(choice_stack
[i
]
7310 free (choice_stack
[i
].state
);
7312 free (choice_stack
);
7313 choice_stack
= NULL
;
7315 sched_ready_n_insns
= -1;
7319 haifa_luid_for_non_insn (rtx x
)
7321 gcc_assert (NOTE_P (x
) || LABEL_P (x
));
7326 /* Generates recovery code for INSN. */
7328 generate_recovery_code (rtx insn
)
7330 if (TODO_SPEC (insn
) & BEGIN_SPEC
)
7331 begin_speculative_block (insn
);
7333 /* Here we have insn with no dependencies to
7334 instructions other then CHECK_SPEC ones. */
7336 if (TODO_SPEC (insn
) & BE_IN_SPEC
)
7337 add_to_speculative_block (insn
);
7341 Tries to add speculative dependencies of type FS between instructions
7342 in deps_list L and TWIN. */
7344 process_insn_forw_deps_be_in_spec (rtx insn
, rtx twin
, ds_t fs
)
7346 sd_iterator_def sd_it
;
7349 FOR_EACH_DEP (insn
, SD_LIST_FORW
, sd_it
, dep
)
7354 consumer
= DEP_CON (dep
);
7356 ds
= DEP_STATUS (dep
);
7358 if (/* If we want to create speculative dep. */
7360 /* And we can do that because this is a true dep. */
7361 && (ds
& DEP_TYPES
) == DEP_TRUE
)
7363 gcc_assert (!(ds
& BE_IN_SPEC
));
7365 if (/* If this dep can be overcome with 'begin speculation'. */
7367 /* Then we have a choice: keep the dep 'begin speculative'
7368 or transform it into 'be in speculative'. */
7370 if (/* In try_ready we assert that if insn once became ready
7371 it can be removed from the ready (or queue) list only
7372 due to backend decision. Hence we can't let the
7373 probability of the speculative dep to decrease. */
7374 ds_weak (ds
) <= ds_weak (fs
))
7378 new_ds
= (ds
& ~BEGIN_SPEC
) | fs
;
7380 if (/* consumer can 'be in speculative'. */
7381 sched_insn_is_legitimate_for_speculation_p (consumer
,
7383 /* Transform it to be in speculative. */
7388 /* Mark the dep as 'be in speculative'. */
7393 dep_def _new_dep
, *new_dep
= &_new_dep
;
7395 init_dep_1 (new_dep
, twin
, consumer
, DEP_TYPE (dep
), ds
);
7396 sd_add_dep (new_dep
, false);
7401 /* Generates recovery code for BEGIN speculative INSN. */
7403 begin_speculative_block (rtx insn
)
7405 if (TODO_SPEC (insn
) & BEGIN_DATA
)
7407 if (TODO_SPEC (insn
) & BEGIN_CONTROL
)
7410 create_check_block_twin (insn
, false);
7412 TODO_SPEC (insn
) &= ~BEGIN_SPEC
;
7415 static void haifa_init_insn (rtx
);
7417 /* Generates recovery code for BE_IN speculative INSN. */
7419 add_to_speculative_block (rtx insn
)
7422 sd_iterator_def sd_it
;
7425 rtx_vec_t priorities_roots
;
7427 ts
= TODO_SPEC (insn
);
7428 gcc_assert (!(ts
& ~BE_IN_SPEC
));
7430 if (ts
& BE_IN_DATA
)
7432 if (ts
& BE_IN_CONTROL
)
7435 TODO_SPEC (insn
) &= ~BE_IN_SPEC
;
7436 gcc_assert (!TODO_SPEC (insn
));
7438 DONE_SPEC (insn
) |= ts
;
7440 /* First we convert all simple checks to branchy. */
7441 for (sd_it
= sd_iterator_start (insn
, SD_LIST_SPEC_BACK
);
7442 sd_iterator_cond (&sd_it
, &dep
);)
7444 rtx check
= DEP_PRO (dep
);
7446 if (IS_SPECULATION_SIMPLE_CHECK_P (check
))
7448 create_check_block_twin (check
, true);
7450 /* Restart search. */
7451 sd_it
= sd_iterator_start (insn
, SD_LIST_SPEC_BACK
);
7454 /* Continue search. */
7455 sd_iterator_next (&sd_it
);
7458 priorities_roots
.create (0);
7459 clear_priorities (insn
, &priorities_roots
);
7466 /* Get the first backward dependency of INSN. */
7467 sd_it
= sd_iterator_start (insn
, SD_LIST_SPEC_BACK
);
7468 if (!sd_iterator_cond (&sd_it
, &dep
))
7469 /* INSN has no backward dependencies left. */
7472 gcc_assert ((DEP_STATUS (dep
) & BEGIN_SPEC
) == 0
7473 && (DEP_STATUS (dep
) & BE_IN_SPEC
) != 0
7474 && (DEP_STATUS (dep
) & DEP_TYPES
) == DEP_TRUE
);
7476 check
= DEP_PRO (dep
);
7478 gcc_assert (!IS_SPECULATION_CHECK_P (check
) && !ORIG_PAT (check
)
7479 && QUEUE_INDEX (check
) == QUEUE_NOWHERE
);
7481 rec
= BLOCK_FOR_INSN (check
);
7483 twin
= emit_insn_before (copy_insn (PATTERN (insn
)), BB_END (rec
));
7484 haifa_init_insn (twin
);
7486 sd_copy_back_deps (twin
, insn
, true);
7488 if (sched_verbose
&& spec_info
->dump
)
7489 /* INSN_BB (insn) isn't determined for twin insns yet.
7490 So we can't use current_sched_info->print_insn. */
7491 fprintf (spec_info
->dump
, ";;\t\tGenerated twin insn : %d/rec%d\n",
7492 INSN_UID (twin
), rec
->index
);
7494 twins
= alloc_INSN_LIST (twin
, twins
);
7496 /* Add dependences between TWIN and all appropriate
7497 instructions from REC. */
7498 FOR_EACH_DEP (insn
, SD_LIST_SPEC_BACK
, sd_it
, dep
)
7500 rtx pro
= DEP_PRO (dep
);
7502 gcc_assert (DEP_TYPE (dep
) == REG_DEP_TRUE
);
7504 /* INSN might have dependencies from the instructions from
7505 several recovery blocks. At this iteration we process those
7506 producers that reside in REC. */
7507 if (BLOCK_FOR_INSN (pro
) == rec
)
7509 dep_def _new_dep
, *new_dep
= &_new_dep
;
7511 init_dep (new_dep
, pro
, twin
, REG_DEP_TRUE
);
7512 sd_add_dep (new_dep
, false);
7516 process_insn_forw_deps_be_in_spec (insn
, twin
, ts
);
7518 /* Remove all dependencies between INSN and insns in REC. */
7519 for (sd_it
= sd_iterator_start (insn
, SD_LIST_SPEC_BACK
);
7520 sd_iterator_cond (&sd_it
, &dep
);)
7522 rtx pro
= DEP_PRO (dep
);
7524 if (BLOCK_FOR_INSN (pro
) == rec
)
7525 sd_delete_dep (sd_it
);
7527 sd_iterator_next (&sd_it
);
7531 /* We couldn't have added the dependencies between INSN and TWINS earlier
7532 because that would make TWINS appear in the INSN_BACK_DEPS (INSN). */
7537 twin
= XEXP (twins
, 0);
7540 dep_def _new_dep
, *new_dep
= &_new_dep
;
7542 init_dep (new_dep
, insn
, twin
, REG_DEP_OUTPUT
);
7543 sd_add_dep (new_dep
, false);
7546 twin
= XEXP (twins
, 1);
7547 free_INSN_LIST_node (twins
);
7551 calc_priorities (priorities_roots
);
7552 priorities_roots
.release ();
7555 /* Extends and fills with zeros (only the new part) array pointed to by P. */
7557 xrecalloc (void *p
, size_t new_nmemb
, size_t old_nmemb
, size_t size
)
7559 gcc_assert (new_nmemb
>= old_nmemb
);
7560 p
= XRESIZEVAR (void, p
, new_nmemb
* size
);
7561 memset (((char *) p
) + old_nmemb
* size
, 0, (new_nmemb
- old_nmemb
) * size
);
7566 Find fallthru edge from PRED. */
7568 find_fallthru_edge_from (basic_block pred
)
7573 succ
= pred
->next_bb
;
7574 gcc_assert (succ
->prev_bb
== pred
);
7576 if (EDGE_COUNT (pred
->succs
) <= EDGE_COUNT (succ
->preds
))
7578 e
= find_fallthru_edge (pred
->succs
);
7582 gcc_assert (e
->dest
== succ
);
7588 e
= find_fallthru_edge (succ
->preds
);
7592 gcc_assert (e
->src
== pred
);
7600 /* Extend per basic block data structures. */
7602 sched_extend_bb (void)
7604 /* The following is done to keep current_sched_info->next_tail non null. */
7605 rtx end
= BB_END (EXIT_BLOCK_PTR_FOR_FN (cfun
)->prev_bb
);
7606 rtx insn
= DEBUG_INSN_P (end
) ? prev_nondebug_insn (end
) : end
;
7607 if (NEXT_INSN (end
) == 0
7610 /* Don't emit a NOTE if it would end up before a BARRIER. */
7611 && !BARRIER_P (NEXT_INSN (end
))))
7613 rtx note
= emit_note_after (NOTE_INSN_DELETED
, end
);
7614 /* Make note appear outside BB. */
7615 set_block_for_insn (note
, NULL
);
7616 BB_END (EXIT_BLOCK_PTR_FOR_FN (cfun
)->prev_bb
) = end
;
7620 /* Init per basic block data structures. */
7622 sched_init_bbs (void)
7627 /* Initialize BEFORE_RECOVERY variable. */
7629 init_before_recovery (basic_block
*before_recovery_ptr
)
7634 last
= EXIT_BLOCK_PTR_FOR_FN (cfun
)->prev_bb
;
7635 e
= find_fallthru_edge_from (last
);
7639 /* We create two basic blocks:
7640 1. Single instruction block is inserted right after E->SRC
7642 2. Empty block right before EXIT_BLOCK.
7643 Between these two blocks recovery blocks will be emitted. */
7645 basic_block single
, empty
;
7648 /* If the fallthrough edge to exit we've found is from the block we've
7649 created before, don't do anything more. */
7650 if (last
== after_recovery
)
7653 adding_bb_to_current_region_p
= false;
7655 single
= sched_create_empty_bb (last
);
7656 empty
= sched_create_empty_bb (single
);
7658 /* Add new blocks to the root loop. */
7659 if (current_loops
!= NULL
)
7661 add_bb_to_loop (single
, (*current_loops
->larray
)[0]);
7662 add_bb_to_loop (empty
, (*current_loops
->larray
)[0]);
7665 single
->count
= last
->count
;
7666 empty
->count
= last
->count
;
7667 single
->frequency
= last
->frequency
;
7668 empty
->frequency
= last
->frequency
;
7669 BB_COPY_PARTITION (single
, last
);
7670 BB_COPY_PARTITION (empty
, last
);
7672 redirect_edge_succ (e
, single
);
7673 make_single_succ_edge (single
, empty
, 0);
7674 make_single_succ_edge (empty
, EXIT_BLOCK_PTR_FOR_FN (cfun
),
7677 label
= block_label (empty
);
7678 x
= emit_jump_insn_after (gen_jump (label
), BB_END (single
));
7679 JUMP_LABEL (x
) = label
;
7680 LABEL_NUSES (label
)++;
7681 haifa_init_insn (x
);
7683 emit_barrier_after (x
);
7685 sched_init_only_bb (empty
, NULL
);
7686 sched_init_only_bb (single
, NULL
);
7689 adding_bb_to_current_region_p
= true;
7690 before_recovery
= single
;
7691 after_recovery
= empty
;
7693 if (before_recovery_ptr
)
7694 *before_recovery_ptr
= before_recovery
;
7696 if (sched_verbose
>= 2 && spec_info
->dump
)
7697 fprintf (spec_info
->dump
,
7698 ";;\t\tFixed fallthru to EXIT : %d->>%d->%d->>EXIT\n",
7699 last
->index
, single
->index
, empty
->index
);
7702 before_recovery
= last
;
7705 /* Returns new recovery block. */
7707 sched_create_recovery_block (basic_block
*before_recovery_ptr
)
7713 haifa_recovery_bb_recently_added_p
= true;
7714 haifa_recovery_bb_ever_added_p
= true;
7716 init_before_recovery (before_recovery_ptr
);
7718 barrier
= get_last_bb_insn (before_recovery
);
7719 gcc_assert (BARRIER_P (barrier
));
7721 label
= emit_label_after (gen_label_rtx (), barrier
);
7723 rec
= create_basic_block (label
, label
, before_recovery
);
7725 /* A recovery block always ends with an unconditional jump. */
7726 emit_barrier_after (BB_END (rec
));
7728 if (BB_PARTITION (before_recovery
) != BB_UNPARTITIONED
)
7729 BB_SET_PARTITION (rec
, BB_COLD_PARTITION
);
7731 if (sched_verbose
&& spec_info
->dump
)
7732 fprintf (spec_info
->dump
, ";;\t\tGenerated recovery block rec%d\n",
7738 /* Create edges: FIRST_BB -> REC; FIRST_BB -> SECOND_BB; REC -> SECOND_BB
7739 and emit necessary jumps. */
7741 sched_create_recovery_edges (basic_block first_bb
, basic_block rec
,
7742 basic_block second_bb
)
7748 /* This is fixing of incoming edge. */
7749 /* ??? Which other flags should be specified? */
7750 if (BB_PARTITION (first_bb
) != BB_PARTITION (rec
))
7751 /* Partition type is the same, if it is "unpartitioned". */
7752 edge_flags
= EDGE_CROSSING
;
7756 make_edge (first_bb
, rec
, edge_flags
);
7757 label
= block_label (second_bb
);
7758 jump
= emit_jump_insn_after (gen_jump (label
), BB_END (rec
));
7759 JUMP_LABEL (jump
) = label
;
7760 LABEL_NUSES (label
)++;
7762 if (BB_PARTITION (second_bb
) != BB_PARTITION (rec
))
7763 /* Partition type is the same, if it is "unpartitioned". */
7765 /* Rewritten from cfgrtl.c. */
7766 if (flag_reorder_blocks_and_partition
7767 && targetm_common
.have_named_sections
)
7769 /* We don't need the same note for the check because
7770 any_condjump_p (check) == true. */
7771 CROSSING_JUMP_P (jump
) = 1;
7773 edge_flags
= EDGE_CROSSING
;
7778 make_single_succ_edge (rec
, second_bb
, edge_flags
);
7779 if (dom_info_available_p (CDI_DOMINATORS
))
7780 set_immediate_dominator (CDI_DOMINATORS
, rec
, first_bb
);
7783 /* This function creates recovery code for INSN. If MUTATE_P is nonzero,
7784 INSN is a simple check, that should be converted to branchy one. */
7786 create_check_block_twin (rtx insn
, bool mutate_p
)
7789 rtx label
, check
, twin
;
7791 sd_iterator_def sd_it
;
7793 dep_def _new_dep
, *new_dep
= &_new_dep
;
7796 gcc_assert (ORIG_PAT (insn
) != NULL_RTX
);
7799 todo_spec
= TODO_SPEC (insn
);
7802 gcc_assert (IS_SPECULATION_SIMPLE_CHECK_P (insn
)
7803 && (TODO_SPEC (insn
) & SPECULATIVE
) == 0);
7805 todo_spec
= CHECK_SPEC (insn
);
7808 todo_spec
&= SPECULATIVE
;
7810 /* Create recovery block. */
7811 if (mutate_p
|| targetm
.sched
.needs_block_p (todo_spec
))
7813 rec
= sched_create_recovery_block (NULL
);
7814 label
= BB_HEAD (rec
);
7818 rec
= EXIT_BLOCK_PTR_FOR_FN (cfun
);
7823 check
= targetm
.sched
.gen_spec_check (insn
, label
, todo_spec
);
7825 if (rec
!= EXIT_BLOCK_PTR_FOR_FN (cfun
))
7827 /* To have mem_reg alive at the beginning of second_bb,
7828 we emit check BEFORE insn, so insn after splitting
7829 insn will be at the beginning of second_bb, which will
7830 provide us with the correct life information. */
7831 check
= emit_jump_insn_before (check
, insn
);
7832 JUMP_LABEL (check
) = label
;
7833 LABEL_NUSES (label
)++;
7836 check
= emit_insn_before (check
, insn
);
7838 /* Extend data structures. */
7839 haifa_init_insn (check
);
7841 /* CHECK is being added to current region. Extend ready list. */
7842 gcc_assert (sched_ready_n_insns
!= -1);
7843 sched_extend_ready_list (sched_ready_n_insns
+ 1);
7845 if (current_sched_info
->add_remove_insn
)
7846 current_sched_info
->add_remove_insn (insn
, 0);
7848 RECOVERY_BLOCK (check
) = rec
;
7850 if (sched_verbose
&& spec_info
->dump
)
7851 fprintf (spec_info
->dump
, ";;\t\tGenerated check insn : %s\n",
7852 (*current_sched_info
->print_insn
) (check
, 0));
7854 gcc_assert (ORIG_PAT (insn
));
7856 /* Initialize TWIN (twin is a duplicate of original instruction
7857 in the recovery block). */
7858 if (rec
!= EXIT_BLOCK_PTR_FOR_FN (cfun
))
7860 sd_iterator_def sd_it
;
7863 FOR_EACH_DEP (insn
, SD_LIST_RES_BACK
, sd_it
, dep
)
7864 if ((DEP_STATUS (dep
) & DEP_OUTPUT
) != 0)
7866 struct _dep _dep2
, *dep2
= &_dep2
;
7868 init_dep (dep2
, DEP_PRO (dep
), check
, REG_DEP_TRUE
);
7870 sd_add_dep (dep2
, true);
7873 twin
= emit_insn_after (ORIG_PAT (insn
), BB_END (rec
));
7874 haifa_init_insn (twin
);
7876 if (sched_verbose
&& spec_info
->dump
)
7877 /* INSN_BB (insn) isn't determined for twin insns yet.
7878 So we can't use current_sched_info->print_insn. */
7879 fprintf (spec_info
->dump
, ";;\t\tGenerated twin insn : %d/rec%d\n",
7880 INSN_UID (twin
), rec
->index
);
7884 ORIG_PAT (check
) = ORIG_PAT (insn
);
7885 HAS_INTERNAL_DEP (check
) = 1;
7887 /* ??? We probably should change all OUTPUT dependencies to
7891 /* Copy all resolved back dependencies of INSN to TWIN. This will
7892 provide correct value for INSN_TICK (TWIN). */
7893 sd_copy_back_deps (twin
, insn
, true);
7895 if (rec
!= EXIT_BLOCK_PTR_FOR_FN (cfun
))
7896 /* In case of branchy check, fix CFG. */
7898 basic_block first_bb
, second_bb
;
7901 first_bb
= BLOCK_FOR_INSN (check
);
7902 second_bb
= sched_split_block (first_bb
, check
);
7904 sched_create_recovery_edges (first_bb
, rec
, second_bb
);
7906 sched_init_only_bb (second_bb
, first_bb
);
7907 sched_init_only_bb (rec
, EXIT_BLOCK_PTR_FOR_FN (cfun
));
7909 jump
= BB_END (rec
);
7910 haifa_init_insn (jump
);
7913 /* Move backward dependences from INSN to CHECK and
7914 move forward dependences from INSN to TWIN. */
7916 /* First, create dependencies between INSN's producers and CHECK & TWIN. */
7917 FOR_EACH_DEP (insn
, SD_LIST_BACK
, sd_it
, dep
)
7919 rtx pro
= DEP_PRO (dep
);
7922 /* If BEGIN_DATA: [insn ~~TRUE~~> producer]:
7923 check --TRUE--> producer ??? or ANTI ???
7924 twin --TRUE--> producer
7925 twin --ANTI--> check
7927 If BEGIN_CONTROL: [insn ~~ANTI~~> producer]:
7928 check --ANTI--> producer
7929 twin --ANTI--> producer
7930 twin --ANTI--> check
7932 If BE_IN_SPEC: [insn ~~TRUE~~> producer]:
7933 check ~~TRUE~~> producer
7934 twin ~~TRUE~~> producer
7935 twin --ANTI--> check */
7937 ds
= DEP_STATUS (dep
);
7939 if (ds
& BEGIN_SPEC
)
7941 gcc_assert (!mutate_p
);
7945 init_dep_1 (new_dep
, pro
, check
, DEP_TYPE (dep
), ds
);
7946 sd_add_dep (new_dep
, false);
7948 if (rec
!= EXIT_BLOCK_PTR_FOR_FN (cfun
))
7950 DEP_CON (new_dep
) = twin
;
7951 sd_add_dep (new_dep
, false);
7955 /* Second, remove backward dependencies of INSN. */
7956 for (sd_it
= sd_iterator_start (insn
, SD_LIST_SPEC_BACK
);
7957 sd_iterator_cond (&sd_it
, &dep
);)
7959 if ((DEP_STATUS (dep
) & BEGIN_SPEC
)
7961 /* We can delete this dep because we overcome it with
7962 BEGIN_SPECULATION. */
7963 sd_delete_dep (sd_it
);
7965 sd_iterator_next (&sd_it
);
7968 /* Future Speculations. Determine what BE_IN speculations will be like. */
7971 /* Fields (DONE_SPEC (x) & BEGIN_SPEC) and CHECK_SPEC (x) are set only
7974 gcc_assert (!DONE_SPEC (insn
));
7978 ds_t ts
= TODO_SPEC (insn
);
7980 DONE_SPEC (insn
) = ts
& BEGIN_SPEC
;
7981 CHECK_SPEC (check
) = ts
& BEGIN_SPEC
;
7983 /* Luckiness of future speculations solely depends upon initial
7984 BEGIN speculation. */
7985 if (ts
& BEGIN_DATA
)
7986 fs
= set_dep_weak (fs
, BE_IN_DATA
, get_dep_weak (ts
, BEGIN_DATA
));
7987 if (ts
& BEGIN_CONTROL
)
7988 fs
= set_dep_weak (fs
, BE_IN_CONTROL
,
7989 get_dep_weak (ts
, BEGIN_CONTROL
));
7992 CHECK_SPEC (check
) = CHECK_SPEC (insn
);
7994 /* Future speculations: call the helper. */
7995 process_insn_forw_deps_be_in_spec (insn
, twin
, fs
);
7997 if (rec
!= EXIT_BLOCK_PTR_FOR_FN (cfun
))
7999 /* Which types of dependencies should we use here is,
8000 generally, machine-dependent question... But, for now,
8005 init_dep (new_dep
, insn
, check
, REG_DEP_TRUE
);
8006 sd_add_dep (new_dep
, false);
8008 init_dep (new_dep
, insn
, twin
, REG_DEP_OUTPUT
);
8009 sd_add_dep (new_dep
, false);
8013 if (spec_info
->dump
)
8014 fprintf (spec_info
->dump
, ";;\t\tRemoved simple check : %s\n",
8015 (*current_sched_info
->print_insn
) (insn
, 0));
8017 /* Remove all dependencies of the INSN. */
8019 sd_it
= sd_iterator_start (insn
, (SD_LIST_FORW
8021 | SD_LIST_RES_BACK
));
8022 while (sd_iterator_cond (&sd_it
, &dep
))
8023 sd_delete_dep (sd_it
);
8026 /* If former check (INSN) already was moved to the ready (or queue)
8027 list, add new check (CHECK) there too. */
8028 if (QUEUE_INDEX (insn
) != QUEUE_NOWHERE
)
8031 /* Remove old check from instruction stream and free its
8033 sched_remove_insn (insn
);
8036 init_dep (new_dep
, check
, twin
, REG_DEP_ANTI
);
8037 sd_add_dep (new_dep
, false);
8041 init_dep_1 (new_dep
, insn
, check
, REG_DEP_TRUE
, DEP_TRUE
| DEP_OUTPUT
);
8042 sd_add_dep (new_dep
, false);
8046 /* Fix priorities. If MUTATE_P is nonzero, this is not necessary,
8047 because it'll be done later in add_to_speculative_block. */
8049 rtx_vec_t priorities_roots
= rtx_vec_t ();
8051 clear_priorities (twin
, &priorities_roots
);
8052 calc_priorities (priorities_roots
);
8053 priorities_roots
.release ();
8057 /* Removes dependency between instructions in the recovery block REC
8058 and usual region instructions. It keeps inner dependences so it
8059 won't be necessary to recompute them. */
8061 fix_recovery_deps (basic_block rec
)
8063 rtx note
, insn
, jump
, ready_list
= 0;
8064 bitmap_head in_ready
;
8067 bitmap_initialize (&in_ready
, 0);
8069 /* NOTE - a basic block note. */
8070 note
= NEXT_INSN (BB_HEAD (rec
));
8071 gcc_assert (NOTE_INSN_BASIC_BLOCK_P (note
));
8072 insn
= BB_END (rec
);
8073 gcc_assert (JUMP_P (insn
));
8074 insn
= PREV_INSN (insn
);
8078 sd_iterator_def sd_it
;
8081 for (sd_it
= sd_iterator_start (insn
, SD_LIST_FORW
);
8082 sd_iterator_cond (&sd_it
, &dep
);)
8084 rtx consumer
= DEP_CON (dep
);
8086 if (BLOCK_FOR_INSN (consumer
) != rec
)
8088 sd_delete_dep (sd_it
);
8090 if (bitmap_set_bit (&in_ready
, INSN_LUID (consumer
)))
8091 ready_list
= alloc_INSN_LIST (consumer
, ready_list
);
8095 gcc_assert ((DEP_STATUS (dep
) & DEP_TYPES
) == DEP_TRUE
);
8097 sd_iterator_next (&sd_it
);
8101 insn
= PREV_INSN (insn
);
8103 while (insn
!= note
);
8105 bitmap_clear (&in_ready
);
8107 /* Try to add instructions to the ready or queue list. */
8108 for (link
= ready_list
; link
; link
= XEXP (link
, 1))
8109 try_ready (XEXP (link
, 0));
8110 free_INSN_LIST_list (&ready_list
);
8112 /* Fixing jump's dependences. */
8113 insn
= BB_HEAD (rec
);
8114 jump
= BB_END (rec
);
8116 gcc_assert (LABEL_P (insn
));
8117 insn
= NEXT_INSN (insn
);
8119 gcc_assert (NOTE_INSN_BASIC_BLOCK_P (insn
));
8120 add_jump_dependencies (insn
, jump
);
8123 /* Change pattern of INSN to NEW_PAT. Invalidate cached haifa
8124 instruction data. */
8126 haifa_change_pattern (rtx insn
, rtx new_pat
)
8130 t
= validate_change (insn
, &PATTERN (insn
), new_pat
, 0);
8134 update_insn_after_change (insn
);
8138 /* -1 - can't speculate,
8139 0 - for speculation with REQUEST mode it is OK to use
8140 current instruction pattern,
8141 1 - need to change pattern for *NEW_PAT to be speculative. */
8143 sched_speculate_insn (rtx insn
, ds_t request
, rtx
*new_pat
)
8145 gcc_assert (current_sched_info
->flags
& DO_SPECULATION
8146 && (request
& SPECULATIVE
)
8147 && sched_insn_is_legitimate_for_speculation_p (insn
, request
));
8149 if ((request
& spec_info
->mask
) != request
)
8152 if (request
& BE_IN_SPEC
8153 && !(request
& BEGIN_SPEC
))
8156 return targetm
.sched
.speculate_insn (insn
, request
, new_pat
);
8160 haifa_speculate_insn (rtx insn
, ds_t request
, rtx
*new_pat
)
8162 gcc_assert (sched_deps_info
->generate_spec_deps
8163 && !IS_SPECULATION_CHECK_P (insn
));
8165 if (HAS_INTERNAL_DEP (insn
)
8166 || SCHED_GROUP_P (insn
))
8169 return sched_speculate_insn (insn
, request
, new_pat
);
8172 /* Print some information about block BB, which starts with HEAD and
8173 ends with TAIL, before scheduling it.
8174 I is zero, if scheduler is about to start with the fresh ebb. */
8176 dump_new_block_header (int i
, basic_block bb
, rtx head
, rtx tail
)
8179 fprintf (sched_dump
,
8180 ";; ======================================================\n");
8182 fprintf (sched_dump
,
8183 ";; =====================ADVANCING TO=====================\n");
8184 fprintf (sched_dump
,
8185 ";; -- basic block %d from %d to %d -- %s reload\n",
8186 bb
->index
, INSN_UID (head
), INSN_UID (tail
),
8187 (reload_completed
? "after" : "before"));
8188 fprintf (sched_dump
,
8189 ";; ======================================================\n");
8190 fprintf (sched_dump
, "\n");
8193 /* Unlink basic block notes and labels and saves them, so they
8194 can be easily restored. We unlink basic block notes in EBB to
8195 provide back-compatibility with the previous code, as target backends
8196 assume, that there'll be only instructions between
8197 current_sched_info->{head and tail}. We restore these notes as soon
8199 FIRST (LAST) is the first (last) basic block in the ebb.
8200 NB: In usual case (FIRST == LAST) nothing is really done. */
8202 unlink_bb_notes (basic_block first
, basic_block last
)
8204 /* We DON'T unlink basic block notes of the first block in the ebb. */
8208 bb_header
= XNEWVEC (rtx
, last_basic_block_for_fn (cfun
));
8210 /* Make a sentinel. */
8211 if (last
->next_bb
!= EXIT_BLOCK_PTR_FOR_FN (cfun
))
8212 bb_header
[last
->next_bb
->index
] = 0;
8214 first
= first
->next_bb
;
8217 rtx prev
, label
, note
, next
;
8219 label
= BB_HEAD (last
);
8220 if (LABEL_P (label
))
8221 note
= NEXT_INSN (label
);
8224 gcc_assert (NOTE_INSN_BASIC_BLOCK_P (note
));
8226 prev
= PREV_INSN (label
);
8227 next
= NEXT_INSN (note
);
8228 gcc_assert (prev
&& next
);
8230 NEXT_INSN (prev
) = next
;
8231 PREV_INSN (next
) = prev
;
8233 bb_header
[last
->index
] = label
;
8238 last
= last
->prev_bb
;
8243 /* Restore basic block notes.
8244 FIRST is the first basic block in the ebb. */
8246 restore_bb_notes (basic_block first
)
8251 /* We DON'T unlink basic block notes of the first block in the ebb. */
8252 first
= first
->next_bb
;
8253 /* Remember: FIRST is actually a second basic block in the ebb. */
8255 while (first
!= EXIT_BLOCK_PTR_FOR_FN (cfun
)
8256 && bb_header
[first
->index
])
8258 rtx prev
, label
, note
, next
;
8260 label
= bb_header
[first
->index
];
8261 prev
= PREV_INSN (label
);
8262 next
= NEXT_INSN (prev
);
8264 if (LABEL_P (label
))
8265 note
= NEXT_INSN (label
);
8268 gcc_assert (NOTE_INSN_BASIC_BLOCK_P (note
));
8270 bb_header
[first
->index
] = 0;
8272 NEXT_INSN (prev
) = label
;
8273 NEXT_INSN (note
) = next
;
8274 PREV_INSN (next
) = note
;
8276 first
= first
->next_bb
;
8284 Fix CFG after both in- and inter-block movement of
8285 control_flow_insn_p JUMP. */
8287 fix_jump_move (rtx jump
)
8289 basic_block bb
, jump_bb
, jump_bb_next
;
8291 bb
= BLOCK_FOR_INSN (PREV_INSN (jump
));
8292 jump_bb
= BLOCK_FOR_INSN (jump
);
8293 jump_bb_next
= jump_bb
->next_bb
;
8295 gcc_assert (common_sched_info
->sched_pass_id
== SCHED_EBB_PASS
8296 || IS_SPECULATION_BRANCHY_CHECK_P (jump
));
8298 if (!NOTE_INSN_BASIC_BLOCK_P (BB_END (jump_bb_next
)))
8299 /* if jump_bb_next is not empty. */
8300 BB_END (jump_bb
) = BB_END (jump_bb_next
);
8302 if (BB_END (bb
) != PREV_INSN (jump
))
8303 /* Then there are instruction after jump that should be placed
8305 BB_END (jump_bb_next
) = BB_END (bb
);
8307 /* Otherwise jump_bb_next is empty. */
8308 BB_END (jump_bb_next
) = NEXT_INSN (BB_HEAD (jump_bb_next
));
8310 /* To make assertion in move_insn happy. */
8311 BB_END (bb
) = PREV_INSN (jump
);
8313 update_bb_for_insn (jump_bb_next
);
8316 /* Fix CFG after interblock movement of control_flow_insn_p JUMP. */
8318 move_block_after_check (rtx jump
)
8320 basic_block bb
, jump_bb
, jump_bb_next
;
8321 vec
<edge
, va_gc
> *t
;
8323 bb
= BLOCK_FOR_INSN (PREV_INSN (jump
));
8324 jump_bb
= BLOCK_FOR_INSN (jump
);
8325 jump_bb_next
= jump_bb
->next_bb
;
8327 update_bb_for_insn (jump_bb
);
8329 gcc_assert (IS_SPECULATION_CHECK_P (jump
)
8330 || IS_SPECULATION_CHECK_P (BB_END (jump_bb_next
)));
8332 unlink_block (jump_bb_next
);
8333 link_block (jump_bb_next
, bb
);
8337 move_succs (&(jump_bb
->succs
), bb
);
8338 move_succs (&(jump_bb_next
->succs
), jump_bb
);
8339 move_succs (&t
, jump_bb_next
);
8341 df_mark_solutions_dirty ();
8343 common_sched_info
->fix_recovery_cfg
8344 (bb
->index
, jump_bb
->index
, jump_bb_next
->index
);
8347 /* Helper function for move_block_after_check.
8348 This functions attaches edge vector pointed to by SUCCSP to
8351 move_succs (vec
<edge
, va_gc
> **succsp
, basic_block to
)
8356 gcc_assert (to
->succs
== 0);
8358 to
->succs
= *succsp
;
8360 FOR_EACH_EDGE (e
, ei
, to
->succs
)
8366 /* Remove INSN from the instruction stream.
8367 INSN should have any dependencies. */
8369 sched_remove_insn (rtx insn
)
8371 sd_finish_insn (insn
);
8373 change_queue_index (insn
, QUEUE_NOWHERE
);
8374 current_sched_info
->add_remove_insn (insn
, 1);
8378 /* Clear priorities of all instructions, that are forward dependent on INSN.
8379 Store in vector pointed to by ROOTS_PTR insns on which priority () should
8380 be invoked to initialize all cleared priorities. */
8382 clear_priorities (rtx insn
, rtx_vec_t
*roots_ptr
)
8384 sd_iterator_def sd_it
;
8386 bool insn_is_root_p
= true;
8388 gcc_assert (QUEUE_INDEX (insn
) != QUEUE_SCHEDULED
);
8390 FOR_EACH_DEP (insn
, SD_LIST_BACK
, sd_it
, dep
)
8392 rtx pro
= DEP_PRO (dep
);
8394 if (INSN_PRIORITY_STATUS (pro
) >= 0
8395 && QUEUE_INDEX (insn
) != QUEUE_SCHEDULED
)
8397 /* If DEP doesn't contribute to priority then INSN itself should
8398 be added to priority roots. */
8399 if (contributes_to_priority_p (dep
))
8400 insn_is_root_p
= false;
8402 INSN_PRIORITY_STATUS (pro
) = -1;
8403 clear_priorities (pro
, roots_ptr
);
8408 roots_ptr
->safe_push (insn
);
8411 /* Recompute priorities of instructions, whose priorities might have been
8412 changed. ROOTS is a vector of instructions whose priority computation will
8413 trigger initialization of all cleared priorities. */
8415 calc_priorities (rtx_vec_t roots
)
8420 FOR_EACH_VEC_ELT (roots
, i
, insn
)
8425 /* Add dependences between JUMP and other instructions in the recovery
8426 block. INSN is the first insn the recovery block. */
8428 add_jump_dependencies (rtx insn
, rtx jump
)
8432 insn
= NEXT_INSN (insn
);
8436 if (dep_list_size (insn
, SD_LIST_FORW
) == 0)
8438 dep_def _new_dep
, *new_dep
= &_new_dep
;
8440 init_dep (new_dep
, insn
, jump
, REG_DEP_ANTI
);
8441 sd_add_dep (new_dep
, false);
8446 gcc_assert (!sd_lists_empty_p (jump
, SD_LIST_BACK
));
8449 /* Extend data structures for logical insn UID. */
8451 sched_extend_luids (void)
8453 int new_luids_max_uid
= get_max_uid () + 1;
8455 sched_luids
.safe_grow_cleared (new_luids_max_uid
);
8458 /* Initialize LUID for INSN. */
8460 sched_init_insn_luid (rtx insn
)
8462 int i
= INSN_P (insn
) ? 1 : common_sched_info
->luid_for_non_insn (insn
);
8467 luid
= sched_max_luid
;
8468 sched_max_luid
+= i
;
8473 SET_INSN_LUID (insn
, luid
);
8476 /* Initialize luids for BBS.
8477 The hook common_sched_info->luid_for_non_insn () is used to determine
8478 if notes, labels, etc. need luids. */
8480 sched_init_luids (bb_vec_t bbs
)
8485 sched_extend_luids ();
8486 FOR_EACH_VEC_ELT (bbs
, i
, bb
)
8490 FOR_BB_INSNS (bb
, insn
)
8491 sched_init_insn_luid (insn
);
8497 sched_finish_luids (void)
8499 sched_luids
.release ();
8503 /* Return logical uid of INSN. Helpful while debugging. */
8505 insn_luid (rtx insn
)
8507 return INSN_LUID (insn
);
8510 /* Extend per insn data in the target. */
8512 sched_extend_target (void)
8514 if (targetm
.sched
.h_i_d_extended
)
8515 targetm
.sched
.h_i_d_extended ();
8518 /* Extend global scheduler structures (those, that live across calls to
8519 schedule_block) to include information about just emitted INSN. */
8523 int reserve
= (get_max_uid () + 1 - h_i_d
.length ());
8525 && ! h_i_d
.space (reserve
))
8527 h_i_d
.safe_grow_cleared (3 * get_max_uid () / 2);
8528 sched_extend_target ();
8532 /* Initialize h_i_d entry of the INSN with default values.
8533 Values, that are not explicitly initialized here, hold zero. */
8535 init_h_i_d (rtx insn
)
8537 if (INSN_LUID (insn
) > 0)
8539 INSN_COST (insn
) = -1;
8540 QUEUE_INDEX (insn
) = QUEUE_NOWHERE
;
8541 INSN_TICK (insn
) = INVALID_TICK
;
8542 INSN_EXACT_TICK (insn
) = INVALID_TICK
;
8543 INTER_TICK (insn
) = INVALID_TICK
;
8544 TODO_SPEC (insn
) = HARD_DEP
;
8548 /* Initialize haifa_insn_data for BBS. */
8550 haifa_init_h_i_d (bb_vec_t bbs
)
8556 FOR_EACH_VEC_ELT (bbs
, i
, bb
)
8560 FOR_BB_INSNS (bb
, insn
)
8565 /* Finalize haifa_insn_data. */
8567 haifa_finish_h_i_d (void)
8570 haifa_insn_data_t data
;
8571 struct reg_use_data
*use
, *next
;
8573 FOR_EACH_VEC_ELT (h_i_d
, i
, data
)
8575 free (data
->max_reg_pressure
);
8576 free (data
->reg_pressure
);
8577 for (use
= data
->reg_use_list
; use
!= NULL
; use
= next
)
8579 next
= use
->next_insn_use
;
8586 /* Init data for the new insn INSN. */
8588 haifa_init_insn (rtx insn
)
8590 gcc_assert (insn
!= NULL
);
8592 sched_extend_luids ();
8593 sched_init_insn_luid (insn
);
8594 sched_extend_target ();
8595 sched_deps_init (false);
8599 if (adding_bb_to_current_region_p
)
8601 sd_init_insn (insn
);
8603 /* Extend dependency caches by one element. */
8604 extend_dependency_caches (1, false);
8606 if (sched_pressure
!= SCHED_PRESSURE_NONE
)
8607 init_insn_reg_pressure_info (insn
);
8610 /* Init data for the new basic block BB which comes after AFTER. */
8612 haifa_init_only_bb (basic_block bb
, basic_block after
)
8614 gcc_assert (bb
!= NULL
);
8618 if (common_sched_info
->add_block
)
8619 /* This changes only data structures of the front-end. */
8620 common_sched_info
->add_block (bb
, after
);
8623 /* A generic version of sched_split_block (). */
8625 sched_split_block_1 (basic_block first_bb
, rtx after
)
8629 e
= split_block (first_bb
, after
);
8630 gcc_assert (e
->src
== first_bb
);
8632 /* sched_split_block emits note if *check == BB_END. Probably it
8633 is better to rip that note off. */
8638 /* A generic version of sched_create_empty_bb (). */
8640 sched_create_empty_bb_1 (basic_block after
)
8642 return create_empty_bb (after
);
8645 /* Insert PAT as an INSN into the schedule and update the necessary data
8646 structures to account for it. */
8648 sched_emit_insn (rtx pat
)
8650 rtx insn
= emit_insn_before (pat
, first_nonscheduled_insn ());
8651 haifa_init_insn (insn
);
8653 if (current_sched_info
->add_remove_insn
)
8654 current_sched_info
->add_remove_insn (insn
, 0);
8656 (*current_sched_info
->begin_schedule_ready
) (insn
);
8657 scheduled_insns
.safe_push (insn
);
8659 last_scheduled_insn
= insn
;
8663 /* This function returns a candidate satisfying dispatch constraints from
8667 ready_remove_first_dispatch (struct ready_list
*ready
)
8670 rtx insn
= ready_element (ready
, 0);
8672 if (ready
->n_ready
== 1
8674 || INSN_CODE (insn
) < 0
8675 || !active_insn_p (insn
)
8676 || targetm
.sched
.dispatch (insn
, FITS_DISPATCH_WINDOW
))
8677 return ready_remove_first (ready
);
8679 for (i
= 1; i
< ready
->n_ready
; i
++)
8681 insn
= ready_element (ready
, i
);
8684 || INSN_CODE (insn
) < 0
8685 || !active_insn_p (insn
))
8688 if (targetm
.sched
.dispatch (insn
, FITS_DISPATCH_WINDOW
))
8690 /* Return ith element of ready. */
8691 insn
= ready_remove (ready
, i
);
8696 if (targetm
.sched
.dispatch (NULL_RTX
, DISPATCH_VIOLATION
))
8697 return ready_remove_first (ready
);
8699 for (i
= 1; i
< ready
->n_ready
; i
++)
8701 insn
= ready_element (ready
, i
);
8704 || INSN_CODE (insn
) < 0
8705 || !active_insn_p (insn
))
8708 /* Return i-th element of ready. */
8709 if (targetm
.sched
.dispatch (insn
, IS_CMP
))
8710 return ready_remove (ready
, i
);
8713 return ready_remove_first (ready
);
8716 /* Get number of ready insn in the ready list. */
8719 number_in_ready (void)
8721 return ready
.n_ready
;
8724 /* Get number of ready's in the ready list. */
8727 get_ready_element (int i
)
8729 return ready_element (&ready
, i
);
8732 #endif /* INSN_SCHEDULING */