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