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