xref: /netbsd-src/external/gpl3/gcc.old/dist/gcc/sel-sched.c (revision c38e7cc395b1472a774ff828e46123de44c628e9)
1 /* Instruction scheduling pass.  Selective scheduler and pipeliner.
2    Copyright (C) 2006-2015 Free Software Foundation, Inc.
3 
4 This file is part of GCC.
5 
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.
10 
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.
15 
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/>.  */
19 
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 "ira-int.h"
58 #include "rtl-iter.h"
59 
60 #ifdef INSN_SCHEDULING
61 #include "sel-sched-ir.h"
62 #include "sel-sched-dump.h"
63 #include "sel-sched.h"
64 #include "dbgcnt.h"
65 
66 /* Implementation of selective scheduling approach.
67    The below implementation follows the original approach with the following
68    changes:
69 
70    o the scheduler works after register allocation (but can be also tuned
71    to work before RA);
72    o some instructions are not copied or register renamed;
73    o conditional jumps are not moved with code duplication;
74    o several jumps in one parallel group are not supported;
75    o when pipelining outer loops, code motion through inner loops
76    is not supported;
77    o control and data speculation are supported;
78    o some improvements for better compile time/performance were made.
79 
80    Terminology
81    ===========
82 
83    A vinsn, or virtual insn, is an insn with additional data characterizing
84    insn pattern, such as LHS, RHS, register sets used/set/clobbered, etc.
85    Vinsns also act as smart pointers to save memory by reusing them in
86    different expressions.  A vinsn is described by vinsn_t type.
87 
88    An expression is a vinsn with additional data characterizing its properties
89    at some point in the control flow graph.  The data may be its usefulness,
90    priority, speculative status, whether it was renamed/subsituted, etc.
91    An expression is described by expr_t type.
92 
93    Availability set (av_set) is a set of expressions at a given control flow
94    point. It is represented as av_set_t.  The expressions in av sets are kept
95    sorted in the terms of expr_greater_p function.  It allows to truncate
96    the set while leaving the best expressions.
97 
98    A fence is a point through which code motion is prohibited.  On each step,
99    we gather a parallel group of insns at a fence.  It is possible to have
100    multiple fences. A fence is represented via fence_t.
101 
102    A boundary is the border between the fence group and the rest of the code.
103    Currently, we never have more than one boundary per fence, as we finalize
104    the fence group when a jump is scheduled. A boundary is represented
105    via bnd_t.
106 
107    High-level overview
108    ===================
109 
110    The scheduler finds regions to schedule, schedules each one, and finalizes.
111    The regions are formed starting from innermost loops, so that when the inner
112    loop is pipelined, its prologue can be scheduled together with yet unprocessed
113    outer loop. The rest of acyclic regions are found using extend_rgns:
114    the blocks that are not yet allocated to any regions are traversed in top-down
115    order, and a block is added to a region to which all its predecessors belong;
116    otherwise, the block starts its own region.
117 
118    The main scheduling loop (sel_sched_region_2) consists of just
119    scheduling on each fence and updating fences.  For each fence,
120    we fill a parallel group of insns (fill_insns) until some insns can be added.
121    First, we compute available exprs (av-set) at the boundary of the current
122    group.  Second, we choose the best expression from it.  If the stall is
123    required to schedule any of the expressions, we advance the current cycle
124    appropriately.  So, the final group does not exactly correspond to a VLIW
125    word.  Third, we move the chosen expression to the boundary (move_op)
126    and update the intermediate av sets and liveness sets.  We quit fill_insns
127    when either no insns left for scheduling or we have scheduled enough insns
128    so we feel like advancing a scheduling point.
129 
130    Computing available expressions
131    ===============================
132 
133    The computation (compute_av_set) is a bottom-up traversal.  At each insn,
134    we're moving the union of its successors' sets through it via
135    moveup_expr_set.  The dependent expressions are removed.  Local
136    transformations (substitution, speculation) are applied to move more
137    exprs.  Then the expr corresponding to the current insn is added.
138    The result is saved on each basic block header.
139 
140    When traversing the CFG, we're moving down for no more than max_ws insns.
141    Also, we do not move down to ineligible successors (is_ineligible_successor),
142    which include moving along a back-edge, moving to already scheduled code,
143    and moving to another fence.  The first two restrictions are lifted during
144    pipelining, which allows us to move insns along a back-edge.  We always have
145    an acyclic region for scheduling because we forbid motion through fences.
146 
147    Choosing the best expression
148    ============================
149 
150    We sort the final availability set via sel_rank_for_schedule, then we remove
151    expressions which are not yet ready (tick_check_p) or which dest registers
152    cannot be used.  For some of them, we choose another register via
153    find_best_reg.  To do this, we run find_used_regs to calculate the set of
154    registers which cannot be used.  The find_used_regs function performs
155    a traversal of code motion paths for an expr.  We consider for renaming
156    only registers which are from the same regclass as the original one and
157    using which does not interfere with any live ranges.  Finally, we convert
158    the resulting set to the ready list format and use max_issue and reorder*
159    hooks similarly to the Haifa scheduler.
160 
161    Scheduling the best expression
162    ==============================
163 
164    We run the move_op routine to perform the same type of code motion paths
165    traversal as in find_used_regs.  (These are working via the same driver,
166    code_motion_path_driver.)  When moving down the CFG, we look for original
167    instruction that gave birth to a chosen expression.  We undo
168    the transformations performed on an expression via the history saved in it.
169    When found, we remove the instruction or leave a reg-reg copy/speculation
170    check if needed.  On a way up, we insert bookkeeping copies at each join
171    point.  If a copy is not needed, it will be removed later during this
172    traversal.  We update the saved av sets and liveness sets on the way up, too.
173 
174    Finalizing the schedule
175    =======================
176 
177    When pipelining, we reschedule the blocks from which insns were pipelined
178    to get a tighter schedule.  On Itanium, we also perform bundling via
179    the same routine from ia64.c.
180 
181    Dependence analysis changes
182    ===========================
183 
184    We augmented the sched-deps.c with hooks that get called when a particular
185    dependence is found in a particular part of an insn.  Using these hooks, we
186    can do several actions such as: determine whether an insn can be moved through
187    another (has_dependence_p, moveup_expr); find out whether an insn can be
188    scheduled on the current cycle (tick_check_p); find out registers that
189    are set/used/clobbered by an insn and find out all the strange stuff that
190    restrict its movement, like SCHED_GROUP_P or CANT_MOVE (done in
191    init_global_and_expr_for_insn).
192 
193    Initialization changes
194    ======================
195 
196    There are parts of haifa-sched.c, sched-deps.c, and sched-rgn.c that are
197    reused in all of the schedulers.  We have split up the initialization of data
198    of such parts into different functions prefixed with scheduler type and
199    postfixed with the type of data initialized: {,sel_,haifa_}sched_{init,finish},
200    sched_rgn_init/finish, sched_deps_init/finish, sched_init_{luids/bbs}, etc.
201    The same splitting is done with current_sched_info structure:
202    dependence-related parts are in sched_deps_info, common part is in
203    common_sched_info, and haifa/sel/etc part is in current_sched_info.
204 
205    Target contexts
206    ===============
207 
208    As we now have multiple-point scheduling, this would not work with backends
209    which save some of the scheduler state to use it in the target hooks.
210    For this purpose, we introduce a concept of target contexts, which
211    encapsulate such information.  The backend should implement simple routines
212    of allocating/freeing/setting such a context.  The scheduler calls these
213    as target hooks and handles the target context as an opaque pointer (similar
214    to the DFA state type, state_t).
215 
216    Various speedups
217    ================
218 
219    As the correct data dependence graph is not supported during scheduling (which
220    is to be changed in mid-term), we cache as much of the dependence analysis
221    results as possible to avoid reanalyzing.  This includes: bitmap caches on
222    each insn in stream of the region saying yes/no for a query with a pair of
223    UIDs; hashtables with the previously done transformations on each insn in
224    stream; a vector keeping a history of transformations on each expr.
225 
226    Also, we try to minimize the dependence context used on each fence to check
227    whether the given expression is ready for scheduling by removing from it
228    insns that are definitely completed the execution.  The results of
229    tick_check_p checks are also cached in a vector on each fence.
230 
231    We keep a valid liveness set on each insn in a region to avoid the high
232    cost of recomputation on large basic blocks.
233 
234    Finally, we try to minimize the number of needed updates to the availability
235    sets.  The updates happen in two cases: when fill_insns terminates,
236    we advance all fences and increase the stage number to show that the region
237    has changed and the sets are to be recomputed; and when the next iteration
238    of a loop in fill_insns happens (but this one reuses the saved av sets
239    on bb headers.)  Thus, we try to break the fill_insns loop only when
240    "significant" number of insns from the current scheduling window was
241    scheduled.  This should be made a target param.
242 
243 
244    TODO: correctly support the data dependence graph at all stages and get rid
245    of all caches.  This should speed up the scheduler.
246    TODO: implement moving cond jumps with bookkeeping copies on both targets.
247    TODO: tune the scheduler before RA so it does not create too much pseudos.
248 
249 
250    References:
251    S.-M. Moon and K. Ebcioglu. Parallelizing nonnumerical code with
252    selective scheduling and software pipelining.
253    ACM TOPLAS, Vol 19, No. 6, pages 853--898, Nov. 1997.
254 
255    Andrey Belevantsev, Maxim Kuvyrkov, Vladimir Makarov, Dmitry Melnik,
256    and Dmitry Zhurikhin.  An interblock VLIW-targeted instruction scheduler
257    for GCC. In Proceedings of GCC Developers' Summit 2006.
258 
259    Arutyun Avetisyan, Andrey Belevantsev, and Dmitry Melnik.  GCC Instruction
260    Scheduler and Software Pipeliner on the Itanium Platform.   EPIC-7 Workshop.
261    http://rogue.colorado.edu/EPIC7/.
262 
263 */
264 
265 /* True when pipelining is enabled.  */
266 bool pipelining_p;
267 
268 /* True if bookkeeping is enabled.  */
269 bool bookkeeping_p;
270 
271 /* Maximum number of insns that are eligible for renaming.  */
272 int max_insns_to_rename;
273 
274 
275 /* Definitions of local types and macros.  */
276 
277 /* Represents possible outcomes of moving an expression through an insn.  */
278 enum MOVEUP_EXPR_CODE
279   {
280     /* The expression is not changed.  */
281     MOVEUP_EXPR_SAME,
282 
283     /* Not changed, but requires a new destination register.  */
284     MOVEUP_EXPR_AS_RHS,
285 
286     /* Cannot be moved.  */
287     MOVEUP_EXPR_NULL,
288 
289     /* Changed (substituted or speculated).  */
290     MOVEUP_EXPR_CHANGED
291   };
292 
293 /* The container to be passed into rtx search & replace functions.  */
294 struct rtx_search_arg
295 {
296   /* What we are searching for.  */
297   rtx x;
298 
299   /* The occurrence counter.  */
300   int n;
301 };
302 
303 typedef struct rtx_search_arg *rtx_search_arg_p;
304 
305 /* This struct contains precomputed hard reg sets that are needed when
306    computing registers available for renaming.  */
307 struct hard_regs_data
308 {
309   /* For every mode, this stores registers available for use with
310      that mode.  */
311   HARD_REG_SET regs_for_mode[NUM_MACHINE_MODES];
312 
313   /* True when regs_for_mode[mode] is initialized.  */
314   bool regs_for_mode_ok[NUM_MACHINE_MODES];
315 
316   /* For every register, it has regs that are ok to rename into it.
317      The register in question is always set.  If not, this means
318      that the whole set is not computed yet.  */
319   HARD_REG_SET regs_for_rename[FIRST_PSEUDO_REGISTER];
320 
321   /* For every mode, this stores registers not available due to
322      call clobbering.  */
323   HARD_REG_SET regs_for_call_clobbered[NUM_MACHINE_MODES];
324 
325   /* All registers that are used or call used.  */
326   HARD_REG_SET regs_ever_used;
327 
328 #ifdef STACK_REGS
329   /* Stack registers.  */
330   HARD_REG_SET stack_regs;
331 #endif
332 };
333 
334 /* Holds the results of computation of available for renaming and
335    unavailable hard registers.  */
336 struct reg_rename
337 {
338   /* These are unavailable due to calls crossing, globalness, etc.  */
339   HARD_REG_SET unavailable_hard_regs;
340 
341   /* These are *available* for renaming.  */
342   HARD_REG_SET available_for_renaming;
343 
344   /* Whether this code motion path crosses a call.  */
345   bool crosses_call;
346 };
347 
348 /* A global structure that contains the needed information about harg
349    regs.  */
350 static struct hard_regs_data sel_hrd;
351 
352 
353 /* This structure holds local data used in code_motion_path_driver hooks on
354    the same or adjacent levels of recursion.  Here we keep those parameters
355    that are not used in code_motion_path_driver routine itself, but only in
356    its hooks.  Moreover, all parameters that can be modified in hooks are
357    in this structure, so all other parameters passed explicitly to hooks are
358    read-only.  */
359 struct cmpd_local_params
360 {
361   /* Local params used in move_op_* functions.  */
362 
363   /* Edges for bookkeeping generation.  */
364   edge e1, e2;
365 
366   /* C_EXPR merged from all successors and locally allocated temporary C_EXPR.  */
367   expr_t c_expr_merged, c_expr_local;
368 
369   /* Local params used in fur_* functions.  */
370   /* Copy of the ORIGINAL_INSN list, stores the original insns already
371      found before entering the current level of code_motion_path_driver.  */
372   def_list_t old_original_insns;
373 
374   /* Local params used in move_op_* functions.  */
375   /* True when we have removed last insn in the block which was
376      also a boundary.  Do not update anything or create bookkeeping copies.  */
377   BOOL_BITFIELD removed_last_insn : 1;
378 };
379 
380 /* Stores the static parameters for move_op_* calls.  */
381 struct moveop_static_params
382 {
383   /* Destination register.  */
384   rtx dest;
385 
386   /* Current C_EXPR.  */
387   expr_t c_expr;
388 
389   /* An UID of expr_vliw which is to be moved up.  If we find other exprs,
390      they are to be removed.  */
391   int uid;
392 
393 #ifdef ENABLE_CHECKING
394   /* This is initialized to the insn on which the driver stopped its traversal.  */
395   insn_t failed_insn;
396 #endif
397 
398   /* True if we scheduled an insn with different register.  */
399   bool was_renamed;
400 };
401 
402 /* Stores the static parameters for fur_* calls.  */
403 struct fur_static_params
404 {
405   /* Set of registers unavailable on the code motion path.  */
406   regset used_regs;
407 
408   /* Pointer to the list of original insns definitions.  */
409   def_list_t *original_insns;
410 
411   /* True if a code motion path contains a CALL insn.  */
412   bool crosses_call;
413 };
414 
415 typedef struct fur_static_params *fur_static_params_p;
416 typedef struct cmpd_local_params *cmpd_local_params_p;
417 typedef struct moveop_static_params *moveop_static_params_p;
418 
419 /* Set of hooks and parameters that determine behaviour specific to
420    move_op or find_used_regs functions.  */
421 struct code_motion_path_driver_info_def
422 {
423   /* Called on enter to the basic block.  */
424   int (*on_enter) (insn_t, cmpd_local_params_p, void *, bool);
425 
426   /* Called when original expr is found.  */
427   void (*orig_expr_found) (insn_t, expr_t, cmpd_local_params_p, void *);
428 
429   /* Called while descending current basic block if current insn is not
430      the original EXPR we're searching for.  */
431   bool (*orig_expr_not_found) (insn_t, av_set_t, void *);
432 
433   /* Function to merge C_EXPRes from different successors.  */
434   void (*merge_succs) (insn_t, insn_t, int, cmpd_local_params_p, void *);
435 
436   /* Function to finalize merge from different successors and possibly
437      deallocate temporary data structures used for merging.  */
438   void (*after_merge_succs) (cmpd_local_params_p, void *);
439 
440   /* Called on the backward stage of recursion to do moveup_expr.
441      Used only with move_op_*.  */
442   void (*ascend) (insn_t, void *);
443 
444   /* Called on the ascending pass, before returning from the current basic
445      block or from the whole traversal.  */
446   void (*at_first_insn) (insn_t, cmpd_local_params_p, void *);
447 
448   /* When processing successors in move_op we need only descend into
449      SUCCS_NORMAL successors, while in find_used_regs we need SUCCS_ALL.  */
450   int succ_flags;
451 
452   /* The routine name to print in dumps ("move_op" of "find_used_regs").  */
453   const char *routine_name;
454 };
455 
456 /* Global pointer to current hooks, either points to MOVE_OP_HOOKS or
457    FUR_HOOKS.  */
458 struct code_motion_path_driver_info_def *code_motion_path_driver_info;
459 
460 /* Set of hooks for performing move_op and find_used_regs routines with
461    code_motion_path_driver.  */
462 extern struct code_motion_path_driver_info_def move_op_hooks, fur_hooks;
463 
464 /* True if/when we want to emulate Haifa scheduler in the common code.
465    This is used in sched_rgn_local_init and in various places in
466    sched-deps.c.  */
467 int sched_emulate_haifa_p;
468 
469 /* GLOBAL_LEVEL is used to discard information stored in basic block headers
470    av_sets.  Av_set of bb header is valid if its (bb header's) level is equal
471    to GLOBAL_LEVEL.  And invalid if lesser.  This is primarily used to advance
472    scheduling window.  */
473 int global_level;
474 
475 /* Current fences.  */
476 flist_t fences;
477 
478 /* True when separable insns should be scheduled as RHSes.  */
479 static bool enable_schedule_as_rhs_p;
480 
481 /* Used in verify_target_availability to assert that target reg is reported
482    unavailabile by both TARGET_UNAVAILABLE and find_used_regs only if
483    we haven't scheduled anything on the previous fence.
484    if scheduled_something_on_previous_fence is true, TARGET_UNAVAILABLE can
485    have more conservative value than the one returned by the
486    find_used_regs, thus we shouldn't assert that these values are equal.  */
487 static bool scheduled_something_on_previous_fence;
488 
489 /* All newly emitted insns will have their uids greater than this value.  */
490 static int first_emitted_uid;
491 
492 /* Set of basic blocks that are forced to start new ebbs.  This is a subset
493    of all the ebb heads.  */
494 static bitmap_head _forced_ebb_heads;
495 bitmap_head *forced_ebb_heads = &_forced_ebb_heads;
496 
497 /* Blocks that need to be rescheduled after pipelining.  */
498 bitmap blocks_to_reschedule = NULL;
499 
500 /* True when the first lv set should be ignored when updating liveness.  */
501 static bool ignore_first = false;
502 
503 /* Number of insns max_issue has initialized data structures for.  */
504 static int max_issue_size = 0;
505 
506 /* Whether we can issue more instructions.  */
507 static int can_issue_more;
508 
509 /* Maximum software lookahead window size, reduced when rescheduling after
510    pipelining.  */
511 static int max_ws;
512 
513 /* Number of insns scheduled in current region.  */
514 static int num_insns_scheduled;
515 
516 /* A vector of expressions is used to be able to sort them.  */
517 static vec<expr_t> vec_av_set = vNULL;
518 
519 /* A vector of vinsns is used to hold temporary lists of vinsns.  */
520 typedef vec<vinsn_t> vinsn_vec_t;
521 
522 /* This vector has the exprs which may still present in av_sets, but actually
523    can't be moved up due to bookkeeping created during code motion to another
524    fence.  See comment near the call to update_and_record_unavailable_insns
525    for the detailed explanations.  */
526 static vinsn_vec_t vec_bookkeeping_blocked_vinsns = vinsn_vec_t ();
527 
528 /* This vector has vinsns which are scheduled with renaming on the first fence
529    and then seen on the second.  For expressions with such vinsns, target
530    availability information may be wrong.  */
531 static vinsn_vec_t vec_target_unavailable_vinsns = vinsn_vec_t ();
532 
533 /* Vector to store temporary nops inserted in move_op to prevent removal
534    of empty bbs.  */
535 static vec<insn_t> vec_temp_moveop_nops = vNULL;
536 
537 /* These bitmaps record original instructions scheduled on the current
538    iteration and bookkeeping copies created by them.  */
539 static bitmap current_originators = NULL;
540 static bitmap current_copies = NULL;
541 
542 /* This bitmap marks the blocks visited by code_motion_path_driver so we don't
543    visit them afterwards.  */
544 static bitmap code_motion_visited_blocks = NULL;
545 
546 /* Variables to accumulate different statistics.  */
547 
548 /* The number of bookkeeping copies created.  */
549 static int stat_bookkeeping_copies;
550 
551 /* The number of insns that required bookkeeiping for their scheduling.  */
552 static int stat_insns_needed_bookkeeping;
553 
554 /* The number of insns that got renamed.  */
555 static int stat_renamed_scheduled;
556 
557 /* The number of substitutions made during scheduling.  */
558 static int stat_substitutions_total;
559 
560 
561 /* Forward declarations of static functions.  */
562 static bool rtx_ok_for_substitution_p (rtx, rtx);
563 static int sel_rank_for_schedule (const void *, const void *);
564 static av_set_t find_sequential_best_exprs (bnd_t, expr_t, bool);
565 static basic_block find_block_for_bookkeeping (edge e1, edge e2, bool lax);
566 
567 static rtx get_dest_from_orig_ops (av_set_t);
568 static basic_block generate_bookkeeping_insn (expr_t, edge, edge);
569 static bool find_used_regs (insn_t, av_set_t, regset, struct reg_rename *,
570                             def_list_t *);
571 static bool move_op (insn_t, av_set_t, expr_t, rtx, expr_t, bool*);
572 static int code_motion_path_driver (insn_t, av_set_t, ilist_t,
573                                     cmpd_local_params_p, void *);
574 static void sel_sched_region_1 (void);
575 static void sel_sched_region_2 (int);
576 static av_set_t compute_av_set_inside_bb (insn_t, ilist_t, int, bool);
577 
578 static void debug_state (state_t);
579 
580 
581 /* Functions that work with fences.  */
582 
583 /* Advance one cycle on FENCE.  */
584 static void
585 advance_one_cycle (fence_t fence)
586 {
587   unsigned i;
588   int cycle;
589   rtx_insn *insn;
590 
591   advance_state (FENCE_STATE (fence));
592   cycle = ++FENCE_CYCLE (fence);
593   FENCE_ISSUED_INSNS (fence) = 0;
594   FENCE_STARTS_CYCLE_P (fence) = 1;
595   can_issue_more = issue_rate;
596   FENCE_ISSUE_MORE (fence) = can_issue_more;
597 
598   for (i = 0; vec_safe_iterate (FENCE_EXECUTING_INSNS (fence), i, &insn); )
599     {
600       if (INSN_READY_CYCLE (insn) < cycle)
601         {
602           remove_from_deps (FENCE_DC (fence), insn);
603           FENCE_EXECUTING_INSNS (fence)->unordered_remove (i);
604           continue;
605         }
606       i++;
607     }
608   if (sched_verbose >= 2)
609     {
610       sel_print ("Finished a cycle.  Current cycle = %d\n", FENCE_CYCLE (fence));
611       debug_state (FENCE_STATE (fence));
612     }
613 }
614 
615 /* Returns true when SUCC in a fallthru bb of INSN, possibly
616    skipping empty basic blocks.  */
617 static bool
618 in_fallthru_bb_p (rtx insn, rtx succ)
619 {
620   basic_block bb = BLOCK_FOR_INSN (insn);
621   edge e;
622 
623   if (bb == BLOCK_FOR_INSN (succ))
624     return true;
625 
626   e = find_fallthru_edge_from (bb);
627   if (e)
628     bb = e->dest;
629   else
630     return false;
631 
632   while (sel_bb_empty_p (bb))
633     bb = bb->next_bb;
634 
635   return bb == BLOCK_FOR_INSN (succ);
636 }
637 
638 /* Construct successor fences from OLD_FENCEs and put them in NEW_FENCES.
639    When a successor will continue a ebb, transfer all parameters of a fence
640    to the new fence.  ORIG_MAX_SEQNO is the maximal seqno before this round
641    of scheduling helping to distinguish between the old and the new code.  */
642 static void
643 extract_new_fences_from (flist_t old_fences, flist_tail_t new_fences,
644 			 int orig_max_seqno)
645 {
646   bool was_here_p = false;
647   insn_t insn = NULL;
648   insn_t succ;
649   succ_iterator si;
650   ilist_iterator ii;
651   fence_t fence = FLIST_FENCE (old_fences);
652   basic_block bb;
653 
654   /* Get the only element of FENCE_BNDS (fence).  */
655   FOR_EACH_INSN (insn, ii, FENCE_BNDS (fence))
656     {
657       gcc_assert (!was_here_p);
658       was_here_p = true;
659     }
660   gcc_assert (was_here_p && insn != NULL_RTX);
661 
662   /* When in the "middle" of the block, just move this fence
663      to the new list.  */
664   bb = BLOCK_FOR_INSN (insn);
665   if (! sel_bb_end_p (insn)
666       || (single_succ_p (bb)
667           && single_pred_p (single_succ (bb))))
668     {
669       insn_t succ;
670 
671       succ = (sel_bb_end_p (insn)
672               ? sel_bb_head (single_succ (bb))
673               : NEXT_INSN (insn));
674 
675       if (INSN_SEQNO (succ) > 0
676           && INSN_SEQNO (succ) <= orig_max_seqno
677           && INSN_SCHED_TIMES (succ) <= 0)
678         {
679           FENCE_INSN (fence) = succ;
680           move_fence_to_fences (old_fences, new_fences);
681 
682           if (sched_verbose >= 1)
683             sel_print ("Fence %d continues as %d[%d] (state continue)\n",
684                        INSN_UID (insn), INSN_UID (succ), BLOCK_NUM (succ));
685         }
686       return;
687     }
688 
689   /* Otherwise copy fence's structures to (possibly) multiple successors.  */
690   FOR_EACH_SUCC_1 (succ, si, insn, SUCCS_NORMAL | SUCCS_SKIP_TO_LOOP_EXITS)
691     {
692       int seqno = INSN_SEQNO (succ);
693 
694       if (0 < seqno && seqno <= orig_max_seqno
695           && (pipelining_p || INSN_SCHED_TIMES (succ) <= 0))
696         {
697           bool b = (in_same_ebb_p (insn, succ)
698                     || in_fallthru_bb_p (insn, succ));
699 
700           if (sched_verbose >= 1)
701             sel_print ("Fence %d continues as %d[%d] (state %s)\n",
702                        INSN_UID (insn), INSN_UID (succ),
703                        BLOCK_NUM (succ), b ? "continue" : "reset");
704 
705           if (b)
706             add_dirty_fence_to_fences (new_fences, succ, fence);
707           else
708             {
709               /* Mark block of the SUCC as head of the new ebb.  */
710               bitmap_set_bit (forced_ebb_heads, BLOCK_NUM (succ));
711               add_clean_fence_to_fences (new_fences, succ, fence);
712             }
713         }
714     }
715 }
716 
717 
718 /* Functions to support substitution.  */
719 
720 /* Returns whether INSN with dependence status DS is eligible for
721    substitution, i.e. it's a copy operation x := y, and RHS that is
722    moved up through this insn should be substituted.  */
723 static bool
724 can_substitute_through_p (insn_t insn, ds_t ds)
725 {
726   /* We can substitute only true dependencies.  */
727   if ((ds & DEP_OUTPUT)
728       || (ds & DEP_ANTI)
729       || ! INSN_RHS (insn)
730       || ! INSN_LHS (insn))
731     return false;
732 
733   /* Now we just need to make sure the INSN_RHS consists of only one
734      simple REG rtx.  */
735   if (REG_P (INSN_LHS (insn))
736       && REG_P (INSN_RHS (insn)))
737     return true;
738   return false;
739 }
740 
741 /* Substitute all occurrences of INSN's destination in EXPR' vinsn with INSN's
742    source (if INSN is eligible for substitution).  Returns TRUE if
743    substitution was actually performed, FALSE otherwise.  Substitution might
744    be not performed because it's either EXPR' vinsn doesn't contain INSN's
745    destination or the resulting insn is invalid for the target machine.
746    When UNDO is true, perform unsubstitution instead (the difference is in
747    the part of rtx on which validate_replace_rtx is called).  */
748 static bool
749 substitute_reg_in_expr (expr_t expr, insn_t insn, bool undo)
750 {
751   rtx *where;
752   bool new_insn_valid;
753   vinsn_t *vi = &EXPR_VINSN (expr);
754   bool has_rhs = VINSN_RHS (*vi) != NULL;
755   rtx old, new_rtx;
756 
757   /* Do not try to replace in SET_DEST.  Although we'll choose new
758      register for the RHS, we don't want to change RHS' original reg.
759      If the insn is not SET, we may still be able to substitute something
760      in it, and if we're here (don't have deps), it doesn't write INSN's
761      dest.  */
762   where = (has_rhs
763 	   ? &VINSN_RHS (*vi)
764 	   : &PATTERN (VINSN_INSN_RTX (*vi)));
765   old = undo ? INSN_RHS (insn) : INSN_LHS (insn);
766 
767   /* Substitute if INSN has a form of x:=y and LHS(INSN) occurs in *VI.  */
768   if (rtx_ok_for_substitution_p (old, *where))
769     {
770       rtx_insn *new_insn;
771       rtx *where_replace;
772 
773       /* We should copy these rtxes before substitution.  */
774       new_rtx = copy_rtx (undo ? INSN_LHS (insn) : INSN_RHS (insn));
775       new_insn = create_copy_of_insn_rtx (VINSN_INSN_RTX (*vi));
776 
777       /* Where we'll replace.
778          WHERE_REPLACE should point inside NEW_INSN, so INSN_RHS couldn't be
779 	 used instead of SET_SRC.  */
780       where_replace = (has_rhs
781 		       ? &SET_SRC (PATTERN (new_insn))
782 		       : &PATTERN (new_insn));
783 
784       new_insn_valid
785         = validate_replace_rtx_part_nosimplify (old, new_rtx, where_replace,
786                                                 new_insn);
787 
788       /* ??? Actually, constrain_operands result depends upon choice of
789          destination register.  E.g. if we allow single register to be an rhs,
790 	 and if we try to move dx=ax(as rhs) through ax=dx, we'll result
791 	 in invalid insn dx=dx, so we'll loose this rhs here.
792 	 Just can't come up with significant testcase for this, so just
793 	 leaving it for now.  */
794       if (new_insn_valid)
795 	{
796 	  change_vinsn_in_expr (expr,
797 				create_vinsn_from_insn_rtx (new_insn, false));
798 
799 	  /* Do not allow clobbering the address register of speculative
800              insns.  */
801 	  if ((EXPR_SPEC_DONE_DS (expr) & SPECULATIVE)
802               && register_unavailable_p (VINSN_REG_USES (EXPR_VINSN (expr)),
803 					 expr_dest_reg (expr)))
804 	    EXPR_TARGET_AVAILABLE (expr) = false;
805 
806 	  return true;
807 	}
808       else
809         return false;
810     }
811   else
812     return false;
813 }
814 
815 /* Return the number of places WHAT appears within WHERE.
816    Bail out when we found a reference occupying several hard registers.  */
817 static int
818 count_occurrences_equiv (const_rtx what, const_rtx where)
819 {
820   int count = 0;
821   subrtx_iterator::array_type array;
822   FOR_EACH_SUBRTX (iter, array, where, NONCONST)
823     {
824       const_rtx x = *iter;
825       if (REG_P (x) && REGNO (x) == REGNO (what))
826 	{
827 	  /* Bail out if mode is different or more than one register is
828 	     used.  */
829 	  if (GET_MODE (x) != GET_MODE (what)
830 	      || (HARD_REGISTER_P (x)
831 		  && hard_regno_nregs[REGNO (x)][GET_MODE (x)] > 1))
832 	    return 0;
833 	  count += 1;
834 	}
835       else if (GET_CODE (x) == SUBREG
836 	       && (!REG_P (SUBREG_REG (x))
837 		   || REGNO (SUBREG_REG (x)) == REGNO (what)))
838 	/* ??? Do not support substituting regs inside subregs.  In that case,
839 	   simplify_subreg will be called by validate_replace_rtx, and
840 	   unsubstitution will fail later.  */
841 	return 0;
842     }
843   return count;
844 }
845 
846 /* Returns TRUE if WHAT is found in WHERE rtx tree.  */
847 static bool
848 rtx_ok_for_substitution_p (rtx what, rtx where)
849 {
850   return (count_occurrences_equiv (what, where) > 0);
851 }
852 
853 
854 /* Functions to support register renaming.  */
855 
856 /* Substitute VI's set source with REGNO.  Returns newly created pattern
857    that has REGNO as its source.  */
858 static rtx_insn *
859 create_insn_rtx_with_rhs (vinsn_t vi, rtx rhs_rtx)
860 {
861   rtx lhs_rtx;
862   rtx pattern;
863   rtx_insn *insn_rtx;
864 
865   lhs_rtx = copy_rtx (VINSN_LHS (vi));
866 
867   pattern = gen_rtx_SET (VOIDmode, lhs_rtx, rhs_rtx);
868   insn_rtx = create_insn_rtx_from_pattern (pattern, NULL_RTX);
869 
870   return insn_rtx;
871 }
872 
873 /* Returns whether INSN's src can be replaced with register number
874    NEW_SRC_REG. E.g. the following insn is valid for i386:
875 
876     (insn:HI 2205 6585 2207 727 ../../gcc/libiberty/regex.c:3337
877       (set (mem/s:QI (plus:SI (plus:SI (reg/f:SI 7 sp)
878 			(reg:SI 0 ax [orig:770 c1 ] [770]))
879 		    (const_int 288 [0x120])) [0 str S1 A8])
880 	    (const_int 0 [0x0])) 43 {*movqi_1} (nil)
881 	(nil))
882 
883   But if we change (const_int 0 [0x0]) to (reg:QI 4 si), it will be invalid
884   because of operand constraints:
885 
886     (define_insn "*movqi_1"
887       [(set (match_operand:QI 0 "nonimmediate_operand" "=q,q ,q ,r,r ,?r,m")
888 	    (match_operand:QI 1 "general_operand"      " q,qn,qm,q,rn,qm,qn")
889 	    )]
890 
891   So do constrain_operands here, before choosing NEW_SRC_REG as best
892   reg for rhs.  */
893 
894 static bool
895 replace_src_with_reg_ok_p (insn_t insn, rtx new_src_reg)
896 {
897   vinsn_t vi = INSN_VINSN (insn);
898   machine_mode mode;
899   rtx dst_loc;
900   bool res;
901 
902   gcc_assert (VINSN_SEPARABLE_P (vi));
903 
904   get_dest_and_mode (insn, &dst_loc, &mode);
905   gcc_assert (mode == GET_MODE (new_src_reg));
906 
907   if (REG_P (dst_loc) && REGNO (new_src_reg) == REGNO (dst_loc))
908     return true;
909 
910   /* See whether SET_SRC can be replaced with this register.  */
911   validate_change (insn, &SET_SRC (PATTERN (insn)), new_src_reg, 1);
912   res = verify_changes (0);
913   cancel_changes (0);
914 
915   return res;
916 }
917 
918 /* Returns whether INSN still be valid after replacing it's DEST with
919    register NEW_REG.  */
920 static bool
921 replace_dest_with_reg_ok_p (insn_t insn, rtx new_reg)
922 {
923   vinsn_t vi = INSN_VINSN (insn);
924   bool res;
925 
926   /* We should deal here only with separable insns.  */
927   gcc_assert (VINSN_SEPARABLE_P (vi));
928   gcc_assert (GET_MODE (VINSN_LHS (vi)) == GET_MODE (new_reg));
929 
930   /* See whether SET_DEST can be replaced with this register.  */
931   validate_change (insn, &SET_DEST (PATTERN (insn)), new_reg, 1);
932   res = verify_changes (0);
933   cancel_changes (0);
934 
935   return res;
936 }
937 
938 /* Create a pattern with rhs of VI and lhs of LHS_RTX.  */
939 static rtx_insn *
940 create_insn_rtx_with_lhs (vinsn_t vi, rtx lhs_rtx)
941 {
942   rtx rhs_rtx;
943   rtx pattern;
944   rtx_insn *insn_rtx;
945 
946   rhs_rtx = copy_rtx (VINSN_RHS (vi));
947 
948   pattern = gen_rtx_SET (VOIDmode, lhs_rtx, rhs_rtx);
949   insn_rtx = create_insn_rtx_from_pattern (pattern, NULL_RTX);
950 
951   return insn_rtx;
952 }
953 
954 /* Substitute lhs in the given expression EXPR for the register with number
955    NEW_REGNO.  SET_DEST may be arbitrary rtx, not only register.  */
956 static void
957 replace_dest_with_reg_in_expr (expr_t expr, rtx new_reg)
958 {
959   rtx_insn *insn_rtx;
960   vinsn_t vinsn;
961 
962   insn_rtx = create_insn_rtx_with_lhs (EXPR_VINSN (expr), new_reg);
963   vinsn = create_vinsn_from_insn_rtx (insn_rtx, false);
964 
965   change_vinsn_in_expr (expr, vinsn);
966   EXPR_WAS_RENAMED (expr) = 1;
967   EXPR_TARGET_AVAILABLE (expr) = 1;
968 }
969 
970 /* Returns whether VI writes either one of the USED_REGS registers or,
971    if a register is a hard one, one of the UNAVAILABLE_HARD_REGS registers.  */
972 static bool
973 vinsn_writes_one_of_regs_p (vinsn_t vi, regset used_regs,
974                             HARD_REG_SET unavailable_hard_regs)
975 {
976   unsigned regno;
977   reg_set_iterator rsi;
978 
979   EXECUTE_IF_SET_IN_REG_SET (VINSN_REG_SETS (vi), 0, regno, rsi)
980     {
981       if (REGNO_REG_SET_P (used_regs, regno))
982         return true;
983       if (HARD_REGISTER_NUM_P (regno)
984           && TEST_HARD_REG_BIT (unavailable_hard_regs, regno))
985 	return true;
986     }
987 
988   EXECUTE_IF_SET_IN_REG_SET (VINSN_REG_CLOBBERS (vi), 0, regno, rsi)
989     {
990       if (REGNO_REG_SET_P (used_regs, regno))
991         return true;
992       if (HARD_REGISTER_NUM_P (regno)
993           && TEST_HARD_REG_BIT (unavailable_hard_regs, regno))
994 	return true;
995     }
996 
997   return false;
998 }
999 
1000 /* Returns register class of the output register in INSN.
1001    Returns NO_REGS for call insns because some targets have constraints on
1002    destination register of a call insn.
1003 
1004    Code adopted from regrename.c::build_def_use.  */
1005 static enum reg_class
1006 get_reg_class (rtx_insn *insn)
1007 {
1008   int i, n_ops;
1009 
1010   extract_constrain_insn (insn);
1011   preprocess_constraints (insn);
1012   n_ops = recog_data.n_operands;
1013 
1014   const operand_alternative *op_alt = which_op_alt ();
1015   if (asm_noperands (PATTERN (insn)) > 0)
1016     {
1017       for (i = 0; i < n_ops; i++)
1018 	if (recog_data.operand_type[i] == OP_OUT)
1019 	  {
1020 	    rtx *loc = recog_data.operand_loc[i];
1021 	    rtx op = *loc;
1022 	    enum reg_class cl = alternative_class (op_alt, i);
1023 
1024 	    if (REG_P (op)
1025 		&& REGNO (op) == ORIGINAL_REGNO (op))
1026 	      continue;
1027 
1028 	    return cl;
1029 	  }
1030     }
1031   else if (!CALL_P (insn))
1032     {
1033       for (i = 0; i < n_ops + recog_data.n_dups; i++)
1034        {
1035 	 int opn = i < n_ops ? i : recog_data.dup_num[i - n_ops];
1036 	 enum reg_class cl = alternative_class (op_alt, opn);
1037 
1038 	 if (recog_data.operand_type[opn] == OP_OUT ||
1039 	     recog_data.operand_type[opn] == OP_INOUT)
1040 	   return cl;
1041        }
1042     }
1043 
1044 /*  Insns like
1045     (insn (set (reg:CCZ 17 flags) (compare:CCZ ...)))
1046     may result in returning NO_REGS, cause flags is written implicitly through
1047     CMP insn, which has no OP_OUT | OP_INOUT operands.  */
1048   return NO_REGS;
1049 }
1050 
1051 #ifdef HARD_REGNO_RENAME_OK
1052 /* Calculate HARD_REGNO_RENAME_OK data for REGNO.  */
1053 static void
1054 init_hard_regno_rename (int regno)
1055 {
1056   int cur_reg;
1057 
1058   SET_HARD_REG_BIT (sel_hrd.regs_for_rename[regno], regno);
1059 
1060   for (cur_reg = 0; cur_reg < FIRST_PSEUDO_REGISTER; cur_reg++)
1061     {
1062       /* We are not interested in renaming in other regs.  */
1063       if (!TEST_HARD_REG_BIT (sel_hrd.regs_ever_used, cur_reg))
1064         continue;
1065 
1066       if (HARD_REGNO_RENAME_OK (regno, cur_reg))
1067         SET_HARD_REG_BIT (sel_hrd.regs_for_rename[regno], cur_reg);
1068     }
1069 }
1070 #endif
1071 
1072 /* A wrapper around HARD_REGNO_RENAME_OK that will look into the hard regs
1073    data first.  */
1074 static inline bool
1075 sel_hard_regno_rename_ok (int from ATTRIBUTE_UNUSED, int to ATTRIBUTE_UNUSED)
1076 {
1077 #ifdef HARD_REGNO_RENAME_OK
1078   /* Check whether this is all calculated.  */
1079   if (TEST_HARD_REG_BIT (sel_hrd.regs_for_rename[from], from))
1080     return TEST_HARD_REG_BIT (sel_hrd.regs_for_rename[from], to);
1081 
1082   init_hard_regno_rename (from);
1083 
1084   return TEST_HARD_REG_BIT (sel_hrd.regs_for_rename[from], to);
1085 #else
1086   return true;
1087 #endif
1088 }
1089 
1090 /* Calculate set of registers that are capable of holding MODE.  */
1091 static void
1092 init_regs_for_mode (machine_mode mode)
1093 {
1094   int cur_reg;
1095 
1096   CLEAR_HARD_REG_SET (sel_hrd.regs_for_mode[mode]);
1097   CLEAR_HARD_REG_SET (sel_hrd.regs_for_call_clobbered[mode]);
1098 
1099   for (cur_reg = 0; cur_reg < FIRST_PSEUDO_REGISTER; cur_reg++)
1100     {
1101       int nregs;
1102       int i;
1103 
1104       /* See whether it accepts all modes that occur in
1105          original insns.  */
1106       if (! HARD_REGNO_MODE_OK (cur_reg, mode))
1107         continue;
1108 
1109       nregs = hard_regno_nregs[cur_reg][mode];
1110 
1111       for (i = nregs - 1; i >= 0; --i)
1112         if (fixed_regs[cur_reg + i]
1113                 || global_regs[cur_reg + i]
1114             /* Can't use regs which aren't saved by
1115                the prologue.  */
1116             || !TEST_HARD_REG_BIT (sel_hrd.regs_ever_used, cur_reg + i)
1117 	    /* Can't use regs with non-null REG_BASE_VALUE, because adjusting
1118 	       it affects aliasing globally and invalidates all AV sets.  */
1119 	    || get_reg_base_value (cur_reg + i)
1120 #ifdef LEAF_REGISTERS
1121             /* We can't use a non-leaf register if we're in a
1122                leaf function.  */
1123             || (crtl->is_leaf
1124                 && !LEAF_REGISTERS[cur_reg + i])
1125 #endif
1126             )
1127           break;
1128 
1129       if (i >= 0)
1130         continue;
1131 
1132       if (HARD_REGNO_CALL_PART_CLOBBERED (cur_reg, mode))
1133         SET_HARD_REG_BIT (sel_hrd.regs_for_call_clobbered[mode],
1134                           cur_reg);
1135 
1136       /* If the CUR_REG passed all the checks above,
1137          then it's ok.  */
1138       SET_HARD_REG_BIT (sel_hrd.regs_for_mode[mode], cur_reg);
1139     }
1140 
1141   sel_hrd.regs_for_mode_ok[mode] = true;
1142 }
1143 
1144 /* Init all register sets gathered in HRD.  */
1145 static void
1146 init_hard_regs_data (void)
1147 {
1148   int cur_reg = 0;
1149   int cur_mode = 0;
1150 
1151   CLEAR_HARD_REG_SET (sel_hrd.regs_ever_used);
1152   for (cur_reg = 0; cur_reg < FIRST_PSEUDO_REGISTER; cur_reg++)
1153     if (df_regs_ever_live_p (cur_reg) || call_used_regs[cur_reg])
1154       SET_HARD_REG_BIT (sel_hrd.regs_ever_used, cur_reg);
1155 
1156   /* Initialize registers that are valid based on mode when this is
1157      really needed.  */
1158   for (cur_mode = 0; cur_mode < NUM_MACHINE_MODES; cur_mode++)
1159     sel_hrd.regs_for_mode_ok[cur_mode] = false;
1160 
1161   /* Mark that all HARD_REGNO_RENAME_OK is not calculated.  */
1162   for (cur_reg = 0; cur_reg < FIRST_PSEUDO_REGISTER; cur_reg++)
1163     CLEAR_HARD_REG_SET (sel_hrd.regs_for_rename[cur_reg]);
1164 
1165 #ifdef STACK_REGS
1166   CLEAR_HARD_REG_SET (sel_hrd.stack_regs);
1167 
1168   for (cur_reg = FIRST_STACK_REG; cur_reg <= LAST_STACK_REG; cur_reg++)
1169     SET_HARD_REG_BIT (sel_hrd.stack_regs, cur_reg);
1170 #endif
1171 }
1172 
1173 /* Mark hardware regs in REG_RENAME_P that are not suitable
1174    for renaming rhs in INSN due to hardware restrictions (register class,
1175    modes compatibility etc).  This doesn't affect original insn's dest reg,
1176    if it isn't in USED_REGS.  DEF is a definition insn of rhs for which the
1177    destination register is sought.  LHS (DEF->ORIG_INSN) may be REG or MEM.
1178    Registers that are in used_regs are always marked in
1179    unavailable_hard_regs as well.  */
1180 
1181 static void
1182 mark_unavailable_hard_regs (def_t def, struct reg_rename *reg_rename_p,
1183                             regset used_regs ATTRIBUTE_UNUSED)
1184 {
1185   machine_mode mode;
1186   enum reg_class cl = NO_REGS;
1187   rtx orig_dest;
1188   unsigned cur_reg, regno;
1189   hard_reg_set_iterator hrsi;
1190 
1191   gcc_assert (GET_CODE (PATTERN (def->orig_insn)) == SET);
1192   gcc_assert (reg_rename_p);
1193 
1194   orig_dest = SET_DEST (PATTERN (def->orig_insn));
1195 
1196   /* We have decided not to rename 'mem = something;' insns, as 'something'
1197      is usually a register.  */
1198   if (!REG_P (orig_dest))
1199     return;
1200 
1201   regno = REGNO (orig_dest);
1202 
1203   /* If before reload, don't try to work with pseudos.  */
1204   if (!reload_completed && !HARD_REGISTER_NUM_P (regno))
1205     return;
1206 
1207   if (reload_completed)
1208     cl = get_reg_class (def->orig_insn);
1209 
1210   /* Stop if the original register is one of the fixed_regs, global_regs or
1211      frame pointer, or we could not discover its class.  */
1212   if (fixed_regs[regno]
1213       || global_regs[regno]
1214 #if !HARD_FRAME_POINTER_IS_FRAME_POINTER
1215       || (frame_pointer_needed && regno == HARD_FRAME_POINTER_REGNUM)
1216 #else
1217       || (frame_pointer_needed && regno == FRAME_POINTER_REGNUM)
1218 #endif
1219       || (reload_completed && cl == NO_REGS))
1220     {
1221       SET_HARD_REG_SET (reg_rename_p->unavailable_hard_regs);
1222 
1223       /* Give a chance for original register, if it isn't in used_regs.  */
1224       if (!def->crosses_call)
1225         CLEAR_HARD_REG_BIT (reg_rename_p->unavailable_hard_regs, regno);
1226 
1227       return;
1228     }
1229 
1230   /* If something allocated on stack in this function, mark frame pointer
1231      register unavailable, considering also modes.
1232      FIXME: it is enough to do this once per all original defs.  */
1233   if (frame_pointer_needed)
1234     {
1235       add_to_hard_reg_set (&reg_rename_p->unavailable_hard_regs,
1236 			   Pmode, FRAME_POINTER_REGNUM);
1237 
1238       if (!HARD_FRAME_POINTER_IS_FRAME_POINTER)
1239         add_to_hard_reg_set (&reg_rename_p->unavailable_hard_regs,
1240 			     Pmode, HARD_FRAME_POINTER_REGNUM);
1241     }
1242 
1243 #ifdef STACK_REGS
1244   /* For the stack registers the presence of FIRST_STACK_REG in USED_REGS
1245      is equivalent to as if all stack regs were in this set.
1246      I.e. no stack register can be renamed, and even if it's an original
1247      register here we make sure it won't be lifted over it's previous def
1248      (it's previous def will appear as if it's a FIRST_STACK_REG def.
1249      The HARD_REGNO_RENAME_OK covers other cases in condition below.  */
1250   if (IN_RANGE (REGNO (orig_dest), FIRST_STACK_REG, LAST_STACK_REG)
1251       && REGNO_REG_SET_P (used_regs, FIRST_STACK_REG))
1252     IOR_HARD_REG_SET (reg_rename_p->unavailable_hard_regs,
1253                       sel_hrd.stack_regs);
1254 #endif
1255 
1256   /* If there's a call on this path, make regs from call_used_reg_set
1257      unavailable.  */
1258   if (def->crosses_call)
1259     IOR_HARD_REG_SET (reg_rename_p->unavailable_hard_regs,
1260                       call_used_reg_set);
1261 
1262   /* Stop here before reload: we need FRAME_REGS, STACK_REGS, and crosses_call,
1263      but not register classes.  */
1264   if (!reload_completed)
1265     return;
1266 
1267   /* Leave regs as 'available' only from the current
1268      register class.  */
1269   COPY_HARD_REG_SET (reg_rename_p->available_for_renaming,
1270                      reg_class_contents[cl]);
1271 
1272   mode = GET_MODE (orig_dest);
1273 
1274   /* Leave only registers available for this mode.  */
1275   if (!sel_hrd.regs_for_mode_ok[mode])
1276     init_regs_for_mode (mode);
1277   AND_HARD_REG_SET (reg_rename_p->available_for_renaming,
1278                     sel_hrd.regs_for_mode[mode]);
1279 
1280   /* Exclude registers that are partially call clobbered.  */
1281   if (def->crosses_call
1282       && ! HARD_REGNO_CALL_PART_CLOBBERED (regno, mode))
1283     AND_COMPL_HARD_REG_SET (reg_rename_p->available_for_renaming,
1284                             sel_hrd.regs_for_call_clobbered[mode]);
1285 
1286   /* Leave only those that are ok to rename.  */
1287   EXECUTE_IF_SET_IN_HARD_REG_SET (reg_rename_p->available_for_renaming,
1288                                   0, cur_reg, hrsi)
1289     {
1290       int nregs;
1291       int i;
1292 
1293       nregs = hard_regno_nregs[cur_reg][mode];
1294       gcc_assert (nregs > 0);
1295 
1296       for (i = nregs - 1; i >= 0; --i)
1297         if (! sel_hard_regno_rename_ok (regno + i, cur_reg + i))
1298           break;
1299 
1300       if (i >= 0)
1301         CLEAR_HARD_REG_BIT (reg_rename_p->available_for_renaming,
1302                             cur_reg);
1303     }
1304 
1305   AND_COMPL_HARD_REG_SET (reg_rename_p->available_for_renaming,
1306                           reg_rename_p->unavailable_hard_regs);
1307 
1308   /* Regno is always ok from the renaming part of view, but it really
1309      could be in *unavailable_hard_regs already, so set it here instead
1310      of there.  */
1311   SET_HARD_REG_BIT (reg_rename_p->available_for_renaming, regno);
1312 }
1313 
1314 /* reg_rename_tick[REG1] > reg_rename_tick[REG2] if REG1 was chosen as the
1315    best register more recently than REG2.  */
1316 static int reg_rename_tick[FIRST_PSEUDO_REGISTER];
1317 
1318 /* Indicates the number of times renaming happened before the current one.  */
1319 static int reg_rename_this_tick;
1320 
1321 /* Choose the register among free, that is suitable for storing
1322    the rhs value.
1323 
1324    ORIGINAL_INSNS is the list of insns where the operation (rhs)
1325    originally appears.  There could be multiple original operations
1326    for single rhs since we moving it up and merging along different
1327    paths.
1328 
1329    Some code is adapted from regrename.c (regrename_optimize).
1330    If original register is available, function returns it.
1331    Otherwise it performs the checks, so the new register should
1332    comply with the following:
1333     - it should not violate any live ranges (such registers are in
1334       REG_RENAME_P->available_for_renaming set);
1335     - it should not be in the HARD_REGS_USED regset;
1336     - it should be in the class compatible with original uses;
1337     - it should not be clobbered through reference with different mode;
1338     - if we're in the leaf function, then the new register should
1339       not be in the LEAF_REGISTERS;
1340     - etc.
1341 
1342    If several registers meet the conditions, the register with smallest
1343    tick is returned to achieve more even register allocation.
1344 
1345    If original register seems to be ok, we set *IS_ORIG_REG_P_PTR to true.
1346 
1347    If no register satisfies the above conditions, NULL_RTX is returned.  */
1348 static rtx
1349 choose_best_reg_1 (HARD_REG_SET hard_regs_used,
1350                    struct reg_rename *reg_rename_p,
1351                    def_list_t original_insns, bool *is_orig_reg_p_ptr)
1352 {
1353   int best_new_reg;
1354   unsigned cur_reg;
1355   machine_mode mode = VOIDmode;
1356   unsigned regno, i, n;
1357   hard_reg_set_iterator hrsi;
1358   def_list_iterator di;
1359   def_t def;
1360 
1361   /* If original register is available, return it.  */
1362   *is_orig_reg_p_ptr = true;
1363 
1364   FOR_EACH_DEF (def, di, original_insns)
1365     {
1366       rtx orig_dest = SET_DEST (PATTERN (def->orig_insn));
1367 
1368       gcc_assert (REG_P (orig_dest));
1369 
1370       /* Check that all original operations have the same mode.
1371          This is done for the next loop; if we'd return from this
1372          loop, we'd check only part of them, but in this case
1373          it doesn't matter.  */
1374       if (mode == VOIDmode)
1375         mode = GET_MODE (orig_dest);
1376       gcc_assert (mode == GET_MODE (orig_dest));
1377 
1378       regno = REGNO (orig_dest);
1379       for (i = 0, n = hard_regno_nregs[regno][mode]; i < n; i++)
1380         if (TEST_HARD_REG_BIT (hard_regs_used, regno + i))
1381           break;
1382 
1383       /* All hard registers are available.  */
1384       if (i == n)
1385         {
1386           gcc_assert (mode != VOIDmode);
1387 
1388           /* Hard registers should not be shared.  */
1389           return gen_rtx_REG (mode, regno);
1390         }
1391     }
1392 
1393   *is_orig_reg_p_ptr = false;
1394   best_new_reg = -1;
1395 
1396   /* Among all available regs choose the register that was
1397      allocated earliest.  */
1398   EXECUTE_IF_SET_IN_HARD_REG_SET (reg_rename_p->available_for_renaming,
1399                                   0, cur_reg, hrsi)
1400     if (! TEST_HARD_REG_BIT (hard_regs_used, cur_reg))
1401       {
1402 	/* Check that all hard regs for mode are available.  */
1403 	for (i = 1, n = hard_regno_nregs[cur_reg][mode]; i < n; i++)
1404 	  if (TEST_HARD_REG_BIT (hard_regs_used, cur_reg + i)
1405 	      || !TEST_HARD_REG_BIT (reg_rename_p->available_for_renaming,
1406 				     cur_reg + i))
1407 	    break;
1408 
1409 	if (i < n)
1410 	  continue;
1411 
1412         /* All hard registers are available.  */
1413         if (best_new_reg < 0
1414             || reg_rename_tick[cur_reg] < reg_rename_tick[best_new_reg])
1415           {
1416             best_new_reg = cur_reg;
1417 
1418             /* Return immediately when we know there's no better reg.  */
1419             if (! reg_rename_tick[best_new_reg])
1420               break;
1421           }
1422       }
1423 
1424   if (best_new_reg >= 0)
1425     {
1426       /* Use the check from the above loop.  */
1427       gcc_assert (mode != VOIDmode);
1428       return gen_rtx_REG (mode, best_new_reg);
1429     }
1430 
1431   return NULL_RTX;
1432 }
1433 
1434 /* A wrapper around choose_best_reg_1 () to verify that we make correct
1435    assumptions about available registers in the function.  */
1436 static rtx
1437 choose_best_reg (HARD_REG_SET hard_regs_used, struct reg_rename *reg_rename_p,
1438                  def_list_t original_insns, bool *is_orig_reg_p_ptr)
1439 {
1440   rtx best_reg = choose_best_reg_1 (hard_regs_used, reg_rename_p,
1441                                     original_insns, is_orig_reg_p_ptr);
1442 
1443   /* FIXME loop over hard_regno_nregs here.  */
1444   gcc_assert (best_reg == NULL_RTX
1445 	      || TEST_HARD_REG_BIT (sel_hrd.regs_ever_used, REGNO (best_reg)));
1446 
1447   return best_reg;
1448 }
1449 
1450 /* Choose the pseudo register for storing rhs value.  As this is supposed
1451    to work before reload, we return either the original register or make
1452    the new one.  The parameters are the same that in choose_nest_reg_1
1453    functions, except that USED_REGS may contain pseudos.
1454    If we work with hard regs, check also REG_RENAME_P->UNAVAILABLE_HARD_REGS.
1455 
1456    TODO: take into account register pressure while doing this.  Up to this
1457    moment, this function would never return NULL for pseudos, but we should
1458    not rely on this.  */
1459 static rtx
1460 choose_best_pseudo_reg (regset used_regs,
1461                         struct reg_rename *reg_rename_p,
1462                         def_list_t original_insns, bool *is_orig_reg_p_ptr)
1463 {
1464   def_list_iterator i;
1465   def_t def;
1466   machine_mode mode = VOIDmode;
1467   bool bad_hard_regs = false;
1468 
1469   /* We should not use this after reload.  */
1470   gcc_assert (!reload_completed);
1471 
1472   /* If original register is available, return it.  */
1473   *is_orig_reg_p_ptr = true;
1474 
1475   FOR_EACH_DEF (def, i, original_insns)
1476     {
1477       rtx dest = SET_DEST (PATTERN (def->orig_insn));
1478       int orig_regno;
1479 
1480       gcc_assert (REG_P (dest));
1481 
1482       /* Check that all original operations have the same mode.  */
1483       if (mode == VOIDmode)
1484         mode = GET_MODE (dest);
1485       else
1486         gcc_assert (mode == GET_MODE (dest));
1487       orig_regno = REGNO (dest);
1488 
1489       /* Check that nothing in used_regs intersects with orig_regno.  When
1490 	 we have a hard reg here, still loop over hard_regno_nregs.  */
1491       if (HARD_REGISTER_NUM_P (orig_regno))
1492 	{
1493 	  int j, n;
1494 	  for (j = 0, n = hard_regno_nregs[orig_regno][mode]; j < n; j++)
1495 	    if (REGNO_REG_SET_P (used_regs, orig_regno + j))
1496 	      break;
1497 	  if (j < n)
1498 	    continue;
1499 	}
1500       else
1501 	{
1502 	  if (REGNO_REG_SET_P (used_regs, orig_regno))
1503 	    continue;
1504 	}
1505       if (HARD_REGISTER_NUM_P (orig_regno))
1506 	{
1507 	  gcc_assert (df_regs_ever_live_p (orig_regno));
1508 
1509 	  /* For hard registers, we have to check hardware imposed
1510 	     limitations (frame/stack registers, calls crossed).  */
1511 	  if (!TEST_HARD_REG_BIT (reg_rename_p->unavailable_hard_regs,
1512 				  orig_regno))
1513 	    {
1514 	      /* Don't let register cross a call if it doesn't already
1515 		 cross one.  This condition is written in accordance with
1516 		 that in sched-deps.c sched_analyze_reg().  */
1517 	      if (!reg_rename_p->crosses_call
1518 		  || REG_N_CALLS_CROSSED (orig_regno) > 0)
1519 		return gen_rtx_REG (mode, orig_regno);
1520 	    }
1521 
1522 	  bad_hard_regs = true;
1523 	}
1524       else
1525 	return dest;
1526     }
1527 
1528   *is_orig_reg_p_ptr = false;
1529 
1530   /* We had some original hard registers that couldn't be used.
1531      Those were likely special.  Don't try to create a pseudo.  */
1532   if (bad_hard_regs)
1533     return NULL_RTX;
1534 
1535   /* We haven't found a register from original operations.  Get a new one.
1536      FIXME: control register pressure somehow.  */
1537   {
1538     rtx new_reg = gen_reg_rtx (mode);
1539 
1540     gcc_assert (mode != VOIDmode);
1541 
1542     max_regno = max_reg_num ();
1543     maybe_extend_reg_info_p ();
1544     REG_N_CALLS_CROSSED (REGNO (new_reg)) = reg_rename_p->crosses_call ? 1 : 0;
1545 
1546     return new_reg;
1547   }
1548 }
1549 
1550 /* True when target of EXPR is available due to EXPR_TARGET_AVAILABLE,
1551    USED_REGS and REG_RENAME_P->UNAVAILABLE_HARD_REGS.  */
1552 static void
1553 verify_target_availability (expr_t expr, regset used_regs,
1554 			    struct reg_rename *reg_rename_p)
1555 {
1556   unsigned n, i, regno;
1557   machine_mode mode;
1558   bool target_available, live_available, hard_available;
1559 
1560   if (!REG_P (EXPR_LHS (expr)) || EXPR_TARGET_AVAILABLE (expr) < 0)
1561     return;
1562 
1563   regno = expr_dest_regno (expr);
1564   mode = GET_MODE (EXPR_LHS (expr));
1565   target_available = EXPR_TARGET_AVAILABLE (expr) == 1;
1566   n = HARD_REGISTER_NUM_P (regno) ? hard_regno_nregs[regno][mode] : 1;
1567 
1568   live_available = hard_available = true;
1569   for (i = 0; i < n; i++)
1570     {
1571       if (bitmap_bit_p (used_regs, regno + i))
1572         live_available = false;
1573       if (TEST_HARD_REG_BIT (reg_rename_p->unavailable_hard_regs, regno + i))
1574         hard_available = false;
1575     }
1576 
1577   /* When target is not available, it may be due to hard register
1578      restrictions, e.g. crosses calls, so we check hard_available too.  */
1579   if (target_available)
1580     gcc_assert (live_available);
1581   else
1582     /* Check only if we haven't scheduled something on the previous fence,
1583        cause due to MAX_SOFTWARE_LOOKAHEAD_WINDOW_SIZE issues
1584        and having more than one fence, we may end having targ_un in a block
1585        in which successors target register is actually available.
1586 
1587        The last condition handles the case when a dependence from a call insn
1588        was created in sched-deps.c for insns with destination registers that
1589        never crossed a call before, but do cross one after our code motion.
1590 
1591        FIXME: in the latter case, we just uselessly called find_used_regs,
1592        because we can't move this expression with any other register
1593        as well.  */
1594     gcc_assert (scheduled_something_on_previous_fence || !live_available
1595 		|| !hard_available
1596 		|| (!reload_completed && reg_rename_p->crosses_call
1597 		    && REG_N_CALLS_CROSSED (regno) == 0));
1598 }
1599 
1600 /* Collect unavailable registers due to liveness for EXPR from BNDS
1601    into USED_REGS.  Save additional information about available
1602    registers and unavailable due to hardware restriction registers
1603    into REG_RENAME_P structure.  Save original insns into ORIGINAL_INSNS
1604    list.  */
1605 static void
1606 collect_unavailable_regs_from_bnds (expr_t expr, blist_t bnds, regset used_regs,
1607 				    struct reg_rename *reg_rename_p,
1608 				    def_list_t *original_insns)
1609 {
1610   for (; bnds; bnds = BLIST_NEXT (bnds))
1611     {
1612       bool res;
1613       av_set_t orig_ops = NULL;
1614       bnd_t bnd = BLIST_BND (bnds);
1615 
1616       /* If the chosen best expr doesn't belong to current boundary,
1617 	 skip it.  */
1618       if (!av_set_is_in_p (BND_AV1 (bnd), EXPR_VINSN (expr)))
1619 	continue;
1620 
1621       /* Put in ORIG_OPS all exprs from this boundary that became
1622 	 RES on top.  */
1623       orig_ops = find_sequential_best_exprs (bnd, expr, false);
1624 
1625       /* Compute used regs and OR it into the USED_REGS.  */
1626       res = find_used_regs (BND_TO (bnd), orig_ops, used_regs,
1627 			    reg_rename_p, original_insns);
1628 
1629       /* FIXME: the assert is true until we'd have several boundaries.  */
1630       gcc_assert (res);
1631       av_set_clear (&orig_ops);
1632     }
1633 }
1634 
1635 /* Return TRUE if it is possible to replace LHSes of ORIG_INSNS with BEST_REG.
1636    If BEST_REG is valid, replace LHS of EXPR with it.  */
1637 static bool
1638 try_replace_dest_reg (ilist_t orig_insns, rtx best_reg, expr_t expr)
1639 {
1640   /* Try whether we'll be able to generate the insn
1641      'dest := best_reg' at the place of the original operation.  */
1642   for (; orig_insns; orig_insns = ILIST_NEXT (orig_insns))
1643     {
1644       insn_t orig_insn = DEF_LIST_DEF (orig_insns)->orig_insn;
1645 
1646       gcc_assert (EXPR_SEPARABLE_P (INSN_EXPR (orig_insn)));
1647 
1648       if (REGNO (best_reg) != REGNO (INSN_LHS (orig_insn))
1649 	  && (! replace_src_with_reg_ok_p (orig_insn, best_reg)
1650 	      || ! replace_dest_with_reg_ok_p (orig_insn, best_reg)))
1651 	return false;
1652     }
1653 
1654   /* Make sure that EXPR has the right destination
1655      register.  */
1656   if (expr_dest_regno (expr) != REGNO (best_reg))
1657     replace_dest_with_reg_in_expr (expr, best_reg);
1658   else
1659     EXPR_TARGET_AVAILABLE (expr) = 1;
1660 
1661   return true;
1662 }
1663 
1664 /* Select and assign best register to EXPR searching from BNDS.
1665    Set *IS_ORIG_REG_P to TRUE if original register was selected.
1666    Return FALSE if no register can be chosen, which could happen when:
1667    * EXPR_SEPARABLE_P is true but we were unable to find suitable register;
1668    * EXPR_SEPARABLE_P is false but the insn sets/clobbers one of the registers
1669      that are used on the moving path.  */
1670 static bool
1671 find_best_reg_for_expr (expr_t expr, blist_t bnds, bool *is_orig_reg_p)
1672 {
1673   static struct reg_rename reg_rename_data;
1674 
1675   regset used_regs;
1676   def_list_t original_insns = NULL;
1677   bool reg_ok;
1678 
1679   *is_orig_reg_p = false;
1680 
1681   /* Don't bother to do anything if this insn doesn't set any registers.  */
1682   if (bitmap_empty_p (VINSN_REG_SETS (EXPR_VINSN (expr)))
1683       && bitmap_empty_p (VINSN_REG_CLOBBERS (EXPR_VINSN (expr))))
1684     return true;
1685 
1686   used_regs = get_clear_regset_from_pool ();
1687   CLEAR_HARD_REG_SET (reg_rename_data.unavailable_hard_regs);
1688 
1689   collect_unavailable_regs_from_bnds (expr, bnds, used_regs, &reg_rename_data,
1690 				      &original_insns);
1691 
1692 #ifdef ENABLE_CHECKING
1693   /* If after reload, make sure we're working with hard regs here.  */
1694   if (reload_completed)
1695     {
1696       reg_set_iterator rsi;
1697       unsigned i;
1698 
1699       EXECUTE_IF_SET_IN_REG_SET (used_regs, FIRST_PSEUDO_REGISTER, i, rsi)
1700         gcc_unreachable ();
1701     }
1702 #endif
1703 
1704   if (EXPR_SEPARABLE_P (expr))
1705     {
1706       rtx best_reg = NULL_RTX;
1707       /* Check that we have computed availability of a target register
1708 	 correctly.  */
1709       verify_target_availability (expr, used_regs, &reg_rename_data);
1710 
1711       /* Turn everything in hard regs after reload.  */
1712       if (reload_completed)
1713 	{
1714 	  HARD_REG_SET hard_regs_used;
1715 	  REG_SET_TO_HARD_REG_SET (hard_regs_used, used_regs);
1716 
1717 	  /* Join hard registers unavailable due to register class
1718 	     restrictions and live range intersection.  */
1719 	  IOR_HARD_REG_SET (hard_regs_used,
1720 			    reg_rename_data.unavailable_hard_regs);
1721 
1722 	  best_reg = choose_best_reg (hard_regs_used, &reg_rename_data,
1723 				      original_insns, is_orig_reg_p);
1724 	}
1725       else
1726 	best_reg = choose_best_pseudo_reg (used_regs, &reg_rename_data,
1727 					   original_insns, is_orig_reg_p);
1728 
1729       if (!best_reg)
1730 	reg_ok = false;
1731       else if (*is_orig_reg_p)
1732 	{
1733 	  /* In case of unification BEST_REG may be different from EXPR's LHS
1734 	     when EXPR's LHS is unavailable, and there is another LHS among
1735 	     ORIGINAL_INSNS.  */
1736 	  reg_ok = try_replace_dest_reg (original_insns, best_reg, expr);
1737 	}
1738       else
1739 	{
1740 	  /* Forbid renaming of low-cost insns.  */
1741 	  if (sel_vinsn_cost (EXPR_VINSN (expr)) < 2)
1742 	    reg_ok = false;
1743 	  else
1744 	    reg_ok = try_replace_dest_reg (original_insns, best_reg, expr);
1745 	}
1746     }
1747   else
1748     {
1749       /* If !EXPR_SCHEDULE_AS_RHS (EXPR), just make sure INSN doesn't set
1750 	 any of the HARD_REGS_USED set.  */
1751       if (vinsn_writes_one_of_regs_p (EXPR_VINSN (expr), used_regs,
1752 				      reg_rename_data.unavailable_hard_regs))
1753 	{
1754 	  reg_ok = false;
1755 	  gcc_assert (EXPR_TARGET_AVAILABLE (expr) <= 0);
1756 	}
1757       else
1758 	{
1759 	  reg_ok = true;
1760 	  gcc_assert (EXPR_TARGET_AVAILABLE (expr) != 0);
1761 	}
1762     }
1763 
1764   ilist_clear (&original_insns);
1765   return_regset_to_pool (used_regs);
1766 
1767   return reg_ok;
1768 }
1769 
1770 
1771 /* Return true if dependence described by DS can be overcomed.  */
1772 static bool
1773 can_speculate_dep_p (ds_t ds)
1774 {
1775   if (spec_info == NULL)
1776     return false;
1777 
1778   /* Leave only speculative data.  */
1779   ds &= SPECULATIVE;
1780 
1781   if (ds == 0)
1782     return false;
1783 
1784   {
1785     /* FIXME: make sched-deps.c produce only those non-hard dependencies,
1786        that we can overcome.  */
1787     ds_t spec_mask = spec_info->mask;
1788 
1789     if ((ds & spec_mask) != ds)
1790       return false;
1791   }
1792 
1793   if (ds_weak (ds) < spec_info->data_weakness_cutoff)
1794     return false;
1795 
1796   return true;
1797 }
1798 
1799 /* Get a speculation check instruction.
1800    C_EXPR is a speculative expression,
1801    CHECK_DS describes speculations that should be checked,
1802    ORIG_INSN is the original non-speculative insn in the stream.  */
1803 static insn_t
1804 create_speculation_check (expr_t c_expr, ds_t check_ds, insn_t orig_insn)
1805 {
1806   rtx check_pattern;
1807   rtx_insn *insn_rtx;
1808   insn_t insn;
1809   basic_block recovery_block;
1810   rtx_insn *label;
1811 
1812   /* Create a recovery block if target is going to emit branchy check, or if
1813      ORIG_INSN was speculative already.  */
1814   if (targetm.sched.needs_block_p (check_ds)
1815       || EXPR_SPEC_DONE_DS (INSN_EXPR (orig_insn)) != 0)
1816     {
1817       recovery_block = sel_create_recovery_block (orig_insn);
1818       label = BB_HEAD (recovery_block);
1819     }
1820   else
1821     {
1822       recovery_block = NULL;
1823       label = NULL;
1824     }
1825 
1826   /* Get pattern of the check.  */
1827   check_pattern = targetm.sched.gen_spec_check (EXPR_INSN_RTX (c_expr), label,
1828 						check_ds);
1829 
1830   gcc_assert (check_pattern != NULL);
1831 
1832   /* Emit check.  */
1833   insn_rtx = create_insn_rtx_from_pattern (check_pattern, label);
1834 
1835   insn = sel_gen_insn_from_rtx_after (insn_rtx, INSN_EXPR (orig_insn),
1836 				      INSN_SEQNO (orig_insn), orig_insn);
1837 
1838   /* Make check to be non-speculative.  */
1839   EXPR_SPEC_DONE_DS (INSN_EXPR (insn)) = 0;
1840   INSN_SPEC_CHECKED_DS (insn) = check_ds;
1841 
1842   /* Decrease priority of check by difference of load/check instruction
1843      latencies.  */
1844   EXPR_PRIORITY (INSN_EXPR (insn)) -= (sel_vinsn_cost (INSN_VINSN (orig_insn))
1845 				       - sel_vinsn_cost (INSN_VINSN (insn)));
1846 
1847   /* Emit copy of original insn (though with replaced target register,
1848      if needed) to the recovery block.  */
1849   if (recovery_block != NULL)
1850     {
1851       rtx twin_rtx;
1852 
1853       twin_rtx = copy_rtx (PATTERN (EXPR_INSN_RTX (c_expr)));
1854       twin_rtx = create_insn_rtx_from_pattern (twin_rtx, NULL_RTX);
1855       sel_gen_recovery_insn_from_rtx_after (twin_rtx,
1856 					    INSN_EXPR (orig_insn),
1857 					    INSN_SEQNO (insn),
1858 					    bb_note (recovery_block));
1859     }
1860 
1861   /* If we've generated a data speculation check, make sure
1862      that all the bookkeeping instruction we'll create during
1863      this move_op () will allocate an ALAT entry so that the
1864      check won't fail.
1865      In case of control speculation we must convert C_EXPR to control
1866      speculative mode, because failing to do so will bring us an exception
1867      thrown by the non-control-speculative load.  */
1868   check_ds = ds_get_max_dep_weak (check_ds);
1869   speculate_expr (c_expr, check_ds);
1870 
1871   return insn;
1872 }
1873 
1874 /* True when INSN is a "regN = regN" copy.  */
1875 static bool
1876 identical_copy_p (rtx insn)
1877 {
1878   rtx lhs, rhs, pat;
1879 
1880   pat = PATTERN (insn);
1881 
1882   if (GET_CODE (pat) != SET)
1883     return false;
1884 
1885   lhs = SET_DEST (pat);
1886   if (!REG_P (lhs))
1887     return false;
1888 
1889   rhs = SET_SRC (pat);
1890   if (!REG_P (rhs))
1891     return false;
1892 
1893   return REGNO (lhs) == REGNO (rhs);
1894 }
1895 
1896 /* Undo all transformations on *AV_PTR that were done when
1897    moving through INSN.  */
1898 static void
1899 undo_transformations (av_set_t *av_ptr, rtx_insn *insn)
1900 {
1901   av_set_iterator av_iter;
1902   expr_t expr;
1903   av_set_t new_set = NULL;
1904 
1905   /* First, kill any EXPR that uses registers set by an insn.  This is
1906      required for correctness.  */
1907   FOR_EACH_EXPR_1 (expr, av_iter, av_ptr)
1908     if (!sched_insns_conditions_mutex_p (insn, EXPR_INSN_RTX (expr))
1909         && bitmap_intersect_p (INSN_REG_SETS (insn),
1910                                VINSN_REG_USES (EXPR_VINSN (expr)))
1911         /* When an insn looks like 'r1 = r1', we could substitute through
1912            it, but the above condition will still hold.  This happened with
1913            gcc.c-torture/execute/961125-1.c.  */
1914         && !identical_copy_p (insn))
1915       {
1916         if (sched_verbose >= 6)
1917           sel_print ("Expr %d removed due to use/set conflict\n",
1918                      INSN_UID (EXPR_INSN_RTX (expr)));
1919         av_set_iter_remove (&av_iter);
1920       }
1921 
1922   /* Undo transformations looking at the history vector.  */
1923   FOR_EACH_EXPR (expr, av_iter, *av_ptr)
1924     {
1925       int index = find_in_history_vect (EXPR_HISTORY_OF_CHANGES (expr),
1926                                         insn, EXPR_VINSN (expr), true);
1927 
1928       if (index >= 0)
1929         {
1930           expr_history_def *phist;
1931 
1932           phist = &EXPR_HISTORY_OF_CHANGES (expr)[index];
1933 
1934           switch (phist->type)
1935             {
1936             case TRANS_SPECULATION:
1937               {
1938                 ds_t old_ds, new_ds;
1939 
1940                 /* Compute the difference between old and new speculative
1941                    statuses: that's what we need to check.
1942                    Earlier we used to assert that the status will really
1943                    change.  This no longer works because only the probability
1944                    bits in the status may have changed during compute_av_set,
1945                    and in the case of merging different probabilities of the
1946                    same speculative status along different paths we do not
1947                    record this in the history vector.  */
1948                 old_ds = phist->spec_ds;
1949                 new_ds = EXPR_SPEC_DONE_DS (expr);
1950 
1951                 old_ds &= SPECULATIVE;
1952                 new_ds &= SPECULATIVE;
1953                 new_ds &= ~old_ds;
1954 
1955                 EXPR_SPEC_TO_CHECK_DS (expr) |= new_ds;
1956                 break;
1957               }
1958             case TRANS_SUBSTITUTION:
1959               {
1960                 expr_def _tmp_expr, *tmp_expr = &_tmp_expr;
1961                 vinsn_t new_vi;
1962                 bool add = true;
1963 
1964                 new_vi = phist->old_expr_vinsn;
1965 
1966                 gcc_assert (VINSN_SEPARABLE_P (new_vi)
1967                             == EXPR_SEPARABLE_P (expr));
1968                 copy_expr (tmp_expr, expr);
1969 
1970                 if (vinsn_equal_p (phist->new_expr_vinsn,
1971                                    EXPR_VINSN (tmp_expr)))
1972                   change_vinsn_in_expr (tmp_expr, new_vi);
1973                 else
1974                   /* This happens when we're unsubstituting on a bookkeeping
1975                      copy, which was in turn substituted.  The history is wrong
1976                      in this case.  Do it the hard way.  */
1977                   add = substitute_reg_in_expr (tmp_expr, insn, true);
1978                 if (add)
1979                   av_set_add (&new_set, tmp_expr);
1980                 clear_expr (tmp_expr);
1981                 break;
1982               }
1983             default:
1984               gcc_unreachable ();
1985             }
1986         }
1987 
1988     }
1989 
1990   av_set_union_and_clear (av_ptr, &new_set, NULL);
1991 }
1992 
1993 
1994 /* Moveup_* helpers for code motion and computing av sets.  */
1995 
1996 /* Propagates EXPR inside an insn group through THROUGH_INSN.
1997    The difference from the below function is that only substitution is
1998    performed.  */
1999 static enum MOVEUP_EXPR_CODE
2000 moveup_expr_inside_insn_group (expr_t expr, insn_t through_insn)
2001 {
2002   vinsn_t vi = EXPR_VINSN (expr);
2003   ds_t *has_dep_p;
2004   ds_t full_ds;
2005 
2006   /* Do this only inside insn group.  */
2007   gcc_assert (INSN_SCHED_CYCLE (through_insn) > 0);
2008 
2009   full_ds = has_dependence_p (expr, through_insn, &has_dep_p);
2010   if (full_ds == 0)
2011     return MOVEUP_EXPR_SAME;
2012 
2013   /* Substitution is the possible choice in this case.  */
2014   if (has_dep_p[DEPS_IN_RHS])
2015     {
2016       /* Can't substitute UNIQUE VINSNs.  */
2017       gcc_assert (!VINSN_UNIQUE_P (vi));
2018 
2019       if (can_substitute_through_p (through_insn,
2020                                     has_dep_p[DEPS_IN_RHS])
2021           && substitute_reg_in_expr (expr, through_insn, false))
2022         {
2023           EXPR_WAS_SUBSTITUTED (expr) = true;
2024           return MOVEUP_EXPR_CHANGED;
2025         }
2026 
2027       /* Don't care about this, as even true dependencies may be allowed
2028          in an insn group.  */
2029       return MOVEUP_EXPR_SAME;
2030     }
2031 
2032   /* This can catch output dependencies in COND_EXECs.  */
2033   if (has_dep_p[DEPS_IN_INSN])
2034     return MOVEUP_EXPR_NULL;
2035 
2036   /* This is either an output or an anti dependence, which usually have
2037      a zero latency.  Allow this here, if we'd be wrong, tick_check_p
2038      will fix this.  */
2039   gcc_assert (has_dep_p[DEPS_IN_LHS]);
2040   return MOVEUP_EXPR_AS_RHS;
2041 }
2042 
2043 /* True when a trapping EXPR cannot be moved through THROUGH_INSN.  */
2044 #define CANT_MOVE_TRAPPING(expr, through_insn)                \
2045   (VINSN_MAY_TRAP_P (EXPR_VINSN (expr))                       \
2046    && !sel_insn_has_single_succ_p ((through_insn), SUCCS_ALL) \
2047    && !sel_insn_is_speculation_check (through_insn))
2048 
2049 /* True when a conflict on a target register was found during moveup_expr.  */
2050 static bool was_target_conflict = false;
2051 
2052 /* Return true when moving a debug INSN across THROUGH_INSN will
2053    create a bookkeeping block.  We don't want to create such blocks,
2054    for they would cause codegen differences between compilations with
2055    and without debug info.  */
2056 
2057 static bool
2058 moving_insn_creates_bookkeeping_block_p (insn_t insn,
2059 					 insn_t through_insn)
2060 {
2061   basic_block bbi, bbt;
2062   edge e1, e2;
2063   edge_iterator ei1, ei2;
2064 
2065   if (!bookkeeping_can_be_created_if_moved_through_p (through_insn))
2066     {
2067       if (sched_verbose >= 9)
2068 	sel_print ("no bookkeeping required: ");
2069       return FALSE;
2070     }
2071 
2072   bbi = BLOCK_FOR_INSN (insn);
2073 
2074   if (EDGE_COUNT (bbi->preds) == 1)
2075     {
2076       if (sched_verbose >= 9)
2077 	sel_print ("only one pred edge: ");
2078       return TRUE;
2079     }
2080 
2081   bbt = BLOCK_FOR_INSN (through_insn);
2082 
2083   FOR_EACH_EDGE (e1, ei1, bbt->succs)
2084     {
2085       FOR_EACH_EDGE (e2, ei2, bbi->preds)
2086 	{
2087 	  if (find_block_for_bookkeeping (e1, e2, TRUE))
2088 	    {
2089 	      if (sched_verbose >= 9)
2090 		sel_print ("found existing block: ");
2091 	      return FALSE;
2092 	    }
2093 	}
2094     }
2095 
2096   if (sched_verbose >= 9)
2097     sel_print ("would create bookkeeping block: ");
2098 
2099   return TRUE;
2100 }
2101 
2102 /* Return true when the conflict with newly created implicit clobbers
2103    between EXPR and THROUGH_INSN is found because of renaming.  */
2104 static bool
2105 implicit_clobber_conflict_p (insn_t through_insn, expr_t expr)
2106 {
2107   HARD_REG_SET temp;
2108   rtx_insn *insn;
2109   rtx reg, rhs, pat;
2110   hard_reg_set_iterator hrsi;
2111   unsigned regno;
2112   bool valid;
2113 
2114   /* Make a new pseudo register.  */
2115   reg = gen_reg_rtx (GET_MODE (EXPR_LHS (expr)));
2116   max_regno = max_reg_num ();
2117   maybe_extend_reg_info_p ();
2118 
2119   /* Validate a change and bail out early.  */
2120   insn = EXPR_INSN_RTX (expr);
2121   validate_change (insn, &SET_DEST (PATTERN (insn)), reg, true);
2122   valid = verify_changes (0);
2123   cancel_changes (0);
2124   if (!valid)
2125     {
2126       if (sched_verbose >= 6)
2127 	sel_print ("implicit clobbers failed validation, ");
2128       return true;
2129     }
2130 
2131   /* Make a new insn with it.  */
2132   rhs = copy_rtx (VINSN_RHS (EXPR_VINSN (expr)));
2133   pat = gen_rtx_SET (VOIDmode, reg, rhs);
2134   start_sequence ();
2135   insn = emit_insn (pat);
2136   end_sequence ();
2137 
2138   /* Calculate implicit clobbers.  */
2139   extract_insn (insn);
2140   preprocess_constraints (insn);
2141   alternative_mask prefrred = get_preferred_alternatives (insn);
2142   ira_implicitly_set_insn_hard_regs (&temp, prefrred);
2143   AND_COMPL_HARD_REG_SET (temp, ira_no_alloc_regs);
2144 
2145   /* If any implicit clobber registers intersect with regular ones in
2146      through_insn, we have a dependency and thus bail out.  */
2147   EXECUTE_IF_SET_IN_HARD_REG_SET (temp, 0, regno, hrsi)
2148     {
2149       vinsn_t vi = INSN_VINSN (through_insn);
2150       if (bitmap_bit_p (VINSN_REG_SETS (vi), regno)
2151 	  || bitmap_bit_p (VINSN_REG_CLOBBERS (vi), regno)
2152 	  || bitmap_bit_p (VINSN_REG_USES (vi), regno))
2153 	return true;
2154     }
2155 
2156   return false;
2157 }
2158 
2159 /* Modifies EXPR so it can be moved through the THROUGH_INSN,
2160    performing necessary transformations.  Record the type of transformation
2161    made in PTRANS_TYPE, when it is not NULL.  When INSIDE_INSN_GROUP,
2162    permit all dependencies except true ones, and try to remove those
2163    too via forward substitution.  All cases when a non-eliminable
2164    non-zero cost dependency exists inside an insn group will be fixed
2165    in tick_check_p instead.  */
2166 static enum MOVEUP_EXPR_CODE
2167 moveup_expr (expr_t expr, insn_t through_insn, bool inside_insn_group,
2168             enum local_trans_type *ptrans_type)
2169 {
2170   vinsn_t vi = EXPR_VINSN (expr);
2171   insn_t insn = VINSN_INSN_RTX (vi);
2172   bool was_changed = false;
2173   bool as_rhs = false;
2174   ds_t *has_dep_p;
2175   ds_t full_ds;
2176 
2177   /* ??? We use dependencies of non-debug insns on debug insns to
2178      indicate that the debug insns need to be reset if the non-debug
2179      insn is pulled ahead of it.  It's hard to figure out how to
2180      introduce such a notion in sel-sched, but it already fails to
2181      support debug insns in other ways, so we just go ahead and
2182      let the deug insns go corrupt for now.  */
2183   if (DEBUG_INSN_P (through_insn) && !DEBUG_INSN_P (insn))
2184     return MOVEUP_EXPR_SAME;
2185 
2186   /* When inside_insn_group, delegate to the helper.  */
2187   if (inside_insn_group)
2188     return moveup_expr_inside_insn_group (expr, through_insn);
2189 
2190   /* Deal with unique insns and control dependencies.  */
2191   if (VINSN_UNIQUE_P (vi))
2192     {
2193       /* We can move jumps without side-effects or jumps that are
2194 	 mutually exclusive with instruction THROUGH_INSN (all in cases
2195 	 dependencies allow to do so and jump is not speculative).  */
2196       if (control_flow_insn_p (insn))
2197         {
2198           basic_block fallthru_bb;
2199 
2200           /* Do not move checks and do not move jumps through other
2201              jumps.  */
2202           if (control_flow_insn_p (through_insn)
2203               || sel_insn_is_speculation_check (insn))
2204             return MOVEUP_EXPR_NULL;
2205 
2206           /* Don't move jumps through CFG joins.  */
2207           if (bookkeeping_can_be_created_if_moved_through_p (through_insn))
2208             return MOVEUP_EXPR_NULL;
2209 
2210           /* The jump should have a clear fallthru block, and
2211              this block should be in the current region.  */
2212           if ((fallthru_bb = fallthru_bb_of_jump (insn)) == NULL
2213               || ! in_current_region_p (fallthru_bb))
2214             return MOVEUP_EXPR_NULL;
2215 
2216           /* And it should be mutually exclusive with through_insn.  */
2217           if (! sched_insns_conditions_mutex_p (insn, through_insn)
2218 	      && ! DEBUG_INSN_P (through_insn))
2219             return MOVEUP_EXPR_NULL;
2220         }
2221 
2222       /* Don't move what we can't move.  */
2223       if (EXPR_CANT_MOVE (expr)
2224 	  && BLOCK_FOR_INSN (through_insn) != BLOCK_FOR_INSN (insn))
2225 	return MOVEUP_EXPR_NULL;
2226 
2227       /* Don't move SCHED_GROUP instruction through anything.
2228          If we don't force this, then it will be possible to start
2229          scheduling a sched_group before all its dependencies are
2230          resolved.
2231          ??? Haifa deals with this issue by delaying the SCHED_GROUP
2232          as late as possible through rank_for_schedule.  */
2233       if (SCHED_GROUP_P (insn))
2234 	return MOVEUP_EXPR_NULL;
2235     }
2236   else
2237     gcc_assert (!control_flow_insn_p (insn));
2238 
2239   /* Don't move debug insns if this would require bookkeeping.  */
2240   if (DEBUG_INSN_P (insn)
2241       && BLOCK_FOR_INSN (through_insn) != BLOCK_FOR_INSN (insn)
2242       && moving_insn_creates_bookkeeping_block_p (insn, through_insn))
2243     return MOVEUP_EXPR_NULL;
2244 
2245   /* Deal with data dependencies.  */
2246   was_target_conflict = false;
2247   full_ds = has_dependence_p (expr, through_insn, &has_dep_p);
2248   if (full_ds == 0)
2249     {
2250       if (!CANT_MOVE_TRAPPING (expr, through_insn))
2251 	return MOVEUP_EXPR_SAME;
2252     }
2253   else
2254     {
2255       /* We can move UNIQUE insn up only as a whole and unchanged,
2256          so it shouldn't have any dependencies.  */
2257       if (VINSN_UNIQUE_P (vi))
2258 	return MOVEUP_EXPR_NULL;
2259     }
2260 
2261   if (full_ds != 0 && can_speculate_dep_p (full_ds))
2262     {
2263       int res;
2264 
2265       res = speculate_expr (expr, full_ds);
2266       if (res >= 0)
2267 	{
2268           /* Speculation was successful.  */
2269           full_ds = 0;
2270           was_changed = (res > 0);
2271           if (res == 2)
2272             was_target_conflict = true;
2273           if (ptrans_type)
2274             *ptrans_type = TRANS_SPECULATION;
2275 	  sel_clear_has_dependence ();
2276 	}
2277     }
2278 
2279   if (has_dep_p[DEPS_IN_INSN])
2280     /* We have some dependency that cannot be discarded.  */
2281     return MOVEUP_EXPR_NULL;
2282 
2283   if (has_dep_p[DEPS_IN_LHS])
2284     {
2285       /* Only separable insns can be moved up with the new register.
2286          Anyways, we should mark that the original register is
2287          unavailable.  */
2288       if (!enable_schedule_as_rhs_p || !EXPR_SEPARABLE_P (expr))
2289         return MOVEUP_EXPR_NULL;
2290 
2291       /* When renaming a hard register to a pseudo before reload, extra
2292 	 dependencies can occur from the implicit clobbers of the insn.
2293 	 Filter out such cases here.  */
2294       if (!reload_completed && REG_P (EXPR_LHS (expr))
2295 	  && HARD_REGISTER_P (EXPR_LHS (expr))
2296 	  && implicit_clobber_conflict_p (through_insn, expr))
2297 	{
2298 	  if (sched_verbose >= 6)
2299 	    sel_print ("implicit clobbers conflict detected, ");
2300 	  return MOVEUP_EXPR_NULL;
2301 	}
2302       EXPR_TARGET_AVAILABLE (expr) = false;
2303       was_target_conflict = true;
2304       as_rhs = true;
2305     }
2306 
2307   /* At this point we have either separable insns, that will be lifted
2308      up only as RHSes, or non-separable insns with no dependency in lhs.
2309      If dependency is in RHS, then try to perform substitution and move up
2310      substituted RHS:
2311 
2312       Ex. 1:				  Ex.2
2313 	y = x;				    y = x;
2314 	z = y*2;			    y = y*2;
2315 
2316     In Ex.1 y*2 can be substituted for x*2 and the whole operation can be
2317     moved above y=x assignment as z=x*2.
2318 
2319     In Ex.2 y*2 also can be substituted for x*2, but only the right hand
2320     side can be moved because of the output dependency.  The operation was
2321     cropped to its rhs above.  */
2322   if (has_dep_p[DEPS_IN_RHS])
2323     {
2324       ds_t *rhs_dsp = &has_dep_p[DEPS_IN_RHS];
2325 
2326       /* Can't substitute UNIQUE VINSNs.  */
2327       gcc_assert (!VINSN_UNIQUE_P (vi));
2328 
2329       if (can_speculate_dep_p (*rhs_dsp))
2330 	{
2331           int res;
2332 
2333           res = speculate_expr (expr, *rhs_dsp);
2334           if (res >= 0)
2335             {
2336               /* Speculation was successful.  */
2337               *rhs_dsp = 0;
2338               was_changed = (res > 0);
2339               if (res == 2)
2340                 was_target_conflict = true;
2341               if (ptrans_type)
2342                 *ptrans_type = TRANS_SPECULATION;
2343             }
2344 	  else
2345 	    return MOVEUP_EXPR_NULL;
2346 	}
2347       else if (can_substitute_through_p (through_insn,
2348                                          *rhs_dsp)
2349                && substitute_reg_in_expr (expr, through_insn, false))
2350 	{
2351           /* ??? We cannot perform substitution AND speculation on the same
2352              insn.  */
2353           gcc_assert (!was_changed);
2354           was_changed = true;
2355           if (ptrans_type)
2356             *ptrans_type = TRANS_SUBSTITUTION;
2357           EXPR_WAS_SUBSTITUTED (expr) = true;
2358 	}
2359       else
2360 	return MOVEUP_EXPR_NULL;
2361     }
2362 
2363   /* Don't move trapping insns through jumps.
2364      This check should be at the end to give a chance to control speculation
2365      to perform its duties.  */
2366   if (CANT_MOVE_TRAPPING (expr, through_insn))
2367     return MOVEUP_EXPR_NULL;
2368 
2369   return (was_changed
2370           ? MOVEUP_EXPR_CHANGED
2371           : (as_rhs
2372              ? MOVEUP_EXPR_AS_RHS
2373              : MOVEUP_EXPR_SAME));
2374 }
2375 
2376 /* Try to look at bitmap caches for EXPR and INSN pair, return true
2377    if successful.  When INSIDE_INSN_GROUP, also try ignore dependencies
2378    that can exist within a parallel group.  Write to RES the resulting
2379    code for moveup_expr.  */
2380 static bool
2381 try_bitmap_cache (expr_t expr, insn_t insn,
2382                   bool inside_insn_group,
2383                   enum MOVEUP_EXPR_CODE *res)
2384 {
2385   int expr_uid = INSN_UID (EXPR_INSN_RTX (expr));
2386 
2387   /* First check whether we've analyzed this situation already.  */
2388   if (bitmap_bit_p (INSN_ANALYZED_DEPS (insn), expr_uid))
2389     {
2390       if (bitmap_bit_p (INSN_FOUND_DEPS (insn), expr_uid))
2391         {
2392           if (sched_verbose >= 6)
2393             sel_print ("removed (cached)\n");
2394           *res = MOVEUP_EXPR_NULL;
2395           return true;
2396         }
2397       else
2398         {
2399           if (sched_verbose >= 6)
2400             sel_print ("unchanged (cached)\n");
2401           *res = MOVEUP_EXPR_SAME;
2402           return true;
2403         }
2404     }
2405   else if (bitmap_bit_p (INSN_FOUND_DEPS (insn), expr_uid))
2406     {
2407       if (inside_insn_group)
2408         {
2409           if (sched_verbose >= 6)
2410             sel_print ("unchanged (as RHS, cached, inside insn group)\n");
2411           *res = MOVEUP_EXPR_SAME;
2412           return true;
2413 
2414         }
2415       else
2416         EXPR_TARGET_AVAILABLE (expr) = false;
2417 
2418       /* This is the only case when propagation result can change over time,
2419          as we can dynamically switch off scheduling as RHS.  In this case,
2420          just check the flag to reach the correct decision.  */
2421       if (enable_schedule_as_rhs_p)
2422         {
2423           if (sched_verbose >= 6)
2424             sel_print ("unchanged (as RHS, cached)\n");
2425           *res = MOVEUP_EXPR_AS_RHS;
2426           return true;
2427         }
2428       else
2429         {
2430           if (sched_verbose >= 6)
2431             sel_print ("removed (cached as RHS, but renaming"
2432                        " is now disabled)\n");
2433           *res = MOVEUP_EXPR_NULL;
2434           return true;
2435         }
2436     }
2437 
2438   return false;
2439 }
2440 
2441 /* Try to look at bitmap caches for EXPR and INSN pair, return true
2442    if successful.  Write to RES the resulting code for moveup_expr.  */
2443 static bool
2444 try_transformation_cache (expr_t expr, insn_t insn,
2445                           enum MOVEUP_EXPR_CODE *res)
2446 {
2447   struct transformed_insns *pti
2448     = (struct transformed_insns *)
2449     htab_find_with_hash (INSN_TRANSFORMED_INSNS (insn),
2450                          &EXPR_VINSN (expr),
2451                          VINSN_HASH_RTX (EXPR_VINSN (expr)));
2452   if (pti)
2453     {
2454       /* This EXPR was already moved through this insn and was
2455          changed as a result.  Fetch the proper data from
2456          the hashtable.  */
2457       insert_in_history_vect (&EXPR_HISTORY_OF_CHANGES (expr),
2458                               INSN_UID (insn), pti->type,
2459                               pti->vinsn_old, pti->vinsn_new,
2460                               EXPR_SPEC_DONE_DS (expr));
2461 
2462       if (INSN_IN_STREAM_P (VINSN_INSN_RTX (pti->vinsn_new)))
2463         pti->vinsn_new = vinsn_copy (pti->vinsn_new, true);
2464       change_vinsn_in_expr (expr, pti->vinsn_new);
2465       if (pti->was_target_conflict)
2466         EXPR_TARGET_AVAILABLE (expr) = false;
2467       if (pti->type == TRANS_SPECULATION)
2468         {
2469           EXPR_SPEC_DONE_DS (expr) = pti->ds;
2470           EXPR_NEEDS_SPEC_CHECK_P (expr) |= pti->needs_check;
2471         }
2472 
2473       if (sched_verbose >= 6)
2474         {
2475           sel_print ("changed (cached): ");
2476           dump_expr (expr);
2477           sel_print ("\n");
2478         }
2479 
2480       *res = MOVEUP_EXPR_CHANGED;
2481       return true;
2482     }
2483 
2484   return false;
2485 }
2486 
2487 /* Update bitmap caches on INSN with result RES of propagating EXPR.  */
2488 static void
2489 update_bitmap_cache (expr_t expr, insn_t insn, bool inside_insn_group,
2490                      enum MOVEUP_EXPR_CODE res)
2491 {
2492   int expr_uid = INSN_UID (EXPR_INSN_RTX (expr));
2493 
2494   /* Do not cache result of propagating jumps through an insn group,
2495      as it is always true, which is not useful outside the group.  */
2496   if (inside_insn_group)
2497     return;
2498 
2499   if (res == MOVEUP_EXPR_NULL)
2500     {
2501       bitmap_set_bit (INSN_ANALYZED_DEPS (insn), expr_uid);
2502       bitmap_set_bit (INSN_FOUND_DEPS (insn), expr_uid);
2503     }
2504   else if (res == MOVEUP_EXPR_SAME)
2505     {
2506       bitmap_set_bit (INSN_ANALYZED_DEPS (insn), expr_uid);
2507       bitmap_clear_bit (INSN_FOUND_DEPS (insn), expr_uid);
2508     }
2509   else if (res == MOVEUP_EXPR_AS_RHS)
2510     {
2511       bitmap_clear_bit (INSN_ANALYZED_DEPS (insn), expr_uid);
2512       bitmap_set_bit (INSN_FOUND_DEPS (insn), expr_uid);
2513     }
2514   else
2515     gcc_unreachable ();
2516 }
2517 
2518 /* Update hashtable on INSN with changed EXPR, old EXPR_OLD_VINSN
2519    and transformation type TRANS_TYPE.  */
2520 static void
2521 update_transformation_cache (expr_t expr, insn_t insn,
2522                              bool inside_insn_group,
2523                              enum local_trans_type trans_type,
2524                              vinsn_t expr_old_vinsn)
2525 {
2526   struct transformed_insns *pti;
2527 
2528   if (inside_insn_group)
2529     return;
2530 
2531   pti = XNEW (struct transformed_insns);
2532   pti->vinsn_old = expr_old_vinsn;
2533   pti->vinsn_new = EXPR_VINSN (expr);
2534   pti->type = trans_type;
2535   pti->was_target_conflict = was_target_conflict;
2536   pti->ds = EXPR_SPEC_DONE_DS (expr);
2537   pti->needs_check = EXPR_NEEDS_SPEC_CHECK_P (expr);
2538   vinsn_attach (pti->vinsn_old);
2539   vinsn_attach (pti->vinsn_new);
2540   *((struct transformed_insns **)
2541     htab_find_slot_with_hash (INSN_TRANSFORMED_INSNS (insn),
2542                               pti, VINSN_HASH_RTX (expr_old_vinsn),
2543                               INSERT)) = pti;
2544 }
2545 
2546 /* Same as moveup_expr, but first looks up the result of
2547    transformation in caches.  */
2548 static enum MOVEUP_EXPR_CODE
2549 moveup_expr_cached (expr_t expr, insn_t insn, bool inside_insn_group)
2550 {
2551   enum MOVEUP_EXPR_CODE res;
2552   bool got_answer = false;
2553 
2554   if (sched_verbose >= 6)
2555     {
2556       sel_print ("Moving ");
2557       dump_expr (expr);
2558       sel_print (" through %d: ", INSN_UID (insn));
2559     }
2560 
2561   if (DEBUG_INSN_P (EXPR_INSN_RTX (expr))
2562       && BLOCK_FOR_INSN (EXPR_INSN_RTX (expr))
2563       && (sel_bb_head (BLOCK_FOR_INSN (EXPR_INSN_RTX (expr)))
2564 	  == EXPR_INSN_RTX (expr)))
2565     /* Don't use cached information for debug insns that are heads of
2566        basic blocks.  */;
2567   else if (try_bitmap_cache (expr, insn, inside_insn_group, &res))
2568     /* When inside insn group, we do not want remove stores conflicting
2569        with previosly issued loads.  */
2570     got_answer = ! inside_insn_group || res != MOVEUP_EXPR_NULL;
2571   else if (try_transformation_cache (expr, insn, &res))
2572     got_answer = true;
2573 
2574   if (! got_answer)
2575     {
2576       /* Invoke moveup_expr and record the results.  */
2577       vinsn_t expr_old_vinsn = EXPR_VINSN (expr);
2578       ds_t expr_old_spec_ds = EXPR_SPEC_DONE_DS (expr);
2579       int expr_uid = INSN_UID (VINSN_INSN_RTX (expr_old_vinsn));
2580       bool unique_p = VINSN_UNIQUE_P (expr_old_vinsn);
2581       enum local_trans_type trans_type = TRANS_SUBSTITUTION;
2582 
2583       /* ??? Invent something better than this.  We can't allow old_vinsn
2584          to go, we need it for the history vector.  */
2585       vinsn_attach (expr_old_vinsn);
2586 
2587       res = moveup_expr (expr, insn, inside_insn_group,
2588                          &trans_type);
2589       switch (res)
2590         {
2591         case MOVEUP_EXPR_NULL:
2592           update_bitmap_cache (expr, insn, inside_insn_group, res);
2593 	  if (sched_verbose >= 6)
2594             sel_print ("removed\n");
2595 	  break;
2596 
2597 	case MOVEUP_EXPR_SAME:
2598           update_bitmap_cache (expr, insn, inside_insn_group, res);
2599           if (sched_verbose >= 6)
2600             sel_print ("unchanged\n");
2601 	  break;
2602 
2603         case MOVEUP_EXPR_AS_RHS:
2604           gcc_assert (!unique_p || inside_insn_group);
2605           update_bitmap_cache (expr, insn, inside_insn_group, res);
2606 	  if (sched_verbose >= 6)
2607             sel_print ("unchanged (as RHS)\n");
2608 	  break;
2609 
2610 	case MOVEUP_EXPR_CHANGED:
2611           gcc_assert (INSN_UID (EXPR_INSN_RTX (expr)) != expr_uid
2612                       || EXPR_SPEC_DONE_DS (expr) != expr_old_spec_ds);
2613           insert_in_history_vect (&EXPR_HISTORY_OF_CHANGES (expr),
2614                                   INSN_UID (insn), trans_type,
2615                                   expr_old_vinsn, EXPR_VINSN (expr),
2616                                   expr_old_spec_ds);
2617           update_transformation_cache (expr, insn, inside_insn_group,
2618                                        trans_type, expr_old_vinsn);
2619           if (sched_verbose >= 6)
2620             {
2621               sel_print ("changed: ");
2622               dump_expr (expr);
2623               sel_print ("\n");
2624             }
2625 	  break;
2626 	default:
2627 	  gcc_unreachable ();
2628         }
2629 
2630       vinsn_detach (expr_old_vinsn);
2631     }
2632 
2633   return res;
2634 }
2635 
2636 /* Moves an av set AVP up through INSN, performing necessary
2637    transformations.  */
2638 static void
2639 moveup_set_expr (av_set_t *avp, insn_t insn, bool inside_insn_group)
2640 {
2641   av_set_iterator i;
2642   expr_t expr;
2643 
2644   FOR_EACH_EXPR_1 (expr, i, avp)
2645     {
2646 
2647       switch (moveup_expr_cached (expr, insn, inside_insn_group))
2648 	{
2649 	case MOVEUP_EXPR_SAME:
2650         case MOVEUP_EXPR_AS_RHS:
2651 	  break;
2652 
2653 	case MOVEUP_EXPR_NULL:
2654 	  av_set_iter_remove (&i);
2655 	  break;
2656 
2657 	case MOVEUP_EXPR_CHANGED:
2658           expr = merge_with_other_exprs (avp, &i, expr);
2659 	  break;
2660 
2661 	default:
2662 	  gcc_unreachable ();
2663 	}
2664     }
2665 }
2666 
2667 /* Moves AVP set along PATH.  */
2668 static void
2669 moveup_set_inside_insn_group (av_set_t *avp, ilist_t path)
2670 {
2671   int last_cycle;
2672 
2673   if (sched_verbose >= 6)
2674     sel_print ("Moving expressions up in the insn group...\n");
2675   if (! path)
2676     return;
2677   last_cycle = INSN_SCHED_CYCLE (ILIST_INSN (path));
2678   while (path
2679          && INSN_SCHED_CYCLE (ILIST_INSN (path)) == last_cycle)
2680     {
2681       moveup_set_expr (avp, ILIST_INSN (path), true);
2682       path = ILIST_NEXT (path);
2683     }
2684 }
2685 
2686 /* Returns true if after moving EXPR along PATH it equals to EXPR_VLIW.  */
2687 static bool
2688 equal_after_moveup_path_p (expr_t expr, ilist_t path, expr_t expr_vliw)
2689 {
2690   expr_def _tmp, *tmp = &_tmp;
2691   int last_cycle;
2692   bool res = true;
2693 
2694   copy_expr_onside (tmp, expr);
2695   last_cycle = path ? INSN_SCHED_CYCLE (ILIST_INSN (path)) : 0;
2696   while (path
2697          && res
2698          && INSN_SCHED_CYCLE (ILIST_INSN (path)) == last_cycle)
2699     {
2700       res = (moveup_expr_cached (tmp, ILIST_INSN (path), true)
2701              != MOVEUP_EXPR_NULL);
2702       path = ILIST_NEXT (path);
2703     }
2704 
2705   if (res)
2706     {
2707       vinsn_t tmp_vinsn = EXPR_VINSN (tmp);
2708       vinsn_t expr_vliw_vinsn = EXPR_VINSN (expr_vliw);
2709 
2710       if (tmp_vinsn != expr_vliw_vinsn)
2711 	res = vinsn_equal_p (tmp_vinsn, expr_vliw_vinsn);
2712     }
2713 
2714   clear_expr (tmp);
2715   return res;
2716 }
2717 
2718 
2719 /* Functions that compute av and lv sets.  */
2720 
2721 /* Returns true if INSN is not a downward continuation of the given path P in
2722    the current stage.  */
2723 static bool
2724 is_ineligible_successor (insn_t insn, ilist_t p)
2725 {
2726   insn_t prev_insn;
2727 
2728   /* Check if insn is not deleted.  */
2729   if (PREV_INSN (insn) && NEXT_INSN (PREV_INSN (insn)) != insn)
2730     gcc_unreachable ();
2731   else if (NEXT_INSN (insn) && PREV_INSN (NEXT_INSN (insn)) != insn)
2732     gcc_unreachable ();
2733 
2734   /* If it's the first insn visited, then the successor is ok.  */
2735   if (!p)
2736     return false;
2737 
2738   prev_insn = ILIST_INSN (p);
2739 
2740   if (/* a backward edge.  */
2741       INSN_SEQNO (insn) < INSN_SEQNO (prev_insn)
2742       /* is already visited.  */
2743       || (INSN_SEQNO (insn) == INSN_SEQNO (prev_insn)
2744 	  && (ilist_is_in_p (p, insn)
2745               /* We can reach another fence here and still seqno of insn
2746                  would be equal to seqno of prev_insn.  This is possible
2747                  when prev_insn is a previously created bookkeeping copy.
2748                  In that case it'd get a seqno of insn.  Thus, check here
2749                  whether insn is in current fence too.  */
2750               || IN_CURRENT_FENCE_P (insn)))
2751       /* Was already scheduled on this round.  */
2752       || (INSN_SEQNO (insn) > INSN_SEQNO (prev_insn)
2753 	  && IN_CURRENT_FENCE_P (insn))
2754       /* An insn from another fence could also be
2755 	 scheduled earlier even if this insn is not in
2756 	 a fence list right now.  Check INSN_SCHED_CYCLE instead.  */
2757       || (!pipelining_p
2758           && INSN_SCHED_TIMES (insn) > 0))
2759     return true;
2760   else
2761     return false;
2762 }
2763 
2764 /* Computes the av_set below the last bb insn INSN, doing all the 'dirty work'
2765    of handling multiple successors and properly merging its av_sets.  P is
2766    the current path traversed.  WS is the size of lookahead window.
2767    Return the av set computed.  */
2768 static av_set_t
2769 compute_av_set_at_bb_end (insn_t insn, ilist_t p, int ws)
2770 {
2771   struct succs_info *sinfo;
2772   av_set_t expr_in_all_succ_branches = NULL;
2773   int is;
2774   insn_t succ, zero_succ = NULL;
2775   av_set_t av1 = NULL;
2776 
2777   gcc_assert (sel_bb_end_p (insn));
2778 
2779   /* Find different kind of successors needed for correct computing of
2780      SPEC and TARGET_AVAILABLE attributes.  */
2781   sinfo = compute_succs_info (insn, SUCCS_NORMAL);
2782 
2783   /* Debug output.  */
2784   if (sched_verbose >= 6)
2785     {
2786       sel_print ("successors of bb end (%d): ", INSN_UID (insn));
2787       dump_insn_vector (sinfo->succs_ok);
2788       sel_print ("\n");
2789       if (sinfo->succs_ok_n != sinfo->all_succs_n)
2790         sel_print ("real successors num: %d\n", sinfo->all_succs_n);
2791     }
2792 
2793   /* Add insn to the tail of current path.  */
2794   ilist_add (&p, insn);
2795 
2796   FOR_EACH_VEC_ELT (sinfo->succs_ok, is, succ)
2797     {
2798       av_set_t succ_set;
2799 
2800       /* We will edit SUCC_SET and EXPR_SPEC field of its elements.  */
2801       succ_set = compute_av_set_inside_bb (succ, p, ws, true);
2802 
2803       av_set_split_usefulness (succ_set,
2804                                sinfo->probs_ok[is],
2805                                sinfo->all_prob);
2806 
2807       if (sinfo->all_succs_n > 1)
2808 	{
2809           /* Find EXPR'es that came from *all* successors and save them
2810              into expr_in_all_succ_branches.  This set will be used later
2811              for calculating speculation attributes of EXPR'es.  */
2812           if (is == 0)
2813             {
2814               expr_in_all_succ_branches = av_set_copy (succ_set);
2815 
2816               /* Remember the first successor for later. */
2817               zero_succ = succ;
2818             }
2819           else
2820             {
2821               av_set_iterator i;
2822               expr_t expr;
2823 
2824               FOR_EACH_EXPR_1 (expr, i, &expr_in_all_succ_branches)
2825                 if (!av_set_is_in_p (succ_set, EXPR_VINSN (expr)))
2826                   av_set_iter_remove (&i);
2827             }
2828 	}
2829 
2830       /* Union the av_sets.  Check liveness restrictions on target registers
2831          in special case of two successors.  */
2832       if (sinfo->succs_ok_n == 2 && is == 1)
2833         {
2834           basic_block bb0 = BLOCK_FOR_INSN (zero_succ);
2835           basic_block bb1 = BLOCK_FOR_INSN (succ);
2836 
2837           gcc_assert (BB_LV_SET_VALID_P (bb0) && BB_LV_SET_VALID_P (bb1));
2838           av_set_union_and_live (&av1, &succ_set,
2839                                  BB_LV_SET (bb0),
2840                                  BB_LV_SET (bb1),
2841                                  insn);
2842         }
2843       else
2844         av_set_union_and_clear (&av1, &succ_set, insn);
2845     }
2846 
2847   /* Check liveness restrictions via hard way when there are more than
2848      two successors.  */
2849   if (sinfo->succs_ok_n > 2)
2850     FOR_EACH_VEC_ELT (sinfo->succs_ok, is, succ)
2851       {
2852         basic_block succ_bb = BLOCK_FOR_INSN (succ);
2853 
2854         gcc_assert (BB_LV_SET_VALID_P (succ_bb));
2855         mark_unavailable_targets (av1, BB_AV_SET (succ_bb),
2856                                   BB_LV_SET (succ_bb));
2857       }
2858 
2859   /* Finally, check liveness restrictions on paths leaving the region.  */
2860   if (sinfo->all_succs_n > sinfo->succs_ok_n)
2861     FOR_EACH_VEC_ELT (sinfo->succs_other, is, succ)
2862       mark_unavailable_targets
2863         (av1, NULL, BB_LV_SET (BLOCK_FOR_INSN (succ)));
2864 
2865   if (sinfo->all_succs_n > 1)
2866     {
2867       av_set_iterator i;
2868       expr_t expr;
2869 
2870       /* Increase the spec attribute of all EXPR'es that didn't come
2871 	 from all successors.  */
2872       FOR_EACH_EXPR (expr, i, av1)
2873 	if (!av_set_is_in_p (expr_in_all_succ_branches, EXPR_VINSN (expr)))
2874 	  EXPR_SPEC (expr)++;
2875 
2876       av_set_clear (&expr_in_all_succ_branches);
2877 
2878       /* Do not move conditional branches through other
2879 	 conditional branches.  So, remove all conditional
2880 	 branches from av_set if current operator is a conditional
2881 	 branch.  */
2882       av_set_substract_cond_branches (&av1);
2883     }
2884 
2885   ilist_remove (&p);
2886   free_succs_info (sinfo);
2887 
2888   if (sched_verbose >= 6)
2889     {
2890       sel_print ("av_succs (%d): ", INSN_UID (insn));
2891       dump_av_set (av1);
2892       sel_print ("\n");
2893     }
2894 
2895   return av1;
2896 }
2897 
2898 /* This function computes av_set for the FIRST_INSN by dragging valid
2899    av_set through all basic block insns either from the end of basic block
2900    (computed using compute_av_set_at_bb_end) or from the insn on which
2901    MAX_WS was exceeded.  It uses compute_av_set_at_bb_end to compute av_set
2902    below the basic block and handling conditional branches.
2903    FIRST_INSN - the basic block head, P - path consisting of the insns
2904    traversed on the way to the FIRST_INSN (the path is sparse, only bb heads
2905    and bb ends are added to the path), WS - current window size,
2906    NEED_COPY_P - true if we'll make a copy of av_set before returning it.  */
2907 static av_set_t
2908 compute_av_set_inside_bb (insn_t first_insn, ilist_t p, int ws,
2909 			  bool need_copy_p)
2910 {
2911   insn_t cur_insn;
2912   int end_ws = ws;
2913   insn_t bb_end = sel_bb_end (BLOCK_FOR_INSN (first_insn));
2914   insn_t after_bb_end = NEXT_INSN (bb_end);
2915   insn_t last_insn;
2916   av_set_t av = NULL;
2917   basic_block cur_bb = BLOCK_FOR_INSN (first_insn);
2918 
2919   /* Return NULL if insn is not on the legitimate downward path.  */
2920   if (is_ineligible_successor (first_insn, p))
2921     {
2922       if (sched_verbose >= 6)
2923         sel_print ("Insn %d is ineligible_successor\n", INSN_UID (first_insn));
2924 
2925       return NULL;
2926     }
2927 
2928   /* If insn already has valid av(insn) computed, just return it.  */
2929   if (AV_SET_VALID_P (first_insn))
2930     {
2931       av_set_t av_set;
2932 
2933       if (sel_bb_head_p (first_insn))
2934 	av_set = BB_AV_SET (BLOCK_FOR_INSN (first_insn));
2935       else
2936 	av_set = NULL;
2937 
2938       if (sched_verbose >= 6)
2939         {
2940           sel_print ("Insn %d has a valid av set: ", INSN_UID (first_insn));
2941           dump_av_set (av_set);
2942           sel_print ("\n");
2943         }
2944 
2945       return need_copy_p ? av_set_copy (av_set) : av_set;
2946     }
2947 
2948   ilist_add (&p, first_insn);
2949 
2950   /* As the result after this loop have completed, in LAST_INSN we'll
2951      have the insn which has valid av_set to start backward computation
2952      from: it either will be NULL because on it the window size was exceeded
2953      or other valid av_set as returned by compute_av_set for the last insn
2954      of the basic block.  */
2955   for (last_insn = first_insn; last_insn != after_bb_end;
2956        last_insn = NEXT_INSN (last_insn))
2957     {
2958       /* We may encounter valid av_set not only on bb_head, but also on
2959 	 those insns on which previously MAX_WS was exceeded.  */
2960       if (AV_SET_VALID_P (last_insn))
2961 	{
2962           if (sched_verbose >= 6)
2963             sel_print ("Insn %d has a valid empty av set\n", INSN_UID (last_insn));
2964 	  break;
2965 	}
2966 
2967       /* The special case: the last insn of the BB may be an
2968          ineligible_successor due to its SEQ_NO that was set on
2969 	 it as a bookkeeping.  */
2970       if (last_insn != first_insn
2971           && is_ineligible_successor (last_insn, p))
2972 	{
2973           if (sched_verbose >= 6)
2974             sel_print ("Insn %d is ineligible_successor\n", INSN_UID (last_insn));
2975 	  break;
2976 	}
2977 
2978       if (DEBUG_INSN_P (last_insn))
2979 	continue;
2980 
2981       if (end_ws > max_ws)
2982 	{
2983 	  /* We can reach max lookahead size at bb_header, so clean av_set
2984 	     first.  */
2985 	  INSN_WS_LEVEL (last_insn) = global_level;
2986 
2987 	  if (sched_verbose >= 6)
2988             sel_print ("Insn %d is beyond the software lookahead window size\n",
2989                        INSN_UID (last_insn));
2990 	  break;
2991 	}
2992 
2993       end_ws++;
2994     }
2995 
2996   /* Get the valid av_set into AV above the LAST_INSN to start backward
2997      computation from.  It either will be empty av_set or av_set computed from
2998      the successors on the last insn of the current bb.  */
2999   if (last_insn != after_bb_end)
3000     {
3001       av = NULL;
3002 
3003       /* This is needed only to obtain av_sets that are identical to
3004          those computed by the old compute_av_set version.  */
3005       if (last_insn == first_insn && !INSN_NOP_P (last_insn))
3006         av_set_add (&av, INSN_EXPR (last_insn));
3007     }
3008   else
3009     /* END_WS is always already increased by 1 if LAST_INSN == AFTER_BB_END.  */
3010     av = compute_av_set_at_bb_end (bb_end, p, end_ws);
3011 
3012   /* Compute av_set in AV starting from below the LAST_INSN up to
3013      location above the FIRST_INSN.  */
3014   for (cur_insn = PREV_INSN (last_insn); cur_insn != PREV_INSN (first_insn);
3015        cur_insn = PREV_INSN (cur_insn))
3016     if (!INSN_NOP_P (cur_insn))
3017       {
3018         expr_t expr;
3019 
3020         moveup_set_expr (&av, cur_insn, false);
3021 
3022         /* If the expression for CUR_INSN is already in the set,
3023            replace it by the new one.  */
3024         expr = av_set_lookup (av, INSN_VINSN (cur_insn));
3025         if (expr != NULL)
3026           {
3027             clear_expr (expr);
3028             copy_expr (expr, INSN_EXPR (cur_insn));
3029           }
3030         else
3031           av_set_add (&av, INSN_EXPR (cur_insn));
3032       }
3033 
3034   /* Clear stale bb_av_set.  */
3035   if (sel_bb_head_p (first_insn))
3036     {
3037       av_set_clear (&BB_AV_SET (cur_bb));
3038       BB_AV_SET (cur_bb) = need_copy_p ? av_set_copy (av) : av;
3039       BB_AV_LEVEL (cur_bb) = global_level;
3040     }
3041 
3042   if (sched_verbose >= 6)
3043     {
3044       sel_print ("Computed av set for insn %d: ", INSN_UID (first_insn));
3045       dump_av_set (av);
3046       sel_print ("\n");
3047     }
3048 
3049   ilist_remove (&p);
3050   return av;
3051 }
3052 
3053 /* Compute av set before INSN.
3054    INSN - the current operation (actual rtx INSN)
3055    P - the current path, which is list of insns visited so far
3056    WS - software lookahead window size.
3057    UNIQUE_P - TRUE, if returned av_set will be changed, hence
3058    if we want to save computed av_set in s_i_d, we should make a copy of it.
3059 
3060    In the resulting set we will have only expressions that don't have delay
3061    stalls and nonsubstitutable dependences.  */
3062 static av_set_t
3063 compute_av_set (insn_t insn, ilist_t p, int ws, bool unique_p)
3064 {
3065   return compute_av_set_inside_bb (insn, p, ws, unique_p);
3066 }
3067 
3068 /* Propagate a liveness set LV through INSN.  */
3069 static void
3070 propagate_lv_set (regset lv, insn_t insn)
3071 {
3072   gcc_assert (INSN_P (insn));
3073 
3074   if (INSN_NOP_P (insn))
3075     return;
3076 
3077   df_simulate_one_insn_backwards (BLOCK_FOR_INSN (insn), insn, lv);
3078 }
3079 
3080 /* Return livness set at the end of BB.  */
3081 static regset
3082 compute_live_after_bb (basic_block bb)
3083 {
3084   edge e;
3085   edge_iterator ei;
3086   regset lv = get_clear_regset_from_pool ();
3087 
3088   gcc_assert (!ignore_first);
3089 
3090   FOR_EACH_EDGE (e, ei, bb->succs)
3091     if (sel_bb_empty_p (e->dest))
3092       {
3093         if (! BB_LV_SET_VALID_P (e->dest))
3094           {
3095             gcc_unreachable ();
3096             gcc_assert (BB_LV_SET (e->dest) == NULL);
3097             BB_LV_SET (e->dest) = compute_live_after_bb (e->dest);
3098             BB_LV_SET_VALID_P (e->dest) = true;
3099           }
3100         IOR_REG_SET (lv, BB_LV_SET (e->dest));
3101       }
3102     else
3103       IOR_REG_SET (lv, compute_live (sel_bb_head (e->dest)));
3104 
3105   return lv;
3106 }
3107 
3108 /* Compute the set of all live registers at the point before INSN and save
3109    it at INSN if INSN is bb header.  */
3110 regset
3111 compute_live (insn_t insn)
3112 {
3113   basic_block bb = BLOCK_FOR_INSN (insn);
3114   insn_t final, temp;
3115   regset lv;
3116 
3117   /* Return the valid set if we're already on it.  */
3118   if (!ignore_first)
3119     {
3120       regset src = NULL;
3121 
3122       if (sel_bb_head_p (insn) && BB_LV_SET_VALID_P (bb))
3123         src = BB_LV_SET (bb);
3124       else
3125         {
3126           gcc_assert (in_current_region_p (bb));
3127           if (INSN_LIVE_VALID_P (insn))
3128             src = INSN_LIVE (insn);
3129         }
3130 
3131       if (src)
3132 	{
3133 	  lv = get_regset_from_pool ();
3134 	  COPY_REG_SET (lv, src);
3135 
3136           if (sel_bb_head_p (insn) && ! BB_LV_SET_VALID_P (bb))
3137             {
3138               COPY_REG_SET (BB_LV_SET (bb), lv);
3139               BB_LV_SET_VALID_P (bb) = true;
3140             }
3141 
3142 	  return_regset_to_pool (lv);
3143 	  return lv;
3144 	}
3145     }
3146 
3147   /* We've skipped the wrong lv_set.  Don't skip the right one.  */
3148   ignore_first = false;
3149   gcc_assert (in_current_region_p (bb));
3150 
3151   /* Find a valid LV set in this block or below, if needed.
3152      Start searching from the next insn: either ignore_first is true, or
3153      INSN doesn't have a correct live set.  */
3154   temp = NEXT_INSN (insn);
3155   final = NEXT_INSN (BB_END (bb));
3156   while (temp != final && ! INSN_LIVE_VALID_P (temp))
3157     temp = NEXT_INSN (temp);
3158   if (temp == final)
3159     {
3160       lv = compute_live_after_bb (bb);
3161       temp = PREV_INSN (temp);
3162     }
3163   else
3164     {
3165       lv = get_regset_from_pool ();
3166       COPY_REG_SET (lv, INSN_LIVE (temp));
3167     }
3168 
3169   /* Put correct lv sets on the insns which have bad sets.  */
3170   final = PREV_INSN (insn);
3171   while (temp != final)
3172     {
3173       propagate_lv_set (lv, temp);
3174       COPY_REG_SET (INSN_LIVE (temp), lv);
3175       INSN_LIVE_VALID_P (temp) = true;
3176       temp = PREV_INSN (temp);
3177     }
3178 
3179   /* Also put it in a BB.  */
3180   if (sel_bb_head_p (insn))
3181     {
3182       basic_block bb = BLOCK_FOR_INSN (insn);
3183 
3184       COPY_REG_SET (BB_LV_SET (bb), lv);
3185       BB_LV_SET_VALID_P (bb) = true;
3186     }
3187 
3188   /* We return LV to the pool, but will not clear it there.  Thus we can
3189      legimatelly use LV till the next use of regset_pool_get ().  */
3190   return_regset_to_pool (lv);
3191   return lv;
3192 }
3193 
3194 /* Update liveness sets for INSN.  */
3195 static inline void
3196 update_liveness_on_insn (rtx_insn *insn)
3197 {
3198   ignore_first = true;
3199   compute_live (insn);
3200 }
3201 
3202 /* Compute liveness below INSN and write it into REGS.  */
3203 static inline void
3204 compute_live_below_insn (rtx_insn *insn, regset regs)
3205 {
3206   rtx_insn *succ;
3207   succ_iterator si;
3208 
3209   FOR_EACH_SUCC_1 (succ, si, insn, SUCCS_ALL)
3210     IOR_REG_SET (regs, compute_live (succ));
3211 }
3212 
3213 /* Update the data gathered in av and lv sets starting from INSN.  */
3214 static void
3215 update_data_sets (rtx_insn *insn)
3216 {
3217   update_liveness_on_insn (insn);
3218   if (sel_bb_head_p (insn))
3219     {
3220       gcc_assert (AV_LEVEL (insn) != 0);
3221       BB_AV_LEVEL (BLOCK_FOR_INSN (insn)) = -1;
3222       compute_av_set (insn, NULL, 0, 0);
3223     }
3224 }
3225 
3226 
3227 /* Helper for move_op () and find_used_regs ().
3228    Return speculation type for which a check should be created on the place
3229    of INSN.  EXPR is one of the original ops we are searching for.  */
3230 static ds_t
3231 get_spec_check_type_for_insn (insn_t insn, expr_t expr)
3232 {
3233   ds_t to_check_ds;
3234   ds_t already_checked_ds = EXPR_SPEC_DONE_DS (INSN_EXPR (insn));
3235 
3236   to_check_ds = EXPR_SPEC_TO_CHECK_DS (expr);
3237 
3238   if (targetm.sched.get_insn_checked_ds)
3239     already_checked_ds |= targetm.sched.get_insn_checked_ds (insn);
3240 
3241   if (spec_info != NULL
3242       && (spec_info->flags & SEL_SCHED_SPEC_DONT_CHECK_CONTROL))
3243     already_checked_ds |= BEGIN_CONTROL;
3244 
3245   already_checked_ds = ds_get_speculation_types (already_checked_ds);
3246 
3247   to_check_ds &= ~already_checked_ds;
3248 
3249   return to_check_ds;
3250 }
3251 
3252 /* Find the set of registers that are unavailable for storing expres
3253    while moving ORIG_OPS up on the path starting from INSN due to
3254    liveness (USED_REGS) or hardware restrictions (REG_RENAME_P).
3255 
3256    All the original operations found during the traversal are saved in the
3257    ORIGINAL_INSNS list.
3258 
3259    REG_RENAME_P denotes the set of hardware registers that
3260    can not be used with renaming due to the register class restrictions,
3261    mode restrictions and other (the register we'll choose should be
3262    compatible class with the original uses, shouldn't be in call_used_regs,
3263    should be HARD_REGNO_RENAME_OK etc).
3264 
3265    Returns TRUE if we've found all original insns, FALSE otherwise.
3266 
3267    This function utilizes code_motion_path_driver (formerly find_used_regs_1)
3268    to traverse the code motion paths.  This helper function finds registers
3269    that are not available for storing expres while moving ORIG_OPS up on the
3270    path starting from INSN.  A register considered as used on the moving path,
3271    if one of the following conditions is not satisfied:
3272 
3273       (1) a register not set or read on any path from xi to an instance of
3274 	  the original operation,
3275       (2) not among the live registers of the point immediately following the
3276           first original operation on a given downward path, except for the
3277 	  original target register of the operation,
3278       (3) not live on the other path of any conditional branch that is passed
3279 	  by the operation, in case original operations are not present on
3280 	  both paths of the conditional branch.
3281 
3282    All the original operations found during the traversal are saved in the
3283    ORIGINAL_INSNS list.
3284 
3285    REG_RENAME_P->CROSSES_CALL is true, if there is a call insn on the path
3286    from INSN to original insn. In this case CALL_USED_REG_SET will be added
3287    to unavailable hard regs at the point original operation is found.  */
3288 
3289 static bool
3290 find_used_regs (insn_t insn, av_set_t orig_ops, regset used_regs,
3291 		struct reg_rename  *reg_rename_p, def_list_t *original_insns)
3292 {
3293   def_list_iterator i;
3294   def_t def;
3295   int res;
3296   bool needs_spec_check_p = false;
3297   expr_t expr;
3298   av_set_iterator expr_iter;
3299   struct fur_static_params sparams;
3300   struct cmpd_local_params lparams;
3301 
3302   /* We haven't visited any blocks yet.  */
3303   bitmap_clear (code_motion_visited_blocks);
3304 
3305   /* Init parameters for code_motion_path_driver.  */
3306   sparams.crosses_call = false;
3307   sparams.original_insns = original_insns;
3308   sparams.used_regs = used_regs;
3309 
3310   /* Set the appropriate hooks and data.  */
3311   code_motion_path_driver_info = &fur_hooks;
3312 
3313   res = code_motion_path_driver (insn, orig_ops, NULL, &lparams, &sparams);
3314 
3315   reg_rename_p->crosses_call |= sparams.crosses_call;
3316 
3317   gcc_assert (res == 1);
3318   gcc_assert (original_insns && *original_insns);
3319 
3320   /* ??? We calculate whether an expression needs a check when computing
3321      av sets.  This information is not as precise as it could be due to
3322      merging this bit in merge_expr.  We can do better in find_used_regs,
3323      but we want to avoid multiple traversals of the same code motion
3324      paths.  */
3325   FOR_EACH_EXPR (expr, expr_iter, orig_ops)
3326     needs_spec_check_p |= EXPR_NEEDS_SPEC_CHECK_P (expr);
3327 
3328   /* Mark hardware regs in REG_RENAME_P that are not suitable
3329      for renaming expr in INSN due to hardware restrictions (register class,
3330      modes compatibility etc).  */
3331   FOR_EACH_DEF (def, i, *original_insns)
3332     {
3333       vinsn_t vinsn = INSN_VINSN (def->orig_insn);
3334 
3335       if (VINSN_SEPARABLE_P (vinsn))
3336 	mark_unavailable_hard_regs (def, reg_rename_p, used_regs);
3337 
3338       /* Do not allow clobbering of ld.[sa] address in case some of the
3339          original operations need a check.  */
3340       if (needs_spec_check_p)
3341 	IOR_REG_SET (used_regs, VINSN_REG_USES (vinsn));
3342     }
3343 
3344   return true;
3345 }
3346 
3347 
3348 /* Functions to choose the best insn from available ones.  */
3349 
3350 /* Adjusts the priority for EXPR using the backend *_adjust_priority hook.  */
3351 static int
3352 sel_target_adjust_priority (expr_t expr)
3353 {
3354   int priority = EXPR_PRIORITY (expr);
3355   int new_priority;
3356 
3357   if (targetm.sched.adjust_priority)
3358     new_priority = targetm.sched.adjust_priority (EXPR_INSN_RTX (expr), priority);
3359   else
3360     new_priority = priority;
3361 
3362   /* If the priority has changed, adjust EXPR_PRIORITY_ADJ accordingly.  */
3363   EXPR_PRIORITY_ADJ (expr) = new_priority - EXPR_PRIORITY (expr);
3364 
3365   gcc_assert (EXPR_PRIORITY_ADJ (expr) >= 0);
3366 
3367   if (sched_verbose >= 4)
3368     sel_print ("sel_target_adjust_priority: insn %d,  %d+%d = %d.\n",
3369 	       INSN_UID (EXPR_INSN_RTX (expr)), EXPR_PRIORITY (expr),
3370 	       EXPR_PRIORITY_ADJ (expr), new_priority);
3371 
3372   return new_priority;
3373 }
3374 
3375 /* Rank two available exprs for schedule.  Never return 0 here.  */
3376 static int
3377 sel_rank_for_schedule (const void *x, const void *y)
3378 {
3379   expr_t tmp = *(const expr_t *) y;
3380   expr_t tmp2 = *(const expr_t *) x;
3381   insn_t tmp_insn, tmp2_insn;
3382   vinsn_t tmp_vinsn, tmp2_vinsn;
3383   int val;
3384 
3385   tmp_vinsn = EXPR_VINSN (tmp);
3386   tmp2_vinsn = EXPR_VINSN (tmp2);
3387   tmp_insn = EXPR_INSN_RTX (tmp);
3388   tmp2_insn = EXPR_INSN_RTX (tmp2);
3389 
3390   /* Schedule debug insns as early as possible.  */
3391   if (DEBUG_INSN_P (tmp_insn) && !DEBUG_INSN_P (tmp2_insn))
3392     return -1;
3393   else if (DEBUG_INSN_P (tmp2_insn))
3394     return 1;
3395 
3396   /* Prefer SCHED_GROUP_P insns to any others.  */
3397   if (SCHED_GROUP_P (tmp_insn) != SCHED_GROUP_P (tmp2_insn))
3398     {
3399       if (VINSN_UNIQUE_P (tmp_vinsn) && VINSN_UNIQUE_P (tmp2_vinsn))
3400         return SCHED_GROUP_P (tmp2_insn) ? 1 : -1;
3401 
3402       /* Now uniqueness means SCHED_GROUP_P is set, because schedule groups
3403          cannot be cloned.  */
3404       if (VINSN_UNIQUE_P (tmp2_vinsn))
3405         return 1;
3406       return -1;
3407     }
3408 
3409   /* Discourage scheduling of speculative checks.  */
3410   val = (sel_insn_is_speculation_check (tmp_insn)
3411 	 - sel_insn_is_speculation_check (tmp2_insn));
3412   if (val)
3413     return val;
3414 
3415   /* Prefer not scheduled insn over scheduled one.  */
3416   if (EXPR_SCHED_TIMES (tmp) > 0 || EXPR_SCHED_TIMES (tmp2) > 0)
3417     {
3418       val = EXPR_SCHED_TIMES (tmp) - EXPR_SCHED_TIMES (tmp2);
3419       if (val)
3420 	return val;
3421     }
3422 
3423   /* Prefer jump over non-jump instruction.  */
3424   if (control_flow_insn_p (tmp_insn) && !control_flow_insn_p (tmp2_insn))
3425     return -1;
3426   else if (control_flow_insn_p (tmp2_insn) && !control_flow_insn_p (tmp_insn))
3427     return 1;
3428 
3429   /* Prefer an expr with greater priority.  */
3430   if (EXPR_USEFULNESS (tmp) != 0 && EXPR_USEFULNESS (tmp2) != 0)
3431     {
3432       int p2 = EXPR_PRIORITY (tmp2) + EXPR_PRIORITY_ADJ (tmp2),
3433           p1 = EXPR_PRIORITY (tmp) + EXPR_PRIORITY_ADJ (tmp);
3434 
3435       val = p2 * EXPR_USEFULNESS (tmp2) - p1 * EXPR_USEFULNESS (tmp);
3436     }
3437   else
3438     val = EXPR_PRIORITY (tmp2) - EXPR_PRIORITY (tmp)
3439 	  + EXPR_PRIORITY_ADJ (tmp2) - EXPR_PRIORITY_ADJ (tmp);
3440   if (val)
3441     return val;
3442 
3443   if (spec_info != NULL && spec_info->mask != 0)
3444     /* This code was taken from haifa-sched.c: rank_for_schedule ().  */
3445     {
3446       ds_t ds1, ds2;
3447       dw_t dw1, dw2;
3448       int dw;
3449 
3450       ds1 = EXPR_SPEC_DONE_DS (tmp);
3451       if (ds1)
3452 	dw1 = ds_weak (ds1);
3453       else
3454 	dw1 = NO_DEP_WEAK;
3455 
3456       ds2 = EXPR_SPEC_DONE_DS (tmp2);
3457       if (ds2)
3458 	dw2 = ds_weak (ds2);
3459       else
3460 	dw2 = NO_DEP_WEAK;
3461 
3462       dw = dw2 - dw1;
3463       if (dw > (NO_DEP_WEAK / 8) || dw < -(NO_DEP_WEAK / 8))
3464 	return dw;
3465     }
3466 
3467   /* Prefer an old insn to a bookkeeping insn.  */
3468   if (INSN_UID (tmp_insn) < first_emitted_uid
3469       && INSN_UID (tmp2_insn) >= first_emitted_uid)
3470     return -1;
3471   if (INSN_UID (tmp_insn) >= first_emitted_uid
3472       && INSN_UID (tmp2_insn) < first_emitted_uid)
3473     return 1;
3474 
3475   /* Prefer an insn with smaller UID, as a last resort.
3476      We can't safely use INSN_LUID as it is defined only for those insns
3477      that are in the stream.  */
3478   return INSN_UID (tmp_insn) - INSN_UID (tmp2_insn);
3479 }
3480 
3481 /* Filter out expressions from av set pointed to by AV_PTR
3482    that are pipelined too many times.  */
3483 static void
3484 process_pipelined_exprs (av_set_t *av_ptr)
3485 {
3486   expr_t expr;
3487   av_set_iterator si;
3488 
3489   /* Don't pipeline already pipelined code as that would increase
3490      number of unnecessary register moves.  */
3491   FOR_EACH_EXPR_1 (expr, si, av_ptr)
3492     {
3493       if (EXPR_SCHED_TIMES (expr)
3494 	  >= PARAM_VALUE (PARAM_SELSCHED_MAX_SCHED_TIMES))
3495 	av_set_iter_remove (&si);
3496     }
3497 }
3498 
3499 /* Filter speculative insns from AV_PTR if we don't want them.  */
3500 static void
3501 process_spec_exprs (av_set_t *av_ptr)
3502 {
3503   expr_t expr;
3504   av_set_iterator si;
3505 
3506   if (spec_info == NULL)
3507     return;
3508 
3509   /* Scan *AV_PTR to find out if we want to consider speculative
3510      instructions for scheduling.  */
3511   FOR_EACH_EXPR_1 (expr, si, av_ptr)
3512     {
3513       ds_t ds;
3514 
3515       ds = EXPR_SPEC_DONE_DS (expr);
3516 
3517       /* The probability of a success is too low - don't speculate.  */
3518       if ((ds & SPECULATIVE)
3519           && (ds_weak (ds) < spec_info->data_weakness_cutoff
3520               || EXPR_USEFULNESS (expr) < spec_info->control_weakness_cutoff
3521 	      || (pipelining_p && false
3522 		  && (ds & DATA_SPEC)
3523 		  && (ds & CONTROL_SPEC))))
3524         {
3525           av_set_iter_remove (&si);
3526           continue;
3527         }
3528     }
3529 }
3530 
3531 /* Search for any use-like insns in AV_PTR and decide on scheduling
3532    them.  Return one when found, and NULL otherwise.
3533    Note that we check here whether a USE could be scheduled to avoid
3534    an infinite loop later.  */
3535 static expr_t
3536 process_use_exprs (av_set_t *av_ptr)
3537 {
3538   expr_t expr;
3539   av_set_iterator si;
3540   bool uses_present_p = false;
3541   bool try_uses_p = true;
3542 
3543   FOR_EACH_EXPR_1 (expr, si, av_ptr)
3544     {
3545       /* This will also initialize INSN_CODE for later use.  */
3546       if (recog_memoized (EXPR_INSN_RTX (expr)) < 0)
3547         {
3548           /* If we have a USE in *AV_PTR that was not scheduled yet,
3549              do so because it will do good only.  */
3550           if (EXPR_SCHED_TIMES (expr) <= 0)
3551             {
3552               if (EXPR_TARGET_AVAILABLE (expr) == 1)
3553                 return expr;
3554 
3555               av_set_iter_remove (&si);
3556             }
3557           else
3558             {
3559               gcc_assert (pipelining_p);
3560 
3561               uses_present_p = true;
3562             }
3563         }
3564       else
3565         try_uses_p = false;
3566     }
3567 
3568   if (uses_present_p)
3569     {
3570       /* If we don't want to schedule any USEs right now and we have some
3571            in *AV_PTR, remove them, else just return the first one found.  */
3572       if (!try_uses_p)
3573         {
3574           FOR_EACH_EXPR_1 (expr, si, av_ptr)
3575             if (INSN_CODE (EXPR_INSN_RTX (expr)) < 0)
3576               av_set_iter_remove (&si);
3577         }
3578       else
3579         {
3580           FOR_EACH_EXPR_1 (expr, si, av_ptr)
3581             {
3582               gcc_assert (INSN_CODE (EXPR_INSN_RTX (expr)) < 0);
3583 
3584               if (EXPR_TARGET_AVAILABLE (expr) == 1)
3585                 return expr;
3586 
3587               av_set_iter_remove (&si);
3588             }
3589         }
3590     }
3591 
3592   return NULL;
3593 }
3594 
3595 /* Lookup EXPR in VINSN_VEC and return TRUE if found.  Also check patterns from
3596    EXPR's history of changes.  */
3597 static bool
3598 vinsn_vec_has_expr_p (vinsn_vec_t vinsn_vec, expr_t expr)
3599 {
3600   vinsn_t vinsn, expr_vinsn;
3601   int n;
3602   unsigned i;
3603 
3604   /* Start with checking expr itself and then proceed with all the old forms
3605      of expr taken from its history vector.  */
3606   for (i = 0, expr_vinsn = EXPR_VINSN (expr);
3607        expr_vinsn;
3608        expr_vinsn = (i < EXPR_HISTORY_OF_CHANGES (expr).length ()
3609 		     ? EXPR_HISTORY_OF_CHANGES (expr)[i++].old_expr_vinsn
3610 		     : NULL))
3611     FOR_EACH_VEC_ELT (vinsn_vec, n, vinsn)
3612       if (VINSN_SEPARABLE_P (vinsn))
3613 	{
3614 	  if (vinsn_equal_p (vinsn, expr_vinsn))
3615 	    return true;
3616 	}
3617       else
3618 	{
3619 	  /* For non-separable instructions, the blocking insn can have
3620 	     another pattern due to substitution, and we can't choose
3621 	     different register as in the above case.  Check all registers
3622 	     being written instead.  */
3623 	  if (bitmap_intersect_p (VINSN_REG_SETS (vinsn),
3624 				  VINSN_REG_SETS (expr_vinsn)))
3625 	    return true;
3626 	}
3627 
3628   return false;
3629 }
3630 
3631 #ifdef ENABLE_CHECKING
3632 /* Return true if either of expressions from ORIG_OPS can be blocked
3633    by previously created bookkeeping code.  STATIC_PARAMS points to static
3634    parameters of move_op.  */
3635 static bool
3636 av_set_could_be_blocked_by_bookkeeping_p (av_set_t orig_ops, void *static_params)
3637 {
3638   expr_t expr;
3639   av_set_iterator iter;
3640   moveop_static_params_p sparams;
3641 
3642   /* This checks that expressions in ORIG_OPS are not blocked by bookkeeping
3643      created while scheduling on another fence.  */
3644   FOR_EACH_EXPR (expr, iter, orig_ops)
3645     if (vinsn_vec_has_expr_p (vec_bookkeeping_blocked_vinsns, expr))
3646       return true;
3647 
3648   gcc_assert (code_motion_path_driver_info == &move_op_hooks);
3649   sparams = (moveop_static_params_p) static_params;
3650 
3651   /* Expressions can be also blocked by bookkeeping created during current
3652      move_op.  */
3653   if (bitmap_bit_p (current_copies, INSN_UID (sparams->failed_insn)))
3654     FOR_EACH_EXPR (expr, iter, orig_ops)
3655       if (moveup_expr_cached (expr, sparams->failed_insn, false) != MOVEUP_EXPR_NULL)
3656         return true;
3657 
3658   /* Expressions in ORIG_OPS may have wrong destination register due to
3659      renaming.  Check with the right register instead.  */
3660   if (sparams->dest && REG_P (sparams->dest))
3661     {
3662       rtx reg = sparams->dest;
3663       vinsn_t failed_vinsn = INSN_VINSN (sparams->failed_insn);
3664 
3665       if (register_unavailable_p (VINSN_REG_SETS (failed_vinsn), reg)
3666 	  || register_unavailable_p (VINSN_REG_USES (failed_vinsn), reg)
3667 	  || register_unavailable_p (VINSN_REG_CLOBBERS (failed_vinsn), reg))
3668 	return true;
3669     }
3670 
3671   return false;
3672 }
3673 #endif
3674 
3675 /* Clear VINSN_VEC and detach vinsns.  */
3676 static void
3677 vinsn_vec_clear (vinsn_vec_t *vinsn_vec)
3678 {
3679   unsigned len = vinsn_vec->length ();
3680   if (len > 0)
3681     {
3682       vinsn_t vinsn;
3683       int n;
3684 
3685       FOR_EACH_VEC_ELT (*vinsn_vec, n, vinsn)
3686         vinsn_detach (vinsn);
3687       vinsn_vec->block_remove (0, len);
3688     }
3689 }
3690 
3691 /* Add the vinsn of EXPR to the VINSN_VEC.  */
3692 static void
3693 vinsn_vec_add (vinsn_vec_t *vinsn_vec, expr_t expr)
3694 {
3695   vinsn_attach (EXPR_VINSN (expr));
3696   vinsn_vec->safe_push (EXPR_VINSN (expr));
3697 }
3698 
3699 /* Free the vector representing blocked expressions.  */
3700 static void
3701 vinsn_vec_free (vinsn_vec_t &vinsn_vec)
3702 {
3703   vinsn_vec.release ();
3704 }
3705 
3706 /* Increase EXPR_PRIORITY_ADJ for INSN by AMOUNT.  */
3707 
3708 void sel_add_to_insn_priority (rtx insn, int amount)
3709 {
3710   EXPR_PRIORITY_ADJ (INSN_EXPR (insn)) += amount;
3711 
3712   if (sched_verbose >= 2)
3713     sel_print ("sel_add_to_insn_priority: insn %d, by %d (now %d+%d).\n",
3714 	       INSN_UID (insn), amount, EXPR_PRIORITY (INSN_EXPR (insn)),
3715 	       EXPR_PRIORITY_ADJ (INSN_EXPR (insn)));
3716 }
3717 
3718 /* Turn AV into a vector, filter inappropriate insns and sort it.  Return
3719    true if there is something to schedule.  BNDS and FENCE are current
3720    boundaries and fence, respectively.  If we need to stall for some cycles
3721    before an expr from AV would become available, write this number to
3722    *PNEED_STALL.  */
3723 static bool
3724 fill_vec_av_set (av_set_t av, blist_t bnds, fence_t fence,
3725                  int *pneed_stall)
3726 {
3727   av_set_iterator si;
3728   expr_t expr;
3729   int sched_next_worked = 0, stalled, n;
3730   static int av_max_prio, est_ticks_till_branch;
3731   int min_need_stall = -1;
3732   deps_t dc = BND_DC (BLIST_BND (bnds));
3733 
3734   /* Bail out early when the ready list contained only USEs/CLOBBERs that are
3735      already scheduled.  */
3736   if (av == NULL)
3737     return false;
3738 
3739   /* Empty vector from the previous stuff.  */
3740   if (vec_av_set.length () > 0)
3741     vec_av_set.block_remove (0, vec_av_set.length ());
3742 
3743   /* Turn the set into a vector for sorting and call sel_target_adjust_priority
3744      for each insn.  */
3745   gcc_assert (vec_av_set.is_empty ());
3746   FOR_EACH_EXPR (expr, si, av)
3747     {
3748       vec_av_set.safe_push (expr);
3749 
3750       gcc_assert (EXPR_PRIORITY_ADJ (expr) == 0 || *pneed_stall);
3751 
3752       /* Adjust priority using target backend hook.  */
3753       sel_target_adjust_priority (expr);
3754     }
3755 
3756   /* Sort the vector.  */
3757   vec_av_set.qsort (sel_rank_for_schedule);
3758 
3759   /* We record maximal priority of insns in av set for current instruction
3760      group.  */
3761   if (FENCE_STARTS_CYCLE_P (fence))
3762     av_max_prio = est_ticks_till_branch = INT_MIN;
3763 
3764   /* Filter out inappropriate expressions.  Loop's direction is reversed to
3765      visit "best" instructions first.  We assume that vec::unordered_remove
3766      moves last element in place of one being deleted.  */
3767   for (n = vec_av_set.length () - 1, stalled = 0; n >= 0; n--)
3768     {
3769       expr_t expr = vec_av_set[n];
3770       insn_t insn = EXPR_INSN_RTX (expr);
3771       signed char target_available;
3772       bool is_orig_reg_p = true;
3773       int need_cycles, new_prio;
3774       bool fence_insn_p = INSN_UID (insn) == INSN_UID (FENCE_INSN (fence));
3775 
3776       /* Don't allow any insns other than from SCHED_GROUP if we have one.  */
3777       if (FENCE_SCHED_NEXT (fence) && insn != FENCE_SCHED_NEXT (fence))
3778         {
3779           vec_av_set.unordered_remove (n);
3780           continue;
3781         }
3782 
3783       /* Set number of sched_next insns (just in case there
3784          could be several).  */
3785       if (FENCE_SCHED_NEXT (fence))
3786         sched_next_worked++;
3787 
3788       /* Check all liveness requirements and try renaming.
3789          FIXME: try to minimize calls to this.  */
3790       target_available = EXPR_TARGET_AVAILABLE (expr);
3791 
3792       /* If insn was already scheduled on the current fence,
3793 	 set TARGET_AVAILABLE to -1 no matter what expr's attribute says.  */
3794       if (vinsn_vec_has_expr_p (vec_target_unavailable_vinsns, expr)
3795 	  && !fence_insn_p)
3796 	target_available = -1;
3797 
3798       /* If the availability of the EXPR is invalidated by the insertion of
3799 	 bookkeeping earlier, make sure that we won't choose this expr for
3800 	 scheduling if it's not separable, and if it is separable, then
3801 	 we have to recompute the set of available registers for it.  */
3802       if (vinsn_vec_has_expr_p (vec_bookkeeping_blocked_vinsns, expr))
3803 	{
3804           vec_av_set.unordered_remove (n);
3805           if (sched_verbose >= 4)
3806             sel_print ("Expr %d is blocked by bookkeeping inserted earlier\n",
3807                        INSN_UID (insn));
3808           continue;
3809         }
3810 
3811       if (target_available == true)
3812 	{
3813           /* Do nothing -- we can use an existing register.  */
3814 	  is_orig_reg_p = EXPR_SEPARABLE_P (expr);
3815         }
3816       else if (/* Non-separable instruction will never
3817                   get another register. */
3818                (target_available == false
3819                 && !EXPR_SEPARABLE_P (expr))
3820                /* Don't try to find a register for low-priority expression.  */
3821                || (int) vec_av_set.length () - 1 - n >= max_insns_to_rename
3822                /* ??? FIXME: Don't try to rename data speculation.  */
3823                || (EXPR_SPEC_DONE_DS (expr) & BEGIN_DATA)
3824                || ! find_best_reg_for_expr (expr, bnds, &is_orig_reg_p))
3825         {
3826           vec_av_set.unordered_remove (n);
3827           if (sched_verbose >= 4)
3828             sel_print ("Expr %d has no suitable target register\n",
3829                        INSN_UID (insn));
3830 
3831 	  /* A fence insn should not get here.  */
3832 	  gcc_assert (!fence_insn_p);
3833 	  continue;
3834         }
3835 
3836       /* At this point a fence insn should always be available.  */
3837       gcc_assert (!fence_insn_p
3838 		  || INSN_UID (FENCE_INSN (fence)) == INSN_UID (EXPR_INSN_RTX (expr)));
3839 
3840       /* Filter expressions that need to be renamed or speculated when
3841 	 pipelining, because compensating register copies or speculation
3842 	 checks are likely to be placed near the beginning of the loop,
3843 	 causing a stall.  */
3844       if (pipelining_p && EXPR_ORIG_SCHED_CYCLE (expr) > 0
3845 	  && (!is_orig_reg_p || EXPR_SPEC_DONE_DS (expr) != 0))
3846 	{
3847 	  /* Estimation of number of cycles until loop branch for
3848 	     renaming/speculation to be successful.  */
3849 	  int need_n_ticks_till_branch = sel_vinsn_cost (EXPR_VINSN (expr));
3850 
3851 	  if ((int) current_loop_nest->ninsns < 9)
3852 	    {
3853 	      vec_av_set.unordered_remove (n);
3854 	      if (sched_verbose >= 4)
3855 		sel_print ("Pipelining expr %d will likely cause stall\n",
3856 			   INSN_UID (insn));
3857 	      continue;
3858 	    }
3859 
3860 	  if ((int) current_loop_nest->ninsns - num_insns_scheduled
3861 	      < need_n_ticks_till_branch * issue_rate / 2
3862 	      && est_ticks_till_branch < need_n_ticks_till_branch)
3863 	     {
3864 	       vec_av_set.unordered_remove (n);
3865 	       if (sched_verbose >= 4)
3866 		 sel_print ("Pipelining expr %d will likely cause stall\n",
3867 			    INSN_UID (insn));
3868 	       continue;
3869 	     }
3870 	}
3871 
3872       /* We want to schedule speculation checks as late as possible.  Discard
3873 	 them from av set if there are instructions with higher priority.  */
3874       if (sel_insn_is_speculation_check (insn)
3875 	  && EXPR_PRIORITY (expr) < av_max_prio)
3876 	{
3877           stalled++;
3878           min_need_stall = min_need_stall < 0 ? 1 : MIN (min_need_stall, 1);
3879           vec_av_set.unordered_remove (n);
3880 	  if (sched_verbose >= 4)
3881 	    sel_print ("Delaying speculation check %d until its first use\n",
3882 		       INSN_UID (insn));
3883 	  continue;
3884 	}
3885 
3886       /* Ignore EXPRs available from pipelining to update AV_MAX_PRIO.  */
3887       if (EXPR_ORIG_SCHED_CYCLE (expr) <= 0)
3888 	av_max_prio = MAX (av_max_prio, EXPR_PRIORITY (expr));
3889 
3890       /* Don't allow any insns whose data is not yet ready.
3891          Check first whether we've already tried them and failed.  */
3892       if (INSN_UID (insn) < FENCE_READY_TICKS_SIZE (fence))
3893 	{
3894           need_cycles = (FENCE_READY_TICKS (fence)[INSN_UID (insn)]
3895 			 - FENCE_CYCLE (fence));
3896 	  if (EXPR_ORIG_SCHED_CYCLE (expr) <= 0)
3897 	    est_ticks_till_branch = MAX (est_ticks_till_branch,
3898 					 EXPR_PRIORITY (expr) + need_cycles);
3899 
3900 	  if (need_cycles > 0)
3901 	    {
3902 	      stalled++;
3903 	      min_need_stall = (min_need_stall < 0
3904 				? need_cycles
3905 				: MIN (min_need_stall, need_cycles));
3906 	      vec_av_set.unordered_remove (n);
3907 
3908 	      if (sched_verbose >= 4)
3909 		sel_print ("Expr %d is not ready until cycle %d (cached)\n",
3910 			   INSN_UID (insn),
3911 			   FENCE_READY_TICKS (fence)[INSN_UID (insn)]);
3912 	      continue;
3913 	    }
3914 	}
3915 
3916       /* Now resort to dependence analysis to find whether EXPR might be
3917          stalled due to dependencies from FENCE's context.  */
3918       need_cycles = tick_check_p (expr, dc, fence);
3919       new_prio = EXPR_PRIORITY (expr) + EXPR_PRIORITY_ADJ (expr) + need_cycles;
3920 
3921       if (EXPR_ORIG_SCHED_CYCLE (expr) <= 0)
3922 	est_ticks_till_branch = MAX (est_ticks_till_branch,
3923 				     new_prio);
3924 
3925       if (need_cycles > 0)
3926         {
3927           if (INSN_UID (insn) >= FENCE_READY_TICKS_SIZE (fence))
3928             {
3929               int new_size = INSN_UID (insn) * 3 / 2;
3930 
3931               FENCE_READY_TICKS (fence)
3932                 = (int *) xrecalloc (FENCE_READY_TICKS (fence),
3933                                      new_size, FENCE_READY_TICKS_SIZE (fence),
3934                                      sizeof (int));
3935             }
3936           FENCE_READY_TICKS (fence)[INSN_UID (insn)]
3937             = FENCE_CYCLE (fence) + need_cycles;
3938 
3939           stalled++;
3940           min_need_stall = (min_need_stall < 0
3941                             ? need_cycles
3942                             : MIN (min_need_stall, need_cycles));
3943 
3944           vec_av_set.unordered_remove (n);
3945 
3946           if (sched_verbose >= 4)
3947             sel_print ("Expr %d is not ready yet until cycle %d\n",
3948                        INSN_UID (insn),
3949                        FENCE_READY_TICKS (fence)[INSN_UID (insn)]);
3950           continue;
3951         }
3952 
3953       if (sched_verbose >= 4)
3954         sel_print ("Expr %d is ok\n", INSN_UID (insn));
3955       min_need_stall = 0;
3956     }
3957 
3958   /* Clear SCHED_NEXT.  */
3959   if (FENCE_SCHED_NEXT (fence))
3960     {
3961       gcc_assert (sched_next_worked == 1);
3962       FENCE_SCHED_NEXT (fence) = NULL;
3963     }
3964 
3965   /* No need to stall if this variable was not initialized.  */
3966   if (min_need_stall < 0)
3967     min_need_stall = 0;
3968 
3969   if (vec_av_set.is_empty ())
3970     {
3971       /* We need to set *pneed_stall here, because later we skip this code
3972          when ready list is empty.  */
3973       *pneed_stall = min_need_stall;
3974       return false;
3975     }
3976   else
3977     gcc_assert (min_need_stall == 0);
3978 
3979   /* Sort the vector.  */
3980   vec_av_set.qsort (sel_rank_for_schedule);
3981 
3982   if (sched_verbose >= 4)
3983     {
3984       sel_print ("Total ready exprs: %d, stalled: %d\n",
3985                  vec_av_set.length (), stalled);
3986       sel_print ("Sorted av set (%d): ", vec_av_set.length ());
3987       FOR_EACH_VEC_ELT (vec_av_set, n, expr)
3988         dump_expr (expr);
3989       sel_print ("\n");
3990     }
3991 
3992   *pneed_stall = 0;
3993   return true;
3994 }
3995 
3996 /* Convert a vectored and sorted av set to the ready list that
3997    the rest of the backend wants to see.  */
3998 static void
3999 convert_vec_av_set_to_ready (void)
4000 {
4001   int n;
4002   expr_t expr;
4003 
4004   /* Allocate and fill the ready list from the sorted vector.  */
4005   ready.n_ready = vec_av_set.length ();
4006   ready.first = ready.n_ready - 1;
4007 
4008   gcc_assert (ready.n_ready > 0);
4009 
4010   if (ready.n_ready > max_issue_size)
4011     {
4012       max_issue_size = ready.n_ready;
4013       sched_extend_ready_list (ready.n_ready);
4014     }
4015 
4016   FOR_EACH_VEC_ELT (vec_av_set, n, expr)
4017     {
4018       vinsn_t vi = EXPR_VINSN (expr);
4019       insn_t insn = VINSN_INSN_RTX (vi);
4020 
4021       ready_try[n] = 0;
4022       ready.vec[n] = insn;
4023     }
4024 }
4025 
4026 /* Initialize ready list from *AV_PTR for the max_issue () call.
4027    If any unrecognizable insn found in *AV_PTR, return it (and skip
4028    max_issue).  BND and FENCE are current boundary and fence,
4029    respectively.  If we need to stall for some cycles before an expr
4030    from *AV_PTR would become available, write this number to *PNEED_STALL.  */
4031 static expr_t
4032 fill_ready_list (av_set_t *av_ptr, blist_t bnds, fence_t fence,
4033                  int *pneed_stall)
4034 {
4035   expr_t expr;
4036 
4037   /* We do not support multiple boundaries per fence.  */
4038   gcc_assert (BLIST_NEXT (bnds) == NULL);
4039 
4040   /* Process expressions required special handling, i.e.  pipelined,
4041      speculative and recog() < 0 expressions first.  */
4042   process_pipelined_exprs (av_ptr);
4043   process_spec_exprs (av_ptr);
4044 
4045   /* A USE could be scheduled immediately.  */
4046   expr = process_use_exprs (av_ptr);
4047   if (expr)
4048     {
4049       *pneed_stall = 0;
4050       return expr;
4051     }
4052 
4053   /* Turn the av set to a vector for sorting.  */
4054   if (! fill_vec_av_set (*av_ptr, bnds, fence, pneed_stall))
4055     {
4056       ready.n_ready = 0;
4057       return NULL;
4058     }
4059 
4060   /* Build the final ready list.  */
4061   convert_vec_av_set_to_ready ();
4062   return NULL;
4063 }
4064 
4065 /* Wrapper for dfa_new_cycle ().  Returns TRUE if cycle was advanced.  */
4066 static bool
4067 sel_dfa_new_cycle (insn_t insn, fence_t fence)
4068 {
4069   int last_scheduled_cycle = FENCE_LAST_SCHEDULED_INSN (fence)
4070                              ? INSN_SCHED_CYCLE (FENCE_LAST_SCHEDULED_INSN (fence))
4071                              : FENCE_CYCLE (fence) - 1;
4072   bool res = false;
4073   int sort_p = 0;
4074 
4075   if (!targetm.sched.dfa_new_cycle)
4076     return false;
4077 
4078   memcpy (curr_state, FENCE_STATE (fence), dfa_state_size);
4079 
4080   while (!sort_p && targetm.sched.dfa_new_cycle (sched_dump, sched_verbose,
4081                                                  insn, last_scheduled_cycle,
4082                                                  FENCE_CYCLE (fence), &sort_p))
4083     {
4084       memcpy (FENCE_STATE (fence), curr_state, dfa_state_size);
4085       advance_one_cycle (fence);
4086       memcpy (curr_state, FENCE_STATE (fence), dfa_state_size);
4087       res = true;
4088     }
4089 
4090   return res;
4091 }
4092 
4093 /* Invoke reorder* target hooks on the ready list.  Return the number of insns
4094    we can issue.  FENCE is the current fence.  */
4095 static int
4096 invoke_reorder_hooks (fence_t fence)
4097 {
4098   int issue_more;
4099   bool ran_hook = false;
4100 
4101   /* Call the reorder hook at the beginning of the cycle, and call
4102      the reorder2 hook in the middle of the cycle.  */
4103   if (FENCE_ISSUED_INSNS (fence) == 0)
4104     {
4105       if (targetm.sched.reorder
4106           && !SCHED_GROUP_P (ready_element (&ready, 0))
4107           && ready.n_ready > 1)
4108         {
4109           /* Don't give reorder the most prioritized insn as it can break
4110              pipelining.  */
4111           if (pipelining_p)
4112             --ready.n_ready;
4113 
4114           issue_more
4115             = targetm.sched.reorder (sched_dump, sched_verbose,
4116                                      ready_lastpos (&ready),
4117                                      &ready.n_ready, FENCE_CYCLE (fence));
4118 
4119           if (pipelining_p)
4120             ++ready.n_ready;
4121 
4122           ran_hook = true;
4123         }
4124       else
4125         /* Initialize can_issue_more for variable_issue.  */
4126         issue_more = issue_rate;
4127     }
4128   else if (targetm.sched.reorder2
4129            && !SCHED_GROUP_P (ready_element (&ready, 0)))
4130     {
4131       if (ready.n_ready == 1)
4132         issue_more =
4133           targetm.sched.reorder2 (sched_dump, sched_verbose,
4134                                   ready_lastpos (&ready),
4135                                   &ready.n_ready, FENCE_CYCLE (fence));
4136       else
4137         {
4138           if (pipelining_p)
4139             --ready.n_ready;
4140 
4141           issue_more =
4142             targetm.sched.reorder2 (sched_dump, sched_verbose,
4143                                     ready.n_ready
4144                                     ? ready_lastpos (&ready) : NULL,
4145                                     &ready.n_ready, FENCE_CYCLE (fence));
4146 
4147           if (pipelining_p)
4148             ++ready.n_ready;
4149         }
4150 
4151       ran_hook = true;
4152     }
4153   else
4154     issue_more = FENCE_ISSUE_MORE (fence);
4155 
4156   /* Ensure that ready list and vec_av_set are in line with each other,
4157      i.e. vec_av_set[i] == ready_element (&ready, i).  */
4158   if (issue_more && ran_hook)
4159     {
4160       int i, j, n;
4161       rtx_insn **arr = ready.vec;
4162       expr_t *vec = vec_av_set.address ();
4163 
4164       for (i = 0, n = ready.n_ready; i < n; i++)
4165         if (EXPR_INSN_RTX (vec[i]) != arr[i])
4166           {
4167             expr_t tmp;
4168 
4169             for (j = i; j < n; j++)
4170               if (EXPR_INSN_RTX (vec[j]) == arr[i])
4171                 break;
4172             gcc_assert (j < n);
4173 
4174             tmp = vec[i];
4175             vec[i] = vec[j];
4176             vec[j] = tmp;
4177           }
4178     }
4179 
4180   return issue_more;
4181 }
4182 
4183 /* Return an EXPR corresponding to INDEX element of ready list, if
4184    FOLLOW_READY_ELEMENT is true (i.e., an expr of
4185    ready_element (&ready, INDEX) will be returned), and to INDEX element of
4186    ready.vec otherwise.  */
4187 static inline expr_t
4188 find_expr_for_ready (int index, bool follow_ready_element)
4189 {
4190   expr_t expr;
4191   int real_index;
4192 
4193   real_index = follow_ready_element ? ready.first - index : index;
4194 
4195   expr = vec_av_set[real_index];
4196   gcc_assert (ready.vec[real_index] == EXPR_INSN_RTX (expr));
4197 
4198   return expr;
4199 }
4200 
4201 /* Calculate insns worth trying via lookahead_guard hook.  Return a number
4202    of such insns found.  */
4203 static int
4204 invoke_dfa_lookahead_guard (void)
4205 {
4206   int i, n;
4207   bool have_hook
4208     = targetm.sched.first_cycle_multipass_dfa_lookahead_guard != NULL;
4209 
4210   if (sched_verbose >= 2)
4211     sel_print ("ready after reorder: ");
4212 
4213   for (i = 0, n = 0; i < ready.n_ready; i++)
4214     {
4215       expr_t expr;
4216       insn_t insn;
4217       int r;
4218 
4219       /* In this loop insn is Ith element of the ready list given by
4220          ready_element, not Ith element of ready.vec.  */
4221       insn = ready_element (&ready, i);
4222 
4223       if (! have_hook || i == 0)
4224         r = 0;
4225       else
4226         r = targetm.sched.first_cycle_multipass_dfa_lookahead_guard (insn, i);
4227 
4228       gcc_assert (INSN_CODE (insn) >= 0);
4229 
4230       /* Only insns with ready_try = 0 can get here
4231          from fill_ready_list.  */
4232       gcc_assert (ready_try [i] == 0);
4233       ready_try[i] = r;
4234       if (!r)
4235         n++;
4236 
4237       expr = find_expr_for_ready (i, true);
4238 
4239       if (sched_verbose >= 2)
4240         {
4241           dump_vinsn (EXPR_VINSN (expr));
4242           sel_print (":%d; ", ready_try[i]);
4243         }
4244     }
4245 
4246   if (sched_verbose >= 2)
4247     sel_print ("\n");
4248   return n;
4249 }
4250 
4251 /* Calculate the number of privileged insns and return it.  */
4252 static int
4253 calculate_privileged_insns (void)
4254 {
4255   expr_t cur_expr, min_spec_expr = NULL;
4256   int privileged_n = 0, i;
4257 
4258   for (i = 0; i < ready.n_ready; i++)
4259     {
4260       if (ready_try[i])
4261         continue;
4262 
4263       if (! min_spec_expr)
4264 	min_spec_expr = find_expr_for_ready (i, true);
4265 
4266       cur_expr = find_expr_for_ready (i, true);
4267 
4268       if (EXPR_SPEC (cur_expr) > EXPR_SPEC (min_spec_expr))
4269         break;
4270 
4271       ++privileged_n;
4272     }
4273 
4274   if (i == ready.n_ready)
4275     privileged_n = 0;
4276 
4277   if (sched_verbose >= 2)
4278     sel_print ("privileged_n: %d insns with SPEC %d\n",
4279                privileged_n, privileged_n ? EXPR_SPEC (min_spec_expr) : -1);
4280   return privileged_n;
4281 }
4282 
4283 /* Call the rest of the hooks after the choice was made.  Return
4284    the number of insns that still can be issued given that the current
4285    number is ISSUE_MORE.  FENCE and BEST_INSN are the current fence
4286    and the insn chosen for scheduling, respectively.  */
4287 static int
4288 invoke_aftermath_hooks (fence_t fence, rtx_insn *best_insn, int issue_more)
4289 {
4290   gcc_assert (INSN_P (best_insn));
4291 
4292   /* First, call dfa_new_cycle, and then variable_issue, if available.  */
4293   sel_dfa_new_cycle (best_insn, fence);
4294 
4295   if (targetm.sched.variable_issue)
4296     {
4297       memcpy (curr_state, FENCE_STATE (fence), dfa_state_size);
4298       issue_more =
4299         targetm.sched.variable_issue (sched_dump, sched_verbose, best_insn,
4300                                       issue_more);
4301       memcpy (FENCE_STATE (fence), curr_state, dfa_state_size);
4302     }
4303   else if (GET_CODE (PATTERN (best_insn)) != USE
4304            && GET_CODE (PATTERN (best_insn)) != CLOBBER)
4305     issue_more--;
4306 
4307   return issue_more;
4308 }
4309 
4310 /* Estimate the cost of issuing INSN on DFA state STATE.  */
4311 static int
4312 estimate_insn_cost (rtx_insn *insn, state_t state)
4313 {
4314   static state_t temp = NULL;
4315   int cost;
4316 
4317   if (!temp)
4318     temp = xmalloc (dfa_state_size);
4319 
4320   memcpy (temp, state, dfa_state_size);
4321   cost = state_transition (temp, insn);
4322 
4323   if (cost < 0)
4324     return 0;
4325   else if (cost == 0)
4326     return 1;
4327   return cost;
4328 }
4329 
4330 /* Return the cost of issuing EXPR on the FENCE as estimated by DFA.
4331    This function properly handles ASMs, USEs etc.  */
4332 static int
4333 get_expr_cost (expr_t expr, fence_t fence)
4334 {
4335   rtx_insn *insn = EXPR_INSN_RTX (expr);
4336 
4337   if (recog_memoized (insn) < 0)
4338     {
4339       if (!FENCE_STARTS_CYCLE_P (fence)
4340 	  && INSN_ASM_P (insn))
4341 	/* This is asm insn which is tryed to be issued on the
4342 	   cycle not first.  Issue it on the next cycle.  */
4343 	return 1;
4344       else
4345 	/* A USE insn, or something else we don't need to
4346 	   understand.  We can't pass these directly to
4347 	   state_transition because it will trigger a
4348 	   fatal error for unrecognizable insns.  */
4349 	return 0;
4350     }
4351   else
4352     return estimate_insn_cost (insn, FENCE_STATE (fence));
4353 }
4354 
4355 /* Find the best insn for scheduling, either via max_issue or just take
4356    the most prioritized available.  */
4357 static int
4358 choose_best_insn (fence_t fence, int privileged_n, int *index)
4359 {
4360   int can_issue = 0;
4361 
4362   if (dfa_lookahead > 0)
4363     {
4364       cycle_issued_insns = FENCE_ISSUED_INSNS (fence);
4365       /* TODO: pass equivalent of first_cycle_insn_p to max_issue ().  */
4366       can_issue = max_issue (&ready, privileged_n,
4367                              FENCE_STATE (fence), true, index);
4368       if (sched_verbose >= 2)
4369         sel_print ("max_issue: we can issue %d insns, already did %d insns\n",
4370                    can_issue, FENCE_ISSUED_INSNS (fence));
4371     }
4372   else
4373     {
4374       /* We can't use max_issue; just return the first available element.  */
4375       int i;
4376 
4377       for (i = 0; i < ready.n_ready; i++)
4378 	{
4379 	  expr_t expr = find_expr_for_ready (i, true);
4380 
4381 	  if (get_expr_cost (expr, fence) < 1)
4382 	    {
4383 	      can_issue = can_issue_more;
4384 	      *index = i;
4385 
4386 	      if (sched_verbose >= 2)
4387 		sel_print ("using %dth insn from the ready list\n", i + 1);
4388 
4389 	      break;
4390 	    }
4391 	}
4392 
4393       if (i == ready.n_ready)
4394 	{
4395 	  can_issue = 0;
4396 	  *index = -1;
4397 	}
4398     }
4399 
4400   return can_issue;
4401 }
4402 
4403 /* Choose the best expr from *AV_VLIW_PTR and a suitable register for it.
4404    BNDS and FENCE are current boundaries and scheduling fence respectively.
4405    Return the expr found and NULL if nothing can be issued atm.
4406    Write to PNEED_STALL the number of cycles to stall if no expr was found.  */
4407 static expr_t
4408 find_best_expr (av_set_t *av_vliw_ptr, blist_t bnds, fence_t fence,
4409                 int *pneed_stall)
4410 {
4411   expr_t best;
4412 
4413   /* Choose the best insn for scheduling via:
4414      1) sorting the ready list based on priority;
4415      2) calling the reorder hook;
4416      3) calling max_issue.  */
4417   best = fill_ready_list (av_vliw_ptr, bnds, fence, pneed_stall);
4418   if (best == NULL && ready.n_ready > 0)
4419     {
4420       int privileged_n, index;
4421 
4422       can_issue_more = invoke_reorder_hooks (fence);
4423       if (can_issue_more > 0)
4424         {
4425           /* Try choosing the best insn until we find one that is could be
4426              scheduled due to liveness restrictions on its destination register.
4427              In the future, we'd like to choose once and then just probe insns
4428              in the order of their priority.  */
4429           invoke_dfa_lookahead_guard ();
4430           privileged_n = calculate_privileged_insns ();
4431           can_issue_more = choose_best_insn (fence, privileged_n, &index);
4432           if (can_issue_more)
4433             best = find_expr_for_ready (index, true);
4434         }
4435       /* We had some available insns, so if we can't issue them,
4436          we have a stall.  */
4437       if (can_issue_more == 0)
4438         {
4439           best = NULL;
4440           *pneed_stall = 1;
4441         }
4442     }
4443 
4444   if (best != NULL)
4445     {
4446       can_issue_more = invoke_aftermath_hooks (fence, EXPR_INSN_RTX (best),
4447                                                can_issue_more);
4448       if (targetm.sched.variable_issue
4449 	  && can_issue_more == 0)
4450         *pneed_stall = 1;
4451     }
4452 
4453   if (sched_verbose >= 2)
4454     {
4455       if (best != NULL)
4456         {
4457           sel_print ("Best expression (vliw form): ");
4458           dump_expr (best);
4459           sel_print ("; cycle %d\n", FENCE_CYCLE (fence));
4460         }
4461       else
4462         sel_print ("No best expr found!\n");
4463     }
4464 
4465   return best;
4466 }
4467 
4468 
4469 /* Functions that implement the core of the scheduler.  */
4470 
4471 
4472 /* Emit an instruction from EXPR with SEQNO and VINSN after
4473    PLACE_TO_INSERT.  */
4474 static insn_t
4475 emit_insn_from_expr_after (expr_t expr, vinsn_t vinsn, int seqno,
4476                            insn_t place_to_insert)
4477 {
4478   /* This assert fails when we have identical instructions
4479      one of which dominates the other.  In this case move_op ()
4480      finds the first instruction and doesn't search for second one.
4481      The solution would be to compute av_set after the first found
4482      insn and, if insn present in that set, continue searching.
4483      For now we workaround this issue in move_op.  */
4484   gcc_assert (!INSN_IN_STREAM_P (EXPR_INSN_RTX (expr)));
4485 
4486   if (EXPR_WAS_RENAMED (expr))
4487     {
4488       unsigned regno = expr_dest_regno (expr);
4489 
4490       if (HARD_REGISTER_NUM_P (regno))
4491 	{
4492 	  df_set_regs_ever_live (regno, true);
4493 	  reg_rename_tick[regno] = ++reg_rename_this_tick;
4494 	}
4495     }
4496 
4497   return sel_gen_insn_from_expr_after (expr, vinsn, seqno,
4498                                        place_to_insert);
4499 }
4500 
4501 /* Return TRUE if BB can hold bookkeeping code.  */
4502 static bool
4503 block_valid_for_bookkeeping_p (basic_block bb)
4504 {
4505   insn_t bb_end = BB_END (bb);
4506 
4507   if (!in_current_region_p (bb) || EDGE_COUNT (bb->succs) > 1)
4508     return false;
4509 
4510   if (INSN_P (bb_end))
4511     {
4512       if (INSN_SCHED_TIMES (bb_end) > 0)
4513 	return false;
4514     }
4515   else
4516     gcc_assert (NOTE_INSN_BASIC_BLOCK_P (bb_end));
4517 
4518   return true;
4519 }
4520 
4521 /* Attempt to find a block that can hold bookkeeping code for path(s) incoming
4522    into E2->dest, except from E1->src (there may be a sequence of empty basic
4523    blocks between E1->src and E2->dest).  Return found block, or NULL if new
4524    one must be created.  If LAX holds, don't assume there is a simple path
4525    from E1->src to E2->dest.  */
4526 static basic_block
4527 find_block_for_bookkeeping (edge e1, edge e2, bool lax)
4528 {
4529   basic_block candidate_block = NULL;
4530   edge e;
4531 
4532   /* Loop over edges from E1 to E2, inclusive.  */
4533   for (e = e1; !lax || e->dest != EXIT_BLOCK_PTR_FOR_FN (cfun); e =
4534        EDGE_SUCC (e->dest, 0))
4535     {
4536       if (EDGE_COUNT (e->dest->preds) == 2)
4537 	{
4538 	  if (candidate_block == NULL)
4539 	    candidate_block = (EDGE_PRED (e->dest, 0) == e
4540 			       ? EDGE_PRED (e->dest, 1)->src
4541 			       : EDGE_PRED (e->dest, 0)->src);
4542 	  else
4543 	    /* Found additional edge leading to path from e1 to e2
4544 	       from aside.  */
4545 	    return NULL;
4546 	}
4547       else if (EDGE_COUNT (e->dest->preds) > 2)
4548 	/* Several edges leading to path from e1 to e2 from aside.  */
4549 	return NULL;
4550 
4551       if (e == e2)
4552 	return ((!lax || candidate_block)
4553 		&& block_valid_for_bookkeeping_p (candidate_block)
4554 		? candidate_block
4555 		: NULL);
4556 
4557       if (lax && EDGE_COUNT (e->dest->succs) != 1)
4558 	return NULL;
4559     }
4560 
4561   if (lax)
4562     return NULL;
4563 
4564   gcc_unreachable ();
4565 }
4566 
4567 /* Create new basic block for bookkeeping code for path(s) incoming into
4568    E2->dest, except from E1->src.  Return created block.  */
4569 static basic_block
4570 create_block_for_bookkeeping (edge e1, edge e2)
4571 {
4572   basic_block new_bb, bb = e2->dest;
4573 
4574   /* Check that we don't spoil the loop structure.  */
4575   if (current_loop_nest)
4576     {
4577       basic_block latch = current_loop_nest->latch;
4578 
4579       /* We do not split header.  */
4580       gcc_assert (e2->dest != current_loop_nest->header);
4581 
4582       /* We do not redirect the only edge to the latch block.  */
4583       gcc_assert (e1->dest != latch
4584 		  || !single_pred_p (latch)
4585 		  || e1 != single_pred_edge (latch));
4586     }
4587 
4588   /* Split BB to insert BOOK_INSN there.  */
4589   new_bb = sched_split_block (bb, NULL);
4590 
4591   /* Move note_list from the upper bb.  */
4592   gcc_assert (BB_NOTE_LIST (new_bb) == NULL_RTX);
4593   BB_NOTE_LIST (new_bb) = BB_NOTE_LIST (bb);
4594   BB_NOTE_LIST (bb) = NULL;
4595 
4596   gcc_assert (e2->dest == bb);
4597 
4598   /* Skip block for bookkeeping copy when leaving E1->src.  */
4599   if (e1->flags & EDGE_FALLTHRU)
4600     sel_redirect_edge_and_branch_force (e1, new_bb);
4601   else
4602     sel_redirect_edge_and_branch (e1, new_bb);
4603 
4604   gcc_assert (e1->dest == new_bb);
4605   gcc_assert (sel_bb_empty_p (bb));
4606 
4607   /* To keep basic block numbers in sync between debug and non-debug
4608      compilations, we have to rotate blocks here.  Consider that we
4609      started from (a,b)->d, (c,d)->e, and d contained only debug
4610      insns.  It would have been removed before if the debug insns
4611      weren't there, so we'd have split e rather than d.  So what we do
4612      now is to swap the block numbers of new_bb and
4613      single_succ(new_bb) == e, so that the insns that were in e before
4614      get the new block number.  */
4615 
4616   if (MAY_HAVE_DEBUG_INSNS)
4617     {
4618       basic_block succ;
4619       insn_t insn = sel_bb_head (new_bb);
4620       insn_t last;
4621 
4622       if (DEBUG_INSN_P (insn)
4623 	  && single_succ_p (new_bb)
4624 	  && (succ = single_succ (new_bb))
4625 	  && succ != EXIT_BLOCK_PTR_FOR_FN (cfun)
4626 	  && DEBUG_INSN_P ((last = sel_bb_end (new_bb))))
4627 	{
4628 	  while (insn != last && (DEBUG_INSN_P (insn) || NOTE_P (insn)))
4629 	    insn = NEXT_INSN (insn);
4630 
4631 	  if (insn == last)
4632 	    {
4633 	      sel_global_bb_info_def gbi;
4634 	      sel_region_bb_info_def rbi;
4635 	      int i;
4636 
4637 	      if (sched_verbose >= 2)
4638 		sel_print ("Swapping block ids %i and %i\n",
4639 			   new_bb->index, succ->index);
4640 
4641 	      i = new_bb->index;
4642 	      new_bb->index = succ->index;
4643 	      succ->index = i;
4644 
4645 	      SET_BASIC_BLOCK_FOR_FN (cfun, new_bb->index, new_bb);
4646 	      SET_BASIC_BLOCK_FOR_FN (cfun, succ->index, succ);
4647 
4648 	      memcpy (&gbi, SEL_GLOBAL_BB_INFO (new_bb), sizeof (gbi));
4649 	      memcpy (SEL_GLOBAL_BB_INFO (new_bb), SEL_GLOBAL_BB_INFO (succ),
4650 		      sizeof (gbi));
4651 	      memcpy (SEL_GLOBAL_BB_INFO (succ), &gbi, sizeof (gbi));
4652 
4653 	      memcpy (&rbi, SEL_REGION_BB_INFO (new_bb), sizeof (rbi));
4654 	      memcpy (SEL_REGION_BB_INFO (new_bb), SEL_REGION_BB_INFO (succ),
4655 		      sizeof (rbi));
4656 	      memcpy (SEL_REGION_BB_INFO (succ), &rbi, sizeof (rbi));
4657 
4658 	      i = BLOCK_TO_BB (new_bb->index);
4659 	      BLOCK_TO_BB (new_bb->index) = BLOCK_TO_BB (succ->index);
4660 	      BLOCK_TO_BB (succ->index) = i;
4661 
4662 	      i = CONTAINING_RGN (new_bb->index);
4663 	      CONTAINING_RGN (new_bb->index) = CONTAINING_RGN (succ->index);
4664 	      CONTAINING_RGN (succ->index) = i;
4665 
4666 	      for (i = 0; i < current_nr_blocks; i++)
4667 		if (BB_TO_BLOCK (i) == succ->index)
4668 		  BB_TO_BLOCK (i) = new_bb->index;
4669 		else if (BB_TO_BLOCK (i) == new_bb->index)
4670 		  BB_TO_BLOCK (i) = succ->index;
4671 
4672 	      FOR_BB_INSNS (new_bb, insn)
4673 		if (INSN_P (insn))
4674 		  EXPR_ORIG_BB_INDEX (INSN_EXPR (insn)) = new_bb->index;
4675 
4676 	      FOR_BB_INSNS (succ, insn)
4677 		if (INSN_P (insn))
4678 		  EXPR_ORIG_BB_INDEX (INSN_EXPR (insn)) = succ->index;
4679 
4680 	      if (bitmap_clear_bit (code_motion_visited_blocks, new_bb->index))
4681 		bitmap_set_bit (code_motion_visited_blocks, succ->index);
4682 
4683 	      gcc_assert (LABEL_P (BB_HEAD (new_bb))
4684 			  && LABEL_P (BB_HEAD (succ)));
4685 
4686 	      if (sched_verbose >= 4)
4687 		sel_print ("Swapping code labels %i and %i\n",
4688 			   CODE_LABEL_NUMBER (BB_HEAD (new_bb)),
4689 			   CODE_LABEL_NUMBER (BB_HEAD (succ)));
4690 
4691 	      i = CODE_LABEL_NUMBER (BB_HEAD (new_bb));
4692 	      CODE_LABEL_NUMBER (BB_HEAD (new_bb))
4693 		= CODE_LABEL_NUMBER (BB_HEAD (succ));
4694 	      CODE_LABEL_NUMBER (BB_HEAD (succ)) = i;
4695 	    }
4696 	}
4697     }
4698 
4699   return bb;
4700 }
4701 
4702 /* Return insn after which we must insert bookkeeping code for path(s) incoming
4703    into E2->dest, except from E1->src.  If the returned insn immediately
4704    precedes a fence, assign that fence to *FENCE_TO_REWIND.  */
4705 static insn_t
4706 find_place_for_bookkeeping (edge e1, edge e2, fence_t *fence_to_rewind)
4707 {
4708   insn_t place_to_insert;
4709   /* Find a basic block that can hold bookkeeping.  If it can be found, do not
4710      create new basic block, but insert bookkeeping there.  */
4711   basic_block book_block = find_block_for_bookkeeping (e1, e2, FALSE);
4712 
4713   if (book_block)
4714     {
4715       place_to_insert = BB_END (book_block);
4716 
4717       /* Don't use a block containing only debug insns for
4718 	 bookkeeping, this causes scheduling differences between debug
4719 	 and non-debug compilations, for the block would have been
4720 	 removed already.  */
4721       if (DEBUG_INSN_P (place_to_insert))
4722 	{
4723 	  rtx_insn *insn = sel_bb_head (book_block);
4724 
4725 	  while (insn != place_to_insert &&
4726 		 (DEBUG_INSN_P (insn) || NOTE_P (insn)))
4727 	    insn = NEXT_INSN (insn);
4728 
4729 	  if (insn == place_to_insert)
4730 	    book_block = NULL;
4731 	}
4732     }
4733 
4734   if (!book_block)
4735     {
4736       book_block = create_block_for_bookkeeping (e1, e2);
4737       place_to_insert = BB_END (book_block);
4738       if (sched_verbose >= 9)
4739 	sel_print ("New block is %i, split from bookkeeping block %i\n",
4740 		   EDGE_SUCC (book_block, 0)->dest->index, book_block->index);
4741     }
4742   else
4743     {
4744       if (sched_verbose >= 9)
4745 	sel_print ("Pre-existing bookkeeping block is %i\n", book_block->index);
4746     }
4747 
4748   *fence_to_rewind = NULL;
4749   /* If basic block ends with a jump, insert bookkeeping code right before it.
4750      Notice if we are crossing a fence when taking PREV_INSN.  */
4751   if (INSN_P (place_to_insert) && control_flow_insn_p (place_to_insert))
4752     {
4753       *fence_to_rewind = flist_lookup (fences, place_to_insert);
4754       place_to_insert = PREV_INSN (place_to_insert);
4755     }
4756 
4757   return place_to_insert;
4758 }
4759 
4760 /* Find a proper seqno for bookkeeing insn inserted at PLACE_TO_INSERT
4761    for JOIN_POINT.   */
4762 static int
4763 find_seqno_for_bookkeeping (insn_t place_to_insert, insn_t join_point)
4764 {
4765   int seqno;
4766   rtx next;
4767 
4768   /* Check if we are about to insert bookkeeping copy before a jump, and use
4769      jump's seqno for the copy; otherwise, use JOIN_POINT's seqno.  */
4770   next = NEXT_INSN (place_to_insert);
4771   if (INSN_P (next)
4772       && JUMP_P (next)
4773       && BLOCK_FOR_INSN (next) == BLOCK_FOR_INSN (place_to_insert))
4774     {
4775       gcc_assert (INSN_SCHED_TIMES (next) == 0);
4776       seqno = INSN_SEQNO (next);
4777     }
4778   else if (INSN_SEQNO (join_point) > 0)
4779     seqno = INSN_SEQNO (join_point);
4780   else
4781     {
4782       seqno = get_seqno_by_preds (place_to_insert);
4783 
4784       /* Sometimes the fences can move in such a way that there will be
4785          no instructions with positive seqno around this bookkeeping.
4786          This means that there will be no way to get to it by a regular
4787          fence movement.  Never mind because we pick up such pieces for
4788          rescheduling anyways, so any positive value will do for now.  */
4789       if (seqno < 0)
4790         {
4791           gcc_assert (pipelining_p);
4792           seqno = 1;
4793         }
4794     }
4795 
4796   gcc_assert (seqno > 0);
4797   return seqno;
4798 }
4799 
4800 /* Insert bookkeeping copy of C_EXPS's insn after PLACE_TO_INSERT, assigning
4801    NEW_SEQNO to it.  Return created insn.  */
4802 static insn_t
4803 emit_bookkeeping_insn (insn_t place_to_insert, expr_t c_expr, int new_seqno)
4804 {
4805   rtx_insn *new_insn_rtx = create_copy_of_insn_rtx (EXPR_INSN_RTX (c_expr));
4806 
4807   vinsn_t new_vinsn
4808     = create_vinsn_from_insn_rtx (new_insn_rtx,
4809 				  VINSN_UNIQUE_P (EXPR_VINSN (c_expr)));
4810 
4811   insn_t new_insn = emit_insn_from_expr_after (c_expr, new_vinsn, new_seqno,
4812 					       place_to_insert);
4813 
4814   INSN_SCHED_TIMES (new_insn) = 0;
4815   bitmap_set_bit (current_copies, INSN_UID (new_insn));
4816 
4817   return new_insn;
4818 }
4819 
4820 /* Generate a bookkeeping copy of C_EXPR's insn for path(s) incoming into to
4821    E2->dest, except from E1->src (there may be a sequence of empty blocks
4822    between E1->src and E2->dest).  Return block containing the copy.
4823    All scheduler data is initialized for the newly created insn.  */
4824 static basic_block
4825 generate_bookkeeping_insn (expr_t c_expr, edge e1, edge e2)
4826 {
4827   insn_t join_point, place_to_insert, new_insn;
4828   int new_seqno;
4829   bool need_to_exchange_data_sets;
4830   fence_t fence_to_rewind;
4831 
4832   if (sched_verbose >= 4)
4833     sel_print ("Generating bookkeeping insn (%d->%d)\n", e1->src->index,
4834 	       e2->dest->index);
4835 
4836   join_point = sel_bb_head (e2->dest);
4837   place_to_insert = find_place_for_bookkeeping (e1, e2, &fence_to_rewind);
4838   new_seqno = find_seqno_for_bookkeeping (place_to_insert, join_point);
4839   need_to_exchange_data_sets
4840     = sel_bb_empty_p (BLOCK_FOR_INSN (place_to_insert));
4841 
4842   new_insn = emit_bookkeeping_insn (place_to_insert, c_expr, new_seqno);
4843 
4844   if (fence_to_rewind)
4845     FENCE_INSN (fence_to_rewind) = new_insn;
4846 
4847   /* When inserting bookkeeping insn in new block, av sets should be
4848      following: old basic block (that now holds bookkeeping) data sets are
4849      the same as was before generation of bookkeeping, and new basic block
4850      (that now hold all other insns of old basic block) data sets are
4851      invalid.  So exchange data sets for these basic blocks as sel_split_block
4852      mistakenly exchanges them in this case.  Cannot do it earlier because
4853      when single instruction is added to new basic block it should hold NULL
4854      lv_set.  */
4855   if (need_to_exchange_data_sets)
4856     exchange_data_sets (BLOCK_FOR_INSN (new_insn),
4857 			BLOCK_FOR_INSN (join_point));
4858 
4859   stat_bookkeeping_copies++;
4860   return BLOCK_FOR_INSN (new_insn);
4861 }
4862 
4863 /* Remove from AV_PTR all insns that may need bookkeeping when scheduling
4864    on FENCE, but we are unable to copy them.  */
4865 static void
4866 remove_insns_that_need_bookkeeping (fence_t fence, av_set_t *av_ptr)
4867 {
4868   expr_t expr;
4869   av_set_iterator i;
4870 
4871   /*  An expression does not need bookkeeping if it is available on all paths
4872       from current block to original block and current block dominates
4873       original block.  We check availability on all paths by examining
4874       EXPR_SPEC; this is not equivalent, because it may be positive even
4875       if expr is available on all paths (but if expr is not available on
4876       any path, EXPR_SPEC will be positive).  */
4877 
4878   FOR_EACH_EXPR_1 (expr, i, av_ptr)
4879     {
4880       if (!control_flow_insn_p (EXPR_INSN_RTX (expr))
4881 	  && (!bookkeeping_p || VINSN_UNIQUE_P (EXPR_VINSN (expr)))
4882 	  && (EXPR_SPEC (expr)
4883 	      || !EXPR_ORIG_BB_INDEX (expr)
4884 	      || !dominated_by_p (CDI_DOMINATORS,
4885 				  BASIC_BLOCK_FOR_FN (cfun,
4886 						      EXPR_ORIG_BB_INDEX (expr)),
4887 				  BLOCK_FOR_INSN (FENCE_INSN (fence)))))
4888 	{
4889           if (sched_verbose >= 4)
4890             sel_print ("Expr %d removed because it would need bookkeeping, which "
4891                        "cannot be created\n", INSN_UID (EXPR_INSN_RTX (expr)));
4892 	  av_set_iter_remove (&i);
4893 	}
4894     }
4895 }
4896 
4897 /* Moving conditional jump through some instructions.
4898 
4899    Consider example:
4900 
4901        ...                     <- current scheduling point
4902        NOTE BASIC BLOCK:       <- bb header
4903        (p8)  add r14=r14+0x9;;
4904        (p8)  mov [r14]=r23
4905        (!p8) jump L1;;
4906        NOTE BASIC BLOCK:
4907        ...
4908 
4909    We can schedule jump one cycle earlier, than mov, because they cannot be
4910    executed together as their predicates are mutually exclusive.
4911 
4912    This is done in this way: first, new fallthrough basic block is created
4913    after jump (it is always can be done, because there already should be a
4914    fallthrough block, where control flow goes in case of predicate being true -
4915    in our example; otherwise there should be a dependence between those
4916    instructions and jump and we cannot schedule jump right now);
4917    next, all instructions between jump and current scheduling point are moved
4918    to this new block.  And the result is this:
4919 
4920       NOTE BASIC BLOCK:
4921       (!p8) jump L1           <- current scheduling point
4922       NOTE BASIC BLOCK:       <- bb header
4923       (p8)  add r14=r14+0x9;;
4924       (p8)  mov [r14]=r23
4925       NOTE BASIC BLOCK:
4926       ...
4927 */
4928 static void
4929 move_cond_jump (rtx_insn *insn, bnd_t bnd)
4930 {
4931   edge ft_edge;
4932   basic_block block_from, block_next, block_new, block_bnd, bb;
4933   rtx_insn *next, *prev, *link, *head;
4934 
4935   block_from = BLOCK_FOR_INSN (insn);
4936   block_bnd = BLOCK_FOR_INSN (BND_TO (bnd));
4937   prev = BND_TO (bnd);
4938 
4939 #ifdef ENABLE_CHECKING
4940   /* Moving of jump should not cross any other jumps or beginnings of new
4941      basic blocks.  The only exception is when we move a jump through
4942      mutually exclusive insns along fallthru edges.  */
4943   if (block_from != block_bnd)
4944     {
4945       bb = block_from;
4946       for (link = PREV_INSN (insn); link != PREV_INSN (prev);
4947            link = PREV_INSN (link))
4948         {
4949           if (INSN_P (link))
4950             gcc_assert (sched_insns_conditions_mutex_p (insn, link));
4951           if (BLOCK_FOR_INSN (link) && BLOCK_FOR_INSN (link) != bb)
4952             {
4953               gcc_assert (single_pred (bb) == BLOCK_FOR_INSN (link));
4954               bb = BLOCK_FOR_INSN (link);
4955             }
4956         }
4957     }
4958 #endif
4959 
4960   /* Jump is moved to the boundary.  */
4961   next = PREV_INSN (insn);
4962   BND_TO (bnd) = insn;
4963 
4964   ft_edge = find_fallthru_edge_from (block_from);
4965   block_next = ft_edge->dest;
4966   /* There must be a fallthrough block (or where should go
4967   control flow in case of false jump predicate otherwise?).  */
4968   gcc_assert (block_next);
4969 
4970   /* Create new empty basic block after source block.  */
4971   block_new = sel_split_edge (ft_edge);
4972   gcc_assert (block_new->next_bb == block_next
4973               && block_from->next_bb == block_new);
4974 
4975   /* Move all instructions except INSN to BLOCK_NEW.  */
4976   bb = block_bnd;
4977   head = BB_HEAD (block_new);
4978   while (bb != block_from->next_bb)
4979     {
4980       rtx_insn *from, *to;
4981       from = bb == block_bnd ? prev : sel_bb_head (bb);
4982       to = bb == block_from ? next : sel_bb_end (bb);
4983 
4984       /* The jump being moved can be the first insn in the block.
4985          In this case we don't have to move anything in this block.  */
4986       if (NEXT_INSN (to) != from)
4987         {
4988           reorder_insns (from, to, head);
4989 
4990           for (link = to; link != head; link = PREV_INSN (link))
4991             EXPR_ORIG_BB_INDEX (INSN_EXPR (link)) = block_new->index;
4992           head = to;
4993         }
4994 
4995       /* Cleanup possibly empty blocks left.  */
4996       block_next = bb->next_bb;
4997       if (bb != block_from)
4998 	tidy_control_flow (bb, false);
4999       bb = block_next;
5000     }
5001 
5002   /* Assert there is no jump to BLOCK_NEW, only fallthrough edge.  */
5003   gcc_assert (NOTE_INSN_BASIC_BLOCK_P (BB_HEAD (block_new)));
5004 
5005   gcc_assert (!sel_bb_empty_p (block_from)
5006               && !sel_bb_empty_p (block_new));
5007 
5008   /* Update data sets for BLOCK_NEW to represent that INSN and
5009      instructions from the other branch of INSN is no longer
5010      available at BLOCK_NEW.  */
5011   BB_AV_LEVEL (block_new) = global_level;
5012   gcc_assert (BB_LV_SET (block_new) == NULL);
5013   BB_LV_SET (block_new) = get_clear_regset_from_pool ();
5014   update_data_sets (sel_bb_head (block_new));
5015 
5016   /* INSN is a new basic block header - so prepare its data
5017      structures and update availability and liveness sets.  */
5018   update_data_sets (insn);
5019 
5020   if (sched_verbose >= 4)
5021     sel_print ("Moving jump %d\n", INSN_UID (insn));
5022 }
5023 
5024 /* Remove nops generated during move_op for preventing removal of empty
5025    basic blocks.  */
5026 static void
5027 remove_temp_moveop_nops (bool full_tidying)
5028 {
5029   int i;
5030   insn_t insn;
5031 
5032   FOR_EACH_VEC_ELT (vec_temp_moveop_nops, i, insn)
5033     {
5034       gcc_assert (INSN_NOP_P (insn));
5035       return_nop_to_pool (insn, full_tidying);
5036     }
5037 
5038   /* Empty the vector.  */
5039   if (vec_temp_moveop_nops.length () > 0)
5040     vec_temp_moveop_nops.block_remove (0, vec_temp_moveop_nops.length ());
5041 }
5042 
5043 /* Records the maximal UID before moving up an instruction.  Used for
5044    distinguishing between bookkeeping copies and original insns.  */
5045 static int max_uid_before_move_op = 0;
5046 
5047 /* Remove from AV_VLIW_P all instructions but next when debug counter
5048    tells us so.  Next instruction is fetched from BNDS.  */
5049 static void
5050 remove_insns_for_debug (blist_t bnds, av_set_t *av_vliw_p)
5051 {
5052   if (! dbg_cnt (sel_sched_insn_cnt))
5053     /* Leave only the next insn in av_vliw.  */
5054     {
5055       av_set_iterator av_it;
5056       expr_t expr;
5057       bnd_t bnd = BLIST_BND (bnds);
5058       insn_t next = BND_TO (bnd);
5059 
5060       gcc_assert (BLIST_NEXT (bnds) == NULL);
5061 
5062       FOR_EACH_EXPR_1 (expr, av_it, av_vliw_p)
5063         if (EXPR_INSN_RTX (expr) != next)
5064           av_set_iter_remove (&av_it);
5065     }
5066 }
5067 
5068 /* Compute available instructions on BNDS.  FENCE is the current fence.  Write
5069    the computed set to *AV_VLIW_P.  */
5070 static void
5071 compute_av_set_on_boundaries (fence_t fence, blist_t bnds, av_set_t *av_vliw_p)
5072 {
5073   if (sched_verbose >= 2)
5074     {
5075       sel_print ("Boundaries: ");
5076       dump_blist (bnds);
5077       sel_print ("\n");
5078     }
5079 
5080   for (; bnds; bnds = BLIST_NEXT (bnds))
5081     {
5082       bnd_t bnd = BLIST_BND (bnds);
5083       av_set_t av1_copy;
5084       insn_t bnd_to = BND_TO (bnd);
5085 
5086       /* Rewind BND->TO to the basic block header in case some bookkeeping
5087          instructions were inserted before BND->TO and it needs to be
5088          adjusted.  */
5089       if (sel_bb_head_p (bnd_to))
5090         gcc_assert (INSN_SCHED_TIMES (bnd_to) == 0);
5091       else
5092         while (INSN_SCHED_TIMES (PREV_INSN (bnd_to)) == 0)
5093           {
5094             bnd_to = PREV_INSN (bnd_to);
5095             if (sel_bb_head_p (bnd_to))
5096               break;
5097           }
5098 
5099       if (BND_TO (bnd) != bnd_to)
5100 	{
5101   	  gcc_assert (FENCE_INSN (fence) == BND_TO (bnd));
5102 	  FENCE_INSN (fence) = bnd_to;
5103 	  BND_TO (bnd) = bnd_to;
5104 	}
5105 
5106       av_set_clear (&BND_AV (bnd));
5107       BND_AV (bnd) = compute_av_set (BND_TO (bnd), NULL, 0, true);
5108 
5109       av_set_clear (&BND_AV1 (bnd));
5110       BND_AV1 (bnd) = av_set_copy (BND_AV (bnd));
5111 
5112       moveup_set_inside_insn_group (&BND_AV1 (bnd), NULL);
5113 
5114       av1_copy = av_set_copy (BND_AV1 (bnd));
5115       av_set_union_and_clear (av_vliw_p, &av1_copy, NULL);
5116     }
5117 
5118   if (sched_verbose >= 2)
5119     {
5120       sel_print ("Available exprs (vliw form): ");
5121       dump_av_set (*av_vliw_p);
5122       sel_print ("\n");
5123     }
5124 }
5125 
5126 /* Calculate the sequential av set on BND corresponding to the EXPR_VLIW
5127    expression.  When FOR_MOVEOP is true, also replace the register of
5128    expressions found with the register from EXPR_VLIW.  */
5129 static av_set_t
5130 find_sequential_best_exprs (bnd_t bnd, expr_t expr_vliw, bool for_moveop)
5131 {
5132   av_set_t expr_seq = NULL;
5133   expr_t expr;
5134   av_set_iterator i;
5135 
5136   FOR_EACH_EXPR (expr, i, BND_AV (bnd))
5137     {
5138       if (equal_after_moveup_path_p (expr, NULL, expr_vliw))
5139         {
5140           if (for_moveop)
5141             {
5142               /* The sequential expression has the right form to pass
5143                  to move_op except when renaming happened.  Put the
5144                  correct register in EXPR then.  */
5145               if (EXPR_SEPARABLE_P (expr) && REG_P (EXPR_LHS (expr)))
5146 		{
5147                   if (expr_dest_regno (expr) != expr_dest_regno (expr_vliw))
5148 		    {
5149 		      replace_dest_with_reg_in_expr (expr, EXPR_LHS (expr_vliw));
5150 		      stat_renamed_scheduled++;
5151 		    }
5152 		  /* Also put the correct TARGET_AVAILABLE bit on the expr.
5153                      This is needed when renaming came up with original
5154                      register.  */
5155                   else if (EXPR_TARGET_AVAILABLE (expr)
5156                            != EXPR_TARGET_AVAILABLE (expr_vliw))
5157 		    {
5158 		      gcc_assert (EXPR_TARGET_AVAILABLE (expr_vliw) == 1);
5159 		      EXPR_TARGET_AVAILABLE (expr) = 1;
5160 		    }
5161 		}
5162               if (EXPR_WAS_SUBSTITUTED (expr))
5163                 stat_substitutions_total++;
5164             }
5165 
5166           av_set_add (&expr_seq, expr);
5167 
5168           /* With substitution inside insn group, it is possible
5169              that more than one expression in expr_seq will correspond
5170              to expr_vliw.  In this case, choose one as the attempt to
5171              move both leads to miscompiles.  */
5172           break;
5173         }
5174     }
5175 
5176   if (for_moveop && sched_verbose >= 2)
5177     {
5178       sel_print ("Best expression(s) (sequential form): ");
5179       dump_av_set (expr_seq);
5180       sel_print ("\n");
5181     }
5182 
5183   return expr_seq;
5184 }
5185 
5186 
5187 /* Move nop to previous block.  */
5188 static void ATTRIBUTE_UNUSED
5189 move_nop_to_previous_block (insn_t nop, basic_block prev_bb)
5190 {
5191   insn_t prev_insn, next_insn, note;
5192 
5193   gcc_assert (sel_bb_head_p (nop)
5194               && prev_bb == BLOCK_FOR_INSN (nop)->prev_bb);
5195   note = bb_note (BLOCK_FOR_INSN (nop));
5196   prev_insn = sel_bb_end (prev_bb);
5197   next_insn = NEXT_INSN (nop);
5198   gcc_assert (prev_insn != NULL_RTX
5199               && PREV_INSN (note) == prev_insn);
5200 
5201   SET_NEXT_INSN (prev_insn) = nop;
5202   SET_PREV_INSN (nop) = prev_insn;
5203 
5204   SET_PREV_INSN (note) = nop;
5205   SET_NEXT_INSN (note) = next_insn;
5206 
5207   SET_NEXT_INSN (nop) = note;
5208   SET_PREV_INSN (next_insn) = note;
5209 
5210   BB_END (prev_bb) = nop;
5211   BLOCK_FOR_INSN (nop) = prev_bb;
5212 }
5213 
5214 /* Prepare a place to insert the chosen expression on BND.  */
5215 static insn_t
5216 prepare_place_to_insert (bnd_t bnd)
5217 {
5218   insn_t place_to_insert;
5219 
5220   /* Init place_to_insert before calling move_op, as the later
5221      can possibly remove BND_TO (bnd).  */
5222   if (/* If this is not the first insn scheduled.  */
5223       BND_PTR (bnd))
5224     {
5225       /* Add it after last scheduled.  */
5226       place_to_insert = ILIST_INSN (BND_PTR (bnd));
5227       if (DEBUG_INSN_P (place_to_insert))
5228 	{
5229 	  ilist_t l = BND_PTR (bnd);
5230 	  while ((l = ILIST_NEXT (l)) &&
5231 		 DEBUG_INSN_P (ILIST_INSN (l)))
5232 	    ;
5233 	  if (!l)
5234 	    place_to_insert = NULL;
5235 	}
5236     }
5237   else
5238     place_to_insert = NULL;
5239 
5240   if (!place_to_insert)
5241     {
5242       /* Add it before BND_TO.  The difference is in the
5243          basic block, where INSN will be added.  */
5244       place_to_insert = get_nop_from_pool (BND_TO (bnd));
5245       gcc_assert (BLOCK_FOR_INSN (place_to_insert)
5246                   == BLOCK_FOR_INSN (BND_TO (bnd)));
5247     }
5248 
5249   return place_to_insert;
5250 }
5251 
5252 /* Find original instructions for EXPR_SEQ and move it to BND boundary.
5253    Return the expression to emit in C_EXPR.  */
5254 static bool
5255 move_exprs_to_boundary (bnd_t bnd, expr_t expr_vliw,
5256                         av_set_t expr_seq, expr_t c_expr)
5257 {
5258   bool b, should_move;
5259   unsigned book_uid;
5260   bitmap_iterator bi;
5261   int n_bookkeeping_copies_before_moveop;
5262 
5263   /* Make a move.  This call will remove the original operation,
5264      insert all necessary bookkeeping instructions and update the
5265      data sets.  After that all we have to do is add the operation
5266      at before BND_TO (BND).  */
5267   n_bookkeeping_copies_before_moveop = stat_bookkeeping_copies;
5268   max_uid_before_move_op = get_max_uid ();
5269   bitmap_clear (current_copies);
5270   bitmap_clear (current_originators);
5271 
5272   b = move_op (BND_TO (bnd), expr_seq, expr_vliw,
5273                get_dest_from_orig_ops (expr_seq), c_expr, &should_move);
5274 
5275   /* We should be able to find the expression we've chosen for
5276      scheduling.  */
5277   gcc_assert (b);
5278 
5279   if (stat_bookkeeping_copies > n_bookkeeping_copies_before_moveop)
5280     stat_insns_needed_bookkeeping++;
5281 
5282   EXECUTE_IF_SET_IN_BITMAP (current_copies, 0, book_uid, bi)
5283     {
5284       unsigned uid;
5285       bitmap_iterator bi;
5286 
5287       /* We allocate these bitmaps lazily.  */
5288       if (! INSN_ORIGINATORS_BY_UID (book_uid))
5289         INSN_ORIGINATORS_BY_UID (book_uid) = BITMAP_ALLOC (NULL);
5290 
5291       bitmap_copy (INSN_ORIGINATORS_BY_UID (book_uid),
5292                    current_originators);
5293 
5294       /* Transitively add all originators' originators.  */
5295       EXECUTE_IF_SET_IN_BITMAP (current_originators, 0, uid, bi)
5296        if (INSN_ORIGINATORS_BY_UID (uid))
5297 	 bitmap_ior_into (INSN_ORIGINATORS_BY_UID (book_uid),
5298 			  INSN_ORIGINATORS_BY_UID (uid));
5299     }
5300 
5301   return should_move;
5302 }
5303 
5304 
5305 /* Debug a DFA state as an array of bytes.  */
5306 static void
5307 debug_state (state_t state)
5308 {
5309   unsigned char *p;
5310   unsigned int i, size = dfa_state_size;
5311 
5312   sel_print ("state (%u):", size);
5313   for (i = 0, p = (unsigned char *) state; i < size; i++)
5314     sel_print (" %d", p[i]);
5315   sel_print ("\n");
5316 }
5317 
5318 /* Advance state on FENCE with INSN.  Return true if INSN is
5319    an ASM, and we should advance state once more.  */
5320 static bool
5321 advance_state_on_fence (fence_t fence, insn_t insn)
5322 {
5323   bool asm_p;
5324 
5325   if (recog_memoized (insn) >= 0)
5326     {
5327       int res;
5328       state_t temp_state = alloca (dfa_state_size);
5329 
5330       gcc_assert (!INSN_ASM_P (insn));
5331       asm_p = false;
5332 
5333       memcpy (temp_state, FENCE_STATE (fence), dfa_state_size);
5334       res = state_transition (FENCE_STATE (fence), insn);
5335       gcc_assert (res < 0);
5336 
5337       if (memcmp (temp_state, FENCE_STATE (fence), dfa_state_size))
5338         {
5339           FENCE_ISSUED_INSNS (fence)++;
5340 
5341           /* We should never issue more than issue_rate insns.  */
5342           if (FENCE_ISSUED_INSNS (fence) > issue_rate)
5343             gcc_unreachable ();
5344         }
5345     }
5346   else
5347     {
5348       /* This could be an ASM insn which we'd like to schedule
5349          on the next cycle.  */
5350       asm_p = INSN_ASM_P (insn);
5351       if (!FENCE_STARTS_CYCLE_P (fence) && asm_p)
5352         advance_one_cycle (fence);
5353     }
5354 
5355   if (sched_verbose >= 2)
5356     debug_state (FENCE_STATE (fence));
5357   if (!DEBUG_INSN_P (insn))
5358     FENCE_STARTS_CYCLE_P (fence) = 0;
5359   FENCE_ISSUE_MORE (fence) = can_issue_more;
5360   return asm_p;
5361 }
5362 
5363 /* Update FENCE on which INSN was scheduled and this INSN, too.  NEED_STALL
5364    is nonzero if we need to stall after issuing INSN.  */
5365 static void
5366 update_fence_and_insn (fence_t fence, insn_t insn, int need_stall)
5367 {
5368   bool asm_p;
5369 
5370   /* First, reflect that something is scheduled on this fence.  */
5371   asm_p = advance_state_on_fence (fence, insn);
5372   FENCE_LAST_SCHEDULED_INSN (fence) = insn;
5373   vec_safe_push (FENCE_EXECUTING_INSNS (fence), insn);
5374   if (SCHED_GROUP_P (insn))
5375     {
5376       FENCE_SCHED_NEXT (fence) = INSN_SCHED_NEXT (insn);
5377       SCHED_GROUP_P (insn) = 0;
5378     }
5379   else
5380     FENCE_SCHED_NEXT (fence) = NULL;
5381   if (INSN_UID (insn) < FENCE_READY_TICKS_SIZE (fence))
5382     FENCE_READY_TICKS (fence) [INSN_UID (insn)] = 0;
5383 
5384   /* Set instruction scheduling info.  This will be used in bundling,
5385      pipelining, tick computations etc.  */
5386   ++INSN_SCHED_TIMES (insn);
5387   EXPR_TARGET_AVAILABLE (INSN_EXPR (insn)) = true;
5388   EXPR_ORIG_SCHED_CYCLE (INSN_EXPR (insn)) = FENCE_CYCLE (fence);
5389   INSN_AFTER_STALL_P (insn) = FENCE_AFTER_STALL_P (fence);
5390   INSN_SCHED_CYCLE (insn) = FENCE_CYCLE (fence);
5391 
5392   /* This does not account for adjust_cost hooks, just add the biggest
5393      constant the hook may add to the latency.  TODO: make this
5394      a target dependent constant.  */
5395   INSN_READY_CYCLE (insn)
5396     = INSN_SCHED_CYCLE (insn) + (INSN_CODE (insn) < 0
5397                                  ? 1
5398                                  : maximal_insn_latency (insn) + 1);
5399 
5400   /* Change these fields last, as they're used above.  */
5401   FENCE_AFTER_STALL_P (fence) = 0;
5402   if (asm_p || need_stall)
5403     advance_one_cycle (fence);
5404 
5405   /* Indicate that we've scheduled something on this fence.  */
5406   FENCE_SCHEDULED_P (fence) = true;
5407   scheduled_something_on_previous_fence = true;
5408 
5409   /* Print debug information when insn's fields are updated.  */
5410   if (sched_verbose >= 2)
5411     {
5412       sel_print ("Scheduling insn: ");
5413       dump_insn_1 (insn, 1);
5414       sel_print ("\n");
5415     }
5416 }
5417 
5418 /* Update boundary BND (and, if needed, FENCE) with INSN, remove the
5419    old boundary from BNDSP, add new boundaries to BNDS_TAIL_P and
5420    return it.  */
5421 static blist_t *
5422 update_boundaries (fence_t fence, bnd_t bnd, insn_t insn, blist_t *bndsp,
5423                    blist_t *bnds_tailp)
5424 {
5425   succ_iterator si;
5426   insn_t succ;
5427 
5428   advance_deps_context (BND_DC (bnd), insn);
5429   FOR_EACH_SUCC_1 (succ, si, insn,
5430                    SUCCS_NORMAL | SUCCS_SKIP_TO_LOOP_EXITS)
5431     {
5432       ilist_t ptr = ilist_copy (BND_PTR (bnd));
5433 
5434       ilist_add (&ptr, insn);
5435 
5436       if (DEBUG_INSN_P (insn) && sel_bb_end_p (insn)
5437 	  && is_ineligible_successor (succ, ptr))
5438 	{
5439 	  ilist_clear (&ptr);
5440 	  continue;
5441 	}
5442 
5443       if (FENCE_INSN (fence) == insn && !sel_bb_end_p (insn))
5444 	{
5445 	  if (sched_verbose >= 9)
5446 	    sel_print ("Updating fence insn from %i to %i\n",
5447 		       INSN_UID (insn), INSN_UID (succ));
5448 	  FENCE_INSN (fence) = succ;
5449 	}
5450       blist_add (bnds_tailp, succ, ptr, BND_DC (bnd));
5451       bnds_tailp = &BLIST_NEXT (*bnds_tailp);
5452     }
5453 
5454   blist_remove (bndsp);
5455   return bnds_tailp;
5456 }
5457 
5458 /* Schedule EXPR_VLIW on BND.  Return the insn emitted.  */
5459 static insn_t
5460 schedule_expr_on_boundary (bnd_t bnd, expr_t expr_vliw, int seqno)
5461 {
5462   av_set_t expr_seq;
5463   expr_t c_expr = XALLOCA (expr_def);
5464   insn_t place_to_insert;
5465   insn_t insn;
5466   bool should_move;
5467 
5468   expr_seq = find_sequential_best_exprs (bnd, expr_vliw, true);
5469 
5470   /* In case of scheduling a jump skipping some other instructions,
5471      prepare CFG.  After this, jump is at the boundary and can be
5472      scheduled as usual insn by MOVE_OP.  */
5473   if (vinsn_cond_branch_p (EXPR_VINSN (expr_vliw)))
5474     {
5475       insn = EXPR_INSN_RTX (expr_vliw);
5476 
5477       /* Speculative jumps are not handled.  */
5478       if (insn != BND_TO (bnd)
5479           && !sel_insn_is_speculation_check (insn))
5480         move_cond_jump (insn, bnd);
5481     }
5482 
5483   /* Find a place for C_EXPR to schedule.  */
5484   place_to_insert = prepare_place_to_insert (bnd);
5485   should_move = move_exprs_to_boundary (bnd, expr_vliw, expr_seq, c_expr);
5486   clear_expr (c_expr);
5487 
5488   /* Add the instruction.  The corner case to care about is when
5489      the expr_seq set has more than one expr, and we chose the one that
5490      is not equal to expr_vliw.  Then expr_vliw may be insn in stream, and
5491      we can't use it.  Generate the new vinsn.  */
5492   if (INSN_IN_STREAM_P (EXPR_INSN_RTX (expr_vliw)))
5493     {
5494       vinsn_t vinsn_new;
5495 
5496       vinsn_new = vinsn_copy (EXPR_VINSN (expr_vliw), false);
5497       change_vinsn_in_expr (expr_vliw, vinsn_new);
5498       should_move = false;
5499     }
5500   if (should_move)
5501     insn = sel_move_insn (expr_vliw, seqno, place_to_insert);
5502   else
5503     insn = emit_insn_from_expr_after (expr_vliw, NULL, seqno,
5504                                       place_to_insert);
5505 
5506   /* Return the nops generated for preserving of data sets back
5507      into pool.  */
5508   if (INSN_NOP_P (place_to_insert))
5509     return_nop_to_pool (place_to_insert, !DEBUG_INSN_P (insn));
5510   remove_temp_moveop_nops (!DEBUG_INSN_P (insn));
5511 
5512   av_set_clear (&expr_seq);
5513 
5514   /* Save the expression scheduled so to reset target availability if we'll
5515      meet it later on the same fence.  */
5516   if (EXPR_WAS_RENAMED (expr_vliw))
5517     vinsn_vec_add (&vec_target_unavailable_vinsns, INSN_EXPR (insn));
5518 
5519   /* Check that the recent movement didn't destroyed loop
5520      structure.  */
5521   gcc_assert (!pipelining_p
5522               || current_loop_nest == NULL
5523               || loop_latch_edge (current_loop_nest));
5524   return insn;
5525 }
5526 
5527 /* Stall for N cycles on FENCE.  */
5528 static void
5529 stall_for_cycles (fence_t fence, int n)
5530 {
5531   int could_more;
5532 
5533   could_more = n > 1 || FENCE_ISSUED_INSNS (fence) < issue_rate;
5534   while (n--)
5535     advance_one_cycle (fence);
5536   if (could_more)
5537     FENCE_AFTER_STALL_P (fence) = 1;
5538 }
5539 
5540 /* Gather a parallel group of insns at FENCE and assign their seqno
5541    to SEQNO.  All scheduled insns are gathered in SCHEDULED_INSNS_TAILPP
5542    list for later recalculation of seqnos.  */
5543 static void
5544 fill_insns (fence_t fence, int seqno, ilist_t **scheduled_insns_tailpp)
5545 {
5546   blist_t bnds = NULL, *bnds_tailp;
5547   av_set_t av_vliw = NULL;
5548   insn_t insn = FENCE_INSN (fence);
5549 
5550   if (sched_verbose >= 2)
5551     sel_print ("Starting fill_insns for insn %d, cycle %d\n",
5552                INSN_UID (insn), FENCE_CYCLE (fence));
5553 
5554   blist_add (&bnds, insn, NULL, FENCE_DC (fence));
5555   bnds_tailp = &BLIST_NEXT (bnds);
5556   set_target_context (FENCE_TC (fence));
5557   can_issue_more = FENCE_ISSUE_MORE (fence);
5558   target_bb = INSN_BB (insn);
5559 
5560   /* Do while we can add any operation to the current group.  */
5561   do
5562     {
5563       blist_t *bnds_tailp1, *bndsp;
5564       expr_t expr_vliw;
5565       int need_stall = false;
5566       int was_stall = 0, scheduled_insns = 0;
5567       int max_insns = pipelining_p ? issue_rate : 2 * issue_rate;
5568       int max_stall = pipelining_p ? 1 : 3;
5569       bool last_insn_was_debug = false;
5570       bool was_debug_bb_end_p = false;
5571 
5572       compute_av_set_on_boundaries (fence, bnds, &av_vliw);
5573       remove_insns_that_need_bookkeeping (fence, &av_vliw);
5574       remove_insns_for_debug (bnds, &av_vliw);
5575 
5576       /* Return early if we have nothing to schedule.  */
5577       if (av_vliw == NULL)
5578         break;
5579 
5580       /* Choose the best expression and, if needed, destination register
5581 	 for it.  */
5582       do
5583         {
5584           expr_vliw = find_best_expr (&av_vliw, bnds, fence, &need_stall);
5585           if (! expr_vliw && need_stall)
5586             {
5587               /* All expressions required a stall.  Do not recompute av sets
5588                  as we'll get the same answer (modulo the insns between
5589                  the fence and its boundary, which will not be available for
5590                  pipelining).
5591 		 If we are going to stall for too long, break to recompute av
5592 		 sets and bring more insns for pipelining.  */
5593               was_stall++;
5594 	      if (need_stall <= 3)
5595 		stall_for_cycles (fence, need_stall);
5596 	      else
5597 		{
5598 		  stall_for_cycles (fence, 1);
5599 		  break;
5600 		}
5601             }
5602         }
5603       while (! expr_vliw && need_stall);
5604 
5605       /* Now either we've selected expr_vliw or we have nothing to schedule.  */
5606       if (!expr_vliw)
5607         {
5608 	  av_set_clear (&av_vliw);
5609           break;
5610         }
5611 
5612       bndsp = &bnds;
5613       bnds_tailp1 = bnds_tailp;
5614 
5615       do
5616 	/* This code will be executed only once until we'd have several
5617            boundaries per fence.  */
5618         {
5619 	  bnd_t bnd = BLIST_BND (*bndsp);
5620 
5621 	  if (!av_set_is_in_p (BND_AV1 (bnd), EXPR_VINSN (expr_vliw)))
5622 	    {
5623 	      bndsp = &BLIST_NEXT (*bndsp);
5624 	      continue;
5625 	    }
5626 
5627           insn = schedule_expr_on_boundary (bnd, expr_vliw, seqno);
5628 	  last_insn_was_debug = DEBUG_INSN_P (insn);
5629 	  if (last_insn_was_debug)
5630 	    was_debug_bb_end_p = (insn == BND_TO (bnd) && sel_bb_end_p (insn));
5631           update_fence_and_insn (fence, insn, need_stall);
5632           bnds_tailp = update_boundaries (fence, bnd, insn, bndsp, bnds_tailp);
5633 
5634 	  /* Add insn to the list of scheduled on this cycle instructions.  */
5635 	  ilist_add (*scheduled_insns_tailpp, insn);
5636 	  *scheduled_insns_tailpp = &ILIST_NEXT (**scheduled_insns_tailpp);
5637         }
5638       while (*bndsp != *bnds_tailp1);
5639 
5640       av_set_clear (&av_vliw);
5641       if (!last_insn_was_debug)
5642 	scheduled_insns++;
5643 
5644       /* We currently support information about candidate blocks only for
5645 	 one 'target_bb' block.  Hence we can't schedule after jump insn,
5646 	 as this will bring two boundaries and, hence, necessity to handle
5647 	 information for two or more blocks concurrently.  */
5648       if ((last_insn_was_debug ? was_debug_bb_end_p : sel_bb_end_p (insn))
5649           || (was_stall
5650               && (was_stall >= max_stall
5651                   || scheduled_insns >= max_insns)))
5652         break;
5653     }
5654   while (bnds);
5655 
5656   gcc_assert (!FENCE_BNDS (fence));
5657 
5658   /* Update boundaries of the FENCE.  */
5659   while (bnds)
5660     {
5661       ilist_t ptr = BND_PTR (BLIST_BND (bnds));
5662 
5663       if (ptr)
5664 	{
5665 	  insn = ILIST_INSN (ptr);
5666 
5667 	  if (!ilist_is_in_p (FENCE_BNDS (fence), insn))
5668 	    ilist_add (&FENCE_BNDS (fence), insn);
5669 	}
5670 
5671       blist_remove (&bnds);
5672     }
5673 
5674   /* Update target context on the fence.  */
5675   reset_target_context (FENCE_TC (fence), false);
5676 }
5677 
5678 /* All exprs in ORIG_OPS must have the same destination register or memory.
5679    Return that destination.  */
5680 static rtx
5681 get_dest_from_orig_ops (av_set_t orig_ops)
5682 {
5683   rtx dest = NULL_RTX;
5684   av_set_iterator av_it;
5685   expr_t expr;
5686   bool first_p = true;
5687 
5688   FOR_EACH_EXPR (expr, av_it, orig_ops)
5689     {
5690       rtx x = EXPR_LHS (expr);
5691 
5692       if (first_p)
5693 	{
5694 	  first_p = false;
5695 	  dest = x;
5696 	}
5697       else
5698 	gcc_assert (dest == x
5699 		    || (dest != NULL_RTX && x != NULL_RTX
5700 			&& rtx_equal_p (dest, x)));
5701     }
5702 
5703   return dest;
5704 }
5705 
5706 /* Update data sets for the bookkeeping block and record those expressions
5707    which become no longer available after inserting this bookkeeping.  */
5708 static void
5709 update_and_record_unavailable_insns (basic_block book_block)
5710 {
5711   av_set_iterator i;
5712   av_set_t old_av_set = NULL;
5713   expr_t cur_expr;
5714   rtx_insn *bb_end = sel_bb_end (book_block);
5715 
5716   /* First, get correct liveness in the bookkeeping block.  The problem is
5717      the range between the bookeeping insn and the end of block.  */
5718   update_liveness_on_insn (bb_end);
5719   if (control_flow_insn_p (bb_end))
5720     update_liveness_on_insn (PREV_INSN (bb_end));
5721 
5722   /* If there's valid av_set on BOOK_BLOCK, then there might exist another
5723      fence above, where we may choose to schedule an insn which is
5724      actually blocked from moving up with the bookkeeping we create here.  */
5725   if (AV_SET_VALID_P (sel_bb_head (book_block)))
5726     {
5727       old_av_set = av_set_copy (BB_AV_SET (book_block));
5728       update_data_sets (sel_bb_head (book_block));
5729 
5730       /* Traverse all the expressions in the old av_set and check whether
5731 	 CUR_EXPR is in new AV_SET.  */
5732       FOR_EACH_EXPR (cur_expr, i, old_av_set)
5733         {
5734           expr_t new_expr = av_set_lookup (BB_AV_SET (book_block),
5735 					   EXPR_VINSN (cur_expr));
5736 
5737           if (! new_expr
5738               /* In this case, we can just turn off the E_T_A bit, but we can't
5739                  represent this information with the current vector.  */
5740               || EXPR_TARGET_AVAILABLE (new_expr)
5741 		 != EXPR_TARGET_AVAILABLE (cur_expr))
5742 	    /* Unfortunately, the below code could be also fired up on
5743 	       separable insns, e.g. when moving insns through the new
5744 	       speculation check as in PR 53701.  */
5745             vinsn_vec_add (&vec_bookkeeping_blocked_vinsns, cur_expr);
5746         }
5747 
5748       av_set_clear (&old_av_set);
5749     }
5750 }
5751 
5752 /* The main effect of this function is that sparams->c_expr is merged
5753    with (or copied to) lparams->c_expr_merged.  If there's only one successor,
5754    we avoid merging anything by copying sparams->c_expr to lparams->c_expr_merged.
5755    lparams->c_expr_merged is copied back to sparams->c_expr after all
5756    successors has been traversed.  lparams->c_expr_local is an expr allocated
5757    on stack in the caller function, and is used if there is more than one
5758    successor.
5759 
5760    SUCC is one of the SUCCS_NORMAL successors of INSN,
5761    MOVEOP_DRV_CALL_RES is the result of call code_motion_path_driver on succ,
5762    LPARAMS and STATIC_PARAMS contain the parameters described above.  */
5763 static void
5764 move_op_merge_succs (insn_t insn ATTRIBUTE_UNUSED,
5765                      insn_t succ ATTRIBUTE_UNUSED,
5766 		     int moveop_drv_call_res,
5767 		     cmpd_local_params_p lparams, void *static_params)
5768 {
5769   moveop_static_params_p sparams = (moveop_static_params_p) static_params;
5770 
5771   /* Nothing to do, if original expr wasn't found below.  */
5772   if (moveop_drv_call_res != 1)
5773     return;
5774 
5775   /* If this is a first successor.  */
5776   if (!lparams->c_expr_merged)
5777     {
5778       lparams->c_expr_merged = sparams->c_expr;
5779       sparams->c_expr = lparams->c_expr_local;
5780     }
5781   else
5782     {
5783       /* We must merge all found expressions to get reasonable
5784 	 EXPR_SPEC_DONE_DS for the resulting insn.  If we don't
5785 	 do so then we can first find the expr with epsilon
5786 	 speculation success probability and only then with the
5787 	 good probability.  As a result the insn will get epsilon
5788 	 probability and will never be scheduled because of
5789 	 weakness_cutoff in find_best_expr.
5790 
5791 	 We call merge_expr_data here instead of merge_expr
5792 	 because due to speculation C_EXPR and X may have the
5793 	 same insns with different speculation types.  And as of
5794 	 now such insns are considered non-equal.
5795 
5796 	 However, EXPR_SCHED_TIMES is different -- we must get
5797 	 SCHED_TIMES from a real insn, not a bookkeeping copy.
5798 	 We force this here.  Instead, we may consider merging
5799 	 SCHED_TIMES to the maximum instead of minimum in the
5800 	 below function.  */
5801       int old_times = EXPR_SCHED_TIMES (lparams->c_expr_merged);
5802 
5803       merge_expr_data (lparams->c_expr_merged, sparams->c_expr, NULL);
5804       if (EXPR_SCHED_TIMES (sparams->c_expr) == 0)
5805 	EXPR_SCHED_TIMES (lparams->c_expr_merged) = old_times;
5806 
5807       clear_expr (sparams->c_expr);
5808     }
5809 }
5810 
5811 /*  Add used regs for the successor SUCC into SPARAMS->USED_REGS.
5812 
5813    SUCC is one of the SUCCS_NORMAL successors of INSN,
5814    MOVEOP_DRV_CALL_RES is the result of call code_motion_path_driver on succ or 0,
5815      if SUCC is one of SUCCS_BACK or SUCCS_OUT.
5816    STATIC_PARAMS contain USED_REGS set.  */
5817 static void
5818 fur_merge_succs (insn_t insn ATTRIBUTE_UNUSED, insn_t succ,
5819 		 int moveop_drv_call_res,
5820 		 cmpd_local_params_p lparams ATTRIBUTE_UNUSED,
5821 		 void *static_params)
5822 {
5823   regset succ_live;
5824   fur_static_params_p sparams = (fur_static_params_p) static_params;
5825 
5826   /* Here we compute live regsets only for branches that do not lie
5827      on the code motion paths.  These branches correspond to value
5828      MOVEOP_DRV_CALL_RES==0 and include SUCCS_BACK and SUCCS_OUT, though
5829      for such branches code_motion_path_driver is not called.  */
5830   if (moveop_drv_call_res != 0)
5831     return;
5832 
5833   /* Mark all registers that do not meet the following condition:
5834      (3) not live on the other path of any conditional branch
5835      that is passed by the operation, in case original
5836      operations are not present on both paths of the
5837      conditional branch.  */
5838   succ_live = compute_live (succ);
5839   IOR_REG_SET (sparams->used_regs, succ_live);
5840 }
5841 
5842 /* This function is called after the last successor.  Copies LP->C_EXPR_MERGED
5843    into SP->CEXPR.  */
5844 static void
5845 move_op_after_merge_succs (cmpd_local_params_p lp, void *sparams)
5846 {
5847   moveop_static_params_p sp = (moveop_static_params_p) sparams;
5848 
5849   sp->c_expr = lp->c_expr_merged;
5850 }
5851 
5852 /* Track bookkeeping copies created, insns scheduled, and blocks for
5853    rescheduling when INSN is found by move_op.  */
5854 static void
5855 track_scheduled_insns_and_blocks (rtx insn)
5856 {
5857   /* Even if this insn can be a copy that will be removed during current move_op,
5858      we still need to count it as an originator.  */
5859   bitmap_set_bit (current_originators, INSN_UID (insn));
5860 
5861   if (!bitmap_clear_bit (current_copies, INSN_UID (insn)))
5862     {
5863       /* Note that original block needs to be rescheduled, as we pulled an
5864 	 instruction out of it.  */
5865       if (INSN_SCHED_TIMES (insn) > 0)
5866 	bitmap_set_bit (blocks_to_reschedule, BLOCK_FOR_INSN (insn)->index);
5867       else if (INSN_UID (insn) < first_emitted_uid && !DEBUG_INSN_P (insn))
5868 	num_insns_scheduled++;
5869     }
5870 
5871   /* For instructions we must immediately remove insn from the
5872      stream, so subsequent update_data_sets () won't include this
5873      insn into av_set.
5874      For expr we must make insn look like "INSN_REG (insn) := c_expr".  */
5875   if (INSN_UID (insn) > max_uid_before_move_op)
5876     stat_bookkeeping_copies--;
5877 }
5878 
5879 /* Emit a register-register copy for INSN if needed.  Return true if
5880    emitted one.  PARAMS is the move_op static parameters.  */
5881 static bool
5882 maybe_emit_renaming_copy (rtx_insn *insn,
5883                           moveop_static_params_p params)
5884 {
5885   bool insn_emitted  = false;
5886   rtx cur_reg;
5887 
5888   /* Bail out early when expression can not be renamed at all.  */
5889   if (!EXPR_SEPARABLE_P (params->c_expr))
5890     return false;
5891 
5892   cur_reg = expr_dest_reg (params->c_expr);
5893   gcc_assert (cur_reg && params->dest && REG_P (params->dest));
5894 
5895   /* If original operation has expr and the register chosen for
5896      that expr is not original operation's dest reg, substitute
5897      operation's right hand side with the register chosen.  */
5898   if (REGNO (params->dest) != REGNO (cur_reg))
5899     {
5900       insn_t reg_move_insn, reg_move_insn_rtx;
5901 
5902       reg_move_insn_rtx = create_insn_rtx_with_rhs (INSN_VINSN (insn),
5903                                                     params->dest);
5904       reg_move_insn = sel_gen_insn_from_rtx_after (reg_move_insn_rtx,
5905                                                    INSN_EXPR (insn),
5906                                                    INSN_SEQNO (insn),
5907                                                    insn);
5908       EXPR_SPEC_DONE_DS (INSN_EXPR (reg_move_insn)) = 0;
5909       replace_dest_with_reg_in_expr (params->c_expr, params->dest);
5910 
5911       insn_emitted = true;
5912       params->was_renamed = true;
5913     }
5914 
5915   return insn_emitted;
5916 }
5917 
5918 /* Emit a speculative check for INSN speculated as EXPR if needed.
5919    Return true if we've  emitted one.  PARAMS is the move_op static
5920    parameters.  */
5921 static bool
5922 maybe_emit_speculative_check (rtx_insn *insn, expr_t expr,
5923                               moveop_static_params_p params)
5924 {
5925   bool insn_emitted = false;
5926   insn_t x;
5927   ds_t check_ds;
5928 
5929   check_ds = get_spec_check_type_for_insn (insn, expr);
5930   if (check_ds != 0)
5931     {
5932       /* A speculation check should be inserted.  */
5933       x = create_speculation_check (params->c_expr, check_ds, insn);
5934       insn_emitted = true;
5935     }
5936   else
5937     {
5938       EXPR_SPEC_DONE_DS (INSN_EXPR (insn)) = 0;
5939       x = insn;
5940     }
5941 
5942   gcc_assert (EXPR_SPEC_DONE_DS (INSN_EXPR (x)) == 0
5943               && EXPR_SPEC_TO_CHECK_DS (INSN_EXPR (x)) == 0);
5944   return insn_emitted;
5945 }
5946 
5947 /* Handle transformations that leave an insn in place of original
5948    insn such as renaming/speculation.  Return true if one of such
5949    transformations actually happened, and we have emitted this insn.  */
5950 static bool
5951 handle_emitting_transformations (rtx_insn *insn, expr_t expr,
5952                                  moveop_static_params_p params)
5953 {
5954   bool insn_emitted = false;
5955 
5956   insn_emitted = maybe_emit_renaming_copy (insn, params);
5957   insn_emitted |= maybe_emit_speculative_check (insn, expr, params);
5958 
5959   return insn_emitted;
5960 }
5961 
5962 /* If INSN is the only insn in the basic block (not counting JUMP,
5963    which may be a jump to next insn, and DEBUG_INSNs), we want to
5964    leave a NOP there till the return to fill_insns.  */
5965 
5966 static bool
5967 need_nop_to_preserve_insn_bb (rtx_insn *insn)
5968 {
5969   insn_t bb_head, bb_end, bb_next, in_next;
5970   basic_block bb = BLOCK_FOR_INSN (insn);
5971 
5972   bb_head = sel_bb_head (bb);
5973   bb_end = sel_bb_end (bb);
5974 
5975   if (bb_head == bb_end)
5976     return true;
5977 
5978   while (bb_head != bb_end && DEBUG_INSN_P (bb_head))
5979     bb_head = NEXT_INSN (bb_head);
5980 
5981   if (bb_head == bb_end)
5982     return true;
5983 
5984   while (bb_head != bb_end && DEBUG_INSN_P (bb_end))
5985     bb_end = PREV_INSN (bb_end);
5986 
5987   if (bb_head == bb_end)
5988     return true;
5989 
5990   bb_next = NEXT_INSN (bb_head);
5991   while (bb_next != bb_end && DEBUG_INSN_P (bb_next))
5992     bb_next = NEXT_INSN (bb_next);
5993 
5994   if (bb_next == bb_end && JUMP_P (bb_end))
5995     return true;
5996 
5997   in_next = NEXT_INSN (insn);
5998   while (DEBUG_INSN_P (in_next))
5999     in_next = NEXT_INSN (in_next);
6000 
6001   if (IN_CURRENT_FENCE_P (in_next))
6002     return true;
6003 
6004   return false;
6005 }
6006 
6007 /* Remove INSN from stream.  When ONLY_DISCONNECT is true, its data
6008    is not removed but reused when INSN is re-emitted.  */
6009 static void
6010 remove_insn_from_stream (rtx_insn *insn, bool only_disconnect)
6011 {
6012   /* If there's only one insn in the BB, make sure that a nop is
6013      inserted into it, so the basic block won't disappear when we'll
6014      delete INSN below with sel_remove_insn. It should also survive
6015      till the return to fill_insns.  */
6016   if (need_nop_to_preserve_insn_bb (insn))
6017     {
6018       insn_t nop = get_nop_from_pool (insn);
6019       gcc_assert (INSN_NOP_P (nop));
6020       vec_temp_moveop_nops.safe_push (nop);
6021     }
6022 
6023   sel_remove_insn (insn, only_disconnect, false);
6024 }
6025 
6026 /* This function is called when original expr is found.
6027    INSN - current insn traversed, EXPR - the corresponding expr found.
6028    LPARAMS is the local parameters of code modion driver, STATIC_PARAMS
6029    is static parameters of move_op.  */
6030 static void
6031 move_op_orig_expr_found (insn_t insn, expr_t expr,
6032                          cmpd_local_params_p lparams ATTRIBUTE_UNUSED,
6033                          void *static_params)
6034 {
6035   bool only_disconnect;
6036   moveop_static_params_p params = (moveop_static_params_p) static_params;
6037 
6038   copy_expr_onside (params->c_expr, INSN_EXPR (insn));
6039   track_scheduled_insns_and_blocks (insn);
6040   handle_emitting_transformations (insn, expr, params);
6041   only_disconnect = params->uid == INSN_UID (insn);
6042 
6043   /* Mark that we've disconnected an insn.  */
6044   if (only_disconnect)
6045     params->uid = -1;
6046   remove_insn_from_stream (insn, only_disconnect);
6047 }
6048 
6049 /* The function is called when original expr is found.
6050    INSN - current insn traversed, EXPR - the corresponding expr found,
6051    crosses_call and original_insns in STATIC_PARAMS are updated.  */
6052 static void
6053 fur_orig_expr_found (insn_t insn, expr_t expr ATTRIBUTE_UNUSED,
6054                      cmpd_local_params_p lparams ATTRIBUTE_UNUSED,
6055                      void *static_params)
6056 {
6057   fur_static_params_p params = (fur_static_params_p) static_params;
6058   regset tmp;
6059 
6060   if (CALL_P (insn))
6061     params->crosses_call = true;
6062 
6063   def_list_add (params->original_insns, insn, params->crosses_call);
6064 
6065   /* Mark the registers that do not meet the following condition:
6066     (2) not among the live registers of the point
6067 	immediately following the first original operation on
6068 	a given downward path, except for the original target
6069 	register of the operation.  */
6070   tmp = get_clear_regset_from_pool ();
6071   compute_live_below_insn (insn, tmp);
6072   AND_COMPL_REG_SET (tmp, INSN_REG_SETS (insn));
6073   AND_COMPL_REG_SET (tmp, INSN_REG_CLOBBERS (insn));
6074   IOR_REG_SET (params->used_regs, tmp);
6075   return_regset_to_pool (tmp);
6076 
6077   /* (*1) We need to add to USED_REGS registers that are read by
6078      INSN's lhs. This may lead to choosing wrong src register.
6079      E.g. (scheduling const expr enabled):
6080 
6081 	429: ax=0x0	<- Can't use AX for this expr (0x0)
6082 	433: dx=[bp-0x18]
6083 	427: [ax+dx+0x1]=ax
6084 	  REG_DEAD: ax
6085 	168: di=dx
6086 	  REG_DEAD: dx
6087      */
6088   /* FIXME: see comment above and enable MEM_P
6089      in vinsn_separable_p.  */
6090   gcc_assert (!VINSN_SEPARABLE_P (INSN_VINSN (insn))
6091 	      || !MEM_P (INSN_LHS (insn)));
6092 }
6093 
6094 /* This function is called on the ascending pass, before returning from
6095    current basic block.  */
6096 static void
6097 move_op_at_first_insn (insn_t insn, cmpd_local_params_p lparams,
6098                        void *static_params)
6099 {
6100   moveop_static_params_p sparams = (moveop_static_params_p) static_params;
6101   basic_block book_block = NULL;
6102 
6103   /* When we have removed the boundary insn for scheduling, which also
6104      happened to be the end insn in its bb, we don't need to update sets.  */
6105   if (!lparams->removed_last_insn
6106       && lparams->e1
6107       && sel_bb_head_p (insn))
6108     {
6109       /* We should generate bookkeeping code only if we are not at the
6110          top level of the move_op.  */
6111       if (sel_num_cfg_preds_gt_1 (insn))
6112         book_block = generate_bookkeeping_insn (sparams->c_expr,
6113                                                 lparams->e1, lparams->e2);
6114       /* Update data sets for the current insn.  */
6115       update_data_sets (insn);
6116     }
6117 
6118   /* If bookkeeping code was inserted, we need to update av sets of basic
6119      block that received bookkeeping.  After generation of bookkeeping insn,
6120      bookkeeping block does not contain valid av set because we are not following
6121      the original algorithm in every detail with regards to e.g. renaming
6122      simple reg-reg copies.  Consider example:
6123 
6124      bookkeeping block           scheduling fence
6125      \            /
6126       \    join  /
6127        ----------
6128        |        |
6129        ----------
6130       /           \
6131      /             \
6132      r1 := r2          r1 := r3
6133 
6134      We try to schedule insn "r1 := r3" on the current
6135      scheduling fence.  Also, note that av set of bookkeeping block
6136      contain both insns "r1 := r2" and "r1 := r3".  When the insn has
6137      been scheduled, the CFG is as follows:
6138 
6139      r1 := r3               r1 := r3
6140      bookkeeping block           scheduling fence
6141      \            /
6142       \    join  /
6143        ----------
6144        |        |
6145        ----------
6146       /          \
6147      /            \
6148      r1 := r2
6149 
6150      Here, insn "r1 := r3" was scheduled at the current scheduling point
6151      and bookkeeping code was generated at the bookeeping block.  This
6152      way insn "r1 := r2" is no longer available as a whole instruction
6153      (but only as expr) ahead of insn "r1 := r3" in bookkeeping block.
6154      This situation is handled by calling update_data_sets.
6155 
6156      Since update_data_sets is called only on the bookkeeping block, and
6157      it also may have predecessors with av_sets, containing instructions that
6158      are no longer available, we save all such expressions that become
6159      unavailable during data sets update on the bookkeeping block in
6160      VEC_BOOKKEEPING_BLOCKED_VINSNS.  Later we avoid selecting such
6161      expressions for scheduling.  This allows us to avoid recomputation of
6162      av_sets outside the code motion path.  */
6163 
6164   if (book_block)
6165     update_and_record_unavailable_insns (book_block);
6166 
6167   /* If INSN was previously marked for deletion, it's time to do it.  */
6168   if (lparams->removed_last_insn)
6169     insn = PREV_INSN (insn);
6170 
6171   /* Do not tidy control flow at the topmost moveop, as we can erroneously
6172      kill a block with a single nop in which the insn should be emitted.  */
6173   if (lparams->e1)
6174     tidy_control_flow (BLOCK_FOR_INSN (insn), true);
6175 }
6176 
6177 /* This function is called on the ascending pass, before returning from the
6178    current basic block.  */
6179 static void
6180 fur_at_first_insn (insn_t insn,
6181                    cmpd_local_params_p lparams ATTRIBUTE_UNUSED,
6182                    void *static_params ATTRIBUTE_UNUSED)
6183 {
6184   gcc_assert (!sel_bb_head_p (insn) || AV_SET_VALID_P (insn)
6185 	      || AV_LEVEL (insn) == -1);
6186 }
6187 
6188 /* Called on the backward stage of recursion to call moveup_expr for insn
6189    and sparams->c_expr.  */
6190 static void
6191 move_op_ascend (insn_t insn, void *static_params)
6192 {
6193   enum MOVEUP_EXPR_CODE res;
6194   moveop_static_params_p sparams = (moveop_static_params_p) static_params;
6195 
6196   if (! INSN_NOP_P (insn))
6197     {
6198       res = moveup_expr_cached (sparams->c_expr, insn, false);
6199       gcc_assert (res != MOVEUP_EXPR_NULL);
6200     }
6201 
6202   /* Update liveness for this insn as it was invalidated.  */
6203   update_liveness_on_insn (insn);
6204 }
6205 
6206 /* This function is called on enter to the basic block.
6207    Returns TRUE if this block already have been visited and
6208    code_motion_path_driver should return 1, FALSE otherwise.  */
6209 static int
6210 fur_on_enter (insn_t insn ATTRIBUTE_UNUSED, cmpd_local_params_p local_params,
6211 	      void *static_params, bool visited_p)
6212 {
6213   fur_static_params_p sparams = (fur_static_params_p) static_params;
6214 
6215   if (visited_p)
6216     {
6217       /* If we have found something below this block, there should be at
6218 	 least one insn in ORIGINAL_INSNS.  */
6219       gcc_assert (*sparams->original_insns);
6220 
6221       /* Adjust CROSSES_CALL, since we may have come to this block along
6222 	 different path.  */
6223       DEF_LIST_DEF (*sparams->original_insns)->crosses_call
6224 	  |= sparams->crosses_call;
6225     }
6226   else
6227     local_params->old_original_insns = *sparams->original_insns;
6228 
6229   return 1;
6230 }
6231 
6232 /* Same as above but for move_op.   */
6233 static int
6234 move_op_on_enter (insn_t insn ATTRIBUTE_UNUSED,
6235                   cmpd_local_params_p local_params ATTRIBUTE_UNUSED,
6236                   void *static_params ATTRIBUTE_UNUSED, bool visited_p)
6237 {
6238   if (visited_p)
6239     return -1;
6240   return 1;
6241 }
6242 
6243 /* This function is called while descending current basic block if current
6244    insn is not the original EXPR we're searching for.
6245 
6246    Return value: FALSE, if code_motion_path_driver should perform a local
6247 			cleanup and return 0 itself;
6248 		 TRUE, if code_motion_path_driver should continue.  */
6249 static bool
6250 move_op_orig_expr_not_found (insn_t insn, av_set_t orig_ops ATTRIBUTE_UNUSED,
6251 			    void *static_params)
6252 {
6253   moveop_static_params_p sparams = (moveop_static_params_p) static_params;
6254 
6255 #ifdef ENABLE_CHECKING
6256   sparams->failed_insn = insn;
6257 #endif
6258 
6259   /* If we're scheduling separate expr, in order to generate correct code
6260      we need to stop the search at bookkeeping code generated with the
6261      same destination register or memory.  */
6262   if (lhs_of_insn_equals_to_dest_p (insn, sparams->dest))
6263     return false;
6264   return true;
6265 }
6266 
6267 /* This function is called while descending current basic block if current
6268    insn is not the original EXPR we're searching for.
6269 
6270    Return value: TRUE (code_motion_path_driver should continue).  */
6271 static bool
6272 fur_orig_expr_not_found (insn_t insn, av_set_t orig_ops, void *static_params)
6273 {
6274   bool mutexed;
6275   expr_t r;
6276   av_set_iterator avi;
6277   fur_static_params_p sparams = (fur_static_params_p) static_params;
6278 
6279   if (CALL_P (insn))
6280     sparams->crosses_call = true;
6281   else if (DEBUG_INSN_P (insn))
6282     return true;
6283 
6284   /* If current insn we are looking at cannot be executed together
6285      with original insn, then we can skip it safely.
6286 
6287      Example: ORIG_OPS = { (p6) r14 = sign_extend (r15); }
6288 	      INSN = (!p6) r14 = r14 + 1;
6289 
6290      Here we can schedule ORIG_OP with lhs = r14, though only
6291      looking at the set of used and set registers of INSN we must
6292      forbid it.  So, add set/used in INSN registers to the
6293      untouchable set only if there is an insn in ORIG_OPS that can
6294      affect INSN.  */
6295   mutexed = true;
6296   FOR_EACH_EXPR (r, avi, orig_ops)
6297     if (!sched_insns_conditions_mutex_p (insn, EXPR_INSN_RTX (r)))
6298       {
6299 	mutexed = false;
6300 	break;
6301       }
6302 
6303   /* Mark all registers that do not meet the following condition:
6304      (1) Not set or read on any path from xi to an instance of the
6305 	 original operation.  */
6306   if (!mutexed)
6307     {
6308       IOR_REG_SET (sparams->used_regs, INSN_REG_SETS (insn));
6309       IOR_REG_SET (sparams->used_regs, INSN_REG_USES (insn));
6310       IOR_REG_SET (sparams->used_regs, INSN_REG_CLOBBERS (insn));
6311     }
6312 
6313   return true;
6314 }
6315 
6316 /* Hooks and data to perform move_op operations with code_motion_path_driver.  */
6317 struct code_motion_path_driver_info_def move_op_hooks = {
6318   move_op_on_enter,
6319   move_op_orig_expr_found,
6320   move_op_orig_expr_not_found,
6321   move_op_merge_succs,
6322   move_op_after_merge_succs,
6323   move_op_ascend,
6324   move_op_at_first_insn,
6325   SUCCS_NORMAL,
6326   "move_op"
6327 };
6328 
6329 /* Hooks and data to perform find_used_regs operations
6330    with code_motion_path_driver.  */
6331 struct code_motion_path_driver_info_def fur_hooks = {
6332   fur_on_enter,
6333   fur_orig_expr_found,
6334   fur_orig_expr_not_found,
6335   fur_merge_succs,
6336   NULL, /* fur_after_merge_succs */
6337   NULL, /* fur_ascend */
6338   fur_at_first_insn,
6339   SUCCS_ALL,
6340   "find_used_regs"
6341 };
6342 
6343 /* Traverse all successors of INSN.  For each successor that is SUCCS_NORMAL
6344    code_motion_path_driver is called recursively.  Original operation
6345    was found at least on one path that is starting with one of INSN's
6346    successors (this fact is asserted).  ORIG_OPS is expressions we're looking
6347    for, PATH is the path we've traversed, STATIC_PARAMS is the parameters
6348    of either move_op or find_used_regs depending on the caller.
6349 
6350    Return 0 if we haven't found expression, 1 if we found it, -1 if we don't
6351    know for sure at this point.  */
6352 static int
6353 code_motion_process_successors (insn_t insn, av_set_t orig_ops,
6354                                 ilist_t path, void *static_params)
6355 {
6356   int res = 0;
6357   succ_iterator succ_i;
6358   insn_t succ;
6359   basic_block bb;
6360   int old_index;
6361   unsigned old_succs;
6362 
6363   struct cmpd_local_params lparams;
6364   expr_def _x;
6365 
6366   lparams.c_expr_local = &_x;
6367   lparams.c_expr_merged = NULL;
6368 
6369   /* We need to process only NORMAL succs for move_op, and collect live
6370      registers from ALL branches (including those leading out of the
6371      region) for find_used_regs.
6372 
6373      In move_op, there can be a case when insn's bb number has changed
6374      due to created bookkeeping.  This happens very rare, as we need to
6375      move expression from the beginning to the end of the same block.
6376      Rescan successors in this case.  */
6377 
6378  rescan:
6379   bb = BLOCK_FOR_INSN (insn);
6380   old_index = bb->index;
6381   old_succs = EDGE_COUNT (bb->succs);
6382 
6383   FOR_EACH_SUCC_1 (succ, succ_i, insn, code_motion_path_driver_info->succ_flags)
6384     {
6385       int b;
6386 
6387       lparams.e1 = succ_i.e1;
6388       lparams.e2 = succ_i.e2;
6389 
6390       /* Go deep into recursion only for NORMAL edges (non-backedges within the
6391 	 current region).  */
6392       if (succ_i.current_flags == SUCCS_NORMAL)
6393 	b = code_motion_path_driver (succ, orig_ops, path, &lparams,
6394 				     static_params);
6395       else
6396 	b = 0;
6397 
6398       /* Merge c_expres found or unify live register sets from different
6399 	 successors.  */
6400       code_motion_path_driver_info->merge_succs (insn, succ, b, &lparams,
6401 						 static_params);
6402       if (b == 1)
6403         res = b;
6404       else if (b == -1 && res != 1)
6405         res = b;
6406 
6407       /* We have simplified the control flow below this point.  In this case,
6408          the iterator becomes invalid.  We need to try again.
6409 	 If we have removed the insn itself, it could be only an
6410 	 unconditional jump.  Thus, do not rescan but break immediately --
6411 	 we have already visited the only successor block.  */
6412       if (!BLOCK_FOR_INSN (insn))
6413 	{
6414 	  if (sched_verbose >= 6)
6415 	    sel_print ("Not doing rescan: already visited the only successor"
6416 		       " of block %d\n", old_index);
6417 	  break;
6418 	}
6419       if (BLOCK_FOR_INSN (insn)->index != old_index
6420           || EDGE_COUNT (bb->succs) != old_succs)
6421         {
6422 	  if (sched_verbose >= 6)
6423 	    sel_print ("Rescan: CFG was simplified below insn %d, block %d\n",
6424 		       INSN_UID (insn), BLOCK_FOR_INSN (insn)->index);
6425           insn = sel_bb_end (BLOCK_FOR_INSN (insn));
6426           goto rescan;
6427         }
6428     }
6429 
6430 #ifdef ENABLE_CHECKING
6431   /* Here, RES==1 if original expr was found at least for one of the
6432      successors.  After the loop, RES may happen to have zero value
6433      only if at some point the expr searched is present in av_set, but is
6434      not found below.  In most cases, this situation is an error.
6435      The exception is when the original operation is blocked by
6436      bookkeeping generated for another fence or for another path in current
6437      move_op.  */
6438   gcc_assert (res == 1
6439 	      || (res == 0
6440 		  && av_set_could_be_blocked_by_bookkeeping_p (orig_ops,
6441 							       static_params))
6442 	      || res == -1);
6443 #endif
6444 
6445   /* Merge data, clean up, etc.  */
6446   if (res != -1 && code_motion_path_driver_info->after_merge_succs)
6447     code_motion_path_driver_info->after_merge_succs (&lparams, static_params);
6448 
6449   return res;
6450 }
6451 
6452 
6453 /* Perform a cleanup when the driver is about to terminate.  ORIG_OPS_P
6454    is the pointer to the av set with expressions we were looking for,
6455    PATH_P is the pointer to the traversed path.  */
6456 static inline void
6457 code_motion_path_driver_cleanup (av_set_t *orig_ops_p, ilist_t *path_p)
6458 {
6459   ilist_remove (path_p);
6460   av_set_clear (orig_ops_p);
6461 }
6462 
6463 /* The driver function that implements move_op or find_used_regs
6464    functionality dependent whether code_motion_path_driver_INFO is set to
6465    &MOVE_OP_HOOKS or &FUR_HOOKS.  This function implements the common parts
6466    of code (CFG traversal etc) that are shared among both functions.  INSN
6467    is the insn we're starting the search from, ORIG_OPS are the expressions
6468    we're searching for, PATH is traversed path, LOCAL_PARAMS_IN are local
6469    parameters of the driver, and STATIC_PARAMS are static parameters of
6470    the caller.
6471 
6472    Returns whether original instructions were found.  Note that top-level
6473    code_motion_path_driver always returns true.  */
6474 static int
6475 code_motion_path_driver (insn_t insn, av_set_t orig_ops, ilist_t path,
6476 			 cmpd_local_params_p local_params_in,
6477 			 void *static_params)
6478 {
6479   expr_t expr = NULL;
6480   basic_block bb = BLOCK_FOR_INSN (insn);
6481   insn_t first_insn, bb_tail, before_first;
6482   bool removed_last_insn = false;
6483 
6484   if (sched_verbose >= 6)
6485     {
6486       sel_print ("%s (", code_motion_path_driver_info->routine_name);
6487       dump_insn (insn);
6488       sel_print (",");
6489       dump_av_set (orig_ops);
6490       sel_print (")\n");
6491     }
6492 
6493   gcc_assert (orig_ops);
6494 
6495   /* If no original operations exist below this insn, return immediately.  */
6496   if (is_ineligible_successor (insn, path))
6497     {
6498       if (sched_verbose >= 6)
6499         sel_print ("Insn %d is ineligible successor\n", INSN_UID (insn));
6500       return false;
6501     }
6502 
6503   /* The block can have invalid av set, in which case it was created earlier
6504      during move_op.  Return immediately.  */
6505   if (sel_bb_head_p (insn))
6506     {
6507       if (! AV_SET_VALID_P (insn))
6508         {
6509           if (sched_verbose >= 6)
6510             sel_print ("Returned from block %d as it had invalid av set\n",
6511                        bb->index);
6512           return false;
6513         }
6514 
6515       if (bitmap_bit_p (code_motion_visited_blocks, bb->index))
6516         {
6517           /* We have already found an original operation on this branch, do not
6518              go any further and just return TRUE here.  If we don't stop here,
6519              function can have exponential behaviour even on the small code
6520              with many different paths (e.g. with data speculation and
6521              recovery blocks).  */
6522           if (sched_verbose >= 6)
6523             sel_print ("Block %d already visited in this traversal\n", bb->index);
6524           if (code_motion_path_driver_info->on_enter)
6525             return code_motion_path_driver_info->on_enter (insn,
6526                                                            local_params_in,
6527                                                            static_params,
6528                                                            true);
6529         }
6530     }
6531 
6532   if (code_motion_path_driver_info->on_enter)
6533     code_motion_path_driver_info->on_enter (insn, local_params_in,
6534                                             static_params, false);
6535   orig_ops = av_set_copy (orig_ops);
6536 
6537   /* Filter the orig_ops set.  */
6538   if (AV_SET_VALID_P (insn))
6539     av_set_code_motion_filter (&orig_ops, AV_SET (insn));
6540 
6541   /* If no more original ops, return immediately.  */
6542   if (!orig_ops)
6543     {
6544       if (sched_verbose >= 6)
6545         sel_print ("No intersection with av set of block %d\n", bb->index);
6546       return false;
6547     }
6548 
6549   /* For non-speculative insns we have to leave only one form of the
6550      original operation, because if we don't, we may end up with
6551      different C_EXPRes and, consequently, with bookkeepings for different
6552      expression forms along the same code motion path.  That may lead to
6553      generation of incorrect code.  So for each code motion we stick to
6554      the single form of the instruction,  except for speculative insns
6555      which we need to keep in different forms with all speculation
6556      types.  */
6557   av_set_leave_one_nonspec (&orig_ops);
6558 
6559   /* It is not possible that all ORIG_OPS are filtered out.  */
6560   gcc_assert (orig_ops);
6561 
6562   /* It is enough to place only heads and tails of visited basic blocks into
6563      the PATH.  */
6564   ilist_add (&path, insn);
6565   first_insn = insn;
6566   bb_tail = sel_bb_end (bb);
6567 
6568   /* Descend the basic block in search of the original expr; this part
6569      corresponds to the part of the original move_op procedure executed
6570      before the recursive call.  */
6571   for (;;)
6572     {
6573       /* Look at the insn and decide if it could be an ancestor of currently
6574 	 scheduling operation.  If it is so, then the insn "dest = op" could
6575 	 either be replaced with "dest = reg", because REG now holds the result
6576 	 of OP, or just removed, if we've scheduled the insn as a whole.
6577 
6578 	 If this insn doesn't contain currently scheduling OP, then proceed
6579 	 with searching and look at its successors.  Operations we're searching
6580 	 for could have changed when moving up through this insn via
6581 	 substituting.  In this case, perform unsubstitution on them first.
6582 
6583 	 When traversing the DAG below this insn is finished, insert
6584 	 bookkeeping code, if the insn is a joint point, and remove
6585 	 leftovers.  */
6586 
6587       expr = av_set_lookup (orig_ops, INSN_VINSN (insn));
6588       if (expr)
6589 	{
6590 	  insn_t last_insn = PREV_INSN (insn);
6591 
6592 	  /* We have found the original operation.   */
6593           if (sched_verbose >= 6)
6594             sel_print ("Found original operation at insn %d\n", INSN_UID (insn));
6595 
6596 	  code_motion_path_driver_info->orig_expr_found
6597             (insn, expr, local_params_in, static_params);
6598 
6599 	  /* Step back, so on the way back we'll start traversing from the
6600 	     previous insn (or we'll see that it's bb_note and skip that
6601 	     loop).  */
6602           if (insn == first_insn)
6603             {
6604               first_insn = NEXT_INSN (last_insn);
6605               removed_last_insn = sel_bb_end_p (last_insn);
6606             }
6607 	  insn = last_insn;
6608 	  break;
6609 	}
6610       else
6611 	{
6612 	  /* We haven't found the original expr, continue descending the basic
6613 	     block.  */
6614 	  if (code_motion_path_driver_info->orig_expr_not_found
6615               (insn, orig_ops, static_params))
6616 	    {
6617 	      /* Av set ops could have been changed when moving through this
6618 	         insn.  To find them below it, we have to un-substitute them.  */
6619 	      undo_transformations (&orig_ops, insn);
6620 	    }
6621 	  else
6622 	    {
6623 	      /* Clean up and return, if the hook tells us to do so.  It may
6624 		 happen if we've encountered the previously created
6625 		 bookkeeping.  */
6626 	      code_motion_path_driver_cleanup (&orig_ops, &path);
6627 	      return -1;
6628 	    }
6629 
6630 	  gcc_assert (orig_ops);
6631         }
6632 
6633       /* Stop at insn if we got to the end of BB.  */
6634       if (insn == bb_tail)
6635 	break;
6636 
6637       insn = NEXT_INSN (insn);
6638     }
6639 
6640   /* Here INSN either points to the insn before the original insn (may be
6641      bb_note, if original insn was a bb_head) or to the bb_end.  */
6642   if (!expr)
6643     {
6644       int res;
6645       rtx_insn *last_insn = PREV_INSN (insn);
6646       bool added_to_path;
6647 
6648       gcc_assert (insn == sel_bb_end (bb));
6649 
6650       /* Add bb tail to PATH (but it doesn't make any sense if it's a bb_head -
6651 	 it's already in PATH then).  */
6652       if (insn != first_insn)
6653 	{
6654 	  ilist_add (&path, insn);
6655 	  added_to_path = true;
6656 	}
6657       else
6658         added_to_path = false;
6659 
6660       /* Process_successors should be able to find at least one
6661 	 successor for which code_motion_path_driver returns TRUE.  */
6662       res = code_motion_process_successors (insn, orig_ops,
6663                                             path, static_params);
6664 
6665       /* Jump in the end of basic block could have been removed or replaced
6666          during code_motion_process_successors, so recompute insn as the
6667          last insn in bb.  */
6668       if (NEXT_INSN (last_insn) != insn)
6669         {
6670           insn = sel_bb_end (bb);
6671           first_insn = sel_bb_head (bb);
6672         }
6673 
6674       /* Remove bb tail from path.  */
6675       if (added_to_path)
6676 	ilist_remove (&path);
6677 
6678       if (res != 1)
6679 	{
6680 	  /* This is the case when one of the original expr is no longer available
6681 	     due to bookkeeping created on this branch with the same register.
6682 	     In the original algorithm, which doesn't have update_data_sets call
6683 	     on a bookkeeping block, it would simply result in returning
6684 	     FALSE when we've encountered a previously generated bookkeeping
6685 	     insn in moveop_orig_expr_not_found.  */
6686 	  code_motion_path_driver_cleanup (&orig_ops, &path);
6687 	  return res;
6688 	}
6689     }
6690 
6691   /* Don't need it any more.  */
6692   av_set_clear (&orig_ops);
6693 
6694   /* Backward pass: now, when we have C_EXPR computed, we'll drag it to
6695      the beginning of the basic block.  */
6696   before_first = PREV_INSN (first_insn);
6697   while (insn != before_first)
6698     {
6699       if (code_motion_path_driver_info->ascend)
6700 	code_motion_path_driver_info->ascend (insn, static_params);
6701 
6702       insn = PREV_INSN (insn);
6703     }
6704 
6705   /* Now we're at the bb head.  */
6706   insn = first_insn;
6707   ilist_remove (&path);
6708   local_params_in->removed_last_insn = removed_last_insn;
6709   code_motion_path_driver_info->at_first_insn (insn, local_params_in, static_params);
6710 
6711   /* This should be the very last operation as at bb head we could change
6712      the numbering by creating bookkeeping blocks.  */
6713   if (removed_last_insn)
6714     insn = PREV_INSN (insn);
6715 
6716   /* If we have simplified the control flow and removed the first jump insn,
6717      there's no point in marking this block in the visited blocks bitmap.  */
6718   if (BLOCK_FOR_INSN (insn))
6719     bitmap_set_bit (code_motion_visited_blocks, BLOCK_FOR_INSN (insn)->index);
6720   return true;
6721 }
6722 
6723 /* Move up the operations from ORIG_OPS set traversing the dag starting
6724    from INSN.  PATH represents the edges traversed so far.
6725    DEST is the register chosen for scheduling the current expr.  Insert
6726    bookkeeping code in the join points.  EXPR_VLIW is the chosen expression,
6727    C_EXPR is how it looks like at the given cfg point.
6728    Set *SHOULD_MOVE to indicate whether we have only disconnected
6729    one of the insns found.
6730 
6731    Returns whether original instructions were found, which is asserted
6732    to be true in the caller.  */
6733 static bool
6734 move_op (insn_t insn, av_set_t orig_ops, expr_t expr_vliw,
6735          rtx dest, expr_t c_expr, bool *should_move)
6736 {
6737   struct moveop_static_params sparams;
6738   struct cmpd_local_params lparams;
6739   int res;
6740 
6741   /* Init params for code_motion_path_driver.  */
6742   sparams.dest = dest;
6743   sparams.c_expr = c_expr;
6744   sparams.uid = INSN_UID (EXPR_INSN_RTX (expr_vliw));
6745 #ifdef ENABLE_CHECKING
6746   sparams.failed_insn = NULL;
6747 #endif
6748   sparams.was_renamed = false;
6749   lparams.e1 = NULL;
6750 
6751   /* We haven't visited any blocks yet.  */
6752   bitmap_clear (code_motion_visited_blocks);
6753 
6754   /* Set appropriate hooks and data.  */
6755   code_motion_path_driver_info = &move_op_hooks;
6756   res = code_motion_path_driver (insn, orig_ops, NULL, &lparams, &sparams);
6757 
6758   gcc_assert (res != -1);
6759 
6760   if (sparams.was_renamed)
6761     EXPR_WAS_RENAMED (expr_vliw) = true;
6762 
6763   *should_move = (sparams.uid == -1);
6764 
6765   return res;
6766 }
6767 
6768 
6769 /* Functions that work with regions.  */
6770 
6771 /* Current number of seqno used in init_seqno and init_seqno_1.  */
6772 static int cur_seqno;
6773 
6774 /* A helper for init_seqno.  Traverse the region starting from BB and
6775    compute seqnos for visited insns, marking visited bbs in VISITED_BBS.
6776    Clear visited blocks from BLOCKS_TO_RESCHEDULE.  */
6777 static void
6778 init_seqno_1 (basic_block bb, sbitmap visited_bbs, bitmap blocks_to_reschedule)
6779 {
6780   int bbi = BLOCK_TO_BB (bb->index);
6781   insn_t insn, note = bb_note (bb);
6782   insn_t succ_insn;
6783   succ_iterator si;
6784 
6785   bitmap_set_bit (visited_bbs, bbi);
6786   if (blocks_to_reschedule)
6787     bitmap_clear_bit (blocks_to_reschedule, bb->index);
6788 
6789   FOR_EACH_SUCC_1 (succ_insn, si, BB_END (bb),
6790 		   SUCCS_NORMAL | SUCCS_SKIP_TO_LOOP_EXITS)
6791     {
6792       basic_block succ = BLOCK_FOR_INSN (succ_insn);
6793       int succ_bbi = BLOCK_TO_BB (succ->index);
6794 
6795       gcc_assert (in_current_region_p (succ));
6796 
6797       if (!bitmap_bit_p (visited_bbs, succ_bbi))
6798 	{
6799 	  gcc_assert (succ_bbi > bbi);
6800 
6801 	  init_seqno_1 (succ, visited_bbs, blocks_to_reschedule);
6802 	}
6803       else if (blocks_to_reschedule)
6804         bitmap_set_bit (forced_ebb_heads, succ->index);
6805     }
6806 
6807   for (insn = BB_END (bb); insn != note; insn = PREV_INSN (insn))
6808     INSN_SEQNO (insn) = cur_seqno--;
6809 }
6810 
6811 /* Initialize seqnos for the current region.  BLOCKS_TO_RESCHEDULE contains
6812    blocks on which we're rescheduling when pipelining, FROM is the block where
6813    traversing region begins (it may not be the head of the region when
6814    pipelining, but the head of the loop instead).
6815 
6816    Returns the maximal seqno found.  */
6817 static int
6818 init_seqno (bitmap blocks_to_reschedule, basic_block from)
6819 {
6820   sbitmap visited_bbs;
6821   bitmap_iterator bi;
6822   unsigned bbi;
6823 
6824   visited_bbs = sbitmap_alloc (current_nr_blocks);
6825 
6826   if (blocks_to_reschedule)
6827     {
6828       bitmap_ones (visited_bbs);
6829       EXECUTE_IF_SET_IN_BITMAP (blocks_to_reschedule, 0, bbi, bi)
6830         {
6831 	  gcc_assert (BLOCK_TO_BB (bbi) < current_nr_blocks);
6832           bitmap_clear_bit (visited_bbs, BLOCK_TO_BB (bbi));
6833 	}
6834     }
6835   else
6836     {
6837       bitmap_clear (visited_bbs);
6838       from = EBB_FIRST_BB (0);
6839     }
6840 
6841   cur_seqno = sched_max_luid - 1;
6842   init_seqno_1 (from, visited_bbs, blocks_to_reschedule);
6843 
6844   /* cur_seqno may be positive if the number of instructions is less than
6845      sched_max_luid - 1 (when rescheduling or if some instructions have been
6846      removed by the call to purge_empty_blocks in sel_sched_region_1).  */
6847   gcc_assert (cur_seqno >= 0);
6848 
6849   sbitmap_free (visited_bbs);
6850   return sched_max_luid - 1;
6851 }
6852 
6853 /* Initialize scheduling parameters for current region.  */
6854 static void
6855 sel_setup_region_sched_flags (void)
6856 {
6857   enable_schedule_as_rhs_p = 1;
6858   bookkeeping_p = 1;
6859   pipelining_p = (bookkeeping_p
6860                   && (flag_sel_sched_pipelining != 0)
6861 		  && current_loop_nest != NULL
6862 		  && loop_has_exit_edges (current_loop_nest));
6863   max_insns_to_rename = PARAM_VALUE (PARAM_SELSCHED_INSNS_TO_RENAME);
6864   max_ws = MAX_WS;
6865 }
6866 
6867 /* Return true if all basic blocks of current region are empty.  */
6868 static bool
6869 current_region_empty_p (void)
6870 {
6871   int i;
6872   for (i = 0; i < current_nr_blocks; i++)
6873     if (! sel_bb_empty_p (BASIC_BLOCK_FOR_FN (cfun, BB_TO_BLOCK (i))))
6874       return false;
6875 
6876   return true;
6877 }
6878 
6879 /* Prepare and verify loop nest for pipelining.  */
6880 static void
6881 setup_current_loop_nest (int rgn, bb_vec_t *bbs)
6882 {
6883   current_loop_nest = get_loop_nest_for_rgn (rgn);
6884 
6885   if (!current_loop_nest)
6886     return;
6887 
6888   /* If this loop has any saved loop preheaders from nested loops,
6889      add these basic blocks to the current region.  */
6890   sel_add_loop_preheaders (bbs);
6891 
6892   /* Check that we're starting with a valid information.  */
6893   gcc_assert (loop_latch_edge (current_loop_nest));
6894   gcc_assert (LOOP_MARKED_FOR_PIPELINING_P (current_loop_nest));
6895 }
6896 
6897 /* Compute instruction priorities for current region.  */
6898 static void
6899 sel_compute_priorities (int rgn)
6900 {
6901   sched_rgn_compute_dependencies (rgn);
6902 
6903   /* Compute insn priorities in haifa style.  Then free haifa style
6904      dependencies that we've calculated for this.  */
6905   compute_priorities ();
6906 
6907   if (sched_verbose >= 5)
6908     debug_rgn_dependencies (0);
6909 
6910   free_rgn_deps ();
6911 }
6912 
6913 /* Init scheduling data for RGN.  Returns true when this region should not
6914    be scheduled.  */
6915 static bool
6916 sel_region_init (int rgn)
6917 {
6918   int i;
6919   bb_vec_t bbs;
6920 
6921   rgn_setup_region (rgn);
6922 
6923   /* Even if sched_is_disabled_for_current_region_p() is true, we still
6924      do region initialization here so the region can be bundled correctly,
6925      but we'll skip the scheduling in sel_sched_region ().  */
6926   if (current_region_empty_p ())
6927     return true;
6928 
6929   bbs.create (current_nr_blocks);
6930 
6931   for (i = 0; i < current_nr_blocks; i++)
6932     bbs.quick_push (BASIC_BLOCK_FOR_FN (cfun, BB_TO_BLOCK (i)));
6933 
6934   sel_init_bbs (bbs);
6935 
6936   if (flag_sel_sched_pipelining)
6937     setup_current_loop_nest (rgn, &bbs);
6938 
6939   sel_setup_region_sched_flags ();
6940 
6941   /* Initialize luids and dependence analysis which both sel-sched and haifa
6942      need.  */
6943   sched_init_luids (bbs);
6944   sched_deps_init (false);
6945 
6946   /* Initialize haifa data.  */
6947   rgn_setup_sched_infos ();
6948   sel_set_sched_flags ();
6949   haifa_init_h_i_d (bbs);
6950 
6951   sel_compute_priorities (rgn);
6952   init_deps_global ();
6953 
6954   /* Main initialization.  */
6955   sel_setup_sched_infos ();
6956   sel_init_global_and_expr (bbs);
6957 
6958   bbs.release ();
6959 
6960   blocks_to_reschedule = BITMAP_ALLOC (NULL);
6961 
6962   /* Init correct liveness sets on each instruction of a single-block loop.
6963      This is the only situation when we can't update liveness when calling
6964      compute_live for the first insn of the loop.  */
6965   if (current_loop_nest)
6966     {
6967       int header =
6968 	(sel_is_loop_preheader_p (BASIC_BLOCK_FOR_FN (cfun, BB_TO_BLOCK (0)))
6969 	 ? 1
6970 	 : 0);
6971 
6972       if (current_nr_blocks == header + 1)
6973         update_liveness_on_insn
6974           (sel_bb_head (BASIC_BLOCK_FOR_FN (cfun, BB_TO_BLOCK (header))));
6975     }
6976 
6977   /* Set hooks so that no newly generated insn will go out unnoticed.  */
6978   sel_register_cfg_hooks ();
6979 
6980   /* !!! We call target.sched.init () for the whole region, but we invoke
6981      targetm.sched.finish () for every ebb.  */
6982   if (targetm.sched.init)
6983     /* None of the arguments are actually used in any target.  */
6984     targetm.sched.init (sched_dump, sched_verbose, -1);
6985 
6986   first_emitted_uid = get_max_uid () + 1;
6987   preheader_removed = false;
6988 
6989   /* Reset register allocation ticks array.  */
6990   memset (reg_rename_tick, 0, sizeof reg_rename_tick);
6991   reg_rename_this_tick = 0;
6992 
6993   bitmap_initialize (forced_ebb_heads, 0);
6994   bitmap_clear (forced_ebb_heads);
6995 
6996   setup_nop_vinsn ();
6997   current_copies = BITMAP_ALLOC (NULL);
6998   current_originators = BITMAP_ALLOC (NULL);
6999   code_motion_visited_blocks = BITMAP_ALLOC (NULL);
7000 
7001   return false;
7002 }
7003 
7004 /* Simplify insns after the scheduling.  */
7005 static void
7006 simplify_changed_insns (void)
7007 {
7008   int i;
7009 
7010   for (i = 0; i < current_nr_blocks; i++)
7011     {
7012       basic_block bb = BASIC_BLOCK_FOR_FN (cfun, BB_TO_BLOCK (i));
7013       rtx_insn *insn;
7014 
7015       FOR_BB_INSNS (bb, insn)
7016 	if (INSN_P (insn))
7017 	  {
7018 	    expr_t expr = INSN_EXPR (insn);
7019 
7020 	    if (EXPR_WAS_SUBSTITUTED (expr))
7021 	      validate_simplify_insn (insn);
7022 	  }
7023     }
7024 }
7025 
7026 /* Find boundaries of the EBB starting from basic block BB, marking blocks of
7027    this EBB in SCHEDULED_BLOCKS and appropriately filling in HEAD, TAIL,
7028    PREV_HEAD, and NEXT_TAIL fields of CURRENT_SCHED_INFO structure.  */
7029 static void
7030 find_ebb_boundaries (basic_block bb, bitmap scheduled_blocks)
7031 {
7032   rtx_insn *head, *tail;
7033   basic_block bb1 = bb;
7034   if (sched_verbose >= 2)
7035     sel_print ("Finishing schedule in bbs: ");
7036 
7037   do
7038     {
7039       bitmap_set_bit (scheduled_blocks, BLOCK_TO_BB (bb1->index));
7040 
7041       if (sched_verbose >= 2)
7042 	sel_print ("%d; ", bb1->index);
7043     }
7044   while (!bb_ends_ebb_p (bb1) && (bb1 = bb_next_bb (bb1)));
7045 
7046   if (sched_verbose >= 2)
7047     sel_print ("\n");
7048 
7049   get_ebb_head_tail (bb, bb1, &head, &tail);
7050 
7051   current_sched_info->head = head;
7052   current_sched_info->tail = tail;
7053   current_sched_info->prev_head = PREV_INSN (head);
7054   current_sched_info->next_tail = NEXT_INSN (tail);
7055 }
7056 
7057 /* Regenerate INSN_SCHED_CYCLEs for insns of current EBB.  */
7058 static void
7059 reset_sched_cycles_in_current_ebb (void)
7060 {
7061   int last_clock = 0;
7062   int haifa_last_clock = -1;
7063   int haifa_clock = 0;
7064   int issued_insns = 0;
7065   insn_t insn;
7066 
7067   if (targetm.sched.init)
7068     {
7069       /* None of the arguments are actually used in any target.
7070 	 NB: We should have md_reset () hook for cases like this.  */
7071       targetm.sched.init (sched_dump, sched_verbose, -1);
7072     }
7073 
7074   state_reset (curr_state);
7075   advance_state (curr_state);
7076 
7077   for (insn = current_sched_info->head;
7078        insn != current_sched_info->next_tail;
7079        insn = NEXT_INSN (insn))
7080     {
7081       int cost, haifa_cost;
7082       int sort_p;
7083       bool asm_p, real_insn, after_stall, all_issued;
7084       int clock;
7085 
7086       if (!INSN_P (insn))
7087 	continue;
7088 
7089       asm_p = false;
7090       real_insn = recog_memoized (insn) >= 0;
7091       clock = INSN_SCHED_CYCLE (insn);
7092 
7093       cost = clock - last_clock;
7094 
7095       /* Initialize HAIFA_COST.  */
7096       if (! real_insn)
7097 	{
7098 	  asm_p = INSN_ASM_P (insn);
7099 
7100 	  if (asm_p)
7101 	    /* This is asm insn which *had* to be scheduled first
7102 	       on the cycle.  */
7103 	    haifa_cost = 1;
7104 	  else
7105 	    /* This is a use/clobber insn.  It should not change
7106 	       cost.  */
7107 	    haifa_cost = 0;
7108 	}
7109       else
7110         haifa_cost = estimate_insn_cost (insn, curr_state);
7111 
7112       /* Stall for whatever cycles we've stalled before.  */
7113       after_stall = 0;
7114       if (INSN_AFTER_STALL_P (insn) && cost > haifa_cost)
7115         {
7116           haifa_cost = cost;
7117           after_stall = 1;
7118         }
7119       all_issued = issued_insns == issue_rate;
7120       if (haifa_cost == 0 && all_issued)
7121 	haifa_cost = 1;
7122       if (haifa_cost > 0)
7123 	{
7124 	  int i = 0;
7125 
7126 	  while (haifa_cost--)
7127 	    {
7128 	      advance_state (curr_state);
7129 	      issued_insns = 0;
7130               i++;
7131 
7132 	      if (sched_verbose >= 2)
7133                 {
7134                   sel_print ("advance_state (state_transition)\n");
7135                   debug_state (curr_state);
7136                 }
7137 
7138               /* The DFA may report that e.g. insn requires 2 cycles to be
7139                  issued, but on the next cycle it says that insn is ready
7140                  to go.  Check this here.  */
7141               if (!after_stall
7142                   && real_insn
7143                   && haifa_cost > 0
7144                   && estimate_insn_cost (insn, curr_state) == 0)
7145                 break;
7146 
7147               /* When the data dependency stall is longer than the DFA stall,
7148                  and when we have issued exactly issue_rate insns and stalled,
7149                  it could be that after this longer stall the insn will again
7150                  become unavailable  to the DFA restrictions.  Looks strange
7151                  but happens e.g. on x86-64.  So recheck DFA on the last
7152                  iteration.  */
7153               if ((after_stall || all_issued)
7154                   && real_insn
7155                   && haifa_cost == 0)
7156                 haifa_cost = estimate_insn_cost (insn, curr_state);
7157             }
7158 
7159 	  haifa_clock += i;
7160           if (sched_verbose >= 2)
7161             sel_print ("haifa clock: %d\n", haifa_clock);
7162 	}
7163       else
7164 	gcc_assert (haifa_cost == 0);
7165 
7166       if (sched_verbose >= 2)
7167 	sel_print ("Haifa cost for insn %d: %d\n", INSN_UID (insn), haifa_cost);
7168 
7169       if (targetm.sched.dfa_new_cycle)
7170 	while (targetm.sched.dfa_new_cycle (sched_dump, sched_verbose, insn,
7171 					    haifa_last_clock, haifa_clock,
7172 					    &sort_p))
7173 	  {
7174 	    advance_state (curr_state);
7175 	    issued_insns = 0;
7176 	    haifa_clock++;
7177 	    if (sched_verbose >= 2)
7178               {
7179                 sel_print ("advance_state (dfa_new_cycle)\n");
7180                 debug_state (curr_state);
7181 		sel_print ("haifa clock: %d\n", haifa_clock + 1);
7182               }
7183           }
7184 
7185       if (real_insn)
7186 	{
7187 	  static state_t temp = NULL;
7188 
7189 	  if (!temp)
7190 	    temp = xmalloc (dfa_state_size);
7191 	  memcpy (temp, curr_state, dfa_state_size);
7192 
7193 	  cost = state_transition (curr_state, insn);
7194 	  if (memcmp (temp, curr_state, dfa_state_size))
7195 	    issued_insns++;
7196 
7197           if (sched_verbose >= 2)
7198 	    {
7199 	      sel_print ("scheduled insn %d, clock %d\n", INSN_UID (insn),
7200 			 haifa_clock + 1);
7201               debug_state (curr_state);
7202 	    }
7203 	  gcc_assert (cost < 0);
7204 	}
7205 
7206       if (targetm.sched.variable_issue)
7207 	targetm.sched.variable_issue (sched_dump, sched_verbose, insn, 0);
7208 
7209       INSN_SCHED_CYCLE (insn) = haifa_clock;
7210 
7211       last_clock = clock;
7212       haifa_last_clock = haifa_clock;
7213     }
7214 }
7215 
7216 /* Put TImode markers on insns starting a new issue group.  */
7217 static void
7218 put_TImodes (void)
7219 {
7220   int last_clock = -1;
7221   insn_t insn;
7222 
7223   for (insn = current_sched_info->head; insn != current_sched_info->next_tail;
7224        insn = NEXT_INSN (insn))
7225     {
7226       int cost, clock;
7227 
7228       if (!INSN_P (insn))
7229 	continue;
7230 
7231       clock = INSN_SCHED_CYCLE (insn);
7232       cost = (last_clock == -1) ? 1 : clock - last_clock;
7233 
7234       gcc_assert (cost >= 0);
7235 
7236       if (issue_rate > 1
7237 	  && GET_CODE (PATTERN (insn)) != USE
7238 	  && GET_CODE (PATTERN (insn)) != CLOBBER)
7239 	{
7240 	  if (reload_completed && cost > 0)
7241 	    PUT_MODE (insn, TImode);
7242 
7243 	  last_clock = clock;
7244 	}
7245 
7246       if (sched_verbose >= 2)
7247 	sel_print ("Cost for insn %d is %d\n", INSN_UID (insn), cost);
7248     }
7249 }
7250 
7251 /* Perform MD_FINISH on EBBs comprising current region.  When
7252    RESET_SCHED_CYCLES_P is true, run a pass emulating the scheduler
7253    to produce correct sched cycles on insns.  */
7254 static void
7255 sel_region_target_finish (bool reset_sched_cycles_p)
7256 {
7257   int i;
7258   bitmap scheduled_blocks = BITMAP_ALLOC (NULL);
7259 
7260   for (i = 0; i < current_nr_blocks; i++)
7261     {
7262       if (bitmap_bit_p (scheduled_blocks, i))
7263 	continue;
7264 
7265       /* While pipelining outer loops, skip bundling for loop
7266 	 preheaders.  Those will be rescheduled in the outer loop.  */
7267       if (sel_is_loop_preheader_p (EBB_FIRST_BB (i)))
7268 	continue;
7269 
7270       find_ebb_boundaries (EBB_FIRST_BB (i), scheduled_blocks);
7271 
7272       if (no_real_insns_p (current_sched_info->head, current_sched_info->tail))
7273 	continue;
7274 
7275       if (reset_sched_cycles_p)
7276 	reset_sched_cycles_in_current_ebb ();
7277 
7278       if (targetm.sched.init)
7279 	targetm.sched.init (sched_dump, sched_verbose, -1);
7280 
7281       put_TImodes ();
7282 
7283       if (targetm.sched.finish)
7284 	{
7285 	  targetm.sched.finish (sched_dump, sched_verbose);
7286 
7287 	  /* Extend luids so that insns generated by the target will
7288 	     get zero luid.  */
7289 	  sched_extend_luids ();
7290 	}
7291     }
7292 
7293   BITMAP_FREE (scheduled_blocks);
7294 }
7295 
7296 /* Free the scheduling data for the current region.  When RESET_SCHED_CYCLES_P
7297    is true, make an additional pass emulating scheduler to get correct insn
7298    cycles for md_finish calls.  */
7299 static void
7300 sel_region_finish (bool reset_sched_cycles_p)
7301 {
7302   simplify_changed_insns ();
7303   sched_finish_ready_list ();
7304   free_nop_pool ();
7305 
7306   /* Free the vectors.  */
7307   vec_av_set.release ();
7308   BITMAP_FREE (current_copies);
7309   BITMAP_FREE (current_originators);
7310   BITMAP_FREE (code_motion_visited_blocks);
7311   vinsn_vec_free (vec_bookkeeping_blocked_vinsns);
7312   vinsn_vec_free (vec_target_unavailable_vinsns);
7313 
7314   /* If LV_SET of the region head should be updated, do it now because
7315      there will be no other chance.  */
7316   {
7317     succ_iterator si;
7318     insn_t insn;
7319 
7320     FOR_EACH_SUCC_1 (insn, si, bb_note (EBB_FIRST_BB (0)),
7321                      SUCCS_NORMAL | SUCCS_SKIP_TO_LOOP_EXITS)
7322       {
7323 	basic_block bb = BLOCK_FOR_INSN (insn);
7324 
7325 	if (!BB_LV_SET_VALID_P (bb))
7326 	  compute_live (insn);
7327       }
7328   }
7329 
7330   /* Emulate the Haifa scheduler for bundling.  */
7331   if (reload_completed)
7332     sel_region_target_finish (reset_sched_cycles_p);
7333 
7334   sel_finish_global_and_expr ();
7335 
7336   bitmap_clear (forced_ebb_heads);
7337 
7338   free_nop_vinsn ();
7339 
7340   finish_deps_global ();
7341   sched_finish_luids ();
7342   h_d_i_d.release ();
7343 
7344   sel_finish_bbs ();
7345   BITMAP_FREE (blocks_to_reschedule);
7346 
7347   sel_unregister_cfg_hooks ();
7348 
7349   max_issue_size = 0;
7350 }
7351 
7352 
7353 /* Functions that implement the scheduler driver.  */
7354 
7355 /* Schedule a parallel instruction group on each of FENCES.  MAX_SEQNO
7356    is the current maximum seqno.  SCHEDULED_INSNS_TAILPP is the list
7357    of insns scheduled -- these would be postprocessed later.  */
7358 static void
7359 schedule_on_fences (flist_t fences, int max_seqno,
7360                     ilist_t **scheduled_insns_tailpp)
7361 {
7362   flist_t old_fences = fences;
7363 
7364   if (sched_verbose >= 1)
7365     {
7366       sel_print ("\nScheduling on fences: ");
7367       dump_flist (fences);
7368       sel_print ("\n");
7369     }
7370 
7371   scheduled_something_on_previous_fence = false;
7372   for (; fences; fences = FLIST_NEXT (fences))
7373     {
7374       fence_t fence = NULL;
7375       int seqno = 0;
7376       flist_t fences2;
7377       bool first_p = true;
7378 
7379       /* Choose the next fence group to schedule.
7380          The fact that insn can be scheduled only once
7381          on the cycle is guaranteed by two properties:
7382          1. seqnos of parallel groups decrease with each iteration.
7383          2. If is_ineligible_successor () sees the larger seqno, it
7384          checks if candidate insn is_in_current_fence_p ().  */
7385       for (fences2 = old_fences; fences2; fences2 = FLIST_NEXT (fences2))
7386         {
7387           fence_t f = FLIST_FENCE (fences2);
7388 
7389           if (!FENCE_PROCESSED_P (f))
7390             {
7391               int i = INSN_SEQNO (FENCE_INSN (f));
7392 
7393               if (first_p || i > seqno)
7394                 {
7395                   seqno = i;
7396                   fence = f;
7397                   first_p = false;
7398                 }
7399               else
7400                 /* ??? Seqnos of different groups should be different.  */
7401                 gcc_assert (1 || i != seqno);
7402             }
7403         }
7404 
7405       gcc_assert (fence);
7406 
7407       /* As FENCE is nonnull, SEQNO is initialized.  */
7408       seqno -= max_seqno + 1;
7409       fill_insns (fence, seqno, scheduled_insns_tailpp);
7410       FENCE_PROCESSED_P (fence) = true;
7411     }
7412 
7413   /* All av_sets are invalidated by GLOBAL_LEVEL increase, thus we
7414      don't need to keep bookkeeping-invalidated and target-unavailable
7415      vinsns any more.  */
7416   vinsn_vec_clear (&vec_bookkeeping_blocked_vinsns);
7417   vinsn_vec_clear (&vec_target_unavailable_vinsns);
7418 }
7419 
7420 /* Calculate MIN_SEQNO and MAX_SEQNO.  */
7421 static void
7422 find_min_max_seqno (flist_t fences, int *min_seqno, int *max_seqno)
7423 {
7424   *min_seqno = *max_seqno = INSN_SEQNO (FENCE_INSN (FLIST_FENCE (fences)));
7425 
7426   /* The first element is already processed.  */
7427   while ((fences = FLIST_NEXT (fences)))
7428     {
7429       int seqno = INSN_SEQNO (FENCE_INSN (FLIST_FENCE (fences)));
7430 
7431       if (*min_seqno > seqno)
7432         *min_seqno = seqno;
7433       else if (*max_seqno < seqno)
7434         *max_seqno = seqno;
7435     }
7436 }
7437 
7438 /* Calculate new fences from FENCES.  Write the current time to PTIME.  */
7439 static flist_t
7440 calculate_new_fences (flist_t fences, int orig_max_seqno, int *ptime)
7441 {
7442   flist_t old_fences = fences;
7443   struct flist_tail_def _new_fences, *new_fences = &_new_fences;
7444   int max_time = 0;
7445 
7446   flist_tail_init (new_fences);
7447   for (; fences; fences = FLIST_NEXT (fences))
7448     {
7449       fence_t fence = FLIST_FENCE (fences);
7450       insn_t insn;
7451 
7452       if (!FENCE_BNDS (fence))
7453         {
7454           /* This fence doesn't have any successors.  */
7455           if (!FENCE_SCHEDULED_P (fence))
7456             {
7457               /* Nothing was scheduled on this fence.  */
7458               int seqno;
7459 
7460               insn = FENCE_INSN (fence);
7461               seqno = INSN_SEQNO (insn);
7462               gcc_assert (seqno > 0 && seqno <= orig_max_seqno);
7463 
7464               if (sched_verbose >= 1)
7465                 sel_print ("Fence %d[%d] has not changed\n",
7466                            INSN_UID (insn),
7467                            BLOCK_NUM (insn));
7468               move_fence_to_fences (fences, new_fences);
7469             }
7470         }
7471       else
7472         extract_new_fences_from (fences, new_fences, orig_max_seqno);
7473       max_time = MAX (max_time, FENCE_CYCLE (fence));
7474     }
7475 
7476   flist_clear (&old_fences);
7477   *ptime = max_time;
7478   return FLIST_TAIL_HEAD (new_fences);
7479 }
7480 
7481 /* Update seqnos of insns given by PSCHEDULED_INSNS.  MIN_SEQNO and MAX_SEQNO
7482    are the miminum and maximum seqnos of the group, HIGHEST_SEQNO_IN_USE is
7483    the highest seqno used in a region.  Return the updated highest seqno.  */
7484 static int
7485 update_seqnos_and_stage (int min_seqno, int max_seqno,
7486                          int highest_seqno_in_use,
7487                          ilist_t *pscheduled_insns)
7488 {
7489   int new_hs;
7490   ilist_iterator ii;
7491   insn_t insn;
7492 
7493   /* Actually, new_hs is the seqno of the instruction, that was
7494      scheduled first (i.e. it is the first one in SCHEDULED_INSNS).  */
7495   if (*pscheduled_insns)
7496     {
7497       new_hs = (INSN_SEQNO (ILIST_INSN (*pscheduled_insns))
7498                 + highest_seqno_in_use + max_seqno - min_seqno + 2);
7499       gcc_assert (new_hs > highest_seqno_in_use);
7500     }
7501   else
7502     new_hs = highest_seqno_in_use;
7503 
7504   FOR_EACH_INSN (insn, ii, *pscheduled_insns)
7505     {
7506       gcc_assert (INSN_SEQNO (insn) < 0);
7507       INSN_SEQNO (insn) += highest_seqno_in_use + max_seqno - min_seqno + 2;
7508       gcc_assert (INSN_SEQNO (insn) <= new_hs);
7509 
7510       /* When not pipelining, purge unneeded insn info on the scheduled insns.
7511          For example, having reg_last array of INSN_DEPS_CONTEXT in memory may
7512          require > 1GB of memory e.g. on limit-fnargs.c.  */
7513       if (! pipelining_p)
7514         free_data_for_scheduled_insn (insn);
7515     }
7516 
7517   ilist_clear (pscheduled_insns);
7518   global_level++;
7519 
7520   return new_hs;
7521 }
7522 
7523 /* The main driver for scheduling a region.  This function is responsible
7524    for correct propagation of fences (i.e. scheduling points) and creating
7525    a group of parallel insns at each of them.  It also supports
7526    pipelining.  ORIG_MAX_SEQNO is the maximal seqno before this pass
7527    of scheduling.  */
7528 static void
7529 sel_sched_region_2 (int orig_max_seqno)
7530 {
7531   int highest_seqno_in_use = orig_max_seqno;
7532   int max_time = 0;
7533 
7534   stat_bookkeeping_copies = 0;
7535   stat_insns_needed_bookkeeping = 0;
7536   stat_renamed_scheduled = 0;
7537   stat_substitutions_total = 0;
7538   num_insns_scheduled = 0;
7539 
7540   while (fences)
7541     {
7542       int min_seqno, max_seqno;
7543       ilist_t scheduled_insns = NULL;
7544       ilist_t *scheduled_insns_tailp = &scheduled_insns;
7545 
7546       find_min_max_seqno (fences, &min_seqno, &max_seqno);
7547       schedule_on_fences (fences, max_seqno, &scheduled_insns_tailp);
7548       fences = calculate_new_fences (fences, orig_max_seqno, &max_time);
7549       highest_seqno_in_use = update_seqnos_and_stage (min_seqno, max_seqno,
7550                                                       highest_seqno_in_use,
7551                                                       &scheduled_insns);
7552     }
7553 
7554   if (sched_verbose >= 1)
7555     {
7556       sel_print ("Total scheduling time: %d cycles\n", max_time);
7557       sel_print ("Scheduled %d bookkeeping copies, %d insns needed "
7558 		 "bookkeeping, %d insns renamed, %d insns substituted\n",
7559 		 stat_bookkeeping_copies,
7560 		 stat_insns_needed_bookkeeping,
7561 		 stat_renamed_scheduled,
7562 		 stat_substitutions_total);
7563     }
7564 }
7565 
7566 /* Schedule a region.  When pipelining, search for possibly never scheduled
7567    bookkeeping code and schedule it.  Reschedule pipelined code without
7568    pipelining after.  */
7569 static void
7570 sel_sched_region_1 (void)
7571 {
7572   int orig_max_seqno;
7573 
7574   /* Remove empty blocks that might be in the region from the beginning.  */
7575   purge_empty_blocks ();
7576 
7577   orig_max_seqno = init_seqno (NULL, NULL);
7578   gcc_assert (orig_max_seqno >= 1);
7579 
7580   /* When pipelining outer loops, create fences on the loop header,
7581      not preheader.  */
7582   fences = NULL;
7583   if (current_loop_nest)
7584     init_fences (BB_END (EBB_FIRST_BB (0)));
7585   else
7586     init_fences (bb_note (EBB_FIRST_BB (0)));
7587   global_level = 1;
7588 
7589   sel_sched_region_2 (orig_max_seqno);
7590 
7591   gcc_assert (fences == NULL);
7592 
7593   if (pipelining_p)
7594     {
7595       int i;
7596       basic_block bb;
7597       struct flist_tail_def _new_fences;
7598       flist_tail_t new_fences = &_new_fences;
7599       bool do_p = true;
7600 
7601       pipelining_p = false;
7602       max_ws = MIN (max_ws, issue_rate * 3 / 2);
7603       bookkeeping_p = false;
7604       enable_schedule_as_rhs_p = false;
7605 
7606       /* Schedule newly created code, that has not been scheduled yet.  */
7607       do_p = true;
7608 
7609       while (do_p)
7610         {
7611           do_p = false;
7612 
7613           for (i = 0; i < current_nr_blocks; i++)
7614             {
7615               basic_block bb = EBB_FIRST_BB (i);
7616 
7617               if (bitmap_bit_p (blocks_to_reschedule, bb->index))
7618                 {
7619                   if (! bb_ends_ebb_p (bb))
7620                     bitmap_set_bit (blocks_to_reschedule, bb_next_bb (bb)->index);
7621                   if (sel_bb_empty_p (bb))
7622                     {
7623                       bitmap_clear_bit (blocks_to_reschedule, bb->index);
7624                       continue;
7625                     }
7626                   clear_outdated_rtx_info (bb);
7627                   if (sel_insn_is_speculation_check (BB_END (bb))
7628                       && JUMP_P (BB_END (bb)))
7629                     bitmap_set_bit (blocks_to_reschedule,
7630                                     BRANCH_EDGE (bb)->dest->index);
7631                 }
7632               else if (! sel_bb_empty_p (bb)
7633                        && INSN_SCHED_TIMES (sel_bb_head (bb)) <= 0)
7634                 bitmap_set_bit (blocks_to_reschedule, bb->index);
7635             }
7636 
7637           for (i = 0; i < current_nr_blocks; i++)
7638             {
7639               bb = EBB_FIRST_BB (i);
7640 
7641               /* While pipelining outer loops, skip bundling for loop
7642                  preheaders.  Those will be rescheduled in the outer
7643                  loop.  */
7644               if (sel_is_loop_preheader_p (bb))
7645                 {
7646                   clear_outdated_rtx_info (bb);
7647                   continue;
7648                 }
7649 
7650               if (bitmap_bit_p (blocks_to_reschedule, bb->index))
7651                 {
7652                   flist_tail_init (new_fences);
7653 
7654                   orig_max_seqno = init_seqno (blocks_to_reschedule, bb);
7655 
7656                   /* Mark BB as head of the new ebb.  */
7657                   bitmap_set_bit (forced_ebb_heads, bb->index);
7658 
7659                   gcc_assert (fences == NULL);
7660 
7661                   init_fences (bb_note (bb));
7662 
7663                   sel_sched_region_2 (orig_max_seqno);
7664 
7665                   do_p = true;
7666                   break;
7667                 }
7668             }
7669         }
7670     }
7671 }
7672 
7673 /* Schedule the RGN region.  */
7674 void
7675 sel_sched_region (int rgn)
7676 {
7677   bool schedule_p;
7678   bool reset_sched_cycles_p;
7679 
7680   if (sel_region_init (rgn))
7681     return;
7682 
7683   if (sched_verbose >= 1)
7684     sel_print ("Scheduling region %d\n", rgn);
7685 
7686   schedule_p = (!sched_is_disabled_for_current_region_p ()
7687                 && dbg_cnt (sel_sched_region_cnt));
7688   reset_sched_cycles_p = pipelining_p;
7689   if (schedule_p)
7690     sel_sched_region_1 ();
7691   else
7692     /* Force initialization of INSN_SCHED_CYCLEs for correct bundling.  */
7693     reset_sched_cycles_p = true;
7694 
7695   sel_region_finish (reset_sched_cycles_p);
7696 }
7697 
7698 /* Perform global init for the scheduler.  */
7699 static void
7700 sel_global_init (void)
7701 {
7702   calculate_dominance_info (CDI_DOMINATORS);
7703   alloc_sched_pools ();
7704 
7705   /* Setup the infos for sched_init.  */
7706   sel_setup_sched_infos ();
7707   setup_sched_dump ();
7708 
7709   sched_rgn_init (false);
7710   sched_init ();
7711 
7712   sched_init_bbs ();
7713   /* Reset AFTER_RECOVERY if it has been set by the 1st scheduler pass.  */
7714   after_recovery = 0;
7715   can_issue_more = issue_rate;
7716 
7717   sched_extend_target ();
7718   sched_deps_init (true);
7719   setup_nop_and_exit_insns ();
7720   sel_extend_global_bb_info ();
7721   init_lv_sets ();
7722   init_hard_regs_data ();
7723 }
7724 
7725 /* Free the global data of the scheduler.  */
7726 static void
7727 sel_global_finish (void)
7728 {
7729   free_bb_note_pool ();
7730   free_lv_sets ();
7731   sel_finish_global_bb_info ();
7732 
7733   free_regset_pool ();
7734   free_nop_and_exit_insns ();
7735 
7736   sched_rgn_finish ();
7737   sched_deps_finish ();
7738   sched_finish ();
7739 
7740   if (current_loops)
7741     sel_finish_pipelining ();
7742 
7743   free_sched_pools ();
7744   free_dominance_info (CDI_DOMINATORS);
7745 }
7746 
7747 /* Return true when we need to skip selective scheduling.  Used for debugging.  */
7748 bool
7749 maybe_skip_selective_scheduling (void)
7750 {
7751   return ! dbg_cnt (sel_sched_cnt);
7752 }
7753 
7754 /* The entry point.  */
7755 void
7756 run_selective_scheduling (void)
7757 {
7758   int rgn;
7759 
7760   if (n_basic_blocks_for_fn (cfun) == NUM_FIXED_BLOCKS)
7761     return;
7762 
7763   sel_global_init ();
7764 
7765   for (rgn = 0; rgn < nr_regions; rgn++)
7766     sel_sched_region (rgn);
7767 
7768   sel_global_finish ();
7769 }
7770 
7771 #endif
7772