OSDN Git Service

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