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