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