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