1 /* Instruction scheduling pass.
2 Copyright (C) 1992, 93-98, 1999 Free Software Foundation, Inc.
3 Contributed by Michael Tiemann (tiemann@cygnus.com) Enhanced by,
4 and currently maintained by, Jim Wilson (wilson@cygnus.com)
6 This file is part of GNU CC.
8 GNU CC is free software; you can redistribute it and/or modify it
9 under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2, or (at your option)
13 GNU CC is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with GNU CC; see the file COPYING. If not, write to the Free
20 the Free Software Foundation, 59 Temple Place - Suite 330,
21 Boston, MA 02111-1307, USA. */
24 /* Instruction scheduling pass.
26 This pass implements list scheduling within basic blocks. It is
27 run twice: (1) after flow analysis, but before register allocation,
28 and (2) after register allocation.
30 The first run performs interblock scheduling, moving insns between
31 different blocks in the same "region", and the second runs only
32 basic block scheduling.
34 Interblock motions performed are useful motions and speculative
35 motions, including speculative loads. Motions requiring code
36 duplication are not supported. The identification of motion type
37 and the check for validity of speculative motions requires
38 construction and analysis of the function's control flow graph.
39 The scheduler works as follows:
41 We compute insn priorities based on data dependencies. Flow
42 analysis only creates a fraction of the data-dependencies we must
43 observe: namely, only those dependencies which the combiner can be
44 expected to use. For this pass, we must therefore create the
45 remaining dependencies we need to observe: register dependencies,
46 memory dependencies, dependencies to keep function calls in order,
47 and the dependence between a conditional branch and the setting of
48 condition codes are all dealt with here.
50 The scheduler first traverses the data flow graph, starting with
51 the last instruction, and proceeding to the first, assigning values
52 to insn_priority as it goes. This sorts the instructions
53 topologically by data dependence.
55 Once priorities have been established, we order the insns using
56 list scheduling. This works as follows: starting with a list of
57 all the ready insns, and sorted according to priority number, we
58 schedule the insn from the end of the list by placing its
59 predecessors in the list according to their priority order. We
60 consider this insn scheduled by setting the pointer to the "end" of
61 the list to point to the previous insn. When an insn has no
62 predecessors, we either queue it until sufficient time has elapsed
63 or add it to the ready list. As the instructions are scheduled or
64 when stalls are introduced, the queue advances and dumps insns into
65 the ready list. When all insns down to the lowest priority have
66 been scheduled, the critical path of the basic block has been made
67 as short as possible. The remaining insns are then scheduled in
70 Function unit conflicts are resolved during forward list scheduling
71 by tracking the time when each insn is committed to the schedule
72 and from that, the time the function units it uses must be free.
73 As insns on the ready list are considered for scheduling, those
74 that would result in a blockage of the already committed insns are
75 queued until no blockage will result.
77 The following list shows the order in which we want to break ties
78 among insns in the ready list:
80 1. choose insn with the longest path to end of bb, ties
82 2. choose insn with least contribution to register pressure,
84 3. prefer in-block upon interblock motion, ties broken by
85 4. prefer useful upon speculative motion, ties broken by
86 5. choose insn with largest control flow probability, ties
88 6. choose insn with the least dependences upon the previously
89 scheduled insn, or finally
90 7 choose the insn which has the most insns dependent on it.
91 8. choose insn with lowest UID.
93 Memory references complicate matters. Only if we can be certain
94 that memory references are not part of the data dependency graph
95 (via true, anti, or output dependence), can we move operations past
96 memory references. To first approximation, reads can be done
97 independently, while writes introduce dependencies. Better
98 approximations will yield fewer dependencies.
100 Before reload, an extended analysis of interblock data dependences
101 is required for interblock scheduling. This is performed in
102 compute_block_backward_dependences ().
104 Dependencies set up by memory references are treated in exactly the
105 same way as other dependencies, by using LOG_LINKS backward
106 dependences. LOG_LINKS are translated into INSN_DEPEND forward
107 dependences for the purpose of forward list scheduling.
109 Having optimized the critical path, we may have also unduly
110 extended the lifetimes of some registers. If an operation requires
111 that constants be loaded into registers, it is certainly desirable
112 to load those constants as early as necessary, but no earlier.
113 I.e., it will not do to load up a bunch of registers at the
114 beginning of a basic block only to use them at the end, if they
115 could be loaded later, since this may result in excessive register
118 Note that since branches are never in basic blocks, but only end
119 basic blocks, this pass will not move branches. But that is ok,
120 since we can use GNU's delayed branch scheduling pass to take care
123 Also note that no further optimizations based on algebraic
124 identities are performed, so this pass would be a good one to
125 perform instruction splitting, such as breaking up a multiply
126 instruction into shifts and adds where that is profitable.
128 Given the memory aliasing analysis that this pass should perform,
129 it should be possible to remove redundant stores to memory, and to
130 load values from registers instead of hitting memory.
132 Before reload, speculative insns are moved only if a 'proof' exists
133 that no exception will be caused by this, and if no live registers
134 exist that inhibit the motion (live registers constraints are not
135 represented by data dependence edges).
137 This pass must update information that subsequent passes expect to
138 be correct. Namely: reg_n_refs, reg_n_sets, reg_n_deaths,
139 reg_n_calls_crossed, and reg_live_length. Also, BLOCK_HEAD,
142 The information in the line number notes is carefully retained by
143 this pass. Notes that refer to the starting and ending of
144 exception regions are also carefully retained by this pass. All
145 other NOTE insns are grouped in their same relative order at the
146 beginning of basic blocks and regions that have been scheduled.
148 The main entry point for this pass is schedule_insns(), called for
149 each function. The work of the scheduler is organized in three
150 levels: (1) function level: insns are subject to splitting,
151 control-flow-graph is constructed, regions are computed (after
152 reload, each region is of one block), (2) region level: control
153 flow graph attributes required for interblock scheduling are
154 computed (dominators, reachability, etc.), data dependences and
155 priorities are computed, and (3) block level: insns in the block
156 are actually scheduled. */
163 #include "basic-block.h"
165 #include "function.h"
166 #include "hard-reg-set.h"
168 #include "insn-config.h"
169 #include "insn-attr.h"
174 extern char *reg_known_equiv_p
;
175 extern rtx
*reg_known_value
;
177 #ifdef INSN_SCHEDULING
179 /* target_units bitmask has 1 for each unit in the cpu. It should be
180 possible to compute this variable from the machine description.
181 But currently it is computed by examining the insn list. Since
182 this is only needed for visualization, it seems an acceptable
183 solution. (For understanding the mapping of bits to units, see
184 definition of function_units[] in "insn-attrtab.c".) */
186 static int target_units
= 0;
188 /* issue_rate is the number of insns that can be scheduled in the same
189 machine cycle. It can be defined in the config/mach/mach.h file,
190 otherwise we set it to 1. */
192 static int issue_rate
;
198 /* sched-verbose controls the amount of debugging output the
199 scheduler prints. It is controlled by -fsched-verbose-N:
200 N>0 and no -DSR : the output is directed to stderr.
201 N>=10 will direct the printouts to stderr (regardless of -dSR).
203 N=2: bb's probabilities, detailed ready list info, unit/insn info.
204 N=3: rtl at abort point, control-flow, regions info.
205 N=5: dependences info. */
207 #define MAX_RGN_BLOCKS 10
208 #define MAX_RGN_INSNS 100
210 static int sched_verbose_param
= 0;
211 static int sched_verbose
= 0;
213 /* nr_inter/spec counts interblock/speculative motion for the function. */
214 static int nr_inter
, nr_spec
;
217 /* Debugging file. All printouts are sent to dump, which is always set,
218 either to stderr, or to the dump listing file (-dRS). */
219 static FILE *dump
= 0;
221 /* fix_sched_param() is called from toplev.c upon detection
222 of the -fsched-***-N options. */
225 fix_sched_param (param
, val
)
226 const char *param
, *val
;
228 if (!strcmp (param
, "verbose"))
229 sched_verbose_param
= atoi (val
);
231 warning ("fix_sched_param: unknown param: %s", param
);
235 /* Arrays set up by scheduling for the same respective purposes as
236 similar-named arrays set up by flow analysis. We work with these
237 arrays during the scheduling pass so we can compare values against
240 Values of these arrays are copied at the end of this pass into the
241 arrays set up by flow analysis. */
242 static int *sched_reg_n_calls_crossed
;
243 static int *sched_reg_live_length
;
244 static int *sched_reg_basic_block
;
246 /* We need to know the current block number during the post scheduling
247 update of live register information so that we can also update
248 REG_BASIC_BLOCK if a register changes blocks. */
249 static int current_block_num
;
251 /* Element N is the next insn that sets (hard or pseudo) register
252 N within the current basic block; or zero, if there is no
253 such insn. Needed for new registers which may be introduced
254 by splitting insns. */
255 static rtx
*reg_last_uses
;
256 static rtx
*reg_last_sets
;
257 static rtx
*reg_last_clobbers
;
258 static regset reg_pending_sets
;
259 static regset reg_pending_clobbers
;
260 static int reg_pending_sets_all
;
262 /* Vector indexed by INSN_UID giving the original ordering of the insns. */
263 static int *insn_luid
;
264 #define INSN_LUID(INSN) (insn_luid[INSN_UID (INSN)])
266 /* Vector indexed by INSN_UID giving each instruction a priority. */
267 static int *insn_priority
;
268 #define INSN_PRIORITY(INSN) (insn_priority[INSN_UID (INSN)])
270 static short *insn_costs
;
271 #define INSN_COST(INSN) insn_costs[INSN_UID (INSN)]
273 /* Vector indexed by INSN_UID giving an encoding of the function units
275 static short *insn_units
;
276 #define INSN_UNIT(INSN) insn_units[INSN_UID (INSN)]
278 /* Vector indexed by INSN_UID giving each instruction a
279 register-weight. This weight is an estimation of the insn
280 contribution to registers pressure. */
281 static int *insn_reg_weight
;
282 #define INSN_REG_WEIGHT(INSN) (insn_reg_weight[INSN_UID (INSN)])
284 /* Vector indexed by INSN_UID giving list of insns which
285 depend upon INSN. Unlike LOG_LINKS, it represents forward dependences. */
286 static rtx
*insn_depend
;
287 #define INSN_DEPEND(INSN) insn_depend[INSN_UID (INSN)]
289 /* Vector indexed by INSN_UID. Initialized to the number of incoming
290 edges in forward dependence graph (= number of LOG_LINKS). As
291 scheduling procedes, dependence counts are decreased. An
292 instruction moves to the ready list when its counter is zero. */
293 static int *insn_dep_count
;
294 #define INSN_DEP_COUNT(INSN) (insn_dep_count[INSN_UID (INSN)])
296 /* Vector indexed by INSN_UID giving an encoding of the blockage range
297 function. The unit and the range are encoded. */
298 static unsigned int *insn_blockage
;
299 #define INSN_BLOCKAGE(INSN) insn_blockage[INSN_UID (INSN)]
301 #define BLOCKAGE_MASK ((1 << BLOCKAGE_BITS) - 1)
302 #define ENCODE_BLOCKAGE(U, R) \
303 (((U) << BLOCKAGE_BITS \
304 | MIN_BLOCKAGE_COST (R)) << BLOCKAGE_BITS \
305 | MAX_BLOCKAGE_COST (R))
306 #define UNIT_BLOCKED(B) ((B) >> (2 * BLOCKAGE_BITS))
307 #define BLOCKAGE_RANGE(B) \
308 (((((B) >> BLOCKAGE_BITS) & BLOCKAGE_MASK) << (HOST_BITS_PER_INT / 2)) \
309 | ((B) & BLOCKAGE_MASK))
311 /* Encodings of the `<name>_unit_blockage_range' function. */
312 #define MIN_BLOCKAGE_COST(R) ((R) >> (HOST_BITS_PER_INT / 2))
313 #define MAX_BLOCKAGE_COST(R) ((R) & ((1 << (HOST_BITS_PER_INT / 2)) - 1))
315 #define DONE_PRIORITY -1
316 #define MAX_PRIORITY 0x7fffffff
317 #define TAIL_PRIORITY 0x7ffffffe
318 #define LAUNCH_PRIORITY 0x7f000001
319 #define DONE_PRIORITY_P(INSN) (INSN_PRIORITY (INSN) < 0)
320 #define LOW_PRIORITY_P(INSN) ((INSN_PRIORITY (INSN) & 0x7f000000) == 0)
322 /* Vector indexed by INSN_UID giving number of insns referring to this
324 static int *insn_ref_count
;
325 #define INSN_REF_COUNT(INSN) (insn_ref_count[INSN_UID (INSN)])
327 /* Vector indexed by INSN_UID giving line-number note in effect for each
328 insn. For line-number notes, this indicates whether the note may be
330 static rtx
*line_note
;
331 #define LINE_NOTE(INSN) (line_note[INSN_UID (INSN)])
333 /* Vector indexed by basic block number giving the starting line-number
334 for each basic block. */
335 static rtx
*line_note_head
;
337 /* List of important notes we must keep around. This is a pointer to the
338 last element in the list. */
339 static rtx note_list
;
341 /* Regsets telling whether a given register is live or dead before the last
342 scheduled insn. Must scan the instructions once before scheduling to
343 determine what registers are live or dead at the end of the block. */
344 static regset bb_live_regs
;
346 /* Regset telling whether a given register is live after the insn currently
347 being scheduled. Before processing an insn, this is equal to bb_live_regs
348 above. This is used so that we can find registers that are newly born/dead
349 after processing an insn. */
350 static regset old_live_regs
;
352 /* The chain of REG_DEAD notes. REG_DEAD notes are removed from all insns
353 during the initial scan and reused later. If there are not exactly as
354 many REG_DEAD notes in the post scheduled code as there were in the
355 prescheduled code then we trigger an abort because this indicates a bug. */
356 static rtx dead_notes
;
360 /* An instruction is ready to be scheduled when all insns preceding it
361 have already been scheduled. It is important to ensure that all
362 insns which use its result will not be executed until its result
363 has been computed. An insn is maintained in one of four structures:
365 (P) the "Pending" set of insns which cannot be scheduled until
366 their dependencies have been satisfied.
367 (Q) the "Queued" set of insns that can be scheduled when sufficient
369 (R) the "Ready" list of unscheduled, uncommitted insns.
370 (S) the "Scheduled" list of insns.
372 Initially, all insns are either "Pending" or "Ready" depending on
373 whether their dependencies are satisfied.
375 Insns move from the "Ready" list to the "Scheduled" list as they
376 are committed to the schedule. As this occurs, the insns in the
377 "Pending" list have their dependencies satisfied and move to either
378 the "Ready" list or the "Queued" set depending on whether
379 sufficient time has passed to make them ready. As time passes,
380 insns move from the "Queued" set to the "Ready" list. Insns may
381 move from the "Ready" list to the "Queued" set if they are blocked
382 due to a function unit conflict.
384 The "Pending" list (P) are the insns in the INSN_DEPEND of the unscheduled
385 insns, i.e., those that are ready, queued, and pending.
386 The "Queued" set (Q) is implemented by the variable `insn_queue'.
387 The "Ready" list (R) is implemented by the variables `ready' and
389 The "Scheduled" list (S) is the new insn chain built by this pass.
391 The transition (R->S) is implemented in the scheduling loop in
392 `schedule_block' when the best insn to schedule is chosen.
393 The transition (R->Q) is implemented in `queue_insn' when an
394 insn is found to have a function unit conflict with the already
396 The transitions (P->R and P->Q) are implemented in `schedule_insn' as
397 insns move from the ready list to the scheduled list.
398 The transition (Q->R) is implemented in 'queue_to_insn' as time
399 passes or stalls are introduced. */
401 /* Implement a circular buffer to delay instructions until sufficient
402 time has passed. INSN_QUEUE_SIZE is a power of two larger than
403 MAX_BLOCKAGE and MAX_READY_COST computed by genattr.c. This is the
404 longest time an isnsn may be queued. */
405 static rtx insn_queue
[INSN_QUEUE_SIZE
];
406 static int q_ptr
= 0;
407 static int q_size
= 0;
408 #define NEXT_Q(X) (((X)+1) & (INSN_QUEUE_SIZE-1))
409 #define NEXT_Q_AFTER(X, C) (((X)+C) & (INSN_QUEUE_SIZE-1))
411 /* Vector indexed by INSN_UID giving the minimum clock tick at which
412 the insn becomes ready. This is used to note timing constraints for
413 insns in the pending list. */
414 static int *insn_tick
;
415 #define INSN_TICK(INSN) (insn_tick[INSN_UID (INSN)])
417 /* Data structure for keeping track of register information
418 during that register's life. */
427 /* Forward declarations. */
428 static void add_dependence
PROTO ((rtx
, rtx
, enum reg_note
));
429 static void remove_dependence
PROTO ((rtx
, rtx
));
430 static rtx find_insn_list
PROTO ((rtx
, rtx
));
431 static int insn_unit
PROTO ((rtx
));
432 static unsigned int blockage_range
PROTO ((int, rtx
));
433 static void clear_units
PROTO ((void));
434 static int actual_hazard_this_instance
PROTO ((int, int, rtx
, int, int));
435 static void schedule_unit
PROTO ((int, rtx
, int));
436 static int actual_hazard
PROTO ((int, rtx
, int, int));
437 static int potential_hazard
PROTO ((int, rtx
, int));
438 static int insn_cost
PROTO ((rtx
, rtx
, rtx
));
439 static int priority
PROTO ((rtx
));
440 static void free_pending_lists
PROTO ((void));
441 static void add_insn_mem_dependence
PROTO ((rtx
*, rtx
*, rtx
, rtx
));
442 static void flush_pending_lists
PROTO ((rtx
, int));
443 static void sched_analyze_1
PROTO ((rtx
, rtx
));
444 static void sched_analyze_2
PROTO ((rtx
, rtx
));
445 static void sched_analyze_insn
PROTO ((rtx
, rtx
, rtx
));
446 static void sched_analyze
PROTO ((rtx
, rtx
));
447 static void sched_note_set
PROTO ((rtx
, int));
448 static int rank_for_schedule
PROTO ((const PTR
, const PTR
));
449 static void swap_sort
PROTO ((rtx
*, int));
450 static void queue_insn
PROTO ((rtx
, int));
451 static int schedule_insn
PROTO ((rtx
, rtx
*, int, int));
452 static void create_reg_dead_note
PROTO ((rtx
, rtx
));
453 static void attach_deaths
PROTO ((rtx
, rtx
, int));
454 static void attach_deaths_insn
PROTO ((rtx
));
455 static int new_sometimes_live
PROTO ((struct sometimes
*, int, int));
456 static void finish_sometimes_live
PROTO ((struct sometimes
*, int));
457 static int schedule_block
PROTO ((int, int));
458 static char *safe_concat
PROTO ((char *, char *, const char *));
459 static int insn_issue_delay
PROTO ((rtx
));
460 static int birthing_insn_p
PROTO ((rtx
));
461 static void adjust_priority
PROTO ((rtx
));
463 /* Mapping of insns to their original block prior to scheduling. */
464 static int *insn_orig_block
;
465 #define INSN_BLOCK(insn) (insn_orig_block[INSN_UID (insn)])
467 /* Some insns (e.g. call) are not allowed to move across blocks. */
468 static char *cant_move
;
469 #define CANT_MOVE(insn) (cant_move[INSN_UID (insn)])
471 /* Control flow graph edges are kept in circular lists. */
480 static haifa_edge
*edge_table
;
482 #define NEXT_IN(edge) (edge_table[edge].next_in)
483 #define NEXT_OUT(edge) (edge_table[edge].next_out)
484 #define FROM_BLOCK(edge) (edge_table[edge].from_block)
485 #define TO_BLOCK(edge) (edge_table[edge].to_block)
487 /* Number of edges in the control flow graph. (In fact, larger than
488 that by 1, since edge 0 is unused.) */
491 /* Circular list of incoming/outgoing edges of a block. */
492 static int *in_edges
;
493 static int *out_edges
;
495 #define IN_EDGES(block) (in_edges[block])
496 #define OUT_EDGES(block) (out_edges[block])
500 static int is_cfg_nonregular
PROTO ((void));
501 static int build_control_flow
PROTO ((int_list_ptr
*, int_list_ptr
*,
503 static void new_edge
PROTO ((int, int));
506 /* A region is the main entity for interblock scheduling: insns
507 are allowed to move between blocks in the same region, along
508 control flow graph edges, in the 'up' direction. */
511 int rgn_nr_blocks
; /* Number of blocks in region. */
512 int rgn_blocks
; /* cblocks in the region (actually index in rgn_bb_table). */
516 /* Number of regions in the procedure. */
517 static int nr_regions
;
519 /* Table of region descriptions. */
520 static region
*rgn_table
;
522 /* Array of lists of regions' blocks. */
523 static int *rgn_bb_table
;
525 /* Topological order of blocks in the region (if b2 is reachable from
526 b1, block_to_bb[b2] > block_to_bb[b1]). Note: A basic block is
527 always referred to by either block or b, while its topological
528 order name (in the region) is refered to by bb. */
529 static int *block_to_bb
;
531 /* The number of the region containing a block. */
532 static int *containing_rgn
;
534 #define RGN_NR_BLOCKS(rgn) (rgn_table[rgn].rgn_nr_blocks)
535 #define RGN_BLOCKS(rgn) (rgn_table[rgn].rgn_blocks)
536 #define BLOCK_TO_BB(block) (block_to_bb[block])
537 #define CONTAINING_RGN(block) (containing_rgn[block])
539 void debug_regions
PROTO ((void));
540 static void find_single_block_region
PROTO ((void));
541 static void find_rgns
PROTO ((int_list_ptr
*, int_list_ptr
*,
542 int *, int *, sbitmap
*));
543 static int too_large
PROTO ((int, int *, int *));
545 extern void debug_live
PROTO ((int, int));
547 /* Blocks of the current region being scheduled. */
548 static int current_nr_blocks
;
549 static int current_blocks
;
551 /* The mapping from bb to block. */
552 #define BB_TO_BLOCK(bb) (rgn_bb_table[current_blocks + (bb)])
555 /* Bit vectors and bitset operations are needed for computations on
556 the control flow graph. */
558 typedef unsigned HOST_WIDE_INT
*bitset
;
561 int *first_member
; /* Pointer to the list start in bitlst_table. */
562 int nr_members
; /* The number of members of the bit list. */
566 static int bitlst_table_last
;
567 static int bitlst_table_size
;
568 static int *bitlst_table
;
570 static char bitset_member
PROTO ((bitset
, int, int));
571 static void extract_bitlst
PROTO ((bitset
, int, bitlst
*));
573 /* Target info declarations.
575 The block currently being scheduled is referred to as the "target" block,
576 while other blocks in the region from which insns can be moved to the
577 target are called "source" blocks. The candidate structure holds info
578 about such sources: are they valid? Speculative? Etc. */
579 typedef bitlst bblst
;
590 static candidate
*candidate_table
;
592 /* A speculative motion requires checking live information on the path
593 from 'source' to 'target'. The split blocks are those to be checked.
594 After a speculative motion, live information should be modified in
597 Lists of split and update blocks for each candidate of the current
598 target are in array bblst_table. */
599 static int *bblst_table
, bblst_size
, bblst_last
;
601 #define IS_VALID(src) ( candidate_table[src].is_valid )
602 #define IS_SPECULATIVE(src) ( candidate_table[src].is_speculative )
603 #define SRC_PROB(src) ( candidate_table[src].src_prob )
605 /* The bb being currently scheduled. */
606 static int target_bb
;
609 typedef bitlst edgelst
;
611 /* Target info functions. */
612 static void split_edges
PROTO ((int, int, edgelst
*));
613 static void compute_trg_info
PROTO ((int));
614 void debug_candidate
PROTO ((int));
615 void debug_candidates
PROTO ((int));
618 /* Bit-set of bbs, where bit 'i' stands for bb 'i'. */
619 typedef bitset bbset
;
621 /* Number of words of the bbset. */
622 static int bbset_size
;
624 /* Dominators array: dom[i] contains the bbset of dominators of
625 bb i in the region. */
628 /* bb 0 is the only region entry. */
629 #define IS_RGN_ENTRY(bb) (!bb)
631 /* Is bb_src dominated by bb_trg. */
632 #define IS_DOMINATED(bb_src, bb_trg) \
633 ( bitset_member (dom[bb_src], bb_trg, bbset_size) )
635 /* Probability: Prob[i] is a float in [0, 1] which is the probability
636 of bb i relative to the region entry. */
639 /* The probability of bb_src, relative to bb_trg. Note, that while the
640 'prob[bb]' is a float in [0, 1], this macro returns an integer
642 #define GET_SRC_PROB(bb_src, bb_trg) ((int) (100.0 * (prob[bb_src] / \
645 /* Bit-set of edges, where bit i stands for edge i. */
646 typedef bitset edgeset
;
648 /* Number of edges in the region. */
649 static int rgn_nr_edges
;
651 /* Array of size rgn_nr_edges. */
652 static int *rgn_edges
;
654 /* Number of words in an edgeset. */
655 static int edgeset_size
;
657 /* Mapping from each edge in the graph to its number in the rgn. */
658 static int *edge_to_bit
;
659 #define EDGE_TO_BIT(edge) (edge_to_bit[edge])
661 /* The split edges of a source bb is different for each target
662 bb. In order to compute this efficiently, the 'potential-split edges'
663 are computed for each bb prior to scheduling a region. This is actually
664 the split edges of each bb relative to the region entry.
666 pot_split[bb] is the set of potential split edges of bb. */
667 static edgeset
*pot_split
;
669 /* For every bb, a set of its ancestor edges. */
670 static edgeset
*ancestor_edges
;
672 static void compute_dom_prob_ps
PROTO ((int));
674 #define ABS_VALUE(x) (((x)<0)?(-(x)):(x))
675 #define INSN_PROBABILITY(INSN) (SRC_PROB (BLOCK_TO_BB (INSN_BLOCK (INSN))))
676 #define IS_SPECULATIVE_INSN(INSN) (IS_SPECULATIVE (BLOCK_TO_BB (INSN_BLOCK (INSN))))
677 #define INSN_BB(INSN) (BLOCK_TO_BB (INSN_BLOCK (INSN)))
679 /* Parameters affecting the decision of rank_for_schedule(). */
680 #define MIN_DIFF_PRIORITY 2
681 #define MIN_PROBABILITY 40
682 #define MIN_PROB_DIFF 10
684 /* Speculative scheduling functions. */
685 static int check_live_1
PROTO ((int, rtx
));
686 static void update_live_1
PROTO ((int, rtx
));
687 static int check_live
PROTO ((rtx
, int));
688 static void update_live
PROTO ((rtx
, int));
689 static void set_spec_fed
PROTO ((rtx
));
690 static int is_pfree
PROTO ((rtx
, int, int));
691 static int find_conditional_protection
PROTO ((rtx
, int));
692 static int is_conditionally_protected
PROTO ((rtx
, int, int));
693 static int may_trap_exp
PROTO ((rtx
, int));
694 static int haifa_classify_insn
PROTO ((rtx
));
695 static int is_prisky
PROTO ((rtx
, int, int));
696 static int is_exception_free
PROTO ((rtx
, int, int));
698 static char find_insn_mem_list
PROTO ((rtx
, rtx
, rtx
, rtx
));
699 static void compute_block_forward_dependences
PROTO ((int));
700 static void init_rgn_data_dependences
PROTO ((int));
701 static void add_branch_dependences
PROTO ((rtx
, rtx
));
702 static void compute_block_backward_dependences
PROTO ((int));
703 void debug_dependencies
PROTO ((void));
705 /* Notes handling mechanism:
706 =========================
707 Generally, NOTES are saved before scheduling and restored after scheduling.
708 The scheduler distinguishes between three types of notes:
710 (1) LINE_NUMBER notes, generated and used for debugging. Here,
711 before scheduling a region, a pointer to the LINE_NUMBER note is
712 added to the insn following it (in save_line_notes()), and the note
713 is removed (in rm_line_notes() and unlink_line_notes()). After
714 scheduling the region, this pointer is used for regeneration of
715 the LINE_NUMBER note (in restore_line_notes()).
717 (2) LOOP_BEGIN, LOOP_END, SETJMP, EHREGION_BEG, EHREGION_END notes:
718 Before scheduling a region, a pointer to the note is added to the insn
719 that follows or precedes it. (This happens as part of the data dependence
720 computation). After scheduling an insn, the pointer contained in it is
721 used for regenerating the corresponding note (in reemit_notes).
723 (3) All other notes (e.g. INSN_DELETED): Before scheduling a block,
724 these notes are put in a list (in rm_other_notes() and
725 unlink_other_notes ()). After scheduling the block, these notes are
726 inserted at the beginning of the block (in schedule_block()). */
728 static rtx unlink_other_notes
PROTO ((rtx
, rtx
));
729 static rtx unlink_line_notes
PROTO ((rtx
, rtx
));
730 static void rm_line_notes
PROTO ((int));
731 static void save_line_notes
PROTO ((int));
732 static void restore_line_notes
PROTO ((int));
733 static void rm_redundant_line_notes
PROTO ((void));
734 static void rm_other_notes
PROTO ((rtx
, rtx
));
735 static rtx reemit_notes
PROTO ((rtx
, rtx
));
737 static void get_block_head_tail
PROTO ((int, rtx
*, rtx
*));
739 static void find_pre_sched_live
PROTO ((int));
740 static void find_post_sched_live
PROTO ((int));
741 static void update_reg_usage
PROTO ((void));
742 static int queue_to_ready
PROTO ((rtx
[], int));
744 static void debug_ready_list
PROTO ((rtx
[], int));
745 static void init_target_units
PROTO ((void));
746 static void insn_print_units
PROTO ((rtx
));
747 static int get_visual_tbl_length
PROTO ((void));
748 static void init_block_visualization
PROTO ((void));
749 static void print_block_visualization
PROTO ((int, const char *));
750 static void visualize_scheduled_insns
PROTO ((int, int));
751 static void visualize_no_unit
PROTO ((rtx
));
752 static void visualize_stall_cycles
PROTO ((int, int));
753 static void print_exp
PROTO ((char *, rtx
, int));
754 static void print_value
PROTO ((char *, rtx
, int));
755 static void print_pattern
PROTO ((char *, rtx
, int));
756 static void print_insn
PROTO ((char *, rtx
, int));
757 void debug_reg_vector
PROTO ((regset
));
759 static rtx move_insn1
PROTO ((rtx
, rtx
));
760 static rtx move_insn
PROTO ((rtx
, rtx
));
761 static rtx group_leader
PROTO ((rtx
));
762 static int set_priorities
PROTO ((int));
763 static void init_rtx_vector
PROTO ((rtx
**, rtx
*, int, int));
764 static void schedule_region
PROTO ((int));
766 #endif /* INSN_SCHEDULING */
768 #define SIZE_FOR_MODE(X) (GET_MODE_SIZE (GET_MODE (X)))
770 /* Add ELEM wrapped in an INSN_LIST with reg note kind DEP_TYPE to the
771 LOG_LINKS of INSN, if not already there. DEP_TYPE indicates the type
772 of dependence that this link represents. */
775 add_dependence (insn
, elem
, dep_type
)
778 enum reg_note dep_type
;
782 /* Don't depend an insn on itself. */
786 /* We can get a dependency on deleted insns due to optimizations in
787 the register allocation and reloading or due to splitting. Any
788 such dependency is useless and can be ignored. */
789 if (GET_CODE (elem
) == NOTE
)
792 /* If elem is part of a sequence that must be scheduled together, then
793 make the dependence point to the last insn of the sequence.
794 When HAVE_cc0, it is possible for NOTEs to exist between users and
795 setters of the condition codes, so we must skip past notes here.
796 Otherwise, NOTEs are impossible here. */
798 next
= NEXT_INSN (elem
);
801 while (next
&& GET_CODE (next
) == NOTE
)
802 next
= NEXT_INSN (next
);
805 if (next
&& SCHED_GROUP_P (next
)
806 && GET_CODE (next
) != CODE_LABEL
)
808 /* Notes will never intervene here though, so don't bother checking
810 /* We must reject CODE_LABELs, so that we don't get confused by one
811 that has LABEL_PRESERVE_P set, which is represented by the same
812 bit in the rtl as SCHED_GROUP_P. A CODE_LABEL can never be
814 while (NEXT_INSN (next
) && SCHED_GROUP_P (NEXT_INSN (next
))
815 && GET_CODE (NEXT_INSN (next
)) != CODE_LABEL
)
816 next
= NEXT_INSN (next
);
818 /* Again, don't depend an insn on itself. */
822 /* Make the dependence to NEXT, the last insn of the group, instead
823 of the original ELEM. */
827 #ifdef INSN_SCHEDULING
828 /* (This code is guarded by INSN_SCHEDULING, otherwise INSN_BB is undefined.)
829 No need for interblock dependences with calls, since
830 calls are not moved between blocks. Note: the edge where
831 elem is a CALL is still required. */
832 if (GET_CODE (insn
) == CALL_INSN
833 && (INSN_BB (elem
) != INSN_BB (insn
)))
838 /* Check that we don't already have this dependence. */
839 for (link
= LOG_LINKS (insn
); link
; link
= XEXP (link
, 1))
840 if (XEXP (link
, 0) == elem
)
842 /* If this is a more restrictive type of dependence than the existing
843 one, then change the existing dependence to this type. */
844 if ((int) dep_type
< (int) REG_NOTE_KIND (link
))
845 PUT_REG_NOTE_KIND (link
, dep_type
);
848 /* Might want to check one level of transitivity to save conses. */
850 link
= alloc_INSN_LIST (elem
, LOG_LINKS (insn
));
851 LOG_LINKS (insn
) = link
;
853 /* Insn dependency, not data dependency. */
854 PUT_REG_NOTE_KIND (link
, dep_type
);
857 /* Remove ELEM wrapped in an INSN_LIST from the LOG_LINKS
858 of INSN. Abort if not found. */
861 remove_dependence (insn
, elem
)
865 rtx prev
, link
, next
;
868 for (prev
= 0, link
= LOG_LINKS (insn
); link
; link
= next
)
870 next
= XEXP (link
, 1);
871 if (XEXP (link
, 0) == elem
)
874 XEXP (prev
, 1) = next
;
876 LOG_LINKS (insn
) = next
;
877 free_INSN_LIST_node (link
);
890 #ifndef INSN_SCHEDULING
892 schedule_insns (dump_file
)
902 #define HAIFA_INLINE __inline
905 /* Computation of memory dependencies. */
907 /* The *_insns and *_mems are paired lists. Each pending memory operation
908 will have a pointer to the MEM rtx on one list and a pointer to the
909 containing insn on the other list in the same place in the list. */
911 /* We can't use add_dependence like the old code did, because a single insn
912 may have multiple memory accesses, and hence needs to be on the list
913 once for each memory access. Add_dependence won't let you add an insn
914 to a list more than once. */
916 /* An INSN_LIST containing all insns with pending read operations. */
917 static rtx pending_read_insns
;
919 /* An EXPR_LIST containing all MEM rtx's which are pending reads. */
920 static rtx pending_read_mems
;
922 /* An INSN_LIST containing all insns with pending write operations. */
923 static rtx pending_write_insns
;
925 /* An EXPR_LIST containing all MEM rtx's which are pending writes. */
926 static rtx pending_write_mems
;
928 /* Indicates the combined length of the two pending lists. We must prevent
929 these lists from ever growing too large since the number of dependencies
930 produced is at least O(N*N), and execution time is at least O(4*N*N), as
931 a function of the length of these pending lists. */
933 static int pending_lists_length
;
935 /* The last insn upon which all memory references must depend.
936 This is an insn which flushed the pending lists, creating a dependency
937 between it and all previously pending memory references. This creates
938 a barrier (or a checkpoint) which no memory reference is allowed to cross.
940 This includes all non constant CALL_INSNs. When we do interprocedural
941 alias analysis, this restriction can be relaxed.
942 This may also be an INSN that writes memory if the pending lists grow
945 static rtx last_pending_memory_flush
;
947 /* The last function call we have seen. All hard regs, and, of course,
948 the last function call, must depend on this. */
950 static rtx last_function_call
;
952 /* The LOG_LINKS field of this is a list of insns which use a pseudo register
953 that does not already cross a call. We create dependencies between each
954 of those insn and the next call insn, to ensure that they won't cross a call
955 after scheduling is done. */
957 static rtx sched_before_next_call
;
959 /* Pointer to the last instruction scheduled. Used by rank_for_schedule,
960 so that insns independent of the last scheduled insn will be preferred
961 over dependent instructions. */
963 static rtx last_scheduled_insn
;
965 /* Data structures for the computation of data dependences in a regions. We
966 keep one copy of each of the declared above variables for each bb in the
967 region. Before analyzing the data dependences for a bb, its variables
968 are initialized as a function of the variables of its predecessors. When
969 the analysis for a bb completes, we save the contents of each variable X
970 to a corresponding bb_X[bb] variable. For example, pending_read_insns is
971 copied to bb_pending_read_insns[bb]. Another change is that few
972 variables are now a list of insns rather than a single insn:
973 last_pending_memory_flash, last_function_call, reg_last_sets. The
974 manipulation of these variables was changed appropriately. */
976 static rtx
**bb_reg_last_uses
;
977 static rtx
**bb_reg_last_sets
;
978 static rtx
**bb_reg_last_clobbers
;
980 static rtx
*bb_pending_read_insns
;
981 static rtx
*bb_pending_read_mems
;
982 static rtx
*bb_pending_write_insns
;
983 static rtx
*bb_pending_write_mems
;
984 static int *bb_pending_lists_length
;
986 static rtx
*bb_last_pending_memory_flush
;
987 static rtx
*bb_last_function_call
;
988 static rtx
*bb_sched_before_next_call
;
990 /* Functions for construction of the control flow graph. */
992 /* Return 1 if control flow graph should not be constructed, 0 otherwise.
994 We decide not to build the control flow graph if there is possibly more
995 than one entry to the function, if computed branches exist, of if we
996 have nonlocal gotos. */
1005 /* If we have a label that could be the target of a nonlocal goto, then
1006 the cfg is not well structured. */
1007 if (nonlocal_goto_handler_labels
)
1010 /* If we have any forced labels, then the cfg is not well structured. */
1014 /* If this function has a computed jump, then we consider the cfg
1015 not well structured. */
1016 if (current_function_has_computed_jump
)
1019 /* If we have exception handlers, then we consider the cfg not well
1020 structured. ?!? We should be able to handle this now that flow.c
1021 computes an accurate cfg for EH. */
1022 if (exception_handler_labels
)
1025 /* If we have non-jumping insns which refer to labels, then we consider
1026 the cfg not well structured. */
1027 /* Check for labels referred to other thn by jumps. */
1028 for (b
= 0; b
< n_basic_blocks
; b
++)
1029 for (insn
= BLOCK_HEAD (b
);; insn
= NEXT_INSN (insn
))
1031 code
= GET_CODE (insn
);
1032 if (GET_RTX_CLASS (code
) == 'i')
1036 for (note
= REG_NOTES (insn
); note
; note
= XEXP (note
, 1))
1037 if (REG_NOTE_KIND (note
) == REG_LABEL
)
1041 if (insn
== BLOCK_END (b
))
1045 /* All the tests passed. Consider the cfg well structured. */
1049 /* Build the control flow graph and set nr_edges.
1051 Instead of trying to build a cfg ourselves, we rely on flow to
1052 do it for us. Stamp out useless code (and bug) duplication.
1054 Return nonzero if an irregularity in the cfg is found which would
1055 prevent cross block scheduling. */
1058 build_control_flow (s_preds
, s_succs
, num_preds
, num_succs
)
1059 int_list_ptr
*s_preds
;
1060 int_list_ptr
*s_succs
;
1068 /* Count the number of edges in the cfg. */
1071 for (i
= 0; i
< n_basic_blocks
; i
++)
1073 nr_edges
+= num_succs
[i
];
1075 /* Unreachable loops with more than one basic block are detected
1076 during the DFS traversal in find_rgns.
1078 Unreachable loops with a single block are detected here. This
1079 test is redundant with the one in find_rgns, but it's much
1080 cheaper to go ahead and catch the trivial case here. */
1081 if (num_preds
[i
] == 0
1082 || (num_preds
[i
] == 1 && INT_LIST_VAL (s_preds
[i
]) == i
))
1086 /* Account for entry/exit edges. */
1089 in_edges
= (int *) xcalloc (n_basic_blocks
, sizeof (int));
1090 out_edges
= (int *) xcalloc (n_basic_blocks
, sizeof (int));
1091 edge_table
= (haifa_edge
*) xcalloc (nr_edges
, sizeof (haifa_edge
));
1094 for (i
= 0; i
< n_basic_blocks
; i
++)
1095 for (succ
= s_succs
[i
]; succ
; succ
= succ
->next
)
1097 if (INT_LIST_VAL (succ
) != EXIT_BLOCK
)
1098 new_edge (i
, INT_LIST_VAL (succ
));
1101 /* Increment by 1, since edge 0 is unused. */
1108 /* Record an edge in the control flow graph from SOURCE to TARGET.
1110 In theory, this is redundant with the s_succs computed above, but
1111 we have not converted all of haifa to use information from the
1115 new_edge (source
, target
)
1119 int curr_edge
, fst_edge
;
1121 /* Check for duplicates. */
1122 fst_edge
= curr_edge
= OUT_EDGES (source
);
1125 if (FROM_BLOCK (curr_edge
) == source
1126 && TO_BLOCK (curr_edge
) == target
)
1131 curr_edge
= NEXT_OUT (curr_edge
);
1133 if (fst_edge
== curr_edge
)
1139 FROM_BLOCK (e
) = source
;
1140 TO_BLOCK (e
) = target
;
1142 if (OUT_EDGES (source
))
1144 next_edge
= NEXT_OUT (OUT_EDGES (source
));
1145 NEXT_OUT (OUT_EDGES (source
)) = e
;
1146 NEXT_OUT (e
) = next_edge
;
1150 OUT_EDGES (source
) = e
;
1154 if (IN_EDGES (target
))
1156 next_edge
= NEXT_IN (IN_EDGES (target
));
1157 NEXT_IN (IN_EDGES (target
)) = e
;
1158 NEXT_IN (e
) = next_edge
;
1162 IN_EDGES (target
) = e
;
1168 /* BITSET macros for operations on the control flow graph. */
1170 /* Compute bitwise union of two bitsets. */
1171 #define BITSET_UNION(set1, set2, len) \
1172 do { register bitset tp = set1, sp = set2; \
1174 for (i = 0; i < len; i++) \
1175 *(tp++) |= *(sp++); } while (0)
1177 /* Compute bitwise intersection of two bitsets. */
1178 #define BITSET_INTER(set1, set2, len) \
1179 do { register bitset tp = set1, sp = set2; \
1181 for (i = 0; i < len; i++) \
1182 *(tp++) &= *(sp++); } while (0)
1184 /* Compute bitwise difference of two bitsets. */
1185 #define BITSET_DIFFER(set1, set2, len) \
1186 do { register bitset tp = set1, sp = set2; \
1188 for (i = 0; i < len; i++) \
1189 *(tp++) &= ~*(sp++); } while (0)
1191 /* Inverts every bit of bitset 'set'. */
1192 #define BITSET_INVERT(set, len) \
1193 do { register bitset tmpset = set; \
1195 for (i = 0; i < len; i++, tmpset++) \
1196 *tmpset = ~*tmpset; } while (0)
1198 /* Turn on the index'th bit in bitset set. */
1199 #define BITSET_ADD(set, index, len) \
1201 if (index >= HOST_BITS_PER_WIDE_INT * len) \
1204 set[index/HOST_BITS_PER_WIDE_INT] |= \
1205 1 << (index % HOST_BITS_PER_WIDE_INT); \
1208 /* Turn off the index'th bit in set. */
1209 #define BITSET_REMOVE(set, index, len) \
1211 if (index >= HOST_BITS_PER_WIDE_INT * len) \
1214 set[index/HOST_BITS_PER_WIDE_INT] &= \
1215 ~(1 << (index%HOST_BITS_PER_WIDE_INT)); \
1219 /* Check if the index'th bit in bitset set is on. */
1222 bitset_member (set
, index
, len
)
1226 if (index
>= HOST_BITS_PER_WIDE_INT
* len
)
1228 return (set
[index
/ HOST_BITS_PER_WIDE_INT
] &
1229 1 << (index
% HOST_BITS_PER_WIDE_INT
)) ? 1 : 0;
1233 /* Translate a bit-set SET to a list BL of the bit-set members. */
1236 extract_bitlst (set
, len
, bl
)
1242 unsigned HOST_WIDE_INT word
;
1244 /* bblst table space is reused in each call to extract_bitlst. */
1245 bitlst_table_last
= 0;
1247 bl
->first_member
= &bitlst_table
[bitlst_table_last
];
1250 for (i
= 0; i
< len
; i
++)
1253 offset
= i
* HOST_BITS_PER_WIDE_INT
;
1254 for (j
= 0; word
; j
++)
1258 bitlst_table
[bitlst_table_last
++] = offset
;
1269 /* Functions for the construction of regions. */
1271 /* Print the regions, for debugging purposes. Callable from debugger. */
1278 fprintf (dump
, "\n;; ------------ REGIONS ----------\n\n");
1279 for (rgn
= 0; rgn
< nr_regions
; rgn
++)
1281 fprintf (dump
, ";;\trgn %d nr_blocks %d:\n", rgn
,
1282 rgn_table
[rgn
].rgn_nr_blocks
);
1283 fprintf (dump
, ";;\tbb/block: ");
1285 for (bb
= 0; bb
< rgn_table
[rgn
].rgn_nr_blocks
; bb
++)
1287 current_blocks
= RGN_BLOCKS (rgn
);
1289 if (bb
!= BLOCK_TO_BB (BB_TO_BLOCK (bb
)))
1292 fprintf (dump
, " %d/%d ", bb
, BB_TO_BLOCK (bb
));
1295 fprintf (dump
, "\n\n");
1300 /* Build a single block region for each basic block in the function.
1301 This allows for using the same code for interblock and basic block
1305 find_single_block_region ()
1309 for (i
= 0; i
< n_basic_blocks
; i
++)
1311 rgn_bb_table
[i
] = i
;
1312 RGN_NR_BLOCKS (i
) = 1;
1314 CONTAINING_RGN (i
) = i
;
1315 BLOCK_TO_BB (i
) = 0;
1317 nr_regions
= n_basic_blocks
;
1321 /* Update number of blocks and the estimate for number of insns
1322 in the region. Return 1 if the region is "too large" for interblock
1323 scheduling (compile time considerations), otherwise return 0. */
1326 too_large (block
, num_bbs
, num_insns
)
1327 int block
, *num_bbs
, *num_insns
;
1330 (*num_insns
) += (INSN_LUID (BLOCK_END (block
)) -
1331 INSN_LUID (BLOCK_HEAD (block
)));
1332 if ((*num_bbs
> MAX_RGN_BLOCKS
) || (*num_insns
> MAX_RGN_INSNS
))
1339 /* Update_loop_relations(blk, hdr): Check if the loop headed by max_hdr[blk]
1340 is still an inner loop. Put in max_hdr[blk] the header of the most inner
1341 loop containing blk. */
1342 #define UPDATE_LOOP_RELATIONS(blk, hdr) \
1344 if (max_hdr[blk] == -1) \
1345 max_hdr[blk] = hdr; \
1346 else if (dfs_nr[max_hdr[blk]] > dfs_nr[hdr]) \
1347 RESET_BIT (inner, hdr); \
1348 else if (dfs_nr[max_hdr[blk]] < dfs_nr[hdr]) \
1350 RESET_BIT (inner,max_hdr[blk]); \
1351 max_hdr[blk] = hdr; \
1356 /* Find regions for interblock scheduling.
1358 A region for scheduling can be:
1360 * A loop-free procedure, or
1362 * A reducible inner loop, or
1364 * A basic block not contained in any other region.
1367 ?!? In theory we could build other regions based on extended basic
1368 blocks or reverse extended basic blocks. Is it worth the trouble?
1370 Loop blocks that form a region are put into the region's block list
1371 in topological order.
1373 This procedure stores its results into the following global (ick) variables
1382 We use dominator relationships to avoid making regions out of non-reducible
1385 This procedure needs to be converted to work on pred/succ lists instead
1386 of edge tables. That would simplify it somewhat. */
1389 find_rgns (s_preds
, s_succs
, num_preds
, num_succs
, dom
)
1390 int_list_ptr
*s_preds
;
1391 int_list_ptr
*s_succs
;
1396 int *max_hdr
, *dfs_nr
, *stack
, *queue
, *degree
;
1398 int node
, child
, loop_head
, i
, head
, tail
;
1399 int count
= 0, sp
, idx
= 0, current_edge
= out_edges
[0];
1400 int num_bbs
, num_insns
, unreachable
;
1401 int too_large_failure
;
1403 /* Note if an edge has been passed. */
1406 /* Note if a block is a natural loop header. */
1409 /* Note if a block is an natural inner loop header. */
1412 /* Note if a block is in the block queue. */
1415 /* Note if a block is in the block queue. */
1418 /* Perform a DFS traversal of the cfg. Identify loop headers, inner loops
1419 and a mapping from block to its loop header (if the block is contained
1420 in a loop, else -1).
1422 Store results in HEADER, INNER, and MAX_HDR respectively, these will
1423 be used as inputs to the second traversal.
1425 STACK, SP and DFS_NR are only used during the first traversal. */
1427 /* Allocate and initialize variables for the first traversal. */
1428 max_hdr
= (int *) alloca (n_basic_blocks
* sizeof (int));
1429 dfs_nr
= (int *) alloca (n_basic_blocks
* sizeof (int));
1430 bzero ((char *) dfs_nr
, n_basic_blocks
* sizeof (int));
1431 stack
= (int *) alloca (nr_edges
* sizeof (int));
1433 inner
= sbitmap_alloc (n_basic_blocks
);
1434 sbitmap_ones (inner
);
1436 header
= sbitmap_alloc (n_basic_blocks
);
1437 sbitmap_zero (header
);
1439 passed
= sbitmap_alloc (nr_edges
);
1440 sbitmap_zero (passed
);
1442 in_queue
= sbitmap_alloc (n_basic_blocks
);
1443 sbitmap_zero (in_queue
);
1445 in_stack
= sbitmap_alloc (n_basic_blocks
);
1446 sbitmap_zero (in_stack
);
1448 for (i
= 0; i
< n_basic_blocks
; i
++)
1451 /* DFS traversal to find inner loops in the cfg. */
1456 if (current_edge
== 0 || TEST_BIT (passed
, current_edge
))
1458 /* We have reached a leaf node or a node that was already
1459 processed. Pop edges off the stack until we find
1460 an edge that has not yet been processed. */
1462 && (current_edge
== 0 || TEST_BIT (passed
, current_edge
)))
1464 /* Pop entry off the stack. */
1465 current_edge
= stack
[sp
--];
1466 node
= FROM_BLOCK (current_edge
);
1467 child
= TO_BLOCK (current_edge
);
1468 RESET_BIT (in_stack
, child
);
1469 if (max_hdr
[child
] >= 0 && TEST_BIT (in_stack
, max_hdr
[child
]))
1470 UPDATE_LOOP_RELATIONS (node
, max_hdr
[child
]);
1471 current_edge
= NEXT_OUT (current_edge
);
1474 /* See if have finished the DFS tree traversal. */
1475 if (sp
< 0 && TEST_BIT (passed
, current_edge
))
1478 /* Nope, continue the traversal with the popped node. */
1482 /* Process a node. */
1483 node
= FROM_BLOCK (current_edge
);
1484 child
= TO_BLOCK (current_edge
);
1485 SET_BIT (in_stack
, node
);
1486 dfs_nr
[node
] = ++count
;
1488 /* If the successor is in the stack, then we've found a loop.
1489 Mark the loop, if it is not a natural loop, then it will
1490 be rejected during the second traversal. */
1491 if (TEST_BIT (in_stack
, child
))
1494 SET_BIT (header
, child
);
1495 UPDATE_LOOP_RELATIONS (node
, child
);
1496 SET_BIT (passed
, current_edge
);
1497 current_edge
= NEXT_OUT (current_edge
);
1501 /* If the child was already visited, then there is no need to visit
1502 it again. Just update the loop relationships and restart
1506 if (max_hdr
[child
] >= 0 && TEST_BIT (in_stack
, max_hdr
[child
]))
1507 UPDATE_LOOP_RELATIONS (node
, max_hdr
[child
]);
1508 SET_BIT (passed
, current_edge
);
1509 current_edge
= NEXT_OUT (current_edge
);
1513 /* Push an entry on the stack and continue DFS traversal. */
1514 stack
[++sp
] = current_edge
;
1515 SET_BIT (passed
, current_edge
);
1516 current_edge
= OUT_EDGES (child
);
1518 /* This is temporary until haifa is converted to use rth's new
1519 cfg routines which have true entry/exit blocks and the
1520 appropriate edges from/to those blocks.
1522 Generally we update dfs_nr for a node when we process its
1523 out edge. However, if the node has no out edge then we will
1524 not set dfs_nr for that node. This can confuse the scheduler
1525 into thinking that we have unreachable blocks, which in turn
1526 disables cross block scheduling.
1528 So, if we have a node with no out edges, go ahead and mark it
1529 as reachable now. */
1530 if (current_edge
== 0)
1531 dfs_nr
[child
] = ++count
;
1534 /* Another check for unreachable blocks. The earlier test in
1535 is_cfg_nonregular only finds unreachable blocks that do not
1538 The DFS traversal will mark every block that is reachable from
1539 the entry node by placing a nonzero value in dfs_nr. Thus if
1540 dfs_nr is zero for any block, then it must be unreachable. */
1542 for (i
= 0; i
< n_basic_blocks
; i
++)
1549 /* Gross. To avoid wasting memory, the second pass uses the dfs_nr array
1550 to hold degree counts. */
1553 /* Compute the in-degree of every block in the graph. */
1554 for (i
= 0; i
< n_basic_blocks
; i
++)
1555 degree
[i
] = num_preds
[i
];
1557 /* Do not perform region scheduling if there are any unreachable
1562 SET_BIT (header
, 0);
1564 /* Second travsersal:find reducible inner loops and topologically sort
1565 block of each region. */
1567 queue
= (int *) alloca (n_basic_blocks
* sizeof (int));
1569 /* Find blocks which are inner loop headers. We still have non-reducible
1570 loops to consider at this point. */
1571 for (i
= 0; i
< n_basic_blocks
; i
++)
1573 if (TEST_BIT (header
, i
) && TEST_BIT (inner
, i
))
1578 /* Now check that the loop is reducible. We do this separate
1579 from finding inner loops so that we do not find a reducible
1580 loop which contains an inner non-reducible loop.
1582 A simple way to find reducible/natural loops is to verify
1583 that each block in the loop is dominated by the loop
1586 If there exists a block that is not dominated by the loop
1587 header, then the block is reachable from outside the loop
1588 and thus the loop is not a natural loop. */
1589 for (j
= 0; j
< n_basic_blocks
; j
++)
1591 /* First identify blocks in the loop, except for the loop
1593 if (i
== max_hdr
[j
] && i
!= j
)
1595 /* Now verify that the block is dominated by the loop
1597 if (!TEST_BIT (dom
[j
], i
))
1602 /* If we exited the loop early, then I is the header of
1603 a non-reducible loop and we should quit processing it
1605 if (j
!= n_basic_blocks
)
1608 /* I is a header of an inner loop, or block 0 in a subroutine
1609 with no loops at all. */
1611 too_large_failure
= 0;
1612 loop_head
= max_hdr
[i
];
1614 /* Decrease degree of all I's successors for topological
1616 for (ps
= s_succs
[i
]; ps
; ps
= ps
->next
)
1617 if (INT_LIST_VAL (ps
) != EXIT_BLOCK
1618 && INT_LIST_VAL (ps
) != ENTRY_BLOCK
)
1619 --degree
[INT_LIST_VAL(ps
)];
1621 /* Estimate # insns, and count # blocks in the region. */
1623 num_insns
= (INSN_LUID (BLOCK_END (i
))
1624 - INSN_LUID (BLOCK_HEAD (i
)));
1627 /* Find all loop latches (blocks with back edges to the loop
1628 header) or all the leaf blocks in the cfg has no loops.
1630 Place those blocks into the queue. */
1633 for (j
= 0; j
< n_basic_blocks
; j
++)
1634 /* Leaf nodes have only a single successor which must
1636 if (num_succs
[j
] == 1
1637 && INT_LIST_VAL (s_succs
[j
]) == EXIT_BLOCK
)
1640 SET_BIT (in_queue
, j
);
1642 if (too_large (j
, &num_bbs
, &num_insns
))
1644 too_large_failure
= 1;
1653 for (ps
= s_preds
[i
]; ps
; ps
= ps
->next
)
1655 node
= INT_LIST_VAL (ps
);
1657 if (node
== ENTRY_BLOCK
|| node
== EXIT_BLOCK
)
1660 if (max_hdr
[node
] == loop_head
&& node
!= i
)
1662 /* This is a loop latch. */
1663 queue
[++tail
] = node
;
1664 SET_BIT (in_queue
, node
);
1666 if (too_large (node
, &num_bbs
, &num_insns
))
1668 too_large_failure
= 1;
1676 /* Now add all the blocks in the loop to the queue.
1678 We know the loop is a natural loop; however the algorithm
1679 above will not always mark certain blocks as being in the
1688 The algorithm in the DFS traversal may not mark B & D as part
1689 of the loop (ie they will not have max_hdr set to A).
1691 We know they can not be loop latches (else they would have
1692 had max_hdr set since they'd have a backedge to a dominator
1693 block). So we don't need them on the initial queue.
1695 We know they are part of the loop because they are dominated
1696 by the loop header and can be reached by a backwards walk of
1697 the edges starting with nodes on the initial queue.
1699 It is safe and desirable to include those nodes in the
1700 loop/scheduling region. To do so we would need to decrease
1701 the degree of a node if it is the target of a backedge
1702 within the loop itself as the node is placed in the queue.
1704 We do not do this because I'm not sure that the actual
1705 scheduling code will properly handle this case. ?!? */
1707 while (head
< tail
&& !too_large_failure
)
1710 child
= queue
[++head
];
1712 for (ps
= s_preds
[child
]; ps
; ps
= ps
->next
)
1714 node
= INT_LIST_VAL (ps
);
1716 /* See discussion above about nodes not marked as in
1717 this loop during the initial DFS traversal. */
1718 if (node
== ENTRY_BLOCK
|| node
== EXIT_BLOCK
1719 || max_hdr
[node
] != loop_head
)
1724 else if (!TEST_BIT (in_queue
, node
) && node
!= i
)
1726 queue
[++tail
] = node
;
1727 SET_BIT (in_queue
, node
);
1729 if (too_large (node
, &num_bbs
, &num_insns
))
1731 too_large_failure
= 1;
1738 if (tail
>= 0 && !too_large_failure
)
1740 /* Place the loop header into list of region blocks. */
1742 rgn_bb_table
[idx
] = i
;
1743 RGN_NR_BLOCKS (nr_regions
) = num_bbs
;
1744 RGN_BLOCKS (nr_regions
) = idx
++;
1745 CONTAINING_RGN (i
) = nr_regions
;
1746 BLOCK_TO_BB (i
) = count
= 0;
1748 /* Remove blocks from queue[] when their in degree
1749 becomes zero. Repeat until no blocks are left on the
1750 list. This produces a topological list of blocks in
1758 child
= queue
[head
];
1759 if (degree
[child
] == 0)
1762 rgn_bb_table
[idx
++] = child
;
1763 BLOCK_TO_BB (child
) = ++count
;
1764 CONTAINING_RGN (child
) = nr_regions
;
1765 queue
[head
] = queue
[tail
--];
1767 for (ps
= s_succs
[child
]; ps
; ps
= ps
->next
)
1768 if (INT_LIST_VAL (ps
) != ENTRY_BLOCK
1769 && INT_LIST_VAL (ps
) != EXIT_BLOCK
)
1770 --degree
[INT_LIST_VAL (ps
)];
1781 /* Any block that did not end up in a region is placed into a region
1783 for (i
= 0; i
< n_basic_blocks
; i
++)
1786 rgn_bb_table
[idx
] = i
;
1787 RGN_NR_BLOCKS (nr_regions
) = 1;
1788 RGN_BLOCKS (nr_regions
) = idx
++;
1789 CONTAINING_RGN (i
) = nr_regions
++;
1790 BLOCK_TO_BB (i
) = 0;
1801 /* Functions for regions scheduling information. */
1803 /* Compute dominators, probability, and potential-split-edges of bb.
1804 Assume that these values were already computed for bb's predecessors. */
1807 compute_dom_prob_ps (bb
)
1810 int nxt_in_edge
, fst_in_edge
, pred
;
1811 int fst_out_edge
, nxt_out_edge
, nr_out_edges
, nr_rgn_out_edges
;
1814 if (IS_RGN_ENTRY (bb
))
1816 BITSET_ADD (dom
[bb
], 0, bbset_size
);
1821 fst_in_edge
= nxt_in_edge
= IN_EDGES (BB_TO_BLOCK (bb
));
1823 /* Intialize dom[bb] to '111..1'. */
1824 BITSET_INVERT (dom
[bb
], bbset_size
);
1828 pred
= FROM_BLOCK (nxt_in_edge
);
1829 BITSET_INTER (dom
[bb
], dom
[BLOCK_TO_BB (pred
)], bbset_size
);
1831 BITSET_UNION (ancestor_edges
[bb
], ancestor_edges
[BLOCK_TO_BB (pred
)],
1834 BITSET_ADD (ancestor_edges
[bb
], EDGE_TO_BIT (nxt_in_edge
), edgeset_size
);
1837 nr_rgn_out_edges
= 0;
1838 fst_out_edge
= OUT_EDGES (pred
);
1839 nxt_out_edge
= NEXT_OUT (fst_out_edge
);
1840 BITSET_UNION (pot_split
[bb
], pot_split
[BLOCK_TO_BB (pred
)],
1843 BITSET_ADD (pot_split
[bb
], EDGE_TO_BIT (fst_out_edge
), edgeset_size
);
1845 /* The successor doesn't belong in the region? */
1846 if (CONTAINING_RGN (TO_BLOCK (fst_out_edge
)) !=
1847 CONTAINING_RGN (BB_TO_BLOCK (bb
)))
1850 while (fst_out_edge
!= nxt_out_edge
)
1853 /* The successor doesn't belong in the region? */
1854 if (CONTAINING_RGN (TO_BLOCK (nxt_out_edge
)) !=
1855 CONTAINING_RGN (BB_TO_BLOCK (bb
)))
1857 BITSET_ADD (pot_split
[bb
], EDGE_TO_BIT (nxt_out_edge
), edgeset_size
);
1858 nxt_out_edge
= NEXT_OUT (nxt_out_edge
);
1862 /* Now nr_rgn_out_edges is the number of region-exit edges from
1863 pred, and nr_out_edges will be the number of pred out edges
1864 not leaving the region. */
1865 nr_out_edges
-= nr_rgn_out_edges
;
1866 if (nr_rgn_out_edges
> 0)
1867 prob
[bb
] += 0.9 * prob
[BLOCK_TO_BB (pred
)] / nr_out_edges
;
1869 prob
[bb
] += prob
[BLOCK_TO_BB (pred
)] / nr_out_edges
;
1870 nxt_in_edge
= NEXT_IN (nxt_in_edge
);
1872 while (fst_in_edge
!= nxt_in_edge
);
1874 BITSET_ADD (dom
[bb
], bb
, bbset_size
);
1875 BITSET_DIFFER (pot_split
[bb
], ancestor_edges
[bb
], edgeset_size
);
1877 if (sched_verbose
>= 2)
1878 fprintf (dump
, ";; bb_prob(%d, %d) = %3d\n", bb
, BB_TO_BLOCK (bb
), (int) (100.0 * prob
[bb
]));
1879 } /* compute_dom_prob_ps */
1881 /* Functions for target info. */
1883 /* Compute in BL the list of split-edges of bb_src relatively to bb_trg.
1884 Note that bb_trg dominates bb_src. */
1887 split_edges (bb_src
, bb_trg
, bl
)
1892 int es
= edgeset_size
;
1893 edgeset src
= (edgeset
) alloca (es
* sizeof (HOST_WIDE_INT
));
1896 src
[es
] = (pot_split
[bb_src
])[es
];
1897 BITSET_DIFFER (src
, pot_split
[bb_trg
], edgeset_size
);
1898 extract_bitlst (src
, edgeset_size
, bl
);
1902 /* Find the valid candidate-source-blocks for the target block TRG, compute
1903 their probability, and check if they are speculative or not.
1904 For speculative sources, compute their update-blocks and split-blocks. */
1907 compute_trg_info (trg
)
1910 register candidate
*sp
;
1912 int check_block
, update_idx
;
1913 int i
, j
, k
, fst_edge
, nxt_edge
;
1915 /* Define some of the fields for the target bb as well. */
1916 sp
= candidate_table
+ trg
;
1918 sp
->is_speculative
= 0;
1921 for (i
= trg
+ 1; i
< current_nr_blocks
; i
++)
1923 sp
= candidate_table
+ i
;
1925 sp
->is_valid
= IS_DOMINATED (i
, trg
);
1928 sp
->src_prob
= GET_SRC_PROB (i
, trg
);
1929 sp
->is_valid
= (sp
->src_prob
>= MIN_PROBABILITY
);
1934 split_edges (i
, trg
, &el
);
1935 sp
->is_speculative
= (el
.nr_members
) ? 1 : 0;
1936 if (sp
->is_speculative
&& !flag_schedule_speculative
)
1942 sp
->split_bbs
.first_member
= &bblst_table
[bblst_last
];
1943 sp
->split_bbs
.nr_members
= el
.nr_members
;
1944 for (j
= 0; j
< el
.nr_members
; bblst_last
++, j
++)
1945 bblst_table
[bblst_last
] =
1946 TO_BLOCK (rgn_edges
[el
.first_member
[j
]]);
1947 sp
->update_bbs
.first_member
= &bblst_table
[bblst_last
];
1949 for (j
= 0; j
< el
.nr_members
; j
++)
1951 check_block
= FROM_BLOCK (rgn_edges
[el
.first_member
[j
]]);
1952 fst_edge
= nxt_edge
= OUT_EDGES (check_block
);
1955 for (k
= 0; k
< el
.nr_members
; k
++)
1956 if (EDGE_TO_BIT (nxt_edge
) == el
.first_member
[k
])
1959 if (k
>= el
.nr_members
)
1961 bblst_table
[bblst_last
++] = TO_BLOCK (nxt_edge
);
1965 nxt_edge
= NEXT_OUT (nxt_edge
);
1967 while (fst_edge
!= nxt_edge
);
1969 sp
->update_bbs
.nr_members
= update_idx
;
1974 sp
->split_bbs
.nr_members
= sp
->update_bbs
.nr_members
= 0;
1976 sp
->is_speculative
= 0;
1980 } /* compute_trg_info */
1983 /* Print candidates info, for debugging purposes. Callable from debugger. */
1989 if (!candidate_table
[i
].is_valid
)
1992 if (candidate_table
[i
].is_speculative
)
1995 fprintf (dump
, "src b %d bb %d speculative \n", BB_TO_BLOCK (i
), i
);
1997 fprintf (dump
, "split path: ");
1998 for (j
= 0; j
< candidate_table
[i
].split_bbs
.nr_members
; j
++)
2000 int b
= candidate_table
[i
].split_bbs
.first_member
[j
];
2002 fprintf (dump
, " %d ", b
);
2004 fprintf (dump
, "\n");
2006 fprintf (dump
, "update path: ");
2007 for (j
= 0; j
< candidate_table
[i
].update_bbs
.nr_members
; j
++)
2009 int b
= candidate_table
[i
].update_bbs
.first_member
[j
];
2011 fprintf (dump
, " %d ", b
);
2013 fprintf (dump
, "\n");
2017 fprintf (dump
, " src %d equivalent\n", BB_TO_BLOCK (i
));
2022 /* Print candidates info, for debugging purposes. Callable from debugger. */
2025 debug_candidates (trg
)
2030 fprintf (dump
, "----------- candidate table: target: b=%d bb=%d ---\n",
2031 BB_TO_BLOCK (trg
), trg
);
2032 for (i
= trg
+ 1; i
< current_nr_blocks
; i
++)
2033 debug_candidate (i
);
2037 /* Functions for speculative scheduing. */
2039 /* Return 0 if x is a set of a register alive in the beginning of one
2040 of the split-blocks of src, otherwise return 1. */
2043 check_live_1 (src
, x
)
2049 register rtx reg
= SET_DEST (x
);
2054 while (GET_CODE (reg
) == SUBREG
|| GET_CODE (reg
) == ZERO_EXTRACT
2055 || GET_CODE (reg
) == SIGN_EXTRACT
2056 || GET_CODE (reg
) == STRICT_LOW_PART
)
2057 reg
= XEXP (reg
, 0);
2059 if (GET_CODE (reg
) == PARALLEL
2060 && GET_MODE (reg
) == BLKmode
)
2063 for (i
= XVECLEN (reg
, 0) - 1; i
>= 0; i
--)
2064 if (check_live_1 (src
, XVECEXP (reg
, 0, i
)))
2069 if (GET_CODE (reg
) != REG
)
2072 regno
= REGNO (reg
);
2074 if (regno
< FIRST_PSEUDO_REGISTER
&& global_regs
[regno
])
2076 /* Global registers are assumed live. */
2081 if (regno
< FIRST_PSEUDO_REGISTER
)
2083 /* Check for hard registers. */
2084 int j
= HARD_REGNO_NREGS (regno
, GET_MODE (reg
));
2087 for (i
= 0; i
< candidate_table
[src
].split_bbs
.nr_members
; i
++)
2089 int b
= candidate_table
[src
].split_bbs
.first_member
[i
];
2091 if (REGNO_REG_SET_P (BASIC_BLOCK (b
)->global_live_at_start
,
2101 /* Check for psuedo registers. */
2102 for (i
= 0; i
< candidate_table
[src
].split_bbs
.nr_members
; i
++)
2104 int b
= candidate_table
[src
].split_bbs
.first_member
[i
];
2106 if (REGNO_REG_SET_P (BASIC_BLOCK (b
)->global_live_at_start
, regno
))
2118 /* If x is a set of a register R, mark that R is alive in the beginning
2119 of every update-block of src. */
2122 update_live_1 (src
, x
)
2128 register rtx reg
= SET_DEST (x
);
2133 while (GET_CODE (reg
) == SUBREG
|| GET_CODE (reg
) == ZERO_EXTRACT
2134 || GET_CODE (reg
) == SIGN_EXTRACT
2135 || GET_CODE (reg
) == STRICT_LOW_PART
)
2136 reg
= XEXP (reg
, 0);
2138 if (GET_CODE (reg
) == PARALLEL
2139 && GET_MODE (reg
) == BLKmode
)
2142 for (i
= XVECLEN (reg
, 0) - 1; i
>= 0; i
--)
2143 update_live_1 (src
, XVECEXP (reg
, 0, i
));
2147 if (GET_CODE (reg
) != REG
)
2150 /* Global registers are always live, so the code below does not apply
2153 regno
= REGNO (reg
);
2155 if (regno
>= FIRST_PSEUDO_REGISTER
|| !global_regs
[regno
])
2157 if (regno
< FIRST_PSEUDO_REGISTER
)
2159 int j
= HARD_REGNO_NREGS (regno
, GET_MODE (reg
));
2162 for (i
= 0; i
< candidate_table
[src
].update_bbs
.nr_members
; i
++)
2164 int b
= candidate_table
[src
].update_bbs
.first_member
[i
];
2166 SET_REGNO_REG_SET (BASIC_BLOCK (b
)->global_live_at_start
,
2173 for (i
= 0; i
< candidate_table
[src
].update_bbs
.nr_members
; i
++)
2175 int b
= candidate_table
[src
].update_bbs
.first_member
[i
];
2177 SET_REGNO_REG_SET (BASIC_BLOCK (b
)->global_live_at_start
, regno
);
2184 /* Return 1 if insn can be speculatively moved from block src to trg,
2185 otherwise return 0. Called before first insertion of insn to
2186 ready-list or before the scheduling. */
2189 check_live (insn
, src
)
2193 /* Find the registers set by instruction. */
2194 if (GET_CODE (PATTERN (insn
)) == SET
2195 || GET_CODE (PATTERN (insn
)) == CLOBBER
)
2196 return check_live_1 (src
, PATTERN (insn
));
2197 else if (GET_CODE (PATTERN (insn
)) == PARALLEL
)
2200 for (j
= XVECLEN (PATTERN (insn
), 0) - 1; j
>= 0; j
--)
2201 if ((GET_CODE (XVECEXP (PATTERN (insn
), 0, j
)) == SET
2202 || GET_CODE (XVECEXP (PATTERN (insn
), 0, j
)) == CLOBBER
)
2203 && !check_live_1 (src
, XVECEXP (PATTERN (insn
), 0, j
)))
2213 /* Update the live registers info after insn was moved speculatively from
2214 block src to trg. */
2217 update_live (insn
, src
)
2221 /* Find the registers set by instruction. */
2222 if (GET_CODE (PATTERN (insn
)) == SET
2223 || GET_CODE (PATTERN (insn
)) == CLOBBER
)
2224 update_live_1 (src
, PATTERN (insn
));
2225 else if (GET_CODE (PATTERN (insn
)) == PARALLEL
)
2228 for (j
= XVECLEN (PATTERN (insn
), 0) - 1; j
>= 0; j
--)
2229 if (GET_CODE (XVECEXP (PATTERN (insn
), 0, j
)) == SET
2230 || GET_CODE (XVECEXP (PATTERN (insn
), 0, j
)) == CLOBBER
)
2231 update_live_1 (src
, XVECEXP (PATTERN (insn
), 0, j
));
2235 /* Exception Free Loads:
2237 We define five classes of speculative loads: IFREE, IRISKY,
2238 PFREE, PRISKY, and MFREE.
2240 IFREE loads are loads that are proved to be exception-free, just
2241 by examining the load insn. Examples for such loads are loads
2242 from TOC and loads of global data.
2244 IRISKY loads are loads that are proved to be exception-risky,
2245 just by examining the load insn. Examples for such loads are
2246 volatile loads and loads from shared memory.
2248 PFREE loads are loads for which we can prove, by examining other
2249 insns, that they are exception-free. Currently, this class consists
2250 of loads for which we are able to find a "similar load", either in
2251 the target block, or, if only one split-block exists, in that split
2252 block. Load2 is similar to load1 if both have same single base
2253 register. We identify only part of the similar loads, by finding
2254 an insn upon which both load1 and load2 have a DEF-USE dependence.
2256 PRISKY loads are loads for which we can prove, by examining other
2257 insns, that they are exception-risky. Currently we have two proofs for
2258 such loads. The first proof detects loads that are probably guarded by a
2259 test on the memory address. This proof is based on the
2260 backward and forward data dependence information for the region.
2261 Let load-insn be the examined load.
2262 Load-insn is PRISKY iff ALL the following hold:
2264 - insn1 is not in the same block as load-insn
2265 - there is a DEF-USE dependence chain (insn1, ..., load-insn)
2266 - test-insn is either a compare or a branch, not in the same block
2268 - load-insn is reachable from test-insn
2269 - there is a DEF-USE dependence chain (insn1, ..., test-insn)
2271 This proof might fail when the compare and the load are fed
2272 by an insn not in the region. To solve this, we will add to this
2273 group all loads that have no input DEF-USE dependence.
2275 The second proof detects loads that are directly or indirectly
2276 fed by a speculative load. This proof is affected by the
2277 scheduling process. We will use the flag fed_by_spec_load.
2278 Initially, all insns have this flag reset. After a speculative
2279 motion of an insn, if insn is either a load, or marked as
2280 fed_by_spec_load, we will also mark as fed_by_spec_load every
2281 insn1 for which a DEF-USE dependence (insn, insn1) exists. A
2282 load which is fed_by_spec_load is also PRISKY.
2284 MFREE (maybe-free) loads are all the remaining loads. They may be
2285 exception-free, but we cannot prove it.
2287 Now, all loads in IFREE and PFREE classes are considered
2288 exception-free, while all loads in IRISKY and PRISKY classes are
2289 considered exception-risky. As for loads in the MFREE class,
2290 these are considered either exception-free or exception-risky,
2291 depending on whether we are pessimistic or optimistic. We have
2292 to take the pessimistic approach to assure the safety of
2293 speculative scheduling, but we can take the optimistic approach
2294 by invoking the -fsched_spec_load_dangerous option. */
2296 enum INSN_TRAP_CLASS
2298 TRAP_FREE
= 0, IFREE
= 1, PFREE_CANDIDATE
= 2,
2299 PRISKY_CANDIDATE
= 3, IRISKY
= 4, TRAP_RISKY
= 5
2302 #define WORST_CLASS(class1, class2) \
2303 ((class1 > class2) ? class1 : class2)
2305 /* Indexed by INSN_UID, and set if there's DEF-USE dependence between
2306 some speculatively moved load insn and this one. */
2307 char *fed_by_spec_load
;
2310 /* Non-zero if block bb_to is equal to, or reachable from block bb_from. */
2311 #define IS_REACHABLE(bb_from, bb_to) \
2313 || IS_RGN_ENTRY (bb_from) \
2314 || (bitset_member (ancestor_edges[bb_to], \
2315 EDGE_TO_BIT (IN_EDGES (BB_TO_BLOCK (bb_from))), \
2317 #define FED_BY_SPEC_LOAD(insn) (fed_by_spec_load[INSN_UID (insn)])
2318 #define IS_LOAD_INSN(insn) (is_load_insn[INSN_UID (insn)])
2320 /* Non-zero iff the address is comprised from at most 1 register. */
2321 #define CONST_BASED_ADDRESS_P(x) \
2322 (GET_CODE (x) == REG \
2323 || ((GET_CODE (x) == PLUS || GET_CODE (x) == MINUS \
2324 || (GET_CODE (x) == LO_SUM)) \
2325 && (GET_CODE (XEXP (x, 0)) == CONST_INT \
2326 || GET_CODE (XEXP (x, 1)) == CONST_INT)))
2328 /* Turns on the fed_by_spec_load flag for insns fed by load_insn. */
2331 set_spec_fed (load_insn
)
2336 for (link
= INSN_DEPEND (load_insn
); link
; link
= XEXP (link
, 1))
2337 if (GET_MODE (link
) == VOIDmode
)
2338 FED_BY_SPEC_LOAD (XEXP (link
, 0)) = 1;
2339 } /* set_spec_fed */
2341 /* On the path from the insn to load_insn_bb, find a conditional
2342 branch depending on insn, that guards the speculative load. */
2345 find_conditional_protection (insn
, load_insn_bb
)
2351 /* Iterate through DEF-USE forward dependences. */
2352 for (link
= INSN_DEPEND (insn
); link
; link
= XEXP (link
, 1))
2354 rtx next
= XEXP (link
, 0);
2355 if ((CONTAINING_RGN (INSN_BLOCK (next
)) ==
2356 CONTAINING_RGN (BB_TO_BLOCK (load_insn_bb
)))
2357 && IS_REACHABLE (INSN_BB (next
), load_insn_bb
)
2358 && load_insn_bb
!= INSN_BB (next
)
2359 && GET_MODE (link
) == VOIDmode
2360 && (GET_CODE (next
) == JUMP_INSN
2361 || find_conditional_protection (next
, load_insn_bb
)))
2365 } /* find_conditional_protection */
2367 /* Returns 1 if the same insn1 that participates in the computation
2368 of load_insn's address is feeding a conditional branch that is
2369 guarding on load_insn. This is true if we find a the two DEF-USE
2371 insn1 -> ... -> conditional-branch
2372 insn1 -> ... -> load_insn,
2373 and if a flow path exist:
2374 insn1 -> ... -> conditional-branch -> ... -> load_insn,
2375 and if insn1 is on the path
2376 region-entry -> ... -> bb_trg -> ... load_insn.
2378 Locate insn1 by climbing on LOG_LINKS from load_insn.
2379 Locate the branch by following INSN_DEPEND from insn1. */
2382 is_conditionally_protected (load_insn
, bb_src
, bb_trg
)
2388 for (link
= LOG_LINKS (load_insn
); link
; link
= XEXP (link
, 1))
2390 rtx insn1
= XEXP (link
, 0);
2392 /* Must be a DEF-USE dependence upon non-branch. */
2393 if (GET_MODE (link
) != VOIDmode
2394 || GET_CODE (insn1
) == JUMP_INSN
)
2397 /* Must exist a path: region-entry -> ... -> bb_trg -> ... load_insn. */
2398 if (INSN_BB (insn1
) == bb_src
2399 || (CONTAINING_RGN (INSN_BLOCK (insn1
))
2400 != CONTAINING_RGN (BB_TO_BLOCK (bb_src
)))
2401 || (!IS_REACHABLE (bb_trg
, INSN_BB (insn1
))
2402 && !IS_REACHABLE (INSN_BB (insn1
), bb_trg
)))
2405 /* Now search for the conditional-branch. */
2406 if (find_conditional_protection (insn1
, bb_src
))
2409 /* Recursive step: search another insn1, "above" current insn1. */
2410 return is_conditionally_protected (insn1
, bb_src
, bb_trg
);
2413 /* The chain does not exist. */
2415 } /* is_conditionally_protected */
2417 /* Returns 1 if a clue for "similar load" 'insn2' is found, and hence
2418 load_insn can move speculatively from bb_src to bb_trg. All the
2419 following must hold:
2421 (1) both loads have 1 base register (PFREE_CANDIDATEs).
2422 (2) load_insn and load1 have a def-use dependence upon
2423 the same insn 'insn1'.
2424 (3) either load2 is in bb_trg, or:
2425 - there's only one split-block, and
2426 - load1 is on the escape path, and
2428 From all these we can conclude that the two loads access memory
2429 addresses that differ at most by a constant, and hence if moving
2430 load_insn would cause an exception, it would have been caused by
2434 is_pfree (load_insn
, bb_src
, bb_trg
)
2439 register candidate
*candp
= candidate_table
+ bb_src
;
2441 if (candp
->split_bbs
.nr_members
!= 1)
2442 /* Must have exactly one escape block. */
2445 for (back_link
= LOG_LINKS (load_insn
);
2446 back_link
; back_link
= XEXP (back_link
, 1))
2448 rtx insn1
= XEXP (back_link
, 0);
2450 if (GET_MODE (back_link
) == VOIDmode
)
2452 /* Found a DEF-USE dependence (insn1, load_insn). */
2455 for (fore_link
= INSN_DEPEND (insn1
);
2456 fore_link
; fore_link
= XEXP (fore_link
, 1))
2458 rtx insn2
= XEXP (fore_link
, 0);
2459 if (GET_MODE (fore_link
) == VOIDmode
)
2461 /* Found a DEF-USE dependence (insn1, insn2). */
2462 if (haifa_classify_insn (insn2
) != PFREE_CANDIDATE
)
2463 /* insn2 not guaranteed to be a 1 base reg load. */
2466 if (INSN_BB (insn2
) == bb_trg
)
2467 /* insn2 is the similar load, in the target block. */
2470 if (*(candp
->split_bbs
.first_member
) == INSN_BLOCK (insn2
))
2471 /* insn2 is a similar load, in a split-block. */
2478 /* Couldn't find a similar load. */
2482 /* Returns a class that insn with GET_DEST(insn)=x may belong to,
2483 as found by analyzing insn's expression. */
2486 may_trap_exp (x
, is_store
)
2494 code
= GET_CODE (x
);
2504 /* The insn uses memory: a volatile load. */
2505 if (MEM_VOLATILE_P (x
))
2507 /* An exception-free load. */
2508 if (!may_trap_p (x
))
2510 /* A load with 1 base register, to be further checked. */
2511 if (CONST_BASED_ADDRESS_P (XEXP (x
, 0)))
2512 return PFREE_CANDIDATE
;
2513 /* No info on the load, to be further checked. */
2514 return PRISKY_CANDIDATE
;
2519 int i
, insn_class
= TRAP_FREE
;
2521 /* Neither store nor load, check if it may cause a trap. */
2524 /* Recursive step: walk the insn... */
2525 fmt
= GET_RTX_FORMAT (code
);
2526 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
2530 int tmp_class
= may_trap_exp (XEXP (x
, i
), is_store
);
2531 insn_class
= WORST_CLASS (insn_class
, tmp_class
);
2533 else if (fmt
[i
] == 'E')
2536 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
2538 int tmp_class
= may_trap_exp (XVECEXP (x
, i
, j
), is_store
);
2539 insn_class
= WORST_CLASS (insn_class
, tmp_class
);
2540 if (insn_class
== TRAP_RISKY
|| insn_class
== IRISKY
)
2544 if (insn_class
== TRAP_RISKY
|| insn_class
== IRISKY
)
2549 } /* may_trap_exp */
2552 /* Classifies insn for the purpose of verifying that it can be
2553 moved speculatively, by examining it's patterns, returning:
2554 TRAP_RISKY: store, or risky non-load insn (e.g. division by variable).
2555 TRAP_FREE: non-load insn.
2556 IFREE: load from a globaly safe location.
2557 IRISKY: volatile load.
2558 PFREE_CANDIDATE, PRISKY_CANDIDATE: load that need to be checked for
2559 being either PFREE or PRISKY. */
2562 haifa_classify_insn (insn
)
2565 rtx pat
= PATTERN (insn
);
2566 int tmp_class
= TRAP_FREE
;
2567 int insn_class
= TRAP_FREE
;
2570 if (GET_CODE (pat
) == PARALLEL
)
2572 int i
, len
= XVECLEN (pat
, 0);
2574 for (i
= len
- 1; i
>= 0; i
--)
2576 code
= GET_CODE (XVECEXP (pat
, 0, i
));
2580 /* Test if it is a 'store'. */
2581 tmp_class
= may_trap_exp (XEXP (XVECEXP (pat
, 0, i
), 0), 1);
2584 /* Test if it is a store. */
2585 tmp_class
= may_trap_exp (SET_DEST (XVECEXP (pat
, 0, i
)), 1);
2586 if (tmp_class
== TRAP_RISKY
)
2588 /* Test if it is a load. */
2590 WORST_CLASS (tmp_class
,
2591 may_trap_exp (SET_SRC (XVECEXP (pat
, 0, i
)), 0));
2594 tmp_class
= TRAP_RISKY
;
2598 insn_class
= WORST_CLASS (insn_class
, tmp_class
);
2599 if (insn_class
== TRAP_RISKY
|| insn_class
== IRISKY
)
2605 code
= GET_CODE (pat
);
2609 /* Test if it is a 'store'. */
2610 tmp_class
= may_trap_exp (XEXP (pat
, 0), 1);
2613 /* Test if it is a store. */
2614 tmp_class
= may_trap_exp (SET_DEST (pat
), 1);
2615 if (tmp_class
== TRAP_RISKY
)
2617 /* Test if it is a load. */
2619 WORST_CLASS (tmp_class
,
2620 may_trap_exp (SET_SRC (pat
), 0));
2623 tmp_class
= TRAP_RISKY
;
2627 insn_class
= tmp_class
;
2632 } /* haifa_classify_insn */
2634 /* Return 1 if load_insn is prisky (i.e. if load_insn is fed by
2635 a load moved speculatively, or if load_insn is protected by
2636 a compare on load_insn's address). */
2639 is_prisky (load_insn
, bb_src
, bb_trg
)
2643 if (FED_BY_SPEC_LOAD (load_insn
))
2646 if (LOG_LINKS (load_insn
) == NULL
)
2647 /* Dependence may 'hide' out of the region. */
2650 if (is_conditionally_protected (load_insn
, bb_src
, bb_trg
))
2656 /* Insn is a candidate to be moved speculatively from bb_src to bb_trg.
2657 Return 1 if insn is exception-free (and the motion is valid)
2661 is_exception_free (insn
, bb_src
, bb_trg
)
2665 int insn_class
= haifa_classify_insn (insn
);
2667 /* Handle non-load insns. */
2678 if (!flag_schedule_speculative_load
)
2680 IS_LOAD_INSN (insn
) = 1;
2687 case PFREE_CANDIDATE
:
2688 if (is_pfree (insn
, bb_src
, bb_trg
))
2690 /* Don't 'break' here: PFREE-candidate is also PRISKY-candidate. */
2691 case PRISKY_CANDIDATE
:
2692 if (!flag_schedule_speculative_load_dangerous
2693 || is_prisky (insn
, bb_src
, bb_trg
))
2699 return flag_schedule_speculative_load_dangerous
;
2700 } /* is_exception_free */
2703 /* Process an insn's memory dependencies. There are four kinds of
2706 (0) read dependence: read follows read
2707 (1) true dependence: read follows write
2708 (2) anti dependence: write follows read
2709 (3) output dependence: write follows write
2711 We are careful to build only dependencies which actually exist, and
2712 use transitivity to avoid building too many links. */
2714 /* Return the INSN_LIST containing INSN in LIST, or NULL
2715 if LIST does not contain INSN. */
2717 HAIFA_INLINE
static rtx
2718 find_insn_list (insn
, list
)
2724 if (XEXP (list
, 0) == insn
)
2726 list
= XEXP (list
, 1);
2732 /* Return 1 if the pair (insn, x) is found in (LIST, LIST1), or 0
2735 HAIFA_INLINE
static char
2736 find_insn_mem_list (insn
, x
, list
, list1
)
2742 if (XEXP (list
, 0) == insn
2743 && XEXP (list1
, 0) == x
)
2745 list
= XEXP (list
, 1);
2746 list1
= XEXP (list1
, 1);
2752 /* Compute the function units used by INSN. This caches the value
2753 returned by function_units_used. A function unit is encoded as the
2754 unit number if the value is non-negative and the compliment of a
2755 mask if the value is negative. A function unit index is the
2756 non-negative encoding. */
2758 HAIFA_INLINE
static int
2762 register int unit
= INSN_UNIT (insn
);
2766 recog_memoized (insn
);
2768 /* A USE insn, or something else we don't need to understand.
2769 We can't pass these directly to function_units_used because it will
2770 trigger a fatal error for unrecognizable insns. */
2771 if (INSN_CODE (insn
) < 0)
2775 unit
= function_units_used (insn
);
2776 /* Increment non-negative values so we can cache zero. */
2780 /* We only cache 16 bits of the result, so if the value is out of
2781 range, don't cache it. */
2782 if (FUNCTION_UNITS_SIZE
< HOST_BITS_PER_SHORT
2784 || (unit
& ~((1 << (HOST_BITS_PER_SHORT
- 1)) - 1)) == 0)
2785 INSN_UNIT (insn
) = unit
;
2787 return (unit
> 0 ? unit
- 1 : unit
);
2790 /* Compute the blockage range for executing INSN on UNIT. This caches
2791 the value returned by the blockage_range_function for the unit.
2792 These values are encoded in an int where the upper half gives the
2793 minimum value and the lower half gives the maximum value. */
2795 HAIFA_INLINE
static unsigned int
2796 blockage_range (unit
, insn
)
2800 unsigned int blockage
= INSN_BLOCKAGE (insn
);
2803 if ((int) UNIT_BLOCKED (blockage
) != unit
+ 1)
2805 range
= function_units
[unit
].blockage_range_function (insn
);
2806 /* We only cache the blockage range for one unit and then only if
2808 if (HOST_BITS_PER_INT
>= UNIT_BITS
+ 2 * BLOCKAGE_BITS
)
2809 INSN_BLOCKAGE (insn
) = ENCODE_BLOCKAGE (unit
+ 1, range
);
2812 range
= BLOCKAGE_RANGE (blockage
);
2817 /* A vector indexed by function unit instance giving the last insn to use
2818 the unit. The value of the function unit instance index for unit U
2819 instance I is (U + I * FUNCTION_UNITS_SIZE). */
2820 static rtx unit_last_insn
[FUNCTION_UNITS_SIZE
* MAX_MULTIPLICITY
];
2822 /* A vector indexed by function unit instance giving the minimum time when
2823 the unit will unblock based on the maximum blockage cost. */
2824 static int unit_tick
[FUNCTION_UNITS_SIZE
* MAX_MULTIPLICITY
];
2826 /* A vector indexed by function unit number giving the number of insns
2827 that remain to use the unit. */
2828 static int unit_n_insns
[FUNCTION_UNITS_SIZE
];
2830 /* Reset the function unit state to the null state. */
2835 bzero ((char *) unit_last_insn
, sizeof (unit_last_insn
));
2836 bzero ((char *) unit_tick
, sizeof (unit_tick
));
2837 bzero ((char *) unit_n_insns
, sizeof (unit_n_insns
));
2840 /* Return the issue-delay of an insn. */
2842 HAIFA_INLINE
static int
2843 insn_issue_delay (insn
)
2847 int unit
= insn_unit (insn
);
2849 /* Efficiency note: in fact, we are working 'hard' to compute a
2850 value that was available in md file, and is not available in
2851 function_units[] structure. It would be nice to have this
2852 value there, too. */
2855 if (function_units
[unit
].blockage_range_function
&&
2856 function_units
[unit
].blockage_function
)
2857 delay
= function_units
[unit
].blockage_function (insn
, insn
);
2860 for (i
= 0, unit
= ~unit
; unit
; i
++, unit
>>= 1)
2861 if ((unit
& 1) != 0 && function_units
[i
].blockage_range_function
2862 && function_units
[i
].blockage_function
)
2863 delay
= MAX (delay
, function_units
[i
].blockage_function (insn
, insn
));
2868 /* Return the actual hazard cost of executing INSN on the unit UNIT,
2869 instance INSTANCE at time CLOCK if the previous actual hazard cost
2872 HAIFA_INLINE
static int
2873 actual_hazard_this_instance (unit
, instance
, insn
, clock
, cost
)
2874 int unit
, instance
, clock
, cost
;
2877 int tick
= unit_tick
[instance
]; /* Issue time of the last issued insn. */
2879 if (tick
- clock
> cost
)
2881 /* The scheduler is operating forward, so unit's last insn is the
2882 executing insn and INSN is the candidate insn. We want a
2883 more exact measure of the blockage if we execute INSN at CLOCK
2884 given when we committed the execution of the unit's last insn.
2886 The blockage value is given by either the unit's max blockage
2887 constant, blockage range function, or blockage function. Use
2888 the most exact form for the given unit. */
2890 if (function_units
[unit
].blockage_range_function
)
2892 if (function_units
[unit
].blockage_function
)
2893 tick
+= (function_units
[unit
].blockage_function
2894 (unit_last_insn
[instance
], insn
)
2895 - function_units
[unit
].max_blockage
);
2897 tick
+= ((int) MAX_BLOCKAGE_COST (blockage_range (unit
, insn
))
2898 - function_units
[unit
].max_blockage
);
2900 if (tick
- clock
> cost
)
2901 cost
= tick
- clock
;
2906 /* Record INSN as having begun execution on the units encoded by UNIT at
2909 HAIFA_INLINE
static void
2910 schedule_unit (unit
, insn
, clock
)
2918 int instance
= unit
;
2919 #if MAX_MULTIPLICITY > 1
2920 /* Find the first free instance of the function unit and use that
2921 one. We assume that one is free. */
2922 for (i
= function_units
[unit
].multiplicity
- 1; i
> 0; i
--)
2924 if (!actual_hazard_this_instance (unit
, instance
, insn
, clock
, 0))
2926 instance
+= FUNCTION_UNITS_SIZE
;
2929 unit_last_insn
[instance
] = insn
;
2930 unit_tick
[instance
] = (clock
+ function_units
[unit
].max_blockage
);
2933 for (i
= 0, unit
= ~unit
; unit
; i
++, unit
>>= 1)
2934 if ((unit
& 1) != 0)
2935 schedule_unit (i
, insn
, clock
);
2938 /* Return the actual hazard cost of executing INSN on the units encoded by
2939 UNIT at time CLOCK if the previous actual hazard cost was COST. */
2941 HAIFA_INLINE
static int
2942 actual_hazard (unit
, insn
, clock
, cost
)
2943 int unit
, clock
, cost
;
2950 /* Find the instance of the function unit with the minimum hazard. */
2951 int instance
= unit
;
2952 int best_cost
= actual_hazard_this_instance (unit
, instance
, insn
,
2954 #if MAX_MULTIPLICITY > 1
2957 if (best_cost
> cost
)
2959 for (i
= function_units
[unit
].multiplicity
- 1; i
> 0; i
--)
2961 instance
+= FUNCTION_UNITS_SIZE
;
2962 this_cost
= actual_hazard_this_instance (unit
, instance
, insn
,
2964 if (this_cost
< best_cost
)
2966 best_cost
= this_cost
;
2967 if (this_cost
<= cost
)
2973 cost
= MAX (cost
, best_cost
);
2976 for (i
= 0, unit
= ~unit
; unit
; i
++, unit
>>= 1)
2977 if ((unit
& 1) != 0)
2978 cost
= actual_hazard (i
, insn
, clock
, cost
);
2983 /* Return the potential hazard cost of executing an instruction on the
2984 units encoded by UNIT if the previous potential hazard cost was COST.
2985 An insn with a large blockage time is chosen in preference to one
2986 with a smaller time; an insn that uses a unit that is more likely
2987 to be used is chosen in preference to one with a unit that is less
2988 used. We are trying to minimize a subsequent actual hazard. */
2990 HAIFA_INLINE
static int
2991 potential_hazard (unit
, insn
, cost
)
2996 unsigned int minb
, maxb
;
3000 minb
= maxb
= function_units
[unit
].max_blockage
;
3003 if (function_units
[unit
].blockage_range_function
)
3005 maxb
= minb
= blockage_range (unit
, insn
);
3006 maxb
= MAX_BLOCKAGE_COST (maxb
);
3007 minb
= MIN_BLOCKAGE_COST (minb
);
3012 /* Make the number of instructions left dominate. Make the
3013 minimum delay dominate the maximum delay. If all these
3014 are the same, use the unit number to add an arbitrary
3015 ordering. Other terms can be added. */
3016 ncost
= minb
* 0x40 + maxb
;
3017 ncost
*= (unit_n_insns
[unit
] - 1) * 0x1000 + unit
;
3024 for (i
= 0, unit
= ~unit
; unit
; i
++, unit
>>= 1)
3025 if ((unit
& 1) != 0)
3026 cost
= potential_hazard (i
, insn
, cost
);
3031 /* Compute cost of executing INSN given the dependence LINK on the insn USED.
3032 This is the number of cycles between instruction issue and
3033 instruction results. */
3035 HAIFA_INLINE
static int
3036 insn_cost (insn
, link
, used
)
3037 rtx insn
, link
, used
;
3039 register int cost
= INSN_COST (insn
);
3043 recog_memoized (insn
);
3045 /* A USE insn, or something else we don't need to understand.
3046 We can't pass these directly to result_ready_cost because it will
3047 trigger a fatal error for unrecognizable insns. */
3048 if (INSN_CODE (insn
) < 0)
3050 INSN_COST (insn
) = 1;
3055 cost
= result_ready_cost (insn
);
3060 INSN_COST (insn
) = cost
;
3064 /* In this case estimate cost without caring how insn is used. */
3065 if (link
== 0 && used
== 0)
3068 /* A USE insn should never require the value used to be computed. This
3069 allows the computation of a function's result and parameter values to
3070 overlap the return and call. */
3071 recog_memoized (used
);
3072 if (INSN_CODE (used
) < 0)
3073 LINK_COST_FREE (link
) = 1;
3075 /* If some dependencies vary the cost, compute the adjustment. Most
3076 commonly, the adjustment is complete: either the cost is ignored
3077 (in the case of an output- or anti-dependence), or the cost is
3078 unchanged. These values are cached in the link as LINK_COST_FREE
3079 and LINK_COST_ZERO. */
3081 if (LINK_COST_FREE (link
))
3084 else if (!LINK_COST_ZERO (link
))
3088 ADJUST_COST (used
, link
, insn
, ncost
);
3091 LINK_COST_FREE (link
) = 1;
3095 LINK_COST_ZERO (link
) = 1;
3102 /* Compute the priority number for INSN. */
3111 if (GET_RTX_CLASS (GET_CODE (insn
)) != 'i')
3114 if ((this_priority
= INSN_PRIORITY (insn
)) == 0)
3116 if (INSN_DEPEND (insn
) == 0)
3117 this_priority
= insn_cost (insn
, 0, 0);
3119 for (link
= INSN_DEPEND (insn
); link
; link
= XEXP (link
, 1))
3124 if (RTX_INTEGRATED_P (link
))
3127 next
= XEXP (link
, 0);
3129 /* Critical path is meaningful in block boundaries only. */
3130 if (INSN_BLOCK (next
) != INSN_BLOCK (insn
))
3133 next_priority
= insn_cost (insn
, link
, next
) + priority (next
);
3134 if (next_priority
> this_priority
)
3135 this_priority
= next_priority
;
3137 INSN_PRIORITY (insn
) = this_priority
;
3139 return this_priority
;
3143 /* Remove all INSN_LISTs and EXPR_LISTs from the pending lists and add
3144 them to the unused_*_list variables, so that they can be reused. */
3147 free_pending_lists ()
3149 if (current_nr_blocks
<= 1)
3151 free_INSN_LIST_list (&pending_read_insns
);
3152 free_INSN_LIST_list (&pending_write_insns
);
3153 free_EXPR_LIST_list (&pending_read_mems
);
3154 free_EXPR_LIST_list (&pending_write_mems
);
3158 /* Interblock scheduling. */
3161 for (bb
= 0; bb
< current_nr_blocks
; bb
++)
3163 free_INSN_LIST_list (&bb_pending_read_insns
[bb
]);
3164 free_INSN_LIST_list (&bb_pending_write_insns
[bb
]);
3165 free_EXPR_LIST_list (&bb_pending_read_mems
[bb
]);
3166 free_EXPR_LIST_list (&bb_pending_write_mems
[bb
]);
3171 /* Add an INSN and MEM reference pair to a pending INSN_LIST and MEM_LIST.
3172 The MEM is a memory reference contained within INSN, which we are saving
3173 so that we can do memory aliasing on it. */
3176 add_insn_mem_dependence (insn_list
, mem_list
, insn
, mem
)
3177 rtx
*insn_list
, *mem_list
, insn
, mem
;
3181 link
= alloc_INSN_LIST (insn
, *insn_list
);
3184 link
= alloc_EXPR_LIST (VOIDmode
, mem
, *mem_list
);
3187 pending_lists_length
++;
3191 /* Make a dependency between every memory reference on the pending lists
3192 and INSN, thus flushing the pending lists. If ONLY_WRITE, don't flush
3196 flush_pending_lists (insn
, only_write
)
3203 while (pending_read_insns
&& ! only_write
)
3205 add_dependence (insn
, XEXP (pending_read_insns
, 0), REG_DEP_ANTI
);
3207 link
= pending_read_insns
;
3208 pending_read_insns
= XEXP (pending_read_insns
, 1);
3209 free_INSN_LIST_node (link
);
3211 link
= pending_read_mems
;
3212 pending_read_mems
= XEXP (pending_read_mems
, 1);
3213 free_EXPR_LIST_node (link
);
3215 while (pending_write_insns
)
3217 add_dependence (insn
, XEXP (pending_write_insns
, 0), REG_DEP_ANTI
);
3219 link
= pending_write_insns
;
3220 pending_write_insns
= XEXP (pending_write_insns
, 1);
3221 free_INSN_LIST_node (link
);
3223 link
= pending_write_mems
;
3224 pending_write_mems
= XEXP (pending_write_mems
, 1);
3225 free_EXPR_LIST_node (link
);
3227 pending_lists_length
= 0;
3229 /* last_pending_memory_flush is now a list of insns. */
3230 for (u
= last_pending_memory_flush
; u
; u
= XEXP (u
, 1))
3231 add_dependence (insn
, XEXP (u
, 0), REG_DEP_ANTI
);
3233 free_INSN_LIST_list (&last_pending_memory_flush
);
3234 last_pending_memory_flush
= alloc_INSN_LIST (insn
, NULL_RTX
);
3237 /* Analyze a single SET, CLOBBER, PRE_DEC, POST_DEC, PRE_INC or POST_INC
3238 rtx, X, creating all dependencies generated by the write to the
3239 destination of X, and reads of everything mentioned. */
3242 sched_analyze_1 (x
, insn
)
3247 register rtx dest
= XEXP (x
, 0);
3248 enum rtx_code code
= GET_CODE (x
);
3253 if (GET_CODE (dest
) == PARALLEL
3254 && GET_MODE (dest
) == BLKmode
)
3257 for (i
= XVECLEN (dest
, 0) - 1; i
>= 0; i
--)
3258 sched_analyze_1 (XVECEXP (dest
, 0, i
), insn
);
3259 if (GET_CODE (x
) == SET
)
3260 sched_analyze_2 (SET_SRC (x
), insn
);
3264 while (GET_CODE (dest
) == STRICT_LOW_PART
|| GET_CODE (dest
) == SUBREG
3265 || GET_CODE (dest
) == ZERO_EXTRACT
|| GET_CODE (dest
) == SIGN_EXTRACT
)
3267 if (GET_CODE (dest
) == ZERO_EXTRACT
|| GET_CODE (dest
) == SIGN_EXTRACT
)
3269 /* The second and third arguments are values read by this insn. */
3270 sched_analyze_2 (XEXP (dest
, 1), insn
);
3271 sched_analyze_2 (XEXP (dest
, 2), insn
);
3273 dest
= XEXP (dest
, 0);
3276 if (GET_CODE (dest
) == REG
)
3280 regno
= REGNO (dest
);
3282 /* A hard reg in a wide mode may really be multiple registers.
3283 If so, mark all of them just like the first. */
3284 if (regno
< FIRST_PSEUDO_REGISTER
)
3286 i
= HARD_REGNO_NREGS (regno
, GET_MODE (dest
));
3291 for (u
= reg_last_uses
[regno
+ i
]; u
; u
= XEXP (u
, 1))
3292 add_dependence (insn
, XEXP (u
, 0), REG_DEP_ANTI
);
3294 for (u
= reg_last_sets
[regno
+ i
]; u
; u
= XEXP (u
, 1))
3295 add_dependence (insn
, XEXP (u
, 0), REG_DEP_OUTPUT
);
3297 /* Clobbers need not be ordered with respect to one
3298 another, but sets must be ordered with respect to a
3302 free_INSN_LIST_list (®_last_uses
[regno
+ i
]);
3303 for (u
= reg_last_clobbers
[regno
+ i
]; u
; u
= XEXP (u
, 1))
3304 add_dependence (insn
, XEXP (u
, 0), REG_DEP_OUTPUT
);
3305 SET_REGNO_REG_SET (reg_pending_sets
, regno
+ i
);
3308 SET_REGNO_REG_SET (reg_pending_clobbers
, regno
+ i
);
3310 /* Function calls clobber all call_used regs. */
3311 if (global_regs
[regno
+ i
]
3312 || (code
== SET
&& call_used_regs
[regno
+ i
]))
3313 for (u
= last_function_call
; u
; u
= XEXP (u
, 1))
3314 add_dependence (insn
, XEXP (u
, 0), REG_DEP_ANTI
);
3321 for (u
= reg_last_uses
[regno
]; u
; u
= XEXP (u
, 1))
3322 add_dependence (insn
, XEXP (u
, 0), REG_DEP_ANTI
);
3324 for (u
= reg_last_sets
[regno
]; u
; u
= XEXP (u
, 1))
3325 add_dependence (insn
, XEXP (u
, 0), REG_DEP_OUTPUT
);
3329 free_INSN_LIST_list (®_last_uses
[regno
]);
3330 for (u
= reg_last_clobbers
[regno
]; u
; u
= XEXP (u
, 1))
3331 add_dependence (insn
, XEXP (u
, 0), REG_DEP_OUTPUT
);
3332 SET_REGNO_REG_SET (reg_pending_sets
, regno
);
3335 SET_REGNO_REG_SET (reg_pending_clobbers
, regno
);
3337 /* Pseudos that are REG_EQUIV to something may be replaced
3338 by that during reloading. We need only add dependencies for
3339 the address in the REG_EQUIV note. */
3340 if (!reload_completed
3341 && reg_known_equiv_p
[regno
]
3342 && GET_CODE (reg_known_value
[regno
]) == MEM
)
3343 sched_analyze_2 (XEXP (reg_known_value
[regno
], 0), insn
);
3345 /* Don't let it cross a call after scheduling if it doesn't
3346 already cross one. */
3348 if (REG_N_CALLS_CROSSED (regno
) == 0)
3349 for (u
= last_function_call
; u
; u
= XEXP (u
, 1))
3350 add_dependence (insn
, XEXP (u
, 0), REG_DEP_ANTI
);
3353 else if (GET_CODE (dest
) == MEM
)
3355 /* Writing memory. */
3357 if (pending_lists_length
> 32)
3359 /* Flush all pending reads and writes to prevent the pending lists
3360 from getting any larger. Insn scheduling runs too slowly when
3361 these lists get long. The number 32 was chosen because it
3362 seems like a reasonable number. When compiling GCC with itself,
3363 this flush occurs 8 times for sparc, and 10 times for m88k using
3365 flush_pending_lists (insn
, 0);
3370 rtx pending
, pending_mem
;
3372 pending
= pending_read_insns
;
3373 pending_mem
= pending_read_mems
;
3376 if (anti_dependence (XEXP (pending_mem
, 0), dest
))
3377 add_dependence (insn
, XEXP (pending
, 0), REG_DEP_ANTI
);
3379 pending
= XEXP (pending
, 1);
3380 pending_mem
= XEXP (pending_mem
, 1);
3383 pending
= pending_write_insns
;
3384 pending_mem
= pending_write_mems
;
3387 if (output_dependence (XEXP (pending_mem
, 0), dest
))
3388 add_dependence (insn
, XEXP (pending
, 0), REG_DEP_OUTPUT
);
3390 pending
= XEXP (pending
, 1);
3391 pending_mem
= XEXP (pending_mem
, 1);
3394 for (u
= last_pending_memory_flush
; u
; u
= XEXP (u
, 1))
3395 add_dependence (insn
, XEXP (u
, 0), REG_DEP_ANTI
);
3397 add_insn_mem_dependence (&pending_write_insns
, &pending_write_mems
,
3400 sched_analyze_2 (XEXP (dest
, 0), insn
);
3403 /* Analyze reads. */
3404 if (GET_CODE (x
) == SET
)
3405 sched_analyze_2 (SET_SRC (x
), insn
);
3408 /* Analyze the uses of memory and registers in rtx X in INSN. */
3411 sched_analyze_2 (x
, insn
)
3417 register enum rtx_code code
;
3418 register const char *fmt
;
3423 code
= GET_CODE (x
);
3432 /* Ignore constants. Note that we must handle CONST_DOUBLE here
3433 because it may have a cc0_rtx in its CONST_DOUBLE_CHAIN field, but
3434 this does not mean that this insn is using cc0. */
3442 /* User of CC0 depends on immediately preceding insn. */
3443 SCHED_GROUP_P (insn
) = 1;
3445 /* There may be a note before this insn now, but all notes will
3446 be removed before we actually try to schedule the insns, so
3447 it won't cause a problem later. We must avoid it here though. */
3448 prev
= prev_nonnote_insn (insn
);
3450 /* Make a copy of all dependencies on the immediately previous insn,
3451 and add to this insn. This is so that all the dependencies will
3452 apply to the group. Remove an explicit dependence on this insn
3453 as SCHED_GROUP_P now represents it. */
3455 if (find_insn_list (prev
, LOG_LINKS (insn
)))
3456 remove_dependence (insn
, prev
);
3458 for (link
= LOG_LINKS (prev
); link
; link
= XEXP (link
, 1))
3459 add_dependence (insn
, XEXP (link
, 0), REG_NOTE_KIND (link
));
3468 int regno
= REGNO (x
);
3469 if (regno
< FIRST_PSEUDO_REGISTER
)
3473 i
= HARD_REGNO_NREGS (regno
, GET_MODE (x
));
3476 reg_last_uses
[regno
+ i
]
3477 = alloc_INSN_LIST (insn
, reg_last_uses
[regno
+ i
]);
3479 for (u
= reg_last_sets
[regno
+ i
]; u
; u
= XEXP (u
, 1))
3480 add_dependence (insn
, XEXP (u
, 0), 0);
3482 /* ??? This should never happen. */
3483 for (u
= reg_last_clobbers
[regno
+ i
]; u
; u
= XEXP (u
, 1))
3484 add_dependence (insn
, XEXP (u
, 0), 0);
3486 if ((call_used_regs
[regno
+ i
] || global_regs
[regno
+ i
]))
3487 /* Function calls clobber all call_used regs. */
3488 for (u
= last_function_call
; u
; u
= XEXP (u
, 1))
3489 add_dependence (insn
, XEXP (u
, 0), REG_DEP_ANTI
);
3494 reg_last_uses
[regno
] = alloc_INSN_LIST (insn
,
3495 reg_last_uses
[regno
]);
3497 for (u
= reg_last_sets
[regno
]; u
; u
= XEXP (u
, 1))
3498 add_dependence (insn
, XEXP (u
, 0), 0);
3500 /* ??? This should never happen. */
3501 for (u
= reg_last_clobbers
[regno
]; u
; u
= XEXP (u
, 1))
3502 add_dependence (insn
, XEXP (u
, 0), 0);
3504 /* Pseudos that are REG_EQUIV to something may be replaced
3505 by that during reloading. We need only add dependencies for
3506 the address in the REG_EQUIV note. */
3507 if (!reload_completed
3508 && reg_known_equiv_p
[regno
]
3509 && GET_CODE (reg_known_value
[regno
]) == MEM
)
3510 sched_analyze_2 (XEXP (reg_known_value
[regno
], 0), insn
);
3512 /* If the register does not already cross any calls, then add this
3513 insn to the sched_before_next_call list so that it will still
3514 not cross calls after scheduling. */
3515 if (REG_N_CALLS_CROSSED (regno
) == 0)
3516 add_dependence (sched_before_next_call
, insn
, REG_DEP_ANTI
);
3523 /* Reading memory. */
3525 rtx pending
, pending_mem
;
3527 pending
= pending_read_insns
;
3528 pending_mem
= pending_read_mems
;
3531 if (read_dependence (XEXP (pending_mem
, 0), x
))
3532 add_dependence (insn
, XEXP (pending
, 0), REG_DEP_ANTI
);
3534 pending
= XEXP (pending
, 1);
3535 pending_mem
= XEXP (pending_mem
, 1);
3538 pending
= pending_write_insns
;
3539 pending_mem
= pending_write_mems
;
3542 if (true_dependence (XEXP (pending_mem
, 0), VOIDmode
,
3544 add_dependence (insn
, XEXP (pending
, 0), 0);
3546 pending
= XEXP (pending
, 1);
3547 pending_mem
= XEXP (pending_mem
, 1);
3550 for (u
= last_pending_memory_flush
; u
; u
= XEXP (u
, 1))
3551 add_dependence (insn
, XEXP (u
, 0), REG_DEP_ANTI
);
3553 /* Always add these dependencies to pending_reads, since
3554 this insn may be followed by a write. */
3555 add_insn_mem_dependence (&pending_read_insns
, &pending_read_mems
,
3558 /* Take advantage of tail recursion here. */
3559 sched_analyze_2 (XEXP (x
, 0), insn
);
3563 /* Force pending stores to memory in case a trap handler needs them. */
3565 flush_pending_lists (insn
, 1);
3570 case UNSPEC_VOLATILE
:
3574 /* Traditional and volatile asm instructions must be considered to use
3575 and clobber all hard registers, all pseudo-registers and all of
3576 memory. So must TRAP_IF and UNSPEC_VOLATILE operations.
3578 Consider for instance a volatile asm that changes the fpu rounding
3579 mode. An insn should not be moved across this even if it only uses
3580 pseudo-regs because it might give an incorrectly rounded result. */
3581 if (code
!= ASM_OPERANDS
|| MEM_VOLATILE_P (x
))
3583 int max_reg
= max_reg_num ();
3584 for (i
= 0; i
< max_reg
; i
++)
3586 for (u
= reg_last_uses
[i
]; u
; u
= XEXP (u
, 1))
3587 add_dependence (insn
, XEXP (u
, 0), REG_DEP_ANTI
);
3588 free_INSN_LIST_list (®_last_uses
[i
]);
3590 for (u
= reg_last_sets
[i
]; u
; u
= XEXP (u
, 1))
3591 add_dependence (insn
, XEXP (u
, 0), 0);
3593 for (u
= reg_last_clobbers
[i
]; u
; u
= XEXP (u
, 1))
3594 add_dependence (insn
, XEXP (u
, 0), 0);
3596 reg_pending_sets_all
= 1;
3598 flush_pending_lists (insn
, 0);
3601 /* For all ASM_OPERANDS, we must traverse the vector of input operands.
3602 We can not just fall through here since then we would be confused
3603 by the ASM_INPUT rtx inside ASM_OPERANDS, which do not indicate
3604 traditional asms unlike their normal usage. */
3606 if (code
== ASM_OPERANDS
)
3608 for (j
= 0; j
< ASM_OPERANDS_INPUT_LENGTH (x
); j
++)
3609 sched_analyze_2 (ASM_OPERANDS_INPUT (x
, j
), insn
);
3619 /* These both read and modify the result. We must handle them as writes
3620 to get proper dependencies for following instructions. We must handle
3621 them as reads to get proper dependencies from this to previous
3622 instructions. Thus we need to pass them to both sched_analyze_1
3623 and sched_analyze_2. We must call sched_analyze_2 first in order
3624 to get the proper antecedent for the read. */
3625 sched_analyze_2 (XEXP (x
, 0), insn
);
3626 sched_analyze_1 (x
, insn
);
3633 /* Other cases: walk the insn. */
3634 fmt
= GET_RTX_FORMAT (code
);
3635 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
3638 sched_analyze_2 (XEXP (x
, i
), insn
);
3639 else if (fmt
[i
] == 'E')
3640 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
3641 sched_analyze_2 (XVECEXP (x
, i
, j
), insn
);
3645 /* Analyze an INSN with pattern X to find all dependencies. */
3648 sched_analyze_insn (x
, insn
, loop_notes
)
3652 register RTX_CODE code
= GET_CODE (x
);
3654 int maxreg
= max_reg_num ();
3657 if (code
== SET
|| code
== CLOBBER
)
3658 sched_analyze_1 (x
, insn
);
3659 else if (code
== PARALLEL
)
3662 for (i
= XVECLEN (x
, 0) - 1; i
>= 0; i
--)
3664 code
= GET_CODE (XVECEXP (x
, 0, i
));
3665 if (code
== SET
|| code
== CLOBBER
)
3666 sched_analyze_1 (XVECEXP (x
, 0, i
), insn
);
3668 sched_analyze_2 (XVECEXP (x
, 0, i
), insn
);
3672 sched_analyze_2 (x
, insn
);
3674 /* Mark registers CLOBBERED or used by called function. */
3675 if (GET_CODE (insn
) == CALL_INSN
)
3676 for (link
= CALL_INSN_FUNCTION_USAGE (insn
); link
; link
= XEXP (link
, 1))
3678 if (GET_CODE (XEXP (link
, 0)) == CLOBBER
)
3679 sched_analyze_1 (XEXP (link
, 0), insn
);
3681 sched_analyze_2 (XEXP (link
, 0), insn
);
3684 /* If there is a {LOOP,EHREGION}_{BEG,END} note in the middle of a basic
3685 block, then we must be sure that no instructions are scheduled across it.
3686 Otherwise, the reg_n_refs info (which depends on loop_depth) would
3687 become incorrect. */
3691 int max_reg
= max_reg_num ();
3692 int schedule_barrier_found
= 0;
3695 /* Update loop_notes with any notes from this insn. Also determine
3696 if any of the notes on the list correspond to instruction scheduling
3697 barriers (loop, eh & setjmp notes, but not range notes. */
3699 while (XEXP (link
, 1))
3701 if (INTVAL (XEXP (link
, 0)) == NOTE_INSN_LOOP_BEG
3702 || INTVAL (XEXP (link
, 0)) == NOTE_INSN_LOOP_END
3703 || INTVAL (XEXP (link
, 0)) == NOTE_INSN_EH_REGION_BEG
3704 || INTVAL (XEXP (link
, 0)) == NOTE_INSN_EH_REGION_END
3705 || INTVAL (XEXP (link
, 0)) == NOTE_INSN_SETJMP
)
3706 schedule_barrier_found
= 1;
3708 link
= XEXP (link
, 1);
3710 XEXP (link
, 1) = REG_NOTES (insn
);
3711 REG_NOTES (insn
) = loop_notes
;
3713 /* Add dependencies if a scheduling barrier was found. */
3714 if (schedule_barrier_found
)
3716 for (i
= 0; i
< max_reg
; i
++)
3719 for (u
= reg_last_uses
[i
]; u
; u
= XEXP (u
, 1))
3720 add_dependence (insn
, XEXP (u
, 0), REG_DEP_ANTI
);
3721 free_INSN_LIST_list (®_last_uses
[i
]);
3723 for (u
= reg_last_sets
[i
]; u
; u
= XEXP (u
, 1))
3724 add_dependence (insn
, XEXP (u
, 0), 0);
3726 for (u
= reg_last_clobbers
[i
]; u
; u
= XEXP (u
, 1))
3727 add_dependence (insn
, XEXP (u
, 0), 0);
3729 reg_pending_sets_all
= 1;
3731 flush_pending_lists (insn
, 0);
3736 /* Accumulate clobbers until the next set so that it will be output dependent
3737 on all of them. At the next set we can clear the clobber list, since
3738 subsequent sets will be output dependent on it. */
3739 EXECUTE_IF_SET_IN_REG_SET (reg_pending_sets
, 0, i
,
3741 free_INSN_LIST_list (®_last_sets
[i
]);
3742 free_INSN_LIST_list (®_last_clobbers
[i
]);
3744 = alloc_INSN_LIST (insn
, NULL_RTX
);
3746 EXECUTE_IF_SET_IN_REG_SET (reg_pending_clobbers
, 0, i
,
3748 reg_last_clobbers
[i
]
3749 = alloc_INSN_LIST (insn
,
3750 reg_last_clobbers
[i
]);
3752 CLEAR_REG_SET (reg_pending_sets
);
3753 CLEAR_REG_SET (reg_pending_clobbers
);
3755 if (reg_pending_sets_all
)
3757 for (i
= 0; i
< maxreg
; i
++)
3759 free_INSN_LIST_list (®_last_sets
[i
]);
3760 reg_last_sets
[i
] = alloc_INSN_LIST (insn
, NULL_RTX
);
3763 reg_pending_sets_all
= 0;
3766 /* Handle function calls and function returns created by the epilogue
3768 if (GET_CODE (insn
) == CALL_INSN
|| GET_CODE (insn
) == JUMP_INSN
)
3773 /* When scheduling instructions, we make sure calls don't lose their
3774 accompanying USE insns by depending them one on another in order.
3776 Also, we must do the same thing for returns created by the epilogue
3777 threading code. Note this code works only in this special case,
3778 because other passes make no guarantee that they will never emit
3779 an instruction between a USE and a RETURN. There is such a guarantee
3780 for USE instructions immediately before a call. */
3782 prev_dep_insn
= insn
;
3783 dep_insn
= PREV_INSN (insn
);
3784 while (GET_CODE (dep_insn
) == INSN
3785 && GET_CODE (PATTERN (dep_insn
)) == USE
3786 && GET_CODE (XEXP (PATTERN (dep_insn
), 0)) == REG
)
3788 SCHED_GROUP_P (prev_dep_insn
) = 1;
3790 /* Make a copy of all dependencies on dep_insn, and add to insn.
3791 This is so that all of the dependencies will apply to the
3794 for (link
= LOG_LINKS (dep_insn
); link
; link
= XEXP (link
, 1))
3795 add_dependence (insn
, XEXP (link
, 0), REG_NOTE_KIND (link
));
3797 prev_dep_insn
= dep_insn
;
3798 dep_insn
= PREV_INSN (dep_insn
);
3803 /* Analyze every insn between HEAD and TAIL inclusive, creating LOG_LINKS
3804 for every dependency. */
3807 sched_analyze (head
, tail
)
3814 for (insn
= head
;; insn
= NEXT_INSN (insn
))
3816 if (GET_CODE (insn
) == INSN
|| GET_CODE (insn
) == JUMP_INSN
)
3818 /* Clear out the stale LOG_LINKS from flow. */
3819 free_INSN_LIST_list (&LOG_LINKS (insn
));
3821 /* Make each JUMP_INSN a scheduling barrier for memory
3823 if (GET_CODE (insn
) == JUMP_INSN
)
3824 last_pending_memory_flush
3825 = alloc_INSN_LIST (insn
, last_pending_memory_flush
);
3826 sched_analyze_insn (PATTERN (insn
), insn
, loop_notes
);
3829 else if (GET_CODE (insn
) == CALL_INSN
)
3834 CANT_MOVE (insn
) = 1;
3836 /* Clear out the stale LOG_LINKS from flow. */
3837 free_INSN_LIST_list (&LOG_LINKS (insn
));
3839 /* Any instruction using a hard register which may get clobbered
3840 by a call needs to be marked as dependent on this call.
3841 This prevents a use of a hard return reg from being moved
3842 past a void call (i.e. it does not explicitly set the hard
3845 /* If this call is followed by a NOTE_INSN_SETJMP, then assume that
3846 all registers, not just hard registers, may be clobbered by this
3849 /* Insn, being a CALL_INSN, magically depends on
3850 `last_function_call' already. */
3852 if (NEXT_INSN (insn
) && GET_CODE (NEXT_INSN (insn
)) == NOTE
3853 && NOTE_LINE_NUMBER (NEXT_INSN (insn
)) == NOTE_INSN_SETJMP
)
3855 int max_reg
= max_reg_num ();
3856 for (i
= 0; i
< max_reg
; i
++)
3858 for (u
= reg_last_uses
[i
]; u
; u
= XEXP (u
, 1))
3859 add_dependence (insn
, XEXP (u
, 0), REG_DEP_ANTI
);
3860 free_INSN_LIST_list (®_last_uses
[i
]);
3862 for (u
= reg_last_sets
[i
]; u
; u
= XEXP (u
, 1))
3863 add_dependence (insn
, XEXP (u
, 0), 0);
3865 for (u
= reg_last_clobbers
[i
]; u
; u
= XEXP (u
, 1))
3866 add_dependence (insn
, XEXP (u
, 0), 0);
3868 reg_pending_sets_all
= 1;
3870 /* Add a pair of fake REG_NOTEs which we will later
3871 convert back into a NOTE_INSN_SETJMP note. See
3872 reemit_notes for why we use a pair of NOTEs. */
3873 REG_NOTES (insn
) = alloc_EXPR_LIST (REG_DEAD
,
3876 REG_NOTES (insn
) = alloc_EXPR_LIST (REG_DEAD
,
3877 GEN_INT (NOTE_INSN_SETJMP
),
3882 for (i
= 0; i
< FIRST_PSEUDO_REGISTER
; i
++)
3883 if (call_used_regs
[i
] || global_regs
[i
])
3885 for (u
= reg_last_uses
[i
]; u
; u
= XEXP (u
, 1))
3886 add_dependence (insn
, XEXP (u
, 0), REG_DEP_ANTI
);
3888 for (u
= reg_last_sets
[i
]; u
; u
= XEXP (u
, 1))
3889 add_dependence (insn
, XEXP (u
, 0), REG_DEP_ANTI
);
3891 SET_REGNO_REG_SET (reg_pending_clobbers
, i
);
3895 /* For each insn which shouldn't cross a call, add a dependence
3896 between that insn and this call insn. */
3897 x
= LOG_LINKS (sched_before_next_call
);
3900 add_dependence (insn
, XEXP (x
, 0), REG_DEP_ANTI
);
3903 free_INSN_LIST_list (&LOG_LINKS (sched_before_next_call
));
3905 sched_analyze_insn (PATTERN (insn
), insn
, loop_notes
);
3908 /* In the absence of interprocedural alias analysis, we must flush
3909 all pending reads and writes, and start new dependencies starting
3910 from here. But only flush writes for constant calls (which may
3911 be passed a pointer to something we haven't written yet). */
3912 flush_pending_lists (insn
, CONST_CALL_P (insn
));
3914 /* Depend this function call (actually, the user of this
3915 function call) on all hard register clobberage. */
3917 /* last_function_call is now a list of insns. */
3918 free_INSN_LIST_list(&last_function_call
);
3919 last_function_call
= alloc_INSN_LIST (insn
, NULL_RTX
);
3922 /* See comments on reemit_notes as to why we do this.
3923 ??? Actually, the reemit_notes just say what is done, not why. */
3925 else if (GET_CODE (insn
) == NOTE
3926 && (NOTE_LINE_NUMBER (insn
) == NOTE_INSN_RANGE_START
3927 || NOTE_LINE_NUMBER (insn
) == NOTE_INSN_RANGE_END
))
3929 loop_notes
= alloc_EXPR_LIST (REG_DEAD
, NOTE_RANGE_INFO (insn
),
3931 loop_notes
= alloc_EXPR_LIST (REG_DEAD
,
3932 GEN_INT (NOTE_LINE_NUMBER (insn
)),
3935 else if (GET_CODE (insn
) == NOTE
3936 && (NOTE_LINE_NUMBER (insn
) == NOTE_INSN_LOOP_BEG
3937 || NOTE_LINE_NUMBER (insn
) == NOTE_INSN_LOOP_END
3938 || NOTE_LINE_NUMBER (insn
) == NOTE_INSN_EH_REGION_BEG
3939 || NOTE_LINE_NUMBER (insn
) == NOTE_INSN_EH_REGION_END
3940 || (NOTE_LINE_NUMBER (insn
) == NOTE_INSN_SETJMP
3941 && GET_CODE (PREV_INSN (insn
)) != CALL_INSN
)))
3945 if (NOTE_LINE_NUMBER (insn
) == NOTE_INSN_EH_REGION_BEG
3946 || NOTE_LINE_NUMBER (insn
) == NOTE_INSN_EH_REGION_END
)
3947 rtx_region
= GEN_INT (NOTE_EH_HANDLER (insn
));
3949 rtx_region
= GEN_INT (0);
3951 loop_notes
= alloc_EXPR_LIST (REG_DEAD
,
3954 loop_notes
= alloc_EXPR_LIST (REG_DEAD
,
3955 GEN_INT (NOTE_LINE_NUMBER (insn
)),
3957 CONST_CALL_P (loop_notes
) = CONST_CALL_P (insn
);
3966 /* Called when we see a set of a register. If death is true, then we are
3967 scanning backwards. Mark that register as unborn. If nobody says
3968 otherwise, that is how things will remain. If death is false, then we
3969 are scanning forwards. Mark that register as being born. */
3972 sched_note_set (x
, death
)
3977 register rtx reg
= SET_DEST (x
);
3983 if (GET_CODE (reg
) == PARALLEL
3984 && GET_MODE (reg
) == BLKmode
)
3987 for (i
= XVECLEN (reg
, 0) - 1; i
>= 0; i
--)
3988 sched_note_set (XVECEXP (reg
, 0, i
), death
);
3992 while (GET_CODE (reg
) == SUBREG
|| GET_CODE (reg
) == STRICT_LOW_PART
3993 || GET_CODE (reg
) == SIGN_EXTRACT
|| GET_CODE (reg
) == ZERO_EXTRACT
)
3995 /* Must treat modification of just one hardware register of a multi-reg
3996 value or just a byte field of a register exactly the same way that
3997 mark_set_1 in flow.c does, i.e. anything except a paradoxical subreg
3998 does not kill the entire register. */
3999 if (GET_CODE (reg
) != SUBREG
4000 || REG_SIZE (SUBREG_REG (reg
)) > REG_SIZE (reg
))
4003 reg
= SUBREG_REG (reg
);
4006 if (GET_CODE (reg
) != REG
)
4009 /* Global registers are always live, so the code below does not apply
4012 regno
= REGNO (reg
);
4013 if (regno
>= FIRST_PSEUDO_REGISTER
|| !global_regs
[regno
])
4017 /* If we only set part of the register, then this set does not
4022 /* Try killing this register. */
4023 if (regno
< FIRST_PSEUDO_REGISTER
)
4025 int j
= HARD_REGNO_NREGS (regno
, GET_MODE (reg
));
4028 CLEAR_REGNO_REG_SET (bb_live_regs
, regno
+ j
);
4033 /* Recompute REG_BASIC_BLOCK as we update all the other
4034 dataflow information. */
4035 if (sched_reg_basic_block
[regno
] == REG_BLOCK_UNKNOWN
)
4036 sched_reg_basic_block
[regno
] = current_block_num
;
4037 else if (sched_reg_basic_block
[regno
] != current_block_num
)
4038 sched_reg_basic_block
[regno
] = REG_BLOCK_GLOBAL
;
4040 CLEAR_REGNO_REG_SET (bb_live_regs
, regno
);
4045 /* Make the register live again. */
4046 if (regno
< FIRST_PSEUDO_REGISTER
)
4048 int j
= HARD_REGNO_NREGS (regno
, GET_MODE (reg
));
4051 SET_REGNO_REG_SET (bb_live_regs
, regno
+ j
);
4056 SET_REGNO_REG_SET (bb_live_regs
, regno
);
4062 /* Macros and functions for keeping the priority queue sorted, and
4063 dealing with queueing and dequeueing of instructions. */
4065 #define SCHED_SORT(READY, N_READY) \
4066 do { if ((N_READY) == 2) \
4067 swap_sort (READY, N_READY); \
4068 else if ((N_READY) > 2) \
4069 qsort (READY, N_READY, sizeof (rtx), rank_for_schedule); } \
4072 /* Returns a positive value if x is preferred; returns a negative value if
4073 y is preferred. Should never return 0, since that will make the sort
4077 rank_for_schedule (x
, y
)
4081 rtx tmp
= *(rtx
*)y
;
4082 rtx tmp2
= *(rtx
*)x
;
4084 int tmp_class
, tmp2_class
, depend_count1
, depend_count2
;
4085 int val
, priority_val
, spec_val
, prob_val
, weight_val
;
4088 /* Prefer insn with higher priority. */
4089 priority_val
= INSN_PRIORITY (tmp2
) - INSN_PRIORITY (tmp
);
4091 return priority_val
;
4093 /* Prefer an insn with smaller contribution to registers-pressure. */
4094 if (!reload_completed
&&
4095 (weight_val
= INSN_REG_WEIGHT (tmp
) - INSN_REG_WEIGHT (tmp2
)))
4096 return (weight_val
);
4098 /* Some comparison make sense in interblock scheduling only. */
4099 if (INSN_BB (tmp
) != INSN_BB (tmp2
))
4101 /* Prefer an inblock motion on an interblock motion. */
4102 if ((INSN_BB (tmp2
) == target_bb
) && (INSN_BB (tmp
) != target_bb
))
4104 if ((INSN_BB (tmp
) == target_bb
) && (INSN_BB (tmp2
) != target_bb
))
4107 /* Prefer a useful motion on a speculative one. */
4108 if ((spec_val
= IS_SPECULATIVE_INSN (tmp
) - IS_SPECULATIVE_INSN (tmp2
)))
4111 /* Prefer a more probable (speculative) insn. */
4112 prob_val
= INSN_PROBABILITY (tmp2
) - INSN_PROBABILITY (tmp
);
4117 /* Compare insns based on their relation to the last-scheduled-insn. */
4118 if (last_scheduled_insn
)
4120 /* Classify the instructions into three classes:
4121 1) Data dependent on last schedule insn.
4122 2) Anti/Output dependent on last scheduled insn.
4123 3) Independent of last scheduled insn, or has latency of one.
4124 Choose the insn from the highest numbered class if different. */
4125 link
= find_insn_list (tmp
, INSN_DEPEND (last_scheduled_insn
));
4126 if (link
== 0 || insn_cost (last_scheduled_insn
, link
, tmp
) == 1)
4128 else if (REG_NOTE_KIND (link
) == 0) /* Data dependence. */
4133 link
= find_insn_list (tmp2
, INSN_DEPEND (last_scheduled_insn
));
4134 if (link
== 0 || insn_cost (last_scheduled_insn
, link
, tmp2
) == 1)
4136 else if (REG_NOTE_KIND (link
) == 0) /* Data dependence. */
4141 if ((val
= tmp2_class
- tmp_class
))
4145 /* Prefer the insn which has more later insns that depend on it.
4146 This gives the scheduler more freedom when scheduling later
4147 instructions at the expense of added register pressure. */
4149 for (link
= INSN_DEPEND (tmp
); link
; link
= XEXP (link
, 1))
4153 for (link
= INSN_DEPEND (tmp2
); link
; link
= XEXP (link
, 1))
4156 val
= depend_count2
- depend_count1
;
4160 /* If insns are equally good, sort by INSN_LUID (original insn order),
4161 so that we make the sort stable. This minimizes instruction movement,
4162 thus minimizing sched's effect on debugging and cross-jumping. */
4163 return INSN_LUID (tmp
) - INSN_LUID (tmp2
);
4166 /* Resort the array A in which only element at index N may be out of order. */
4168 HAIFA_INLINE
static void
4173 rtx insn
= a
[n
- 1];
4176 while (i
>= 0 && rank_for_schedule (a
+ i
, &insn
) >= 0)
4184 static int max_priority
;
4186 /* Add INSN to the insn queue so that it can be executed at least
4187 N_CYCLES after the currently executing insn. Preserve insns
4188 chain for debugging purposes. */
4190 HAIFA_INLINE
static void
4191 queue_insn (insn
, n_cycles
)
4195 int next_q
= NEXT_Q_AFTER (q_ptr
, n_cycles
);
4196 rtx link
= alloc_INSN_LIST (insn
, insn_queue
[next_q
]);
4197 insn_queue
[next_q
] = link
;
4200 if (sched_verbose
>= 2)
4202 fprintf (dump
, ";;\t\tReady-->Q: insn %d: ", INSN_UID (insn
));
4204 if (INSN_BB (insn
) != target_bb
)
4205 fprintf (dump
, "(b%d) ", INSN_BLOCK (insn
));
4207 fprintf (dump
, "queued for %d cycles.\n", n_cycles
);
4212 /* Return nonzero if PAT is the pattern of an insn which makes a
4215 HAIFA_INLINE
static int
4216 birthing_insn_p (pat
)
4221 if (reload_completed
== 1)
4224 if (GET_CODE (pat
) == SET
4225 && (GET_CODE (SET_DEST (pat
)) == REG
4226 || (GET_CODE (SET_DEST (pat
)) == PARALLEL
4227 && GET_MODE (SET_DEST (pat
)) == BLKmode
)))
4229 rtx dest
= SET_DEST (pat
);
4232 /* It would be more accurate to use refers_to_regno_p or
4233 reg_mentioned_p to determine when the dest is not live before this
4235 if (GET_CODE (dest
) == REG
)
4238 if (REGNO_REG_SET_P (bb_live_regs
, i
))
4239 return (REG_N_SETS (i
) == 1);
4243 for (i
= XVECLEN (dest
, 0) - 1; i
>= 0; i
--)
4245 int regno
= REGNO (SET_DEST (XVECEXP (dest
, 0, i
)));
4246 if (REGNO_REG_SET_P (bb_live_regs
, regno
))
4247 return (REG_N_SETS (regno
) == 1);
4252 if (GET_CODE (pat
) == PARALLEL
)
4254 for (j
= 0; j
< XVECLEN (pat
, 0); j
++)
4255 if (birthing_insn_p (XVECEXP (pat
, 0, j
)))
4261 /* PREV is an insn that is ready to execute. Adjust its priority if that
4262 will help shorten register lifetimes. */
4264 HAIFA_INLINE
static void
4265 adjust_priority (prev
)
4268 /* Trying to shorten register lives after reload has completed
4269 is useless and wrong. It gives inaccurate schedules. */
4270 if (reload_completed
== 0)
4275 /* ??? This code has no effect, because REG_DEAD notes are removed
4276 before we ever get here. */
4277 for (note
= REG_NOTES (prev
); note
; note
= XEXP (note
, 1))
4278 if (REG_NOTE_KIND (note
) == REG_DEAD
)
4281 /* Defer scheduling insns which kill registers, since that
4282 shortens register lives. Prefer scheduling insns which
4283 make registers live for the same reason. */
4287 INSN_PRIORITY (prev
) >>= 3;
4290 INSN_PRIORITY (prev
) >>= 2;
4294 INSN_PRIORITY (prev
) >>= 1;
4297 if (birthing_insn_p (PATTERN (prev
)))
4299 int max
= max_priority
;
4301 if (max
> INSN_PRIORITY (prev
))
4302 INSN_PRIORITY (prev
) = max
;
4308 /* That said, a target might have it's own reasons for adjusting
4309 priority after reload. */
4310 #ifdef ADJUST_PRIORITY
4311 ADJUST_PRIORITY (prev
);
4315 /* Clock at which the previous instruction was issued. */
4316 static int last_clock_var
;
4318 /* INSN is the "currently executing insn". Launch each insn which was
4319 waiting on INSN. READY is a vector of insns which are ready to fire.
4320 N_READY is the number of elements in READY. CLOCK is the current
4324 schedule_insn (insn
, ready
, n_ready
, clock
)
4333 unit
= insn_unit (insn
);
4335 if (sched_verbose
>= 2)
4337 fprintf (dump
, ";;\t\t--> scheduling insn <<<%d>>> on unit ",
4339 insn_print_units (insn
);
4340 fprintf (dump
, "\n");
4343 if (sched_verbose
&& unit
== -1)
4344 visualize_no_unit (insn
);
4346 if (MAX_BLOCKAGE
> 1 || issue_rate
> 1 || sched_verbose
)
4347 schedule_unit (unit
, insn
, clock
);
4349 if (INSN_DEPEND (insn
) == 0)
4352 /* This is used by the function adjust_priority above. */
4354 max_priority
= MAX (INSN_PRIORITY (ready
[0]), INSN_PRIORITY (insn
));
4356 max_priority
= INSN_PRIORITY (insn
);
4358 for (link
= INSN_DEPEND (insn
); link
!= 0; link
= XEXP (link
, 1))
4360 rtx next
= XEXP (link
, 0);
4361 int cost
= insn_cost (insn
, link
, next
);
4363 INSN_TICK (next
) = MAX (INSN_TICK (next
), clock
+ cost
);
4365 if ((INSN_DEP_COUNT (next
) -= 1) == 0)
4367 int effective_cost
= INSN_TICK (next
) - clock
;
4369 /* For speculative insns, before inserting to ready/queue,
4370 check live, exception-free, and issue-delay. */
4371 if (INSN_BB (next
) != target_bb
4372 && (!IS_VALID (INSN_BB (next
))
4374 || (IS_SPECULATIVE_INSN (next
)
4375 && (insn_issue_delay (next
) > 3
4376 || !check_live (next
, INSN_BB (next
))
4377 || !is_exception_free (next
, INSN_BB (next
), target_bb
)))))
4380 if (sched_verbose
>= 2)
4382 fprintf (dump
, ";;\t\tdependences resolved: insn %d ",
4385 if (current_nr_blocks
> 1 && INSN_BB (next
) != target_bb
)
4386 fprintf (dump
, "/b%d ", INSN_BLOCK (next
));
4388 if (effective_cost
< 1)
4389 fprintf (dump
, "into ready\n");
4391 fprintf (dump
, "into queue with cost=%d\n", effective_cost
);
4394 /* Adjust the priority of NEXT and either put it on the ready
4395 list or queue it. */
4396 adjust_priority (next
);
4397 if (effective_cost
< 1)
4398 ready
[n_ready
++] = next
;
4400 queue_insn (next
, effective_cost
);
4404 /* Annotate the instruction with issue information -- TImode
4405 indicates that the instruction is expected not to be able
4406 to issue on the same cycle as the previous insn. A machine
4407 may use this information to decide how the instruction should
4409 if (reload_completed
&& issue_rate
> 1)
4411 PUT_MODE (insn
, clock
> last_clock_var
? TImode
: VOIDmode
);
4412 last_clock_var
= clock
;
4419 /* Add a REG_DEAD note for REG to INSN, reusing a REG_DEAD note from the
4423 create_reg_dead_note (reg
, insn
)
4428 /* The number of registers killed after scheduling must be the same as the
4429 number of registers killed before scheduling. The number of REG_DEAD
4430 notes may not be conserved, i.e. two SImode hard register REG_DEAD notes
4431 might become one DImode hard register REG_DEAD note, but the number of
4432 registers killed will be conserved.
4434 We carefully remove REG_DEAD notes from the dead_notes list, so that
4435 there will be none left at the end. If we run out early, then there
4436 is a bug somewhere in flow, combine and/or sched. */
4438 if (dead_notes
== 0)
4440 if (current_nr_blocks
<= 1)
4443 link
= alloc_EXPR_LIST (REG_DEAD
, NULL_RTX
, NULL_RTX
);
4447 /* Number of regs killed by REG. */
4448 int regs_killed
= (REGNO (reg
) >= FIRST_PSEUDO_REGISTER
? 1
4449 : HARD_REGNO_NREGS (REGNO (reg
), GET_MODE (reg
)));
4450 /* Number of regs killed by REG_DEAD notes taken off the list. */
4454 reg_note_regs
= (REGNO (XEXP (link
, 0)) >= FIRST_PSEUDO_REGISTER
? 1
4455 : HARD_REGNO_NREGS (REGNO (XEXP (link
, 0)),
4456 GET_MODE (XEXP (link
, 0))));
4457 while (reg_note_regs
< regs_killed
)
4459 link
= XEXP (link
, 1);
4461 /* LINK might be zero if we killed more registers after scheduling
4462 than before, and the last hard register we kill is actually
4465 This is normal for interblock scheduling, so deal with it in
4466 that case, else abort. */
4467 if (link
== NULL_RTX
&& current_nr_blocks
<= 1)
4469 else if (link
== NULL_RTX
)
4470 link
= alloc_EXPR_LIST (REG_DEAD
, gen_rtx_REG (word_mode
, 0),
4473 reg_note_regs
+= (REGNO (XEXP (link
, 0)) >= FIRST_PSEUDO_REGISTER
? 1
4474 : HARD_REGNO_NREGS (REGNO (XEXP (link
, 0)),
4475 GET_MODE (XEXP (link
, 0))));
4477 dead_notes
= XEXP (link
, 1);
4479 /* If we took too many regs kills off, put the extra ones back. */
4480 while (reg_note_regs
> regs_killed
)
4482 rtx temp_reg
, temp_link
;
4484 temp_reg
= gen_rtx_REG (word_mode
, 0);
4485 temp_link
= alloc_EXPR_LIST (REG_DEAD
, temp_reg
, dead_notes
);
4486 dead_notes
= temp_link
;
4491 XEXP (link
, 0) = reg
;
4492 XEXP (link
, 1) = REG_NOTES (insn
);
4493 REG_NOTES (insn
) = link
;
4496 /* Subroutine on attach_deaths_insn--handles the recursive search
4497 through INSN. If SET_P is true, then x is being modified by the insn. */
4500 attach_deaths (x
, insn
, set_p
)
4507 register enum rtx_code code
;
4508 register const char *fmt
;
4513 code
= GET_CODE (x
);
4525 /* Get rid of the easy cases first. */
4530 /* If the register dies in this insn, queue that note, and mark
4531 this register as needing to die. */
4532 /* This code is very similar to mark_used_1 (if set_p is false)
4533 and mark_set_1 (if set_p is true) in flow.c. */
4543 all_needed
= some_needed
= REGNO_REG_SET_P (old_live_regs
, regno
);
4544 if (regno
< FIRST_PSEUDO_REGISTER
)
4548 n
= HARD_REGNO_NREGS (regno
, GET_MODE (x
));
4551 int needed
= (REGNO_REG_SET_P (old_live_regs
, regno
+ n
));
4552 some_needed
|= needed
;
4553 all_needed
&= needed
;
4557 /* If it wasn't live before we started, then add a REG_DEAD note.
4558 We must check the previous lifetime info not the current info,
4559 because we may have to execute this code several times, e.g.
4560 once for a clobber (which doesn't add a note) and later
4561 for a use (which does add a note).
4563 Always make the register live. We must do this even if it was
4564 live before, because this may be an insn which sets and uses
4565 the same register, in which case the register has already been
4566 killed, so we must make it live again.
4568 Global registers are always live, and should never have a REG_DEAD
4569 note added for them, so none of the code below applies to them. */
4571 if (regno
>= FIRST_PSEUDO_REGISTER
|| ! global_regs
[regno
])
4573 /* Never add REG_DEAD notes for STACK_POINTER_REGNUM
4574 since it's always considered to be live. Similarly
4575 for FRAME_POINTER_REGNUM if a frame pointer is needed
4576 and for ARG_POINTER_REGNUM if it is fixed. */
4577 if (! (regno
== FRAME_POINTER_REGNUM
4578 && (! reload_completed
|| frame_pointer_needed
))
4579 #if HARD_FRAME_POINTER_REGNUM != FRAME_POINTER_REGNUM
4580 && ! (regno
== HARD_FRAME_POINTER_REGNUM
4581 && (! reload_completed
|| frame_pointer_needed
))
4583 #if ARG_POINTER_REGNUM != FRAME_POINTER_REGNUM
4584 && ! (regno
== ARG_POINTER_REGNUM
&& fixed_regs
[regno
])
4586 && regno
!= STACK_POINTER_REGNUM
)
4588 if (! all_needed
&& ! dead_or_set_p (insn
, x
))
4590 /* Check for the case where the register dying partially
4591 overlaps the register set by this insn. */
4592 if (regno
< FIRST_PSEUDO_REGISTER
4593 && HARD_REGNO_NREGS (regno
, GET_MODE (x
)) > 1)
4595 int n
= HARD_REGNO_NREGS (regno
, GET_MODE (x
));
4597 some_needed
|= dead_or_set_regno_p (insn
, regno
+ n
);
4600 /* If none of the words in X is needed, make a REG_DEAD
4601 note. Otherwise, we must make partial REG_DEAD
4604 create_reg_dead_note (x
, insn
);
4609 /* Don't make a REG_DEAD note for a part of a
4610 register that is set in the insn. */
4611 for (i
= HARD_REGNO_NREGS (regno
, GET_MODE (x
)) - 1;
4613 if (! REGNO_REG_SET_P (old_live_regs
, regno
+i
)
4614 && ! dead_or_set_regno_p (insn
, regno
+ i
))
4615 create_reg_dead_note (gen_rtx_REG (reg_raw_mode
[regno
+ i
],
4622 if (regno
< FIRST_PSEUDO_REGISTER
)
4624 int j
= HARD_REGNO_NREGS (regno
, GET_MODE (x
));
4627 SET_REGNO_REG_SET (bb_live_regs
, regno
+ j
);
4632 /* Recompute REG_BASIC_BLOCK as we update all the other
4633 dataflow information. */
4634 if (sched_reg_basic_block
[regno
] == REG_BLOCK_UNKNOWN
)
4635 sched_reg_basic_block
[regno
] = current_block_num
;
4636 else if (sched_reg_basic_block
[regno
] != current_block_num
)
4637 sched_reg_basic_block
[regno
] = REG_BLOCK_GLOBAL
;
4639 SET_REGNO_REG_SET (bb_live_regs
, regno
);
4646 /* Handle tail-recursive case. */
4647 attach_deaths (XEXP (x
, 0), insn
, 0);
4651 attach_deaths (SUBREG_REG (x
), insn
,
4652 set_p
&& ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (x
)))
4654 || (GET_MODE_SIZE (GET_MODE (SUBREG_REG (x
)))
4655 == GET_MODE_SIZE (GET_MODE ((x
))))));
4658 case STRICT_LOW_PART
:
4659 attach_deaths (XEXP (x
, 0), insn
, 0);
4664 attach_deaths (XEXP (x
, 0), insn
, 0);
4665 attach_deaths (XEXP (x
, 1), insn
, 0);
4666 attach_deaths (XEXP (x
, 2), insn
, 0);
4671 && GET_MODE (x
) == BLKmode
)
4673 for (i
= XVECLEN (x
, 0) - 1; i
>= 0; i
--)
4674 attach_deaths (SET_DEST (XVECEXP (x
, 0, i
)), insn
, 1);
4680 /* Other cases: walk the insn. */
4681 fmt
= GET_RTX_FORMAT (code
);
4682 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
4685 attach_deaths (XEXP (x
, i
), insn
, 0);
4686 else if (fmt
[i
] == 'E')
4687 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
4688 attach_deaths (XVECEXP (x
, i
, j
), insn
, 0);
4693 /* After INSN has executed, add register death notes for each register
4694 that is dead after INSN. */
4697 attach_deaths_insn (insn
)
4700 rtx x
= PATTERN (insn
);
4701 register RTX_CODE code
= GET_CODE (x
);
4706 attach_deaths (SET_SRC (x
), insn
, 0);
4708 /* A register might die here even if it is the destination, e.g.
4709 it is the target of a volatile read and is otherwise unused.
4710 Hence we must always call attach_deaths for the SET_DEST. */
4711 attach_deaths (SET_DEST (x
), insn
, 1);
4713 else if (code
== PARALLEL
)
4716 for (i
= XVECLEN (x
, 0) - 1; i
>= 0; i
--)
4718 code
= GET_CODE (XVECEXP (x
, 0, i
));
4721 attach_deaths (SET_SRC (XVECEXP (x
, 0, i
)), insn
, 0);
4723 attach_deaths (SET_DEST (XVECEXP (x
, 0, i
)), insn
, 1);
4725 /* Flow does not add REG_DEAD notes to registers that die in
4726 clobbers, so we can't either. */
4727 else if (code
!= CLOBBER
)
4728 attach_deaths (XVECEXP (x
, 0, i
), insn
, 0);
4731 /* If this is a CLOBBER, only add REG_DEAD notes to registers inside a
4732 MEM being clobbered, just like flow. */
4733 else if (code
== CLOBBER
&& GET_CODE (XEXP (x
, 0)) == MEM
)
4734 attach_deaths (XEXP (XEXP (x
, 0), 0), insn
, 0);
4735 /* Otherwise don't add a death note to things being clobbered. */
4736 else if (code
!= CLOBBER
)
4737 attach_deaths (x
, insn
, 0);
4739 /* Make death notes for things used in the called function. */
4740 if (GET_CODE (insn
) == CALL_INSN
)
4741 for (link
= CALL_INSN_FUNCTION_USAGE (insn
); link
; link
= XEXP (link
, 1))
4742 attach_deaths (XEXP (XEXP (link
, 0), 0), insn
,
4743 GET_CODE (XEXP (link
, 0)) == CLOBBER
);
4746 /* Functions for handling of notes. */
4748 /* Delete notes beginning with INSN and put them in the chain
4749 of notes ended by NOTE_LIST.
4750 Returns the insn following the notes. */
4753 unlink_other_notes (insn
, tail
)
4756 rtx prev
= PREV_INSN (insn
);
4758 while (insn
!= tail
&& GET_CODE (insn
) == NOTE
)
4760 rtx next
= NEXT_INSN (insn
);
4761 /* Delete the note from its current position. */
4763 NEXT_INSN (prev
) = next
;
4765 PREV_INSN (next
) = prev
;
4767 /* Don't save away NOTE_INSN_SETJMPs, because they must remain
4768 immediately after the call they follow. We use a fake
4769 (REG_DEAD (const_int -1)) note to remember them.
4770 Likewise with NOTE_INSN_{LOOP,EHREGION}_{BEG, END}. */
4771 if (NOTE_LINE_NUMBER (insn
) != NOTE_INSN_SETJMP
4772 && NOTE_LINE_NUMBER (insn
) != NOTE_INSN_LOOP_BEG
4773 && NOTE_LINE_NUMBER (insn
) != NOTE_INSN_LOOP_END
4774 && NOTE_LINE_NUMBER (insn
) != NOTE_INSN_RANGE_START
4775 && NOTE_LINE_NUMBER (insn
) != NOTE_INSN_RANGE_END
4776 && NOTE_LINE_NUMBER (insn
) != NOTE_INSN_EH_REGION_BEG
4777 && NOTE_LINE_NUMBER (insn
) != NOTE_INSN_EH_REGION_END
)
4779 /* Insert the note at the end of the notes list. */
4780 PREV_INSN (insn
) = note_list
;
4782 NEXT_INSN (note_list
) = insn
;
4791 /* Delete line notes beginning with INSN. Record line-number notes so
4792 they can be reused. Returns the insn following the notes. */
4795 unlink_line_notes (insn
, tail
)
4798 rtx prev
= PREV_INSN (insn
);
4800 while (insn
!= tail
&& GET_CODE (insn
) == NOTE
)
4802 rtx next
= NEXT_INSN (insn
);
4804 if (write_symbols
!= NO_DEBUG
&& NOTE_LINE_NUMBER (insn
) > 0)
4806 /* Delete the note from its current position. */
4808 NEXT_INSN (prev
) = next
;
4810 PREV_INSN (next
) = prev
;
4812 /* Record line-number notes so they can be reused. */
4813 LINE_NOTE (insn
) = insn
;
4823 /* Return the head and tail pointers of BB. */
4825 HAIFA_INLINE
static void
4826 get_block_head_tail (bb
, headp
, tailp
)
4836 b
= BB_TO_BLOCK (bb
);
4838 /* HEAD and TAIL delimit the basic block being scheduled. */
4839 head
= BLOCK_HEAD (b
);
4840 tail
= BLOCK_END (b
);
4842 /* Don't include any notes or labels at the beginning of the
4843 basic block, or notes at the ends of basic blocks. */
4844 while (head
!= tail
)
4846 if (GET_CODE (head
) == NOTE
)
4847 head
= NEXT_INSN (head
);
4848 else if (GET_CODE (tail
) == NOTE
)
4849 tail
= PREV_INSN (tail
);
4850 else if (GET_CODE (head
) == CODE_LABEL
)
4851 head
= NEXT_INSN (head
);
4860 /* Delete line notes from bb. Save them so they can be later restored
4861 (in restore_line_notes ()). */
4872 get_block_head_tail (bb
, &head
, &tail
);
4875 && (GET_RTX_CLASS (GET_CODE (head
)) != 'i'))
4878 next_tail
= NEXT_INSN (tail
);
4879 for (insn
= head
; insn
!= next_tail
; insn
= NEXT_INSN (insn
))
4883 /* Farm out notes, and maybe save them in NOTE_LIST.
4884 This is needed to keep the debugger from
4885 getting completely deranged. */
4886 if (GET_CODE (insn
) == NOTE
)
4889 insn
= unlink_line_notes (insn
, next_tail
);
4895 if (insn
== next_tail
)
4901 /* Save line number notes for each insn in bb. */
4904 save_line_notes (bb
)
4910 /* We must use the true line number for the first insn in the block
4911 that was computed and saved at the start of this pass. We can't
4912 use the current line number, because scheduling of the previous
4913 block may have changed the current line number. */
4915 rtx line
= line_note_head
[BB_TO_BLOCK (bb
)];
4918 get_block_head_tail (bb
, &head
, &tail
);
4919 next_tail
= NEXT_INSN (tail
);
4921 for (insn
= BLOCK_HEAD (BB_TO_BLOCK (bb
));
4923 insn
= NEXT_INSN (insn
))
4924 if (GET_CODE (insn
) == NOTE
&& NOTE_LINE_NUMBER (insn
) > 0)
4927 LINE_NOTE (insn
) = line
;
4931 /* After bb was scheduled, insert line notes into the insns list. */
4934 restore_line_notes (bb
)
4937 rtx line
, note
, prev
, new;
4938 int added_notes
= 0;
4940 rtx head
, next_tail
, insn
;
4942 b
= BB_TO_BLOCK (bb
);
4944 head
= BLOCK_HEAD (b
);
4945 next_tail
= NEXT_INSN (BLOCK_END (b
));
4947 /* Determine the current line-number. We want to know the current
4948 line number of the first insn of the block here, in case it is
4949 different from the true line number that was saved earlier. If
4950 different, then we need a line number note before the first insn
4951 of this block. If it happens to be the same, then we don't want to
4952 emit another line number note here. */
4953 for (line
= head
; line
; line
= PREV_INSN (line
))
4954 if (GET_CODE (line
) == NOTE
&& NOTE_LINE_NUMBER (line
) > 0)
4957 /* Walk the insns keeping track of the current line-number and inserting
4958 the line-number notes as needed. */
4959 for (insn
= head
; insn
!= next_tail
; insn
= NEXT_INSN (insn
))
4960 if (GET_CODE (insn
) == NOTE
&& NOTE_LINE_NUMBER (insn
) > 0)
4962 /* This used to emit line number notes before every non-deleted note.
4963 However, this confuses a debugger, because line notes not separated
4964 by real instructions all end up at the same address. I can find no
4965 use for line number notes before other notes, so none are emitted. */
4966 else if (GET_CODE (insn
) != NOTE
4967 && (note
= LINE_NOTE (insn
)) != 0
4970 || NOTE_LINE_NUMBER (note
) != NOTE_LINE_NUMBER (line
)
4971 || NOTE_SOURCE_FILE (note
) != NOTE_SOURCE_FILE (line
)))
4974 prev
= PREV_INSN (insn
);
4975 if (LINE_NOTE (note
))
4977 /* Re-use the original line-number note. */
4978 LINE_NOTE (note
) = 0;
4979 PREV_INSN (note
) = prev
;
4980 NEXT_INSN (prev
) = note
;
4981 PREV_INSN (insn
) = note
;
4982 NEXT_INSN (note
) = insn
;
4987 new = emit_note_after (NOTE_LINE_NUMBER (note
), prev
);
4988 NOTE_SOURCE_FILE (new) = NOTE_SOURCE_FILE (note
);
4989 RTX_INTEGRATED_P (new) = RTX_INTEGRATED_P (note
);
4992 if (sched_verbose
&& added_notes
)
4993 fprintf (dump
, ";; added %d line-number notes\n", added_notes
);
4996 /* After scheduling the function, delete redundant line notes from the
5000 rm_redundant_line_notes ()
5003 rtx insn
= get_insns ();
5004 int active_insn
= 0;
5007 /* Walk the insns deleting redundant line-number notes. Many of these
5008 are already present. The remainder tend to occur at basic
5009 block boundaries. */
5010 for (insn
= get_last_insn (); insn
; insn
= PREV_INSN (insn
))
5011 if (GET_CODE (insn
) == NOTE
&& NOTE_LINE_NUMBER (insn
) > 0)
5013 /* If there are no active insns following, INSN is redundant. */
5014 if (active_insn
== 0)
5017 NOTE_SOURCE_FILE (insn
) = 0;
5018 NOTE_LINE_NUMBER (insn
) = NOTE_INSN_DELETED
;
5020 /* If the line number is unchanged, LINE is redundant. */
5022 && NOTE_LINE_NUMBER (line
) == NOTE_LINE_NUMBER (insn
)
5023 && NOTE_SOURCE_FILE (line
) == NOTE_SOURCE_FILE (insn
))
5026 NOTE_SOURCE_FILE (line
) = 0;
5027 NOTE_LINE_NUMBER (line
) = NOTE_INSN_DELETED
;
5034 else if (!((GET_CODE (insn
) == NOTE
5035 && NOTE_LINE_NUMBER (insn
) == NOTE_INSN_DELETED
)
5036 || (GET_CODE (insn
) == INSN
5037 && (GET_CODE (PATTERN (insn
)) == USE
5038 || GET_CODE (PATTERN (insn
)) == CLOBBER
))))
5041 if (sched_verbose
&& notes
)
5042 fprintf (dump
, ";; deleted %d line-number notes\n", notes
);
5045 /* Delete notes between head and tail and put them in the chain
5046 of notes ended by NOTE_LIST. */
5049 rm_other_notes (head
, tail
)
5057 && (GET_RTX_CLASS (GET_CODE (head
)) != 'i'))
5060 next_tail
= NEXT_INSN (tail
);
5061 for (insn
= head
; insn
!= next_tail
; insn
= NEXT_INSN (insn
))
5065 /* Farm out notes, and maybe save them in NOTE_LIST.
5066 This is needed to keep the debugger from
5067 getting completely deranged. */
5068 if (GET_CODE (insn
) == NOTE
)
5072 insn
= unlink_other_notes (insn
, next_tail
);
5078 if (insn
== next_tail
)
5084 /* Constructor for `sometimes' data structure. */
5087 new_sometimes_live (regs_sometimes_live
, regno
, sometimes_max
)
5088 struct sometimes
*regs_sometimes_live
;
5092 register struct sometimes
*p
;
5094 /* There should never be a register greater than max_regno here. If there
5095 is, it means that a define_split has created a new pseudo reg. This
5096 is not allowed, since there will not be flow info available for any
5097 new register, so catch the error here. */
5098 if (regno
>= max_regno
)
5101 p
= ®s_sometimes_live
[sometimes_max
];
5104 p
->calls_crossed
= 0;
5106 return sometimes_max
;
5109 /* Count lengths of all regs we are currently tracking,
5110 and find new registers no longer live. */
5113 finish_sometimes_live (regs_sometimes_live
, sometimes_max
)
5114 struct sometimes
*regs_sometimes_live
;
5119 for (i
= 0; i
< sometimes_max
; i
++)
5121 register struct sometimes
*p
= ®s_sometimes_live
[i
];
5122 int regno
= p
->regno
;
5124 sched_reg_live_length
[regno
] += p
->live_length
;
5125 sched_reg_n_calls_crossed
[regno
] += p
->calls_crossed
;
5129 /* Functions for computation of registers live/usage info. */
5131 /* It is assumed that prior to scheduling BASIC_BLOCK (b)->global_live_at_start
5132 contains the registers that are alive at the entry to b.
5134 Two passes follow: The first pass is performed before the scheduling
5135 of a region. It scans each block of the region forward, computing
5136 the set of registers alive at the end of the basic block and
5137 discard REG_DEAD notes (done by find_pre_sched_live ()).
5139 The second path is invoked after scheduling all region blocks.
5140 It scans each block of the region backward, a block being traversed
5141 only after its succesors in the region. When the set of registers
5142 live at the end of a basic block may be changed by the scheduling
5143 (this may happen for multiple blocks region), it is computed as
5144 the union of the registers live at the start of its succesors.
5145 The last-use information is updated by inserting REG_DEAD notes.
5146 (done by find_post_sched_live ()) */
5148 /* Scan all the insns to be scheduled, removing register death notes.
5149 Register death notes end up in DEAD_NOTES.
5150 Recreate the register life information for the end of this basic
5154 find_pre_sched_live (bb
)
5157 rtx insn
, next_tail
, head
, tail
;
5158 int b
= BB_TO_BLOCK (bb
);
5160 get_block_head_tail (bb
, &head
, &tail
);
5161 COPY_REG_SET (bb_live_regs
, BASIC_BLOCK (b
)->global_live_at_start
);
5162 next_tail
= NEXT_INSN (tail
);
5164 for (insn
= head
; insn
!= next_tail
; insn
= NEXT_INSN (insn
))
5166 rtx prev
, next
, link
;
5169 /* Handle register life information. */
5170 if (GET_RTX_CLASS (GET_CODE (insn
)) == 'i')
5172 /* See if the register gets born here. */
5173 /* We must check for registers being born before we check for
5174 registers dying. It is possible for a register to be born and
5175 die in the same insn, e.g. reading from a volatile memory
5176 location into an otherwise unused register. Such a register
5177 must be marked as dead after this insn. */
5178 if (GET_CODE (PATTERN (insn
)) == SET
5179 || GET_CODE (PATTERN (insn
)) == CLOBBER
)
5181 sched_note_set (PATTERN (insn
), 0);
5185 else if (GET_CODE (PATTERN (insn
)) == PARALLEL
)
5188 for (j
= XVECLEN (PATTERN (insn
), 0) - 1; j
>= 0; j
--)
5189 if (GET_CODE (XVECEXP (PATTERN (insn
), 0, j
)) == SET
5190 || GET_CODE (XVECEXP (PATTERN (insn
), 0, j
)) == CLOBBER
)
5192 sched_note_set (XVECEXP (PATTERN (insn
), 0, j
), 0);
5196 /* ??? This code is obsolete and should be deleted. It
5197 is harmless though, so we will leave it in for now. */
5198 for (j
= XVECLEN (PATTERN (insn
), 0) - 1; j
>= 0; j
--)
5199 if (GET_CODE (XVECEXP (PATTERN (insn
), 0, j
)) == USE
)
5200 sched_note_set (XVECEXP (PATTERN (insn
), 0, j
), 0);
5203 /* Each call cobbers (makes live) all call-clobbered regs
5204 that are not global or fixed. Note that the function-value
5205 reg is a call_clobbered reg. */
5206 if (GET_CODE (insn
) == CALL_INSN
)
5209 for (j
= 0; j
< FIRST_PSEUDO_REGISTER
; j
++)
5210 if (call_used_regs
[j
] && !global_regs
[j
]
5213 SET_REGNO_REG_SET (bb_live_regs
, j
);
5217 /* Need to know what registers this insn kills. */
5218 for (prev
= 0, link
= REG_NOTES (insn
); link
; link
= next
)
5220 next
= XEXP (link
, 1);
5221 if ((REG_NOTE_KIND (link
) == REG_DEAD
5222 || REG_NOTE_KIND (link
) == REG_UNUSED
)
5223 /* Verify that the REG_NOTE has a valid value. */
5224 && GET_CODE (XEXP (link
, 0)) == REG
)
5226 register int regno
= REGNO (XEXP (link
, 0));
5230 /* Only unlink REG_DEAD notes; leave REG_UNUSED notes
5232 if (REG_NOTE_KIND (link
) == REG_DEAD
)
5235 XEXP (prev
, 1) = next
;
5237 REG_NOTES (insn
) = next
;
5238 XEXP (link
, 1) = dead_notes
;
5244 if (regno
< FIRST_PSEUDO_REGISTER
)
5246 int j
= HARD_REGNO_NREGS (regno
,
5247 GET_MODE (XEXP (link
, 0)));
5250 CLEAR_REGNO_REG_SET (bb_live_regs
, regno
+j
);
5255 CLEAR_REGNO_REG_SET (bb_live_regs
, regno
);
5263 INSN_REG_WEIGHT (insn
) = reg_weight
;
5267 /* Update register life and usage information for block bb
5268 after scheduling. Put register dead notes back in the code. */
5271 find_post_sched_live (bb
)
5278 rtx head
, tail
, prev_head
, next_tail
;
5280 register struct sometimes
*regs_sometimes_live
;
5282 b
= BB_TO_BLOCK (bb
);
5284 /* Compute live regs at the end of bb as a function of its successors. */
5285 if (current_nr_blocks
> 1)
5290 first_edge
= e
= OUT_EDGES (b
);
5291 CLEAR_REG_SET (bb_live_regs
);
5298 b_succ
= TO_BLOCK (e
);
5299 IOR_REG_SET (bb_live_regs
,
5300 BASIC_BLOCK (b_succ
)->global_live_at_start
);
5303 while (e
!= first_edge
);
5306 get_block_head_tail (bb
, &head
, &tail
);
5307 next_tail
= NEXT_INSN (tail
);
5308 prev_head
= PREV_INSN (head
);
5310 EXECUTE_IF_SET_IN_REG_SET (bb_live_regs
, FIRST_PSEUDO_REGISTER
, i
,
5312 sched_reg_basic_block
[i
] = REG_BLOCK_GLOBAL
;
5315 /* If the block is empty, same regs are alive at its end and its start.
5316 since this is not guaranteed after interblock scheduling, make sure they
5317 are truly identical. */
5318 if (NEXT_INSN (prev_head
) == tail
5319 && (GET_RTX_CLASS (GET_CODE (tail
)) != 'i'))
5321 if (current_nr_blocks
> 1)
5322 COPY_REG_SET (BASIC_BLOCK (b
)->global_live_at_start
, bb_live_regs
);
5327 b
= BB_TO_BLOCK (bb
);
5328 current_block_num
= b
;
5330 /* Keep track of register lives. */
5331 old_live_regs
= ALLOCA_REG_SET ();
5333 = (struct sometimes
*) alloca (max_regno
* sizeof (struct sometimes
));
5336 /* Initiate "sometimes" data, starting with registers live at end. */
5338 COPY_REG_SET (old_live_regs
, bb_live_regs
);
5339 EXECUTE_IF_SET_IN_REG_SET (bb_live_regs
, 0, j
,
5342 = new_sometimes_live (regs_sometimes_live
,
5346 /* Scan insns back, computing regs live info. */
5347 for (insn
= tail
; insn
!= prev_head
; insn
= PREV_INSN (insn
))
5349 /* First we kill registers set by this insn, and then we
5350 make registers used by this insn live. This is the opposite
5351 order used above because we are traversing the instructions
5354 /* Strictly speaking, we should scan REG_UNUSED notes and make
5355 every register mentioned there live, however, we will just
5356 kill them again immediately below, so there doesn't seem to
5357 be any reason why we bother to do this. */
5359 /* See if this is the last notice we must take of a register. */
5360 if (GET_RTX_CLASS (GET_CODE (insn
)) != 'i')
5363 if (GET_CODE (PATTERN (insn
)) == SET
5364 || GET_CODE (PATTERN (insn
)) == CLOBBER
)
5365 sched_note_set (PATTERN (insn
), 1);
5366 else if (GET_CODE (PATTERN (insn
)) == PARALLEL
)
5368 for (j
= XVECLEN (PATTERN (insn
), 0) - 1; j
>= 0; j
--)
5369 if (GET_CODE (XVECEXP (PATTERN (insn
), 0, j
)) == SET
5370 || GET_CODE (XVECEXP (PATTERN (insn
), 0, j
)) == CLOBBER
)
5371 sched_note_set (XVECEXP (PATTERN (insn
), 0, j
), 1);
5374 /* This code keeps life analysis information up to date. */
5375 if (GET_CODE (insn
) == CALL_INSN
)
5377 register struct sometimes
*p
;
5379 /* A call kills all call used registers that are not
5380 global or fixed, except for those mentioned in the call
5381 pattern which will be made live again later. */
5382 for (i
= 0; i
< FIRST_PSEUDO_REGISTER
; i
++)
5383 if (call_used_regs
[i
] && ! global_regs
[i
]
5386 CLEAR_REGNO_REG_SET (bb_live_regs
, i
);
5389 /* Regs live at the time of a call instruction must not
5390 go in a register clobbered by calls. Record this for
5391 all regs now live. Note that insns which are born or
5392 die in a call do not cross a call, so this must be done
5393 after the killings (above) and before the births
5395 p
= regs_sometimes_live
;
5396 for (i
= 0; i
< sometimes_max
; i
++, p
++)
5397 if (REGNO_REG_SET_P (bb_live_regs
, p
->regno
))
5398 p
->calls_crossed
+= 1;
5401 /* Make every register used live, and add REG_DEAD notes for
5402 registers which were not live before we started. */
5403 attach_deaths_insn (insn
);
5405 /* Find registers now made live by that instruction. */
5406 EXECUTE_IF_AND_COMPL_IN_REG_SET (bb_live_regs
, old_live_regs
, 0, j
,
5409 = new_sometimes_live (regs_sometimes_live
,
5412 IOR_REG_SET (old_live_regs
, bb_live_regs
);
5414 /* Count lengths of all regs we are worrying about now,
5415 and handle registers no longer live. */
5417 for (i
= 0; i
< sometimes_max
; i
++)
5419 register struct sometimes
*p
= ®s_sometimes_live
[i
];
5420 int regno
= p
->regno
;
5422 p
->live_length
+= 1;
5424 if (!REGNO_REG_SET_P (bb_live_regs
, regno
))
5426 /* This is the end of one of this register's lifetime
5427 segments. Save the lifetime info collected so far,
5428 and clear its bit in the old_live_regs entry. */
5429 sched_reg_live_length
[regno
] += p
->live_length
;
5430 sched_reg_n_calls_crossed
[regno
] += p
->calls_crossed
;
5431 CLEAR_REGNO_REG_SET (old_live_regs
, p
->regno
);
5433 /* Delete the reg_sometimes_live entry for this reg by
5434 copying the last entry over top of it. */
5435 *p
= regs_sometimes_live
[--sometimes_max
];
5436 /* ...and decrement i so that this newly copied entry
5437 will be processed. */
5443 finish_sometimes_live (regs_sometimes_live
, sometimes_max
);
5445 /* In interblock scheduling, global_live_at_start may have changed. */
5446 if (current_nr_blocks
> 1)
5447 COPY_REG_SET (BASIC_BLOCK (b
)->global_live_at_start
, bb_live_regs
);
5450 FREE_REG_SET (old_live_regs
);
5451 } /* find_post_sched_live */
5453 /* After scheduling the subroutine, restore information about uses of
5461 if (n_basic_blocks
> 0)
5462 EXECUTE_IF_SET_IN_REG_SET (bb_live_regs
, FIRST_PSEUDO_REGISTER
, regno
,
5464 sched_reg_basic_block
[regno
]
5468 for (regno
= 0; regno
< max_regno
; regno
++)
5469 if (sched_reg_live_length
[regno
])
5473 if (REG_LIVE_LENGTH (regno
) > sched_reg_live_length
[regno
])
5475 ";; register %d life shortened from %d to %d\n",
5476 regno
, REG_LIVE_LENGTH (regno
),
5477 sched_reg_live_length
[regno
]);
5478 /* Negative values are special; don't overwrite the current
5479 reg_live_length value if it is negative. */
5480 else if (REG_LIVE_LENGTH (regno
) < sched_reg_live_length
[regno
]
5481 && REG_LIVE_LENGTH (regno
) >= 0)
5483 ";; register %d life extended from %d to %d\n",
5484 regno
, REG_LIVE_LENGTH (regno
),
5485 sched_reg_live_length
[regno
]);
5487 if (!REG_N_CALLS_CROSSED (regno
)
5488 && sched_reg_n_calls_crossed
[regno
])
5490 ";; register %d now crosses calls\n", regno
);
5491 else if (REG_N_CALLS_CROSSED (regno
)
5492 && !sched_reg_n_calls_crossed
[regno
]
5493 && REG_BASIC_BLOCK (regno
) != REG_BLOCK_GLOBAL
)
5495 ";; register %d no longer crosses calls\n", regno
);
5497 if (REG_BASIC_BLOCK (regno
) != sched_reg_basic_block
[regno
]
5498 && sched_reg_basic_block
[regno
] != REG_BLOCK_UNKNOWN
5499 && REG_BASIC_BLOCK(regno
) != REG_BLOCK_UNKNOWN
)
5501 ";; register %d changed basic block from %d to %d\n",
5502 regno
, REG_BASIC_BLOCK(regno
),
5503 sched_reg_basic_block
[regno
]);
5506 /* Negative values are special; don't overwrite the current
5507 reg_live_length value if it is negative. */
5508 if (REG_LIVE_LENGTH (regno
) >= 0)
5509 REG_LIVE_LENGTH (regno
) = sched_reg_live_length
[regno
];
5511 if (sched_reg_basic_block
[regno
] != REG_BLOCK_UNKNOWN
5512 && REG_BASIC_BLOCK(regno
) != REG_BLOCK_UNKNOWN
)
5513 REG_BASIC_BLOCK(regno
) = sched_reg_basic_block
[regno
];
5515 /* We can't change the value of reg_n_calls_crossed to zero for
5516 pseudos which are live in more than one block.
5518 This is because combine might have made an optimization which
5519 invalidated global_live_at_start and reg_n_calls_crossed,
5520 but it does not update them. If we update reg_n_calls_crossed
5521 here, the two variables are now inconsistent, and this might
5522 confuse the caller-save code into saving a register that doesn't
5523 need to be saved. This is only a problem when we zero calls
5524 crossed for a pseudo live in multiple basic blocks.
5526 Alternatively, we could try to correctly update basic block live
5527 at start here in sched, but that seems complicated.
5529 Note: it is possible that a global register became local,
5530 as result of interblock motion, but will remain marked as a
5532 if (sched_reg_n_calls_crossed
[regno
]
5533 || REG_BASIC_BLOCK (regno
) != REG_BLOCK_GLOBAL
)
5534 REG_N_CALLS_CROSSED (regno
) = sched_reg_n_calls_crossed
[regno
];
5539 /* Scheduling clock, modified in schedule_block() and queue_to_ready (). */
5540 static int clock_var
;
5542 /* Move insns that became ready to fire from queue to ready list. */
5545 queue_to_ready (ready
, n_ready
)
5552 q_ptr
= NEXT_Q (q_ptr
);
5554 /* Add all pending insns that can be scheduled without stalls to the
5556 for (link
= insn_queue
[q_ptr
]; link
; link
= XEXP (link
, 1))
5559 insn
= XEXP (link
, 0);
5562 if (sched_verbose
>= 2)
5563 fprintf (dump
, ";;\t\tQ-->Ready: insn %d: ", INSN_UID (insn
));
5565 if (sched_verbose
>= 2 && INSN_BB (insn
) != target_bb
)
5566 fprintf (dump
, "(b%d) ", INSN_BLOCK (insn
));
5568 ready
[n_ready
++] = insn
;
5569 if (sched_verbose
>= 2)
5570 fprintf (dump
, "moving to ready without stalls\n");
5572 insn_queue
[q_ptr
] = 0;
5574 /* If there are no ready insns, stall until one is ready and add all
5575 of the pending insns at that point to the ready list. */
5578 register int stalls
;
5580 for (stalls
= 1; stalls
< INSN_QUEUE_SIZE
; stalls
++)
5582 if ((link
= insn_queue
[NEXT_Q_AFTER (q_ptr
, stalls
)]))
5584 for (; link
; link
= XEXP (link
, 1))
5586 insn
= XEXP (link
, 0);
5589 if (sched_verbose
>= 2)
5590 fprintf (dump
, ";;\t\tQ-->Ready: insn %d: ", INSN_UID (insn
));
5592 if (sched_verbose
>= 2 && INSN_BB (insn
) != target_bb
)
5593 fprintf (dump
, "(b%d) ", INSN_BLOCK (insn
));
5595 ready
[n_ready
++] = insn
;
5596 if (sched_verbose
>= 2)
5597 fprintf (dump
, "moving to ready with %d stalls\n", stalls
);
5599 insn_queue
[NEXT_Q_AFTER (q_ptr
, stalls
)] = 0;
5606 if (sched_verbose
&& stalls
)
5607 visualize_stall_cycles (BB_TO_BLOCK (target_bb
), stalls
);
5608 q_ptr
= NEXT_Q_AFTER (q_ptr
, stalls
);
5609 clock_var
+= stalls
;
5614 /* Print the ready list for debugging purposes. Callable from debugger. */
5617 debug_ready_list (ready
, n_ready
)
5623 for (i
= 0; i
< n_ready
; i
++)
5625 fprintf (dump
, " %d", INSN_UID (ready
[i
]));
5626 if (current_nr_blocks
> 1 && INSN_BB (ready
[i
]) != target_bb
)
5627 fprintf (dump
, "/b%d", INSN_BLOCK (ready
[i
]));
5629 fprintf (dump
, "\n");
5632 /* Print names of units on which insn can/should execute, for debugging. */
5635 insn_print_units (insn
)
5639 int unit
= insn_unit (insn
);
5642 fprintf (dump
, "none");
5644 fprintf (dump
, "%s", function_units
[unit
].name
);
5647 fprintf (dump
, "[");
5648 for (i
= 0, unit
= ~unit
; unit
; i
++, unit
>>= 1)
5651 fprintf (dump
, "%s", function_units
[i
].name
);
5653 fprintf (dump
, " ");
5655 fprintf (dump
, "]");
5659 /* MAX_VISUAL_LINES is the maximum number of lines in visualization table
5660 of a basic block. If more lines are needed, table is splitted to two.
5661 n_visual_lines is the number of lines printed so far for a block.
5662 visual_tbl contains the block visualization info.
5663 vis_no_unit holds insns in a cycle that are not mapped to any unit. */
5664 #define MAX_VISUAL_LINES 100
5669 rtx vis_no_unit
[10];
5671 /* Finds units that are in use in this fuction. Required only
5672 for visualization. */
5675 init_target_units ()
5680 for (insn
= get_last_insn (); insn
; insn
= PREV_INSN (insn
))
5682 if (GET_RTX_CLASS (GET_CODE (insn
)) != 'i')
5685 unit
= insn_unit (insn
);
5688 target_units
|= ~unit
;
5690 target_units
|= (1 << unit
);
5694 /* Return the length of the visualization table. */
5697 get_visual_tbl_length ()
5703 /* Compute length of one field in line. */
5704 s
= (char *) alloca (INSN_LEN
+ 6);
5705 sprintf (s
, " %33s", "uname");
5708 /* Compute length of one line. */
5711 for (unit
= 0; unit
< FUNCTION_UNITS_SIZE
; unit
++)
5712 if (function_units
[unit
].bitmask
& target_units
)
5713 for (i
= 0; i
< function_units
[unit
].multiplicity
; i
++)
5716 n
+= strlen ("\n") + 2;
5718 /* Compute length of visualization string. */
5719 return (MAX_VISUAL_LINES
* n
);
5722 /* Init block visualization debugging info. */
5725 init_block_visualization ()
5727 strcpy (visual_tbl
, "");
5735 safe_concat (buf
, cur
, str
)
5740 char *end
= buf
+ BUF_LEN
- 2; /* Leave room for null. */
5749 while (cur
< end
&& (c
= *str
++) != '\0')
5756 /* This recognizes rtx, I classified as expressions. These are always
5757 represent some action on values or results of other expression, that
5758 may be stored in objects representing values. */
5761 print_exp (buf
, x
, verbose
)
5769 const char *fun
= (char *)0;
5774 for (i
= 0; i
< 4; i
++)
5780 switch (GET_CODE (x
))
5783 op
[0] = XEXP (x
, 0);
5784 if (GET_CODE (XEXP (x
, 1)) == CONST_INT
5785 && INTVAL (XEXP (x
, 1)) < 0)
5788 op
[1] = GEN_INT (-INTVAL (XEXP (x
, 1)));
5793 op
[1] = XEXP (x
, 1);
5797 op
[0] = XEXP (x
, 0);
5799 op
[1] = XEXP (x
, 1);
5803 op
[0] = XEXP (x
, 0);
5805 op
[1] = XEXP (x
, 1);
5809 op
[0] = XEXP (x
, 0);
5810 op
[1] = XEXP (x
, 1);
5814 op
[0] = XEXP (x
, 0);
5817 op
[0] = XEXP (x
, 0);
5819 op
[1] = XEXP (x
, 1);
5822 op
[0] = XEXP (x
, 0);
5824 op
[1] = XEXP (x
, 1);
5828 op
[0] = XEXP (x
, 0);
5829 op
[1] = XEXP (x
, 1);
5832 op
[0] = XEXP (x
, 0);
5834 op
[1] = XEXP (x
, 1);
5838 op
[0] = XEXP (x
, 0);
5839 op
[1] = XEXP (x
, 1);
5843 op
[0] = XEXP (x
, 0);
5844 op
[1] = XEXP (x
, 1);
5848 op
[0] = XEXP (x
, 0);
5849 op
[1] = XEXP (x
, 1);
5853 op
[0] = XEXP (x
, 0);
5854 op
[1] = XEXP (x
, 1);
5858 op
[0] = XEXP (x
, 0);
5859 op
[1] = XEXP (x
, 1);
5863 op
[0] = XEXP (x
, 0);
5866 op
[0] = XEXP (x
, 0);
5868 op
[1] = XEXP (x
, 1);
5871 op
[0] = XEXP (x
, 0);
5873 op
[1] = XEXP (x
, 1);
5876 op
[0] = XEXP (x
, 0);
5878 op
[1] = XEXP (x
, 1);
5881 op
[0] = XEXP (x
, 0);
5883 op
[1] = XEXP (x
, 1);
5886 op
[0] = XEXP (x
, 0);
5888 op
[1] = XEXP (x
, 1);
5891 op
[0] = XEXP (x
, 0);
5893 op
[1] = XEXP (x
, 1);
5896 op
[0] = XEXP (x
, 0);
5898 op
[1] = XEXP (x
, 1);
5901 op
[0] = XEXP (x
, 0);
5903 op
[1] = XEXP (x
, 1);
5907 op
[0] = XEXP (x
, 0);
5911 op
[0] = XEXP (x
, 0);
5915 op
[0] = XEXP (x
, 0);
5918 op
[0] = XEXP (x
, 0);
5920 op
[1] = XEXP (x
, 1);
5923 op
[0] = XEXP (x
, 0);
5925 op
[1] = XEXP (x
, 1);
5928 op
[0] = XEXP (x
, 0);
5930 op
[1] = XEXP (x
, 1);
5934 op
[0] = XEXP (x
, 0);
5935 op
[1] = XEXP (x
, 1);
5938 op
[0] = XEXP (x
, 0);
5940 op
[1] = XEXP (x
, 1);
5944 op
[0] = XEXP (x
, 0);
5945 op
[1] = XEXP (x
, 1);
5948 op
[0] = XEXP (x
, 0);
5950 op
[1] = XEXP (x
, 1);
5954 op
[0] = XEXP (x
, 0);
5955 op
[1] = XEXP (x
, 1);
5958 op
[0] = XEXP (x
, 0);
5960 op
[1] = XEXP (x
, 1);
5964 op
[0] = XEXP (x
, 0);
5965 op
[1] = XEXP (x
, 1);
5968 fun
= (verbose
) ? "sign_extract" : "sxt";
5969 op
[0] = XEXP (x
, 0);
5970 op
[1] = XEXP (x
, 1);
5971 op
[2] = XEXP (x
, 2);
5974 fun
= (verbose
) ? "zero_extract" : "zxt";
5975 op
[0] = XEXP (x
, 0);
5976 op
[1] = XEXP (x
, 1);
5977 op
[2] = XEXP (x
, 2);
5980 fun
= (verbose
) ? "sign_extend" : "sxn";
5981 op
[0] = XEXP (x
, 0);
5984 fun
= (verbose
) ? "zero_extend" : "zxn";
5985 op
[0] = XEXP (x
, 0);
5988 fun
= (verbose
) ? "float_extend" : "fxn";
5989 op
[0] = XEXP (x
, 0);
5992 fun
= (verbose
) ? "trunc" : "trn";
5993 op
[0] = XEXP (x
, 0);
5995 case FLOAT_TRUNCATE
:
5996 fun
= (verbose
) ? "float_trunc" : "ftr";
5997 op
[0] = XEXP (x
, 0);
6000 fun
= (verbose
) ? "float" : "flt";
6001 op
[0] = XEXP (x
, 0);
6003 case UNSIGNED_FLOAT
:
6004 fun
= (verbose
) ? "uns_float" : "ufl";
6005 op
[0] = XEXP (x
, 0);
6009 op
[0] = XEXP (x
, 0);
6012 fun
= (verbose
) ? "uns_fix" : "ufx";
6013 op
[0] = XEXP (x
, 0);
6017 op
[0] = XEXP (x
, 0);
6021 op
[0] = XEXP (x
, 0);
6024 op
[0] = XEXP (x
, 0);
6028 op
[0] = XEXP (x
, 0);
6033 op
[0] = XEXP (x
, 0);
6037 op
[1] = XEXP (x
, 1);
6042 op
[0] = XEXP (x
, 0);
6044 op
[1] = XEXP (x
, 1);
6046 op
[2] = XEXP (x
, 2);
6051 op
[0] = TRAP_CONDITION (x
);
6054 case UNSPEC_VOLATILE
:
6056 cur
= safe_concat (buf
, cur
, "unspec");
6057 if (GET_CODE (x
) == UNSPEC_VOLATILE
)
6058 cur
= safe_concat (buf
, cur
, "/v");
6059 cur
= safe_concat (buf
, cur
, "[");
6061 for (i
= 0; i
< XVECLEN (x
, 0); i
++)
6063 print_pattern (tmp
, XVECEXP (x
, 0, i
), verbose
);
6064 cur
= safe_concat (buf
, cur
, sep
);
6065 cur
= safe_concat (buf
, cur
, tmp
);
6068 cur
= safe_concat (buf
, cur
, "] ");
6069 sprintf (tmp
, "%d", XINT (x
, 1));
6070 cur
= safe_concat (buf
, cur
, tmp
);
6074 /* If (verbose) debug_rtx (x); */
6075 st
[0] = GET_RTX_NAME (GET_CODE (x
));
6079 /* Print this as a function? */
6082 cur
= safe_concat (buf
, cur
, fun
);
6083 cur
= safe_concat (buf
, cur
, "(");
6086 for (i
= 0; i
< 4; i
++)
6089 cur
= safe_concat (buf
, cur
, st
[i
]);
6094 cur
= safe_concat (buf
, cur
, ",");
6096 print_value (tmp
, op
[i
], verbose
);
6097 cur
= safe_concat (buf
, cur
, tmp
);
6102 cur
= safe_concat (buf
, cur
, ")");
6105 /* Prints rtxes, I customly classified as values. They're constants,
6106 registers, labels, symbols and memory accesses. */
6109 print_value (buf
, x
, verbose
)
6117 switch (GET_CODE (x
))
6120 sprintf (t
, HOST_WIDE_INT_PRINT_HEX
, INTVAL (x
));
6121 cur
= safe_concat (buf
, cur
, t
);
6124 sprintf (t
, "<0x%lx,0x%lx>", (long)XWINT (x
, 2), (long)XWINT (x
, 3));
6125 cur
= safe_concat (buf
, cur
, t
);
6128 cur
= safe_concat (buf
, cur
, "\"");
6129 cur
= safe_concat (buf
, cur
, XSTR (x
, 0));
6130 cur
= safe_concat (buf
, cur
, "\"");
6133 cur
= safe_concat (buf
, cur
, "`");
6134 cur
= safe_concat (buf
, cur
, XSTR (x
, 0));
6135 cur
= safe_concat (buf
, cur
, "'");
6138 sprintf (t
, "L%d", INSN_UID (XEXP (x
, 0)));
6139 cur
= safe_concat (buf
, cur
, t
);
6142 print_value (t
, XEXP (x
, 0), verbose
);
6143 cur
= safe_concat (buf
, cur
, "const(");
6144 cur
= safe_concat (buf
, cur
, t
);
6145 cur
= safe_concat (buf
, cur
, ")");
6148 print_value (t
, XEXP (x
, 0), verbose
);
6149 cur
= safe_concat (buf
, cur
, "high(");
6150 cur
= safe_concat (buf
, cur
, t
);
6151 cur
= safe_concat (buf
, cur
, ")");
6154 if (REGNO (x
) < FIRST_PSEUDO_REGISTER
)
6156 int c
= reg_names
[ REGNO (x
) ][0];
6157 if (c
>= '0' && c
<= '9')
6158 cur
= safe_concat (buf
, cur
, "%");
6160 cur
= safe_concat (buf
, cur
, reg_names
[ REGNO (x
) ]);
6164 sprintf (t
, "r%d", REGNO (x
));
6165 cur
= safe_concat (buf
, cur
, t
);
6169 print_value (t
, SUBREG_REG (x
), verbose
);
6170 cur
= safe_concat (buf
, cur
, t
);
6171 sprintf (t
, "#%d", SUBREG_WORD (x
));
6172 cur
= safe_concat (buf
, cur
, t
);
6175 cur
= safe_concat (buf
, cur
, "scratch");
6178 cur
= safe_concat (buf
, cur
, "cc0");
6181 cur
= safe_concat (buf
, cur
, "pc");
6184 print_value (t
, XEXP (x
, 0), verbose
);
6185 cur
= safe_concat (buf
, cur
, "[");
6186 cur
= safe_concat (buf
, cur
, t
);
6187 cur
= safe_concat (buf
, cur
, "]");
6190 print_exp (t
, x
, verbose
);
6191 cur
= safe_concat (buf
, cur
, t
);
6196 /* The next step in insn detalization, its pattern recognition. */
6199 print_pattern (buf
, x
, verbose
)
6204 char t1
[BUF_LEN
], t2
[BUF_LEN
], t3
[BUF_LEN
];
6206 switch (GET_CODE (x
))
6209 print_value (t1
, SET_DEST (x
), verbose
);
6210 print_value (t2
, SET_SRC (x
), verbose
);
6211 sprintf (buf
, "%s=%s", t1
, t2
);
6214 sprintf (buf
, "return");
6217 print_exp (buf
, x
, verbose
);
6220 print_value (t1
, XEXP (x
, 0), verbose
);
6221 sprintf (buf
, "clobber %s", t1
);
6224 print_value (t1
, XEXP (x
, 0), verbose
);
6225 sprintf (buf
, "use %s", t1
);
6232 for (i
= 0; i
< XVECLEN (x
, 0); i
++)
6234 print_pattern (t2
, XVECEXP (x
, 0, i
), verbose
);
6235 sprintf (t3
, "%s%s;", t1
, t2
);
6238 sprintf (buf
, "%s}", t1
);
6245 sprintf (t1
, "%%{");
6246 for (i
= 0; i
< XVECLEN (x
, 0); i
++)
6248 print_insn (t2
, XVECEXP (x
, 0, i
), verbose
);
6249 sprintf (t3
, "%s%s;", t1
, t2
);
6252 sprintf (buf
, "%s%%}", t1
);
6256 sprintf (buf
, "asm {%s}", XSTR (x
, 0));
6261 print_value (buf
, XEXP (x
, 0), verbose
);
6264 print_value (t1
, TRAP_CONDITION (x
), verbose
);
6265 sprintf (buf
, "trap_if %s", t1
);
6271 sprintf (t1
, "unspec{");
6272 for (i
= 0; i
< XVECLEN (x
, 0); i
++)
6274 print_pattern (t2
, XVECEXP (x
, 0, i
), verbose
);
6275 sprintf (t3
, "%s%s;", t1
, t2
);
6278 sprintf (buf
, "%s}", t1
);
6281 case UNSPEC_VOLATILE
:
6285 sprintf (t1
, "unspec/v{");
6286 for (i
= 0; i
< XVECLEN (x
, 0); i
++)
6288 print_pattern (t2
, XVECEXP (x
, 0, i
), verbose
);
6289 sprintf (t3
, "%s%s;", t1
, t2
);
6292 sprintf (buf
, "%s}", t1
);
6296 print_value (buf
, x
, verbose
);
6298 } /* print_pattern */
6300 /* This is the main function in rtl visualization mechanism. It
6301 accepts an rtx and tries to recognize it as an insn, then prints it
6302 properly in human readable form, resembling assembler mnemonics.
6303 For every insn it prints its UID and BB the insn belongs too.
6304 (Probably the last "option" should be extended somehow, since it
6305 depends now on sched.c inner variables ...) */
6308 print_insn (buf
, x
, verbose
)
6316 switch (GET_CODE (x
))
6319 print_pattern (t
, PATTERN (x
), verbose
);
6321 sprintf (buf
, "b%d: i% 4d: %s", INSN_BB (x
),
6324 sprintf (buf
, "%-4d %s", INSN_UID (x
), t
);
6327 print_pattern (t
, PATTERN (x
), verbose
);
6329 sprintf (buf
, "b%d: i% 4d: jump %s", INSN_BB (x
),
6332 sprintf (buf
, "%-4d %s", INSN_UID (x
), t
);
6336 if (GET_CODE (x
) == PARALLEL
)
6338 x
= XVECEXP (x
, 0, 0);
6339 print_pattern (t
, x
, verbose
);
6342 strcpy (t
, "call <...>");
6344 sprintf (buf
, "b%d: i% 4d: %s", INSN_BB (insn
),
6345 INSN_UID (insn
), t
);
6347 sprintf (buf
, "%-4d %s", INSN_UID (insn
), t
);
6350 sprintf (buf
, "L%d:", INSN_UID (x
));
6353 sprintf (buf
, "i% 4d: barrier", INSN_UID (x
));
6356 if (NOTE_LINE_NUMBER (x
) > 0)
6357 sprintf (buf
, "%4d note \"%s\" %d", INSN_UID (x
),
6358 NOTE_SOURCE_FILE (x
), NOTE_LINE_NUMBER (x
));
6360 sprintf (buf
, "%4d %s", INSN_UID (x
),
6361 GET_NOTE_INSN_NAME (NOTE_LINE_NUMBER (x
)));
6366 sprintf (buf
, "Not an INSN at all\n");
6370 sprintf (buf
, "i%-4d <What?>", INSN_UID (x
));
6374 /* Print visualization debugging info. */
6377 print_block_visualization (b
, s
)
6384 fprintf (dump
, "\n;; ==================== scheduling visualization for block %d %s \n", b
, s
);
6386 /* Print names of units. */
6387 fprintf (dump
, ";; %-8s", "clock");
6388 for (unit
= 0; unit
< FUNCTION_UNITS_SIZE
; unit
++)
6389 if (function_units
[unit
].bitmask
& target_units
)
6390 for (i
= 0; i
< function_units
[unit
].multiplicity
; i
++)
6391 fprintf (dump
, " %-33s", function_units
[unit
].name
);
6392 fprintf (dump
, " %-8s\n", "no-unit");
6394 fprintf (dump
, ";; %-8s", "=====");
6395 for (unit
= 0; unit
< FUNCTION_UNITS_SIZE
; unit
++)
6396 if (function_units
[unit
].bitmask
& target_units
)
6397 for (i
= 0; i
< function_units
[unit
].multiplicity
; i
++)
6398 fprintf (dump
, " %-33s", "==============================");
6399 fprintf (dump
, " %-8s\n", "=======");
6401 /* Print insns in each cycle. */
6402 fprintf (dump
, "%s\n", visual_tbl
);
6405 /* Print insns in the 'no_unit' column of visualization. */
6408 visualize_no_unit (insn
)
6411 vis_no_unit
[n_vis_no_unit
] = insn
;
6415 /* Print insns scheduled in clock, for visualization. */
6418 visualize_scheduled_insns (b
, clock
)
6423 /* If no more room, split table into two. */
6424 if (n_visual_lines
>= MAX_VISUAL_LINES
)
6426 print_block_visualization (b
, "(incomplete)");
6427 init_block_visualization ();
6432 sprintf (visual_tbl
+ strlen (visual_tbl
), ";; %-8d", clock
);
6433 for (unit
= 0; unit
< FUNCTION_UNITS_SIZE
; unit
++)
6434 if (function_units
[unit
].bitmask
& target_units
)
6435 for (i
= 0; i
< function_units
[unit
].multiplicity
; i
++)
6437 int instance
= unit
+ i
* FUNCTION_UNITS_SIZE
;
6438 rtx insn
= unit_last_insn
[instance
];
6440 /* Print insns that still keep the unit busy. */
6442 actual_hazard_this_instance (unit
, instance
, insn
, clock
, 0))
6445 print_insn (str
, insn
, 0);
6446 str
[INSN_LEN
] = '\0';
6447 sprintf (visual_tbl
+ strlen (visual_tbl
), " %-33s", str
);
6450 sprintf (visual_tbl
+ strlen (visual_tbl
), " %-33s", "------------------------------");
6453 /* Print insns that are not assigned to any unit. */
6454 for (i
= 0; i
< n_vis_no_unit
; i
++)
6455 sprintf (visual_tbl
+ strlen (visual_tbl
), " %-8d",
6456 INSN_UID (vis_no_unit
[i
]));
6459 sprintf (visual_tbl
+ strlen (visual_tbl
), "\n");
6462 /* Print stalled cycles. */
6465 visualize_stall_cycles (b
, stalls
)
6470 /* If no more room, split table into two. */
6471 if (n_visual_lines
>= MAX_VISUAL_LINES
)
6473 print_block_visualization (b
, "(incomplete)");
6474 init_block_visualization ();
6479 sprintf (visual_tbl
+ strlen (visual_tbl
), ";; ");
6480 for (i
= 0; i
< stalls
; i
++)
6481 sprintf (visual_tbl
+ strlen (visual_tbl
), ".");
6482 sprintf (visual_tbl
+ strlen (visual_tbl
), "\n");
6485 /* move_insn1: Remove INSN from insn chain, and link it after LAST insn. */
6488 move_insn1 (insn
, last
)
6491 NEXT_INSN (PREV_INSN (insn
)) = NEXT_INSN (insn
);
6492 PREV_INSN (NEXT_INSN (insn
)) = PREV_INSN (insn
);
6494 NEXT_INSN (insn
) = NEXT_INSN (last
);
6495 PREV_INSN (NEXT_INSN (last
)) = insn
;
6497 NEXT_INSN (last
) = insn
;
6498 PREV_INSN (insn
) = last
;
6503 /* Search INSN for fake REG_DEAD note pairs for NOTE_INSN_SETJMP,
6504 NOTE_INSN_{LOOP,EHREGION}_{BEG,END}; and convert them back into
6505 NOTEs. The REG_DEAD note following first one is contains the saved
6506 value for NOTE_BLOCK_NUMBER which is useful for
6507 NOTE_INSN_EH_REGION_{BEG,END} NOTEs. LAST is the last instruction
6508 output by the instruction scheduler. Return the new value of LAST. */
6511 reemit_notes (insn
, last
)
6518 for (note
= REG_NOTES (insn
); note
; note
= XEXP (note
, 1))
6520 if (REG_NOTE_KIND (note
) == REG_DEAD
6521 && GET_CODE (XEXP (note
, 0)) == CONST_INT
)
6523 int note_type
= INTVAL (XEXP (note
, 0));
6524 if (note_type
== NOTE_INSN_SETJMP
)
6526 retval
= emit_note_after (NOTE_INSN_SETJMP
, insn
);
6527 CONST_CALL_P (retval
) = CONST_CALL_P (note
);
6528 remove_note (insn
, note
);
6529 note
= XEXP (note
, 1);
6531 else if (note_type
== NOTE_INSN_RANGE_START
6532 || note_type
== NOTE_INSN_RANGE_END
)
6534 last
= emit_note_before (note_type
, last
);
6535 remove_note (insn
, note
);
6536 note
= XEXP (note
, 1);
6537 NOTE_RANGE_INFO (last
) = XEXP (note
, 0);
6541 last
= emit_note_before (note_type
, last
);
6542 remove_note (insn
, note
);
6543 note
= XEXP (note
, 1);
6544 if (note_type
== NOTE_INSN_EH_REGION_BEG
6545 || note_type
== NOTE_INSN_EH_REGION_END
)
6546 NOTE_EH_HANDLER (last
) = INTVAL (XEXP (note
, 0));
6548 remove_note (insn
, note
);
6554 /* Move INSN, and all insns which should be issued before it,
6555 due to SCHED_GROUP_P flag. Reemit notes if needed.
6557 Return the last insn emitted by the scheduler, which is the
6558 return value from the first call to reemit_notes. */
6561 move_insn (insn
, last
)
6566 /* If INSN has SCHED_GROUP_P set, then issue it and any other
6567 insns with SCHED_GROUP_P set first. */
6568 while (SCHED_GROUP_P (insn
))
6570 rtx prev
= PREV_INSN (insn
);
6572 /* Move a SCHED_GROUP_P insn. */
6573 move_insn1 (insn
, last
);
6574 /* If this is the first call to reemit_notes, then record
6575 its return value. */
6576 if (retval
== NULL_RTX
)
6577 retval
= reemit_notes (insn
, insn
);
6579 reemit_notes (insn
, insn
);
6583 /* Now move the first non SCHED_GROUP_P insn. */
6584 move_insn1 (insn
, last
);
6586 /* If this is the first call to reemit_notes, then record
6587 its return value. */
6588 if (retval
== NULL_RTX
)
6589 retval
= reemit_notes (insn
, insn
);
6591 reemit_notes (insn
, insn
);
6596 /* Return an insn which represents a SCHED_GROUP, which is
6597 the last insn in the group. */
6608 insn
= next_nonnote_insn (insn
);
6610 while (insn
&& SCHED_GROUP_P (insn
) && (GET_CODE (insn
) != CODE_LABEL
));
6615 /* Use forward list scheduling to rearrange insns of block BB in region RGN,
6616 possibly bringing insns from subsequent blocks in the same region.
6617 Return number of insns scheduled. */
6620 schedule_block (bb
, rgn_n_insns
)
6624 /* Local variables. */
6630 /* Flow block of this bb. */
6631 int b
= BB_TO_BLOCK (bb
);
6633 /* target_n_insns == number of insns in b before scheduling starts.
6634 sched_target_n_insns == how many of b's insns were scheduled.
6635 sched_n_insns == how many insns were scheduled in b. */
6636 int target_n_insns
= 0;
6637 int sched_target_n_insns
= 0;
6638 int sched_n_insns
= 0;
6640 #define NEED_NOTHING 0
6645 /* Head/tail info for this block. */
6652 /* We used to have code to avoid getting parameters moved from hard
6653 argument registers into pseudos.
6655 However, it was removed when it proved to be of marginal benefit
6656 and caused problems because schedule_block and compute_forward_dependences
6657 had different notions of what the "head" insn was. */
6658 get_block_head_tail (bb
, &head
, &tail
);
6660 /* Interblock scheduling could have moved the original head insn from this
6661 block into a proceeding block. This may also cause schedule_block and
6662 compute_forward_dependences to have different notions of what the
6665 If the interblock movement happened to make this block start with
6666 some notes (LOOP, EH or SETJMP) before the first real insn, then
6667 HEAD will have various special notes attached to it which must be
6668 removed so that we don't end up with extra copies of the notes. */
6669 if (GET_RTX_CLASS (GET_CODE (head
)) == 'i')
6673 for (note
= REG_NOTES (head
); note
; note
= XEXP (note
, 1))
6674 if (REG_NOTE_KIND (note
) == REG_DEAD
6675 && GET_CODE (XEXP (note
, 0)) == CONST_INT
)
6676 remove_note (head
, note
);
6679 next_tail
= NEXT_INSN (tail
);
6680 prev_head
= PREV_INSN (head
);
6682 /* If the only insn left is a NOTE or a CODE_LABEL, then there is no need
6683 to schedule this block. */
6685 && (GET_RTX_CLASS (GET_CODE (head
)) != 'i'))
6686 return (sched_n_insns
);
6691 fprintf (dump
, ";; ======================================================\n");
6693 ";; -- basic block %d from %d to %d -- %s reload\n",
6694 b
, INSN_UID (BLOCK_HEAD (b
)), INSN_UID (BLOCK_END (b
)),
6695 (reload_completed
? "after" : "before"));
6696 fprintf (dump
, ";; ======================================================\n");
6697 fprintf (dump
, "\n");
6699 visual_tbl
= (char *) alloca (get_visual_tbl_length ());
6700 init_block_visualization ();
6703 /* Remove remaining note insns from the block, save them in
6704 note_list. These notes are restored at the end of
6705 schedule_block (). */
6707 rm_other_notes (head
, tail
);
6711 /* Prepare current target block info. */
6712 if (current_nr_blocks
> 1)
6714 candidate_table
= (candidate
*) alloca (current_nr_blocks
6715 * sizeof (candidate
));
6718 /* ??? It is not clear why bblst_size is computed this way. The original
6719 number was clearly too small as it resulted in compiler failures.
6720 Multiplying by the original number by 2 (to account for update_bbs
6721 members) seems to be a reasonable solution. */
6722 /* ??? Or perhaps there is a bug somewhere else in this file? */
6723 bblst_size
= (current_nr_blocks
- bb
) * rgn_nr_edges
* 2;
6724 bblst_table
= (int *) alloca (bblst_size
* sizeof (int));
6726 bitlst_table_last
= 0;
6727 bitlst_table_size
= rgn_nr_edges
;
6728 bitlst_table
= (int *) alloca (rgn_nr_edges
* sizeof (int));
6730 compute_trg_info (bb
);
6735 /* Allocate the ready list. */
6736 ready
= (rtx
*) alloca ((rgn_n_insns
+ 1) * sizeof (rtx
));
6738 /* Print debugging information. */
6739 if (sched_verbose
>= 5)
6740 debug_dependencies ();
6743 /* Initialize ready list with all 'ready' insns in target block.
6744 Count number of insns in the target block being scheduled. */
6746 for (insn
= head
; insn
!= next_tail
; insn
= NEXT_INSN (insn
))
6750 if (GET_RTX_CLASS (GET_CODE (insn
)) != 'i')
6752 next
= NEXT_INSN (insn
);
6754 if (INSN_DEP_COUNT (insn
) == 0
6755 && (SCHED_GROUP_P (next
) == 0 || GET_RTX_CLASS (GET_CODE (next
)) != 'i'))
6756 ready
[n_ready
++] = insn
;
6757 if (!(SCHED_GROUP_P (insn
)))
6761 /* Add to ready list all 'ready' insns in valid source blocks.
6762 For speculative insns, check-live, exception-free, and
6764 for (bb_src
= bb
+ 1; bb_src
< current_nr_blocks
; bb_src
++)
6765 if (IS_VALID (bb_src
))
6771 get_block_head_tail (bb_src
, &head
, &tail
);
6772 src_next_tail
= NEXT_INSN (tail
);
6776 && (GET_RTX_CLASS (GET_CODE (head
)) != 'i'))
6779 for (insn
= src_head
; insn
!= src_next_tail
; insn
= NEXT_INSN (insn
))
6781 if (GET_RTX_CLASS (GET_CODE (insn
)) != 'i')
6784 if (!CANT_MOVE (insn
)
6785 && (!IS_SPECULATIVE_INSN (insn
)
6786 || (insn_issue_delay (insn
) <= 3
6787 && check_live (insn
, bb_src
)
6788 && is_exception_free (insn
, bb_src
, target_bb
))))
6793 /* Note that we havn't squirrled away the notes for
6794 blocks other than the current. So if this is a
6795 speculative insn, NEXT might otherwise be a note. */
6796 next
= next_nonnote_insn (insn
);
6797 if (INSN_DEP_COUNT (insn
) == 0
6798 && (SCHED_GROUP_P (next
) == 0
6799 || GET_RTX_CLASS (GET_CODE (next
)) != 'i'))
6800 ready
[n_ready
++] = insn
;
6805 #ifdef MD_SCHED_INIT
6806 MD_SCHED_INIT (dump
, sched_verbose
);
6809 /* No insns scheduled in this block yet. */
6810 last_scheduled_insn
= 0;
6812 /* Q_SIZE is the total number of insns in the queue. */
6816 bzero ((char *) insn_queue
, sizeof (insn_queue
));
6818 /* Start just before the beginning of time. */
6821 /* We start inserting insns after PREV_HEAD. */
6824 /* Initialize INSN_QUEUE, LIST and NEW_NEEDS. */
6825 new_needs
= (NEXT_INSN (prev_head
) == BLOCK_HEAD (b
)
6826 ? NEED_HEAD
: NEED_NOTHING
);
6827 if (PREV_INSN (next_tail
) == BLOCK_END (b
))
6828 new_needs
|= NEED_TAIL
;
6830 /* Loop until all the insns in BB are scheduled. */
6831 while (sched_target_n_insns
< target_n_insns
)
6837 /* Add to the ready list all pending insns that can be issued now.
6838 If there are no ready insns, increment clock until one
6839 is ready and add all pending insns at that point to the ready
6841 n_ready
= queue_to_ready (ready
, n_ready
);
6846 if (sched_verbose
>= 2)
6848 fprintf (dump
, ";;\t\tReady list after queue_to_ready: ");
6849 debug_ready_list (ready
, n_ready
);
6852 /* Sort the ready list based on priority. */
6853 SCHED_SORT (ready
, n_ready
);
6855 /* Allow the target to reorder the list, typically for
6856 better instruction bundling. */
6857 #ifdef MD_SCHED_REORDER
6858 MD_SCHED_REORDER (dump
, sched_verbose
, ready
, n_ready
, clock_var
,
6861 can_issue_more
= issue_rate
;
6866 fprintf (dump
, "\n;;\tReady list (t =%3d): ", clock_var
);
6867 debug_ready_list (ready
, n_ready
);
6870 /* Issue insns from ready list. */
6871 while (n_ready
!= 0 && can_issue_more
)
6873 /* Select and remove the insn from the ready list. */
6874 rtx insn
= ready
[--n_ready
];
6875 int cost
= actual_hazard (insn_unit (insn
), insn
, clock_var
, 0);
6879 queue_insn (insn
, cost
);
6883 /* An interblock motion? */
6884 if (INSN_BB (insn
) != target_bb
)
6888 if (IS_SPECULATIVE_INSN (insn
))
6890 if (!check_live (insn
, INSN_BB (insn
)))
6892 update_live (insn
, INSN_BB (insn
));
6894 /* For speculative load, mark insns fed by it. */
6895 if (IS_LOAD_INSN (insn
) || FED_BY_SPEC_LOAD (insn
))
6896 set_spec_fed (insn
);
6903 while (SCHED_GROUP_P (temp
))
6904 temp
= PREV_INSN (temp
);
6906 /* Update source block boundaries. */
6907 b1
= INSN_BLOCK (temp
);
6908 if (temp
== BLOCK_HEAD (b1
)
6909 && insn
== BLOCK_END (b1
))
6911 /* We moved all the insns in the basic block.
6912 Emit a note after the last insn and update the
6913 begin/end boundaries to point to the note. */
6914 emit_note_after (NOTE_INSN_DELETED
, insn
);
6915 BLOCK_END (b1
) = NEXT_INSN (insn
);
6916 BLOCK_HEAD (b1
) = NEXT_INSN (insn
);
6918 else if (insn
== BLOCK_END (b1
))
6920 /* We took insns from the end of the basic block,
6921 so update the end of block boundary so that it
6922 points to the first insn we did not move. */
6923 BLOCK_END (b1
) = PREV_INSN (temp
);
6925 else if (temp
== BLOCK_HEAD (b1
))
6927 /* We took insns from the start of the basic block,
6928 so update the start of block boundary so that
6929 it points to the first insn we did not move. */
6930 BLOCK_HEAD (b1
) = NEXT_INSN (insn
);
6935 /* In block motion. */
6936 sched_target_n_insns
++;
6939 last_scheduled_insn
= insn
;
6940 last
= move_insn (insn
, last
);
6943 #ifdef MD_SCHED_VARIABLE_ISSUE
6944 MD_SCHED_VARIABLE_ISSUE (dump
, sched_verbose
, insn
,
6950 n_ready
= schedule_insn (insn
, ready
, n_ready
, clock_var
);
6952 /* Close this block after scheduling its jump. */
6953 if (GET_CODE (last_scheduled_insn
) == JUMP_INSN
)
6959 visualize_scheduled_insns (b
, clock_var
);
6965 fprintf (dump
, ";;\tReady list (final): ");
6966 debug_ready_list (ready
, n_ready
);
6967 print_block_visualization (b
, "");
6970 /* Sanity check -- queue must be empty now. Meaningless if region has
6972 if (current_nr_blocks
> 1)
6973 if (!flag_schedule_interblock
&& q_size
!= 0)
6976 /* Update head/tail boundaries. */
6977 head
= NEXT_INSN (prev_head
);
6980 /* Restore-other-notes: NOTE_LIST is the end of a chain of notes
6981 previously found among the insns. Insert them at the beginning
6985 rtx note_head
= note_list
;
6987 while (PREV_INSN (note_head
))
6989 note_head
= PREV_INSN (note_head
);
6992 PREV_INSN (note_head
) = PREV_INSN (head
);
6993 NEXT_INSN (PREV_INSN (head
)) = note_head
;
6994 PREV_INSN (head
) = note_list
;
6995 NEXT_INSN (note_list
) = head
;
6999 /* Update target block boundaries. */
7000 if (new_needs
& NEED_HEAD
)
7001 BLOCK_HEAD (b
) = head
;
7003 if (new_needs
& NEED_TAIL
)
7004 BLOCK_END (b
) = tail
;
7009 fprintf (dump
, ";; total time = %d\n;; new basic block head = %d\n",
7010 clock_var
, INSN_UID (BLOCK_HEAD (b
)));
7011 fprintf (dump
, ";; new basic block end = %d\n\n",
7012 INSN_UID (BLOCK_END (b
)));
7015 return (sched_n_insns
);
7016 } /* schedule_block () */
7019 /* Print the bit-set of registers, S, callable from debugger. */
7022 debug_reg_vector (s
)
7027 EXECUTE_IF_SET_IN_REG_SET (s
, 0, regno
,
7029 fprintf (dump
, " %d", regno
);
7032 fprintf (dump
, "\n");
7035 /* Use the backward dependences from LOG_LINKS to build
7036 forward dependences in INSN_DEPEND. */
7039 compute_block_forward_dependences (bb
)
7045 enum reg_note dep_type
;
7047 get_block_head_tail (bb
, &head
, &tail
);
7048 next_tail
= NEXT_INSN (tail
);
7049 for (insn
= head
; insn
!= next_tail
; insn
= NEXT_INSN (insn
))
7051 if (GET_RTX_CLASS (GET_CODE (insn
)) != 'i')
7054 insn
= group_leader (insn
);
7056 for (link
= LOG_LINKS (insn
); link
; link
= XEXP (link
, 1))
7058 rtx x
= group_leader (XEXP (link
, 0));
7061 if (x
!= XEXP (link
, 0))
7064 /* Ignore dependences upon deleted insn. */
7065 if (GET_CODE (x
) == NOTE
|| INSN_DELETED_P (x
))
7067 if (find_insn_list (insn
, INSN_DEPEND (x
)))
7070 new_link
= alloc_INSN_LIST (insn
, INSN_DEPEND (x
));
7072 dep_type
= REG_NOTE_KIND (link
);
7073 PUT_REG_NOTE_KIND (new_link
, dep_type
);
7075 INSN_DEPEND (x
) = new_link
;
7076 INSN_DEP_COUNT (insn
) += 1;
7081 /* Initialize variables for region data dependence analysis.
7082 n_bbs is the number of region blocks. */
7084 __inline
static void
7085 init_rgn_data_dependences (n_bbs
)
7090 /* Variables for which one copy exists for each block. */
7091 bzero ((char *) bb_pending_read_insns
, n_bbs
* sizeof (rtx
));
7092 bzero ((char *) bb_pending_read_mems
, n_bbs
* sizeof (rtx
));
7093 bzero ((char *) bb_pending_write_insns
, n_bbs
* sizeof (rtx
));
7094 bzero ((char *) bb_pending_write_mems
, n_bbs
* sizeof (rtx
));
7095 bzero ((char *) bb_pending_lists_length
, n_bbs
* sizeof (rtx
));
7096 bzero ((char *) bb_last_pending_memory_flush
, n_bbs
* sizeof (rtx
));
7097 bzero ((char *) bb_last_function_call
, n_bbs
* sizeof (rtx
));
7098 bzero ((char *) bb_sched_before_next_call
, n_bbs
* sizeof (rtx
));
7100 /* Create an insn here so that we can hang dependencies off of it later. */
7101 for (bb
= 0; bb
< n_bbs
; bb
++)
7103 bb_sched_before_next_call
[bb
] =
7104 gen_rtx_INSN (VOIDmode
, 0, NULL_RTX
, NULL_RTX
,
7105 NULL_RTX
, 0, NULL_RTX
, NULL_RTX
);
7106 LOG_LINKS (bb_sched_before_next_call
[bb
]) = 0;
7110 /* Add dependences so that branches are scheduled to run last in their
7114 add_branch_dependences (head
, tail
)
7120 /* For all branches, calls, uses, and cc0 setters, force them to remain
7121 in order at the end of the block by adding dependencies and giving
7122 the last a high priority. There may be notes present, and prev_head
7125 Branches must obviously remain at the end. Calls should remain at the
7126 end since moving them results in worse register allocation. Uses remain
7127 at the end to ensure proper register allocation. cc0 setters remaim
7128 at the end because they can't be moved away from their cc0 user. */
7131 while (GET_CODE (insn
) == CALL_INSN
|| GET_CODE (insn
) == JUMP_INSN
7132 || (GET_CODE (insn
) == INSN
7133 && (GET_CODE (PATTERN (insn
)) == USE
7135 || sets_cc0_p (PATTERN (insn
))
7138 || GET_CODE (insn
) == NOTE
)
7140 if (GET_CODE (insn
) != NOTE
)
7143 && !find_insn_list (insn
, LOG_LINKS (last
)))
7145 add_dependence (last
, insn
, REG_DEP_ANTI
);
7146 INSN_REF_COUNT (insn
)++;
7149 CANT_MOVE (insn
) = 1;
7152 /* Skip over insns that are part of a group.
7153 Make each insn explicitly depend on the previous insn.
7154 This ensures that only the group header will ever enter
7155 the ready queue (and, when scheduled, will automatically
7156 schedule the SCHED_GROUP_P block). */
7157 while (SCHED_GROUP_P (insn
))
7159 rtx temp
= prev_nonnote_insn (insn
);
7160 add_dependence (insn
, temp
, REG_DEP_ANTI
);
7165 /* Don't overrun the bounds of the basic block. */
7169 insn
= PREV_INSN (insn
);
7172 /* Make sure these insns are scheduled last in their block. */
7175 while (insn
!= head
)
7177 insn
= prev_nonnote_insn (insn
);
7179 if (INSN_REF_COUNT (insn
) != 0)
7182 add_dependence (last
, insn
, REG_DEP_ANTI
);
7183 INSN_REF_COUNT (insn
) = 1;
7185 /* Skip over insns that are part of a group. */
7186 while (SCHED_GROUP_P (insn
))
7187 insn
= prev_nonnote_insn (insn
);
7191 /* Compute backward dependences inside bb. In a multiple blocks region:
7192 (1) a bb is analyzed after its predecessors, and (2) the lists in
7193 effect at the end of bb (after analyzing for bb) are inherited by
7196 Specifically for reg-reg data dependences, the block insns are
7197 scanned by sched_analyze () top-to-bottom. Two lists are
7198 maintained by sched_analyze (): reg_last_sets[] for register DEFs,
7199 and reg_last_uses[] for register USEs.
7201 When analysis is completed for bb, we update for its successors:
7202 ; - DEFS[succ] = Union (DEFS [succ], DEFS [bb])
7203 ; - USES[succ] = Union (USES [succ], DEFS [bb])
7205 The mechanism for computing mem-mem data dependence is very
7206 similar, and the result is interblock dependences in the region. */
7209 compute_block_backward_dependences (bb
)
7215 int max_reg
= max_reg_num ();
7217 b
= BB_TO_BLOCK (bb
);
7219 if (current_nr_blocks
== 1)
7221 reg_last_uses
= (rtx
*) alloca (max_reg
* sizeof (rtx
));
7222 reg_last_sets
= (rtx
*) alloca (max_reg
* sizeof (rtx
));
7223 reg_last_clobbers
= (rtx
*) alloca (max_reg
* sizeof (rtx
));
7225 bzero ((char *) reg_last_uses
, max_reg
* sizeof (rtx
));
7226 bzero ((char *) reg_last_sets
, max_reg
* sizeof (rtx
));
7227 bzero ((char *) reg_last_clobbers
, max_reg
* sizeof (rtx
));
7229 pending_read_insns
= 0;
7230 pending_read_mems
= 0;
7231 pending_write_insns
= 0;
7232 pending_write_mems
= 0;
7233 pending_lists_length
= 0;
7234 last_function_call
= 0;
7235 last_pending_memory_flush
= 0;
7236 sched_before_next_call
7237 = gen_rtx_INSN (VOIDmode
, 0, NULL_RTX
, NULL_RTX
,
7238 NULL_RTX
, 0, NULL_RTX
, NULL_RTX
);
7239 LOG_LINKS (sched_before_next_call
) = 0;
7243 reg_last_uses
= bb_reg_last_uses
[bb
];
7244 reg_last_sets
= bb_reg_last_sets
[bb
];
7245 reg_last_clobbers
= bb_reg_last_clobbers
[bb
];
7247 pending_read_insns
= bb_pending_read_insns
[bb
];
7248 pending_read_mems
= bb_pending_read_mems
[bb
];
7249 pending_write_insns
= bb_pending_write_insns
[bb
];
7250 pending_write_mems
= bb_pending_write_mems
[bb
];
7251 pending_lists_length
= bb_pending_lists_length
[bb
];
7252 last_function_call
= bb_last_function_call
[bb
];
7253 last_pending_memory_flush
= bb_last_pending_memory_flush
[bb
];
7255 sched_before_next_call
= bb_sched_before_next_call
[bb
];
7258 /* Do the analysis for this block. */
7259 get_block_head_tail (bb
, &head
, &tail
);
7260 sched_analyze (head
, tail
);
7261 add_branch_dependences (head
, tail
);
7263 if (current_nr_blocks
> 1)
7266 int b_succ
, bb_succ
;
7268 rtx link_insn
, link_mem
;
7271 /* These lists should point to the right place, for correct
7273 bb_pending_read_insns
[bb
] = pending_read_insns
;
7274 bb_pending_read_mems
[bb
] = pending_read_mems
;
7275 bb_pending_write_insns
[bb
] = pending_write_insns
;
7276 bb_pending_write_mems
[bb
] = pending_write_mems
;
7278 /* bb's structures are inherited by it's successors. */
7279 first_edge
= e
= OUT_EDGES (b
);
7283 b_succ
= TO_BLOCK (e
);
7284 bb_succ
= BLOCK_TO_BB (b_succ
);
7286 /* Only bbs "below" bb, in the same region, are interesting. */
7287 if (CONTAINING_RGN (b
) != CONTAINING_RGN (b_succ
)
7294 for (reg
= 0; reg
< max_reg
; reg
++)
7297 /* reg-last-uses lists are inherited by bb_succ. */
7298 for (u
= reg_last_uses
[reg
]; u
; u
= XEXP (u
, 1))
7300 if (find_insn_list (XEXP (u
, 0),
7301 (bb_reg_last_uses
[bb_succ
])[reg
]))
7304 (bb_reg_last_uses
[bb_succ
])[reg
]
7305 = alloc_INSN_LIST (XEXP (u
, 0),
7306 (bb_reg_last_uses
[bb_succ
])[reg
]);
7309 /* reg-last-defs lists are inherited by bb_succ. */
7310 for (u
= reg_last_sets
[reg
]; u
; u
= XEXP (u
, 1))
7312 if (find_insn_list (XEXP (u
, 0),
7313 (bb_reg_last_sets
[bb_succ
])[reg
]))
7316 (bb_reg_last_sets
[bb_succ
])[reg
]
7317 = alloc_INSN_LIST (XEXP (u
, 0),
7318 (bb_reg_last_sets
[bb_succ
])[reg
]);
7321 for (u
= reg_last_clobbers
[reg
]; u
; u
= XEXP (u
, 1))
7323 if (find_insn_list (XEXP (u
, 0),
7324 (bb_reg_last_clobbers
[bb_succ
])[reg
]))
7327 (bb_reg_last_clobbers
[bb_succ
])[reg
]
7328 = alloc_INSN_LIST (XEXP (u
, 0),
7329 (bb_reg_last_clobbers
[bb_succ
])[reg
]);
7333 /* Mem read/write lists are inherited by bb_succ. */
7334 link_insn
= pending_read_insns
;
7335 link_mem
= pending_read_mems
;
7338 if (!(find_insn_mem_list (XEXP (link_insn
, 0),
7340 bb_pending_read_insns
[bb_succ
],
7341 bb_pending_read_mems
[bb_succ
])))
7342 add_insn_mem_dependence (&bb_pending_read_insns
[bb_succ
],
7343 &bb_pending_read_mems
[bb_succ
],
7344 XEXP (link_insn
, 0), XEXP (link_mem
, 0));
7345 link_insn
= XEXP (link_insn
, 1);
7346 link_mem
= XEXP (link_mem
, 1);
7349 link_insn
= pending_write_insns
;
7350 link_mem
= pending_write_mems
;
7353 if (!(find_insn_mem_list (XEXP (link_insn
, 0),
7355 bb_pending_write_insns
[bb_succ
],
7356 bb_pending_write_mems
[bb_succ
])))
7357 add_insn_mem_dependence (&bb_pending_write_insns
[bb_succ
],
7358 &bb_pending_write_mems
[bb_succ
],
7359 XEXP (link_insn
, 0), XEXP (link_mem
, 0));
7361 link_insn
= XEXP (link_insn
, 1);
7362 link_mem
= XEXP (link_mem
, 1);
7365 /* last_function_call is inherited by bb_succ. */
7366 for (u
= last_function_call
; u
; u
= XEXP (u
, 1))
7368 if (find_insn_list (XEXP (u
, 0),
7369 bb_last_function_call
[bb_succ
]))
7372 bb_last_function_call
[bb_succ
]
7373 = alloc_INSN_LIST (XEXP (u
, 0),
7374 bb_last_function_call
[bb_succ
]);
7377 /* last_pending_memory_flush is inherited by bb_succ. */
7378 for (u
= last_pending_memory_flush
; u
; u
= XEXP (u
, 1))
7380 if (find_insn_list (XEXP (u
, 0),
7381 bb_last_pending_memory_flush
[bb_succ
]))
7384 bb_last_pending_memory_flush
[bb_succ
]
7385 = alloc_INSN_LIST (XEXP (u
, 0),
7386 bb_last_pending_memory_flush
[bb_succ
]);
7389 /* sched_before_next_call is inherited by bb_succ. */
7390 x
= LOG_LINKS (sched_before_next_call
);
7391 for (; x
; x
= XEXP (x
, 1))
7392 add_dependence (bb_sched_before_next_call
[bb_succ
],
7393 XEXP (x
, 0), REG_DEP_ANTI
);
7397 while (e
!= first_edge
);
7400 /* Free up the INSN_LISTs.
7402 Note this loop is executed max_reg * nr_regions times. It's first
7403 implementation accounted for over 90% of the calls to free_INSN_LIST_list.
7404 The list was empty for the vast majority of those calls. On the PA, not
7405 calling free_INSN_LIST_list in those cases improves -O2 compile times by
7407 for (b
= 0; b
< max_reg
; ++b
)
7409 if (reg_last_clobbers
[b
])
7410 free_INSN_LIST_list (®_last_clobbers
[b
]);
7411 if (reg_last_sets
[b
])
7412 free_INSN_LIST_list (®_last_sets
[b
]);
7413 if (reg_last_uses
[b
])
7414 free_INSN_LIST_list (®_last_uses
[b
]);
7417 /* Assert that we won't need bb_reg_last_* for this block anymore. */
7418 if (current_nr_blocks
> 1)
7420 bb_reg_last_uses
[bb
] = (rtx
*) NULL_RTX
;
7421 bb_reg_last_sets
[bb
] = (rtx
*) NULL_RTX
;
7422 bb_reg_last_clobbers
[bb
] = (rtx
*) NULL_RTX
;
7426 /* Print dependences for debugging, callable from debugger. */
7429 debug_dependencies ()
7433 fprintf (dump
, ";; --------------- forward dependences: ------------ \n");
7434 for (bb
= 0; bb
< current_nr_blocks
; bb
++)
7442 get_block_head_tail (bb
, &head
, &tail
);
7443 next_tail
= NEXT_INSN (tail
);
7444 fprintf (dump
, "\n;; --- Region Dependences --- b %d bb %d \n",
7445 BB_TO_BLOCK (bb
), bb
);
7447 fprintf (dump
, ";; %7s%6s%6s%6s%6s%6s%11s%6s\n",
7448 "insn", "code", "bb", "dep", "prio", "cost", "blockage", "units");
7449 fprintf (dump
, ";; %7s%6s%6s%6s%6s%6s%11s%6s\n",
7450 "----", "----", "--", "---", "----", "----", "--------", "-----");
7451 for (insn
= head
; insn
!= next_tail
; insn
= NEXT_INSN (insn
))
7456 if (GET_RTX_CLASS (GET_CODE (insn
)) != 'i')
7459 fprintf (dump
, ";; %6d ", INSN_UID (insn
));
7460 if (GET_CODE (insn
) == NOTE
)
7462 n
= NOTE_LINE_NUMBER (insn
);
7464 fprintf (dump
, "%s\n", GET_NOTE_INSN_NAME (n
));
7466 fprintf (dump
, "line %d, file %s\n", n
,
7467 NOTE_SOURCE_FILE (insn
));
7470 fprintf (dump
, " {%s}\n", GET_RTX_NAME (GET_CODE (insn
)));
7474 unit
= insn_unit (insn
);
7476 || function_units
[unit
].blockage_range_function
== 0) ? 0 :
7477 function_units
[unit
].blockage_range_function (insn
);
7479 ";; %s%5d%6d%6d%6d%6d%6d %3d -%3d ",
7480 (SCHED_GROUP_P (insn
) ? "+" : " "),
7484 INSN_DEP_COUNT (insn
),
7485 INSN_PRIORITY (insn
),
7486 insn_cost (insn
, 0, 0),
7487 (int) MIN_BLOCKAGE_COST (range
),
7488 (int) MAX_BLOCKAGE_COST (range
));
7489 insn_print_units (insn
);
7490 fprintf (dump
, "\t: ");
7491 for (link
= INSN_DEPEND (insn
); link
; link
= XEXP (link
, 1))
7492 fprintf (dump
, "%d ", INSN_UID (XEXP (link
, 0)));
7493 fprintf (dump
, "\n");
7497 fprintf (dump
, "\n");
7500 /* Set_priorities: compute priority of each insn in the block. */
7513 get_block_head_tail (bb
, &head
, &tail
);
7514 prev_head
= PREV_INSN (head
);
7517 && (GET_RTX_CLASS (GET_CODE (head
)) != 'i'))
7521 for (insn
= tail
; insn
!= prev_head
; insn
= PREV_INSN (insn
))
7524 if (GET_CODE (insn
) == NOTE
)
7527 if (!(SCHED_GROUP_P (insn
)))
7529 (void) priority (insn
);
7535 /* Make each element of VECTOR point at an rtx-vector,
7536 taking the space for all those rtx-vectors from SPACE.
7537 SPACE is of type (rtx *), but it is really as long as NELTS rtx-vectors.
7538 BYTES_PER_ELT is the number of bytes in one rtx-vector.
7539 (this is the same as init_regset_vector () in flow.c) */
7542 init_rtx_vector (vector
, space
, nelts
, bytes_per_elt
)
7549 register rtx
*p
= space
;
7551 for (i
= 0; i
< nelts
; i
++)
7554 p
+= bytes_per_elt
/ sizeof (*p
);
7558 /* Schedule a region. A region is either an inner loop, a loop-free
7559 subroutine, or a single basic block. Each bb in the region is
7560 scheduled after its flow predecessors. */
7563 schedule_region (rgn
)
7567 int rgn_n_insns
= 0;
7568 int sched_rgn_n_insns
= 0;
7570 /* Set variables for the current region. */
7571 current_nr_blocks
= RGN_NR_BLOCKS (rgn
);
7572 current_blocks
= RGN_BLOCKS (rgn
);
7574 reg_pending_sets
= ALLOCA_REG_SET ();
7575 reg_pending_clobbers
= ALLOCA_REG_SET ();
7576 reg_pending_sets_all
= 0;
7578 /* Initializations for region data dependence analyisis. */
7579 if (current_nr_blocks
> 1)
7582 int maxreg
= max_reg_num ();
7584 bb_reg_last_uses
= (rtx
**) alloca (current_nr_blocks
* sizeof (rtx
*));
7585 space
= (rtx
*) alloca (current_nr_blocks
* maxreg
* sizeof (rtx
));
7586 bzero ((char *) space
, current_nr_blocks
* maxreg
* sizeof (rtx
));
7587 init_rtx_vector (bb_reg_last_uses
, space
, current_nr_blocks
,
7588 maxreg
* sizeof (rtx
*));
7590 bb_reg_last_sets
= (rtx
**) alloca (current_nr_blocks
* sizeof (rtx
*));
7591 space
= (rtx
*) alloca (current_nr_blocks
* maxreg
* sizeof (rtx
));
7592 bzero ((char *) space
, current_nr_blocks
* maxreg
* sizeof (rtx
));
7593 init_rtx_vector (bb_reg_last_sets
, space
, current_nr_blocks
,
7594 maxreg
* sizeof (rtx
*));
7596 bb_reg_last_clobbers
=
7597 (rtx
**) alloca (current_nr_blocks
* sizeof (rtx
*));
7598 space
= (rtx
*) alloca (current_nr_blocks
* maxreg
* sizeof (rtx
));
7599 bzero ((char *) space
, current_nr_blocks
* maxreg
* sizeof (rtx
));
7600 init_rtx_vector (bb_reg_last_clobbers
, space
, current_nr_blocks
,
7601 maxreg
* sizeof (rtx
*));
7603 bb_pending_read_insns
= (rtx
*) alloca (current_nr_blocks
* sizeof (rtx
));
7604 bb_pending_read_mems
= (rtx
*) alloca (current_nr_blocks
* sizeof (rtx
));
7605 bb_pending_write_insns
=
7606 (rtx
*) alloca (current_nr_blocks
* sizeof (rtx
));
7607 bb_pending_write_mems
= (rtx
*) alloca (current_nr_blocks
* sizeof (rtx
));
7608 bb_pending_lists_length
=
7609 (int *) alloca (current_nr_blocks
* sizeof (int));
7610 bb_last_pending_memory_flush
=
7611 (rtx
*) alloca (current_nr_blocks
* sizeof (rtx
));
7612 bb_last_function_call
= (rtx
*) alloca (current_nr_blocks
* sizeof (rtx
));
7613 bb_sched_before_next_call
=
7614 (rtx
*) alloca (current_nr_blocks
* sizeof (rtx
));
7616 init_rgn_data_dependences (current_nr_blocks
);
7619 /* Compute LOG_LINKS. */
7620 for (bb
= 0; bb
< current_nr_blocks
; bb
++)
7621 compute_block_backward_dependences (bb
);
7623 /* Compute INSN_DEPEND. */
7624 for (bb
= current_nr_blocks
- 1; bb
>= 0; bb
--)
7625 compute_block_forward_dependences (bb
);
7627 /* Delete line notes, compute live-regs at block end, and set priorities. */
7629 for (bb
= 0; bb
< current_nr_blocks
; bb
++)
7631 if (reload_completed
== 0)
7632 find_pre_sched_live (bb
);
7634 if (write_symbols
!= NO_DEBUG
)
7636 save_line_notes (bb
);
7640 rgn_n_insns
+= set_priorities (bb
);
7643 /* Compute interblock info: probabilities, split-edges, dominators, etc. */
7644 if (current_nr_blocks
> 1)
7648 prob
= (float *) alloca ((current_nr_blocks
) * sizeof (float));
7650 bbset_size
= current_nr_blocks
/ HOST_BITS_PER_WIDE_INT
+ 1;
7651 dom
= (bbset
*) alloca (current_nr_blocks
* sizeof (bbset
));
7652 for (i
= 0; i
< current_nr_blocks
; i
++)
7654 dom
[i
] = (bbset
) alloca (bbset_size
* sizeof (HOST_WIDE_INT
));
7655 bzero ((char *) dom
[i
], bbset_size
* sizeof (HOST_WIDE_INT
));
7660 edge_to_bit
= (int *) alloca (nr_edges
* sizeof (int));
7661 for (i
= 1; i
< nr_edges
; i
++)
7662 if (CONTAINING_RGN (FROM_BLOCK (i
)) == rgn
)
7663 EDGE_TO_BIT (i
) = rgn_nr_edges
++;
7664 rgn_edges
= (int *) alloca (rgn_nr_edges
* sizeof (int));
7667 for (i
= 1; i
< nr_edges
; i
++)
7668 if (CONTAINING_RGN (FROM_BLOCK (i
)) == (rgn
))
7669 rgn_edges
[rgn_nr_edges
++] = i
;
7672 edgeset_size
= rgn_nr_edges
/ HOST_BITS_PER_WIDE_INT
+ 1;
7673 pot_split
= (edgeset
*) alloca (current_nr_blocks
* sizeof (edgeset
));
7674 ancestor_edges
= (edgeset
*) alloca (current_nr_blocks
7675 * sizeof (edgeset
));
7676 for (i
= 0; i
< current_nr_blocks
; i
++)
7679 (edgeset
) alloca (edgeset_size
* sizeof (HOST_WIDE_INT
));
7680 bzero ((char *) pot_split
[i
],
7681 edgeset_size
* sizeof (HOST_WIDE_INT
));
7683 (edgeset
) alloca (edgeset_size
* sizeof (HOST_WIDE_INT
));
7684 bzero ((char *) ancestor_edges
[i
],
7685 edgeset_size
* sizeof (HOST_WIDE_INT
));
7688 /* Compute probabilities, dominators, split_edges. */
7689 for (bb
= 0; bb
< current_nr_blocks
; bb
++)
7690 compute_dom_prob_ps (bb
);
7693 /* Now we can schedule all blocks. */
7694 for (bb
= 0; bb
< current_nr_blocks
; bb
++)
7696 sched_rgn_n_insns
+= schedule_block (bb
, rgn_n_insns
);
7703 /* Sanity check: verify that all region insns were scheduled. */
7704 if (sched_rgn_n_insns
!= rgn_n_insns
)
7707 /* Update register life and usage information. */
7708 if (reload_completed
== 0)
7710 for (bb
= current_nr_blocks
- 1; bb
>= 0; bb
--)
7711 find_post_sched_live (bb
);
7713 if (current_nr_blocks
<= 1)
7714 /* Sanity check. There should be no REG_DEAD notes leftover
7715 at the end. In practice, this can occur as the result of
7716 bugs in flow, combine.c, and/or sched.c. The values of the
7717 REG_DEAD notes remaining are meaningless, because
7718 dead_notes is just used as a free list. */
7719 if (dead_notes
!= 0)
7723 /* Restore line notes. */
7724 if (write_symbols
!= NO_DEBUG
)
7726 for (bb
= 0; bb
< current_nr_blocks
; bb
++)
7727 restore_line_notes (bb
);
7730 /* Done with this region. */
7731 free_pending_lists ();
7733 FREE_REG_SET (reg_pending_sets
);
7734 FREE_REG_SET (reg_pending_clobbers
);
7737 /* The one entry point in this file. DUMP_FILE is the dump file for
7741 schedule_insns (dump_file
)
7752 /* Disable speculative loads in their presence if cc0 defined. */
7754 flag_schedule_speculative_load
= 0;
7757 /* Taking care of this degenerate case makes the rest of
7758 this code simpler. */
7759 if (n_basic_blocks
== 0)
7762 /* Set dump and sched_verbose for the desired debugging output. If no
7763 dump-file was specified, but -fsched-verbose-N (any N), print to stderr.
7764 For -fsched-verbose-N, N>=10, print everything to stderr. */
7765 sched_verbose
= sched_verbose_param
;
7766 if (sched_verbose_param
== 0 && dump_file
)
7768 dump
= ((sched_verbose_param
>= 10 || !dump_file
) ? stderr
: dump_file
);
7773 /* Initialize issue_rate. */
7774 issue_rate
= ISSUE_RATE
;
7776 /* Do the splitting first for all blocks. */
7777 for (b
= 0; b
< n_basic_blocks
; b
++)
7778 split_block_insns (b
, 1);
7780 max_uid
= (get_max_uid () + 1);
7782 cant_move
= xcalloc (max_uid
, sizeof (char));
7783 fed_by_spec_load
= xcalloc (max_uid
, sizeof (char));
7784 is_load_insn
= xcalloc (max_uid
, sizeof (char));
7786 insn_orig_block
= (int *) xmalloc (max_uid
* sizeof (int));
7787 insn_luid
= (int *) xmalloc (max_uid
* sizeof (int));
7790 for (b
= 0; b
< n_basic_blocks
; b
++)
7791 for (insn
= BLOCK_HEAD (b
);; insn
= NEXT_INSN (insn
))
7793 INSN_BLOCK (insn
) = b
;
7794 INSN_LUID (insn
) = luid
++;
7796 if (insn
== BLOCK_END (b
))
7800 /* After reload, remove inter-blocks dependences computed before reload. */
7801 if (reload_completed
)
7806 for (b
= 0; b
< n_basic_blocks
; b
++)
7807 for (insn
= BLOCK_HEAD (b
);; insn
= NEXT_INSN (insn
))
7811 if (GET_RTX_CLASS (GET_CODE (insn
)) == 'i')
7814 link
= LOG_LINKS (insn
);
7817 rtx x
= XEXP (link
, 0);
7819 if (INSN_BLOCK (x
) != b
)
7821 remove_dependence (insn
, x
);
7822 link
= prev
? XEXP (prev
, 1) : LOG_LINKS (insn
);
7825 prev
= link
, link
= XEXP (prev
, 1);
7829 if (insn
== BLOCK_END (b
))
7835 rgn_table
= (region
*) alloca ((n_basic_blocks
) * sizeof (region
));
7836 rgn_bb_table
= (int *) alloca ((n_basic_blocks
) * sizeof (int));
7837 block_to_bb
= (int *) alloca ((n_basic_blocks
) * sizeof (int));
7838 containing_rgn
= (int *) alloca ((n_basic_blocks
) * sizeof (int));
7840 /* Compute regions for scheduling. */
7841 if (reload_completed
7842 || n_basic_blocks
== 1
7843 || !flag_schedule_interblock
)
7845 find_single_block_region ();
7849 /* Verify that a 'good' control flow graph can be built. */
7850 if (is_cfg_nonregular ())
7852 find_single_block_region ();
7856 int_list_ptr
*s_preds
, *s_succs
;
7857 int *num_preds
, *num_succs
;
7858 sbitmap
*dom
, *pdom
;
7860 s_preds
= (int_list_ptr
*) alloca (n_basic_blocks
7861 * sizeof (int_list_ptr
));
7862 s_succs
= (int_list_ptr
*) alloca (n_basic_blocks
7863 * sizeof (int_list_ptr
));
7864 num_preds
= (int *) alloca (n_basic_blocks
* sizeof (int));
7865 num_succs
= (int *) alloca (n_basic_blocks
* sizeof (int));
7866 dom
= sbitmap_vector_alloc (n_basic_blocks
, n_basic_blocks
);
7867 pdom
= sbitmap_vector_alloc (n_basic_blocks
, n_basic_blocks
);
7869 /* The scheduler runs after flow; therefore, we can't blindly call
7870 back into find_basic_blocks since doing so could invalidate the
7871 info in global_live_at_start.
7873 Consider a block consisting entirely of dead stores; after life
7874 analysis it would be a block of NOTE_INSN_DELETED notes. If
7875 we call find_basic_blocks again, then the block would be removed
7876 entirely and invalidate our the register live information.
7878 We could (should?) recompute register live information. Doing
7879 so may even be beneficial. */
7881 compute_preds_succs (s_preds
, s_succs
, num_preds
, num_succs
);
7883 /* Compute the dominators and post dominators. We don't
7884 currently use post dominators, but we should for
7885 speculative motion analysis. */
7886 compute_dominators (dom
, pdom
, s_preds
, s_succs
);
7888 /* build_control_flow will return nonzero if it detects unreachable
7889 blocks or any other irregularity with the cfg which prevents
7890 cross block scheduling. */
7891 if (build_control_flow (s_preds
, s_succs
, num_preds
, num_succs
) != 0)
7892 find_single_block_region ();
7894 find_rgns (s_preds
, s_succs
, num_preds
, num_succs
, dom
);
7896 if (sched_verbose
>= 3)
7899 /* For now. This will move as more and more of haifa is converted
7900 to using the cfg code in flow.c. */
7907 /* Allocate data for this pass. See comments, above,
7908 for what these vectors do.
7910 We use xmalloc instead of alloca, because max_uid can be very large
7911 when there is a lot of function inlining. If we used alloca, we could
7912 exceed stack limits on some hosts for some inputs. */
7913 insn_priority
= (int *) xcalloc (max_uid
, sizeof (int));
7914 insn_reg_weight
= (int *) xcalloc (max_uid
, sizeof (int));
7915 insn_tick
= (int *) xcalloc (max_uid
, sizeof (int));
7916 insn_costs
= (short *) xcalloc (max_uid
, sizeof (short));
7917 insn_units
= (short *) xcalloc (max_uid
, sizeof (short));
7918 insn_blockage
= (unsigned int *) xcalloc (max_uid
, sizeof (unsigned int));
7919 insn_ref_count
= (int *) xcalloc (max_uid
, sizeof (int));
7921 /* Allocate for forward dependencies. */
7922 insn_dep_count
= (int *) xcalloc (max_uid
, sizeof (int));
7923 insn_depend
= (rtx
*) xcalloc (max_uid
, sizeof (rtx
));
7925 if (reload_completed
== 0)
7929 sched_reg_n_calls_crossed
= (int *) alloca (max_regno
* sizeof (int));
7930 sched_reg_live_length
= (int *) alloca (max_regno
* sizeof (int));
7931 sched_reg_basic_block
= (int *) alloca (max_regno
* sizeof (int));
7932 bb_live_regs
= ALLOCA_REG_SET ();
7933 bzero ((char *) sched_reg_n_calls_crossed
, max_regno
* sizeof (int));
7934 bzero ((char *) sched_reg_live_length
, max_regno
* sizeof (int));
7936 for (i
= 0; i
< max_regno
; i
++)
7937 sched_reg_basic_block
[i
] = REG_BLOCK_UNKNOWN
;
7941 sched_reg_n_calls_crossed
= 0;
7942 sched_reg_live_length
= 0;
7945 init_alias_analysis ();
7947 if (write_symbols
!= NO_DEBUG
)
7951 line_note
= (rtx
*) xcalloc (max_uid
, sizeof (rtx
));
7952 line_note_head
= (rtx
*) alloca (n_basic_blocks
* sizeof (rtx
));
7953 bzero ((char *) line_note_head
, n_basic_blocks
* sizeof (rtx
));
7955 /* Save-line-note-head:
7956 Determine the line-number at the start of each basic block.
7957 This must be computed and saved now, because after a basic block's
7958 predecessor has been scheduled, it is impossible to accurately
7959 determine the correct line number for the first insn of the block. */
7961 for (b
= 0; b
< n_basic_blocks
; b
++)
7962 for (line
= BLOCK_HEAD (b
); line
; line
= PREV_INSN (line
))
7963 if (GET_CODE (line
) == NOTE
&& NOTE_LINE_NUMBER (line
) > 0)
7965 line_note_head
[b
] = line
;
7970 /* Find units used in this fuction, for visualization. */
7972 init_target_units ();
7974 /* ??? Add a NOTE after the last insn of the last basic block. It is not
7975 known why this is done. */
7977 insn
= BLOCK_END (n_basic_blocks
- 1);
7978 if (NEXT_INSN (insn
) == 0
7979 || (GET_CODE (insn
) != NOTE
7980 && GET_CODE (insn
) != CODE_LABEL
7981 /* Don't emit a NOTE if it would end up between an unconditional
7982 jump and a BARRIER. */
7983 && !(GET_CODE (insn
) == JUMP_INSN
7984 && GET_CODE (NEXT_INSN (insn
)) == BARRIER
)))
7985 emit_note_after (NOTE_INSN_DELETED
, BLOCK_END (n_basic_blocks
- 1));
7987 /* Schedule every region in the subroutine. */
7988 for (rgn
= 0; rgn
< nr_regions
; rgn
++)
7990 schedule_region (rgn
);
7997 /* Reposition the prologue and epilogue notes in case we moved the
7998 prologue/epilogue insns. */
7999 if (reload_completed
)
8000 reposition_prologue_and_epilogue_notes (get_insns ());
8002 /* Delete redundant line notes. */
8003 if (write_symbols
!= NO_DEBUG
)
8004 rm_redundant_line_notes ();
8006 /* Update information about uses of registers in the subroutine. */
8007 if (reload_completed
== 0)
8008 update_reg_usage ();
8012 if (reload_completed
== 0 && flag_schedule_interblock
)
8014 fprintf (dump
, "\n;; Procedure interblock/speculative motions == %d/%d \n",
8022 fprintf (dump
, "\n\n");
8026 free (fed_by_spec_load
);
8027 free (is_load_insn
);
8028 free (insn_orig_block
);
8031 free (insn_priority
);
8032 free (insn_reg_weight
);
8036 free (insn_blockage
);
8037 free (insn_ref_count
);
8039 free (insn_dep_count
);
8042 if (write_symbols
!= NO_DEBUG
)
8046 FREE_REG_SET (bb_live_regs
);
8065 #endif /* INSN_SCHEDULING */