2015-01-14 Sandra Loosemore <sandra@codesourcery.com>
[official-gcc.git] / gcc / sel-sched.c
blob988f9d50719df8466c40c884a5bbefa1d23b7d5e
1 /* Instruction scheduling pass. Selective scheduler and pipeliner.
2 Copyright (C) 2006-2015 Free Software Foundation, Inc.
4 This file is part of GCC.
6 GCC is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 3, or (at your option) any later
9 version.
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 for more details.
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3. If not see
18 <http://www.gnu.org/licenses/>. */
20 #include "config.h"
21 #include "system.h"
22 #include "coretypes.h"
23 #include "tm.h"
24 #include "rtl-error.h"
25 #include "tm_p.h"
26 #include "hard-reg-set.h"
27 #include "regs.h"
28 #include "hashtab.h"
29 #include "hash-set.h"
30 #include "vec.h"
31 #include "machmode.h"
32 #include "input.h"
33 #include "function.h"
34 #include "predict.h"
35 #include "dominance.h"
36 #include "cfg.h"
37 #include "cfgbuild.h"
38 #include "basic-block.h"
39 #include "flags.h"
40 #include "insn-config.h"
41 #include "insn-attr.h"
42 #include "except.h"
43 #include "recog.h"
44 #include "params.h"
45 #include "target.h"
46 #include "output.h"
47 #include "sched-int.h"
48 #include "ggc.h"
49 #include "symtab.h"
50 #include "wide-int.h"
51 #include "inchash.h"
52 #include "tree.h"
53 #include "langhooks.h"
54 #include "rtlhooks-def.h"
55 #include "emit-rtl.h"
56 #include "ira.h"
57 #include "rtl-iter.h"
59 #ifdef INSN_SCHEDULING
60 #include "sel-sched-ir.h"
61 #include "sel-sched-dump.h"
62 #include "sel-sched.h"
63 #include "dbgcnt.h"
65 /* Implementation of selective scheduling approach.
66 The below implementation follows the original approach with the following
67 changes:
69 o the scheduler works after register allocation (but can be also tuned
70 to work before RA);
71 o some instructions are not copied or register renamed;
72 o conditional jumps are not moved with code duplication;
73 o several jumps in one parallel group are not supported;
74 o when pipelining outer loops, code motion through inner loops
75 is not supported;
76 o control and data speculation are supported;
77 o some improvements for better compile time/performance were made.
79 Terminology
80 ===========
82 A vinsn, or virtual insn, is an insn with additional data characterizing
83 insn pattern, such as LHS, RHS, register sets used/set/clobbered, etc.
84 Vinsns also act as smart pointers to save memory by reusing them in
85 different expressions. A vinsn is described by vinsn_t type.
87 An expression is a vinsn with additional data characterizing its properties
88 at some point in the control flow graph. The data may be its usefulness,
89 priority, speculative status, whether it was renamed/subsituted, etc.
90 An expression is described by expr_t type.
92 Availability set (av_set) is a set of expressions at a given control flow
93 point. It is represented as av_set_t. The expressions in av sets are kept
94 sorted in the terms of expr_greater_p function. It allows to truncate
95 the set while leaving the best expressions.
97 A fence is a point through which code motion is prohibited. On each step,
98 we gather a parallel group of insns at a fence. It is possible to have
99 multiple fences. A fence is represented via fence_t.
101 A boundary is the border between the fence group and the rest of the code.
102 Currently, we never have more than one boundary per fence, as we finalize
103 the fence group when a jump is scheduled. A boundary is represented
104 via bnd_t.
106 High-level overview
107 ===================
109 The scheduler finds regions to schedule, schedules each one, and finalizes.
110 The regions are formed starting from innermost loops, so that when the inner
111 loop is pipelined, its prologue can be scheduled together with yet unprocessed
112 outer loop. The rest of acyclic regions are found using extend_rgns:
113 the blocks that are not yet allocated to any regions are traversed in top-down
114 order, and a block is added to a region to which all its predecessors belong;
115 otherwise, the block starts its own region.
117 The main scheduling loop (sel_sched_region_2) consists of just
118 scheduling on each fence and updating fences. For each fence,
119 we fill a parallel group of insns (fill_insns) until some insns can be added.
120 First, we compute available exprs (av-set) at the boundary of the current
121 group. Second, we choose the best expression from it. If the stall is
122 required to schedule any of the expressions, we advance the current cycle
123 appropriately. So, the final group does not exactly correspond to a VLIW
124 word. Third, we move the chosen expression to the boundary (move_op)
125 and update the intermediate av sets and liveness sets. We quit fill_insns
126 when either no insns left for scheduling or we have scheduled enough insns
127 so we feel like advancing a scheduling point.
129 Computing available expressions
130 ===============================
132 The computation (compute_av_set) is a bottom-up traversal. At each insn,
133 we're moving the union of its successors' sets through it via
134 moveup_expr_set. The dependent expressions are removed. Local
135 transformations (substitution, speculation) are applied to move more
136 exprs. Then the expr corresponding to the current insn is added.
137 The result is saved on each basic block header.
139 When traversing the CFG, we're moving down for no more than max_ws insns.
140 Also, we do not move down to ineligible successors (is_ineligible_successor),
141 which include moving along a back-edge, moving to already scheduled code,
142 and moving to another fence. The first two restrictions are lifted during
143 pipelining, which allows us to move insns along a back-edge. We always have
144 an acyclic region for scheduling because we forbid motion through fences.
146 Choosing the best expression
147 ============================
149 We sort the final availability set via sel_rank_for_schedule, then we remove
150 expressions which are not yet ready (tick_check_p) or which dest registers
151 cannot be used. For some of them, we choose another register via
152 find_best_reg. To do this, we run find_used_regs to calculate the set of
153 registers which cannot be used. The find_used_regs function performs
154 a traversal of code motion paths for an expr. We consider for renaming
155 only registers which are from the same regclass as the original one and
156 using which does not interfere with any live ranges. Finally, we convert
157 the resulting set to the ready list format and use max_issue and reorder*
158 hooks similarly to the Haifa scheduler.
160 Scheduling the best expression
161 ==============================
163 We run the move_op routine to perform the same type of code motion paths
164 traversal as in find_used_regs. (These are working via the same driver,
165 code_motion_path_driver.) When moving down the CFG, we look for original
166 instruction that gave birth to a chosen expression. We undo
167 the transformations performed on an expression via the history saved in it.
168 When found, we remove the instruction or leave a reg-reg copy/speculation
169 check if needed. On a way up, we insert bookkeeping copies at each join
170 point. If a copy is not needed, it will be removed later during this
171 traversal. We update the saved av sets and liveness sets on the way up, too.
173 Finalizing the schedule
174 =======================
176 When pipelining, we reschedule the blocks from which insns were pipelined
177 to get a tighter schedule. On Itanium, we also perform bundling via
178 the same routine from ia64.c.
180 Dependence analysis changes
181 ===========================
183 We augmented the sched-deps.c with hooks that get called when a particular
184 dependence is found in a particular part of an insn. Using these hooks, we
185 can do several actions such as: determine whether an insn can be moved through
186 another (has_dependence_p, moveup_expr); find out whether an insn can be
187 scheduled on the current cycle (tick_check_p); find out registers that
188 are set/used/clobbered by an insn and find out all the strange stuff that
189 restrict its movement, like SCHED_GROUP_P or CANT_MOVE (done in
190 init_global_and_expr_for_insn).
192 Initialization changes
193 ======================
195 There are parts of haifa-sched.c, sched-deps.c, and sched-rgn.c that are
196 reused in all of the schedulers. We have split up the initialization of data
197 of such parts into different functions prefixed with scheduler type and
198 postfixed with the type of data initialized: {,sel_,haifa_}sched_{init,finish},
199 sched_rgn_init/finish, sched_deps_init/finish, sched_init_{luids/bbs}, etc.
200 The same splitting is done with current_sched_info structure:
201 dependence-related parts are in sched_deps_info, common part is in
202 common_sched_info, and haifa/sel/etc part is in current_sched_info.
204 Target contexts
205 ===============
207 As we now have multiple-point scheduling, this would not work with backends
208 which save some of the scheduler state to use it in the target hooks.
209 For this purpose, we introduce a concept of target contexts, which
210 encapsulate such information. The backend should implement simple routines
211 of allocating/freeing/setting such a context. The scheduler calls these
212 as target hooks and handles the target context as an opaque pointer (similar
213 to the DFA state type, state_t).
215 Various speedups
216 ================
218 As the correct data dependence graph is not supported during scheduling (which
219 is to be changed in mid-term), we cache as much of the dependence analysis
220 results as possible to avoid reanalyzing. This includes: bitmap caches on
221 each insn in stream of the region saying yes/no for a query with a pair of
222 UIDs; hashtables with the previously done transformations on each insn in
223 stream; a vector keeping a history of transformations on each expr.
225 Also, we try to minimize the dependence context used on each fence to check
226 whether the given expression is ready for scheduling by removing from it
227 insns that are definitely completed the execution. The results of
228 tick_check_p checks are also cached in a vector on each fence.
230 We keep a valid liveness set on each insn in a region to avoid the high
231 cost of recomputation on large basic blocks.
233 Finally, we try to minimize the number of needed updates to the availability
234 sets. The updates happen in two cases: when fill_insns terminates,
235 we advance all fences and increase the stage number to show that the region
236 has changed and the sets are to be recomputed; and when the next iteration
237 of a loop in fill_insns happens (but this one reuses the saved av sets
238 on bb headers.) Thus, we try to break the fill_insns loop only when
239 "significant" number of insns from the current scheduling window was
240 scheduled. This should be made a target param.
243 TODO: correctly support the data dependence graph at all stages and get rid
244 of all caches. This should speed up the scheduler.
245 TODO: implement moving cond jumps with bookkeeping copies on both targets.
246 TODO: tune the scheduler before RA so it does not create too much pseudos.
249 References:
250 S.-M. Moon and K. Ebcioglu. Parallelizing nonnumerical code with
251 selective scheduling and software pipelining.
252 ACM TOPLAS, Vol 19, No. 6, pages 853--898, Nov. 1997.
254 Andrey Belevantsev, Maxim Kuvyrkov, Vladimir Makarov, Dmitry Melnik,
255 and Dmitry Zhurikhin. An interblock VLIW-targeted instruction scheduler
256 for GCC. In Proceedings of GCC Developers' Summit 2006.
258 Arutyun Avetisyan, Andrey Belevantsev, and Dmitry Melnik. GCC Instruction
259 Scheduler and Software Pipeliner on the Itanium Platform. EPIC-7 Workshop.
260 http://rogue.colorado.edu/EPIC7/.
264 /* True when pipelining is enabled. */
265 bool pipelining_p;
267 /* True if bookkeeping is enabled. */
268 bool bookkeeping_p;
270 /* Maximum number of insns that are eligible for renaming. */
271 int max_insns_to_rename;
274 /* Definitions of local types and macros. */
276 /* Represents possible outcomes of moving an expression through an insn. */
277 enum MOVEUP_EXPR_CODE
279 /* The expression is not changed. */
280 MOVEUP_EXPR_SAME,
282 /* Not changed, but requires a new destination register. */
283 MOVEUP_EXPR_AS_RHS,
285 /* Cannot be moved. */
286 MOVEUP_EXPR_NULL,
288 /* Changed (substituted or speculated). */
289 MOVEUP_EXPR_CHANGED
292 /* The container to be passed into rtx search & replace functions. */
293 struct rtx_search_arg
295 /* What we are searching for. */
296 rtx x;
298 /* The occurrence counter. */
299 int n;
302 typedef struct rtx_search_arg *rtx_search_arg_p;
304 /* This struct contains precomputed hard reg sets that are needed when
305 computing registers available for renaming. */
306 struct hard_regs_data
308 /* For every mode, this stores registers available for use with
309 that mode. */
310 HARD_REG_SET regs_for_mode[NUM_MACHINE_MODES];
312 /* True when regs_for_mode[mode] is initialized. */
313 bool regs_for_mode_ok[NUM_MACHINE_MODES];
315 /* For every register, it has regs that are ok to rename into it.
316 The register in question is always set. If not, this means
317 that the whole set is not computed yet. */
318 HARD_REG_SET regs_for_rename[FIRST_PSEUDO_REGISTER];
320 /* For every mode, this stores registers not available due to
321 call clobbering. */
322 HARD_REG_SET regs_for_call_clobbered[NUM_MACHINE_MODES];
324 /* All registers that are used or call used. */
325 HARD_REG_SET regs_ever_used;
327 #ifdef STACK_REGS
328 /* Stack registers. */
329 HARD_REG_SET stack_regs;
330 #endif
333 /* Holds the results of computation of available for renaming and
334 unavailable hard registers. */
335 struct reg_rename
337 /* These are unavailable due to calls crossing, globalness, etc. */
338 HARD_REG_SET unavailable_hard_regs;
340 /* These are *available* for renaming. */
341 HARD_REG_SET available_for_renaming;
343 /* Whether this code motion path crosses a call. */
344 bool crosses_call;
347 /* A global structure that contains the needed information about harg
348 regs. */
349 static struct hard_regs_data sel_hrd;
352 /* This structure holds local data used in code_motion_path_driver hooks on
353 the same or adjacent levels of recursion. Here we keep those parameters
354 that are not used in code_motion_path_driver routine itself, but only in
355 its hooks. Moreover, all parameters that can be modified in hooks are
356 in this structure, so all other parameters passed explicitly to hooks are
357 read-only. */
358 struct cmpd_local_params
360 /* Local params used in move_op_* functions. */
362 /* Edges for bookkeeping generation. */
363 edge e1, e2;
365 /* C_EXPR merged from all successors and locally allocated temporary C_EXPR. */
366 expr_t c_expr_merged, c_expr_local;
368 /* Local params used in fur_* functions. */
369 /* Copy of the ORIGINAL_INSN list, stores the original insns already
370 found before entering the current level of code_motion_path_driver. */
371 def_list_t old_original_insns;
373 /* Local params used in move_op_* functions. */
374 /* True when we have removed last insn in the block which was
375 also a boundary. Do not update anything or create bookkeeping copies. */
376 BOOL_BITFIELD removed_last_insn : 1;
379 /* Stores the static parameters for move_op_* calls. */
380 struct moveop_static_params
382 /* Destination register. */
383 rtx dest;
385 /* Current C_EXPR. */
386 expr_t c_expr;
388 /* An UID of expr_vliw which is to be moved up. If we find other exprs,
389 they are to be removed. */
390 int uid;
392 #ifdef ENABLE_CHECKING
393 /* This is initialized to the insn on which the driver stopped its traversal. */
394 insn_t failed_insn;
395 #endif
397 /* True if we scheduled an insn with different register. */
398 bool was_renamed;
401 /* Stores the static parameters for fur_* calls. */
402 struct fur_static_params
404 /* Set of registers unavailable on the code motion path. */
405 regset used_regs;
407 /* Pointer to the list of original insns definitions. */
408 def_list_t *original_insns;
410 /* True if a code motion path contains a CALL insn. */
411 bool crosses_call;
414 typedef struct fur_static_params *fur_static_params_p;
415 typedef struct cmpd_local_params *cmpd_local_params_p;
416 typedef struct moveop_static_params *moveop_static_params_p;
418 /* Set of hooks and parameters that determine behaviour specific to
419 move_op or find_used_regs functions. */
420 struct code_motion_path_driver_info_def
422 /* Called on enter to the basic block. */
423 int (*on_enter) (insn_t, cmpd_local_params_p, void *, bool);
425 /* Called when original expr is found. */
426 void (*orig_expr_found) (insn_t, expr_t, cmpd_local_params_p, void *);
428 /* Called while descending current basic block if current insn is not
429 the original EXPR we're searching for. */
430 bool (*orig_expr_not_found) (insn_t, av_set_t, void *);
432 /* Function to merge C_EXPRes from different successors. */
433 void (*merge_succs) (insn_t, insn_t, int, cmpd_local_params_p, void *);
435 /* Function to finalize merge from different successors and possibly
436 deallocate temporary data structures used for merging. */
437 void (*after_merge_succs) (cmpd_local_params_p, void *);
439 /* Called on the backward stage of recursion to do moveup_expr.
440 Used only with move_op_*. */
441 void (*ascend) (insn_t, void *);
443 /* Called on the ascending pass, before returning from the current basic
444 block or from the whole traversal. */
445 void (*at_first_insn) (insn_t, cmpd_local_params_p, void *);
447 /* When processing successors in move_op we need only descend into
448 SUCCS_NORMAL successors, while in find_used_regs we need SUCCS_ALL. */
449 int succ_flags;
451 /* The routine name to print in dumps ("move_op" of "find_used_regs"). */
452 const char *routine_name;
455 /* Global pointer to current hooks, either points to MOVE_OP_HOOKS or
456 FUR_HOOKS. */
457 struct code_motion_path_driver_info_def *code_motion_path_driver_info;
459 /* Set of hooks for performing move_op and find_used_regs routines with
460 code_motion_path_driver. */
461 extern struct code_motion_path_driver_info_def move_op_hooks, fur_hooks;
463 /* True if/when we want to emulate Haifa scheduler in the common code.
464 This is used in sched_rgn_local_init and in various places in
465 sched-deps.c. */
466 int sched_emulate_haifa_p;
468 /* GLOBAL_LEVEL is used to discard information stored in basic block headers
469 av_sets. Av_set of bb header is valid if its (bb header's) level is equal
470 to GLOBAL_LEVEL. And invalid if lesser. This is primarily used to advance
471 scheduling window. */
472 int global_level;
474 /* Current fences. */
475 flist_t fences;
477 /* True when separable insns should be scheduled as RHSes. */
478 static bool enable_schedule_as_rhs_p;
480 /* Used in verify_target_availability to assert that target reg is reported
481 unavailabile by both TARGET_UNAVAILABLE and find_used_regs only if
482 we haven't scheduled anything on the previous fence.
483 if scheduled_something_on_previous_fence is true, TARGET_UNAVAILABLE can
484 have more conservative value than the one returned by the
485 find_used_regs, thus we shouldn't assert that these values are equal. */
486 static bool scheduled_something_on_previous_fence;
488 /* All newly emitted insns will have their uids greater than this value. */
489 static int first_emitted_uid;
491 /* Set of basic blocks that are forced to start new ebbs. This is a subset
492 of all the ebb heads. */
493 static bitmap_head _forced_ebb_heads;
494 bitmap_head *forced_ebb_heads = &_forced_ebb_heads;
496 /* Blocks that need to be rescheduled after pipelining. */
497 bitmap blocks_to_reschedule = NULL;
499 /* True when the first lv set should be ignored when updating liveness. */
500 static bool ignore_first = false;
502 /* Number of insns max_issue has initialized data structures for. */
503 static int max_issue_size = 0;
505 /* Whether we can issue more instructions. */
506 static int can_issue_more;
508 /* Maximum software lookahead window size, reduced when rescheduling after
509 pipelining. */
510 static int max_ws;
512 /* Number of insns scheduled in current region. */
513 static int num_insns_scheduled;
515 /* A vector of expressions is used to be able to sort them. */
516 static vec<expr_t> vec_av_set = vNULL;
518 /* A vector of vinsns is used to hold temporary lists of vinsns. */
519 typedef vec<vinsn_t> vinsn_vec_t;
521 /* This vector has the exprs which may still present in av_sets, but actually
522 can't be moved up due to bookkeeping created during code motion to another
523 fence. See comment near the call to update_and_record_unavailable_insns
524 for the detailed explanations. */
525 static vinsn_vec_t vec_bookkeeping_blocked_vinsns = vinsn_vec_t ();
527 /* This vector has vinsns which are scheduled with renaming on the first fence
528 and then seen on the second. For expressions with such vinsns, target
529 availability information may be wrong. */
530 static vinsn_vec_t vec_target_unavailable_vinsns = vinsn_vec_t ();
532 /* Vector to store temporary nops inserted in move_op to prevent removal
533 of empty bbs. */
534 static vec<insn_t> vec_temp_moveop_nops = vNULL;
536 /* These bitmaps record original instructions scheduled on the current
537 iteration and bookkeeping copies created by them. */
538 static bitmap current_originators = NULL;
539 static bitmap current_copies = NULL;
541 /* This bitmap marks the blocks visited by code_motion_path_driver so we don't
542 visit them afterwards. */
543 static bitmap code_motion_visited_blocks = NULL;
545 /* Variables to accumulate different statistics. */
547 /* The number of bookkeeping copies created. */
548 static int stat_bookkeeping_copies;
550 /* The number of insns that required bookkeeiping for their scheduling. */
551 static int stat_insns_needed_bookkeeping;
553 /* The number of insns that got renamed. */
554 static int stat_renamed_scheduled;
556 /* The number of substitutions made during scheduling. */
557 static int stat_substitutions_total;
560 /* Forward declarations of static functions. */
561 static bool rtx_ok_for_substitution_p (rtx, rtx);
562 static int sel_rank_for_schedule (const void *, const void *);
563 static av_set_t find_sequential_best_exprs (bnd_t, expr_t, bool);
564 static basic_block find_block_for_bookkeeping (edge e1, edge e2, bool lax);
566 static rtx get_dest_from_orig_ops (av_set_t);
567 static basic_block generate_bookkeeping_insn (expr_t, edge, edge);
568 static bool find_used_regs (insn_t, av_set_t, regset, struct reg_rename *,
569 def_list_t *);
570 static bool move_op (insn_t, av_set_t, expr_t, rtx, expr_t, bool*);
571 static int code_motion_path_driver (insn_t, av_set_t, ilist_t,
572 cmpd_local_params_p, void *);
573 static void sel_sched_region_1 (void);
574 static void sel_sched_region_2 (int);
575 static av_set_t compute_av_set_inside_bb (insn_t, ilist_t, int, bool);
577 static void debug_state (state_t);
580 /* Functions that work with fences. */
582 /* Advance one cycle on FENCE. */
583 static void
584 advance_one_cycle (fence_t fence)
586 unsigned i;
587 int cycle;
588 rtx_insn *insn;
590 advance_state (FENCE_STATE (fence));
591 cycle = ++FENCE_CYCLE (fence);
592 FENCE_ISSUED_INSNS (fence) = 0;
593 FENCE_STARTS_CYCLE_P (fence) = 1;
594 can_issue_more = issue_rate;
595 FENCE_ISSUE_MORE (fence) = can_issue_more;
597 for (i = 0; vec_safe_iterate (FENCE_EXECUTING_INSNS (fence), i, &insn); )
599 if (INSN_READY_CYCLE (insn) < cycle)
601 remove_from_deps (FENCE_DC (fence), insn);
602 FENCE_EXECUTING_INSNS (fence)->unordered_remove (i);
603 continue;
605 i++;
607 if (sched_verbose >= 2)
609 sel_print ("Finished a cycle. Current cycle = %d\n", FENCE_CYCLE (fence));
610 debug_state (FENCE_STATE (fence));
614 /* Returns true when SUCC in a fallthru bb of INSN, possibly
615 skipping empty basic blocks. */
616 static bool
617 in_fallthru_bb_p (rtx insn, rtx succ)
619 basic_block bb = BLOCK_FOR_INSN (insn);
620 edge e;
622 if (bb == BLOCK_FOR_INSN (succ))
623 return true;
625 e = find_fallthru_edge_from (bb);
626 if (e)
627 bb = e->dest;
628 else
629 return false;
631 while (sel_bb_empty_p (bb))
632 bb = bb->next_bb;
634 return bb == BLOCK_FOR_INSN (succ);
637 /* Construct successor fences from OLD_FENCEs and put them in NEW_FENCES.
638 When a successor will continue a ebb, transfer all parameters of a fence
639 to the new fence. ORIG_MAX_SEQNO is the maximal seqno before this round
640 of scheduling helping to distinguish between the old and the new code. */
641 static void
642 extract_new_fences_from (flist_t old_fences, flist_tail_t new_fences,
643 int orig_max_seqno)
645 bool was_here_p = false;
646 insn_t insn = NULL;
647 insn_t succ;
648 succ_iterator si;
649 ilist_iterator ii;
650 fence_t fence = FLIST_FENCE (old_fences);
651 basic_block bb;
653 /* Get the only element of FENCE_BNDS (fence). */
654 FOR_EACH_INSN (insn, ii, FENCE_BNDS (fence))
656 gcc_assert (!was_here_p);
657 was_here_p = true;
659 gcc_assert (was_here_p && insn != NULL_RTX);
661 /* When in the "middle" of the block, just move this fence
662 to the new list. */
663 bb = BLOCK_FOR_INSN (insn);
664 if (! sel_bb_end_p (insn)
665 || (single_succ_p (bb)
666 && single_pred_p (single_succ (bb))))
668 insn_t succ;
670 succ = (sel_bb_end_p (insn)
671 ? sel_bb_head (single_succ (bb))
672 : NEXT_INSN (insn));
674 if (INSN_SEQNO (succ) > 0
675 && INSN_SEQNO (succ) <= orig_max_seqno
676 && INSN_SCHED_TIMES (succ) <= 0)
678 FENCE_INSN (fence) = succ;
679 move_fence_to_fences (old_fences, new_fences);
681 if (sched_verbose >= 1)
682 sel_print ("Fence %d continues as %d[%d] (state continue)\n",
683 INSN_UID (insn), INSN_UID (succ), BLOCK_NUM (succ));
685 return;
688 /* Otherwise copy fence's structures to (possibly) multiple successors. */
689 FOR_EACH_SUCC_1 (succ, si, insn, SUCCS_NORMAL | SUCCS_SKIP_TO_LOOP_EXITS)
691 int seqno = INSN_SEQNO (succ);
693 if (0 < seqno && seqno <= orig_max_seqno
694 && (pipelining_p || INSN_SCHED_TIMES (succ) <= 0))
696 bool b = (in_same_ebb_p (insn, succ)
697 || in_fallthru_bb_p (insn, succ));
699 if (sched_verbose >= 1)
700 sel_print ("Fence %d continues as %d[%d] (state %s)\n",
701 INSN_UID (insn), INSN_UID (succ),
702 BLOCK_NUM (succ), b ? "continue" : "reset");
704 if (b)
705 add_dirty_fence_to_fences (new_fences, succ, fence);
706 else
708 /* Mark block of the SUCC as head of the new ebb. */
709 bitmap_set_bit (forced_ebb_heads, BLOCK_NUM (succ));
710 add_clean_fence_to_fences (new_fences, succ, fence);
717 /* Functions to support substitution. */
719 /* Returns whether INSN with dependence status DS is eligible for
720 substitution, i.e. it's a copy operation x := y, and RHS that is
721 moved up through this insn should be substituted. */
722 static bool
723 can_substitute_through_p (insn_t insn, ds_t ds)
725 /* We can substitute only true dependencies. */
726 if ((ds & DEP_OUTPUT)
727 || (ds & DEP_ANTI)
728 || ! INSN_RHS (insn)
729 || ! INSN_LHS (insn))
730 return false;
732 /* Now we just need to make sure the INSN_RHS consists of only one
733 simple REG rtx. */
734 if (REG_P (INSN_LHS (insn))
735 && REG_P (INSN_RHS (insn)))
736 return true;
737 return false;
740 /* Substitute all occurrences of INSN's destination in EXPR' vinsn with INSN's
741 source (if INSN is eligible for substitution). Returns TRUE if
742 substitution was actually performed, FALSE otherwise. Substitution might
743 be not performed because it's either EXPR' vinsn doesn't contain INSN's
744 destination or the resulting insn is invalid for the target machine.
745 When UNDO is true, perform unsubstitution instead (the difference is in
746 the part of rtx on which validate_replace_rtx is called). */
747 static bool
748 substitute_reg_in_expr (expr_t expr, insn_t insn, bool undo)
750 rtx *where;
751 bool new_insn_valid;
752 vinsn_t *vi = &EXPR_VINSN (expr);
753 bool has_rhs = VINSN_RHS (*vi) != NULL;
754 rtx old, new_rtx;
756 /* Do not try to replace in SET_DEST. Although we'll choose new
757 register for the RHS, we don't want to change RHS' original reg.
758 If the insn is not SET, we may still be able to substitute something
759 in it, and if we're here (don't have deps), it doesn't write INSN's
760 dest. */
761 where = (has_rhs
762 ? &VINSN_RHS (*vi)
763 : &PATTERN (VINSN_INSN_RTX (*vi)));
764 old = undo ? INSN_RHS (insn) : INSN_LHS (insn);
766 /* Substitute if INSN has a form of x:=y and LHS(INSN) occurs in *VI. */
767 if (rtx_ok_for_substitution_p (old, *where))
769 rtx_insn *new_insn;
770 rtx *where_replace;
772 /* We should copy these rtxes before substitution. */
773 new_rtx = copy_rtx (undo ? INSN_LHS (insn) : INSN_RHS (insn));
774 new_insn = create_copy_of_insn_rtx (VINSN_INSN_RTX (*vi));
776 /* Where we'll replace.
777 WHERE_REPLACE should point inside NEW_INSN, so INSN_RHS couldn't be
778 used instead of SET_SRC. */
779 where_replace = (has_rhs
780 ? &SET_SRC (PATTERN (new_insn))
781 : &PATTERN (new_insn));
783 new_insn_valid
784 = validate_replace_rtx_part_nosimplify (old, new_rtx, where_replace,
785 new_insn);
787 /* ??? Actually, constrain_operands result depends upon choice of
788 destination register. E.g. if we allow single register to be an rhs,
789 and if we try to move dx=ax(as rhs) through ax=dx, we'll result
790 in invalid insn dx=dx, so we'll loose this rhs here.
791 Just can't come up with significant testcase for this, so just
792 leaving it for now. */
793 if (new_insn_valid)
795 change_vinsn_in_expr (expr,
796 create_vinsn_from_insn_rtx (new_insn, false));
798 /* Do not allow clobbering the address register of speculative
799 insns. */
800 if ((EXPR_SPEC_DONE_DS (expr) & SPECULATIVE)
801 && register_unavailable_p (VINSN_REG_USES (EXPR_VINSN (expr)),
802 expr_dest_reg (expr)))
803 EXPR_TARGET_AVAILABLE (expr) = false;
805 return true;
807 else
808 return false;
810 else
811 return false;
814 /* Return the number of places WHAT appears within WHERE.
815 Bail out when we found a reference occupying several hard registers. */
816 static int
817 count_occurrences_equiv (const_rtx what, const_rtx where)
819 int count = 0;
820 subrtx_iterator::array_type array;
821 FOR_EACH_SUBRTX (iter, array, where, NONCONST)
823 const_rtx x = *iter;
824 if (REG_P (x) && REGNO (x) == REGNO (what))
826 /* Bail out if mode is different or more than one register is
827 used. */
828 if (GET_MODE (x) != GET_MODE (what)
829 || (HARD_REGISTER_P (x)
830 && hard_regno_nregs[REGNO (x)][GET_MODE (x)] > 1))
831 return 0;
832 count += 1;
834 else if (GET_CODE (x) == SUBREG
835 && (!REG_P (SUBREG_REG (x))
836 || REGNO (SUBREG_REG (x)) == REGNO (what)))
837 /* ??? Do not support substituting regs inside subregs. In that case,
838 simplify_subreg will be called by validate_replace_rtx, and
839 unsubstitution will fail later. */
840 return 0;
842 return count;
845 /* Returns TRUE if WHAT is found in WHERE rtx tree. */
846 static bool
847 rtx_ok_for_substitution_p (rtx what, rtx where)
849 return (count_occurrences_equiv (what, where) > 0);
853 /* Functions to support register renaming. */
855 /* Substitute VI's set source with REGNO. Returns newly created pattern
856 that has REGNO as its source. */
857 static rtx_insn *
858 create_insn_rtx_with_rhs (vinsn_t vi, rtx rhs_rtx)
860 rtx lhs_rtx;
861 rtx pattern;
862 rtx_insn *insn_rtx;
864 lhs_rtx = copy_rtx (VINSN_LHS (vi));
866 pattern = gen_rtx_SET (VOIDmode, lhs_rtx, rhs_rtx);
867 insn_rtx = create_insn_rtx_from_pattern (pattern, NULL_RTX);
869 return insn_rtx;
872 /* Returns whether INSN's src can be replaced with register number
873 NEW_SRC_REG. E.g. the following insn is valid for i386:
875 (insn:HI 2205 6585 2207 727 ../../gcc/libiberty/regex.c:3337
876 (set (mem/s:QI (plus:SI (plus:SI (reg/f:SI 7 sp)
877 (reg:SI 0 ax [orig:770 c1 ] [770]))
878 (const_int 288 [0x120])) [0 str S1 A8])
879 (const_int 0 [0x0])) 43 {*movqi_1} (nil)
880 (nil))
882 But if we change (const_int 0 [0x0]) to (reg:QI 4 si), it will be invalid
883 because of operand constraints:
885 (define_insn "*movqi_1"
886 [(set (match_operand:QI 0 "nonimmediate_operand" "=q,q ,q ,r,r ,?r,m")
887 (match_operand:QI 1 "general_operand" " q,qn,qm,q,rn,qm,qn")
890 So do constrain_operands here, before choosing NEW_SRC_REG as best
891 reg for rhs. */
893 static bool
894 replace_src_with_reg_ok_p (insn_t insn, rtx new_src_reg)
896 vinsn_t vi = INSN_VINSN (insn);
897 machine_mode mode;
898 rtx dst_loc;
899 bool res;
901 gcc_assert (VINSN_SEPARABLE_P (vi));
903 get_dest_and_mode (insn, &dst_loc, &mode);
904 gcc_assert (mode == GET_MODE (new_src_reg));
906 if (REG_P (dst_loc) && REGNO (new_src_reg) == REGNO (dst_loc))
907 return true;
909 /* See whether SET_SRC can be replaced with this register. */
910 validate_change (insn, &SET_SRC (PATTERN (insn)), new_src_reg, 1);
911 res = verify_changes (0);
912 cancel_changes (0);
914 return res;
917 /* Returns whether INSN still be valid after replacing it's DEST with
918 register NEW_REG. */
919 static bool
920 replace_dest_with_reg_ok_p (insn_t insn, rtx new_reg)
922 vinsn_t vi = INSN_VINSN (insn);
923 bool res;
925 /* We should deal here only with separable insns. */
926 gcc_assert (VINSN_SEPARABLE_P (vi));
927 gcc_assert (GET_MODE (VINSN_LHS (vi)) == GET_MODE (new_reg));
929 /* See whether SET_DEST can be replaced with this register. */
930 validate_change (insn, &SET_DEST (PATTERN (insn)), new_reg, 1);
931 res = verify_changes (0);
932 cancel_changes (0);
934 return res;
937 /* Create a pattern with rhs of VI and lhs of LHS_RTX. */
938 static rtx_insn *
939 create_insn_rtx_with_lhs (vinsn_t vi, rtx lhs_rtx)
941 rtx rhs_rtx;
942 rtx pattern;
943 rtx_insn *insn_rtx;
945 rhs_rtx = copy_rtx (VINSN_RHS (vi));
947 pattern = gen_rtx_SET (VOIDmode, lhs_rtx, rhs_rtx);
948 insn_rtx = create_insn_rtx_from_pattern (pattern, NULL_RTX);
950 return insn_rtx;
953 /* Substitute lhs in the given expression EXPR for the register with number
954 NEW_REGNO. SET_DEST may be arbitrary rtx, not only register. */
955 static void
956 replace_dest_with_reg_in_expr (expr_t expr, rtx new_reg)
958 rtx_insn *insn_rtx;
959 vinsn_t vinsn;
961 insn_rtx = create_insn_rtx_with_lhs (EXPR_VINSN (expr), new_reg);
962 vinsn = create_vinsn_from_insn_rtx (insn_rtx, false);
964 change_vinsn_in_expr (expr, vinsn);
965 EXPR_WAS_RENAMED (expr) = 1;
966 EXPR_TARGET_AVAILABLE (expr) = 1;
969 /* Returns whether VI writes either one of the USED_REGS registers or,
970 if a register is a hard one, one of the UNAVAILABLE_HARD_REGS registers. */
971 static bool
972 vinsn_writes_one_of_regs_p (vinsn_t vi, regset used_regs,
973 HARD_REG_SET unavailable_hard_regs)
975 unsigned regno;
976 reg_set_iterator rsi;
978 EXECUTE_IF_SET_IN_REG_SET (VINSN_REG_SETS (vi), 0, regno, rsi)
980 if (REGNO_REG_SET_P (used_regs, regno))
981 return true;
982 if (HARD_REGISTER_NUM_P (regno)
983 && TEST_HARD_REG_BIT (unavailable_hard_regs, regno))
984 return true;
987 EXECUTE_IF_SET_IN_REG_SET (VINSN_REG_CLOBBERS (vi), 0, regno, rsi)
989 if (REGNO_REG_SET_P (used_regs, regno))
990 return true;
991 if (HARD_REGISTER_NUM_P (regno)
992 && TEST_HARD_REG_BIT (unavailable_hard_regs, regno))
993 return true;
996 return false;
999 /* Returns register class of the output register in INSN.
1000 Returns NO_REGS for call insns because some targets have constraints on
1001 destination register of a call insn.
1003 Code adopted from regrename.c::build_def_use. */
1004 static enum reg_class
1005 get_reg_class (rtx_insn *insn)
1007 int i, n_ops;
1009 extract_constrain_insn (insn);
1010 preprocess_constraints (insn);
1011 n_ops = recog_data.n_operands;
1013 const operand_alternative *op_alt = which_op_alt ();
1014 if (asm_noperands (PATTERN (insn)) > 0)
1016 for (i = 0; i < n_ops; i++)
1017 if (recog_data.operand_type[i] == OP_OUT)
1019 rtx *loc = recog_data.operand_loc[i];
1020 rtx op = *loc;
1021 enum reg_class cl = alternative_class (op_alt, i);
1023 if (REG_P (op)
1024 && REGNO (op) == ORIGINAL_REGNO (op))
1025 continue;
1027 return cl;
1030 else if (!CALL_P (insn))
1032 for (i = 0; i < n_ops + recog_data.n_dups; i++)
1034 int opn = i < n_ops ? i : recog_data.dup_num[i - n_ops];
1035 enum reg_class cl = alternative_class (op_alt, opn);
1037 if (recog_data.operand_type[opn] == OP_OUT ||
1038 recog_data.operand_type[opn] == OP_INOUT)
1039 return cl;
1043 /* Insns like
1044 (insn (set (reg:CCZ 17 flags) (compare:CCZ ...)))
1045 may result in returning NO_REGS, cause flags is written implicitly through
1046 CMP insn, which has no OP_OUT | OP_INOUT operands. */
1047 return NO_REGS;
1050 #ifdef HARD_REGNO_RENAME_OK
1051 /* Calculate HARD_REGNO_RENAME_OK data for REGNO. */
1052 static void
1053 init_hard_regno_rename (int regno)
1055 int cur_reg;
1057 SET_HARD_REG_BIT (sel_hrd.regs_for_rename[regno], regno);
1059 for (cur_reg = 0; cur_reg < FIRST_PSEUDO_REGISTER; cur_reg++)
1061 /* We are not interested in renaming in other regs. */
1062 if (!TEST_HARD_REG_BIT (sel_hrd.regs_ever_used, cur_reg))
1063 continue;
1065 if (HARD_REGNO_RENAME_OK (regno, cur_reg))
1066 SET_HARD_REG_BIT (sel_hrd.regs_for_rename[regno], cur_reg);
1069 #endif
1071 /* A wrapper around HARD_REGNO_RENAME_OK that will look into the hard regs
1072 data first. */
1073 static inline bool
1074 sel_hard_regno_rename_ok (int from ATTRIBUTE_UNUSED, int to ATTRIBUTE_UNUSED)
1076 #ifdef HARD_REGNO_RENAME_OK
1077 /* Check whether this is all calculated. */
1078 if (TEST_HARD_REG_BIT (sel_hrd.regs_for_rename[from], from))
1079 return TEST_HARD_REG_BIT (sel_hrd.regs_for_rename[from], to);
1081 init_hard_regno_rename (from);
1083 return TEST_HARD_REG_BIT (sel_hrd.regs_for_rename[from], to);
1084 #else
1085 return true;
1086 #endif
1089 /* Calculate set of registers that are capable of holding MODE. */
1090 static void
1091 init_regs_for_mode (machine_mode mode)
1093 int cur_reg;
1095 CLEAR_HARD_REG_SET (sel_hrd.regs_for_mode[mode]);
1096 CLEAR_HARD_REG_SET (sel_hrd.regs_for_call_clobbered[mode]);
1098 for (cur_reg = 0; cur_reg < FIRST_PSEUDO_REGISTER; cur_reg++)
1100 int nregs;
1101 int i;
1103 /* See whether it accepts all modes that occur in
1104 original insns. */
1105 if (! HARD_REGNO_MODE_OK (cur_reg, mode))
1106 continue;
1108 nregs = hard_regno_nregs[cur_reg][mode];
1110 for (i = nregs - 1; i >= 0; --i)
1111 if (fixed_regs[cur_reg + i]
1112 || global_regs[cur_reg + i]
1113 /* Can't use regs which aren't saved by
1114 the prologue. */
1115 || !TEST_HARD_REG_BIT (sel_hrd.regs_ever_used, cur_reg + i)
1116 /* Can't use regs with non-null REG_BASE_VALUE, because adjusting
1117 it affects aliasing globally and invalidates all AV sets. */
1118 || get_reg_base_value (cur_reg + i)
1119 #ifdef LEAF_REGISTERS
1120 /* We can't use a non-leaf register if we're in a
1121 leaf function. */
1122 || (crtl->is_leaf
1123 && !LEAF_REGISTERS[cur_reg + i])
1124 #endif
1126 break;
1128 if (i >= 0)
1129 continue;
1131 if (HARD_REGNO_CALL_PART_CLOBBERED (cur_reg, mode))
1132 SET_HARD_REG_BIT (sel_hrd.regs_for_call_clobbered[mode],
1133 cur_reg);
1135 /* If the CUR_REG passed all the checks above,
1136 then it's ok. */
1137 SET_HARD_REG_BIT (sel_hrd.regs_for_mode[mode], cur_reg);
1140 sel_hrd.regs_for_mode_ok[mode] = true;
1143 /* Init all register sets gathered in HRD. */
1144 static void
1145 init_hard_regs_data (void)
1147 int cur_reg = 0;
1148 int cur_mode = 0;
1150 CLEAR_HARD_REG_SET (sel_hrd.regs_ever_used);
1151 for (cur_reg = 0; cur_reg < FIRST_PSEUDO_REGISTER; cur_reg++)
1152 if (df_regs_ever_live_p (cur_reg) || call_used_regs[cur_reg])
1153 SET_HARD_REG_BIT (sel_hrd.regs_ever_used, cur_reg);
1155 /* Initialize registers that are valid based on mode when this is
1156 really needed. */
1157 for (cur_mode = 0; cur_mode < NUM_MACHINE_MODES; cur_mode++)
1158 sel_hrd.regs_for_mode_ok[cur_mode] = false;
1160 /* Mark that all HARD_REGNO_RENAME_OK is not calculated. */
1161 for (cur_reg = 0; cur_reg < FIRST_PSEUDO_REGISTER; cur_reg++)
1162 CLEAR_HARD_REG_SET (sel_hrd.regs_for_rename[cur_reg]);
1164 #ifdef STACK_REGS
1165 CLEAR_HARD_REG_SET (sel_hrd.stack_regs);
1167 for (cur_reg = FIRST_STACK_REG; cur_reg <= LAST_STACK_REG; cur_reg++)
1168 SET_HARD_REG_BIT (sel_hrd.stack_regs, cur_reg);
1169 #endif
1172 /* Mark hardware regs in REG_RENAME_P that are not suitable
1173 for renaming rhs in INSN due to hardware restrictions (register class,
1174 modes compatibility etc). This doesn't affect original insn's dest reg,
1175 if it isn't in USED_REGS. DEF is a definition insn of rhs for which the
1176 destination register is sought. LHS (DEF->ORIG_INSN) may be REG or MEM.
1177 Registers that are in used_regs are always marked in
1178 unavailable_hard_regs as well. */
1180 static void
1181 mark_unavailable_hard_regs (def_t def, struct reg_rename *reg_rename_p,
1182 regset used_regs ATTRIBUTE_UNUSED)
1184 machine_mode mode;
1185 enum reg_class cl = NO_REGS;
1186 rtx orig_dest;
1187 unsigned cur_reg, regno;
1188 hard_reg_set_iterator hrsi;
1190 gcc_assert (GET_CODE (PATTERN (def->orig_insn)) == SET);
1191 gcc_assert (reg_rename_p);
1193 orig_dest = SET_DEST (PATTERN (def->orig_insn));
1195 /* We have decided not to rename 'mem = something;' insns, as 'something'
1196 is usually a register. */
1197 if (!REG_P (orig_dest))
1198 return;
1200 regno = REGNO (orig_dest);
1202 /* If before reload, don't try to work with pseudos. */
1203 if (!reload_completed && !HARD_REGISTER_NUM_P (regno))
1204 return;
1206 if (reload_completed)
1207 cl = get_reg_class (def->orig_insn);
1209 /* Stop if the original register is one of the fixed_regs, global_regs or
1210 frame pointer, or we could not discover its class. */
1211 if (fixed_regs[regno]
1212 || global_regs[regno]
1213 #if !HARD_FRAME_POINTER_IS_FRAME_POINTER
1214 || (frame_pointer_needed && regno == HARD_FRAME_POINTER_REGNUM)
1215 #else
1216 || (frame_pointer_needed && regno == FRAME_POINTER_REGNUM)
1217 #endif
1218 || (reload_completed && cl == NO_REGS))
1220 SET_HARD_REG_SET (reg_rename_p->unavailable_hard_regs);
1222 /* Give a chance for original register, if it isn't in used_regs. */
1223 if (!def->crosses_call)
1224 CLEAR_HARD_REG_BIT (reg_rename_p->unavailable_hard_regs, regno);
1226 return;
1229 /* If something allocated on stack in this function, mark frame pointer
1230 register unavailable, considering also modes.
1231 FIXME: it is enough to do this once per all original defs. */
1232 if (frame_pointer_needed)
1234 add_to_hard_reg_set (&reg_rename_p->unavailable_hard_regs,
1235 Pmode, FRAME_POINTER_REGNUM);
1237 if (!HARD_FRAME_POINTER_IS_FRAME_POINTER)
1238 add_to_hard_reg_set (&reg_rename_p->unavailable_hard_regs,
1239 Pmode, HARD_FRAME_POINTER_REGNUM);
1242 #ifdef STACK_REGS
1243 /* For the stack registers the presence of FIRST_STACK_REG in USED_REGS
1244 is equivalent to as if all stack regs were in this set.
1245 I.e. no stack register can be renamed, and even if it's an original
1246 register here we make sure it won't be lifted over it's previous def
1247 (it's previous def will appear as if it's a FIRST_STACK_REG def.
1248 The HARD_REGNO_RENAME_OK covers other cases in condition below. */
1249 if (IN_RANGE (REGNO (orig_dest), FIRST_STACK_REG, LAST_STACK_REG)
1250 && REGNO_REG_SET_P (used_regs, FIRST_STACK_REG))
1251 IOR_HARD_REG_SET (reg_rename_p->unavailable_hard_regs,
1252 sel_hrd.stack_regs);
1253 #endif
1255 /* If there's a call on this path, make regs from call_used_reg_set
1256 unavailable. */
1257 if (def->crosses_call)
1258 IOR_HARD_REG_SET (reg_rename_p->unavailable_hard_regs,
1259 call_used_reg_set);
1261 /* Stop here before reload: we need FRAME_REGS, STACK_REGS, and crosses_call,
1262 but not register classes. */
1263 if (!reload_completed)
1264 return;
1266 /* Leave regs as 'available' only from the current
1267 register class. */
1268 COPY_HARD_REG_SET (reg_rename_p->available_for_renaming,
1269 reg_class_contents[cl]);
1271 mode = GET_MODE (orig_dest);
1273 /* Leave only registers available for this mode. */
1274 if (!sel_hrd.regs_for_mode_ok[mode])
1275 init_regs_for_mode (mode);
1276 AND_HARD_REG_SET (reg_rename_p->available_for_renaming,
1277 sel_hrd.regs_for_mode[mode]);
1279 /* Exclude registers that are partially call clobbered. */
1280 if (def->crosses_call
1281 && ! HARD_REGNO_CALL_PART_CLOBBERED (regno, mode))
1282 AND_COMPL_HARD_REG_SET (reg_rename_p->available_for_renaming,
1283 sel_hrd.regs_for_call_clobbered[mode]);
1285 /* Leave only those that are ok to rename. */
1286 EXECUTE_IF_SET_IN_HARD_REG_SET (reg_rename_p->available_for_renaming,
1287 0, cur_reg, hrsi)
1289 int nregs;
1290 int i;
1292 nregs = hard_regno_nregs[cur_reg][mode];
1293 gcc_assert (nregs > 0);
1295 for (i = nregs - 1; i >= 0; --i)
1296 if (! sel_hard_regno_rename_ok (regno + i, cur_reg + i))
1297 break;
1299 if (i >= 0)
1300 CLEAR_HARD_REG_BIT (reg_rename_p->available_for_renaming,
1301 cur_reg);
1304 AND_COMPL_HARD_REG_SET (reg_rename_p->available_for_renaming,
1305 reg_rename_p->unavailable_hard_regs);
1307 /* Regno is always ok from the renaming part of view, but it really
1308 could be in *unavailable_hard_regs already, so set it here instead
1309 of there. */
1310 SET_HARD_REG_BIT (reg_rename_p->available_for_renaming, regno);
1313 /* reg_rename_tick[REG1] > reg_rename_tick[REG2] if REG1 was chosen as the
1314 best register more recently than REG2. */
1315 static int reg_rename_tick[FIRST_PSEUDO_REGISTER];
1317 /* Indicates the number of times renaming happened before the current one. */
1318 static int reg_rename_this_tick;
1320 /* Choose the register among free, that is suitable for storing
1321 the rhs value.
1323 ORIGINAL_INSNS is the list of insns where the operation (rhs)
1324 originally appears. There could be multiple original operations
1325 for single rhs since we moving it up and merging along different
1326 paths.
1328 Some code is adapted from regrename.c (regrename_optimize).
1329 If original register is available, function returns it.
1330 Otherwise it performs the checks, so the new register should
1331 comply with the following:
1332 - it should not violate any live ranges (such registers are in
1333 REG_RENAME_P->available_for_renaming set);
1334 - it should not be in the HARD_REGS_USED regset;
1335 - it should be in the class compatible with original uses;
1336 - it should not be clobbered through reference with different mode;
1337 - if we're in the leaf function, then the new register should
1338 not be in the LEAF_REGISTERS;
1339 - etc.
1341 If several registers meet the conditions, the register with smallest
1342 tick is returned to achieve more even register allocation.
1344 If original register seems to be ok, we set *IS_ORIG_REG_P_PTR to true.
1346 If no register satisfies the above conditions, NULL_RTX is returned. */
1347 static rtx
1348 choose_best_reg_1 (HARD_REG_SET hard_regs_used,
1349 struct reg_rename *reg_rename_p,
1350 def_list_t original_insns, bool *is_orig_reg_p_ptr)
1352 int best_new_reg;
1353 unsigned cur_reg;
1354 machine_mode mode = VOIDmode;
1355 unsigned regno, i, n;
1356 hard_reg_set_iterator hrsi;
1357 def_list_iterator di;
1358 def_t def;
1360 /* If original register is available, return it. */
1361 *is_orig_reg_p_ptr = true;
1363 FOR_EACH_DEF (def, di, original_insns)
1365 rtx orig_dest = SET_DEST (PATTERN (def->orig_insn));
1367 gcc_assert (REG_P (orig_dest));
1369 /* Check that all original operations have the same mode.
1370 This is done for the next loop; if we'd return from this
1371 loop, we'd check only part of them, but in this case
1372 it doesn't matter. */
1373 if (mode == VOIDmode)
1374 mode = GET_MODE (orig_dest);
1375 gcc_assert (mode == GET_MODE (orig_dest));
1377 regno = REGNO (orig_dest);
1378 for (i = 0, n = hard_regno_nregs[regno][mode]; i < n; i++)
1379 if (TEST_HARD_REG_BIT (hard_regs_used, regno + i))
1380 break;
1382 /* All hard registers are available. */
1383 if (i == n)
1385 gcc_assert (mode != VOIDmode);
1387 /* Hard registers should not be shared. */
1388 return gen_rtx_REG (mode, regno);
1392 *is_orig_reg_p_ptr = false;
1393 best_new_reg = -1;
1395 /* Among all available regs choose the register that was
1396 allocated earliest. */
1397 EXECUTE_IF_SET_IN_HARD_REG_SET (reg_rename_p->available_for_renaming,
1398 0, cur_reg, hrsi)
1399 if (! TEST_HARD_REG_BIT (hard_regs_used, cur_reg))
1401 /* Check that all hard regs for mode are available. */
1402 for (i = 1, n = hard_regno_nregs[cur_reg][mode]; i < n; i++)
1403 if (TEST_HARD_REG_BIT (hard_regs_used, cur_reg + i)
1404 || !TEST_HARD_REG_BIT (reg_rename_p->available_for_renaming,
1405 cur_reg + i))
1406 break;
1408 if (i < n)
1409 continue;
1411 /* All hard registers are available. */
1412 if (best_new_reg < 0
1413 || reg_rename_tick[cur_reg] < reg_rename_tick[best_new_reg])
1415 best_new_reg = cur_reg;
1417 /* Return immediately when we know there's no better reg. */
1418 if (! reg_rename_tick[best_new_reg])
1419 break;
1423 if (best_new_reg >= 0)
1425 /* Use the check from the above loop. */
1426 gcc_assert (mode != VOIDmode);
1427 return gen_rtx_REG (mode, best_new_reg);
1430 return NULL_RTX;
1433 /* A wrapper around choose_best_reg_1 () to verify that we make correct
1434 assumptions about available registers in the function. */
1435 static rtx
1436 choose_best_reg (HARD_REG_SET hard_regs_used, struct reg_rename *reg_rename_p,
1437 def_list_t original_insns, bool *is_orig_reg_p_ptr)
1439 rtx best_reg = choose_best_reg_1 (hard_regs_used, reg_rename_p,
1440 original_insns, is_orig_reg_p_ptr);
1442 /* FIXME loop over hard_regno_nregs here. */
1443 gcc_assert (best_reg == NULL_RTX
1444 || TEST_HARD_REG_BIT (sel_hrd.regs_ever_used, REGNO (best_reg)));
1446 return best_reg;
1449 /* Choose the pseudo register for storing rhs value. As this is supposed
1450 to work before reload, we return either the original register or make
1451 the new one. The parameters are the same that in choose_nest_reg_1
1452 functions, except that USED_REGS may contain pseudos.
1453 If we work with hard regs, check also REG_RENAME_P->UNAVAILABLE_HARD_REGS.
1455 TODO: take into account register pressure while doing this. Up to this
1456 moment, this function would never return NULL for pseudos, but we should
1457 not rely on this. */
1458 static rtx
1459 choose_best_pseudo_reg (regset used_regs,
1460 struct reg_rename *reg_rename_p,
1461 def_list_t original_insns, bool *is_orig_reg_p_ptr)
1463 def_list_iterator i;
1464 def_t def;
1465 machine_mode mode = VOIDmode;
1466 bool bad_hard_regs = false;
1468 /* We should not use this after reload. */
1469 gcc_assert (!reload_completed);
1471 /* If original register is available, return it. */
1472 *is_orig_reg_p_ptr = true;
1474 FOR_EACH_DEF (def, i, original_insns)
1476 rtx dest = SET_DEST (PATTERN (def->orig_insn));
1477 int orig_regno;
1479 gcc_assert (REG_P (dest));
1481 /* Check that all original operations have the same mode. */
1482 if (mode == VOIDmode)
1483 mode = GET_MODE (dest);
1484 else
1485 gcc_assert (mode == GET_MODE (dest));
1486 orig_regno = REGNO (dest);
1488 if (!REGNO_REG_SET_P (used_regs, orig_regno))
1490 if (orig_regno < FIRST_PSEUDO_REGISTER)
1492 gcc_assert (df_regs_ever_live_p (orig_regno));
1494 /* For hard registers, we have to check hardware imposed
1495 limitations (frame/stack registers, calls crossed). */
1496 if (!TEST_HARD_REG_BIT (reg_rename_p->unavailable_hard_regs,
1497 orig_regno))
1499 /* Don't let register cross a call if it doesn't already
1500 cross one. This condition is written in accordance with
1501 that in sched-deps.c sched_analyze_reg(). */
1502 if (!reg_rename_p->crosses_call
1503 || REG_N_CALLS_CROSSED (orig_regno) > 0)
1504 return gen_rtx_REG (mode, orig_regno);
1507 bad_hard_regs = true;
1509 else
1510 return dest;
1514 *is_orig_reg_p_ptr = false;
1516 /* We had some original hard registers that couldn't be used.
1517 Those were likely special. Don't try to create a pseudo. */
1518 if (bad_hard_regs)
1519 return NULL_RTX;
1521 /* We haven't found a register from original operations. Get a new one.
1522 FIXME: control register pressure somehow. */
1524 rtx new_reg = gen_reg_rtx (mode);
1526 gcc_assert (mode != VOIDmode);
1528 max_regno = max_reg_num ();
1529 maybe_extend_reg_info_p ();
1530 REG_N_CALLS_CROSSED (REGNO (new_reg)) = reg_rename_p->crosses_call ? 1 : 0;
1532 return new_reg;
1536 /* True when target of EXPR is available due to EXPR_TARGET_AVAILABLE,
1537 USED_REGS and REG_RENAME_P->UNAVAILABLE_HARD_REGS. */
1538 static void
1539 verify_target_availability (expr_t expr, regset used_regs,
1540 struct reg_rename *reg_rename_p)
1542 unsigned n, i, regno;
1543 machine_mode mode;
1544 bool target_available, live_available, hard_available;
1546 if (!REG_P (EXPR_LHS (expr)) || EXPR_TARGET_AVAILABLE (expr) < 0)
1547 return;
1549 regno = expr_dest_regno (expr);
1550 mode = GET_MODE (EXPR_LHS (expr));
1551 target_available = EXPR_TARGET_AVAILABLE (expr) == 1;
1552 n = HARD_REGISTER_NUM_P (regno) ? hard_regno_nregs[regno][mode] : 1;
1554 live_available = hard_available = true;
1555 for (i = 0; i < n; i++)
1557 if (bitmap_bit_p (used_regs, regno + i))
1558 live_available = false;
1559 if (TEST_HARD_REG_BIT (reg_rename_p->unavailable_hard_regs, regno + i))
1560 hard_available = false;
1563 /* When target is not available, it may be due to hard register
1564 restrictions, e.g. crosses calls, so we check hard_available too. */
1565 if (target_available)
1566 gcc_assert (live_available);
1567 else
1568 /* Check only if we haven't scheduled something on the previous fence,
1569 cause due to MAX_SOFTWARE_LOOKAHEAD_WINDOW_SIZE issues
1570 and having more than one fence, we may end having targ_un in a block
1571 in which successors target register is actually available.
1573 The last condition handles the case when a dependence from a call insn
1574 was created in sched-deps.c for insns with destination registers that
1575 never crossed a call before, but do cross one after our code motion.
1577 FIXME: in the latter case, we just uselessly called find_used_regs,
1578 because we can't move this expression with any other register
1579 as well. */
1580 gcc_assert (scheduled_something_on_previous_fence || !live_available
1581 || !hard_available
1582 || (!reload_completed && reg_rename_p->crosses_call
1583 && REG_N_CALLS_CROSSED (regno) == 0));
1586 /* Collect unavailable registers due to liveness for EXPR from BNDS
1587 into USED_REGS. Save additional information about available
1588 registers and unavailable due to hardware restriction registers
1589 into REG_RENAME_P structure. Save original insns into ORIGINAL_INSNS
1590 list. */
1591 static void
1592 collect_unavailable_regs_from_bnds (expr_t expr, blist_t bnds, regset used_regs,
1593 struct reg_rename *reg_rename_p,
1594 def_list_t *original_insns)
1596 for (; bnds; bnds = BLIST_NEXT (bnds))
1598 bool res;
1599 av_set_t orig_ops = NULL;
1600 bnd_t bnd = BLIST_BND (bnds);
1602 /* If the chosen best expr doesn't belong to current boundary,
1603 skip it. */
1604 if (!av_set_is_in_p (BND_AV1 (bnd), EXPR_VINSN (expr)))
1605 continue;
1607 /* Put in ORIG_OPS all exprs from this boundary that became
1608 RES on top. */
1609 orig_ops = find_sequential_best_exprs (bnd, expr, false);
1611 /* Compute used regs and OR it into the USED_REGS. */
1612 res = find_used_regs (BND_TO (bnd), orig_ops, used_regs,
1613 reg_rename_p, original_insns);
1615 /* FIXME: the assert is true until we'd have several boundaries. */
1616 gcc_assert (res);
1617 av_set_clear (&orig_ops);
1621 /* Return TRUE if it is possible to replace LHSes of ORIG_INSNS with BEST_REG.
1622 If BEST_REG is valid, replace LHS of EXPR with it. */
1623 static bool
1624 try_replace_dest_reg (ilist_t orig_insns, rtx best_reg, expr_t expr)
1626 /* Try whether we'll be able to generate the insn
1627 'dest := best_reg' at the place of the original operation. */
1628 for (; orig_insns; orig_insns = ILIST_NEXT (orig_insns))
1630 insn_t orig_insn = DEF_LIST_DEF (orig_insns)->orig_insn;
1632 gcc_assert (EXPR_SEPARABLE_P (INSN_EXPR (orig_insn)));
1634 if (REGNO (best_reg) != REGNO (INSN_LHS (orig_insn))
1635 && (! replace_src_with_reg_ok_p (orig_insn, best_reg)
1636 || ! replace_dest_with_reg_ok_p (orig_insn, best_reg)))
1637 return false;
1640 /* Make sure that EXPR has the right destination
1641 register. */
1642 if (expr_dest_regno (expr) != REGNO (best_reg))
1643 replace_dest_with_reg_in_expr (expr, best_reg);
1644 else
1645 EXPR_TARGET_AVAILABLE (expr) = 1;
1647 return true;
1650 /* Select and assign best register to EXPR searching from BNDS.
1651 Set *IS_ORIG_REG_P to TRUE if original register was selected.
1652 Return FALSE if no register can be chosen, which could happen when:
1653 * EXPR_SEPARABLE_P is true but we were unable to find suitable register;
1654 * EXPR_SEPARABLE_P is false but the insn sets/clobbers one of the registers
1655 that are used on the moving path. */
1656 static bool
1657 find_best_reg_for_expr (expr_t expr, blist_t bnds, bool *is_orig_reg_p)
1659 static struct reg_rename reg_rename_data;
1661 regset used_regs;
1662 def_list_t original_insns = NULL;
1663 bool reg_ok;
1665 *is_orig_reg_p = false;
1667 /* Don't bother to do anything if this insn doesn't set any registers. */
1668 if (bitmap_empty_p (VINSN_REG_SETS (EXPR_VINSN (expr)))
1669 && bitmap_empty_p (VINSN_REG_CLOBBERS (EXPR_VINSN (expr))))
1670 return true;
1672 used_regs = get_clear_regset_from_pool ();
1673 CLEAR_HARD_REG_SET (reg_rename_data.unavailable_hard_regs);
1675 collect_unavailable_regs_from_bnds (expr, bnds, used_regs, &reg_rename_data,
1676 &original_insns);
1678 #ifdef ENABLE_CHECKING
1679 /* If after reload, make sure we're working with hard regs here. */
1680 if (reload_completed)
1682 reg_set_iterator rsi;
1683 unsigned i;
1685 EXECUTE_IF_SET_IN_REG_SET (used_regs, FIRST_PSEUDO_REGISTER, i, rsi)
1686 gcc_unreachable ();
1688 #endif
1690 if (EXPR_SEPARABLE_P (expr))
1692 rtx best_reg = NULL_RTX;
1693 /* Check that we have computed availability of a target register
1694 correctly. */
1695 verify_target_availability (expr, used_regs, &reg_rename_data);
1697 /* Turn everything in hard regs after reload. */
1698 if (reload_completed)
1700 HARD_REG_SET hard_regs_used;
1701 REG_SET_TO_HARD_REG_SET (hard_regs_used, used_regs);
1703 /* Join hard registers unavailable due to register class
1704 restrictions and live range intersection. */
1705 IOR_HARD_REG_SET (hard_regs_used,
1706 reg_rename_data.unavailable_hard_regs);
1708 best_reg = choose_best_reg (hard_regs_used, &reg_rename_data,
1709 original_insns, is_orig_reg_p);
1711 else
1712 best_reg = choose_best_pseudo_reg (used_regs, &reg_rename_data,
1713 original_insns, is_orig_reg_p);
1715 if (!best_reg)
1716 reg_ok = false;
1717 else if (*is_orig_reg_p)
1719 /* In case of unification BEST_REG may be different from EXPR's LHS
1720 when EXPR's LHS is unavailable, and there is another LHS among
1721 ORIGINAL_INSNS. */
1722 reg_ok = try_replace_dest_reg (original_insns, best_reg, expr);
1724 else
1726 /* Forbid renaming of low-cost insns. */
1727 if (sel_vinsn_cost (EXPR_VINSN (expr)) < 2)
1728 reg_ok = false;
1729 else
1730 reg_ok = try_replace_dest_reg (original_insns, best_reg, expr);
1733 else
1735 /* If !EXPR_SCHEDULE_AS_RHS (EXPR), just make sure INSN doesn't set
1736 any of the HARD_REGS_USED set. */
1737 if (vinsn_writes_one_of_regs_p (EXPR_VINSN (expr), used_regs,
1738 reg_rename_data.unavailable_hard_regs))
1740 reg_ok = false;
1741 gcc_assert (EXPR_TARGET_AVAILABLE (expr) <= 0);
1743 else
1745 reg_ok = true;
1746 gcc_assert (EXPR_TARGET_AVAILABLE (expr) != 0);
1750 ilist_clear (&original_insns);
1751 return_regset_to_pool (used_regs);
1753 return reg_ok;
1757 /* Return true if dependence described by DS can be overcomed. */
1758 static bool
1759 can_speculate_dep_p (ds_t ds)
1761 if (spec_info == NULL)
1762 return false;
1764 /* Leave only speculative data. */
1765 ds &= SPECULATIVE;
1767 if (ds == 0)
1768 return false;
1771 /* FIXME: make sched-deps.c produce only those non-hard dependencies,
1772 that we can overcome. */
1773 ds_t spec_mask = spec_info->mask;
1775 if ((ds & spec_mask) != ds)
1776 return false;
1779 if (ds_weak (ds) < spec_info->data_weakness_cutoff)
1780 return false;
1782 return true;
1785 /* Get a speculation check instruction.
1786 C_EXPR is a speculative expression,
1787 CHECK_DS describes speculations that should be checked,
1788 ORIG_INSN is the original non-speculative insn in the stream. */
1789 static insn_t
1790 create_speculation_check (expr_t c_expr, ds_t check_ds, insn_t orig_insn)
1792 rtx check_pattern;
1793 rtx_insn *insn_rtx;
1794 insn_t insn;
1795 basic_block recovery_block;
1796 rtx_insn *label;
1798 /* Create a recovery block if target is going to emit branchy check, or if
1799 ORIG_INSN was speculative already. */
1800 if (targetm.sched.needs_block_p (check_ds)
1801 || EXPR_SPEC_DONE_DS (INSN_EXPR (orig_insn)) != 0)
1803 recovery_block = sel_create_recovery_block (orig_insn);
1804 label = BB_HEAD (recovery_block);
1806 else
1808 recovery_block = NULL;
1809 label = NULL;
1812 /* Get pattern of the check. */
1813 check_pattern = targetm.sched.gen_spec_check (EXPR_INSN_RTX (c_expr), label,
1814 check_ds);
1816 gcc_assert (check_pattern != NULL);
1818 /* Emit check. */
1819 insn_rtx = create_insn_rtx_from_pattern (check_pattern, label);
1821 insn = sel_gen_insn_from_rtx_after (insn_rtx, INSN_EXPR (orig_insn),
1822 INSN_SEQNO (orig_insn), orig_insn);
1824 /* Make check to be non-speculative. */
1825 EXPR_SPEC_DONE_DS (INSN_EXPR (insn)) = 0;
1826 INSN_SPEC_CHECKED_DS (insn) = check_ds;
1828 /* Decrease priority of check by difference of load/check instruction
1829 latencies. */
1830 EXPR_PRIORITY (INSN_EXPR (insn)) -= (sel_vinsn_cost (INSN_VINSN (orig_insn))
1831 - sel_vinsn_cost (INSN_VINSN (insn)));
1833 /* Emit copy of original insn (though with replaced target register,
1834 if needed) to the recovery block. */
1835 if (recovery_block != NULL)
1837 rtx twin_rtx;
1839 twin_rtx = copy_rtx (PATTERN (EXPR_INSN_RTX (c_expr)));
1840 twin_rtx = create_insn_rtx_from_pattern (twin_rtx, NULL_RTX);
1841 sel_gen_recovery_insn_from_rtx_after (twin_rtx,
1842 INSN_EXPR (orig_insn),
1843 INSN_SEQNO (insn),
1844 bb_note (recovery_block));
1847 /* If we've generated a data speculation check, make sure
1848 that all the bookkeeping instruction we'll create during
1849 this move_op () will allocate an ALAT entry so that the
1850 check won't fail.
1851 In case of control speculation we must convert C_EXPR to control
1852 speculative mode, because failing to do so will bring us an exception
1853 thrown by the non-control-speculative load. */
1854 check_ds = ds_get_max_dep_weak (check_ds);
1855 speculate_expr (c_expr, check_ds);
1857 return insn;
1860 /* True when INSN is a "regN = regN" copy. */
1861 static bool
1862 identical_copy_p (rtx insn)
1864 rtx lhs, rhs, pat;
1866 pat = PATTERN (insn);
1868 if (GET_CODE (pat) != SET)
1869 return false;
1871 lhs = SET_DEST (pat);
1872 if (!REG_P (lhs))
1873 return false;
1875 rhs = SET_SRC (pat);
1876 if (!REG_P (rhs))
1877 return false;
1879 return REGNO (lhs) == REGNO (rhs);
1882 /* Undo all transformations on *AV_PTR that were done when
1883 moving through INSN. */
1884 static void
1885 undo_transformations (av_set_t *av_ptr, rtx_insn *insn)
1887 av_set_iterator av_iter;
1888 expr_t expr;
1889 av_set_t new_set = NULL;
1891 /* First, kill any EXPR that uses registers set by an insn. This is
1892 required for correctness. */
1893 FOR_EACH_EXPR_1 (expr, av_iter, av_ptr)
1894 if (!sched_insns_conditions_mutex_p (insn, EXPR_INSN_RTX (expr))
1895 && bitmap_intersect_p (INSN_REG_SETS (insn),
1896 VINSN_REG_USES (EXPR_VINSN (expr)))
1897 /* When an insn looks like 'r1 = r1', we could substitute through
1898 it, but the above condition will still hold. This happened with
1899 gcc.c-torture/execute/961125-1.c. */
1900 && !identical_copy_p (insn))
1902 if (sched_verbose >= 6)
1903 sel_print ("Expr %d removed due to use/set conflict\n",
1904 INSN_UID (EXPR_INSN_RTX (expr)));
1905 av_set_iter_remove (&av_iter);
1908 /* Undo transformations looking at the history vector. */
1909 FOR_EACH_EXPR (expr, av_iter, *av_ptr)
1911 int index = find_in_history_vect (EXPR_HISTORY_OF_CHANGES (expr),
1912 insn, EXPR_VINSN (expr), true);
1914 if (index >= 0)
1916 expr_history_def *phist;
1918 phist = &EXPR_HISTORY_OF_CHANGES (expr)[index];
1920 switch (phist->type)
1922 case TRANS_SPECULATION:
1924 ds_t old_ds, new_ds;
1926 /* Compute the difference between old and new speculative
1927 statuses: that's what we need to check.
1928 Earlier we used to assert that the status will really
1929 change. This no longer works because only the probability
1930 bits in the status may have changed during compute_av_set,
1931 and in the case of merging different probabilities of the
1932 same speculative status along different paths we do not
1933 record this in the history vector. */
1934 old_ds = phist->spec_ds;
1935 new_ds = EXPR_SPEC_DONE_DS (expr);
1937 old_ds &= SPECULATIVE;
1938 new_ds &= SPECULATIVE;
1939 new_ds &= ~old_ds;
1941 EXPR_SPEC_TO_CHECK_DS (expr) |= new_ds;
1942 break;
1944 case TRANS_SUBSTITUTION:
1946 expr_def _tmp_expr, *tmp_expr = &_tmp_expr;
1947 vinsn_t new_vi;
1948 bool add = true;
1950 new_vi = phist->old_expr_vinsn;
1952 gcc_assert (VINSN_SEPARABLE_P (new_vi)
1953 == EXPR_SEPARABLE_P (expr));
1954 copy_expr (tmp_expr, expr);
1956 if (vinsn_equal_p (phist->new_expr_vinsn,
1957 EXPR_VINSN (tmp_expr)))
1958 change_vinsn_in_expr (tmp_expr, new_vi);
1959 else
1960 /* This happens when we're unsubstituting on a bookkeeping
1961 copy, which was in turn substituted. The history is wrong
1962 in this case. Do it the hard way. */
1963 add = substitute_reg_in_expr (tmp_expr, insn, true);
1964 if (add)
1965 av_set_add (&new_set, tmp_expr);
1966 clear_expr (tmp_expr);
1967 break;
1969 default:
1970 gcc_unreachable ();
1976 av_set_union_and_clear (av_ptr, &new_set, NULL);
1980 /* Moveup_* helpers for code motion and computing av sets. */
1982 /* Propagates EXPR inside an insn group through THROUGH_INSN.
1983 The difference from the below function is that only substitution is
1984 performed. */
1985 static enum MOVEUP_EXPR_CODE
1986 moveup_expr_inside_insn_group (expr_t expr, insn_t through_insn)
1988 vinsn_t vi = EXPR_VINSN (expr);
1989 ds_t *has_dep_p;
1990 ds_t full_ds;
1992 /* Do this only inside insn group. */
1993 gcc_assert (INSN_SCHED_CYCLE (through_insn) > 0);
1995 full_ds = has_dependence_p (expr, through_insn, &has_dep_p);
1996 if (full_ds == 0)
1997 return MOVEUP_EXPR_SAME;
1999 /* Substitution is the possible choice in this case. */
2000 if (has_dep_p[DEPS_IN_RHS])
2002 /* Can't substitute UNIQUE VINSNs. */
2003 gcc_assert (!VINSN_UNIQUE_P (vi));
2005 if (can_substitute_through_p (through_insn,
2006 has_dep_p[DEPS_IN_RHS])
2007 && substitute_reg_in_expr (expr, through_insn, false))
2009 EXPR_WAS_SUBSTITUTED (expr) = true;
2010 return MOVEUP_EXPR_CHANGED;
2013 /* Don't care about this, as even true dependencies may be allowed
2014 in an insn group. */
2015 return MOVEUP_EXPR_SAME;
2018 /* This can catch output dependencies in COND_EXECs. */
2019 if (has_dep_p[DEPS_IN_INSN])
2020 return MOVEUP_EXPR_NULL;
2022 /* This is either an output or an anti dependence, which usually have
2023 a zero latency. Allow this here, if we'd be wrong, tick_check_p
2024 will fix this. */
2025 gcc_assert (has_dep_p[DEPS_IN_LHS]);
2026 return MOVEUP_EXPR_AS_RHS;
2029 /* True when a trapping EXPR cannot be moved through THROUGH_INSN. */
2030 #define CANT_MOVE_TRAPPING(expr, through_insn) \
2031 (VINSN_MAY_TRAP_P (EXPR_VINSN (expr)) \
2032 && !sel_insn_has_single_succ_p ((through_insn), SUCCS_ALL) \
2033 && !sel_insn_is_speculation_check (through_insn))
2035 /* True when a conflict on a target register was found during moveup_expr. */
2036 static bool was_target_conflict = false;
2038 /* Return true when moving a debug INSN across THROUGH_INSN will
2039 create a bookkeeping block. We don't want to create such blocks,
2040 for they would cause codegen differences between compilations with
2041 and without debug info. */
2043 static bool
2044 moving_insn_creates_bookkeeping_block_p (insn_t insn,
2045 insn_t through_insn)
2047 basic_block bbi, bbt;
2048 edge e1, e2;
2049 edge_iterator ei1, ei2;
2051 if (!bookkeeping_can_be_created_if_moved_through_p (through_insn))
2053 if (sched_verbose >= 9)
2054 sel_print ("no bookkeeping required: ");
2055 return FALSE;
2058 bbi = BLOCK_FOR_INSN (insn);
2060 if (EDGE_COUNT (bbi->preds) == 1)
2062 if (sched_verbose >= 9)
2063 sel_print ("only one pred edge: ");
2064 return TRUE;
2067 bbt = BLOCK_FOR_INSN (through_insn);
2069 FOR_EACH_EDGE (e1, ei1, bbt->succs)
2071 FOR_EACH_EDGE (e2, ei2, bbi->preds)
2073 if (find_block_for_bookkeeping (e1, e2, TRUE))
2075 if (sched_verbose >= 9)
2076 sel_print ("found existing block: ");
2077 return FALSE;
2082 if (sched_verbose >= 9)
2083 sel_print ("would create bookkeeping block: ");
2085 return TRUE;
2088 /* Return true when the conflict with newly created implicit clobbers
2089 between EXPR and THROUGH_INSN is found because of renaming. */
2090 static bool
2091 implicit_clobber_conflict_p (insn_t through_insn, expr_t expr)
2093 HARD_REG_SET temp;
2094 rtx_insn *insn;
2095 rtx reg, rhs, pat;
2096 hard_reg_set_iterator hrsi;
2097 unsigned regno;
2098 bool valid;
2100 /* Make a new pseudo register. */
2101 reg = gen_reg_rtx (GET_MODE (EXPR_LHS (expr)));
2102 max_regno = max_reg_num ();
2103 maybe_extend_reg_info_p ();
2105 /* Validate a change and bail out early. */
2106 insn = EXPR_INSN_RTX (expr);
2107 validate_change (insn, &SET_DEST (PATTERN (insn)), reg, true);
2108 valid = verify_changes (0);
2109 cancel_changes (0);
2110 if (!valid)
2112 if (sched_verbose >= 6)
2113 sel_print ("implicit clobbers failed validation, ");
2114 return true;
2117 /* Make a new insn with it. */
2118 rhs = copy_rtx (VINSN_RHS (EXPR_VINSN (expr)));
2119 pat = gen_rtx_SET (VOIDmode, reg, rhs);
2120 start_sequence ();
2121 insn = emit_insn (pat);
2122 end_sequence ();
2124 /* Calculate implicit clobbers. */
2125 extract_insn (insn);
2126 preprocess_constraints (insn);
2127 ira_implicitly_set_insn_hard_regs (&temp);
2128 AND_COMPL_HARD_REG_SET (temp, ira_no_alloc_regs);
2130 /* If any implicit clobber registers intersect with regular ones in
2131 through_insn, we have a dependency and thus bail out. */
2132 EXECUTE_IF_SET_IN_HARD_REG_SET (temp, 0, regno, hrsi)
2134 vinsn_t vi = INSN_VINSN (through_insn);
2135 if (bitmap_bit_p (VINSN_REG_SETS (vi), regno)
2136 || bitmap_bit_p (VINSN_REG_CLOBBERS (vi), regno)
2137 || bitmap_bit_p (VINSN_REG_USES (vi), regno))
2138 return true;
2141 return false;
2144 /* Modifies EXPR so it can be moved through the THROUGH_INSN,
2145 performing necessary transformations. Record the type of transformation
2146 made in PTRANS_TYPE, when it is not NULL. When INSIDE_INSN_GROUP,
2147 permit all dependencies except true ones, and try to remove those
2148 too via forward substitution. All cases when a non-eliminable
2149 non-zero cost dependency exists inside an insn group will be fixed
2150 in tick_check_p instead. */
2151 static enum MOVEUP_EXPR_CODE
2152 moveup_expr (expr_t expr, insn_t through_insn, bool inside_insn_group,
2153 enum local_trans_type *ptrans_type)
2155 vinsn_t vi = EXPR_VINSN (expr);
2156 insn_t insn = VINSN_INSN_RTX (vi);
2157 bool was_changed = false;
2158 bool as_rhs = false;
2159 ds_t *has_dep_p;
2160 ds_t full_ds;
2162 /* ??? We use dependencies of non-debug insns on debug insns to
2163 indicate that the debug insns need to be reset if the non-debug
2164 insn is pulled ahead of it. It's hard to figure out how to
2165 introduce such a notion in sel-sched, but it already fails to
2166 support debug insns in other ways, so we just go ahead and
2167 let the deug insns go corrupt for now. */
2168 if (DEBUG_INSN_P (through_insn) && !DEBUG_INSN_P (insn))
2169 return MOVEUP_EXPR_SAME;
2171 /* When inside_insn_group, delegate to the helper. */
2172 if (inside_insn_group)
2173 return moveup_expr_inside_insn_group (expr, through_insn);
2175 /* Deal with unique insns and control dependencies. */
2176 if (VINSN_UNIQUE_P (vi))
2178 /* We can move jumps without side-effects or jumps that are
2179 mutually exclusive with instruction THROUGH_INSN (all in cases
2180 dependencies allow to do so and jump is not speculative). */
2181 if (control_flow_insn_p (insn))
2183 basic_block fallthru_bb;
2185 /* Do not move checks and do not move jumps through other
2186 jumps. */
2187 if (control_flow_insn_p (through_insn)
2188 || sel_insn_is_speculation_check (insn))
2189 return MOVEUP_EXPR_NULL;
2191 /* Don't move jumps through CFG joins. */
2192 if (bookkeeping_can_be_created_if_moved_through_p (through_insn))
2193 return MOVEUP_EXPR_NULL;
2195 /* The jump should have a clear fallthru block, and
2196 this block should be in the current region. */
2197 if ((fallthru_bb = fallthru_bb_of_jump (insn)) == NULL
2198 || ! in_current_region_p (fallthru_bb))
2199 return MOVEUP_EXPR_NULL;
2201 /* And it should be mutually exclusive with through_insn. */
2202 if (! sched_insns_conditions_mutex_p (insn, through_insn)
2203 && ! DEBUG_INSN_P (through_insn))
2204 return MOVEUP_EXPR_NULL;
2207 /* Don't move what we can't move. */
2208 if (EXPR_CANT_MOVE (expr)
2209 && BLOCK_FOR_INSN (through_insn) != BLOCK_FOR_INSN (insn))
2210 return MOVEUP_EXPR_NULL;
2212 /* Don't move SCHED_GROUP instruction through anything.
2213 If we don't force this, then it will be possible to start
2214 scheduling a sched_group before all its dependencies are
2215 resolved.
2216 ??? Haifa deals with this issue by delaying the SCHED_GROUP
2217 as late as possible through rank_for_schedule. */
2218 if (SCHED_GROUP_P (insn))
2219 return MOVEUP_EXPR_NULL;
2221 else
2222 gcc_assert (!control_flow_insn_p (insn));
2224 /* Don't move debug insns if this would require bookkeeping. */
2225 if (DEBUG_INSN_P (insn)
2226 && BLOCK_FOR_INSN (through_insn) != BLOCK_FOR_INSN (insn)
2227 && moving_insn_creates_bookkeeping_block_p (insn, through_insn))
2228 return MOVEUP_EXPR_NULL;
2230 /* Deal with data dependencies. */
2231 was_target_conflict = false;
2232 full_ds = has_dependence_p (expr, through_insn, &has_dep_p);
2233 if (full_ds == 0)
2235 if (!CANT_MOVE_TRAPPING (expr, through_insn))
2236 return MOVEUP_EXPR_SAME;
2238 else
2240 /* We can move UNIQUE insn up only as a whole and unchanged,
2241 so it shouldn't have any dependencies. */
2242 if (VINSN_UNIQUE_P (vi))
2243 return MOVEUP_EXPR_NULL;
2246 if (full_ds != 0 && can_speculate_dep_p (full_ds))
2248 int res;
2250 res = speculate_expr (expr, full_ds);
2251 if (res >= 0)
2253 /* Speculation was successful. */
2254 full_ds = 0;
2255 was_changed = (res > 0);
2256 if (res == 2)
2257 was_target_conflict = true;
2258 if (ptrans_type)
2259 *ptrans_type = TRANS_SPECULATION;
2260 sel_clear_has_dependence ();
2264 if (has_dep_p[DEPS_IN_INSN])
2265 /* We have some dependency that cannot be discarded. */
2266 return MOVEUP_EXPR_NULL;
2268 if (has_dep_p[DEPS_IN_LHS])
2270 /* Only separable insns can be moved up with the new register.
2271 Anyways, we should mark that the original register is
2272 unavailable. */
2273 if (!enable_schedule_as_rhs_p || !EXPR_SEPARABLE_P (expr))
2274 return MOVEUP_EXPR_NULL;
2276 /* When renaming a hard register to a pseudo before reload, extra
2277 dependencies can occur from the implicit clobbers of the insn.
2278 Filter out such cases here. */
2279 if (!reload_completed && REG_P (EXPR_LHS (expr))
2280 && HARD_REGISTER_P (EXPR_LHS (expr))
2281 && implicit_clobber_conflict_p (through_insn, expr))
2283 if (sched_verbose >= 6)
2284 sel_print ("implicit clobbers conflict detected, ");
2285 return MOVEUP_EXPR_NULL;
2287 EXPR_TARGET_AVAILABLE (expr) = false;
2288 was_target_conflict = true;
2289 as_rhs = true;
2292 /* At this point we have either separable insns, that will be lifted
2293 up only as RHSes, or non-separable insns with no dependency in lhs.
2294 If dependency is in RHS, then try to perform substitution and move up
2295 substituted RHS:
2297 Ex. 1: Ex.2
2298 y = x; y = x;
2299 z = y*2; y = y*2;
2301 In Ex.1 y*2 can be substituted for x*2 and the whole operation can be
2302 moved above y=x assignment as z=x*2.
2304 In Ex.2 y*2 also can be substituted for x*2, but only the right hand
2305 side can be moved because of the output dependency. The operation was
2306 cropped to its rhs above. */
2307 if (has_dep_p[DEPS_IN_RHS])
2309 ds_t *rhs_dsp = &has_dep_p[DEPS_IN_RHS];
2311 /* Can't substitute UNIQUE VINSNs. */
2312 gcc_assert (!VINSN_UNIQUE_P (vi));
2314 if (can_speculate_dep_p (*rhs_dsp))
2316 int res;
2318 res = speculate_expr (expr, *rhs_dsp);
2319 if (res >= 0)
2321 /* Speculation was successful. */
2322 *rhs_dsp = 0;
2323 was_changed = (res > 0);
2324 if (res == 2)
2325 was_target_conflict = true;
2326 if (ptrans_type)
2327 *ptrans_type = TRANS_SPECULATION;
2329 else
2330 return MOVEUP_EXPR_NULL;
2332 else if (can_substitute_through_p (through_insn,
2333 *rhs_dsp)
2334 && substitute_reg_in_expr (expr, through_insn, false))
2336 /* ??? We cannot perform substitution AND speculation on the same
2337 insn. */
2338 gcc_assert (!was_changed);
2339 was_changed = true;
2340 if (ptrans_type)
2341 *ptrans_type = TRANS_SUBSTITUTION;
2342 EXPR_WAS_SUBSTITUTED (expr) = true;
2344 else
2345 return MOVEUP_EXPR_NULL;
2348 /* Don't move trapping insns through jumps.
2349 This check should be at the end to give a chance to control speculation
2350 to perform its duties. */
2351 if (CANT_MOVE_TRAPPING (expr, through_insn))
2352 return MOVEUP_EXPR_NULL;
2354 return (was_changed
2355 ? MOVEUP_EXPR_CHANGED
2356 : (as_rhs
2357 ? MOVEUP_EXPR_AS_RHS
2358 : MOVEUP_EXPR_SAME));
2361 /* Try to look at bitmap caches for EXPR and INSN pair, return true
2362 if successful. When INSIDE_INSN_GROUP, also try ignore dependencies
2363 that can exist within a parallel group. Write to RES the resulting
2364 code for moveup_expr. */
2365 static bool
2366 try_bitmap_cache (expr_t expr, insn_t insn,
2367 bool inside_insn_group,
2368 enum MOVEUP_EXPR_CODE *res)
2370 int expr_uid = INSN_UID (EXPR_INSN_RTX (expr));
2372 /* First check whether we've analyzed this situation already. */
2373 if (bitmap_bit_p (INSN_ANALYZED_DEPS (insn), expr_uid))
2375 if (bitmap_bit_p (INSN_FOUND_DEPS (insn), expr_uid))
2377 if (sched_verbose >= 6)
2378 sel_print ("removed (cached)\n");
2379 *res = MOVEUP_EXPR_NULL;
2380 return true;
2382 else
2384 if (sched_verbose >= 6)
2385 sel_print ("unchanged (cached)\n");
2386 *res = MOVEUP_EXPR_SAME;
2387 return true;
2390 else if (bitmap_bit_p (INSN_FOUND_DEPS (insn), expr_uid))
2392 if (inside_insn_group)
2394 if (sched_verbose >= 6)
2395 sel_print ("unchanged (as RHS, cached, inside insn group)\n");
2396 *res = MOVEUP_EXPR_SAME;
2397 return true;
2400 else
2401 EXPR_TARGET_AVAILABLE (expr) = false;
2403 /* This is the only case when propagation result can change over time,
2404 as we can dynamically switch off scheduling as RHS. In this case,
2405 just check the flag to reach the correct decision. */
2406 if (enable_schedule_as_rhs_p)
2408 if (sched_verbose >= 6)
2409 sel_print ("unchanged (as RHS, cached)\n");
2410 *res = MOVEUP_EXPR_AS_RHS;
2411 return true;
2413 else
2415 if (sched_verbose >= 6)
2416 sel_print ("removed (cached as RHS, but renaming"
2417 " is now disabled)\n");
2418 *res = MOVEUP_EXPR_NULL;
2419 return true;
2423 return false;
2426 /* Try to look at bitmap caches for EXPR and INSN pair, return true
2427 if successful. Write to RES the resulting code for moveup_expr. */
2428 static bool
2429 try_transformation_cache (expr_t expr, insn_t insn,
2430 enum MOVEUP_EXPR_CODE *res)
2432 struct transformed_insns *pti
2433 = (struct transformed_insns *)
2434 htab_find_with_hash (INSN_TRANSFORMED_INSNS (insn),
2435 &EXPR_VINSN (expr),
2436 VINSN_HASH_RTX (EXPR_VINSN (expr)));
2437 if (pti)
2439 /* This EXPR was already moved through this insn and was
2440 changed as a result. Fetch the proper data from
2441 the hashtable. */
2442 insert_in_history_vect (&EXPR_HISTORY_OF_CHANGES (expr),
2443 INSN_UID (insn), pti->type,
2444 pti->vinsn_old, pti->vinsn_new,
2445 EXPR_SPEC_DONE_DS (expr));
2447 if (INSN_IN_STREAM_P (VINSN_INSN_RTX (pti->vinsn_new)))
2448 pti->vinsn_new = vinsn_copy (pti->vinsn_new, true);
2449 change_vinsn_in_expr (expr, pti->vinsn_new);
2450 if (pti->was_target_conflict)
2451 EXPR_TARGET_AVAILABLE (expr) = false;
2452 if (pti->type == TRANS_SPECULATION)
2454 EXPR_SPEC_DONE_DS (expr) = pti->ds;
2455 EXPR_NEEDS_SPEC_CHECK_P (expr) |= pti->needs_check;
2458 if (sched_verbose >= 6)
2460 sel_print ("changed (cached): ");
2461 dump_expr (expr);
2462 sel_print ("\n");
2465 *res = MOVEUP_EXPR_CHANGED;
2466 return true;
2469 return false;
2472 /* Update bitmap caches on INSN with result RES of propagating EXPR. */
2473 static void
2474 update_bitmap_cache (expr_t expr, insn_t insn, bool inside_insn_group,
2475 enum MOVEUP_EXPR_CODE res)
2477 int expr_uid = INSN_UID (EXPR_INSN_RTX (expr));
2479 /* Do not cache result of propagating jumps through an insn group,
2480 as it is always true, which is not useful outside the group. */
2481 if (inside_insn_group)
2482 return;
2484 if (res == MOVEUP_EXPR_NULL)
2486 bitmap_set_bit (INSN_ANALYZED_DEPS (insn), expr_uid);
2487 bitmap_set_bit (INSN_FOUND_DEPS (insn), expr_uid);
2489 else if (res == MOVEUP_EXPR_SAME)
2491 bitmap_set_bit (INSN_ANALYZED_DEPS (insn), expr_uid);
2492 bitmap_clear_bit (INSN_FOUND_DEPS (insn), expr_uid);
2494 else if (res == MOVEUP_EXPR_AS_RHS)
2496 bitmap_clear_bit (INSN_ANALYZED_DEPS (insn), expr_uid);
2497 bitmap_set_bit (INSN_FOUND_DEPS (insn), expr_uid);
2499 else
2500 gcc_unreachable ();
2503 /* Update hashtable on INSN with changed EXPR, old EXPR_OLD_VINSN
2504 and transformation type TRANS_TYPE. */
2505 static void
2506 update_transformation_cache (expr_t expr, insn_t insn,
2507 bool inside_insn_group,
2508 enum local_trans_type trans_type,
2509 vinsn_t expr_old_vinsn)
2511 struct transformed_insns *pti;
2513 if (inside_insn_group)
2514 return;
2516 pti = XNEW (struct transformed_insns);
2517 pti->vinsn_old = expr_old_vinsn;
2518 pti->vinsn_new = EXPR_VINSN (expr);
2519 pti->type = trans_type;
2520 pti->was_target_conflict = was_target_conflict;
2521 pti->ds = EXPR_SPEC_DONE_DS (expr);
2522 pti->needs_check = EXPR_NEEDS_SPEC_CHECK_P (expr);
2523 vinsn_attach (pti->vinsn_old);
2524 vinsn_attach (pti->vinsn_new);
2525 *((struct transformed_insns **)
2526 htab_find_slot_with_hash (INSN_TRANSFORMED_INSNS (insn),
2527 pti, VINSN_HASH_RTX (expr_old_vinsn),
2528 INSERT)) = pti;
2531 /* Same as moveup_expr, but first looks up the result of
2532 transformation in caches. */
2533 static enum MOVEUP_EXPR_CODE
2534 moveup_expr_cached (expr_t expr, insn_t insn, bool inside_insn_group)
2536 enum MOVEUP_EXPR_CODE res;
2537 bool got_answer = false;
2539 if (sched_verbose >= 6)
2541 sel_print ("Moving ");
2542 dump_expr (expr);
2543 sel_print (" through %d: ", INSN_UID (insn));
2546 if (DEBUG_INSN_P (EXPR_INSN_RTX (expr))
2547 && (sel_bb_head (BLOCK_FOR_INSN (EXPR_INSN_RTX (expr)))
2548 == EXPR_INSN_RTX (expr)))
2549 /* Don't use cached information for debug insns that are heads of
2550 basic blocks. */;
2551 else if (try_bitmap_cache (expr, insn, inside_insn_group, &res))
2552 /* When inside insn group, we do not want remove stores conflicting
2553 with previosly issued loads. */
2554 got_answer = ! inside_insn_group || res != MOVEUP_EXPR_NULL;
2555 else if (try_transformation_cache (expr, insn, &res))
2556 got_answer = true;
2558 if (! got_answer)
2560 /* Invoke moveup_expr and record the results. */
2561 vinsn_t expr_old_vinsn = EXPR_VINSN (expr);
2562 ds_t expr_old_spec_ds = EXPR_SPEC_DONE_DS (expr);
2563 int expr_uid = INSN_UID (VINSN_INSN_RTX (expr_old_vinsn));
2564 bool unique_p = VINSN_UNIQUE_P (expr_old_vinsn);
2565 enum local_trans_type trans_type = TRANS_SUBSTITUTION;
2567 /* ??? Invent something better than this. We can't allow old_vinsn
2568 to go, we need it for the history vector. */
2569 vinsn_attach (expr_old_vinsn);
2571 res = moveup_expr (expr, insn, inside_insn_group,
2572 &trans_type);
2573 switch (res)
2575 case MOVEUP_EXPR_NULL:
2576 update_bitmap_cache (expr, insn, inside_insn_group, res);
2577 if (sched_verbose >= 6)
2578 sel_print ("removed\n");
2579 break;
2581 case MOVEUP_EXPR_SAME:
2582 update_bitmap_cache (expr, insn, inside_insn_group, res);
2583 if (sched_verbose >= 6)
2584 sel_print ("unchanged\n");
2585 break;
2587 case MOVEUP_EXPR_AS_RHS:
2588 gcc_assert (!unique_p || inside_insn_group);
2589 update_bitmap_cache (expr, insn, inside_insn_group, res);
2590 if (sched_verbose >= 6)
2591 sel_print ("unchanged (as RHS)\n");
2592 break;
2594 case MOVEUP_EXPR_CHANGED:
2595 gcc_assert (INSN_UID (EXPR_INSN_RTX (expr)) != expr_uid
2596 || EXPR_SPEC_DONE_DS (expr) != expr_old_spec_ds);
2597 insert_in_history_vect (&EXPR_HISTORY_OF_CHANGES (expr),
2598 INSN_UID (insn), trans_type,
2599 expr_old_vinsn, EXPR_VINSN (expr),
2600 expr_old_spec_ds);
2601 update_transformation_cache (expr, insn, inside_insn_group,
2602 trans_type, expr_old_vinsn);
2603 if (sched_verbose >= 6)
2605 sel_print ("changed: ");
2606 dump_expr (expr);
2607 sel_print ("\n");
2609 break;
2610 default:
2611 gcc_unreachable ();
2614 vinsn_detach (expr_old_vinsn);
2617 return res;
2620 /* Moves an av set AVP up through INSN, performing necessary
2621 transformations. */
2622 static void
2623 moveup_set_expr (av_set_t *avp, insn_t insn, bool inside_insn_group)
2625 av_set_iterator i;
2626 expr_t expr;
2628 FOR_EACH_EXPR_1 (expr, i, avp)
2631 switch (moveup_expr_cached (expr, insn, inside_insn_group))
2633 case MOVEUP_EXPR_SAME:
2634 case MOVEUP_EXPR_AS_RHS:
2635 break;
2637 case MOVEUP_EXPR_NULL:
2638 av_set_iter_remove (&i);
2639 break;
2641 case MOVEUP_EXPR_CHANGED:
2642 expr = merge_with_other_exprs (avp, &i, expr);
2643 break;
2645 default:
2646 gcc_unreachable ();
2651 /* Moves AVP set along PATH. */
2652 static void
2653 moveup_set_inside_insn_group (av_set_t *avp, ilist_t path)
2655 int last_cycle;
2657 if (sched_verbose >= 6)
2658 sel_print ("Moving expressions up in the insn group...\n");
2659 if (! path)
2660 return;
2661 last_cycle = INSN_SCHED_CYCLE (ILIST_INSN (path));
2662 while (path
2663 && INSN_SCHED_CYCLE (ILIST_INSN (path)) == last_cycle)
2665 moveup_set_expr (avp, ILIST_INSN (path), true);
2666 path = ILIST_NEXT (path);
2670 /* Returns true if after moving EXPR along PATH it equals to EXPR_VLIW. */
2671 static bool
2672 equal_after_moveup_path_p (expr_t expr, ilist_t path, expr_t expr_vliw)
2674 expr_def _tmp, *tmp = &_tmp;
2675 int last_cycle;
2676 bool res = true;
2678 copy_expr_onside (tmp, expr);
2679 last_cycle = path ? INSN_SCHED_CYCLE (ILIST_INSN (path)) : 0;
2680 while (path
2681 && res
2682 && INSN_SCHED_CYCLE (ILIST_INSN (path)) == last_cycle)
2684 res = (moveup_expr_cached (tmp, ILIST_INSN (path), true)
2685 != MOVEUP_EXPR_NULL);
2686 path = ILIST_NEXT (path);
2689 if (res)
2691 vinsn_t tmp_vinsn = EXPR_VINSN (tmp);
2692 vinsn_t expr_vliw_vinsn = EXPR_VINSN (expr_vliw);
2694 if (tmp_vinsn != expr_vliw_vinsn)
2695 res = vinsn_equal_p (tmp_vinsn, expr_vliw_vinsn);
2698 clear_expr (tmp);
2699 return res;
2703 /* Functions that compute av and lv sets. */
2705 /* Returns true if INSN is not a downward continuation of the given path P in
2706 the current stage. */
2707 static bool
2708 is_ineligible_successor (insn_t insn, ilist_t p)
2710 insn_t prev_insn;
2712 /* Check if insn is not deleted. */
2713 if (PREV_INSN (insn) && NEXT_INSN (PREV_INSN (insn)) != insn)
2714 gcc_unreachable ();
2715 else if (NEXT_INSN (insn) && PREV_INSN (NEXT_INSN (insn)) != insn)
2716 gcc_unreachable ();
2718 /* If it's the first insn visited, then the successor is ok. */
2719 if (!p)
2720 return false;
2722 prev_insn = ILIST_INSN (p);
2724 if (/* a backward edge. */
2725 INSN_SEQNO (insn) < INSN_SEQNO (prev_insn)
2726 /* is already visited. */
2727 || (INSN_SEQNO (insn) == INSN_SEQNO (prev_insn)
2728 && (ilist_is_in_p (p, insn)
2729 /* We can reach another fence here and still seqno of insn
2730 would be equal to seqno of prev_insn. This is possible
2731 when prev_insn is a previously created bookkeeping copy.
2732 In that case it'd get a seqno of insn. Thus, check here
2733 whether insn is in current fence too. */
2734 || IN_CURRENT_FENCE_P (insn)))
2735 /* Was already scheduled on this round. */
2736 || (INSN_SEQNO (insn) > INSN_SEQNO (prev_insn)
2737 && IN_CURRENT_FENCE_P (insn))
2738 /* An insn from another fence could also be
2739 scheduled earlier even if this insn is not in
2740 a fence list right now. Check INSN_SCHED_CYCLE instead. */
2741 || (!pipelining_p
2742 && INSN_SCHED_TIMES (insn) > 0))
2743 return true;
2744 else
2745 return false;
2748 /* Computes the av_set below the last bb insn INSN, doing all the 'dirty work'
2749 of handling multiple successors and properly merging its av_sets. P is
2750 the current path traversed. WS is the size of lookahead window.
2751 Return the av set computed. */
2752 static av_set_t
2753 compute_av_set_at_bb_end (insn_t insn, ilist_t p, int ws)
2755 struct succs_info *sinfo;
2756 av_set_t expr_in_all_succ_branches = NULL;
2757 int is;
2758 insn_t succ, zero_succ = NULL;
2759 av_set_t av1 = NULL;
2761 gcc_assert (sel_bb_end_p (insn));
2763 /* Find different kind of successors needed for correct computing of
2764 SPEC and TARGET_AVAILABLE attributes. */
2765 sinfo = compute_succs_info (insn, SUCCS_NORMAL);
2767 /* Debug output. */
2768 if (sched_verbose >= 6)
2770 sel_print ("successors of bb end (%d): ", INSN_UID (insn));
2771 dump_insn_vector (sinfo->succs_ok);
2772 sel_print ("\n");
2773 if (sinfo->succs_ok_n != sinfo->all_succs_n)
2774 sel_print ("real successors num: %d\n", sinfo->all_succs_n);
2777 /* Add insn to the tail of current path. */
2778 ilist_add (&p, insn);
2780 FOR_EACH_VEC_ELT (sinfo->succs_ok, is, succ)
2782 av_set_t succ_set;
2784 /* We will edit SUCC_SET and EXPR_SPEC field of its elements. */
2785 succ_set = compute_av_set_inside_bb (succ, p, ws, true);
2787 av_set_split_usefulness (succ_set,
2788 sinfo->probs_ok[is],
2789 sinfo->all_prob);
2791 if (sinfo->all_succs_n > 1)
2793 /* Find EXPR'es that came from *all* successors and save them
2794 into expr_in_all_succ_branches. This set will be used later
2795 for calculating speculation attributes of EXPR'es. */
2796 if (is == 0)
2798 expr_in_all_succ_branches = av_set_copy (succ_set);
2800 /* Remember the first successor for later. */
2801 zero_succ = succ;
2803 else
2805 av_set_iterator i;
2806 expr_t expr;
2808 FOR_EACH_EXPR_1 (expr, i, &expr_in_all_succ_branches)
2809 if (!av_set_is_in_p (succ_set, EXPR_VINSN (expr)))
2810 av_set_iter_remove (&i);
2814 /* Union the av_sets. Check liveness restrictions on target registers
2815 in special case of two successors. */
2816 if (sinfo->succs_ok_n == 2 && is == 1)
2818 basic_block bb0 = BLOCK_FOR_INSN (zero_succ);
2819 basic_block bb1 = BLOCK_FOR_INSN (succ);
2821 gcc_assert (BB_LV_SET_VALID_P (bb0) && BB_LV_SET_VALID_P (bb1));
2822 av_set_union_and_live (&av1, &succ_set,
2823 BB_LV_SET (bb0),
2824 BB_LV_SET (bb1),
2825 insn);
2827 else
2828 av_set_union_and_clear (&av1, &succ_set, insn);
2831 /* Check liveness restrictions via hard way when there are more than
2832 two successors. */
2833 if (sinfo->succs_ok_n > 2)
2834 FOR_EACH_VEC_ELT (sinfo->succs_ok, is, succ)
2836 basic_block succ_bb = BLOCK_FOR_INSN (succ);
2838 gcc_assert (BB_LV_SET_VALID_P (succ_bb));
2839 mark_unavailable_targets (av1, BB_AV_SET (succ_bb),
2840 BB_LV_SET (succ_bb));
2843 /* Finally, check liveness restrictions on paths leaving the region. */
2844 if (sinfo->all_succs_n > sinfo->succs_ok_n)
2845 FOR_EACH_VEC_ELT (sinfo->succs_other, is, succ)
2846 mark_unavailable_targets
2847 (av1, NULL, BB_LV_SET (BLOCK_FOR_INSN (succ)));
2849 if (sinfo->all_succs_n > 1)
2851 av_set_iterator i;
2852 expr_t expr;
2854 /* Increase the spec attribute of all EXPR'es that didn't come
2855 from all successors. */
2856 FOR_EACH_EXPR (expr, i, av1)
2857 if (!av_set_is_in_p (expr_in_all_succ_branches, EXPR_VINSN (expr)))
2858 EXPR_SPEC (expr)++;
2860 av_set_clear (&expr_in_all_succ_branches);
2862 /* Do not move conditional branches through other
2863 conditional branches. So, remove all conditional
2864 branches from av_set if current operator is a conditional
2865 branch. */
2866 av_set_substract_cond_branches (&av1);
2869 ilist_remove (&p);
2870 free_succs_info (sinfo);
2872 if (sched_verbose >= 6)
2874 sel_print ("av_succs (%d): ", INSN_UID (insn));
2875 dump_av_set (av1);
2876 sel_print ("\n");
2879 return av1;
2882 /* This function computes av_set for the FIRST_INSN by dragging valid
2883 av_set through all basic block insns either from the end of basic block
2884 (computed using compute_av_set_at_bb_end) or from the insn on which
2885 MAX_WS was exceeded. It uses compute_av_set_at_bb_end to compute av_set
2886 below the basic block and handling conditional branches.
2887 FIRST_INSN - the basic block head, P - path consisting of the insns
2888 traversed on the way to the FIRST_INSN (the path is sparse, only bb heads
2889 and bb ends are added to the path), WS - current window size,
2890 NEED_COPY_P - true if we'll make a copy of av_set before returning it. */
2891 static av_set_t
2892 compute_av_set_inside_bb (insn_t first_insn, ilist_t p, int ws,
2893 bool need_copy_p)
2895 insn_t cur_insn;
2896 int end_ws = ws;
2897 insn_t bb_end = sel_bb_end (BLOCK_FOR_INSN (first_insn));
2898 insn_t after_bb_end = NEXT_INSN (bb_end);
2899 insn_t last_insn;
2900 av_set_t av = NULL;
2901 basic_block cur_bb = BLOCK_FOR_INSN (first_insn);
2903 /* Return NULL if insn is not on the legitimate downward path. */
2904 if (is_ineligible_successor (first_insn, p))
2906 if (sched_verbose >= 6)
2907 sel_print ("Insn %d is ineligible_successor\n", INSN_UID (first_insn));
2909 return NULL;
2912 /* If insn already has valid av(insn) computed, just return it. */
2913 if (AV_SET_VALID_P (first_insn))
2915 av_set_t av_set;
2917 if (sel_bb_head_p (first_insn))
2918 av_set = BB_AV_SET (BLOCK_FOR_INSN (first_insn));
2919 else
2920 av_set = NULL;
2922 if (sched_verbose >= 6)
2924 sel_print ("Insn %d has a valid av set: ", INSN_UID (first_insn));
2925 dump_av_set (av_set);
2926 sel_print ("\n");
2929 return need_copy_p ? av_set_copy (av_set) : av_set;
2932 ilist_add (&p, first_insn);
2934 /* As the result after this loop have completed, in LAST_INSN we'll
2935 have the insn which has valid av_set to start backward computation
2936 from: it either will be NULL because on it the window size was exceeded
2937 or other valid av_set as returned by compute_av_set for the last insn
2938 of the basic block. */
2939 for (last_insn = first_insn; last_insn != after_bb_end;
2940 last_insn = NEXT_INSN (last_insn))
2942 /* We may encounter valid av_set not only on bb_head, but also on
2943 those insns on which previously MAX_WS was exceeded. */
2944 if (AV_SET_VALID_P (last_insn))
2946 if (sched_verbose >= 6)
2947 sel_print ("Insn %d has a valid empty av set\n", INSN_UID (last_insn));
2948 break;
2951 /* The special case: the last insn of the BB may be an
2952 ineligible_successor due to its SEQ_NO that was set on
2953 it as a bookkeeping. */
2954 if (last_insn != first_insn
2955 && is_ineligible_successor (last_insn, p))
2957 if (sched_verbose >= 6)
2958 sel_print ("Insn %d is ineligible_successor\n", INSN_UID (last_insn));
2959 break;
2962 if (DEBUG_INSN_P (last_insn))
2963 continue;
2965 if (end_ws > max_ws)
2967 /* We can reach max lookahead size at bb_header, so clean av_set
2968 first. */
2969 INSN_WS_LEVEL (last_insn) = global_level;
2971 if (sched_verbose >= 6)
2972 sel_print ("Insn %d is beyond the software lookahead window size\n",
2973 INSN_UID (last_insn));
2974 break;
2977 end_ws++;
2980 /* Get the valid av_set into AV above the LAST_INSN to start backward
2981 computation from. It either will be empty av_set or av_set computed from
2982 the successors on the last insn of the current bb. */
2983 if (last_insn != after_bb_end)
2985 av = NULL;
2987 /* This is needed only to obtain av_sets that are identical to
2988 those computed by the old compute_av_set version. */
2989 if (last_insn == first_insn && !INSN_NOP_P (last_insn))
2990 av_set_add (&av, INSN_EXPR (last_insn));
2992 else
2993 /* END_WS is always already increased by 1 if LAST_INSN == AFTER_BB_END. */
2994 av = compute_av_set_at_bb_end (bb_end, p, end_ws);
2996 /* Compute av_set in AV starting from below the LAST_INSN up to
2997 location above the FIRST_INSN. */
2998 for (cur_insn = PREV_INSN (last_insn); cur_insn != PREV_INSN (first_insn);
2999 cur_insn = PREV_INSN (cur_insn))
3000 if (!INSN_NOP_P (cur_insn))
3002 expr_t expr;
3004 moveup_set_expr (&av, cur_insn, false);
3006 /* If the expression for CUR_INSN is already in the set,
3007 replace it by the new one. */
3008 expr = av_set_lookup (av, INSN_VINSN (cur_insn));
3009 if (expr != NULL)
3011 clear_expr (expr);
3012 copy_expr (expr, INSN_EXPR (cur_insn));
3014 else
3015 av_set_add (&av, INSN_EXPR (cur_insn));
3018 /* Clear stale bb_av_set. */
3019 if (sel_bb_head_p (first_insn))
3021 av_set_clear (&BB_AV_SET (cur_bb));
3022 BB_AV_SET (cur_bb) = need_copy_p ? av_set_copy (av) : av;
3023 BB_AV_LEVEL (cur_bb) = global_level;
3026 if (sched_verbose >= 6)
3028 sel_print ("Computed av set for insn %d: ", INSN_UID (first_insn));
3029 dump_av_set (av);
3030 sel_print ("\n");
3033 ilist_remove (&p);
3034 return av;
3037 /* Compute av set before INSN.
3038 INSN - the current operation (actual rtx INSN)
3039 P - the current path, which is list of insns visited so far
3040 WS - software lookahead window size.
3041 UNIQUE_P - TRUE, if returned av_set will be changed, hence
3042 if we want to save computed av_set in s_i_d, we should make a copy of it.
3044 In the resulting set we will have only expressions that don't have delay
3045 stalls and nonsubstitutable dependences. */
3046 static av_set_t
3047 compute_av_set (insn_t insn, ilist_t p, int ws, bool unique_p)
3049 return compute_av_set_inside_bb (insn, p, ws, unique_p);
3052 /* Propagate a liveness set LV through INSN. */
3053 static void
3054 propagate_lv_set (regset lv, insn_t insn)
3056 gcc_assert (INSN_P (insn));
3058 if (INSN_NOP_P (insn))
3059 return;
3061 df_simulate_one_insn_backwards (BLOCK_FOR_INSN (insn), insn, lv);
3064 /* Return livness set at the end of BB. */
3065 static regset
3066 compute_live_after_bb (basic_block bb)
3068 edge e;
3069 edge_iterator ei;
3070 regset lv = get_clear_regset_from_pool ();
3072 gcc_assert (!ignore_first);
3074 FOR_EACH_EDGE (e, ei, bb->succs)
3075 if (sel_bb_empty_p (e->dest))
3077 if (! BB_LV_SET_VALID_P (e->dest))
3079 gcc_unreachable ();
3080 gcc_assert (BB_LV_SET (e->dest) == NULL);
3081 BB_LV_SET (e->dest) = compute_live_after_bb (e->dest);
3082 BB_LV_SET_VALID_P (e->dest) = true;
3084 IOR_REG_SET (lv, BB_LV_SET (e->dest));
3086 else
3087 IOR_REG_SET (lv, compute_live (sel_bb_head (e->dest)));
3089 return lv;
3092 /* Compute the set of all live registers at the point before INSN and save
3093 it at INSN if INSN is bb header. */
3094 regset
3095 compute_live (insn_t insn)
3097 basic_block bb = BLOCK_FOR_INSN (insn);
3098 insn_t final, temp;
3099 regset lv;
3101 /* Return the valid set if we're already on it. */
3102 if (!ignore_first)
3104 regset src = NULL;
3106 if (sel_bb_head_p (insn) && BB_LV_SET_VALID_P (bb))
3107 src = BB_LV_SET (bb);
3108 else
3110 gcc_assert (in_current_region_p (bb));
3111 if (INSN_LIVE_VALID_P (insn))
3112 src = INSN_LIVE (insn);
3115 if (src)
3117 lv = get_regset_from_pool ();
3118 COPY_REG_SET (lv, src);
3120 if (sel_bb_head_p (insn) && ! BB_LV_SET_VALID_P (bb))
3122 COPY_REG_SET (BB_LV_SET (bb), lv);
3123 BB_LV_SET_VALID_P (bb) = true;
3126 return_regset_to_pool (lv);
3127 return lv;
3131 /* We've skipped the wrong lv_set. Don't skip the right one. */
3132 ignore_first = false;
3133 gcc_assert (in_current_region_p (bb));
3135 /* Find a valid LV set in this block or below, if needed.
3136 Start searching from the next insn: either ignore_first is true, or
3137 INSN doesn't have a correct live set. */
3138 temp = NEXT_INSN (insn);
3139 final = NEXT_INSN (BB_END (bb));
3140 while (temp != final && ! INSN_LIVE_VALID_P (temp))
3141 temp = NEXT_INSN (temp);
3142 if (temp == final)
3144 lv = compute_live_after_bb (bb);
3145 temp = PREV_INSN (temp);
3147 else
3149 lv = get_regset_from_pool ();
3150 COPY_REG_SET (lv, INSN_LIVE (temp));
3153 /* Put correct lv sets on the insns which have bad sets. */
3154 final = PREV_INSN (insn);
3155 while (temp != final)
3157 propagate_lv_set (lv, temp);
3158 COPY_REG_SET (INSN_LIVE (temp), lv);
3159 INSN_LIVE_VALID_P (temp) = true;
3160 temp = PREV_INSN (temp);
3163 /* Also put it in a BB. */
3164 if (sel_bb_head_p (insn))
3166 basic_block bb = BLOCK_FOR_INSN (insn);
3168 COPY_REG_SET (BB_LV_SET (bb), lv);
3169 BB_LV_SET_VALID_P (bb) = true;
3172 /* We return LV to the pool, but will not clear it there. Thus we can
3173 legimatelly use LV till the next use of regset_pool_get (). */
3174 return_regset_to_pool (lv);
3175 return lv;
3178 /* Update liveness sets for INSN. */
3179 static inline void
3180 update_liveness_on_insn (rtx_insn *insn)
3182 ignore_first = true;
3183 compute_live (insn);
3186 /* Compute liveness below INSN and write it into REGS. */
3187 static inline void
3188 compute_live_below_insn (rtx_insn *insn, regset regs)
3190 rtx_insn *succ;
3191 succ_iterator si;
3193 FOR_EACH_SUCC_1 (succ, si, insn, SUCCS_ALL)
3194 IOR_REG_SET (regs, compute_live (succ));
3197 /* Update the data gathered in av and lv sets starting from INSN. */
3198 static void
3199 update_data_sets (rtx_insn *insn)
3201 update_liveness_on_insn (insn);
3202 if (sel_bb_head_p (insn))
3204 gcc_assert (AV_LEVEL (insn) != 0);
3205 BB_AV_LEVEL (BLOCK_FOR_INSN (insn)) = -1;
3206 compute_av_set (insn, NULL, 0, 0);
3211 /* Helper for move_op () and find_used_regs ().
3212 Return speculation type for which a check should be created on the place
3213 of INSN. EXPR is one of the original ops we are searching for. */
3214 static ds_t
3215 get_spec_check_type_for_insn (insn_t insn, expr_t expr)
3217 ds_t to_check_ds;
3218 ds_t already_checked_ds = EXPR_SPEC_DONE_DS (INSN_EXPR (insn));
3220 to_check_ds = EXPR_SPEC_TO_CHECK_DS (expr);
3222 if (targetm.sched.get_insn_checked_ds)
3223 already_checked_ds |= targetm.sched.get_insn_checked_ds (insn);
3225 if (spec_info != NULL
3226 && (spec_info->flags & SEL_SCHED_SPEC_DONT_CHECK_CONTROL))
3227 already_checked_ds |= BEGIN_CONTROL;
3229 already_checked_ds = ds_get_speculation_types (already_checked_ds);
3231 to_check_ds &= ~already_checked_ds;
3233 return to_check_ds;
3236 /* Find the set of registers that are unavailable for storing expres
3237 while moving ORIG_OPS up on the path starting from INSN due to
3238 liveness (USED_REGS) or hardware restrictions (REG_RENAME_P).
3240 All the original operations found during the traversal are saved in the
3241 ORIGINAL_INSNS list.
3243 REG_RENAME_P denotes the set of hardware registers that
3244 can not be used with renaming due to the register class restrictions,
3245 mode restrictions and other (the register we'll choose should be
3246 compatible class with the original uses, shouldn't be in call_used_regs,
3247 should be HARD_REGNO_RENAME_OK etc).
3249 Returns TRUE if we've found all original insns, FALSE otherwise.
3251 This function utilizes code_motion_path_driver (formerly find_used_regs_1)
3252 to traverse the code motion paths. This helper function finds registers
3253 that are not available for storing expres while moving ORIG_OPS up on the
3254 path starting from INSN. A register considered as used on the moving path,
3255 if one of the following conditions is not satisfied:
3257 (1) a register not set or read on any path from xi to an instance of
3258 the original operation,
3259 (2) not among the live registers of the point immediately following the
3260 first original operation on a given downward path, except for the
3261 original target register of the operation,
3262 (3) not live on the other path of any conditional branch that is passed
3263 by the operation, in case original operations are not present on
3264 both paths of the conditional branch.
3266 All the original operations found during the traversal are saved in the
3267 ORIGINAL_INSNS list.
3269 REG_RENAME_P->CROSSES_CALL is true, if there is a call insn on the path
3270 from INSN to original insn. In this case CALL_USED_REG_SET will be added
3271 to unavailable hard regs at the point original operation is found. */
3273 static bool
3274 find_used_regs (insn_t insn, av_set_t orig_ops, regset used_regs,
3275 struct reg_rename *reg_rename_p, def_list_t *original_insns)
3277 def_list_iterator i;
3278 def_t def;
3279 int res;
3280 bool needs_spec_check_p = false;
3281 expr_t expr;
3282 av_set_iterator expr_iter;
3283 struct fur_static_params sparams;
3284 struct cmpd_local_params lparams;
3286 /* We haven't visited any blocks yet. */
3287 bitmap_clear (code_motion_visited_blocks);
3289 /* Init parameters for code_motion_path_driver. */
3290 sparams.crosses_call = false;
3291 sparams.original_insns = original_insns;
3292 sparams.used_regs = used_regs;
3294 /* Set the appropriate hooks and data. */
3295 code_motion_path_driver_info = &fur_hooks;
3297 res = code_motion_path_driver (insn, orig_ops, NULL, &lparams, &sparams);
3299 reg_rename_p->crosses_call |= sparams.crosses_call;
3301 gcc_assert (res == 1);
3302 gcc_assert (original_insns && *original_insns);
3304 /* ??? We calculate whether an expression needs a check when computing
3305 av sets. This information is not as precise as it could be due to
3306 merging this bit in merge_expr. We can do better in find_used_regs,
3307 but we want to avoid multiple traversals of the same code motion
3308 paths. */
3309 FOR_EACH_EXPR (expr, expr_iter, orig_ops)
3310 needs_spec_check_p |= EXPR_NEEDS_SPEC_CHECK_P (expr);
3312 /* Mark hardware regs in REG_RENAME_P that are not suitable
3313 for renaming expr in INSN due to hardware restrictions (register class,
3314 modes compatibility etc). */
3315 FOR_EACH_DEF (def, i, *original_insns)
3317 vinsn_t vinsn = INSN_VINSN (def->orig_insn);
3319 if (VINSN_SEPARABLE_P (vinsn))
3320 mark_unavailable_hard_regs (def, reg_rename_p, used_regs);
3322 /* Do not allow clobbering of ld.[sa] address in case some of the
3323 original operations need a check. */
3324 if (needs_spec_check_p)
3325 IOR_REG_SET (used_regs, VINSN_REG_USES (vinsn));
3328 return true;
3332 /* Functions to choose the best insn from available ones. */
3334 /* Adjusts the priority for EXPR using the backend *_adjust_priority hook. */
3335 static int
3336 sel_target_adjust_priority (expr_t expr)
3338 int priority = EXPR_PRIORITY (expr);
3339 int new_priority;
3341 if (targetm.sched.adjust_priority)
3342 new_priority = targetm.sched.adjust_priority (EXPR_INSN_RTX (expr), priority);
3343 else
3344 new_priority = priority;
3346 /* If the priority has changed, adjust EXPR_PRIORITY_ADJ accordingly. */
3347 EXPR_PRIORITY_ADJ (expr) = new_priority - EXPR_PRIORITY (expr);
3349 gcc_assert (EXPR_PRIORITY_ADJ (expr) >= 0);
3351 if (sched_verbose >= 4)
3352 sel_print ("sel_target_adjust_priority: insn %d, %d+%d = %d.\n",
3353 INSN_UID (EXPR_INSN_RTX (expr)), EXPR_PRIORITY (expr),
3354 EXPR_PRIORITY_ADJ (expr), new_priority);
3356 return new_priority;
3359 /* Rank two available exprs for schedule. Never return 0 here. */
3360 static int
3361 sel_rank_for_schedule (const void *x, const void *y)
3363 expr_t tmp = *(const expr_t *) y;
3364 expr_t tmp2 = *(const expr_t *) x;
3365 insn_t tmp_insn, tmp2_insn;
3366 vinsn_t tmp_vinsn, tmp2_vinsn;
3367 int val;
3369 tmp_vinsn = EXPR_VINSN (tmp);
3370 tmp2_vinsn = EXPR_VINSN (tmp2);
3371 tmp_insn = EXPR_INSN_RTX (tmp);
3372 tmp2_insn = EXPR_INSN_RTX (tmp2);
3374 /* Schedule debug insns as early as possible. */
3375 if (DEBUG_INSN_P (tmp_insn) && !DEBUG_INSN_P (tmp2_insn))
3376 return -1;
3377 else if (DEBUG_INSN_P (tmp2_insn))
3378 return 1;
3380 /* Prefer SCHED_GROUP_P insns to any others. */
3381 if (SCHED_GROUP_P (tmp_insn) != SCHED_GROUP_P (tmp2_insn))
3383 if (VINSN_UNIQUE_P (tmp_vinsn) && VINSN_UNIQUE_P (tmp2_vinsn))
3384 return SCHED_GROUP_P (tmp2_insn) ? 1 : -1;
3386 /* Now uniqueness means SCHED_GROUP_P is set, because schedule groups
3387 cannot be cloned. */
3388 if (VINSN_UNIQUE_P (tmp2_vinsn))
3389 return 1;
3390 return -1;
3393 /* Discourage scheduling of speculative checks. */
3394 val = (sel_insn_is_speculation_check (tmp_insn)
3395 - sel_insn_is_speculation_check (tmp2_insn));
3396 if (val)
3397 return val;
3399 /* Prefer not scheduled insn over scheduled one. */
3400 if (EXPR_SCHED_TIMES (tmp) > 0 || EXPR_SCHED_TIMES (tmp2) > 0)
3402 val = EXPR_SCHED_TIMES (tmp) - EXPR_SCHED_TIMES (tmp2);
3403 if (val)
3404 return val;
3407 /* Prefer jump over non-jump instruction. */
3408 if (control_flow_insn_p (tmp_insn) && !control_flow_insn_p (tmp2_insn))
3409 return -1;
3410 else if (control_flow_insn_p (tmp2_insn) && !control_flow_insn_p (tmp_insn))
3411 return 1;
3413 /* Prefer an expr with greater priority. */
3414 if (EXPR_USEFULNESS (tmp) != 0 && EXPR_USEFULNESS (tmp2) != 0)
3416 int p2 = EXPR_PRIORITY (tmp2) + EXPR_PRIORITY_ADJ (tmp2),
3417 p1 = EXPR_PRIORITY (tmp) + EXPR_PRIORITY_ADJ (tmp);
3419 val = p2 * EXPR_USEFULNESS (tmp2) - p1 * EXPR_USEFULNESS (tmp);
3421 else
3422 val = EXPR_PRIORITY (tmp2) - EXPR_PRIORITY (tmp)
3423 + EXPR_PRIORITY_ADJ (tmp2) - EXPR_PRIORITY_ADJ (tmp);
3424 if (val)
3425 return val;
3427 if (spec_info != NULL && spec_info->mask != 0)
3428 /* This code was taken from haifa-sched.c: rank_for_schedule (). */
3430 ds_t ds1, ds2;
3431 dw_t dw1, dw2;
3432 int dw;
3434 ds1 = EXPR_SPEC_DONE_DS (tmp);
3435 if (ds1)
3436 dw1 = ds_weak (ds1);
3437 else
3438 dw1 = NO_DEP_WEAK;
3440 ds2 = EXPR_SPEC_DONE_DS (tmp2);
3441 if (ds2)
3442 dw2 = ds_weak (ds2);
3443 else
3444 dw2 = NO_DEP_WEAK;
3446 dw = dw2 - dw1;
3447 if (dw > (NO_DEP_WEAK / 8) || dw < -(NO_DEP_WEAK / 8))
3448 return dw;
3451 /* Prefer an old insn to a bookkeeping insn. */
3452 if (INSN_UID (tmp_insn) < first_emitted_uid
3453 && INSN_UID (tmp2_insn) >= first_emitted_uid)
3454 return -1;
3455 if (INSN_UID (tmp_insn) >= first_emitted_uid
3456 && INSN_UID (tmp2_insn) < first_emitted_uid)
3457 return 1;
3459 /* Prefer an insn with smaller UID, as a last resort.
3460 We can't safely use INSN_LUID as it is defined only for those insns
3461 that are in the stream. */
3462 return INSN_UID (tmp_insn) - INSN_UID (tmp2_insn);
3465 /* Filter out expressions from av set pointed to by AV_PTR
3466 that are pipelined too many times. */
3467 static void
3468 process_pipelined_exprs (av_set_t *av_ptr)
3470 expr_t expr;
3471 av_set_iterator si;
3473 /* Don't pipeline already pipelined code as that would increase
3474 number of unnecessary register moves. */
3475 FOR_EACH_EXPR_1 (expr, si, av_ptr)
3477 if (EXPR_SCHED_TIMES (expr)
3478 >= PARAM_VALUE (PARAM_SELSCHED_MAX_SCHED_TIMES))
3479 av_set_iter_remove (&si);
3483 /* Filter speculative insns from AV_PTR if we don't want them. */
3484 static void
3485 process_spec_exprs (av_set_t *av_ptr)
3487 expr_t expr;
3488 av_set_iterator si;
3490 if (spec_info == NULL)
3491 return;
3493 /* Scan *AV_PTR to find out if we want to consider speculative
3494 instructions for scheduling. */
3495 FOR_EACH_EXPR_1 (expr, si, av_ptr)
3497 ds_t ds;
3499 ds = EXPR_SPEC_DONE_DS (expr);
3501 /* The probability of a success is too low - don't speculate. */
3502 if ((ds & SPECULATIVE)
3503 && (ds_weak (ds) < spec_info->data_weakness_cutoff
3504 || EXPR_USEFULNESS (expr) < spec_info->control_weakness_cutoff
3505 || (pipelining_p && false
3506 && (ds & DATA_SPEC)
3507 && (ds & CONTROL_SPEC))))
3509 av_set_iter_remove (&si);
3510 continue;
3515 /* Search for any use-like insns in AV_PTR and decide on scheduling
3516 them. Return one when found, and NULL otherwise.
3517 Note that we check here whether a USE could be scheduled to avoid
3518 an infinite loop later. */
3519 static expr_t
3520 process_use_exprs (av_set_t *av_ptr)
3522 expr_t expr;
3523 av_set_iterator si;
3524 bool uses_present_p = false;
3525 bool try_uses_p = true;
3527 FOR_EACH_EXPR_1 (expr, si, av_ptr)
3529 /* This will also initialize INSN_CODE for later use. */
3530 if (recog_memoized (EXPR_INSN_RTX (expr)) < 0)
3532 /* If we have a USE in *AV_PTR that was not scheduled yet,
3533 do so because it will do good only. */
3534 if (EXPR_SCHED_TIMES (expr) <= 0)
3536 if (EXPR_TARGET_AVAILABLE (expr) == 1)
3537 return expr;
3539 av_set_iter_remove (&si);
3541 else
3543 gcc_assert (pipelining_p);
3545 uses_present_p = true;
3548 else
3549 try_uses_p = false;
3552 if (uses_present_p)
3554 /* If we don't want to schedule any USEs right now and we have some
3555 in *AV_PTR, remove them, else just return the first one found. */
3556 if (!try_uses_p)
3558 FOR_EACH_EXPR_1 (expr, si, av_ptr)
3559 if (INSN_CODE (EXPR_INSN_RTX (expr)) < 0)
3560 av_set_iter_remove (&si);
3562 else
3564 FOR_EACH_EXPR_1 (expr, si, av_ptr)
3566 gcc_assert (INSN_CODE (EXPR_INSN_RTX (expr)) < 0);
3568 if (EXPR_TARGET_AVAILABLE (expr) == 1)
3569 return expr;
3571 av_set_iter_remove (&si);
3576 return NULL;
3579 /* Lookup EXPR in VINSN_VEC and return TRUE if found. Also check patterns from
3580 EXPR's history of changes. */
3581 static bool
3582 vinsn_vec_has_expr_p (vinsn_vec_t vinsn_vec, expr_t expr)
3584 vinsn_t vinsn, expr_vinsn;
3585 int n;
3586 unsigned i;
3588 /* Start with checking expr itself and then proceed with all the old forms
3589 of expr taken from its history vector. */
3590 for (i = 0, expr_vinsn = EXPR_VINSN (expr);
3591 expr_vinsn;
3592 expr_vinsn = (i < EXPR_HISTORY_OF_CHANGES (expr).length ()
3593 ? EXPR_HISTORY_OF_CHANGES (expr)[i++].old_expr_vinsn
3594 : NULL))
3595 FOR_EACH_VEC_ELT (vinsn_vec, n, vinsn)
3596 if (VINSN_SEPARABLE_P (vinsn))
3598 if (vinsn_equal_p (vinsn, expr_vinsn))
3599 return true;
3601 else
3603 /* For non-separable instructions, the blocking insn can have
3604 another pattern due to substitution, and we can't choose
3605 different register as in the above case. Check all registers
3606 being written instead. */
3607 if (bitmap_intersect_p (VINSN_REG_SETS (vinsn),
3608 VINSN_REG_SETS (expr_vinsn)))
3609 return true;
3612 return false;
3615 #ifdef ENABLE_CHECKING
3616 /* Return true if either of expressions from ORIG_OPS can be blocked
3617 by previously created bookkeeping code. STATIC_PARAMS points to static
3618 parameters of move_op. */
3619 static bool
3620 av_set_could_be_blocked_by_bookkeeping_p (av_set_t orig_ops, void *static_params)
3622 expr_t expr;
3623 av_set_iterator iter;
3624 moveop_static_params_p sparams;
3626 /* This checks that expressions in ORIG_OPS are not blocked by bookkeeping
3627 created while scheduling on another fence. */
3628 FOR_EACH_EXPR (expr, iter, orig_ops)
3629 if (vinsn_vec_has_expr_p (vec_bookkeeping_blocked_vinsns, expr))
3630 return true;
3632 gcc_assert (code_motion_path_driver_info == &move_op_hooks);
3633 sparams = (moveop_static_params_p) static_params;
3635 /* Expressions can be also blocked by bookkeeping created during current
3636 move_op. */
3637 if (bitmap_bit_p (current_copies, INSN_UID (sparams->failed_insn)))
3638 FOR_EACH_EXPR (expr, iter, orig_ops)
3639 if (moveup_expr_cached (expr, sparams->failed_insn, false) != MOVEUP_EXPR_NULL)
3640 return true;
3642 /* Expressions in ORIG_OPS may have wrong destination register due to
3643 renaming. Check with the right register instead. */
3644 if (sparams->dest && REG_P (sparams->dest))
3646 rtx reg = sparams->dest;
3647 vinsn_t failed_vinsn = INSN_VINSN (sparams->failed_insn);
3649 if (register_unavailable_p (VINSN_REG_SETS (failed_vinsn), reg)
3650 || register_unavailable_p (VINSN_REG_USES (failed_vinsn), reg)
3651 || register_unavailable_p (VINSN_REG_CLOBBERS (failed_vinsn), reg))
3652 return true;
3655 return false;
3657 #endif
3659 /* Clear VINSN_VEC and detach vinsns. */
3660 static void
3661 vinsn_vec_clear (vinsn_vec_t *vinsn_vec)
3663 unsigned len = vinsn_vec->length ();
3664 if (len > 0)
3666 vinsn_t vinsn;
3667 int n;
3669 FOR_EACH_VEC_ELT (*vinsn_vec, n, vinsn)
3670 vinsn_detach (vinsn);
3671 vinsn_vec->block_remove (0, len);
3675 /* Add the vinsn of EXPR to the VINSN_VEC. */
3676 static void
3677 vinsn_vec_add (vinsn_vec_t *vinsn_vec, expr_t expr)
3679 vinsn_attach (EXPR_VINSN (expr));
3680 vinsn_vec->safe_push (EXPR_VINSN (expr));
3683 /* Free the vector representing blocked expressions. */
3684 static void
3685 vinsn_vec_free (vinsn_vec_t &vinsn_vec)
3687 vinsn_vec.release ();
3690 /* Increase EXPR_PRIORITY_ADJ for INSN by AMOUNT. */
3692 void sel_add_to_insn_priority (rtx insn, int amount)
3694 EXPR_PRIORITY_ADJ (INSN_EXPR (insn)) += amount;
3696 if (sched_verbose >= 2)
3697 sel_print ("sel_add_to_insn_priority: insn %d, by %d (now %d+%d).\n",
3698 INSN_UID (insn), amount, EXPR_PRIORITY (INSN_EXPR (insn)),
3699 EXPR_PRIORITY_ADJ (INSN_EXPR (insn)));
3702 /* Turn AV into a vector, filter inappropriate insns and sort it. Return
3703 true if there is something to schedule. BNDS and FENCE are current
3704 boundaries and fence, respectively. If we need to stall for some cycles
3705 before an expr from AV would become available, write this number to
3706 *PNEED_STALL. */
3707 static bool
3708 fill_vec_av_set (av_set_t av, blist_t bnds, fence_t fence,
3709 int *pneed_stall)
3711 av_set_iterator si;
3712 expr_t expr;
3713 int sched_next_worked = 0, stalled, n;
3714 static int av_max_prio, est_ticks_till_branch;
3715 int min_need_stall = -1;
3716 deps_t dc = BND_DC (BLIST_BND (bnds));
3718 /* Bail out early when the ready list contained only USEs/CLOBBERs that are
3719 already scheduled. */
3720 if (av == NULL)
3721 return false;
3723 /* Empty vector from the previous stuff. */
3724 if (vec_av_set.length () > 0)
3725 vec_av_set.block_remove (0, vec_av_set.length ());
3727 /* Turn the set into a vector for sorting and call sel_target_adjust_priority
3728 for each insn. */
3729 gcc_assert (vec_av_set.is_empty ());
3730 FOR_EACH_EXPR (expr, si, av)
3732 vec_av_set.safe_push (expr);
3734 gcc_assert (EXPR_PRIORITY_ADJ (expr) == 0 || *pneed_stall);
3736 /* Adjust priority using target backend hook. */
3737 sel_target_adjust_priority (expr);
3740 /* Sort the vector. */
3741 vec_av_set.qsort (sel_rank_for_schedule);
3743 /* We record maximal priority of insns in av set for current instruction
3744 group. */
3745 if (FENCE_STARTS_CYCLE_P (fence))
3746 av_max_prio = est_ticks_till_branch = INT_MIN;
3748 /* Filter out inappropriate expressions. Loop's direction is reversed to
3749 visit "best" instructions first. We assume that vec::unordered_remove
3750 moves last element in place of one being deleted. */
3751 for (n = vec_av_set.length () - 1, stalled = 0; n >= 0; n--)
3753 expr_t expr = vec_av_set[n];
3754 insn_t insn = EXPR_INSN_RTX (expr);
3755 signed char target_available;
3756 bool is_orig_reg_p = true;
3757 int need_cycles, new_prio;
3758 bool fence_insn_p = INSN_UID (insn) == INSN_UID (FENCE_INSN (fence));
3760 /* Don't allow any insns other than from SCHED_GROUP if we have one. */
3761 if (FENCE_SCHED_NEXT (fence) && insn != FENCE_SCHED_NEXT (fence))
3763 vec_av_set.unordered_remove (n);
3764 continue;
3767 /* Set number of sched_next insns (just in case there
3768 could be several). */
3769 if (FENCE_SCHED_NEXT (fence))
3770 sched_next_worked++;
3772 /* Check all liveness requirements and try renaming.
3773 FIXME: try to minimize calls to this. */
3774 target_available = EXPR_TARGET_AVAILABLE (expr);
3776 /* If insn was already scheduled on the current fence,
3777 set TARGET_AVAILABLE to -1 no matter what expr's attribute says. */
3778 if (vinsn_vec_has_expr_p (vec_target_unavailable_vinsns, expr)
3779 && !fence_insn_p)
3780 target_available = -1;
3782 /* If the availability of the EXPR is invalidated by the insertion of
3783 bookkeeping earlier, make sure that we won't choose this expr for
3784 scheduling if it's not separable, and if it is separable, then
3785 we have to recompute the set of available registers for it. */
3786 if (vinsn_vec_has_expr_p (vec_bookkeeping_blocked_vinsns, expr))
3788 vec_av_set.unordered_remove (n);
3789 if (sched_verbose >= 4)
3790 sel_print ("Expr %d is blocked by bookkeeping inserted earlier\n",
3791 INSN_UID (insn));
3792 continue;
3795 if (target_available == true)
3797 /* Do nothing -- we can use an existing register. */
3798 is_orig_reg_p = EXPR_SEPARABLE_P (expr);
3800 else if (/* Non-separable instruction will never
3801 get another register. */
3802 (target_available == false
3803 && !EXPR_SEPARABLE_P (expr))
3804 /* Don't try to find a register for low-priority expression. */
3805 || (int) vec_av_set.length () - 1 - n >= max_insns_to_rename
3806 /* ??? FIXME: Don't try to rename data speculation. */
3807 || (EXPR_SPEC_DONE_DS (expr) & BEGIN_DATA)
3808 || ! find_best_reg_for_expr (expr, bnds, &is_orig_reg_p))
3810 vec_av_set.unordered_remove (n);
3811 if (sched_verbose >= 4)
3812 sel_print ("Expr %d has no suitable target register\n",
3813 INSN_UID (insn));
3815 /* A fence insn should not get here. */
3816 gcc_assert (!fence_insn_p);
3817 continue;
3820 /* At this point a fence insn should always be available. */
3821 gcc_assert (!fence_insn_p
3822 || INSN_UID (FENCE_INSN (fence)) == INSN_UID (EXPR_INSN_RTX (expr)));
3824 /* Filter expressions that need to be renamed or speculated when
3825 pipelining, because compensating register copies or speculation
3826 checks are likely to be placed near the beginning of the loop,
3827 causing a stall. */
3828 if (pipelining_p && EXPR_ORIG_SCHED_CYCLE (expr) > 0
3829 && (!is_orig_reg_p || EXPR_SPEC_DONE_DS (expr) != 0))
3831 /* Estimation of number of cycles until loop branch for
3832 renaming/speculation to be successful. */
3833 int need_n_ticks_till_branch = sel_vinsn_cost (EXPR_VINSN (expr));
3835 if ((int) current_loop_nest->ninsns < 9)
3837 vec_av_set.unordered_remove (n);
3838 if (sched_verbose >= 4)
3839 sel_print ("Pipelining expr %d will likely cause stall\n",
3840 INSN_UID (insn));
3841 continue;
3844 if ((int) current_loop_nest->ninsns - num_insns_scheduled
3845 < need_n_ticks_till_branch * issue_rate / 2
3846 && est_ticks_till_branch < need_n_ticks_till_branch)
3848 vec_av_set.unordered_remove (n);
3849 if (sched_verbose >= 4)
3850 sel_print ("Pipelining expr %d will likely cause stall\n",
3851 INSN_UID (insn));
3852 continue;
3856 /* We want to schedule speculation checks as late as possible. Discard
3857 them from av set if there are instructions with higher priority. */
3858 if (sel_insn_is_speculation_check (insn)
3859 && EXPR_PRIORITY (expr) < av_max_prio)
3861 stalled++;
3862 min_need_stall = min_need_stall < 0 ? 1 : MIN (min_need_stall, 1);
3863 vec_av_set.unordered_remove (n);
3864 if (sched_verbose >= 4)
3865 sel_print ("Delaying speculation check %d until its first use\n",
3866 INSN_UID (insn));
3867 continue;
3870 /* Ignore EXPRs available from pipelining to update AV_MAX_PRIO. */
3871 if (EXPR_ORIG_SCHED_CYCLE (expr) <= 0)
3872 av_max_prio = MAX (av_max_prio, EXPR_PRIORITY (expr));
3874 /* Don't allow any insns whose data is not yet ready.
3875 Check first whether we've already tried them and failed. */
3876 if (INSN_UID (insn) < FENCE_READY_TICKS_SIZE (fence))
3878 need_cycles = (FENCE_READY_TICKS (fence)[INSN_UID (insn)]
3879 - FENCE_CYCLE (fence));
3880 if (EXPR_ORIG_SCHED_CYCLE (expr) <= 0)
3881 est_ticks_till_branch = MAX (est_ticks_till_branch,
3882 EXPR_PRIORITY (expr) + need_cycles);
3884 if (need_cycles > 0)
3886 stalled++;
3887 min_need_stall = (min_need_stall < 0
3888 ? need_cycles
3889 : MIN (min_need_stall, need_cycles));
3890 vec_av_set.unordered_remove (n);
3892 if (sched_verbose >= 4)
3893 sel_print ("Expr %d is not ready until cycle %d (cached)\n",
3894 INSN_UID (insn),
3895 FENCE_READY_TICKS (fence)[INSN_UID (insn)]);
3896 continue;
3900 /* Now resort to dependence analysis to find whether EXPR might be
3901 stalled due to dependencies from FENCE's context. */
3902 need_cycles = tick_check_p (expr, dc, fence);
3903 new_prio = EXPR_PRIORITY (expr) + EXPR_PRIORITY_ADJ (expr) + need_cycles;
3905 if (EXPR_ORIG_SCHED_CYCLE (expr) <= 0)
3906 est_ticks_till_branch = MAX (est_ticks_till_branch,
3907 new_prio);
3909 if (need_cycles > 0)
3911 if (INSN_UID (insn) >= FENCE_READY_TICKS_SIZE (fence))
3913 int new_size = INSN_UID (insn) * 3 / 2;
3915 FENCE_READY_TICKS (fence)
3916 = (int *) xrecalloc (FENCE_READY_TICKS (fence),
3917 new_size, FENCE_READY_TICKS_SIZE (fence),
3918 sizeof (int));
3920 FENCE_READY_TICKS (fence)[INSN_UID (insn)]
3921 = FENCE_CYCLE (fence) + need_cycles;
3923 stalled++;
3924 min_need_stall = (min_need_stall < 0
3925 ? need_cycles
3926 : MIN (min_need_stall, need_cycles));
3928 vec_av_set.unordered_remove (n);
3930 if (sched_verbose >= 4)
3931 sel_print ("Expr %d is not ready yet until cycle %d\n",
3932 INSN_UID (insn),
3933 FENCE_READY_TICKS (fence)[INSN_UID (insn)]);
3934 continue;
3937 if (sched_verbose >= 4)
3938 sel_print ("Expr %d is ok\n", INSN_UID (insn));
3939 min_need_stall = 0;
3942 /* Clear SCHED_NEXT. */
3943 if (FENCE_SCHED_NEXT (fence))
3945 gcc_assert (sched_next_worked == 1);
3946 FENCE_SCHED_NEXT (fence) = NULL;
3949 /* No need to stall if this variable was not initialized. */
3950 if (min_need_stall < 0)
3951 min_need_stall = 0;
3953 if (vec_av_set.is_empty ())
3955 /* We need to set *pneed_stall here, because later we skip this code
3956 when ready list is empty. */
3957 *pneed_stall = min_need_stall;
3958 return false;
3960 else
3961 gcc_assert (min_need_stall == 0);
3963 /* Sort the vector. */
3964 vec_av_set.qsort (sel_rank_for_schedule);
3966 if (sched_verbose >= 4)
3968 sel_print ("Total ready exprs: %d, stalled: %d\n",
3969 vec_av_set.length (), stalled);
3970 sel_print ("Sorted av set (%d): ", vec_av_set.length ());
3971 FOR_EACH_VEC_ELT (vec_av_set, n, expr)
3972 dump_expr (expr);
3973 sel_print ("\n");
3976 *pneed_stall = 0;
3977 return true;
3980 /* Convert a vectored and sorted av set to the ready list that
3981 the rest of the backend wants to see. */
3982 static void
3983 convert_vec_av_set_to_ready (void)
3985 int n;
3986 expr_t expr;
3988 /* Allocate and fill the ready list from the sorted vector. */
3989 ready.n_ready = vec_av_set.length ();
3990 ready.first = ready.n_ready - 1;
3992 gcc_assert (ready.n_ready > 0);
3994 if (ready.n_ready > max_issue_size)
3996 max_issue_size = ready.n_ready;
3997 sched_extend_ready_list (ready.n_ready);
4000 FOR_EACH_VEC_ELT (vec_av_set, n, expr)
4002 vinsn_t vi = EXPR_VINSN (expr);
4003 insn_t insn = VINSN_INSN_RTX (vi);
4005 ready_try[n] = 0;
4006 ready.vec[n] = insn;
4010 /* Initialize ready list from *AV_PTR for the max_issue () call.
4011 If any unrecognizable insn found in *AV_PTR, return it (and skip
4012 max_issue). BND and FENCE are current boundary and fence,
4013 respectively. If we need to stall for some cycles before an expr
4014 from *AV_PTR would become available, write this number to *PNEED_STALL. */
4015 static expr_t
4016 fill_ready_list (av_set_t *av_ptr, blist_t bnds, fence_t fence,
4017 int *pneed_stall)
4019 expr_t expr;
4021 /* We do not support multiple boundaries per fence. */
4022 gcc_assert (BLIST_NEXT (bnds) == NULL);
4024 /* Process expressions required special handling, i.e. pipelined,
4025 speculative and recog() < 0 expressions first. */
4026 process_pipelined_exprs (av_ptr);
4027 process_spec_exprs (av_ptr);
4029 /* A USE could be scheduled immediately. */
4030 expr = process_use_exprs (av_ptr);
4031 if (expr)
4033 *pneed_stall = 0;
4034 return expr;
4037 /* Turn the av set to a vector for sorting. */
4038 if (! fill_vec_av_set (*av_ptr, bnds, fence, pneed_stall))
4040 ready.n_ready = 0;
4041 return NULL;
4044 /* Build the final ready list. */
4045 convert_vec_av_set_to_ready ();
4046 return NULL;
4049 /* Wrapper for dfa_new_cycle (). Returns TRUE if cycle was advanced. */
4050 static bool
4051 sel_dfa_new_cycle (insn_t insn, fence_t fence)
4053 int last_scheduled_cycle = FENCE_LAST_SCHEDULED_INSN (fence)
4054 ? INSN_SCHED_CYCLE (FENCE_LAST_SCHEDULED_INSN (fence))
4055 : FENCE_CYCLE (fence) - 1;
4056 bool res = false;
4057 int sort_p = 0;
4059 if (!targetm.sched.dfa_new_cycle)
4060 return false;
4062 memcpy (curr_state, FENCE_STATE (fence), dfa_state_size);
4064 while (!sort_p && targetm.sched.dfa_new_cycle (sched_dump, sched_verbose,
4065 insn, last_scheduled_cycle,
4066 FENCE_CYCLE (fence), &sort_p))
4068 memcpy (FENCE_STATE (fence), curr_state, dfa_state_size);
4069 advance_one_cycle (fence);
4070 memcpy (curr_state, FENCE_STATE (fence), dfa_state_size);
4071 res = true;
4074 return res;
4077 /* Invoke reorder* target hooks on the ready list. Return the number of insns
4078 we can issue. FENCE is the current fence. */
4079 static int
4080 invoke_reorder_hooks (fence_t fence)
4082 int issue_more;
4083 bool ran_hook = false;
4085 /* Call the reorder hook at the beginning of the cycle, and call
4086 the reorder2 hook in the middle of the cycle. */
4087 if (FENCE_ISSUED_INSNS (fence) == 0)
4089 if (targetm.sched.reorder
4090 && !SCHED_GROUP_P (ready_element (&ready, 0))
4091 && ready.n_ready > 1)
4093 /* Don't give reorder the most prioritized insn as it can break
4094 pipelining. */
4095 if (pipelining_p)
4096 --ready.n_ready;
4098 issue_more
4099 = targetm.sched.reorder (sched_dump, sched_verbose,
4100 ready_lastpos (&ready),
4101 &ready.n_ready, FENCE_CYCLE (fence));
4103 if (pipelining_p)
4104 ++ready.n_ready;
4106 ran_hook = true;
4108 else
4109 /* Initialize can_issue_more for variable_issue. */
4110 issue_more = issue_rate;
4112 else if (targetm.sched.reorder2
4113 && !SCHED_GROUP_P (ready_element (&ready, 0)))
4115 if (ready.n_ready == 1)
4116 issue_more =
4117 targetm.sched.reorder2 (sched_dump, sched_verbose,
4118 ready_lastpos (&ready),
4119 &ready.n_ready, FENCE_CYCLE (fence));
4120 else
4122 if (pipelining_p)
4123 --ready.n_ready;
4125 issue_more =
4126 targetm.sched.reorder2 (sched_dump, sched_verbose,
4127 ready.n_ready
4128 ? ready_lastpos (&ready) : NULL,
4129 &ready.n_ready, FENCE_CYCLE (fence));
4131 if (pipelining_p)
4132 ++ready.n_ready;
4135 ran_hook = true;
4137 else
4138 issue_more = FENCE_ISSUE_MORE (fence);
4140 /* Ensure that ready list and vec_av_set are in line with each other,
4141 i.e. vec_av_set[i] == ready_element (&ready, i). */
4142 if (issue_more && ran_hook)
4144 int i, j, n;
4145 rtx_insn **arr = ready.vec;
4146 expr_t *vec = vec_av_set.address ();
4148 for (i = 0, n = ready.n_ready; i < n; i++)
4149 if (EXPR_INSN_RTX (vec[i]) != arr[i])
4151 expr_t tmp;
4153 for (j = i; j < n; j++)
4154 if (EXPR_INSN_RTX (vec[j]) == arr[i])
4155 break;
4156 gcc_assert (j < n);
4158 tmp = vec[i];
4159 vec[i] = vec[j];
4160 vec[j] = tmp;
4164 return issue_more;
4167 /* Return an EXPR corresponding to INDEX element of ready list, if
4168 FOLLOW_READY_ELEMENT is true (i.e., an expr of
4169 ready_element (&ready, INDEX) will be returned), and to INDEX element of
4170 ready.vec otherwise. */
4171 static inline expr_t
4172 find_expr_for_ready (int index, bool follow_ready_element)
4174 expr_t expr;
4175 int real_index;
4177 real_index = follow_ready_element ? ready.first - index : index;
4179 expr = vec_av_set[real_index];
4180 gcc_assert (ready.vec[real_index] == EXPR_INSN_RTX (expr));
4182 return expr;
4185 /* Calculate insns worth trying via lookahead_guard hook. Return a number
4186 of such insns found. */
4187 static int
4188 invoke_dfa_lookahead_guard (void)
4190 int i, n;
4191 bool have_hook
4192 = targetm.sched.first_cycle_multipass_dfa_lookahead_guard != NULL;
4194 if (sched_verbose >= 2)
4195 sel_print ("ready after reorder: ");
4197 for (i = 0, n = 0; i < ready.n_ready; i++)
4199 expr_t expr;
4200 insn_t insn;
4201 int r;
4203 /* In this loop insn is Ith element of the ready list given by
4204 ready_element, not Ith element of ready.vec. */
4205 insn = ready_element (&ready, i);
4207 if (! have_hook || i == 0)
4208 r = 0;
4209 else
4210 r = targetm.sched.first_cycle_multipass_dfa_lookahead_guard (insn, i);
4212 gcc_assert (INSN_CODE (insn) >= 0);
4214 /* Only insns with ready_try = 0 can get here
4215 from fill_ready_list. */
4216 gcc_assert (ready_try [i] == 0);
4217 ready_try[i] = r;
4218 if (!r)
4219 n++;
4221 expr = find_expr_for_ready (i, true);
4223 if (sched_verbose >= 2)
4225 dump_vinsn (EXPR_VINSN (expr));
4226 sel_print (":%d; ", ready_try[i]);
4230 if (sched_verbose >= 2)
4231 sel_print ("\n");
4232 return n;
4235 /* Calculate the number of privileged insns and return it. */
4236 static int
4237 calculate_privileged_insns (void)
4239 expr_t cur_expr, min_spec_expr = NULL;
4240 int privileged_n = 0, i;
4242 for (i = 0; i < ready.n_ready; i++)
4244 if (ready_try[i])
4245 continue;
4247 if (! min_spec_expr)
4248 min_spec_expr = find_expr_for_ready (i, true);
4250 cur_expr = find_expr_for_ready (i, true);
4252 if (EXPR_SPEC (cur_expr) > EXPR_SPEC (min_spec_expr))
4253 break;
4255 ++privileged_n;
4258 if (i == ready.n_ready)
4259 privileged_n = 0;
4261 if (sched_verbose >= 2)
4262 sel_print ("privileged_n: %d insns with SPEC %d\n",
4263 privileged_n, privileged_n ? EXPR_SPEC (min_spec_expr) : -1);
4264 return privileged_n;
4267 /* Call the rest of the hooks after the choice was made. Return
4268 the number of insns that still can be issued given that the current
4269 number is ISSUE_MORE. FENCE and BEST_INSN are the current fence
4270 and the insn chosen for scheduling, respectively. */
4271 static int
4272 invoke_aftermath_hooks (fence_t fence, rtx_insn *best_insn, int issue_more)
4274 gcc_assert (INSN_P (best_insn));
4276 /* First, call dfa_new_cycle, and then variable_issue, if available. */
4277 sel_dfa_new_cycle (best_insn, fence);
4279 if (targetm.sched.variable_issue)
4281 memcpy (curr_state, FENCE_STATE (fence), dfa_state_size);
4282 issue_more =
4283 targetm.sched.variable_issue (sched_dump, sched_verbose, best_insn,
4284 issue_more);
4285 memcpy (FENCE_STATE (fence), curr_state, dfa_state_size);
4287 else if (GET_CODE (PATTERN (best_insn)) != USE
4288 && GET_CODE (PATTERN (best_insn)) != CLOBBER)
4289 issue_more--;
4291 return issue_more;
4294 /* Estimate the cost of issuing INSN on DFA state STATE. */
4295 static int
4296 estimate_insn_cost (rtx_insn *insn, state_t state)
4298 static state_t temp = NULL;
4299 int cost;
4301 if (!temp)
4302 temp = xmalloc (dfa_state_size);
4304 memcpy (temp, state, dfa_state_size);
4305 cost = state_transition (temp, insn);
4307 if (cost < 0)
4308 return 0;
4309 else if (cost == 0)
4310 return 1;
4311 return cost;
4314 /* Return the cost of issuing EXPR on the FENCE as estimated by DFA.
4315 This function properly handles ASMs, USEs etc. */
4316 static int
4317 get_expr_cost (expr_t expr, fence_t fence)
4319 rtx_insn *insn = EXPR_INSN_RTX (expr);
4321 if (recog_memoized (insn) < 0)
4323 if (!FENCE_STARTS_CYCLE_P (fence)
4324 && INSN_ASM_P (insn))
4325 /* This is asm insn which is tryed to be issued on the
4326 cycle not first. Issue it on the next cycle. */
4327 return 1;
4328 else
4329 /* A USE insn, or something else we don't need to
4330 understand. We can't pass these directly to
4331 state_transition because it will trigger a
4332 fatal error for unrecognizable insns. */
4333 return 0;
4335 else
4336 return estimate_insn_cost (insn, FENCE_STATE (fence));
4339 /* Find the best insn for scheduling, either via max_issue or just take
4340 the most prioritized available. */
4341 static int
4342 choose_best_insn (fence_t fence, int privileged_n, int *index)
4344 int can_issue = 0;
4346 if (dfa_lookahead > 0)
4348 cycle_issued_insns = FENCE_ISSUED_INSNS (fence);
4349 /* TODO: pass equivalent of first_cycle_insn_p to max_issue (). */
4350 can_issue = max_issue (&ready, privileged_n,
4351 FENCE_STATE (fence), true, index);
4352 if (sched_verbose >= 2)
4353 sel_print ("max_issue: we can issue %d insns, already did %d insns\n",
4354 can_issue, FENCE_ISSUED_INSNS (fence));
4356 else
4358 /* We can't use max_issue; just return the first available element. */
4359 int i;
4361 for (i = 0; i < ready.n_ready; i++)
4363 expr_t expr = find_expr_for_ready (i, true);
4365 if (get_expr_cost (expr, fence) < 1)
4367 can_issue = can_issue_more;
4368 *index = i;
4370 if (sched_verbose >= 2)
4371 sel_print ("using %dth insn from the ready list\n", i + 1);
4373 break;
4377 if (i == ready.n_ready)
4379 can_issue = 0;
4380 *index = -1;
4384 return can_issue;
4387 /* Choose the best expr from *AV_VLIW_PTR and a suitable register for it.
4388 BNDS and FENCE are current boundaries and scheduling fence respectively.
4389 Return the expr found and NULL if nothing can be issued atm.
4390 Write to PNEED_STALL the number of cycles to stall if no expr was found. */
4391 static expr_t
4392 find_best_expr (av_set_t *av_vliw_ptr, blist_t bnds, fence_t fence,
4393 int *pneed_stall)
4395 expr_t best;
4397 /* Choose the best insn for scheduling via:
4398 1) sorting the ready list based on priority;
4399 2) calling the reorder hook;
4400 3) calling max_issue. */
4401 best = fill_ready_list (av_vliw_ptr, bnds, fence, pneed_stall);
4402 if (best == NULL && ready.n_ready > 0)
4404 int privileged_n, index;
4406 can_issue_more = invoke_reorder_hooks (fence);
4407 if (can_issue_more > 0)
4409 /* Try choosing the best insn until we find one that is could be
4410 scheduled due to liveness restrictions on its destination register.
4411 In the future, we'd like to choose once and then just probe insns
4412 in the order of their priority. */
4413 invoke_dfa_lookahead_guard ();
4414 privileged_n = calculate_privileged_insns ();
4415 can_issue_more = choose_best_insn (fence, privileged_n, &index);
4416 if (can_issue_more)
4417 best = find_expr_for_ready (index, true);
4419 /* We had some available insns, so if we can't issue them,
4420 we have a stall. */
4421 if (can_issue_more == 0)
4423 best = NULL;
4424 *pneed_stall = 1;
4428 if (best != NULL)
4430 can_issue_more = invoke_aftermath_hooks (fence, EXPR_INSN_RTX (best),
4431 can_issue_more);
4432 if (targetm.sched.variable_issue
4433 && can_issue_more == 0)
4434 *pneed_stall = 1;
4437 if (sched_verbose >= 2)
4439 if (best != NULL)
4441 sel_print ("Best expression (vliw form): ");
4442 dump_expr (best);
4443 sel_print ("; cycle %d\n", FENCE_CYCLE (fence));
4445 else
4446 sel_print ("No best expr found!\n");
4449 return best;
4453 /* Functions that implement the core of the scheduler. */
4456 /* Emit an instruction from EXPR with SEQNO and VINSN after
4457 PLACE_TO_INSERT. */
4458 static insn_t
4459 emit_insn_from_expr_after (expr_t expr, vinsn_t vinsn, int seqno,
4460 insn_t place_to_insert)
4462 /* This assert fails when we have identical instructions
4463 one of which dominates the other. In this case move_op ()
4464 finds the first instruction and doesn't search for second one.
4465 The solution would be to compute av_set after the first found
4466 insn and, if insn present in that set, continue searching.
4467 For now we workaround this issue in move_op. */
4468 gcc_assert (!INSN_IN_STREAM_P (EXPR_INSN_RTX (expr)));
4470 if (EXPR_WAS_RENAMED (expr))
4472 unsigned regno = expr_dest_regno (expr);
4474 if (HARD_REGISTER_NUM_P (regno))
4476 df_set_regs_ever_live (regno, true);
4477 reg_rename_tick[regno] = ++reg_rename_this_tick;
4481 return sel_gen_insn_from_expr_after (expr, vinsn, seqno,
4482 place_to_insert);
4485 /* Return TRUE if BB can hold bookkeeping code. */
4486 static bool
4487 block_valid_for_bookkeeping_p (basic_block bb)
4489 insn_t bb_end = BB_END (bb);
4491 if (!in_current_region_p (bb) || EDGE_COUNT (bb->succs) > 1)
4492 return false;
4494 if (INSN_P (bb_end))
4496 if (INSN_SCHED_TIMES (bb_end) > 0)
4497 return false;
4499 else
4500 gcc_assert (NOTE_INSN_BASIC_BLOCK_P (bb_end));
4502 return true;
4505 /* Attempt to find a block that can hold bookkeeping code for path(s) incoming
4506 into E2->dest, except from E1->src (there may be a sequence of empty basic
4507 blocks between E1->src and E2->dest). Return found block, or NULL if new
4508 one must be created. If LAX holds, don't assume there is a simple path
4509 from E1->src to E2->dest. */
4510 static basic_block
4511 find_block_for_bookkeeping (edge e1, edge e2, bool lax)
4513 basic_block candidate_block = NULL;
4514 edge e;
4516 /* Loop over edges from E1 to E2, inclusive. */
4517 for (e = e1; !lax || e->dest != EXIT_BLOCK_PTR_FOR_FN (cfun); e =
4518 EDGE_SUCC (e->dest, 0))
4520 if (EDGE_COUNT (e->dest->preds) == 2)
4522 if (candidate_block == NULL)
4523 candidate_block = (EDGE_PRED (e->dest, 0) == e
4524 ? EDGE_PRED (e->dest, 1)->src
4525 : EDGE_PRED (e->dest, 0)->src);
4526 else
4527 /* Found additional edge leading to path from e1 to e2
4528 from aside. */
4529 return NULL;
4531 else if (EDGE_COUNT (e->dest->preds) > 2)
4532 /* Several edges leading to path from e1 to e2 from aside. */
4533 return NULL;
4535 if (e == e2)
4536 return ((!lax || candidate_block)
4537 && block_valid_for_bookkeeping_p (candidate_block)
4538 ? candidate_block
4539 : NULL);
4541 if (lax && EDGE_COUNT (e->dest->succs) != 1)
4542 return NULL;
4545 if (lax)
4546 return NULL;
4548 gcc_unreachable ();
4551 /* Create new basic block for bookkeeping code for path(s) incoming into
4552 E2->dest, except from E1->src. Return created block. */
4553 static basic_block
4554 create_block_for_bookkeeping (edge e1, edge e2)
4556 basic_block new_bb, bb = e2->dest;
4558 /* Check that we don't spoil the loop structure. */
4559 if (current_loop_nest)
4561 basic_block latch = current_loop_nest->latch;
4563 /* We do not split header. */
4564 gcc_assert (e2->dest != current_loop_nest->header);
4566 /* We do not redirect the only edge to the latch block. */
4567 gcc_assert (e1->dest != latch
4568 || !single_pred_p (latch)
4569 || e1 != single_pred_edge (latch));
4572 /* Split BB to insert BOOK_INSN there. */
4573 new_bb = sched_split_block (bb, NULL);
4575 /* Move note_list from the upper bb. */
4576 gcc_assert (BB_NOTE_LIST (new_bb) == NULL_RTX);
4577 BB_NOTE_LIST (new_bb) = BB_NOTE_LIST (bb);
4578 BB_NOTE_LIST (bb) = NULL;
4580 gcc_assert (e2->dest == bb);
4582 /* Skip block for bookkeeping copy when leaving E1->src. */
4583 if (e1->flags & EDGE_FALLTHRU)
4584 sel_redirect_edge_and_branch_force (e1, new_bb);
4585 else
4586 sel_redirect_edge_and_branch (e1, new_bb);
4588 gcc_assert (e1->dest == new_bb);
4589 gcc_assert (sel_bb_empty_p (bb));
4591 /* To keep basic block numbers in sync between debug and non-debug
4592 compilations, we have to rotate blocks here. Consider that we
4593 started from (a,b)->d, (c,d)->e, and d contained only debug
4594 insns. It would have been removed before if the debug insns
4595 weren't there, so we'd have split e rather than d. So what we do
4596 now is to swap the block numbers of new_bb and
4597 single_succ(new_bb) == e, so that the insns that were in e before
4598 get the new block number. */
4600 if (MAY_HAVE_DEBUG_INSNS)
4602 basic_block succ;
4603 insn_t insn = sel_bb_head (new_bb);
4604 insn_t last;
4606 if (DEBUG_INSN_P (insn)
4607 && single_succ_p (new_bb)
4608 && (succ = single_succ (new_bb))
4609 && succ != EXIT_BLOCK_PTR_FOR_FN (cfun)
4610 && DEBUG_INSN_P ((last = sel_bb_end (new_bb))))
4612 while (insn != last && (DEBUG_INSN_P (insn) || NOTE_P (insn)))
4613 insn = NEXT_INSN (insn);
4615 if (insn == last)
4617 sel_global_bb_info_def gbi;
4618 sel_region_bb_info_def rbi;
4619 int i;
4621 if (sched_verbose >= 2)
4622 sel_print ("Swapping block ids %i and %i\n",
4623 new_bb->index, succ->index);
4625 i = new_bb->index;
4626 new_bb->index = succ->index;
4627 succ->index = i;
4629 SET_BASIC_BLOCK_FOR_FN (cfun, new_bb->index, new_bb);
4630 SET_BASIC_BLOCK_FOR_FN (cfun, succ->index, succ);
4632 memcpy (&gbi, SEL_GLOBAL_BB_INFO (new_bb), sizeof (gbi));
4633 memcpy (SEL_GLOBAL_BB_INFO (new_bb), SEL_GLOBAL_BB_INFO (succ),
4634 sizeof (gbi));
4635 memcpy (SEL_GLOBAL_BB_INFO (succ), &gbi, sizeof (gbi));
4637 memcpy (&rbi, SEL_REGION_BB_INFO (new_bb), sizeof (rbi));
4638 memcpy (SEL_REGION_BB_INFO (new_bb), SEL_REGION_BB_INFO (succ),
4639 sizeof (rbi));
4640 memcpy (SEL_REGION_BB_INFO (succ), &rbi, sizeof (rbi));
4642 i = BLOCK_TO_BB (new_bb->index);
4643 BLOCK_TO_BB (new_bb->index) = BLOCK_TO_BB (succ->index);
4644 BLOCK_TO_BB (succ->index) = i;
4646 i = CONTAINING_RGN (new_bb->index);
4647 CONTAINING_RGN (new_bb->index) = CONTAINING_RGN (succ->index);
4648 CONTAINING_RGN (succ->index) = i;
4650 for (i = 0; i < current_nr_blocks; i++)
4651 if (BB_TO_BLOCK (i) == succ->index)
4652 BB_TO_BLOCK (i) = new_bb->index;
4653 else if (BB_TO_BLOCK (i) == new_bb->index)
4654 BB_TO_BLOCK (i) = succ->index;
4656 FOR_BB_INSNS (new_bb, insn)
4657 if (INSN_P (insn))
4658 EXPR_ORIG_BB_INDEX (INSN_EXPR (insn)) = new_bb->index;
4660 FOR_BB_INSNS (succ, insn)
4661 if (INSN_P (insn))
4662 EXPR_ORIG_BB_INDEX (INSN_EXPR (insn)) = succ->index;
4664 if (bitmap_clear_bit (code_motion_visited_blocks, new_bb->index))
4665 bitmap_set_bit (code_motion_visited_blocks, succ->index);
4667 gcc_assert (LABEL_P (BB_HEAD (new_bb))
4668 && LABEL_P (BB_HEAD (succ)));
4670 if (sched_verbose >= 4)
4671 sel_print ("Swapping code labels %i and %i\n",
4672 CODE_LABEL_NUMBER (BB_HEAD (new_bb)),
4673 CODE_LABEL_NUMBER (BB_HEAD (succ)));
4675 i = CODE_LABEL_NUMBER (BB_HEAD (new_bb));
4676 CODE_LABEL_NUMBER (BB_HEAD (new_bb))
4677 = CODE_LABEL_NUMBER (BB_HEAD (succ));
4678 CODE_LABEL_NUMBER (BB_HEAD (succ)) = i;
4683 return bb;
4686 /* Return insn after which we must insert bookkeeping code for path(s) incoming
4687 into E2->dest, except from E1->src. If the returned insn immediately
4688 precedes a fence, assign that fence to *FENCE_TO_REWIND. */
4689 static insn_t
4690 find_place_for_bookkeeping (edge e1, edge e2, fence_t *fence_to_rewind)
4692 insn_t place_to_insert;
4693 /* Find a basic block that can hold bookkeeping. If it can be found, do not
4694 create new basic block, but insert bookkeeping there. */
4695 basic_block book_block = find_block_for_bookkeeping (e1, e2, FALSE);
4697 if (book_block)
4699 place_to_insert = BB_END (book_block);
4701 /* Don't use a block containing only debug insns for
4702 bookkeeping, this causes scheduling differences between debug
4703 and non-debug compilations, for the block would have been
4704 removed already. */
4705 if (DEBUG_INSN_P (place_to_insert))
4707 rtx_insn *insn = sel_bb_head (book_block);
4709 while (insn != place_to_insert &&
4710 (DEBUG_INSN_P (insn) || NOTE_P (insn)))
4711 insn = NEXT_INSN (insn);
4713 if (insn == place_to_insert)
4714 book_block = NULL;
4718 if (!book_block)
4720 book_block = create_block_for_bookkeeping (e1, e2);
4721 place_to_insert = BB_END (book_block);
4722 if (sched_verbose >= 9)
4723 sel_print ("New block is %i, split from bookkeeping block %i\n",
4724 EDGE_SUCC (book_block, 0)->dest->index, book_block->index);
4726 else
4728 if (sched_verbose >= 9)
4729 sel_print ("Pre-existing bookkeeping block is %i\n", book_block->index);
4732 *fence_to_rewind = NULL;
4733 /* If basic block ends with a jump, insert bookkeeping code right before it.
4734 Notice if we are crossing a fence when taking PREV_INSN. */
4735 if (INSN_P (place_to_insert) && control_flow_insn_p (place_to_insert))
4737 *fence_to_rewind = flist_lookup (fences, place_to_insert);
4738 place_to_insert = PREV_INSN (place_to_insert);
4741 return place_to_insert;
4744 /* Find a proper seqno for bookkeeing insn inserted at PLACE_TO_INSERT
4745 for JOIN_POINT. */
4746 static int
4747 find_seqno_for_bookkeeping (insn_t place_to_insert, insn_t join_point)
4749 int seqno;
4750 rtx next;
4752 /* Check if we are about to insert bookkeeping copy before a jump, and use
4753 jump's seqno for the copy; otherwise, use JOIN_POINT's seqno. */
4754 next = NEXT_INSN (place_to_insert);
4755 if (INSN_P (next)
4756 && JUMP_P (next)
4757 && BLOCK_FOR_INSN (next) == BLOCK_FOR_INSN (place_to_insert))
4759 gcc_assert (INSN_SCHED_TIMES (next) == 0);
4760 seqno = INSN_SEQNO (next);
4762 else if (INSN_SEQNO (join_point) > 0)
4763 seqno = INSN_SEQNO (join_point);
4764 else
4766 seqno = get_seqno_by_preds (place_to_insert);
4768 /* Sometimes the fences can move in such a way that there will be
4769 no instructions with positive seqno around this bookkeeping.
4770 This means that there will be no way to get to it by a regular
4771 fence movement. Never mind because we pick up such pieces for
4772 rescheduling anyways, so any positive value will do for now. */
4773 if (seqno < 0)
4775 gcc_assert (pipelining_p);
4776 seqno = 1;
4780 gcc_assert (seqno > 0);
4781 return seqno;
4784 /* Insert bookkeeping copy of C_EXPS's insn after PLACE_TO_INSERT, assigning
4785 NEW_SEQNO to it. Return created insn. */
4786 static insn_t
4787 emit_bookkeeping_insn (insn_t place_to_insert, expr_t c_expr, int new_seqno)
4789 rtx_insn *new_insn_rtx = create_copy_of_insn_rtx (EXPR_INSN_RTX (c_expr));
4791 vinsn_t new_vinsn
4792 = create_vinsn_from_insn_rtx (new_insn_rtx,
4793 VINSN_UNIQUE_P (EXPR_VINSN (c_expr)));
4795 insn_t new_insn = emit_insn_from_expr_after (c_expr, new_vinsn, new_seqno,
4796 place_to_insert);
4798 INSN_SCHED_TIMES (new_insn) = 0;
4799 bitmap_set_bit (current_copies, INSN_UID (new_insn));
4801 return new_insn;
4804 /* Generate a bookkeeping copy of C_EXPR's insn for path(s) incoming into to
4805 E2->dest, except from E1->src (there may be a sequence of empty blocks
4806 between E1->src and E2->dest). Return block containing the copy.
4807 All scheduler data is initialized for the newly created insn. */
4808 static basic_block
4809 generate_bookkeeping_insn (expr_t c_expr, edge e1, edge e2)
4811 insn_t join_point, place_to_insert, new_insn;
4812 int new_seqno;
4813 bool need_to_exchange_data_sets;
4814 fence_t fence_to_rewind;
4816 if (sched_verbose >= 4)
4817 sel_print ("Generating bookkeeping insn (%d->%d)\n", e1->src->index,
4818 e2->dest->index);
4820 join_point = sel_bb_head (e2->dest);
4821 place_to_insert = find_place_for_bookkeeping (e1, e2, &fence_to_rewind);
4822 new_seqno = find_seqno_for_bookkeeping (place_to_insert, join_point);
4823 need_to_exchange_data_sets
4824 = sel_bb_empty_p (BLOCK_FOR_INSN (place_to_insert));
4826 new_insn = emit_bookkeeping_insn (place_to_insert, c_expr, new_seqno);
4828 if (fence_to_rewind)
4829 FENCE_INSN (fence_to_rewind) = new_insn;
4831 /* When inserting bookkeeping insn in new block, av sets should be
4832 following: old basic block (that now holds bookkeeping) data sets are
4833 the same as was before generation of bookkeeping, and new basic block
4834 (that now hold all other insns of old basic block) data sets are
4835 invalid. So exchange data sets for these basic blocks as sel_split_block
4836 mistakenly exchanges them in this case. Cannot do it earlier because
4837 when single instruction is added to new basic block it should hold NULL
4838 lv_set. */
4839 if (need_to_exchange_data_sets)
4840 exchange_data_sets (BLOCK_FOR_INSN (new_insn),
4841 BLOCK_FOR_INSN (join_point));
4843 stat_bookkeeping_copies++;
4844 return BLOCK_FOR_INSN (new_insn);
4847 /* Remove from AV_PTR all insns that may need bookkeeping when scheduling
4848 on FENCE, but we are unable to copy them. */
4849 static void
4850 remove_insns_that_need_bookkeeping (fence_t fence, av_set_t *av_ptr)
4852 expr_t expr;
4853 av_set_iterator i;
4855 /* An expression does not need bookkeeping if it is available on all paths
4856 from current block to original block and current block dominates
4857 original block. We check availability on all paths by examining
4858 EXPR_SPEC; this is not equivalent, because it may be positive even
4859 if expr is available on all paths (but if expr is not available on
4860 any path, EXPR_SPEC will be positive). */
4862 FOR_EACH_EXPR_1 (expr, i, av_ptr)
4864 if (!control_flow_insn_p (EXPR_INSN_RTX (expr))
4865 && (!bookkeeping_p || VINSN_UNIQUE_P (EXPR_VINSN (expr)))
4866 && (EXPR_SPEC (expr)
4867 || !EXPR_ORIG_BB_INDEX (expr)
4868 || !dominated_by_p (CDI_DOMINATORS,
4869 BASIC_BLOCK_FOR_FN (cfun,
4870 EXPR_ORIG_BB_INDEX (expr)),
4871 BLOCK_FOR_INSN (FENCE_INSN (fence)))))
4873 if (sched_verbose >= 4)
4874 sel_print ("Expr %d removed because it would need bookkeeping, which "
4875 "cannot be created\n", INSN_UID (EXPR_INSN_RTX (expr)));
4876 av_set_iter_remove (&i);
4881 /* Moving conditional jump through some instructions.
4883 Consider example:
4885 ... <- current scheduling point
4886 NOTE BASIC BLOCK: <- bb header
4887 (p8) add r14=r14+0x9;;
4888 (p8) mov [r14]=r23
4889 (!p8) jump L1;;
4890 NOTE BASIC BLOCK:
4893 We can schedule jump one cycle earlier, than mov, because they cannot be
4894 executed together as their predicates are mutually exclusive.
4896 This is done in this way: first, new fallthrough basic block is created
4897 after jump (it is always can be done, because there already should be a
4898 fallthrough block, where control flow goes in case of predicate being true -
4899 in our example; otherwise there should be a dependence between those
4900 instructions and jump and we cannot schedule jump right now);
4901 next, all instructions between jump and current scheduling point are moved
4902 to this new block. And the result is this:
4904 NOTE BASIC BLOCK:
4905 (!p8) jump L1 <- current scheduling point
4906 NOTE BASIC BLOCK: <- bb header
4907 (p8) add r14=r14+0x9;;
4908 (p8) mov [r14]=r23
4909 NOTE BASIC BLOCK:
4912 static void
4913 move_cond_jump (rtx_insn *insn, bnd_t bnd)
4915 edge ft_edge;
4916 basic_block block_from, block_next, block_new, block_bnd, bb;
4917 rtx_insn *next, *prev, *link, *head;
4919 block_from = BLOCK_FOR_INSN (insn);
4920 block_bnd = BLOCK_FOR_INSN (BND_TO (bnd));
4921 prev = BND_TO (bnd);
4923 #ifdef ENABLE_CHECKING
4924 /* Moving of jump should not cross any other jumps or beginnings of new
4925 basic blocks. The only exception is when we move a jump through
4926 mutually exclusive insns along fallthru edges. */
4927 if (block_from != block_bnd)
4929 bb = block_from;
4930 for (link = PREV_INSN (insn); link != PREV_INSN (prev);
4931 link = PREV_INSN (link))
4933 if (INSN_P (link))
4934 gcc_assert (sched_insns_conditions_mutex_p (insn, link));
4935 if (BLOCK_FOR_INSN (link) && BLOCK_FOR_INSN (link) != bb)
4937 gcc_assert (single_pred (bb) == BLOCK_FOR_INSN (link));
4938 bb = BLOCK_FOR_INSN (link);
4942 #endif
4944 /* Jump is moved to the boundary. */
4945 next = PREV_INSN (insn);
4946 BND_TO (bnd) = insn;
4948 ft_edge = find_fallthru_edge_from (block_from);
4949 block_next = ft_edge->dest;
4950 /* There must be a fallthrough block (or where should go
4951 control flow in case of false jump predicate otherwise?). */
4952 gcc_assert (block_next);
4954 /* Create new empty basic block after source block. */
4955 block_new = sel_split_edge (ft_edge);
4956 gcc_assert (block_new->next_bb == block_next
4957 && block_from->next_bb == block_new);
4959 /* Move all instructions except INSN to BLOCK_NEW. */
4960 bb = block_bnd;
4961 head = BB_HEAD (block_new);
4962 while (bb != block_from->next_bb)
4964 rtx_insn *from, *to;
4965 from = bb == block_bnd ? prev : sel_bb_head (bb);
4966 to = bb == block_from ? next : sel_bb_end (bb);
4968 /* The jump being moved can be the first insn in the block.
4969 In this case we don't have to move anything in this block. */
4970 if (NEXT_INSN (to) != from)
4972 reorder_insns (from, to, head);
4974 for (link = to; link != head; link = PREV_INSN (link))
4975 EXPR_ORIG_BB_INDEX (INSN_EXPR (link)) = block_new->index;
4976 head = to;
4979 /* Cleanup possibly empty blocks left. */
4980 block_next = bb->next_bb;
4981 if (bb != block_from)
4982 tidy_control_flow (bb, false);
4983 bb = block_next;
4986 /* Assert there is no jump to BLOCK_NEW, only fallthrough edge. */
4987 gcc_assert (NOTE_INSN_BASIC_BLOCK_P (BB_HEAD (block_new)));
4989 gcc_assert (!sel_bb_empty_p (block_from)
4990 && !sel_bb_empty_p (block_new));
4992 /* Update data sets for BLOCK_NEW to represent that INSN and
4993 instructions from the other branch of INSN is no longer
4994 available at BLOCK_NEW. */
4995 BB_AV_LEVEL (block_new) = global_level;
4996 gcc_assert (BB_LV_SET (block_new) == NULL);
4997 BB_LV_SET (block_new) = get_clear_regset_from_pool ();
4998 update_data_sets (sel_bb_head (block_new));
5000 /* INSN is a new basic block header - so prepare its data
5001 structures and update availability and liveness sets. */
5002 update_data_sets (insn);
5004 if (sched_verbose >= 4)
5005 sel_print ("Moving jump %d\n", INSN_UID (insn));
5008 /* Remove nops generated during move_op for preventing removal of empty
5009 basic blocks. */
5010 static void
5011 remove_temp_moveop_nops (bool full_tidying)
5013 int i;
5014 insn_t insn;
5016 FOR_EACH_VEC_ELT (vec_temp_moveop_nops, i, insn)
5018 gcc_assert (INSN_NOP_P (insn));
5019 return_nop_to_pool (insn, full_tidying);
5022 /* Empty the vector. */
5023 if (vec_temp_moveop_nops.length () > 0)
5024 vec_temp_moveop_nops.block_remove (0, vec_temp_moveop_nops.length ());
5027 /* Records the maximal UID before moving up an instruction. Used for
5028 distinguishing between bookkeeping copies and original insns. */
5029 static int max_uid_before_move_op = 0;
5031 /* Remove from AV_VLIW_P all instructions but next when debug counter
5032 tells us so. Next instruction is fetched from BNDS. */
5033 static void
5034 remove_insns_for_debug (blist_t bnds, av_set_t *av_vliw_p)
5036 if (! dbg_cnt (sel_sched_insn_cnt))
5037 /* Leave only the next insn in av_vliw. */
5039 av_set_iterator av_it;
5040 expr_t expr;
5041 bnd_t bnd = BLIST_BND (bnds);
5042 insn_t next = BND_TO (bnd);
5044 gcc_assert (BLIST_NEXT (bnds) == NULL);
5046 FOR_EACH_EXPR_1 (expr, av_it, av_vliw_p)
5047 if (EXPR_INSN_RTX (expr) != next)
5048 av_set_iter_remove (&av_it);
5052 /* Compute available instructions on BNDS. FENCE is the current fence. Write
5053 the computed set to *AV_VLIW_P. */
5054 static void
5055 compute_av_set_on_boundaries (fence_t fence, blist_t bnds, av_set_t *av_vliw_p)
5057 if (sched_verbose >= 2)
5059 sel_print ("Boundaries: ");
5060 dump_blist (bnds);
5061 sel_print ("\n");
5064 for (; bnds; bnds = BLIST_NEXT (bnds))
5066 bnd_t bnd = BLIST_BND (bnds);
5067 av_set_t av1_copy;
5068 insn_t bnd_to = BND_TO (bnd);
5070 /* Rewind BND->TO to the basic block header in case some bookkeeping
5071 instructions were inserted before BND->TO and it needs to be
5072 adjusted. */
5073 if (sel_bb_head_p (bnd_to))
5074 gcc_assert (INSN_SCHED_TIMES (bnd_to) == 0);
5075 else
5076 while (INSN_SCHED_TIMES (PREV_INSN (bnd_to)) == 0)
5078 bnd_to = PREV_INSN (bnd_to);
5079 if (sel_bb_head_p (bnd_to))
5080 break;
5083 if (BND_TO (bnd) != bnd_to)
5085 gcc_assert (FENCE_INSN (fence) == BND_TO (bnd));
5086 FENCE_INSN (fence) = bnd_to;
5087 BND_TO (bnd) = bnd_to;
5090 av_set_clear (&BND_AV (bnd));
5091 BND_AV (bnd) = compute_av_set (BND_TO (bnd), NULL, 0, true);
5093 av_set_clear (&BND_AV1 (bnd));
5094 BND_AV1 (bnd) = av_set_copy (BND_AV (bnd));
5096 moveup_set_inside_insn_group (&BND_AV1 (bnd), NULL);
5098 av1_copy = av_set_copy (BND_AV1 (bnd));
5099 av_set_union_and_clear (av_vliw_p, &av1_copy, NULL);
5102 if (sched_verbose >= 2)
5104 sel_print ("Available exprs (vliw form): ");
5105 dump_av_set (*av_vliw_p);
5106 sel_print ("\n");
5110 /* Calculate the sequential av set on BND corresponding to the EXPR_VLIW
5111 expression. When FOR_MOVEOP is true, also replace the register of
5112 expressions found with the register from EXPR_VLIW. */
5113 static av_set_t
5114 find_sequential_best_exprs (bnd_t bnd, expr_t expr_vliw, bool for_moveop)
5116 av_set_t expr_seq = NULL;
5117 expr_t expr;
5118 av_set_iterator i;
5120 FOR_EACH_EXPR (expr, i, BND_AV (bnd))
5122 if (equal_after_moveup_path_p (expr, NULL, expr_vliw))
5124 if (for_moveop)
5126 /* The sequential expression has the right form to pass
5127 to move_op except when renaming happened. Put the
5128 correct register in EXPR then. */
5129 if (EXPR_SEPARABLE_P (expr) && REG_P (EXPR_LHS (expr)))
5131 if (expr_dest_regno (expr) != expr_dest_regno (expr_vliw))
5133 replace_dest_with_reg_in_expr (expr, EXPR_LHS (expr_vliw));
5134 stat_renamed_scheduled++;
5136 /* Also put the correct TARGET_AVAILABLE bit on the expr.
5137 This is needed when renaming came up with original
5138 register. */
5139 else if (EXPR_TARGET_AVAILABLE (expr)
5140 != EXPR_TARGET_AVAILABLE (expr_vliw))
5142 gcc_assert (EXPR_TARGET_AVAILABLE (expr_vliw) == 1);
5143 EXPR_TARGET_AVAILABLE (expr) = 1;
5146 if (EXPR_WAS_SUBSTITUTED (expr))
5147 stat_substitutions_total++;
5150 av_set_add (&expr_seq, expr);
5152 /* With substitution inside insn group, it is possible
5153 that more than one expression in expr_seq will correspond
5154 to expr_vliw. In this case, choose one as the attempt to
5155 move both leads to miscompiles. */
5156 break;
5160 if (for_moveop && sched_verbose >= 2)
5162 sel_print ("Best expression(s) (sequential form): ");
5163 dump_av_set (expr_seq);
5164 sel_print ("\n");
5167 return expr_seq;
5171 /* Move nop to previous block. */
5172 static void ATTRIBUTE_UNUSED
5173 move_nop_to_previous_block (insn_t nop, basic_block prev_bb)
5175 insn_t prev_insn, next_insn, note;
5177 gcc_assert (sel_bb_head_p (nop)
5178 && prev_bb == BLOCK_FOR_INSN (nop)->prev_bb);
5179 note = bb_note (BLOCK_FOR_INSN (nop));
5180 prev_insn = sel_bb_end (prev_bb);
5181 next_insn = NEXT_INSN (nop);
5182 gcc_assert (prev_insn != NULL_RTX
5183 && PREV_INSN (note) == prev_insn);
5185 SET_NEXT_INSN (prev_insn) = nop;
5186 SET_PREV_INSN (nop) = prev_insn;
5188 SET_PREV_INSN (note) = nop;
5189 SET_NEXT_INSN (note) = next_insn;
5191 SET_NEXT_INSN (nop) = note;
5192 SET_PREV_INSN (next_insn) = note;
5194 BB_END (prev_bb) = nop;
5195 BLOCK_FOR_INSN (nop) = prev_bb;
5198 /* Prepare a place to insert the chosen expression on BND. */
5199 static insn_t
5200 prepare_place_to_insert (bnd_t bnd)
5202 insn_t place_to_insert;
5204 /* Init place_to_insert before calling move_op, as the later
5205 can possibly remove BND_TO (bnd). */
5206 if (/* If this is not the first insn scheduled. */
5207 BND_PTR (bnd))
5209 /* Add it after last scheduled. */
5210 place_to_insert = ILIST_INSN (BND_PTR (bnd));
5211 if (DEBUG_INSN_P (place_to_insert))
5213 ilist_t l = BND_PTR (bnd);
5214 while ((l = ILIST_NEXT (l)) &&
5215 DEBUG_INSN_P (ILIST_INSN (l)))
5217 if (!l)
5218 place_to_insert = NULL;
5221 else
5222 place_to_insert = NULL;
5224 if (!place_to_insert)
5226 /* Add it before BND_TO. The difference is in the
5227 basic block, where INSN will be added. */
5228 place_to_insert = get_nop_from_pool (BND_TO (bnd));
5229 gcc_assert (BLOCK_FOR_INSN (place_to_insert)
5230 == BLOCK_FOR_INSN (BND_TO (bnd)));
5233 return place_to_insert;
5236 /* Find original instructions for EXPR_SEQ and move it to BND boundary.
5237 Return the expression to emit in C_EXPR. */
5238 static bool
5239 move_exprs_to_boundary (bnd_t bnd, expr_t expr_vliw,
5240 av_set_t expr_seq, expr_t c_expr)
5242 bool b, should_move;
5243 unsigned book_uid;
5244 bitmap_iterator bi;
5245 int n_bookkeeping_copies_before_moveop;
5247 /* Make a move. This call will remove the original operation,
5248 insert all necessary bookkeeping instructions and update the
5249 data sets. After that all we have to do is add the operation
5250 at before BND_TO (BND). */
5251 n_bookkeeping_copies_before_moveop = stat_bookkeeping_copies;
5252 max_uid_before_move_op = get_max_uid ();
5253 bitmap_clear (current_copies);
5254 bitmap_clear (current_originators);
5256 b = move_op (BND_TO (bnd), expr_seq, expr_vliw,
5257 get_dest_from_orig_ops (expr_seq), c_expr, &should_move);
5259 /* We should be able to find the expression we've chosen for
5260 scheduling. */
5261 gcc_assert (b);
5263 if (stat_bookkeeping_copies > n_bookkeeping_copies_before_moveop)
5264 stat_insns_needed_bookkeeping++;
5266 EXECUTE_IF_SET_IN_BITMAP (current_copies, 0, book_uid, bi)
5268 unsigned uid;
5269 bitmap_iterator bi;
5271 /* We allocate these bitmaps lazily. */
5272 if (! INSN_ORIGINATORS_BY_UID (book_uid))
5273 INSN_ORIGINATORS_BY_UID (book_uid) = BITMAP_ALLOC (NULL);
5275 bitmap_copy (INSN_ORIGINATORS_BY_UID (book_uid),
5276 current_originators);
5278 /* Transitively add all originators' originators. */
5279 EXECUTE_IF_SET_IN_BITMAP (current_originators, 0, uid, bi)
5280 if (INSN_ORIGINATORS_BY_UID (uid))
5281 bitmap_ior_into (INSN_ORIGINATORS_BY_UID (book_uid),
5282 INSN_ORIGINATORS_BY_UID (uid));
5285 return should_move;
5289 /* Debug a DFA state as an array of bytes. */
5290 static void
5291 debug_state (state_t state)
5293 unsigned char *p;
5294 unsigned int i, size = dfa_state_size;
5296 sel_print ("state (%u):", size);
5297 for (i = 0, p = (unsigned char *) state; i < size; i++)
5298 sel_print (" %d", p[i]);
5299 sel_print ("\n");
5302 /* Advance state on FENCE with INSN. Return true if INSN is
5303 an ASM, and we should advance state once more. */
5304 static bool
5305 advance_state_on_fence (fence_t fence, insn_t insn)
5307 bool asm_p;
5309 if (recog_memoized (insn) >= 0)
5311 int res;
5312 state_t temp_state = alloca (dfa_state_size);
5314 gcc_assert (!INSN_ASM_P (insn));
5315 asm_p = false;
5317 memcpy (temp_state, FENCE_STATE (fence), dfa_state_size);
5318 res = state_transition (FENCE_STATE (fence), insn);
5319 gcc_assert (res < 0);
5321 if (memcmp (temp_state, FENCE_STATE (fence), dfa_state_size))
5323 FENCE_ISSUED_INSNS (fence)++;
5325 /* We should never issue more than issue_rate insns. */
5326 if (FENCE_ISSUED_INSNS (fence) > issue_rate)
5327 gcc_unreachable ();
5330 else
5332 /* This could be an ASM insn which we'd like to schedule
5333 on the next cycle. */
5334 asm_p = INSN_ASM_P (insn);
5335 if (!FENCE_STARTS_CYCLE_P (fence) && asm_p)
5336 advance_one_cycle (fence);
5339 if (sched_verbose >= 2)
5340 debug_state (FENCE_STATE (fence));
5341 if (!DEBUG_INSN_P (insn))
5342 FENCE_STARTS_CYCLE_P (fence) = 0;
5343 FENCE_ISSUE_MORE (fence) = can_issue_more;
5344 return asm_p;
5347 /* Update FENCE on which INSN was scheduled and this INSN, too. NEED_STALL
5348 is nonzero if we need to stall after issuing INSN. */
5349 static void
5350 update_fence_and_insn (fence_t fence, insn_t insn, int need_stall)
5352 bool asm_p;
5354 /* First, reflect that something is scheduled on this fence. */
5355 asm_p = advance_state_on_fence (fence, insn);
5356 FENCE_LAST_SCHEDULED_INSN (fence) = insn;
5357 vec_safe_push (FENCE_EXECUTING_INSNS (fence), insn);
5358 if (SCHED_GROUP_P (insn))
5360 FENCE_SCHED_NEXT (fence) = INSN_SCHED_NEXT (insn);
5361 SCHED_GROUP_P (insn) = 0;
5363 else
5364 FENCE_SCHED_NEXT (fence) = NULL;
5365 if (INSN_UID (insn) < FENCE_READY_TICKS_SIZE (fence))
5366 FENCE_READY_TICKS (fence) [INSN_UID (insn)] = 0;
5368 /* Set instruction scheduling info. This will be used in bundling,
5369 pipelining, tick computations etc. */
5370 ++INSN_SCHED_TIMES (insn);
5371 EXPR_TARGET_AVAILABLE (INSN_EXPR (insn)) = true;
5372 EXPR_ORIG_SCHED_CYCLE (INSN_EXPR (insn)) = FENCE_CYCLE (fence);
5373 INSN_AFTER_STALL_P (insn) = FENCE_AFTER_STALL_P (fence);
5374 INSN_SCHED_CYCLE (insn) = FENCE_CYCLE (fence);
5376 /* This does not account for adjust_cost hooks, just add the biggest
5377 constant the hook may add to the latency. TODO: make this
5378 a target dependent constant. */
5379 INSN_READY_CYCLE (insn)
5380 = INSN_SCHED_CYCLE (insn) + (INSN_CODE (insn) < 0
5382 : maximal_insn_latency (insn) + 1);
5384 /* Change these fields last, as they're used above. */
5385 FENCE_AFTER_STALL_P (fence) = 0;
5386 if (asm_p || need_stall)
5387 advance_one_cycle (fence);
5389 /* Indicate that we've scheduled something on this fence. */
5390 FENCE_SCHEDULED_P (fence) = true;
5391 scheduled_something_on_previous_fence = true;
5393 /* Print debug information when insn's fields are updated. */
5394 if (sched_verbose >= 2)
5396 sel_print ("Scheduling insn: ");
5397 dump_insn_1 (insn, 1);
5398 sel_print ("\n");
5402 /* Update boundary BND (and, if needed, FENCE) with INSN, remove the
5403 old boundary from BNDSP, add new boundaries to BNDS_TAIL_P and
5404 return it. */
5405 static blist_t *
5406 update_boundaries (fence_t fence, bnd_t bnd, insn_t insn, blist_t *bndsp,
5407 blist_t *bnds_tailp)
5409 succ_iterator si;
5410 insn_t succ;
5412 advance_deps_context (BND_DC (bnd), insn);
5413 FOR_EACH_SUCC_1 (succ, si, insn,
5414 SUCCS_NORMAL | SUCCS_SKIP_TO_LOOP_EXITS)
5416 ilist_t ptr = ilist_copy (BND_PTR (bnd));
5418 ilist_add (&ptr, insn);
5420 if (DEBUG_INSN_P (insn) && sel_bb_end_p (insn)
5421 && is_ineligible_successor (succ, ptr))
5423 ilist_clear (&ptr);
5424 continue;
5427 if (FENCE_INSN (fence) == insn && !sel_bb_end_p (insn))
5429 if (sched_verbose >= 9)
5430 sel_print ("Updating fence insn from %i to %i\n",
5431 INSN_UID (insn), INSN_UID (succ));
5432 FENCE_INSN (fence) = succ;
5434 blist_add (bnds_tailp, succ, ptr, BND_DC (bnd));
5435 bnds_tailp = &BLIST_NEXT (*bnds_tailp);
5438 blist_remove (bndsp);
5439 return bnds_tailp;
5442 /* Schedule EXPR_VLIW on BND. Return the insn emitted. */
5443 static insn_t
5444 schedule_expr_on_boundary (bnd_t bnd, expr_t expr_vliw, int seqno)
5446 av_set_t expr_seq;
5447 expr_t c_expr = XALLOCA (expr_def);
5448 insn_t place_to_insert;
5449 insn_t insn;
5450 bool should_move;
5452 expr_seq = find_sequential_best_exprs (bnd, expr_vliw, true);
5454 /* In case of scheduling a jump skipping some other instructions,
5455 prepare CFG. After this, jump is at the boundary and can be
5456 scheduled as usual insn by MOVE_OP. */
5457 if (vinsn_cond_branch_p (EXPR_VINSN (expr_vliw)))
5459 insn = EXPR_INSN_RTX (expr_vliw);
5461 /* Speculative jumps are not handled. */
5462 if (insn != BND_TO (bnd)
5463 && !sel_insn_is_speculation_check (insn))
5464 move_cond_jump (insn, bnd);
5467 /* Find a place for C_EXPR to schedule. */
5468 place_to_insert = prepare_place_to_insert (bnd);
5469 should_move = move_exprs_to_boundary (bnd, expr_vliw, expr_seq, c_expr);
5470 clear_expr (c_expr);
5472 /* Add the instruction. The corner case to care about is when
5473 the expr_seq set has more than one expr, and we chose the one that
5474 is not equal to expr_vliw. Then expr_vliw may be insn in stream, and
5475 we can't use it. Generate the new vinsn. */
5476 if (INSN_IN_STREAM_P (EXPR_INSN_RTX (expr_vliw)))
5478 vinsn_t vinsn_new;
5480 vinsn_new = vinsn_copy (EXPR_VINSN (expr_vliw), false);
5481 change_vinsn_in_expr (expr_vliw, vinsn_new);
5482 should_move = false;
5484 if (should_move)
5485 insn = sel_move_insn (expr_vliw, seqno, place_to_insert);
5486 else
5487 insn = emit_insn_from_expr_after (expr_vliw, NULL, seqno,
5488 place_to_insert);
5490 /* Return the nops generated for preserving of data sets back
5491 into pool. */
5492 if (INSN_NOP_P (place_to_insert))
5493 return_nop_to_pool (place_to_insert, !DEBUG_INSN_P (insn));
5494 remove_temp_moveop_nops (!DEBUG_INSN_P (insn));
5496 av_set_clear (&expr_seq);
5498 /* Save the expression scheduled so to reset target availability if we'll
5499 meet it later on the same fence. */
5500 if (EXPR_WAS_RENAMED (expr_vliw))
5501 vinsn_vec_add (&vec_target_unavailable_vinsns, INSN_EXPR (insn));
5503 /* Check that the recent movement didn't destroyed loop
5504 structure. */
5505 gcc_assert (!pipelining_p
5506 || current_loop_nest == NULL
5507 || loop_latch_edge (current_loop_nest));
5508 return insn;
5511 /* Stall for N cycles on FENCE. */
5512 static void
5513 stall_for_cycles (fence_t fence, int n)
5515 int could_more;
5517 could_more = n > 1 || FENCE_ISSUED_INSNS (fence) < issue_rate;
5518 while (n--)
5519 advance_one_cycle (fence);
5520 if (could_more)
5521 FENCE_AFTER_STALL_P (fence) = 1;
5524 /* Gather a parallel group of insns at FENCE and assign their seqno
5525 to SEQNO. All scheduled insns are gathered in SCHEDULED_INSNS_TAILPP
5526 list for later recalculation of seqnos. */
5527 static void
5528 fill_insns (fence_t fence, int seqno, ilist_t **scheduled_insns_tailpp)
5530 blist_t bnds = NULL, *bnds_tailp;
5531 av_set_t av_vliw = NULL;
5532 insn_t insn = FENCE_INSN (fence);
5534 if (sched_verbose >= 2)
5535 sel_print ("Starting fill_insns for insn %d, cycle %d\n",
5536 INSN_UID (insn), FENCE_CYCLE (fence));
5538 blist_add (&bnds, insn, NULL, FENCE_DC (fence));
5539 bnds_tailp = &BLIST_NEXT (bnds);
5540 set_target_context (FENCE_TC (fence));
5541 can_issue_more = FENCE_ISSUE_MORE (fence);
5542 target_bb = INSN_BB (insn);
5544 /* Do while we can add any operation to the current group. */
5547 blist_t *bnds_tailp1, *bndsp;
5548 expr_t expr_vliw;
5549 int need_stall = false;
5550 int was_stall = 0, scheduled_insns = 0;
5551 int max_insns = pipelining_p ? issue_rate : 2 * issue_rate;
5552 int max_stall = pipelining_p ? 1 : 3;
5553 bool last_insn_was_debug = false;
5554 bool was_debug_bb_end_p = false;
5556 compute_av_set_on_boundaries (fence, bnds, &av_vliw);
5557 remove_insns_that_need_bookkeeping (fence, &av_vliw);
5558 remove_insns_for_debug (bnds, &av_vliw);
5560 /* Return early if we have nothing to schedule. */
5561 if (av_vliw == NULL)
5562 break;
5564 /* Choose the best expression and, if needed, destination register
5565 for it. */
5568 expr_vliw = find_best_expr (&av_vliw, bnds, fence, &need_stall);
5569 if (! expr_vliw && need_stall)
5571 /* All expressions required a stall. Do not recompute av sets
5572 as we'll get the same answer (modulo the insns between
5573 the fence and its boundary, which will not be available for
5574 pipelining).
5575 If we are going to stall for too long, break to recompute av
5576 sets and bring more insns for pipelining. */
5577 was_stall++;
5578 if (need_stall <= 3)
5579 stall_for_cycles (fence, need_stall);
5580 else
5582 stall_for_cycles (fence, 1);
5583 break;
5587 while (! expr_vliw && need_stall);
5589 /* Now either we've selected expr_vliw or we have nothing to schedule. */
5590 if (!expr_vliw)
5592 av_set_clear (&av_vliw);
5593 break;
5596 bndsp = &bnds;
5597 bnds_tailp1 = bnds_tailp;
5600 /* This code will be executed only once until we'd have several
5601 boundaries per fence. */
5603 bnd_t bnd = BLIST_BND (*bndsp);
5605 if (!av_set_is_in_p (BND_AV1 (bnd), EXPR_VINSN (expr_vliw)))
5607 bndsp = &BLIST_NEXT (*bndsp);
5608 continue;
5611 insn = schedule_expr_on_boundary (bnd, expr_vliw, seqno);
5612 last_insn_was_debug = DEBUG_INSN_P (insn);
5613 if (last_insn_was_debug)
5614 was_debug_bb_end_p = (insn == BND_TO (bnd) && sel_bb_end_p (insn));
5615 update_fence_and_insn (fence, insn, need_stall);
5616 bnds_tailp = update_boundaries (fence, bnd, insn, bndsp, bnds_tailp);
5618 /* Add insn to the list of scheduled on this cycle instructions. */
5619 ilist_add (*scheduled_insns_tailpp, insn);
5620 *scheduled_insns_tailpp = &ILIST_NEXT (**scheduled_insns_tailpp);
5622 while (*bndsp != *bnds_tailp1);
5624 av_set_clear (&av_vliw);
5625 if (!last_insn_was_debug)
5626 scheduled_insns++;
5628 /* We currently support information about candidate blocks only for
5629 one 'target_bb' block. Hence we can't schedule after jump insn,
5630 as this will bring two boundaries and, hence, necessity to handle
5631 information for two or more blocks concurrently. */
5632 if ((last_insn_was_debug ? was_debug_bb_end_p : sel_bb_end_p (insn))
5633 || (was_stall
5634 && (was_stall >= max_stall
5635 || scheduled_insns >= max_insns)))
5636 break;
5638 while (bnds);
5640 gcc_assert (!FENCE_BNDS (fence));
5642 /* Update boundaries of the FENCE. */
5643 while (bnds)
5645 ilist_t ptr = BND_PTR (BLIST_BND (bnds));
5647 if (ptr)
5649 insn = ILIST_INSN (ptr);
5651 if (!ilist_is_in_p (FENCE_BNDS (fence), insn))
5652 ilist_add (&FENCE_BNDS (fence), insn);
5655 blist_remove (&bnds);
5658 /* Update target context on the fence. */
5659 reset_target_context (FENCE_TC (fence), false);
5662 /* All exprs in ORIG_OPS must have the same destination register or memory.
5663 Return that destination. */
5664 static rtx
5665 get_dest_from_orig_ops (av_set_t orig_ops)
5667 rtx dest = NULL_RTX;
5668 av_set_iterator av_it;
5669 expr_t expr;
5670 bool first_p = true;
5672 FOR_EACH_EXPR (expr, av_it, orig_ops)
5674 rtx x = EXPR_LHS (expr);
5676 if (first_p)
5678 first_p = false;
5679 dest = x;
5681 else
5682 gcc_assert (dest == x
5683 || (dest != NULL_RTX && x != NULL_RTX
5684 && rtx_equal_p (dest, x)));
5687 return dest;
5690 /* Update data sets for the bookkeeping block and record those expressions
5691 which become no longer available after inserting this bookkeeping. */
5692 static void
5693 update_and_record_unavailable_insns (basic_block book_block)
5695 av_set_iterator i;
5696 av_set_t old_av_set = NULL;
5697 expr_t cur_expr;
5698 rtx_insn *bb_end = sel_bb_end (book_block);
5700 /* First, get correct liveness in the bookkeeping block. The problem is
5701 the range between the bookeeping insn and the end of block. */
5702 update_liveness_on_insn (bb_end);
5703 if (control_flow_insn_p (bb_end))
5704 update_liveness_on_insn (PREV_INSN (bb_end));
5706 /* If there's valid av_set on BOOK_BLOCK, then there might exist another
5707 fence above, where we may choose to schedule an insn which is
5708 actually blocked from moving up with the bookkeeping we create here. */
5709 if (AV_SET_VALID_P (sel_bb_head (book_block)))
5711 old_av_set = av_set_copy (BB_AV_SET (book_block));
5712 update_data_sets (sel_bb_head (book_block));
5714 /* Traverse all the expressions in the old av_set and check whether
5715 CUR_EXPR is in new AV_SET. */
5716 FOR_EACH_EXPR (cur_expr, i, old_av_set)
5718 expr_t new_expr = av_set_lookup (BB_AV_SET (book_block),
5719 EXPR_VINSN (cur_expr));
5721 if (! new_expr
5722 /* In this case, we can just turn off the E_T_A bit, but we can't
5723 represent this information with the current vector. */
5724 || EXPR_TARGET_AVAILABLE (new_expr)
5725 != EXPR_TARGET_AVAILABLE (cur_expr))
5726 /* Unfortunately, the below code could be also fired up on
5727 separable insns, e.g. when moving insns through the new
5728 speculation check as in PR 53701. */
5729 vinsn_vec_add (&vec_bookkeeping_blocked_vinsns, cur_expr);
5732 av_set_clear (&old_av_set);
5736 /* The main effect of this function is that sparams->c_expr is merged
5737 with (or copied to) lparams->c_expr_merged. If there's only one successor,
5738 we avoid merging anything by copying sparams->c_expr to lparams->c_expr_merged.
5739 lparams->c_expr_merged is copied back to sparams->c_expr after all
5740 successors has been traversed. lparams->c_expr_local is an expr allocated
5741 on stack in the caller function, and is used if there is more than one
5742 successor.
5744 SUCC is one of the SUCCS_NORMAL successors of INSN,
5745 MOVEOP_DRV_CALL_RES is the result of call code_motion_path_driver on succ,
5746 LPARAMS and STATIC_PARAMS contain the parameters described above. */
5747 static void
5748 move_op_merge_succs (insn_t insn ATTRIBUTE_UNUSED,
5749 insn_t succ ATTRIBUTE_UNUSED,
5750 int moveop_drv_call_res,
5751 cmpd_local_params_p lparams, void *static_params)
5753 moveop_static_params_p sparams = (moveop_static_params_p) static_params;
5755 /* Nothing to do, if original expr wasn't found below. */
5756 if (moveop_drv_call_res != 1)
5757 return;
5759 /* If this is a first successor. */
5760 if (!lparams->c_expr_merged)
5762 lparams->c_expr_merged = sparams->c_expr;
5763 sparams->c_expr = lparams->c_expr_local;
5765 else
5767 /* We must merge all found expressions to get reasonable
5768 EXPR_SPEC_DONE_DS for the resulting insn. If we don't
5769 do so then we can first find the expr with epsilon
5770 speculation success probability and only then with the
5771 good probability. As a result the insn will get epsilon
5772 probability and will never be scheduled because of
5773 weakness_cutoff in find_best_expr.
5775 We call merge_expr_data here instead of merge_expr
5776 because due to speculation C_EXPR and X may have the
5777 same insns with different speculation types. And as of
5778 now such insns are considered non-equal.
5780 However, EXPR_SCHED_TIMES is different -- we must get
5781 SCHED_TIMES from a real insn, not a bookkeeping copy.
5782 We force this here. Instead, we may consider merging
5783 SCHED_TIMES to the maximum instead of minimum in the
5784 below function. */
5785 int old_times = EXPR_SCHED_TIMES (lparams->c_expr_merged);
5787 merge_expr_data (lparams->c_expr_merged, sparams->c_expr, NULL);
5788 if (EXPR_SCHED_TIMES (sparams->c_expr) == 0)
5789 EXPR_SCHED_TIMES (lparams->c_expr_merged) = old_times;
5791 clear_expr (sparams->c_expr);
5795 /* Add used regs for the successor SUCC into SPARAMS->USED_REGS.
5797 SUCC is one of the SUCCS_NORMAL successors of INSN,
5798 MOVEOP_DRV_CALL_RES is the result of call code_motion_path_driver on succ or 0,
5799 if SUCC is one of SUCCS_BACK or SUCCS_OUT.
5800 STATIC_PARAMS contain USED_REGS set. */
5801 static void
5802 fur_merge_succs (insn_t insn ATTRIBUTE_UNUSED, insn_t succ,
5803 int moveop_drv_call_res,
5804 cmpd_local_params_p lparams ATTRIBUTE_UNUSED,
5805 void *static_params)
5807 regset succ_live;
5808 fur_static_params_p sparams = (fur_static_params_p) static_params;
5810 /* Here we compute live regsets only for branches that do not lie
5811 on the code motion paths. These branches correspond to value
5812 MOVEOP_DRV_CALL_RES==0 and include SUCCS_BACK and SUCCS_OUT, though
5813 for such branches code_motion_path_driver is not called. */
5814 if (moveop_drv_call_res != 0)
5815 return;
5817 /* Mark all registers that do not meet the following condition:
5818 (3) not live on the other path of any conditional branch
5819 that is passed by the operation, in case original
5820 operations are not present on both paths of the
5821 conditional branch. */
5822 succ_live = compute_live (succ);
5823 IOR_REG_SET (sparams->used_regs, succ_live);
5826 /* This function is called after the last successor. Copies LP->C_EXPR_MERGED
5827 into SP->CEXPR. */
5828 static void
5829 move_op_after_merge_succs (cmpd_local_params_p lp, void *sparams)
5831 moveop_static_params_p sp = (moveop_static_params_p) sparams;
5833 sp->c_expr = lp->c_expr_merged;
5836 /* Track bookkeeping copies created, insns scheduled, and blocks for
5837 rescheduling when INSN is found by move_op. */
5838 static void
5839 track_scheduled_insns_and_blocks (rtx insn)
5841 /* Even if this insn can be a copy that will be removed during current move_op,
5842 we still need to count it as an originator. */
5843 bitmap_set_bit (current_originators, INSN_UID (insn));
5845 if (!bitmap_clear_bit (current_copies, INSN_UID (insn)))
5847 /* Note that original block needs to be rescheduled, as we pulled an
5848 instruction out of it. */
5849 if (INSN_SCHED_TIMES (insn) > 0)
5850 bitmap_set_bit (blocks_to_reschedule, BLOCK_FOR_INSN (insn)->index);
5851 else if (INSN_UID (insn) < first_emitted_uid && !DEBUG_INSN_P (insn))
5852 num_insns_scheduled++;
5855 /* For instructions we must immediately remove insn from the
5856 stream, so subsequent update_data_sets () won't include this
5857 insn into av_set.
5858 For expr we must make insn look like "INSN_REG (insn) := c_expr". */
5859 if (INSN_UID (insn) > max_uid_before_move_op)
5860 stat_bookkeeping_copies--;
5863 /* Emit a register-register copy for INSN if needed. Return true if
5864 emitted one. PARAMS is the move_op static parameters. */
5865 static bool
5866 maybe_emit_renaming_copy (rtx_insn *insn,
5867 moveop_static_params_p params)
5869 bool insn_emitted = false;
5870 rtx cur_reg;
5872 /* Bail out early when expression can not be renamed at all. */
5873 if (!EXPR_SEPARABLE_P (params->c_expr))
5874 return false;
5876 cur_reg = expr_dest_reg (params->c_expr);
5877 gcc_assert (cur_reg && params->dest && REG_P (params->dest));
5879 /* If original operation has expr and the register chosen for
5880 that expr is not original operation's dest reg, substitute
5881 operation's right hand side with the register chosen. */
5882 if (REGNO (params->dest) != REGNO (cur_reg))
5884 insn_t reg_move_insn, reg_move_insn_rtx;
5886 reg_move_insn_rtx = create_insn_rtx_with_rhs (INSN_VINSN (insn),
5887 params->dest);
5888 reg_move_insn = sel_gen_insn_from_rtx_after (reg_move_insn_rtx,
5889 INSN_EXPR (insn),
5890 INSN_SEQNO (insn),
5891 insn);
5892 EXPR_SPEC_DONE_DS (INSN_EXPR (reg_move_insn)) = 0;
5893 replace_dest_with_reg_in_expr (params->c_expr, params->dest);
5895 insn_emitted = true;
5896 params->was_renamed = true;
5899 return insn_emitted;
5902 /* Emit a speculative check for INSN speculated as EXPR if needed.
5903 Return true if we've emitted one. PARAMS is the move_op static
5904 parameters. */
5905 static bool
5906 maybe_emit_speculative_check (rtx_insn *insn, expr_t expr,
5907 moveop_static_params_p params)
5909 bool insn_emitted = false;
5910 insn_t x;
5911 ds_t check_ds;
5913 check_ds = get_spec_check_type_for_insn (insn, expr);
5914 if (check_ds != 0)
5916 /* A speculation check should be inserted. */
5917 x = create_speculation_check (params->c_expr, check_ds, insn);
5918 insn_emitted = true;
5920 else
5922 EXPR_SPEC_DONE_DS (INSN_EXPR (insn)) = 0;
5923 x = insn;
5926 gcc_assert (EXPR_SPEC_DONE_DS (INSN_EXPR (x)) == 0
5927 && EXPR_SPEC_TO_CHECK_DS (INSN_EXPR (x)) == 0);
5928 return insn_emitted;
5931 /* Handle transformations that leave an insn in place of original
5932 insn such as renaming/speculation. Return true if one of such
5933 transformations actually happened, and we have emitted this insn. */
5934 static bool
5935 handle_emitting_transformations (rtx_insn *insn, expr_t expr,
5936 moveop_static_params_p params)
5938 bool insn_emitted = false;
5940 insn_emitted = maybe_emit_renaming_copy (insn, params);
5941 insn_emitted |= maybe_emit_speculative_check (insn, expr, params);
5943 return insn_emitted;
5946 /* If INSN is the only insn in the basic block (not counting JUMP,
5947 which may be a jump to next insn, and DEBUG_INSNs), we want to
5948 leave a NOP there till the return to fill_insns. */
5950 static bool
5951 need_nop_to_preserve_insn_bb (rtx_insn *insn)
5953 insn_t bb_head, bb_end, bb_next, in_next;
5954 basic_block bb = BLOCK_FOR_INSN (insn);
5956 bb_head = sel_bb_head (bb);
5957 bb_end = sel_bb_end (bb);
5959 if (bb_head == bb_end)
5960 return true;
5962 while (bb_head != bb_end && DEBUG_INSN_P (bb_head))
5963 bb_head = NEXT_INSN (bb_head);
5965 if (bb_head == bb_end)
5966 return true;
5968 while (bb_head != bb_end && DEBUG_INSN_P (bb_end))
5969 bb_end = PREV_INSN (bb_end);
5971 if (bb_head == bb_end)
5972 return true;
5974 bb_next = NEXT_INSN (bb_head);
5975 while (bb_next != bb_end && DEBUG_INSN_P (bb_next))
5976 bb_next = NEXT_INSN (bb_next);
5978 if (bb_next == bb_end && JUMP_P (bb_end))
5979 return true;
5981 in_next = NEXT_INSN (insn);
5982 while (DEBUG_INSN_P (in_next))
5983 in_next = NEXT_INSN (in_next);
5985 if (IN_CURRENT_FENCE_P (in_next))
5986 return true;
5988 return false;
5991 /* Remove INSN from stream. When ONLY_DISCONNECT is true, its data
5992 is not removed but reused when INSN is re-emitted. */
5993 static void
5994 remove_insn_from_stream (rtx_insn *insn, bool only_disconnect)
5996 /* If there's only one insn in the BB, make sure that a nop is
5997 inserted into it, so the basic block won't disappear when we'll
5998 delete INSN below with sel_remove_insn. It should also survive
5999 till the return to fill_insns. */
6000 if (need_nop_to_preserve_insn_bb (insn))
6002 insn_t nop = get_nop_from_pool (insn);
6003 gcc_assert (INSN_NOP_P (nop));
6004 vec_temp_moveop_nops.safe_push (nop);
6007 sel_remove_insn (insn, only_disconnect, false);
6010 /* This function is called when original expr is found.
6011 INSN - current insn traversed, EXPR - the corresponding expr found.
6012 LPARAMS is the local parameters of code modion driver, STATIC_PARAMS
6013 is static parameters of move_op. */
6014 static void
6015 move_op_orig_expr_found (insn_t insn, expr_t expr,
6016 cmpd_local_params_p lparams ATTRIBUTE_UNUSED,
6017 void *static_params)
6019 bool only_disconnect;
6020 moveop_static_params_p params = (moveop_static_params_p) static_params;
6022 copy_expr_onside (params->c_expr, INSN_EXPR (insn));
6023 track_scheduled_insns_and_blocks (insn);
6024 handle_emitting_transformations (insn, expr, params);
6025 only_disconnect = params->uid == INSN_UID (insn);
6027 /* Mark that we've disconnected an insn. */
6028 if (only_disconnect)
6029 params->uid = -1;
6030 remove_insn_from_stream (insn, only_disconnect);
6033 /* The function is called when original expr is found.
6034 INSN - current insn traversed, EXPR - the corresponding expr found,
6035 crosses_call and original_insns in STATIC_PARAMS are updated. */
6036 static void
6037 fur_orig_expr_found (insn_t insn, expr_t expr ATTRIBUTE_UNUSED,
6038 cmpd_local_params_p lparams ATTRIBUTE_UNUSED,
6039 void *static_params)
6041 fur_static_params_p params = (fur_static_params_p) static_params;
6042 regset tmp;
6044 if (CALL_P (insn))
6045 params->crosses_call = true;
6047 def_list_add (params->original_insns, insn, params->crosses_call);
6049 /* Mark the registers that do not meet the following condition:
6050 (2) not among the live registers of the point
6051 immediately following the first original operation on
6052 a given downward path, except for the original target
6053 register of the operation. */
6054 tmp = get_clear_regset_from_pool ();
6055 compute_live_below_insn (insn, tmp);
6056 AND_COMPL_REG_SET (tmp, INSN_REG_SETS (insn));
6057 AND_COMPL_REG_SET (tmp, INSN_REG_CLOBBERS (insn));
6058 IOR_REG_SET (params->used_regs, tmp);
6059 return_regset_to_pool (tmp);
6061 /* (*1) We need to add to USED_REGS registers that are read by
6062 INSN's lhs. This may lead to choosing wrong src register.
6063 E.g. (scheduling const expr enabled):
6065 429: ax=0x0 <- Can't use AX for this expr (0x0)
6066 433: dx=[bp-0x18]
6067 427: [ax+dx+0x1]=ax
6068 REG_DEAD: ax
6069 168: di=dx
6070 REG_DEAD: dx
6072 /* FIXME: see comment above and enable MEM_P
6073 in vinsn_separable_p. */
6074 gcc_assert (!VINSN_SEPARABLE_P (INSN_VINSN (insn))
6075 || !MEM_P (INSN_LHS (insn)));
6078 /* This function is called on the ascending pass, before returning from
6079 current basic block. */
6080 static void
6081 move_op_at_first_insn (insn_t insn, cmpd_local_params_p lparams,
6082 void *static_params)
6084 moveop_static_params_p sparams = (moveop_static_params_p) static_params;
6085 basic_block book_block = NULL;
6087 /* When we have removed the boundary insn for scheduling, which also
6088 happened to be the end insn in its bb, we don't need to update sets. */
6089 if (!lparams->removed_last_insn
6090 && lparams->e1
6091 && sel_bb_head_p (insn))
6093 /* We should generate bookkeeping code only if we are not at the
6094 top level of the move_op. */
6095 if (sel_num_cfg_preds_gt_1 (insn))
6096 book_block = generate_bookkeeping_insn (sparams->c_expr,
6097 lparams->e1, lparams->e2);
6098 /* Update data sets for the current insn. */
6099 update_data_sets (insn);
6102 /* If bookkeeping code was inserted, we need to update av sets of basic
6103 block that received bookkeeping. After generation of bookkeeping insn,
6104 bookkeeping block does not contain valid av set because we are not following
6105 the original algorithm in every detail with regards to e.g. renaming
6106 simple reg-reg copies. Consider example:
6108 bookkeeping block scheduling fence
6110 \ join /
6111 ----------
6113 ----------
6116 r1 := r2 r1 := r3
6118 We try to schedule insn "r1 := r3" on the current
6119 scheduling fence. Also, note that av set of bookkeeping block
6120 contain both insns "r1 := r2" and "r1 := r3". When the insn has
6121 been scheduled, the CFG is as follows:
6123 r1 := r3 r1 := r3
6124 bookkeeping block scheduling fence
6126 \ join /
6127 ----------
6129 ----------
6132 r1 := r2
6134 Here, insn "r1 := r3" was scheduled at the current scheduling point
6135 and bookkeeping code was generated at the bookeeping block. This
6136 way insn "r1 := r2" is no longer available as a whole instruction
6137 (but only as expr) ahead of insn "r1 := r3" in bookkeeping block.
6138 This situation is handled by calling update_data_sets.
6140 Since update_data_sets is called only on the bookkeeping block, and
6141 it also may have predecessors with av_sets, containing instructions that
6142 are no longer available, we save all such expressions that become
6143 unavailable during data sets update on the bookkeeping block in
6144 VEC_BOOKKEEPING_BLOCKED_VINSNS. Later we avoid selecting such
6145 expressions for scheduling. This allows us to avoid recomputation of
6146 av_sets outside the code motion path. */
6148 if (book_block)
6149 update_and_record_unavailable_insns (book_block);
6151 /* If INSN was previously marked for deletion, it's time to do it. */
6152 if (lparams->removed_last_insn)
6153 insn = PREV_INSN (insn);
6155 /* Do not tidy control flow at the topmost moveop, as we can erroneously
6156 kill a block with a single nop in which the insn should be emitted. */
6157 if (lparams->e1)
6158 tidy_control_flow (BLOCK_FOR_INSN (insn), true);
6161 /* This function is called on the ascending pass, before returning from the
6162 current basic block. */
6163 static void
6164 fur_at_first_insn (insn_t insn,
6165 cmpd_local_params_p lparams ATTRIBUTE_UNUSED,
6166 void *static_params ATTRIBUTE_UNUSED)
6168 gcc_assert (!sel_bb_head_p (insn) || AV_SET_VALID_P (insn)
6169 || AV_LEVEL (insn) == -1);
6172 /* Called on the backward stage of recursion to call moveup_expr for insn
6173 and sparams->c_expr. */
6174 static void
6175 move_op_ascend (insn_t insn, void *static_params)
6177 enum MOVEUP_EXPR_CODE res;
6178 moveop_static_params_p sparams = (moveop_static_params_p) static_params;
6180 if (! INSN_NOP_P (insn))
6182 res = moveup_expr_cached (sparams->c_expr, insn, false);
6183 gcc_assert (res != MOVEUP_EXPR_NULL);
6186 /* Update liveness for this insn as it was invalidated. */
6187 update_liveness_on_insn (insn);
6190 /* This function is called on enter to the basic block.
6191 Returns TRUE if this block already have been visited and
6192 code_motion_path_driver should return 1, FALSE otherwise. */
6193 static int
6194 fur_on_enter (insn_t insn ATTRIBUTE_UNUSED, cmpd_local_params_p local_params,
6195 void *static_params, bool visited_p)
6197 fur_static_params_p sparams = (fur_static_params_p) static_params;
6199 if (visited_p)
6201 /* If we have found something below this block, there should be at
6202 least one insn in ORIGINAL_INSNS. */
6203 gcc_assert (*sparams->original_insns);
6205 /* Adjust CROSSES_CALL, since we may have come to this block along
6206 different path. */
6207 DEF_LIST_DEF (*sparams->original_insns)->crosses_call
6208 |= sparams->crosses_call;
6210 else
6211 local_params->old_original_insns = *sparams->original_insns;
6213 return 1;
6216 /* Same as above but for move_op. */
6217 static int
6218 move_op_on_enter (insn_t insn ATTRIBUTE_UNUSED,
6219 cmpd_local_params_p local_params ATTRIBUTE_UNUSED,
6220 void *static_params ATTRIBUTE_UNUSED, bool visited_p)
6222 if (visited_p)
6223 return -1;
6224 return 1;
6227 /* This function is called while descending current basic block if current
6228 insn is not the original EXPR we're searching for.
6230 Return value: FALSE, if code_motion_path_driver should perform a local
6231 cleanup and return 0 itself;
6232 TRUE, if code_motion_path_driver should continue. */
6233 static bool
6234 move_op_orig_expr_not_found (insn_t insn, av_set_t orig_ops ATTRIBUTE_UNUSED,
6235 void *static_params)
6237 moveop_static_params_p sparams = (moveop_static_params_p) static_params;
6239 #ifdef ENABLE_CHECKING
6240 sparams->failed_insn = insn;
6241 #endif
6243 /* If we're scheduling separate expr, in order to generate correct code
6244 we need to stop the search at bookkeeping code generated with the
6245 same destination register or memory. */
6246 if (lhs_of_insn_equals_to_dest_p (insn, sparams->dest))
6247 return false;
6248 return true;
6251 /* This function is called while descending current basic block if current
6252 insn is not the original EXPR we're searching for.
6254 Return value: TRUE (code_motion_path_driver should continue). */
6255 static bool
6256 fur_orig_expr_not_found (insn_t insn, av_set_t orig_ops, void *static_params)
6258 bool mutexed;
6259 expr_t r;
6260 av_set_iterator avi;
6261 fur_static_params_p sparams = (fur_static_params_p) static_params;
6263 if (CALL_P (insn))
6264 sparams->crosses_call = true;
6265 else if (DEBUG_INSN_P (insn))
6266 return true;
6268 /* If current insn we are looking at cannot be executed together
6269 with original insn, then we can skip it safely.
6271 Example: ORIG_OPS = { (p6) r14 = sign_extend (r15); }
6272 INSN = (!p6) r14 = r14 + 1;
6274 Here we can schedule ORIG_OP with lhs = r14, though only
6275 looking at the set of used and set registers of INSN we must
6276 forbid it. So, add set/used in INSN registers to the
6277 untouchable set only if there is an insn in ORIG_OPS that can
6278 affect INSN. */
6279 mutexed = true;
6280 FOR_EACH_EXPR (r, avi, orig_ops)
6281 if (!sched_insns_conditions_mutex_p (insn, EXPR_INSN_RTX (r)))
6283 mutexed = false;
6284 break;
6287 /* Mark all registers that do not meet the following condition:
6288 (1) Not set or read on any path from xi to an instance of the
6289 original operation. */
6290 if (!mutexed)
6292 IOR_REG_SET (sparams->used_regs, INSN_REG_SETS (insn));
6293 IOR_REG_SET (sparams->used_regs, INSN_REG_USES (insn));
6294 IOR_REG_SET (sparams->used_regs, INSN_REG_CLOBBERS (insn));
6297 return true;
6300 /* Hooks and data to perform move_op operations with code_motion_path_driver. */
6301 struct code_motion_path_driver_info_def move_op_hooks = {
6302 move_op_on_enter,
6303 move_op_orig_expr_found,
6304 move_op_orig_expr_not_found,
6305 move_op_merge_succs,
6306 move_op_after_merge_succs,
6307 move_op_ascend,
6308 move_op_at_first_insn,
6309 SUCCS_NORMAL,
6310 "move_op"
6313 /* Hooks and data to perform find_used_regs operations
6314 with code_motion_path_driver. */
6315 struct code_motion_path_driver_info_def fur_hooks = {
6316 fur_on_enter,
6317 fur_orig_expr_found,
6318 fur_orig_expr_not_found,
6319 fur_merge_succs,
6320 NULL, /* fur_after_merge_succs */
6321 NULL, /* fur_ascend */
6322 fur_at_first_insn,
6323 SUCCS_ALL,
6324 "find_used_regs"
6327 /* Traverse all successors of INSN. For each successor that is SUCCS_NORMAL
6328 code_motion_path_driver is called recursively. Original operation
6329 was found at least on one path that is starting with one of INSN's
6330 successors (this fact is asserted). ORIG_OPS is expressions we're looking
6331 for, PATH is the path we've traversed, STATIC_PARAMS is the parameters
6332 of either move_op or find_used_regs depending on the caller.
6334 Return 0 if we haven't found expression, 1 if we found it, -1 if we don't
6335 know for sure at this point. */
6336 static int
6337 code_motion_process_successors (insn_t insn, av_set_t orig_ops,
6338 ilist_t path, void *static_params)
6340 int res = 0;
6341 succ_iterator succ_i;
6342 insn_t succ;
6343 basic_block bb;
6344 int old_index;
6345 unsigned old_succs;
6347 struct cmpd_local_params lparams;
6348 expr_def _x;
6350 lparams.c_expr_local = &_x;
6351 lparams.c_expr_merged = NULL;
6353 /* We need to process only NORMAL succs for move_op, and collect live
6354 registers from ALL branches (including those leading out of the
6355 region) for find_used_regs.
6357 In move_op, there can be a case when insn's bb number has changed
6358 due to created bookkeeping. This happens very rare, as we need to
6359 move expression from the beginning to the end of the same block.
6360 Rescan successors in this case. */
6362 rescan:
6363 bb = BLOCK_FOR_INSN (insn);
6364 old_index = bb->index;
6365 old_succs = EDGE_COUNT (bb->succs);
6367 FOR_EACH_SUCC_1 (succ, succ_i, insn, code_motion_path_driver_info->succ_flags)
6369 int b;
6371 lparams.e1 = succ_i.e1;
6372 lparams.e2 = succ_i.e2;
6374 /* Go deep into recursion only for NORMAL edges (non-backedges within the
6375 current region). */
6376 if (succ_i.current_flags == SUCCS_NORMAL)
6377 b = code_motion_path_driver (succ, orig_ops, path, &lparams,
6378 static_params);
6379 else
6380 b = 0;
6382 /* Merge c_expres found or unify live register sets from different
6383 successors. */
6384 code_motion_path_driver_info->merge_succs (insn, succ, b, &lparams,
6385 static_params);
6386 if (b == 1)
6387 res = b;
6388 else if (b == -1 && res != 1)
6389 res = b;
6391 /* We have simplified the control flow below this point. In this case,
6392 the iterator becomes invalid. We need to try again.
6393 If we have removed the insn itself, it could be only an
6394 unconditional jump. Thus, do not rescan but break immediately --
6395 we have already visited the only successor block. */
6396 if (!BLOCK_FOR_INSN (insn))
6398 if (sched_verbose >= 6)
6399 sel_print ("Not doing rescan: already visited the only successor"
6400 " of block %d\n", old_index);
6401 break;
6403 if (BLOCK_FOR_INSN (insn)->index != old_index
6404 || EDGE_COUNT (bb->succs) != old_succs)
6406 if (sched_verbose >= 6)
6407 sel_print ("Rescan: CFG was simplified below insn %d, block %d\n",
6408 INSN_UID (insn), BLOCK_FOR_INSN (insn)->index);
6409 insn = sel_bb_end (BLOCK_FOR_INSN (insn));
6410 goto rescan;
6414 #ifdef ENABLE_CHECKING
6415 /* Here, RES==1 if original expr was found at least for one of the
6416 successors. After the loop, RES may happen to have zero value
6417 only if at some point the expr searched is present in av_set, but is
6418 not found below. In most cases, this situation is an error.
6419 The exception is when the original operation is blocked by
6420 bookkeeping generated for another fence or for another path in current
6421 move_op. */
6422 gcc_assert (res == 1
6423 || (res == 0
6424 && av_set_could_be_blocked_by_bookkeeping_p (orig_ops,
6425 static_params))
6426 || res == -1);
6427 #endif
6429 /* Merge data, clean up, etc. */
6430 if (res != -1 && code_motion_path_driver_info->after_merge_succs)
6431 code_motion_path_driver_info->after_merge_succs (&lparams, static_params);
6433 return res;
6437 /* Perform a cleanup when the driver is about to terminate. ORIG_OPS_P
6438 is the pointer to the av set with expressions we were looking for,
6439 PATH_P is the pointer to the traversed path. */
6440 static inline void
6441 code_motion_path_driver_cleanup (av_set_t *orig_ops_p, ilist_t *path_p)
6443 ilist_remove (path_p);
6444 av_set_clear (orig_ops_p);
6447 /* The driver function that implements move_op or find_used_regs
6448 functionality dependent whether code_motion_path_driver_INFO is set to
6449 &MOVE_OP_HOOKS or &FUR_HOOKS. This function implements the common parts
6450 of code (CFG traversal etc) that are shared among both functions. INSN
6451 is the insn we're starting the search from, ORIG_OPS are the expressions
6452 we're searching for, PATH is traversed path, LOCAL_PARAMS_IN are local
6453 parameters of the driver, and STATIC_PARAMS are static parameters of
6454 the caller.
6456 Returns whether original instructions were found. Note that top-level
6457 code_motion_path_driver always returns true. */
6458 static int
6459 code_motion_path_driver (insn_t insn, av_set_t orig_ops, ilist_t path,
6460 cmpd_local_params_p local_params_in,
6461 void *static_params)
6463 expr_t expr = NULL;
6464 basic_block bb = BLOCK_FOR_INSN (insn);
6465 insn_t first_insn, bb_tail, before_first;
6466 bool removed_last_insn = false;
6468 if (sched_verbose >= 6)
6470 sel_print ("%s (", code_motion_path_driver_info->routine_name);
6471 dump_insn (insn);
6472 sel_print (",");
6473 dump_av_set (orig_ops);
6474 sel_print (")\n");
6477 gcc_assert (orig_ops);
6479 /* If no original operations exist below this insn, return immediately. */
6480 if (is_ineligible_successor (insn, path))
6482 if (sched_verbose >= 6)
6483 sel_print ("Insn %d is ineligible successor\n", INSN_UID (insn));
6484 return false;
6487 /* The block can have invalid av set, in which case it was created earlier
6488 during move_op. Return immediately. */
6489 if (sel_bb_head_p (insn))
6491 if (! AV_SET_VALID_P (insn))
6493 if (sched_verbose >= 6)
6494 sel_print ("Returned from block %d as it had invalid av set\n",
6495 bb->index);
6496 return false;
6499 if (bitmap_bit_p (code_motion_visited_blocks, bb->index))
6501 /* We have already found an original operation on this branch, do not
6502 go any further and just return TRUE here. If we don't stop here,
6503 function can have exponential behaviour even on the small code
6504 with many different paths (e.g. with data speculation and
6505 recovery blocks). */
6506 if (sched_verbose >= 6)
6507 sel_print ("Block %d already visited in this traversal\n", bb->index);
6508 if (code_motion_path_driver_info->on_enter)
6509 return code_motion_path_driver_info->on_enter (insn,
6510 local_params_in,
6511 static_params,
6512 true);
6516 if (code_motion_path_driver_info->on_enter)
6517 code_motion_path_driver_info->on_enter (insn, local_params_in,
6518 static_params, false);
6519 orig_ops = av_set_copy (orig_ops);
6521 /* Filter the orig_ops set. */
6522 if (AV_SET_VALID_P (insn))
6523 av_set_code_motion_filter (&orig_ops, AV_SET (insn));
6525 /* If no more original ops, return immediately. */
6526 if (!orig_ops)
6528 if (sched_verbose >= 6)
6529 sel_print ("No intersection with av set of block %d\n", bb->index);
6530 return false;
6533 /* For non-speculative insns we have to leave only one form of the
6534 original operation, because if we don't, we may end up with
6535 different C_EXPRes and, consequently, with bookkeepings for different
6536 expression forms along the same code motion path. That may lead to
6537 generation of incorrect code. So for each code motion we stick to
6538 the single form of the instruction, except for speculative insns
6539 which we need to keep in different forms with all speculation
6540 types. */
6541 av_set_leave_one_nonspec (&orig_ops);
6543 /* It is not possible that all ORIG_OPS are filtered out. */
6544 gcc_assert (orig_ops);
6546 /* It is enough to place only heads and tails of visited basic blocks into
6547 the PATH. */
6548 ilist_add (&path, insn);
6549 first_insn = insn;
6550 bb_tail = sel_bb_end (bb);
6552 /* Descend the basic block in search of the original expr; this part
6553 corresponds to the part of the original move_op procedure executed
6554 before the recursive call. */
6555 for (;;)
6557 /* Look at the insn and decide if it could be an ancestor of currently
6558 scheduling operation. If it is so, then the insn "dest = op" could
6559 either be replaced with "dest = reg", because REG now holds the result
6560 of OP, or just removed, if we've scheduled the insn as a whole.
6562 If this insn doesn't contain currently scheduling OP, then proceed
6563 with searching and look at its successors. Operations we're searching
6564 for could have changed when moving up through this insn via
6565 substituting. In this case, perform unsubstitution on them first.
6567 When traversing the DAG below this insn is finished, insert
6568 bookkeeping code, if the insn is a joint point, and remove
6569 leftovers. */
6571 expr = av_set_lookup (orig_ops, INSN_VINSN (insn));
6572 if (expr)
6574 insn_t last_insn = PREV_INSN (insn);
6576 /* We have found the original operation. */
6577 if (sched_verbose >= 6)
6578 sel_print ("Found original operation at insn %d\n", INSN_UID (insn));
6580 code_motion_path_driver_info->orig_expr_found
6581 (insn, expr, local_params_in, static_params);
6583 /* Step back, so on the way back we'll start traversing from the
6584 previous insn (or we'll see that it's bb_note and skip that
6585 loop). */
6586 if (insn == first_insn)
6588 first_insn = NEXT_INSN (last_insn);
6589 removed_last_insn = sel_bb_end_p (last_insn);
6591 insn = last_insn;
6592 break;
6594 else
6596 /* We haven't found the original expr, continue descending the basic
6597 block. */
6598 if (code_motion_path_driver_info->orig_expr_not_found
6599 (insn, orig_ops, static_params))
6601 /* Av set ops could have been changed when moving through this
6602 insn. To find them below it, we have to un-substitute them. */
6603 undo_transformations (&orig_ops, insn);
6605 else
6607 /* Clean up and return, if the hook tells us to do so. It may
6608 happen if we've encountered the previously created
6609 bookkeeping. */
6610 code_motion_path_driver_cleanup (&orig_ops, &path);
6611 return -1;
6614 gcc_assert (orig_ops);
6617 /* Stop at insn if we got to the end of BB. */
6618 if (insn == bb_tail)
6619 break;
6621 insn = NEXT_INSN (insn);
6624 /* Here INSN either points to the insn before the original insn (may be
6625 bb_note, if original insn was a bb_head) or to the bb_end. */
6626 if (!expr)
6628 int res;
6629 rtx_insn *last_insn = PREV_INSN (insn);
6630 bool added_to_path;
6632 gcc_assert (insn == sel_bb_end (bb));
6634 /* Add bb tail to PATH (but it doesn't make any sense if it's a bb_head -
6635 it's already in PATH then). */
6636 if (insn != first_insn)
6638 ilist_add (&path, insn);
6639 added_to_path = true;
6641 else
6642 added_to_path = false;
6644 /* Process_successors should be able to find at least one
6645 successor for which code_motion_path_driver returns TRUE. */
6646 res = code_motion_process_successors (insn, orig_ops,
6647 path, static_params);
6649 /* Jump in the end of basic block could have been removed or replaced
6650 during code_motion_process_successors, so recompute insn as the
6651 last insn in bb. */
6652 if (NEXT_INSN (last_insn) != insn)
6654 insn = sel_bb_end (bb);
6655 first_insn = sel_bb_head (bb);
6658 /* Remove bb tail from path. */
6659 if (added_to_path)
6660 ilist_remove (&path);
6662 if (res != 1)
6664 /* This is the case when one of the original expr is no longer available
6665 due to bookkeeping created on this branch with the same register.
6666 In the original algorithm, which doesn't have update_data_sets call
6667 on a bookkeeping block, it would simply result in returning
6668 FALSE when we've encountered a previously generated bookkeeping
6669 insn in moveop_orig_expr_not_found. */
6670 code_motion_path_driver_cleanup (&orig_ops, &path);
6671 return res;
6675 /* Don't need it any more. */
6676 av_set_clear (&orig_ops);
6678 /* Backward pass: now, when we have C_EXPR computed, we'll drag it to
6679 the beginning of the basic block. */
6680 before_first = PREV_INSN (first_insn);
6681 while (insn != before_first)
6683 if (code_motion_path_driver_info->ascend)
6684 code_motion_path_driver_info->ascend (insn, static_params);
6686 insn = PREV_INSN (insn);
6689 /* Now we're at the bb head. */
6690 insn = first_insn;
6691 ilist_remove (&path);
6692 local_params_in->removed_last_insn = removed_last_insn;
6693 code_motion_path_driver_info->at_first_insn (insn, local_params_in, static_params);
6695 /* This should be the very last operation as at bb head we could change
6696 the numbering by creating bookkeeping blocks. */
6697 if (removed_last_insn)
6698 insn = PREV_INSN (insn);
6700 /* If we have simplified the control flow and removed the first jump insn,
6701 there's no point in marking this block in the visited blocks bitmap. */
6702 if (BLOCK_FOR_INSN (insn))
6703 bitmap_set_bit (code_motion_visited_blocks, BLOCK_FOR_INSN (insn)->index);
6704 return true;
6707 /* Move up the operations from ORIG_OPS set traversing the dag starting
6708 from INSN. PATH represents the edges traversed so far.
6709 DEST is the register chosen for scheduling the current expr. Insert
6710 bookkeeping code in the join points. EXPR_VLIW is the chosen expression,
6711 C_EXPR is how it looks like at the given cfg point.
6712 Set *SHOULD_MOVE to indicate whether we have only disconnected
6713 one of the insns found.
6715 Returns whether original instructions were found, which is asserted
6716 to be true in the caller. */
6717 static bool
6718 move_op (insn_t insn, av_set_t orig_ops, expr_t expr_vliw,
6719 rtx dest, expr_t c_expr, bool *should_move)
6721 struct moveop_static_params sparams;
6722 struct cmpd_local_params lparams;
6723 int res;
6725 /* Init params for code_motion_path_driver. */
6726 sparams.dest = dest;
6727 sparams.c_expr = c_expr;
6728 sparams.uid = INSN_UID (EXPR_INSN_RTX (expr_vliw));
6729 #ifdef ENABLE_CHECKING
6730 sparams.failed_insn = NULL;
6731 #endif
6732 sparams.was_renamed = false;
6733 lparams.e1 = NULL;
6735 /* We haven't visited any blocks yet. */
6736 bitmap_clear (code_motion_visited_blocks);
6738 /* Set appropriate hooks and data. */
6739 code_motion_path_driver_info = &move_op_hooks;
6740 res = code_motion_path_driver (insn, orig_ops, NULL, &lparams, &sparams);
6742 gcc_assert (res != -1);
6744 if (sparams.was_renamed)
6745 EXPR_WAS_RENAMED (expr_vliw) = true;
6747 *should_move = (sparams.uid == -1);
6749 return res;
6753 /* Functions that work with regions. */
6755 /* Current number of seqno used in init_seqno and init_seqno_1. */
6756 static int cur_seqno;
6758 /* A helper for init_seqno. Traverse the region starting from BB and
6759 compute seqnos for visited insns, marking visited bbs in VISITED_BBS.
6760 Clear visited blocks from BLOCKS_TO_RESCHEDULE. */
6761 static void
6762 init_seqno_1 (basic_block bb, sbitmap visited_bbs, bitmap blocks_to_reschedule)
6764 int bbi = BLOCK_TO_BB (bb->index);
6765 insn_t insn, note = bb_note (bb);
6766 insn_t succ_insn;
6767 succ_iterator si;
6769 bitmap_set_bit (visited_bbs, bbi);
6770 if (blocks_to_reschedule)
6771 bitmap_clear_bit (blocks_to_reschedule, bb->index);
6773 FOR_EACH_SUCC_1 (succ_insn, si, BB_END (bb),
6774 SUCCS_NORMAL | SUCCS_SKIP_TO_LOOP_EXITS)
6776 basic_block succ = BLOCK_FOR_INSN (succ_insn);
6777 int succ_bbi = BLOCK_TO_BB (succ->index);
6779 gcc_assert (in_current_region_p (succ));
6781 if (!bitmap_bit_p (visited_bbs, succ_bbi))
6783 gcc_assert (succ_bbi > bbi);
6785 init_seqno_1 (succ, visited_bbs, blocks_to_reschedule);
6787 else if (blocks_to_reschedule)
6788 bitmap_set_bit (forced_ebb_heads, succ->index);
6791 for (insn = BB_END (bb); insn != note; insn = PREV_INSN (insn))
6792 INSN_SEQNO (insn) = cur_seqno--;
6795 /* Initialize seqnos for the current region. BLOCKS_TO_RESCHEDULE contains
6796 blocks on which we're rescheduling when pipelining, FROM is the block where
6797 traversing region begins (it may not be the head of the region when
6798 pipelining, but the head of the loop instead).
6800 Returns the maximal seqno found. */
6801 static int
6802 init_seqno (bitmap blocks_to_reschedule, basic_block from)
6804 sbitmap visited_bbs;
6805 bitmap_iterator bi;
6806 unsigned bbi;
6808 visited_bbs = sbitmap_alloc (current_nr_blocks);
6810 if (blocks_to_reschedule)
6812 bitmap_ones (visited_bbs);
6813 EXECUTE_IF_SET_IN_BITMAP (blocks_to_reschedule, 0, bbi, bi)
6815 gcc_assert (BLOCK_TO_BB (bbi) < current_nr_blocks);
6816 bitmap_clear_bit (visited_bbs, BLOCK_TO_BB (bbi));
6819 else
6821 bitmap_clear (visited_bbs);
6822 from = EBB_FIRST_BB (0);
6825 cur_seqno = sched_max_luid - 1;
6826 init_seqno_1 (from, visited_bbs, blocks_to_reschedule);
6828 /* cur_seqno may be positive if the number of instructions is less than
6829 sched_max_luid - 1 (when rescheduling or if some instructions have been
6830 removed by the call to purge_empty_blocks in sel_sched_region_1). */
6831 gcc_assert (cur_seqno >= 0);
6833 sbitmap_free (visited_bbs);
6834 return sched_max_luid - 1;
6837 /* Initialize scheduling parameters for current region. */
6838 static void
6839 sel_setup_region_sched_flags (void)
6841 enable_schedule_as_rhs_p = 1;
6842 bookkeeping_p = 1;
6843 pipelining_p = (bookkeeping_p
6844 && (flag_sel_sched_pipelining != 0)
6845 && current_loop_nest != NULL
6846 && loop_has_exit_edges (current_loop_nest));
6847 max_insns_to_rename = PARAM_VALUE (PARAM_SELSCHED_INSNS_TO_RENAME);
6848 max_ws = MAX_WS;
6851 /* Return true if all basic blocks of current region are empty. */
6852 static bool
6853 current_region_empty_p (void)
6855 int i;
6856 for (i = 0; i < current_nr_blocks; i++)
6857 if (! sel_bb_empty_p (BASIC_BLOCK_FOR_FN (cfun, BB_TO_BLOCK (i))))
6858 return false;
6860 return true;
6863 /* Prepare and verify loop nest for pipelining. */
6864 static void
6865 setup_current_loop_nest (int rgn, bb_vec_t *bbs)
6867 current_loop_nest = get_loop_nest_for_rgn (rgn);
6869 if (!current_loop_nest)
6870 return;
6872 /* If this loop has any saved loop preheaders from nested loops,
6873 add these basic blocks to the current region. */
6874 sel_add_loop_preheaders (bbs);
6876 /* Check that we're starting with a valid information. */
6877 gcc_assert (loop_latch_edge (current_loop_nest));
6878 gcc_assert (LOOP_MARKED_FOR_PIPELINING_P (current_loop_nest));
6881 /* Compute instruction priorities for current region. */
6882 static void
6883 sel_compute_priorities (int rgn)
6885 sched_rgn_compute_dependencies (rgn);
6887 /* Compute insn priorities in haifa style. Then free haifa style
6888 dependencies that we've calculated for this. */
6889 compute_priorities ();
6891 if (sched_verbose >= 5)
6892 debug_rgn_dependencies (0);
6894 free_rgn_deps ();
6897 /* Init scheduling data for RGN. Returns true when this region should not
6898 be scheduled. */
6899 static bool
6900 sel_region_init (int rgn)
6902 int i;
6903 bb_vec_t bbs;
6905 rgn_setup_region (rgn);
6907 /* Even if sched_is_disabled_for_current_region_p() is true, we still
6908 do region initialization here so the region can be bundled correctly,
6909 but we'll skip the scheduling in sel_sched_region (). */
6910 if (current_region_empty_p ())
6911 return true;
6913 bbs.create (current_nr_blocks);
6915 for (i = 0; i < current_nr_blocks; i++)
6916 bbs.quick_push (BASIC_BLOCK_FOR_FN (cfun, BB_TO_BLOCK (i)));
6918 sel_init_bbs (bbs);
6920 if (flag_sel_sched_pipelining)
6921 setup_current_loop_nest (rgn, &bbs);
6923 sel_setup_region_sched_flags ();
6925 /* Initialize luids and dependence analysis which both sel-sched and haifa
6926 need. */
6927 sched_init_luids (bbs);
6928 sched_deps_init (false);
6930 /* Initialize haifa data. */
6931 rgn_setup_sched_infos ();
6932 sel_set_sched_flags ();
6933 haifa_init_h_i_d (bbs);
6935 sel_compute_priorities (rgn);
6936 init_deps_global ();
6938 /* Main initialization. */
6939 sel_setup_sched_infos ();
6940 sel_init_global_and_expr (bbs);
6942 bbs.release ();
6944 blocks_to_reschedule = BITMAP_ALLOC (NULL);
6946 /* Init correct liveness sets on each instruction of a single-block loop.
6947 This is the only situation when we can't update liveness when calling
6948 compute_live for the first insn of the loop. */
6949 if (current_loop_nest)
6951 int header =
6952 (sel_is_loop_preheader_p (BASIC_BLOCK_FOR_FN (cfun, BB_TO_BLOCK (0)))
6954 : 0);
6956 if (current_nr_blocks == header + 1)
6957 update_liveness_on_insn
6958 (sel_bb_head (BASIC_BLOCK_FOR_FN (cfun, BB_TO_BLOCK (header))));
6961 /* Set hooks so that no newly generated insn will go out unnoticed. */
6962 sel_register_cfg_hooks ();
6964 /* !!! We call target.sched.init () for the whole region, but we invoke
6965 targetm.sched.finish () for every ebb. */
6966 if (targetm.sched.init)
6967 /* None of the arguments are actually used in any target. */
6968 targetm.sched.init (sched_dump, sched_verbose, -1);
6970 first_emitted_uid = get_max_uid () + 1;
6971 preheader_removed = false;
6973 /* Reset register allocation ticks array. */
6974 memset (reg_rename_tick, 0, sizeof reg_rename_tick);
6975 reg_rename_this_tick = 0;
6977 bitmap_initialize (forced_ebb_heads, 0);
6978 bitmap_clear (forced_ebb_heads);
6980 setup_nop_vinsn ();
6981 current_copies = BITMAP_ALLOC (NULL);
6982 current_originators = BITMAP_ALLOC (NULL);
6983 code_motion_visited_blocks = BITMAP_ALLOC (NULL);
6985 return false;
6988 /* Simplify insns after the scheduling. */
6989 static void
6990 simplify_changed_insns (void)
6992 int i;
6994 for (i = 0; i < current_nr_blocks; i++)
6996 basic_block bb = BASIC_BLOCK_FOR_FN (cfun, BB_TO_BLOCK (i));
6997 rtx_insn *insn;
6999 FOR_BB_INSNS (bb, insn)
7000 if (INSN_P (insn))
7002 expr_t expr = INSN_EXPR (insn);
7004 if (EXPR_WAS_SUBSTITUTED (expr))
7005 validate_simplify_insn (insn);
7010 /* Find boundaries of the EBB starting from basic block BB, marking blocks of
7011 this EBB in SCHEDULED_BLOCKS and appropriately filling in HEAD, TAIL,
7012 PREV_HEAD, and NEXT_TAIL fields of CURRENT_SCHED_INFO structure. */
7013 static void
7014 find_ebb_boundaries (basic_block bb, bitmap scheduled_blocks)
7016 rtx_insn *head, *tail;
7017 basic_block bb1 = bb;
7018 if (sched_verbose >= 2)
7019 sel_print ("Finishing schedule in bbs: ");
7023 bitmap_set_bit (scheduled_blocks, BLOCK_TO_BB (bb1->index));
7025 if (sched_verbose >= 2)
7026 sel_print ("%d; ", bb1->index);
7028 while (!bb_ends_ebb_p (bb1) && (bb1 = bb_next_bb (bb1)));
7030 if (sched_verbose >= 2)
7031 sel_print ("\n");
7033 get_ebb_head_tail (bb, bb1, &head, &tail);
7035 current_sched_info->head = head;
7036 current_sched_info->tail = tail;
7037 current_sched_info->prev_head = PREV_INSN (head);
7038 current_sched_info->next_tail = NEXT_INSN (tail);
7041 /* Regenerate INSN_SCHED_CYCLEs for insns of current EBB. */
7042 static void
7043 reset_sched_cycles_in_current_ebb (void)
7045 int last_clock = 0;
7046 int haifa_last_clock = -1;
7047 int haifa_clock = 0;
7048 int issued_insns = 0;
7049 insn_t insn;
7051 if (targetm.sched.init)
7053 /* None of the arguments are actually used in any target.
7054 NB: We should have md_reset () hook for cases like this. */
7055 targetm.sched.init (sched_dump, sched_verbose, -1);
7058 state_reset (curr_state);
7059 advance_state (curr_state);
7061 for (insn = current_sched_info->head;
7062 insn != current_sched_info->next_tail;
7063 insn = NEXT_INSN (insn))
7065 int cost, haifa_cost;
7066 int sort_p;
7067 bool asm_p, real_insn, after_stall, all_issued;
7068 int clock;
7070 if (!INSN_P (insn))
7071 continue;
7073 asm_p = false;
7074 real_insn = recog_memoized (insn) >= 0;
7075 clock = INSN_SCHED_CYCLE (insn);
7077 cost = clock - last_clock;
7079 /* Initialize HAIFA_COST. */
7080 if (! real_insn)
7082 asm_p = INSN_ASM_P (insn);
7084 if (asm_p)
7085 /* This is asm insn which *had* to be scheduled first
7086 on the cycle. */
7087 haifa_cost = 1;
7088 else
7089 /* This is a use/clobber insn. It should not change
7090 cost. */
7091 haifa_cost = 0;
7093 else
7094 haifa_cost = estimate_insn_cost (insn, curr_state);
7096 /* Stall for whatever cycles we've stalled before. */
7097 after_stall = 0;
7098 if (INSN_AFTER_STALL_P (insn) && cost > haifa_cost)
7100 haifa_cost = cost;
7101 after_stall = 1;
7103 all_issued = issued_insns == issue_rate;
7104 if (haifa_cost == 0 && all_issued)
7105 haifa_cost = 1;
7106 if (haifa_cost > 0)
7108 int i = 0;
7110 while (haifa_cost--)
7112 advance_state (curr_state);
7113 issued_insns = 0;
7114 i++;
7116 if (sched_verbose >= 2)
7118 sel_print ("advance_state (state_transition)\n");
7119 debug_state (curr_state);
7122 /* The DFA may report that e.g. insn requires 2 cycles to be
7123 issued, but on the next cycle it says that insn is ready
7124 to go. Check this here. */
7125 if (!after_stall
7126 && real_insn
7127 && haifa_cost > 0
7128 && estimate_insn_cost (insn, curr_state) == 0)
7129 break;
7131 /* When the data dependency stall is longer than the DFA stall,
7132 and when we have issued exactly issue_rate insns and stalled,
7133 it could be that after this longer stall the insn will again
7134 become unavailable to the DFA restrictions. Looks strange
7135 but happens e.g. on x86-64. So recheck DFA on the last
7136 iteration. */
7137 if ((after_stall || all_issued)
7138 && real_insn
7139 && haifa_cost == 0)
7140 haifa_cost = estimate_insn_cost (insn, curr_state);
7143 haifa_clock += i;
7144 if (sched_verbose >= 2)
7145 sel_print ("haifa clock: %d\n", haifa_clock);
7147 else
7148 gcc_assert (haifa_cost == 0);
7150 if (sched_verbose >= 2)
7151 sel_print ("Haifa cost for insn %d: %d\n", INSN_UID (insn), haifa_cost);
7153 if (targetm.sched.dfa_new_cycle)
7154 while (targetm.sched.dfa_new_cycle (sched_dump, sched_verbose, insn,
7155 haifa_last_clock, haifa_clock,
7156 &sort_p))
7158 advance_state (curr_state);
7159 issued_insns = 0;
7160 haifa_clock++;
7161 if (sched_verbose >= 2)
7163 sel_print ("advance_state (dfa_new_cycle)\n");
7164 debug_state (curr_state);
7165 sel_print ("haifa clock: %d\n", haifa_clock + 1);
7169 if (real_insn)
7171 static state_t temp = NULL;
7173 if (!temp)
7174 temp = xmalloc (dfa_state_size);
7175 memcpy (temp, curr_state, dfa_state_size);
7177 cost = state_transition (curr_state, insn);
7178 if (memcmp (temp, curr_state, dfa_state_size))
7179 issued_insns++;
7181 if (sched_verbose >= 2)
7183 sel_print ("scheduled insn %d, clock %d\n", INSN_UID (insn),
7184 haifa_clock + 1);
7185 debug_state (curr_state);
7187 gcc_assert (cost < 0);
7190 if (targetm.sched.variable_issue)
7191 targetm.sched.variable_issue (sched_dump, sched_verbose, insn, 0);
7193 INSN_SCHED_CYCLE (insn) = haifa_clock;
7195 last_clock = clock;
7196 haifa_last_clock = haifa_clock;
7200 /* Put TImode markers on insns starting a new issue group. */
7201 static void
7202 put_TImodes (void)
7204 int last_clock = -1;
7205 insn_t insn;
7207 for (insn = current_sched_info->head; insn != current_sched_info->next_tail;
7208 insn = NEXT_INSN (insn))
7210 int cost, clock;
7212 if (!INSN_P (insn))
7213 continue;
7215 clock = INSN_SCHED_CYCLE (insn);
7216 cost = (last_clock == -1) ? 1 : clock - last_clock;
7218 gcc_assert (cost >= 0);
7220 if (issue_rate > 1
7221 && GET_CODE (PATTERN (insn)) != USE
7222 && GET_CODE (PATTERN (insn)) != CLOBBER)
7224 if (reload_completed && cost > 0)
7225 PUT_MODE (insn, TImode);
7227 last_clock = clock;
7230 if (sched_verbose >= 2)
7231 sel_print ("Cost for insn %d is %d\n", INSN_UID (insn), cost);
7235 /* Perform MD_FINISH on EBBs comprising current region. When
7236 RESET_SCHED_CYCLES_P is true, run a pass emulating the scheduler
7237 to produce correct sched cycles on insns. */
7238 static void
7239 sel_region_target_finish (bool reset_sched_cycles_p)
7241 int i;
7242 bitmap scheduled_blocks = BITMAP_ALLOC (NULL);
7244 for (i = 0; i < current_nr_blocks; i++)
7246 if (bitmap_bit_p (scheduled_blocks, i))
7247 continue;
7249 /* While pipelining outer loops, skip bundling for loop
7250 preheaders. Those will be rescheduled in the outer loop. */
7251 if (sel_is_loop_preheader_p (EBB_FIRST_BB (i)))
7252 continue;
7254 find_ebb_boundaries (EBB_FIRST_BB (i), scheduled_blocks);
7256 if (no_real_insns_p (current_sched_info->head, current_sched_info->tail))
7257 continue;
7259 if (reset_sched_cycles_p)
7260 reset_sched_cycles_in_current_ebb ();
7262 if (targetm.sched.init)
7263 targetm.sched.init (sched_dump, sched_verbose, -1);
7265 put_TImodes ();
7267 if (targetm.sched.finish)
7269 targetm.sched.finish (sched_dump, sched_verbose);
7271 /* Extend luids so that insns generated by the target will
7272 get zero luid. */
7273 sched_extend_luids ();
7277 BITMAP_FREE (scheduled_blocks);
7280 /* Free the scheduling data for the current region. When RESET_SCHED_CYCLES_P
7281 is true, make an additional pass emulating scheduler to get correct insn
7282 cycles for md_finish calls. */
7283 static void
7284 sel_region_finish (bool reset_sched_cycles_p)
7286 simplify_changed_insns ();
7287 sched_finish_ready_list ();
7288 free_nop_pool ();
7290 /* Free the vectors. */
7291 vec_av_set.release ();
7292 BITMAP_FREE (current_copies);
7293 BITMAP_FREE (current_originators);
7294 BITMAP_FREE (code_motion_visited_blocks);
7295 vinsn_vec_free (vec_bookkeeping_blocked_vinsns);
7296 vinsn_vec_free (vec_target_unavailable_vinsns);
7298 /* If LV_SET of the region head should be updated, do it now because
7299 there will be no other chance. */
7301 succ_iterator si;
7302 insn_t insn;
7304 FOR_EACH_SUCC_1 (insn, si, bb_note (EBB_FIRST_BB (0)),
7305 SUCCS_NORMAL | SUCCS_SKIP_TO_LOOP_EXITS)
7307 basic_block bb = BLOCK_FOR_INSN (insn);
7309 if (!BB_LV_SET_VALID_P (bb))
7310 compute_live (insn);
7314 /* Emulate the Haifa scheduler for bundling. */
7315 if (reload_completed)
7316 sel_region_target_finish (reset_sched_cycles_p);
7318 sel_finish_global_and_expr ();
7320 bitmap_clear (forced_ebb_heads);
7322 free_nop_vinsn ();
7324 finish_deps_global ();
7325 sched_finish_luids ();
7326 h_d_i_d.release ();
7328 sel_finish_bbs ();
7329 BITMAP_FREE (blocks_to_reschedule);
7331 sel_unregister_cfg_hooks ();
7333 max_issue_size = 0;
7337 /* Functions that implement the scheduler driver. */
7339 /* Schedule a parallel instruction group on each of FENCES. MAX_SEQNO
7340 is the current maximum seqno. SCHEDULED_INSNS_TAILPP is the list
7341 of insns scheduled -- these would be postprocessed later. */
7342 static void
7343 schedule_on_fences (flist_t fences, int max_seqno,
7344 ilist_t **scheduled_insns_tailpp)
7346 flist_t old_fences = fences;
7348 if (sched_verbose >= 1)
7350 sel_print ("\nScheduling on fences: ");
7351 dump_flist (fences);
7352 sel_print ("\n");
7355 scheduled_something_on_previous_fence = false;
7356 for (; fences; fences = FLIST_NEXT (fences))
7358 fence_t fence = NULL;
7359 int seqno = 0;
7360 flist_t fences2;
7361 bool first_p = true;
7363 /* Choose the next fence group to schedule.
7364 The fact that insn can be scheduled only once
7365 on the cycle is guaranteed by two properties:
7366 1. seqnos of parallel groups decrease with each iteration.
7367 2. If is_ineligible_successor () sees the larger seqno, it
7368 checks if candidate insn is_in_current_fence_p (). */
7369 for (fences2 = old_fences; fences2; fences2 = FLIST_NEXT (fences2))
7371 fence_t f = FLIST_FENCE (fences2);
7373 if (!FENCE_PROCESSED_P (f))
7375 int i = INSN_SEQNO (FENCE_INSN (f));
7377 if (first_p || i > seqno)
7379 seqno = i;
7380 fence = f;
7381 first_p = false;
7383 else
7384 /* ??? Seqnos of different groups should be different. */
7385 gcc_assert (1 || i != seqno);
7389 gcc_assert (fence);
7391 /* As FENCE is nonnull, SEQNO is initialized. */
7392 seqno -= max_seqno + 1;
7393 fill_insns (fence, seqno, scheduled_insns_tailpp);
7394 FENCE_PROCESSED_P (fence) = true;
7397 /* All av_sets are invalidated by GLOBAL_LEVEL increase, thus we
7398 don't need to keep bookkeeping-invalidated and target-unavailable
7399 vinsns any more. */
7400 vinsn_vec_clear (&vec_bookkeeping_blocked_vinsns);
7401 vinsn_vec_clear (&vec_target_unavailable_vinsns);
7404 /* Calculate MIN_SEQNO and MAX_SEQNO. */
7405 static void
7406 find_min_max_seqno (flist_t fences, int *min_seqno, int *max_seqno)
7408 *min_seqno = *max_seqno = INSN_SEQNO (FENCE_INSN (FLIST_FENCE (fences)));
7410 /* The first element is already processed. */
7411 while ((fences = FLIST_NEXT (fences)))
7413 int seqno = INSN_SEQNO (FENCE_INSN (FLIST_FENCE (fences)));
7415 if (*min_seqno > seqno)
7416 *min_seqno = seqno;
7417 else if (*max_seqno < seqno)
7418 *max_seqno = seqno;
7422 /* Calculate new fences from FENCES. Write the current time to PTIME. */
7423 static flist_t
7424 calculate_new_fences (flist_t fences, int orig_max_seqno, int *ptime)
7426 flist_t old_fences = fences;
7427 struct flist_tail_def _new_fences, *new_fences = &_new_fences;
7428 int max_time = 0;
7430 flist_tail_init (new_fences);
7431 for (; fences; fences = FLIST_NEXT (fences))
7433 fence_t fence = FLIST_FENCE (fences);
7434 insn_t insn;
7436 if (!FENCE_BNDS (fence))
7438 /* This fence doesn't have any successors. */
7439 if (!FENCE_SCHEDULED_P (fence))
7441 /* Nothing was scheduled on this fence. */
7442 int seqno;
7444 insn = FENCE_INSN (fence);
7445 seqno = INSN_SEQNO (insn);
7446 gcc_assert (seqno > 0 && seqno <= orig_max_seqno);
7448 if (sched_verbose >= 1)
7449 sel_print ("Fence %d[%d] has not changed\n",
7450 INSN_UID (insn),
7451 BLOCK_NUM (insn));
7452 move_fence_to_fences (fences, new_fences);
7455 else
7456 extract_new_fences_from (fences, new_fences, orig_max_seqno);
7457 max_time = MAX (max_time, FENCE_CYCLE (fence));
7460 flist_clear (&old_fences);
7461 *ptime = max_time;
7462 return FLIST_TAIL_HEAD (new_fences);
7465 /* Update seqnos of insns given by PSCHEDULED_INSNS. MIN_SEQNO and MAX_SEQNO
7466 are the miminum and maximum seqnos of the group, HIGHEST_SEQNO_IN_USE is
7467 the highest seqno used in a region. Return the updated highest seqno. */
7468 static int
7469 update_seqnos_and_stage (int min_seqno, int max_seqno,
7470 int highest_seqno_in_use,
7471 ilist_t *pscheduled_insns)
7473 int new_hs;
7474 ilist_iterator ii;
7475 insn_t insn;
7477 /* Actually, new_hs is the seqno of the instruction, that was
7478 scheduled first (i.e. it is the first one in SCHEDULED_INSNS). */
7479 if (*pscheduled_insns)
7481 new_hs = (INSN_SEQNO (ILIST_INSN (*pscheduled_insns))
7482 + highest_seqno_in_use + max_seqno - min_seqno + 2);
7483 gcc_assert (new_hs > highest_seqno_in_use);
7485 else
7486 new_hs = highest_seqno_in_use;
7488 FOR_EACH_INSN (insn, ii, *pscheduled_insns)
7490 gcc_assert (INSN_SEQNO (insn) < 0);
7491 INSN_SEQNO (insn) += highest_seqno_in_use + max_seqno - min_seqno + 2;
7492 gcc_assert (INSN_SEQNO (insn) <= new_hs);
7494 /* When not pipelining, purge unneeded insn info on the scheduled insns.
7495 For example, having reg_last array of INSN_DEPS_CONTEXT in memory may
7496 require > 1GB of memory e.g. on limit-fnargs.c. */
7497 if (! pipelining_p)
7498 free_data_for_scheduled_insn (insn);
7501 ilist_clear (pscheduled_insns);
7502 global_level++;
7504 return new_hs;
7507 /* The main driver for scheduling a region. This function is responsible
7508 for correct propagation of fences (i.e. scheduling points) and creating
7509 a group of parallel insns at each of them. It also supports
7510 pipelining. ORIG_MAX_SEQNO is the maximal seqno before this pass
7511 of scheduling. */
7512 static void
7513 sel_sched_region_2 (int orig_max_seqno)
7515 int highest_seqno_in_use = orig_max_seqno;
7516 int max_time = 0;
7518 stat_bookkeeping_copies = 0;
7519 stat_insns_needed_bookkeeping = 0;
7520 stat_renamed_scheduled = 0;
7521 stat_substitutions_total = 0;
7522 num_insns_scheduled = 0;
7524 while (fences)
7526 int min_seqno, max_seqno;
7527 ilist_t scheduled_insns = NULL;
7528 ilist_t *scheduled_insns_tailp = &scheduled_insns;
7530 find_min_max_seqno (fences, &min_seqno, &max_seqno);
7531 schedule_on_fences (fences, max_seqno, &scheduled_insns_tailp);
7532 fences = calculate_new_fences (fences, orig_max_seqno, &max_time);
7533 highest_seqno_in_use = update_seqnos_and_stage (min_seqno, max_seqno,
7534 highest_seqno_in_use,
7535 &scheduled_insns);
7538 if (sched_verbose >= 1)
7540 sel_print ("Total scheduling time: %d cycles\n", max_time);
7541 sel_print ("Scheduled %d bookkeeping copies, %d insns needed "
7542 "bookkeeping, %d insns renamed, %d insns substituted\n",
7543 stat_bookkeeping_copies,
7544 stat_insns_needed_bookkeeping,
7545 stat_renamed_scheduled,
7546 stat_substitutions_total);
7550 /* Schedule a region. When pipelining, search for possibly never scheduled
7551 bookkeeping code and schedule it. Reschedule pipelined code without
7552 pipelining after. */
7553 static void
7554 sel_sched_region_1 (void)
7556 int orig_max_seqno;
7558 /* Remove empty blocks that might be in the region from the beginning. */
7559 purge_empty_blocks ();
7561 orig_max_seqno = init_seqno (NULL, NULL);
7562 gcc_assert (orig_max_seqno >= 1);
7564 /* When pipelining outer loops, create fences on the loop header,
7565 not preheader. */
7566 fences = NULL;
7567 if (current_loop_nest)
7568 init_fences (BB_END (EBB_FIRST_BB (0)));
7569 else
7570 init_fences (bb_note (EBB_FIRST_BB (0)));
7571 global_level = 1;
7573 sel_sched_region_2 (orig_max_seqno);
7575 gcc_assert (fences == NULL);
7577 if (pipelining_p)
7579 int i;
7580 basic_block bb;
7581 struct flist_tail_def _new_fences;
7582 flist_tail_t new_fences = &_new_fences;
7583 bool do_p = true;
7585 pipelining_p = false;
7586 max_ws = MIN (max_ws, issue_rate * 3 / 2);
7587 bookkeeping_p = false;
7588 enable_schedule_as_rhs_p = false;
7590 /* Schedule newly created code, that has not been scheduled yet. */
7591 do_p = true;
7593 while (do_p)
7595 do_p = false;
7597 for (i = 0; i < current_nr_blocks; i++)
7599 basic_block bb = EBB_FIRST_BB (i);
7601 if (bitmap_bit_p (blocks_to_reschedule, bb->index))
7603 if (! bb_ends_ebb_p (bb))
7604 bitmap_set_bit (blocks_to_reschedule, bb_next_bb (bb)->index);
7605 if (sel_bb_empty_p (bb))
7607 bitmap_clear_bit (blocks_to_reschedule, bb->index);
7608 continue;
7610 clear_outdated_rtx_info (bb);
7611 if (sel_insn_is_speculation_check (BB_END (bb))
7612 && JUMP_P (BB_END (bb)))
7613 bitmap_set_bit (blocks_to_reschedule,
7614 BRANCH_EDGE (bb)->dest->index);
7616 else if (! sel_bb_empty_p (bb)
7617 && INSN_SCHED_TIMES (sel_bb_head (bb)) <= 0)
7618 bitmap_set_bit (blocks_to_reschedule, bb->index);
7621 for (i = 0; i < current_nr_blocks; i++)
7623 bb = EBB_FIRST_BB (i);
7625 /* While pipelining outer loops, skip bundling for loop
7626 preheaders. Those will be rescheduled in the outer
7627 loop. */
7628 if (sel_is_loop_preheader_p (bb))
7630 clear_outdated_rtx_info (bb);
7631 continue;
7634 if (bitmap_bit_p (blocks_to_reschedule, bb->index))
7636 flist_tail_init (new_fences);
7638 orig_max_seqno = init_seqno (blocks_to_reschedule, bb);
7640 /* Mark BB as head of the new ebb. */
7641 bitmap_set_bit (forced_ebb_heads, bb->index);
7643 gcc_assert (fences == NULL);
7645 init_fences (bb_note (bb));
7647 sel_sched_region_2 (orig_max_seqno);
7649 do_p = true;
7650 break;
7657 /* Schedule the RGN region. */
7658 void
7659 sel_sched_region (int rgn)
7661 bool schedule_p;
7662 bool reset_sched_cycles_p;
7664 if (sel_region_init (rgn))
7665 return;
7667 if (sched_verbose >= 1)
7668 sel_print ("Scheduling region %d\n", rgn);
7670 schedule_p = (!sched_is_disabled_for_current_region_p ()
7671 && dbg_cnt (sel_sched_region_cnt));
7672 reset_sched_cycles_p = pipelining_p;
7673 if (schedule_p)
7674 sel_sched_region_1 ();
7675 else
7676 /* Force initialization of INSN_SCHED_CYCLEs for correct bundling. */
7677 reset_sched_cycles_p = true;
7679 sel_region_finish (reset_sched_cycles_p);
7682 /* Perform global init for the scheduler. */
7683 static void
7684 sel_global_init (void)
7686 calculate_dominance_info (CDI_DOMINATORS);
7687 alloc_sched_pools ();
7689 /* Setup the infos for sched_init. */
7690 sel_setup_sched_infos ();
7691 setup_sched_dump ();
7693 sched_rgn_init (false);
7694 sched_init ();
7696 sched_init_bbs ();
7697 /* Reset AFTER_RECOVERY if it has been set by the 1st scheduler pass. */
7698 after_recovery = 0;
7699 can_issue_more = issue_rate;
7701 sched_extend_target ();
7702 sched_deps_init (true);
7703 setup_nop_and_exit_insns ();
7704 sel_extend_global_bb_info ();
7705 init_lv_sets ();
7706 init_hard_regs_data ();
7709 /* Free the global data of the scheduler. */
7710 static void
7711 sel_global_finish (void)
7713 free_bb_note_pool ();
7714 free_lv_sets ();
7715 sel_finish_global_bb_info ();
7717 free_regset_pool ();
7718 free_nop_and_exit_insns ();
7720 sched_rgn_finish ();
7721 sched_deps_finish ();
7722 sched_finish ();
7724 if (current_loops)
7725 sel_finish_pipelining ();
7727 free_sched_pools ();
7728 free_dominance_info (CDI_DOMINATORS);
7731 /* Return true when we need to skip selective scheduling. Used for debugging. */
7732 bool
7733 maybe_skip_selective_scheduling (void)
7735 return ! dbg_cnt (sel_sched_cnt);
7738 /* The entry point. */
7739 void
7740 run_selective_scheduling (void)
7742 int rgn;
7744 if (n_basic_blocks_for_fn (cfun) == NUM_FIXED_BLOCKS)
7745 return;
7747 sel_global_init ();
7749 for (rgn = 0; rgn < nr_regions; rgn++)
7750 sel_sched_region (rgn);
7752 sel_global_finish ();
7755 #endif