VINSN_INSN_RTX scaffolding
[platform/upstream/gcc.git] / gcc / sel-sched-ir.c
1 /* Instruction scheduling pass.  Selective scheduler and pipeliner.
2    Copyright (C) 2006-2014 Free Software Foundation, Inc.
3
4 This file is part of GCC.
5
6 GCC is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 3, or (at your option) any later
9 version.
10
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3.  If not see
18 <http://www.gnu.org/licenses/>.  */
19
20 #include "config.h"
21 #include "system.h"
22 #include "coretypes.h"
23 #include "tm.h"
24 #include "diagnostic-core.h"
25 #include "rtl.h"
26 #include "tm_p.h"
27 #include "hard-reg-set.h"
28 #include "regs.h"
29 #include "function.h"
30 #include "flags.h"
31 #include "insn-config.h"
32 #include "insn-attr.h"
33 #include "except.h"
34 #include "recog.h"
35 #include "params.h"
36 #include "target.h"
37 #include "sched-int.h"
38 #include "ggc.h"
39 #include "tree.h"
40 #include "vec.h"
41 #include "langhooks.h"
42 #include "rtlhooks-def.h"
43 #include "emit-rtl.h"  /* FIXME: Can go away once crtl is moved to rtl.h.  */
44
45 #ifdef INSN_SCHEDULING
46 #include "sel-sched-ir.h"
47 /* We don't have to use it except for sel_print_insn.  */
48 #include "sel-sched-dump.h"
49
50 /* A vector holding bb info for whole scheduling pass.  */
51 vec<sel_global_bb_info_def>
52     sel_global_bb_info = vNULL;
53
54 /* A vector holding bb info.  */
55 vec<sel_region_bb_info_def>
56     sel_region_bb_info = vNULL;
57
58 /* A pool for allocating all lists.  */
59 alloc_pool sched_lists_pool;
60
61 /* This contains information about successors for compute_av_set.  */
62 struct succs_info current_succs;
63
64 /* Data structure to describe interaction with the generic scheduler utils.  */
65 static struct common_sched_info_def sel_common_sched_info;
66
67 /* The loop nest being pipelined.  */
68 struct loop *current_loop_nest;
69
70 /* LOOP_NESTS is a vector containing the corresponding loop nest for
71    each region.  */
72 static vec<loop_p> loop_nests = vNULL;
73
74 /* Saves blocks already in loop regions, indexed by bb->index.  */
75 static sbitmap bbs_in_loop_rgns = NULL;
76
77 /* CFG hooks that are saved before changing create_basic_block hook.  */
78 static struct cfg_hooks orig_cfg_hooks;
79 \f
80
81 /* Array containing reverse topological index of function basic blocks,
82    indexed by BB->INDEX.  */
83 static int *rev_top_order_index = NULL;
84
85 /* Length of the above array.  */
86 static int rev_top_order_index_len = -1;
87
88 /* A regset pool structure.  */
89 static struct
90 {
91   /* The stack to which regsets are returned.  */
92   regset *v;
93
94   /* Its pointer.  */
95   int n;
96
97   /* Its size.  */
98   int s;
99
100   /* In VV we save all generated regsets so that, when destructing the
101      pool, we can compare it with V and check that every regset was returned
102      back to pool.  */
103   regset *vv;
104
105   /* The pointer of VV stack.  */
106   int nn;
107
108   /* Its size.  */
109   int ss;
110
111   /* The difference between allocated and returned regsets.  */
112   int diff;
113 } regset_pool = { NULL, 0, 0, NULL, 0, 0, 0 };
114
115 /* This represents the nop pool.  */
116 static struct
117 {
118   /* The vector which holds previously emitted nops.  */
119   insn_t *v;
120
121   /* Its pointer.  */
122   int n;
123
124   /* Its size.  */
125   int s;
126 } nop_pool = { NULL, 0, 0 };
127
128 /* The pool for basic block notes.  */
129 static rtx_vec_t bb_note_pool;
130
131 /* A NOP pattern used to emit placeholder insns.  */
132 rtx nop_pattern = NULL_RTX;
133 /* A special instruction that resides in EXIT_BLOCK.
134    EXIT_INSN is successor of the insns that lead to EXIT_BLOCK.  */
135 rtx exit_insn = NULL_RTX;
136
137 /* TRUE if while scheduling current region, which is loop, its preheader
138    was removed.  */
139 bool preheader_removed = false;
140 \f
141
142 /* Forward static declarations.  */
143 static void fence_clear (fence_t);
144
145 static void deps_init_id (idata_t, insn_t, bool);
146 static void init_id_from_df (idata_t, insn_t, bool);
147 static expr_t set_insn_init (expr_t, vinsn_t, int);
148
149 static void cfg_preds (basic_block, insn_t **, int *);
150 static void prepare_insn_expr (insn_t, int);
151 static void free_history_vect (vec<expr_history_def> &);
152
153 static void move_bb_info (basic_block, basic_block);
154 static void remove_empty_bb (basic_block, bool);
155 static void sel_merge_blocks (basic_block, basic_block);
156 static void sel_remove_loop_preheader (void);
157 static bool bb_has_removable_jump_to_p (basic_block, basic_block);
158
159 static bool insn_is_the_only_one_in_bb_p (insn_t);
160 static void create_initial_data_sets (basic_block);
161
162 static void free_av_set (basic_block);
163 static void invalidate_av_set (basic_block);
164 static void extend_insn_data (void);
165 static void sel_init_new_insn (insn_t, int, int = -1);
166 static void finish_insns (void);
167 \f
168 /* Various list functions.  */
169
170 /* Copy an instruction list L.  */
171 ilist_t
172 ilist_copy (ilist_t l)
173 {
174   ilist_t head = NULL, *tailp = &head;
175
176   while (l)
177     {
178       ilist_add (tailp, ILIST_INSN (l));
179       tailp = &ILIST_NEXT (*tailp);
180       l = ILIST_NEXT (l);
181     }
182
183   return head;
184 }
185
186 /* Invert an instruction list L.  */
187 ilist_t
188 ilist_invert (ilist_t l)
189 {
190   ilist_t res = NULL;
191
192   while (l)
193     {
194       ilist_add (&res, ILIST_INSN (l));
195       l = ILIST_NEXT (l);
196     }
197
198   return res;
199 }
200
201 /* Add a new boundary to the LP list with parameters TO, PTR, and DC.  */
202 void
203 blist_add (blist_t *lp, insn_t to, ilist_t ptr, deps_t dc)
204 {
205   bnd_t bnd;
206
207   _list_add (lp);
208   bnd = BLIST_BND (*lp);
209
210   BND_TO (bnd) = to;
211   BND_PTR (bnd) = ptr;
212   BND_AV (bnd) = NULL;
213   BND_AV1 (bnd) = NULL;
214   BND_DC (bnd) = dc;
215 }
216
217 /* Remove the list note pointed to by LP.  */
218 void
219 blist_remove (blist_t *lp)
220 {
221   bnd_t b = BLIST_BND (*lp);
222
223   av_set_clear (&BND_AV (b));
224   av_set_clear (&BND_AV1 (b));
225   ilist_clear (&BND_PTR (b));
226
227   _list_remove (lp);
228 }
229
230 /* Init a fence tail L.  */
231 void
232 flist_tail_init (flist_tail_t l)
233 {
234   FLIST_TAIL_HEAD (l) = NULL;
235   FLIST_TAIL_TAILP (l) = &FLIST_TAIL_HEAD (l);
236 }
237
238 /* Try to find fence corresponding to INSN in L.  */
239 fence_t
240 flist_lookup (flist_t l, insn_t insn)
241 {
242   while (l)
243     {
244       if (FENCE_INSN (FLIST_FENCE (l)) == insn)
245         return FLIST_FENCE (l);
246
247       l = FLIST_NEXT (l);
248     }
249
250   return NULL;
251 }
252
253 /* Init the fields of F before running fill_insns.  */
254 static void
255 init_fence_for_scheduling (fence_t f)
256 {
257   FENCE_BNDS (f) = NULL;
258   FENCE_PROCESSED_P (f) = false;
259   FENCE_SCHEDULED_P (f) = false;
260 }
261
262 /* Add new fence consisting of INSN and STATE to the list pointed to by LP.  */
263 static void
264 flist_add (flist_t *lp, insn_t insn, state_t state, deps_t dc, void *tc,
265            insn_t last_scheduled_insn, vec<rtx, va_gc> *executing_insns,
266            int *ready_ticks, int ready_ticks_size, insn_t sched_next,
267            int cycle, int cycle_issued_insns, int issue_more,
268            bool starts_cycle_p, bool after_stall_p)
269 {
270   fence_t f;
271
272   _list_add (lp);
273   f = FLIST_FENCE (*lp);
274
275   FENCE_INSN (f) = insn;
276
277   gcc_assert (state != NULL);
278   FENCE_STATE (f) = state;
279
280   FENCE_CYCLE (f) = cycle;
281   FENCE_ISSUED_INSNS (f) = cycle_issued_insns;
282   FENCE_STARTS_CYCLE_P (f) = starts_cycle_p;
283   FENCE_AFTER_STALL_P (f) = after_stall_p;
284
285   gcc_assert (dc != NULL);
286   FENCE_DC (f) = dc;
287
288   gcc_assert (tc != NULL || targetm.sched.alloc_sched_context == NULL);
289   FENCE_TC (f) = tc;
290
291   FENCE_LAST_SCHEDULED_INSN (f) = last_scheduled_insn;
292   FENCE_ISSUE_MORE (f) = issue_more;
293   FENCE_EXECUTING_INSNS (f) = executing_insns;
294   FENCE_READY_TICKS (f) = ready_ticks;
295   FENCE_READY_TICKS_SIZE (f) = ready_ticks_size;
296   FENCE_SCHED_NEXT (f) = sched_next;
297
298   init_fence_for_scheduling (f);
299 }
300
301 /* Remove the head node of the list pointed to by LP.  */
302 static void
303 flist_remove (flist_t *lp)
304 {
305   if (FENCE_INSN (FLIST_FENCE (*lp)))
306     fence_clear (FLIST_FENCE (*lp));
307   _list_remove (lp);
308 }
309
310 /* Clear the fence list pointed to by LP.  */
311 void
312 flist_clear (flist_t *lp)
313 {
314   while (*lp)
315     flist_remove (lp);
316 }
317
318 /* Add ORIGINAL_INSN the def list DL honoring CROSSES_CALL.  */
319 void
320 def_list_add (def_list_t *dl, insn_t original_insn, bool crosses_call)
321 {
322   def_t d;
323
324   _list_add (dl);
325   d = DEF_LIST_DEF (*dl);
326
327   d->orig_insn = original_insn;
328   d->crosses_call = crosses_call;
329 }
330 \f
331
332 /* Functions to work with target contexts.  */
333
334 /* Bulk target context.  It is convenient for debugging purposes to ensure
335    that there are no uninitialized (null) target contexts.  */
336 static tc_t bulk_tc = (tc_t) 1;
337
338 /* Target hooks wrappers.  In the future we can provide some default
339    implementations for them.  */
340
341 /* Allocate a store for the target context.  */
342 static tc_t
343 alloc_target_context (void)
344 {
345   return (targetm.sched.alloc_sched_context
346           ? targetm.sched.alloc_sched_context () : bulk_tc);
347 }
348
349 /* Init target context TC.
350    If CLEAN_P is true, then make TC as it is beginning of the scheduler.
351    Overwise, copy current backend context to TC.  */
352 static void
353 init_target_context (tc_t tc, bool clean_p)
354 {
355   if (targetm.sched.init_sched_context)
356     targetm.sched.init_sched_context (tc, clean_p);
357 }
358
359 /* Allocate and initialize a target context.  Meaning of CLEAN_P is the same as
360    int init_target_context ().  */
361 tc_t
362 create_target_context (bool clean_p)
363 {
364   tc_t tc = alloc_target_context ();
365
366   init_target_context (tc, clean_p);
367   return tc;
368 }
369
370 /* Copy TC to the current backend context.  */
371 void
372 set_target_context (tc_t tc)
373 {
374   if (targetm.sched.set_sched_context)
375     targetm.sched.set_sched_context (tc);
376 }
377
378 /* TC is about to be destroyed.  Free any internal data.  */
379 static void
380 clear_target_context (tc_t tc)
381 {
382   if (targetm.sched.clear_sched_context)
383     targetm.sched.clear_sched_context (tc);
384 }
385
386 /*  Clear and free it.  */
387 static void
388 delete_target_context (tc_t tc)
389 {
390   clear_target_context (tc);
391
392   if (targetm.sched.free_sched_context)
393     targetm.sched.free_sched_context (tc);
394 }
395
396 /* Make a copy of FROM in TO.
397    NB: May be this should be a hook.  */
398 static void
399 copy_target_context (tc_t to, tc_t from)
400 {
401   tc_t tmp = create_target_context (false);
402
403   set_target_context (from);
404   init_target_context (to, false);
405
406   set_target_context (tmp);
407   delete_target_context (tmp);
408 }
409
410 /* Create a copy of TC.  */
411 static tc_t
412 create_copy_of_target_context (tc_t tc)
413 {
414   tc_t copy = alloc_target_context ();
415
416   copy_target_context (copy, tc);
417
418   return copy;
419 }
420
421 /* Clear TC and initialize it according to CLEAN_P.  The meaning of CLEAN_P
422    is the same as in init_target_context ().  */
423 void
424 reset_target_context (tc_t tc, bool clean_p)
425 {
426   clear_target_context (tc);
427   init_target_context (tc, clean_p);
428 }
429 \f
430 /* Functions to work with dependence contexts.
431    Dc (aka deps context, aka deps_t, aka struct deps_desc *) is short for dependence
432    context.  It accumulates information about processed insns to decide if
433    current insn is dependent on the processed ones.  */
434
435 /* Make a copy of FROM in TO.  */
436 static void
437 copy_deps_context (deps_t to, deps_t from)
438 {
439   init_deps (to, false);
440   deps_join (to, from);
441 }
442
443 /* Allocate store for dep context.  */
444 static deps_t
445 alloc_deps_context (void)
446 {
447   return XNEW (struct deps_desc);
448 }
449
450 /* Allocate and initialize dep context.  */
451 static deps_t
452 create_deps_context (void)
453 {
454   deps_t dc = alloc_deps_context ();
455
456   init_deps (dc, false);
457   return dc;
458 }
459
460 /* Create a copy of FROM.  */
461 static deps_t
462 create_copy_of_deps_context (deps_t from)
463 {
464   deps_t to = alloc_deps_context ();
465
466   copy_deps_context (to, from);
467   return to;
468 }
469
470 /* Clean up internal data of DC.  */
471 static void
472 clear_deps_context (deps_t dc)
473 {
474   free_deps (dc);
475 }
476
477 /* Clear and free DC.  */
478 static void
479 delete_deps_context (deps_t dc)
480 {
481   clear_deps_context (dc);
482   free (dc);
483 }
484
485 /* Clear and init DC.  */
486 static void
487 reset_deps_context (deps_t dc)
488 {
489   clear_deps_context (dc);
490   init_deps (dc, false);
491 }
492
493 /* This structure describes the dependence analysis hooks for advancing
494    dependence context.  */
495 static struct sched_deps_info_def advance_deps_context_sched_deps_info =
496   {
497     NULL,
498
499     NULL, /* start_insn */
500     NULL, /* finish_insn */
501     NULL, /* start_lhs */
502     NULL, /* finish_lhs */
503     NULL, /* start_rhs */
504     NULL, /* finish_rhs */
505     haifa_note_reg_set,
506     haifa_note_reg_clobber,
507     haifa_note_reg_use,
508     NULL, /* note_mem_dep */
509     NULL, /* note_dep */
510
511     0, 0, 0
512   };
513
514 /* Process INSN and add its impact on DC.  */
515 void
516 advance_deps_context (deps_t dc, insn_t insn)
517 {
518   sched_deps_info = &advance_deps_context_sched_deps_info;
519   deps_analyze_insn (dc, insn);
520 }
521 \f
522
523 /* Functions to work with DFA states.  */
524
525 /* Allocate store for a DFA state.  */
526 static state_t
527 state_alloc (void)
528 {
529   return xmalloc (dfa_state_size);
530 }
531
532 /* Allocate and initialize DFA state.  */
533 static state_t
534 state_create (void)
535 {
536   state_t state = state_alloc ();
537
538   state_reset (state);
539   advance_state (state);
540   return state;
541 }
542
543 /* Free DFA state.  */
544 static void
545 state_free (state_t state)
546 {
547   free (state);
548 }
549
550 /* Make a copy of FROM in TO.  */
551 static void
552 state_copy (state_t to, state_t from)
553 {
554   memcpy (to, from, dfa_state_size);
555 }
556
557 /* Create a copy of FROM.  */
558 static state_t
559 state_create_copy (state_t from)
560 {
561   state_t to = state_alloc ();
562
563   state_copy (to, from);
564   return to;
565 }
566 \f
567
568 /* Functions to work with fences.  */
569
570 /* Clear the fence.  */
571 static void
572 fence_clear (fence_t f)
573 {
574   state_t s = FENCE_STATE (f);
575   deps_t dc = FENCE_DC (f);
576   void *tc = FENCE_TC (f);
577
578   ilist_clear (&FENCE_BNDS (f));
579
580   gcc_assert ((s != NULL && dc != NULL && tc != NULL)
581               || (s == NULL && dc == NULL && tc == NULL));
582
583   free (s);
584
585   if (dc != NULL)
586     delete_deps_context (dc);
587
588   if (tc != NULL)
589     delete_target_context (tc);
590   vec_free (FENCE_EXECUTING_INSNS (f));
591   free (FENCE_READY_TICKS (f));
592   FENCE_READY_TICKS (f) = NULL;
593 }
594
595 /* Init a list of fences with successors of OLD_FENCE.  */
596 void
597 init_fences (insn_t old_fence)
598 {
599   insn_t succ;
600   succ_iterator si;
601   bool first = true;
602   int ready_ticks_size = get_max_uid () + 1;
603
604   FOR_EACH_SUCC_1 (succ, si, old_fence,
605                    SUCCS_NORMAL | SUCCS_SKIP_TO_LOOP_EXITS)
606     {
607
608       if (first)
609         first = false;
610       else
611         gcc_assert (flag_sel_sched_pipelining_outer_loops);
612
613       flist_add (&fences, succ,
614                  state_create (),
615                  create_deps_context () /* dc */,
616                  create_target_context (true) /* tc */,
617                  NULL_RTX /* last_scheduled_insn */,
618                  NULL, /* executing_insns */
619                  XCNEWVEC (int, ready_ticks_size), /* ready_ticks */
620                  ready_ticks_size,
621                  NULL_RTX /* sched_next */,
622                  1 /* cycle */, 0 /* cycle_issued_insns */,
623                  issue_rate, /* issue_more */
624                  1 /* starts_cycle_p */, 0 /* after_stall_p */);
625     }
626 }
627
628 /* Merges two fences (filling fields of fence F with resulting values) by
629    following rules: 1) state, target context and last scheduled insn are
630    propagated from fallthrough edge if it is available;
631    2) deps context and cycle is propagated from more probable edge;
632    3) all other fields are set to corresponding constant values.
633
634    INSN, STATE, DC, TC, LAST_SCHEDULED_INSN, EXECUTING_INSNS,
635    READY_TICKS, READY_TICKS_SIZE, SCHED_NEXT, CYCLE, ISSUE_MORE
636    and AFTER_STALL_P are the corresponding fields of the second fence.  */
637 static void
638 merge_fences (fence_t f, insn_t insn,
639               state_t state, deps_t dc, void *tc,
640               rtx last_scheduled_insn, vec<rtx, va_gc> *executing_insns,
641               int *ready_ticks, int ready_ticks_size,
642               rtx sched_next, int cycle, int issue_more, bool after_stall_p)
643 {
644   insn_t last_scheduled_insn_old = FENCE_LAST_SCHEDULED_INSN (f);
645
646   gcc_assert (sel_bb_head_p (FENCE_INSN (f))
647               && !sched_next && !FENCE_SCHED_NEXT (f));
648
649   /* Check if we can decide which path fences came.
650      If we can't (or don't want to) - reset all.  */
651   if (last_scheduled_insn == NULL
652       || last_scheduled_insn_old == NULL
653       /* This is a case when INSN is reachable on several paths from
654          one insn (this can happen when pipelining of outer loops is on and
655          there are two edges: one going around of inner loop and the other -
656          right through it; in such case just reset everything).  */
657       || last_scheduled_insn == last_scheduled_insn_old)
658     {
659       state_reset (FENCE_STATE (f));
660       state_free (state);
661
662       reset_deps_context (FENCE_DC (f));
663       delete_deps_context (dc);
664
665       reset_target_context (FENCE_TC (f), true);
666       delete_target_context (tc);
667
668       if (cycle > FENCE_CYCLE (f))
669         FENCE_CYCLE (f) = cycle;
670
671       FENCE_LAST_SCHEDULED_INSN (f) = NULL;
672       FENCE_ISSUE_MORE (f) = issue_rate;
673       vec_free (executing_insns);
674       free (ready_ticks);
675       if (FENCE_EXECUTING_INSNS (f))
676         FENCE_EXECUTING_INSNS (f)->block_remove (0,
677                                           FENCE_EXECUTING_INSNS (f)->length ());
678       if (FENCE_READY_TICKS (f))
679         memset (FENCE_READY_TICKS (f), 0, FENCE_READY_TICKS_SIZE (f));
680     }
681   else
682     {
683       edge edge_old = NULL, edge_new = NULL;
684       edge candidate;
685       succ_iterator si;
686       insn_t succ;
687
688       /* Find fallthrough edge.  */
689       gcc_assert (BLOCK_FOR_INSN (insn)->prev_bb);
690       candidate = find_fallthru_edge_from (BLOCK_FOR_INSN (insn)->prev_bb);
691
692       if (!candidate
693           || (candidate->src != BLOCK_FOR_INSN (last_scheduled_insn)
694               && candidate->src != BLOCK_FOR_INSN (last_scheduled_insn_old)))
695         {
696           /* No fallthrough edge leading to basic block of INSN.  */
697           state_reset (FENCE_STATE (f));
698           state_free (state);
699
700           reset_target_context (FENCE_TC (f), true);
701           delete_target_context (tc);
702
703           FENCE_LAST_SCHEDULED_INSN (f) = NULL;
704           FENCE_ISSUE_MORE (f) = issue_rate;
705         }
706       else
707         if (candidate->src == BLOCK_FOR_INSN (last_scheduled_insn))
708           {
709             /* Would be weird if same insn is successor of several fallthrough
710                edges.  */
711             gcc_assert (BLOCK_FOR_INSN (insn)->prev_bb
712                         != BLOCK_FOR_INSN (last_scheduled_insn_old));
713
714             state_free (FENCE_STATE (f));
715             FENCE_STATE (f) = state;
716
717             delete_target_context (FENCE_TC (f));
718             FENCE_TC (f) = tc;
719
720             FENCE_LAST_SCHEDULED_INSN (f) = last_scheduled_insn;
721             FENCE_ISSUE_MORE (f) = issue_more;
722           }
723         else
724           {
725             /* Leave STATE, TC and LAST_SCHEDULED_INSN fields untouched.  */
726             state_free (state);
727             delete_target_context (tc);
728
729             gcc_assert (BLOCK_FOR_INSN (insn)->prev_bb
730                         != BLOCK_FOR_INSN (last_scheduled_insn));
731           }
732
733         /* Find edge of first predecessor (last_scheduled_insn_old->insn).  */
734         FOR_EACH_SUCC_1 (succ, si, last_scheduled_insn_old,
735                          SUCCS_NORMAL | SUCCS_SKIP_TO_LOOP_EXITS)
736           {
737             if (succ == insn)
738               {
739                 /* No same successor allowed from several edges.  */
740                 gcc_assert (!edge_old);
741                 edge_old = si.e1;
742               }
743           }
744         /* Find edge of second predecessor (last_scheduled_insn->insn).  */
745         FOR_EACH_SUCC_1 (succ, si, last_scheduled_insn,
746                          SUCCS_NORMAL | SUCCS_SKIP_TO_LOOP_EXITS)
747           {
748             if (succ == insn)
749               {
750                 /* No same successor allowed from several edges.  */
751                 gcc_assert (!edge_new);
752                 edge_new = si.e1;
753               }
754           }
755
756         /* Check if we can choose most probable predecessor.  */
757         if (edge_old == NULL || edge_new == NULL)
758           {
759             reset_deps_context (FENCE_DC (f));
760             delete_deps_context (dc);
761             vec_free (executing_insns);
762             free (ready_ticks);
763
764             FENCE_CYCLE (f) = MAX (FENCE_CYCLE (f), cycle);
765             if (FENCE_EXECUTING_INSNS (f))
766               FENCE_EXECUTING_INSNS (f)->block_remove (0,
767                                 FENCE_EXECUTING_INSNS (f)->length ());
768             if (FENCE_READY_TICKS (f))
769               memset (FENCE_READY_TICKS (f), 0, FENCE_READY_TICKS_SIZE (f));
770           }
771         else
772           if (edge_new->probability > edge_old->probability)
773             {
774               delete_deps_context (FENCE_DC (f));
775               FENCE_DC (f) = dc;
776               vec_free (FENCE_EXECUTING_INSNS (f));
777               FENCE_EXECUTING_INSNS (f) = executing_insns;
778               free (FENCE_READY_TICKS (f));
779               FENCE_READY_TICKS (f) = ready_ticks;
780               FENCE_READY_TICKS_SIZE (f) = ready_ticks_size;
781               FENCE_CYCLE (f) = cycle;
782             }
783           else
784             {
785               /* Leave DC and CYCLE untouched.  */
786               delete_deps_context (dc);
787               vec_free (executing_insns);
788               free (ready_ticks);
789             }
790     }
791
792   /* Fill remaining invariant fields.  */
793   if (after_stall_p)
794     FENCE_AFTER_STALL_P (f) = 1;
795
796   FENCE_ISSUED_INSNS (f) = 0;
797   FENCE_STARTS_CYCLE_P (f) = 1;
798   FENCE_SCHED_NEXT (f) = NULL;
799 }
800
801 /* Add a new fence to NEW_FENCES list, initializing it from all
802    other parameters.  */
803 static void
804 add_to_fences (flist_tail_t new_fences, insn_t insn,
805                state_t state, deps_t dc, void *tc, rtx last_scheduled_insn,
806                vec<rtx, va_gc> *executing_insns, int *ready_ticks,
807                int ready_ticks_size, rtx sched_next, int cycle,
808                int cycle_issued_insns, int issue_rate,
809                bool starts_cycle_p, bool after_stall_p)
810 {
811   fence_t f = flist_lookup (FLIST_TAIL_HEAD (new_fences), insn);
812
813   if (! f)
814     {
815       flist_add (FLIST_TAIL_TAILP (new_fences), insn, state, dc, tc,
816                  last_scheduled_insn, executing_insns, ready_ticks,
817                  ready_ticks_size, sched_next, cycle, cycle_issued_insns,
818                  issue_rate, starts_cycle_p, after_stall_p);
819
820       FLIST_TAIL_TAILP (new_fences)
821         = &FLIST_NEXT (*FLIST_TAIL_TAILP (new_fences));
822     }
823   else
824     {
825       merge_fences (f, insn, state, dc, tc, last_scheduled_insn,
826                     executing_insns, ready_ticks, ready_ticks_size,
827                     sched_next, cycle, issue_rate, after_stall_p);
828     }
829 }
830
831 /* Move the first fence in the OLD_FENCES list to NEW_FENCES.  */
832 void
833 move_fence_to_fences (flist_t old_fences, flist_tail_t new_fences)
834 {
835   fence_t f, old;
836   flist_t *tailp = FLIST_TAIL_TAILP (new_fences);
837
838   old = FLIST_FENCE (old_fences);
839   f = flist_lookup (FLIST_TAIL_HEAD (new_fences),
840                     FENCE_INSN (FLIST_FENCE (old_fences)));
841   if (f)
842     {
843       merge_fences (f, old->insn, old->state, old->dc, old->tc,
844                     old->last_scheduled_insn, old->executing_insns,
845                     old->ready_ticks, old->ready_ticks_size,
846                     old->sched_next, old->cycle, old->issue_more,
847                     old->after_stall_p);
848     }
849   else
850     {
851       _list_add (tailp);
852       FLIST_TAIL_TAILP (new_fences) = &FLIST_NEXT (*tailp);
853       *FLIST_FENCE (*tailp) = *old;
854       init_fence_for_scheduling (FLIST_FENCE (*tailp));
855     }
856   FENCE_INSN (old) = NULL;
857 }
858
859 /* Add a new fence to NEW_FENCES list and initialize most of its data
860    as a clean one.  */
861 void
862 add_clean_fence_to_fences (flist_tail_t new_fences, insn_t succ, fence_t fence)
863 {
864   int ready_ticks_size = get_max_uid () + 1;
865
866   add_to_fences (new_fences,
867                  succ, state_create (), create_deps_context (),
868                  create_target_context (true),
869                  NULL_RTX, NULL,
870                  XCNEWVEC (int, ready_ticks_size), ready_ticks_size,
871                  NULL_RTX, FENCE_CYCLE (fence) + 1,
872                  0, issue_rate, 1, FENCE_AFTER_STALL_P (fence));
873 }
874
875 /* Add a new fence to NEW_FENCES list and initialize all of its data
876    from FENCE and SUCC.  */
877 void
878 add_dirty_fence_to_fences (flist_tail_t new_fences, insn_t succ, fence_t fence)
879 {
880   int * new_ready_ticks
881     = XNEWVEC (int, FENCE_READY_TICKS_SIZE (fence));
882
883   memcpy (new_ready_ticks, FENCE_READY_TICKS (fence),
884           FENCE_READY_TICKS_SIZE (fence) * sizeof (int));
885   add_to_fences (new_fences,
886                  succ, state_create_copy (FENCE_STATE (fence)),
887                  create_copy_of_deps_context (FENCE_DC (fence)),
888                  create_copy_of_target_context (FENCE_TC (fence)),
889                  FENCE_LAST_SCHEDULED_INSN (fence),
890                  vec_safe_copy (FENCE_EXECUTING_INSNS (fence)),
891                  new_ready_ticks,
892                  FENCE_READY_TICKS_SIZE (fence),
893                  FENCE_SCHED_NEXT (fence),
894                  FENCE_CYCLE (fence),
895                  FENCE_ISSUED_INSNS (fence),
896                  FENCE_ISSUE_MORE (fence),
897                  FENCE_STARTS_CYCLE_P (fence),
898                  FENCE_AFTER_STALL_P (fence));
899 }
900 \f
901
902 /* Functions to work with regset and nop pools.  */
903
904 /* Returns the new regset from pool.  It might have some of the bits set
905    from the previous usage.  */
906 regset
907 get_regset_from_pool (void)
908 {
909   regset rs;
910
911   if (regset_pool.n != 0)
912     rs = regset_pool.v[--regset_pool.n];
913   else
914     /* We need to create the regset.  */
915     {
916       rs = ALLOC_REG_SET (&reg_obstack);
917
918       if (regset_pool.nn == regset_pool.ss)
919         regset_pool.vv = XRESIZEVEC (regset, regset_pool.vv,
920                                      (regset_pool.ss = 2 * regset_pool.ss + 1));
921       regset_pool.vv[regset_pool.nn++] = rs;
922     }
923
924   regset_pool.diff++;
925
926   return rs;
927 }
928
929 /* Same as above, but returns the empty regset.  */
930 regset
931 get_clear_regset_from_pool (void)
932 {
933   regset rs = get_regset_from_pool ();
934
935   CLEAR_REG_SET (rs);
936   return rs;
937 }
938
939 /* Return regset RS to the pool for future use.  */
940 void
941 return_regset_to_pool (regset rs)
942 {
943   gcc_assert (rs);
944   regset_pool.diff--;
945
946   if (regset_pool.n == regset_pool.s)
947     regset_pool.v = XRESIZEVEC (regset, regset_pool.v,
948                                 (regset_pool.s = 2 * regset_pool.s + 1));
949   regset_pool.v[regset_pool.n++] = rs;
950 }
951
952 #ifdef ENABLE_CHECKING
953 /* This is used as a qsort callback for sorting regset pool stacks.
954    X and XX are addresses of two regsets.  They are never equal.  */
955 static int
956 cmp_v_in_regset_pool (const void *x, const void *xx)
957 {
958   uintptr_t r1 = (uintptr_t) *((const regset *) x);
959   uintptr_t r2 = (uintptr_t) *((const regset *) xx);
960   if (r1 > r2)
961     return 1;
962   else if (r1 < r2)
963     return -1;
964   gcc_unreachable ();
965 }
966 #endif
967
968 /*  Free the regset pool possibly checking for memory leaks.  */
969 void
970 free_regset_pool (void)
971 {
972 #ifdef ENABLE_CHECKING
973   {
974     regset *v = regset_pool.v;
975     int i = 0;
976     int n = regset_pool.n;
977
978     regset *vv = regset_pool.vv;
979     int ii = 0;
980     int nn = regset_pool.nn;
981
982     int diff = 0;
983
984     gcc_assert (n <= nn);
985
986     /* Sort both vectors so it will be possible to compare them.  */
987     qsort (v, n, sizeof (*v), cmp_v_in_regset_pool);
988     qsort (vv, nn, sizeof (*vv), cmp_v_in_regset_pool);
989
990     while (ii < nn)
991       {
992         if (v[i] == vv[ii])
993           i++;
994         else
995           /* VV[II] was lost.  */
996           diff++;
997
998         ii++;
999       }
1000
1001     gcc_assert (diff == regset_pool.diff);
1002   }
1003 #endif
1004
1005   /* If not true - we have a memory leak.  */
1006   gcc_assert (regset_pool.diff == 0);
1007
1008   while (regset_pool.n)
1009     {
1010       --regset_pool.n;
1011       FREE_REG_SET (regset_pool.v[regset_pool.n]);
1012     }
1013
1014   free (regset_pool.v);
1015   regset_pool.v = NULL;
1016   regset_pool.s = 0;
1017
1018   free (regset_pool.vv);
1019   regset_pool.vv = NULL;
1020   regset_pool.nn = 0;
1021   regset_pool.ss = 0;
1022
1023   regset_pool.diff = 0;
1024 }
1025 \f
1026
1027 /* Functions to work with nop pools.  NOP insns are used as temporary
1028    placeholders of the insns being scheduled to allow correct update of
1029    the data sets.  When update is finished, NOPs are deleted.  */
1030
1031 /* A vinsn that is used to represent a nop.  This vinsn is shared among all
1032    nops sel-sched generates.  */
1033 static vinsn_t nop_vinsn = NULL;
1034
1035 /* Emit a nop before INSN, taking it from pool.  */
1036 insn_t
1037 get_nop_from_pool (insn_t insn)
1038 {
1039   insn_t nop;
1040   bool old_p = nop_pool.n != 0;
1041   int flags;
1042
1043   if (old_p)
1044     nop = nop_pool.v[--nop_pool.n];
1045   else
1046     nop = nop_pattern;
1047
1048   nop = emit_insn_before (nop, insn);
1049
1050   if (old_p)
1051     flags = INSN_INIT_TODO_SSID;
1052   else
1053     flags = INSN_INIT_TODO_LUID | INSN_INIT_TODO_SSID;
1054
1055   set_insn_init (INSN_EXPR (insn), nop_vinsn, INSN_SEQNO (insn));
1056   sel_init_new_insn (nop, flags);
1057
1058   return nop;
1059 }
1060
1061 /* Remove NOP from the instruction stream and return it to the pool.  */
1062 void
1063 return_nop_to_pool (insn_t nop, bool full_tidying)
1064 {
1065   gcc_assert (INSN_IN_STREAM_P (nop));
1066   sel_remove_insn (nop, false, full_tidying);
1067
1068   /* We'll recycle this nop.  */
1069   INSN_DELETED_P (nop) = 0;
1070
1071   if (nop_pool.n == nop_pool.s)
1072     nop_pool.v = XRESIZEVEC (rtx, nop_pool.v,
1073                              (nop_pool.s = 2 * nop_pool.s + 1));
1074   nop_pool.v[nop_pool.n++] = nop;
1075 }
1076
1077 /* Free the nop pool.  */
1078 void
1079 free_nop_pool (void)
1080 {
1081   nop_pool.n = 0;
1082   nop_pool.s = 0;
1083   free (nop_pool.v);
1084   nop_pool.v = NULL;
1085 }
1086 \f
1087
1088 /* Skip unspec to support ia64 speculation. Called from rtx_equal_p_cb.
1089    The callback is given two rtxes XX and YY and writes the new rtxes
1090    to NX and NY in case some needs to be skipped.  */
1091 static int
1092 skip_unspecs_callback (const_rtx *xx, const_rtx *yy, rtx *nx, rtx* ny)
1093 {
1094   const_rtx x = *xx;
1095   const_rtx y = *yy;
1096
1097   if (GET_CODE (x) == UNSPEC
1098       && (targetm.sched.skip_rtx_p == NULL
1099           || targetm.sched.skip_rtx_p (x)))
1100     {
1101       *nx = XVECEXP (x, 0, 0);
1102       *ny = CONST_CAST_RTX (y);
1103       return 1;
1104     }
1105
1106   if (GET_CODE (y) == UNSPEC
1107       && (targetm.sched.skip_rtx_p == NULL
1108           || targetm.sched.skip_rtx_p (y)))
1109     {
1110       *nx = CONST_CAST_RTX (x);
1111       *ny = XVECEXP (y, 0, 0);
1112       return 1;
1113     }
1114
1115   return 0;
1116 }
1117
1118 /* Callback, called from hash_rtx_cb.  Helps to hash UNSPEC rtx X in a correct way
1119    to support ia64 speculation.  When changes are needed, new rtx X and new mode
1120    NMODE are written, and the callback returns true.  */
1121 static int
1122 hash_with_unspec_callback (const_rtx x, enum machine_mode mode ATTRIBUTE_UNUSED,
1123                            rtx *nx, enum machine_mode* nmode)
1124 {
1125   if (GET_CODE (x) == UNSPEC
1126       && targetm.sched.skip_rtx_p
1127       && targetm.sched.skip_rtx_p (x))
1128     {
1129       *nx = XVECEXP (x, 0 ,0);
1130       *nmode = VOIDmode;
1131       return 1;
1132     }
1133
1134   return 0;
1135 }
1136
1137 /* Returns LHS and RHS are ok to be scheduled separately.  */
1138 static bool
1139 lhs_and_rhs_separable_p (rtx lhs, rtx rhs)
1140 {
1141   if (lhs == NULL || rhs == NULL)
1142     return false;
1143
1144   /* Do not schedule constants as rhs: no point to use reg, if const
1145      can be used.  Moreover, scheduling const as rhs may lead to mode
1146      mismatch cause consts don't have modes but they could be merged
1147      from branches where the same const used in different modes.  */
1148   if (CONSTANT_P (rhs))
1149     return false;
1150
1151   /* ??? Do not rename predicate registers to avoid ICEs in bundling.  */
1152   if (COMPARISON_P (rhs))
1153       return false;
1154
1155   /* Do not allow single REG to be an rhs.  */
1156   if (REG_P (rhs))
1157     return false;
1158
1159   /* See comment at find_used_regs_1 (*1) for explanation of this
1160      restriction.  */
1161   /* FIXME: remove this later.  */
1162   if (MEM_P (lhs))
1163     return false;
1164
1165   /* This will filter all tricky things like ZERO_EXTRACT etc.
1166      For now we don't handle it.  */
1167   if (!REG_P (lhs) && !MEM_P (lhs))
1168     return false;
1169
1170   return true;
1171 }
1172
1173 /* Initialize vinsn VI for INSN.  Only for use from vinsn_create ().  When
1174    FORCE_UNIQUE_P is true, the resulting vinsn will not be clonable.  This is
1175    used e.g. for insns from recovery blocks.  */
1176 static void
1177 vinsn_init (vinsn_t vi, insn_t insn, bool force_unique_p)
1178 {
1179   hash_rtx_callback_function hrcf;
1180   int insn_class;
1181
1182   SET_VINSN_INSN_RTX (vi) = insn;
1183   VINSN_COUNT (vi) = 0;
1184   vi->cost = -1;
1185
1186   if (INSN_NOP_P (insn))
1187     return;
1188
1189   if (DF_INSN_UID_SAFE_GET (INSN_UID (insn)) != NULL)
1190     init_id_from_df (VINSN_ID (vi), insn, force_unique_p);
1191   else
1192     deps_init_id (VINSN_ID (vi), insn, force_unique_p);
1193
1194   /* Hash vinsn depending on whether it is separable or not.  */
1195   hrcf = targetm.sched.skip_rtx_p ? hash_with_unspec_callback : NULL;
1196   if (VINSN_SEPARABLE_P (vi))
1197     {
1198       rtx rhs = VINSN_RHS (vi);
1199
1200       VINSN_HASH (vi) = hash_rtx_cb (rhs, GET_MODE (rhs),
1201                                      NULL, NULL, false, hrcf);
1202       VINSN_HASH_RTX (vi) = hash_rtx_cb (VINSN_PATTERN (vi),
1203                                          VOIDmode, NULL, NULL,
1204                                          false, hrcf);
1205     }
1206   else
1207     {
1208       VINSN_HASH (vi) = hash_rtx_cb (VINSN_PATTERN (vi), VOIDmode,
1209                                      NULL, NULL, false, hrcf);
1210       VINSN_HASH_RTX (vi) = VINSN_HASH (vi);
1211     }
1212
1213   insn_class = haifa_classify_insn (insn);
1214   if (insn_class >= 2
1215       && (!targetm.sched.get_insn_spec_ds
1216           || ((targetm.sched.get_insn_spec_ds (insn) & BEGIN_CONTROL)
1217               == 0)))
1218     VINSN_MAY_TRAP_P (vi) = true;
1219   else
1220     VINSN_MAY_TRAP_P (vi) = false;
1221 }
1222
1223 /* Indicate that VI has become the part of an rtx object.  */
1224 void
1225 vinsn_attach (vinsn_t vi)
1226 {
1227   /* Assert that VI is not pending for deletion.  */
1228   gcc_assert (VINSN_INSN_RTX (vi));
1229
1230   VINSN_COUNT (vi)++;
1231 }
1232
1233 /* Create and init VI from the INSN.  Use UNIQUE_P for determining the correct
1234    VINSN_TYPE (VI).  */
1235 static vinsn_t
1236 vinsn_create (insn_t insn, bool force_unique_p)
1237 {
1238   vinsn_t vi = XCNEW (struct vinsn_def);
1239
1240   vinsn_init (vi, insn, force_unique_p);
1241   return vi;
1242 }
1243
1244 /* Return a copy of VI.  When REATTACH_P is true, detach VI and attach
1245    the copy.  */
1246 vinsn_t
1247 vinsn_copy (vinsn_t vi, bool reattach_p)
1248 {
1249   rtx copy;
1250   bool unique = VINSN_UNIQUE_P (vi);
1251   vinsn_t new_vi;
1252
1253   copy = create_copy_of_insn_rtx (VINSN_INSN_RTX (vi));
1254   new_vi = create_vinsn_from_insn_rtx (copy, unique);
1255   if (reattach_p)
1256     {
1257       vinsn_detach (vi);
1258       vinsn_attach (new_vi);
1259     }
1260
1261   return new_vi;
1262 }
1263
1264 /* Delete the VI vinsn and free its data.  */
1265 static void
1266 vinsn_delete (vinsn_t vi)
1267 {
1268   gcc_assert (VINSN_COUNT (vi) == 0);
1269
1270   if (!INSN_NOP_P (VINSN_INSN_RTX (vi)))
1271     {
1272       return_regset_to_pool (VINSN_REG_SETS (vi));
1273       return_regset_to_pool (VINSN_REG_USES (vi));
1274       return_regset_to_pool (VINSN_REG_CLOBBERS (vi));
1275     }
1276
1277   free (vi);
1278 }
1279
1280 /* Indicate that VI is no longer a part of some rtx object.
1281    Remove VI if it is no longer needed.  */
1282 void
1283 vinsn_detach (vinsn_t vi)
1284 {
1285   gcc_assert (VINSN_COUNT (vi) > 0);
1286
1287   if (--VINSN_COUNT (vi) == 0)
1288     vinsn_delete (vi);
1289 }
1290
1291 /* Returns TRUE if VI is a branch.  */
1292 bool
1293 vinsn_cond_branch_p (vinsn_t vi)
1294 {
1295   insn_t insn;
1296
1297   if (!VINSN_UNIQUE_P (vi))
1298     return false;
1299
1300   insn = VINSN_INSN_RTX (vi);
1301   if (BB_END (BLOCK_FOR_INSN (insn)) != insn)
1302     return false;
1303
1304   return control_flow_insn_p (insn);
1305 }
1306
1307 /* Return latency of INSN.  */
1308 static int
1309 sel_insn_rtx_cost (rtx insn)
1310 {
1311   int cost;
1312
1313   /* A USE insn, or something else we don't need to
1314      understand.  We can't pass these directly to
1315      result_ready_cost or insn_default_latency because it will
1316      trigger a fatal error for unrecognizable insns.  */
1317   if (recog_memoized (insn) < 0)
1318     cost = 0;
1319   else
1320     {
1321       cost = insn_default_latency (insn);
1322
1323       if (cost < 0)
1324         cost = 0;
1325     }
1326
1327   return cost;
1328 }
1329
1330 /* Return the cost of the VI.
1331    !!! FIXME: Unify with haifa-sched.c: insn_cost ().  */
1332 int
1333 sel_vinsn_cost (vinsn_t vi)
1334 {
1335   int cost = vi->cost;
1336
1337   if (cost < 0)
1338     {
1339       cost = sel_insn_rtx_cost (VINSN_INSN_RTX (vi));
1340       vi->cost = cost;
1341     }
1342
1343   return cost;
1344 }
1345 \f
1346
1347 /* Functions for insn emitting.  */
1348
1349 /* Emit new insn after AFTER based on PATTERN and initialize its data from
1350    EXPR and SEQNO.  */
1351 insn_t
1352 sel_gen_insn_from_rtx_after (rtx pattern, expr_t expr, int seqno, insn_t after)
1353 {
1354   insn_t new_insn;
1355
1356   gcc_assert (EXPR_TARGET_AVAILABLE (expr) == true);
1357
1358   new_insn = emit_insn_after (pattern, after);
1359   set_insn_init (expr, NULL, seqno);
1360   sel_init_new_insn (new_insn, INSN_INIT_TODO_LUID | INSN_INIT_TODO_SSID);
1361
1362   return new_insn;
1363 }
1364
1365 /* Force newly generated vinsns to be unique.  */
1366 static bool init_insn_force_unique_p = false;
1367
1368 /* Emit new speculation recovery insn after AFTER based on PATTERN and
1369    initialize its data from EXPR and SEQNO.  */
1370 insn_t
1371 sel_gen_recovery_insn_from_rtx_after (rtx pattern, expr_t expr, int seqno,
1372                                       insn_t after)
1373 {
1374   insn_t insn;
1375
1376   gcc_assert (!init_insn_force_unique_p);
1377
1378   init_insn_force_unique_p = true;
1379   insn = sel_gen_insn_from_rtx_after (pattern, expr, seqno, after);
1380   CANT_MOVE (insn) = 1;
1381   init_insn_force_unique_p = false;
1382
1383   return insn;
1384 }
1385
1386 /* Emit new insn after AFTER based on EXPR and SEQNO.  If VINSN is not NULL,
1387    take it as a new vinsn instead of EXPR's vinsn.
1388    We simplify insns later, after scheduling region in
1389    simplify_changed_insns.  */
1390 insn_t
1391 sel_gen_insn_from_expr_after (expr_t expr, vinsn_t vinsn, int seqno,
1392                               insn_t after)
1393 {
1394   expr_t emit_expr;
1395   insn_t insn;
1396   int flags;
1397
1398   emit_expr = set_insn_init (expr, vinsn ? vinsn : EXPR_VINSN (expr),
1399                              seqno);
1400   insn = EXPR_INSN_RTX (emit_expr);
1401
1402   /* The insn may come from the transformation cache, which may hold already
1403      deleted insns, so mark it as not deleted.  */
1404   INSN_DELETED_P (insn) = 0;
1405
1406   add_insn_after (insn, after, BLOCK_FOR_INSN (insn));
1407
1408   flags = INSN_INIT_TODO_SSID;
1409   if (INSN_LUID (insn) == 0)
1410     flags |= INSN_INIT_TODO_LUID;
1411   sel_init_new_insn (insn, flags);
1412
1413   return insn;
1414 }
1415
1416 /* Move insn from EXPR after AFTER.  */
1417 insn_t
1418 sel_move_insn (expr_t expr, int seqno, insn_t after)
1419 {
1420   insn_t insn = EXPR_INSN_RTX (expr);
1421   basic_block bb = BLOCK_FOR_INSN (after);
1422   insn_t next = NEXT_INSN (after);
1423
1424   /* Assert that in move_op we disconnected this insn properly.  */
1425   gcc_assert (EXPR_VINSN (INSN_EXPR (insn)) != NULL);
1426   SET_PREV_INSN (insn) = after;
1427   SET_NEXT_INSN (insn) = next;
1428
1429   SET_NEXT_INSN (after) = insn;
1430   SET_PREV_INSN (next) = insn;
1431
1432   /* Update links from insn to bb and vice versa.  */
1433   df_insn_change_bb (insn, bb);
1434   if (BB_END (bb) == after)
1435     SET_BB_END (bb) = insn;
1436
1437   prepare_insn_expr (insn, seqno);
1438   return insn;
1439 }
1440
1441 \f
1442 /* Functions to work with right-hand sides.  */
1443
1444 /* Search for a hash value determined by UID/NEW_VINSN in a sorted vector
1445    VECT and return true when found.  Use NEW_VINSN for comparison only when
1446    COMPARE_VINSNS is true.  Write to INDP the index on which
1447    the search has stopped, such that inserting the new element at INDP will
1448    retain VECT's sort order.  */
1449 static bool
1450 find_in_history_vect_1 (vec<expr_history_def> vect,
1451                         unsigned uid, vinsn_t new_vinsn,
1452                         bool compare_vinsns, int *indp)
1453 {
1454   expr_history_def *arr;
1455   int i, j, len = vect.length ();
1456
1457   if (len == 0)
1458     {
1459       *indp = 0;
1460       return false;
1461     }
1462
1463   arr = vect.address ();
1464   i = 0, j = len - 1;
1465
1466   while (i <= j)
1467     {
1468       unsigned auid = arr[i].uid;
1469       vinsn_t avinsn = arr[i].new_expr_vinsn;
1470
1471       if (auid == uid
1472           /* When undoing transformation on a bookkeeping copy, the new vinsn
1473              may not be exactly equal to the one that is saved in the vector.
1474              This is because the insn whose copy we're checking was possibly
1475              substituted itself.  */
1476           && (! compare_vinsns
1477               || vinsn_equal_p (avinsn, new_vinsn)))
1478         {
1479           *indp = i;
1480           return true;
1481         }
1482       else if (auid > uid)
1483         break;
1484       i++;
1485     }
1486
1487   *indp = i;
1488   return false;
1489 }
1490
1491 /* Search for a uid of INSN and NEW_VINSN in a sorted vector VECT.  Return
1492    the position found or -1, if no such value is in vector.
1493    Search also for UIDs of insn's originators, if ORIGINATORS_P is true.  */
1494 int
1495 find_in_history_vect (vec<expr_history_def> vect, rtx insn,
1496                       vinsn_t new_vinsn, bool originators_p)
1497 {
1498   int ind;
1499
1500   if (find_in_history_vect_1 (vect, INSN_UID (insn), new_vinsn,
1501                               false, &ind))
1502     return ind;
1503
1504   if (INSN_ORIGINATORS (insn) && originators_p)
1505     {
1506       unsigned uid;
1507       bitmap_iterator bi;
1508
1509       EXECUTE_IF_SET_IN_BITMAP (INSN_ORIGINATORS (insn), 0, uid, bi)
1510         if (find_in_history_vect_1 (vect, uid, new_vinsn, false, &ind))
1511           return ind;
1512     }
1513
1514   return -1;
1515 }
1516
1517 /* Insert new element in a sorted history vector pointed to by PVECT,
1518    if it is not there already.  The element is searched using
1519    UID/NEW_EXPR_VINSN pair.  TYPE, OLD_EXPR_VINSN and SPEC_DS save
1520    the history of a transformation.  */
1521 void
1522 insert_in_history_vect (vec<expr_history_def> *pvect,
1523                         unsigned uid, enum local_trans_type type,
1524                         vinsn_t old_expr_vinsn, vinsn_t new_expr_vinsn,
1525                         ds_t spec_ds)
1526 {
1527   vec<expr_history_def> vect = *pvect;
1528   expr_history_def temp;
1529   bool res;
1530   int ind;
1531
1532   res = find_in_history_vect_1 (vect, uid, new_expr_vinsn, true, &ind);
1533
1534   if (res)
1535     {
1536       expr_history_def *phist = &vect[ind];
1537
1538       /* It is possible that speculation types of expressions that were
1539          propagated through different paths will be different here.  In this
1540          case, merge the status to get the correct check later.  */
1541       if (phist->spec_ds != spec_ds)
1542         phist->spec_ds = ds_max_merge (phist->spec_ds, spec_ds);
1543       return;
1544     }
1545
1546   temp.uid = uid;
1547   temp.old_expr_vinsn = old_expr_vinsn;
1548   temp.new_expr_vinsn = new_expr_vinsn;
1549   temp.spec_ds = spec_ds;
1550   temp.type = type;
1551
1552   vinsn_attach (old_expr_vinsn);
1553   vinsn_attach (new_expr_vinsn);
1554   vect.safe_insert (ind, temp);
1555   *pvect = vect;
1556 }
1557
1558 /* Free history vector PVECT.  */
1559 static void
1560 free_history_vect (vec<expr_history_def> &pvect)
1561 {
1562   unsigned i;
1563   expr_history_def *phist;
1564
1565   if (! pvect.exists ())
1566     return;
1567
1568   for (i = 0; pvect.iterate (i, &phist); i++)
1569     {
1570       vinsn_detach (phist->old_expr_vinsn);
1571       vinsn_detach (phist->new_expr_vinsn);
1572     }
1573
1574   pvect.release ();
1575 }
1576
1577 /* Merge vector FROM to PVECT.  */
1578 static void
1579 merge_history_vect (vec<expr_history_def> *pvect,
1580                     vec<expr_history_def> from)
1581 {
1582   expr_history_def *phist;
1583   int i;
1584
1585   /* We keep this vector sorted.  */
1586   for (i = 0; from.iterate (i, &phist); i++)
1587     insert_in_history_vect (pvect, phist->uid, phist->type,
1588                             phist->old_expr_vinsn, phist->new_expr_vinsn,
1589                             phist->spec_ds);
1590 }
1591
1592 /* Compare two vinsns as rhses if possible and as vinsns otherwise.  */
1593 bool
1594 vinsn_equal_p (vinsn_t x, vinsn_t y)
1595 {
1596   rtx_equal_p_callback_function repcf;
1597
1598   if (x == y)
1599     return true;
1600
1601   if (VINSN_TYPE (x) != VINSN_TYPE (y))
1602     return false;
1603
1604   if (VINSN_HASH (x) != VINSN_HASH (y))
1605     return false;
1606
1607   repcf = targetm.sched.skip_rtx_p ? skip_unspecs_callback : NULL;
1608   if (VINSN_SEPARABLE_P (x))
1609     {
1610       /* Compare RHSes of VINSNs.  */
1611       gcc_assert (VINSN_RHS (x));
1612       gcc_assert (VINSN_RHS (y));
1613
1614       return rtx_equal_p_cb (VINSN_RHS (x), VINSN_RHS (y), repcf);
1615     }
1616
1617   return rtx_equal_p_cb (VINSN_PATTERN (x), VINSN_PATTERN (y), repcf);
1618 }
1619 \f
1620
1621 /* Functions for working with expressions.  */
1622
1623 /* Initialize EXPR.  */
1624 static void
1625 init_expr (expr_t expr, vinsn_t vi, int spec, int use, int priority,
1626            int sched_times, int orig_bb_index, ds_t spec_done_ds,
1627            ds_t spec_to_check_ds, int orig_sched_cycle,
1628            vec<expr_history_def> history,
1629            signed char target_available,
1630            bool was_substituted, bool was_renamed, bool needs_spec_check_p,
1631            bool cant_move)
1632 {
1633   vinsn_attach (vi);
1634
1635   EXPR_VINSN (expr) = vi;
1636   EXPR_SPEC (expr) = spec;
1637   EXPR_USEFULNESS (expr) = use;
1638   EXPR_PRIORITY (expr) = priority;
1639   EXPR_PRIORITY_ADJ (expr) = 0;
1640   EXPR_SCHED_TIMES (expr) = sched_times;
1641   EXPR_ORIG_BB_INDEX (expr) = orig_bb_index;
1642   EXPR_ORIG_SCHED_CYCLE (expr) = orig_sched_cycle;
1643   EXPR_SPEC_DONE_DS (expr) = spec_done_ds;
1644   EXPR_SPEC_TO_CHECK_DS (expr) = spec_to_check_ds;
1645
1646   if (history.exists ())
1647     EXPR_HISTORY_OF_CHANGES (expr) = history;
1648   else
1649     EXPR_HISTORY_OF_CHANGES (expr).create (0);
1650
1651   EXPR_TARGET_AVAILABLE (expr) = target_available;
1652   EXPR_WAS_SUBSTITUTED (expr) = was_substituted;
1653   EXPR_WAS_RENAMED (expr) = was_renamed;
1654   EXPR_NEEDS_SPEC_CHECK_P (expr) = needs_spec_check_p;
1655   EXPR_CANT_MOVE (expr) = cant_move;
1656 }
1657
1658 /* Make a copy of the expr FROM into the expr TO.  */
1659 void
1660 copy_expr (expr_t to, expr_t from)
1661 {
1662   vec<expr_history_def> temp = vNULL;
1663
1664   if (EXPR_HISTORY_OF_CHANGES (from).exists ())
1665     {
1666       unsigned i;
1667       expr_history_def *phist;
1668
1669       temp = EXPR_HISTORY_OF_CHANGES (from).copy ();
1670       for (i = 0;
1671            temp.iterate (i, &phist);
1672            i++)
1673         {
1674           vinsn_attach (phist->old_expr_vinsn);
1675           vinsn_attach (phist->new_expr_vinsn);
1676         }
1677     }
1678
1679   init_expr (to, EXPR_VINSN (from), EXPR_SPEC (from),
1680              EXPR_USEFULNESS (from), EXPR_PRIORITY (from),
1681              EXPR_SCHED_TIMES (from), EXPR_ORIG_BB_INDEX (from),
1682              EXPR_SPEC_DONE_DS (from), EXPR_SPEC_TO_CHECK_DS (from),
1683              EXPR_ORIG_SCHED_CYCLE (from), temp,
1684              EXPR_TARGET_AVAILABLE (from), EXPR_WAS_SUBSTITUTED (from),
1685              EXPR_WAS_RENAMED (from), EXPR_NEEDS_SPEC_CHECK_P (from),
1686              EXPR_CANT_MOVE (from));
1687 }
1688
1689 /* Same, but the final expr will not ever be in av sets, so don't copy
1690    "uninteresting" data such as bitmap cache.  */
1691 void
1692 copy_expr_onside (expr_t to, expr_t from)
1693 {
1694   init_expr (to, EXPR_VINSN (from), EXPR_SPEC (from), EXPR_USEFULNESS (from),
1695              EXPR_PRIORITY (from), EXPR_SCHED_TIMES (from), 0,
1696              EXPR_SPEC_DONE_DS (from), EXPR_SPEC_TO_CHECK_DS (from), 0,
1697              vNULL,
1698              EXPR_TARGET_AVAILABLE (from), EXPR_WAS_SUBSTITUTED (from),
1699              EXPR_WAS_RENAMED (from), EXPR_NEEDS_SPEC_CHECK_P (from),
1700              EXPR_CANT_MOVE (from));
1701 }
1702
1703 /* Prepare the expr of INSN for scheduling.  Used when moving insn and when
1704    initializing new insns.  */
1705 static void
1706 prepare_insn_expr (insn_t insn, int seqno)
1707 {
1708   expr_t expr = INSN_EXPR (insn);
1709   ds_t ds;
1710
1711   INSN_SEQNO (insn) = seqno;
1712   EXPR_ORIG_BB_INDEX (expr) = BLOCK_NUM (insn);
1713   EXPR_SPEC (expr) = 0;
1714   EXPR_ORIG_SCHED_CYCLE (expr) = 0;
1715   EXPR_WAS_SUBSTITUTED (expr) = 0;
1716   EXPR_WAS_RENAMED (expr) = 0;
1717   EXPR_TARGET_AVAILABLE (expr) = 1;
1718   INSN_LIVE_VALID_P (insn) = false;
1719
1720   /* ??? If this expression is speculative, make its dependence
1721      as weak as possible.  We can filter this expression later
1722      in process_spec_exprs, because we do not distinguish
1723      between the status we got during compute_av_set and the
1724      existing status.  To be fixed.  */
1725   ds = EXPR_SPEC_DONE_DS (expr);
1726   if (ds)
1727     EXPR_SPEC_DONE_DS (expr) = ds_get_max_dep_weak (ds);
1728
1729   free_history_vect (EXPR_HISTORY_OF_CHANGES (expr));
1730 }
1731
1732 /* Update target_available bits when merging exprs TO and FROM.  SPLIT_POINT
1733    is non-null when expressions are merged from different successors at
1734    a split point.  */
1735 static void
1736 update_target_availability (expr_t to, expr_t from, insn_t split_point)
1737 {
1738   if (EXPR_TARGET_AVAILABLE (to) < 0
1739       || EXPR_TARGET_AVAILABLE (from) < 0)
1740     EXPR_TARGET_AVAILABLE (to) = -1;
1741   else
1742     {
1743       /* We try to detect the case when one of the expressions
1744          can only be reached through another one.  In this case,
1745          we can do better.  */
1746       if (split_point == NULL)
1747         {
1748           int toind, fromind;
1749
1750           toind = EXPR_ORIG_BB_INDEX (to);
1751           fromind = EXPR_ORIG_BB_INDEX (from);
1752
1753           if (toind && toind == fromind)
1754             /* Do nothing -- everything is done in
1755                merge_with_other_exprs.  */
1756             ;
1757           else
1758             EXPR_TARGET_AVAILABLE (to) = -1;
1759         }
1760       else if (EXPR_TARGET_AVAILABLE (from) == 0
1761                && EXPR_LHS (from)
1762                && REG_P (EXPR_LHS (from))
1763                && REGNO (EXPR_LHS (to)) != REGNO (EXPR_LHS (from)))
1764         EXPR_TARGET_AVAILABLE (to) = -1;
1765       else
1766         EXPR_TARGET_AVAILABLE (to) &= EXPR_TARGET_AVAILABLE (from);
1767     }
1768 }
1769
1770 /* Update speculation bits when merging exprs TO and FROM.  SPLIT_POINT
1771    is non-null when expressions are merged from different successors at
1772    a split point.  */
1773 static void
1774 update_speculative_bits (expr_t to, expr_t from, insn_t split_point)
1775 {
1776   ds_t old_to_ds, old_from_ds;
1777
1778   old_to_ds = EXPR_SPEC_DONE_DS (to);
1779   old_from_ds = EXPR_SPEC_DONE_DS (from);
1780
1781   EXPR_SPEC_DONE_DS (to) = ds_max_merge (old_to_ds, old_from_ds);
1782   EXPR_SPEC_TO_CHECK_DS (to) |= EXPR_SPEC_TO_CHECK_DS (from);
1783   EXPR_NEEDS_SPEC_CHECK_P (to) |= EXPR_NEEDS_SPEC_CHECK_P (from);
1784
1785   /* When merging e.g. control & data speculative exprs, or a control
1786      speculative with a control&data speculative one, we really have
1787      to change vinsn too.  Also, when speculative status is changed,
1788      we also need to record this as a transformation in expr's history.  */
1789   if ((old_to_ds & SPECULATIVE) || (old_from_ds & SPECULATIVE))
1790     {
1791       old_to_ds = ds_get_speculation_types (old_to_ds);
1792       old_from_ds = ds_get_speculation_types (old_from_ds);
1793
1794       if (old_to_ds != old_from_ds)
1795         {
1796           ds_t record_ds;
1797
1798           /* When both expressions are speculative, we need to change
1799              the vinsn first.  */
1800           if ((old_to_ds & SPECULATIVE) && (old_from_ds & SPECULATIVE))
1801             {
1802               int res;
1803
1804               res = speculate_expr (to, EXPR_SPEC_DONE_DS (to));
1805               gcc_assert (res >= 0);
1806             }
1807
1808           if (split_point != NULL)
1809             {
1810               /* Record the change with proper status.  */
1811               record_ds = EXPR_SPEC_DONE_DS (to) & SPECULATIVE;
1812               record_ds &= ~(old_to_ds & SPECULATIVE);
1813               record_ds &= ~(old_from_ds & SPECULATIVE);
1814
1815               insert_in_history_vect (&EXPR_HISTORY_OF_CHANGES (to),
1816                                       INSN_UID (split_point), TRANS_SPECULATION,
1817                                       EXPR_VINSN (from), EXPR_VINSN (to),
1818                                       record_ds);
1819             }
1820         }
1821     }
1822 }
1823
1824
1825 /* Merge bits of FROM expr to TO expr.  When SPLIT_POINT is not NULL,
1826    this is done along different paths.  */
1827 void
1828 merge_expr_data (expr_t to, expr_t from, insn_t split_point)
1829 {
1830   /* Choose the maximum of the specs of merged exprs.  This is required
1831      for correctness of bookkeeping.  */
1832   if (EXPR_SPEC (to) < EXPR_SPEC (from))
1833     EXPR_SPEC (to) = EXPR_SPEC (from);
1834
1835   if (split_point)
1836     EXPR_USEFULNESS (to) += EXPR_USEFULNESS (from);
1837   else
1838     EXPR_USEFULNESS (to) = MAX (EXPR_USEFULNESS (to),
1839                                 EXPR_USEFULNESS (from));
1840
1841   if (EXPR_PRIORITY (to) < EXPR_PRIORITY (from))
1842     EXPR_PRIORITY (to) = EXPR_PRIORITY (from);
1843
1844   if (EXPR_SCHED_TIMES (to) > EXPR_SCHED_TIMES (from))
1845     EXPR_SCHED_TIMES (to) = EXPR_SCHED_TIMES (from);
1846
1847   if (EXPR_ORIG_BB_INDEX (to) != EXPR_ORIG_BB_INDEX (from))
1848     EXPR_ORIG_BB_INDEX (to) = 0;
1849
1850   EXPR_ORIG_SCHED_CYCLE (to) = MIN (EXPR_ORIG_SCHED_CYCLE (to),
1851                                     EXPR_ORIG_SCHED_CYCLE (from));
1852
1853   EXPR_WAS_SUBSTITUTED (to) |= EXPR_WAS_SUBSTITUTED (from);
1854   EXPR_WAS_RENAMED (to) |= EXPR_WAS_RENAMED (from);
1855   EXPR_CANT_MOVE (to) |= EXPR_CANT_MOVE (from);
1856
1857   merge_history_vect (&EXPR_HISTORY_OF_CHANGES (to),
1858                       EXPR_HISTORY_OF_CHANGES (from));
1859   update_target_availability (to, from, split_point);
1860   update_speculative_bits (to, from, split_point);
1861 }
1862
1863 /* Merge bits of FROM expr to TO expr.  Vinsns in the exprs should be equal
1864    in terms of vinsn_equal_p.  SPLIT_POINT is non-null when expressions
1865    are merged from different successors at a split point.  */
1866 void
1867 merge_expr (expr_t to, expr_t from, insn_t split_point)
1868 {
1869   vinsn_t to_vi = EXPR_VINSN (to);
1870   vinsn_t from_vi = EXPR_VINSN (from);
1871
1872   gcc_assert (vinsn_equal_p (to_vi, from_vi));
1873
1874   /* Make sure that speculative pattern is propagated into exprs that
1875      have non-speculative one.  This will provide us with consistent
1876      speculative bits and speculative patterns inside expr.  */
1877   if ((EXPR_SPEC_DONE_DS (from) != 0
1878        && EXPR_SPEC_DONE_DS (to) == 0)
1879       /* Do likewise for volatile insns, so that we always retain
1880          the may_trap_p bit on the resulting expression.  */
1881       || (VINSN_MAY_TRAP_P (EXPR_VINSN (from))
1882           && !VINSN_MAY_TRAP_P (EXPR_VINSN (to))))
1883     change_vinsn_in_expr (to, EXPR_VINSN (from));
1884
1885   merge_expr_data (to, from, split_point);
1886   gcc_assert (EXPR_USEFULNESS (to) <= REG_BR_PROB_BASE);
1887 }
1888
1889 /* Clear the information of this EXPR.  */
1890 void
1891 clear_expr (expr_t expr)
1892 {
1893
1894   vinsn_detach (EXPR_VINSN (expr));
1895   EXPR_VINSN (expr) = NULL;
1896
1897   free_history_vect (EXPR_HISTORY_OF_CHANGES (expr));
1898 }
1899
1900 /* For a given LV_SET, mark EXPR having unavailable target register.  */
1901 static void
1902 set_unavailable_target_for_expr (expr_t expr, regset lv_set)
1903 {
1904   if (EXPR_SEPARABLE_P (expr))
1905     {
1906       if (REG_P (EXPR_LHS (expr))
1907           && register_unavailable_p (lv_set, EXPR_LHS (expr)))
1908         {
1909           /* If it's an insn like r1 = use (r1, ...), and it exists in
1910              different forms in each of the av_sets being merged, we can't say
1911              whether original destination register is available or not.
1912              However, this still works if destination register is not used
1913              in the original expression: if the branch at which LV_SET we're
1914              looking here is not actually 'other branch' in sense that same
1915              expression is available through it (but it can't be determined
1916              at computation stage because of transformations on one of the
1917              branches), it still won't affect the availability.
1918              Liveness of a register somewhere on a code motion path means
1919              it's either read somewhere on a codemotion path, live on
1920              'other' branch, live at the point immediately following
1921              the original operation, or is read by the original operation.
1922              The latter case is filtered out in the condition below.
1923              It still doesn't cover the case when register is defined and used
1924              somewhere within the code motion path, and in this case we could
1925              miss a unifying code motion along both branches using a renamed
1926              register, but it won't affect a code correctness since upon
1927              an actual code motion a bookkeeping code would be generated.  */
1928           if (register_unavailable_p (VINSN_REG_USES (EXPR_VINSN (expr)),
1929                                       EXPR_LHS (expr)))
1930             EXPR_TARGET_AVAILABLE (expr) = -1;
1931           else
1932             EXPR_TARGET_AVAILABLE (expr) = false;
1933         }
1934     }
1935   else
1936     {
1937       unsigned regno;
1938       reg_set_iterator rsi;
1939
1940       EXECUTE_IF_SET_IN_REG_SET (VINSN_REG_SETS (EXPR_VINSN (expr)),
1941                                  0, regno, rsi)
1942         if (bitmap_bit_p (lv_set, regno))
1943           {
1944             EXPR_TARGET_AVAILABLE (expr) = false;
1945             break;
1946           }
1947
1948       EXECUTE_IF_SET_IN_REG_SET (VINSN_REG_CLOBBERS (EXPR_VINSN (expr)),
1949                                  0, regno, rsi)
1950         if (bitmap_bit_p (lv_set, regno))
1951           {
1952             EXPR_TARGET_AVAILABLE (expr) = false;
1953             break;
1954           }
1955     }
1956 }
1957
1958 /* Try to make EXPR speculative.  Return 1 when EXPR's pattern
1959    or dependence status have changed, 2 when also the target register
1960    became unavailable, 0 if nothing had to be changed.  */
1961 int
1962 speculate_expr (expr_t expr, ds_t ds)
1963 {
1964   int res;
1965   rtx orig_insn_rtx;
1966   rtx spec_pat;
1967   ds_t target_ds, current_ds;
1968
1969   /* Obtain the status we need to put on EXPR.   */
1970   target_ds = (ds & SPECULATIVE);
1971   current_ds = EXPR_SPEC_DONE_DS (expr);
1972   ds = ds_full_merge (current_ds, target_ds, NULL_RTX, NULL_RTX);
1973
1974   orig_insn_rtx = EXPR_INSN_RTX (expr);
1975
1976   res = sched_speculate_insn (orig_insn_rtx, ds, &spec_pat);
1977
1978   switch (res)
1979     {
1980     case 0:
1981       EXPR_SPEC_DONE_DS (expr) = ds;
1982       return current_ds != ds ? 1 : 0;
1983
1984     case 1:
1985       {
1986         rtx spec_insn_rtx = create_insn_rtx_from_pattern (spec_pat, NULL_RTX);
1987         vinsn_t spec_vinsn = create_vinsn_from_insn_rtx (spec_insn_rtx, false);
1988
1989         change_vinsn_in_expr (expr, spec_vinsn);
1990         EXPR_SPEC_DONE_DS (expr) = ds;
1991         EXPR_NEEDS_SPEC_CHECK_P (expr) = true;
1992
1993         /* Do not allow clobbering the address register of speculative
1994            insns.  */
1995         if (register_unavailable_p (VINSN_REG_USES (EXPR_VINSN (expr)),
1996                                     expr_dest_reg (expr)))
1997           {
1998             EXPR_TARGET_AVAILABLE (expr) = false;
1999             return 2;
2000           }
2001
2002         return 1;
2003       }
2004
2005     case -1:
2006       return -1;
2007
2008     default:
2009       gcc_unreachable ();
2010       return -1;
2011     }
2012 }
2013
2014 /* Return a destination register, if any, of EXPR.  */
2015 rtx
2016 expr_dest_reg (expr_t expr)
2017 {
2018   rtx dest = VINSN_LHS (EXPR_VINSN (expr));
2019
2020   if (dest != NULL_RTX && REG_P (dest))
2021     return dest;
2022
2023   return NULL_RTX;
2024 }
2025
2026 /* Returns the REGNO of the R's destination.  */
2027 unsigned
2028 expr_dest_regno (expr_t expr)
2029 {
2030   rtx dest = expr_dest_reg (expr);
2031
2032   gcc_assert (dest != NULL_RTX);
2033   return REGNO (dest);
2034 }
2035
2036 /* For a given LV_SET, mark all expressions in JOIN_SET, but not present in
2037    AV_SET having unavailable target register.  */
2038 void
2039 mark_unavailable_targets (av_set_t join_set, av_set_t av_set, regset lv_set)
2040 {
2041   expr_t expr;
2042   av_set_iterator avi;
2043
2044   FOR_EACH_EXPR (expr, avi, join_set)
2045     if (av_set_lookup (av_set, EXPR_VINSN (expr)) == NULL)
2046       set_unavailable_target_for_expr (expr, lv_set);
2047 }
2048 \f
2049
2050 /* Returns true if REG (at least partially) is present in REGS.  */
2051 bool
2052 register_unavailable_p (regset regs, rtx reg)
2053 {
2054   unsigned regno, end_regno;
2055
2056   regno = REGNO (reg);
2057   if (bitmap_bit_p (regs, regno))
2058     return true;
2059
2060   end_regno = END_REGNO (reg);
2061
2062   while (++regno < end_regno)
2063     if (bitmap_bit_p (regs, regno))
2064       return true;
2065
2066   return false;
2067 }
2068
2069 /* Av set functions.  */
2070
2071 /* Add a new element to av set SETP.
2072    Return the element added.  */
2073 static av_set_t
2074 av_set_add_element (av_set_t *setp)
2075 {
2076   /* Insert at the beginning of the list.  */
2077   _list_add (setp);
2078   return *setp;
2079 }
2080
2081 /* Add EXPR to SETP.  */
2082 void
2083 av_set_add (av_set_t *setp, expr_t expr)
2084 {
2085   av_set_t elem;
2086
2087   gcc_assert (!INSN_NOP_P (EXPR_INSN_RTX (expr)));
2088   elem = av_set_add_element (setp);
2089   copy_expr (_AV_SET_EXPR (elem), expr);
2090 }
2091
2092 /* Same, but do not copy EXPR.  */
2093 static void
2094 av_set_add_nocopy (av_set_t *setp, expr_t expr)
2095 {
2096   av_set_t elem;
2097
2098   elem = av_set_add_element (setp);
2099   *_AV_SET_EXPR (elem) = *expr;
2100 }
2101
2102 /* Remove expr pointed to by IP from the av_set.  */
2103 void
2104 av_set_iter_remove (av_set_iterator *ip)
2105 {
2106   clear_expr (_AV_SET_EXPR (*ip->lp));
2107   _list_iter_remove (ip);
2108 }
2109
2110 /* Search for an expr in SET, such that it's equivalent to SOUGHT_VINSN in the
2111    sense of vinsn_equal_p function. Return NULL if no such expr is
2112    in SET was found.  */
2113 expr_t
2114 av_set_lookup (av_set_t set, vinsn_t sought_vinsn)
2115 {
2116   expr_t expr;
2117   av_set_iterator i;
2118
2119   FOR_EACH_EXPR (expr, i, set)
2120     if (vinsn_equal_p (EXPR_VINSN (expr), sought_vinsn))
2121       return expr;
2122   return NULL;
2123 }
2124
2125 /* Same, but also remove the EXPR found.   */
2126 static expr_t
2127 av_set_lookup_and_remove (av_set_t *setp, vinsn_t sought_vinsn)
2128 {
2129   expr_t expr;
2130   av_set_iterator i;
2131
2132   FOR_EACH_EXPR_1 (expr, i, setp)
2133     if (vinsn_equal_p (EXPR_VINSN (expr), sought_vinsn))
2134       {
2135         _list_iter_remove_nofree (&i);
2136         return expr;
2137       }
2138   return NULL;
2139 }
2140
2141 /* Search for an expr in SET, such that it's equivalent to EXPR in the
2142    sense of vinsn_equal_p function of their vinsns, but not EXPR itself.
2143    Returns NULL if no such expr is in SET was found.  */
2144 static expr_t
2145 av_set_lookup_other_equiv_expr (av_set_t set, expr_t expr)
2146 {
2147   expr_t cur_expr;
2148   av_set_iterator i;
2149
2150   FOR_EACH_EXPR (cur_expr, i, set)
2151     {
2152       if (cur_expr == expr)
2153         continue;
2154       if (vinsn_equal_p (EXPR_VINSN (cur_expr), EXPR_VINSN (expr)))
2155         return cur_expr;
2156     }
2157
2158   return NULL;
2159 }
2160
2161 /* If other expression is already in AVP, remove one of them.  */
2162 expr_t
2163 merge_with_other_exprs (av_set_t *avp, av_set_iterator *ip, expr_t expr)
2164 {
2165   expr_t expr2;
2166
2167   expr2 = av_set_lookup_other_equiv_expr (*avp, expr);
2168   if (expr2 != NULL)
2169     {
2170       /* Reset target availability on merge, since taking it only from one
2171          of the exprs would be controversial for different code.  */
2172       EXPR_TARGET_AVAILABLE (expr2) = -1;
2173       EXPR_USEFULNESS (expr2) = 0;
2174
2175       merge_expr (expr2, expr, NULL);
2176
2177       /* Fix usefulness as it should be now REG_BR_PROB_BASE.  */
2178       EXPR_USEFULNESS (expr2) = REG_BR_PROB_BASE;
2179
2180       av_set_iter_remove (ip);
2181       return expr2;
2182     }
2183
2184   return expr;
2185 }
2186
2187 /* Return true if there is an expr that correlates to VI in SET.  */
2188 bool
2189 av_set_is_in_p (av_set_t set, vinsn_t vi)
2190 {
2191   return av_set_lookup (set, vi) != NULL;
2192 }
2193
2194 /* Return a copy of SET.  */
2195 av_set_t
2196 av_set_copy (av_set_t set)
2197 {
2198   expr_t expr;
2199   av_set_iterator i;
2200   av_set_t res = NULL;
2201
2202   FOR_EACH_EXPR (expr, i, set)
2203     av_set_add (&res, expr);
2204
2205   return res;
2206 }
2207
2208 /* Join two av sets that do not have common elements by attaching second set
2209    (pointed to by FROMP) to the end of first set (TO_TAILP must point to
2210    _AV_SET_NEXT of first set's last element).  */
2211 static void
2212 join_distinct_sets (av_set_t *to_tailp, av_set_t *fromp)
2213 {
2214   gcc_assert (*to_tailp == NULL);
2215   *to_tailp = *fromp;
2216   *fromp = NULL;
2217 }
2218
2219 /* Makes set pointed to by TO to be the union of TO and FROM.  Clear av_set
2220    pointed to by FROMP afterwards.  */
2221 void
2222 av_set_union_and_clear (av_set_t *top, av_set_t *fromp, insn_t insn)
2223 {
2224   expr_t expr1;
2225   av_set_iterator i;
2226
2227   /* Delete from TOP all exprs, that present in FROMP.  */
2228   FOR_EACH_EXPR_1 (expr1, i, top)
2229     {
2230       expr_t expr2 = av_set_lookup (*fromp, EXPR_VINSN (expr1));
2231
2232       if (expr2)
2233         {
2234           merge_expr (expr2, expr1, insn);
2235           av_set_iter_remove (&i);
2236         }
2237     }
2238
2239   join_distinct_sets (i.lp, fromp);
2240 }
2241
2242 /* Same as above, but also update availability of target register in
2243    TOP judging by TO_LV_SET and FROM_LV_SET.  */
2244 void
2245 av_set_union_and_live (av_set_t *top, av_set_t *fromp, regset to_lv_set,
2246                        regset from_lv_set, insn_t insn)
2247 {
2248   expr_t expr1;
2249   av_set_iterator i;
2250   av_set_t *to_tailp, in_both_set = NULL;
2251
2252   /* Delete from TOP all expres, that present in FROMP.  */
2253   FOR_EACH_EXPR_1 (expr1, i, top)
2254     {
2255       expr_t expr2 = av_set_lookup_and_remove (fromp, EXPR_VINSN (expr1));
2256
2257       if (expr2)
2258         {
2259           /* It may be that the expressions have different destination
2260              registers, in which case we need to check liveness here.  */
2261           if (EXPR_SEPARABLE_P (expr1))
2262             {
2263               int regno1 = (REG_P (EXPR_LHS (expr1))
2264                             ? (int) expr_dest_regno (expr1) : -1);
2265               int regno2 = (REG_P (EXPR_LHS (expr2))
2266                             ? (int) expr_dest_regno (expr2) : -1);
2267
2268               /* ??? We don't have a way to check restrictions for
2269                *other* register on the current path, we did it only
2270                for the current target register.  Give up.  */
2271               if (regno1 != regno2)
2272                 EXPR_TARGET_AVAILABLE (expr2) = -1;
2273             }
2274           else if (EXPR_INSN_RTX (expr1) != EXPR_INSN_RTX (expr2))
2275             EXPR_TARGET_AVAILABLE (expr2) = -1;
2276
2277           merge_expr (expr2, expr1, insn);
2278           av_set_add_nocopy (&in_both_set, expr2);
2279           av_set_iter_remove (&i);
2280         }
2281       else
2282         /* EXPR1 is present in TOP, but not in FROMP.  Check it on
2283            FROM_LV_SET.  */
2284         set_unavailable_target_for_expr (expr1, from_lv_set);
2285     }
2286   to_tailp = i.lp;
2287
2288   /* These expressions are not present in TOP.  Check liveness
2289      restrictions on TO_LV_SET.  */
2290   FOR_EACH_EXPR (expr1, i, *fromp)
2291     set_unavailable_target_for_expr (expr1, to_lv_set);
2292
2293   join_distinct_sets (i.lp, &in_both_set);
2294   join_distinct_sets (to_tailp, fromp);
2295 }
2296
2297 /* Clear av_set pointed to by SETP.  */
2298 void
2299 av_set_clear (av_set_t *setp)
2300 {
2301   expr_t expr;
2302   av_set_iterator i;
2303
2304   FOR_EACH_EXPR_1 (expr, i, setp)
2305     av_set_iter_remove (&i);
2306
2307   gcc_assert (*setp == NULL);
2308 }
2309
2310 /* Leave only one non-speculative element in the SETP.  */
2311 void
2312 av_set_leave_one_nonspec (av_set_t *setp)
2313 {
2314   expr_t expr;
2315   av_set_iterator i;
2316   bool has_one_nonspec = false;
2317
2318   /* Keep all speculative exprs, and leave one non-speculative
2319      (the first one).  */
2320   FOR_EACH_EXPR_1 (expr, i, setp)
2321     {
2322       if (!EXPR_SPEC_DONE_DS (expr))
2323         {
2324           if (has_one_nonspec)
2325             av_set_iter_remove (&i);
2326           else
2327             has_one_nonspec = true;
2328         }
2329     }
2330 }
2331
2332 /* Return the N'th element of the SET.  */
2333 expr_t
2334 av_set_element (av_set_t set, int n)
2335 {
2336   expr_t expr;
2337   av_set_iterator i;
2338
2339   FOR_EACH_EXPR (expr, i, set)
2340     if (n-- == 0)
2341       return expr;
2342
2343   gcc_unreachable ();
2344   return NULL;
2345 }
2346
2347 /* Deletes all expressions from AVP that are conditional branches (IFs).  */
2348 void
2349 av_set_substract_cond_branches (av_set_t *avp)
2350 {
2351   av_set_iterator i;
2352   expr_t expr;
2353
2354   FOR_EACH_EXPR_1 (expr, i, avp)
2355     if (vinsn_cond_branch_p (EXPR_VINSN (expr)))
2356       av_set_iter_remove (&i);
2357 }
2358
2359 /* Multiplies usefulness attribute of each member of av-set *AVP by
2360    value PROB / ALL_PROB.  */
2361 void
2362 av_set_split_usefulness (av_set_t av, int prob, int all_prob)
2363 {
2364   av_set_iterator i;
2365   expr_t expr;
2366
2367   FOR_EACH_EXPR (expr, i, av)
2368     EXPR_USEFULNESS (expr) = (all_prob
2369                               ? (EXPR_USEFULNESS (expr) * prob) / all_prob
2370                               : 0);
2371 }
2372
2373 /* Leave in AVP only those expressions, which are present in AV,
2374    and return it, merging history expressions.  */
2375 void
2376 av_set_code_motion_filter (av_set_t *avp, av_set_t av)
2377 {
2378   av_set_iterator i;
2379   expr_t expr, expr2;
2380
2381   FOR_EACH_EXPR_1 (expr, i, avp)
2382     if ((expr2 = av_set_lookup (av, EXPR_VINSN (expr))) == NULL)
2383       av_set_iter_remove (&i);
2384     else
2385       /* When updating av sets in bookkeeping blocks, we can add more insns
2386          there which will be transformed but the upper av sets will not
2387          reflect those transformations.  We then fail to undo those
2388          when searching for such insns.  So merge the history saved
2389          in the av set of the block we are processing.  */
2390       merge_history_vect (&EXPR_HISTORY_OF_CHANGES (expr),
2391                           EXPR_HISTORY_OF_CHANGES (expr2));
2392 }
2393
2394 \f
2395
2396 /* Dependence hooks to initialize insn data.  */
2397
2398 /* This is used in hooks callable from dependence analysis when initializing
2399    instruction's data.  */
2400 static struct
2401 {
2402   /* Where the dependence was found (lhs/rhs).  */
2403   deps_where_t where;
2404
2405   /* The actual data object to initialize.  */
2406   idata_t id;
2407
2408   /* True when the insn should not be made clonable.  */
2409   bool force_unique_p;
2410
2411   /* True when insn should be treated as of type USE, i.e. never renamed.  */
2412   bool force_use_p;
2413 } deps_init_id_data;
2414
2415
2416 /* Setup ID for INSN.  FORCE_UNIQUE_P is true when INSN should not be
2417    clonable.  */
2418 static void
2419 setup_id_for_insn (idata_t id, insn_t insn, bool force_unique_p)
2420 {
2421   int type;
2422
2423   /* Determine whether INSN could be cloned and return appropriate vinsn type.
2424      That clonable insns which can be separated into lhs and rhs have type SET.
2425      Other clonable insns have type USE.  */
2426   type = GET_CODE (insn);
2427
2428   /* Only regular insns could be cloned.  */
2429   if (type == INSN && !force_unique_p)
2430     type = SET;
2431   else if (type == JUMP_INSN && simplejump_p (insn))
2432     type = PC;
2433   else if (type == DEBUG_INSN)
2434     type = !force_unique_p ? USE : INSN;
2435
2436   IDATA_TYPE (id) = type;
2437   IDATA_REG_SETS (id) = get_clear_regset_from_pool ();
2438   IDATA_REG_USES (id) = get_clear_regset_from_pool ();
2439   IDATA_REG_CLOBBERS (id) = get_clear_regset_from_pool ();
2440 }
2441
2442 /* Start initializing insn data.  */
2443 static void
2444 deps_init_id_start_insn (insn_t insn)
2445 {
2446   gcc_assert (deps_init_id_data.where == DEPS_IN_NOWHERE);
2447
2448   setup_id_for_insn (deps_init_id_data.id, insn,
2449                      deps_init_id_data.force_unique_p);
2450   deps_init_id_data.where = DEPS_IN_INSN;
2451 }
2452
2453 /* Start initializing lhs data.  */
2454 static void
2455 deps_init_id_start_lhs (rtx lhs)
2456 {
2457   gcc_assert (deps_init_id_data.where == DEPS_IN_INSN);
2458   gcc_assert (IDATA_LHS (deps_init_id_data.id) == NULL);
2459
2460   if (IDATA_TYPE (deps_init_id_data.id) == SET)
2461     {
2462       IDATA_LHS (deps_init_id_data.id) = lhs;
2463       deps_init_id_data.where = DEPS_IN_LHS;
2464     }
2465 }
2466
2467 /* Finish initializing lhs data.  */
2468 static void
2469 deps_init_id_finish_lhs (void)
2470 {
2471   deps_init_id_data.where = DEPS_IN_INSN;
2472 }
2473
2474 /* Note a set of REGNO.  */
2475 static void
2476 deps_init_id_note_reg_set (int regno)
2477 {
2478   haifa_note_reg_set (regno);
2479
2480   if (deps_init_id_data.where == DEPS_IN_RHS)
2481     deps_init_id_data.force_use_p = true;
2482
2483   if (IDATA_TYPE (deps_init_id_data.id) != PC)
2484     SET_REGNO_REG_SET (IDATA_REG_SETS (deps_init_id_data.id), regno);
2485
2486 #ifdef STACK_REGS
2487   /* Make instructions that set stack registers to be ineligible for
2488      renaming to avoid issues with find_used_regs.  */
2489   if (IN_RANGE (regno, FIRST_STACK_REG, LAST_STACK_REG))
2490     deps_init_id_data.force_use_p = true;
2491 #endif
2492 }
2493
2494 /* Note a clobber of REGNO.  */
2495 static void
2496 deps_init_id_note_reg_clobber (int regno)
2497 {
2498   haifa_note_reg_clobber (regno);
2499
2500   if (deps_init_id_data.where == DEPS_IN_RHS)
2501     deps_init_id_data.force_use_p = true;
2502
2503   if (IDATA_TYPE (deps_init_id_data.id) != PC)
2504     SET_REGNO_REG_SET (IDATA_REG_CLOBBERS (deps_init_id_data.id), regno);
2505 }
2506
2507 /* Note a use of REGNO.  */
2508 static void
2509 deps_init_id_note_reg_use (int regno)
2510 {
2511   haifa_note_reg_use (regno);
2512
2513   if (IDATA_TYPE (deps_init_id_data.id) != PC)
2514     SET_REGNO_REG_SET (IDATA_REG_USES (deps_init_id_data.id), regno);
2515 }
2516
2517 /* Start initializing rhs data.  */
2518 static void
2519 deps_init_id_start_rhs (rtx rhs)
2520 {
2521   gcc_assert (deps_init_id_data.where == DEPS_IN_INSN);
2522
2523   /* And there was no sel_deps_reset_to_insn ().  */
2524   if (IDATA_LHS (deps_init_id_data.id) != NULL)
2525     {
2526       IDATA_RHS (deps_init_id_data.id) = rhs;
2527       deps_init_id_data.where = DEPS_IN_RHS;
2528     }
2529 }
2530
2531 /* Finish initializing rhs data.  */
2532 static void
2533 deps_init_id_finish_rhs (void)
2534 {
2535   gcc_assert (deps_init_id_data.where == DEPS_IN_RHS
2536               || deps_init_id_data.where == DEPS_IN_INSN);
2537   deps_init_id_data.where = DEPS_IN_INSN;
2538 }
2539
2540 /* Finish initializing insn data.  */
2541 static void
2542 deps_init_id_finish_insn (void)
2543 {
2544   gcc_assert (deps_init_id_data.where == DEPS_IN_INSN);
2545
2546   if (IDATA_TYPE (deps_init_id_data.id) == SET)
2547     {
2548       rtx lhs = IDATA_LHS (deps_init_id_data.id);
2549       rtx rhs = IDATA_RHS (deps_init_id_data.id);
2550
2551       if (lhs == NULL || rhs == NULL || !lhs_and_rhs_separable_p (lhs, rhs)
2552           || deps_init_id_data.force_use_p)
2553         {
2554           /* This should be a USE, as we don't want to schedule its RHS
2555              separately.  However, we still want to have them recorded
2556              for the purposes of substitution.  That's why we don't
2557              simply call downgrade_to_use () here.  */
2558           gcc_assert (IDATA_TYPE (deps_init_id_data.id) == SET);
2559           gcc_assert (!lhs == !rhs);
2560
2561           IDATA_TYPE (deps_init_id_data.id) = USE;
2562         }
2563     }
2564
2565   deps_init_id_data.where = DEPS_IN_NOWHERE;
2566 }
2567
2568 /* This is dependence info used for initializing insn's data.  */
2569 static struct sched_deps_info_def deps_init_id_sched_deps_info;
2570
2571 /* This initializes most of the static part of the above structure.  */
2572 static const struct sched_deps_info_def const_deps_init_id_sched_deps_info =
2573   {
2574     NULL,
2575
2576     deps_init_id_start_insn,
2577     deps_init_id_finish_insn,
2578     deps_init_id_start_lhs,
2579     deps_init_id_finish_lhs,
2580     deps_init_id_start_rhs,
2581     deps_init_id_finish_rhs,
2582     deps_init_id_note_reg_set,
2583     deps_init_id_note_reg_clobber,
2584     deps_init_id_note_reg_use,
2585     NULL, /* note_mem_dep */
2586     NULL, /* note_dep */
2587
2588     0, /* use_cselib */
2589     0, /* use_deps_list */
2590     0 /* generate_spec_deps */
2591   };
2592
2593 /* Initialize INSN's lhs and rhs in ID.  When FORCE_UNIQUE_P is true,
2594    we don't actually need information about lhs and rhs.  */
2595 static void
2596 setup_id_lhs_rhs (idata_t id, insn_t insn, bool force_unique_p)
2597 {
2598   rtx pat = PATTERN (insn);
2599
2600   if (NONJUMP_INSN_P (insn)
2601       && GET_CODE (pat) == SET
2602       && !force_unique_p)
2603     {
2604       IDATA_RHS (id) = SET_SRC (pat);
2605       IDATA_LHS (id) = SET_DEST (pat);
2606     }
2607   else
2608     IDATA_LHS (id) = IDATA_RHS (id) = NULL;
2609 }
2610
2611 /* Possibly downgrade INSN to USE.  */
2612 static void
2613 maybe_downgrade_id_to_use (idata_t id, insn_t insn)
2614 {
2615   bool must_be_use = false;
2616   df_ref def;
2617   rtx lhs = IDATA_LHS (id);
2618   rtx rhs = IDATA_RHS (id);
2619
2620   /* We downgrade only SETs.  */
2621   if (IDATA_TYPE (id) != SET)
2622     return;
2623
2624   if (!lhs || !lhs_and_rhs_separable_p (lhs, rhs))
2625     {
2626       IDATA_TYPE (id) = USE;
2627       return;
2628     }
2629
2630   FOR_EACH_INSN_DEF (def, insn)
2631     {
2632       if (DF_REF_INSN (def)
2633           && DF_REF_FLAGS_IS_SET (def, DF_REF_PRE_POST_MODIFY)
2634           && loc_mentioned_in_p (DF_REF_LOC (def), IDATA_RHS (id)))
2635         {
2636           must_be_use = true;
2637           break;
2638         }
2639
2640 #ifdef STACK_REGS
2641       /* Make instructions that set stack registers to be ineligible for
2642          renaming to avoid issues with find_used_regs.  */
2643       if (IN_RANGE (DF_REF_REGNO (def), FIRST_STACK_REG, LAST_STACK_REG))
2644         {
2645           must_be_use = true;
2646           break;
2647         }
2648 #endif
2649     }
2650
2651   if (must_be_use)
2652     IDATA_TYPE (id) = USE;
2653 }
2654
2655 /* Setup register sets describing INSN in ID.  */
2656 static void
2657 setup_id_reg_sets (idata_t id, insn_t insn)
2658 {
2659   struct df_insn_info *insn_info = DF_INSN_INFO_GET (insn);
2660   df_ref def, use;
2661   regset tmp = get_clear_regset_from_pool ();
2662
2663   FOR_EACH_INSN_INFO_DEF (def, insn_info)
2664     {
2665       unsigned int regno = DF_REF_REGNO (def);
2666
2667       /* Post modifies are treated like clobbers by sched-deps.c.  */
2668       if (DF_REF_FLAGS_IS_SET (def, (DF_REF_MUST_CLOBBER
2669                                      | DF_REF_PRE_POST_MODIFY)))
2670         SET_REGNO_REG_SET (IDATA_REG_CLOBBERS (id), regno);
2671       else if (! DF_REF_FLAGS_IS_SET (def, DF_REF_MAY_CLOBBER))
2672         {
2673           SET_REGNO_REG_SET (IDATA_REG_SETS (id), regno);
2674
2675 #ifdef STACK_REGS
2676           /* For stack registers, treat writes to them as writes
2677              to the first one to be consistent with sched-deps.c.  */
2678           if (IN_RANGE (regno, FIRST_STACK_REG, LAST_STACK_REG))
2679             SET_REGNO_REG_SET (IDATA_REG_SETS (id), FIRST_STACK_REG);
2680 #endif
2681         }
2682       /* Mark special refs that generate read/write def pair.  */
2683       if (DF_REF_FLAGS_IS_SET (def, DF_REF_CONDITIONAL)
2684           || regno == STACK_POINTER_REGNUM)
2685         bitmap_set_bit (tmp, regno);
2686     }
2687
2688   FOR_EACH_INSN_INFO_USE (use, insn_info)
2689     {
2690       unsigned int regno = DF_REF_REGNO (use);
2691
2692       /* When these refs are met for the first time, skip them, as
2693          these uses are just counterparts of some defs.  */
2694       if (bitmap_bit_p (tmp, regno))
2695         bitmap_clear_bit (tmp, regno);
2696       else if (! DF_REF_FLAGS_IS_SET (use, DF_REF_CALL_STACK_USAGE))
2697         {
2698           SET_REGNO_REG_SET (IDATA_REG_USES (id), regno);
2699
2700 #ifdef STACK_REGS
2701           /* For stack registers, treat reads from them as reads from
2702              the first one to be consistent with sched-deps.c.  */
2703           if (IN_RANGE (regno, FIRST_STACK_REG, LAST_STACK_REG))
2704             SET_REGNO_REG_SET (IDATA_REG_USES (id), FIRST_STACK_REG);
2705 #endif
2706         }
2707     }
2708
2709   return_regset_to_pool (tmp);
2710 }
2711
2712 /* Initialize instruction data for INSN in ID using DF's data.  */
2713 static void
2714 init_id_from_df (idata_t id, insn_t insn, bool force_unique_p)
2715 {
2716   gcc_assert (DF_INSN_UID_SAFE_GET (INSN_UID (insn)) != NULL);
2717
2718   setup_id_for_insn (id, insn, force_unique_p);
2719   setup_id_lhs_rhs (id, insn, force_unique_p);
2720
2721   if (INSN_NOP_P (insn))
2722     return;
2723
2724   maybe_downgrade_id_to_use (id, insn);
2725   setup_id_reg_sets (id, insn);
2726 }
2727
2728 /* Initialize instruction data for INSN in ID.  */
2729 static void
2730 deps_init_id (idata_t id, insn_t insn, bool force_unique_p)
2731 {
2732   struct deps_desc _dc, *dc = &_dc;
2733
2734   deps_init_id_data.where = DEPS_IN_NOWHERE;
2735   deps_init_id_data.id = id;
2736   deps_init_id_data.force_unique_p = force_unique_p;
2737   deps_init_id_data.force_use_p = false;
2738
2739   init_deps (dc, false);
2740
2741   memcpy (&deps_init_id_sched_deps_info,
2742           &const_deps_init_id_sched_deps_info,
2743           sizeof (deps_init_id_sched_deps_info));
2744
2745   if (spec_info != NULL)
2746     deps_init_id_sched_deps_info.generate_spec_deps = 1;
2747
2748   sched_deps_info = &deps_init_id_sched_deps_info;
2749
2750   deps_analyze_insn (dc, insn);
2751
2752   free_deps (dc);
2753
2754   deps_init_id_data.id = NULL;
2755 }
2756
2757 \f
2758 struct sched_scan_info_def
2759 {
2760   /* This hook notifies scheduler frontend to extend its internal per basic
2761      block data structures.  This hook should be called once before a series of
2762      calls to bb_init ().  */
2763   void (*extend_bb) (void);
2764
2765   /* This hook makes scheduler frontend to initialize its internal data
2766      structures for the passed basic block.  */
2767   void (*init_bb) (basic_block);
2768
2769   /* This hook notifies scheduler frontend to extend its internal per insn data
2770      structures.  This hook should be called once before a series of calls to
2771      insn_init ().  */
2772   void (*extend_insn) (void);
2773
2774   /* This hook makes scheduler frontend to initialize its internal data
2775      structures for the passed insn.  */
2776   void (*init_insn) (rtx);
2777 };
2778
2779 /* A driver function to add a set of basic blocks (BBS) to the
2780    scheduling region.  */
2781 static void
2782 sched_scan (const struct sched_scan_info_def *ssi, bb_vec_t bbs)
2783 {
2784   unsigned i;
2785   basic_block bb;
2786
2787   if (ssi->extend_bb)
2788     ssi->extend_bb ();
2789
2790   if (ssi->init_bb)
2791     FOR_EACH_VEC_ELT (bbs, i, bb)
2792       ssi->init_bb (bb);
2793
2794   if (ssi->extend_insn)
2795     ssi->extend_insn ();
2796
2797   if (ssi->init_insn)
2798     FOR_EACH_VEC_ELT (bbs, i, bb)
2799       {
2800         rtx insn;
2801
2802         FOR_BB_INSNS (bb, insn)
2803           ssi->init_insn (insn);
2804       }
2805 }
2806
2807 /* Implement hooks for collecting fundamental insn properties like if insn is
2808    an ASM or is within a SCHED_GROUP.  */
2809
2810 /* True when a "one-time init" data for INSN was already inited.  */
2811 static bool
2812 first_time_insn_init (insn_t insn)
2813 {
2814   return INSN_LIVE (insn) == NULL;
2815 }
2816
2817 /* Hash an entry in a transformed_insns hashtable.  */
2818 static hashval_t
2819 hash_transformed_insns (const void *p)
2820 {
2821   return VINSN_HASH_RTX (((const struct transformed_insns *) p)->vinsn_old);
2822 }
2823
2824 /* Compare the entries in a transformed_insns hashtable.  */
2825 static int
2826 eq_transformed_insns (const void *p, const void *q)
2827 {
2828   rtx i1 = VINSN_INSN_RTX (((const struct transformed_insns *) p)->vinsn_old);
2829   rtx i2 = VINSN_INSN_RTX (((const struct transformed_insns *) q)->vinsn_old);
2830
2831   if (INSN_UID (i1) == INSN_UID (i2))
2832     return 1;
2833   return rtx_equal_p (PATTERN (i1), PATTERN (i2));
2834 }
2835
2836 /* Free an entry in a transformed_insns hashtable.  */
2837 static void
2838 free_transformed_insns (void *p)
2839 {
2840   struct transformed_insns *pti = (struct transformed_insns *) p;
2841
2842   vinsn_detach (pti->vinsn_old);
2843   vinsn_detach (pti->vinsn_new);
2844   free (pti);
2845 }
2846
2847 /* Init the s_i_d data for INSN which should be inited just once, when
2848    we first see the insn.  */
2849 static void
2850 init_first_time_insn_data (insn_t insn)
2851 {
2852   /* This should not be set if this is the first time we init data for
2853      insn.  */
2854   gcc_assert (first_time_insn_init (insn));
2855
2856   /* These are needed for nops too.  */
2857   INSN_LIVE (insn) = get_regset_from_pool ();
2858   INSN_LIVE_VALID_P (insn) = false;
2859
2860   if (!INSN_NOP_P (insn))
2861     {
2862       INSN_ANALYZED_DEPS (insn) = BITMAP_ALLOC (NULL);
2863       INSN_FOUND_DEPS (insn) = BITMAP_ALLOC (NULL);
2864       INSN_TRANSFORMED_INSNS (insn)
2865         = htab_create (16, hash_transformed_insns,
2866                        eq_transformed_insns, free_transformed_insns);
2867       init_deps (&INSN_DEPS_CONTEXT (insn), true);
2868     }
2869 }
2870
2871 /* Free almost all above data for INSN that is scheduled already.
2872    Used for extra-large basic blocks.  */
2873 void
2874 free_data_for_scheduled_insn (insn_t insn)
2875 {
2876   gcc_assert (! first_time_insn_init (insn));
2877
2878   if (! INSN_ANALYZED_DEPS (insn))
2879     return;
2880
2881   BITMAP_FREE (INSN_ANALYZED_DEPS (insn));
2882   BITMAP_FREE (INSN_FOUND_DEPS (insn));
2883   htab_delete (INSN_TRANSFORMED_INSNS (insn));
2884
2885   /* This is allocated only for bookkeeping insns.  */
2886   if (INSN_ORIGINATORS (insn))
2887     BITMAP_FREE (INSN_ORIGINATORS (insn));
2888   free_deps (&INSN_DEPS_CONTEXT (insn));
2889
2890   INSN_ANALYZED_DEPS (insn) = NULL;
2891
2892   /* Clear the readonly flag so we would ICE when trying to recalculate
2893      the deps context (as we believe that it should not happen).  */
2894   (&INSN_DEPS_CONTEXT (insn))->readonly = 0;
2895 }
2896
2897 /* Free the same data as above for INSN.  */
2898 static void
2899 free_first_time_insn_data (insn_t insn)
2900 {
2901   gcc_assert (! first_time_insn_init (insn));
2902
2903   free_data_for_scheduled_insn (insn);
2904   return_regset_to_pool (INSN_LIVE (insn));
2905   INSN_LIVE (insn) = NULL;
2906   INSN_LIVE_VALID_P (insn) = false;
2907 }
2908
2909 /* Initialize region-scope data structures for basic blocks.  */
2910 static void
2911 init_global_and_expr_for_bb (basic_block bb)
2912 {
2913   if (sel_bb_empty_p (bb))
2914     return;
2915
2916   invalidate_av_set (bb);
2917 }
2918
2919 /* Data for global dependency analysis (to initialize CANT_MOVE and
2920    SCHED_GROUP_P).  */
2921 static struct
2922 {
2923   /* Previous insn.  */
2924   insn_t prev_insn;
2925 } init_global_data;
2926
2927 /* Determine if INSN is in the sched_group, is an asm or should not be
2928    cloned.  After that initialize its expr.  */
2929 static void
2930 init_global_and_expr_for_insn (insn_t insn)
2931 {
2932   if (LABEL_P (insn))
2933     return;
2934
2935   if (NOTE_INSN_BASIC_BLOCK_P (insn))
2936     {
2937       init_global_data.prev_insn = NULL_RTX;
2938       return;
2939     }
2940
2941   gcc_assert (INSN_P (insn));
2942
2943   if (SCHED_GROUP_P (insn))
2944     /* Setup a sched_group.  */
2945     {
2946       insn_t prev_insn = init_global_data.prev_insn;
2947
2948       if (prev_insn)
2949         INSN_SCHED_NEXT (prev_insn) = insn;
2950
2951       init_global_data.prev_insn = insn;
2952     }
2953   else
2954     init_global_data.prev_insn = NULL_RTX;
2955
2956   if (GET_CODE (PATTERN (insn)) == ASM_INPUT
2957       || asm_noperands (PATTERN (insn)) >= 0)
2958     /* Mark INSN as an asm.  */
2959     INSN_ASM_P (insn) = true;
2960
2961   {
2962     bool force_unique_p;
2963     ds_t spec_done_ds;
2964
2965     /* Certain instructions cannot be cloned, and frame related insns and
2966        the insn adjacent to NOTE_INSN_EPILOGUE_BEG cannot be moved out of
2967        their block.  */
2968     if (prologue_epilogue_contains (insn))
2969       {
2970         if (RTX_FRAME_RELATED_P (insn))
2971           CANT_MOVE (insn) = 1;
2972         else
2973           {
2974             rtx note;
2975             for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
2976               if (REG_NOTE_KIND (note) == REG_SAVE_NOTE
2977                   && ((enum insn_note) INTVAL (XEXP (note, 0))
2978                       == NOTE_INSN_EPILOGUE_BEG))
2979                 {
2980                   CANT_MOVE (insn) = 1;
2981                   break;
2982                 }
2983           }
2984         force_unique_p = true;
2985       }
2986     else
2987       if (CANT_MOVE (insn)
2988           || INSN_ASM_P (insn)
2989           || SCHED_GROUP_P (insn)
2990           || CALL_P (insn)
2991           /* Exception handling insns are always unique.  */
2992           || (cfun->can_throw_non_call_exceptions && can_throw_internal (insn))
2993           /* TRAP_IF though have an INSN code is control_flow_insn_p ().  */
2994           || control_flow_insn_p (insn)
2995           || volatile_insn_p (PATTERN (insn))
2996           || (targetm.cannot_copy_insn_p
2997               && targetm.cannot_copy_insn_p (insn)))
2998         force_unique_p = true;
2999       else
3000         force_unique_p = false;
3001
3002     if (targetm.sched.get_insn_spec_ds)
3003       {
3004         spec_done_ds = targetm.sched.get_insn_spec_ds (insn);
3005         spec_done_ds = ds_get_max_dep_weak (spec_done_ds);
3006       }
3007     else
3008       spec_done_ds = 0;
3009
3010     /* Initialize INSN's expr.  */
3011     init_expr (INSN_EXPR (insn), vinsn_create (insn, force_unique_p), 0,
3012                REG_BR_PROB_BASE, INSN_PRIORITY (insn), 0, BLOCK_NUM (insn),
3013                spec_done_ds, 0, 0, vNULL, true,
3014                false, false, false, CANT_MOVE (insn));
3015   }
3016
3017   init_first_time_insn_data (insn);
3018 }
3019
3020 /* Scan the region and initialize instruction data for basic blocks BBS.  */
3021 void
3022 sel_init_global_and_expr (bb_vec_t bbs)
3023 {
3024   /* ??? It would be nice to implement push / pop scheme for sched_infos.  */
3025   const struct sched_scan_info_def ssi =
3026     {
3027       NULL, /* extend_bb */
3028       init_global_and_expr_for_bb, /* init_bb */
3029       extend_insn_data, /* extend_insn */
3030       init_global_and_expr_for_insn /* init_insn */
3031     };
3032
3033   sched_scan (&ssi, bbs);
3034 }
3035
3036 /* Finalize region-scope data structures for basic blocks.  */
3037 static void
3038 finish_global_and_expr_for_bb (basic_block bb)
3039 {
3040   av_set_clear (&BB_AV_SET (bb));
3041   BB_AV_LEVEL (bb) = 0;
3042 }
3043
3044 /* Finalize INSN's data.  */
3045 static void
3046 finish_global_and_expr_insn (insn_t insn)
3047 {
3048   if (LABEL_P (insn) || NOTE_INSN_BASIC_BLOCK_P (insn))
3049     return;
3050
3051   gcc_assert (INSN_P (insn));
3052
3053   if (INSN_LUID (insn) > 0)
3054     {
3055       free_first_time_insn_data (insn);
3056       INSN_WS_LEVEL (insn) = 0;
3057       CANT_MOVE (insn) = 0;
3058
3059       /* We can no longer assert this, as vinsns of this insn could be
3060          easily live in other insn's caches.  This should be changed to
3061          a counter-like approach among all vinsns.  */
3062       gcc_assert (true || VINSN_COUNT (INSN_VINSN (insn)) == 1);
3063       clear_expr (INSN_EXPR (insn));
3064     }
3065 }
3066
3067 /* Finalize per instruction data for the whole region.  */
3068 void
3069 sel_finish_global_and_expr (void)
3070 {
3071   {
3072     bb_vec_t bbs;
3073     int i;
3074
3075     bbs.create (current_nr_blocks);
3076
3077     for (i = 0; i < current_nr_blocks; i++)
3078       bbs.quick_push (BASIC_BLOCK_FOR_FN (cfun, BB_TO_BLOCK (i)));
3079
3080     /* Clear AV_SETs and INSN_EXPRs.  */
3081     {
3082       const struct sched_scan_info_def ssi =
3083         {
3084           NULL, /* extend_bb */
3085           finish_global_and_expr_for_bb, /* init_bb */
3086           NULL, /* extend_insn */
3087           finish_global_and_expr_insn /* init_insn */
3088         };
3089
3090       sched_scan (&ssi, bbs);
3091     }
3092
3093     bbs.release ();
3094   }
3095
3096   finish_insns ();
3097 }
3098 \f
3099
3100 /* In the below hooks, we merely calculate whether or not a dependence
3101    exists, and in what part of insn.  However, we will need more data
3102    when we'll start caching dependence requests.  */
3103
3104 /* Container to hold information for dependency analysis.  */
3105 static struct
3106 {
3107   deps_t dc;
3108
3109   /* A variable to track which part of rtx we are scanning in
3110      sched-deps.c: sched_analyze_insn ().  */
3111   deps_where_t where;
3112
3113   /* Current producer.  */
3114   insn_t pro;
3115
3116   /* Current consumer.  */
3117   vinsn_t con;
3118
3119   /* Is SEL_DEPS_HAS_DEP_P[DEPS_IN_X] is true, then X has a dependence.
3120      X is from { INSN, LHS, RHS }.  */
3121   ds_t has_dep_p[DEPS_IN_NOWHERE];
3122 } has_dependence_data;
3123
3124 /* Start analyzing dependencies of INSN.  */
3125 static void
3126 has_dependence_start_insn (insn_t insn ATTRIBUTE_UNUSED)
3127 {
3128   gcc_assert (has_dependence_data.where == DEPS_IN_NOWHERE);
3129
3130   has_dependence_data.where = DEPS_IN_INSN;
3131 }
3132
3133 /* Finish analyzing dependencies of an insn.  */
3134 static void
3135 has_dependence_finish_insn (void)
3136 {
3137   gcc_assert (has_dependence_data.where == DEPS_IN_INSN);
3138
3139   has_dependence_data.where = DEPS_IN_NOWHERE;
3140 }
3141
3142 /* Start analyzing dependencies of LHS.  */
3143 static void
3144 has_dependence_start_lhs (rtx lhs ATTRIBUTE_UNUSED)
3145 {
3146   gcc_assert (has_dependence_data.where == DEPS_IN_INSN);
3147
3148   if (VINSN_LHS (has_dependence_data.con) != NULL)
3149     has_dependence_data.where = DEPS_IN_LHS;
3150 }
3151
3152 /* Finish analyzing dependencies of an lhs.  */
3153 static void
3154 has_dependence_finish_lhs (void)
3155 {
3156   has_dependence_data.where = DEPS_IN_INSN;
3157 }
3158
3159 /* Start analyzing dependencies of RHS.  */
3160 static void
3161 has_dependence_start_rhs (rtx rhs ATTRIBUTE_UNUSED)
3162 {
3163   gcc_assert (has_dependence_data.where == DEPS_IN_INSN);
3164
3165   if (VINSN_RHS (has_dependence_data.con) != NULL)
3166     has_dependence_data.where = DEPS_IN_RHS;
3167 }
3168
3169 /* Start analyzing dependencies of an rhs.  */
3170 static void
3171 has_dependence_finish_rhs (void)
3172 {
3173   gcc_assert (has_dependence_data.where == DEPS_IN_RHS
3174               || has_dependence_data.where == DEPS_IN_INSN);
3175
3176   has_dependence_data.where = DEPS_IN_INSN;
3177 }
3178
3179 /* Note a set of REGNO.  */
3180 static void
3181 has_dependence_note_reg_set (int regno)
3182 {
3183   struct deps_reg *reg_last = &has_dependence_data.dc->reg_last[regno];
3184
3185   if (!sched_insns_conditions_mutex_p (has_dependence_data.pro,
3186                                        VINSN_INSN_RTX
3187                                        (has_dependence_data.con)))
3188     {
3189       ds_t *dsp = &has_dependence_data.has_dep_p[has_dependence_data.where];
3190
3191       if (reg_last->sets != NULL
3192           || reg_last->clobbers != NULL)
3193         *dsp = (*dsp & ~SPECULATIVE) | DEP_OUTPUT;
3194
3195       if (reg_last->uses || reg_last->implicit_sets)
3196         *dsp = (*dsp & ~SPECULATIVE) | DEP_ANTI;
3197     }
3198 }
3199
3200 /* Note a clobber of REGNO.  */
3201 static void
3202 has_dependence_note_reg_clobber (int regno)
3203 {
3204   struct deps_reg *reg_last = &has_dependence_data.dc->reg_last[regno];
3205
3206   if (!sched_insns_conditions_mutex_p (has_dependence_data.pro,
3207                                        VINSN_INSN_RTX
3208                                        (has_dependence_data.con)))
3209     {
3210       ds_t *dsp = &has_dependence_data.has_dep_p[has_dependence_data.where];
3211
3212       if (reg_last->sets)
3213         *dsp = (*dsp & ~SPECULATIVE) | DEP_OUTPUT;
3214
3215       if (reg_last->uses || reg_last->implicit_sets)
3216         *dsp = (*dsp & ~SPECULATIVE) | DEP_ANTI;
3217     }
3218 }
3219
3220 /* Note a use of REGNO.  */
3221 static void
3222 has_dependence_note_reg_use (int regno)
3223 {
3224   struct deps_reg *reg_last = &has_dependence_data.dc->reg_last[regno];
3225
3226   if (!sched_insns_conditions_mutex_p (has_dependence_data.pro,
3227                                        VINSN_INSN_RTX
3228                                        (has_dependence_data.con)))
3229     {
3230       ds_t *dsp = &has_dependence_data.has_dep_p[has_dependence_data.where];
3231
3232       if (reg_last->sets)
3233         *dsp = (*dsp & ~SPECULATIVE) | DEP_TRUE;
3234
3235       if (reg_last->clobbers || reg_last->implicit_sets)
3236         *dsp = (*dsp & ~SPECULATIVE) | DEP_ANTI;
3237
3238       /* Merge BE_IN_SPEC bits into *DSP when the dependency producer
3239          is actually a check insn.  We need to do this for any register
3240          read-read dependency with the check unless we track properly
3241          all registers written by BE_IN_SPEC-speculated insns, as
3242          we don't have explicit dependence lists.  See PR 53975.  */
3243       if (reg_last->uses)
3244         {
3245           ds_t pro_spec_checked_ds;
3246
3247           pro_spec_checked_ds = INSN_SPEC_CHECKED_DS (has_dependence_data.pro);
3248           pro_spec_checked_ds = ds_get_max_dep_weak (pro_spec_checked_ds);
3249
3250           if (pro_spec_checked_ds != 0)
3251             *dsp = ds_full_merge (*dsp, pro_spec_checked_ds,
3252                                   NULL_RTX, NULL_RTX);
3253         }
3254     }
3255 }
3256
3257 /* Note a memory dependence.  */
3258 static void
3259 has_dependence_note_mem_dep (rtx mem ATTRIBUTE_UNUSED,
3260                              rtx pending_mem ATTRIBUTE_UNUSED,
3261                              insn_t pending_insn ATTRIBUTE_UNUSED,
3262                              ds_t ds ATTRIBUTE_UNUSED)
3263 {
3264   if (!sched_insns_conditions_mutex_p (has_dependence_data.pro,
3265                                        VINSN_INSN_RTX (has_dependence_data.con)))
3266     {
3267       ds_t *dsp = &has_dependence_data.has_dep_p[has_dependence_data.where];
3268
3269       *dsp = ds_full_merge (ds, *dsp, pending_mem, mem);
3270     }
3271 }
3272
3273 /* Note a dependence.  */
3274 static void
3275 has_dependence_note_dep (insn_t pro ATTRIBUTE_UNUSED,
3276                          ds_t ds ATTRIBUTE_UNUSED)
3277 {
3278   if (!sched_insns_conditions_mutex_p (has_dependence_data.pro,
3279                                        VINSN_INSN_RTX (has_dependence_data.con)))
3280     {
3281       ds_t *dsp = &has_dependence_data.has_dep_p[has_dependence_data.where];
3282
3283       *dsp = ds_full_merge (ds, *dsp, NULL_RTX, NULL_RTX);
3284     }
3285 }
3286
3287 /* Mark the insn as having a hard dependence that prevents speculation.  */
3288 void
3289 sel_mark_hard_insn (rtx insn)
3290 {
3291   int i;
3292
3293   /* Only work when we're in has_dependence_p mode.
3294      ??? This is a hack, this should actually be a hook.  */
3295   if (!has_dependence_data.dc || !has_dependence_data.pro)
3296     return;
3297
3298   gcc_assert (insn == VINSN_INSN_RTX (has_dependence_data.con));
3299   gcc_assert (has_dependence_data.where == DEPS_IN_INSN);
3300
3301   for (i = 0; i < DEPS_IN_NOWHERE; i++)
3302     has_dependence_data.has_dep_p[i] &= ~SPECULATIVE;
3303 }
3304
3305 /* This structure holds the hooks for the dependency analysis used when
3306    actually processing dependencies in the scheduler.  */
3307 static struct sched_deps_info_def has_dependence_sched_deps_info;
3308
3309 /* This initializes most of the fields of the above structure.  */
3310 static const struct sched_deps_info_def const_has_dependence_sched_deps_info =
3311   {
3312     NULL,
3313
3314     has_dependence_start_insn,
3315     has_dependence_finish_insn,
3316     has_dependence_start_lhs,
3317     has_dependence_finish_lhs,
3318     has_dependence_start_rhs,
3319     has_dependence_finish_rhs,
3320     has_dependence_note_reg_set,
3321     has_dependence_note_reg_clobber,
3322     has_dependence_note_reg_use,
3323     has_dependence_note_mem_dep,
3324     has_dependence_note_dep,
3325
3326     0, /* use_cselib */
3327     0, /* use_deps_list */
3328     0 /* generate_spec_deps */
3329   };
3330
3331 /* Initialize has_dependence_sched_deps_info with extra spec field.  */
3332 static void
3333 setup_has_dependence_sched_deps_info (void)
3334 {
3335   memcpy (&has_dependence_sched_deps_info,
3336           &const_has_dependence_sched_deps_info,
3337           sizeof (has_dependence_sched_deps_info));
3338
3339   if (spec_info != NULL)
3340     has_dependence_sched_deps_info.generate_spec_deps = 1;
3341
3342   sched_deps_info = &has_dependence_sched_deps_info;
3343 }
3344
3345 /* Remove all dependences found and recorded in has_dependence_data array.  */
3346 void
3347 sel_clear_has_dependence (void)
3348 {
3349   int i;
3350
3351   for (i = 0; i < DEPS_IN_NOWHERE; i++)
3352     has_dependence_data.has_dep_p[i] = 0;
3353 }
3354
3355 /* Return nonzero if EXPR has is dependent upon PRED.  Return the pointer
3356    to the dependence information array in HAS_DEP_PP.  */
3357 ds_t
3358 has_dependence_p (expr_t expr, insn_t pred, ds_t **has_dep_pp)
3359 {
3360   int i;
3361   ds_t ds;
3362   struct deps_desc *dc;
3363
3364   if (INSN_SIMPLEJUMP_P (pred))
3365     /* Unconditional jump is just a transfer of control flow.
3366        Ignore it.  */
3367     return false;
3368
3369   dc = &INSN_DEPS_CONTEXT (pred);
3370
3371   /* We init this field lazily.  */
3372   if (dc->reg_last == NULL)
3373     init_deps_reg_last (dc);
3374
3375   if (!dc->readonly)
3376     {
3377       has_dependence_data.pro = NULL;
3378       /* Initialize empty dep context with information about PRED.  */
3379       advance_deps_context (dc, pred);
3380       dc->readonly = 1;
3381     }
3382
3383   has_dependence_data.where = DEPS_IN_NOWHERE;
3384   has_dependence_data.pro = pred;
3385   has_dependence_data.con = EXPR_VINSN (expr);
3386   has_dependence_data.dc = dc;
3387
3388   sel_clear_has_dependence ();
3389
3390   /* Now catch all dependencies that would be generated between PRED and
3391      INSN.  */
3392   setup_has_dependence_sched_deps_info ();
3393   deps_analyze_insn (dc, EXPR_INSN_RTX (expr));
3394   has_dependence_data.dc = NULL;
3395
3396   /* When a barrier was found, set DEPS_IN_INSN bits.  */
3397   if (dc->last_reg_pending_barrier == TRUE_BARRIER)
3398     has_dependence_data.has_dep_p[DEPS_IN_INSN] = DEP_TRUE;
3399   else if (dc->last_reg_pending_barrier == MOVE_BARRIER)
3400     has_dependence_data.has_dep_p[DEPS_IN_INSN] = DEP_ANTI;
3401
3402   /* Do not allow stores to memory to move through checks.  Currently
3403      we don't move this to sched-deps.c as the check doesn't have
3404      obvious places to which this dependence can be attached.
3405      FIMXE: this should go to a hook.  */
3406   if (EXPR_LHS (expr)
3407       && MEM_P (EXPR_LHS (expr))
3408       && sel_insn_is_speculation_check (pred))
3409     has_dependence_data.has_dep_p[DEPS_IN_INSN] = DEP_ANTI;
3410
3411   *has_dep_pp = has_dependence_data.has_dep_p;
3412   ds = 0;
3413   for (i = 0; i < DEPS_IN_NOWHERE; i++)
3414     ds = ds_full_merge (ds, has_dependence_data.has_dep_p[i],
3415                         NULL_RTX, NULL_RTX);
3416
3417   return ds;
3418 }
3419 \f
3420
3421 /* Dependence hooks implementation that checks dependence latency constraints
3422    on the insns being scheduled.  The entry point for these routines is
3423    tick_check_p predicate.  */
3424
3425 static struct
3426 {
3427   /* An expr we are currently checking.  */
3428   expr_t expr;
3429
3430   /* A minimal cycle for its scheduling.  */
3431   int cycle;
3432
3433   /* Whether we have seen a true dependence while checking.  */
3434   bool seen_true_dep_p;
3435 } tick_check_data;
3436
3437 /* Update minimal scheduling cycle for tick_check_insn given that it depends
3438    on PRO with status DS and weight DW.  */
3439 static void
3440 tick_check_dep_with_dw (insn_t pro_insn, ds_t ds, dw_t dw)
3441 {
3442   expr_t con_expr = tick_check_data.expr;
3443   insn_t con_insn = EXPR_INSN_RTX (con_expr);
3444
3445   if (con_insn != pro_insn)
3446     {
3447       enum reg_note dt;
3448       int tick;
3449
3450       if (/* PROducer was removed from above due to pipelining.  */
3451           !INSN_IN_STREAM_P (pro_insn)
3452           /* Or PROducer was originally on the next iteration regarding the
3453              CONsumer.  */
3454           || (INSN_SCHED_TIMES (pro_insn)
3455               - EXPR_SCHED_TIMES (con_expr)) > 1)
3456         /* Don't count this dependence.  */
3457         return;
3458
3459       dt = ds_to_dt (ds);
3460       if (dt == REG_DEP_TRUE)
3461         tick_check_data.seen_true_dep_p = true;
3462
3463       gcc_assert (INSN_SCHED_CYCLE (pro_insn) > 0);
3464
3465       {
3466         dep_def _dep, *dep = &_dep;
3467
3468         init_dep (dep, pro_insn, con_insn, dt);
3469
3470         tick = INSN_SCHED_CYCLE (pro_insn) + dep_cost_1 (dep, dw);
3471       }
3472
3473       /* When there are several kinds of dependencies between pro and con,
3474          only REG_DEP_TRUE should be taken into account.  */
3475       if (tick > tick_check_data.cycle
3476           && (dt == REG_DEP_TRUE || !tick_check_data.seen_true_dep_p))
3477         tick_check_data.cycle = tick;
3478     }
3479 }
3480
3481 /* An implementation of note_dep hook.  */
3482 static void
3483 tick_check_note_dep (insn_t pro, ds_t ds)
3484 {
3485   tick_check_dep_with_dw (pro, ds, 0);
3486 }
3487
3488 /* An implementation of note_mem_dep hook.  */
3489 static void
3490 tick_check_note_mem_dep (rtx mem1, rtx mem2, insn_t pro, ds_t ds)
3491 {
3492   dw_t dw;
3493
3494   dw = (ds_to_dt (ds) == REG_DEP_TRUE
3495         ? estimate_dep_weak (mem1, mem2)
3496         : 0);
3497
3498   tick_check_dep_with_dw (pro, ds, dw);
3499 }
3500
3501 /* This structure contains hooks for dependence analysis used when determining
3502    whether an insn is ready for scheduling.  */
3503 static struct sched_deps_info_def tick_check_sched_deps_info =
3504   {
3505     NULL,
3506
3507     NULL,
3508     NULL,
3509     NULL,
3510     NULL,
3511     NULL,
3512     NULL,
3513     haifa_note_reg_set,
3514     haifa_note_reg_clobber,
3515     haifa_note_reg_use,
3516     tick_check_note_mem_dep,
3517     tick_check_note_dep,
3518
3519     0, 0, 0
3520   };
3521
3522 /* Estimate number of cycles from the current cycle of FENCE until EXPR can be
3523    scheduled.  Return 0 if all data from producers in DC is ready.  */
3524 int
3525 tick_check_p (expr_t expr, deps_t dc, fence_t fence)
3526 {
3527   int cycles_left;
3528   /* Initialize variables.  */
3529   tick_check_data.expr = expr;
3530   tick_check_data.cycle = 0;
3531   tick_check_data.seen_true_dep_p = false;
3532   sched_deps_info = &tick_check_sched_deps_info;
3533
3534   gcc_assert (!dc->readonly);
3535   dc->readonly = 1;
3536   deps_analyze_insn (dc, EXPR_INSN_RTX (expr));
3537   dc->readonly = 0;
3538
3539   cycles_left = tick_check_data.cycle - FENCE_CYCLE (fence);
3540
3541   return cycles_left >= 0 ? cycles_left : 0;
3542 }
3543 \f
3544
3545 /* Functions to work with insns.  */
3546
3547 /* Returns true if LHS of INSN is the same as DEST of an insn
3548    being moved.  */
3549 bool
3550 lhs_of_insn_equals_to_dest_p (insn_t insn, rtx dest)
3551 {
3552   rtx lhs = INSN_LHS (insn);
3553
3554   if (lhs == NULL || dest == NULL)
3555     return false;
3556
3557   return rtx_equal_p (lhs, dest);
3558 }
3559
3560 /* Return s_i_d entry of INSN.  Callable from debugger.  */
3561 sel_insn_data_def
3562 insn_sid (insn_t insn)
3563 {
3564   return *SID (insn);
3565 }
3566
3567 /* True when INSN is a speculative check.  We can tell this by looking
3568    at the data structures of the selective scheduler, not by examining
3569    the pattern.  */
3570 bool
3571 sel_insn_is_speculation_check (rtx insn)
3572 {
3573   return s_i_d.exists () && !! INSN_SPEC_CHECKED_DS (insn);
3574 }
3575
3576 /* Extracts machine mode MODE and destination location DST_LOC
3577    for given INSN.  */
3578 void
3579 get_dest_and_mode (rtx insn, rtx *dst_loc, enum machine_mode *mode)
3580 {
3581   rtx pat = PATTERN (insn);
3582
3583   gcc_assert (dst_loc);
3584   gcc_assert (GET_CODE (pat) == SET);
3585
3586   *dst_loc = SET_DEST (pat);
3587
3588   gcc_assert (*dst_loc);
3589   gcc_assert (MEM_P (*dst_loc) || REG_P (*dst_loc));
3590
3591   if (mode)
3592     *mode = GET_MODE (*dst_loc);
3593 }
3594
3595 /* Returns true when moving through JUMP will result in bookkeeping
3596    creation.  */
3597 bool
3598 bookkeeping_can_be_created_if_moved_through_p (insn_t jump)
3599 {
3600   insn_t succ;
3601   succ_iterator si;
3602
3603   FOR_EACH_SUCC (succ, si, jump)
3604     if (sel_num_cfg_preds_gt_1 (succ))
3605       return true;
3606
3607   return false;
3608 }
3609
3610 /* Return 'true' if INSN is the only one in its basic block.  */
3611 static bool
3612 insn_is_the_only_one_in_bb_p (insn_t insn)
3613 {
3614   return sel_bb_head_p (insn) && sel_bb_end_p (insn);
3615 }
3616
3617 #ifdef ENABLE_CHECKING
3618 /* Check that the region we're scheduling still has at most one
3619    backedge.  */
3620 static void
3621 verify_backedges (void)
3622 {
3623   if (pipelining_p)
3624     {
3625       int i, n = 0;
3626       edge e;
3627       edge_iterator ei;
3628
3629       for (i = 0; i < current_nr_blocks; i++)
3630         FOR_EACH_EDGE (e, ei, BASIC_BLOCK_FOR_FN (cfun, BB_TO_BLOCK (i))->succs)
3631           if (in_current_region_p (e->dest)
3632               && BLOCK_TO_BB (e->dest->index) < i)
3633             n++;
3634
3635       gcc_assert (n <= 1);
3636     }
3637 }
3638 #endif
3639 \f
3640
3641 /* Functions to work with control flow.  */
3642
3643 /* Recompute BLOCK_TO_BB and BB_FOR_BLOCK for current region so that blocks
3644    are sorted in topological order (it might have been invalidated by
3645    redirecting an edge).  */
3646 static void
3647 sel_recompute_toporder (void)
3648 {
3649   int i, n, rgn;
3650   int *postorder, n_blocks;
3651
3652   postorder = XALLOCAVEC (int, n_basic_blocks_for_fn (cfun));
3653   n_blocks = post_order_compute (postorder, false, false);
3654
3655   rgn = CONTAINING_RGN (BB_TO_BLOCK (0));
3656   for (n = 0, i = n_blocks - 1; i >= 0; i--)
3657     if (CONTAINING_RGN (postorder[i]) == rgn)
3658       {
3659         BLOCK_TO_BB (postorder[i]) = n;
3660         BB_TO_BLOCK (n) = postorder[i];
3661         n++;
3662       }
3663
3664   /* Assert that we updated info for all blocks.  We may miss some blocks if
3665      this function is called when redirecting an edge made a block
3666      unreachable, but that block is not deleted yet.  */
3667   gcc_assert (n == RGN_NR_BLOCKS (rgn));
3668 }
3669
3670 /* Tidy the possibly empty block BB.  */
3671 static bool
3672 maybe_tidy_empty_bb (basic_block bb)
3673 {
3674   basic_block succ_bb, pred_bb, note_bb;
3675   vec<basic_block> dom_bbs;
3676   edge e;
3677   edge_iterator ei;
3678   bool rescan_p;
3679
3680   /* Keep empty bb only if this block immediately precedes EXIT and
3681      has incoming non-fallthrough edge, or it has no predecessors or
3682      successors.  Otherwise remove it.  */
3683   if (!sel_bb_empty_p (bb)
3684       || (single_succ_p (bb)
3685           && single_succ (bb) == EXIT_BLOCK_PTR_FOR_FN (cfun)
3686           && (!single_pred_p (bb)
3687               || !(single_pred_edge (bb)->flags & EDGE_FALLTHRU)))
3688       || EDGE_COUNT (bb->preds) == 0
3689       || EDGE_COUNT (bb->succs) == 0)
3690     return false;
3691
3692   /* Do not attempt to redirect complex edges.  */
3693   FOR_EACH_EDGE (e, ei, bb->preds)
3694     if (e->flags & EDGE_COMPLEX)
3695       return false;
3696     else if (e->flags & EDGE_FALLTHRU)
3697       {
3698         rtx note;
3699         /* If prev bb ends with asm goto, see if any of the
3700            ASM_OPERANDS_LABELs don't point to the fallthru
3701            label.  Do not attempt to redirect it in that case.  */
3702         if (JUMP_P (BB_END (e->src))
3703             && (note = extract_asm_operands (PATTERN (BB_END (e->src)))))
3704           {
3705             int i, n = ASM_OPERANDS_LABEL_LENGTH (note);
3706
3707             for (i = 0; i < n; ++i)
3708               if (XEXP (ASM_OPERANDS_LABEL (note, i), 0) == BB_HEAD (bb))
3709                 return false;
3710           }
3711       }
3712
3713   free_data_sets (bb);
3714
3715   /* Do not delete BB if it has more than one successor.
3716      That can occur when we moving a jump.  */
3717   if (!single_succ_p (bb))
3718     {
3719       gcc_assert (can_merge_blocks_p (bb->prev_bb, bb));
3720       sel_merge_blocks (bb->prev_bb, bb);
3721       return true;
3722     }
3723
3724   succ_bb = single_succ (bb);
3725   rescan_p = true;
3726   pred_bb = NULL;
3727   dom_bbs.create (0);
3728
3729   /* Save a pred/succ from the current region to attach the notes to.  */
3730   note_bb = NULL;
3731   FOR_EACH_EDGE (e, ei, bb->preds)
3732     if (in_current_region_p (e->src))
3733       {
3734         note_bb = e->src;
3735         break;
3736       }
3737   if (note_bb == NULL)
3738     note_bb = succ_bb;
3739
3740   /* Redirect all non-fallthru edges to the next bb.  */
3741   while (rescan_p)
3742     {
3743       rescan_p = false;
3744
3745       FOR_EACH_EDGE (e, ei, bb->preds)
3746         {
3747           pred_bb = e->src;
3748
3749           if (!(e->flags & EDGE_FALLTHRU))
3750             {
3751               /* We can not invalidate computed topological order by moving
3752                  the edge destination block (E->SUCC) along a fallthru edge.
3753
3754                  We will update dominators here only when we'll get
3755                  an unreachable block when redirecting, otherwise
3756                  sel_redirect_edge_and_branch will take care of it.  */
3757               if (e->dest != bb
3758                   && single_pred_p (e->dest))
3759                 dom_bbs.safe_push (e->dest);
3760               sel_redirect_edge_and_branch (e, succ_bb);
3761               rescan_p = true;
3762               break;
3763             }
3764           /* If the edge is fallthru, but PRED_BB ends in a conditional jump
3765              to BB (so there is no non-fallthru edge from PRED_BB to BB), we
3766              still have to adjust it.  */
3767           else if (single_succ_p (pred_bb) && any_condjump_p (BB_END (pred_bb)))
3768             {
3769               /* If possible, try to remove the unneeded conditional jump.  */
3770               if (INSN_SCHED_TIMES (BB_END (pred_bb)) == 0
3771                   && !IN_CURRENT_FENCE_P (BB_END (pred_bb)))
3772                 {
3773                   if (!sel_remove_insn (BB_END (pred_bb), false, false))
3774                     tidy_fallthru_edge (e);
3775                 }
3776               else
3777                 sel_redirect_edge_and_branch (e, succ_bb);
3778               rescan_p = true;
3779               break;
3780             }
3781         }
3782     }
3783
3784   if (can_merge_blocks_p (bb->prev_bb, bb))
3785     sel_merge_blocks (bb->prev_bb, bb);
3786   else
3787     {
3788       /* This is a block without fallthru predecessor.  Just delete it.  */
3789       gcc_assert (note_bb);
3790       move_bb_info (note_bb, bb);
3791       remove_empty_bb (bb, true);
3792     }
3793
3794   if (!dom_bbs.is_empty ())
3795     {
3796       dom_bbs.safe_push (succ_bb);
3797       iterate_fix_dominators (CDI_DOMINATORS, dom_bbs, false);
3798       dom_bbs.release ();
3799     }
3800
3801   return true;
3802 }
3803
3804 /* Tidy the control flow after we have removed original insn from
3805    XBB.  Return true if we have removed some blocks.  When FULL_TIDYING
3806    is true, also try to optimize control flow on non-empty blocks.  */
3807 bool
3808 tidy_control_flow (basic_block xbb, bool full_tidying)
3809 {
3810   bool changed = true;
3811   insn_t first, last;
3812
3813   /* First check whether XBB is empty.  */
3814   changed = maybe_tidy_empty_bb (xbb);
3815   if (changed || !full_tidying)
3816     return changed;
3817
3818   /* Check if there is a unnecessary jump after insn left.  */
3819   if (bb_has_removable_jump_to_p (xbb, xbb->next_bb)
3820       && INSN_SCHED_TIMES (BB_END (xbb)) == 0
3821       && !IN_CURRENT_FENCE_P (BB_END (xbb)))
3822     {
3823       if (sel_remove_insn (BB_END (xbb), false, false))
3824         return true;
3825       tidy_fallthru_edge (EDGE_SUCC (xbb, 0));
3826     }
3827
3828   first = sel_bb_head (xbb);
3829   last = sel_bb_end (xbb);
3830   if (MAY_HAVE_DEBUG_INSNS)
3831     {
3832       if (first != last && DEBUG_INSN_P (first))
3833         do
3834           first = NEXT_INSN (first);
3835         while (first != last && (DEBUG_INSN_P (first) || NOTE_P (first)));
3836
3837       if (first != last && DEBUG_INSN_P (last))
3838         do
3839           last = PREV_INSN (last);
3840         while (first != last && (DEBUG_INSN_P (last) || NOTE_P (last)));
3841     }
3842   /* Check if there is an unnecessary jump in previous basic block leading
3843      to next basic block left after removing INSN from stream.
3844      If it is so, remove that jump and redirect edge to current
3845      basic block (where there was INSN before deletion).  This way
3846      when NOP will be deleted several instructions later with its
3847      basic block we will not get a jump to next instruction, which
3848      can be harmful.  */
3849   if (first == last
3850       && !sel_bb_empty_p (xbb)
3851       && INSN_NOP_P (last)
3852       /* Flow goes fallthru from current block to the next.  */
3853       && EDGE_COUNT (xbb->succs) == 1
3854       && (EDGE_SUCC (xbb, 0)->flags & EDGE_FALLTHRU)
3855       /* When successor is an EXIT block, it may not be the next block.  */
3856       && single_succ (xbb) != EXIT_BLOCK_PTR_FOR_FN (cfun)
3857       /* And unconditional jump in previous basic block leads to
3858          next basic block of XBB and this jump can be safely removed.  */
3859       && in_current_region_p (xbb->prev_bb)
3860       && bb_has_removable_jump_to_p (xbb->prev_bb, xbb->next_bb)
3861       && INSN_SCHED_TIMES (BB_END (xbb->prev_bb)) == 0
3862       /* Also this jump is not at the scheduling boundary.  */
3863       && !IN_CURRENT_FENCE_P (BB_END (xbb->prev_bb)))
3864     {
3865       bool recompute_toporder_p;
3866       /* Clear data structures of jump - jump itself will be removed
3867          by sel_redirect_edge_and_branch.  */
3868       clear_expr (INSN_EXPR (BB_END (xbb->prev_bb)));
3869       recompute_toporder_p
3870         = sel_redirect_edge_and_branch (EDGE_SUCC (xbb->prev_bb, 0), xbb);
3871
3872       gcc_assert (EDGE_SUCC (xbb->prev_bb, 0)->flags & EDGE_FALLTHRU);
3873
3874       /* It can turn out that after removing unused jump, basic block
3875          that contained that jump, becomes empty too.  In such case
3876          remove it too.  */
3877       if (sel_bb_empty_p (xbb->prev_bb))
3878         changed = maybe_tidy_empty_bb (xbb->prev_bb);
3879       if (recompute_toporder_p)
3880         sel_recompute_toporder ();
3881     }
3882
3883 #ifdef ENABLE_CHECKING
3884   verify_backedges ();
3885   verify_dominators (CDI_DOMINATORS);
3886 #endif
3887
3888   return changed;
3889 }
3890
3891 /* Purge meaningless empty blocks in the middle of a region.  */
3892 void
3893 purge_empty_blocks (void)
3894 {
3895   int i;
3896
3897   /* Do not attempt to delete the first basic block in the region.  */
3898   for (i = 1; i < current_nr_blocks; )
3899     {
3900       basic_block b = BASIC_BLOCK_FOR_FN (cfun, BB_TO_BLOCK (i));
3901
3902       if (maybe_tidy_empty_bb (b))
3903         continue;
3904
3905       i++;
3906     }
3907 }
3908
3909 /* Rip-off INSN from the insn stream.  When ONLY_DISCONNECT is true,
3910    do not delete insn's data, because it will be later re-emitted.
3911    Return true if we have removed some blocks afterwards.  */
3912 bool
3913 sel_remove_insn (insn_t insn, bool only_disconnect, bool full_tidying)
3914 {
3915   basic_block bb = BLOCK_FOR_INSN (insn);
3916
3917   gcc_assert (INSN_IN_STREAM_P (insn));
3918
3919   if (DEBUG_INSN_P (insn) && BB_AV_SET_VALID_P (bb))
3920     {
3921       expr_t expr;
3922       av_set_iterator i;
3923
3924       /* When we remove a debug insn that is head of a BB, it remains
3925          in the AV_SET of the block, but it shouldn't.  */
3926       FOR_EACH_EXPR_1 (expr, i, &BB_AV_SET (bb))
3927         if (EXPR_INSN_RTX (expr) == insn)
3928           {
3929             av_set_iter_remove (&i);
3930             break;
3931           }
3932     }
3933
3934   if (only_disconnect)
3935     remove_insn (insn);
3936   else
3937     {
3938       delete_insn (insn);
3939       clear_expr (INSN_EXPR (insn));
3940     }
3941
3942   /* It is necessary to NULL these fields in case we are going to re-insert
3943      INSN into the insns stream, as will usually happen in the ONLY_DISCONNECT
3944      case, but also for NOPs that we will return to the nop pool.  */
3945   SET_PREV_INSN (insn) = NULL_RTX;
3946   SET_NEXT_INSN (insn) = NULL_RTX;
3947   set_block_for_insn (insn, NULL);
3948
3949   return tidy_control_flow (bb, full_tidying);
3950 }
3951
3952 /* Estimate number of the insns in BB.  */
3953 static int
3954 sel_estimate_number_of_insns (basic_block bb)
3955 {
3956   int res = 0;
3957   insn_t insn = NEXT_INSN (BB_HEAD (bb)), next_tail = NEXT_INSN (BB_END (bb));
3958
3959   for (; insn != next_tail; insn = NEXT_INSN (insn))
3960     if (NONDEBUG_INSN_P (insn))
3961       res++;
3962
3963   return res;
3964 }
3965
3966 /* We don't need separate luids for notes or labels.  */
3967 static int
3968 sel_luid_for_non_insn (rtx x)
3969 {
3970   gcc_assert (NOTE_P (x) || LABEL_P (x));
3971
3972   return -1;
3973 }
3974
3975 /*  Find the proper seqno for inserting at INSN by successors.
3976     Return -1 if no successors with positive seqno exist.  */
3977 static int
3978 get_seqno_by_succs (rtx insn)
3979 {
3980   basic_block bb = BLOCK_FOR_INSN (insn);
3981   rtx tmp = insn, end = BB_END (bb);
3982   int seqno;
3983   insn_t succ = NULL;
3984   succ_iterator si;
3985
3986   while (tmp != end)
3987     {
3988       tmp = NEXT_INSN (tmp);
3989       if (INSN_P (tmp))
3990         return INSN_SEQNO (tmp);
3991     }
3992
3993   seqno = INT_MAX;
3994
3995   FOR_EACH_SUCC_1 (succ, si, end, SUCCS_NORMAL)
3996     if (INSN_SEQNO (succ) > 0)
3997       seqno = MIN (seqno, INSN_SEQNO (succ));
3998
3999   if (seqno == INT_MAX)
4000     return -1;
4001
4002   return seqno;
4003 }
4004
4005 /* Compute seqno for INSN by its preds or succs.  Use OLD_SEQNO to compute
4006    seqno in corner cases.  */
4007 static int
4008 get_seqno_for_a_jump (insn_t insn, int old_seqno)
4009 {
4010   int seqno;
4011
4012   gcc_assert (INSN_SIMPLEJUMP_P (insn));
4013
4014   if (!sel_bb_head_p (insn))
4015     seqno = INSN_SEQNO (PREV_INSN (insn));
4016   else
4017     {
4018       basic_block bb = BLOCK_FOR_INSN (insn);
4019
4020       if (single_pred_p (bb)
4021           && !in_current_region_p (single_pred (bb)))
4022         {
4023           /* We can have preds outside a region when splitting edges
4024              for pipelining of an outer loop.  Use succ instead.
4025              There should be only one of them.  */
4026           insn_t succ = NULL;
4027           succ_iterator si;
4028           bool first = true;
4029
4030           gcc_assert (flag_sel_sched_pipelining_outer_loops
4031                       && current_loop_nest);
4032           FOR_EACH_SUCC_1 (succ, si, insn,
4033                            SUCCS_NORMAL | SUCCS_SKIP_TO_LOOP_EXITS)
4034             {
4035               gcc_assert (first);
4036               first = false;
4037             }
4038
4039           gcc_assert (succ != NULL);
4040           seqno = INSN_SEQNO (succ);
4041         }
4042       else
4043         {
4044           insn_t *preds;
4045           int n;
4046
4047           cfg_preds (BLOCK_FOR_INSN (insn), &preds, &n);
4048
4049           gcc_assert (n > 0);
4050           /* For one predecessor, use simple method.  */
4051           if (n == 1)
4052             seqno = INSN_SEQNO (preds[0]);
4053           else
4054             seqno = get_seqno_by_preds (insn);
4055
4056           free (preds);
4057         }
4058     }
4059
4060   /* We were unable to find a good seqno among preds.  */
4061   if (seqno < 0)
4062     seqno = get_seqno_by_succs (insn);
4063
4064   if (seqno < 0)
4065     {
4066       /* The only case where this could be here legally is that the only
4067          unscheduled insn was a conditional jump that got removed and turned
4068          into this unconditional one.  Initialize from the old seqno
4069          of that jump passed down to here.  */
4070       seqno = old_seqno;
4071     }
4072
4073   gcc_assert (seqno >= 0);
4074   return seqno;
4075 }
4076
4077 /*  Find the proper seqno for inserting at INSN.  Returns -1 if no predecessors
4078     with positive seqno exist.  */
4079 int
4080 get_seqno_by_preds (rtx insn)
4081 {
4082   basic_block bb = BLOCK_FOR_INSN (insn);
4083   rtx tmp = insn, head = BB_HEAD (bb);
4084   insn_t *preds;
4085   int n, i, seqno;
4086
4087   while (tmp != head)
4088     {
4089       tmp = PREV_INSN (tmp);
4090       if (INSN_P (tmp))
4091         return INSN_SEQNO (tmp);
4092     }
4093
4094   cfg_preds (bb, &preds, &n);
4095   for (i = 0, seqno = -1; i < n; i++)
4096     seqno = MAX (seqno, INSN_SEQNO (preds[i]));
4097
4098   return seqno;
4099 }
4100
4101 \f
4102
4103 /* Extend pass-scope data structures for basic blocks.  */
4104 void
4105 sel_extend_global_bb_info (void)
4106 {
4107   sel_global_bb_info.safe_grow_cleared (last_basic_block_for_fn (cfun));
4108 }
4109
4110 /* Extend region-scope data structures for basic blocks.  */
4111 static void
4112 extend_region_bb_info (void)
4113 {
4114   sel_region_bb_info.safe_grow_cleared (last_basic_block_for_fn (cfun));
4115 }
4116
4117 /* Extend all data structures to fit for all basic blocks.  */
4118 static void
4119 extend_bb_info (void)
4120 {
4121   sel_extend_global_bb_info ();
4122   extend_region_bb_info ();
4123 }
4124
4125 /* Finalize pass-scope data structures for basic blocks.  */
4126 void
4127 sel_finish_global_bb_info (void)
4128 {
4129   sel_global_bb_info.release ();
4130 }
4131
4132 /* Finalize region-scope data structures for basic blocks.  */
4133 static void
4134 finish_region_bb_info (void)
4135 {
4136   sel_region_bb_info.release ();
4137 }
4138 \f
4139
4140 /* Data for each insn in current region.  */
4141 vec<sel_insn_data_def> s_i_d = vNULL;
4142
4143 /* Extend data structures for insns from current region.  */
4144 static void
4145 extend_insn_data (void)
4146 {
4147   int reserve;
4148
4149   sched_extend_target ();
4150   sched_deps_init (false);
4151
4152   /* Extend data structures for insns from current region.  */
4153   reserve = (sched_max_luid + 1 - s_i_d.length ());
4154   if (reserve > 0 && ! s_i_d.space (reserve))
4155     {
4156       int size;
4157
4158       if (sched_max_luid / 2 > 1024)
4159         size = sched_max_luid + 1024;
4160       else
4161         size = 3 * sched_max_luid / 2;
4162
4163
4164       s_i_d.safe_grow_cleared (size);
4165     }
4166 }
4167
4168 /* Finalize data structures for insns from current region.  */
4169 static void
4170 finish_insns (void)
4171 {
4172   unsigned i;
4173
4174   /* Clear here all dependence contexts that may have left from insns that were
4175      removed during the scheduling.  */
4176   for (i = 0; i < s_i_d.length (); i++)
4177     {
4178       sel_insn_data_def *sid_entry = &s_i_d[i];
4179
4180       if (sid_entry->live)
4181         return_regset_to_pool (sid_entry->live);
4182       if (sid_entry->analyzed_deps)
4183         {
4184           BITMAP_FREE (sid_entry->analyzed_deps);
4185           BITMAP_FREE (sid_entry->found_deps);
4186           htab_delete (sid_entry->transformed_insns);
4187           free_deps (&sid_entry->deps_context);
4188         }
4189       if (EXPR_VINSN (&sid_entry->expr))
4190         {
4191           clear_expr (&sid_entry->expr);
4192
4193           /* Also, clear CANT_MOVE bit here, because we really don't want it
4194              to be passed to the next region.  */
4195           CANT_MOVE_BY_LUID (i) = 0;
4196         }
4197     }
4198
4199   s_i_d.release ();
4200 }
4201
4202 /* A proxy to pass initialization data to init_insn ().  */
4203 static sel_insn_data_def _insn_init_ssid;
4204 static sel_insn_data_t insn_init_ssid = &_insn_init_ssid;
4205
4206 /* If true create a new vinsn.  Otherwise use the one from EXPR.  */
4207 static bool insn_init_create_new_vinsn_p;
4208
4209 /* Set all necessary data for initialization of the new insn[s].  */
4210 static expr_t
4211 set_insn_init (expr_t expr, vinsn_t vi, int seqno)
4212 {
4213   expr_t x = &insn_init_ssid->expr;
4214
4215   copy_expr_onside (x, expr);
4216   if (vi != NULL)
4217     {
4218       insn_init_create_new_vinsn_p = false;
4219       change_vinsn_in_expr (x, vi);
4220     }
4221   else
4222     insn_init_create_new_vinsn_p = true;
4223
4224   insn_init_ssid->seqno = seqno;
4225   return x;
4226 }
4227
4228 /* Init data for INSN.  */
4229 static void
4230 init_insn_data (insn_t insn)
4231 {
4232   expr_t expr;
4233   sel_insn_data_t ssid = insn_init_ssid;
4234
4235   /* The fields mentioned below are special and hence are not being
4236      propagated to the new insns.  */
4237   gcc_assert (!ssid->asm_p && ssid->sched_next == NULL
4238               && !ssid->after_stall_p && ssid->sched_cycle == 0);
4239   gcc_assert (INSN_P (insn) && INSN_LUID (insn) > 0);
4240
4241   expr = INSN_EXPR (insn);
4242   copy_expr (expr, &ssid->expr);
4243   prepare_insn_expr (insn, ssid->seqno);
4244
4245   if (insn_init_create_new_vinsn_p)
4246     change_vinsn_in_expr (expr, vinsn_create (insn, init_insn_force_unique_p));
4247
4248   if (first_time_insn_init (insn))
4249     init_first_time_insn_data (insn);
4250 }
4251
4252 /* This is used to initialize spurious jumps generated by
4253    sel_redirect_edge ().  OLD_SEQNO is used for initializing seqnos
4254    in corner cases within get_seqno_for_a_jump.  */
4255 static void
4256 init_simplejump_data (insn_t insn, int old_seqno)
4257 {
4258   init_expr (INSN_EXPR (insn), vinsn_create (insn, false), 0,
4259              REG_BR_PROB_BASE, 0, 0, 0, 0, 0, 0,
4260              vNULL, true, false, false,
4261              false, true);
4262   INSN_SEQNO (insn) = get_seqno_for_a_jump (insn, old_seqno);
4263   init_first_time_insn_data (insn);
4264 }
4265
4266 /* Perform deferred initialization of insns.  This is used to process
4267    a new jump that may be created by redirect_edge.  OLD_SEQNO is used
4268    for initializing simplejumps in init_simplejump_data.  */
4269 static void
4270 sel_init_new_insn (insn_t insn, int flags, int old_seqno)
4271 {
4272   /* We create data structures for bb when the first insn is emitted in it.  */
4273   if (INSN_P (insn)
4274       && INSN_IN_STREAM_P (insn)
4275       && insn_is_the_only_one_in_bb_p (insn))
4276     {
4277       extend_bb_info ();
4278       create_initial_data_sets (BLOCK_FOR_INSN (insn));
4279     }
4280
4281   if (flags & INSN_INIT_TODO_LUID)
4282     {
4283       sched_extend_luids ();
4284       sched_init_insn_luid (insn);
4285     }
4286
4287   if (flags & INSN_INIT_TODO_SSID)
4288     {
4289       extend_insn_data ();
4290       init_insn_data (insn);
4291       clear_expr (&insn_init_ssid->expr);
4292     }
4293
4294   if (flags & INSN_INIT_TODO_SIMPLEJUMP)
4295     {
4296       extend_insn_data ();
4297       init_simplejump_data (insn, old_seqno);
4298     }
4299
4300   gcc_assert (CONTAINING_RGN (BLOCK_NUM (insn))
4301               == CONTAINING_RGN (BB_TO_BLOCK (0)));
4302 }
4303 \f
4304
4305 /* Functions to init/finish work with lv sets.  */
4306
4307 /* Init BB_LV_SET of BB from DF_LR_IN set of BB.  */
4308 static void
4309 init_lv_set (basic_block bb)
4310 {
4311   gcc_assert (!BB_LV_SET_VALID_P (bb));
4312
4313   BB_LV_SET (bb) = get_regset_from_pool ();
4314   COPY_REG_SET (BB_LV_SET (bb), DF_LR_IN (bb));
4315   BB_LV_SET_VALID_P (bb) = true;
4316 }
4317
4318 /* Copy liveness information to BB from FROM_BB.  */
4319 static void
4320 copy_lv_set_from (basic_block bb, basic_block from_bb)
4321 {
4322   gcc_assert (!BB_LV_SET_VALID_P (bb));
4323
4324   COPY_REG_SET (BB_LV_SET (bb), BB_LV_SET (from_bb));
4325   BB_LV_SET_VALID_P (bb) = true;
4326 }
4327
4328 /* Initialize lv set of all bb headers.  */
4329 void
4330 init_lv_sets (void)
4331 {
4332   basic_block bb;
4333
4334   /* Initialize of LV sets.  */
4335   FOR_EACH_BB_FN (bb, cfun)
4336     init_lv_set (bb);
4337
4338   /* Don't forget EXIT_BLOCK.  */
4339   init_lv_set (EXIT_BLOCK_PTR_FOR_FN (cfun));
4340 }
4341
4342 /* Release lv set of HEAD.  */
4343 static void
4344 free_lv_set (basic_block bb)
4345 {
4346   gcc_assert (BB_LV_SET (bb) != NULL);
4347
4348   return_regset_to_pool (BB_LV_SET (bb));
4349   BB_LV_SET (bb) = NULL;
4350   BB_LV_SET_VALID_P (bb) = false;
4351 }
4352
4353 /* Finalize lv sets of all bb headers.  */
4354 void
4355 free_lv_sets (void)
4356 {
4357   basic_block bb;
4358
4359   /* Don't forget EXIT_BLOCK.  */
4360   free_lv_set (EXIT_BLOCK_PTR_FOR_FN (cfun));
4361
4362   /* Free LV sets.  */
4363   FOR_EACH_BB_FN (bb, cfun)
4364     if (BB_LV_SET (bb))
4365       free_lv_set (bb);
4366 }
4367
4368 /* Mark AV_SET for BB as invalid, so this set will be updated the next time
4369    compute_av() processes BB.  This function is called when creating new basic
4370    blocks, as well as for blocks (either new or existing) where new jumps are
4371    created when the control flow is being updated.  */
4372 static void
4373 invalidate_av_set (basic_block bb)
4374 {
4375   BB_AV_LEVEL (bb) = -1;
4376 }
4377
4378 /* Create initial data sets for BB (they will be invalid).  */
4379 static void
4380 create_initial_data_sets (basic_block bb)
4381 {
4382   if (BB_LV_SET (bb))
4383     BB_LV_SET_VALID_P (bb) = false;
4384   else
4385     BB_LV_SET (bb) = get_regset_from_pool ();
4386   invalidate_av_set (bb);
4387 }
4388
4389 /* Free av set of BB.  */
4390 static void
4391 free_av_set (basic_block bb)
4392 {
4393   av_set_clear (&BB_AV_SET (bb));
4394   BB_AV_LEVEL (bb) = 0;
4395 }
4396
4397 /* Free data sets of BB.  */
4398 void
4399 free_data_sets (basic_block bb)
4400 {
4401   free_lv_set (bb);
4402   free_av_set (bb);
4403 }
4404
4405 /* Exchange lv sets of TO and FROM.  */
4406 static void
4407 exchange_lv_sets (basic_block to, basic_block from)
4408 {
4409   {
4410     regset to_lv_set = BB_LV_SET (to);
4411
4412     BB_LV_SET (to) = BB_LV_SET (from);
4413     BB_LV_SET (from) = to_lv_set;
4414   }
4415
4416   {
4417     bool to_lv_set_valid_p = BB_LV_SET_VALID_P (to);
4418
4419     BB_LV_SET_VALID_P (to) = BB_LV_SET_VALID_P (from);
4420     BB_LV_SET_VALID_P (from) = to_lv_set_valid_p;
4421   }
4422 }
4423
4424
4425 /* Exchange av sets of TO and FROM.  */
4426 static void
4427 exchange_av_sets (basic_block to, basic_block from)
4428 {
4429   {
4430     av_set_t to_av_set = BB_AV_SET (to);
4431
4432     BB_AV_SET (to) = BB_AV_SET (from);
4433     BB_AV_SET (from) = to_av_set;
4434   }
4435
4436   {
4437     int to_av_level = BB_AV_LEVEL (to);
4438
4439     BB_AV_LEVEL (to) = BB_AV_LEVEL (from);
4440     BB_AV_LEVEL (from) = to_av_level;
4441   }
4442 }
4443
4444 /* Exchange data sets of TO and FROM.  */
4445 void
4446 exchange_data_sets (basic_block to, basic_block from)
4447 {
4448   exchange_lv_sets (to, from);
4449   exchange_av_sets (to, from);
4450 }
4451
4452 /* Copy data sets of FROM to TO.  */
4453 void
4454 copy_data_sets (basic_block to, basic_block from)
4455 {
4456   gcc_assert (!BB_LV_SET_VALID_P (to) && !BB_AV_SET_VALID_P (to));
4457   gcc_assert (BB_AV_SET (to) == NULL);
4458
4459   BB_AV_LEVEL (to) = BB_AV_LEVEL (from);
4460   BB_LV_SET_VALID_P (to) = BB_LV_SET_VALID_P (from);
4461
4462   if (BB_AV_SET_VALID_P (from))
4463     {
4464       BB_AV_SET (to) = av_set_copy (BB_AV_SET (from));
4465     }
4466   if (BB_LV_SET_VALID_P (from))
4467     {
4468       gcc_assert (BB_LV_SET (to) != NULL);
4469       COPY_REG_SET (BB_LV_SET (to), BB_LV_SET (from));
4470     }
4471 }
4472
4473 /* Return an av set for INSN, if any.  */
4474 av_set_t
4475 get_av_set (insn_t insn)
4476 {
4477   av_set_t av_set;
4478
4479   gcc_assert (AV_SET_VALID_P (insn));
4480
4481   if (sel_bb_head_p (insn))
4482     av_set = BB_AV_SET (BLOCK_FOR_INSN (insn));
4483   else
4484     av_set = NULL;
4485
4486   return av_set;
4487 }
4488
4489 /* Implementation of AV_LEVEL () macro.  Return AV_LEVEL () of INSN.  */
4490 int
4491 get_av_level (insn_t insn)
4492 {
4493   int av_level;
4494
4495   gcc_assert (INSN_P (insn));
4496
4497   if (sel_bb_head_p (insn))
4498     av_level = BB_AV_LEVEL (BLOCK_FOR_INSN (insn));
4499   else
4500     av_level = INSN_WS_LEVEL (insn);
4501
4502   return av_level;
4503 }
4504
4505 \f
4506
4507 /* Variables to work with control-flow graph.  */
4508
4509 /* The basic block that already has been processed by the sched_data_update (),
4510    but hasn't been in sel_add_bb () yet.  */
4511 static vec<basic_block>
4512     last_added_blocks = vNULL;
4513
4514 /* A pool for allocating successor infos.  */
4515 static struct
4516 {
4517   /* A stack for saving succs_info structures.  */
4518   struct succs_info *stack;
4519
4520   /* Its size.  */
4521   int size;
4522
4523   /* Top of the stack.  */
4524   int top;
4525
4526   /* Maximal value of the top.  */
4527   int max_top;
4528 }  succs_info_pool;
4529
4530 /* Functions to work with control-flow graph.  */
4531
4532 /* Return basic block note of BB.  */
4533 insn_t
4534 sel_bb_head (basic_block bb)
4535 {
4536   insn_t head;
4537
4538   if (bb == EXIT_BLOCK_PTR_FOR_FN (cfun))
4539     {
4540       gcc_assert (exit_insn != NULL_RTX);
4541       head = exit_insn;
4542     }
4543   else
4544     {
4545       insn_t note;
4546
4547       note = bb_note (bb);
4548       head = next_nonnote_insn (note);
4549
4550       if (head && (BARRIER_P (head) || BLOCK_FOR_INSN (head) != bb))
4551         head = NULL_RTX;
4552     }
4553
4554   return head;
4555 }
4556
4557 /* Return true if INSN is a basic block header.  */
4558 bool
4559 sel_bb_head_p (insn_t insn)
4560 {
4561   return sel_bb_head (BLOCK_FOR_INSN (insn)) == insn;
4562 }
4563
4564 /* Return last insn of BB.  */
4565 insn_t
4566 sel_bb_end (basic_block bb)
4567 {
4568   if (sel_bb_empty_p (bb))
4569     return NULL_RTX;
4570
4571   gcc_assert (bb != EXIT_BLOCK_PTR_FOR_FN (cfun));
4572
4573   return BB_END (bb);
4574 }
4575
4576 /* Return true if INSN is the last insn in its basic block.  */
4577 bool
4578 sel_bb_end_p (insn_t insn)
4579 {
4580   return insn == sel_bb_end (BLOCK_FOR_INSN (insn));
4581 }
4582
4583 /* Return true if BB consist of single NOTE_INSN_BASIC_BLOCK.  */
4584 bool
4585 sel_bb_empty_p (basic_block bb)
4586 {
4587   return sel_bb_head (bb) == NULL;
4588 }
4589
4590 /* True when BB belongs to the current scheduling region.  */
4591 bool
4592 in_current_region_p (basic_block bb)
4593 {
4594   if (bb->index < NUM_FIXED_BLOCKS)
4595     return false;
4596
4597   return CONTAINING_RGN (bb->index) == CONTAINING_RGN (BB_TO_BLOCK (0));
4598 }
4599
4600 /* Return the block which is a fallthru bb of a conditional jump JUMP.  */
4601 basic_block
4602 fallthru_bb_of_jump (rtx jump)
4603 {
4604   if (!JUMP_P (jump))
4605     return NULL;
4606
4607   if (!any_condjump_p (jump))
4608     return NULL;
4609
4610   /* A basic block that ends with a conditional jump may still have one successor
4611      (and be followed by a barrier), we are not interested.  */
4612   if (single_succ_p (BLOCK_FOR_INSN (jump)))
4613     return NULL;
4614
4615   return FALLTHRU_EDGE (BLOCK_FOR_INSN (jump))->dest;
4616 }
4617
4618 /* Remove all notes from BB.  */
4619 static void
4620 init_bb (basic_block bb)
4621 {
4622   remove_notes (bb_note (bb), BB_END (bb));
4623   BB_NOTE_LIST (bb) = note_list;
4624 }
4625
4626 void
4627 sel_init_bbs (bb_vec_t bbs)
4628 {
4629   const struct sched_scan_info_def ssi =
4630     {
4631       extend_bb_info, /* extend_bb */
4632       init_bb, /* init_bb */
4633       NULL, /* extend_insn */
4634       NULL /* init_insn */
4635     };
4636
4637   sched_scan (&ssi, bbs);
4638 }
4639
4640 /* Restore notes for the whole region.  */
4641 static void
4642 sel_restore_notes (void)
4643 {
4644   int bb;
4645   insn_t insn;
4646
4647   for (bb = 0; bb < current_nr_blocks; bb++)
4648     {
4649       basic_block first, last;
4650
4651       first = EBB_FIRST_BB (bb);
4652       last = EBB_LAST_BB (bb)->next_bb;
4653
4654       do
4655         {
4656           note_list = BB_NOTE_LIST (first);
4657           restore_other_notes (NULL, first);
4658           BB_NOTE_LIST (first) = NULL_RTX;
4659
4660           FOR_BB_INSNS (first, insn)
4661             if (NONDEBUG_INSN_P (insn))
4662               reemit_notes (insn);
4663
4664           first = first->next_bb;
4665         }
4666       while (first != last);
4667     }
4668 }
4669
4670 /* Free per-bb data structures.  */
4671 void
4672 sel_finish_bbs (void)
4673 {
4674   sel_restore_notes ();
4675
4676   /* Remove current loop preheader from this loop.  */
4677   if (current_loop_nest)
4678     sel_remove_loop_preheader ();
4679
4680   finish_region_bb_info ();
4681 }
4682
4683 /* Return true if INSN has a single successor of type FLAGS.  */
4684 bool
4685 sel_insn_has_single_succ_p (insn_t insn, int flags)
4686 {
4687   insn_t succ;
4688   succ_iterator si;
4689   bool first_p = true;
4690
4691   FOR_EACH_SUCC_1 (succ, si, insn, flags)
4692     {
4693       if (first_p)
4694         first_p = false;
4695       else
4696         return false;
4697     }
4698
4699   return true;
4700 }
4701
4702 /* Allocate successor's info.  */
4703 static struct succs_info *
4704 alloc_succs_info (void)
4705 {
4706   if (succs_info_pool.top == succs_info_pool.max_top)
4707     {
4708       int i;
4709
4710       if (++succs_info_pool.max_top >= succs_info_pool.size)
4711         gcc_unreachable ();
4712
4713       i = ++succs_info_pool.top;
4714       succs_info_pool.stack[i].succs_ok.create (10);
4715       succs_info_pool.stack[i].succs_other.create (10);
4716       succs_info_pool.stack[i].probs_ok.create (10);
4717     }
4718   else
4719     succs_info_pool.top++;
4720
4721   return &succs_info_pool.stack[succs_info_pool.top];
4722 }
4723
4724 /* Free successor's info.  */
4725 void
4726 free_succs_info (struct succs_info * sinfo)
4727 {
4728   gcc_assert (succs_info_pool.top >= 0
4729               && &succs_info_pool.stack[succs_info_pool.top] == sinfo);
4730   succs_info_pool.top--;
4731
4732   /* Clear stale info.  */
4733   sinfo->succs_ok.block_remove (0, sinfo->succs_ok.length ());
4734   sinfo->succs_other.block_remove (0, sinfo->succs_other.length ());
4735   sinfo->probs_ok.block_remove (0, sinfo->probs_ok.length ());
4736   sinfo->all_prob = 0;
4737   sinfo->succs_ok_n = 0;
4738   sinfo->all_succs_n = 0;
4739 }
4740
4741 /* Compute successor info for INSN.  FLAGS are the flags passed
4742    to the FOR_EACH_SUCC_1 iterator.  */
4743 struct succs_info *
4744 compute_succs_info (insn_t insn, short flags)
4745 {
4746   succ_iterator si;
4747   insn_t succ;
4748   struct succs_info *sinfo = alloc_succs_info ();
4749
4750   /* Traverse *all* successors and decide what to do with each.  */
4751   FOR_EACH_SUCC_1 (succ, si, insn, SUCCS_ALL)
4752     {
4753       /* FIXME: this doesn't work for skipping to loop exits, as we don't
4754          perform code motion through inner loops.  */
4755       short current_flags = si.current_flags & ~SUCCS_SKIP_TO_LOOP_EXITS;
4756
4757       if (current_flags & flags)
4758         {
4759           sinfo->succs_ok.safe_push (succ);
4760           sinfo->probs_ok.safe_push (
4761                     /* FIXME: Improve calculation when skipping
4762                        inner loop to exits.  */
4763                     si.bb_end ? si.e1->probability : REG_BR_PROB_BASE);
4764           sinfo->succs_ok_n++;
4765         }
4766       else
4767         sinfo->succs_other.safe_push (succ);
4768
4769       /* Compute all_prob.  */
4770       if (!si.bb_end)
4771         sinfo->all_prob = REG_BR_PROB_BASE;
4772       else
4773         sinfo->all_prob += si.e1->probability;
4774
4775       sinfo->all_succs_n++;
4776     }
4777
4778   return sinfo;
4779 }
4780
4781 /* Return the predecessors of BB in PREDS and their number in N.
4782    Empty blocks are skipped.  SIZE is used to allocate PREDS.  */
4783 static void
4784 cfg_preds_1 (basic_block bb, insn_t **preds, int *n, int *size)
4785 {
4786   edge e;
4787   edge_iterator ei;
4788
4789   gcc_assert (BLOCK_TO_BB (bb->index) != 0);
4790
4791   FOR_EACH_EDGE (e, ei, bb->preds)
4792     {
4793       basic_block pred_bb = e->src;
4794       insn_t bb_end = BB_END (pred_bb);
4795
4796       if (!in_current_region_p (pred_bb))
4797         {
4798           gcc_assert (flag_sel_sched_pipelining_outer_loops
4799                       && current_loop_nest);
4800           continue;
4801         }
4802
4803       if (sel_bb_empty_p (pred_bb))
4804         cfg_preds_1 (pred_bb, preds, n, size);
4805       else
4806         {
4807           if (*n == *size)
4808             *preds = XRESIZEVEC (insn_t, *preds,
4809                                  (*size = 2 * *size + 1));
4810           (*preds)[(*n)++] = bb_end;
4811         }
4812     }
4813
4814   gcc_assert (*n != 0
4815               || (flag_sel_sched_pipelining_outer_loops
4816                   && current_loop_nest));
4817 }
4818
4819 /* Find all predecessors of BB and record them in PREDS and their number
4820    in N.  Empty blocks are skipped, and only normal (forward in-region)
4821    edges are processed.  */
4822 static void
4823 cfg_preds (basic_block bb, insn_t **preds, int *n)
4824 {
4825   int size = 0;
4826
4827   *preds = NULL;
4828   *n = 0;
4829   cfg_preds_1 (bb, preds, n, &size);
4830 }
4831
4832 /* Returns true if we are moving INSN through join point.  */
4833 bool
4834 sel_num_cfg_preds_gt_1 (insn_t insn)
4835 {
4836   basic_block bb;
4837
4838   if (!sel_bb_head_p (insn) || INSN_BB (insn) == 0)
4839     return false;
4840
4841   bb = BLOCK_FOR_INSN (insn);
4842
4843   while (1)
4844     {
4845       if (EDGE_COUNT (bb->preds) > 1)
4846         return true;
4847
4848       gcc_assert (EDGE_PRED (bb, 0)->dest == bb);
4849       bb = EDGE_PRED (bb, 0)->src;
4850
4851       if (!sel_bb_empty_p (bb))
4852         break;
4853     }
4854
4855   return false;
4856 }
4857
4858 /* Returns true when BB should be the end of an ebb.  Adapted from the
4859    code in sched-ebb.c.  */
4860 bool
4861 bb_ends_ebb_p (basic_block bb)
4862 {
4863   basic_block next_bb = bb_next_bb (bb);
4864   edge e;
4865
4866   if (next_bb == EXIT_BLOCK_PTR_FOR_FN (cfun)
4867       || bitmap_bit_p (forced_ebb_heads, next_bb->index)
4868       || (LABEL_P (BB_HEAD (next_bb))
4869           /* NB: LABEL_NUSES () is not maintained outside of jump.c.
4870              Work around that.  */
4871           && !single_pred_p (next_bb)))
4872     return true;
4873
4874   if (!in_current_region_p (next_bb))
4875     return true;
4876
4877   e = find_fallthru_edge (bb->succs);
4878   if (e)
4879     {
4880       gcc_assert (e->dest == next_bb);
4881       
4882       return false;
4883     }
4884
4885   return true;
4886 }
4887
4888 /* Returns true when INSN and SUCC are in the same EBB, given that SUCC is a
4889    successor of INSN.  */
4890 bool
4891 in_same_ebb_p (insn_t insn, insn_t succ)
4892 {
4893   basic_block ptr = BLOCK_FOR_INSN (insn);
4894
4895   for (;;)
4896     {
4897       if (ptr == BLOCK_FOR_INSN (succ))
4898         return true;
4899
4900       if (bb_ends_ebb_p (ptr))
4901         return false;
4902
4903       ptr = bb_next_bb (ptr);
4904     }
4905
4906   gcc_unreachable ();
4907   return false;
4908 }
4909
4910 /* Recomputes the reverse topological order for the function and
4911    saves it in REV_TOP_ORDER_INDEX.  REV_TOP_ORDER_INDEX_LEN is also
4912    modified appropriately.  */
4913 static void
4914 recompute_rev_top_order (void)
4915 {
4916   int *postorder;
4917   int n_blocks, i;
4918
4919   if (!rev_top_order_index
4920       || rev_top_order_index_len < last_basic_block_for_fn (cfun))
4921     {
4922       rev_top_order_index_len = last_basic_block_for_fn (cfun);
4923       rev_top_order_index = XRESIZEVEC (int, rev_top_order_index,
4924                                         rev_top_order_index_len);
4925     }
4926
4927   postorder = XNEWVEC (int, n_basic_blocks_for_fn (cfun));
4928
4929   n_blocks = post_order_compute (postorder, true, false);
4930   gcc_assert (n_basic_blocks_for_fn (cfun) == n_blocks);
4931
4932   /* Build reverse function: for each basic block with BB->INDEX == K
4933      rev_top_order_index[K] is it's reverse topological sort number.  */
4934   for (i = 0; i < n_blocks; i++)
4935     {
4936       gcc_assert (postorder[i] < rev_top_order_index_len);
4937       rev_top_order_index[postorder[i]] = i;
4938     }
4939
4940   free (postorder);
4941 }
4942
4943 /* Clear all flags from insns in BB that could spoil its rescheduling.  */
4944 void
4945 clear_outdated_rtx_info (basic_block bb)
4946 {
4947   rtx insn;
4948
4949   FOR_BB_INSNS (bb, insn)
4950     if (INSN_P (insn))
4951       {
4952         SCHED_GROUP_P (insn) = 0;
4953         INSN_AFTER_STALL_P (insn) = 0;
4954         INSN_SCHED_TIMES (insn) = 0;
4955         EXPR_PRIORITY_ADJ (INSN_EXPR (insn)) = 0;
4956
4957         /* We cannot use the changed caches, as previously we could ignore
4958            the LHS dependence due to enabled renaming and transform
4959            the expression, and currently we'll be unable to do this.  */
4960         htab_empty (INSN_TRANSFORMED_INSNS (insn));
4961       }
4962 }
4963
4964 /* Add BB_NOTE to the pool of available basic block notes.  */
4965 static void
4966 return_bb_to_pool (basic_block bb)
4967 {
4968   rtx note = bb_note (bb);
4969
4970   gcc_assert (NOTE_BASIC_BLOCK (note) == bb
4971               && bb->aux == NULL);
4972
4973   /* It turns out that current cfg infrastructure does not support
4974      reuse of basic blocks.  Don't bother for now.  */
4975   /*bb_note_pool.safe_push (note);*/
4976 }
4977
4978 /* Get a bb_note from pool or return NULL_RTX if pool is empty.  */
4979 static rtx
4980 get_bb_note_from_pool (void)
4981 {
4982   if (bb_note_pool.is_empty ())
4983     return NULL_RTX;
4984   else
4985     {
4986       rtx note = bb_note_pool.pop ();
4987
4988       SET_PREV_INSN (note) = NULL_RTX;
4989       SET_NEXT_INSN (note) = NULL_RTX;
4990
4991       return note;
4992     }
4993 }
4994
4995 /* Free bb_note_pool.  */
4996 void
4997 free_bb_note_pool (void)
4998 {
4999   bb_note_pool.release ();
5000 }
5001
5002 /* Setup scheduler pool and successor structure.  */
5003 void
5004 alloc_sched_pools (void)
5005 {
5006   int succs_size;
5007
5008   succs_size = MAX_WS + 1;
5009   succs_info_pool.stack = XCNEWVEC (struct succs_info, succs_size);
5010   succs_info_pool.size = succs_size;
5011   succs_info_pool.top = -1;
5012   succs_info_pool.max_top = -1;
5013
5014   sched_lists_pool = create_alloc_pool ("sel-sched-lists",
5015                                         sizeof (struct _list_node), 500);
5016 }
5017
5018 /* Free the pools.  */
5019 void
5020 free_sched_pools (void)
5021 {
5022   int i;
5023
5024   free_alloc_pool (sched_lists_pool);
5025   gcc_assert (succs_info_pool.top == -1);
5026   for (i = 0; i <= succs_info_pool.max_top; i++)
5027     {
5028       succs_info_pool.stack[i].succs_ok.release ();
5029       succs_info_pool.stack[i].succs_other.release ();
5030       succs_info_pool.stack[i].probs_ok.release ();
5031     }
5032   free (succs_info_pool.stack);
5033 }
5034 \f
5035
5036 /* Returns a position in RGN where BB can be inserted retaining
5037    topological order.  */
5038 static int
5039 find_place_to_insert_bb (basic_block bb, int rgn)
5040 {
5041   bool has_preds_outside_rgn = false;
5042   edge e;
5043   edge_iterator ei;
5044
5045   /* Find whether we have preds outside the region.  */
5046   FOR_EACH_EDGE (e, ei, bb->preds)
5047     if (!in_current_region_p (e->src))
5048       {
5049         has_preds_outside_rgn = true;
5050         break;
5051       }
5052
5053   /* Recompute the top order -- needed when we have > 1 pred
5054      and in case we don't have preds outside.  */
5055   if (flag_sel_sched_pipelining_outer_loops
5056       && (has_preds_outside_rgn || EDGE_COUNT (bb->preds) > 1))
5057     {
5058       int i, bbi = bb->index, cur_bbi;
5059
5060       recompute_rev_top_order ();
5061       for (i = RGN_NR_BLOCKS (rgn) - 1; i >= 0; i--)
5062         {
5063           cur_bbi = BB_TO_BLOCK (i);
5064           if (rev_top_order_index[bbi]
5065               < rev_top_order_index[cur_bbi])
5066             break;
5067         }
5068
5069       /* We skipped the right block, so we increase i.  We accommodate
5070          it for increasing by step later, so we decrease i.  */
5071       return (i + 1) - 1;
5072     }
5073   else if (has_preds_outside_rgn)
5074     {
5075       /* This is the case when we generate an extra empty block
5076          to serve as region head during pipelining.  */
5077       e = EDGE_SUCC (bb, 0);
5078       gcc_assert (EDGE_COUNT (bb->succs) == 1
5079                   && in_current_region_p (EDGE_SUCC (bb, 0)->dest)
5080                   && (BLOCK_TO_BB (e->dest->index) == 0));
5081       return -1;
5082     }
5083
5084   /* We don't have preds outside the region.  We should have
5085      the only pred, because the multiple preds case comes from
5086      the pipelining of outer loops, and that is handled above.
5087      Just take the bbi of this single pred.  */
5088   if (EDGE_COUNT (bb->succs) > 0)
5089     {
5090       int pred_bbi;
5091
5092       gcc_assert (EDGE_COUNT (bb->preds) == 1);
5093
5094       pred_bbi = EDGE_PRED (bb, 0)->src->index;
5095       return BLOCK_TO_BB (pred_bbi);
5096     }
5097   else
5098     /* BB has no successors.  It is safe to put it in the end.  */
5099     return current_nr_blocks - 1;
5100 }
5101
5102 /* Deletes an empty basic block freeing its data.  */
5103 static void
5104 delete_and_free_basic_block (basic_block bb)
5105 {
5106   gcc_assert (sel_bb_empty_p (bb));
5107
5108   if (BB_LV_SET (bb))
5109     free_lv_set (bb);
5110
5111   bitmap_clear_bit (blocks_to_reschedule, bb->index);
5112
5113   /* Can't assert av_set properties because we use sel_aremove_bb
5114      when removing loop preheader from the region.  At the point of
5115      removing the preheader we already have deallocated sel_region_bb_info.  */
5116   gcc_assert (BB_LV_SET (bb) == NULL
5117               && !BB_LV_SET_VALID_P (bb)
5118               && BB_AV_LEVEL (bb) == 0
5119               && BB_AV_SET (bb) == NULL);
5120
5121   delete_basic_block (bb);
5122 }
5123
5124 /* Add BB to the current region and update the region data.  */
5125 static void
5126 add_block_to_current_region (basic_block bb)
5127 {
5128   int i, pos, bbi = -2, rgn;
5129
5130   rgn = CONTAINING_RGN (BB_TO_BLOCK (0));
5131   bbi = find_place_to_insert_bb (bb, rgn);
5132   bbi += 1;
5133   pos = RGN_BLOCKS (rgn) + bbi;
5134
5135   gcc_assert (RGN_HAS_REAL_EBB (rgn) == 0
5136               && ebb_head[bbi] == pos);
5137
5138   /* Make a place for the new block.  */
5139   extend_regions ();
5140
5141   for (i = RGN_BLOCKS (rgn + 1) - 1; i >= pos; i--)
5142     BLOCK_TO_BB (rgn_bb_table[i])++;
5143
5144   memmove (rgn_bb_table + pos + 1,
5145            rgn_bb_table + pos,
5146            (RGN_BLOCKS (nr_regions) - pos) * sizeof (*rgn_bb_table));
5147
5148   /* Initialize data for BB.  */
5149   rgn_bb_table[pos] = bb->index;
5150   BLOCK_TO_BB (bb->index) = bbi;
5151   CONTAINING_RGN (bb->index) = rgn;
5152
5153   RGN_NR_BLOCKS (rgn)++;
5154
5155   for (i = rgn + 1; i <= nr_regions; i++)
5156     RGN_BLOCKS (i)++;
5157 }
5158
5159 /* Remove BB from the current region and update the region data.  */
5160 static void
5161 remove_bb_from_region (basic_block bb)
5162 {
5163   int i, pos, bbi = -2, rgn;
5164
5165   rgn = CONTAINING_RGN (BB_TO_BLOCK (0));
5166   bbi = BLOCK_TO_BB (bb->index);
5167   pos = RGN_BLOCKS (rgn) + bbi;
5168
5169   gcc_assert (RGN_HAS_REAL_EBB (rgn) == 0
5170               && ebb_head[bbi] == pos);
5171
5172   for (i = RGN_BLOCKS (rgn + 1) - 1; i >= pos; i--)
5173     BLOCK_TO_BB (rgn_bb_table[i])--;
5174
5175   memmove (rgn_bb_table + pos,
5176            rgn_bb_table + pos + 1,
5177            (RGN_BLOCKS (nr_regions) - pos) * sizeof (*rgn_bb_table));
5178
5179   RGN_NR_BLOCKS (rgn)--;
5180   for (i = rgn + 1; i <= nr_regions; i++)
5181     RGN_BLOCKS (i)--;
5182 }
5183
5184 /* Add BB to the current region  and update all data.  If BB is NULL, add all
5185    blocks from last_added_blocks vector.  */
5186 static void
5187 sel_add_bb (basic_block bb)
5188 {
5189   /* Extend luids so that new notes will receive zero luids.  */
5190   sched_extend_luids ();
5191   sched_init_bbs ();
5192   sel_init_bbs (last_added_blocks);
5193
5194   /* When bb is passed explicitly, the vector should contain
5195      the only element that equals to bb; otherwise, the vector
5196      should not be NULL.  */
5197   gcc_assert (last_added_blocks.exists ());
5198
5199   if (bb != NULL)
5200     {
5201       gcc_assert (last_added_blocks.length () == 1
5202                   && last_added_blocks[0] == bb);
5203       add_block_to_current_region (bb);
5204
5205       /* We associate creating/deleting data sets with the first insn
5206          appearing / disappearing in the bb.  */
5207       if (!sel_bb_empty_p (bb) && BB_LV_SET (bb) == NULL)
5208         create_initial_data_sets (bb);
5209
5210       last_added_blocks.release ();
5211     }
5212   else
5213     /* BB is NULL - process LAST_ADDED_BLOCKS instead.  */
5214     {
5215       int i;
5216       basic_block temp_bb = NULL;
5217
5218       for (i = 0;
5219            last_added_blocks.iterate (i, &bb); i++)
5220         {
5221           add_block_to_current_region (bb);
5222           temp_bb = bb;
5223         }
5224
5225       /* We need to fetch at least one bb so we know the region
5226          to update.  */
5227       gcc_assert (temp_bb != NULL);
5228       bb = temp_bb;
5229
5230       last_added_blocks.release ();
5231     }
5232
5233   rgn_setup_region (CONTAINING_RGN (bb->index));
5234 }
5235
5236 /* Remove BB from the current region and update all data.
5237    If REMOVE_FROM_CFG_PBB is true, also remove the block cfom cfg.  */
5238 static void
5239 sel_remove_bb (basic_block bb, bool remove_from_cfg_p)
5240 {
5241   unsigned idx = bb->index;
5242
5243   gcc_assert (bb != NULL && BB_NOTE_LIST (bb) == NULL_RTX);
5244
5245   remove_bb_from_region (bb);
5246   return_bb_to_pool (bb);
5247   bitmap_clear_bit (blocks_to_reschedule, idx);
5248
5249   if (remove_from_cfg_p)
5250     {
5251       basic_block succ = single_succ (bb);
5252       delete_and_free_basic_block (bb);
5253       set_immediate_dominator (CDI_DOMINATORS, succ,
5254                                recompute_dominator (CDI_DOMINATORS, succ));
5255     }
5256
5257   rgn_setup_region (CONTAINING_RGN (idx));
5258 }
5259
5260 /* Concatenate info of EMPTY_BB to info of MERGE_BB.  */
5261 static void
5262 move_bb_info (basic_block merge_bb, basic_block empty_bb)
5263 {
5264   if (in_current_region_p (merge_bb))
5265     concat_note_lists (BB_NOTE_LIST (empty_bb),
5266                        &BB_NOTE_LIST (merge_bb));
5267   BB_NOTE_LIST (empty_bb) = NULL_RTX;
5268
5269 }
5270
5271 /* Remove EMPTY_BB.  If REMOVE_FROM_CFG_P is false, remove EMPTY_BB from
5272    region, but keep it in CFG.  */
5273 static void
5274 remove_empty_bb (basic_block empty_bb, bool remove_from_cfg_p)
5275 {
5276   /* The block should contain just a note or a label.
5277      We try to check whether it is unused below.  */
5278   gcc_assert (BB_HEAD (empty_bb) == BB_END (empty_bb)
5279               || LABEL_P (BB_HEAD (empty_bb)));
5280
5281   /* If basic block has predecessors or successors, redirect them.  */
5282   if (remove_from_cfg_p
5283       && (EDGE_COUNT (empty_bb->preds) > 0
5284           || EDGE_COUNT (empty_bb->succs) > 0))
5285     {
5286       basic_block pred;
5287       basic_block succ;
5288
5289       /* We need to init PRED and SUCC before redirecting edges.  */
5290       if (EDGE_COUNT (empty_bb->preds) > 0)
5291         {
5292           edge e;
5293
5294           gcc_assert (EDGE_COUNT (empty_bb->preds) == 1);
5295
5296           e = EDGE_PRED (empty_bb, 0);
5297           gcc_assert (e->src == empty_bb->prev_bb
5298                       && (e->flags & EDGE_FALLTHRU));
5299
5300           pred = empty_bb->prev_bb;
5301         }
5302       else
5303         pred = NULL;
5304
5305       if (EDGE_COUNT (empty_bb->succs) > 0)
5306         {
5307           /* We do not check fallthruness here as above, because
5308              after removing a jump the edge may actually be not fallthru.  */
5309           gcc_assert (EDGE_COUNT (empty_bb->succs) == 1);
5310           succ = EDGE_SUCC (empty_bb, 0)->dest;
5311         }
5312       else
5313         succ = NULL;
5314
5315       if (EDGE_COUNT (empty_bb->preds) > 0 && succ != NULL)
5316         {
5317           edge e = EDGE_PRED (empty_bb, 0);
5318
5319           if (e->flags & EDGE_FALLTHRU)
5320             redirect_edge_succ_nodup (e, succ);
5321           else
5322             sel_redirect_edge_and_branch (EDGE_PRED (empty_bb, 0), succ);
5323         }
5324
5325       if (EDGE_COUNT (empty_bb->succs) > 0 && pred != NULL)
5326         {
5327           edge e = EDGE_SUCC (empty_bb, 0);
5328
5329           if (find_edge (pred, e->dest) == NULL)
5330             redirect_edge_pred (e, pred);
5331         }
5332     }
5333
5334   /* Finish removing.  */
5335   sel_remove_bb (empty_bb, remove_from_cfg_p);
5336 }
5337
5338 /* An implementation of create_basic_block hook, which additionally updates
5339    per-bb data structures.  */
5340 static basic_block
5341 sel_create_basic_block (void *headp, void *endp, basic_block after)
5342 {
5343   basic_block new_bb;
5344   insn_t new_bb_note;
5345
5346   gcc_assert (flag_sel_sched_pipelining_outer_loops
5347               || !last_added_blocks.exists ());
5348
5349   new_bb_note = get_bb_note_from_pool ();
5350
5351   if (new_bb_note == NULL_RTX)
5352     new_bb = orig_cfg_hooks.create_basic_block (headp, endp, after);
5353   else
5354     {
5355       new_bb = create_basic_block_structure ((rtx) headp, (rtx) endp,
5356                                              new_bb_note, after);
5357       new_bb->aux = NULL;
5358     }
5359
5360   last_added_blocks.safe_push (new_bb);
5361
5362   return new_bb;
5363 }
5364
5365 /* Implement sched_init_only_bb ().  */
5366 static void
5367 sel_init_only_bb (basic_block bb, basic_block after)
5368 {
5369   gcc_assert (after == NULL);
5370
5371   extend_regions ();
5372   rgn_make_new_region_out_of_new_block (bb);
5373 }
5374
5375 /* Update the latch when we've splitted or merged it from FROM block to TO.
5376    This should be checked for all outer loops, too.  */
5377 static void
5378 change_loops_latches (basic_block from, basic_block to)
5379 {
5380   gcc_assert (from != to);
5381
5382   if (current_loop_nest)
5383     {
5384       struct loop *loop;
5385
5386       for (loop = current_loop_nest; loop; loop = loop_outer (loop))
5387         if (considered_for_pipelining_p (loop) && loop->latch == from)
5388           {
5389             gcc_assert (loop == current_loop_nest);
5390             loop->latch = to;
5391             gcc_assert (loop_latch_edge (loop));
5392           }
5393     }
5394 }
5395
5396 /* Splits BB on two basic blocks, adding it to the region and extending
5397    per-bb data structures.  Returns the newly created bb.  */
5398 static basic_block
5399 sel_split_block (basic_block bb, rtx after)
5400 {
5401   basic_block new_bb;
5402   insn_t insn;
5403
5404   new_bb = sched_split_block_1 (bb, after);
5405   sel_add_bb (new_bb);
5406
5407   /* This should be called after sel_add_bb, because this uses
5408      CONTAINING_RGN for the new block, which is not yet initialized.
5409      FIXME: this function may be a no-op now.  */
5410   change_loops_latches (bb, new_bb);
5411
5412   /* Update ORIG_BB_INDEX for insns moved into the new block.  */
5413   FOR_BB_INSNS (new_bb, insn)
5414    if (INSN_P (insn))
5415      EXPR_ORIG_BB_INDEX (INSN_EXPR (insn)) = new_bb->index;
5416
5417   if (sel_bb_empty_p (bb))
5418     {
5419       gcc_assert (!sel_bb_empty_p (new_bb));
5420
5421       /* NEW_BB has data sets that need to be updated and BB holds
5422          data sets that should be removed.  Exchange these data sets
5423          so that we won't lose BB's valid data sets.  */
5424       exchange_data_sets (new_bb, bb);
5425       free_data_sets (bb);
5426     }
5427
5428   if (!sel_bb_empty_p (new_bb)
5429       && bitmap_bit_p (blocks_to_reschedule, bb->index))
5430     bitmap_set_bit (blocks_to_reschedule, new_bb->index);
5431
5432   return new_bb;
5433 }
5434
5435 /* If BB ends with a jump insn whose ID is bigger then PREV_MAX_UID, return it.
5436    Otherwise returns NULL.  */
5437 static rtx
5438 check_for_new_jump (basic_block bb, int prev_max_uid)
5439 {
5440   rtx end;
5441
5442   end = sel_bb_end (bb);
5443   if (end && INSN_UID (end) >= prev_max_uid)
5444     return end;
5445   return NULL;
5446 }
5447
5448 /* Look for a new jump either in FROM_BB block or in newly created JUMP_BB block.
5449    New means having UID at least equal to PREV_MAX_UID.  */
5450 static rtx
5451 find_new_jump (basic_block from, basic_block jump_bb, int prev_max_uid)
5452 {
5453   rtx jump;
5454
5455   /* Return immediately if no new insns were emitted.  */
5456   if (get_max_uid () == prev_max_uid)
5457     return NULL;
5458
5459   /* Now check both blocks for new jumps.  It will ever be only one.  */
5460   if ((jump = check_for_new_jump (from, prev_max_uid)))
5461     return jump;
5462
5463   if (jump_bb != NULL
5464       && (jump = check_for_new_jump (jump_bb, prev_max_uid)))
5465     return jump;
5466   return NULL;
5467 }
5468
5469 /* Splits E and adds the newly created basic block to the current region.
5470    Returns this basic block.  */
5471 basic_block
5472 sel_split_edge (edge e)
5473 {
5474   basic_block new_bb, src, other_bb = NULL;
5475   int prev_max_uid;
5476   rtx jump;
5477
5478   src = e->src;
5479   prev_max_uid = get_max_uid ();
5480   new_bb = split_edge (e);
5481
5482   if (flag_sel_sched_pipelining_outer_loops
5483       && current_loop_nest)
5484     {
5485       int i;
5486       basic_block bb;
5487
5488       /* Some of the basic blocks might not have been added to the loop.
5489          Add them here, until this is fixed in force_fallthru.  */
5490       for (i = 0;
5491            last_added_blocks.iterate (i, &bb); i++)
5492         if (!bb->loop_father)
5493           {
5494             add_bb_to_loop (bb, e->dest->loop_father);
5495
5496             gcc_assert (!other_bb && (new_bb->index != bb->index));
5497             other_bb = bb;
5498           }
5499     }
5500
5501   /* Add all last_added_blocks to the region.  */
5502   sel_add_bb (NULL);
5503
5504   jump = find_new_jump (src, new_bb, prev_max_uid);
5505   if (jump)
5506     sel_init_new_insn (jump, INSN_INIT_TODO_LUID | INSN_INIT_TODO_SIMPLEJUMP);
5507
5508   /* Put the correct lv set on this block.  */
5509   if (other_bb && !sel_bb_empty_p (other_bb))
5510     compute_live (sel_bb_head (other_bb));
5511
5512   return new_bb;
5513 }
5514
5515 /* Implement sched_create_empty_bb ().  */
5516 static basic_block
5517 sel_create_empty_bb (basic_block after)
5518 {
5519   basic_block new_bb;
5520
5521   new_bb = sched_create_empty_bb_1 (after);
5522
5523   /* We'll explicitly initialize NEW_BB via sel_init_only_bb () a bit
5524      later.  */
5525   gcc_assert (last_added_blocks.length () == 1
5526               && last_added_blocks[0] == new_bb);
5527
5528   last_added_blocks.release ();
5529   return new_bb;
5530 }
5531
5532 /* Implement sched_create_recovery_block.  ORIG_INSN is where block
5533    will be splitted to insert a check.  */
5534 basic_block
5535 sel_create_recovery_block (insn_t orig_insn)
5536 {
5537   basic_block first_bb, second_bb, recovery_block;
5538   basic_block before_recovery = NULL;
5539   rtx jump;
5540
5541   first_bb = BLOCK_FOR_INSN (orig_insn);
5542   if (sel_bb_end_p (orig_insn))
5543     {
5544       /* Avoid introducing an empty block while splitting.  */
5545       gcc_assert (single_succ_p (first_bb));
5546       second_bb = single_succ (first_bb);
5547     }
5548   else
5549     second_bb = sched_split_block (first_bb, orig_insn);
5550
5551   recovery_block = sched_create_recovery_block (&before_recovery);
5552   if (before_recovery)
5553     copy_lv_set_from (before_recovery, EXIT_BLOCK_PTR_FOR_FN (cfun));
5554
5555   gcc_assert (sel_bb_empty_p (recovery_block));
5556   sched_create_recovery_edges (first_bb, recovery_block, second_bb);
5557   if (current_loops != NULL)
5558     add_bb_to_loop (recovery_block, first_bb->loop_father);
5559
5560   sel_add_bb (recovery_block);
5561
5562   jump = BB_END (recovery_block);
5563   gcc_assert (sel_bb_head (recovery_block) == jump);
5564   sel_init_new_insn (jump, INSN_INIT_TODO_LUID | INSN_INIT_TODO_SIMPLEJUMP);
5565
5566   return recovery_block;
5567 }
5568
5569 /* Merge basic block B into basic block A.  */
5570 static void
5571 sel_merge_blocks (basic_block a, basic_block b)
5572 {
5573   gcc_assert (sel_bb_empty_p (b)
5574               && EDGE_COUNT (b->preds) == 1
5575               && EDGE_PRED (b, 0)->src == b->prev_bb);
5576
5577   move_bb_info (b->prev_bb, b);
5578   remove_empty_bb (b, false);
5579   merge_blocks (a, b);
5580   change_loops_latches (b, a);
5581 }
5582
5583 /* A wrapper for redirect_edge_and_branch_force, which also initializes
5584    data structures for possibly created bb and insns.  */
5585 void
5586 sel_redirect_edge_and_branch_force (edge e, basic_block to)
5587 {
5588   basic_block jump_bb, src, orig_dest = e->dest;
5589   int prev_max_uid;
5590   rtx jump;
5591   int old_seqno = -1;
5592
5593   /* This function is now used only for bookkeeping code creation, where
5594      we'll never get the single pred of orig_dest block and thus will not
5595      hit unreachable blocks when updating dominator info.  */
5596   gcc_assert (!sel_bb_empty_p (e->src)
5597               && !single_pred_p (orig_dest));
5598   src = e->src;
5599   prev_max_uid = get_max_uid ();
5600   /* Compute and pass old_seqno down to sel_init_new_insn only for the case
5601      when the conditional jump being redirected may become unconditional.  */
5602   if (any_condjump_p (BB_END (src))
5603       && INSN_SEQNO (BB_END (src)) >= 0)
5604     old_seqno = INSN_SEQNO (BB_END (src));
5605
5606   jump_bb = redirect_edge_and_branch_force (e, to);
5607   if (jump_bb != NULL)
5608     sel_add_bb (jump_bb);
5609
5610   /* This function could not be used to spoil the loop structure by now,
5611      thus we don't care to update anything.  But check it to be sure.  */
5612   if (current_loop_nest
5613       && pipelining_p)
5614     gcc_assert (loop_latch_edge (current_loop_nest));
5615
5616   jump = find_new_jump (src, jump_bb, prev_max_uid);
5617   if (jump)
5618     sel_init_new_insn (jump, INSN_INIT_TODO_LUID | INSN_INIT_TODO_SIMPLEJUMP,
5619                        old_seqno);
5620   set_immediate_dominator (CDI_DOMINATORS, to,
5621                            recompute_dominator (CDI_DOMINATORS, to));
5622   set_immediate_dominator (CDI_DOMINATORS, orig_dest,
5623                            recompute_dominator (CDI_DOMINATORS, orig_dest));
5624 }
5625
5626 /* A wrapper for redirect_edge_and_branch.  Return TRUE if blocks connected by
5627    redirected edge are in reverse topological order.  */
5628 bool
5629 sel_redirect_edge_and_branch (edge e, basic_block to)
5630 {
5631   bool latch_edge_p;
5632   basic_block src, orig_dest = e->dest;
5633   int prev_max_uid;
5634   rtx jump;
5635   edge redirected;
5636   bool recompute_toporder_p = false;
5637   bool maybe_unreachable = single_pred_p (orig_dest);
5638   int old_seqno = -1;
5639
5640   latch_edge_p = (pipelining_p
5641                   && current_loop_nest
5642                   && e == loop_latch_edge (current_loop_nest));
5643
5644   src = e->src;
5645   prev_max_uid = get_max_uid ();
5646
5647   /* Compute and pass old_seqno down to sel_init_new_insn only for the case
5648      when the conditional jump being redirected may become unconditional.  */
5649   if (any_condjump_p (BB_END (src))
5650       && INSN_SEQNO (BB_END (src)) >= 0)
5651     old_seqno = INSN_SEQNO (BB_END (src));
5652
5653   redirected = redirect_edge_and_branch (e, to);
5654
5655   gcc_assert (redirected && !last_added_blocks.exists ());
5656
5657   /* When we've redirected a latch edge, update the header.  */
5658   if (latch_edge_p)
5659     {
5660       current_loop_nest->header = to;
5661       gcc_assert (loop_latch_edge (current_loop_nest));
5662     }
5663
5664   /* In rare situations, the topological relation between the blocks connected
5665      by the redirected edge can change (see PR42245 for an example).  Update
5666      block_to_bb/bb_to_block.  */
5667   if (CONTAINING_RGN (e->src->index) == CONTAINING_RGN (to->index)
5668       && BLOCK_TO_BB (e->src->index) > BLOCK_TO_BB (to->index))
5669     recompute_toporder_p = true;
5670
5671   jump = find_new_jump (src, NULL, prev_max_uid);
5672   if (jump)
5673     sel_init_new_insn (jump, INSN_INIT_TODO_LUID | INSN_INIT_TODO_SIMPLEJUMP, old_seqno);
5674
5675   /* Only update dominator info when we don't have unreachable blocks.
5676      Otherwise we'll update in maybe_tidy_empty_bb.  */
5677   if (!maybe_unreachable)
5678     {
5679       set_immediate_dominator (CDI_DOMINATORS, to,
5680                                recompute_dominator (CDI_DOMINATORS, to));
5681       set_immediate_dominator (CDI_DOMINATORS, orig_dest,
5682                                recompute_dominator (CDI_DOMINATORS, orig_dest));
5683     }
5684   return recompute_toporder_p;
5685 }
5686
5687 /* This variable holds the cfg hooks used by the selective scheduler.  */
5688 static struct cfg_hooks sel_cfg_hooks;
5689
5690 /* Register sel-sched cfg hooks.  */
5691 void
5692 sel_register_cfg_hooks (void)
5693 {
5694   sched_split_block = sel_split_block;
5695
5696   orig_cfg_hooks = get_cfg_hooks ();
5697   sel_cfg_hooks = orig_cfg_hooks;
5698
5699   sel_cfg_hooks.create_basic_block = sel_create_basic_block;
5700
5701   set_cfg_hooks (sel_cfg_hooks);
5702
5703   sched_init_only_bb = sel_init_only_bb;
5704   sched_split_block = sel_split_block;
5705   sched_create_empty_bb = sel_create_empty_bb;
5706 }
5707
5708 /* Unregister sel-sched cfg hooks.  */
5709 void
5710 sel_unregister_cfg_hooks (void)
5711 {
5712   sched_create_empty_bb = NULL;
5713   sched_split_block = NULL;
5714   sched_init_only_bb = NULL;
5715
5716   set_cfg_hooks (orig_cfg_hooks);
5717 }
5718 \f
5719
5720 /* Emit an insn rtx based on PATTERN.  If a jump insn is wanted,
5721    LABEL is where this jump should be directed.  */
5722 rtx
5723 create_insn_rtx_from_pattern (rtx pattern, rtx label)
5724 {
5725   rtx insn_rtx;
5726
5727   gcc_assert (!INSN_P (pattern));
5728
5729   start_sequence ();
5730
5731   if (label == NULL_RTX)
5732     insn_rtx = emit_insn (pattern);
5733   else if (DEBUG_INSN_P (label))
5734     insn_rtx = emit_debug_insn (pattern);
5735   else
5736     {
5737       insn_rtx = emit_jump_insn (pattern);
5738       JUMP_LABEL (insn_rtx) = label;
5739       ++LABEL_NUSES (label);
5740     }
5741
5742   end_sequence ();
5743
5744   sched_extend_luids ();
5745   sched_extend_target ();
5746   sched_deps_init (false);
5747
5748   /* Initialize INSN_CODE now.  */
5749   recog_memoized (insn_rtx);
5750   return insn_rtx;
5751 }
5752
5753 /* Create a new vinsn for INSN_RTX.  FORCE_UNIQUE_P is true when the vinsn
5754    must not be clonable.  */
5755 vinsn_t
5756 create_vinsn_from_insn_rtx (rtx insn_rtx, bool force_unique_p)
5757 {
5758   gcc_assert (INSN_P (insn_rtx) && !INSN_IN_STREAM_P (insn_rtx));
5759
5760   /* If VINSN_TYPE is not USE, retain its uniqueness.  */
5761   return vinsn_create (insn_rtx, force_unique_p);
5762 }
5763
5764 /* Create a copy of INSN_RTX.  */
5765 rtx
5766 create_copy_of_insn_rtx (rtx insn_rtx)
5767 {
5768   rtx res, link;
5769
5770   if (DEBUG_INSN_P (insn_rtx))
5771     return create_insn_rtx_from_pattern (copy_rtx (PATTERN (insn_rtx)),
5772                                          insn_rtx);
5773
5774   gcc_assert (NONJUMP_INSN_P (insn_rtx));
5775
5776   res = create_insn_rtx_from_pattern (copy_rtx (PATTERN (insn_rtx)),
5777                                       NULL_RTX);
5778
5779   /* Copy all REG_NOTES except REG_EQUAL/REG_EQUIV and REG_LABEL_OPERAND
5780      since mark_jump_label will make them.  REG_LABEL_TARGETs are created
5781      there too, but are supposed to be sticky, so we copy them.  */
5782   for (link = REG_NOTES (insn_rtx); link; link = XEXP (link, 1))
5783     if (REG_NOTE_KIND (link) != REG_LABEL_OPERAND
5784         && REG_NOTE_KIND (link) != REG_EQUAL
5785         && REG_NOTE_KIND (link) != REG_EQUIV)
5786       {
5787         if (GET_CODE (link) == EXPR_LIST)
5788           add_reg_note (res, REG_NOTE_KIND (link),
5789                         copy_insn_1 (XEXP (link, 0)));
5790         else
5791           add_reg_note (res, REG_NOTE_KIND (link), XEXP (link, 0));
5792       }
5793
5794   return res;
5795 }
5796
5797 /* Change vinsn field of EXPR to hold NEW_VINSN.  */
5798 void
5799 change_vinsn_in_expr (expr_t expr, vinsn_t new_vinsn)
5800 {
5801   vinsn_detach (EXPR_VINSN (expr));
5802
5803   EXPR_VINSN (expr) = new_vinsn;
5804   vinsn_attach (new_vinsn);
5805 }
5806
5807 /* Helpers for global init.  */
5808 /* This structure is used to be able to call existing bundling mechanism
5809    and calculate insn priorities.  */
5810 static struct haifa_sched_info sched_sel_haifa_sched_info =
5811 {
5812   NULL, /* init_ready_list */
5813   NULL, /* can_schedule_ready_p */
5814   NULL, /* schedule_more_p */
5815   NULL, /* new_ready */
5816   NULL, /* rgn_rank */
5817   sel_print_insn, /* rgn_print_insn */
5818   contributes_to_priority,
5819   NULL, /* insn_finishes_block_p */
5820
5821   NULL, NULL,
5822   NULL, NULL,
5823   0, 0,
5824
5825   NULL, /* add_remove_insn */
5826   NULL, /* begin_schedule_ready */
5827   NULL, /* begin_move_insn */
5828   NULL, /* advance_target_bb */
5829
5830   NULL,
5831   NULL,
5832
5833   SEL_SCHED | NEW_BBS
5834 };
5835
5836 /* Setup special insns used in the scheduler.  */
5837 void
5838 setup_nop_and_exit_insns (void)
5839 {
5840   gcc_assert (nop_pattern == NULL_RTX
5841               && exit_insn == NULL_RTX);
5842
5843   nop_pattern = constm1_rtx;
5844
5845   start_sequence ();
5846   emit_insn (nop_pattern);
5847   exit_insn = get_insns ();
5848   end_sequence ();
5849   set_block_for_insn (exit_insn, EXIT_BLOCK_PTR_FOR_FN (cfun));
5850 }
5851
5852 /* Free special insns used in the scheduler.  */
5853 void
5854 free_nop_and_exit_insns (void)
5855 {
5856   exit_insn = NULL_RTX;
5857   nop_pattern = NULL_RTX;
5858 }
5859
5860 /* Setup a special vinsn used in new insns initialization.  */
5861 void
5862 setup_nop_vinsn (void)
5863 {
5864   nop_vinsn = vinsn_create (exit_insn, false);
5865   vinsn_attach (nop_vinsn);
5866 }
5867
5868 /* Free a special vinsn used in new insns initialization.  */
5869 void
5870 free_nop_vinsn (void)
5871 {
5872   gcc_assert (VINSN_COUNT (nop_vinsn) == 1);
5873   vinsn_detach (nop_vinsn);
5874   nop_vinsn = NULL;
5875 }
5876
5877 /* Call a set_sched_flags hook.  */
5878 void
5879 sel_set_sched_flags (void)
5880 {
5881   /* ??? This means that set_sched_flags were called, and we decided to
5882      support speculation.  However, set_sched_flags also modifies flags
5883      on current_sched_info, doing this only at global init.  And we
5884      sometimes change c_s_i later.  So put the correct flags again.  */
5885   if (spec_info && targetm.sched.set_sched_flags)
5886     targetm.sched.set_sched_flags (spec_info);
5887 }
5888
5889 /* Setup pointers to global sched info structures.  */
5890 void
5891 sel_setup_sched_infos (void)
5892 {
5893   rgn_setup_common_sched_info ();
5894
5895   memcpy (&sel_common_sched_info, common_sched_info,
5896           sizeof (sel_common_sched_info));
5897
5898   sel_common_sched_info.fix_recovery_cfg = NULL;
5899   sel_common_sched_info.add_block = NULL;
5900   sel_common_sched_info.estimate_number_of_insns
5901     = sel_estimate_number_of_insns;
5902   sel_common_sched_info.luid_for_non_insn = sel_luid_for_non_insn;
5903   sel_common_sched_info.sched_pass_id = SCHED_SEL_PASS;
5904
5905   common_sched_info = &sel_common_sched_info;
5906
5907   current_sched_info = &sched_sel_haifa_sched_info;
5908   current_sched_info->sched_max_insns_priority =
5909     get_rgn_sched_max_insns_priority ();
5910
5911   sel_set_sched_flags ();
5912 }
5913 \f
5914
5915 /* Adds basic block BB to region RGN at the position *BB_ORD_INDEX,
5916    *BB_ORD_INDEX after that is increased.  */
5917 static void
5918 sel_add_block_to_region (basic_block bb, int *bb_ord_index, int rgn)
5919 {
5920   RGN_NR_BLOCKS (rgn) += 1;
5921   RGN_DONT_CALC_DEPS (rgn) = 0;
5922   RGN_HAS_REAL_EBB (rgn) = 0;
5923   CONTAINING_RGN (bb->index) = rgn;
5924   BLOCK_TO_BB (bb->index) = *bb_ord_index;
5925   rgn_bb_table[RGN_BLOCKS (rgn) + *bb_ord_index] = bb->index;
5926   (*bb_ord_index)++;
5927
5928   /* FIXME: it is true only when not scheduling ebbs.  */
5929   RGN_BLOCKS (rgn + 1) = RGN_BLOCKS (rgn) + RGN_NR_BLOCKS (rgn);
5930 }
5931
5932 /* Functions to support pipelining of outer loops.  */
5933
5934 /* Creates a new empty region and returns it's number.  */
5935 static int
5936 sel_create_new_region (void)
5937 {
5938   int new_rgn_number = nr_regions;
5939
5940   RGN_NR_BLOCKS (new_rgn_number) = 0;
5941
5942   /* FIXME: This will work only when EBBs are not created.  */
5943   if (new_rgn_number != 0)
5944     RGN_BLOCKS (new_rgn_number) = RGN_BLOCKS (new_rgn_number - 1) +
5945       RGN_NR_BLOCKS (new_rgn_number - 1);
5946   else
5947     RGN_BLOCKS (new_rgn_number) = 0;
5948
5949   /* Set the blocks of the next region so the other functions may
5950      calculate the number of blocks in the region.  */
5951   RGN_BLOCKS (new_rgn_number + 1) = RGN_BLOCKS (new_rgn_number) +
5952     RGN_NR_BLOCKS (new_rgn_number);
5953
5954   nr_regions++;
5955
5956   return new_rgn_number;
5957 }
5958
5959 /* If X has a smaller topological sort number than Y, returns -1;
5960    if greater, returns 1.  */
5961 static int
5962 bb_top_order_comparator (const void *x, const void *y)
5963 {
5964   basic_block bb1 = *(const basic_block *) x;
5965   basic_block bb2 = *(const basic_block *) y;
5966
5967   gcc_assert (bb1 == bb2
5968               || rev_top_order_index[bb1->index]
5969                  != rev_top_order_index[bb2->index]);
5970
5971   /* It's a reverse topological order in REV_TOP_ORDER_INDEX, so
5972      bbs with greater number should go earlier.  */
5973   if (rev_top_order_index[bb1->index] > rev_top_order_index[bb2->index])
5974     return -1;
5975   else
5976     return 1;
5977 }
5978
5979 /* Create a region for LOOP and return its number.  If we don't want
5980    to pipeline LOOP, return -1.  */
5981 static int
5982 make_region_from_loop (struct loop *loop)
5983 {
5984   unsigned int i;
5985   int new_rgn_number = -1;
5986   struct loop *inner;
5987
5988   /* Basic block index, to be assigned to BLOCK_TO_BB.  */
5989   int bb_ord_index = 0;
5990   basic_block *loop_blocks;
5991   basic_block preheader_block;
5992
5993   if (loop->num_nodes
5994       > (unsigned) PARAM_VALUE (PARAM_MAX_PIPELINE_REGION_BLOCKS))
5995     return -1;
5996
5997   /* Don't pipeline loops whose latch belongs to some of its inner loops.  */
5998   for (inner = loop->inner; inner; inner = inner->inner)
5999     if (flow_bb_inside_loop_p (inner, loop->latch))
6000       return -1;
6001
6002   loop->ninsns = num_loop_insns (loop);
6003   if ((int) loop->ninsns > PARAM_VALUE (PARAM_MAX_PIPELINE_REGION_INSNS))
6004     return -1;
6005
6006   loop_blocks = get_loop_body_in_custom_order (loop, bb_top_order_comparator);
6007
6008   for (i = 0; i < loop->num_nodes; i++)
6009     if (loop_blocks[i]->flags & BB_IRREDUCIBLE_LOOP)
6010       {
6011         free (loop_blocks);
6012         return -1;
6013       }
6014
6015   preheader_block = loop_preheader_edge (loop)->src;
6016   gcc_assert (preheader_block);
6017   gcc_assert (loop_blocks[0] == loop->header);
6018
6019   new_rgn_number = sel_create_new_region ();
6020
6021   sel_add_block_to_region (preheader_block, &bb_ord_index, new_rgn_number);
6022   bitmap_set_bit (bbs_in_loop_rgns, preheader_block->index);
6023
6024   for (i = 0; i < loop->num_nodes; i++)
6025     {
6026       /* Add only those blocks that haven't been scheduled in the inner loop.
6027          The exception is the basic blocks with bookkeeping code - they should
6028          be added to the region (and they actually don't belong to the loop
6029          body, but to the region containing that loop body).  */
6030
6031       gcc_assert (new_rgn_number >= 0);
6032
6033       if (! bitmap_bit_p (bbs_in_loop_rgns, loop_blocks[i]->index))
6034         {
6035           sel_add_block_to_region (loop_blocks[i], &bb_ord_index,
6036                                    new_rgn_number);
6037           bitmap_set_bit (bbs_in_loop_rgns, loop_blocks[i]->index);
6038         }
6039     }
6040
6041   free (loop_blocks);
6042   MARK_LOOP_FOR_PIPELINING (loop);
6043
6044   return new_rgn_number;
6045 }
6046
6047 /* Create a new region from preheader blocks LOOP_BLOCKS.  */
6048 void
6049 make_region_from_loop_preheader (vec<basic_block> *&loop_blocks)
6050 {
6051   unsigned int i;
6052   int new_rgn_number = -1;
6053   basic_block bb;
6054
6055   /* Basic block index, to be assigned to BLOCK_TO_BB.  */
6056   int bb_ord_index = 0;
6057
6058   new_rgn_number = sel_create_new_region ();
6059
6060   FOR_EACH_VEC_ELT (*loop_blocks, i, bb)
6061     {
6062       gcc_assert (new_rgn_number >= 0);
6063
6064       sel_add_block_to_region (bb, &bb_ord_index, new_rgn_number);
6065     }
6066
6067   vec_free (loop_blocks);
6068 }
6069
6070
6071 /* Create region(s) from loop nest LOOP, such that inner loops will be
6072    pipelined before outer loops.  Returns true when a region for LOOP
6073    is created.  */
6074 static bool
6075 make_regions_from_loop_nest (struct loop *loop)
6076 {
6077   struct loop *cur_loop;
6078   int rgn_number;
6079
6080   /* Traverse all inner nodes of the loop.  */
6081   for (cur_loop = loop->inner; cur_loop; cur_loop = cur_loop->next)
6082     if (! bitmap_bit_p (bbs_in_loop_rgns, cur_loop->header->index))
6083       return false;
6084
6085   /* At this moment all regular inner loops should have been pipelined.
6086      Try to create a region from this loop.  */
6087   rgn_number = make_region_from_loop (loop);
6088
6089   if (rgn_number < 0)
6090     return false;
6091
6092   loop_nests.safe_push (loop);
6093   return true;
6094 }
6095
6096 /* Initalize data structures needed.  */
6097 void
6098 sel_init_pipelining (void)
6099 {
6100   /* Collect loop information to be used in outer loops pipelining.  */
6101   loop_optimizer_init (LOOPS_HAVE_PREHEADERS
6102                        | LOOPS_HAVE_FALLTHRU_PREHEADERS
6103                        | LOOPS_HAVE_RECORDED_EXITS
6104                        | LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS);
6105   current_loop_nest = NULL;
6106
6107   bbs_in_loop_rgns = sbitmap_alloc (last_basic_block_for_fn (cfun));
6108   bitmap_clear (bbs_in_loop_rgns);
6109
6110   recompute_rev_top_order ();
6111 }
6112
6113 /* Returns a struct loop for region RGN.  */
6114 loop_p
6115 get_loop_nest_for_rgn (unsigned int rgn)
6116 {
6117   /* Regions created with extend_rgns don't have corresponding loop nests,
6118      because they don't represent loops.  */
6119   if (rgn < loop_nests.length ())
6120     return loop_nests[rgn];
6121   else
6122     return NULL;
6123 }
6124
6125 /* True when LOOP was included into pipelining regions.   */
6126 bool
6127 considered_for_pipelining_p (struct loop *loop)
6128 {
6129   if (loop_depth (loop) == 0)
6130     return false;
6131
6132   /* Now, the loop could be too large or irreducible.  Check whether its
6133      region is in LOOP_NESTS.
6134      We determine the region number of LOOP as the region number of its
6135      latch.  We can't use header here, because this header could be
6136      just removed preheader and it will give us the wrong region number.
6137      Latch can't be used because it could be in the inner loop too.  */
6138   if (LOOP_MARKED_FOR_PIPELINING_P (loop))
6139     {
6140       int rgn = CONTAINING_RGN (loop->latch->index);
6141
6142       gcc_assert ((unsigned) rgn < loop_nests.length ());
6143       return true;
6144     }
6145
6146   return false;
6147 }
6148
6149 /* Makes regions from the rest of the blocks, after loops are chosen
6150    for pipelining.  */
6151 static void
6152 make_regions_from_the_rest (void)
6153 {
6154   int cur_rgn_blocks;
6155   int *loop_hdr;
6156   int i;
6157
6158   basic_block bb;
6159   edge e;
6160   edge_iterator ei;
6161   int *degree;
6162
6163   /* Index in rgn_bb_table where to start allocating new regions.  */
6164   cur_rgn_blocks = nr_regions ? RGN_BLOCKS (nr_regions) : 0;
6165
6166   /* Make regions from all the rest basic blocks - those that don't belong to
6167      any loop or belong to irreducible loops.  Prepare the data structures
6168      for extend_rgns.  */
6169
6170   /* LOOP_HDR[I] == -1 if I-th bb doesn't belong to any loop,
6171      LOOP_HDR[I] == LOOP_HDR[J] iff basic blocks I and J reside within the same
6172      loop.  */
6173   loop_hdr = XNEWVEC (int, last_basic_block_for_fn (cfun));
6174   degree = XCNEWVEC (int, last_basic_block_for_fn (cfun));
6175
6176
6177   /* For each basic block that belongs to some loop assign the number
6178      of innermost loop it belongs to.  */
6179   for (i = 0; i < last_basic_block_for_fn (cfun); i++)
6180     loop_hdr[i] = -1;
6181
6182   FOR_EACH_BB_FN (bb, cfun)
6183     {
6184       if (bb->loop_father && !bb->loop_father->num == 0
6185           && !(bb->flags & BB_IRREDUCIBLE_LOOP))
6186         loop_hdr[bb->index] = bb->loop_father->num;
6187     }
6188
6189   /* For each basic block degree is calculated as the number of incoming
6190      edges, that are going out of bbs that are not yet scheduled.
6191      The basic blocks that are scheduled have degree value of zero.  */
6192   FOR_EACH_BB_FN (bb, cfun)
6193     {
6194       degree[bb->index] = 0;
6195
6196       if (!bitmap_bit_p (bbs_in_loop_rgns, bb->index))
6197         {
6198           FOR_EACH_EDGE (e, ei, bb->preds)
6199             if (!bitmap_bit_p (bbs_in_loop_rgns, e->src->index))
6200               degree[bb->index]++;
6201         }
6202       else
6203         degree[bb->index] = -1;
6204     }
6205
6206   extend_rgns (degree, &cur_rgn_blocks, bbs_in_loop_rgns, loop_hdr);
6207
6208   /* Any block that did not end up in a region is placed into a region
6209      by itself.  */
6210   FOR_EACH_BB_FN (bb, cfun)
6211     if (degree[bb->index] >= 0)
6212       {
6213         rgn_bb_table[cur_rgn_blocks] = bb->index;
6214         RGN_NR_BLOCKS (nr_regions) = 1;
6215         RGN_BLOCKS (nr_regions) = cur_rgn_blocks++;
6216         RGN_DONT_CALC_DEPS (nr_regions) = 0;
6217         RGN_HAS_REAL_EBB (nr_regions) = 0;
6218         CONTAINING_RGN (bb->index) = nr_regions++;
6219         BLOCK_TO_BB (bb->index) = 0;
6220       }
6221
6222   free (degree);
6223   free (loop_hdr);
6224 }
6225
6226 /* Free data structures used in pipelining of loops.  */
6227 void sel_finish_pipelining (void)
6228 {
6229   struct loop *loop;
6230
6231   /* Release aux fields so we don't free them later by mistake.  */
6232   FOR_EACH_LOOP (loop, 0)
6233     loop->aux = NULL;
6234
6235   loop_optimizer_finalize ();
6236
6237   loop_nests.release ();
6238
6239   free (rev_top_order_index);
6240   rev_top_order_index = NULL;
6241 }
6242
6243 /* This function replaces the find_rgns when
6244    FLAG_SEL_SCHED_PIPELINING_OUTER_LOOPS is set.  */
6245 void
6246 sel_find_rgns (void)
6247 {
6248   sel_init_pipelining ();
6249   extend_regions ();
6250
6251   if (current_loops)
6252     {
6253       loop_p loop;
6254
6255       FOR_EACH_LOOP (loop, (flag_sel_sched_pipelining_outer_loops
6256                             ? LI_FROM_INNERMOST
6257                             : LI_ONLY_INNERMOST))
6258         make_regions_from_loop_nest (loop);
6259     }
6260
6261   /* Make regions from all the rest basic blocks and schedule them.
6262      These blocks include blocks that don't belong to any loop or belong
6263      to irreducible loops.  */
6264   make_regions_from_the_rest ();
6265
6266   /* We don't need bbs_in_loop_rgns anymore.  */
6267   sbitmap_free (bbs_in_loop_rgns);
6268   bbs_in_loop_rgns = NULL;
6269 }
6270
6271 /* Add the preheader blocks from previous loop to current region taking
6272    it from LOOP_PREHEADER_BLOCKS (current_loop_nest) and record them in *BBS.
6273    This function is only used with -fsel-sched-pipelining-outer-loops.  */
6274 void
6275 sel_add_loop_preheaders (bb_vec_t *bbs)
6276 {
6277   int i;
6278   basic_block bb;
6279   vec<basic_block> *preheader_blocks
6280     = LOOP_PREHEADER_BLOCKS (current_loop_nest);
6281
6282   if (!preheader_blocks)
6283     return;
6284
6285   for (i = 0; preheader_blocks->iterate (i, &bb); i++)
6286     {
6287       bbs->safe_push (bb);
6288       last_added_blocks.safe_push (bb);
6289       sel_add_bb (bb);
6290     }
6291
6292   vec_free (preheader_blocks);
6293 }
6294
6295 /* While pipelining outer loops, returns TRUE if BB is a loop preheader.
6296    Please note that the function should also work when pipelining_p is
6297    false, because it is used when deciding whether we should or should
6298    not reschedule pipelined code.  */
6299 bool
6300 sel_is_loop_preheader_p (basic_block bb)
6301 {
6302   if (current_loop_nest)
6303     {
6304       struct loop *outer;
6305
6306       if (preheader_removed)
6307         return false;
6308
6309       /* Preheader is the first block in the region.  */
6310       if (BLOCK_TO_BB (bb->index) == 0)
6311         return true;
6312
6313       /* We used to find a preheader with the topological information.
6314          Check that the above code is equivalent to what we did before.  */
6315
6316       if (in_current_region_p (current_loop_nest->header))
6317         gcc_assert (!(BLOCK_TO_BB (bb->index)
6318                       < BLOCK_TO_BB (current_loop_nest->header->index)));
6319
6320       /* Support the situation when the latch block of outer loop
6321          could be from here.  */
6322       for (outer = loop_outer (current_loop_nest);
6323            outer;
6324            outer = loop_outer (outer))
6325         if (considered_for_pipelining_p (outer) && outer->latch == bb)
6326           gcc_unreachable ();
6327     }
6328
6329   return false;
6330 }
6331
6332 /* Check whether JUMP_BB ends with a jump insn that leads only to DEST_BB and
6333    can be removed, making the corresponding edge fallthrough (assuming that
6334    all basic blocks between JUMP_BB and DEST_BB are empty).  */
6335 static bool
6336 bb_has_removable_jump_to_p (basic_block jump_bb, basic_block dest_bb)
6337 {
6338   if (!onlyjump_p (BB_END (jump_bb))
6339       || tablejump_p (BB_END (jump_bb), NULL, NULL))
6340     return false;
6341
6342   /* Several outgoing edges, abnormal edge or destination of jump is
6343      not DEST_BB.  */
6344   if (EDGE_COUNT (jump_bb->succs) != 1
6345       || EDGE_SUCC (jump_bb, 0)->flags & (EDGE_ABNORMAL | EDGE_CROSSING)
6346       || EDGE_SUCC (jump_bb, 0)->dest != dest_bb)
6347     return false;
6348
6349   /* If not anything of the upper.  */
6350   return true;
6351 }
6352
6353 /* Removes the loop preheader from the current region and saves it in
6354    PREHEADER_BLOCKS of the father loop, so they will be added later to
6355    region that represents an outer loop.  */
6356 static void
6357 sel_remove_loop_preheader (void)
6358 {
6359   int i, old_len;
6360   int cur_rgn = CONTAINING_RGN (BB_TO_BLOCK (0));
6361   basic_block bb;
6362   bool all_empty_p = true;
6363   vec<basic_block> *preheader_blocks
6364     = LOOP_PREHEADER_BLOCKS (loop_outer (current_loop_nest));
6365
6366   vec_check_alloc (preheader_blocks, 0);
6367
6368   gcc_assert (current_loop_nest);
6369   old_len = preheader_blocks->length ();
6370
6371   /* Add blocks that aren't within the current loop to PREHEADER_BLOCKS.  */
6372   for (i = 0; i < RGN_NR_BLOCKS (cur_rgn); i++)
6373     {
6374       bb = BASIC_BLOCK_FOR_FN (cfun, BB_TO_BLOCK (i));
6375
6376       /* If the basic block belongs to region, but doesn't belong to
6377          corresponding loop, then it should be a preheader.  */
6378       if (sel_is_loop_preheader_p (bb))
6379         {
6380           preheader_blocks->safe_push (bb);
6381           if (BB_END (bb) != bb_note (bb))
6382             all_empty_p = false;
6383         }
6384     }
6385
6386   /* Remove these blocks only after iterating over the whole region.  */
6387   for (i = preheader_blocks->length () - 1; i >= old_len; i--)
6388     {
6389       bb =  (*preheader_blocks)[i];
6390       sel_remove_bb (bb, false);
6391     }
6392
6393   if (!considered_for_pipelining_p (loop_outer (current_loop_nest)))
6394     {
6395       if (!all_empty_p)
6396         /* Immediately create new region from preheader.  */
6397         make_region_from_loop_preheader (preheader_blocks);
6398       else
6399         {
6400           /* If all preheader blocks are empty - dont create new empty region.
6401              Instead, remove them completely.  */
6402           FOR_EACH_VEC_ELT (*preheader_blocks, i, bb)
6403             {
6404               edge e;
6405               edge_iterator ei;
6406               basic_block prev_bb = bb->prev_bb, next_bb = bb->next_bb;
6407
6408               /* Redirect all incoming edges to next basic block.  */
6409               for (ei = ei_start (bb->preds); (e = ei_safe_edge (ei)); )
6410                 {
6411                   if (! (e->flags & EDGE_FALLTHRU))
6412                     redirect_edge_and_branch (e, bb->next_bb);
6413                   else
6414                     redirect_edge_succ (e, bb->next_bb);
6415                 }
6416               gcc_assert (BB_NOTE_LIST (bb) == NULL);
6417               delete_and_free_basic_block (bb);
6418
6419               /* Check if after deleting preheader there is a nonconditional
6420                  jump in PREV_BB that leads to the next basic block NEXT_BB.
6421                  If it is so - delete this jump and clear data sets of its
6422                  basic block if it becomes empty.  */
6423               if (next_bb->prev_bb == prev_bb
6424                   && prev_bb != ENTRY_BLOCK_PTR_FOR_FN (cfun)
6425                   && bb_has_removable_jump_to_p (prev_bb, next_bb))
6426                 {
6427                   redirect_edge_and_branch (EDGE_SUCC (prev_bb, 0), next_bb);
6428                   if (BB_END (prev_bb) == bb_note (prev_bb))
6429                     free_data_sets (prev_bb);
6430                 }
6431
6432               set_immediate_dominator (CDI_DOMINATORS, next_bb,
6433                                        recompute_dominator (CDI_DOMINATORS,
6434                                                             next_bb));
6435             }
6436         }
6437       vec_free (preheader_blocks);
6438     }
6439   else
6440     /* Store preheader within the father's loop structure.  */
6441     SET_LOOP_PREHEADER_BLOCKS (loop_outer (current_loop_nest),
6442                                preheader_blocks);
6443 }
6444
6445 rtx_insn *VINSN_INSN_RTX (vinsn_t vi)
6446 {
6447   return safe_as_a <rtx_insn *> (vi->insn_rtx);
6448 }
6449
6450 rtx& SET_VINSN_INSN_RTX (vinsn_t vi)
6451 {
6452   return vi->insn_rtx;
6453 }
6454
6455 #endif