]> gcc.gnu.org Git - gcc.git/blame - gcc/haifa-sched.c
* gcse.c (dump_cuid_table): Correct typo.
[gcc.git] / gcc / haifa-sched.c
CommitLineData
8c660648 1/* Instruction scheduling pass.
a4fc4b2d 2 Copyright (C) 1992, 93-97, 1998 Free Software Foundation, Inc.
8c660648
JL
3 Contributed by Michael Tiemann (tiemann@cygnus.com) Enhanced by,
4 and currently maintained by, Jim Wilson (wilson@cygnus.com)
5
6 This file is part of GNU CC.
7
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)
11 any later version.
12
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.
17
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. */
22
23
24/* Instruction scheduling pass.
25
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.
29
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.
33
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:
40
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.
49
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.
54
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
68 remaining slots.
69
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.
76
77 The following list shows the order in which we want to break ties
78 among insns in the ready list:
79
80 1. choose insn with the longest path to end of bb, ties
81 broken by
82 2. choose insn with least contribution to register pressure,
83 ties broken by
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
87 broken by
88 6. choose insn with the least dependences upon the previously
89 scheduled insn, or finally
2db45993
JL
90 7 choose the insn which has the most insns dependent on it.
91 8. choose insn with lowest UID.
8c660648
JL
92
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.
99
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 ().
103
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.
108
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
116 utilization.
117
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
121 of this case.
122
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.
127
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.
131
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).
136
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, basic_block_head,
140 basic_block_end.
141
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.
147
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. */
157\f
8c660648 158#include "config.h"
5835e573 159#include "system.h"
8c660648
JL
160#include "rtl.h"
161#include "basic-block.h"
162#include "regs.h"
163#include "hard-reg-set.h"
164#include "flags.h"
165#include "insn-config.h"
166#include "insn-attr.h"
167#include "except.h"
487a6e06 168#include "toplev.h"
8c660648
JL
169
170extern char *reg_known_equiv_p;
171extern rtx *reg_known_value;
172
173#ifdef INSN_SCHEDULING
174
8c660648
JL
175/* target_units bitmask has 1 for each unit in the cpu. It should be
176 possible to compute this variable from the machine description.
177 But currently it is computed by examinning the insn list. Since
178 this is only needed for visualization, it seems an acceptable
179 solution. (For understanding the mapping of bits to units, see
180 definition of function_units[] in "insn-attrtab.c") */
181
61822835 182static int target_units = 0;
8c660648
JL
183
184/* issue_rate is the number of insns that can be scheduled in the same
185 machine cycle. It can be defined in the config/mach/mach.h file,
186 otherwise we set it to 1. */
187
188static int issue_rate;
189
62d65906
JL
190#ifndef ISSUE_RATE
191#define ISSUE_RATE 1
8c660648
JL
192#endif
193
cc132865 194/* sched-verbose controls the amount of debugging output the
8c660648
JL
195 scheduler prints. It is controlled by -fsched-verbose-N:
196 N>0 and no -DSR : the output is directed to stderr.
197 N>=10 will direct the printouts to stderr (regardless of -dSR).
198 N=1: same as -dSR.
199 N=2: bb's probabilities, detailed ready list info, unit/insn info.
200 N=3: rtl at abort point, control-flow, regions info.
cc132865 201 N=5: dependences info. */
8c660648
JL
202
203#define MAX_RGN_BLOCKS 10
204#define MAX_RGN_INSNS 100
205
8c660648
JL
206static int sched_verbose_param = 0;
207static int sched_verbose = 0;
8c660648
JL
208
209/* nr_inter/spec counts interblock/speculative motion for the function */
210static int nr_inter, nr_spec;
211
212
213/* debugging file. all printouts are sent to dump, which is always set,
214 either to stderr, or to the dump listing file (-dRS). */
215static FILE *dump = 0;
216
217/* fix_sched_param() is called from toplev.c upon detection
218 of the -fsched-***-N options. */
219
220void
221fix_sched_param (param, val)
222 char *param, *val;
223{
cc132865 224 if (!strcmp (param, "verbose"))
8c660648 225 sched_verbose_param = atoi (val);
8c660648
JL
226 else
227 warning ("fix_sched_param: unknown param: %s", param);
228}
229
230
231/* Arrays set up by scheduling for the same respective purposes as
232 similar-named arrays set up by flow analysis. We work with these
233 arrays during the scheduling pass so we can compare values against
234 unscheduled code.
235
236 Values of these arrays are copied at the end of this pass into the
237 arrays set up by flow analysis. */
238static int *sched_reg_n_calls_crossed;
239static int *sched_reg_live_length;
240static int *sched_reg_basic_block;
241
242/* We need to know the current block number during the post scheduling
243 update of live register information so that we can also update
244 REG_BASIC_BLOCK if a register changes blocks. */
245static int current_block_num;
246
247/* Element N is the next insn that sets (hard or pseudo) register
248 N within the current basic block; or zero, if there is no
249 such insn. Needed for new registers which may be introduced
250 by splitting insns. */
251static rtx *reg_last_uses;
252static rtx *reg_last_sets;
253static regset reg_pending_sets;
254static int reg_pending_sets_all;
255
256/* Vector indexed by INSN_UID giving the original ordering of the insns. */
257static int *insn_luid;
258#define INSN_LUID(INSN) (insn_luid[INSN_UID (INSN)])
259
260/* Vector indexed by INSN_UID giving each instruction a priority. */
261static int *insn_priority;
262#define INSN_PRIORITY(INSN) (insn_priority[INSN_UID (INSN)])
263
264static short *insn_costs;
265#define INSN_COST(INSN) insn_costs[INSN_UID (INSN)]
266
267/* Vector indexed by INSN_UID giving an encoding of the function units
268 used. */
269static short *insn_units;
270#define INSN_UNIT(INSN) insn_units[INSN_UID (INSN)]
271
272/* Vector indexed by INSN_UID giving each instruction a register-weight.
273 This weight is an estimation of the insn contribution to registers pressure. */
274static int *insn_reg_weight;
275#define INSN_REG_WEIGHT(INSN) (insn_reg_weight[INSN_UID (INSN)])
276
277/* Vector indexed by INSN_UID giving list of insns which
278 depend upon INSN. Unlike LOG_LINKS, it represents forward dependences. */
279static rtx *insn_depend;
280#define INSN_DEPEND(INSN) insn_depend[INSN_UID (INSN)]
281
282/* Vector indexed by INSN_UID. Initialized to the number of incoming
283 edges in forward dependence graph (= number of LOG_LINKS). As
284 scheduling procedes, dependence counts are decreased. An
285 instruction moves to the ready list when its counter is zero. */
286static int *insn_dep_count;
287#define INSN_DEP_COUNT(INSN) (insn_dep_count[INSN_UID (INSN)])
288
289/* Vector indexed by INSN_UID giving an encoding of the blockage range
290 function. The unit and the range are encoded. */
291static unsigned int *insn_blockage;
292#define INSN_BLOCKAGE(INSN) insn_blockage[INSN_UID (INSN)]
293#define UNIT_BITS 5
294#define BLOCKAGE_MASK ((1 << BLOCKAGE_BITS) - 1)
295#define ENCODE_BLOCKAGE(U, R) \
296((((U) << UNIT_BITS) << BLOCKAGE_BITS \
297 | MIN_BLOCKAGE_COST (R)) << BLOCKAGE_BITS \
298 | MAX_BLOCKAGE_COST (R))
299#define UNIT_BLOCKED(B) ((B) >> (2 * BLOCKAGE_BITS))
300#define BLOCKAGE_RANGE(B) \
301 (((((B) >> BLOCKAGE_BITS) & BLOCKAGE_MASK) << (HOST_BITS_PER_INT / 2)) \
5835e573 302 | ((B) & BLOCKAGE_MASK))
8c660648
JL
303
304/* Encodings of the `<name>_unit_blockage_range' function. */
305#define MIN_BLOCKAGE_COST(R) ((R) >> (HOST_BITS_PER_INT / 2))
306#define MAX_BLOCKAGE_COST(R) ((R) & ((1 << (HOST_BITS_PER_INT / 2)) - 1))
307
308#define DONE_PRIORITY -1
309#define MAX_PRIORITY 0x7fffffff
310#define TAIL_PRIORITY 0x7ffffffe
311#define LAUNCH_PRIORITY 0x7f000001
312#define DONE_PRIORITY_P(INSN) (INSN_PRIORITY (INSN) < 0)
313#define LOW_PRIORITY_P(INSN) ((INSN_PRIORITY (INSN) & 0x7f000000) == 0)
314
315/* Vector indexed by INSN_UID giving number of insns referring to this insn. */
316static int *insn_ref_count;
317#define INSN_REF_COUNT(INSN) (insn_ref_count[INSN_UID (INSN)])
318
319/* Vector indexed by INSN_UID giving line-number note in effect for each
320 insn. For line-number notes, this indicates whether the note may be
321 reused. */
322static rtx *line_note;
323#define LINE_NOTE(INSN) (line_note[INSN_UID (INSN)])
324
325/* Vector indexed by basic block number giving the starting line-number
326 for each basic block. */
327static rtx *line_note_head;
328
329/* List of important notes we must keep around. This is a pointer to the
330 last element in the list. */
331static rtx note_list;
332
333/* Regsets telling whether a given register is live or dead before the last
334 scheduled insn. Must scan the instructions once before scheduling to
335 determine what registers are live or dead at the end of the block. */
336static regset bb_live_regs;
337
338/* Regset telling whether a given register is live after the insn currently
339 being scheduled. Before processing an insn, this is equal to bb_live_regs
340 above. This is used so that we can find registers that are newly born/dead
341 after processing an insn. */
342static regset old_live_regs;
343
344/* The chain of REG_DEAD notes. REG_DEAD notes are removed from all insns
345 during the initial scan and reused later. If there are not exactly as
346 many REG_DEAD notes in the post scheduled code as there were in the
347 prescheduled code then we trigger an abort because this indicates a bug. */
348static rtx dead_notes;
349
350/* Queues, etc. */
351
352/* An instruction is ready to be scheduled when all insns preceding it
353 have already been scheduled. It is important to ensure that all
354 insns which use its result will not be executed until its result
355 has been computed. An insn is maintained in one of four structures:
356
357 (P) the "Pending" set of insns which cannot be scheduled until
358 their dependencies have been satisfied.
359 (Q) the "Queued" set of insns that can be scheduled when sufficient
360 time has passed.
361 (R) the "Ready" list of unscheduled, uncommitted insns.
362 (S) the "Scheduled" list of insns.
363
364 Initially, all insns are either "Pending" or "Ready" depending on
365 whether their dependencies are satisfied.
366
367 Insns move from the "Ready" list to the "Scheduled" list as they
368 are committed to the schedule. As this occurs, the insns in the
369 "Pending" list have their dependencies satisfied and move to either
370 the "Ready" list or the "Queued" set depending on whether
371 sufficient time has passed to make them ready. As time passes,
372 insns move from the "Queued" set to the "Ready" list. Insns may
373 move from the "Ready" list to the "Queued" set if they are blocked
374 due to a function unit conflict.
375
376 The "Pending" list (P) are the insns in the INSN_DEPEND of the unscheduled
377 insns, i.e., those that are ready, queued, and pending.
378 The "Queued" set (Q) is implemented by the variable `insn_queue'.
379 The "Ready" list (R) is implemented by the variables `ready' and
380 `n_ready'.
381 The "Scheduled" list (S) is the new insn chain built by this pass.
382
383 The transition (R->S) is implemented in the scheduling loop in
384 `schedule_block' when the best insn to schedule is chosen.
385 The transition (R->Q) is implemented in `queue_insn' when an
38e01259 386 insn is found to have a function unit conflict with the already
8c660648
JL
387 committed insns.
388 The transitions (P->R and P->Q) are implemented in `schedule_insn' as
389 insns move from the ready list to the scheduled list.
390 The transition (Q->R) is implemented in 'queue_to_insn' as time
391 passes or stalls are introduced. */
392
393/* Implement a circular buffer to delay instructions until sufficient
394 time has passed. INSN_QUEUE_SIZE is a power of two larger than
395 MAX_BLOCKAGE and MAX_READY_COST computed by genattr.c. This is the
396 longest time an isnsn may be queued. */
397static rtx insn_queue[INSN_QUEUE_SIZE];
398static int q_ptr = 0;
399static int q_size = 0;
400#define NEXT_Q(X) (((X)+1) & (INSN_QUEUE_SIZE-1))
401#define NEXT_Q_AFTER(X, C) (((X)+C) & (INSN_QUEUE_SIZE-1))
402
403/* Vector indexed by INSN_UID giving the minimum clock tick at which
404 the insn becomes ready. This is used to note timing constraints for
405 insns in the pending list. */
406static int *insn_tick;
407#define INSN_TICK(INSN) (insn_tick[INSN_UID (INSN)])
408
409/* Data structure for keeping track of register information
410 during that register's life. */
411
412struct sometimes
413 {
414 int regno;
415 int live_length;
416 int calls_crossed;
417 };
418
419/* Forward declarations. */
420static void add_dependence PROTO ((rtx, rtx, enum reg_note));
421static void remove_dependence PROTO ((rtx, rtx));
422static rtx find_insn_list PROTO ((rtx, rtx));
423static int insn_unit PROTO ((rtx));
424static unsigned int blockage_range PROTO ((int, rtx));
425static void clear_units PROTO ((void));
426static int actual_hazard_this_instance PROTO ((int, int, rtx, int, int));
427static void schedule_unit PROTO ((int, rtx, int));
428static int actual_hazard PROTO ((int, rtx, int, int));
429static int potential_hazard PROTO ((int, rtx, int));
430static int insn_cost PROTO ((rtx, rtx, rtx));
431static int priority PROTO ((rtx));
432static void free_pending_lists PROTO ((void));
433static void add_insn_mem_dependence PROTO ((rtx *, rtx *, rtx, rtx));
434static void flush_pending_lists PROTO ((rtx, int));
435static void sched_analyze_1 PROTO ((rtx, rtx));
436static void sched_analyze_2 PROTO ((rtx, rtx));
437static void sched_analyze_insn PROTO ((rtx, rtx, rtx));
438static void sched_analyze PROTO ((rtx, rtx));
5835e573 439static void sched_note_set PROTO ((rtx, int));
01c7f350 440static int rank_for_schedule PROTO ((const GENERIC_PTR, const GENERIC_PTR));
8c660648
JL
441static void swap_sort PROTO ((rtx *, int));
442static void queue_insn PROTO ((rtx, int));
443static int schedule_insn PROTO ((rtx, rtx *, int, int));
444static void create_reg_dead_note PROTO ((rtx, rtx));
445static void attach_deaths PROTO ((rtx, rtx, int));
446static void attach_deaths_insn PROTO ((rtx));
447static int new_sometimes_live PROTO ((struct sometimes *, int, int));
448static void finish_sometimes_live PROTO ((struct sometimes *, int));
5835e573 449static int schedule_block PROTO ((int, int));
8c660648 450static rtx regno_use_in PROTO ((int, rtx));
5835e573 451static void split_hard_reg_notes PROTO ((rtx, rtx, rtx));
8c660648
JL
452static void new_insn_dead_notes PROTO ((rtx, rtx, rtx, rtx));
453static void update_n_sets PROTO ((rtx, int));
454static void update_flow_info PROTO ((rtx, rtx, rtx, rtx));
459b3825 455static char *safe_concat PROTO ((char *, char *, char *));
cc4fe0e2
L
456static int insn_issue_delay PROTO ((rtx));
457static int birthing_insn_p PROTO ((rtx));
458static void adjust_priority PROTO ((rtx));
8c660648
JL
459
460/* Mapping of insns to their original block prior to scheduling. */
461static int *insn_orig_block;
462#define INSN_BLOCK(insn) (insn_orig_block[INSN_UID (insn)])
463
464/* Some insns (e.g. call) are not allowed to move across blocks. */
465static char *cant_move;
466#define CANT_MOVE(insn) (cant_move[INSN_UID (insn)])
467
468/* Control flow graph edges are kept in circular lists. */
469typedef struct
470 {
471 int from_block;
472 int to_block;
473 int next_in;
474 int next_out;
475 }
476edge;
477static edge *edge_table;
478
479#define NEXT_IN(edge) (edge_table[edge].next_in)
480#define NEXT_OUT(edge) (edge_table[edge].next_out)
481#define FROM_BLOCK(edge) (edge_table[edge].from_block)
482#define TO_BLOCK(edge) (edge_table[edge].to_block)
483
484/* Number of edges in the control flow graph. (in fact larger than
485 that by 1, since edge 0 is unused.) */
486static int nr_edges;
487
488/* Circular list of incoming/outgoing edges of a block */
489static int *in_edges;
490static int *out_edges;
491
492#define IN_EDGES(block) (in_edges[block])
493#define OUT_EDGES(block) (out_edges[block])
494
495/* List of labels which cannot be deleted, needed for control
496 flow graph construction. */
497extern rtx forced_labels;
498
499
168cbdf9 500static int is_cfg_nonregular PROTO ((void));
a2e68776
JL
501static int build_control_flow PROTO ((int_list_ptr *, int_list_ptr *,
502 int *, int *));
8c660648
JL
503static void new_edge PROTO ((int, int));
504
505
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. */
509typedef struct
510 {
511 int rgn_nr_blocks; /* number of blocks in region */
512 int rgn_blocks; /* blocks in the region (actually index in rgn_bb_table) */
513 }
514region;
515
516/* Number of regions in the procedure */
517static int nr_regions;
518
519/* Table of region descriptions */
520static region *rgn_table;
521
522/* Array of lists of regions' blocks */
523static int *rgn_bb_table;
524
525/* Topological order of blocks in the region (if b2 is reachable from
526 b1, block_to_bb[b2] > block_to_bb[b1]).
527 Note: A basic block is always referred to by either block or b,
528 while its topological order name (in the region) is refered to by
529 bb.
530 */
531static int *block_to_bb;
532
533/* The number of the region containing a block. */
534static int *containing_rgn;
535
536#define RGN_NR_BLOCKS(rgn) (rgn_table[rgn].rgn_nr_blocks)
537#define RGN_BLOCKS(rgn) (rgn_table[rgn].rgn_blocks)
538#define BLOCK_TO_BB(block) (block_to_bb[block])
539#define CONTAINING_RGN(block) (containing_rgn[block])
540
541void debug_regions PROTO ((void));
542static void find_single_block_region PROTO ((void));
a2e68776
JL
543static void find_rgns PROTO ((int_list_ptr *, int_list_ptr *,
544 int *, int *, sbitmap *));
8c660648
JL
545static int too_large PROTO ((int, int *, int *));
546
547extern void debug_live PROTO ((int, int));
548
549/* Blocks of the current region being scheduled. */
550static int current_nr_blocks;
551static int current_blocks;
552
553/* The mapping from bb to block */
554#define BB_TO_BLOCK(bb) (rgn_bb_table[current_blocks + (bb)])
555
556
557/* Bit vectors and bitset operations are needed for computations on
558 the control flow graph. */
559
560typedef unsigned HOST_WIDE_INT *bitset;
561typedef struct
562 {
563 int *first_member; /* pointer to the list start in bitlst_table. */
564 int nr_members; /* the number of members of the bit list. */
565 }
566bitlst;
567
61822835
JL
568static int bitlst_table_last;
569static int bitlst_table_size;
8c660648
JL
570static int *bitlst_table;
571
572static char bitset_member PROTO ((bitset, int, int));
573static void extract_bitlst PROTO ((bitset, int, bitlst *));
574
575/* target info declarations.
576
577 The block currently being scheduled is referred to as the "target" block,
578 while other blocks in the region from which insns can be moved to the
579 target are called "source" blocks. The candidate structure holds info
580 about such sources: are they valid? Speculative? Etc. */
581typedef bitlst bblst;
582typedef struct
583 {
584 char is_valid;
585 char is_speculative;
586 int src_prob;
587 bblst split_bbs;
588 bblst update_bbs;
589 }
590candidate;
591
592static candidate *candidate_table;
593
594/* A speculative motion requires checking live information on the path
595 from 'source' to 'target'. The split blocks are those to be checked.
596 After a speculative motion, live information should be modified in
597 the 'update' blocks.
598
599 Lists of split and update blocks for each candidate of the current
600 target are in array bblst_table */
61822835 601static int *bblst_table, bblst_size, bblst_last;
8c660648
JL
602
603#define IS_VALID(src) ( candidate_table[src].is_valid )
604#define IS_SPECULATIVE(src) ( candidate_table[src].is_speculative )
605#define SRC_PROB(src) ( candidate_table[src].src_prob )
606
607/* The bb being currently scheduled. */
61822835 608static int target_bb;
8c660648
JL
609
610/* List of edges. */
611typedef bitlst edgelst;
612
613/* target info functions */
614static void split_edges PROTO ((int, int, edgelst *));
615static void compute_trg_info PROTO ((int));
616void debug_candidate PROTO ((int));
617void debug_candidates PROTO ((int));
618
619
620/* Bit-set of bbs, where bit 'i' stands for bb 'i'. */
621typedef bitset bbset;
622
623/* Number of words of the bbset. */
61822835 624static int bbset_size;
8c660648
JL
625
626/* Dominators array: dom[i] contains the bbset of dominators of
627 bb i in the region. */
61822835 628static bbset *dom;
8c660648
JL
629
630/* bb 0 is the only region entry */
631#define IS_RGN_ENTRY(bb) (!bb)
632
633/* Is bb_src dominated by bb_trg. */
634#define IS_DOMINATED(bb_src, bb_trg) \
635( bitset_member (dom[bb_src], bb_trg, bbset_size) )
636
637/* Probability: Prob[i] is a float in [0, 1] which is the probability
638 of bb i relative to the region entry. */
61822835 639static float *prob;
8c660648
JL
640
641/* The probability of bb_src, relative to bb_trg. Note, that while the
642 'prob[bb]' is a float in [0, 1], this macro returns an integer
643 in [0, 100]. */
644#define GET_SRC_PROB(bb_src, bb_trg) ((int) (100.0 * (prob[bb_src] / \
645 prob[bb_trg])))
646
647/* Bit-set of edges, where bit i stands for edge i. */
648typedef bitset edgeset;
649
650/* Number of edges in the region. */
61822835 651static int rgn_nr_edges;
8c660648
JL
652
653/* Array of size rgn_nr_edges. */
61822835 654static int *rgn_edges;
8c660648
JL
655
656/* Number of words in an edgeset. */
61822835 657static int edgeset_size;
8c660648
JL
658
659/* Mapping from each edge in the graph to its number in the rgn. */
61822835 660static int *edge_to_bit;
8c660648
JL
661#define EDGE_TO_BIT(edge) (edge_to_bit[edge])
662
663/* The split edges of a source bb is different for each target
664 bb. In order to compute this efficiently, the 'potential-split edges'
665 are computed for each bb prior to scheduling a region. This is actually
666 the split edges of each bb relative to the region entry.
667
668 pot_split[bb] is the set of potential split edges of bb. */
61822835 669static edgeset *pot_split;
8c660648
JL
670
671/* For every bb, a set of its ancestor edges. */
61822835 672static edgeset *ancestor_edges;
8c660648
JL
673
674static void compute_dom_prob_ps PROTO ((int));
675
676#define ABS_VALUE(x) (((x)<0)?(-(x)):(x))
677#define INSN_PROBABILITY(INSN) (SRC_PROB (BLOCK_TO_BB (INSN_BLOCK (INSN))))
678#define IS_SPECULATIVE_INSN(INSN) (IS_SPECULATIVE (BLOCK_TO_BB (INSN_BLOCK (INSN))))
679#define INSN_BB(INSN) (BLOCK_TO_BB (INSN_BLOCK (INSN)))
680
681/* parameters affecting the decision of rank_for_schedule() */
682#define MIN_DIFF_PRIORITY 2
683#define MIN_PROBABILITY 40
684#define MIN_PROB_DIFF 10
685
686/* speculative scheduling functions */
687static int check_live_1 PROTO ((int, rtx));
688static void update_live_1 PROTO ((int, rtx));
5835e573
KG
689static int check_live PROTO ((rtx, int));
690static void update_live PROTO ((rtx, int));
8c660648
JL
691static void set_spec_fed PROTO ((rtx));
692static int is_pfree PROTO ((rtx, int, int));
693static int find_conditional_protection PROTO ((rtx, int));
694static int is_conditionally_protected PROTO ((rtx, int, int));
695static int may_trap_exp PROTO ((rtx, int));
ac957f13 696static int haifa_classify_insn PROTO ((rtx));
e009aaf3 697static int is_prisky PROTO ((rtx, int, int));
8c660648
JL
698static int is_exception_free PROTO ((rtx, int, int));
699
700static char find_insn_mem_list PROTO ((rtx, rtx, rtx, rtx));
701static void compute_block_forward_dependences PROTO ((int));
702static void init_rgn_data_dependences PROTO ((int));
703static void add_branch_dependences PROTO ((rtx, rtx));
704static void compute_block_backward_dependences PROTO ((int));
705void debug_dependencies PROTO ((void));
706
707/* Notes handling mechanism:
708 =========================
709 Generally, NOTES are saved before scheduling and restored after scheduling.
710 The scheduler distinguishes between three types of notes:
711
712 (1) LINE_NUMBER notes, generated and used for debugging. Here,
713 before scheduling a region, a pointer to the LINE_NUMBER note is
714 added to the insn following it (in save_line_notes()), and the note
715 is removed (in rm_line_notes() and unlink_line_notes()). After
716 scheduling the region, this pointer is used for regeneration of
717 the LINE_NUMBER note (in restore_line_notes()).
718
719 (2) LOOP_BEGIN, LOOP_END, SETJMP, EHREGION_BEG, EHREGION_END notes:
720 Before scheduling a region, a pointer to the note is added to the insn
721 that follows or precedes it. (This happens as part of the data dependence
722 computation). After scheduling an insn, the pointer contained in it is
723 used for regenerating the corresponding note (in reemit_notes).
724
725 (3) All other notes (e.g. INSN_DELETED): Before scheduling a block,
726 these notes are put in a list (in rm_other_notes() and
727 unlink_other_notes ()). After scheduling the block, these notes are
728 inserted at the beginning of the block (in schedule_block()). */
729
730static rtx unlink_other_notes PROTO ((rtx, rtx));
731static rtx unlink_line_notes PROTO ((rtx, rtx));
732static void rm_line_notes PROTO ((int));
733static void save_line_notes PROTO ((int));
734static void restore_line_notes PROTO ((int));
735static void rm_redundant_line_notes PROTO ((void));
736static void rm_other_notes PROTO ((rtx, rtx));
737static rtx reemit_notes PROTO ((rtx, rtx));
738
739static void get_block_head_tail PROTO ((int, rtx *, rtx *));
740
741static void find_pre_sched_live PROTO ((int));
742static void find_post_sched_live PROTO ((int));
743static void update_reg_usage PROTO ((void));
c6a754f2 744static int queue_to_ready PROTO ((rtx [], int));
8c660648 745
9a8b0889 746static void debug_ready_list PROTO ((rtx[], int));
cc4fe0e2 747static void init_target_units PROTO ((void));
8c660648 748static void insn_print_units PROTO ((rtx));
cc4fe0e2
L
749static int get_visual_tbl_length PROTO ((void));
750static void init_block_visualization PROTO ((void));
8c660648
JL
751static void print_block_visualization PROTO ((int, char *));
752static void visualize_scheduled_insns PROTO ((int, int));
753static void visualize_no_unit PROTO ((rtx));
754static void visualize_stall_cycles PROTO ((int, int));
755static void print_exp PROTO ((char *, rtx, int));
756static void print_value PROTO ((char *, rtx, int));
757static void print_pattern PROTO ((char *, rtx, int));
758static void print_insn PROTO ((char *, rtx, int));
759void debug_reg_vector PROTO ((regset));
760
761static rtx move_insn1 PROTO ((rtx, rtx));
762static rtx move_insn PROTO ((rtx, rtx));
763static rtx group_leader PROTO ((rtx));
764static int set_priorities PROTO ((int));
765static void init_rtx_vector PROTO ((rtx **, rtx *, int, int));
766static void schedule_region PROTO ((int));
767static void split_block_insns PROTO ((int));
768
769#endif /* INSN_SCHEDULING */
770\f
771#define SIZE_FOR_MODE(X) (GET_MODE_SIZE (GET_MODE (X)))
772
773/* Helper functions for instruction scheduling. */
774
ebb7b10b
RH
775/* An INSN_LIST containing all INSN_LISTs allocated but currently unused. */
776static rtx unused_insn_list;
777
778/* An EXPR_LIST containing all EXPR_LISTs allocated but currently unused. */
779static rtx unused_expr_list;
780
781static void free_list PROTO ((rtx *, rtx *));
782static rtx alloc_INSN_LIST PROTO ((rtx, rtx));
783static rtx alloc_EXPR_LIST PROTO ((int, rtx, rtx));
784
785static void
786free_list (listp, unused_listp)
787 rtx *listp, *unused_listp;
788{
789 register rtx link, prev_link;
790
791 if (*listp == 0)
792 return;
793
794 prev_link = *listp;
795 link = XEXP (prev_link, 1);
796
797 while (link)
798 {
799 prev_link = link;
800 link = XEXP (link, 1);
801 }
802
803 XEXP (prev_link, 1) = *unused_listp;
804 *unused_listp = *listp;
805 *listp = 0;
806}
807
459b3825 808static rtx
ebb7b10b
RH
809alloc_INSN_LIST (val, next)
810 rtx val, next;
811{
812 rtx r;
813
814 if (unused_insn_list)
815 {
816 r = unused_insn_list;
817 unused_insn_list = XEXP (r, 1);
818 XEXP (r, 0) = val;
819 XEXP (r, 1) = next;
820 PUT_REG_NOTE_KIND (r, VOIDmode);
821 }
822 else
823 r = gen_rtx_INSN_LIST (VOIDmode, val, next);
824
825 return r;
826}
827
459b3825 828static rtx
ebb7b10b
RH
829alloc_EXPR_LIST (kind, val, next)
830 int kind;
831 rtx val, next;
832{
833 rtx r;
834
c92293e7 835 if (unused_expr_list)
ebb7b10b 836 {
c92293e7
CM
837 r = unused_expr_list;
838 unused_expr_list = XEXP (r, 1);
ebb7b10b
RH
839 XEXP (r, 0) = val;
840 XEXP (r, 1) = next;
841 PUT_REG_NOTE_KIND (r, kind);
842 }
843 else
844 r = gen_rtx_EXPR_LIST (kind, val, next);
845
846 return r;
847}
848
8c660648
JL
849/* Add ELEM wrapped in an INSN_LIST with reg note kind DEP_TYPE to the
850 LOG_LINKS of INSN, if not already there. DEP_TYPE indicates the type
851 of dependence that this link represents. */
852
853static void
854add_dependence (insn, elem, dep_type)
855 rtx insn;
856 rtx elem;
857 enum reg_note dep_type;
858{
859 rtx link, next;
860
861 /* Don't depend an insn on itself. */
862 if (insn == elem)
863 return;
864
865 /* If elem is part of a sequence that must be scheduled together, then
866 make the dependence point to the last insn of the sequence.
867 When HAVE_cc0, it is possible for NOTEs to exist between users and
868 setters of the condition codes, so we must skip past notes here.
869 Otherwise, NOTEs are impossible here. */
870
871 next = NEXT_INSN (elem);
872
873#ifdef HAVE_cc0
874 while (next && GET_CODE (next) == NOTE)
875 next = NEXT_INSN (next);
876#endif
877
878 if (next && SCHED_GROUP_P (next)
879 && GET_CODE (next) != CODE_LABEL)
880 {
881 /* Notes will never intervene here though, so don't bother checking
882 for them. */
883 /* We must reject CODE_LABELs, so that we don't get confused by one
884 that has LABEL_PRESERVE_P set, which is represented by the same
885 bit in the rtl as SCHED_GROUP_P. A CODE_LABEL can never be
886 SCHED_GROUP_P. */
887 while (NEXT_INSN (next) && SCHED_GROUP_P (NEXT_INSN (next))
888 && GET_CODE (NEXT_INSN (next)) != CODE_LABEL)
889 next = NEXT_INSN (next);
890
891 /* Again, don't depend an insn on itself. */
892 if (insn == next)
893 return;
894
895 /* Make the dependence to NEXT, the last insn of the group, instead
896 of the original ELEM. */
897 elem = next;
898 }
899
900#ifdef INSN_SCHEDULING
901 /* (This code is guarded by INSN_SCHEDULING, otherwise INSN_BB is undefined.)
902 No need for interblock dependences with calls, since
903 calls are not moved between blocks. Note: the edge where
904 elem is a CALL is still required. */
905 if (GET_CODE (insn) == CALL_INSN
906 && (INSN_BB (elem) != INSN_BB (insn)))
907 return;
908
909#endif
910
911 /* Check that we don't already have this dependence. */
912 for (link = LOG_LINKS (insn); link; link = XEXP (link, 1))
913 if (XEXP (link, 0) == elem)
914 {
915 /* If this is a more restrictive type of dependence than the existing
916 one, then change the existing dependence to this type. */
917 if ((int) dep_type < (int) REG_NOTE_KIND (link))
918 PUT_REG_NOTE_KIND (link, dep_type);
919 return;
920 }
921 /* Might want to check one level of transitivity to save conses. */
922
ebb7b10b
RH
923 link = alloc_INSN_LIST (elem, LOG_LINKS (insn));
924 LOG_LINKS (insn) = link;
925
8c660648
JL
926 /* Insn dependency, not data dependency. */
927 PUT_REG_NOTE_KIND (link, dep_type);
8c660648
JL
928}
929
930/* Remove ELEM wrapped in an INSN_LIST from the LOG_LINKS
931 of INSN. Abort if not found. */
932
933static void
934remove_dependence (insn, elem)
935 rtx insn;
936 rtx elem;
937{
ebb7b10b 938 rtx prev, link, next;
8c660648
JL
939 int found = 0;
940
ebb7b10b 941 for (prev = 0, link = LOG_LINKS (insn); link; link = next)
8c660648 942 {
ebb7b10b 943 next = XEXP (link, 1);
8c660648
JL
944 if (XEXP (link, 0) == elem)
945 {
946 if (prev)
ebb7b10b 947 XEXP (prev, 1) = next;
8c660648 948 else
ebb7b10b
RH
949 LOG_LINKS (insn) = next;
950
951 XEXP (link, 1) = unused_insn_list;
952 unused_insn_list = link;
953
8c660648
JL
954 found = 1;
955 }
6d8ccdbb
JL
956 else
957 prev = link;
8c660648
JL
958 }
959
960 if (!found)
961 abort ();
962 return;
963}
964\f
965#ifndef INSN_SCHEDULING
966void
967schedule_insns (dump_file)
968 FILE *dump_file;
969{
970}
971#else
972#ifndef __GNUC__
973#define __inline
974#endif
975
cbb13457
MM
976#ifndef HAIFA_INLINE
977#define HAIFA_INLINE __inline
978#endif
979
8c660648
JL
980/* Computation of memory dependencies. */
981
982/* The *_insns and *_mems are paired lists. Each pending memory operation
983 will have a pointer to the MEM rtx on one list and a pointer to the
984 containing insn on the other list in the same place in the list. */
985
986/* We can't use add_dependence like the old code did, because a single insn
987 may have multiple memory accesses, and hence needs to be on the list
988 once for each memory access. Add_dependence won't let you add an insn
989 to a list more than once. */
990
991/* An INSN_LIST containing all insns with pending read operations. */
992static rtx pending_read_insns;
993
994/* An EXPR_LIST containing all MEM rtx's which are pending reads. */
995static rtx pending_read_mems;
996
997/* An INSN_LIST containing all insns with pending write operations. */
998static rtx pending_write_insns;
999
1000/* An EXPR_LIST containing all MEM rtx's which are pending writes. */
1001static rtx pending_write_mems;
1002
1003/* Indicates the combined length of the two pending lists. We must prevent
1004 these lists from ever growing too large since the number of dependencies
1005 produced is at least O(N*N), and execution time is at least O(4*N*N), as
1006 a function of the length of these pending lists. */
1007
1008static int pending_lists_length;
1009
8c660648
JL
1010/* The last insn upon which all memory references must depend.
1011 This is an insn which flushed the pending lists, creating a dependency
1012 between it and all previously pending memory references. This creates
1013 a barrier (or a checkpoint) which no memory reference is allowed to cross.
1014
1015 This includes all non constant CALL_INSNs. When we do interprocedural
1016 alias analysis, this restriction can be relaxed.
1017 This may also be an INSN that writes memory if the pending lists grow
1018 too large. */
1019
1020static rtx last_pending_memory_flush;
1021
1022/* The last function call we have seen. All hard regs, and, of course,
1023 the last function call, must depend on this. */
1024
1025static rtx last_function_call;
1026
1027/* The LOG_LINKS field of this is a list of insns which use a pseudo register
1028 that does not already cross a call. We create dependencies between each
1029 of those insn and the next call insn, to ensure that they won't cross a call
1030 after scheduling is done. */
1031
1032static rtx sched_before_next_call;
1033
1034/* Pointer to the last instruction scheduled. Used by rank_for_schedule,
1035 so that insns independent of the last scheduled insn will be preferred
1036 over dependent instructions. */
1037
1038static rtx last_scheduled_insn;
1039
1040/* Data structures for the computation of data dependences in a regions. We
1041 keep one copy of each of the declared above variables for each bb in the
1042 region. Before analyzing the data dependences for a bb, its variables
1043 are initialized as a function of the variables of its predecessors. When
1044 the analysis for a bb completes, we save the contents of each variable X
1045 to a corresponding bb_X[bb] variable. For example, pending_read_insns is
1046 copied to bb_pending_read_insns[bb]. Another change is that few
1047 variables are now a list of insns rather than a single insn:
1048 last_pending_memory_flash, last_function_call, reg_last_sets. The
1049 manipulation of these variables was changed appropriately. */
1050
1051static rtx **bb_reg_last_uses;
1052static rtx **bb_reg_last_sets;
1053
1054static rtx *bb_pending_read_insns;
1055static rtx *bb_pending_read_mems;
1056static rtx *bb_pending_write_insns;
1057static rtx *bb_pending_write_mems;
1058static int *bb_pending_lists_length;
1059
1060static rtx *bb_last_pending_memory_flush;
1061static rtx *bb_last_function_call;
1062static rtx *bb_sched_before_next_call;
1063
1064/* functions for construction of the control flow graph. */
1065
1066/* Return 1 if control flow graph should not be constructed, 0 otherwise.
168cbdf9 1067
8c660648 1068 We decide not to build the control flow graph if there is possibly more
168cbdf9
JL
1069 than one entry to the function, if computed branches exist, of if we
1070 have nonlocal gotos. */
8c660648 1071
168cbdf9 1072static int
8c660648
JL
1073is_cfg_nonregular ()
1074{
1075 int b;
1076 rtx insn;
1077 RTX_CODE code;
1078
168cbdf9
JL
1079 /* If we have a label that could be the target of a nonlocal goto, then
1080 the cfg is not well structured. */
1081 if (nonlocal_label_rtx_list () != NULL)
1082 return 1;
8c660648 1083
168cbdf9 1084 /* If we have any forced labels, then the cfg is not well structured. */
8c660648 1085 if (forced_labels)
168cbdf9 1086 return 1;
8c660648 1087
4d1d8045
BS
1088 /* If this function has a computed jump, then we consider the cfg
1089 not well structured. */
1090 if (current_function_has_computed_jump)
1091 return 1;
1092
168cbdf9
JL
1093 /* If we have exception handlers, then we consider the cfg not well
1094 structured. ?!? We should be able to handle this now that flow.c
1095 computes an accurate cfg for EH. */
8c660648 1096 if (exception_handler_labels)
168cbdf9 1097 return 1;
8c660648 1098
168cbdf9
JL
1099 /* If we have non-jumping insns which refer to labels, then we consider
1100 the cfg not well structured. */
8c660648
JL
1101 /* check for labels referred to other thn by jumps */
1102 for (b = 0; b < n_basic_blocks; b++)
1103 for (insn = basic_block_head[b];; insn = NEXT_INSN (insn))
1104 {
1105 code = GET_CODE (insn);
1106 if (GET_RTX_CLASS (code) == 'i')
1107 {
1108 rtx note;
1109
1110 for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
1111 if (REG_NOTE_KIND (note) == REG_LABEL)
168cbdf9 1112 return 1;
8c660648
JL
1113 }
1114
1115 if (insn == basic_block_end[b])
1116 break;
1117 }
1118
168cbdf9 1119 /* All the tests passed. Consider the cfg well structured. */
8c660648
JL
1120 return 0;
1121}
1122
5ece9746
JL
1123/* Build the control flow graph and set nr_edges.
1124
1125 Instead of trying to build a cfg ourselves, we rely on flow to
168cbdf9 1126 do it for us. Stamp out useless code (and bug) duplication.
8c660648 1127
168cbdf9
JL
1128 Return nonzero if an irregularity in the cfg is found which would
1129 prevent cross block scheduling. */
1130
1131static int
a2e68776
JL
1132build_control_flow (s_preds, s_succs, num_preds, num_succs)
1133 int_list_ptr *s_preds;
1134 int_list_ptr *s_succs;
1135 int *num_preds;
1136 int *num_succs;
8c660648 1137{
081f5e7e 1138 int i;
5ece9746 1139 int_list_ptr succ;
168cbdf9 1140 int unreachable;
5ece9746 1141
168cbdf9
JL
1142 /* Count the number of edges in the cfg. */
1143 nr_edges = 0;
1144 unreachable = 0;
1145 for (i = 0; i < n_basic_blocks; i++)
1146 {
1147 nr_edges += num_succs[i];
15ebe47d
JL
1148
1149 /* Unreachable loops with more than one basic block are detected
1150 during the DFS traversal in find_rgns.
1151
1152 Unreachable loops with a single block are detected here. This
1153 test is redundant with the one in find_rgns, but it's much
1154 cheaper to go ahead and catch the trivial case here. */
a8afd67b
JW
1155 if (num_preds[i] == 0
1156 || (num_preds[i] == 1 && INT_LIST_VAL (s_preds[i]) == i))
168cbdf9
JL
1157 unreachable = 1;
1158 }
1159
1160 /* Account for entry/exit edges. */
1161 nr_edges += 2;
1162
1163 in_edges = (int *) xmalloc (n_basic_blocks * sizeof (int));
1164 out_edges = (int *) xmalloc (n_basic_blocks * sizeof (int));
1165 bzero ((char *) in_edges, n_basic_blocks * sizeof (int));
1166 bzero ((char *) out_edges, n_basic_blocks * sizeof (int));
1167
1168 edge_table = (edge *) xmalloc ((nr_edges) * sizeof (edge));
1169 bzero ((char *) edge_table, ((nr_edges) * sizeof (edge)));
1170
8c660648
JL
1171 nr_edges = 0;
1172 for (i = 0; i < n_basic_blocks; i++)
5ece9746
JL
1173 for (succ = s_succs[i]; succ; succ = succ->next)
1174 {
1175 if (INT_LIST_VAL (succ) != EXIT_BLOCK)
1176 new_edge (i, INT_LIST_VAL (succ));
1177 }
8c660648
JL
1178
1179 /* increment by 1, since edge 0 is unused. */
1180 nr_edges++;
1181
168cbdf9 1182 return unreachable;
8c660648
JL
1183}
1184
1185
5ece9746 1186/* Record an edge in the control flow graph from SOURCE to TARGET.
8c660648 1187
5ece9746
JL
1188 In theory, this is redundant with the s_succs computed above, but
1189 we have not converted all of haifa to use information from the
1190 integer lists. */
8c660648
JL
1191
1192static void
1193new_edge (source, target)
1194 int source, target;
1195{
1196 int e, next_edge;
1197 int curr_edge, fst_edge;
1198
1199 /* check for duplicates */
1200 fst_edge = curr_edge = OUT_EDGES (source);
1201 while (curr_edge)
1202 {
1203 if (FROM_BLOCK (curr_edge) == source
1204 && TO_BLOCK (curr_edge) == target)
1205 {
1206 return;
1207 }
1208
1209 curr_edge = NEXT_OUT (curr_edge);
1210
1211 if (fst_edge == curr_edge)
1212 break;
1213 }
1214
1215 e = ++nr_edges;
1216
1217 FROM_BLOCK (e) = source;
1218 TO_BLOCK (e) = target;
1219
1220 if (OUT_EDGES (source))
1221 {
1222 next_edge = NEXT_OUT (OUT_EDGES (source));
1223 NEXT_OUT (OUT_EDGES (source)) = e;
1224 NEXT_OUT (e) = next_edge;
1225 }
1226 else
1227 {
1228 OUT_EDGES (source) = e;
1229 NEXT_OUT (e) = e;
1230 }
1231
1232 if (IN_EDGES (target))
1233 {
1234 next_edge = NEXT_IN (IN_EDGES (target));
1235 NEXT_IN (IN_EDGES (target)) = e;
1236 NEXT_IN (e) = next_edge;
1237 }
1238 else
1239 {
1240 IN_EDGES (target) = e;
1241 NEXT_IN (e) = e;
1242 }
1243}
1244
1245
1246/* BITSET macros for operations on the control flow graph. */
1247
1248/* Compute bitwise union of two bitsets. */
1249#define BITSET_UNION(set1, set2, len) \
1250do { register bitset tp = set1, sp = set2; \
1251 register int i; \
1252 for (i = 0; i < len; i++) \
1253 *(tp++) |= *(sp++); } while (0)
1254
1255/* Compute bitwise intersection of two bitsets. */
1256#define BITSET_INTER(set1, set2, len) \
1257do { register bitset tp = set1, sp = set2; \
1258 register int i; \
1259 for (i = 0; i < len; i++) \
1260 *(tp++) &= *(sp++); } while (0)
1261
1262/* Compute bitwise difference of two bitsets. */
1263#define BITSET_DIFFER(set1, set2, len) \
1264do { register bitset tp = set1, sp = set2; \
1265 register int i; \
1266 for (i = 0; i < len; i++) \
1267 *(tp++) &= ~*(sp++); } while (0)
1268
1269/* Inverts every bit of bitset 'set' */
1270#define BITSET_INVERT(set, len) \
1271do { register bitset tmpset = set; \
1272 register int i; \
1273 for (i = 0; i < len; i++, tmpset++) \
1274 *tmpset = ~*tmpset; } while (0)
1275
1276/* Turn on the index'th bit in bitset set. */
1277#define BITSET_ADD(set, index, len) \
1278{ \
1279 if (index >= HOST_BITS_PER_WIDE_INT * len) \
1280 abort (); \
1281 else \
1282 set[index/HOST_BITS_PER_WIDE_INT] |= \
1283 1 << (index % HOST_BITS_PER_WIDE_INT); \
1284}
1285
1286/* Turn off the index'th bit in set. */
1287#define BITSET_REMOVE(set, index, len) \
1288{ \
1289 if (index >= HOST_BITS_PER_WIDE_INT * len) \
1290 abort (); \
1291 else \
1292 set[index/HOST_BITS_PER_WIDE_INT] &= \
1293 ~(1 << (index%HOST_BITS_PER_WIDE_INT)); \
1294}
1295
1296
1297/* Check if the index'th bit in bitset set is on. */
1298
1299static char
1300bitset_member (set, index, len)
1301 bitset set;
1302 int index, len;
1303{
1304 if (index >= HOST_BITS_PER_WIDE_INT * len)
1305 abort ();
1306 return (set[index / HOST_BITS_PER_WIDE_INT] &
1307 1 << (index % HOST_BITS_PER_WIDE_INT)) ? 1 : 0;
1308}
1309
1310
1311/* Translate a bit-set SET to a list BL of the bit-set members. */
1312
1313static void
1314extract_bitlst (set, len, bl)
1315 bitset set;
1316 int len;
1317 bitlst *bl;
1318{
1319 int i, j, offset;
1320 unsigned HOST_WIDE_INT word;
1321
1322 /* bblst table space is reused in each call to extract_bitlst */
1323 bitlst_table_last = 0;
1324
1325 bl->first_member = &bitlst_table[bitlst_table_last];
1326 bl->nr_members = 0;
1327
1328 for (i = 0; i < len; i++)
1329 {
1330 word = set[i];
1331 offset = i * HOST_BITS_PER_WIDE_INT;
1332 for (j = 0; word; j++)
1333 {
1334 if (word & 1)
1335 {
1336 bitlst_table[bitlst_table_last++] = offset;
1337 (bl->nr_members)++;
1338 }
1339 word >>= 1;
1340 ++offset;
1341 }
1342 }
1343
1344}
1345
1346
1347/* functions for the construction of regions */
1348
1349/* Print the regions, for debugging purposes. Callable from debugger. */
1350
1351void
1352debug_regions ()
1353{
1354 int rgn, bb;
1355
1356 fprintf (dump, "\n;; ------------ REGIONS ----------\n\n");
1357 for (rgn = 0; rgn < nr_regions; rgn++)
1358 {
1359 fprintf (dump, ";;\trgn %d nr_blocks %d:\n", rgn,
1360 rgn_table[rgn].rgn_nr_blocks);
1361 fprintf (dump, ";;\tbb/block: ");
1362
1363 for (bb = 0; bb < rgn_table[rgn].rgn_nr_blocks; bb++)
1364 {
1365 current_blocks = RGN_BLOCKS (rgn);
1366
1367 if (bb != BLOCK_TO_BB (BB_TO_BLOCK (bb)))
1368 abort ();
1369
1370 fprintf (dump, " %d/%d ", bb, BB_TO_BLOCK (bb));
1371 }
1372
1373 fprintf (dump, "\n\n");
1374 }
1375}
1376
1377
1378/* Build a single block region for each basic block in the function.
1379 This allows for using the same code for interblock and basic block
1380 scheduling. */
1381
1382static void
1383find_single_block_region ()
1384{
1385 int i;
1386
1387 for (i = 0; i < n_basic_blocks; i++)
1388 {
1389 rgn_bb_table[i] = i;
1390 RGN_NR_BLOCKS (i) = 1;
1391 RGN_BLOCKS (i) = i;
1392 CONTAINING_RGN (i) = i;
1393 BLOCK_TO_BB (i) = 0;
1394 }
1395 nr_regions = n_basic_blocks;
1396}
1397
1398
1399/* Update number of blocks and the estimate for number of insns
1400 in the region. Return 1 if the region is "too large" for interblock
1401 scheduling (compile time considerations), otherwise return 0. */
1402
1403static int
1404too_large (block, num_bbs, num_insns)
1405 int block, *num_bbs, *num_insns;
1406{
1407 (*num_bbs)++;
1408 (*num_insns) += (INSN_LUID (basic_block_end[block]) -
1409 INSN_LUID (basic_block_head[block]));
cc132865 1410 if ((*num_bbs > MAX_RGN_BLOCKS) || (*num_insns > MAX_RGN_INSNS))
8c660648
JL
1411 return 1;
1412 else
1413 return 0;
1414}
1415
1416
1417/* Update_loop_relations(blk, hdr): Check if the loop headed by max_hdr[blk]
1418 is still an inner loop. Put in max_hdr[blk] the header of the most inner
1419 loop containing blk. */
1420#define UPDATE_LOOP_RELATIONS(blk, hdr) \
1421{ \
1422 if (max_hdr[blk] == -1) \
1423 max_hdr[blk] = hdr; \
1424 else if (dfs_nr[max_hdr[blk]] > dfs_nr[hdr]) \
a2e68776 1425 RESET_BIT (inner, hdr); \
8c660648
JL
1426 else if (dfs_nr[max_hdr[blk]] < dfs_nr[hdr]) \
1427 { \
a2e68776 1428 RESET_BIT (inner,max_hdr[blk]); \
8c660648
JL
1429 max_hdr[blk] = hdr; \
1430 } \
1431}
1432
1433
a2e68776
JL
1434/* Find regions for interblock scheduling.
1435
1436 A region for scheduling can be:
1437
1438 * A loop-free procedure, or
1439
1440 * A reducible inner loop, or
1441
1442 * A basic block not contained in any other region.
1443
1444
1445 ?!? In theory we could build other regions based on extended basic
1446 blocks or reverse extended basic blocks. Is it worth the trouble?
1447
1448 Loop blocks that form a region are put into the region's block list
1449 in topological order.
1450
1451 This procedure stores its results into the following global (ick) variables
1452
1453 * rgn_nr
1454 * rgn_table
1455 * rgn_bb_table
1456 * block_to_bb
1457 * containing region
1458
1459
1460 We use dominator relationships to avoid making regions out of non-reducible
1461 loops.
8c660648 1462
a2e68776
JL
1463 This procedure needs to be converted to work on pred/succ lists instead
1464 of edge tables. That would simplify it somewhat. */
8c660648
JL
1465
1466static void
a2e68776
JL
1467find_rgns (s_preds, s_succs, num_preds, num_succs, dom)
1468 int_list_ptr *s_preds;
1469 int_list_ptr *s_succs;
1470 int *num_preds;
1471 int *num_succs;
1472 sbitmap *dom;
8c660648
JL
1473{
1474 int *max_hdr, *dfs_nr, *stack, *queue, *degree;
a2e68776 1475 char no_loops = 1;
487a6e06 1476 int node, child, loop_head, i, head, tail;
8c660648 1477 int count = 0, sp, idx = 0, current_edge = out_edges[0];
15ebe47d 1478 int num_bbs, num_insns, unreachable;
8c660648 1479 int too_large_failure;
8c660648 1480
a2e68776
JL
1481 /* Note if an edge has been passed. */
1482 sbitmap passed;
1483
1484 /* Note if a block is a natural loop header. */
1485 sbitmap header;
1486
1487 /* Note if a block is an natural inner loop header. */
1488 sbitmap inner;
1489
1490 /* Note if a block is in the block queue. */
1491 sbitmap in_queue;
1492
cc132865
JL
1493 /* Note if a block is in the block queue. */
1494 sbitmap in_stack;
1495
a2e68776
JL
1496 /* Perform a DFS traversal of the cfg. Identify loop headers, inner loops
1497 and a mapping from block to its loop header (if the block is contained
1498 in a loop, else -1).
1499
1500 Store results in HEADER, INNER, and MAX_HDR respectively, these will
1501 be used as inputs to the second traversal.
1502
1503 STACK, SP and DFS_NR are only used during the first traversal. */
1504
1505 /* Allocate and initialize variables for the first traversal. */
8c660648
JL
1506 max_hdr = (int *) alloca (n_basic_blocks * sizeof (int));
1507 dfs_nr = (int *) alloca (n_basic_blocks * sizeof (int));
52b7724b 1508 bzero ((char *) dfs_nr, n_basic_blocks * sizeof (int));
8c660648 1509 stack = (int *) alloca (nr_edges * sizeof (int));
8c660648 1510
a2e68776
JL
1511 inner = sbitmap_alloc (n_basic_blocks);
1512 sbitmap_ones (inner);
1513
1514 header = sbitmap_alloc (n_basic_blocks);
1515 sbitmap_zero (header);
8c660648 1516
a2e68776
JL
1517 passed = sbitmap_alloc (nr_edges);
1518 sbitmap_zero (passed);
1519
1520 in_queue = sbitmap_alloc (n_basic_blocks);
1521 sbitmap_zero (in_queue);
8c660648 1522
cc132865
JL
1523 in_stack = sbitmap_alloc (n_basic_blocks);
1524 sbitmap_zero (in_stack);
1525
8c660648 1526 for (i = 0; i < n_basic_blocks; i++)
a2e68776 1527 max_hdr[i] = -1;
8c660648 1528
a2e68776 1529 /* DFS traversal to find inner loops in the cfg. */
8c660648 1530
8c660648
JL
1531 sp = -1;
1532 while (1)
1533 {
a2e68776 1534 if (current_edge == 0 || TEST_BIT (passed, current_edge))
8c660648 1535 {
a2e68776 1536 /* We have reached a leaf node or a node that was already
cc132865 1537 processed. Pop edges off the stack until we find
a2e68776
JL
1538 an edge that has not yet been processed. */
1539 while (sp >= 0
1540 && (current_edge == 0 || TEST_BIT (passed, current_edge)))
8c660648 1541 {
a2e68776 1542 /* Pop entry off the stack. */
8c660648
JL
1543 current_edge = stack[sp--];
1544 node = FROM_BLOCK (current_edge);
1545 child = TO_BLOCK (current_edge);
cc132865
JL
1546 RESET_BIT (in_stack, child);
1547 if (max_hdr[child] >= 0 && TEST_BIT (in_stack, max_hdr[child]))
8c660648
JL
1548 UPDATE_LOOP_RELATIONS (node, max_hdr[child]);
1549 current_edge = NEXT_OUT (current_edge);
1550 }
1551
a2e68776
JL
1552 /* See if have finished the DFS tree traversal. */
1553 if (sp < 0 && TEST_BIT (passed, current_edge))
8c660648 1554 break;
a2e68776
JL
1555
1556 /* Nope, continue the traversal with the popped node. */
8c660648
JL
1557 continue;
1558 }
1559
a2e68776 1560 /* Process a node. */
8c660648 1561 node = FROM_BLOCK (current_edge);
8c660648 1562 child = TO_BLOCK (current_edge);
cc132865 1563 SET_BIT (in_stack, node);
a2e68776 1564 dfs_nr[node] = ++count;
8c660648 1565
cc132865
JL
1566 /* If the successor is in the stack, then we've found a loop.
1567 Mark the loop, if it is not a natural loop, then it will
1568 be rejected during the second traversal. */
1569 if (TEST_BIT (in_stack, child))
8c660648
JL
1570 {
1571 no_loops = 0;
a2e68776 1572 SET_BIT (header, child);
8c660648 1573 UPDATE_LOOP_RELATIONS (node, child);
a2e68776 1574 SET_BIT (passed, current_edge);
8c660648
JL
1575 current_edge = NEXT_OUT (current_edge);
1576 continue;
1577 }
1578
a2e68776
JL
1579 /* If the child was already visited, then there is no need to visit
1580 it again. Just update the loop relationships and restart
1581 with a new edge. */
8c660648
JL
1582 if (dfs_nr[child])
1583 {
cc132865 1584 if (max_hdr[child] >= 0 && TEST_BIT (in_stack, max_hdr[child]))
8c660648 1585 UPDATE_LOOP_RELATIONS (node, max_hdr[child]);
a2e68776 1586 SET_BIT (passed, current_edge);
8c660648
JL
1587 current_edge = NEXT_OUT (current_edge);
1588 continue;
1589 }
1590
a2e68776 1591 /* Push an entry on the stack and continue DFS traversal. */
8c660648 1592 stack[++sp] = current_edge;
a2e68776 1593 SET_BIT (passed, current_edge);
8c660648 1594 current_edge = OUT_EDGES (child);
a2e68776 1595 }
8c660648 1596
15ebe47d
JL
1597 /* Another check for unreachable blocks. The earlier test in
1598 is_cfg_nonregular only finds unreachable blocks that do not
1599 form a loop.
a2e68776 1600
15ebe47d
JL
1601 The DFS traversal will mark every block that is reachable from
1602 the entry node by placing a nonzero value in dfs_nr. Thus if
1603 dfs_nr is zero for any block, then it must be unreachable. */
1604 unreachable = 0;
1605 for (i = 0; i < n_basic_blocks; i++)
1606 if (dfs_nr[i] == 0)
1607 {
1608 unreachable = 1;
1609 break;
1610 }
a2e68776
JL
1611
1612 /* Gross. To avoid wasting memory, the second pass uses the dfs_nr array
1613 to hold degree counts. */
1614 degree = dfs_nr;
8c660648 1615
a2e68776 1616 /* Compute the in-degree of every block in the graph */
8c660648 1617 for (i = 0; i < n_basic_blocks; i++)
a2e68776
JL
1618 degree[i] = num_preds[i];
1619
15ebe47d
JL
1620 /* Do not perform region scheduling if there are any unreachable
1621 blocks. */
1622 if (!unreachable)
8c660648 1623 {
15ebe47d
JL
1624 if (no_loops)
1625 SET_BIT (header, 0);
8c660648 1626
15ebe47d
JL
1627 /* Second travsersal:find reducible inner loops and topologically sort
1628 block of each region. */
8c660648 1629
15ebe47d 1630 queue = (int *) alloca (n_basic_blocks * sizeof (int));
8c660648 1631
cc132865
JL
1632 /* Find blocks which are inner loop headers. We still have non-reducible
1633 loops to consider at this point. */
15ebe47d
JL
1634 for (i = 0; i < n_basic_blocks; i++)
1635 {
1636 if (TEST_BIT (header, i) && TEST_BIT (inner, i))
1637 {
1638 int_list_ptr ps;
cc132865
JL
1639 int j;
1640
1641 /* Now check that the loop is reducible. We do this separate
1642 from finding inner loops so that we do not find a reducible
1643 loop which contains an inner non-reducible loop.
1644
1645 A simple way to find reducible/natrual loops is to verify
1646 that each block in the loop is dominated by the loop
1647 header.
1648
1649 If there exists a block that is not dominated by the loop
1650 header, then the block is reachable from outside the loop
1651 and thus the loop is not a natural loop. */
1652 for (j = 0; j < n_basic_blocks; j++)
1653 {
1654 /* First identify blocks in the loop, except for the loop
1655 entry block. */
1656 if (i == max_hdr[j] && i != j)
1657 {
1658 /* Now verify that the block is dominated by the loop
1659 header. */
1660 if (!TEST_BIT (dom[j], i))
1661 break;
1662 }
1663 }
1664
1665 /* If we exited the loop early, then I is the header of a non
1666 reducible loop and we should quit processing it now. */
1667 if (j != n_basic_blocks)
1668 continue;
8c660648 1669
cc132865
JL
1670 /* I is a header of an inner loop, or block 0 in a subroutine
1671 with no loops at all. */
15ebe47d
JL
1672 head = tail = -1;
1673 too_large_failure = 0;
1674 loop_head = max_hdr[i];
8c660648 1675
15ebe47d 1676 /* Decrease degree of all I's successors for topological
a59bfd78 1677 ordering. */
15ebe47d
JL
1678 for (ps = s_succs[i]; ps; ps = ps->next)
1679 if (INT_LIST_VAL (ps) != EXIT_BLOCK
1680 && INT_LIST_VAL (ps) != ENTRY_BLOCK)
cc132865 1681 --degree[INT_LIST_VAL(ps)];
a2e68776 1682
15ebe47d
JL
1683 /* Estimate # insns, and count # blocks in the region. */
1684 num_bbs = 1;
1685 num_insns = (INSN_LUID (basic_block_end[i])
1686 - INSN_LUID (basic_block_head[i]));
8c660648 1687
15ebe47d
JL
1688
1689 /* Find all loop latches (blocks which back edges to the loop
1690 header) or all the leaf blocks in the cfg has no loops.
1691
1692 Place those blocks into the queue. */
1693 if (no_loops)
1694 {
1695 for (j = 0; j < n_basic_blocks; j++)
1696 /* Leaf nodes have only a single successor which must
1697 be EXIT_BLOCK. */
1698 if (num_succs[j] == 1
1699 && INT_LIST_VAL (s_succs[j]) == EXIT_BLOCK)
8c660648 1700 {
15ebe47d
JL
1701 queue[++tail] = j;
1702 SET_BIT (in_queue, j);
1703
1704 if (too_large (j, &num_bbs, &num_insns))
1705 {
1706 too_large_failure = 1;
1707 break;
1708 }
8c660648 1709 }
15ebe47d
JL
1710 }
1711 else
8c660648 1712 {
15ebe47d 1713 int_list_ptr ps;
a2e68776 1714
15ebe47d 1715 for (ps = s_preds[i]; ps; ps = ps->next)
8c660648 1716 {
15ebe47d 1717 node = INT_LIST_VAL (ps);
8c660648 1718
15ebe47d
JL
1719 if (node == ENTRY_BLOCK || node == EXIT_BLOCK)
1720 continue;
1721
1722 if (max_hdr[node] == loop_head && node != i)
8c660648 1723 {
15ebe47d
JL
1724 /* This is a loop latch. */
1725 queue[++tail] = node;
1726 SET_BIT (in_queue, node);
1727
1728 if (too_large (node, &num_bbs, &num_insns))
1729 {
1730 too_large_failure = 1;
1731 break;
1732 }
8c660648 1733 }
15ebe47d 1734
8c660648 1735 }
8c660648 1736 }
8c660648 1737
15ebe47d 1738 /* Now add all the blocks in the loop to the queue.
a2e68776
JL
1739
1740 We know the loop is a natural loop; however the algorithm
1741 above will not always mark certain blocks as being in the
1742 loop. Consider:
1743 node children
1744 a b,c
1745 b c
1746 c a,d
1747 d b
1748
1749
1750 The algorithm in the DFS traversal may not mark B & D as part
1751 of the loop (ie they will not have max_hdr set to A).
1752
1753 We know they can not be loop latches (else they would have
1754 had max_hdr set since they'd have a backedge to a dominator
1755 block). So we don't need them on the initial queue.
1756
1757 We know they are part of the loop because they are dominated
1758 by the loop header and can be reached by a backwards walk of
1759 the edges starting with nodes on the initial queue.
1760
1761 It is safe and desirable to include those nodes in the
1762 loop/scheduling region. To do so we would need to decrease
1763 the degree of a node if it is the target of a backedge
1764 within the loop itself as the node is placed in the queue.
1765
1766 We do not do this because I'm not sure that the actual
1767 scheduling code will properly handle this case. ?!? */
1768
15ebe47d 1769 while (head < tail && !too_large_failure)
8c660648 1770 {
15ebe47d
JL
1771 int_list_ptr ps;
1772 child = queue[++head];
8c660648 1773
15ebe47d 1774 for (ps = s_preds[child]; ps; ps = ps->next)
8c660648 1775 {
15ebe47d 1776 node = INT_LIST_VAL (ps);
8c660648 1777
15ebe47d
JL
1778 /* See discussion above about nodes not marked as in
1779 this loop during the initial DFS traversal. */
1780 if (node == ENTRY_BLOCK || node == EXIT_BLOCK
1781 || max_hdr[node] != loop_head)
8c660648 1782 {
15ebe47d 1783 tail = -1;
8c660648
JL
1784 break;
1785 }
15ebe47d
JL
1786 else if (!TEST_BIT (in_queue, node) && node != i)
1787 {
1788 queue[++tail] = node;
1789 SET_BIT (in_queue, node);
1790
1791 if (too_large (node, &num_bbs, &num_insns))
1792 {
1793 too_large_failure = 1;
1794 break;
1795 }
1796 }
8c660648 1797 }
8c660648 1798 }
8c660648 1799
15ebe47d
JL
1800 if (tail >= 0 && !too_large_failure)
1801 {
1802 /* Place the loop header into list of region blocks. */
1803 degree[i] = -1;
1804 rgn_bb_table[idx] = i;
1805 RGN_NR_BLOCKS (nr_regions) = num_bbs;
1806 RGN_BLOCKS (nr_regions) = idx++;
1807 CONTAINING_RGN (i) = nr_regions;
1808 BLOCK_TO_BB (i) = count = 0;
1809
1810 /* Remove blocks from queue[] when their in degree becomes
a2e68776
JL
1811 zero. Repeat until no blocks are left on the list. This
1812 produces a topological list of blocks in the region. */
15ebe47d 1813 while (tail >= 0)
8c660648 1814 {
15ebe47d
JL
1815 int_list_ptr ps;
1816
1817 if (head < 0)
1818 head = tail;
1819 child = queue[head];
1820 if (degree[child] == 0)
1821 {
1822 degree[child] = -1;
1823 rgn_bb_table[idx++] = child;
1824 BLOCK_TO_BB (child) = ++count;
1825 CONTAINING_RGN (child) = nr_regions;
1826 queue[head] = queue[tail--];
1827
1828 for (ps = s_succs[child]; ps; ps = ps->next)
1829 if (INT_LIST_VAL (ps) != ENTRY_BLOCK
1830 && INT_LIST_VAL (ps) != EXIT_BLOCK)
1831 --degree[INT_LIST_VAL (ps)];
1832 }
1833 else
1834 --head;
8c660648 1835 }
15ebe47d 1836 ++nr_regions;
8c660648 1837 }
8c660648
JL
1838 }
1839 }
1840 }
1841
a2e68776
JL
1842 /* Any block that did not end up in a region is placed into a region
1843 by itself. */
8c660648
JL
1844 for (i = 0; i < n_basic_blocks; i++)
1845 if (degree[i] >= 0)
1846 {
1847 rgn_bb_table[idx] = i;
1848 RGN_NR_BLOCKS (nr_regions) = 1;
1849 RGN_BLOCKS (nr_regions) = idx++;
1850 CONTAINING_RGN (i) = nr_regions++;
1851 BLOCK_TO_BB (i) = 0;
1852 }
1853
a2e68776
JL
1854 free (passed);
1855 free (header);
1856 free (inner);
1857 free (in_queue);
cc132865 1858 free (in_stack);
a2e68776 1859}
8c660648
JL
1860
1861
1862/* functions for regions scheduling information */
1863
1864/* Compute dominators, probability, and potential-split-edges of bb.
1865 Assume that these values were already computed for bb's predecessors. */
1866
1867static void
1868compute_dom_prob_ps (bb)
1869 int bb;
1870{
1871 int nxt_in_edge, fst_in_edge, pred;
1872 int fst_out_edge, nxt_out_edge, nr_out_edges, nr_rgn_out_edges;
1873
1874 prob[bb] = 0.0;
1875 if (IS_RGN_ENTRY (bb))
1876 {
1877 BITSET_ADD (dom[bb], 0, bbset_size);
1878 prob[bb] = 1.0;
1879 return;
1880 }
1881
1882 fst_in_edge = nxt_in_edge = IN_EDGES (BB_TO_BLOCK (bb));
1883
1884 /* intialize dom[bb] to '111..1' */
1885 BITSET_INVERT (dom[bb], bbset_size);
1886
1887 do
1888 {
1889 pred = FROM_BLOCK (nxt_in_edge);
1890 BITSET_INTER (dom[bb], dom[BLOCK_TO_BB (pred)], bbset_size);
1891
1892 BITSET_UNION (ancestor_edges[bb], ancestor_edges[BLOCK_TO_BB (pred)],
1893 edgeset_size);
1894
1895 BITSET_ADD (ancestor_edges[bb], EDGE_TO_BIT (nxt_in_edge), edgeset_size);
1896
1897 nr_out_edges = 1;
1898 nr_rgn_out_edges = 0;
1899 fst_out_edge = OUT_EDGES (pred);
1900 nxt_out_edge = NEXT_OUT (fst_out_edge);
1901 BITSET_UNION (pot_split[bb], pot_split[BLOCK_TO_BB (pred)],
1902 edgeset_size);
1903
1904 BITSET_ADD (pot_split[bb], EDGE_TO_BIT (fst_out_edge), edgeset_size);
1905
1906 /* the successor doesn't belong the region? */
1907 if (CONTAINING_RGN (TO_BLOCK (fst_out_edge)) !=
1908 CONTAINING_RGN (BB_TO_BLOCK (bb)))
1909 ++nr_rgn_out_edges;
1910
1911 while (fst_out_edge != nxt_out_edge)
1912 {
1913 ++nr_out_edges;
1914 /* the successor doesn't belong the region? */
1915 if (CONTAINING_RGN (TO_BLOCK (nxt_out_edge)) !=
1916 CONTAINING_RGN (BB_TO_BLOCK (bb)))
1917 ++nr_rgn_out_edges;
1918 BITSET_ADD (pot_split[bb], EDGE_TO_BIT (nxt_out_edge), edgeset_size);
1919 nxt_out_edge = NEXT_OUT (nxt_out_edge);
1920
1921 }
1922
1923 /* now nr_rgn_out_edges is the number of region-exit edges from pred,
1924 and nr_out_edges will be the number of pred out edges not leaving
1925 the region. */
1926 nr_out_edges -= nr_rgn_out_edges;
1927 if (nr_rgn_out_edges > 0)
1928 prob[bb] += 0.9 * prob[BLOCK_TO_BB (pred)] / nr_out_edges;
1929 else
1930 prob[bb] += prob[BLOCK_TO_BB (pred)] / nr_out_edges;
1931 nxt_in_edge = NEXT_IN (nxt_in_edge);
1932 }
1933 while (fst_in_edge != nxt_in_edge);
1934
1935 BITSET_ADD (dom[bb], bb, bbset_size);
1936 BITSET_DIFFER (pot_split[bb], ancestor_edges[bb], edgeset_size);
1937
1938 if (sched_verbose >= 2)
1939 fprintf (dump, ";; bb_prob(%d, %d) = %3d\n", bb, BB_TO_BLOCK (bb), (int) (100.0 * prob[bb]));
1940} /* compute_dom_prob_ps */
1941
1942/* functions for target info */
1943
1944/* Compute in BL the list of split-edges of bb_src relatively to bb_trg.
1945 Note that bb_trg dominates bb_src. */
1946
1947static void
1948split_edges (bb_src, bb_trg, bl)
1949 int bb_src;
1950 int bb_trg;
1951 edgelst *bl;
1952{
1953 int es = edgeset_size;
1954 edgeset src = (edgeset) alloca (es * sizeof (HOST_WIDE_INT));
1955
1956 while (es--)
1957 src[es] = (pot_split[bb_src])[es];
1958 BITSET_DIFFER (src, pot_split[bb_trg], edgeset_size);
1959 extract_bitlst (src, edgeset_size, bl);
1960}
1961
1962
1963/* Find the valid candidate-source-blocks for the target block TRG, compute
1964 their probability, and check if they are speculative or not.
1965 For speculative sources, compute their update-blocks and split-blocks. */
1966
1967static void
1968compute_trg_info (trg)
1969 int trg;
1970{
1971 register candidate *sp;
1972 edgelst el;
1973 int check_block, update_idx;
1974 int i, j, k, fst_edge, nxt_edge;
1975
1976 /* define some of the fields for the target bb as well */
1977 sp = candidate_table + trg;
1978 sp->is_valid = 1;
1979 sp->is_speculative = 0;
1980 sp->src_prob = 100;
1981
1982 for (i = trg + 1; i < current_nr_blocks; i++)
1983 {
1984 sp = candidate_table + i;
1985
1986 sp->is_valid = IS_DOMINATED (i, trg);
1987 if (sp->is_valid)
1988 {
1989 sp->src_prob = GET_SRC_PROB (i, trg);
1990 sp->is_valid = (sp->src_prob >= MIN_PROBABILITY);
1991 }
1992
1993 if (sp->is_valid)
1994 {
1995 split_edges (i, trg, &el);
1996 sp->is_speculative = (el.nr_members) ? 1 : 0;
1997 if (sp->is_speculative && !flag_schedule_speculative)
1998 sp->is_valid = 0;
1999 }
2000
2001 if (sp->is_valid)
2002 {
2003 sp->split_bbs.first_member = &bblst_table[bblst_last];
2004 sp->split_bbs.nr_members = el.nr_members;
2005 for (j = 0; j < el.nr_members; bblst_last++, j++)
2006 bblst_table[bblst_last] =
2007 TO_BLOCK (rgn_edges[el.first_member[j]]);
2008 sp->update_bbs.first_member = &bblst_table[bblst_last];
2009 update_idx = 0;
2010 for (j = 0; j < el.nr_members; j++)
2011 {
2012 check_block = FROM_BLOCK (rgn_edges[el.first_member[j]]);
2013 fst_edge = nxt_edge = OUT_EDGES (check_block);
2014 do
2015 {
2016 for (k = 0; k < el.nr_members; k++)
2017 if (EDGE_TO_BIT (nxt_edge) == el.first_member[k])
2018 break;
2019
2020 if (k >= el.nr_members)
2021 {
2022 bblst_table[bblst_last++] = TO_BLOCK (nxt_edge);
2023 update_idx++;
2024 }
2025
2026 nxt_edge = NEXT_OUT (nxt_edge);
2027 }
2028 while (fst_edge != nxt_edge);
2029 }
2030 sp->update_bbs.nr_members = update_idx;
2031
2032 }
2033 else
2034 {
2035 sp->split_bbs.nr_members = sp->update_bbs.nr_members = 0;
2036
2037 sp->is_speculative = 0;
2038 sp->src_prob = 0;
2039 }
2040 }
2041} /* compute_trg_info */
2042
2043
2044/* Print candidates info, for debugging purposes. Callable from debugger. */
2045
2046void
2047debug_candidate (i)
2048 int i;
2049{
2050 if (!candidate_table[i].is_valid)
2051 return;
2052
2053 if (candidate_table[i].is_speculative)
2054 {
2055 int j;
2056 fprintf (dump, "src b %d bb %d speculative \n", BB_TO_BLOCK (i), i);
2057
2058 fprintf (dump, "split path: ");
2059 for (j = 0; j < candidate_table[i].split_bbs.nr_members; j++)
2060 {
2061 int b = candidate_table[i].split_bbs.first_member[j];
2062
2063 fprintf (dump, " %d ", b);
2064 }
2065 fprintf (dump, "\n");
2066
2067 fprintf (dump, "update path: ");
2068 for (j = 0; j < candidate_table[i].update_bbs.nr_members; j++)
2069 {
2070 int b = candidate_table[i].update_bbs.first_member[j];
2071
2072 fprintf (dump, " %d ", b);
2073 }
2074 fprintf (dump, "\n");
2075 }
2076 else
2077 {
2078 fprintf (dump, " src %d equivalent\n", BB_TO_BLOCK (i));
2079 }
2080}
2081
2082
2083/* Print candidates info, for debugging purposes. Callable from debugger. */
2084
2085void
2086debug_candidates (trg)
2087 int trg;
2088{
2089 int i;
2090
2091 fprintf (dump, "----------- candidate table: target: b=%d bb=%d ---\n",
2092 BB_TO_BLOCK (trg), trg);
2093 for (i = trg + 1; i < current_nr_blocks; i++)
2094 debug_candidate (i);
2095}
2096
2097
2098/* functions for speculative scheduing */
2099
2100/* Return 0 if x is a set of a register alive in the beginning of one
2101 of the split-blocks of src, otherwise return 1. */
2102
2103static int
2104check_live_1 (src, x)
2105 int src;
2106 rtx x;
2107{
5835e573 2108 register int i;
8c660648
JL
2109 register int regno;
2110 register rtx reg = SET_DEST (x);
2111
2112 if (reg == 0)
2113 return 1;
2114
2115 while (GET_CODE (reg) == SUBREG || GET_CODE (reg) == ZERO_EXTRACT
2116 || GET_CODE (reg) == SIGN_EXTRACT
2117 || GET_CODE (reg) == STRICT_LOW_PART)
2118 reg = XEXP (reg, 0);
2119
c0222c21
DM
2120 if (GET_CODE (reg) == PARALLEL
2121 && GET_MODE (reg) == BLKmode)
2122 {
2123 register int i;
2124 for (i = XVECLEN (reg, 0) - 1; i >= 0; i--)
2125 if (check_live_1 (src, XVECEXP (reg, 0, i)))
2126 return 1;
2127 return 0;
2128 }
2129
8c660648
JL
2130 if (GET_CODE (reg) != REG)
2131 return 1;
2132
2133 regno = REGNO (reg);
2134
2135 if (regno < FIRST_PSEUDO_REGISTER && global_regs[regno])
2136 {
2137 /* Global registers are assumed live */
2138 return 0;
2139 }
2140 else
2141 {
2142 if (regno < FIRST_PSEUDO_REGISTER)
2143 {
2144 /* check for hard registers */
2145 int j = HARD_REGNO_NREGS (regno, GET_MODE (reg));
2146 while (--j >= 0)
2147 {
2148 for (i = 0; i < candidate_table[src].split_bbs.nr_members; i++)
2149 {
2150 int b = candidate_table[src].split_bbs.first_member[i];
2151
2152 if (REGNO_REG_SET_P (basic_block_live_at_start[b], regno + j))
2153 {
2154 return 0;
2155 }
2156 }
2157 }
2158 }
2159 else
2160 {
2161 /* check for psuedo registers */
2162 for (i = 0; i < candidate_table[src].split_bbs.nr_members; i++)
2163 {
2164 int b = candidate_table[src].split_bbs.first_member[i];
2165
2166 if (REGNO_REG_SET_P (basic_block_live_at_start[b], regno))
2167 {
2168 return 0;
2169 }
2170 }
2171 }
2172 }
2173
2174 return 1;
2175}
2176
2177
2178/* If x is a set of a register R, mark that R is alive in the beginning
2179 of every update-block of src. */
2180
2181static void
2182update_live_1 (src, x)
2183 int src;
2184 rtx x;
2185{
5835e573 2186 register int i;
8c660648
JL
2187 register int regno;
2188 register rtx reg = SET_DEST (x);
2189
2190 if (reg == 0)
2191 return;
2192
2193 while (GET_CODE (reg) == SUBREG || GET_CODE (reg) == ZERO_EXTRACT
2194 || GET_CODE (reg) == SIGN_EXTRACT
2195 || GET_CODE (reg) == STRICT_LOW_PART)
2196 reg = XEXP (reg, 0);
2197
c0222c21
DM
2198 if (GET_CODE (reg) == PARALLEL
2199 && GET_MODE (reg) == BLKmode)
2200 {
2201 register int i;
2202 for (i = XVECLEN (reg, 0) - 1; i >= 0; i--)
2203 update_live_1 (src, XVECEXP (reg, 0, i));
2204 return;
2205 }
2206
8c660648
JL
2207 if (GET_CODE (reg) != REG)
2208 return;
2209
2210 /* Global registers are always live, so the code below does not apply
2211 to them. */
2212
2213 regno = REGNO (reg);
2214
2215 if (regno >= FIRST_PSEUDO_REGISTER || !global_regs[regno])
2216 {
2217 if (regno < FIRST_PSEUDO_REGISTER)
2218 {
2219 int j = HARD_REGNO_NREGS (regno, GET_MODE (reg));
2220 while (--j >= 0)
2221 {
2222 for (i = 0; i < candidate_table[src].update_bbs.nr_members; i++)
2223 {
2224 int b = candidate_table[src].update_bbs.first_member[i];
2225
2226 SET_REGNO_REG_SET (basic_block_live_at_start[b], regno + j);
2227 }
2228 }
2229 }
2230 else
2231 {
2232 for (i = 0; i < candidate_table[src].update_bbs.nr_members; i++)
2233 {
2234 int b = candidate_table[src].update_bbs.first_member[i];
2235
2236 SET_REGNO_REG_SET (basic_block_live_at_start[b], regno);
2237 }
2238 }
2239 }
2240}
2241
2242
2243/* Return 1 if insn can be speculatively moved from block src to trg,
2244 otherwise return 0. Called before first insertion of insn to
2245 ready-list or before the scheduling. */
2246
2247static int
5835e573 2248check_live (insn, src)
8c660648
JL
2249 rtx insn;
2250 int src;
8c660648
JL
2251{
2252 /* find the registers set by instruction */
2253 if (GET_CODE (PATTERN (insn)) == SET
2254 || GET_CODE (PATTERN (insn)) == CLOBBER)
2255 return check_live_1 (src, PATTERN (insn));
2256 else if (GET_CODE (PATTERN (insn)) == PARALLEL)
2257 {
2258 int j;
2259 for (j = XVECLEN (PATTERN (insn), 0) - 1; j >= 0; j--)
2260 if ((GET_CODE (XVECEXP (PATTERN (insn), 0, j)) == SET
2261 || GET_CODE (XVECEXP (PATTERN (insn), 0, j)) == CLOBBER)
2262 && !check_live_1 (src, XVECEXP (PATTERN (insn), 0, j)))
2263 return 0;
2264
2265 return 1;
2266 }
2267
2268 return 1;
2269}
2270
2271
2272/* Update the live registers info after insn was moved speculatively from
2273 block src to trg. */
2274
2275static void
5835e573 2276update_live (insn, src)
8c660648 2277 rtx insn;
5835e573 2278 int src;
8c660648
JL
2279{
2280 /* find the registers set by instruction */
2281 if (GET_CODE (PATTERN (insn)) == SET
2282 || GET_CODE (PATTERN (insn)) == CLOBBER)
2283 update_live_1 (src, PATTERN (insn));
2284 else if (GET_CODE (PATTERN (insn)) == PARALLEL)
2285 {
2286 int j;
2287 for (j = XVECLEN (PATTERN (insn), 0) - 1; j >= 0; j--)
2288 if (GET_CODE (XVECEXP (PATTERN (insn), 0, j)) == SET
2289 || GET_CODE (XVECEXP (PATTERN (insn), 0, j)) == CLOBBER)
2290 update_live_1 (src, XVECEXP (PATTERN (insn), 0, j));
2291 }
2292}
2293
2294/* Exception Free Loads:
2295
2296 We define five classes of speculative loads: IFREE, IRISKY,
2297 PFREE, PRISKY, and MFREE.
2298
2299 IFREE loads are loads that are proved to be exception-free, just
2300 by examining the load insn. Examples for such loads are loads
2301 from TOC and loads of global data.
2302
2303 IRISKY loads are loads that are proved to be exception-risky,
2304 just by examining the load insn. Examples for such loads are
2305 volatile loads and loads from shared memory.
2306
2307 PFREE loads are loads for which we can prove, by examining other
2308 insns, that they are exception-free. Currently, this class consists
2309 of loads for which we are able to find a "similar load", either in
2310 the target block, or, if only one split-block exists, in that split
2311 block. Load2 is similar to load1 if both have same single base
2312 register. We identify only part of the similar loads, by finding
2313 an insn upon which both load1 and load2 have a DEF-USE dependence.
2314
2315 PRISKY loads are loads for which we can prove, by examining other
2316 insns, that they are exception-risky. Currently we have two proofs for
2317 such loads. The first proof detects loads that are probably guarded by a
2318 test on the memory address. This proof is based on the
2319 backward and forward data dependence information for the region.
2320 Let load-insn be the examined load.
2321 Load-insn is PRISKY iff ALL the following hold:
2322
2323 - insn1 is not in the same block as load-insn
2324 - there is a DEF-USE dependence chain (insn1, ..., load-insn)
2325 - test-insn is either a compare or a branch, not in the same block as load-insn
2326 - load-insn is reachable from test-insn
2327 - there is a DEF-USE dependence chain (insn1, ..., test-insn)
2328
2329 This proof might fail when the compare and the load are fed
2330 by an insn not in the region. To solve this, we will add to this
2331 group all loads that have no input DEF-USE dependence.
2332
2333 The second proof detects loads that are directly or indirectly
2334 fed by a speculative load. This proof is affected by the
2335 scheduling process. We will use the flag fed_by_spec_load.
2336 Initially, all insns have this flag reset. After a speculative
2337 motion of an insn, if insn is either a load, or marked as
2338 fed_by_spec_load, we will also mark as fed_by_spec_load every
2339 insn1 for which a DEF-USE dependence (insn, insn1) exists. A
2340 load which is fed_by_spec_load is also PRISKY.
2341
2342 MFREE (maybe-free) loads are all the remaining loads. They may be
2343 exception-free, but we cannot prove it.
2344
2345 Now, all loads in IFREE and PFREE classes are considered
2346 exception-free, while all loads in IRISKY and PRISKY classes are
2347 considered exception-risky. As for loads in the MFREE class,
2348 these are considered either exception-free or exception-risky,
2349 depending on whether we are pessimistic or optimistic. We have
2350 to take the pessimistic approach to assure the safety of
2351 speculative scheduling, but we can take the optimistic approach
2352 by invoking the -fsched_spec_load_dangerous option. */
2353
2354enum INSN_TRAP_CLASS
2355{
2356 TRAP_FREE = 0, IFREE = 1, PFREE_CANDIDATE = 2,
2357 PRISKY_CANDIDATE = 3, IRISKY = 4, TRAP_RISKY = 5
2358};
2359
2360#define WORST_CLASS(class1, class2) \
2361((class1 > class2) ? class1 : class2)
2362
2363/* Indexed by INSN_UID, and set if there's DEF-USE dependence between */
2364/* some speculatively moved load insn and this one. */
2365char *fed_by_spec_load;
2366char *is_load_insn;
2367
2368/* Non-zero if block bb_to is equal to, or reachable from block bb_from. */
2369#define IS_REACHABLE(bb_from, bb_to) \
2370(bb_from == bb_to \
2371 || IS_RGN_ENTRY (bb_from) \
2372 || (bitset_member (ancestor_edges[bb_to], \
2373 EDGE_TO_BIT (IN_EDGES (BB_TO_BLOCK (bb_from))), \
2374 edgeset_size)))
2375#define FED_BY_SPEC_LOAD(insn) (fed_by_spec_load[INSN_UID (insn)])
2376#define IS_LOAD_INSN(insn) (is_load_insn[INSN_UID (insn)])
2377
2378/* Non-zero iff the address is comprised from at most 1 register */
2379#define CONST_BASED_ADDRESS_P(x) \
2380 (GET_CODE (x) == REG \
2381 || ((GET_CODE (x) == PLUS || GET_CODE (x) == MINUS \
2382 || (GET_CODE (x) == LO_SUM)) \
2383 && (GET_CODE (XEXP (x, 0)) == CONST_INT \
2384 || GET_CODE (XEXP (x, 1)) == CONST_INT)))
2385
2386/* Turns on the fed_by_spec_load flag for insns fed by load_insn. */
2387
2388static void
2389set_spec_fed (load_insn)
2390 rtx load_insn;
2391{
2392 rtx link;
2393
2394 for (link = INSN_DEPEND (load_insn); link; link = XEXP (link, 1))
2395 if (GET_MODE (link) == VOIDmode)
2396 FED_BY_SPEC_LOAD (XEXP (link, 0)) = 1;
2397} /* set_spec_fed */
2398
2399/* On the path from the insn to load_insn_bb, find a conditional branch */
2400/* depending on insn, that guards the speculative load. */
2401
2402static int
2403find_conditional_protection (insn, load_insn_bb)
2404 rtx insn;
2405 int load_insn_bb;
2406{
2407 rtx link;
2408
2409 /* iterate through DEF-USE forward dependences */
2410 for (link = INSN_DEPEND (insn); link; link = XEXP (link, 1))
2411 {
2412 rtx next = XEXP (link, 0);
2413 if ((CONTAINING_RGN (INSN_BLOCK (next)) ==
2414 CONTAINING_RGN (BB_TO_BLOCK (load_insn_bb)))
2415 && IS_REACHABLE (INSN_BB (next), load_insn_bb)
2416 && load_insn_bb != INSN_BB (next)
2417 && GET_MODE (link) == VOIDmode
2418 && (GET_CODE (next) == JUMP_INSN
2419 || find_conditional_protection (next, load_insn_bb)))
2420 return 1;
2421 }
2422 return 0;
2423} /* find_conditional_protection */
2424
2425/* Returns 1 if the same insn1 that participates in the computation
2426 of load_insn's address is feeding a conditional branch that is
2427 guarding on load_insn. This is true if we find a the two DEF-USE
2428 chains:
2429 insn1 -> ... -> conditional-branch
2430 insn1 -> ... -> load_insn,
2431 and if a flow path exist:
2432 insn1 -> ... -> conditional-branch -> ... -> load_insn,
2433 and if insn1 is on the path
2434 region-entry -> ... -> bb_trg -> ... load_insn.
2435
2436 Locate insn1 by climbing on LOG_LINKS from load_insn.
2437 Locate the branch by following INSN_DEPEND from insn1. */
2438
2439static int
2440is_conditionally_protected (load_insn, bb_src, bb_trg)
2441 rtx load_insn;
2442 int bb_src, bb_trg;
2443{
2444 rtx link;
2445
2446 for (link = LOG_LINKS (load_insn); link; link = XEXP (link, 1))
2447 {
2448 rtx insn1 = XEXP (link, 0);
2449
2450 /* must be a DEF-USE dependence upon non-branch */
2451 if (GET_MODE (link) != VOIDmode
2452 || GET_CODE (insn1) == JUMP_INSN)
2453 continue;
2454
2455 /* must exist a path: region-entry -> ... -> bb_trg -> ... load_insn */
2456 if (INSN_BB (insn1) == bb_src
2457 || (CONTAINING_RGN (INSN_BLOCK (insn1))
2458 != CONTAINING_RGN (BB_TO_BLOCK (bb_src)))
2459 || (!IS_REACHABLE (bb_trg, INSN_BB (insn1))
2460 && !IS_REACHABLE (INSN_BB (insn1), bb_trg)))
2461 continue;
2462
2463 /* now search for the conditional-branch */
2464 if (find_conditional_protection (insn1, bb_src))
2465 return 1;
2466
2467 /* recursive step: search another insn1, "above" current insn1. */
2468 return is_conditionally_protected (insn1, bb_src, bb_trg);
2469 }
2470
2471 /* the chain does not exsist */
2472 return 0;
2473} /* is_conditionally_protected */
2474
2475/* Returns 1 if a clue for "similar load" 'insn2' is found, and hence
2476 load_insn can move speculatively from bb_src to bb_trg. All the
2477 following must hold:
2478
2479 (1) both loads have 1 base register (PFREE_CANDIDATEs).
2480 (2) load_insn and load1 have a def-use dependence upon
2481 the same insn 'insn1'.
2482 (3) either load2 is in bb_trg, or:
2483 - there's only one split-block, and
2484 - load1 is on the escape path, and
2485
2486 From all these we can conclude that the two loads access memory
2487 addresses that differ at most by a constant, and hence if moving
2488 load_insn would cause an exception, it would have been caused by
2489 load2 anyhow. */
2490
2491static int
2492is_pfree (load_insn, bb_src, bb_trg)
2493 rtx load_insn;
2494 int bb_src, bb_trg;
2495{
2496 rtx back_link;
2497 register candidate *candp = candidate_table + bb_src;
2498
2499 if (candp->split_bbs.nr_members != 1)
2500 /* must have exactly one escape block */
2501 return 0;
2502
2503 for (back_link = LOG_LINKS (load_insn);
2504 back_link; back_link = XEXP (back_link, 1))
2505 {
2506 rtx insn1 = XEXP (back_link, 0);
2507
2508 if (GET_MODE (back_link) == VOIDmode)
2509 {
2510 /* found a DEF-USE dependence (insn1, load_insn) */
2511 rtx fore_link;
2512
2513 for (fore_link = INSN_DEPEND (insn1);
2514 fore_link; fore_link = XEXP (fore_link, 1))
2515 {
2516 rtx insn2 = XEXP (fore_link, 0);
2517 if (GET_MODE (fore_link) == VOIDmode)
2518 {
2519 /* found a DEF-USE dependence (insn1, insn2) */
ac957f13 2520 if (haifa_classify_insn (insn2) != PFREE_CANDIDATE)
8c660648
JL
2521 /* insn2 not guaranteed to be a 1 base reg load */
2522 continue;
2523
2524 if (INSN_BB (insn2) == bb_trg)
2525 /* insn2 is the similar load, in the target block */
2526 return 1;
2527
2528 if (*(candp->split_bbs.first_member) == INSN_BLOCK (insn2))
2529 /* insn2 is a similar load, in a split-block */
2530 return 1;
2531 }
2532 }
2533 }
2534 }
2535
2536 /* couldn't find a similar load */
2537 return 0;
2538} /* is_pfree */
2539
2540/* Returns a class that insn with GET_DEST(insn)=x may belong to,
2541 as found by analyzing insn's expression. */
2542
2543static int
2544may_trap_exp (x, is_store)
2545 rtx x;
2546 int is_store;
2547{
2548 enum rtx_code code;
2549
2550 if (x == 0)
2551 return TRAP_FREE;
2552 code = GET_CODE (x);
2553 if (is_store)
2554 {
2555 if (code == MEM)
2556 return TRAP_RISKY;
2557 else
2558 return TRAP_FREE;
2559 }
2560 if (code == MEM)
2561 {
2562 /* The insn uses memory */
2563 /* a volatile load */
2564 if (MEM_VOLATILE_P (x))
2565 return IRISKY;
2566 /* an exception-free load */
2567 if (!may_trap_p (x))
2568 return IFREE;
2569 /* a load with 1 base register, to be further checked */
2570 if (CONST_BASED_ADDRESS_P (XEXP (x, 0)))
2571 return PFREE_CANDIDATE;
2572 /* no info on the load, to be further checked */
2573 return PRISKY_CANDIDATE;
2574 }
2575 else
2576 {
2577 char *fmt;
2578 int i, insn_class = TRAP_FREE;
2579
2580 /* neither store nor load, check if it may cause a trap */
2581 if (may_trap_p (x))
2582 return TRAP_RISKY;
2583 /* recursive step: walk the insn... */
2584 fmt = GET_RTX_FORMAT (code);
2585 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
2586 {
2587 if (fmt[i] == 'e')
2588 {
2589 int tmp_class = may_trap_exp (XEXP (x, i), is_store);
2590 insn_class = WORST_CLASS (insn_class, tmp_class);
2591 }
2592 else if (fmt[i] == 'E')
2593 {
2594 int j;
2595 for (j = 0; j < XVECLEN (x, i); j++)
2596 {
2597 int tmp_class = may_trap_exp (XVECEXP (x, i, j), is_store);
2598 insn_class = WORST_CLASS (insn_class, tmp_class);
2599 if (insn_class == TRAP_RISKY || insn_class == IRISKY)
2600 break;
2601 }
2602 }
2603 if (insn_class == TRAP_RISKY || insn_class == IRISKY)
2604 break;
2605 }
2606 return insn_class;
2607 }
2608} /* may_trap_exp */
2609
2610
2611/* Classifies insn for the purpose of verifying that it can be
2612 moved speculatively, by examining it's patterns, returning:
2613 TRAP_RISKY: store, or risky non-load insn (e.g. division by variable).
2614 TRAP_FREE: non-load insn.
2615 IFREE: load from a globaly safe location.
2616 IRISKY: volatile load.
2617 PFREE_CANDIDATE, PRISKY_CANDIDATE: load that need to be checked for
2618 being either PFREE or PRISKY. */
2619
2620static int
ac957f13 2621haifa_classify_insn (insn)
8c660648
JL
2622 rtx insn;
2623{
2624 rtx pat = PATTERN (insn);
2625 int tmp_class = TRAP_FREE;
2626 int insn_class = TRAP_FREE;
2627 enum rtx_code code;
2628
2629 if (GET_CODE (pat) == PARALLEL)
2630 {
2631 int i, len = XVECLEN (pat, 0);
2632
2633 for (i = len - 1; i >= 0; i--)
2634 {
2635 code = GET_CODE (XVECEXP (pat, 0, i));
2636 switch (code)
2637 {
2638 case CLOBBER:
2639 /* test if it is a 'store' */
2640 tmp_class = may_trap_exp (XEXP (XVECEXP (pat, 0, i), 0), 1);
2641 break;
2642 case SET:
2643 /* test if it is a store */
2644 tmp_class = may_trap_exp (SET_DEST (XVECEXP (pat, 0, i)), 1);
2645 if (tmp_class == TRAP_RISKY)
2646 break;
2647 /* test if it is a load */
2648 tmp_class =
2649 WORST_CLASS (tmp_class,
2650 may_trap_exp (SET_SRC (XVECEXP (pat, 0, i)), 0));
e0cd0770
JC
2651 break;
2652 case TRAP_IF:
2653 tmp_class = TRAP_RISKY;
2654 break;
8c660648
JL
2655 default:;
2656 }
2657 insn_class = WORST_CLASS (insn_class, tmp_class);
2658 if (insn_class == TRAP_RISKY || insn_class == IRISKY)
2659 break;
2660 }
2661 }
2662 else
2663 {
2664 code = GET_CODE (pat);
2665 switch (code)
2666 {
2667 case CLOBBER:
2668 /* test if it is a 'store' */
2669 tmp_class = may_trap_exp (XEXP (pat, 0), 1);
2670 break;
2671 case SET:
2672 /* test if it is a store */
2673 tmp_class = may_trap_exp (SET_DEST (pat), 1);
2674 if (tmp_class == TRAP_RISKY)
2675 break;
2676 /* test if it is a load */
2677 tmp_class =
2678 WORST_CLASS (tmp_class,
2679 may_trap_exp (SET_SRC (pat), 0));
e0cd0770
JC
2680 break;
2681 case TRAP_IF:
2682 tmp_class = TRAP_RISKY;
2683 break;
8c660648
JL
2684 default:;
2685 }
2686 insn_class = tmp_class;
2687 }
2688
2689 return insn_class;
2690
ac957f13 2691} /* haifa_classify_insn */
8c660648
JL
2692
2693/* Return 1 if load_insn is prisky (i.e. if load_insn is fed by
2694 a load moved speculatively, or if load_insn is protected by
2695 a compare on load_insn's address). */
2696
2697static int
2698is_prisky (load_insn, bb_src, bb_trg)
2699 rtx load_insn;
2700 int bb_src, bb_trg;
2701{
2702 if (FED_BY_SPEC_LOAD (load_insn))
2703 return 1;
2704
2705 if (LOG_LINKS (load_insn) == NULL)
2706 /* dependence may 'hide' out of the region. */
2707 return 1;
2708
2709 if (is_conditionally_protected (load_insn, bb_src, bb_trg))
2710 return 1;
2711
2712 return 0;
2713} /* is_prisky */
2714
2715/* Insn is a candidate to be moved speculatively from bb_src to bb_trg.
2716 Return 1 if insn is exception-free (and the motion is valid)
2717 and 0 otherwise. */
2718
2719static int
2720is_exception_free (insn, bb_src, bb_trg)
2721 rtx insn;
2722 int bb_src, bb_trg;
2723{
ac957f13 2724 int insn_class = haifa_classify_insn (insn);
8c660648
JL
2725
2726 /* handle non-load insns */
2727 switch (insn_class)
2728 {
2729 case TRAP_FREE:
2730 return 1;
2731 case TRAP_RISKY:
2732 return 0;
2733 default:;
2734 }
2735
2736 /* handle loads */
2737 if (!flag_schedule_speculative_load)
2738 return 0;
2739 IS_LOAD_INSN (insn) = 1;
2740 switch (insn_class)
2741 {
2742 case IFREE:
2743 return (1);
2744 case IRISKY:
2745 return 0;
2746 case PFREE_CANDIDATE:
2747 if (is_pfree (insn, bb_src, bb_trg))
2748 return 1;
2749 /* don't 'break' here: PFREE-candidate is also PRISKY-candidate */
2750 case PRISKY_CANDIDATE:
2751 if (!flag_schedule_speculative_load_dangerous
2752 || is_prisky (insn, bb_src, bb_trg))
2753 return 0;
2754 break;
2755 default:;
2756 }
2757
2758 return flag_schedule_speculative_load_dangerous;
2759} /* is_exception_free */
2760
2761
2762/* Process an insn's memory dependencies. There are four kinds of
2763 dependencies:
2764
2765 (0) read dependence: read follows read
2766 (1) true dependence: read follows write
2767 (2) anti dependence: write follows read
2768 (3) output dependence: write follows write
2769
2770 We are careful to build only dependencies which actually exist, and
2771 use transitivity to avoid building too many links. */
2772\f
2773/* Return the INSN_LIST containing INSN in LIST, or NULL
2774 if LIST does not contain INSN. */
2775
cbb13457 2776HAIFA_INLINE static rtx
8c660648
JL
2777find_insn_list (insn, list)
2778 rtx insn;
2779 rtx list;
2780{
2781 while (list)
2782 {
2783 if (XEXP (list, 0) == insn)
2784 return list;
2785 list = XEXP (list, 1);
2786 }
2787 return 0;
2788}
2789
2790
2791/* Return 1 if the pair (insn, x) is found in (LIST, LIST1), or 0 otherwise. */
2792
cbb13457 2793HAIFA_INLINE static char
8c660648
JL
2794find_insn_mem_list (insn, x, list, list1)
2795 rtx insn, x;
2796 rtx list, list1;
2797{
2798 while (list)
2799 {
2800 if (XEXP (list, 0) == insn
2801 && XEXP (list1, 0) == x)
2802 return 1;
2803 list = XEXP (list, 1);
2804 list1 = XEXP (list1, 1);
2805 }
2806 return 0;
2807}
2808
2809
2810/* Compute the function units used by INSN. This caches the value
2811 returned by function_units_used. A function unit is encoded as the
2812 unit number if the value is non-negative and the compliment of a
2813 mask if the value is negative. A function unit index is the
2814 non-negative encoding. */
2815
cbb13457 2816HAIFA_INLINE static int
8c660648
JL
2817insn_unit (insn)
2818 rtx insn;
2819{
2820 register int unit = INSN_UNIT (insn);
2821
2822 if (unit == 0)
2823 {
2824 recog_memoized (insn);
2825
2826 /* A USE insn, or something else we don't need to understand.
2827 We can't pass these directly to function_units_used because it will
2828 trigger a fatal error for unrecognizable insns. */
2829 if (INSN_CODE (insn) < 0)
2830 unit = -1;
2831 else
2832 {
2833 unit = function_units_used (insn);
2834 /* Increment non-negative values so we can cache zero. */
2835 if (unit >= 0)
2836 unit++;
2837 }
2838 /* We only cache 16 bits of the result, so if the value is out of
2839 range, don't cache it. */
2840 if (FUNCTION_UNITS_SIZE < HOST_BITS_PER_SHORT
2841 || unit >= 0
2842 || (~unit & ((1 << (HOST_BITS_PER_SHORT - 1)) - 1)) == 0)
2843 INSN_UNIT (insn) = unit;
2844 }
2845 return (unit > 0 ? unit - 1 : unit);
2846}
2847
2848/* Compute the blockage range for executing INSN on UNIT. This caches
2849 the value returned by the blockage_range_function for the unit.
2850 These values are encoded in an int where the upper half gives the
2851 minimum value and the lower half gives the maximum value. */
2852
cbb13457 2853HAIFA_INLINE static unsigned int
8c660648
JL
2854blockage_range (unit, insn)
2855 int unit;
2856 rtx insn;
2857{
2858 unsigned int blockage = INSN_BLOCKAGE (insn);
2859 unsigned int range;
2860
2861 if (UNIT_BLOCKED (blockage) != unit + 1)
2862 {
2863 range = function_units[unit].blockage_range_function (insn);
2864 /* We only cache the blockage range for one unit and then only if
2865 the values fit. */
2866 if (HOST_BITS_PER_INT >= UNIT_BITS + 2 * BLOCKAGE_BITS)
2867 INSN_BLOCKAGE (insn) = ENCODE_BLOCKAGE (unit + 1, range);
2868 }
2869 else
2870 range = BLOCKAGE_RANGE (blockage);
2871
2872 return range;
2873}
2874
2875/* A vector indexed by function unit instance giving the last insn to use
2876 the unit. The value of the function unit instance index for unit U
2877 instance I is (U + I * FUNCTION_UNITS_SIZE). */
2878static rtx unit_last_insn[FUNCTION_UNITS_SIZE * MAX_MULTIPLICITY];
2879
2880/* A vector indexed by function unit instance giving the minimum time when
2881 the unit will unblock based on the maximum blockage cost. */
2882static int unit_tick[FUNCTION_UNITS_SIZE * MAX_MULTIPLICITY];
2883
2884/* A vector indexed by function unit number giving the number of insns
2885 that remain to use the unit. */
2886static int unit_n_insns[FUNCTION_UNITS_SIZE];
2887
2888/* Reset the function unit state to the null state. */
2889
2890static void
2891clear_units ()
2892{
2893 bzero ((char *) unit_last_insn, sizeof (unit_last_insn));
2894 bzero ((char *) unit_tick, sizeof (unit_tick));
2895 bzero ((char *) unit_n_insns, sizeof (unit_n_insns));
2896}
2897
2898/* Return the issue-delay of an insn */
2899
cbb13457 2900HAIFA_INLINE static int
8c660648
JL
2901insn_issue_delay (insn)
2902 rtx insn;
2903{
8c660648
JL
2904 int i, delay = 0;
2905 int unit = insn_unit (insn);
2906
2907 /* efficiency note: in fact, we are working 'hard' to compute a
2908 value that was available in md file, and is not available in
2909 function_units[] structure. It would be nice to have this
2910 value there, too. */
2911 if (unit >= 0)
2912 {
2913 if (function_units[unit].blockage_range_function &&
2914 function_units[unit].blockage_function)
2915 delay = function_units[unit].blockage_function (insn, insn);
2916 }
2917 else
2918 for (i = 0, unit = ~unit; unit; i++, unit >>= 1)
2919 if ((unit & 1) != 0 && function_units[i].blockage_range_function
2920 && function_units[i].blockage_function)
2921 delay = MAX (delay, function_units[i].blockage_function (insn, insn));
2922
2923 return delay;
2924}
2925
2926/* Return the actual hazard cost of executing INSN on the unit UNIT,
2927 instance INSTANCE at time CLOCK if the previous actual hazard cost
2928 was COST. */
2929
cbb13457 2930HAIFA_INLINE static int
8c660648
JL
2931actual_hazard_this_instance (unit, instance, insn, clock, cost)
2932 int unit, instance, clock, cost;
2933 rtx insn;
2934{
2935 int tick = unit_tick[instance]; /* issue time of the last issued insn */
2936
2937 if (tick - clock > cost)
2938 {
2939 /* The scheduler is operating forward, so unit's last insn is the
2940 executing insn and INSN is the candidate insn. We want a
2941 more exact measure of the blockage if we execute INSN at CLOCK
2942 given when we committed the execution of the unit's last insn.
2943
2944 The blockage value is given by either the unit's max blockage
2945 constant, blockage range function, or blockage function. Use
2946 the most exact form for the given unit. */
2947
2948 if (function_units[unit].blockage_range_function)
2949 {
2950 if (function_units[unit].blockage_function)
2951 tick += (function_units[unit].blockage_function
2952 (unit_last_insn[instance], insn)
2953 - function_units[unit].max_blockage);
2954 else
2955 tick += ((int) MAX_BLOCKAGE_COST (blockage_range (unit, insn))
2956 - function_units[unit].max_blockage);
2957 }
2958 if (tick - clock > cost)
2959 cost = tick - clock;
2960 }
2961 return cost;
2962}
2963
2964/* Record INSN as having begun execution on the units encoded by UNIT at
2965 time CLOCK. */
2966
cbb13457 2967HAIFA_INLINE static void
8c660648
JL
2968schedule_unit (unit, insn, clock)
2969 int unit, clock;
2970 rtx insn;
2971{
2972 int i;
2973
2974 if (unit >= 0)
2975 {
2976 int instance = unit;
2977#if MAX_MULTIPLICITY > 1
2978 /* Find the first free instance of the function unit and use that
2979 one. We assume that one is free. */
2980 for (i = function_units[unit].multiplicity - 1; i > 0; i--)
2981 {
2982 if (!actual_hazard_this_instance (unit, instance, insn, clock, 0))
2983 break;
2984 instance += FUNCTION_UNITS_SIZE;
2985 }
2986#endif
2987 unit_last_insn[instance] = insn;
2988 unit_tick[instance] = (clock + function_units[unit].max_blockage);
2989 }
2990 else
2991 for (i = 0, unit = ~unit; unit; i++, unit >>= 1)
2992 if ((unit & 1) != 0)
2993 schedule_unit (i, insn, clock);
2994}
2995
2996/* Return the actual hazard cost of executing INSN on the units encoded by
2997 UNIT at time CLOCK if the previous actual hazard cost was COST. */
2998
cbb13457 2999HAIFA_INLINE static int
8c660648
JL
3000actual_hazard (unit, insn, clock, cost)
3001 int unit, clock, cost;
3002 rtx insn;
3003{
3004 int i;
3005
3006 if (unit >= 0)
3007 {
3008 /* Find the instance of the function unit with the minimum hazard. */
3009 int instance = unit;
3010 int best_cost = actual_hazard_this_instance (unit, instance, insn,
3011 clock, cost);
3012 int this_cost;
3013
3014#if MAX_MULTIPLICITY > 1
3015 if (best_cost > cost)
3016 {
3017 for (i = function_units[unit].multiplicity - 1; i > 0; i--)
3018 {
3019 instance += FUNCTION_UNITS_SIZE;
3020 this_cost = actual_hazard_this_instance (unit, instance, insn,
3021 clock, cost);
3022 if (this_cost < best_cost)
3023 {
3024 best_cost = this_cost;
3025 if (this_cost <= cost)
3026 break;
3027 }
3028 }
3029 }
3030#endif
3031 cost = MAX (cost, best_cost);
3032 }
3033 else
3034 for (i = 0, unit = ~unit; unit; i++, unit >>= 1)
3035 if ((unit & 1) != 0)
3036 cost = actual_hazard (i, insn, clock, cost);
3037
3038 return cost;
3039}
3040
3041/* Return the potential hazard cost of executing an instruction on the
3042 units encoded by UNIT if the previous potential hazard cost was COST.
3043 An insn with a large blockage time is chosen in preference to one
3044 with a smaller time; an insn that uses a unit that is more likely
3045 to be used is chosen in preference to one with a unit that is less
3046 used. We are trying to minimize a subsequent actual hazard. */
3047
cbb13457 3048HAIFA_INLINE static int
8c660648
JL
3049potential_hazard (unit, insn, cost)
3050 int unit, cost;
3051 rtx insn;
3052{
3053 int i, ncost;
3054 unsigned int minb, maxb;
3055
3056 if (unit >= 0)
3057 {
3058 minb = maxb = function_units[unit].max_blockage;
3059 if (maxb > 1)
3060 {
3061 if (function_units[unit].blockage_range_function)
3062 {
3063 maxb = minb = blockage_range (unit, insn);
3064 maxb = MAX_BLOCKAGE_COST (maxb);
3065 minb = MIN_BLOCKAGE_COST (minb);
3066 }
3067
3068 if (maxb > 1)
3069 {
3070 /* Make the number of instructions left dominate. Make the
3071 minimum delay dominate the maximum delay. If all these
3072 are the same, use the unit number to add an arbitrary
3073 ordering. Other terms can be added. */
3074 ncost = minb * 0x40 + maxb;
3075 ncost *= (unit_n_insns[unit] - 1) * 0x1000 + unit;
3076 if (ncost > cost)
3077 cost = ncost;
3078 }
3079 }
3080 }
3081 else
3082 for (i = 0, unit = ~unit; unit; i++, unit >>= 1)
3083 if ((unit & 1) != 0)
3084 cost = potential_hazard (i, insn, cost);
3085
3086 return cost;
3087}
3088
3089/* Compute cost of executing INSN given the dependence LINK on the insn USED.
3090 This is the number of cycles between instruction issue and
3091 instruction results. */
3092
cbb13457 3093HAIFA_INLINE static int
8c660648
JL
3094insn_cost (insn, link, used)
3095 rtx insn, link, used;
3096{
3097 register int cost = INSN_COST (insn);
3098
3099 if (cost == 0)
3100 {
3101 recog_memoized (insn);
3102
3103 /* A USE insn, or something else we don't need to understand.
3104 We can't pass these directly to result_ready_cost because it will
3105 trigger a fatal error for unrecognizable insns. */
3106 if (INSN_CODE (insn) < 0)
3107 {
3108 INSN_COST (insn) = 1;
3109 return 1;
3110 }
3111 else
3112 {
3113 cost = result_ready_cost (insn);
3114
3115 if (cost < 1)
3116 cost = 1;
3117
3118 INSN_COST (insn) = cost;
3119 }
3120 }
3121
3122 /* in this case estimate cost without caring how insn is used. */
3123 if (link == 0 && used == 0)
3124 return cost;
3125
3126 /* A USE insn should never require the value used to be computed. This
3127 allows the computation of a function's result and parameter values to
3128 overlap the return and call. */
3129 recog_memoized (used);
3130 if (INSN_CODE (used) < 0)
3131 LINK_COST_FREE (link) = 1;
3132
3133 /* If some dependencies vary the cost, compute the adjustment. Most
3134 commonly, the adjustment is complete: either the cost is ignored
3135 (in the case of an output- or anti-dependence), or the cost is
3136 unchanged. These values are cached in the link as LINK_COST_FREE
3137 and LINK_COST_ZERO. */
3138
3139 if (LINK_COST_FREE (link))
3140 cost = 1;
3141#ifdef ADJUST_COST
3142 else if (!LINK_COST_ZERO (link))
3143 {
3144 int ncost = cost;
3145
3146 ADJUST_COST (used, link, insn, ncost);
3147 if (ncost <= 1)
3148 LINK_COST_FREE (link) = ncost = 1;
3149 if (cost == ncost)
3150 LINK_COST_ZERO (link) = 1;
3151 cost = ncost;
3152 }
3153#endif
3154 return cost;
3155}
3156
3157/* Compute the priority number for INSN. */
3158
3159static int
3160priority (insn)
3161 rtx insn;
3162{
3163 int this_priority;
3164 rtx link;
3165
3166 if (GET_RTX_CLASS (GET_CODE (insn)) != 'i')
3167 return 0;
3168
3169 if ((this_priority = INSN_PRIORITY (insn)) == 0)
3170 {
3171 if (INSN_DEPEND (insn) == 0)
3172 this_priority = insn_cost (insn, 0, 0);
3173 else
3174 for (link = INSN_DEPEND (insn); link; link = XEXP (link, 1))
3175 {
3176 rtx next;
3177 int next_priority;
3178
6d8ccdbb
JL
3179 if (RTX_INTEGRATED_P (link))
3180 continue;
3181
8c660648
JL
3182 next = XEXP (link, 0);
3183
3184 /* critical path is meaningful in block boundaries only */
3185 if (INSN_BLOCK (next) != INSN_BLOCK (insn))
3186 continue;
3187
3188 next_priority = insn_cost (insn, link, next) + priority (next);
3189 if (next_priority > this_priority)
3190 this_priority = next_priority;
3191 }
3192 INSN_PRIORITY (insn) = this_priority;
3193 }
3194 return this_priority;
3195}
3196\f
3197
3198/* Remove all INSN_LISTs and EXPR_LISTs from the pending lists and add
3199 them to the unused_*_list variables, so that they can be reused. */
3200
8c660648
JL
3201static void
3202free_pending_lists ()
3203{
8c660648
JL
3204 if (current_nr_blocks <= 1)
3205 {
ebb7b10b
RH
3206 free_list (&pending_read_insns, &unused_insn_list);
3207 free_list (&pending_write_insns, &unused_insn_list);
3208 free_list (&pending_read_mems, &unused_expr_list);
3209 free_list (&pending_write_mems, &unused_expr_list);
8c660648
JL
3210 }
3211 else
3212 {
3213 /* interblock scheduling */
3214 int bb;
3215
3216 for (bb = 0; bb < current_nr_blocks; bb++)
3217 {
ebb7b10b
RH
3218 free_list (&bb_pending_read_insns[bb], &unused_insn_list);
3219 free_list (&bb_pending_write_insns[bb], &unused_insn_list);
3220 free_list (&bb_pending_read_mems[bb], &unused_expr_list);
3221 free_list (&bb_pending_write_mems[bb], &unused_expr_list);
8c660648
JL
3222 }
3223 }
3224}
3225
3226/* Add an INSN and MEM reference pair to a pending INSN_LIST and MEM_LIST.
3227 The MEM is a memory reference contained within INSN, which we are saving
3228 so that we can do memory aliasing on it. */
3229
3230static void
3231add_insn_mem_dependence (insn_list, mem_list, insn, mem)
3232 rtx *insn_list, *mem_list, insn, mem;
3233{
3234 register rtx link;
3235
ebb7b10b 3236 link = alloc_INSN_LIST (insn, *insn_list);
8c660648
JL
3237 *insn_list = link;
3238
ebb7b10b 3239 link = alloc_EXPR_LIST (VOIDmode, mem, *mem_list);
8c660648
JL
3240 *mem_list = link;
3241
3242 pending_lists_length++;
3243}
3244\f
3245
3246/* Make a dependency between every memory reference on the pending lists
3247 and INSN, thus flushing the pending lists. If ONLY_WRITE, don't flush
3248 the read list. */
3249
3250static void
3251flush_pending_lists (insn, only_write)
3252 rtx insn;
3253 int only_write;
3254{
3255 rtx u;
3256 rtx link;
3257
3258 while (pending_read_insns && ! only_write)
3259 {
3260 add_dependence (insn, XEXP (pending_read_insns, 0), REG_DEP_ANTI);
3261
3262 link = pending_read_insns;
3263 pending_read_insns = XEXP (pending_read_insns, 1);
3264 XEXP (link, 1) = unused_insn_list;
3265 unused_insn_list = link;
3266
3267 link = pending_read_mems;
3268 pending_read_mems = XEXP (pending_read_mems, 1);
3269 XEXP (link, 1) = unused_expr_list;
3270 unused_expr_list = link;
3271 }
3272 while (pending_write_insns)
3273 {
3274 add_dependence (insn, XEXP (pending_write_insns, 0), REG_DEP_ANTI);
3275
3276 link = pending_write_insns;
3277 pending_write_insns = XEXP (pending_write_insns, 1);
3278 XEXP (link, 1) = unused_insn_list;
3279 unused_insn_list = link;
3280
3281 link = pending_write_mems;
3282 pending_write_mems = XEXP (pending_write_mems, 1);
3283 XEXP (link, 1) = unused_expr_list;
3284 unused_expr_list = link;
3285 }
3286 pending_lists_length = 0;
3287
3288 /* last_pending_memory_flush is now a list of insns */
3289 for (u = last_pending_memory_flush; u; u = XEXP (u, 1))
3290 add_dependence (insn, XEXP (u, 0), REG_DEP_ANTI);
3291
ebb7b10b
RH
3292 free_list (&last_pending_memory_flush, &unused_insn_list);
3293 last_pending_memory_flush = alloc_INSN_LIST (insn, NULL_RTX);
8c660648
JL
3294}
3295
3296/* Analyze a single SET or CLOBBER rtx, X, creating all dependencies generated
3297 by the write to the destination of X, and reads of everything mentioned. */
3298
3299static void
3300sched_analyze_1 (x, insn)
3301 rtx x;
3302 rtx insn;
3303{
3304 register int regno;
3305 register rtx dest = SET_DEST (x);
3306
3307 if (dest == 0)
3308 return;
3309
c0222c21
DM
3310 if (GET_CODE (dest) == PARALLEL
3311 && GET_MODE (dest) == BLKmode)
3312 {
3313 register int i;
3314 for (i = XVECLEN (dest, 0) - 1; i >= 0; i--)
3315 sched_analyze_1 (XVECEXP (dest, 0, i), insn);
3316 if (GET_CODE (x) == SET)
3317 sched_analyze_2 (SET_SRC (x), insn);
3318 return;
3319 }
3320
8c660648
JL
3321 while (GET_CODE (dest) == STRICT_LOW_PART || GET_CODE (dest) == SUBREG
3322 || GET_CODE (dest) == ZERO_EXTRACT || GET_CODE (dest) == SIGN_EXTRACT)
3323 {
3324 if (GET_CODE (dest) == ZERO_EXTRACT || GET_CODE (dest) == SIGN_EXTRACT)
3325 {
3326 /* The second and third arguments are values read by this insn. */
3327 sched_analyze_2 (XEXP (dest, 1), insn);
3328 sched_analyze_2 (XEXP (dest, 2), insn);
3329 }
3330 dest = SUBREG_REG (dest);
3331 }
3332
3333 if (GET_CODE (dest) == REG)
3334 {
3335 register int i;
3336
3337 regno = REGNO (dest);
3338
3339 /* A hard reg in a wide mode may really be multiple registers.
3340 If so, mark all of them just like the first. */
3341 if (regno < FIRST_PSEUDO_REGISTER)
3342 {
3343 i = HARD_REGNO_NREGS (regno, GET_MODE (dest));
3344 while (--i >= 0)
3345 {
3346 rtx u;
3347
3348 for (u = reg_last_uses[regno + i]; u; u = XEXP (u, 1))
3349 add_dependence (insn, XEXP (u, 0), REG_DEP_ANTI);
3350 reg_last_uses[regno + i] = 0;
3351
3352 for (u = reg_last_sets[regno + i]; u; u = XEXP (u, 1))
3353 add_dependence (insn, XEXP (u, 0), REG_DEP_OUTPUT);
3354
3355 SET_REGNO_REG_SET (reg_pending_sets, regno + i);
3356
3357 if ((call_used_regs[regno + i] || global_regs[regno + i]))
3358 /* Function calls clobber all call_used regs. */
3359 for (u = last_function_call; u; u = XEXP (u, 1))
3360 add_dependence (insn, XEXP (u, 0), REG_DEP_ANTI);
3361 }
3362 }
3363 else
3364 {
3365 rtx u;
3366
3367 for (u = reg_last_uses[regno]; u; u = XEXP (u, 1))
3368 add_dependence (insn, XEXP (u, 0), REG_DEP_ANTI);
3369 reg_last_uses[regno] = 0;
3370
3371 for (u = reg_last_sets[regno]; u; u = XEXP (u, 1))
3372 add_dependence (insn, XEXP (u, 0), REG_DEP_OUTPUT);
3373
3374 SET_REGNO_REG_SET (reg_pending_sets, regno);
3375
3376 /* Pseudos that are REG_EQUIV to something may be replaced
3377 by that during reloading. We need only add dependencies for
3378 the address in the REG_EQUIV note. */
3379 if (!reload_completed
3380 && reg_known_equiv_p[regno]
3381 && GET_CODE (reg_known_value[regno]) == MEM)
3382 sched_analyze_2 (XEXP (reg_known_value[regno], 0), insn);
3383
3384 /* Don't let it cross a call after scheduling if it doesn't
3385 already cross one. */
3386
3387 if (REG_N_CALLS_CROSSED (regno) == 0)
3388 for (u = last_function_call; u; u = XEXP (u, 1))
3389 add_dependence (insn, XEXP (u, 0), REG_DEP_ANTI);
3390 }
3391 }
3392 else if (GET_CODE (dest) == MEM)
3393 {
3394 /* Writing memory. */
3395
3396 if (pending_lists_length > 32)
3397 {
3398 /* Flush all pending reads and writes to prevent the pending lists
3399 from getting any larger. Insn scheduling runs too slowly when
3400 these lists get long. The number 32 was chosen because it
3401 seems like a reasonable number. When compiling GCC with itself,
3402 this flush occurs 8 times for sparc, and 10 times for m88k using
3403 the number 32. */
3404 flush_pending_lists (insn, 0);
3405 }
3406 else
3407 {
3408 rtx u;
3409 rtx pending, pending_mem;
3410
3411 pending = pending_read_insns;
3412 pending_mem = pending_read_mems;
3413 while (pending)
3414 {
3415 /* If a dependency already exists, don't create a new one. */
3416 if (!find_insn_list (XEXP (pending, 0), LOG_LINKS (insn)))
3417 if (anti_dependence (XEXP (pending_mem, 0), dest))
3418 add_dependence (insn, XEXP (pending, 0), REG_DEP_ANTI);
3419
3420 pending = XEXP (pending, 1);
3421 pending_mem = XEXP (pending_mem, 1);
3422 }
3423
3424 pending = pending_write_insns;
3425 pending_mem = pending_write_mems;
3426 while (pending)
3427 {
3428 /* If a dependency already exists, don't create a new one. */
3429 if (!find_insn_list (XEXP (pending, 0), LOG_LINKS (insn)))
3430 if (output_dependence (XEXP (pending_mem, 0), dest))
3431 add_dependence (insn, XEXP (pending, 0), REG_DEP_OUTPUT);
3432
3433 pending = XEXP (pending, 1);
3434 pending_mem = XEXP (pending_mem, 1);
3435 }
3436
3437 for (u = last_pending_memory_flush; u; u = XEXP (u, 1))
3438 add_dependence (insn, XEXP (u, 0), REG_DEP_ANTI);
3439
3440 add_insn_mem_dependence (&pending_write_insns, &pending_write_mems,
3441 insn, dest);
3442 }
3443 sched_analyze_2 (XEXP (dest, 0), insn);
3444 }
3445
3446 /* Analyze reads. */
3447 if (GET_CODE (x) == SET)
3448 sched_analyze_2 (SET_SRC (x), insn);
3449}
3450
3451/* Analyze the uses of memory and registers in rtx X in INSN. */
3452
3453static void
3454sched_analyze_2 (x, insn)
3455 rtx x;
3456 rtx insn;
3457{
3458 register int i;
3459 register int j;
3460 register enum rtx_code code;
3461 register char *fmt;
3462
3463 if (x == 0)
3464 return;
3465
3466 code = GET_CODE (x);
3467
3468 switch (code)
3469 {
3470 case CONST_INT:
3471 case CONST_DOUBLE:
3472 case SYMBOL_REF:
3473 case CONST:
3474 case LABEL_REF:
3475 /* Ignore constants. Note that we must handle CONST_DOUBLE here
3476 because it may have a cc0_rtx in its CONST_DOUBLE_CHAIN field, but
3477 this does not mean that this insn is using cc0. */
3478 return;
3479
3480#ifdef HAVE_cc0
3481 case CC0:
3482 {
3483 rtx link, prev;
3484
3485 /* User of CC0 depends on immediately preceding insn. */
3486 SCHED_GROUP_P (insn) = 1;
3487
3488 /* There may be a note before this insn now, but all notes will
3489 be removed before we actually try to schedule the insns, so
3490 it won't cause a problem later. We must avoid it here though. */
3491 prev = prev_nonnote_insn (insn);
3492
3493 /* Make a copy of all dependencies on the immediately previous insn,
3494 and add to this insn. This is so that all the dependencies will
3495 apply to the group. Remove an explicit dependence on this insn
3496 as SCHED_GROUP_P now represents it. */
3497
3498 if (find_insn_list (prev, LOG_LINKS (insn)))
3499 remove_dependence (insn, prev);
3500
3501 for (link = LOG_LINKS (prev); link; link = XEXP (link, 1))
3502 add_dependence (insn, XEXP (link, 0), REG_NOTE_KIND (link));
3503
3504 return;
3505 }
3506#endif
3507
3508 case REG:
3509 {
3510 rtx u;
3511 int regno = REGNO (x);
3512 if (regno < FIRST_PSEUDO_REGISTER)
3513 {
3514 int i;
3515
3516 i = HARD_REGNO_NREGS (regno, GET_MODE (x));
3517 while (--i >= 0)
3518 {
3519 reg_last_uses[regno + i]
ebb7b10b 3520 = alloc_INSN_LIST (insn, reg_last_uses[regno + i]);
8c660648
JL
3521
3522 for (u = reg_last_sets[regno + i]; u; u = XEXP (u, 1))
3523 add_dependence (insn, XEXP (u, 0), 0);
3524
3525 if ((call_used_regs[regno + i] || global_regs[regno + i]))
3526 /* Function calls clobber all call_used regs. */
3527 for (u = last_function_call; u; u = XEXP (u, 1))
3528 add_dependence (insn, XEXP (u, 0), REG_DEP_ANTI);
3529 }
3530 }
3531 else
3532 {
ebb7b10b 3533 reg_last_uses[regno] = alloc_INSN_LIST (insn, reg_last_uses[regno]);
8c660648
JL
3534
3535 for (u = reg_last_sets[regno]; u; u = XEXP (u, 1))
3536 add_dependence (insn, XEXP (u, 0), 0);
3537
3538 /* Pseudos that are REG_EQUIV to something may be replaced
3539 by that during reloading. We need only add dependencies for
3540 the address in the REG_EQUIV note. */
3541 if (!reload_completed
3542 && reg_known_equiv_p[regno]
3543 && GET_CODE (reg_known_value[regno]) == MEM)
3544 sched_analyze_2 (XEXP (reg_known_value[regno], 0), insn);
3545
3546 /* If the register does not already cross any calls, then add this
3547 insn to the sched_before_next_call list so that it will still
3548 not cross calls after scheduling. */
3549 if (REG_N_CALLS_CROSSED (regno) == 0)
3550 add_dependence (sched_before_next_call, insn, REG_DEP_ANTI);
3551 }
3552 return;
3553 }
3554
3555 case MEM:
3556 {
3557 /* Reading memory. */
3558 rtx u;
3559 rtx pending, pending_mem;
3560
3561 pending = pending_read_insns;
3562 pending_mem = pending_read_mems;
3563 while (pending)
3564 {
3565 /* If a dependency already exists, don't create a new one. */
3566 if (!find_insn_list (XEXP (pending, 0), LOG_LINKS (insn)))
3567 if (read_dependence (XEXP (pending_mem, 0), x))
3568 add_dependence (insn, XEXP (pending, 0), REG_DEP_ANTI);
3569
3570 pending = XEXP (pending, 1);
3571 pending_mem = XEXP (pending_mem, 1);
3572 }
3573
3574 pending = pending_write_insns;
3575 pending_mem = pending_write_mems;
3576 while (pending)
3577 {
3578 /* If a dependency already exists, don't create a new one. */
3579 if (!find_insn_list (XEXP (pending, 0), LOG_LINKS (insn)))
3580 if (true_dependence (XEXP (pending_mem, 0), VOIDmode,
3581 x, rtx_varies_p))
3582 add_dependence (insn, XEXP (pending, 0), 0);
3583
3584 pending = XEXP (pending, 1);
3585 pending_mem = XEXP (pending_mem, 1);
3586 }
3587
3588 for (u = last_pending_memory_flush; u; u = XEXP (u, 1))
3589 add_dependence (insn, XEXP (u, 0), REG_DEP_ANTI);
3590
3591 /* Always add these dependencies to pending_reads, since
3592 this insn may be followed by a write. */
3593 add_insn_mem_dependence (&pending_read_insns, &pending_read_mems,
3594 insn, x);
3595
3596 /* Take advantage of tail recursion here. */
3597 sched_analyze_2 (XEXP (x, 0), insn);
3598 return;
3599 }
3600
e0cd0770
JC
3601 /* Force pending stores to memory in case a trap handler needs them. */
3602 case TRAP_IF:
3603 flush_pending_lists (insn, 1);
3604 break;
3605
8c660648
JL
3606 case ASM_OPERANDS:
3607 case ASM_INPUT:
3608 case UNSPEC_VOLATILE:
8c660648
JL
3609 {
3610 rtx u;
3611
3612 /* Traditional and volatile asm instructions must be considered to use
3613 and clobber all hard registers, all pseudo-registers and all of
3614 memory. So must TRAP_IF and UNSPEC_VOLATILE operations.
3615
3616 Consider for instance a volatile asm that changes the fpu rounding
3617 mode. An insn should not be moved across this even if it only uses
3618 pseudo-regs because it might give an incorrectly rounded result. */
3619 if (code != ASM_OPERANDS || MEM_VOLATILE_P (x))
3620 {
3621 int max_reg = max_reg_num ();
3622 for (i = 0; i < max_reg; i++)
3623 {
3624 for (u = reg_last_uses[i]; u; u = XEXP (u, 1))
3625 add_dependence (insn, XEXP (u, 0), REG_DEP_ANTI);
3626 reg_last_uses[i] = 0;
3627
3628 /* reg_last_sets[r] is now a list of insns */
3629 for (u = reg_last_sets[i]; u; u = XEXP (u, 1))
3630 add_dependence (insn, XEXP (u, 0), 0);
3631 }
3632 reg_pending_sets_all = 1;
3633
3634 flush_pending_lists (insn, 0);
3635 }
3636
3637 /* For all ASM_OPERANDS, we must traverse the vector of input operands.
3638 We can not just fall through here since then we would be confused
3639 by the ASM_INPUT rtx inside ASM_OPERANDS, which do not indicate
3640 traditional asms unlike their normal usage. */
3641
3642 if (code == ASM_OPERANDS)
3643 {
3644 for (j = 0; j < ASM_OPERANDS_INPUT_LENGTH (x); j++)
3645 sched_analyze_2 (ASM_OPERANDS_INPUT (x, j), insn);
3646 return;
3647 }
3648 break;
3649 }
3650
3651 case PRE_DEC:
3652 case POST_DEC:
3653 case PRE_INC:
3654 case POST_INC:
3655 /* These both read and modify the result. We must handle them as writes
3656 to get proper dependencies for following instructions. We must handle
3657 them as reads to get proper dependencies from this to previous
3658 instructions. Thus we need to pass them to both sched_analyze_1
3659 and sched_analyze_2. We must call sched_analyze_2 first in order
3660 to get the proper antecedent for the read. */
3661 sched_analyze_2 (XEXP (x, 0), insn);
3662 sched_analyze_1 (x, insn);
3663 return;
5835e573
KG
3664
3665 default:
3666 break;
8c660648
JL
3667 }
3668
3669 /* Other cases: walk the insn. */
3670 fmt = GET_RTX_FORMAT (code);
3671 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
3672 {
3673 if (fmt[i] == 'e')
3674 sched_analyze_2 (XEXP (x, i), insn);
3675 else if (fmt[i] == 'E')
3676 for (j = 0; j < XVECLEN (x, i); j++)
3677 sched_analyze_2 (XVECEXP (x, i, j), insn);
3678 }
3679}
3680
3681/* Analyze an INSN with pattern X to find all dependencies. */
3682
3683static void
3684sched_analyze_insn (x, insn, loop_notes)
3685 rtx x, insn;
3686 rtx loop_notes;
3687{
3688 register RTX_CODE code = GET_CODE (x);
3689 rtx link;
3690 int maxreg = max_reg_num ();
3691 int i;
3692
3693 if (code == SET || code == CLOBBER)
3694 sched_analyze_1 (x, insn);
3695 else if (code == PARALLEL)
3696 {
3697 register int i;
3698 for (i = XVECLEN (x, 0) - 1; i >= 0; i--)
3699 {
3700 code = GET_CODE (XVECEXP (x, 0, i));
3701 if (code == SET || code == CLOBBER)
3702 sched_analyze_1 (XVECEXP (x, 0, i), insn);
3703 else
3704 sched_analyze_2 (XVECEXP (x, 0, i), insn);
3705 }
3706 }
3707 else
3708 sched_analyze_2 (x, insn);
3709
3710 /* Mark registers CLOBBERED or used by called function. */
3711 if (GET_CODE (insn) == CALL_INSN)
3712 for (link = CALL_INSN_FUNCTION_USAGE (insn); link; link = XEXP (link, 1))
3713 {
3714 if (GET_CODE (XEXP (link, 0)) == CLOBBER)
3715 sched_analyze_1 (XEXP (link, 0), insn);
3716 else
3717 sched_analyze_2 (XEXP (link, 0), insn);
3718 }
3719
1f1ed00c
JL
3720 /* If there is a {LOOP,EHREGION}_{BEG,END} note in the middle of a basic
3721 block, then we must be sure that no instructions are scheduled across it.
8c660648
JL
3722 Otherwise, the reg_n_refs info (which depends on loop_depth) would
3723 become incorrect. */
3724
3725 if (loop_notes)
3726 {
3727 int max_reg = max_reg_num ();
1f1ed00c 3728 int schedule_barrier_found = 0;
8c660648
JL
3729 rtx link;
3730
1f1ed00c
JL
3731 /* Update loop_notes with any notes from this insn. Also determine
3732 if any of the notes on the list correspond to instruction scheduling
3733 barriers (loop, eh & setjmp notes, but not range notes. */
8c660648
JL
3734 link = loop_notes;
3735 while (XEXP (link, 1))
1f1ed00c 3736 {
54c3cf4b
JL
3737 if (INTVAL (XEXP (link, 0)) == NOTE_INSN_LOOP_BEG
3738 || INTVAL (XEXP (link, 0)) == NOTE_INSN_LOOP_END
3739 || INTVAL (XEXP (link, 0)) == NOTE_INSN_EH_REGION_BEG
3740 || INTVAL (XEXP (link, 0)) == NOTE_INSN_EH_REGION_END
3741 || INTVAL (XEXP (link, 0)) == NOTE_INSN_SETJMP)
1f1ed00c
JL
3742 schedule_barrier_found = 1;
3743
3744 link = XEXP (link, 1);
3745 }
8c660648
JL
3746 XEXP (link, 1) = REG_NOTES (insn);
3747 REG_NOTES (insn) = loop_notes;
1f1ed00c
JL
3748
3749 /* Add dependencies if a scheduling barrier was found. */
3750 if (schedule_barrier_found)
3751 {
3752 for (i = 0; i < max_reg; i++)
3753 {
3754 rtx u;
3755 for (u = reg_last_uses[i]; u; u = XEXP (u, 1))
3756 add_dependence (insn, XEXP (u, 0), REG_DEP_ANTI);
3757 reg_last_uses[i] = 0;
3758
3759 /* reg_last_sets[r] is now a list of insns */
3760 for (u = reg_last_sets[i]; u; u = XEXP (u, 1))
3761 add_dependence (insn, XEXP (u, 0), 0);
3762 }
3763 reg_pending_sets_all = 1;
3764
3765 flush_pending_lists (insn, 0);
3766 }
3767
8c660648
JL
3768 }
3769
8c660648
JL
3770 EXECUTE_IF_SET_IN_REG_SET (reg_pending_sets, 0, i,
3771 {
3772 /* reg_last_sets[r] is now a list of insns */
ebb7b10b 3773 free_list (&reg_last_sets[i], &unused_insn_list);
8c660648 3774 reg_last_sets[i]
ebb7b10b 3775 = alloc_INSN_LIST (insn, NULL_RTX);
8c660648
JL
3776 });
3777 CLEAR_REG_SET (reg_pending_sets);
3778
3779 if (reg_pending_sets_all)
3780 {
3781 for (i = 0; i < maxreg; i++)
ebb7b10b
RH
3782 {
3783 /* reg_last_sets[r] is now a list of insns */
3784 free_list (&reg_last_sets[i], &unused_insn_list);
3785 reg_last_sets[i] = alloc_INSN_LIST (insn, NULL_RTX);
3786 }
8c660648
JL
3787
3788 reg_pending_sets_all = 0;
3789 }
3790
3791 /* Handle function calls and function returns created by the epilogue
3792 threading code. */
3793 if (GET_CODE (insn) == CALL_INSN || GET_CODE (insn) == JUMP_INSN)
3794 {
3795 rtx dep_insn;
3796 rtx prev_dep_insn;
3797
3798 /* When scheduling instructions, we make sure calls don't lose their
3799 accompanying USE insns by depending them one on another in order.
3800
3801 Also, we must do the same thing for returns created by the epilogue
3802 threading code. Note this code works only in this special case,
3803 because other passes make no guarantee that they will never emit
3804 an instruction between a USE and a RETURN. There is such a guarantee
3805 for USE instructions immediately before a call. */
3806
3807 prev_dep_insn = insn;
3808 dep_insn = PREV_INSN (insn);
3809 while (GET_CODE (dep_insn) == INSN
3810 && GET_CODE (PATTERN (dep_insn)) == USE
3811 && GET_CODE (XEXP (PATTERN (dep_insn), 0)) == REG)
3812 {
3813 SCHED_GROUP_P (prev_dep_insn) = 1;
3814
3815 /* Make a copy of all dependencies on dep_insn, and add to insn.
3816 This is so that all of the dependencies will apply to the
3817 group. */
3818
3819 for (link = LOG_LINKS (dep_insn); link; link = XEXP (link, 1))
3820 add_dependence (insn, XEXP (link, 0), REG_NOTE_KIND (link));
3821
3822 prev_dep_insn = dep_insn;
3823 dep_insn = PREV_INSN (dep_insn);
3824 }
3825 }
3826}
3827
3828/* Analyze every insn between HEAD and TAIL inclusive, creating LOG_LINKS
3829 for every dependency. */
3830
3831static void
3832sched_analyze (head, tail)
3833 rtx head, tail;
3834{
3835 register rtx insn;
3836 register rtx u;
3837 rtx loop_notes = 0;
3838
3839 for (insn = head;; insn = NEXT_INSN (insn))
3840 {
3841 if (GET_CODE (insn) == INSN || GET_CODE (insn) == JUMP_INSN)
3842 {
062ae7ed
JL
3843 /* Make each JUMP_INSN a scheduling barrier for memory references. */
3844 if (GET_CODE (insn) == JUMP_INSN)
3845 last_pending_memory_flush
3846 = alloc_INSN_LIST (insn, last_pending_memory_flush);
8c660648
JL
3847 sched_analyze_insn (PATTERN (insn), insn, loop_notes);
3848 loop_notes = 0;
3849 }
3850 else if (GET_CODE (insn) == CALL_INSN)
3851 {
3852 rtx x;
3853 register int i;
3854
3855 CANT_MOVE (insn) = 1;
3856
3857 /* Any instruction using a hard register which may get clobbered
3858 by a call needs to be marked as dependent on this call.
3859 This prevents a use of a hard return reg from being moved
3860 past a void call (i.e. it does not explicitly set the hard
3861 return reg). */
3862
3863 /* If this call is followed by a NOTE_INSN_SETJMP, then assume that
3864 all registers, not just hard registers, may be clobbered by this
3865 call. */
3866
3867 /* Insn, being a CALL_INSN, magically depends on
3868 `last_function_call' already. */
3869
3870 if (NEXT_INSN (insn) && GET_CODE (NEXT_INSN (insn)) == NOTE
3871 && NOTE_LINE_NUMBER (NEXT_INSN (insn)) == NOTE_INSN_SETJMP)
3872 {
3873 int max_reg = max_reg_num ();
3874 for (i = 0; i < max_reg; i++)
3875 {
3876 for (u = reg_last_uses[i]; u; u = XEXP (u, 1))
3877 add_dependence (insn, XEXP (u, 0), REG_DEP_ANTI);
3878
3879 reg_last_uses[i] = 0;
3880
3881 /* reg_last_sets[r] is now a list of insns */
3882 for (u = reg_last_sets[i]; u; u = XEXP (u, 1))
3883 add_dependence (insn, XEXP (u, 0), 0);
3884 }
3885 reg_pending_sets_all = 1;
3886
3887 /* Add a pair of fake REG_NOTE which we will later
3888 convert back into a NOTE_INSN_SETJMP note. See
3889 reemit_notes for why we use a pair of NOTEs. */
ebb7b10b
RH
3890 REG_NOTES (insn) = alloc_EXPR_LIST (REG_DEAD,
3891 GEN_INT (0),
3892 REG_NOTES (insn));
3893 REG_NOTES (insn) = alloc_EXPR_LIST (REG_DEAD,
3894 GEN_INT (NOTE_INSN_SETJMP),
3895 REG_NOTES (insn));
8c660648
JL
3896 }
3897 else
3898 {
3899 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
3900 if (call_used_regs[i] || global_regs[i])
3901 {
3902 for (u = reg_last_uses[i]; u; u = XEXP (u, 1))
3903 add_dependence (insn, XEXP (u, 0), REG_DEP_ANTI);
3904 reg_last_uses[i] = 0;
3905
3906 /* reg_last_sets[r] is now a list of insns */
3907 for (u = reg_last_sets[i]; u; u = XEXP (u, 1))
3908 add_dependence (insn, XEXP (u, 0), REG_DEP_ANTI);
3909
3910 SET_REGNO_REG_SET (reg_pending_sets, i);
3911 }
3912 }
3913
3914 /* For each insn which shouldn't cross a call, add a dependence
3915 between that insn and this call insn. */
3916 x = LOG_LINKS (sched_before_next_call);
3917 while (x)
3918 {
3919 add_dependence (insn, XEXP (x, 0), REG_DEP_ANTI);
3920 x = XEXP (x, 1);
3921 }
3922 LOG_LINKS (sched_before_next_call) = 0;
3923
3924 sched_analyze_insn (PATTERN (insn), insn, loop_notes);
3925 loop_notes = 0;
3926
3927 /* In the absence of interprocedural alias analysis, we must flush
3928 all pending reads and writes, and start new dependencies starting
3929 from here. But only flush writes for constant calls (which may
3930 be passed a pointer to something we haven't written yet). */
3931 flush_pending_lists (insn, CONST_CALL_P (insn));
3932
3933 /* Depend this function call (actually, the user of this
3934 function call) on all hard register clobberage. */
3935
3936 /* last_function_call is now a list of insns */
ebb7b10b
RH
3937 free_list(&last_function_call, &unused_insn_list);
3938 last_function_call = alloc_INSN_LIST (insn, NULL_RTX);
8c660648
JL
3939 }
3940
3941 /* See comments on reemit_notes as to why we do this. */
6dfdecdb
RH
3942 /* ??? Actually, the reemit_notes just say what is done, not why. */
3943
3944 else if (GET_CODE (insn) == NOTE
3945 && (NOTE_LINE_NUMBER (insn) == NOTE_INSN_RANGE_START
3946 || NOTE_LINE_NUMBER (insn) == NOTE_INSN_RANGE_END))
3947 {
3948 loop_notes = alloc_EXPR_LIST (REG_DEAD, NOTE_RANGE_INFO (insn),
3949 loop_notes);
3950 loop_notes = alloc_EXPR_LIST (REG_DEAD,
3951 GEN_INT (NOTE_LINE_NUMBER (insn)),
3952 loop_notes);
3953 }
8c660648
JL
3954 else if (GET_CODE (insn) == NOTE
3955 && (NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_BEG
3956 || NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_END
3957 || NOTE_LINE_NUMBER (insn) == NOTE_INSN_EH_REGION_BEG
3958 || NOTE_LINE_NUMBER (insn) == NOTE_INSN_EH_REGION_END
3959 || (NOTE_LINE_NUMBER (insn) == NOTE_INSN_SETJMP
3960 && GET_CODE (PREV_INSN (insn)) != CALL_INSN)))
3961 {
ebb7b10b
RH
3962 loop_notes = alloc_EXPR_LIST (REG_DEAD,
3963 GEN_INT (NOTE_BLOCK_NUMBER (insn)),
3964 loop_notes);
3965 loop_notes = alloc_EXPR_LIST (REG_DEAD,
3966 GEN_INT (NOTE_LINE_NUMBER (insn)),
3967 loop_notes);
8c660648
JL
3968 CONST_CALL_P (loop_notes) = CONST_CALL_P (insn);
3969 }
3970
3971 if (insn == tail)
3972 return;
3973 }
3974 abort ();
3975}
3976\f
3977/* Called when we see a set of a register. If death is true, then we are
3978 scanning backwards. Mark that register as unborn. If nobody says
3979 otherwise, that is how things will remain. If death is false, then we
3980 are scanning forwards. Mark that register as being born. */
3981
3982static void
5835e573 3983sched_note_set (x, death)
8c660648
JL
3984 rtx x;
3985 int death;
3986{
3987 register int regno;
3988 register rtx reg = SET_DEST (x);
3989 int subreg_p = 0;
3990
3991 if (reg == 0)
3992 return;
3993
c0222c21
DM
3994 if (GET_CODE (reg) == PARALLEL
3995 && GET_MODE (reg) == BLKmode)
3996 {
3997 register int i;
3998 for (i = XVECLEN (reg, 0) - 1; i >= 0; i--)
3999 sched_note_set (XVECEXP (reg, 0, i), death);
4000 return;
4001 }
4002
8c660648
JL
4003 while (GET_CODE (reg) == SUBREG || GET_CODE (reg) == STRICT_LOW_PART
4004 || GET_CODE (reg) == SIGN_EXTRACT || GET_CODE (reg) == ZERO_EXTRACT)
4005 {
4006 /* Must treat modification of just one hardware register of a multi-reg
4007 value or just a byte field of a register exactly the same way that
4008 mark_set_1 in flow.c does, i.e. anything except a paradoxical subreg
4009 does not kill the entire register. */
4010 if (GET_CODE (reg) != SUBREG
4011 || REG_SIZE (SUBREG_REG (reg)) > REG_SIZE (reg))
4012 subreg_p = 1;
4013
4014 reg = SUBREG_REG (reg);
4015 }
4016
4017 if (GET_CODE (reg) != REG)
4018 return;
4019
4020 /* Global registers are always live, so the code below does not apply
4021 to them. */
4022
4023 regno = REGNO (reg);
4024 if (regno >= FIRST_PSEUDO_REGISTER || !global_regs[regno])
4025 {
4026 if (death)
4027 {
4028 /* If we only set part of the register, then this set does not
4029 kill it. */
4030 if (subreg_p)
4031 return;
4032
4033 /* Try killing this register. */
4034 if (regno < FIRST_PSEUDO_REGISTER)
4035 {
4036 int j = HARD_REGNO_NREGS (regno, GET_MODE (reg));
4037 while (--j >= 0)
4038 {
4039 CLEAR_REGNO_REG_SET (bb_live_regs, regno + j);
4040 }
4041 }
4042 else
4043 {
4044 /* Recompute REG_BASIC_BLOCK as we update all the other
4045 dataflow information. */
4046 if (sched_reg_basic_block[regno] == REG_BLOCK_UNKNOWN)
4047 sched_reg_basic_block[regno] = current_block_num;
4048 else if (sched_reg_basic_block[regno] != current_block_num)
4049 sched_reg_basic_block[regno] = REG_BLOCK_GLOBAL;
4050
4051 CLEAR_REGNO_REG_SET (bb_live_regs, regno);
4052 }
4053 }
4054 else
4055 {
4056 /* Make the register live again. */
4057 if (regno < FIRST_PSEUDO_REGISTER)
4058 {
4059 int j = HARD_REGNO_NREGS (regno, GET_MODE (reg));
4060 while (--j >= 0)
4061 {
4062 SET_REGNO_REG_SET (bb_live_regs, regno + j);
4063 }
4064 }
4065 else
4066 {
4067 SET_REGNO_REG_SET (bb_live_regs, regno);
4068 }
4069 }
4070 }
4071}
4072\f
4073/* Macros and functions for keeping the priority queue sorted, and
4074 dealing with queueing and dequeueing of instructions. */
4075
4076#define SCHED_SORT(READY, N_READY) \
4077do { if ((N_READY) == 2) \
4078 swap_sort (READY, N_READY); \
4079 else if ((N_READY) > 2) \
4080 qsort (READY, N_READY, sizeof (rtx), rank_for_schedule); } \
4081while (0)
4082
4083/* Returns a positive value if x is preferred; returns a negative value if
4084 y is preferred. Should never return 0, since that will make the sort
4085 unstable. */
4086
4087static int
4088rank_for_schedule (x, y)
01c7f350
MM
4089 const GENERIC_PTR x;
4090 const GENERIC_PTR y;
8c660648 4091{
01c7f350
MM
4092 rtx tmp = *(rtx *)y;
4093 rtx tmp2 = *(rtx *)x;
8c660648 4094 rtx link;
2db45993 4095 int tmp_class, tmp2_class, depend_count1, depend_count2;
8c660648
JL
4096 int val, priority_val, spec_val, prob_val, weight_val;
4097
4098
8c660648
JL
4099 /* prefer insn with higher priority */
4100 priority_val = INSN_PRIORITY (tmp2) - INSN_PRIORITY (tmp);
4101 if (priority_val)
4102 return priority_val;
4103
4104 /* prefer an insn with smaller contribution to registers-pressure */
4105 if (!reload_completed &&
4106 (weight_val = INSN_REG_WEIGHT (tmp) - INSN_REG_WEIGHT (tmp2)))
4107 return (weight_val);
4108
4109 /* some comparison make sense in interblock scheduling only */
4110 if (INSN_BB (tmp) != INSN_BB (tmp2))
4111 {
4112 /* prefer an inblock motion on an interblock motion */
4113 if ((INSN_BB (tmp2) == target_bb) && (INSN_BB (tmp) != target_bb))
4114 return 1;
4115 if ((INSN_BB (tmp) == target_bb) && (INSN_BB (tmp2) != target_bb))
4116 return -1;
4117
4118 /* prefer a useful motion on a speculative one */
4119 if ((spec_val = IS_SPECULATIVE_INSN (tmp) - IS_SPECULATIVE_INSN (tmp2)))
4120 return (spec_val);
4121
4122 /* prefer a more probable (speculative) insn */
4123 prob_val = INSN_PROBABILITY (tmp2) - INSN_PROBABILITY (tmp);
4124 if (prob_val)
4125 return (prob_val);
4126 }
4127
4128 /* compare insns based on their relation to the last-scheduled-insn */
4129 if (last_scheduled_insn)
4130 {
4131 /* Classify the instructions into three classes:
4132 1) Data dependent on last schedule insn.
4133 2) Anti/Output dependent on last scheduled insn.
4134 3) Independent of last scheduled insn, or has latency of one.
4135 Choose the insn from the highest numbered class if different. */
4136 link = find_insn_list (tmp, INSN_DEPEND (last_scheduled_insn));
4137 if (link == 0 || insn_cost (last_scheduled_insn, link, tmp) == 1)
4138 tmp_class = 3;
4139 else if (REG_NOTE_KIND (link) == 0) /* Data dependence. */
4140 tmp_class = 1;
4141 else
4142 tmp_class = 2;
4143
4144 link = find_insn_list (tmp2, INSN_DEPEND (last_scheduled_insn));
4145 if (link == 0 || insn_cost (last_scheduled_insn, link, tmp2) == 1)
4146 tmp2_class = 3;
4147 else if (REG_NOTE_KIND (link) == 0) /* Data dependence. */
4148 tmp2_class = 1;
4149 else
4150 tmp2_class = 2;
4151
4152 if ((val = tmp2_class - tmp_class))
4153 return val;
4154 }
4155
2db45993
JL
4156 /* Prefer the insn which has more later insns that depend on it.
4157 This gives the scheduler more freedom when scheduling later
4158 instructions at the expense of added register pressure. */
4159 depend_count1 = 0;
4160 for (link = INSN_DEPEND (tmp); link; link = XEXP (link, 1))
4161 depend_count1++;
4162
4163 depend_count2 = 0;
4164 for (link = INSN_DEPEND (tmp2); link; link = XEXP (link, 1))
4165 depend_count2++;
4166
4167 val = depend_count2 - depend_count1;
4168 if (val)
4169 return val;
4170
8c660648
JL
4171 /* If insns are equally good, sort by INSN_LUID (original insn order),
4172 so that we make the sort stable. This minimizes instruction movement,
4173 thus minimizing sched's effect on debugging and cross-jumping. */
4174 return INSN_LUID (tmp) - INSN_LUID (tmp2);
4175}
4176
4177/* Resort the array A in which only element at index N may be out of order. */
4178
cbb13457 4179HAIFA_INLINE static void
8c660648
JL
4180swap_sort (a, n)
4181 rtx *a;
4182 int n;
4183{
4184 rtx insn = a[n - 1];
4185 int i = n - 2;
4186
4187 while (i >= 0 && rank_for_schedule (a + i, &insn) >= 0)
4188 {
4189 a[i + 1] = a[i];
4190 i -= 1;
4191 }
4192 a[i + 1] = insn;
4193}
4194
4195static int max_priority;
4196
4197/* Add INSN to the insn queue so that it can be executed at least
4198 N_CYCLES after the currently executing insn. Preserve insns
4199 chain for debugging purposes. */
4200
cbb13457 4201HAIFA_INLINE static void
8c660648
JL
4202queue_insn (insn, n_cycles)
4203 rtx insn;
4204 int n_cycles;
4205{
4206 int next_q = NEXT_Q_AFTER (q_ptr, n_cycles);
ebb7b10b 4207 rtx link = alloc_INSN_LIST (insn, insn_queue[next_q]);
8c660648
JL
4208 insn_queue[next_q] = link;
4209 q_size += 1;
4210
4211 if (sched_verbose >= 2)
4212 {
4213 fprintf (dump, ";;\t\tReady-->Q: insn %d: ", INSN_UID (insn));
4214
4215 if (INSN_BB (insn) != target_bb)
4216 fprintf (dump, "(b%d) ", INSN_BLOCK (insn));
4217
4218 fprintf (dump, "queued for %d cycles.\n", n_cycles);
4219 }
4220
4221}
4222
4223/* Return nonzero if PAT is the pattern of an insn which makes a
4224 register live. */
4225
cbb13457 4226HAIFA_INLINE static int
8c660648
JL
4227birthing_insn_p (pat)
4228 rtx pat;
4229{
4230 int j;
4231
4232 if (reload_completed == 1)
4233 return 0;
4234
4235 if (GET_CODE (pat) == SET
c0222c21
DM
4236 && (GET_CODE (SET_DEST (pat)) == REG
4237 || (GET_CODE (SET_DEST (pat)) == PARALLEL
4238 && GET_MODE (SET_DEST (pat)) == BLKmode)))
8c660648
JL
4239 {
4240 rtx dest = SET_DEST (pat);
c0222c21 4241 int i;
8c660648
JL
4242
4243 /* It would be more accurate to use refers_to_regno_p or
c0222c21
DM
4244 reg_mentioned_p to determine when the dest is not live before this
4245 insn. */
4246 if (GET_CODE (dest) == REG)
4247 {
4248 i = REGNO (dest);
4249 if (REGNO_REG_SET_P (bb_live_regs, i))
4250 return (REG_N_SETS (i) == 1);
4251 }
4252 else
4253 {
4254 for (i = XVECLEN (dest, 0) - 1; i >= 0; i--)
4255 {
4256 int regno = REGNO (SET_DEST (XVECEXP (dest, 0, i)));
4257 if (REGNO_REG_SET_P (bb_live_regs, regno))
4258 return (REG_N_SETS (regno) == 1);
4259 }
4260 }
8c660648
JL
4261 return 0;
4262 }
4263 if (GET_CODE (pat) == PARALLEL)
4264 {
4265 for (j = 0; j < XVECLEN (pat, 0); j++)
4266 if (birthing_insn_p (XVECEXP (pat, 0, j)))
4267 return 1;
4268 }
4269 return 0;
4270}
4271
4272/* PREV is an insn that is ready to execute. Adjust its priority if that
4273 will help shorten register lifetimes. */
4274
cbb13457 4275HAIFA_INLINE static void
8c660648
JL
4276adjust_priority (prev)
4277 rtx prev;
4278{
4279 /* Trying to shorten register lives after reload has completed
4280 is useless and wrong. It gives inaccurate schedules. */
4281 if (reload_completed == 0)
4282 {
4283 rtx note;
4284 int n_deaths = 0;
4285
4286 /* ??? This code has no effect, because REG_DEAD notes are removed
4287 before we ever get here. */
4288 for (note = REG_NOTES (prev); note; note = XEXP (note, 1))
4289 if (REG_NOTE_KIND (note) == REG_DEAD)
4290 n_deaths += 1;
4291
4292 /* Defer scheduling insns which kill registers, since that
4293 shortens register lives. Prefer scheduling insns which
4294 make registers live for the same reason. */
4295 switch (n_deaths)
4296 {
4297 default:
4298 INSN_PRIORITY (prev) >>= 3;
4299 break;
4300 case 3:
4301 INSN_PRIORITY (prev) >>= 2;
4302 break;
4303 case 2:
4304 case 1:
4305 INSN_PRIORITY (prev) >>= 1;
4306 break;
4307 case 0:
4308 if (birthing_insn_p (PATTERN (prev)))
4309 {
4310 int max = max_priority;
4311
4312 if (max > INSN_PRIORITY (prev))
4313 INSN_PRIORITY (prev) = max;
4314 }
4315 break;
4316 }
4317#ifdef ADJUST_PRIORITY
4318 ADJUST_PRIORITY (prev);
4319#endif
4320 }
4321}
4322
4bdc8810
RH
4323/* Clock at which the previous instruction was issued. */
4324static int last_clock_var;
4325
8c660648
JL
4326/* INSN is the "currently executing insn". Launch each insn which was
4327 waiting on INSN. READY is a vector of insns which are ready to fire.
4328 N_READY is the number of elements in READY. CLOCK is the current
4329 cycle. */
4330
4331static int
4332schedule_insn (insn, ready, n_ready, clock)
4333 rtx insn;
4334 rtx *ready;
4335 int n_ready;
4336 int clock;
4337{
4338 rtx link;
4339 int unit;
4340
4341 unit = insn_unit (insn);
4342
4343 if (sched_verbose >= 2)
4344 {
4345 fprintf (dump, ";;\t\t--> scheduling insn <<<%d>>> on unit ", INSN_UID (insn));
4346 insn_print_units (insn);
4347 fprintf (dump, "\n");
4348 }
4349
4350 if (sched_verbose && unit == -1)
4351 visualize_no_unit (insn);
4352
4353 if (MAX_BLOCKAGE > 1 || issue_rate > 1 || sched_verbose)
4354 schedule_unit (unit, insn, clock);
4355
4356 if (INSN_DEPEND (insn) == 0)
4357 return n_ready;
4358
4359 /* This is used by the function adjust_priority above. */
4360 if (n_ready > 0)
4361 max_priority = MAX (INSN_PRIORITY (ready[0]), INSN_PRIORITY (insn));
4362 else
4363 max_priority = INSN_PRIORITY (insn);
4364
4365 for (link = INSN_DEPEND (insn); link != 0; link = XEXP (link, 1))
4366 {
4367 rtx next = XEXP (link, 0);
4368 int cost = insn_cost (insn, link, next);
4369
4370 INSN_TICK (next) = MAX (INSN_TICK (next), clock + cost);
4371
4372 if ((INSN_DEP_COUNT (next) -= 1) == 0)
4373 {
4374 int effective_cost = INSN_TICK (next) - clock;
4375
4376 /* For speculative insns, before inserting to ready/queue,
4377 check live, exception-free, and issue-delay */
4378 if (INSN_BB (next) != target_bb
4379 && (!IS_VALID (INSN_BB (next))
4380 || CANT_MOVE (next)
4381 || (IS_SPECULATIVE_INSN (next)
4382 && (insn_issue_delay (next) > 3
5835e573 4383 || !check_live (next, INSN_BB (next))
8c660648
JL
4384 || !is_exception_free (next, INSN_BB (next), target_bb)))))
4385 continue;
4386
4387 if (sched_verbose >= 2)
4388 {
4389 fprintf (dump, ";;\t\tdependences resolved: insn %d ", INSN_UID (next));
4390
4391 if (current_nr_blocks > 1 && INSN_BB (next) != target_bb)
4392 fprintf (dump, "/b%d ", INSN_BLOCK (next));
4393
4394 if (effective_cost <= 1)
4395 fprintf (dump, "into ready\n");
4396 else
4397 fprintf (dump, "into queue with cost=%d\n", effective_cost);
4398 }
4399
4400 /* Adjust the priority of NEXT and either put it on the ready
4401 list or queue it. */
4402 adjust_priority (next);
4403 if (effective_cost <= 1)
4404 ready[n_ready++] = next;
4405 else
4406 queue_insn (next, effective_cost);
4407 }
4408 }
4409
4bdc8810
RH
4410 /* Annotate the instruction with issue information -- TImode
4411 indicates that the instruction is expected not to be able
4412 to issue on the same cycle as the previous insn. A machine
4413 may use this information to decide how the instruction should
4414 be aligned. */
4415 if (reload_completed && issue_rate > 1)
4416 {
4417 PUT_MODE (insn, clock > last_clock_var ? TImode : VOIDmode);
4418 last_clock_var = clock;
4419 }
4420
8c660648
JL
4421 return n_ready;
4422}
4423
4424
4425/* Add a REG_DEAD note for REG to INSN, reusing a REG_DEAD note from the
4426 dead_notes list. */
4427
4428static void
4429create_reg_dead_note (reg, insn)
4430 rtx reg, insn;
4431{
4432 rtx link;
4433
4434 /* The number of registers killed after scheduling must be the same as the
4435 number of registers killed before scheduling. The number of REG_DEAD
4436 notes may not be conserved, i.e. two SImode hard register REG_DEAD notes
4437 might become one DImode hard register REG_DEAD note, but the number of
4438 registers killed will be conserved.
4439
4440 We carefully remove REG_DEAD notes from the dead_notes list, so that
4441 there will be none left at the end. If we run out early, then there
4442 is a bug somewhere in flow, combine and/or sched. */
4443
4444 if (dead_notes == 0)
4445 {
4446 if (current_nr_blocks <= 1)
4447 abort ();
4448 else
ebb7b10b 4449 link = alloc_EXPR_LIST (REG_DEAD, NULL_RTX, NULL_RTX);
8c660648
JL
4450 }
4451 else
4452 {
4453 /* Number of regs killed by REG. */
4454 int regs_killed = (REGNO (reg) >= FIRST_PSEUDO_REGISTER ? 1
4455 : HARD_REGNO_NREGS (REGNO (reg), GET_MODE (reg)));
4456 /* Number of regs killed by REG_DEAD notes taken off the list. */
4457 int reg_note_regs;
4458
4459 link = dead_notes;
4460 reg_note_regs = (REGNO (XEXP (link, 0)) >= FIRST_PSEUDO_REGISTER ? 1
4461 : HARD_REGNO_NREGS (REGNO (XEXP (link, 0)),
4462 GET_MODE (XEXP (link, 0))));
4463 while (reg_note_regs < regs_killed)
4464 {
4465 link = XEXP (link, 1);
04029ca2
JL
4466
4467 /* LINK might be zero if we killed more registers after scheduling
4468 than before, and the last hard register we kill is actually
4469 multiple hard regs.
4470
4471 This is normal for interblock scheduling, so deal with it in
4472 that case, else abort. */
4473 if (link == NULL_RTX && current_nr_blocks <= 1)
4474 abort ();
4475 else if (link == NULL_RTX)
ebb7b10b
RH
4476 link = alloc_EXPR_LIST (REG_DEAD, gen_rtx_REG (word_mode, 0),
4477 NULL_RTX);
04029ca2 4478
8c660648
JL
4479 reg_note_regs += (REGNO (XEXP (link, 0)) >= FIRST_PSEUDO_REGISTER ? 1
4480 : HARD_REGNO_NREGS (REGNO (XEXP (link, 0)),
4481 GET_MODE (XEXP (link, 0))));
4482 }
4483 dead_notes = XEXP (link, 1);
4484
4485 /* If we took too many regs kills off, put the extra ones back. */
4486 while (reg_note_regs > regs_killed)
4487 {
4488 rtx temp_reg, temp_link;
4489
38a448ca 4490 temp_reg = gen_rtx_REG (word_mode, 0);
ebb7b10b 4491 temp_link = alloc_EXPR_LIST (REG_DEAD, temp_reg, dead_notes);
8c660648
JL
4492 dead_notes = temp_link;
4493 reg_note_regs--;
4494 }
4495 }
4496
4497 XEXP (link, 0) = reg;
4498 XEXP (link, 1) = REG_NOTES (insn);
4499 REG_NOTES (insn) = link;
4500}
4501
4502/* Subroutine on attach_deaths_insn--handles the recursive search
4503 through INSN. If SET_P is true, then x is being modified by the insn. */
4504
4505static void
4506attach_deaths (x, insn, set_p)
4507 rtx x;
4508 rtx insn;
4509 int set_p;
4510{
4511 register int i;
4512 register int j;
4513 register enum rtx_code code;
4514 register char *fmt;
4515
4516 if (x == 0)
4517 return;
4518
4519 code = GET_CODE (x);
4520
4521 switch (code)
4522 {
4523 case CONST_INT:
4524 case CONST_DOUBLE:
4525 case LABEL_REF:
4526 case SYMBOL_REF:
4527 case CONST:
4528 case CODE_LABEL:
4529 case PC:
4530 case CC0:
4531 /* Get rid of the easy cases first. */
4532 return;
4533
4534 case REG:
4535 {
4536 /* If the register dies in this insn, queue that note, and mark
4537 this register as needing to die. */
4538 /* This code is very similar to mark_used_1 (if set_p is false)
4539 and mark_set_1 (if set_p is true) in flow.c. */
4540
4541 register int regno;
4542 int some_needed;
4543 int all_needed;
4544
4545 if (set_p)
4546 return;
4547
4548 regno = REGNO (x);
4549 all_needed = some_needed = REGNO_REG_SET_P (old_live_regs, regno);
4550 if (regno < FIRST_PSEUDO_REGISTER)
4551 {
4552 int n;
4553
4554 n = HARD_REGNO_NREGS (regno, GET_MODE (x));
4555 while (--n > 0)
4556 {
4557 int needed = (REGNO_REG_SET_P (old_live_regs, regno + n));
4558 some_needed |= needed;
4559 all_needed &= needed;
4560 }
4561 }
4562
4563 /* If it wasn't live before we started, then add a REG_DEAD note.
4564 We must check the previous lifetime info not the current info,
4565 because we may have to execute this code several times, e.g.
4566 once for a clobber (which doesn't add a note) and later
4567 for a use (which does add a note).
4568
4569 Always make the register live. We must do this even if it was
4570 live before, because this may be an insn which sets and uses
4571 the same register, in which case the register has already been
4572 killed, so we must make it live again.
4573
4574 Global registers are always live, and should never have a REG_DEAD
4575 note added for them, so none of the code below applies to them. */
4576
4577 if (regno >= FIRST_PSEUDO_REGISTER || ! global_regs[regno])
4578 {
4579 /* Never add REG_DEAD notes for the FRAME_POINTER_REGNUM or the
4580 STACK_POINTER_REGNUM, since these are always considered to be
4581 live. Similarly for ARG_POINTER_REGNUM if it is fixed. */
4582 if (regno != FRAME_POINTER_REGNUM
4583#if HARD_FRAME_POINTER_REGNUM != FRAME_POINTER_REGNUM
4584 && ! (regno == HARD_FRAME_POINTER_REGNUM)
4585#endif
4586#if ARG_POINTER_REGNUM != FRAME_POINTER_REGNUM
4587 && ! (regno == ARG_POINTER_REGNUM && fixed_regs[regno])
4588#endif
4589 && regno != STACK_POINTER_REGNUM)
4590 {
d6df9efb 4591 if (! all_needed && ! dead_or_set_p (insn, x))
8c660648
JL
4592 {
4593 /* Check for the case where the register dying partially
4594 overlaps the register set by this insn. */
4595 if (regno < FIRST_PSEUDO_REGISTER
4596 && HARD_REGNO_NREGS (regno, GET_MODE (x)) > 1)
4597 {
4598 int n = HARD_REGNO_NREGS (regno, GET_MODE (x));
4599 while (--n >= 0)
4600 some_needed |= dead_or_set_regno_p (insn, regno + n);
4601 }
4602
4603 /* If none of the words in X is needed, make a REG_DEAD
4604 note. Otherwise, we must make partial REG_DEAD
4605 notes. */
4606 if (! some_needed)
4607 create_reg_dead_note (x, insn);
4608 else
4609 {
4610 int i;
4611
4612 /* Don't make a REG_DEAD note for a part of a
4613 register that is set in the insn. */
4614 for (i = HARD_REGNO_NREGS (regno, GET_MODE (x)) - 1;
4615 i >= 0; i--)
4616 if (! REGNO_REG_SET_P (old_live_regs, regno+i)
4617 && ! dead_or_set_regno_p (insn, regno + i))
38a448ca
RH
4618 create_reg_dead_note (gen_rtx_REG (reg_raw_mode[regno + i],
4619 regno + i),
8c660648
JL
4620 insn);
4621 }
4622 }
4623 }
4624
4625 if (regno < FIRST_PSEUDO_REGISTER)
4626 {
4627 int j = HARD_REGNO_NREGS (regno, GET_MODE (x));
4628 while (--j >= 0)
4629 {
4630 SET_REGNO_REG_SET (bb_live_regs, regno + j);
4631 }
4632 }
4633 else
4634 {
4635 /* Recompute REG_BASIC_BLOCK as we update all the other
4636 dataflow information. */
4637 if (sched_reg_basic_block[regno] == REG_BLOCK_UNKNOWN)
4638 sched_reg_basic_block[regno] = current_block_num;
4639 else if (sched_reg_basic_block[regno] != current_block_num)
4640 sched_reg_basic_block[regno] = REG_BLOCK_GLOBAL;
4641
4642 SET_REGNO_REG_SET (bb_live_regs, regno);
4643 }
4644 }
4645 return;
4646 }
4647
4648 case MEM:
4649 /* Handle tail-recursive case. */
4650 attach_deaths (XEXP (x, 0), insn, 0);
4651 return;
4652
4653 case SUBREG:
d6df9efb
JL
4654 attach_deaths (SUBREG_REG (x), insn,
4655 set_p && ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (x)))
4656 <= UNITS_PER_WORD)
4657 || (GET_MODE_SIZE (GET_MODE (SUBREG_REG (x)))
4658 == GET_MODE_SIZE (GET_MODE ((x))))));
4659 return;
4660
8c660648 4661 case STRICT_LOW_PART:
d6df9efb 4662 attach_deaths (XEXP (x, 0), insn, 0);
8c660648
JL
4663 return;
4664
4665 case ZERO_EXTRACT:
4666 case SIGN_EXTRACT:
d6df9efb 4667 attach_deaths (XEXP (x, 0), insn, 0);
8c660648
JL
4668 attach_deaths (XEXP (x, 1), insn, 0);
4669 attach_deaths (XEXP (x, 2), insn, 0);
4670 return;
4671
c0222c21
DM
4672 case PARALLEL:
4673 if (set_p
4674 && GET_MODE (x) == BLKmode)
4675 {
4676 for (i = XVECLEN (x, 0) - 1; i >= 0; i--)
4677 attach_deaths (SET_DEST (XVECEXP (x, 0, i)), insn, 1);
4678 return;
4679 }
4680
4681 /* fallthrough */
8c660648
JL
4682 default:
4683 /* Other cases: walk the insn. */
4684 fmt = GET_RTX_FORMAT (code);
4685 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
4686 {
4687 if (fmt[i] == 'e')
4688 attach_deaths (XEXP (x, i), insn, 0);
4689 else if (fmt[i] == 'E')
4690 for (j = 0; j < XVECLEN (x, i); j++)
4691 attach_deaths (XVECEXP (x, i, j), insn, 0);
4692 }
4693 }
4694}
4695
4696/* After INSN has executed, add register death notes for each register
4697 that is dead after INSN. */
4698
4699static void
4700attach_deaths_insn (insn)
4701 rtx insn;
4702{
4703 rtx x = PATTERN (insn);
4704 register RTX_CODE code = GET_CODE (x);
4705 rtx link;
4706
4707 if (code == SET)
4708 {
4709 attach_deaths (SET_SRC (x), insn, 0);
4710
4711 /* A register might die here even if it is the destination, e.g.
4712 it is the target of a volatile read and is otherwise unused.
4713 Hence we must always call attach_deaths for the SET_DEST. */
4714 attach_deaths (SET_DEST (x), insn, 1);
4715 }
4716 else if (code == PARALLEL)
4717 {
4718 register int i;
4719 for (i = XVECLEN (x, 0) - 1; i >= 0; i--)
4720 {
4721 code = GET_CODE (XVECEXP (x, 0, i));
4722 if (code == SET)
4723 {
4724 attach_deaths (SET_SRC (XVECEXP (x, 0, i)), insn, 0);
4725
4726 attach_deaths (SET_DEST (XVECEXP (x, 0, i)), insn, 1);
4727 }
4728 /* Flow does not add REG_DEAD notes to registers that die in
4729 clobbers, so we can't either. */
4730 else if (code != CLOBBER)
4731 attach_deaths (XVECEXP (x, 0, i), insn, 0);
4732 }
4733 }
4734 /* If this is a CLOBBER, only add REG_DEAD notes to registers inside a
4735 MEM being clobbered, just like flow. */
4736 else if (code == CLOBBER && GET_CODE (XEXP (x, 0)) == MEM)
4737 attach_deaths (XEXP (XEXP (x, 0), 0), insn, 0);
4738 /* Otherwise don't add a death note to things being clobbered. */
4739 else if (code != CLOBBER)
4740 attach_deaths (x, insn, 0);
4741
4742 /* Make death notes for things used in the called function. */
4743 if (GET_CODE (insn) == CALL_INSN)
4744 for (link = CALL_INSN_FUNCTION_USAGE (insn); link; link = XEXP (link, 1))
4745 attach_deaths (XEXP (XEXP (link, 0), 0), insn,
4746 GET_CODE (XEXP (link, 0)) == CLOBBER);
4747}
4748
4749/* functions for handlnig of notes */
4750
4751/* Delete notes beginning with INSN and put them in the chain
4752 of notes ended by NOTE_LIST.
4753 Returns the insn following the notes. */
4754
4755static rtx
4756unlink_other_notes (insn, tail)
4757 rtx insn, tail;
4758{
4759 rtx prev = PREV_INSN (insn);
4760
4761 while (insn != tail && GET_CODE (insn) == NOTE)
4762 {
4763 rtx next = NEXT_INSN (insn);
4764 /* Delete the note from its current position. */
4765 if (prev)
4766 NEXT_INSN (prev) = next;
4767 if (next)
4768 PREV_INSN (next) = prev;
4769
4770 /* Don't save away NOTE_INSN_SETJMPs, because they must remain
4771 immediately after the call they follow. We use a fake
4772 (REG_DEAD (const_int -1)) note to remember them.
4773 Likewise with NOTE_INSN_{LOOP,EHREGION}_{BEG, END}. */
4774 if (NOTE_LINE_NUMBER (insn) != NOTE_INSN_SETJMP
4775 && NOTE_LINE_NUMBER (insn) != NOTE_INSN_LOOP_BEG
4776 && NOTE_LINE_NUMBER (insn) != NOTE_INSN_LOOP_END
0dfa1860
MM
4777 && NOTE_LINE_NUMBER (insn) != NOTE_INSN_RANGE_START
4778 && NOTE_LINE_NUMBER (insn) != NOTE_INSN_RANGE_END
8c660648
JL
4779 && NOTE_LINE_NUMBER (insn) != NOTE_INSN_EH_REGION_BEG
4780 && NOTE_LINE_NUMBER (insn) != NOTE_INSN_EH_REGION_END)
4781 {
4782 /* Insert the note at the end of the notes list. */
4783 PREV_INSN (insn) = note_list;
4784 if (note_list)
4785 NEXT_INSN (note_list) = insn;
4786 note_list = insn;
4787 }
4788
4789 insn = next;
4790 }
4791 return insn;
4792}
4793
4794/* Delete line notes beginning with INSN. Record line-number notes so
4795 they can be reused. Returns the insn following the notes. */
4796
4797static rtx
4798unlink_line_notes (insn, tail)
4799 rtx insn, tail;
4800{
4801 rtx prev = PREV_INSN (insn);
4802
4803 while (insn != tail && GET_CODE (insn) == NOTE)
4804 {
4805 rtx next = NEXT_INSN (insn);
4806
4807 if (write_symbols != NO_DEBUG && NOTE_LINE_NUMBER (insn) > 0)
4808 {
4809 /* Delete the note from its current position. */
4810 if (prev)
4811 NEXT_INSN (prev) = next;
4812 if (next)
4813 PREV_INSN (next) = prev;
4814
4815 /* Record line-number notes so they can be reused. */
4816 LINE_NOTE (insn) = insn;
4817 }
4818 else
4819 prev = insn;
4820
4821 insn = next;
4822 }
4823 return insn;
4824}
4825
4826/* Return the head and tail pointers of BB. */
4827
cbb13457 4828HAIFA_INLINE static void
8c660648
JL
4829get_block_head_tail (bb, headp, tailp)
4830 int bb;
4831 rtx *headp;
4832 rtx *tailp;
4833{
4834
55d89719
TK
4835 rtx head;
4836 rtx tail;
8c660648
JL
4837 int b;
4838
4839 b = BB_TO_BLOCK (bb);
4840
4841 /* HEAD and TAIL delimit the basic block being scheduled. */
4842 head = basic_block_head[b];
4843 tail = basic_block_end[b];
4844
4845 /* Don't include any notes or labels at the beginning of the
4846 basic block, or notes at the ends of basic blocks. */
4847 while (head != tail)
4848 {
4849 if (GET_CODE (head) == NOTE)
4850 head = NEXT_INSN (head);
4851 else if (GET_CODE (tail) == NOTE)
4852 tail = PREV_INSN (tail);
4853 else if (GET_CODE (head) == CODE_LABEL)
4854 head = NEXT_INSN (head);
4855 else
4856 break;
4857 }
4858
4859 *headp = head;
4860 *tailp = tail;
4861}
4862
4863/* Delete line notes from bb. Save them so they can be later restored
4864 (in restore_line_notes ()). */
4865
4866static void
4867rm_line_notes (bb)
4868 int bb;
4869{
4870 rtx next_tail;
4871 rtx tail;
4872 rtx head;
4873 rtx insn;
4874
4875 get_block_head_tail (bb, &head, &tail);
4876
4877 if (head == tail
4878 && (GET_RTX_CLASS (GET_CODE (head)) != 'i'))
4879 return;
4880
4881 next_tail = NEXT_INSN (tail);
4882 for (insn = head; insn != next_tail; insn = NEXT_INSN (insn))
4883 {
4884 rtx prev;
4885
4886 /* Farm out notes, and maybe save them in NOTE_LIST.
4887 This is needed to keep the debugger from
4888 getting completely deranged. */
4889 if (GET_CODE (insn) == NOTE)
4890 {
4891 prev = insn;
4892 insn = unlink_line_notes (insn, next_tail);
4893
4894 if (prev == tail)
4895 abort ();
4896 if (prev == head)
4897 abort ();
4898 if (insn == next_tail)
4899 abort ();
4900 }
4901 }
4902}
4903
4904/* Save line number notes for each insn in bb. */
4905
4906static void
4907save_line_notes (bb)
4908 int bb;
4909{
4910 rtx head, tail;
4911 rtx next_tail;
4912
4913 /* We must use the true line number for the first insn in the block
4914 that was computed and saved at the start of this pass. We can't
4915 use the current line number, because scheduling of the previous
4916 block may have changed the current line number. */
4917
4918 rtx line = line_note_head[BB_TO_BLOCK (bb)];
4919 rtx insn;
4920
4921 get_block_head_tail (bb, &head, &tail);
4922 next_tail = NEXT_INSN (tail);
4923
4924 for (insn = basic_block_head[BB_TO_BLOCK (bb)];
4925 insn != next_tail;
4926 insn = NEXT_INSN (insn))
4927 if (GET_CODE (insn) == NOTE && NOTE_LINE_NUMBER (insn) > 0)
4928 line = insn;
4929 else
4930 LINE_NOTE (insn) = line;
4931}
4932
4933
4934/* After bb was scheduled, insert line notes into the insns list. */
4935
4936static void
4937restore_line_notes (bb)
4938 int bb;
4939{
4940 rtx line, note, prev, new;
4941 int added_notes = 0;
4942 int b;
4943 rtx head, next_tail, insn;
4944
4945 b = BB_TO_BLOCK (bb);
4946
4947 head = basic_block_head[b];
4948 next_tail = NEXT_INSN (basic_block_end[b]);
4949
4950 /* Determine the current line-number. We want to know the current
4951 line number of the first insn of the block here, in case it is
4952 different from the true line number that was saved earlier. If
4953 different, then we need a line number note before the first insn
4954 of this block. If it happens to be the same, then we don't want to
4955 emit another line number note here. */
4956 for (line = head; line; line = PREV_INSN (line))
4957 if (GET_CODE (line) == NOTE && NOTE_LINE_NUMBER (line) > 0)
4958 break;
4959
4960 /* Walk the insns keeping track of the current line-number and inserting
4961 the line-number notes as needed. */
4962 for (insn = head; insn != next_tail; insn = NEXT_INSN (insn))
4963 if (GET_CODE (insn) == NOTE && NOTE_LINE_NUMBER (insn) > 0)
4964 line = insn;
4965 /* This used to emit line number notes before every non-deleted note.
4966 However, this confuses a debugger, because line notes not separated
4967 by real instructions all end up at the same address. I can find no
4968 use for line number notes before other notes, so none are emitted. */
4969 else if (GET_CODE (insn) != NOTE
4970 && (note = LINE_NOTE (insn)) != 0
4971 && note != line
4972 && (line == 0
4973 || NOTE_LINE_NUMBER (note) != NOTE_LINE_NUMBER (line)
4974 || NOTE_SOURCE_FILE (note) != NOTE_SOURCE_FILE (line)))
4975 {
4976 line = note;
4977 prev = PREV_INSN (insn);
4978 if (LINE_NOTE (note))
4979 {
4980 /* Re-use the original line-number note. */
4981 LINE_NOTE (note) = 0;
4982 PREV_INSN (note) = prev;
4983 NEXT_INSN (prev) = note;
4984 PREV_INSN (insn) = note;
4985 NEXT_INSN (note) = insn;
4986 }
4987 else
4988 {
4989 added_notes++;
4990 new = emit_note_after (NOTE_LINE_NUMBER (note), prev);
4991 NOTE_SOURCE_FILE (new) = NOTE_SOURCE_FILE (note);
4992 RTX_INTEGRATED_P (new) = RTX_INTEGRATED_P (note);
4993 }
4994 }
4995 if (sched_verbose && added_notes)
4996 fprintf (dump, ";; added %d line-number notes\n", added_notes);
4997}
4998
4999/* After scheduling the function, delete redundant line notes from the
5000 insns list. */
5001
5002static void
5003rm_redundant_line_notes ()
5004{
5005 rtx line = 0;
5006 rtx insn = get_insns ();
5007 int active_insn = 0;
5008 int notes = 0;
5009
5010 /* Walk the insns deleting redundant line-number notes. Many of these
5011 are already present. The remainder tend to occur at basic
5012 block boundaries. */
5013 for (insn = get_last_insn (); insn; insn = PREV_INSN (insn))
5014 if (GET_CODE (insn) == NOTE && NOTE_LINE_NUMBER (insn) > 0)
5015 {
5016 /* If there are no active insns following, INSN is redundant. */
5017 if (active_insn == 0)
5018 {
5019 notes++;
5020 NOTE_SOURCE_FILE (insn) = 0;
5021 NOTE_LINE_NUMBER (insn) = NOTE_INSN_DELETED;
5022 }
5023 /* If the line number is unchanged, LINE is redundant. */
5024 else if (line
5025 && NOTE_LINE_NUMBER (line) == NOTE_LINE_NUMBER (insn)
5026 && NOTE_SOURCE_FILE (line) == NOTE_SOURCE_FILE (insn))
5027 {
5028 notes++;
5029 NOTE_SOURCE_FILE (line) = 0;
5030 NOTE_LINE_NUMBER (line) = NOTE_INSN_DELETED;
5031 line = insn;
5032 }
5033 else
5034 line = insn;
5035 active_insn = 0;
5036 }
5037 else if (!((GET_CODE (insn) == NOTE
5038 && NOTE_LINE_NUMBER (insn) == NOTE_INSN_DELETED)
5039 || (GET_CODE (insn) == INSN
5040 && (GET_CODE (PATTERN (insn)) == USE
5041 || GET_CODE (PATTERN (insn)) == CLOBBER))))
5042 active_insn++;
5043
5044 if (sched_verbose && notes)
5045 fprintf (dump, ";; deleted %d line-number notes\n", notes);
5046}
5047
5048/* Delete notes between head and tail and put them in the chain
5049 of notes ended by NOTE_LIST. */
5050
5051static void
5052rm_other_notes (head, tail)
5053 rtx head;
5054 rtx tail;
5055{
5056 rtx next_tail;
5057 rtx insn;
5058
5059 if (head == tail
5060 && (GET_RTX_CLASS (GET_CODE (head)) != 'i'))
5061 return;
5062
5063 next_tail = NEXT_INSN (tail);
5064 for (insn = head; insn != next_tail; insn = NEXT_INSN (insn))
5065 {
5066 rtx prev;
5067
5068 /* Farm out notes, and maybe save them in NOTE_LIST.
5069 This is needed to keep the debugger from
5070 getting completely deranged. */
5071 if (GET_CODE (insn) == NOTE)
5072 {
5073 prev = insn;
5074
5075 insn = unlink_other_notes (insn, next_tail);
5076
5077 if (prev == tail)
5078 abort ();
5079 if (prev == head)
5080 abort ();
5081 if (insn == next_tail)
5082 abort ();
5083 }
5084 }
5085}
5086
5087/* Constructor for `sometimes' data structure. */
5088
5089static int
5090new_sometimes_live (regs_sometimes_live, regno, sometimes_max)
5091 struct sometimes *regs_sometimes_live;
5092 int regno;
5093 int sometimes_max;
5094{
5095 register struct sometimes *p;
5096
5097 /* There should never be a register greater than max_regno here. If there
5098 is, it means that a define_split has created a new pseudo reg. This
5099 is not allowed, since there will not be flow info available for any
5100 new register, so catch the error here. */
5101 if (regno >= max_regno)
5102 abort ();
5103
5104 p = &regs_sometimes_live[sometimes_max];
5105 p->regno = regno;
5106 p->live_length = 0;
5107 p->calls_crossed = 0;
5108 sometimes_max++;
5109 return sometimes_max;
5110}
5111
5112/* Count lengths of all regs we are currently tracking,
5113 and find new registers no longer live. */
5114
5115static void
5116finish_sometimes_live (regs_sometimes_live, sometimes_max)
5117 struct sometimes *regs_sometimes_live;
5118 int sometimes_max;
5119{
5120 int i;
5121
5122 for (i = 0; i < sometimes_max; i++)
5123 {
5124 register struct sometimes *p = &regs_sometimes_live[i];
5125 int regno = p->regno;
5126
5127 sched_reg_live_length[regno] += p->live_length;
5128 sched_reg_n_calls_crossed[regno] += p->calls_crossed;
5129 }
5130}
5131
5132/* functions for computation of registers live/usage info */
5133
5134/* It is assumed that prior to scheduling basic_block_live_at_start (b)
5135 contains the registers that are alive at the entry to b.
5136
5137 Two passes follow: The first pass is performed before the scheduling
5138 of a region. It scans each block of the region forward, computing
5139 the set of registers alive at the end of the basic block and
5140 discard REG_DEAD notes (done by find_pre_sched_live ()).
5141
5142 The second path is invoked after scheduling all region blocks.
5143 It scans each block of the region backward, a block being traversed
5144 only after its succesors in the region. When the set of registers
5145 live at the end of a basic block may be changed by the scheduling
5146 (this may happen for multiple blocks region), it is computed as
5147 the union of the registers live at the start of its succesors.
5148 The last-use information is updated by inserting REG_DEAD notes.
5149 (done by find_post_sched_live ()) */
5150
5151/* Scan all the insns to be scheduled, removing register death notes.
5152 Register death notes end up in DEAD_NOTES.
5153 Recreate the register life information for the end of this basic
5154 block. */
5155
5156static void
5157find_pre_sched_live (bb)
5158 int bb;
5159{
5160 rtx insn, next_tail, head, tail;
5161 int b = BB_TO_BLOCK (bb);
5162
5163 get_block_head_tail (bb, &head, &tail);
5164 COPY_REG_SET (bb_live_regs, basic_block_live_at_start[b]);
5165 next_tail = NEXT_INSN (tail);
5166
5167 for (insn = head; insn != next_tail; insn = NEXT_INSN (insn))
5168 {
5169 rtx prev, next, link;
5170 int reg_weight = 0;
5171
5172 /* Handle register life information. */
5173 if (GET_RTX_CLASS (GET_CODE (insn)) == 'i')
5174 {
5175 /* See if the register gets born here. */
5176 /* We must check for registers being born before we check for
5177 registers dying. It is possible for a register to be born and
5178 die in the same insn, e.g. reading from a volatile memory
5179 location into an otherwise unused register. Such a register
5180 must be marked as dead after this insn. */
5181 if (GET_CODE (PATTERN (insn)) == SET
5182 || GET_CODE (PATTERN (insn)) == CLOBBER)
5183 {
5835e573 5184 sched_note_set (PATTERN (insn), 0);
8c660648
JL
5185 reg_weight++;
5186 }
5187
5188 else if (GET_CODE (PATTERN (insn)) == PARALLEL)
5189 {
5190 int j;
5191 for (j = XVECLEN (PATTERN (insn), 0) - 1; j >= 0; j--)
5192 if (GET_CODE (XVECEXP (PATTERN (insn), 0, j)) == SET
5193 || GET_CODE (XVECEXP (PATTERN (insn), 0, j)) == CLOBBER)
5194 {
5835e573 5195 sched_note_set (XVECEXP (PATTERN (insn), 0, j), 0);
8c660648
JL
5196 reg_weight++;
5197 }
5198
5199 /* ??? This code is obsolete and should be deleted. It
5200 is harmless though, so we will leave it in for now. */
5201 for (j = XVECLEN (PATTERN (insn), 0) - 1; j >= 0; j--)
5202 if (GET_CODE (XVECEXP (PATTERN (insn), 0, j)) == USE)
5835e573 5203 sched_note_set (XVECEXP (PATTERN (insn), 0, j), 0);
8c660648
JL
5204 }
5205
5206 /* Each call cobbers (makes live) all call-clobbered regs
5207 that are not global or fixed. Note that the function-value
5208 reg is a call_clobbered reg. */
5209 if (GET_CODE (insn) == CALL_INSN)
5210 {
5211 int j;
5212 for (j = 0; j < FIRST_PSEUDO_REGISTER; j++)
5213 if (call_used_regs[j] && !global_regs[j]
5214 && ! fixed_regs[j])
5215 {
5216 SET_REGNO_REG_SET (bb_live_regs, j);
8c660648
JL
5217 }
5218 }
5219
5220 /* Need to know what registers this insn kills. */
5221 for (prev = 0, link = REG_NOTES (insn); link; link = next)
5222 {
5223 next = XEXP (link, 1);
5224 if ((REG_NOTE_KIND (link) == REG_DEAD
5225 || REG_NOTE_KIND (link) == REG_UNUSED)
5226 /* Verify that the REG_NOTE has a valid value. */
5227 && GET_CODE (XEXP (link, 0)) == REG)
5228 {
5229 register int regno = REGNO (XEXP (link, 0));
5230
5231 reg_weight--;
5232
5233 /* Only unlink REG_DEAD notes; leave REG_UNUSED notes
5234 alone. */
5235 if (REG_NOTE_KIND (link) == REG_DEAD)
5236 {
5237 if (prev)
5238 XEXP (prev, 1) = next;
5239 else
5240 REG_NOTES (insn) = next;
5241 XEXP (link, 1) = dead_notes;
5242 dead_notes = link;
5243 }
5244 else
5245 prev = link;
5246
5247 if (regno < FIRST_PSEUDO_REGISTER)
5248 {
5249 int j = HARD_REGNO_NREGS (regno,
5250 GET_MODE (XEXP (link, 0)));
5251 while (--j >= 0)
5252 {
5253 CLEAR_REGNO_REG_SET (bb_live_regs, regno+j);
5254 }
5255 }
5256 else
5257 {
5258 CLEAR_REGNO_REG_SET (bb_live_regs, regno);
5259 }
5260 }
5261 else
5262 prev = link;
5263 }
5264 }
5265
5266 INSN_REG_WEIGHT (insn) = reg_weight;
5267 }
5268}
5269
5270/* Update register life and usage information for block bb
5271 after scheduling. Put register dead notes back in the code. */
5272
5273static void
5274find_post_sched_live (bb)
5275 int bb;
5276{
5277 int sometimes_max;
5278 int j, i;
5279 int b;
5280 rtx insn;
5281 rtx head, tail, prev_head, next_tail;
5282
5283 register struct sometimes *regs_sometimes_live;
5284
5285 b = BB_TO_BLOCK (bb);
5286
5287 /* compute live regs at the end of bb as a function of its successors. */
5288 if (current_nr_blocks > 1)
5289 {
5290 int e;
5291 int first_edge;
5292
5293 first_edge = e = OUT_EDGES (b);
5294 CLEAR_REG_SET (bb_live_regs);
5295
5296 if (e)
5297 do
5298 {
5299 int b_succ;
5300
5301 b_succ = TO_BLOCK (e);
5302 IOR_REG_SET (bb_live_regs, basic_block_live_at_start[b_succ]);
5303 e = NEXT_OUT (e);
5304 }
5305 while (e != first_edge);
5306 }
5307
5308 get_block_head_tail (bb, &head, &tail);
5309 next_tail = NEXT_INSN (tail);
5310 prev_head = PREV_INSN (head);
5311
7eea6443
JL
5312 EXECUTE_IF_SET_IN_REG_SET (bb_live_regs, FIRST_PSEUDO_REGISTER, i,
5313 {
5314 sched_reg_basic_block[i] = REG_BLOCK_GLOBAL;
5315 });
8c660648
JL
5316
5317 /* if the block is empty, same regs are alive at its end and its start.
5318 since this is not guaranteed after interblock scheduling, make sure they
5319 are truly identical. */
5320 if (NEXT_INSN (prev_head) == tail
5321 && (GET_RTX_CLASS (GET_CODE (tail)) != 'i'))
5322 {
5323 if (current_nr_blocks > 1)
5324 COPY_REG_SET (basic_block_live_at_start[b], bb_live_regs);
5325
5326 return;
5327 }
5328
5329 b = BB_TO_BLOCK (bb);
5330 current_block_num = b;
5331
5332 /* Keep track of register lives. */
5333 old_live_regs = ALLOCA_REG_SET ();
5334 regs_sometimes_live
5335 = (struct sometimes *) alloca (max_regno * sizeof (struct sometimes));
5336 sometimes_max = 0;
5337
5338 /* initiate "sometimes" data, starting with registers live at end */
5339 sometimes_max = 0;
5340 COPY_REG_SET (old_live_regs, bb_live_regs);
5341 EXECUTE_IF_SET_IN_REG_SET (bb_live_regs, 0, j,
5342 {
5343 sometimes_max
5344 = new_sometimes_live (regs_sometimes_live,
5345 j, sometimes_max);
5346 });
5347
5348 /* scan insns back, computing regs live info */
5349 for (insn = tail; insn != prev_head; insn = PREV_INSN (insn))
5350 {
5351 /* First we kill registers set by this insn, and then we
5352 make registers used by this insn live. This is the opposite
5353 order used above because we are traversing the instructions
5354 backwards. */
5355
5356 /* Strictly speaking, we should scan REG_UNUSED notes and make
5357 every register mentioned there live, however, we will just
5358 kill them again immediately below, so there doesn't seem to
5359 be any reason why we bother to do this. */
5360
5361 /* See if this is the last notice we must take of a register. */
5362 if (GET_RTX_CLASS (GET_CODE (insn)) != 'i')
5363 continue;
5364
5365 if (GET_CODE (PATTERN (insn)) == SET
5366 || GET_CODE (PATTERN (insn)) == CLOBBER)
5835e573 5367 sched_note_set (PATTERN (insn), 1);
8c660648
JL
5368 else if (GET_CODE (PATTERN (insn)) == PARALLEL)
5369 {
5370 for (j = XVECLEN (PATTERN (insn), 0) - 1; j >= 0; j--)
5371 if (GET_CODE (XVECEXP (PATTERN (insn), 0, j)) == SET
5372 || GET_CODE (XVECEXP (PATTERN (insn), 0, j)) == CLOBBER)
5835e573 5373 sched_note_set (XVECEXP (PATTERN (insn), 0, j), 1);
8c660648
JL
5374 }
5375
5376 /* This code keeps life analysis information up to date. */
5377 if (GET_CODE (insn) == CALL_INSN)
5378 {
5379 register struct sometimes *p;
5380
5381 /* A call kills all call used registers that are not
5382 global or fixed, except for those mentioned in the call
5383 pattern which will be made live again later. */
5384 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
5385 if (call_used_regs[i] && ! global_regs[i]
5386 && ! fixed_regs[i])
5387 {
5388 CLEAR_REGNO_REG_SET (bb_live_regs, i);
8c660648
JL
5389 }
5390
5391 /* Regs live at the time of a call instruction must not
5392 go in a register clobbered by calls. Record this for
5393 all regs now live. Note that insns which are born or
5394 die in a call do not cross a call, so this must be done
5395 after the killings (above) and before the births
5396 (below). */
5397 p = regs_sometimes_live;
5398 for (i = 0; i < sometimes_max; i++, p++)
5399 if (REGNO_REG_SET_P (bb_live_regs, p->regno))
5400 p->calls_crossed += 1;
5401 }
5402
5403 /* Make every register used live, and add REG_DEAD notes for
5404 registers which were not live before we started. */
5405 attach_deaths_insn (insn);
5406
5407 /* Find registers now made live by that instruction. */
5408 EXECUTE_IF_AND_COMPL_IN_REG_SET (bb_live_regs, old_live_regs, 0, j,
5409 {
5410 sometimes_max
5411 = new_sometimes_live (regs_sometimes_live,
5412 j, sometimes_max);
5413 });
5414 IOR_REG_SET (old_live_regs, bb_live_regs);
5415
5416 /* Count lengths of all regs we are worrying about now,
5417 and handle registers no longer live. */
5418
5419 for (i = 0; i < sometimes_max; i++)
5420 {
5421 register struct sometimes *p = &regs_sometimes_live[i];
5422 int regno = p->regno;
5423
5424 p->live_length += 1;
5425
5426 if (!REGNO_REG_SET_P (bb_live_regs, regno))
5427 {
5428 /* This is the end of one of this register's lifetime
5429 segments. Save the lifetime info collected so far,
5430 and clear its bit in the old_live_regs entry. */
5431 sched_reg_live_length[regno] += p->live_length;
5432 sched_reg_n_calls_crossed[regno] += p->calls_crossed;
5433 CLEAR_REGNO_REG_SET (old_live_regs, p->regno);
5434
5435 /* Delete the reg_sometimes_live entry for this reg by
5436 copying the last entry over top of it. */
5437 *p = regs_sometimes_live[--sometimes_max];
5438 /* ...and decrement i so that this newly copied entry
5439 will be processed. */
5440 i--;
5441 }
5442 }
5443 }
5444
5445 finish_sometimes_live (regs_sometimes_live, sometimes_max);
5446
5447 /* In interblock scheduling, basic_block_live_at_start may have changed. */
5448 if (current_nr_blocks > 1)
5449 COPY_REG_SET (basic_block_live_at_start[b], bb_live_regs);
5450
f187056f
JL
5451
5452 FREE_REG_SET (old_live_regs);
8c660648
JL
5453} /* find_post_sched_live */
5454
5455/* After scheduling the subroutine, restore information about uses of
5456 registers. */
5457
5458static void
5459update_reg_usage ()
5460{
5461 int regno;
5462
5463 if (n_basic_blocks > 0)
7eea6443
JL
5464 EXECUTE_IF_SET_IN_REG_SET (bb_live_regs, FIRST_PSEUDO_REGISTER, regno,
5465 {
5466 sched_reg_basic_block[regno]
5467 = REG_BLOCK_GLOBAL;
5468 });
8c660648
JL
5469
5470 for (regno = 0; regno < max_regno; regno++)
5471 if (sched_reg_live_length[regno])
5472 {
5473 if (sched_verbose)
5474 {
5475 if (REG_LIVE_LENGTH (regno) > sched_reg_live_length[regno])
5476 fprintf (dump,
5477 ";; register %d life shortened from %d to %d\n",
5478 regno, REG_LIVE_LENGTH (regno),
5479 sched_reg_live_length[regno]);
5480 /* Negative values are special; don't overwrite the current
5481 reg_live_length value if it is negative. */
5482 else if (REG_LIVE_LENGTH (regno) < sched_reg_live_length[regno]
5483 && REG_LIVE_LENGTH (regno) >= 0)
5484 fprintf (dump,
5485 ";; register %d life extended from %d to %d\n",
5486 regno, REG_LIVE_LENGTH (regno),
5487 sched_reg_live_length[regno]);
5488
5489 if (!REG_N_CALLS_CROSSED (regno)
5490 && sched_reg_n_calls_crossed[regno])
5491 fprintf (dump,
5492 ";; register %d now crosses calls\n", regno);
5493 else if (REG_N_CALLS_CROSSED (regno)
5494 && !sched_reg_n_calls_crossed[regno]
5495 && REG_BASIC_BLOCK (regno) != REG_BLOCK_GLOBAL)
5496 fprintf (dump,
5497 ";; register %d no longer crosses calls\n", regno);
5498
5499 if (REG_BASIC_BLOCK (regno) != sched_reg_basic_block[regno]
5500 && sched_reg_basic_block[regno] != REG_BLOCK_UNKNOWN
5501 && REG_BASIC_BLOCK(regno) != REG_BLOCK_UNKNOWN)
5502 fprintf (dump,
5503 ";; register %d changed basic block from %d to %d\n",
5504 regno, REG_BASIC_BLOCK(regno),
5505 sched_reg_basic_block[regno]);
5506
5507 }
5508 /* Negative values are special; don't overwrite the current
5509 reg_live_length value if it is negative. */
5510 if (REG_LIVE_LENGTH (regno) >= 0)
5511 REG_LIVE_LENGTH (regno) = sched_reg_live_length[regno];
5512
5513 if (sched_reg_basic_block[regno] != REG_BLOCK_UNKNOWN
5514 && REG_BASIC_BLOCK(regno) != REG_BLOCK_UNKNOWN)
5515 REG_BASIC_BLOCK(regno) = sched_reg_basic_block[regno];
5516
5517 /* We can't change the value of reg_n_calls_crossed to zero for
5518 pseudos which are live in more than one block.
5519
5520 This is because combine might have made an optimization which
5521 invalidated basic_block_live_at_start and reg_n_calls_crossed,
5522 but it does not update them. If we update reg_n_calls_crossed
5523 here, the two variables are now inconsistent, and this might
5524 confuse the caller-save code into saving a register that doesn't
5525 need to be saved. This is only a problem when we zero calls
5526 crossed for a pseudo live in multiple basic blocks.
5527
5528 Alternatively, we could try to correctly update basic block live
5529 at start here in sched, but that seems complicated.
5530
5531 Note: it is possible that a global register became local, as result
5532 of interblock motion, but will remain marked as a global register. */
5533 if (sched_reg_n_calls_crossed[regno]
5534 || REG_BASIC_BLOCK (regno) != REG_BLOCK_GLOBAL)
5535 REG_N_CALLS_CROSSED (regno) = sched_reg_n_calls_crossed[regno];
5536
5537 }
5538}
5539
5540/* Scheduling clock, modified in schedule_block() and queue_to_ready () */
5541static int clock_var;
5542
5543/* Move insns that became ready to fire from queue to ready list. */
5544
5545static int
5546queue_to_ready (ready, n_ready)
5547 rtx ready[];
5548 int n_ready;
5549{
5550 rtx insn;
5551 rtx link;
5552
5553 q_ptr = NEXT_Q (q_ptr);
5554
5555 /* Add all pending insns that can be scheduled without stalls to the
5556 ready list. */
5557 for (link = insn_queue[q_ptr]; link; link = XEXP (link, 1))
5558 {
5559
5560 insn = XEXP (link, 0);
5561 q_size -= 1;
5562
5563 if (sched_verbose >= 2)
5564 fprintf (dump, ";;\t\tQ-->Ready: insn %d: ", INSN_UID (insn));
5565
5566 if (sched_verbose >= 2 && INSN_BB (insn) != target_bb)
5567 fprintf (dump, "(b%d) ", INSN_BLOCK (insn));
5568
5569 ready[n_ready++] = insn;
5570 if (sched_verbose >= 2)
5571 fprintf (dump, "moving to ready without stalls\n");
5572 }
5573 insn_queue[q_ptr] = 0;
5574
5575 /* If there are no ready insns, stall until one is ready and add all
5576 of the pending insns at that point to the ready list. */
5577 if (n_ready == 0)
5578 {
5579 register int stalls;
5580
5581 for (stalls = 1; stalls < INSN_QUEUE_SIZE; stalls++)
5582 {
5583 if ((link = insn_queue[NEXT_Q_AFTER (q_ptr, stalls)]))
5584 {
5585 for (; link; link = XEXP (link, 1))
5586 {
5587 insn = XEXP (link, 0);
5588 q_size -= 1;
5589
5590 if (sched_verbose >= 2)
5591 fprintf (dump, ";;\t\tQ-->Ready: insn %d: ", INSN_UID (insn));
5592
5593 if (sched_verbose >= 2 && INSN_BB (insn) != target_bb)
5594 fprintf (dump, "(b%d) ", INSN_BLOCK (insn));
5595
5596 ready[n_ready++] = insn;
5597 if (sched_verbose >= 2)
5598 fprintf (dump, "moving to ready with %d stalls\n", stalls);
5599 }
5600 insn_queue[NEXT_Q_AFTER (q_ptr, stalls)] = 0;
5601
5602 if (n_ready)
5603 break;
5604 }
5605 }
5606
5607 if (sched_verbose && stalls)
5608 visualize_stall_cycles (BB_TO_BLOCK (target_bb), stalls);
5609 q_ptr = NEXT_Q_AFTER (q_ptr, stalls);
5610 clock_var += stalls;
5611 }
5612 return n_ready;
5613}
5614
5615/* Print the ready list for debugging purposes. Callable from debugger. */
5616
9a8b0889 5617static void
8c660648
JL
5618debug_ready_list (ready, n_ready)
5619 rtx ready[];
5620 int n_ready;
5621{
5622 int i;
5623
5624 for (i = 0; i < n_ready; i++)
5625 {
5626 fprintf (dump, " %d", INSN_UID (ready[i]));
5627 if (current_nr_blocks > 1 && INSN_BB (ready[i]) != target_bb)
5628 fprintf (dump, "/b%d", INSN_BLOCK (ready[i]));
5629 }
5630 fprintf (dump, "\n");
5631}
5632
5633/* Print names of units on which insn can/should execute, for debugging. */
5634
5635static void
5636insn_print_units (insn)
5637 rtx insn;
5638{
5639 int i;
5640 int unit = insn_unit (insn);
5641
5642 if (unit == -1)
5643 fprintf (dump, "none");
5644 else if (unit >= 0)
5645 fprintf (dump, "%s", function_units[unit].name);
5646 else
5647 {
5648 fprintf (dump, "[");
5649 for (i = 0, unit = ~unit; unit; i++, unit >>= 1)
5650 if (unit & 1)
5651 {
5652 fprintf (dump, "%s", function_units[i].name);
5653 if (unit != 1)
5654 fprintf (dump, " ");
5655 }
5656 fprintf (dump, "]");
5657 }
5658}
5659
5660/* MAX_VISUAL_LINES is the maximum number of lines in visualization table
5661 of a basic block. If more lines are needed, table is splitted to two.
5662 n_visual_lines is the number of lines printed so far for a block.
5663 visual_tbl contains the block visualization info.
5664 vis_no_unit holds insns in a cycle that are not mapped to any unit. */
5665#define MAX_VISUAL_LINES 100
5666#define INSN_LEN 30
5667int n_visual_lines;
5668char *visual_tbl;
5669int n_vis_no_unit;
5670rtx vis_no_unit[10];
5671
5672/* Finds units that are in use in this fuction. Required only
5673 for visualization. */
5674
5675static void
5676init_target_units ()
5677{
5678 rtx insn;
5679 int unit;
5680
5681 for (insn = get_last_insn (); insn; insn = PREV_INSN (insn))
5682 {
5683 if (GET_RTX_CLASS (GET_CODE (insn)) != 'i')
5684 continue;
5685
5686 unit = insn_unit (insn);
5687
5688 if (unit < 0)
5689 target_units |= ~unit;
5690 else
5691 target_units |= (1 << unit);
5692 }
5693}
5694
5695/* Return the length of the visualization table */
5696
5697static int
5698get_visual_tbl_length ()
5699{
5700 int unit, i;
5701 int n, n1;
5702 char *s;
5703
5704 /* compute length of one field in line */
5705 s = (char *) alloca (INSN_LEN + 5);
5706 sprintf (s, " %33s", "uname");
5707 n1 = strlen (s);
5708
5709 /* compute length of one line */
5710 n = strlen (";; ");
5711 n += n1;
5712 for (unit = 0; unit < FUNCTION_UNITS_SIZE; unit++)
5713 if (function_units[unit].bitmask & target_units)
5714 for (i = 0; i < function_units[unit].multiplicity; i++)
5715 n += n1;
5716 n += n1;
5717 n += strlen ("\n") + 2;
5718
5719 /* compute length of visualization string */
5720 return (MAX_VISUAL_LINES * n);
5721}
5722
5723/* Init block visualization debugging info */
5724
5725static void
5726init_block_visualization ()
5727{
5728 strcpy (visual_tbl, "");
5729 n_visual_lines = 0;
5730 n_vis_no_unit = 0;
5731}
5732
5733#define BUF_LEN 256
5734
459b3825
MM
5735static char *
5736safe_concat (buf, cur, str)
5737 char *buf;
5738 char *cur;
5739 char *str;
5740{
5741 char *end = buf + BUF_LEN - 2; /* leave room for null */
5742 int c;
5743
5744 if (cur > end)
5745 {
5746 *end = '\0';
5747 return end;
5748 }
5749
5750 while (cur < end && (c = *str++) != '\0')
5751 *cur++ = c;
5752
5753 *cur = '\0';
5754 return cur;
5755}
5756
8c660648
JL
5757/* This recognizes rtx, I classified as expressions. These are always */
5758/* represent some action on values or results of other expression, */
5759/* that may be stored in objects representing values. */
5760
5761static void
5762print_exp (buf, x, verbose)
5763 char *buf;
5764 rtx x;
5765 int verbose;
5766{
459b3825
MM
5767 char tmp[BUF_LEN];
5768 char *st[4];
5769 char *cur = buf;
5770 char *fun = (char *)0;
5771 char *sep;
5772 rtx op[4];
5773 int i;
5774
5775 for (i = 0; i < 4; i++)
5776 {
5777 st[i] = (char *)0;
5778 op[i] = NULL_RTX;
5779 }
8c660648
JL
5780
5781 switch (GET_CODE (x))
5782 {
5783 case PLUS:
459b3825
MM
5784 op[0] = XEXP (x, 0);
5785 st[1] = "+";
5786 op[1] = XEXP (x, 1);
8c660648
JL
5787 break;
5788 case LO_SUM:
459b3825
MM
5789 op[0] = XEXP (x, 0);
5790 st[1] = "+low(";
5791 op[1] = XEXP (x, 1);
5792 st[2] = ")";
8c660648
JL
5793 break;
5794 case MINUS:
459b3825
MM
5795 op[0] = XEXP (x, 0);
5796 st[1] = "-";
5797 op[1] = XEXP (x, 1);
8c660648
JL
5798 break;
5799 case COMPARE:
459b3825
MM
5800 fun = "cmp";
5801 op[0] = XEXP (x, 0);
5802 op[1] = XEXP (x, 1);
8c660648
JL
5803 break;
5804 case NEG:
459b3825
MM
5805 st[0] = "-";
5806 op[0] = XEXP (x, 0);
8c660648
JL
5807 break;
5808 case MULT:
459b3825
MM
5809 op[0] = XEXP (x, 0);
5810 st[1] = "*";
5811 op[1] = XEXP (x, 1);
8c660648
JL
5812 break;
5813 case DIV:
459b3825
MM
5814 op[0] = XEXP (x, 0);
5815 st[1] = "/";
5816 op[1] = XEXP (x, 1);
8c660648
JL
5817 break;
5818 case UDIV:
459b3825
MM
5819 fun = "udiv";
5820 op[0] = XEXP (x, 0);
5821 op[1] = XEXP (x, 1);
8c660648
JL
5822 break;
5823 case MOD:
459b3825
MM
5824 op[0] = XEXP (x, 0);
5825 st[1] = "%";
5826 op[1] = XEXP (x, 1);
8c660648
JL
5827 break;
5828 case UMOD:
459b3825
MM
5829 fun = "umod";
5830 op[0] = XEXP (x, 0);
5831 op[1] = XEXP (x, 1);
8c660648
JL
5832 break;
5833 case SMIN:
459b3825
MM
5834 fun = "smin";
5835 op[0] = XEXP (x, 0);
5836 op[1] = XEXP (x, 1);
8c660648
JL
5837 break;
5838 case SMAX:
459b3825
MM
5839 fun = "smax";
5840 op[0] = XEXP (x, 0);
5841 op[1] = XEXP (x, 1);
8c660648
JL
5842 break;
5843 case UMIN:
459b3825
MM
5844 fun = "umin";
5845 op[0] = XEXP (x, 0);
5846 op[1] = XEXP (x, 1);
8c660648
JL
5847 break;
5848 case UMAX:
459b3825
MM
5849 fun = "umax";
5850 op[0] = XEXP (x, 0);
5851 op[1] = XEXP (x, 1);
8c660648
JL
5852 break;
5853 case NOT:
459b3825
MM
5854 st[0] = "!";
5855 op[0] = XEXP (x, 0);
8c660648
JL
5856 break;
5857 case AND:
459b3825
MM
5858 op[0] = XEXP (x, 0);
5859 st[1] = "&";
5860 op[1] = XEXP (x, 1);
8c660648
JL
5861 break;
5862 case IOR:
459b3825
MM
5863 op[0] = XEXP (x, 0);
5864 st[1] = "|";
5865 op[1] = XEXP (x, 1);
8c660648
JL
5866 break;
5867 case XOR:
459b3825
MM
5868 op[0] = XEXP (x, 0);
5869 st[1] = "^";
5870 op[1] = XEXP (x, 1);
8c660648
JL
5871 break;
5872 case ASHIFT:
459b3825
MM
5873 op[0] = XEXP (x, 0);
5874 st[1] = "<<";
5875 op[1] = XEXP (x, 1);
8c660648
JL
5876 break;
5877 case LSHIFTRT:
459b3825
MM
5878 op[0] = XEXP (x, 0);
5879 st[1] = " 0>>";
5880 op[1] = XEXP (x, 1);
8c660648
JL
5881 break;
5882 case ASHIFTRT:
459b3825
MM
5883 op[0] = XEXP (x, 0);
5884 st[1] = ">>";
5885 op[1] = XEXP (x, 1);
8c660648
JL
5886 break;
5887 case ROTATE:
459b3825
MM
5888 op[0] = XEXP (x, 0);
5889 st[1] = "<-<";
5890 op[1] = XEXP (x, 1);
8c660648
JL
5891 break;
5892 case ROTATERT:
459b3825
MM
5893 op[0] = XEXP (x, 0);
5894 st[1] = ">->";
5895 op[1] = XEXP (x, 1);
8c660648
JL
5896 break;
5897 case ABS:
459b3825
MM
5898 fun = "abs";
5899 op[0] = XEXP (x, 0);
8c660648
JL
5900 break;
5901 case SQRT:
459b3825
MM
5902 fun = "sqrt";
5903 op[0] = XEXP (x, 0);
8c660648
JL
5904 break;
5905 case FFS:
459b3825
MM
5906 fun = "ffs";
5907 op[0] = XEXP (x, 0);
8c660648
JL
5908 break;
5909 case EQ:
459b3825
MM
5910 op[0] = XEXP (x, 0);
5911 st[1] = "==";
5912 op[1] = XEXP (x, 1);
8c660648
JL
5913 break;
5914 case NE:
459b3825
MM
5915 op[0] = XEXP (x, 0);
5916 st[1] = "!=";
5917 op[1] = XEXP (x, 1);
8c660648
JL
5918 break;
5919 case GT:
459b3825
MM
5920 op[0] = XEXP (x, 0);
5921 st[1] = ">";
5922 op[1] = XEXP (x, 1);
8c660648
JL
5923 break;
5924 case GTU:
459b3825
MM
5925 fun = "gtu";
5926 op[0] = XEXP (x, 0);
5927 op[1] = XEXP (x, 1);
8c660648
JL
5928 break;
5929 case LT:
459b3825
MM
5930 op[0] = XEXP (x, 0);
5931 st[1] = "<";
5932 op[1] = XEXP (x, 1);
8c660648
JL
5933 break;
5934 case LTU:
459b3825
MM
5935 fun = "ltu";
5936 op[0] = XEXP (x, 0);
5937 op[1] = XEXP (x, 1);
8c660648
JL
5938 break;
5939 case GE:
459b3825
MM
5940 op[0] = XEXP (x, 0);
5941 st[1] = ">=";
5942 op[1] = XEXP (x, 1);
8c660648
JL
5943 break;
5944 case GEU:
459b3825
MM
5945 fun = "geu";
5946 op[0] = XEXP (x, 0);
5947 op[1] = XEXP (x, 1);
8c660648
JL
5948 break;
5949 case LE:
459b3825
MM
5950 op[0] = XEXP (x, 0);
5951 st[1] = "<=";
5952 op[1] = XEXP (x, 1);
8c660648
JL
5953 break;
5954 case LEU:
459b3825
MM
5955 fun = "leu";
5956 op[0] = XEXP (x, 0);
5957 op[1] = XEXP (x, 1);
8c660648
JL
5958 break;
5959 case SIGN_EXTRACT:
459b3825
MM
5960 fun = (verbose) ? "sign_extract" : "sxt";
5961 op[0] = XEXP (x, 0);
5962 op[1] = XEXP (x, 1);
5963 op[2] = XEXP (x, 2);
8c660648
JL
5964 break;
5965 case ZERO_EXTRACT:
459b3825
MM
5966 fun = (verbose) ? "zero_extract" : "zxt";
5967 op[0] = XEXP (x, 0);
5968 op[1] = XEXP (x, 1);
5969 op[2] = XEXP (x, 2);
8c660648
JL
5970 break;
5971 case SIGN_EXTEND:
459b3825
MM
5972 fun = (verbose) ? "sign_extend" : "sxn";
5973 op[0] = XEXP (x, 0);
8c660648
JL
5974 break;
5975 case ZERO_EXTEND:
459b3825
MM
5976 fun = (verbose) ? "zero_extend" : "zxn";
5977 op[0] = XEXP (x, 0);
8c660648
JL
5978 break;
5979 case FLOAT_EXTEND:
459b3825
MM
5980 fun = (verbose) ? "float_extend" : "fxn";
5981 op[0] = XEXP (x, 0);
8c660648
JL
5982 break;
5983 case TRUNCATE:
459b3825
MM
5984 fun = (verbose) ? "trunc" : "trn";
5985 op[0] = XEXP (x, 0);
8c660648
JL
5986 break;
5987 case FLOAT_TRUNCATE:
459b3825
MM
5988 fun = (verbose) ? "float_trunc" : "ftr";
5989 op[0] = XEXP (x, 0);
8c660648
JL
5990 break;
5991 case FLOAT:
459b3825
MM
5992 fun = (verbose) ? "float" : "flt";
5993 op[0] = XEXP (x, 0);
8c660648
JL
5994 break;
5995 case UNSIGNED_FLOAT:
459b3825
MM
5996 fun = (verbose) ? "uns_float" : "ufl";
5997 op[0] = XEXP (x, 0);
8c660648
JL
5998 break;
5999 case FIX:
459b3825
MM
6000 fun = "fix";
6001 op[0] = XEXP (x, 0);
8c660648
JL
6002 break;
6003 case UNSIGNED_FIX:
459b3825
MM
6004 fun = (verbose) ? "uns_fix" : "ufx";
6005 op[0] = XEXP (x, 0);
8c660648
JL
6006 break;
6007 case PRE_DEC:
459b3825
MM
6008 st[0] = "--";
6009 op[0] = XEXP (x, 0);
8c660648
JL
6010 break;
6011 case PRE_INC:
459b3825
MM
6012 st[0] = "++";
6013 op[0] = XEXP (x, 0);
8c660648
JL
6014 break;
6015 case POST_DEC:
459b3825
MM
6016 op[0] = XEXP (x, 0);
6017 st[1] = "--";
8c660648
JL
6018 break;
6019 case POST_INC:
459b3825
MM
6020 op[0] = XEXP (x, 0);
6021 st[1] = "++";
8c660648
JL
6022 break;
6023 case CALL:
459b3825
MM
6024 st[0] = "call ";
6025 op[0] = XEXP (x, 0);
8c660648
JL
6026 if (verbose)
6027 {
459b3825
MM
6028 st[1] = " argc:";
6029 op[1] = XEXP (x, 1);
8c660648 6030 }
8c660648
JL
6031 break;
6032 case IF_THEN_ELSE:
459b3825
MM
6033 st[0] = "{(";
6034 op[0] = XEXP (x, 0);
6035 st[1] = ")?";
6036 op[1] = XEXP (x, 1);
6037 st[2] = ":";
6038 op[2] = XEXP (x, 2);
6039 st[3] = "}";
8c660648
JL
6040 break;
6041 case TRAP_IF:
459b3825
MM
6042 fun = "trap_if";
6043 op[0] = TRAP_CONDITION (x);
8c660648
JL
6044 break;
6045 case UNSPEC:
8c660648
JL
6046 case UNSPEC_VOLATILE:
6047 {
459b3825
MM
6048 cur = safe_concat (buf, cur, "unspec");
6049 if (GET_CODE (x) == UNSPEC_VOLATILE)
6050 cur = safe_concat (buf, cur, "/v");
6051 cur = safe_concat (buf, cur, "[");
6052 sep = "";
8c660648
JL
6053 for (i = 0; i < XVECLEN (x, 0); i++)
6054 {
459b3825
MM
6055 print_pattern (tmp, XVECEXP (x, 0, i), verbose);
6056 cur = safe_concat (buf, cur, sep);
6057 cur = safe_concat (buf, cur, tmp);
6058 sep = ",";
8c660648 6059 }
459b3825
MM
6060 cur = safe_concat (buf, cur, "] ");
6061 sprintf (tmp, "%d", XINT (x, 1));
6062 cur = safe_concat (buf, cur, tmp);
8c660648
JL
6063 }
6064 break;
6065 default:
53c0919d
RH
6066 /* if (verbose) debug_rtx (x); */
6067 st[0] = GET_RTX_NAME (GET_CODE (x));
459b3825
MM
6068 break;
6069 }
6070
6071 /* Print this as a function? */
6072 if (fun)
6073 {
6074 cur = safe_concat (buf, cur, fun);
6075 cur = safe_concat (buf, cur, "(");
6076 }
6077
6078 for (i = 0; i < 4; i++)
6079 {
6080 if (st[i])
6081 cur = safe_concat (buf, cur, st[i]);
6082
6083 if (op[i])
6084 {
6085 if (fun && i != 0)
6086 cur = safe_concat (buf, cur, ",");
6087
6088 print_value (tmp, op[i], verbose);
6089 cur = safe_concat (buf, cur, tmp);
6090 }
8c660648 6091 }
459b3825
MM
6092
6093 if (fun)
6094 cur = safe_concat (buf, cur, ")");
6095} /* print_exp */
8c660648
JL
6096
6097/* Prints rtxes, i customly classified as values. They're constants, */
6098/* registers, labels, symbols and memory accesses. */
6099
6100static void
6101print_value (buf, x, verbose)
6102 char *buf;
6103 rtx x;
6104 int verbose;
6105{
6106 char t[BUF_LEN];
459b3825 6107 char *cur = buf;
8c660648
JL
6108
6109 switch (GET_CODE (x))
6110 {
6111 case CONST_INT:
459b3825
MM
6112 sprintf (t, "0x%lx", (long)INTVAL (x));
6113 cur = safe_concat (buf, cur, t);
8c660648
JL
6114 break;
6115 case CONST_DOUBLE:
459b3825
MM
6116 sprintf (t, "<0x%lx,0x%lx>", (long)XWINT (x, 2), (long)XWINT (x, 3));
6117 cur = safe_concat (buf, cur, t);
8c660648
JL
6118 break;
6119 case CONST_STRING:
459b3825
MM
6120 cur = safe_concat (buf, cur, "\"");
6121 cur = safe_concat (buf, cur, XSTR (x, 0));
6122 cur = safe_concat (buf, cur, "\"");
8c660648
JL
6123 break;
6124 case SYMBOL_REF:
459b3825
MM
6125 cur = safe_concat (buf, cur, "`");
6126 cur = safe_concat (buf, cur, XSTR (x, 0));
6127 cur = safe_concat (buf, cur, "'");
8c660648
JL
6128 break;
6129 case LABEL_REF:
459b3825
MM
6130 sprintf (t, "L%d", INSN_UID (XEXP (x, 0)));
6131 cur = safe_concat (buf, cur, t);
8c660648
JL
6132 break;
6133 case CONST:
459b3825
MM
6134 print_value (t, XEXP (x, 0), verbose);
6135 cur = safe_concat (buf, cur, "const(");
6136 cur = safe_concat (buf, cur, t);
6137 cur = safe_concat (buf, cur, ")");
8c660648
JL
6138 break;
6139 case HIGH:
459b3825
MM
6140 print_value (t, XEXP (x, 0), verbose);
6141 cur = safe_concat (buf, cur, "high(");
6142 cur = safe_concat (buf, cur, t);
6143 cur = safe_concat (buf, cur, ")");
8c660648
JL
6144 break;
6145 case REG:
459b3825
MM
6146 if (REGNO (x) < FIRST_PSEUDO_REGISTER)
6147 {
6148 int c = reg_names[ REGNO (x) ][0];
6149 if (c >= '0' && c <= '9')
6150 cur = safe_concat (buf, cur, "%");
6151
6152 cur = safe_concat (buf, cur, reg_names[ REGNO (x) ]);
6153 }
8c660648 6154 else
459b3825
MM
6155 {
6156 sprintf (t, "r%d", REGNO (x));
6157 cur = safe_concat (buf, cur, t);
6158 }
8c660648
JL
6159 break;
6160 case SUBREG:
459b3825
MM
6161 print_value (t, SUBREG_REG (x), verbose);
6162 cur = safe_concat (buf, cur, t);
6b879bcc 6163 sprintf (t, "#%d", SUBREG_WORD (x));
459b3825 6164 cur = safe_concat (buf, cur, t);
8c660648
JL
6165 break;
6166 case SCRATCH:
459b3825 6167 cur = safe_concat (buf, cur, "scratch");
8c660648
JL
6168 break;
6169 case CC0:
459b3825 6170 cur = safe_concat (buf, cur, "cc0");
8c660648
JL
6171 break;
6172 case PC:
459b3825 6173 cur = safe_concat (buf, cur, "pc");
8c660648
JL
6174 break;
6175 case MEM:
6176 print_value (t, XEXP (x, 0), verbose);
459b3825
MM
6177 cur = safe_concat (buf, cur, "[");
6178 cur = safe_concat (buf, cur, t);
6179 cur = safe_concat (buf, cur, "]");
8c660648
JL
6180 break;
6181 default:
459b3825
MM
6182 print_exp (t, x, verbose);
6183 cur = safe_concat (buf, cur, t);
6184 break;
8c660648
JL
6185 }
6186} /* print_value */
6187
6188/* The next step in insn detalization, its pattern recognition */
6189
6190static void
6191print_pattern (buf, x, verbose)
6192 char *buf;
6193 rtx x;
6194 int verbose;
6195{
6196 char t1[BUF_LEN], t2[BUF_LEN], t3[BUF_LEN];
6197
6198 switch (GET_CODE (x))
6199 {
6200 case SET:
6201 print_value (t1, SET_DEST (x), verbose);
6202 print_value (t2, SET_SRC (x), verbose);
6203 sprintf (buf, "%s=%s", t1, t2);
6204 break;
6205 case RETURN:
6206 sprintf (buf, "return");
6207 break;
6208 case CALL:
6209 print_exp (buf, x, verbose);
6210 break;
6211 case CLOBBER:
6212 print_value (t1, XEXP (x, 0), verbose);
6213 sprintf (buf, "clobber %s", t1);
6214 break;
6215 case USE:
6216 print_value (t1, XEXP (x, 0), verbose);
6217 sprintf (buf, "use %s", t1);
6218 break;
6219 case PARALLEL:
6220 {
6221 int i;
6222
6223 sprintf (t1, "{");
6224 for (i = 0; i < XVECLEN (x, 0); i++)
6225 {
6226 print_pattern (t2, XVECEXP (x, 0, i), verbose);
6227 sprintf (t3, "%s%s;", t1, t2);
6228 strcpy (t1, t3);
6229 }
6230 sprintf (buf, "%s}", t1);
6231 }
6232 break;
6233 case SEQUENCE:
6234 {
6235 int i;
6236
6237 sprintf (t1, "%%{");
6238 for (i = 0; i < XVECLEN (x, 0); i++)
6239 {
6240 print_insn (t2, XVECEXP (x, 0, i), verbose);
6241 sprintf (t3, "%s%s;", t1, t2);
6242 strcpy (t1, t3);
6243 }
6244 sprintf (buf, "%s%%}", t1);
6245 }
6246 break;
6247 case ASM_INPUT:
c4fa3460 6248 sprintf (buf, "asm {%s}", XSTR (x, 0));
8c660648
JL
6249 break;
6250 case ADDR_VEC:
6251 break;
6252 case ADDR_DIFF_VEC:
6253 print_value (buf, XEXP (x, 0), verbose);
6254 break;
6255 case TRAP_IF:
6256 print_value (t1, TRAP_CONDITION (x), verbose);
6257 sprintf (buf, "trap_if %s", t1);
6258 break;
6259 case UNSPEC:
6260 {
6261 int i;
6262
6263 sprintf (t1, "unspec{");
6264 for (i = 0; i < XVECLEN (x, 0); i++)
6265 {
6266 print_pattern (t2, XVECEXP (x, 0, i), verbose);
6267 sprintf (t3, "%s%s;", t1, t2);
6268 strcpy (t1, t3);
6269 }
6270 sprintf (buf, "%s}", t1);
6271 }
6272 break;
6273 case UNSPEC_VOLATILE:
6274 {
6275 int i;
6276
6277 sprintf (t1, "unspec/v{");
6278 for (i = 0; i < XVECLEN (x, 0); i++)
6279 {
6280 print_pattern (t2, XVECEXP (x, 0, i), verbose);
6281 sprintf (t3, "%s%s;", t1, t2);
6282 strcpy (t1, t3);
6283 }
6284 sprintf (buf, "%s}", t1);
6285 }
6286 break;
6287 default:
6288 print_value (buf, x, verbose);
6289 }
6290} /* print_pattern */
6291
6292/* This is the main function in rtl visualization mechanism. It
6293 accepts an rtx and tries to recognize it as an insn, then prints it
6294 properly in human readable form, resembling assembler mnemonics. */
6295/* For every insn it prints its UID and BB the insn belongs */
6296/* too. (probably the last "option" should be extended somehow, since */
6297/* it depends now on sched.c inner variables ...) */
6298
6299static void
6300print_insn (buf, x, verbose)
6301 char *buf;
6302 rtx x;
6303 int verbose;
6304{
6305 char t[BUF_LEN];
6306 rtx insn = x;
6307
6308 switch (GET_CODE (x))
6309 {
6310 case INSN:
6311 print_pattern (t, PATTERN (x), verbose);
6312 if (verbose)
6313 sprintf (buf, "b%d: i% 4d: %s", INSN_BB (x),
6314 INSN_UID (x), t);
6315 else
6316 sprintf (buf, "%-4d %s", INSN_UID (x), t);
6317 break;
6318 case JUMP_INSN:
6319 print_pattern (t, PATTERN (x), verbose);
6320 if (verbose)
6321 sprintf (buf, "b%d: i% 4d: jump %s", INSN_BB (x),
6322 INSN_UID (x), t);
6323 else
6324 sprintf (buf, "%-4d %s", INSN_UID (x), t);
6325 break;
6326 case CALL_INSN:
6327 x = PATTERN (insn);
6328 if (GET_CODE (x) == PARALLEL)
6329 {
6330 x = XVECEXP (x, 0, 0);
6331 print_pattern (t, x, verbose);
6332 }
6333 else
6334 strcpy (t, "call <...>");
6335 if (verbose)
6336 sprintf (buf, "b%d: i% 4d: %s", INSN_BB (insn),
6337 INSN_UID (insn), t);
6338 else
6339 sprintf (buf, "%-4d %s", INSN_UID (insn), t);
6340 break;
6341 case CODE_LABEL:
6342 sprintf (buf, "L%d:", INSN_UID (x));
6343 break;
6344 case BARRIER:
6345 sprintf (buf, "i% 4d: barrier", INSN_UID (x));
6346 break;
6347 case NOTE:
6348 if (NOTE_LINE_NUMBER (x) > 0)
6349 sprintf (buf, "%4d note \"%s\" %d", INSN_UID (x),
6350 NOTE_SOURCE_FILE (x), NOTE_LINE_NUMBER (x));
6351 else
6352 sprintf (buf, "%4d %s", INSN_UID (x),
6353 GET_NOTE_INSN_NAME (NOTE_LINE_NUMBER (x)));
6354 break;
6355 default:
6356 if (verbose)
6357 {
6358 sprintf (buf, "Not an INSN at all\n");
6359 debug_rtx (x);
6360 }
6361 else
6362 sprintf (buf, "i%-4d <What?>", INSN_UID (x));
6363 }
6364} /* print_insn */
6365
8c660648
JL
6366/* Print visualization debugging info */
6367
6368static void
6369print_block_visualization (b, s)
6370 int b;
6371 char *s;
6372{
6373 int unit, i;
8c660648
JL
6374
6375 /* print header */
6376 fprintf (dump, "\n;; ==================== scheduling visualization for block %d %s \n", b, s);
6377
6378 /* Print names of units */
2f308fec 6379 fprintf (dump, ";; %-8s", "clock");
8c660648
JL
6380 for (unit = 0; unit < FUNCTION_UNITS_SIZE; unit++)
6381 if (function_units[unit].bitmask & target_units)
6382 for (i = 0; i < function_units[unit].multiplicity; i++)
2f308fec
RH
6383 fprintf (dump, " %-33s", function_units[unit].name);
6384 fprintf (dump, " %-8s\n", "no-unit");
6385
6386 fprintf (dump, ";; %-8s", "=====");
6387 for (unit = 0; unit < FUNCTION_UNITS_SIZE; unit++)
6388 if (function_units[unit].bitmask & target_units)
6389 for (i = 0; i < function_units[unit].multiplicity; i++)
6390 fprintf (dump, " %-33s", "==============================");
6391 fprintf (dump, " %-8s\n", "=======");
8c660648
JL
6392
6393 /* Print insns in each cycle */
6394 fprintf (dump, "%s\n", visual_tbl);
6395}
6396
6397/* Print insns in the 'no_unit' column of visualization */
6398
6399static void
6400visualize_no_unit (insn)
6401 rtx insn;
6402{
6403 vis_no_unit[n_vis_no_unit] = insn;
6404 n_vis_no_unit++;
6405}
6406
6407/* Print insns scheduled in clock, for visualization. */
6408
6409static void
6410visualize_scheduled_insns (b, clock)
6411 int b, clock;
6412{
6413 int i, unit;
6414
6415 /* if no more room, split table into two */
6416 if (n_visual_lines >= MAX_VISUAL_LINES)
6417 {
6418 print_block_visualization (b, "(incomplete)");
6419 init_block_visualization ();
6420 }
6421
6422 n_visual_lines++;
6423
6424 sprintf (visual_tbl + strlen (visual_tbl), ";; %-8d", clock);
6425 for (unit = 0; unit < FUNCTION_UNITS_SIZE; unit++)
6426 if (function_units[unit].bitmask & target_units)
6427 for (i = 0; i < function_units[unit].multiplicity; i++)
6428 {
6429 int instance = unit + i * FUNCTION_UNITS_SIZE;
6430 rtx insn = unit_last_insn[instance];
6431
6432 /* print insns that still keep the unit busy */
6433 if (insn &&
6434 actual_hazard_this_instance (unit, instance, insn, clock, 0))
6435 {
6436 char str[BUF_LEN];
6437 print_insn (str, insn, 0);
6438 str[INSN_LEN] = '\0';
6439 sprintf (visual_tbl + strlen (visual_tbl), " %-33s", str);
6440 }
6441 else
6442 sprintf (visual_tbl + strlen (visual_tbl), " %-33s", "------------------------------");
6443 }
6444
6445 /* print insns that are not assigned to any unit */
6446 for (i = 0; i < n_vis_no_unit; i++)
6447 sprintf (visual_tbl + strlen (visual_tbl), " %-8d",
6448 INSN_UID (vis_no_unit[i]));
6449 n_vis_no_unit = 0;
6450
6451 sprintf (visual_tbl + strlen (visual_tbl), "\n");
6452}
6453
6454/* Print stalled cycles */
6455
6456static void
6457visualize_stall_cycles (b, stalls)
6458 int b, stalls;
6459{
6460 int i;
6461
6462 /* if no more room, split table into two */
6463 if (n_visual_lines >= MAX_VISUAL_LINES)
6464 {
6465 print_block_visualization (b, "(incomplete)");
6466 init_block_visualization ();
6467 }
6468
6469 n_visual_lines++;
6470
6471 sprintf (visual_tbl + strlen (visual_tbl), ";; ");
6472 for (i = 0; i < stalls; i++)
6473 sprintf (visual_tbl + strlen (visual_tbl), ".");
6474 sprintf (visual_tbl + strlen (visual_tbl), "\n");
6475}
6476
6477/* move_insn1: Remove INSN from insn chain, and link it after LAST insn */
6478
6479static rtx
6480move_insn1 (insn, last)
6481 rtx insn, last;
6482{
6483 NEXT_INSN (PREV_INSN (insn)) = NEXT_INSN (insn);
6484 PREV_INSN (NEXT_INSN (insn)) = PREV_INSN (insn);
6485
6486 NEXT_INSN (insn) = NEXT_INSN (last);
6487 PREV_INSN (NEXT_INSN (last)) = insn;
6488
6489 NEXT_INSN (last) = insn;
6490 PREV_INSN (insn) = last;
6491
6492 return insn;
6493}
6494
6495/* Search INSN for fake REG_DEAD note pairs for NOTE_INSN_SETJMP,
6496 NOTE_INSN_{LOOP,EHREGION}_{BEG,END}; and convert them back into
6497 NOTEs. The REG_DEAD note following first one is contains the saved
6498 value for NOTE_BLOCK_NUMBER which is useful for
6499 NOTE_INSN_EH_REGION_{BEG,END} NOTEs. LAST is the last instruction
6500 output by the instruction scheduler. Return the new value of LAST. */
6501
6502static rtx
6503reemit_notes (insn, last)
6504 rtx insn;
6505 rtx last;
6506{
6507 rtx note, retval;
6508
6509 retval = last;
6510 for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
6511 {
6512 if (REG_NOTE_KIND (note) == REG_DEAD
6513 && GET_CODE (XEXP (note, 0)) == CONST_INT)
6514 {
6dfdecdb
RH
6515 int note_type = INTVAL (XEXP (note, 0));
6516 if (note_type == NOTE_INSN_SETJMP)
8c660648 6517 {
6dfdecdb 6518 retval = emit_note_after (NOTE_INSN_SETJMP, insn);
8c660648
JL
6519 CONST_CALL_P (retval) = CONST_CALL_P (note);
6520 remove_note (insn, note);
6521 note = XEXP (note, 1);
6522 }
6dfdecdb
RH
6523 else if (note_type == NOTE_INSN_RANGE_START
6524 || note_type == NOTE_INSN_RANGE_END)
6525 {
6526 last = emit_note_before (note_type, last);
6527 remove_note (insn, note);
6528 note = XEXP (note, 1);
6529 NOTE_RANGE_INFO (last) = XEXP (note, 0);
6530 }
8c660648
JL
6531 else
6532 {
6533 last = emit_note_before (INTVAL (XEXP (note, 0)), last);
6534 remove_note (insn, note);
6535 note = XEXP (note, 1);
6536 NOTE_BLOCK_NUMBER (last) = INTVAL (XEXP (note, 0));
6537 }
6538 remove_note (insn, note);
6539 }
6540 }
6541 return retval;
6542}
6543
6544/* Move INSN, and all insns which should be issued before it,
c9e03727
JL
6545 due to SCHED_GROUP_P flag. Reemit notes if needed.
6546
6547 Return the last insn emitted by the scheduler, which is the
6548 return value from the first call to reemit_notes. */
8c660648
JL
6549
6550static rtx
6551move_insn (insn, last)
6552 rtx insn, last;
6553{
c9e03727 6554 rtx retval = NULL;
8c660648 6555
c9e03727
JL
6556 /* If INSN has SCHED_GROUP_P set, then issue it and any other
6557 insns with SCHED_GROUP_P set first. */
8c660648
JL
6558 while (SCHED_GROUP_P (insn))
6559 {
6560 rtx prev = PREV_INSN (insn);
c9e03727
JL
6561
6562 /* Move a SCHED_GROUP_P insn. */
8c660648 6563 move_insn1 (insn, last);
c9e03727
JL
6564 /* If this is the first call to reemit_notes, then record
6565 its return value. */
6566 if (retval == NULL_RTX)
6567 retval = reemit_notes (insn, insn);
6568 else
6569 reemit_notes (insn, insn);
8c660648
JL
6570 insn = prev;
6571 }
6572
c9e03727 6573 /* Now move the first non SCHED_GROUP_P insn. */
8c660648 6574 move_insn1 (insn, last);
c9e03727
JL
6575
6576 /* If this is the first call to reemit_notes, then record
6577 its return value. */
6578 if (retval == NULL_RTX)
6579 retval = reemit_notes (insn, insn);
6580 else
6581 reemit_notes (insn, insn);
6582
6583 return retval;
8c660648
JL
6584}
6585
6586/* Return an insn which represents a SCHED_GROUP, which is
6587 the last insn in the group. */
6588
6589static rtx
6590group_leader (insn)
6591 rtx insn;
6592{
6593 rtx prev;
6594
6595 do
6596 {
6597 prev = insn;
6598 insn = next_nonnote_insn (insn);
6599 }
6600 while (insn && SCHED_GROUP_P (insn) && (GET_CODE (insn) != CODE_LABEL));
6601
6602 return prev;
6603}
6604
6605/* Use forward list scheduling to rearrange insns of block BB in region RGN,
6606 possibly bringing insns from subsequent blocks in the same region.
6607 Return number of insns scheduled. */
6608
6609static int
5835e573 6610schedule_block (bb, rgn_n_insns)
8c660648 6611 int bb;
8c660648
JL
6612 int rgn_n_insns;
6613{
6614 /* Local variables. */
6615 rtx insn, last;
6616 rtx *ready;
6617 int i;
6618 int n_ready = 0;
6619 int can_issue_more;
6620
6621 /* flow block of this bb */
6622 int b = BB_TO_BLOCK (bb);
6623
6624 /* target_n_insns == number of insns in b before scheduling starts.
6625 sched_target_n_insns == how many of b's insns were scheduled.
6626 sched_n_insns == how many insns were scheduled in b */
6627 int target_n_insns = 0;
6628 int sched_target_n_insns = 0;
6629 int sched_n_insns = 0;
6630
6631#define NEED_NOTHING 0
6632#define NEED_HEAD 1
6633#define NEED_TAIL 2
6634 int new_needs;
6635
6636 /* head/tail info for this block */
6637 rtx prev_head;
6638 rtx next_tail;
6639 rtx head;
6640 rtx tail;
6641 int bb_src;
6642
484df988
JL
6643 /* We used to have code to avoid getting parameters moved from hard
6644 argument registers into pseudos.
8c660648 6645
484df988
JL
6646 However, it was removed when it proved to be of marginal benefit
6647 and caused problems because schedule_block and compute_forward_dependences
6648 had different notions of what the "head" insn was. */
6649 get_block_head_tail (bb, &head, &tail);
8c660648 6650
1447b516
JL
6651 /* Interblock scheduling could have moved the original head insn from this
6652 block into a proceeding block. This may also cause schedule_block and
6653 compute_forward_dependences to have different notions of what the
6654 "head" insn was.
6655
6656 If the interblock movement happened to make this block start with
6657 some notes (LOOP, EH or SETJMP) before the first real insn, then
6658 HEAD will have various special notes attached to it which must be
6659 removed so that we don't end up with extra copies of the notes. */
6660 if (GET_RTX_CLASS (GET_CODE (head)) == 'i')
6661 {
6662 rtx note;
6663
6664 for (note = REG_NOTES (head); note; note = XEXP (note, 1))
6665 if (REG_NOTE_KIND (note) == REG_DEAD
6666 && GET_CODE (XEXP (note, 0)) == CONST_INT)
6667 remove_note (head, note);
6668 }
6669
8c660648
JL
6670 next_tail = NEXT_INSN (tail);
6671 prev_head = PREV_INSN (head);
6672
6673 /* If the only insn left is a NOTE or a CODE_LABEL, then there is no need
6674 to schedule this block. */
6675 if (head == tail
6676 && (GET_RTX_CLASS (GET_CODE (head)) != 'i'))
6677 return (sched_n_insns);
6678
6679 /* debug info */
6680 if (sched_verbose)
6681 {
6682 fprintf (dump, ";; ======================================================\n");
6683 fprintf (dump,
6684 ";; -- basic block %d from %d to %d -- %s reload\n",
6685 b, INSN_UID (basic_block_head[b]),
6686 INSN_UID (basic_block_end[b]),
6687 (reload_completed ? "after" : "before"));
6688 fprintf (dump, ";; ======================================================\n");
8c660648
JL
6689 fprintf (dump, "\n");
6690
6691 visual_tbl = (char *) alloca (get_visual_tbl_length ());
6692 init_block_visualization ();
6693 }
6694
6695 /* remove remaining note insns from the block, save them in
6696 note_list. These notes are restored at the end of
6697 schedule_block (). */
6698 note_list = 0;
6699 rm_other_notes (head, tail);
6700
6701 target_bb = bb;
6702
6703 /* prepare current target block info */
6704 if (current_nr_blocks > 1)
6705 {
6706 candidate_table = (candidate *) alloca (current_nr_blocks * sizeof (candidate));
6707
6708 bblst_last = 0;
6709 /* ??? It is not clear why bblst_size is computed this way. The original
6710 number was clearly too small as it resulted in compiler failures.
6711 Multiplying by the original number by 2 (to account for update_bbs
6712 members) seems to be a reasonable solution. */
6713 /* ??? Or perhaps there is a bug somewhere else in this file? */
6714 bblst_size = (current_nr_blocks - bb) * rgn_nr_edges * 2;
6715 bblst_table = (int *) alloca (bblst_size * sizeof (int));
6716
6717 bitlst_table_last = 0;
6718 bitlst_table_size = rgn_nr_edges;
6719 bitlst_table = (int *) alloca (rgn_nr_edges * sizeof (int));
6720
6721 compute_trg_info (bb);
6722 }
6723
6724 clear_units ();
6725
6726 /* Allocate the ready list */
6727 ready = (rtx *) alloca ((rgn_n_insns + 1) * sizeof (rtx));
6728
6729 /* Print debugging information. */
6730 if (sched_verbose >= 5)
6731 debug_dependencies ();
6732
6733
6734 /* Initialize ready list with all 'ready' insns in target block.
6735 Count number of insns in the target block being scheduled. */
6736 n_ready = 0;
6737 for (insn = head; insn != next_tail; insn = NEXT_INSN (insn))
6738 {
6739 rtx next;
6740
6741 if (GET_RTX_CLASS (GET_CODE (insn)) != 'i')
6742 continue;
6743 next = NEXT_INSN (insn);
6744
6745 if (INSN_DEP_COUNT (insn) == 0
6746 && (SCHED_GROUP_P (next) == 0 || GET_RTX_CLASS (GET_CODE (next)) != 'i'))
6747 ready[n_ready++] = insn;
6748 if (!(SCHED_GROUP_P (insn)))
6749 target_n_insns++;
6750 }
6751
6752 /* Add to ready list all 'ready' insns in valid source blocks.
6753 For speculative insns, check-live, exception-free, and
6754 issue-delay. */
6755 for (bb_src = bb + 1; bb_src < current_nr_blocks; bb_src++)
6756 if (IS_VALID (bb_src))
6757 {
6758 rtx src_head;
6759 rtx src_next_tail;
6760 rtx tail, head;
6761
6762 get_block_head_tail (bb_src, &head, &tail);
6763 src_next_tail = NEXT_INSN (tail);
6764 src_head = head;
6765
6766 if (head == tail
6767 && (GET_RTX_CLASS (GET_CODE (head)) != 'i'))
6768 continue;
6769
6770 for (insn = src_head; insn != src_next_tail; insn = NEXT_INSN (insn))
6771 {
6772 if (GET_RTX_CLASS (GET_CODE (insn)) != 'i')
6773 continue;
6774
6775 if (!CANT_MOVE (insn)
6776 && (!IS_SPECULATIVE_INSN (insn)
6777 || (insn_issue_delay (insn) <= 3
5835e573 6778 && check_live (insn, bb_src)
8c660648
JL
6779 && is_exception_free (insn, bb_src, target_bb))))
6780
6781 {
6782 rtx next;
6783
6784 next = NEXT_INSN (insn);
6785 if (INSN_DEP_COUNT (insn) == 0
6786 && (SCHED_GROUP_P (next) == 0
6787 || GET_RTX_CLASS (GET_CODE (next)) != 'i'))
6788 ready[n_ready++] = insn;
6789 }
6790 }
6791 }
6792
e4da5f6d
MM
6793#ifdef MD_SCHED_INIT
6794 MD_SCHED_INIT (dump, sched_verbose);
6795#endif
6796
8c660648
JL
6797 /* no insns scheduled in this block yet */
6798 last_scheduled_insn = 0;
6799
6800 /* Sort the ready list */
6801 SCHED_SORT (ready, n_ready);
e4da5f6d
MM
6802#ifdef MD_SCHED_REORDER
6803 MD_SCHED_REORDER (dump, sched_verbose, ready, n_ready);
6804#endif
8c660648
JL
6805
6806 if (sched_verbose >= 2)
6807 {
6d3352d9 6808 fprintf (dump, ";;\t\tReady list initially: ");
8c660648
JL
6809 debug_ready_list (ready, n_ready);
6810 }
6811
6812 /* Q_SIZE is the total number of insns in the queue. */
6813 q_ptr = 0;
6814 q_size = 0;
6815 clock_var = 0;
4bdc8810 6816 last_clock_var = 0;
8c660648
JL
6817 bzero ((char *) insn_queue, sizeof (insn_queue));
6818
6819 /* We start inserting insns after PREV_HEAD. */
6820 last = prev_head;
6821
6822 /* Initialize INSN_QUEUE, LIST and NEW_NEEDS. */
6823 new_needs = (NEXT_INSN (prev_head) == basic_block_head[b]
6824 ? NEED_HEAD : NEED_NOTHING);
6825 if (PREV_INSN (next_tail) == basic_block_end[b])
6826 new_needs |= NEED_TAIL;
6827
6828 /* loop until all the insns in BB are scheduled. */
6829 while (sched_target_n_insns < target_n_insns)
6830 {
6831 int b1;
6832
8c660648
JL
6833 clock_var++;
6834
6835 /* Add to the ready list all pending insns that can be issued now.
6836 If there are no ready insns, increment clock until one
6837 is ready and add all pending insns at that point to the ready
6838 list. */
6839 n_ready = queue_to_ready (ready, n_ready);
6840
6841 if (n_ready == 0)
6842 abort ();
6843
6844 if (sched_verbose >= 2)
6845 {
6846 fprintf (dump, ";;\t\tReady list after queue_to_ready: ");
6847 debug_ready_list (ready, n_ready);
6848 }
6849
6850 /* Sort the ready list. */
6851 SCHED_SORT (ready, n_ready);
e4da5f6d
MM
6852#ifdef MD_SCHED_REORDER
6853 MD_SCHED_REORDER (dump, sched_verbose, ready, n_ready);
6854#endif
8c660648
JL
6855
6856 if (sched_verbose)
6857 {
47312d84 6858 fprintf (dump, "\n;;\tReady list (t =%3d): ", clock_var);
8c660648
JL
6859 debug_ready_list (ready, n_ready);
6860 }
6861
6862 /* Issue insns from ready list.
6863 It is important to count down from n_ready, because n_ready may change
6864 as insns are issued. */
6865 can_issue_more = issue_rate;
6866 for (i = n_ready - 1; i >= 0 && can_issue_more; i--)
6867 {
6868 rtx insn = ready[i];
6869 int cost = actual_hazard (insn_unit (insn), insn, clock_var, 0);
6870
6871 if (cost > 1)
6872 {
6873 queue_insn (insn, cost);
6874 ready[i] = ready[--n_ready]; /* remove insn from ready list */
6875 }
6876 else if (cost == 0)
6877 {
8c660648
JL
6878 /* an interblock motion? */
6879 if (INSN_BB (insn) != target_bb)
6880 {
4f64eaca
JL
6881 rtx temp;
6882
8c660648
JL
6883 if (IS_SPECULATIVE_INSN (insn))
6884 {
6885
5835e573 6886 if (!check_live (insn, INSN_BB (insn)))
8c660648
JL
6887 {
6888 /* speculative motion, live check failed, remove
6889 insn from ready list */
6890 ready[i] = ready[--n_ready];
6891 continue;
6892 }
5835e573 6893 update_live (insn, INSN_BB (insn));
8c660648
JL
6894
6895 /* for speculative load, mark insns fed by it. */
6896 if (IS_LOAD_INSN (insn) || FED_BY_SPEC_LOAD (insn))
6897 set_spec_fed (insn);
6898
6899 nr_spec++;
6900 }
6901 nr_inter++;
6902
4f64eaca
JL
6903 temp = insn;
6904 while (SCHED_GROUP_P (temp))
6905 temp = PREV_INSN (temp);
6906
6907 /* Update source block boundaries. */
6908 b1 = INSN_BLOCK (temp);
6909 if (temp == basic_block_head[b1]
8c660648
JL
6910 && insn == basic_block_end[b1])
6911 {
4f64eaca
JL
6912 /* We moved all the insns in the basic block.
6913 Emit a note after the last insn and update the
6914 begin/end boundaries to point to the note. */
6915 emit_note_after (NOTE_INSN_DELETED, insn);
6916 basic_block_end[b1] = NEXT_INSN (insn);
6917 basic_block_head[b1] = NEXT_INSN (insn);
8c660648
JL
6918 }
6919 else if (insn == basic_block_end[b1])
6920 {
4f64eaca
JL
6921 /* We took insns from the end of the basic block,
6922 so update the end of block boundary so that it
6923 points to the first insn we did not move. */
6924 basic_block_end[b1] = PREV_INSN (temp);
8c660648 6925 }
4f64eaca 6926 else if (temp == basic_block_head[b1])
8c660648 6927 {
4f64eaca
JL
6928 /* We took insns from the start of the basic block,
6929 so update the start of block boundary so that
6930 it points to the first insn we did not move. */
8c660648
JL
6931 basic_block_head[b1] = NEXT_INSN (insn);
6932 }
6933 }
6934 else
6935 {
6936 /* in block motion */
6937 sched_target_n_insns++;
6938 }
6939
6940 last_scheduled_insn = insn;
6941 last = move_insn (insn, last);
6942 sched_n_insns++;
6943
e4da5f6d
MM
6944#ifdef MD_SCHED_VARIABLE_ISSUE
6945 MD_SCHED_VARIABLE_ISSUE (dump, sched_verbose, insn, can_issue_more);
6946#else
8c660648 6947 can_issue_more--;
e4da5f6d 6948#endif
8c660648 6949
8c660648
JL
6950 n_ready = schedule_insn (insn, ready, n_ready, clock_var);
6951
6952 /* remove insn from ready list */
6953 ready[i] = ready[--n_ready];
6954
6955 /* close this block after scheduling its jump */
6956 if (GET_CODE (last_scheduled_insn) == JUMP_INSN)
6957 break;
6958 }
6959 }
6960
6961 /* debug info */
6962 if (sched_verbose)
6963 {
6964 visualize_scheduled_insns (b, clock_var);
8c660648
JL
6965 }
6966 }
6967
6968 /* debug info */
6969 if (sched_verbose)
6970 {
6971 fprintf (dump, ";;\tReady list (final): ");
6972 debug_ready_list (ready, n_ready);
6973 print_block_visualization (b, "");
6974 }
6975
6976 /* Sanity check -- queue must be empty now. Meaningless if region has
cc132865 6977 multiple bbs. */
8c660648 6978 if (current_nr_blocks > 1)
cc132865
JL
6979 if (!flag_schedule_interblock && q_size != 0)
6980 abort ();
8c660648
JL
6981
6982 /* update head/tail boundaries. */
6983 head = NEXT_INSN (prev_head);
6984 tail = last;
6985
8c660648
JL
6986 /* Restore-other-notes: NOTE_LIST is the end of a chain of notes
6987 previously found among the insns. Insert them at the beginning
6988 of the insns. */
6989 if (note_list != 0)
6990 {
6991 rtx note_head = note_list;
6992
6993 while (PREV_INSN (note_head))
6994 {
6995 note_head = PREV_INSN (note_head);
6996 }
6997
6998 PREV_INSN (note_head) = PREV_INSN (head);
6999 NEXT_INSN (PREV_INSN (head)) = note_head;
7000 PREV_INSN (head) = note_list;
7001 NEXT_INSN (note_list) = head;
7002 head = note_head;
7003 }
7004
7005 /* update target block boundaries. */
7006 if (new_needs & NEED_HEAD)
7007 basic_block_head[b] = head;
7008
7009 if (new_needs & NEED_TAIL)
7010 basic_block_end[b] = tail;
7011
7012 /* debugging */
7013 if (sched_verbose)
7014 {
7015 fprintf (dump, ";; total time = %d\n;; new basic block head = %d\n",
7016 clock_var, INSN_UID (basic_block_head[b]));
7017 fprintf (dump, ";; new basic block end = %d\n\n",
7018 INSN_UID (basic_block_end[b]));
7019 }
7020
7021 return (sched_n_insns);
7022} /* schedule_block () */
7023\f
7024
7025/* print the bit-set of registers, S. callable from debugger */
7026
7027extern void
7028debug_reg_vector (s)
7029 regset s;
7030{
7031 int regno;
7032
7033 EXECUTE_IF_SET_IN_REG_SET (s, 0, regno,
7034 {
7035 fprintf (dump, " %d", regno);
7036 });
7037
7038 fprintf (dump, "\n");
7039}
7040
7041/* Use the backward dependences from LOG_LINKS to build
7042 forward dependences in INSN_DEPEND. */
7043
7044static void
7045compute_block_forward_dependences (bb)
7046 int bb;
7047{
7048 rtx insn, link;
7049 rtx tail, head;
7050 rtx next_tail;
7051 enum reg_note dep_type;
7052
7053 get_block_head_tail (bb, &head, &tail);
7054 next_tail = NEXT_INSN (tail);
7055 for (insn = head; insn != next_tail; insn = NEXT_INSN (insn))
7056 {
7057 if (GET_RTX_CLASS (GET_CODE (insn)) != 'i')
7058 continue;
7059
7060 insn = group_leader (insn);
7061
7062 for (link = LOG_LINKS (insn); link; link = XEXP (link, 1))
7063 {
7064 rtx x = group_leader (XEXP (link, 0));
7065 rtx new_link;
7066
7067 if (x != XEXP (link, 0))
7068 continue;
7069
7070 /* Ignore dependences upon deleted insn */
7071 if (GET_CODE (x) == NOTE || INSN_DELETED_P (x))
7072 continue;
7073 if (find_insn_list (insn, INSN_DEPEND (x)))
7074 continue;
7075
ebb7b10b 7076 new_link = alloc_INSN_LIST (insn, INSN_DEPEND (x));
8c660648
JL
7077
7078 dep_type = REG_NOTE_KIND (link);
7079 PUT_REG_NOTE_KIND (new_link, dep_type);
7080
8c660648
JL
7081 INSN_DEPEND (x) = new_link;
7082 INSN_DEP_COUNT (insn) += 1;
7083 }
7084 }
7085}
7086
7087/* Initialize variables for region data dependence analysis.
7088 n_bbs is the number of region blocks */
7089
6d3352d9 7090__inline static void
8c660648
JL
7091init_rgn_data_dependences (n_bbs)
7092 int n_bbs;
7093{
7094 int bb;
7095
7096 /* variables for which one copy exists for each block */
7097 bzero ((char *) bb_pending_read_insns, n_bbs * sizeof (rtx));
7098 bzero ((char *) bb_pending_read_mems, n_bbs * sizeof (rtx));
7099 bzero ((char *) bb_pending_write_insns, n_bbs * sizeof (rtx));
7100 bzero ((char *) bb_pending_write_mems, n_bbs * sizeof (rtx));
7101 bzero ((char *) bb_pending_lists_length, n_bbs * sizeof (rtx));
7102 bzero ((char *) bb_last_pending_memory_flush, n_bbs * sizeof (rtx));
7103 bzero ((char *) bb_last_function_call, n_bbs * sizeof (rtx));
7104 bzero ((char *) bb_sched_before_next_call, n_bbs * sizeof (rtx));
7105
7106 /* Create an insn here so that we can hang dependencies off of it later. */
7107 for (bb = 0; bb < n_bbs; bb++)
7108 {
7109 bb_sched_before_next_call[bb] =
38a448ca
RH
7110 gen_rtx_INSN (VOIDmode, 0, NULL_RTX, NULL_RTX,
7111 NULL_RTX, 0, NULL_RTX, NULL_RTX);
8c660648
JL
7112 LOG_LINKS (bb_sched_before_next_call[bb]) = 0;
7113 }
7114}
7115
7116/* Add dependences so that branches are scheduled to run last in their block */
7117
7118static void
7119add_branch_dependences (head, tail)
7120 rtx head, tail;
7121{
7122
7123 rtx insn, last;
7124
7125 /* For all branches, calls, uses, and cc0 setters, force them to remain
7126 in order at the end of the block by adding dependencies and giving
7127 the last a high priority. There may be notes present, and prev_head
7128 may also be a note.
7129
7130 Branches must obviously remain at the end. Calls should remain at the
7131 end since moving them results in worse register allocation. Uses remain
7132 at the end to ensure proper register allocation. cc0 setters remaim
7133 at the end because they can't be moved away from their cc0 user. */
7134 insn = tail;
7135 last = 0;
7136 while (GET_CODE (insn) == CALL_INSN || GET_CODE (insn) == JUMP_INSN
7137 || (GET_CODE (insn) == INSN
7138 && (GET_CODE (PATTERN (insn)) == USE
7139#ifdef HAVE_cc0
7140 || sets_cc0_p (PATTERN (insn))
7141#endif
7142 ))
7143 || GET_CODE (insn) == NOTE)
7144 {
7145 if (GET_CODE (insn) != NOTE)
7146 {
7147 if (last != 0
7148 && !find_insn_list (insn, LOG_LINKS (last)))
7149 {
7150 add_dependence (last, insn, REG_DEP_ANTI);
7151 INSN_REF_COUNT (insn)++;
7152 }
7153
7154 CANT_MOVE (insn) = 1;
7155
7156 last = insn;
326ee7a3
JL
7157 /* Skip over insns that are part of a group.
7158 Make each insn explicitly depend on the previous insn.
7159 This ensures that only the group header will ever enter
7160 the ready queue (and, when scheduled, will automatically
7161 schedule the SCHED_GROUP_P block). */
8c660648 7162 while (SCHED_GROUP_P (insn))
326ee7a3
JL
7163 {
7164 rtx temp = prev_nonnote_insn (insn);
7165 add_dependence (insn, temp, REG_DEP_ANTI);
7166 insn = temp;
7167 }
8c660648
JL
7168 }
7169
7170 /* Don't overrun the bounds of the basic block. */
7171 if (insn == head)
7172 break;
7173
7174 insn = PREV_INSN (insn);
7175 }
7176
7177 /* make sure these insns are scheduled last in their block */
7178 insn = last;
7179 if (insn != 0)
7180 while (insn != head)
7181 {
7182 insn = prev_nonnote_insn (insn);
7183
7184 if (INSN_REF_COUNT (insn) != 0)
7185 continue;
7186
7187 if (!find_insn_list (last, LOG_LINKS (insn)))
7188 add_dependence (last, insn, REG_DEP_ANTI);
7189 INSN_REF_COUNT (insn) = 1;
7190
7191 /* Skip over insns that are part of a group. */
7192 while (SCHED_GROUP_P (insn))
7193 insn = prev_nonnote_insn (insn);
7194 }
7195}
7196
7197/* Compute bacward dependences inside BB. In a multiple blocks region:
7198 (1) a bb is analyzed after its predecessors, and (2) the lists in
7199 effect at the end of bb (after analyzing for bb) are inherited by
7200 bb's successrs.
7201
7202 Specifically for reg-reg data dependences, the block insns are
7203 scanned by sched_analyze () top-to-bottom. Two lists are
7204 naintained by sched_analyze (): reg_last_defs[] for register DEFs,
7205 and reg_last_uses[] for register USEs.
7206
7207 When analysis is completed for bb, we update for its successors:
7208 ; - DEFS[succ] = Union (DEFS [succ], DEFS [bb])
7209 ; - USES[succ] = Union (USES [succ], DEFS [bb])
7210
7211 The mechanism for computing mem-mem data dependence is very
7212 similar, and the result is interblock dependences in the region. */
7213
7214static void
7215compute_block_backward_dependences (bb)
7216 int bb;
7217{
7218 int b;
7219 rtx x;
7220 rtx head, tail;
7221 int max_reg = max_reg_num ();
7222
7223 b = BB_TO_BLOCK (bb);
7224
7225 if (current_nr_blocks == 1)
7226 {
7227 reg_last_uses = (rtx *) alloca (max_reg * sizeof (rtx));
7228 reg_last_sets = (rtx *) alloca (max_reg * sizeof (rtx));
7229
7230 bzero ((char *) reg_last_uses, max_reg * sizeof (rtx));
7231 bzero ((char *) reg_last_sets, max_reg * sizeof (rtx));
7232
7233 pending_read_insns = 0;
7234 pending_read_mems = 0;
7235 pending_write_insns = 0;
7236 pending_write_mems = 0;
7237 pending_lists_length = 0;
7238 last_function_call = 0;
7239 last_pending_memory_flush = 0;
7240 sched_before_next_call
38a448ca
RH
7241 = gen_rtx_INSN (VOIDmode, 0, NULL_RTX, NULL_RTX,
7242 NULL_RTX, 0, NULL_RTX, NULL_RTX);
8c660648
JL
7243 LOG_LINKS (sched_before_next_call) = 0;
7244 }
7245 else
7246 {
7247 reg_last_uses = bb_reg_last_uses[bb];
7248 reg_last_sets = bb_reg_last_sets[bb];
7249
7250 pending_read_insns = bb_pending_read_insns[bb];
7251 pending_read_mems = bb_pending_read_mems[bb];
7252 pending_write_insns = bb_pending_write_insns[bb];
7253 pending_write_mems = bb_pending_write_mems[bb];
7254 pending_lists_length = bb_pending_lists_length[bb];
7255 last_function_call = bb_last_function_call[bb];
7256 last_pending_memory_flush = bb_last_pending_memory_flush[bb];
7257
7258 sched_before_next_call = bb_sched_before_next_call[bb];
7259 }
7260
7261 /* do the analysis for this block */
7262 get_block_head_tail (bb, &head, &tail);
7263 sched_analyze (head, tail);
7264 add_branch_dependences (head, tail);
7265
7266 if (current_nr_blocks > 1)
7267 {
7268 int e, first_edge;
7269 int b_succ, bb_succ;
7270 int reg;
7271 rtx link_insn, link_mem;
7272 rtx u;
7273
7274 /* these lists should point to the right place, for correct freeing later. */
7275 bb_pending_read_insns[bb] = pending_read_insns;
7276 bb_pending_read_mems[bb] = pending_read_mems;
7277 bb_pending_write_insns[bb] = pending_write_insns;
7278 bb_pending_write_mems[bb] = pending_write_mems;
7279
7280 /* bb's structures are inherited by it's successors */
7281 first_edge = e = OUT_EDGES (b);
7282 if (e > 0)
7283 do
7284 {
7285 b_succ = TO_BLOCK (e);
7286 bb_succ = BLOCK_TO_BB (b_succ);
7287
7288 /* only bbs "below" bb, in the same region, are interesting */
7289 if (CONTAINING_RGN (b) != CONTAINING_RGN (b_succ)
7290 || bb_succ <= bb)
7291 {
7292 e = NEXT_OUT (e);
7293 continue;
7294 }
7295
7296 for (reg = 0; reg < max_reg; reg++)
7297 {
7298
7299 /* reg-last-uses lists are inherited by bb_succ */
7300 for (u = reg_last_uses[reg]; u; u = XEXP (u, 1))
7301 {
7302 if (find_insn_list (XEXP (u, 0), (bb_reg_last_uses[bb_succ])[reg]))
7303 continue;
7304
7305 (bb_reg_last_uses[bb_succ])[reg]
ebb7b10b
RH
7306 = alloc_INSN_LIST (XEXP (u, 0),
7307 (bb_reg_last_uses[bb_succ])[reg]);
8c660648
JL
7308 }
7309
7310 /* reg-last-defs lists are inherited by bb_succ */
7311 for (u = reg_last_sets[reg]; u; u = XEXP (u, 1))
7312 {
7313 if (find_insn_list (XEXP (u, 0), (bb_reg_last_sets[bb_succ])[reg]))
7314 continue;
7315
7316 (bb_reg_last_sets[bb_succ])[reg]
ebb7b10b
RH
7317 = alloc_INSN_LIST (XEXP (u, 0),
7318 (bb_reg_last_sets[bb_succ])[reg]);
8c660648
JL
7319 }
7320 }
7321
7322 /* mem read/write lists are inherited by bb_succ */
7323 link_insn = pending_read_insns;
7324 link_mem = pending_read_mems;
7325 while (link_insn)
7326 {
7327 if (!(find_insn_mem_list (XEXP (link_insn, 0), XEXP (link_mem, 0),
7328 bb_pending_read_insns[bb_succ],
7329 bb_pending_read_mems[bb_succ])))
7330 add_insn_mem_dependence (&bb_pending_read_insns[bb_succ],
7331 &bb_pending_read_mems[bb_succ],
7332 XEXP (link_insn, 0), XEXP (link_mem, 0));
7333 link_insn = XEXP (link_insn, 1);
7334 link_mem = XEXP (link_mem, 1);
7335 }
7336
7337 link_insn = pending_write_insns;
7338 link_mem = pending_write_mems;
7339 while (link_insn)
7340 {
7341 if (!(find_insn_mem_list (XEXP (link_insn, 0), XEXP (link_mem, 0),
7342 bb_pending_write_insns[bb_succ],
7343 bb_pending_write_mems[bb_succ])))
7344 add_insn_mem_dependence (&bb_pending_write_insns[bb_succ],
7345 &bb_pending_write_mems[bb_succ],
7346 XEXP (link_insn, 0), XEXP (link_mem, 0));
7347
7348 link_insn = XEXP (link_insn, 1);
7349 link_mem = XEXP (link_mem, 1);
7350 }
7351
7352 /* last_function_call is inherited by bb_succ */
7353 for (u = last_function_call; u; u = XEXP (u, 1))
7354 {
7355 if (find_insn_list (XEXP (u, 0), bb_last_function_call[bb_succ]))
7356 continue;
7357
7358 bb_last_function_call[bb_succ]
ebb7b10b
RH
7359 = alloc_INSN_LIST (XEXP (u, 0),
7360 bb_last_function_call[bb_succ]);
8c660648
JL
7361 }
7362
7363 /* last_pending_memory_flush is inherited by bb_succ */
7364 for (u = last_pending_memory_flush; u; u = XEXP (u, 1))
7365 {
7366 if (find_insn_list (XEXP (u, 0), bb_last_pending_memory_flush[bb_succ]))
7367 continue;
7368
7369 bb_last_pending_memory_flush[bb_succ]
ebb7b10b
RH
7370 = alloc_INSN_LIST (XEXP (u, 0),
7371 bb_last_pending_memory_flush[bb_succ]);
8c660648
JL
7372 }
7373
7374 /* sched_before_next_call is inherited by bb_succ */
7375 x = LOG_LINKS (sched_before_next_call);
7376 for (; x; x = XEXP (x, 1))
7377 add_dependence (bb_sched_before_next_call[bb_succ],
7378 XEXP (x, 0), REG_DEP_ANTI);
7379
7380 e = NEXT_OUT (e);
7381 }
7382 while (e != first_edge);
7383 }
ebb7b10b 7384
7eea6443
JL
7385 /* Free up the INSN_LISTs
7386
7387 Note this loop is executed max_reg * nr_regions times. It's first
7388 implementation accounted for over 90% of the calls to free_list.
7389 The list was empty for the vast majority of those calls. On the PA,
7390 not calling free_list in those cases improves -O2 compile times by
7391 3-5% on average. */
ebb7b10b
RH
7392 for (b = 0; b < max_reg; ++b)
7393 {
7eea6443
JL
7394 if (reg_last_sets[b])
7395 free_list (&reg_last_sets[b], &unused_insn_list);
7396 if (reg_last_uses[b])
7397 free_list (&reg_last_uses[b], &unused_insn_list);
ebb7b10b
RH
7398 }
7399
7400 /* Assert that we won't need bb_reg_last_* for this block anymore. */
7401 if (current_nr_blocks > 1)
7402 {
7403 bb_reg_last_uses[bb] = (rtx *) NULL_RTX;
7404 bb_reg_last_sets[bb] = (rtx *) NULL_RTX;
7405 }
8c660648
JL
7406}
7407
7408/* Print dependences for debugging, callable from debugger */
7409
7410void
7411debug_dependencies ()
7412{
7413 int bb;
7414
7415 fprintf (dump, ";; --------------- forward dependences: ------------ \n");
7416 for (bb = 0; bb < current_nr_blocks; bb++)
7417 {
7418 if (1)
7419 {
7420 rtx head, tail;
7421 rtx next_tail;
7422 rtx insn;
7423
7424 get_block_head_tail (bb, &head, &tail);
7425 next_tail = NEXT_INSN (tail);
7426 fprintf (dump, "\n;; --- Region Dependences --- b %d bb %d \n",
7427 BB_TO_BLOCK (bb), bb);
7428
7429 fprintf (dump, ";; %7s%6s%6s%6s%6s%6s%11s%6s\n",
7430 "insn", "code", "bb", "dep", "prio", "cost", "blockage", "units");
7431 fprintf (dump, ";; %7s%6s%6s%6s%6s%6s%11s%6s\n",
7432 "----", "----", "--", "---", "----", "----", "--------", "-----");
7433 for (insn = head; insn != next_tail; insn = NEXT_INSN (insn))
7434 {
7435 rtx link;
7436 int unit, range;
7437
7438 if (GET_RTX_CLASS (GET_CODE (insn)) != 'i')
7439 {
7440 int n;
7441 fprintf (dump, ";; %6d ", INSN_UID (insn));
7442 if (GET_CODE (insn) == NOTE)
ebc25a17
MM
7443 {
7444 n = NOTE_LINE_NUMBER (insn);
7445 if (n < 0)
7446 fprintf (dump, "%s\n", GET_NOTE_INSN_NAME (n));
7447 else
7448 fprintf (dump, "line %d, file %s\n", n,
7449 NOTE_SOURCE_FILE (insn));
7450 }
7451 else
4f64eaca 7452 fprintf (dump, " {%s}\n", GET_RTX_NAME (GET_CODE (insn)));
8c660648
JL
7453 continue;
7454 }
7455
7456 unit = insn_unit (insn);
7457 range = (unit < 0
7458 || function_units[unit].blockage_range_function == 0) ? 0 :
7459 function_units[unit].blockage_range_function (insn);
7460 fprintf (dump,
7461 ";; %s%5d%6d%6d%6d%6d%6d %3d -%3d ",
7462 (SCHED_GROUP_P (insn) ? "+" : " "),
7463 INSN_UID (insn),
7464 INSN_CODE (insn),
7465 INSN_BB (insn),
7466 INSN_DEP_COUNT (insn),
7467 INSN_PRIORITY (insn),
7468 insn_cost (insn, 0, 0),
7469 (int) MIN_BLOCKAGE_COST (range),
7470 (int) MAX_BLOCKAGE_COST (range));
7471 insn_print_units (insn);
7472 fprintf (dump, "\t: ");
7473 for (link = INSN_DEPEND (insn); link; link = XEXP (link, 1))
7474 fprintf (dump, "%d ", INSN_UID (XEXP (link, 0)));
7475 fprintf (dump, "\n");
7476 }
7477 }
7478 }
7479 fprintf (dump, "\n");
7480}
7481
7482/* Set_priorities: compute priority of each insn in the block */
7483
7484static int
7485set_priorities (bb)
7486 int bb;
7487{
7488 rtx insn;
7489 int n_insn;
7490
7491 rtx tail;
7492 rtx prev_head;
7493 rtx head;
7494
7495 get_block_head_tail (bb, &head, &tail);
7496 prev_head = PREV_INSN (head);
7497
7498 if (head == tail
7499 && (GET_RTX_CLASS (GET_CODE (head)) != 'i'))
7500 return 0;
7501
7502 n_insn = 0;
7503 for (insn = tail; insn != prev_head; insn = PREV_INSN (insn))
7504 {
7505
7506 if (GET_CODE (insn) == NOTE)
7507 continue;
7508
7509 if (!(SCHED_GROUP_P (insn)))
7510 n_insn++;
7511 (void) priority (insn);
7512 }
7513
7514 return n_insn;
7515}
7516
7517/* Make each element of VECTOR point at an rtx-vector,
7518 taking the space for all those rtx-vectors from SPACE.
7519 SPACE is of type (rtx *), but it is really as long as NELTS rtx-vectors.
7520 BYTES_PER_ELT is the number of bytes in one rtx-vector.
7521 (this is the same as init_regset_vector () in flow.c) */
7522
7523static void
7524init_rtx_vector (vector, space, nelts, bytes_per_elt)
7525 rtx **vector;
7526 rtx *space;
7527 int nelts;
7528 int bytes_per_elt;
7529{
7530 register int i;
7531 register rtx *p = space;
7532
7533 for (i = 0; i < nelts; i++)
7534 {
7535 vector[i] = p;
7536 p += bytes_per_elt / sizeof (*p);
7537 }
7538}
7539
7540/* Schedule a region. A region is either an inner loop, a loop-free
7541 subroutine, or a single basic block. Each bb in the region is
7542 scheduled after its flow predecessors. */
7543
7544static void
7545schedule_region (rgn)
7546 int rgn;
7547{
7548 int bb;
7549 int rgn_n_insns = 0;
7550 int sched_rgn_n_insns = 0;
7551
7552 /* set variables for the current region */
7553 current_nr_blocks = RGN_NR_BLOCKS (rgn);
7554 current_blocks = RGN_BLOCKS (rgn);
7555
7556 reg_pending_sets = ALLOCA_REG_SET ();
7557 reg_pending_sets_all = 0;
7558
7559 /* initializations for region data dependence analyisis */
7560 if (current_nr_blocks > 1)
7561 {
7562 rtx *space;
7563 int maxreg = max_reg_num ();
7564
7565 bb_reg_last_uses = (rtx **) alloca (current_nr_blocks * sizeof (rtx *));
7566 space = (rtx *) alloca (current_nr_blocks * maxreg * sizeof (rtx));
7567 bzero ((char *) space, current_nr_blocks * maxreg * sizeof (rtx));
7568 init_rtx_vector (bb_reg_last_uses, space, current_nr_blocks, maxreg * sizeof (rtx *));
7569
7570 bb_reg_last_sets = (rtx **) alloca (current_nr_blocks * sizeof (rtx *));
7571 space = (rtx *) alloca (current_nr_blocks * maxreg * sizeof (rtx));
7572 bzero ((char *) space, current_nr_blocks * maxreg * sizeof (rtx));
7573 init_rtx_vector (bb_reg_last_sets, space, current_nr_blocks, maxreg * sizeof (rtx *));
7574
7575 bb_pending_read_insns = (rtx *) alloca (current_nr_blocks * sizeof (rtx));
7576 bb_pending_read_mems = (rtx *) alloca (current_nr_blocks * sizeof (rtx));
7577 bb_pending_write_insns = (rtx *) alloca (current_nr_blocks * sizeof (rtx));
7578 bb_pending_write_mems = (rtx *) alloca (current_nr_blocks * sizeof (rtx));
7579 bb_pending_lists_length = (int *) alloca (current_nr_blocks * sizeof (int));
7580 bb_last_pending_memory_flush = (rtx *) alloca (current_nr_blocks * sizeof (rtx));
7581 bb_last_function_call = (rtx *) alloca (current_nr_blocks * sizeof (rtx));
7582 bb_sched_before_next_call = (rtx *) alloca (current_nr_blocks * sizeof (rtx));
7583
7584 init_rgn_data_dependences (current_nr_blocks);
7585 }
7586
7587 /* compute LOG_LINKS */
7588 for (bb = 0; bb < current_nr_blocks; bb++)
7589 compute_block_backward_dependences (bb);
7590
7591 /* compute INSN_DEPEND */
7592 for (bb = current_nr_blocks - 1; bb >= 0; bb--)
7593 compute_block_forward_dependences (bb);
7594
7595 /* Delete line notes, compute live-regs at block end, and set priorities. */
7596 dead_notes = 0;
7597 for (bb = 0; bb < current_nr_blocks; bb++)
7598 {
7599 if (reload_completed == 0)
7600 find_pre_sched_live (bb);
7601
7602 if (write_symbols != NO_DEBUG)
7603 {
7604 save_line_notes (bb);
7605 rm_line_notes (bb);
7606 }
7607
7608 rgn_n_insns += set_priorities (bb);
7609 }
7610
7611 /* compute interblock info: probabilities, split-edges, dominators, etc. */
7612 if (current_nr_blocks > 1)
7613 {
7614 int i;
7615
7616 prob = (float *) alloca ((current_nr_blocks) * sizeof (float));
7617
7618 bbset_size = current_nr_blocks / HOST_BITS_PER_WIDE_INT + 1;
7619 dom = (bbset *) alloca (current_nr_blocks * sizeof (bbset));
7620 for (i = 0; i < current_nr_blocks; i++)
7621 {
7622 dom[i] = (bbset) alloca (bbset_size * sizeof (HOST_WIDE_INT));
7623 bzero ((char *) dom[i], bbset_size * sizeof (HOST_WIDE_INT));
7624 }
7625
7626 /* edge to bit */
7627 rgn_nr_edges = 0;
7628 edge_to_bit = (int *) alloca (nr_edges * sizeof (int));
7629 for (i = 1; i < nr_edges; i++)
7630 if (CONTAINING_RGN (FROM_BLOCK (i)) == rgn)
7631 EDGE_TO_BIT (i) = rgn_nr_edges++;
7632 rgn_edges = (int *) alloca (rgn_nr_edges * sizeof (int));
7633
7634 rgn_nr_edges = 0;
7635 for (i = 1; i < nr_edges; i++)
7636 if (CONTAINING_RGN (FROM_BLOCK (i)) == (rgn))
7637 rgn_edges[rgn_nr_edges++] = i;
7638
7639 /* split edges */
7640 edgeset_size = rgn_nr_edges / HOST_BITS_PER_WIDE_INT + 1;
7641 pot_split = (edgeset *) alloca (current_nr_blocks * sizeof (edgeset));
7642 ancestor_edges = (edgeset *) alloca (current_nr_blocks * sizeof (edgeset));
7643 for (i = 0; i < current_nr_blocks; i++)
7644 {
7645 pot_split[i] =
7646 (edgeset) alloca (edgeset_size * sizeof (HOST_WIDE_INT));
7647 bzero ((char *) pot_split[i],
7648 edgeset_size * sizeof (HOST_WIDE_INT));
7649 ancestor_edges[i] =
7650 (edgeset) alloca (edgeset_size * sizeof (HOST_WIDE_INT));
7651 bzero ((char *) ancestor_edges[i],
7652 edgeset_size * sizeof (HOST_WIDE_INT));
7653 }
7654
7655 /* compute probabilities, dominators, split_edges */
7656 for (bb = 0; bb < current_nr_blocks; bb++)
7657 compute_dom_prob_ps (bb);
7658 }
7659
7660 /* now we can schedule all blocks */
7661 for (bb = 0; bb < current_nr_blocks; bb++)
7662 {
5835e573 7663 sched_rgn_n_insns += schedule_block (bb, rgn_n_insns);
8c660648
JL
7664
7665#ifdef USE_C_ALLOCA
7666 alloca (0);
7667#endif
7668 }
7669
cc132865
JL
7670 /* sanity check: verify that all region insns were scheduled */
7671 if (sched_rgn_n_insns != rgn_n_insns)
7672 abort ();
8c660648
JL
7673
7674 /* update register life and usage information */
7675 if (reload_completed == 0)
7676 {
7677 for (bb = current_nr_blocks - 1; bb >= 0; bb--)
7678 find_post_sched_live (bb);
7679
7680 if (current_nr_blocks <= 1)
7681 /* Sanity check. There should be no REG_DEAD notes leftover at the end.
7682 In practice, this can occur as the result of bugs in flow, combine.c,
7683 and/or sched.c. The values of the REG_DEAD notes remaining are
7684 meaningless, because dead_notes is just used as a free list. */
7685 if (dead_notes != 0)
7686 abort ();
7687 }
7688
7689 /* restore line notes. */
7690 if (write_symbols != NO_DEBUG)
7691 {
7692 for (bb = 0; bb < current_nr_blocks; bb++)
7693 restore_line_notes (bb);
7694 }
7695
7696 /* Done with this region */
7697 free_pending_lists ();
f187056f
JL
7698
7699 FREE_REG_SET (reg_pending_sets);
8c660648
JL
7700}
7701
7702/* Subroutine of split_hard_reg_notes. Searches X for any reference to
7703 REGNO, returning the rtx of the reference found if any. Otherwise,
7704 returns 0. */
7705
7706static rtx
7707regno_use_in (regno, x)
7708 int regno;
7709 rtx x;
7710{
7711 register char *fmt;
7712 int i, j;
7713 rtx tem;
7714
7715 if (GET_CODE (x) == REG && REGNO (x) == regno)
7716 return x;
7717
7718 fmt = GET_RTX_FORMAT (GET_CODE (x));
7719 for (i = GET_RTX_LENGTH (GET_CODE (x)) - 1; i >= 0; i--)
7720 {
7721 if (fmt[i] == 'e')
7722 {
7723 if ((tem = regno_use_in (regno, XEXP (x, i))))
7724 return tem;
7725 }
7726 else if (fmt[i] == 'E')
7727 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
7728 if ((tem = regno_use_in (regno, XVECEXP (x, i, j))))
7729 return tem;
7730 }
7731
7732 return 0;
7733}
7734
7735/* Subroutine of update_flow_info. Determines whether any new REG_NOTEs are
7736 needed for the hard register mentioned in the note. This can happen
7737 if the reference to the hard register in the original insn was split into
7738 several smaller hard register references in the split insns. */
7739
7740static void
5835e573
KG
7741split_hard_reg_notes (note, first, last)
7742 rtx note, first, last;
8c660648
JL
7743{
7744 rtx reg, temp, link;
7745 int n_regs, i, new_reg;
7746 rtx insn;
7747
7748 /* Assume that this is a REG_DEAD note. */
7749 if (REG_NOTE_KIND (note) != REG_DEAD)
7750 abort ();
7751
7752 reg = XEXP (note, 0);
7753
7754 n_regs = HARD_REGNO_NREGS (REGNO (reg), GET_MODE (reg));
7755
7756 for (i = 0; i < n_regs; i++)
7757 {
7758 new_reg = REGNO (reg) + i;
7759
7760 /* Check for references to new_reg in the split insns. */
7761 for (insn = last;; insn = PREV_INSN (insn))
7762 {
7763 if (GET_RTX_CLASS (GET_CODE (insn)) == 'i'
7764 && (temp = regno_use_in (new_reg, PATTERN (insn))))
7765 {
7766 /* Create a new reg dead note ere. */
ebb7b10b 7767 link = alloc_EXPR_LIST (REG_DEAD, temp, REG_NOTES (insn));
8c660648
JL
7768 REG_NOTES (insn) = link;
7769
7770 /* If killed multiple registers here, then add in the excess. */
7771 i += HARD_REGNO_NREGS (REGNO (temp), GET_MODE (temp)) - 1;
7772
7773 break;
7774 }
7775 /* It isn't mentioned anywhere, so no new reg note is needed for
7776 this register. */
7777 if (insn == first)
7778 break;
7779 }
7780 }
7781}
7782
7783/* Subroutine of update_flow_info. Determines whether a SET or CLOBBER in an
7784 insn created by splitting needs a REG_DEAD or REG_UNUSED note added. */
7785
7786static void
7787new_insn_dead_notes (pat, insn, last, orig_insn)
7788 rtx pat, insn, last, orig_insn;
7789{
7790 rtx dest, tem, set;
7791
7792 /* PAT is either a CLOBBER or a SET here. */
7793 dest = XEXP (pat, 0);
7794
7795 while (GET_CODE (dest) == ZERO_EXTRACT || GET_CODE (dest) == SUBREG
7796 || GET_CODE (dest) == STRICT_LOW_PART
7797 || GET_CODE (dest) == SIGN_EXTRACT)
7798 dest = XEXP (dest, 0);
7799
7800 if (GET_CODE (dest) == REG)
7801 {
93da030f
R
7802 /* If the original insn already used this register, we may not add new
7803 notes for it. One example for a split that needs this test is
7804 when a multi-word memory access with register-indirect addressing
7805 is split into multiple memory accesses with auto-increment and
7806 one adjusting add instruction for the address register. */
7807 if (reg_referenced_p (dest, PATTERN (orig_insn)))
7808 return;
8c660648
JL
7809 for (tem = last; tem != insn; tem = PREV_INSN (tem))
7810 {
7811 if (GET_RTX_CLASS (GET_CODE (tem)) == 'i'
7812 && reg_overlap_mentioned_p (dest, PATTERN (tem))
7813 && (set = single_set (tem)))
7814 {
7815 rtx tem_dest = SET_DEST (set);
7816
7817 while (GET_CODE (tem_dest) == ZERO_EXTRACT
7818 || GET_CODE (tem_dest) == SUBREG
7819 || GET_CODE (tem_dest) == STRICT_LOW_PART
7820 || GET_CODE (tem_dest) == SIGN_EXTRACT)
7821 tem_dest = XEXP (tem_dest, 0);
7822
7823 if (!rtx_equal_p (tem_dest, dest))
7824 {
7825 /* Use the same scheme as combine.c, don't put both REG_DEAD
7826 and REG_UNUSED notes on the same insn. */
7827 if (!find_regno_note (tem, REG_UNUSED, REGNO (dest))
7828 && !find_regno_note (tem, REG_DEAD, REGNO (dest)))
7829 {
ebb7b10b
RH
7830 rtx note = alloc_EXPR_LIST (REG_DEAD, dest,
7831 REG_NOTES (tem));
8c660648
JL
7832 REG_NOTES (tem) = note;
7833 }
7834 /* The reg only dies in one insn, the last one that uses
7835 it. */
7836 break;
7837 }
7838 else if (reg_overlap_mentioned_p (dest, SET_SRC (set)))
7839 /* We found an instruction that both uses the register,
7840 and sets it, so no new REG_NOTE is needed for this set. */
7841 break;
7842 }
7843 }
7844 /* If this is a set, it must die somewhere, unless it is the dest of
7845 the original insn, and hence is live after the original insn. Abort
7846 if it isn't supposed to be live after the original insn.
7847
7848 If this is a clobber, then just add a REG_UNUSED note. */
7849 if (tem == insn)
7850 {
7851 int live_after_orig_insn = 0;
7852 rtx pattern = PATTERN (orig_insn);
7853 int i;
7854
7855 if (GET_CODE (pat) == CLOBBER)
7856 {
ebb7b10b 7857 rtx note = alloc_EXPR_LIST (REG_UNUSED, dest, REG_NOTES (insn));
8c660648
JL
7858 REG_NOTES (insn) = note;
7859 return;
7860 }
7861
7862 /* The original insn could have multiple sets, so search the
7863 insn for all sets. */
7864 if (GET_CODE (pattern) == SET)
7865 {
7866 if (reg_overlap_mentioned_p (dest, SET_DEST (pattern)))
7867 live_after_orig_insn = 1;
7868 }
7869 else if (GET_CODE (pattern) == PARALLEL)
7870 {
7871 for (i = 0; i < XVECLEN (pattern, 0); i++)
7872 if (GET_CODE (XVECEXP (pattern, 0, i)) == SET
7873 && reg_overlap_mentioned_p (dest,
7874 SET_DEST (XVECEXP (pattern,
7875 0, i))))
7876 live_after_orig_insn = 1;
7877 }
7878
7879 if (!live_after_orig_insn)
7880 abort ();
7881 }
7882 }
7883}
7884
7885/* Subroutine of update_flow_info. Update the value of reg_n_sets for all
7886 registers modified by X. INC is -1 if the containing insn is being deleted,
7887 and is 1 if the containing insn is a newly generated insn. */
7888
7889static void
7890update_n_sets (x, inc)
7891 rtx x;
7892 int inc;
7893{
7894 rtx dest = SET_DEST (x);
7895
7896 while (GET_CODE (dest) == STRICT_LOW_PART || GET_CODE (dest) == SUBREG
7897 || GET_CODE (dest) == ZERO_EXTRACT || GET_CODE (dest) == SIGN_EXTRACT)
7898 dest = SUBREG_REG (dest);
7899
7900 if (GET_CODE (dest) == REG)
7901 {
7902 int regno = REGNO (dest);
7903
7904 if (regno < FIRST_PSEUDO_REGISTER)
7905 {
7906 register int i;
7907 int endregno = regno + HARD_REGNO_NREGS (regno, GET_MODE (dest));
7908
7909 for (i = regno; i < endregno; i++)
7910 REG_N_SETS (i) += inc;
7911 }
7912 else
7913 REG_N_SETS (regno) += inc;
7914 }
7915}
7916
7917/* Updates all flow-analysis related quantities (including REG_NOTES) for
7918 the insns from FIRST to LAST inclusive that were created by splitting
7919 ORIG_INSN. NOTES are the original REG_NOTES. */
7920
7921static void
7922update_flow_info (notes, first, last, orig_insn)
7923 rtx notes;
7924 rtx first, last;
7925 rtx orig_insn;
7926{
7927 rtx insn, note;
7928 rtx next;
7929 rtx orig_dest, temp;
7930 rtx set;
7931
7932 /* Get and save the destination set by the original insn. */
7933
7934 orig_dest = single_set (orig_insn);
7935 if (orig_dest)
7936 orig_dest = SET_DEST (orig_dest);
7937
7938 /* Move REG_NOTES from the original insn to where they now belong. */
7939
7940 for (note = notes; note; note = next)
7941 {
7942 next = XEXP (note, 1);
7943 switch (REG_NOTE_KIND (note))
7944 {
7945 case REG_DEAD:
7946 case REG_UNUSED:
7947 /* Move these notes from the original insn to the last new insn where
7948 the register is now set. */
7949
7950 for (insn = last;; insn = PREV_INSN (insn))
7951 {
7952 if (GET_RTX_CLASS (GET_CODE (insn)) == 'i'
7953 && reg_mentioned_p (XEXP (note, 0), PATTERN (insn)))
7954 {
7955 /* If this note refers to a multiple word hard register, it
7956 may have been split into several smaller hard register
7957 references, so handle it specially. */
7958 temp = XEXP (note, 0);
7959 if (REG_NOTE_KIND (note) == REG_DEAD
7960 && GET_CODE (temp) == REG
7961 && REGNO (temp) < FIRST_PSEUDO_REGISTER
7962 && HARD_REGNO_NREGS (REGNO (temp), GET_MODE (temp)) > 1)
5835e573 7963 split_hard_reg_notes (note, first, last);
8c660648
JL
7964 else
7965 {
7966 XEXP (note, 1) = REG_NOTES (insn);
7967 REG_NOTES (insn) = note;
7968 }
7969
7970 /* Sometimes need to convert REG_UNUSED notes to REG_DEAD
7971 notes. */
7972 /* ??? This won't handle multiple word registers correctly,
7973 but should be good enough for now. */
7974 if (REG_NOTE_KIND (note) == REG_UNUSED
272299b9 7975 && GET_CODE (XEXP (note, 0)) != SCRATCH
8c660648
JL
7976 && !dead_or_set_p (insn, XEXP (note, 0)))
7977 PUT_REG_NOTE_KIND (note, REG_DEAD);
7978
7979 /* The reg only dies in one insn, the last one that uses
7980 it. */
7981 break;
7982 }
7983 /* It must die somewhere, fail it we couldn't find where it died.
7984
7985 If this is a REG_UNUSED note, then it must be a temporary
7986 register that was not needed by this instantiation of the
7987 pattern, so we can safely ignore it. */
7988 if (insn == first)
6764d250 7989 {
8c660648
JL
7990 if (REG_NOTE_KIND (note) != REG_UNUSED)
7991 abort ();
7992
7993 break;
7994 }
7995 }
7996 break;
7997
7998 case REG_WAS_0:
fcdc0d6e
R
7999 /* If the insn that set the register to 0 was deleted, this
8000 note cannot be relied on any longer. The destination might
8001 even have been moved to memory.
8002 This was observed for SH4 with execute/920501-6.c compilation,
8003 -O2 -fomit-frame-pointer -finline-functions . */
8004 if (GET_CODE (XEXP (note, 0)) == NOTE
8005 || INSN_DELETED_P (XEXP (note, 0)))
8006 break;
8c660648
JL
8007 /* This note applies to the dest of the original insn. Find the
8008 first new insn that now has the same dest, and move the note
8009 there. */
8010
8011 if (!orig_dest)
8012 abort ();
8013
8014 for (insn = first;; insn = NEXT_INSN (insn))
8015 {
8016 if (GET_RTX_CLASS (GET_CODE (insn)) == 'i'
8017 && (temp = single_set (insn))
8018 && rtx_equal_p (SET_DEST (temp), orig_dest))
8019 {
8020 XEXP (note, 1) = REG_NOTES (insn);
8021 REG_NOTES (insn) = note;
8022 /* The reg is only zero before one insn, the first that
8023 uses it. */
8024 break;
8025 }
8026 /* If this note refers to a multiple word hard
8027 register, it may have been split into several smaller
8028 hard register references. We could split the notes,
8029 but simply dropping them is good enough. */
8030 if (GET_CODE (orig_dest) == REG
8031 && REGNO (orig_dest) < FIRST_PSEUDO_REGISTER
8032 && HARD_REGNO_NREGS (REGNO (orig_dest),
8033 GET_MODE (orig_dest)) > 1)
8034 break;
8035 /* It must be set somewhere, fail if we couldn't find where it
8036 was set. */
8037 if (insn == last)
8038 abort ();
8039 }
8040 break;
8041
8042 case REG_EQUAL:
8043 case REG_EQUIV:
8044 /* A REG_EQUIV or REG_EQUAL note on an insn with more than one
8045 set is meaningless. Just drop the note. */
8046 if (!orig_dest)
8047 break;
8048
8049 case REG_NO_CONFLICT:
8050 /* These notes apply to the dest of the original insn. Find the last
8051 new insn that now has the same dest, and move the note there. */
8052
8053 if (!orig_dest)
8054 abort ();
8055
8056 for (insn = last;; insn = PREV_INSN (insn))
8057 {
8058 if (GET_RTX_CLASS (GET_CODE (insn)) == 'i'
8059 && (temp = single_set (insn))
8060 && rtx_equal_p (SET_DEST (temp), orig_dest))
8061 {
8062 XEXP (note, 1) = REG_NOTES (insn);
8063 REG_NOTES (insn) = note;
8064 /* Only put this note on one of the new insns. */
8065 break;
8066 }
8067
8068 /* The original dest must still be set someplace. Abort if we
8069 couldn't find it. */
8070 if (insn == first)
8071 {
8072 /* However, if this note refers to a multiple word hard
8073 register, it may have been split into several smaller
8074 hard register references. We could split the notes,
8075 but simply dropping them is good enough. */
8076 if (GET_CODE (orig_dest) == REG
8077 && REGNO (orig_dest) < FIRST_PSEUDO_REGISTER
8078 && HARD_REGNO_NREGS (REGNO (orig_dest),
8079 GET_MODE (orig_dest)) > 1)
8080 break;
8081 /* Likewise for multi-word memory references. */
8082 if (GET_CODE (orig_dest) == MEM
9ae4ec46 8083 && SIZE_FOR_MODE (orig_dest) > UNITS_PER_WORD)
8c660648
JL
8084 break;
8085 abort ();
8086 }
8087 }
8088 break;
8089
8090 case REG_LIBCALL:
8091 /* Move a REG_LIBCALL note to the first insn created, and update
8092 the corresponding REG_RETVAL note. */
8093 XEXP (note, 1) = REG_NOTES (first);
8094 REG_NOTES (first) = note;
8095
8096 insn = XEXP (note, 0);
8097 note = find_reg_note (insn, REG_RETVAL, NULL_RTX);
8098 if (note)
8099 XEXP (note, 0) = first;
8100 break;
8101
8102 case REG_EXEC_COUNT:
8103 /* Move a REG_EXEC_COUNT note to the first insn created. */
8104 XEXP (note, 1) = REG_NOTES (first);
8105 REG_NOTES (first) = note;
8106 break;
8107
8108 case REG_RETVAL:
8109 /* Move a REG_RETVAL note to the last insn created, and update
8110 the corresponding REG_LIBCALL note. */
8111 XEXP (note, 1) = REG_NOTES (last);
8112 REG_NOTES (last) = note;
8113
8114 insn = XEXP (note, 0);
8115 note = find_reg_note (insn, REG_LIBCALL, NULL_RTX);
8116 if (note)
8117 XEXP (note, 0) = last;
8118 break;
8119
8120 case REG_NONNEG:
8121 case REG_BR_PROB:
8122 /* This should be moved to whichever instruction is a JUMP_INSN. */
8123
8124 for (insn = last;; insn = PREV_INSN (insn))
8125 {
8126 if (GET_CODE (insn) == JUMP_INSN)
8127 {
8128 XEXP (note, 1) = REG_NOTES (insn);
8129 REG_NOTES (insn) = note;
8130 /* Only put this note on one of the new insns. */
8131 break;
8132 }
8133 /* Fail if we couldn't find a JUMP_INSN. */
8134 if (insn == first)
8135 abort ();
8136 }
8137 break;
8138
8139 case REG_INC:
8140 /* reload sometimes leaves obsolete REG_INC notes around. */
8141 if (reload_completed)
8142 break;
8143 /* This should be moved to whichever instruction now has the
8144 increment operation. */
8145 abort ();
8146
8147 case REG_LABEL:
8148 /* Should be moved to the new insn(s) which use the label. */
8149 for (insn = first; insn != NEXT_INSN (last); insn = NEXT_INSN (insn))
8150 if (GET_RTX_CLASS (GET_CODE (insn)) == 'i'
8151 && reg_mentioned_p (XEXP (note, 0), PATTERN (insn)))
ebb7b10b
RH
8152 {
8153 REG_NOTES (insn) = alloc_EXPR_LIST (REG_LABEL,
38a448ca
RH
8154 XEXP (note, 0),
8155 REG_NOTES (insn));
ebb7b10b 8156 }
8c660648
JL
8157 break;
8158
8159 case REG_CC_SETTER:
8160 case REG_CC_USER:
8161 /* These two notes will never appear until after reorg, so we don't
8162 have to handle them here. */
8163 default:
8164 abort ();
8165 }
8166 }
8167
8168 /* Each new insn created, except the last, has a new set. If the destination
8169 is a register, then this reg is now live across several insns, whereas
8170 previously the dest reg was born and died within the same insn. To
8171 reflect this, we now need a REG_DEAD note on the insn where this
8172 dest reg dies.
8173
8174 Similarly, the new insns may have clobbers that need REG_UNUSED notes. */
8175
8176 for (insn = first; insn != last; insn = NEXT_INSN (insn))
8177 {
8178 rtx pat;
8179 int i;
8180
8181 pat = PATTERN (insn);
8182 if (GET_CODE (pat) == SET || GET_CODE (pat) == CLOBBER)
8183 new_insn_dead_notes (pat, insn, last, orig_insn);
8184 else if (GET_CODE (pat) == PARALLEL)
8185 {
8186 for (i = 0; i < XVECLEN (pat, 0); i++)
8187 if (GET_CODE (XVECEXP (pat, 0, i)) == SET
8188 || GET_CODE (XVECEXP (pat, 0, i)) == CLOBBER)
8189 new_insn_dead_notes (XVECEXP (pat, 0, i), insn, last, orig_insn);
8190 }
8191 }
8192
8193 /* If any insn, except the last, uses the register set by the last insn,
8194 then we need a new REG_DEAD note on that insn. In this case, there
8195 would not have been a REG_DEAD note for this register in the original
8196 insn because it was used and set within one insn. */
8197
8198 set = single_set (last);
8199 if (set)
8200 {
8201 rtx dest = SET_DEST (set);
8202
8203 while (GET_CODE (dest) == ZERO_EXTRACT || GET_CODE (dest) == SUBREG
8204 || GET_CODE (dest) == STRICT_LOW_PART
8205 || GET_CODE (dest) == SIGN_EXTRACT)
8206 dest = XEXP (dest, 0);
8207
8208 if (GET_CODE (dest) == REG
8209 /* Global registers are always live, so the code below does not
8210 apply to them. */
8211 && (REGNO (dest) >= FIRST_PSEUDO_REGISTER
8212 || ! global_regs[REGNO (dest)]))
8213 {
8214 rtx stop_insn = PREV_INSN (first);
8215
8216 /* If the last insn uses the register that it is setting, then
8217 we don't want to put a REG_DEAD note there. Search backwards
8218 to find the first insn that sets but does not use DEST. */
8219
8220 insn = last;
8221 if (reg_overlap_mentioned_p (dest, SET_SRC (set)))
8222 {
8223 for (insn = PREV_INSN (insn); insn != first;
8224 insn = PREV_INSN (insn))
8225 {
8226 if ((set = single_set (insn))
8227 && reg_mentioned_p (dest, SET_DEST (set))
8228 && ! reg_overlap_mentioned_p (dest, SET_SRC (set)))
8229 break;
8230 }
8231 }
8232
8233 /* Now find the first insn that uses but does not set DEST. */
8234
8235 for (insn = PREV_INSN (insn); insn != stop_insn;
8236 insn = PREV_INSN (insn))
8237 {
8238 if (GET_RTX_CLASS (GET_CODE (insn)) == 'i'
8239 && reg_mentioned_p (dest, PATTERN (insn))
8240 && (set = single_set (insn)))
8241 {
8242 rtx insn_dest = SET_DEST (set);
8243
8244 while (GET_CODE (insn_dest) == ZERO_EXTRACT
8245 || GET_CODE (insn_dest) == SUBREG
8246 || GET_CODE (insn_dest) == STRICT_LOW_PART
8247 || GET_CODE (insn_dest) == SIGN_EXTRACT)
8248 insn_dest = XEXP (insn_dest, 0);
8249
8250 if (insn_dest != dest)
8251 {
ebb7b10b 8252 note = alloc_EXPR_LIST (REG_DEAD, dest, REG_NOTES (insn));
8c660648
JL
8253 REG_NOTES (insn) = note;
8254 /* The reg only dies in one insn, the last one
8255 that uses it. */
8256 break;
8257 }
8258 }
8259 }
8260 }
8261 }
8262
8263 /* If the original dest is modifying a multiple register target, and the
8264 original instruction was split such that the original dest is now set
8265 by two or more SUBREG sets, then the split insns no longer kill the
8266 destination of the original insn.
8267
8268 In this case, if there exists an instruction in the same basic block,
8269 before the split insn, which uses the original dest, and this use is
8270 killed by the original insn, then we must remove the REG_DEAD note on
8271 this insn, because it is now superfluous.
8272
8273 This does not apply when a hard register gets split, because the code
8274 knows how to handle overlapping hard registers properly. */
8275 if (orig_dest && GET_CODE (orig_dest) == REG)
8276 {
8277 int found_orig_dest = 0;
8278 int found_split_dest = 0;
8279
8280 for (insn = first;; insn = NEXT_INSN (insn))
8281 {
acceac1a
R
8282 rtx pat;
8283 int i;
8284
8285 /* I'm not sure if this can happen, but let's be safe. */
8286 if (GET_RTX_CLASS (GET_CODE (insn)) != 'i')
8287 continue;
8288
8289 pat = PATTERN (insn);
8290 i = GET_CODE (pat) == PARALLEL ? XVECLEN (pat, 0) : 0;
8291 set = pat;
8292
8293 for (;;)
8c660648 8294 {
acceac1a 8295 if (GET_CODE (set) == SET)
8c660648 8296 {
acceac1a
R
8297 if (GET_CODE (SET_DEST (set)) == REG
8298 && REGNO (SET_DEST (set)) == REGNO (orig_dest))
8299 {
8300 found_orig_dest = 1;
8301 break;
8302 }
8303 else if (GET_CODE (SET_DEST (set)) == SUBREG
8304 && SUBREG_REG (SET_DEST (set)) == orig_dest)
8305 {
8306 found_split_dest = 1;
8307 break;
8308 }
8c660648 8309 }
acceac1a
R
8310 if (--i < 0)
8311 break;
8312 set = XVECEXP (pat, 0, i);
8c660648
JL
8313 }
8314
8315 if (insn == last)
8316 break;
8317 }
8318
8319 if (found_split_dest)
8320 {
8321 /* Search backwards from FIRST, looking for the first insn that uses
8322 the original dest. Stop if we pass a CODE_LABEL or a JUMP_INSN.
8323 If we find an insn, and it has a REG_DEAD note, then delete the
8324 note. */
8325
8326 for (insn = first; insn; insn = PREV_INSN (insn))
8327 {
8328 if (GET_CODE (insn) == CODE_LABEL
8329 || GET_CODE (insn) == JUMP_INSN)
8330 break;
8331 else if (GET_RTX_CLASS (GET_CODE (insn)) == 'i'
8332 && reg_mentioned_p (orig_dest, insn))
8333 {
8334 note = find_regno_note (insn, REG_DEAD, REGNO (orig_dest));
8335 if (note)
8336 remove_note (insn, note);
8337 }
8338 }
8339 }
8340 else if (!found_orig_dest)
8341 {
8342 /* This should never happen. */
8343 abort ();
8344 }
8345 }
8346
8347 /* Update reg_n_sets. This is necessary to prevent local alloc from
8348 converting REG_EQUAL notes to REG_EQUIV when splitting has modified
8349 a reg from set once to set multiple times. */
8350
8351 {
8352 rtx x = PATTERN (orig_insn);
8353 RTX_CODE code = GET_CODE (x);
8354
8355 if (code == SET || code == CLOBBER)
8356 update_n_sets (x, -1);
8357 else if (code == PARALLEL)
8358 {
8359 int i;
8360 for (i = XVECLEN (x, 0) - 1; i >= 0; i--)
8361 {
8362 code = GET_CODE (XVECEXP (x, 0, i));
8363 if (code == SET || code == CLOBBER)
8364 update_n_sets (XVECEXP (x, 0, i), -1);
8365 }
8366 }
8367
8368 for (insn = first;; insn = NEXT_INSN (insn))
8369 {
8370 x = PATTERN (insn);
8371 code = GET_CODE (x);
8372
8373 if (code == SET || code == CLOBBER)
8374 update_n_sets (x, 1);
8375 else if (code == PARALLEL)
8376 {
8377 int i;
8378 for (i = XVECLEN (x, 0) - 1; i >= 0; i--)
8379 {
8380 code = GET_CODE (XVECEXP (x, 0, i));
8381 if (code == SET || code == CLOBBER)
8382 update_n_sets (XVECEXP (x, 0, i), 1);
8383 }
8384 }
8385
8386 if (insn == last)
8387 break;
8388 }
8389 }
8390}
8391
8392/* Do the splitting of insns in the block b. */
8393
8394static void
8395split_block_insns (b)
8396 int b;
8397{
8398 rtx insn, next;
8399
8400 for (insn = basic_block_head[b];; insn = next)
8401 {
4ed43ff8 8402 rtx set, last, first, notes;
8c660648
JL
8403
8404 /* Can't use `next_real_insn' because that
8405 might go across CODE_LABELS and short-out basic blocks. */
8406 next = NEXT_INSN (insn);
8407 if (GET_CODE (insn) != INSN)
8408 {
8409 if (insn == basic_block_end[b])
8410 break;
8411
8412 continue;
8413 }
8414
8415 /* Don't split no-op move insns. These should silently disappear
8416 later in final. Splitting such insns would break the code
8417 that handles REG_NO_CONFLICT blocks. */
8418 set = single_set (insn);
8419 if (set && rtx_equal_p (SET_SRC (set), SET_DEST (set)))
8420 {
8421 if (insn == basic_block_end[b])
8422 break;
8423
8424 /* Nops get in the way while scheduling, so delete them now if
8425 register allocation has already been done. It is too risky
8426 to try to do this before register allocation, and there are
8427 unlikely to be very many nops then anyways. */
8428 if (reload_completed)
8429 {
8430 PUT_CODE (insn, NOTE);
8431 NOTE_LINE_NUMBER (insn) = NOTE_INSN_DELETED;
8432 NOTE_SOURCE_FILE (insn) = 0;
8433 }
8434
8435 continue;
8436 }
8437
8438 /* Split insns here to get max fine-grain parallelism. */
4ed43ff8
RH
8439 first = PREV_INSN (insn);
8440 notes = REG_NOTES (insn);
8441 last = try_split (PATTERN (insn), insn, 1);
8442 if (last != insn)
8c660648 8443 {
4ed43ff8
RH
8444 /* try_split returns the NOTE that INSN became. */
8445 first = NEXT_INSN (first);
8446 update_flow_info (notes, first, last, insn);
8447
8448 PUT_CODE (insn, NOTE);
8449 NOTE_SOURCE_FILE (insn) = 0;
8450 NOTE_LINE_NUMBER (insn) = NOTE_INSN_DELETED;
8451 if (insn == basic_block_head[b])
8452 basic_block_head[b] = first;
8453 if (insn == basic_block_end[b])
8c660648 8454 {
4ed43ff8
RH
8455 basic_block_end[b] = last;
8456 break;
8c660648
JL
8457 }
8458 }
8459
8460 if (insn == basic_block_end[b])
8461 break;
8462 }
8463}
8464
8465/* The one entry point in this file. DUMP_FILE is the dump file for
8466 this pass. */
8467
8468void
8469schedule_insns (dump_file)
8470 FILE *dump_file;
8471{
8472
8473 int max_uid;
8474 int b;
8c660648
JL
8475 rtx insn;
8476 int rgn;
8477
8478 int luid;
8479
8480 /* disable speculative loads in their presence if cc0 defined */
8481#ifdef HAVE_cc0
8482 flag_schedule_speculative_load = 0;
8483#endif
8484
8485 /* Taking care of this degenerate case makes the rest of
8486 this code simpler. */
8487 if (n_basic_blocks == 0)
8488 return;
8489
8490 /* set dump and sched_verbose for the desired debugging output. If no
8491 dump-file was specified, but -fsched-verbose-N (any N), print to stderr.
8492 For -fsched-verbose-N, N>=10, print everything to stderr. */
8493 sched_verbose = sched_verbose_param;
8494 if (sched_verbose_param == 0 && dump_file)
8495 sched_verbose = 1;
8496 dump = ((sched_verbose_param >= 10 || !dump_file) ? stderr : dump_file);
8497
8498 nr_inter = 0;
8499 nr_spec = 0;
8500
8501 /* Initialize the unused_*_lists. We can't use the ones left over from
8502 the previous function, because gcc has freed that memory. We can use
8503 the ones left over from the first sched pass in the second pass however,
8504 so only clear them on the first sched pass. The first pass is before
8505 reload if flag_schedule_insns is set, otherwise it is afterwards. */
8506
8507 if (reload_completed == 0 || !flag_schedule_insns)
8508 {
8509 unused_insn_list = 0;
8510 unused_expr_list = 0;
8511 }
8512
8513 /* initialize issue_rate */
62d65906 8514 issue_rate = ISSUE_RATE;
8c660648
JL
8515
8516 /* do the splitting first for all blocks */
8517 for (b = 0; b < n_basic_blocks; b++)
8518 split_block_insns (b);
8519
8520 max_uid = (get_max_uid () + 1);
8521
7c74b010 8522 cant_move = (char *) xmalloc (max_uid * sizeof (char));
8c660648
JL
8523 bzero ((char *) cant_move, max_uid * sizeof (char));
8524
7c74b010 8525 fed_by_spec_load = (char *) xmalloc (max_uid * sizeof (char));
8c660648
JL
8526 bzero ((char *) fed_by_spec_load, max_uid * sizeof (char));
8527
7c74b010 8528 is_load_insn = (char *) xmalloc (max_uid * sizeof (char));
8c660648
JL
8529 bzero ((char *) is_load_insn, max_uid * sizeof (char));
8530
7c74b010
JW
8531 insn_orig_block = (int *) xmalloc (max_uid * sizeof (int));
8532 insn_luid = (int *) xmalloc (max_uid * sizeof (int));
8c660648
JL
8533
8534 luid = 0;
8535 for (b = 0; b < n_basic_blocks; b++)
8536 for (insn = basic_block_head[b];; insn = NEXT_INSN (insn))
8537 {
8538 INSN_BLOCK (insn) = b;
8539 INSN_LUID (insn) = luid++;
8540
8541 if (insn == basic_block_end[b])
8542 break;
8543 }
8544
8545 /* after reload, remove inter-blocks dependences computed before reload. */
8546 if (reload_completed)
8547 {
8548 int b;
8549 rtx insn;
8550
8551 for (b = 0; b < n_basic_blocks; b++)
8552 for (insn = basic_block_head[b];; insn = NEXT_INSN (insn))
8553 {
c995fea1 8554 rtx link, prev;
8c660648
JL
8555
8556 if (GET_RTX_CLASS (GET_CODE (insn)) == 'i')
8557 {
c995fea1
RH
8558 prev = NULL_RTX;
8559 link = LOG_LINKS (insn);
8560 while (link)
8c660648
JL
8561 {
8562 rtx x = XEXP (link, 0);
8563
8564 if (INSN_BLOCK (x) != b)
c995fea1
RH
8565 {
8566 remove_dependence (insn, x);
8567 link = prev ? XEXP (prev, 1) : LOG_LINKS (insn);
8568 }
8569 else
8570 prev = link, link = XEXP (prev, 1);
8c660648
JL
8571 }
8572 }
8573
8574 if (insn == basic_block_end[b])
8575 break;
8576 }
8577 }
8578
8579 nr_regions = 0;
8580 rgn_table = (region *) alloca ((n_basic_blocks) * sizeof (region));
8581 rgn_bb_table = (int *) alloca ((n_basic_blocks) * sizeof (int));
8582 block_to_bb = (int *) alloca ((n_basic_blocks) * sizeof (int));
8583 containing_rgn = (int *) alloca ((n_basic_blocks) * sizeof (int));
8584
8585 /* compute regions for scheduling */
8586 if (reload_completed
8587 || n_basic_blocks == 1
8588 || !flag_schedule_interblock)
8589 {
8590 find_single_block_region ();
8591 }
8592 else
8593 {
8c660648 8594 /* verify that a 'good' control flow graph can be built */
168cbdf9 8595 if (is_cfg_nonregular ())
8c660648
JL
8596 {
8597 find_single_block_region ();
8598 }
8599 else
8600 {
a2e68776
JL
8601 int_list_ptr *s_preds, *s_succs;
8602 int *num_preds, *num_succs;
8603 sbitmap *dom, *pdom;
8604
8605 s_preds = (int_list_ptr *) alloca (n_basic_blocks
8606 * sizeof (int_list_ptr));
8607 s_succs = (int_list_ptr *) alloca (n_basic_blocks
8608 * sizeof (int_list_ptr));
8609 num_preds = (int *) alloca (n_basic_blocks * sizeof (int));
8610 num_succs = (int *) alloca (n_basic_blocks * sizeof (int));
8611 dom = sbitmap_vector_alloc (n_basic_blocks, n_basic_blocks);
8612 pdom = sbitmap_vector_alloc (n_basic_blocks, n_basic_blocks);
8613
8614 /* The scheduler runs after flow; therefore, we can't blindly call
8615 back into find_basic_blocks since doing so could invalidate the
8616 info in basic_block_live_at_start.
8617
8618 Consider a block consisting entirely of dead stores; after life
8619 analysis it would be a block of NOTE_INSN_DELETED notes. If
8620 we call find_basic_blocks again, then the block would be removed
8621 entirely and invalidate our the register live information.
8622
8623 We could (should?) recompute register live information. Doing
8624 so may even be beneficial. */
8625
5d27de7d 8626 compute_preds_succs (s_preds, s_succs, num_preds, num_succs);
a2e68776
JL
8627
8628 /* Compute the dominators and post dominators. We don't currently use
8629 post dominators, but we should for speculative motion analysis. */
8630 compute_dominators (dom, pdom, s_preds, s_succs);
8631
168cbdf9
JL
8632 /* build_control_flow will return nonzero if it detects unreachable
8633 blocks or any other irregularity with the cfg which prevents
8634 cross block scheduling. */
a2e68776 8635 if (build_control_flow (s_preds, s_succs, num_preds, num_succs) != 0)
168cbdf9
JL
8636 find_single_block_region ();
8637 else
a2e68776 8638 find_rgns (s_preds, s_succs, num_preds, num_succs, dom);
8c660648
JL
8639
8640 if (sched_verbose >= 3)
a2e68776 8641 debug_regions ();
8c660648 8642
a2e68776
JL
8643 /* For now. This will move as more and more of haifa is converted
8644 to using the cfg code in flow.c */
8645 free_bb_mem ();
8646 free (dom);
8647 free (pdom);
8c660648
JL
8648 }
8649 }
8650
8651 /* Allocate data for this pass. See comments, above,
7c74b010
JW
8652 for what these vectors do.
8653
8654 We use xmalloc instead of alloca, because max_uid can be very large
8655 when there is a lot of function inlining. If we used alloca, we could
8656 exceed stack limits on some hosts for some inputs. */
8657 insn_priority = (int *) xmalloc (max_uid * sizeof (int));
8658 insn_reg_weight = (int *) xmalloc (max_uid * sizeof (int));
8659 insn_tick = (int *) xmalloc (max_uid * sizeof (int));
8660 insn_costs = (short *) xmalloc (max_uid * sizeof (short));
8661 insn_units = (short *) xmalloc (max_uid * sizeof (short));
8662 insn_blockage = (unsigned int *) xmalloc (max_uid * sizeof (unsigned int));
8663 insn_ref_count = (int *) xmalloc (max_uid * sizeof (int));
8c660648
JL
8664
8665 /* Allocate for forward dependencies */
7c74b010
JW
8666 insn_dep_count = (int *) xmalloc (max_uid * sizeof (int));
8667 insn_depend = (rtx *) xmalloc (max_uid * sizeof (rtx));
8c660648
JL
8668
8669 if (reload_completed == 0)
8670 {
8671 int i;
8672
8673 sched_reg_n_calls_crossed = (int *) alloca (max_regno * sizeof (int));
8674 sched_reg_live_length = (int *) alloca (max_regno * sizeof (int));
8675 sched_reg_basic_block = (int *) alloca (max_regno * sizeof (int));
8676 bb_live_regs = ALLOCA_REG_SET ();
8677 bzero ((char *) sched_reg_n_calls_crossed, max_regno * sizeof (int));
8678 bzero ((char *) sched_reg_live_length, max_regno * sizeof (int));
8679
8680 for (i = 0; i < max_regno; i++)
8681 sched_reg_basic_block[i] = REG_BLOCK_UNKNOWN;
8682 }
8683 else
8684 {
8685 sched_reg_n_calls_crossed = 0;
8686 sched_reg_live_length = 0;
8687 bb_live_regs = 0;
8688 }
8689 init_alias_analysis ();
8690
8691 if (write_symbols != NO_DEBUG)
8692 {
8693 rtx line;
8694
7c74b010 8695 line_note = (rtx *) xmalloc (max_uid * sizeof (rtx));
8c660648
JL
8696 bzero ((char *) line_note, max_uid * sizeof (rtx));
8697 line_note_head = (rtx *) alloca (n_basic_blocks * sizeof (rtx));
8698 bzero ((char *) line_note_head, n_basic_blocks * sizeof (rtx));
8699
8700 /* Save-line-note-head:
8701 Determine the line-number at the start of each basic block.
8702 This must be computed and saved now, because after a basic block's
8703 predecessor has been scheduled, it is impossible to accurately
8704 determine the correct line number for the first insn of the block. */
8705
8706 for (b = 0; b < n_basic_blocks; b++)
8707 for (line = basic_block_head[b]; line; line = PREV_INSN (line))
8708 if (GET_CODE (line) == NOTE && NOTE_LINE_NUMBER (line) > 0)
8709 {
8710 line_note_head[b] = line;
8711 break;
8712 }
8713 }
8714
8715 bzero ((char *) insn_priority, max_uid * sizeof (int));
8716 bzero ((char *) insn_reg_weight, max_uid * sizeof (int));
8717 bzero ((char *) insn_tick, max_uid * sizeof (int));
8718 bzero ((char *) insn_costs, max_uid * sizeof (short));
8719 bzero ((char *) insn_units, max_uid * sizeof (short));
8720 bzero ((char *) insn_blockage, max_uid * sizeof (unsigned int));
8721 bzero ((char *) insn_ref_count, max_uid * sizeof (int));
8722
8723 /* Initialize for forward dependencies */
8724 bzero ((char *) insn_depend, max_uid * sizeof (rtx));
8725 bzero ((char *) insn_dep_count, max_uid * sizeof (int));
8726
8727 /* Find units used in this fuction, for visualization */
8728 if (sched_verbose)
8729 init_target_units ();
8730
8731 /* ??? Add a NOTE after the last insn of the last basic block. It is not
8732 known why this is done. */
8733
8734 insn = basic_block_end[n_basic_blocks - 1];
8735 if (NEXT_INSN (insn) == 0
8736 || (GET_CODE (insn) != NOTE
8737 && GET_CODE (insn) != CODE_LABEL
8738 /* Don't emit a NOTE if it would end up between an unconditional
8739 jump and a BARRIER. */
8740 && !(GET_CODE (insn) == JUMP_INSN
8741 && GET_CODE (NEXT_INSN (insn)) == BARRIER)))
8742 emit_note_after (NOTE_INSN_DELETED, basic_block_end[n_basic_blocks - 1]);
8743
8744 /* Schedule every region in the subroutine */
8745 for (rgn = 0; rgn < nr_regions; rgn++)
8746 {
8747 schedule_region (rgn);
8748
8749#ifdef USE_C_ALLOCA
8750 alloca (0);
8751#endif
8752 }
8753
8754 /* Reposition the prologue and epilogue notes in case we moved the
8755 prologue/epilogue insns. */
8756 if (reload_completed)
8757 reposition_prologue_and_epilogue_notes (get_insns ());
8758
8759 /* delete redundant line notes. */
8760 if (write_symbols != NO_DEBUG)
8761 rm_redundant_line_notes ();
8762
8763 /* Update information about uses of registers in the subroutine. */
8764 if (reload_completed == 0)
8765 update_reg_usage ();
8766
8767 if (sched_verbose)
8768 {
8769 if (reload_completed == 0 && flag_schedule_interblock)
8770 {
8771 fprintf (dump, "\n;; Procedure interblock/speculative motions == %d/%d \n",
8772 nr_inter, nr_spec);
8773 }
8774 else
8775 {
8776 if (nr_inter > 0)
8777 abort ();
8778 }
8779 fprintf (dump, "\n\n");
8780 }
f187056f 8781
7c74b010
JW
8782 free (cant_move);
8783 free (fed_by_spec_load);
8784 free (is_load_insn);
8785 free (insn_orig_block);
8786 free (insn_luid);
8787
8788 free (insn_priority);
8789 free (insn_reg_weight);
8790 free (insn_tick);
8791 free (insn_costs);
8792 free (insn_units);
8793 free (insn_blockage);
8794 free (insn_ref_count);
8795
8796 free (insn_dep_count);
8797 free (insn_depend);
8798
8799 if (write_symbols != NO_DEBUG)
8800 free (line_note);
8801
f187056f
JL
8802 if (bb_live_regs)
8803 FREE_REG_SET (bb_live_regs);
168cbdf9
JL
8804
8805 if (edge_table)
8806 {
8807 free (edge_table);
8808 edge_table = NULL;
8809 }
8810
8811 if (in_edges)
8812 {
8813 free (in_edges);
8814 in_edges = NULL;
8815 }
8816 if (out_edges)
8817 {
8818 free (out_edges);
8819 out_edges = NULL;
8820 }
8c660648
JL
8821}
8822#endif /* INSN_SCHEDULING */
This page took 1.105221 seconds and 5 git commands to generate.