Update gcc-50 to SVN version 220677
[dragonfly.git] / contrib / gcc-5.0 / gcc / reorg.c
1 /* Perform instruction reorganizations for delay slot filling.
2    Copyright (C) 1992-2015 Free Software Foundation, Inc.
3    Contributed by Richard Kenner (kenner@vlsi1.ultra.nyu.edu).
4    Hacked by Michael Tiemann (tiemann@cygnus.com).
5
6 This file is part of GCC.
7
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
11 version.
12
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16 for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3.  If not see
20 <http://www.gnu.org/licenses/>.  */
21
22 /* Instruction reorganization pass.
23
24    This pass runs after register allocation and final jump
25    optimization.  It should be the last pass to run before peephole.
26    It serves primarily to fill delay slots of insns, typically branch
27    and call insns.  Other insns typically involve more complicated
28    interactions of data dependencies and resource constraints, and
29    are better handled by scheduling before register allocation (by the
30    function `schedule_insns').
31
32    The Branch Penalty is the number of extra cycles that are needed to
33    execute a branch insn.  On an ideal machine, branches take a single
34    cycle, and the Branch Penalty is 0.  Several RISC machines approach
35    branch delays differently:
36
37    The MIPS has a single branch delay slot.  Most insns
38    (except other branches) can be used to fill this slot.  When the
39    slot is filled, two insns execute in two cycles, reducing the
40    branch penalty to zero.
41
42    The SPARC always has a branch delay slot, but its effects can be
43    annulled when the branch is not taken.  This means that failing to
44    find other sources of insns, we can hoist an insn from the branch
45    target that would only be safe to execute knowing that the branch
46    is taken.
47
48    The HP-PA always has a branch delay slot.  For unconditional branches
49    its effects can be annulled when the branch is taken.  The effects
50    of the delay slot in a conditional branch can be nullified for forward
51    taken branches, or for untaken backward branches.  This means
52    we can hoist insns from the fall-through path for forward branches or
53    steal insns from the target of backward branches.
54
55    The TMS320C3x and C4x have three branch delay slots.  When the three
56    slots are filled, the branch penalty is zero.  Most insns can fill the
57    delay slots except jump insns.
58
59    Three techniques for filling delay slots have been implemented so far:
60
61    (1) `fill_simple_delay_slots' is the simplest, most efficient way
62    to fill delay slots.  This pass first looks for insns which come
63    from before the branch and which are safe to execute after the
64    branch.  Then it searches after the insn requiring delay slots or,
65    in the case of a branch, for insns that are after the point at
66    which the branch merges into the fallthrough code, if such a point
67    exists.  When such insns are found, the branch penalty decreases
68    and no code expansion takes place.
69
70    (2) `fill_eager_delay_slots' is more complicated: it is used for
71    scheduling conditional jumps, or for scheduling jumps which cannot
72    be filled using (1).  A machine need not have annulled jumps to use
73    this strategy, but it helps (by keeping more options open).
74    `fill_eager_delay_slots' tries to guess the direction the branch
75    will go; if it guesses right 100% of the time, it can reduce the
76    branch penalty as much as `fill_simple_delay_slots' does.  If it
77    guesses wrong 100% of the time, it might as well schedule nops.  When
78    `fill_eager_delay_slots' takes insns from the fall-through path of
79    the jump, usually there is no code expansion; when it takes insns
80    from the branch target, there is code expansion if it is not the
81    only way to reach that target.
82
83    (3) `relax_delay_slots' uses a set of rules to simplify code that
84    has been reorganized by (1) and (2).  It finds cases where
85    conditional test can be eliminated, jumps can be threaded, extra
86    insns can be eliminated, etc.  It is the job of (1) and (2) to do a
87    good job of scheduling locally; `relax_delay_slots' takes care of
88    making the various individual schedules work well together.  It is
89    especially tuned to handle the control flow interactions of branch
90    insns.  It does nothing for insns with delay slots that do not
91    branch.
92
93    On machines that use CC0, we are very conservative.  We will not make
94    a copy of an insn involving CC0 since we want to maintain a 1-1
95    correspondence between the insn that sets and uses CC0.  The insns are
96    allowed to be separated by placing an insn that sets CC0 (but not an insn
97    that uses CC0; we could do this, but it doesn't seem worthwhile) in a
98    delay slot.  In that case, we point each insn at the other with REG_CC_USER
99    and REG_CC_SETTER notes.  Note that these restrictions affect very few
100    machines because most RISC machines with delay slots will not use CC0
101    (the RT is the only known exception at this point).  */
102
103 #include "config.h"
104 #include "system.h"
105 #include "coretypes.h"
106 #include "tm.h"
107 #include "diagnostic-core.h"
108 #include "rtl.h"
109 #include "tm_p.h"
110 #include "symtab.h"
111 #include "hashtab.h"
112 #include "hash-set.h"
113 #include "vec.h"
114 #include "machmode.h"
115 #include "hard-reg-set.h"
116 #include "input.h"
117 #include "function.h"
118 #include "flags.h"
119 #include "statistics.h"
120 #include "double-int.h"
121 #include "real.h"
122 #include "fixed-value.h"
123 #include "alias.h"
124 #include "wide-int.h"
125 #include "inchash.h"
126 #include "tree.h"
127 #include "insn-config.h"
128 #include "expmed.h"
129 #include "dojump.h"
130 #include "explow.h"
131 #include "calls.h"
132 #include "emit-rtl.h"
133 #include "varasm.h"
134 #include "stmt.h"
135 #include "expr.h"
136 #include "conditions.h"
137 #include "predict.h"
138 #include "dominance.h"
139 #include "cfg.h"
140 #include "basic-block.h"
141 #include "regs.h"
142 #include "recog.h"
143 #include "obstack.h"
144 #include "insn-attr.h"
145 #include "resource.h"
146 #include "except.h"
147 #include "params.h"
148 #include "target.h"
149 #include "tree-pass.h"
150
151 #ifdef DELAY_SLOTS
152
153 #ifndef ANNUL_IFTRUE_SLOTS
154 #define eligible_for_annul_true(INSN, SLOTS, TRIAL, FLAGS) 0
155 #endif
156 #ifndef ANNUL_IFFALSE_SLOTS
157 #define eligible_for_annul_false(INSN, SLOTS, TRIAL, FLAGS) 0
158 #endif
159
160 \f
161 /* First, some functions that were used before GCC got a control flow graph.
162    These functions are now only used here in reorg.c, and have therefore
163    been moved here to avoid inadvertent misuse elsewhere in the compiler.  */
164
165 /* Return the last label to mark the same position as LABEL.  Return LABEL
166    itself if it is null or any return rtx.  */
167
168 static rtx
169 skip_consecutive_labels (rtx label_or_return)
170 {
171   rtx_insn *insn;
172
173   if (label_or_return && ANY_RETURN_P (label_or_return))
174     return label_or_return;
175
176   rtx_insn *label = as_a <rtx_insn *> (label_or_return);
177
178   for (insn = label; insn != 0 && !INSN_P (insn); insn = NEXT_INSN (insn))
179     if (LABEL_P (insn))
180       label = insn;
181
182   return label;
183 }
184
185 #ifdef HAVE_cc0
186 /* INSN uses CC0 and is being moved into a delay slot.  Set up REG_CC_SETTER
187    and REG_CC_USER notes so we can find it.  */
188
189 static void
190 link_cc0_insns (rtx insn)
191 {
192   rtx user = next_nonnote_insn (insn);
193
194   if (NONJUMP_INSN_P (user) && GET_CODE (PATTERN (user)) == SEQUENCE)
195     user = XVECEXP (PATTERN (user), 0, 0);
196
197   add_reg_note (user, REG_CC_SETTER, insn);
198   add_reg_note (insn, REG_CC_USER, user);
199 }
200 #endif
201 \f
202 /* Insns which have delay slots that have not yet been filled.  */
203
204 static struct obstack unfilled_slots_obstack;
205 static rtx *unfilled_firstobj;
206
207 /* Define macros to refer to the first and last slot containing unfilled
208    insns.  These are used because the list may move and its address
209    should be recomputed at each use.  */
210
211 #define unfilled_slots_base     \
212   ((rtx_insn **) obstack_base (&unfilled_slots_obstack))
213
214 #define unfilled_slots_next     \
215   ((rtx_insn **) obstack_next_free (&unfilled_slots_obstack))
216
217 /* Points to the label before the end of the function, or before a
218    return insn.  */
219 static rtx_code_label *function_return_label;
220 /* Likewise for a simple_return.  */
221 static rtx_code_label *function_simple_return_label;
222
223 /* Mapping between INSN_UID's and position in the code since INSN_UID's do
224    not always monotonically increase.  */
225 static int *uid_to_ruid;
226
227 /* Highest valid index in `uid_to_ruid'.  */
228 static int max_uid;
229
230 static int stop_search_p (rtx, int);
231 static int resource_conflicts_p (struct resources *, struct resources *);
232 static int insn_references_resource_p (rtx, struct resources *, bool);
233 static int insn_sets_resource_p (rtx, struct resources *, bool);
234 static rtx_code_label *find_end_label (rtx);
235 static rtx_insn *emit_delay_sequence (rtx_insn *, rtx_insn_list *, int);
236 static rtx_insn_list *add_to_delay_list (rtx_insn *, rtx_insn_list *);
237 static rtx_insn *delete_from_delay_slot (rtx_insn *);
238 static void delete_scheduled_jump (rtx_insn *);
239 static void note_delay_statistics (int, int);
240 #if defined(ANNUL_IFFALSE_SLOTS) || defined(ANNUL_IFTRUE_SLOTS)
241 static rtx_insn_list *optimize_skip (rtx_insn *);
242 #endif
243 static int get_jump_flags (const rtx_insn *, rtx);
244 static int mostly_true_jump (rtx);
245 static rtx get_branch_condition (const rtx_insn *, rtx);
246 static int condition_dominates_p (rtx, const rtx_insn *);
247 static int redirect_with_delay_slots_safe_p (rtx_insn *, rtx, rtx);
248 static int redirect_with_delay_list_safe_p (rtx_insn *, rtx, rtx_insn_list *);
249 static int check_annul_list_true_false (int, rtx);
250 static rtx_insn_list *steal_delay_list_from_target (rtx_insn *, rtx,
251                                                     rtx_sequence *,
252                                                     rtx_insn_list *,
253                                                     struct resources *,
254                                                     struct resources *,
255                                                     struct resources *,
256                                                     int, int *, int *,
257                                                     rtx *);
258 static rtx_insn_list *steal_delay_list_from_fallthrough (rtx_insn *, rtx,
259                                                          rtx_sequence *,
260                                                          rtx_insn_list *,
261                                                          struct resources *,
262                                                          struct resources *,
263                                                          struct resources *,
264                                                          int, int *, int *);
265 static void try_merge_delay_insns (rtx, rtx_insn *);
266 static rtx redundant_insn (rtx, rtx_insn *, rtx);
267 static int own_thread_p (rtx, rtx, int);
268 static void update_block (rtx_insn *, rtx);
269 static int reorg_redirect_jump (rtx_insn *, rtx);
270 static void update_reg_dead_notes (rtx, rtx);
271 static void fix_reg_dead_note (rtx, rtx);
272 static void update_reg_unused_notes (rtx, rtx);
273 static void fill_simple_delay_slots (int);
274 static rtx_insn_list *fill_slots_from_thread (rtx_insn *, rtx, rtx, rtx,
275                                               int, int, int, int,
276                                               int *, rtx_insn_list *);
277 static void fill_eager_delay_slots (void);
278 static void relax_delay_slots (rtx_insn *);
279 static void make_return_insns (rtx_insn *);
280 \f
281 /* A wrapper around next_active_insn which takes care to return ret_rtx
282    unchanged.  */
283
284 static rtx
285 first_active_target_insn (rtx insn)
286 {
287   if (ANY_RETURN_P (insn))
288     return insn;
289   return next_active_insn (as_a <rtx_insn *> (insn));
290 }
291 \f
292 /* Return true iff INSN is a simplejump, or any kind of return insn.  */
293
294 static bool
295 simplejump_or_return_p (rtx insn)
296 {
297   return (JUMP_P (insn)
298           && (simplejump_p (as_a <rtx_insn *> (insn))
299               || ANY_RETURN_P (PATTERN (insn))));
300 }
301 \f
302 /* Return TRUE if this insn should stop the search for insn to fill delay
303    slots.  LABELS_P indicates that labels should terminate the search.
304    In all cases, jumps terminate the search.  */
305
306 static int
307 stop_search_p (rtx insn, int labels_p)
308 {
309   if (insn == 0)
310     return 1;
311
312   /* If the insn can throw an exception that is caught within the function,
313      it may effectively perform a jump from the viewpoint of the function.
314      Therefore act like for a jump.  */
315   if (can_throw_internal (insn))
316     return 1;
317
318   switch (GET_CODE (insn))
319     {
320     case NOTE:
321     case CALL_INSN:
322       return 0;
323
324     case CODE_LABEL:
325       return labels_p;
326
327     case JUMP_INSN:
328     case BARRIER:
329       return 1;
330
331     case INSN:
332       /* OK unless it contains a delay slot or is an `asm' insn of some type.
333          We don't know anything about these.  */
334       return (GET_CODE (PATTERN (insn)) == SEQUENCE
335               || GET_CODE (PATTERN (insn)) == ASM_INPUT
336               || asm_noperands (PATTERN (insn)) >= 0);
337
338     default:
339       gcc_unreachable ();
340     }
341 }
342 \f
343 /* Return TRUE if any resources are marked in both RES1 and RES2 or if either
344    resource set contains a volatile memory reference.  Otherwise, return FALSE.  */
345
346 static int
347 resource_conflicts_p (struct resources *res1, struct resources *res2)
348 {
349   if ((res1->cc && res2->cc) || (res1->memory && res2->memory)
350       || res1->volatil || res2->volatil)
351     return 1;
352
353   return hard_reg_set_intersect_p (res1->regs, res2->regs);
354 }
355
356 /* Return TRUE if any resource marked in RES, a `struct resources', is
357    referenced by INSN.  If INCLUDE_DELAYED_EFFECTS is set, return if the called
358    routine is using those resources.
359
360    We compute this by computing all the resources referenced by INSN and
361    seeing if this conflicts with RES.  It might be faster to directly check
362    ourselves, and this is the way it used to work, but it means duplicating
363    a large block of complex code.  */
364
365 static int
366 insn_references_resource_p (rtx insn, struct resources *res,
367                             bool include_delayed_effects)
368 {
369   struct resources insn_res;
370
371   CLEAR_RESOURCE (&insn_res);
372   mark_referenced_resources (insn, &insn_res, include_delayed_effects);
373   return resource_conflicts_p (&insn_res, res);
374 }
375
376 /* Return TRUE if INSN modifies resources that are marked in RES.
377    INCLUDE_DELAYED_EFFECTS is set if the actions of that routine should be
378    included.   CC0 is only modified if it is explicitly set; see comments
379    in front of mark_set_resources for details.  */
380
381 static int
382 insn_sets_resource_p (rtx insn, struct resources *res,
383                       bool include_delayed_effects)
384 {
385   struct resources insn_sets;
386
387   CLEAR_RESOURCE (&insn_sets);
388   mark_set_resources (insn, &insn_sets, 0,
389                       (include_delayed_effects
390                        ? MARK_SRC_DEST_CALL
391                        : MARK_SRC_DEST));
392   return resource_conflicts_p (&insn_sets, res);
393 }
394 \f
395 /* Find a label at the end of the function or before a RETURN.  If there
396    is none, try to make one.  If that fails, returns 0.
397
398    The property of such a label is that it is placed just before the
399    epilogue or a bare RETURN insn, so that another bare RETURN can be
400    turned into a jump to the label unconditionally.  In particular, the
401    label cannot be placed before a RETURN insn with a filled delay slot.
402
403    ??? There may be a problem with the current implementation.  Suppose
404    we start with a bare RETURN insn and call find_end_label.  It may set
405    function_return_label just before the RETURN.  Suppose the machinery
406    is able to fill the delay slot of the RETURN insn afterwards.  Then
407    function_return_label is no longer valid according to the property
408    described above and find_end_label will still return it unmodified.
409    Note that this is probably mitigated by the following observation:
410    once function_return_label is made, it is very likely the target of
411    a jump, so filling the delay slot of the RETURN will be much more
412    difficult.
413    KIND is either simple_return_rtx or ret_rtx, indicating which type of
414    return we're looking for.  */
415
416 static rtx_code_label *
417 find_end_label (rtx kind)
418 {
419   rtx_insn *insn;
420   rtx_code_label **plabel;
421
422   if (kind == ret_rtx)
423     plabel = &function_return_label;
424   else
425     {
426       gcc_assert (kind == simple_return_rtx);
427       plabel = &function_simple_return_label;
428     }
429
430   /* If we found one previously, return it.  */
431   if (*plabel)
432     return *plabel;
433
434   /* Otherwise, see if there is a label at the end of the function.  If there
435      is, it must be that RETURN insns aren't needed, so that is our return
436      label and we don't have to do anything else.  */
437
438   insn = get_last_insn ();
439   while (NOTE_P (insn)
440          || (NONJUMP_INSN_P (insn)
441              && (GET_CODE (PATTERN (insn)) == USE
442                  || GET_CODE (PATTERN (insn)) == CLOBBER)))
443     insn = PREV_INSN (insn);
444
445   /* When a target threads its epilogue we might already have a
446      suitable return insn.  If so put a label before it for the
447      function_return_label.  */
448   if (BARRIER_P (insn)
449       && JUMP_P (PREV_INSN (insn))
450       && PATTERN (PREV_INSN (insn)) == kind)
451     {
452       rtx_insn *temp = PREV_INSN (PREV_INSN (insn));
453       rtx_code_label *label = gen_label_rtx ();
454       LABEL_NUSES (label) = 0;
455
456       /* Put the label before any USE insns that may precede the RETURN
457          insn.  */
458       while (GET_CODE (temp) == USE)
459         temp = PREV_INSN (temp);
460
461       emit_label_after (label, temp);
462       *plabel = label;
463     }
464
465   else if (LABEL_P (insn))
466     *plabel = as_a <rtx_code_label *> (insn);
467   else
468     {
469       rtx_code_label *label = gen_label_rtx ();
470       LABEL_NUSES (label) = 0;
471       /* If the basic block reorder pass moves the return insn to
472          some other place try to locate it again and put our
473          function_return_label there.  */
474       while (insn && ! (JUMP_P (insn) && (PATTERN (insn) == kind)))
475         insn = PREV_INSN (insn);
476       if (insn)
477         {
478           insn = PREV_INSN (insn);
479
480           /* Put the label before any USE insns that may precede the
481              RETURN insn.  */
482           while (GET_CODE (insn) == USE)
483             insn = PREV_INSN (insn);
484
485           emit_label_after (label, insn);
486         }
487       else
488         {
489 #ifdef HAVE_epilogue
490           if (HAVE_epilogue
491 #ifdef HAVE_return
492               && ! HAVE_return
493 #endif
494               )
495             /* The RETURN insn has its delay slot filled so we cannot
496                emit the label just before it.  Since we already have
497                an epilogue and cannot emit a new RETURN, we cannot
498                emit the label at all.  */
499             return NULL;
500 #endif /* HAVE_epilogue */
501
502           /* Otherwise, make a new label and emit a RETURN and BARRIER,
503              if needed.  */
504           emit_label (label);
505 #ifdef HAVE_return
506           if (HAVE_return)
507             {
508               /* The return we make may have delay slots too.  */
509               rtx pat = gen_return ();
510               rtx_insn *insn = emit_jump_insn (pat);
511               set_return_jump_label (insn);
512               emit_barrier ();
513               if (num_delay_slots (insn) > 0)
514                 obstack_ptr_grow (&unfilled_slots_obstack, insn);
515             }
516 #endif
517         }
518       *plabel = label;
519     }
520
521   /* Show one additional use for this label so it won't go away until
522      we are done.  */
523   ++LABEL_NUSES (*plabel);
524
525   return *plabel;
526 }
527 \f
528 /* Put INSN and LIST together in a SEQUENCE rtx of LENGTH, and replace
529    the pattern of INSN with the SEQUENCE.
530
531    Returns the insn containing the SEQUENCE that replaces INSN.  */
532
533 static rtx_insn *
534 emit_delay_sequence (rtx_insn *insn, rtx_insn_list *list, int length)
535 {
536   /* Allocate the rtvec to hold the insns and the SEQUENCE.  */
537   rtvec seqv = rtvec_alloc (length + 1);
538   rtx seq = gen_rtx_SEQUENCE (VOIDmode, seqv);
539   rtx_insn *seq_insn = make_insn_raw (seq);
540
541   /* If DELAY_INSN has a location, use it for SEQ_INSN.  If DELAY_INSN does
542      not have a location, but one of the delayed insns does, we pick up a
543      location from there later.  */
544   INSN_LOCATION (seq_insn) = INSN_LOCATION (insn);
545
546   /* Unlink INSN from the insn chain, so that we can put it into
547      the SEQUENCE.   Remember where we want to emit SEQUENCE in AFTER.  */
548   rtx after = PREV_INSN (insn);
549   remove_insn (insn);
550   SET_NEXT_INSN (insn) = SET_PREV_INSN (insn) = NULL;
551
552   /* Build our SEQUENCE and rebuild the insn chain.  */
553   int i = 1;
554   start_sequence ();
555   XVECEXP (seq, 0, 0) = emit_insn (insn);
556   for (rtx_insn_list *li = list; li; li = li->next (), i++)
557     {
558       rtx_insn *tem = li->insn ();
559       rtx note, next;
560
561       /* Show that this copy of the insn isn't deleted.  */
562       tem->set_undeleted ();
563
564       /* Unlink insn from its original place, and re-emit it into
565          the sequence.  */
566       SET_NEXT_INSN (tem) = SET_PREV_INSN (tem) = NULL;
567       XVECEXP (seq, 0, i) = emit_insn (tem);
568
569       /* SPARC assembler, for instance, emit warning when debug info is output
570          into the delay slot.  */
571       if (INSN_LOCATION (tem) && !INSN_LOCATION (seq_insn))
572         INSN_LOCATION (seq_insn) = INSN_LOCATION (tem);
573       INSN_LOCATION (tem) = 0;
574
575       for (note = REG_NOTES (tem); note; note = next)
576         {
577           next = XEXP (note, 1);
578           switch (REG_NOTE_KIND (note))
579             {
580             case REG_DEAD:
581               /* Remove any REG_DEAD notes because we can't rely on them now
582                  that the insn has been moved.  */
583               remove_note (tem, note);
584               break;
585
586             case REG_LABEL_OPERAND:
587             case REG_LABEL_TARGET:
588               /* Keep the label reference count up to date.  */
589               if (LABEL_P (XEXP (note, 0)))
590                 LABEL_NUSES (XEXP (note, 0)) ++;
591               break;
592
593             default:
594               break;
595             }
596         }
597     }
598   end_sequence ();
599   gcc_assert (i == length + 1);
600
601   /* Splice our SEQUENCE into the insn stream where INSN used to be.  */
602   add_insn_after (seq_insn, after, NULL);
603
604   return seq_insn;
605 }
606
607 /* Add INSN to DELAY_LIST and return the head of the new list.  The list must
608    be in the order in which the insns are to be executed.  */
609
610 static rtx_insn_list *
611 add_to_delay_list (rtx_insn *insn, rtx_insn_list *delay_list)
612 {
613   /* If we have an empty list, just make a new list element.  If
614      INSN has its block number recorded, clear it since we may
615      be moving the insn to a new block.  */
616
617   if (delay_list == 0)
618     {
619       clear_hashed_info_for_insn (insn);
620       return gen_rtx_INSN_LIST (VOIDmode, insn, NULL_RTX);
621     }
622
623   /* Otherwise this must be an INSN_LIST.  Add INSN to the end of the
624      list.  */
625   XEXP (delay_list, 1) = add_to_delay_list (insn, delay_list->next ());
626
627   return delay_list;
628 }
629 \f
630 /* Delete INSN from the delay slot of the insn that it is in, which may
631    produce an insn with no delay slots.  Return the new insn.  */
632
633 static rtx_insn *
634 delete_from_delay_slot (rtx_insn *insn)
635 {
636   rtx_insn *trial, *seq_insn, *prev;
637   rtx_sequence *seq;
638   rtx_insn_list *delay_list = 0;
639   int i;
640   int had_barrier = 0;
641
642   /* We first must find the insn containing the SEQUENCE with INSN in its
643      delay slot.  Do this by finding an insn, TRIAL, where
644      PREV_INSN (NEXT_INSN (TRIAL)) != TRIAL.  */
645
646   for (trial = insn;
647        PREV_INSN (NEXT_INSN (trial)) == trial;
648        trial = NEXT_INSN (trial))
649     ;
650
651   seq_insn = PREV_INSN (NEXT_INSN (trial));
652   seq = as_a <rtx_sequence *> (PATTERN (seq_insn));
653
654   if (NEXT_INSN (seq_insn) && BARRIER_P (NEXT_INSN (seq_insn)))
655     had_barrier = 1;
656
657   /* Create a delay list consisting of all the insns other than the one
658      we are deleting (unless we were the only one).  */
659   if (seq->len () > 2)
660     for (i = 1; i < seq->len (); i++)
661       if (seq->insn (i) != insn)
662         delay_list = add_to_delay_list (seq->insn (i), delay_list);
663
664   /* Delete the old SEQUENCE, re-emit the insn that used to have the delay
665      list, and rebuild the delay list if non-empty.  */
666   prev = PREV_INSN (seq_insn);
667   trial = seq->insn (0);
668   delete_related_insns (seq_insn);
669   add_insn_after (trial, prev, NULL);
670
671   /* If there was a barrier after the old SEQUENCE, remit it.  */
672   if (had_barrier)
673     emit_barrier_after (trial);
674
675   /* If there are any delay insns, remit them.  Otherwise clear the
676      annul flag.  */
677   if (delay_list)
678     trial = emit_delay_sequence (trial, delay_list, XVECLEN (seq, 0) - 2);
679   else if (JUMP_P (trial))
680     INSN_ANNULLED_BRANCH_P (trial) = 0;
681
682   INSN_FROM_TARGET_P (insn) = 0;
683
684   /* Show we need to fill this insn again.  */
685   obstack_ptr_grow (&unfilled_slots_obstack, trial);
686
687   return trial;
688 }
689 \f
690 /* Delete INSN, a JUMP_INSN.  If it is a conditional jump, we must track down
691    the insn that sets CC0 for it and delete it too.  */
692
693 static void
694 delete_scheduled_jump (rtx_insn *insn)
695 {
696   /* Delete the insn that sets cc0 for us.  On machines without cc0, we could
697      delete the insn that sets the condition code, but it is hard to find it.
698      Since this case is rare anyway, don't bother trying; there would likely
699      be other insns that became dead anyway, which we wouldn't know to
700      delete.  */
701
702 #ifdef HAVE_cc0
703   if (reg_mentioned_p (cc0_rtx, insn))
704     {
705       rtx note = find_reg_note (insn, REG_CC_SETTER, NULL_RTX);
706
707       /* If a reg-note was found, it points to an insn to set CC0.  This
708          insn is in the delay list of some other insn.  So delete it from
709          the delay list it was in.  */
710       if (note)
711         {
712           if (! FIND_REG_INC_NOTE (XEXP (note, 0), NULL_RTX)
713               && sets_cc0_p (PATTERN (XEXP (note, 0))) == 1)
714             delete_from_delay_slot (as_a <rtx_insn *> (XEXP (note, 0)));
715         }
716       else
717         {
718           /* The insn setting CC0 is our previous insn, but it may be in
719              a delay slot.  It will be the last insn in the delay slot, if
720              it is.  */
721           rtx_insn *trial = previous_insn (insn);
722           if (NOTE_P (trial))
723             trial = prev_nonnote_insn (trial);
724           if (sets_cc0_p (PATTERN (trial)) != 1
725               || FIND_REG_INC_NOTE (trial, NULL_RTX))
726             return;
727           if (PREV_INSN (NEXT_INSN (trial)) == trial)
728             delete_related_insns (trial);
729           else
730             delete_from_delay_slot (trial);
731         }
732     }
733 #endif
734
735   delete_related_insns (insn);
736 }
737 \f
738 /* Counters for delay-slot filling.  */
739
740 #define NUM_REORG_FUNCTIONS 2
741 #define MAX_DELAY_HISTOGRAM 3
742 #define MAX_REORG_PASSES 2
743
744 static int num_insns_needing_delays[NUM_REORG_FUNCTIONS][MAX_REORG_PASSES];
745
746 static int num_filled_delays[NUM_REORG_FUNCTIONS][MAX_DELAY_HISTOGRAM+1][MAX_REORG_PASSES];
747
748 static int reorg_pass_number;
749
750 static void
751 note_delay_statistics (int slots_filled, int index)
752 {
753   num_insns_needing_delays[index][reorg_pass_number]++;
754   if (slots_filled > MAX_DELAY_HISTOGRAM)
755     slots_filled = MAX_DELAY_HISTOGRAM;
756   num_filled_delays[index][slots_filled][reorg_pass_number]++;
757 }
758 \f
759 #if defined(ANNUL_IFFALSE_SLOTS) || defined(ANNUL_IFTRUE_SLOTS)
760
761 /* Optimize the following cases:
762
763    1.  When a conditional branch skips over only one instruction,
764        use an annulling branch and put that insn in the delay slot.
765        Use either a branch that annuls when the condition if true or
766        invert the test with a branch that annuls when the condition is
767        false.  This saves insns, since otherwise we must copy an insn
768        from the L1 target.
769
770         (orig)           (skip)         (otherwise)
771         Bcc.n L1        Bcc',a L1       Bcc,a L1'
772         insn            insn            insn2
773       L1:             L1:             L1:
774         insn2           insn2           insn2
775         insn3           insn3         L1':
776                                         insn3
777
778    2.  When a conditional branch skips over only one instruction,
779        and after that, it unconditionally branches somewhere else,
780        perform the similar optimization. This saves executing the
781        second branch in the case where the inverted condition is true.
782
783         Bcc.n L1        Bcc',a L2
784         insn            insn
785       L1:             L1:
786         Bra L2          Bra L2
787
788    INSN is a JUMP_INSN.
789
790    This should be expanded to skip over N insns, where N is the number
791    of delay slots required.  */
792
793 static rtx_insn_list *
794 optimize_skip (rtx_insn *insn)
795 {
796   rtx_insn *trial = next_nonnote_insn (insn);
797   rtx_insn *next_trial = next_active_insn (trial);
798   rtx_insn_list *delay_list = 0;
799   int flags;
800
801   flags = get_jump_flags (insn, JUMP_LABEL (insn));
802
803   if (trial == 0
804       || !NONJUMP_INSN_P (trial)
805       || GET_CODE (PATTERN (trial)) == SEQUENCE
806       || recog_memoized (trial) < 0
807       || (! eligible_for_annul_false (insn, 0, trial, flags)
808           && ! eligible_for_annul_true (insn, 0, trial, flags))
809       || can_throw_internal (trial))
810     return 0;
811
812   /* There are two cases where we are just executing one insn (we assume
813      here that a branch requires only one insn; this should be generalized
814      at some point):  Where the branch goes around a single insn or where
815      we have one insn followed by a branch to the same label we branch to.
816      In both of these cases, inverting the jump and annulling the delay
817      slot give the same effect in fewer insns.  */
818   if (next_trial == next_active_insn (JUMP_LABEL (insn))
819       || (next_trial != 0
820           && simplejump_or_return_p (next_trial)
821           && JUMP_LABEL (insn) == JUMP_LABEL (next_trial)))
822     {
823       if (eligible_for_annul_false (insn, 0, trial, flags))
824         {
825           if (invert_jump (insn, JUMP_LABEL (insn), 1))
826             INSN_FROM_TARGET_P (trial) = 1;
827           else if (! eligible_for_annul_true (insn, 0, trial, flags))
828             return 0;
829         }
830
831       delay_list = add_to_delay_list (trial, NULL);
832       next_trial = next_active_insn (trial);
833       update_block (trial, trial);
834       delete_related_insns (trial);
835
836       /* Also, if we are targeting an unconditional
837          branch, thread our jump to the target of that branch.  Don't
838          change this into a RETURN here, because it may not accept what
839          we have in the delay slot.  We'll fix this up later.  */
840       if (next_trial && simplejump_or_return_p (next_trial))
841         {
842           rtx target_label = JUMP_LABEL (next_trial);
843           if (ANY_RETURN_P (target_label))
844             target_label = find_end_label (target_label);
845
846           if (target_label)
847             {
848               /* Recompute the flags based on TARGET_LABEL since threading
849                  the jump to TARGET_LABEL may change the direction of the
850                  jump (which may change the circumstances in which the
851                  delay slot is nullified).  */
852               flags = get_jump_flags (insn, target_label);
853               if (eligible_for_annul_true (insn, 0, trial, flags))
854                 reorg_redirect_jump (insn, target_label);
855             }
856         }
857
858       INSN_ANNULLED_BRANCH_P (insn) = 1;
859     }
860
861   return delay_list;
862 }
863 #endif
864 \f
865 /*  Encode and return branch direction and prediction information for
866     INSN assuming it will jump to LABEL.
867
868     Non conditional branches return no direction information and
869     are predicted as very likely taken.  */
870
871 static int
872 get_jump_flags (const rtx_insn *insn, rtx label)
873 {
874   int flags;
875
876   /* get_jump_flags can be passed any insn with delay slots, these may
877      be INSNs, CALL_INSNs, or JUMP_INSNs.  Only JUMP_INSNs have branch
878      direction information, and only if they are conditional jumps.
879
880      If LABEL is a return, then there is no way to determine the branch
881      direction.  */
882   if (JUMP_P (insn)
883       && (condjump_p (insn) || condjump_in_parallel_p (insn))
884       && !ANY_RETURN_P (label)
885       && INSN_UID (insn) <= max_uid
886       && INSN_UID (label) <= max_uid)
887     flags
888       = (uid_to_ruid[INSN_UID (label)] > uid_to_ruid[INSN_UID (insn)])
889          ? ATTR_FLAG_forward : ATTR_FLAG_backward;
890   /* No valid direction information.  */
891   else
892     flags = 0;
893
894   return flags;
895 }
896
897 /* Return truth value of the statement that this branch
898    is mostly taken.  If we think that the branch is extremely likely
899    to be taken, we return 2.  If the branch is slightly more likely to be
900    taken, return 1.  If the branch is slightly less likely to be taken,
901    return 0 and if the branch is highly unlikely to be taken, return -1.  */
902
903 static int
904 mostly_true_jump (rtx jump_insn)
905 {
906   /* If branch probabilities are available, then use that number since it
907      always gives a correct answer.  */
908   rtx note = find_reg_note (jump_insn, REG_BR_PROB, 0);
909   if (note)
910     {
911       int prob = XINT (note, 0);
912
913       if (prob >= REG_BR_PROB_BASE * 9 / 10)
914         return 2;
915       else if (prob >= REG_BR_PROB_BASE / 2)
916         return 1;
917       else if (prob >= REG_BR_PROB_BASE / 10)
918         return 0;
919       else
920         return -1;
921     }
922
923   /* If there is no note, assume branches are not taken.
924      This should be rare.  */
925     return 0;
926 }
927
928 /* Return the condition under which INSN will branch to TARGET.  If TARGET
929    is zero, return the condition under which INSN will return.  If INSN is
930    an unconditional branch, return const_true_rtx.  If INSN isn't a simple
931    type of jump, or it doesn't go to TARGET, return 0.  */
932
933 static rtx
934 get_branch_condition (const rtx_insn *insn, rtx target)
935 {
936   rtx pat = PATTERN (insn);
937   rtx src;
938
939   if (condjump_in_parallel_p (insn))
940     pat = XVECEXP (pat, 0, 0);
941
942   if (ANY_RETURN_P (pat) && pat == target)
943     return const_true_rtx;
944
945   if (GET_CODE (pat) != SET || SET_DEST (pat) != pc_rtx)
946     return 0;
947
948   src = SET_SRC (pat);
949   if (GET_CODE (src) == LABEL_REF && LABEL_REF_LABEL (src) == target)
950     return const_true_rtx;
951
952   else if (GET_CODE (src) == IF_THEN_ELSE
953            && XEXP (src, 2) == pc_rtx
954            && ((GET_CODE (XEXP (src, 1)) == LABEL_REF
955                 && LABEL_REF_LABEL (XEXP (src, 1)) == target)
956                || (ANY_RETURN_P (XEXP (src, 1)) && XEXP (src, 1) == target)))
957     return XEXP (src, 0);
958
959   else if (GET_CODE (src) == IF_THEN_ELSE
960            && XEXP (src, 1) == pc_rtx
961            && ((GET_CODE (XEXP (src, 2)) == LABEL_REF
962                 && LABEL_REF_LABEL (XEXP (src, 2)) == target)
963                || (ANY_RETURN_P (XEXP (src, 2)) && XEXP (src, 2) == target)))
964     {
965       enum rtx_code rev;
966       rev = reversed_comparison_code (XEXP (src, 0), insn);
967       if (rev != UNKNOWN)
968         return gen_rtx_fmt_ee (rev, GET_MODE (XEXP (src, 0)),
969                                XEXP (XEXP (src, 0), 0),
970                                XEXP (XEXP (src, 0), 1));
971     }
972
973   return 0;
974 }
975
976 /* Return nonzero if CONDITION is more strict than the condition of
977    INSN, i.e., if INSN will always branch if CONDITION is true.  */
978
979 static int
980 condition_dominates_p (rtx condition, const rtx_insn *insn)
981 {
982   rtx other_condition = get_branch_condition (insn, JUMP_LABEL (insn));
983   enum rtx_code code = GET_CODE (condition);
984   enum rtx_code other_code;
985
986   if (rtx_equal_p (condition, other_condition)
987       || other_condition == const_true_rtx)
988     return 1;
989
990   else if (condition == const_true_rtx || other_condition == 0)
991     return 0;
992
993   other_code = GET_CODE (other_condition);
994   if (GET_RTX_LENGTH (code) != 2 || GET_RTX_LENGTH (other_code) != 2
995       || ! rtx_equal_p (XEXP (condition, 0), XEXP (other_condition, 0))
996       || ! rtx_equal_p (XEXP (condition, 1), XEXP (other_condition, 1)))
997     return 0;
998
999   return comparison_dominates_p (code, other_code);
1000 }
1001
1002 /* Return nonzero if redirecting JUMP to NEWLABEL does not invalidate
1003    any insns already in the delay slot of JUMP.  */
1004
1005 static int
1006 redirect_with_delay_slots_safe_p (rtx_insn *jump, rtx newlabel, rtx seq)
1007 {
1008   int flags, i;
1009   rtx_sequence *pat = as_a <rtx_sequence *> (PATTERN (seq));
1010
1011   /* Make sure all the delay slots of this jump would still
1012      be valid after threading the jump.  If they are still
1013      valid, then return nonzero.  */
1014
1015   flags = get_jump_flags (jump, newlabel);
1016   for (i = 1; i < pat->len (); i++)
1017     if (! (
1018 #ifdef ANNUL_IFFALSE_SLOTS
1019            (INSN_ANNULLED_BRANCH_P (jump)
1020             && INSN_FROM_TARGET_P (pat->insn (i)))
1021            ? eligible_for_annul_false (jump, i - 1, pat->insn (i), flags) :
1022 #endif
1023 #ifdef ANNUL_IFTRUE_SLOTS
1024            (INSN_ANNULLED_BRANCH_P (jump)
1025             && ! INSN_FROM_TARGET_P (XVECEXP (pat, 0, i)))
1026            ? eligible_for_annul_true (jump, i - 1, pat->insn (i), flags) :
1027 #endif
1028            eligible_for_delay (jump, i - 1, pat->insn (i), flags)))
1029       break;
1030
1031   return (i == pat->len ());
1032 }
1033
1034 /* Return nonzero if redirecting JUMP to NEWLABEL does not invalidate
1035    any insns we wish to place in the delay slot of JUMP.  */
1036
1037 static int
1038 redirect_with_delay_list_safe_p (rtx_insn *jump, rtx newlabel,
1039                                  rtx_insn_list *delay_list)
1040 {
1041   int flags, i;
1042   rtx_insn_list *li;
1043
1044   /* Make sure all the insns in DELAY_LIST would still be
1045      valid after threading the jump.  If they are still
1046      valid, then return nonzero.  */
1047
1048   flags = get_jump_flags (jump, newlabel);
1049   for (li = delay_list, i = 0; li; li = li->next (), i++)
1050     if (! (
1051 #ifdef ANNUL_IFFALSE_SLOTS
1052            (INSN_ANNULLED_BRANCH_P (jump)
1053             && INSN_FROM_TARGET_P (li->insn ()))
1054            ? eligible_for_annul_false (jump, i, li->insn (), flags) :
1055 #endif
1056 #ifdef ANNUL_IFTRUE_SLOTS
1057            (INSN_ANNULLED_BRANCH_P (jump)
1058             && ! INSN_FROM_TARGET_P (XEXP (li, 0)))
1059            ? eligible_for_annul_true (jump, i, li->insn (), flags) :
1060 #endif
1061            eligible_for_delay (jump, i, li->insn (), flags)))
1062       break;
1063
1064   return (li == NULL);
1065 }
1066
1067 /* DELAY_LIST is a list of insns that have already been placed into delay
1068    slots.  See if all of them have the same annulling status as ANNUL_TRUE_P.
1069    If not, return 0; otherwise return 1.  */
1070
1071 static int
1072 check_annul_list_true_false (int annul_true_p, rtx delay_list)
1073 {
1074   rtx temp;
1075
1076   if (delay_list)
1077     {
1078       for (temp = delay_list; temp; temp = XEXP (temp, 1))
1079         {
1080           rtx trial = XEXP (temp, 0);
1081
1082           if ((annul_true_p && INSN_FROM_TARGET_P (trial))
1083               || (!annul_true_p && !INSN_FROM_TARGET_P (trial)))
1084             return 0;
1085         }
1086     }
1087
1088   return 1;
1089 }
1090 \f
1091 /* INSN branches to an insn whose pattern SEQ is a SEQUENCE.  Given that
1092    the condition tested by INSN is CONDITION and the resources shown in
1093    OTHER_NEEDED are needed after INSN, see whether INSN can take all the insns
1094    from SEQ's delay list, in addition to whatever insns it may execute
1095    (in DELAY_LIST).   SETS and NEEDED are denote resources already set and
1096    needed while searching for delay slot insns.  Return the concatenated
1097    delay list if possible, otherwise, return 0.
1098
1099    SLOTS_TO_FILL is the total number of slots required by INSN, and
1100    PSLOTS_FILLED points to the number filled so far (also the number of
1101    insns in DELAY_LIST).  It is updated with the number that have been
1102    filled from the SEQUENCE, if any.
1103
1104    PANNUL_P points to a nonzero value if we already know that we need
1105    to annul INSN.  If this routine determines that annulling is needed,
1106    it may set that value nonzero.
1107
1108    PNEW_THREAD points to a location that is to receive the place at which
1109    execution should continue.  */
1110
1111 static rtx_insn_list *
1112 steal_delay_list_from_target (rtx_insn *insn, rtx condition, rtx_sequence *seq,
1113                               rtx_insn_list *delay_list, struct resources *sets,
1114                               struct resources *needed,
1115                               struct resources *other_needed,
1116                               int slots_to_fill, int *pslots_filled,
1117                               int *pannul_p, rtx *pnew_thread)
1118 {
1119   int slots_remaining = slots_to_fill - *pslots_filled;
1120   int total_slots_filled = *pslots_filled;
1121   rtx_insn_list *new_delay_list = 0;
1122   int must_annul = *pannul_p;
1123   int used_annul = 0;
1124   int i;
1125   struct resources cc_set;
1126   bool *redundant;
1127
1128   /* We can't do anything if there are more delay slots in SEQ than we
1129      can handle, or if we don't know that it will be a taken branch.
1130      We know that it will be a taken branch if it is either an unconditional
1131      branch or a conditional branch with a stricter branch condition.
1132
1133      Also, exit if the branch has more than one set, since then it is computing
1134      other results that can't be ignored, e.g. the HPPA mov&branch instruction.
1135      ??? It may be possible to move other sets into INSN in addition to
1136      moving the instructions in the delay slots.
1137
1138      We can not steal the delay list if one of the instructions in the
1139      current delay_list modifies the condition codes and the jump in the
1140      sequence is a conditional jump. We can not do this because we can
1141      not change the direction of the jump because the condition codes
1142      will effect the direction of the jump in the sequence.  */
1143
1144   CLEAR_RESOURCE (&cc_set);
1145   for (rtx_insn_list *temp = delay_list; temp; temp = temp->next ())
1146     {
1147       rtx_insn *trial = temp->insn ();
1148
1149       mark_set_resources (trial, &cc_set, 0, MARK_SRC_DEST_CALL);
1150       if (insn_references_resource_p (seq->insn (0), &cc_set, false))
1151         return delay_list;
1152     }
1153
1154   if (XVECLEN (seq, 0) - 1 > slots_remaining
1155       || ! condition_dominates_p (condition, seq->insn (0))
1156       || ! single_set (seq->insn (0)))
1157     return delay_list;
1158
1159   /* On some targets, branches with delay slots can have a limited
1160      displacement.  Give the back end a chance to tell us we can't do
1161      this.  */
1162   if (! targetm.can_follow_jump (insn, seq->insn (0)))
1163     return delay_list;
1164
1165   redundant = XALLOCAVEC (bool, XVECLEN (seq, 0));
1166   for (i = 1; i < seq->len (); i++)
1167     {
1168       rtx_insn *trial = seq->insn (i);
1169       int flags;
1170
1171       if (insn_references_resource_p (trial, sets, false)
1172           || insn_sets_resource_p (trial, needed, false)
1173           || insn_sets_resource_p (trial, sets, false)
1174 #ifdef HAVE_cc0
1175           /* If TRIAL sets CC0, we can't copy it, so we can't steal this
1176              delay list.  */
1177           || find_reg_note (trial, REG_CC_USER, NULL_RTX)
1178 #endif
1179           /* If TRIAL is from the fallthrough code of an annulled branch insn
1180              in SEQ, we cannot use it.  */
1181           || (INSN_ANNULLED_BRANCH_P (seq->insn (0))
1182               && ! INSN_FROM_TARGET_P (trial)))
1183         return delay_list;
1184
1185       /* If this insn was already done (usually in a previous delay slot),
1186          pretend we put it in our delay slot.  */
1187       redundant[i] = redundant_insn (trial, insn, new_delay_list);
1188       if (redundant[i])
1189         continue;
1190
1191       /* We will end up re-vectoring this branch, so compute flags
1192          based on jumping to the new label.  */
1193       flags = get_jump_flags (insn, JUMP_LABEL (seq->insn (0)));
1194
1195       if (! must_annul
1196           && ((condition == const_true_rtx
1197                || (! insn_sets_resource_p (trial, other_needed, false)
1198                    && ! may_trap_or_fault_p (PATTERN (trial)))))
1199           ? eligible_for_delay (insn, total_slots_filled, trial, flags)
1200           : (must_annul || (delay_list == NULL && new_delay_list == NULL))
1201              && (must_annul = 1,
1202                  check_annul_list_true_false (0, delay_list)
1203                  && check_annul_list_true_false (0, new_delay_list)
1204                  && eligible_for_annul_false (insn, total_slots_filled,
1205                                               trial, flags)))
1206         {
1207           if (must_annul)
1208             used_annul = 1;
1209           rtx_insn *temp = copy_delay_slot_insn (trial);
1210           INSN_FROM_TARGET_P (temp) = 1;
1211           new_delay_list = add_to_delay_list (temp, new_delay_list);
1212           total_slots_filled++;
1213
1214           if (--slots_remaining == 0)
1215             break;
1216         }
1217       else
1218         return delay_list;
1219     }
1220
1221   /* Record the effect of the instructions that were redundant and which
1222      we therefore decided not to copy.  */
1223   for (i = 1; i < seq->len (); i++)
1224     if (redundant[i])
1225       update_block (seq->insn (i), insn);
1226
1227   /* Show the place to which we will be branching.  */
1228   *pnew_thread = first_active_target_insn (JUMP_LABEL (seq->insn (0)));
1229
1230   /* Add any new insns to the delay list and update the count of the
1231      number of slots filled.  */
1232   *pslots_filled = total_slots_filled;
1233   if (used_annul)
1234     *pannul_p = 1;
1235
1236   if (delay_list == 0)
1237     return new_delay_list;
1238
1239   for (rtx_insn_list *temp = new_delay_list; temp; temp = temp->next ())
1240     delay_list = add_to_delay_list (temp->insn (), delay_list);
1241
1242   return delay_list;
1243 }
1244 \f
1245 /* Similar to steal_delay_list_from_target except that SEQ is on the
1246    fallthrough path of INSN.  Here we only do something if the delay insn
1247    of SEQ is an unconditional branch.  In that case we steal its delay slot
1248    for INSN since unconditional branches are much easier to fill.  */
1249
1250 static rtx_insn_list *
1251 steal_delay_list_from_fallthrough (rtx_insn *insn, rtx condition,
1252                                    rtx_sequence *seq,
1253                                    rtx_insn_list *delay_list,
1254                                    struct resources *sets,
1255                                    struct resources *needed,
1256                                    struct resources *other_needed,
1257                                    int slots_to_fill, int *pslots_filled,
1258                                    int *pannul_p)
1259 {
1260   int i;
1261   int flags;
1262   int must_annul = *pannul_p;
1263   int used_annul = 0;
1264
1265   flags = get_jump_flags (insn, JUMP_LABEL (insn));
1266
1267   /* We can't do anything if SEQ's delay insn isn't an
1268      unconditional branch.  */
1269
1270   if (! simplejump_or_return_p (seq->insn (0)))
1271     return delay_list;
1272
1273   for (i = 1; i < seq->len (); i++)
1274     {
1275       rtx_insn *trial = seq->insn (i);
1276
1277       /* If TRIAL sets CC0, stealing it will move it too far from the use
1278          of CC0.  */
1279       if (insn_references_resource_p (trial, sets, false)
1280           || insn_sets_resource_p (trial, needed, false)
1281           || insn_sets_resource_p (trial, sets, false)
1282 #ifdef HAVE_cc0
1283           || sets_cc0_p (PATTERN (trial))
1284 #endif
1285           )
1286
1287         break;
1288
1289       /* If this insn was already done, we don't need it.  */
1290       if (redundant_insn (trial, insn, delay_list))
1291         {
1292           update_block (trial, insn);
1293           delete_from_delay_slot (trial);
1294           continue;
1295         }
1296
1297       if (! must_annul
1298           && ((condition == const_true_rtx
1299                || (! insn_sets_resource_p (trial, other_needed, false)
1300                    && ! may_trap_or_fault_p (PATTERN (trial)))))
1301           ? eligible_for_delay (insn, *pslots_filled, trial, flags)
1302           : (must_annul || delay_list == NULL) && (must_annul = 1,
1303              check_annul_list_true_false (1, delay_list)
1304              && eligible_for_annul_true (insn, *pslots_filled, trial, flags)))
1305         {
1306           if (must_annul)
1307             used_annul = 1;
1308           delete_from_delay_slot (trial);
1309           delay_list = add_to_delay_list (trial, delay_list);
1310
1311           if (++(*pslots_filled) == slots_to_fill)
1312             break;
1313         }
1314       else
1315         break;
1316     }
1317
1318   if (used_annul)
1319     *pannul_p = 1;
1320   return delay_list;
1321 }
1322 \f
1323 /* Try merging insns starting at THREAD which match exactly the insns in
1324    INSN's delay list.
1325
1326    If all insns were matched and the insn was previously annulling, the
1327    annul bit will be cleared.
1328
1329    For each insn that is merged, if the branch is or will be non-annulling,
1330    we delete the merged insn.  */
1331
1332 static void
1333 try_merge_delay_insns (rtx insn, rtx_insn *thread)
1334 {
1335   rtx_insn *trial, *next_trial;
1336   rtx_insn *delay_insn = as_a <rtx_insn *> (XVECEXP (PATTERN (insn), 0, 0));
1337   int annul_p = JUMP_P (delay_insn) && INSN_ANNULLED_BRANCH_P (delay_insn);
1338   int slot_number = 1;
1339   int num_slots = XVECLEN (PATTERN (insn), 0);
1340   rtx next_to_match = XVECEXP (PATTERN (insn), 0, slot_number);
1341   struct resources set, needed;
1342   rtx_insn_list *merged_insns = 0;
1343   int i;
1344   int flags;
1345
1346   flags = get_jump_flags (delay_insn, JUMP_LABEL (delay_insn));
1347
1348   CLEAR_RESOURCE (&needed);
1349   CLEAR_RESOURCE (&set);
1350
1351   /* If this is not an annulling branch, take into account anything needed in
1352      INSN's delay slot.  This prevents two increments from being incorrectly
1353      folded into one.  If we are annulling, this would be the correct
1354      thing to do.  (The alternative, looking at things set in NEXT_TO_MATCH
1355      will essentially disable this optimization.  This method is somewhat of
1356      a kludge, but I don't see a better way.)  */
1357   if (! annul_p)
1358     for (i = 1 ; i < num_slots; i++)
1359       if (XVECEXP (PATTERN (insn), 0, i))
1360         mark_referenced_resources (XVECEXP (PATTERN (insn), 0, i), &needed,
1361                                    true);
1362
1363   for (trial = thread; !stop_search_p (trial, 1); trial = next_trial)
1364     {
1365       rtx pat = PATTERN (trial);
1366       rtx oldtrial = trial;
1367
1368       next_trial = next_nonnote_insn (trial);
1369
1370       /* TRIAL must be a CALL_INSN or INSN.  Skip USE and CLOBBER.  */
1371       if (NONJUMP_INSN_P (trial)
1372           && (GET_CODE (pat) == USE || GET_CODE (pat) == CLOBBER))
1373         continue;
1374
1375       if (GET_CODE (next_to_match) == GET_CODE (trial)
1376 #ifdef HAVE_cc0
1377           /* We can't share an insn that sets cc0.  */
1378           && ! sets_cc0_p (pat)
1379 #endif
1380           && ! insn_references_resource_p (trial, &set, true)
1381           && ! insn_sets_resource_p (trial, &set, true)
1382           && ! insn_sets_resource_p (trial, &needed, true)
1383           && (trial = try_split (pat, trial, 0)) != 0
1384           /* Update next_trial, in case try_split succeeded.  */
1385           && (next_trial = next_nonnote_insn (trial))
1386           /* Likewise THREAD.  */
1387           && (thread = oldtrial == thread ? trial : thread)
1388           && rtx_equal_p (PATTERN (next_to_match), PATTERN (trial))
1389           /* Have to test this condition if annul condition is different
1390              from (and less restrictive than) non-annulling one.  */
1391           && eligible_for_delay (delay_insn, slot_number - 1, trial, flags))
1392         {
1393
1394           if (! annul_p)
1395             {
1396               update_block (trial, thread);
1397               if (trial == thread)
1398                 thread = next_active_insn (thread);
1399
1400               delete_related_insns (trial);
1401               INSN_FROM_TARGET_P (next_to_match) = 0;
1402             }
1403           else
1404             merged_insns = gen_rtx_INSN_LIST (VOIDmode, trial, merged_insns);
1405
1406           if (++slot_number == num_slots)
1407             break;
1408
1409           next_to_match = XVECEXP (PATTERN (insn), 0, slot_number);
1410         }
1411
1412       mark_set_resources (trial, &set, 0, MARK_SRC_DEST_CALL);
1413       mark_referenced_resources (trial, &needed, true);
1414     }
1415
1416   /* See if we stopped on a filled insn.  If we did, try to see if its
1417      delay slots match.  */
1418   if (slot_number != num_slots
1419       && trial && NONJUMP_INSN_P (trial)
1420       && GET_CODE (PATTERN (trial)) == SEQUENCE
1421       && !(JUMP_P (XVECEXP (PATTERN (trial), 0, 0))
1422            && INSN_ANNULLED_BRANCH_P (XVECEXP (PATTERN (trial), 0, 0))))
1423     {
1424       rtx_sequence *pat = as_a <rtx_sequence *> (PATTERN (trial));
1425       rtx filled_insn = XVECEXP (pat, 0, 0);
1426
1427       /* Account for resources set/needed by the filled insn.  */
1428       mark_set_resources (filled_insn, &set, 0, MARK_SRC_DEST_CALL);
1429       mark_referenced_resources (filled_insn, &needed, true);
1430
1431       for (i = 1; i < pat->len (); i++)
1432         {
1433           rtx_insn *dtrial = pat->insn (i);
1434
1435           if (! insn_references_resource_p (dtrial, &set, true)
1436               && ! insn_sets_resource_p (dtrial, &set, true)
1437               && ! insn_sets_resource_p (dtrial, &needed, true)
1438 #ifdef HAVE_cc0
1439               && ! sets_cc0_p (PATTERN (dtrial))
1440 #endif
1441               && rtx_equal_p (PATTERN (next_to_match), PATTERN (dtrial))
1442               && eligible_for_delay (delay_insn, slot_number - 1, dtrial, flags))
1443             {
1444               if (! annul_p)
1445                 {
1446                   rtx_insn *new_rtx;
1447
1448                   update_block (dtrial, thread);
1449                   new_rtx = delete_from_delay_slot (dtrial);
1450                   if (thread->deleted ())
1451                     thread = new_rtx;
1452                   INSN_FROM_TARGET_P (next_to_match) = 0;
1453                 }
1454               else
1455                 merged_insns = gen_rtx_INSN_LIST (SImode, dtrial,
1456                                                   merged_insns);
1457
1458               if (++slot_number == num_slots)
1459                 break;
1460
1461               next_to_match = XVECEXP (PATTERN (insn), 0, slot_number);
1462             }
1463           else
1464             {
1465               /* Keep track of the set/referenced resources for the delay
1466                  slots of any trial insns we encounter.  */
1467               mark_set_resources (dtrial, &set, 0, MARK_SRC_DEST_CALL);
1468               mark_referenced_resources (dtrial, &needed, true);
1469             }
1470         }
1471     }
1472
1473   /* If all insns in the delay slot have been matched and we were previously
1474      annulling the branch, we need not any more.  In that case delete all the
1475      merged insns.  Also clear the INSN_FROM_TARGET_P bit of each insn in
1476      the delay list so that we know that it isn't only being used at the
1477      target.  */
1478   if (slot_number == num_slots && annul_p)
1479     {
1480       for (; merged_insns; merged_insns = merged_insns->next ())
1481         {
1482           if (GET_MODE (merged_insns) == SImode)
1483             {
1484               rtx_insn *new_rtx;
1485
1486               update_block (merged_insns->insn (), thread);
1487               new_rtx = delete_from_delay_slot (merged_insns->insn ());
1488               if (thread->deleted ())
1489                 thread = new_rtx;
1490             }
1491           else
1492             {
1493               update_block (merged_insns->insn (), thread);
1494               delete_related_insns (merged_insns->insn ());
1495             }
1496         }
1497
1498       INSN_ANNULLED_BRANCH_P (delay_insn) = 0;
1499
1500       for (i = 0; i < XVECLEN (PATTERN (insn), 0); i++)
1501         INSN_FROM_TARGET_P (XVECEXP (PATTERN (insn), 0, i)) = 0;
1502     }
1503 }
1504 \f
1505 /* See if INSN is redundant with an insn in front of TARGET.  Often this
1506    is called when INSN is a candidate for a delay slot of TARGET.
1507    DELAY_LIST are insns that will be placed in delay slots of TARGET in front
1508    of INSN.  Often INSN will be redundant with an insn in a delay slot of
1509    some previous insn.  This happens when we have a series of branches to the
1510    same label; in that case the first insn at the target might want to go
1511    into each of the delay slots.
1512
1513    If we are not careful, this routine can take up a significant fraction
1514    of the total compilation time (4%), but only wins rarely.  Hence we
1515    speed this routine up by making two passes.  The first pass goes back
1516    until it hits a label and sees if it finds an insn with an identical
1517    pattern.  Only in this (relatively rare) event does it check for
1518    data conflicts.
1519
1520    We do not split insns we encounter.  This could cause us not to find a
1521    redundant insn, but the cost of splitting seems greater than the possible
1522    gain in rare cases.  */
1523
1524 static rtx
1525 redundant_insn (rtx insn, rtx_insn *target, rtx delay_list)
1526 {
1527   rtx target_main = target;
1528   rtx ipat = PATTERN (insn);
1529   rtx_insn *trial;
1530   rtx pat;
1531   struct resources needed, set;
1532   int i;
1533   unsigned insns_to_search;
1534
1535   /* If INSN has any REG_UNUSED notes, it can't match anything since we
1536      are allowed to not actually assign to such a register.  */
1537   if (find_reg_note (insn, REG_UNUSED, NULL_RTX) != 0)
1538     return 0;
1539
1540   /* Scan backwards looking for a match.  */
1541   for (trial = PREV_INSN (target),
1542          insns_to_search = MAX_DELAY_SLOT_INSN_SEARCH;
1543        trial && insns_to_search > 0;
1544        trial = PREV_INSN (trial))
1545     {
1546       /* (use (insn))s can come immediately after a barrier if the
1547          label that used to precede them has been deleted as dead.
1548          See delete_related_insns.  */
1549       if (LABEL_P (trial) || BARRIER_P (trial))
1550         return 0;
1551
1552       if (!INSN_P (trial))
1553         continue;
1554       --insns_to_search;
1555
1556       pat = PATTERN (trial);
1557       if (GET_CODE (pat) == USE || GET_CODE (pat) == CLOBBER)
1558         continue;
1559
1560       if (rtx_sequence *seq = dyn_cast <rtx_sequence *> (pat))
1561         {
1562           /* Stop for a CALL and its delay slots because it is difficult to
1563              track its resource needs correctly.  */
1564           if (CALL_P (seq->element (0)))
1565             return 0;
1566
1567           /* Stop for an INSN or JUMP_INSN with delayed effects and its delay
1568              slots because it is difficult to track its resource needs
1569              correctly.  */
1570
1571 #ifdef INSN_SETS_ARE_DELAYED
1572           if (INSN_SETS_ARE_DELAYED (seq->insn (0)))
1573             return 0;
1574 #endif
1575
1576 #ifdef INSN_REFERENCES_ARE_DELAYED
1577           if (INSN_REFERENCES_ARE_DELAYED (seq->insn (0)))
1578             return 0;
1579 #endif
1580
1581           /* See if any of the insns in the delay slot match, updating
1582              resource requirements as we go.  */
1583           for (i = seq->len () - 1; i > 0; i--)
1584             if (GET_CODE (seq->element (i)) == GET_CODE (insn)
1585                 && rtx_equal_p (PATTERN (seq->element (i)), ipat)
1586                 && ! find_reg_note (seq->element (i), REG_UNUSED, NULL_RTX))
1587               break;
1588
1589           /* If found a match, exit this loop early.  */
1590           if (i > 0)
1591             break;
1592         }
1593
1594       else if (GET_CODE (trial) == GET_CODE (insn) && rtx_equal_p (pat, ipat)
1595                && ! find_reg_note (trial, REG_UNUSED, NULL_RTX))
1596         break;
1597     }
1598
1599   /* If we didn't find an insn that matches, return 0.  */
1600   if (trial == 0)
1601     return 0;
1602
1603   /* See what resources this insn sets and needs.  If they overlap, or
1604      if this insn references CC0, it can't be redundant.  */
1605
1606   CLEAR_RESOURCE (&needed);
1607   CLEAR_RESOURCE (&set);
1608   mark_set_resources (insn, &set, 0, MARK_SRC_DEST_CALL);
1609   mark_referenced_resources (insn, &needed, true);
1610
1611   /* If TARGET is a SEQUENCE, get the main insn.  */
1612   if (NONJUMP_INSN_P (target) && GET_CODE (PATTERN (target)) == SEQUENCE)
1613     target_main = XVECEXP (PATTERN (target), 0, 0);
1614
1615   if (resource_conflicts_p (&needed, &set)
1616 #ifdef HAVE_cc0
1617       || reg_mentioned_p (cc0_rtx, ipat)
1618 #endif
1619       /* The insn requiring the delay may not set anything needed or set by
1620          INSN.  */
1621       || insn_sets_resource_p (target_main, &needed, true)
1622       || insn_sets_resource_p (target_main, &set, true))
1623     return 0;
1624
1625   /* Insns we pass may not set either NEEDED or SET, so merge them for
1626      simpler tests.  */
1627   needed.memory |= set.memory;
1628   IOR_HARD_REG_SET (needed.regs, set.regs);
1629
1630   /* This insn isn't redundant if it conflicts with an insn that either is
1631      or will be in a delay slot of TARGET.  */
1632
1633   while (delay_list)
1634     {
1635       if (insn_sets_resource_p (XEXP (delay_list, 0), &needed, true))
1636         return 0;
1637       delay_list = XEXP (delay_list, 1);
1638     }
1639
1640   if (NONJUMP_INSN_P (target) && GET_CODE (PATTERN (target)) == SEQUENCE)
1641     for (i = 1; i < XVECLEN (PATTERN (target), 0); i++)
1642       if (insn_sets_resource_p (XVECEXP (PATTERN (target), 0, i), &needed,
1643                                 true))
1644         return 0;
1645
1646   /* Scan backwards until we reach a label or an insn that uses something
1647      INSN sets or sets something insn uses or sets.  */
1648
1649   for (trial = PREV_INSN (target),
1650          insns_to_search = MAX_DELAY_SLOT_INSN_SEARCH;
1651        trial && !LABEL_P (trial) && insns_to_search > 0;
1652        trial = PREV_INSN (trial))
1653     {
1654       if (!INSN_P (trial))
1655         continue;
1656       --insns_to_search;
1657
1658       pat = PATTERN (trial);
1659       if (GET_CODE (pat) == USE || GET_CODE (pat) == CLOBBER)
1660         continue;
1661
1662       if (rtx_sequence *seq = dyn_cast <rtx_sequence *> (pat))
1663         {
1664           bool annul_p = false;
1665           rtx_insn *control = seq->insn (0);
1666
1667           /* If this is a CALL_INSN and its delay slots, it is hard to track
1668              the resource needs properly, so give up.  */
1669           if (CALL_P (control))
1670             return 0;
1671
1672           /* If this is an INSN or JUMP_INSN with delayed effects, it
1673              is hard to track the resource needs properly, so give up.  */
1674
1675 #ifdef INSN_SETS_ARE_DELAYED
1676           if (INSN_SETS_ARE_DELAYED (control))
1677             return 0;
1678 #endif
1679
1680 #ifdef INSN_REFERENCES_ARE_DELAYED
1681           if (INSN_REFERENCES_ARE_DELAYED (control))
1682             return 0;
1683 #endif
1684
1685           if (JUMP_P (control))
1686             annul_p = INSN_ANNULLED_BRANCH_P (control);
1687
1688           /* See if any of the insns in the delay slot match, updating
1689              resource requirements as we go.  */
1690           for (i = seq->len () - 1; i > 0; i--)
1691             {
1692               rtx candidate = seq->element (i);
1693
1694               /* If an insn will be annulled if the branch is false, it isn't
1695                  considered as a possible duplicate insn.  */
1696               if (rtx_equal_p (PATTERN (candidate), ipat)
1697                   && ! (annul_p && INSN_FROM_TARGET_P (candidate)))
1698                 {
1699                   /* Show that this insn will be used in the sequel.  */
1700                   INSN_FROM_TARGET_P (candidate) = 0;
1701                   return candidate;
1702                 }
1703
1704               /* Unless this is an annulled insn from the target of a branch,
1705                  we must stop if it sets anything needed or set by INSN.  */
1706               if ((!annul_p || !INSN_FROM_TARGET_P (candidate))
1707                   && insn_sets_resource_p (candidate, &needed, true))
1708                 return 0;
1709             }
1710
1711           /* If the insn requiring the delay slot conflicts with INSN, we
1712              must stop.  */
1713           if (insn_sets_resource_p (control, &needed, true))
1714             return 0;
1715         }
1716       else
1717         {
1718           /* See if TRIAL is the same as INSN.  */
1719           pat = PATTERN (trial);
1720           if (rtx_equal_p (pat, ipat))
1721             return trial;
1722
1723           /* Can't go any further if TRIAL conflicts with INSN.  */
1724           if (insn_sets_resource_p (trial, &needed, true))
1725             return 0;
1726         }
1727     }
1728
1729   return 0;
1730 }
1731 \f
1732 /* Return 1 if THREAD can only be executed in one way.  If LABEL is nonzero,
1733    it is the target of the branch insn being scanned.  If ALLOW_FALLTHROUGH
1734    is nonzero, we are allowed to fall into this thread; otherwise, we are
1735    not.
1736
1737    If LABEL is used more than one or we pass a label other than LABEL before
1738    finding an active insn, we do not own this thread.  */
1739
1740 static int
1741 own_thread_p (rtx thread, rtx label, int allow_fallthrough)
1742 {
1743   rtx_insn *active_insn;
1744   rtx_insn *insn;
1745
1746   /* We don't own the function end.  */
1747   if (thread == 0 || ANY_RETURN_P (thread))
1748     return 0;
1749
1750   /* We have a non-NULL insn.  */
1751   rtx_insn *thread_insn = as_a <rtx_insn *> (thread);
1752
1753   /* Get the first active insn, or THREAD_INSN, if it is an active insn.  */
1754   active_insn = next_active_insn (PREV_INSN (thread_insn));
1755
1756   for (insn = thread_insn; insn != active_insn; insn = NEXT_INSN (insn))
1757     if (LABEL_P (insn)
1758         && (insn != label || LABEL_NUSES (insn) != 1))
1759       return 0;
1760
1761   if (allow_fallthrough)
1762     return 1;
1763
1764   /* Ensure that we reach a BARRIER before any insn or label.  */
1765   for (insn = prev_nonnote_insn (thread_insn);
1766        insn == 0 || !BARRIER_P (insn);
1767        insn = prev_nonnote_insn (insn))
1768     if (insn == 0
1769         || LABEL_P (insn)
1770         || (NONJUMP_INSN_P (insn)
1771             && GET_CODE (PATTERN (insn)) != USE
1772             && GET_CODE (PATTERN (insn)) != CLOBBER))
1773       return 0;
1774
1775   return 1;
1776 }
1777 \f
1778 /* Called when INSN is being moved from a location near the target of a jump.
1779    We leave a marker of the form (use (INSN)) immediately in front
1780    of WHERE for mark_target_live_regs.  These markers will be deleted when
1781    reorg finishes.
1782
1783    We used to try to update the live status of registers if WHERE is at
1784    the start of a basic block, but that can't work since we may remove a
1785    BARRIER in relax_delay_slots.  */
1786
1787 static void
1788 update_block (rtx_insn *insn, rtx where)
1789 {
1790   /* Ignore if this was in a delay slot and it came from the target of
1791      a branch.  */
1792   if (INSN_FROM_TARGET_P (insn))
1793     return;
1794
1795   emit_insn_before (gen_rtx_USE (VOIDmode, insn), where);
1796
1797   /* INSN might be making a value live in a block where it didn't use to
1798      be.  So recompute liveness information for this block.  */
1799
1800   incr_ticks_for_insn (insn);
1801 }
1802
1803 /* Similar to REDIRECT_JUMP except that we update the BB_TICKS entry for
1804    the basic block containing the jump.  */
1805
1806 static int
1807 reorg_redirect_jump (rtx_insn *jump, rtx nlabel)
1808 {
1809   incr_ticks_for_insn (jump);
1810   return redirect_jump (jump, nlabel, 1);
1811 }
1812
1813 /* Called when INSN is being moved forward into a delay slot of DELAYED_INSN.
1814    We check every instruction between INSN and DELAYED_INSN for REG_DEAD notes
1815    that reference values used in INSN.  If we find one, then we move the
1816    REG_DEAD note to INSN.
1817
1818    This is needed to handle the case where a later insn (after INSN) has a
1819    REG_DEAD note for a register used by INSN, and this later insn subsequently
1820    gets moved before a CODE_LABEL because it is a redundant insn.  In this
1821    case, mark_target_live_regs may be confused into thinking the register
1822    is dead because it sees a REG_DEAD note immediately before a CODE_LABEL.  */
1823
1824 static void
1825 update_reg_dead_notes (rtx insn, rtx delayed_insn)
1826 {
1827   rtx p, link, next;
1828
1829   for (p = next_nonnote_insn (insn); p != delayed_insn;
1830        p = next_nonnote_insn (p))
1831     for (link = REG_NOTES (p); link; link = next)
1832       {
1833         next = XEXP (link, 1);
1834
1835         if (REG_NOTE_KIND (link) != REG_DEAD
1836             || !REG_P (XEXP (link, 0)))
1837           continue;
1838
1839         if (reg_referenced_p (XEXP (link, 0), PATTERN (insn)))
1840           {
1841             /* Move the REG_DEAD note from P to INSN.  */
1842             remove_note (p, link);
1843             XEXP (link, 1) = REG_NOTES (insn);
1844             REG_NOTES (insn) = link;
1845           }
1846       }
1847 }
1848
1849 /* Called when an insn redundant with start_insn is deleted.  If there
1850    is a REG_DEAD note for the target of start_insn between start_insn
1851    and stop_insn, then the REG_DEAD note needs to be deleted since the
1852    value no longer dies there.
1853
1854    If the REG_DEAD note isn't deleted, then mark_target_live_regs may be
1855    confused into thinking the register is dead.  */
1856
1857 static void
1858 fix_reg_dead_note (rtx start_insn, rtx stop_insn)
1859 {
1860   rtx p, link, next;
1861
1862   for (p = next_nonnote_insn (start_insn); p != stop_insn;
1863        p = next_nonnote_insn (p))
1864     for (link = REG_NOTES (p); link; link = next)
1865       {
1866         next = XEXP (link, 1);
1867
1868         if (REG_NOTE_KIND (link) != REG_DEAD
1869             || !REG_P (XEXP (link, 0)))
1870           continue;
1871
1872         if (reg_set_p (XEXP (link, 0), PATTERN (start_insn)))
1873           {
1874             remove_note (p, link);
1875             return;
1876           }
1877       }
1878 }
1879
1880 /* Delete any REG_UNUSED notes that exist on INSN but not on REDUNDANT_INSN.
1881
1882    This handles the case of udivmodXi4 instructions which optimize their
1883    output depending on whether any REG_UNUSED notes are present.
1884    we must make sure that INSN calculates as many results as REDUNDANT_INSN
1885    does.  */
1886
1887 static void
1888 update_reg_unused_notes (rtx insn, rtx redundant_insn)
1889 {
1890   rtx link, next;
1891
1892   for (link = REG_NOTES (insn); link; link = next)
1893     {
1894       next = XEXP (link, 1);
1895
1896       if (REG_NOTE_KIND (link) != REG_UNUSED
1897           || !REG_P (XEXP (link, 0)))
1898         continue;
1899
1900       if (! find_regno_note (redundant_insn, REG_UNUSED,
1901                              REGNO (XEXP (link, 0))))
1902         remove_note (insn, link);
1903     }
1904 }
1905 \f
1906 static vec <rtx> sibling_labels;
1907
1908 /* Return the label before INSN, or put a new label there.  If SIBLING is
1909    non-zero, it is another label associated with the new label (if any),
1910    typically the former target of the jump that will be redirected to
1911    the new label.  */
1912
1913 static rtx_insn *
1914 get_label_before (rtx_insn *insn, rtx sibling)
1915 {
1916   rtx_insn *label;
1917
1918   /* Find an existing label at this point
1919      or make a new one if there is none.  */
1920   label = prev_nonnote_insn (insn);
1921
1922   if (label == 0 || !LABEL_P (label))
1923     {
1924       rtx_insn *prev = PREV_INSN (insn);
1925
1926       label = gen_label_rtx ();
1927       emit_label_after (label, prev);
1928       LABEL_NUSES (label) = 0;
1929       if (sibling)
1930         {
1931           sibling_labels.safe_push (label);
1932           sibling_labels.safe_push (sibling);
1933         }
1934     }
1935   return label;
1936 }
1937
1938 /* Scan a function looking for insns that need a delay slot and find insns to
1939    put into the delay slot.
1940
1941    NON_JUMPS_P is nonzero if we are to only try to fill non-jump insns (such
1942    as calls).  We do these first since we don't want jump insns (that are
1943    easier to fill) to get the only insns that could be used for non-jump insns.
1944    When it is zero, only try to fill JUMP_INSNs.
1945
1946    When slots are filled in this manner, the insns (including the
1947    delay_insn) are put together in a SEQUENCE rtx.  In this fashion,
1948    it is possible to tell whether a delay slot has really been filled
1949    or not.  `final' knows how to deal with this, by communicating
1950    through FINAL_SEQUENCE.  */
1951
1952 static void
1953 fill_simple_delay_slots (int non_jumps_p)
1954 {
1955   rtx_insn *insn, *trial, *next_trial;
1956   rtx pat;
1957   int i;
1958   int num_unfilled_slots = unfilled_slots_next - unfilled_slots_base;
1959   struct resources needed, set;
1960   int slots_to_fill, slots_filled;
1961   rtx_insn_list *delay_list;
1962
1963   for (i = 0; i < num_unfilled_slots; i++)
1964     {
1965       int flags;
1966       /* Get the next insn to fill.  If it has already had any slots assigned,
1967          we can't do anything with it.  Maybe we'll improve this later.  */
1968
1969       insn = unfilled_slots_base[i];
1970       if (insn == 0
1971           || insn->deleted ()
1972           || (NONJUMP_INSN_P (insn)
1973               && GET_CODE (PATTERN (insn)) == SEQUENCE)
1974           || (JUMP_P (insn) && non_jumps_p)
1975           || (!JUMP_P (insn) && ! non_jumps_p))
1976         continue;
1977
1978       /* It may have been that this insn used to need delay slots, but
1979          now doesn't; ignore in that case.  This can happen, for example,
1980          on the HP PA RISC, where the number of delay slots depends on
1981          what insns are nearby.  */
1982       slots_to_fill = num_delay_slots (insn);
1983
1984       /* Some machine description have defined instructions to have
1985          delay slots only in certain circumstances which may depend on
1986          nearby insns (which change due to reorg's actions).
1987
1988          For example, the PA port normally has delay slots for unconditional
1989          jumps.
1990
1991          However, the PA port claims such jumps do not have a delay slot
1992          if they are immediate successors of certain CALL_INSNs.  This
1993          allows the port to favor filling the delay slot of the call with
1994          the unconditional jump.  */
1995       if (slots_to_fill == 0)
1996         continue;
1997
1998       /* This insn needs, or can use, some delay slots.  SLOTS_TO_FILL
1999          says how many.  After initialization, first try optimizing
2000
2001          call _foo              call _foo
2002          nop                    add %o7,.-L1,%o7
2003          b,a L1
2004          nop
2005
2006          If this case applies, the delay slot of the call is filled with
2007          the unconditional jump.  This is done first to avoid having the
2008          delay slot of the call filled in the backward scan.  Also, since
2009          the unconditional jump is likely to also have a delay slot, that
2010          insn must exist when it is subsequently scanned.
2011
2012          This is tried on each insn with delay slots as some machines
2013          have insns which perform calls, but are not represented as
2014          CALL_INSNs.  */
2015
2016       slots_filled = 0;
2017       delay_list = 0;
2018
2019       if (JUMP_P (insn))
2020         flags = get_jump_flags (insn, JUMP_LABEL (insn));
2021       else
2022         flags = get_jump_flags (insn, NULL_RTX);
2023
2024       if ((trial = next_active_insn (insn))
2025           && JUMP_P (trial)
2026           && simplejump_p (trial)
2027           && eligible_for_delay (insn, slots_filled, trial, flags)
2028           && no_labels_between_p (insn, trial)
2029           && ! can_throw_internal (trial))
2030         {
2031           rtx_insn **tmp;
2032           slots_filled++;
2033           delay_list = add_to_delay_list (trial, delay_list);
2034
2035           /* TRIAL may have had its delay slot filled, then unfilled.  When
2036              the delay slot is unfilled, TRIAL is placed back on the unfilled
2037              slots obstack.  Unfortunately, it is placed on the end of the
2038              obstack, not in its original location.  Therefore, we must search
2039              from entry i + 1 to the end of the unfilled slots obstack to
2040              try and find TRIAL.  */
2041           tmp = &unfilled_slots_base[i + 1];
2042           while (*tmp != trial && tmp != unfilled_slots_next)
2043             tmp++;
2044
2045           /* Remove the unconditional jump from consideration for delay slot
2046              filling and unthread it.  */
2047           if (*tmp == trial)
2048             *tmp = 0;
2049           {
2050             rtx_insn *next = NEXT_INSN (trial);
2051             rtx_insn *prev = PREV_INSN (trial);
2052             if (prev)
2053               SET_NEXT_INSN (prev) = next;
2054             if (next)
2055               SET_PREV_INSN (next) = prev;
2056           }
2057         }
2058
2059       /* Now, scan backwards from the insn to search for a potential
2060          delay-slot candidate.  Stop searching when a label or jump is hit.
2061
2062          For each candidate, if it is to go into the delay slot (moved
2063          forward in execution sequence), it must not need or set any resources
2064          that were set by later insns and must not set any resources that
2065          are needed for those insns.
2066
2067          The delay slot insn itself sets resources unless it is a call
2068          (in which case the called routine, not the insn itself, is doing
2069          the setting).  */
2070
2071       if (slots_filled < slots_to_fill)
2072         {
2073           /* If the flags register is dead after the insn, then we want to be
2074              able to accept a candidate that clobbers it.  For this purpose,
2075              we need to filter the flags register during life analysis, so
2076              that it doesn't create RAW and WAW dependencies, while still
2077              creating the necessary WAR dependencies.  */
2078           bool filter_flags
2079             = (slots_to_fill == 1
2080                && targetm.flags_regnum != INVALID_REGNUM
2081                && find_regno_note (insn, REG_DEAD, targetm.flags_regnum));
2082           struct resources fset;
2083           CLEAR_RESOURCE (&needed);
2084           CLEAR_RESOURCE (&set);
2085           mark_set_resources (insn, &set, 0, MARK_SRC_DEST);
2086           if (filter_flags)
2087             {
2088               CLEAR_RESOURCE (&fset);
2089               mark_set_resources (insn, &fset, 0, MARK_SRC_DEST);
2090             }
2091           mark_referenced_resources (insn, &needed, false);
2092
2093           for (trial = prev_nonnote_insn (insn); ! stop_search_p (trial, 1);
2094                trial = next_trial)
2095             {
2096               next_trial = prev_nonnote_insn (trial);
2097
2098               /* This must be an INSN or CALL_INSN.  */
2099               pat = PATTERN (trial);
2100
2101               /* Stand-alone USE and CLOBBER are just for flow.  */
2102               if (GET_CODE (pat) == USE || GET_CODE (pat) == CLOBBER)
2103                 continue;
2104
2105               /* Check for resource conflict first, to avoid unnecessary
2106                  splitting.  */
2107               if (! insn_references_resource_p (trial, &set, true)
2108                   && ! insn_sets_resource_p (trial,
2109                                              filter_flags ? &fset : &set,
2110                                              true)
2111                   && ! insn_sets_resource_p (trial, &needed, true)
2112 #ifdef HAVE_cc0
2113                   /* Can't separate set of cc0 from its use.  */
2114                   && ! (reg_mentioned_p (cc0_rtx, pat) && ! sets_cc0_p (pat))
2115 #endif
2116                   && ! can_throw_internal (trial))
2117                 {
2118                   trial = try_split (pat, trial, 1);
2119                   next_trial = prev_nonnote_insn (trial);
2120                   if (eligible_for_delay (insn, slots_filled, trial, flags))
2121                     {
2122                       /* In this case, we are searching backward, so if we
2123                          find insns to put on the delay list, we want
2124                          to put them at the head, rather than the
2125                          tail, of the list.  */
2126
2127                       update_reg_dead_notes (trial, insn);
2128                       delay_list = gen_rtx_INSN_LIST (VOIDmode,
2129                                                       trial, delay_list);
2130                       update_block (trial, trial);
2131                       delete_related_insns (trial);
2132                       if (slots_to_fill == ++slots_filled)
2133                         break;
2134                       continue;
2135                     }
2136                 }
2137
2138               mark_set_resources (trial, &set, 0, MARK_SRC_DEST_CALL);
2139               if (filter_flags)
2140                 {
2141                   mark_set_resources (trial, &fset, 0, MARK_SRC_DEST_CALL);
2142                   /* If the flags register is set, then it doesn't create RAW
2143                      dependencies any longer and it also doesn't create WAW
2144                      dependencies since it's dead after the original insn.  */
2145                   if (TEST_HARD_REG_BIT (fset.regs, targetm.flags_regnum))
2146                     {
2147                       CLEAR_HARD_REG_BIT (needed.regs, targetm.flags_regnum);
2148                       CLEAR_HARD_REG_BIT (fset.regs, targetm.flags_regnum);
2149                     }
2150                 }
2151               mark_referenced_resources (trial, &needed, true);
2152             }
2153         }
2154
2155       /* If all needed slots haven't been filled, we come here.  */
2156
2157       /* Try to optimize case of jumping around a single insn.  */
2158 #if defined(ANNUL_IFFALSE_SLOTS) || defined(ANNUL_IFTRUE_SLOTS)
2159       if (slots_filled != slots_to_fill
2160           && delay_list == 0
2161           && JUMP_P (insn)
2162           && (condjump_p (insn) || condjump_in_parallel_p (insn))
2163           && !ANY_RETURN_P (JUMP_LABEL (insn)))
2164         {
2165           delay_list = optimize_skip (insn);
2166           if (delay_list)
2167             slots_filled += 1;
2168         }
2169 #endif
2170
2171       /* Try to get insns from beyond the insn needing the delay slot.
2172          These insns can neither set or reference resources set in insns being
2173          skipped, cannot set resources in the insn being skipped, and, if this
2174          is a CALL_INSN (or a CALL_INSN is passed), cannot trap (because the
2175          call might not return).
2176
2177          There used to be code which continued past the target label if
2178          we saw all uses of the target label.  This code did not work,
2179          because it failed to account for some instructions which were
2180          both annulled and marked as from the target.  This can happen as a
2181          result of optimize_skip.  Since this code was redundant with
2182          fill_eager_delay_slots anyways, it was just deleted.  */
2183
2184       if (slots_filled != slots_to_fill
2185           /* If this instruction could throw an exception which is
2186              caught in the same function, then it's not safe to fill
2187              the delay slot with an instruction from beyond this
2188              point.  For example, consider:
2189
2190                int i = 2;
2191
2192                try {
2193                  f();
2194                  i = 3;
2195                } catch (...) {}
2196
2197                return i;
2198
2199              Even though `i' is a local variable, we must be sure not
2200              to put `i = 3' in the delay slot if `f' might throw an
2201              exception.
2202
2203              Presumably, we should also check to see if we could get
2204              back to this function via `setjmp'.  */
2205           && ! can_throw_internal (insn)
2206           && !JUMP_P (insn))
2207         {
2208           int maybe_never = 0;
2209           rtx pat, trial_delay;
2210
2211           CLEAR_RESOURCE (&needed);
2212           CLEAR_RESOURCE (&set);
2213           mark_set_resources (insn, &set, 0, MARK_SRC_DEST_CALL);
2214           mark_referenced_resources (insn, &needed, true);
2215
2216           if (CALL_P (insn))
2217             maybe_never = 1;
2218
2219           for (trial = next_nonnote_insn (insn); !stop_search_p (trial, 1);
2220                trial = next_trial)
2221             {
2222               next_trial = next_nonnote_insn (trial);
2223
2224               /* This must be an INSN or CALL_INSN.  */
2225               pat = PATTERN (trial);
2226
2227               /* Stand-alone USE and CLOBBER are just for flow.  */
2228               if (GET_CODE (pat) == USE || GET_CODE (pat) == CLOBBER)
2229                 continue;
2230
2231               /* If this already has filled delay slots, get the insn needing
2232                  the delay slots.  */
2233               if (GET_CODE (pat) == SEQUENCE)
2234                 trial_delay = XVECEXP (pat, 0, 0);
2235               else
2236                 trial_delay = trial;
2237
2238               /* Stop our search when seeing a jump.  */
2239               if (JUMP_P (trial_delay))
2240                 break;
2241
2242               /* See if we have a resource problem before we try to split.  */
2243               if (GET_CODE (pat) != SEQUENCE
2244                   && ! insn_references_resource_p (trial, &set, true)
2245                   && ! insn_sets_resource_p (trial, &set, true)
2246                   && ! insn_sets_resource_p (trial, &needed, true)
2247 #ifdef HAVE_cc0
2248                   && ! (reg_mentioned_p (cc0_rtx, pat) && ! sets_cc0_p (pat))
2249 #endif
2250                   && ! (maybe_never && may_trap_or_fault_p (pat))
2251                   && (trial = try_split (pat, trial, 0))
2252                   && eligible_for_delay (insn, slots_filled, trial, flags)
2253                   && ! can_throw_internal (trial))
2254                 {
2255                   next_trial = next_nonnote_insn (trial);
2256                   delay_list = add_to_delay_list (trial, delay_list);
2257 #ifdef HAVE_cc0
2258                   if (reg_mentioned_p (cc0_rtx, pat))
2259                     link_cc0_insns (trial);
2260 #endif
2261                   delete_related_insns (trial);
2262                   if (slots_to_fill == ++slots_filled)
2263                     break;
2264                   continue;
2265                 }
2266
2267               mark_set_resources (trial, &set, 0, MARK_SRC_DEST_CALL);
2268               mark_referenced_resources (trial, &needed, true);
2269
2270               /* Ensure we don't put insns between the setting of cc and the
2271                  comparison by moving a setting of cc into an earlier delay
2272                  slot since these insns could clobber the condition code.  */
2273               set.cc = 1;
2274
2275               /* If this is a call, we might not get here.  */
2276               if (CALL_P (trial_delay))
2277                 maybe_never = 1;
2278             }
2279
2280           /* If there are slots left to fill and our search was stopped by an
2281              unconditional branch, try the insn at the branch target.  We can
2282              redirect the branch if it works.
2283
2284              Don't do this if the insn at the branch target is a branch.  */
2285           if (slots_to_fill != slots_filled
2286               && trial
2287               && jump_to_label_p (trial)
2288               && simplejump_p (trial)
2289               && (next_trial = next_active_insn (JUMP_LABEL (trial))) != 0
2290               && ! (NONJUMP_INSN_P (next_trial)
2291                     && GET_CODE (PATTERN (next_trial)) == SEQUENCE)
2292               && !JUMP_P (next_trial)
2293               && ! insn_references_resource_p (next_trial, &set, true)
2294               && ! insn_sets_resource_p (next_trial, &set, true)
2295               && ! insn_sets_resource_p (next_trial, &needed, true)
2296 #ifdef HAVE_cc0
2297               && ! reg_mentioned_p (cc0_rtx, PATTERN (next_trial))
2298 #endif
2299               && ! (maybe_never && may_trap_or_fault_p (PATTERN (next_trial)))
2300               && (next_trial = try_split (PATTERN (next_trial), next_trial, 0))
2301               && eligible_for_delay (insn, slots_filled, next_trial, flags)
2302               && ! can_throw_internal (trial))
2303             {
2304               /* See comment in relax_delay_slots about necessity of using
2305                  next_real_insn here.  */
2306               rtx_insn *new_label = next_real_insn (next_trial);
2307
2308               if (new_label != 0)
2309                 new_label = get_label_before (new_label, JUMP_LABEL (trial));
2310               else
2311                 new_label = find_end_label (simple_return_rtx);
2312
2313               if (new_label)
2314                 {
2315                   delay_list
2316                     = add_to_delay_list (copy_delay_slot_insn (next_trial),
2317                                          delay_list);
2318                   slots_filled++;
2319                   reorg_redirect_jump (trial, new_label);
2320                 }
2321             }
2322         }
2323
2324       /* If this is an unconditional jump, then try to get insns from the
2325          target of the jump.  */
2326       if (JUMP_P (insn)
2327           && simplejump_p (insn)
2328           && slots_filled != slots_to_fill)
2329         delay_list
2330           = fill_slots_from_thread (insn, const_true_rtx,
2331                                     next_active_insn (JUMP_LABEL (insn)),
2332                                     NULL, 1, 1,
2333                                     own_thread_p (JUMP_LABEL (insn),
2334                                                   JUMP_LABEL (insn), 0),
2335                                     slots_to_fill, &slots_filled,
2336                                     delay_list);
2337
2338       if (delay_list)
2339         unfilled_slots_base[i]
2340           = emit_delay_sequence (insn, delay_list, slots_filled);
2341
2342       if (slots_to_fill == slots_filled)
2343         unfilled_slots_base[i] = 0;
2344
2345       note_delay_statistics (slots_filled, 0);
2346     }
2347 }
2348 \f
2349 /* Follow any unconditional jump at LABEL, for the purpose of redirecting JUMP;
2350    return the ultimate label reached by any such chain of jumps.
2351    Return a suitable return rtx if the chain ultimately leads to a
2352    return instruction.
2353    If LABEL is not followed by a jump, return LABEL.
2354    If the chain loops or we can't find end, return LABEL,
2355    since that tells caller to avoid changing the insn.
2356    If the returned label is obtained by following a crossing jump,
2357    set *CROSSING to true, otherwise set it to false.  */
2358
2359 static rtx
2360 follow_jumps (rtx label, rtx_insn *jump, bool *crossing)
2361 {
2362   rtx_insn *insn;
2363   rtx_insn *next;
2364   int depth;
2365
2366   *crossing = false;
2367   if (ANY_RETURN_P (label))
2368     return label;
2369
2370   rtx_insn *value = as_a <rtx_insn *> (label);
2371
2372   for (depth = 0;
2373        (depth < 10
2374         && (insn = next_active_insn (value)) != 0
2375         && JUMP_P (insn)
2376         && JUMP_LABEL (insn) != NULL_RTX
2377         && ((any_uncondjump_p (insn) && onlyjump_p (insn))
2378             || ANY_RETURN_P (PATTERN (insn)))
2379         && (next = NEXT_INSN (insn))
2380         && BARRIER_P (next));
2381        depth++)
2382     {
2383       rtx this_label_or_return = JUMP_LABEL (insn);
2384
2385       /* If we have found a cycle, make the insn jump to itself.  */
2386       if (this_label_or_return == label)
2387         return label;
2388
2389       /* Cannot follow returns and cannot look through tablejumps.  */
2390       if (ANY_RETURN_P (this_label_or_return))
2391         return this_label_or_return;
2392
2393       rtx_insn *this_label = as_a <rtx_insn *> (this_label_or_return);
2394       if (NEXT_INSN (this_label)
2395           && JUMP_TABLE_DATA_P (NEXT_INSN (this_label)))
2396         break;
2397
2398       if (!targetm.can_follow_jump (jump, insn))
2399         break;
2400       if (!*crossing)
2401         *crossing = CROSSING_JUMP_P (jump);
2402       value = this_label;
2403     }
2404   if (depth == 10)
2405     return label;
2406   return value;
2407 }
2408
2409 /* Try to find insns to place in delay slots.
2410
2411    INSN is the jump needing SLOTS_TO_FILL delay slots.  It tests CONDITION
2412    or is an unconditional branch if CONDITION is const_true_rtx.
2413    *PSLOTS_FILLED is updated with the number of slots that we have filled.
2414
2415    THREAD is a flow-of-control, either the insns to be executed if the
2416    branch is true or if the branch is false, THREAD_IF_TRUE says which.
2417
2418    OPPOSITE_THREAD is the thread in the opposite direction.  It is used
2419    to see if any potential delay slot insns set things needed there.
2420
2421    LIKELY is nonzero if it is extremely likely that the branch will be
2422    taken and THREAD_IF_TRUE is set.  This is used for the branch at the
2423    end of a loop back up to the top.
2424
2425    OWN_THREAD and OWN_OPPOSITE_THREAD are true if we are the only user of the
2426    thread.  I.e., it is the fallthrough code of our jump or the target of the
2427    jump when we are the only jump going there.
2428
2429    If OWN_THREAD is false, it must be the "true" thread of a jump.  In that
2430    case, we can only take insns from the head of the thread for our delay
2431    slot.  We then adjust the jump to point after the insns we have taken.  */
2432
2433 static rtx_insn_list *
2434 fill_slots_from_thread (rtx_insn *insn, rtx condition, rtx thread_or_return,
2435                         rtx opposite_thread, int likely,
2436                         int thread_if_true,
2437                         int own_thread, int slots_to_fill,
2438                         int *pslots_filled, rtx_insn_list *delay_list)
2439 {
2440   rtx new_thread;
2441   struct resources opposite_needed, set, needed;
2442   rtx_insn *trial;
2443   int lose = 0;
2444   int must_annul = 0;
2445   int flags;
2446
2447   /* Validate our arguments.  */
2448   gcc_assert (condition != const_true_rtx || thread_if_true);
2449   gcc_assert (own_thread || thread_if_true);
2450
2451   flags = get_jump_flags (insn, JUMP_LABEL (insn));
2452
2453   /* If our thread is the end of subroutine, we can't get any delay
2454      insns from that.  */
2455   if (thread_or_return == NULL_RTX || ANY_RETURN_P (thread_or_return))
2456     return delay_list;
2457
2458   rtx_insn *thread = as_a <rtx_insn *> (thread_or_return);
2459
2460   /* If this is an unconditional branch, nothing is needed at the
2461      opposite thread.  Otherwise, compute what is needed there.  */
2462   if (condition == const_true_rtx)
2463     CLEAR_RESOURCE (&opposite_needed);
2464   else
2465     mark_target_live_regs (get_insns (), opposite_thread, &opposite_needed);
2466
2467   /* If the insn at THREAD can be split, do it here to avoid having to
2468      update THREAD and NEW_THREAD if it is done in the loop below.  Also
2469      initialize NEW_THREAD.  */
2470
2471   new_thread = thread = try_split (PATTERN (thread), thread, 0);
2472
2473   /* Scan insns at THREAD.  We are looking for an insn that can be removed
2474      from THREAD (it neither sets nor references resources that were set
2475      ahead of it and it doesn't set anything needs by the insns ahead of
2476      it) and that either can be placed in an annulling insn or aren't
2477      needed at OPPOSITE_THREAD.  */
2478
2479   CLEAR_RESOURCE (&needed);
2480   CLEAR_RESOURCE (&set);
2481
2482   /* If we do not own this thread, we must stop as soon as we find
2483      something that we can't put in a delay slot, since all we can do
2484      is branch into THREAD at a later point.  Therefore, labels stop
2485      the search if this is not the `true' thread.  */
2486
2487   for (trial = thread;
2488        ! stop_search_p (trial, ! thread_if_true) && (! lose || own_thread);
2489        trial = next_nonnote_insn (trial))
2490     {
2491       rtx pat, old_trial;
2492
2493       /* If we have passed a label, we no longer own this thread.  */
2494       if (LABEL_P (trial))
2495         {
2496           own_thread = 0;
2497           continue;
2498         }
2499
2500       pat = PATTERN (trial);
2501       if (GET_CODE (pat) == USE || GET_CODE (pat) == CLOBBER)
2502         continue;
2503
2504       /* If TRIAL conflicts with the insns ahead of it, we lose.  Also,
2505          don't separate or copy insns that set and use CC0.  */
2506       if (! insn_references_resource_p (trial, &set, true)
2507           && ! insn_sets_resource_p (trial, &set, true)
2508           && ! insn_sets_resource_p (trial, &needed, true)
2509 #ifdef HAVE_cc0
2510           && ! (reg_mentioned_p (cc0_rtx, pat)
2511                 && (! own_thread || ! sets_cc0_p (pat)))
2512 #endif
2513           && ! can_throw_internal (trial))
2514         {
2515           rtx prior_insn;
2516
2517           /* If TRIAL is redundant with some insn before INSN, we don't
2518              actually need to add it to the delay list; we can merely pretend
2519              we did.  */
2520           if ((prior_insn = redundant_insn (trial, insn, delay_list)))
2521             {
2522               fix_reg_dead_note (prior_insn, insn);
2523               if (own_thread)
2524                 {
2525                   update_block (trial, thread);
2526                   if (trial == thread)
2527                     {
2528                       thread = next_active_insn (thread);
2529                       if (new_thread == trial)
2530                         new_thread = thread;
2531                     }
2532
2533                   delete_related_insns (trial);
2534                 }
2535               else
2536                 {
2537                   update_reg_unused_notes (prior_insn, trial);
2538                   new_thread = next_active_insn (trial);
2539                 }
2540
2541               continue;
2542             }
2543
2544           /* There are two ways we can win:  If TRIAL doesn't set anything
2545              needed at the opposite thread and can't trap, or if it can
2546              go into an annulled delay slot.  But we want neither to copy
2547              nor to speculate frame-related insns.  */
2548           if (!must_annul
2549               && ((condition == const_true_rtx
2550                    && (own_thread || !RTX_FRAME_RELATED_P (trial)))
2551                   || (! insn_sets_resource_p (trial, &opposite_needed, true)
2552                       && ! may_trap_or_fault_p (pat)
2553                       && ! RTX_FRAME_RELATED_P (trial))))
2554             {
2555               old_trial = trial;
2556               trial = try_split (pat, trial, 0);
2557               if (new_thread == old_trial)
2558                 new_thread = trial;
2559               if (thread == old_trial)
2560                 thread = trial;
2561               pat = PATTERN (trial);
2562               if (eligible_for_delay (insn, *pslots_filled, trial, flags))
2563                 goto winner;
2564             }
2565           else if (0
2566 #ifdef ANNUL_IFTRUE_SLOTS
2567                    || ! thread_if_true
2568 #endif
2569 #ifdef ANNUL_IFFALSE_SLOTS
2570                    || thread_if_true
2571 #endif
2572                    )
2573             {
2574               old_trial = trial;
2575               trial = try_split (pat, trial, 0);
2576               if (new_thread == old_trial)
2577                 new_thread = trial;
2578               if (thread == old_trial)
2579                 thread = trial;
2580               pat = PATTERN (trial);
2581               if ((must_annul || delay_list == NULL) && (thread_if_true
2582                    ? check_annul_list_true_false (0, delay_list)
2583                      && eligible_for_annul_false (insn, *pslots_filled, trial, flags)
2584                    : check_annul_list_true_false (1, delay_list)
2585                      && eligible_for_annul_true (insn, *pslots_filled, trial, flags)))
2586                 {
2587                   rtx_insn *temp;
2588
2589                   must_annul = 1;
2590                 winner:
2591
2592 #ifdef HAVE_cc0
2593                   if (reg_mentioned_p (cc0_rtx, pat))
2594                     link_cc0_insns (trial);
2595 #endif
2596
2597                   /* If we own this thread, delete the insn.  If this is the
2598                      destination of a branch, show that a basic block status
2599                      may have been updated.  In any case, mark the new
2600                      starting point of this thread.  */
2601                   if (own_thread)
2602                     {
2603                       rtx note;
2604
2605                       update_block (trial, thread);
2606                       if (trial == thread)
2607                         {
2608                           thread = next_active_insn (thread);
2609                           if (new_thread == trial)
2610                             new_thread = thread;
2611                         }
2612
2613                       /* We are moving this insn, not deleting it.  We must
2614                          temporarily increment the use count on any referenced
2615                          label lest it be deleted by delete_related_insns.  */
2616                       for (note = REG_NOTES (trial);
2617                            note != NULL_RTX;
2618                            note = XEXP (note, 1))
2619                         if (REG_NOTE_KIND (note) == REG_LABEL_OPERAND
2620                             || REG_NOTE_KIND (note) == REG_LABEL_TARGET)
2621                           {
2622                             /* REG_LABEL_OPERAND could be
2623                                NOTE_INSN_DELETED_LABEL too.  */
2624                             if (LABEL_P (XEXP (note, 0)))
2625                               LABEL_NUSES (XEXP (note, 0))++;
2626                             else
2627                               gcc_assert (REG_NOTE_KIND (note)
2628                                           == REG_LABEL_OPERAND);
2629                           }
2630                       if (jump_to_label_p (trial))
2631                         LABEL_NUSES (JUMP_LABEL (trial))++;
2632
2633                       delete_related_insns (trial);
2634
2635                       for (note = REG_NOTES (trial);
2636                            note != NULL_RTX;
2637                            note = XEXP (note, 1))
2638                         if (REG_NOTE_KIND (note) == REG_LABEL_OPERAND
2639                             || REG_NOTE_KIND (note) == REG_LABEL_TARGET)
2640                           {
2641                             /* REG_LABEL_OPERAND could be
2642                                NOTE_INSN_DELETED_LABEL too.  */
2643                             if (LABEL_P (XEXP (note, 0)))
2644                               LABEL_NUSES (XEXP (note, 0))--;
2645                             else
2646                               gcc_assert (REG_NOTE_KIND (note)
2647                                           == REG_LABEL_OPERAND);
2648                           }
2649                       if (jump_to_label_p (trial))
2650                         LABEL_NUSES (JUMP_LABEL (trial))--;
2651                     }
2652                   else
2653                     new_thread = next_active_insn (trial);
2654
2655                   temp = own_thread ? trial : copy_delay_slot_insn (trial);
2656                   if (thread_if_true)
2657                     INSN_FROM_TARGET_P (temp) = 1;
2658
2659                   delay_list = add_to_delay_list (temp, delay_list);
2660
2661                   if (slots_to_fill == ++(*pslots_filled))
2662                     {
2663                       /* Even though we have filled all the slots, we
2664                          may be branching to a location that has a
2665                          redundant insn.  Skip any if so.  */
2666                       while (new_thread && ! own_thread
2667                              && ! insn_sets_resource_p (new_thread, &set, true)
2668                              && ! insn_sets_resource_p (new_thread, &needed,
2669                                                         true)
2670                              && ! insn_references_resource_p (new_thread,
2671                                                               &set, true)
2672                              && (prior_insn
2673                                  = redundant_insn (new_thread, insn,
2674                                                    delay_list)))
2675                         {
2676                           /* We know we do not own the thread, so no need
2677                              to call update_block and delete_insn.  */
2678                           fix_reg_dead_note (prior_insn, insn);
2679                           update_reg_unused_notes (prior_insn, new_thread);
2680                           new_thread = next_active_insn (new_thread);
2681                         }
2682                       break;
2683                     }
2684
2685                   continue;
2686                 }
2687             }
2688         }
2689
2690       /* This insn can't go into a delay slot.  */
2691       lose = 1;
2692       mark_set_resources (trial, &set, 0, MARK_SRC_DEST_CALL);
2693       mark_referenced_resources (trial, &needed, true);
2694
2695       /* Ensure we don't put insns between the setting of cc and the comparison
2696          by moving a setting of cc into an earlier delay slot since these insns
2697          could clobber the condition code.  */
2698       set.cc = 1;
2699
2700       /* If this insn is a register-register copy and the next insn has
2701          a use of our destination, change it to use our source.  That way,
2702          it will become a candidate for our delay slot the next time
2703          through this loop.  This case occurs commonly in loops that
2704          scan a list.
2705
2706          We could check for more complex cases than those tested below,
2707          but it doesn't seem worth it.  It might also be a good idea to try
2708          to swap the two insns.  That might do better.
2709
2710          We can't do this if the next insn modifies our destination, because
2711          that would make the replacement into the insn invalid.  We also can't
2712          do this if it modifies our source, because it might be an earlyclobber
2713          operand.  This latter test also prevents updating the contents of
2714          a PRE_INC.  We also can't do this if there's overlap of source and
2715          destination.  Overlap may happen for larger-than-register-size modes.  */
2716
2717       if (NONJUMP_INSN_P (trial) && GET_CODE (pat) == SET
2718           && REG_P (SET_SRC (pat))
2719           && REG_P (SET_DEST (pat))
2720           && !reg_overlap_mentioned_p (SET_DEST (pat), SET_SRC (pat)))
2721         {
2722           rtx next = next_nonnote_insn (trial);
2723
2724           if (next && NONJUMP_INSN_P (next)
2725               && GET_CODE (PATTERN (next)) != USE
2726               && ! reg_set_p (SET_DEST (pat), next)
2727               && ! reg_set_p (SET_SRC (pat), next)
2728               && reg_referenced_p (SET_DEST (pat), PATTERN (next))
2729               && ! modified_in_p (SET_DEST (pat), next))
2730             validate_replace_rtx (SET_DEST (pat), SET_SRC (pat), next);
2731         }
2732     }
2733
2734   /* If we stopped on a branch insn that has delay slots, see if we can
2735      steal some of the insns in those slots.  */
2736   if (trial && NONJUMP_INSN_P (trial)
2737       && GET_CODE (PATTERN (trial)) == SEQUENCE
2738       && JUMP_P (XVECEXP (PATTERN (trial), 0, 0)))
2739     {
2740       rtx_sequence *sequence = as_a <rtx_sequence *> (PATTERN (trial));
2741       /* If this is the `true' thread, we will want to follow the jump,
2742          so we can only do this if we have taken everything up to here.  */
2743       if (thread_if_true && trial == new_thread)
2744         {
2745           delay_list
2746             = steal_delay_list_from_target (insn, condition, sequence,
2747                                             delay_list, &set, &needed,
2748                                             &opposite_needed, slots_to_fill,
2749                                             pslots_filled, &must_annul,
2750                                             &new_thread);
2751           /* If we owned the thread and are told that it branched
2752              elsewhere, make sure we own the thread at the new location.  */
2753           if (own_thread && trial != new_thread)
2754             own_thread = own_thread_p (new_thread, new_thread, 0);
2755         }
2756       else if (! thread_if_true)
2757         delay_list
2758           = steal_delay_list_from_fallthrough (insn, condition,
2759                                                sequence,
2760                                                delay_list, &set, &needed,
2761                                                &opposite_needed, slots_to_fill,
2762                                                pslots_filled, &must_annul);
2763     }
2764
2765   /* If we haven't found anything for this delay slot and it is very
2766      likely that the branch will be taken, see if the insn at our target
2767      increments or decrements a register with an increment that does not
2768      depend on the destination register.  If so, try to place the opposite
2769      arithmetic insn after the jump insn and put the arithmetic insn in the
2770      delay slot.  If we can't do this, return.  */
2771   if (delay_list == 0 && likely
2772       && new_thread && !ANY_RETURN_P (new_thread)
2773       && NONJUMP_INSN_P (new_thread)
2774       && !RTX_FRAME_RELATED_P (new_thread)
2775       && GET_CODE (PATTERN (new_thread)) != ASM_INPUT
2776       && asm_noperands (PATTERN (new_thread)) < 0)
2777     {
2778       rtx pat = PATTERN (new_thread);
2779       rtx dest;
2780       rtx src;
2781
2782       /* We know "new_thread" is an insn due to NONJUMP_INSN_P (new_thread)
2783          above.  */
2784       trial = as_a <rtx_insn *> (new_thread);
2785       pat = PATTERN (trial);
2786
2787       if (!NONJUMP_INSN_P (trial)
2788           || GET_CODE (pat) != SET
2789           || ! eligible_for_delay (insn, 0, trial, flags)
2790           || can_throw_internal (trial))
2791         return 0;
2792
2793       dest = SET_DEST (pat), src = SET_SRC (pat);
2794       if ((GET_CODE (src) == PLUS || GET_CODE (src) == MINUS)
2795           && rtx_equal_p (XEXP (src, 0), dest)
2796           && (!FLOAT_MODE_P (GET_MODE (src))
2797               || flag_unsafe_math_optimizations)
2798           && ! reg_overlap_mentioned_p (dest, XEXP (src, 1))
2799           && ! side_effects_p (pat))
2800         {
2801           rtx other = XEXP (src, 1);
2802           rtx new_arith;
2803           rtx_insn *ninsn;
2804
2805           /* If this is a constant adjustment, use the same code with
2806              the negated constant.  Otherwise, reverse the sense of the
2807              arithmetic.  */
2808           if (CONST_INT_P (other))
2809             new_arith = gen_rtx_fmt_ee (GET_CODE (src), GET_MODE (src), dest,
2810                                         negate_rtx (GET_MODE (src), other));
2811           else
2812             new_arith = gen_rtx_fmt_ee (GET_CODE (src) == PLUS ? MINUS : PLUS,
2813                                         GET_MODE (src), dest, other);
2814
2815           ninsn = emit_insn_after (gen_rtx_SET (VOIDmode, dest, new_arith),
2816                                    insn);
2817
2818           if (recog_memoized (ninsn) < 0
2819               || (extract_insn (ninsn),
2820                   !constrain_operands (1, get_preferred_alternatives (ninsn))))
2821             {
2822               delete_related_insns (ninsn);
2823               return 0;
2824             }
2825
2826           if (own_thread)
2827             {
2828               update_block (trial, thread);
2829               if (trial == thread)
2830                 {
2831                   thread = next_active_insn (thread);
2832                   if (new_thread == trial)
2833                     new_thread = thread;
2834                 }
2835               delete_related_insns (trial);
2836             }
2837           else
2838             new_thread = next_active_insn (trial);
2839
2840           ninsn = own_thread ? trial : copy_delay_slot_insn (trial);
2841           if (thread_if_true)
2842             INSN_FROM_TARGET_P (ninsn) = 1;
2843
2844           delay_list = add_to_delay_list (ninsn, NULL);
2845           (*pslots_filled)++;
2846         }
2847     }
2848
2849   if (delay_list && must_annul)
2850     INSN_ANNULLED_BRANCH_P (insn) = 1;
2851
2852   /* If we are to branch into the middle of this thread, find an appropriate
2853      label or make a new one if none, and redirect INSN to it.  If we hit the
2854      end of the function, use the end-of-function label.  */
2855   if (new_thread != thread)
2856     {
2857       rtx label;
2858       bool crossing = false;
2859
2860       gcc_assert (thread_if_true);
2861
2862       if (new_thread && simplejump_or_return_p (new_thread)
2863           && redirect_with_delay_list_safe_p (insn,
2864                                               JUMP_LABEL (new_thread),
2865                                               delay_list))
2866         new_thread = follow_jumps (JUMP_LABEL (new_thread), insn,
2867                                    &crossing);
2868
2869       if (ANY_RETURN_P (new_thread))
2870         label = find_end_label (new_thread);
2871       else if (LABEL_P (new_thread))
2872         label = new_thread;
2873       else
2874         label = get_label_before (as_a <rtx_insn *> (new_thread),
2875                                   JUMP_LABEL (insn));
2876
2877       if (label)
2878         {
2879           reorg_redirect_jump (insn, label);
2880           if (crossing)
2881             CROSSING_JUMP_P (insn) = 1;
2882         }
2883     }
2884
2885   return delay_list;
2886 }
2887 \f
2888 /* Make another attempt to find insns to place in delay slots.
2889
2890    We previously looked for insns located in front of the delay insn
2891    and, for non-jump delay insns, located behind the delay insn.
2892
2893    Here only try to schedule jump insns and try to move insns from either
2894    the target or the following insns into the delay slot.  If annulling is
2895    supported, we will be likely to do this.  Otherwise, we can do this only
2896    if safe.  */
2897
2898 static void
2899 fill_eager_delay_slots (void)
2900 {
2901   rtx_insn *insn;
2902   int i;
2903   int num_unfilled_slots = unfilled_slots_next - unfilled_slots_base;
2904
2905   for (i = 0; i < num_unfilled_slots; i++)
2906     {
2907       rtx condition;
2908       rtx target_label, insn_at_target;
2909       rtx_insn *fallthrough_insn;
2910       rtx_insn_list *delay_list = 0;
2911       int own_target;
2912       int own_fallthrough;
2913       int prediction, slots_to_fill, slots_filled;
2914
2915       insn = unfilled_slots_base[i];
2916       if (insn == 0
2917           || insn->deleted ()
2918           || !JUMP_P (insn)
2919           || ! (condjump_p (insn) || condjump_in_parallel_p (insn)))
2920         continue;
2921
2922       slots_to_fill = num_delay_slots (insn);
2923       /* Some machine description have defined instructions to have
2924          delay slots only in certain circumstances which may depend on
2925          nearby insns (which change due to reorg's actions).
2926
2927          For example, the PA port normally has delay slots for unconditional
2928          jumps.
2929
2930          However, the PA port claims such jumps do not have a delay slot
2931          if they are immediate successors of certain CALL_INSNs.  This
2932          allows the port to favor filling the delay slot of the call with
2933          the unconditional jump.  */
2934       if (slots_to_fill == 0)
2935         continue;
2936
2937       slots_filled = 0;
2938       target_label = JUMP_LABEL (insn);
2939       condition = get_branch_condition (insn, target_label);
2940
2941       if (condition == 0)
2942         continue;
2943
2944       /* Get the next active fallthrough and target insns and see if we own
2945          them.  Then see whether the branch is likely true.  We don't need
2946          to do a lot of this for unconditional branches.  */
2947
2948       insn_at_target = first_active_target_insn (target_label);
2949       own_target = own_thread_p (target_label, target_label, 0);
2950
2951       if (condition == const_true_rtx)
2952         {
2953           own_fallthrough = 0;
2954           fallthrough_insn = 0;
2955           prediction = 2;
2956         }
2957       else
2958         {
2959           fallthrough_insn = next_active_insn (insn);
2960           own_fallthrough = own_thread_p (NEXT_INSN (insn), NULL_RTX, 1);
2961           prediction = mostly_true_jump (insn);
2962         }
2963
2964       /* If this insn is expected to branch, first try to get insns from our
2965          target, then our fallthrough insns.  If it is not expected to branch,
2966          try the other order.  */
2967
2968       if (prediction > 0)
2969         {
2970           delay_list
2971             = fill_slots_from_thread (insn, condition, insn_at_target,
2972                                       fallthrough_insn, prediction == 2, 1,
2973                                       own_target,
2974                                       slots_to_fill, &slots_filled, delay_list);
2975
2976           if (delay_list == 0 && own_fallthrough)
2977             {
2978               /* Even though we didn't find anything for delay slots,
2979                  we might have found a redundant insn which we deleted
2980                  from the thread that was filled.  So we have to recompute
2981                  the next insn at the target.  */
2982               target_label = JUMP_LABEL (insn);
2983               insn_at_target = first_active_target_insn (target_label);
2984
2985               delay_list
2986                 = fill_slots_from_thread (insn, condition, fallthrough_insn,
2987                                           insn_at_target, 0, 0,
2988                                           own_fallthrough,
2989                                           slots_to_fill, &slots_filled,
2990                                           delay_list);
2991             }
2992         }
2993       else
2994         {
2995           if (own_fallthrough)
2996             delay_list
2997               = fill_slots_from_thread (insn, condition, fallthrough_insn,
2998                                         insn_at_target, 0, 0,
2999                                         own_fallthrough,
3000                                         slots_to_fill, &slots_filled,
3001                                         delay_list);
3002
3003           if (delay_list == 0)
3004             delay_list
3005               = fill_slots_from_thread (insn, condition, insn_at_target,
3006                                         next_active_insn (insn), 0, 1,
3007                                         own_target,
3008                                         slots_to_fill, &slots_filled,
3009                                         delay_list);
3010         }
3011
3012       if (delay_list)
3013         unfilled_slots_base[i]
3014           = emit_delay_sequence (insn, delay_list, slots_filled);
3015
3016       if (slots_to_fill == slots_filled)
3017         unfilled_slots_base[i] = 0;
3018
3019       note_delay_statistics (slots_filled, 1);
3020     }
3021 }
3022 \f
3023 static void delete_computation (rtx insn);
3024
3025 /* Recursively delete prior insns that compute the value (used only by INSN
3026    which the caller is deleting) stored in the register mentioned by NOTE
3027    which is a REG_DEAD note associated with INSN.  */
3028
3029 static void
3030 delete_prior_computation (rtx note, rtx insn)
3031 {
3032   rtx our_prev;
3033   rtx reg = XEXP (note, 0);
3034
3035   for (our_prev = prev_nonnote_insn (insn);
3036        our_prev && (NONJUMP_INSN_P (our_prev)
3037                     || CALL_P (our_prev));
3038        our_prev = prev_nonnote_insn (our_prev))
3039     {
3040       rtx pat = PATTERN (our_prev);
3041
3042       /* If we reach a CALL which is not calling a const function
3043          or the callee pops the arguments, then give up.  */
3044       if (CALL_P (our_prev)
3045           && (! RTL_CONST_CALL_P (our_prev)
3046               || GET_CODE (pat) != SET || GET_CODE (SET_SRC (pat)) != CALL))
3047         break;
3048
3049       /* If we reach a SEQUENCE, it is too complex to try to
3050          do anything with it, so give up.  We can be run during
3051          and after reorg, so SEQUENCE rtl can legitimately show
3052          up here.  */
3053       if (GET_CODE (pat) == SEQUENCE)
3054         break;
3055
3056       if (GET_CODE (pat) == USE
3057           && NONJUMP_INSN_P (XEXP (pat, 0)))
3058         /* reorg creates USEs that look like this.  We leave them
3059            alone because reorg needs them for its own purposes.  */
3060         break;
3061
3062       if (reg_set_p (reg, pat))
3063         {
3064           if (side_effects_p (pat) && !CALL_P (our_prev))
3065             break;
3066
3067           if (GET_CODE (pat) == PARALLEL)
3068             {
3069               /* If we find a SET of something else, we can't
3070                  delete the insn.  */
3071
3072               int i;
3073
3074               for (i = 0; i < XVECLEN (pat, 0); i++)
3075                 {
3076                   rtx part = XVECEXP (pat, 0, i);
3077
3078                   if (GET_CODE (part) == SET
3079                       && SET_DEST (part) != reg)
3080                     break;
3081                 }
3082
3083               if (i == XVECLEN (pat, 0))
3084                 delete_computation (our_prev);
3085             }
3086           else if (GET_CODE (pat) == SET
3087                    && REG_P (SET_DEST (pat)))
3088             {
3089               int dest_regno = REGNO (SET_DEST (pat));
3090               int dest_endregno = END_REGNO (SET_DEST (pat));
3091               int regno = REGNO (reg);
3092               int endregno = END_REGNO (reg);
3093
3094               if (dest_regno >= regno
3095                   && dest_endregno <= endregno)
3096                 delete_computation (our_prev);
3097
3098               /* We may have a multi-word hard register and some, but not
3099                  all, of the words of the register are needed in subsequent
3100                  insns.  Write REG_UNUSED notes for those parts that were not
3101                  needed.  */
3102               else if (dest_regno <= regno
3103                        && dest_endregno >= endregno)
3104                 {
3105                   int i;
3106
3107                   add_reg_note (our_prev, REG_UNUSED, reg);
3108
3109                   for (i = dest_regno; i < dest_endregno; i++)
3110                     if (! find_regno_note (our_prev, REG_UNUSED, i))
3111                       break;
3112
3113                   if (i == dest_endregno)
3114                     delete_computation (our_prev);
3115                 }
3116             }
3117
3118           break;
3119         }
3120
3121       /* If PAT references the register that dies here, it is an
3122          additional use.  Hence any prior SET isn't dead.  However, this
3123          insn becomes the new place for the REG_DEAD note.  */
3124       if (reg_overlap_mentioned_p (reg, pat))
3125         {
3126           XEXP (note, 1) = REG_NOTES (our_prev);
3127           REG_NOTES (our_prev) = note;
3128           break;
3129         }
3130     }
3131 }
3132
3133 /* Delete INSN and recursively delete insns that compute values used only
3134    by INSN.  This uses the REG_DEAD notes computed during flow analysis.
3135
3136    Look at all our REG_DEAD notes.  If a previous insn does nothing other
3137    than set a register that dies in this insn, we can delete that insn
3138    as well.
3139
3140    On machines with CC0, if CC0 is used in this insn, we may be able to
3141    delete the insn that set it.  */
3142
3143 static void
3144 delete_computation (rtx insn)
3145 {
3146   rtx note, next;
3147
3148 #ifdef HAVE_cc0
3149   if (reg_referenced_p (cc0_rtx, PATTERN (insn)))
3150     {
3151       rtx prev = prev_nonnote_insn (insn);
3152       /* We assume that at this stage
3153          CC's are always set explicitly
3154          and always immediately before the jump that
3155          will use them.  So if the previous insn
3156          exists to set the CC's, delete it
3157          (unless it performs auto-increments, etc.).  */
3158       if (prev && NONJUMP_INSN_P (prev)
3159           && sets_cc0_p (PATTERN (prev)))
3160         {
3161           if (sets_cc0_p (PATTERN (prev)) > 0
3162               && ! side_effects_p (PATTERN (prev)))
3163             delete_computation (prev);
3164           else
3165             /* Otherwise, show that cc0 won't be used.  */
3166             add_reg_note (prev, REG_UNUSED, cc0_rtx);
3167         }
3168     }
3169 #endif
3170
3171   for (note = REG_NOTES (insn); note; note = next)
3172     {
3173       next = XEXP (note, 1);
3174
3175       if (REG_NOTE_KIND (note) != REG_DEAD
3176           /* Verify that the REG_NOTE is legitimate.  */
3177           || !REG_P (XEXP (note, 0)))
3178         continue;
3179
3180       delete_prior_computation (note, insn);
3181     }
3182
3183   delete_related_insns (insn);
3184 }
3185
3186 /* If all INSN does is set the pc, delete it,
3187    and delete the insn that set the condition codes for it
3188    if that's what the previous thing was.  */
3189
3190 static void
3191 delete_jump (rtx_insn *insn)
3192 {
3193   rtx set = single_set (insn);
3194
3195   if (set && GET_CODE (SET_DEST (set)) == PC)
3196     delete_computation (insn);
3197 }
3198
3199 static rtx_insn *
3200 label_before_next_insn (rtx x, rtx scan_limit)
3201 {
3202   rtx_insn *insn = next_active_insn (x);
3203   while (insn)
3204     {
3205       insn = PREV_INSN (insn);
3206       if (insn == scan_limit || insn == NULL_RTX)
3207         return NULL;
3208       if (LABEL_P (insn))
3209         break;
3210     }
3211   return insn;
3212 }
3213
3214 /* Return TRUE if there is a NOTE_INSN_SWITCH_TEXT_SECTIONS note in between
3215    BEG and END.  */
3216
3217 static bool
3218 switch_text_sections_between_p (const rtx_insn *beg, const rtx_insn *end)
3219 {
3220   const rtx_insn *p;
3221   for (p = beg; p != end; p = NEXT_INSN (p))
3222     if (NOTE_P (p) && NOTE_KIND (p) == NOTE_INSN_SWITCH_TEXT_SECTIONS)
3223       return true;
3224   return false;
3225 }
3226
3227 \f
3228 /* Once we have tried two ways to fill a delay slot, make a pass over the
3229    code to try to improve the results and to do such things as more jump
3230    threading.  */
3231
3232 static void
3233 relax_delay_slots (rtx_insn *first)
3234 {
3235   rtx_insn *insn, *next;
3236   rtx_sequence *pat;
3237   rtx trial;
3238   rtx_insn *delay_insn;
3239   rtx target_label;
3240
3241   /* Look at every JUMP_INSN and see if we can improve it.  */
3242   for (insn = first; insn; insn = next)
3243     {
3244       rtx_insn *other;
3245       bool crossing;
3246
3247       next = next_active_insn (insn);
3248
3249       /* If this is a jump insn, see if it now jumps to a jump, jumps to
3250          the next insn, or jumps to a label that is not the last of a
3251          group of consecutive labels.  */
3252       if (JUMP_P (insn)
3253           && (condjump_p (insn) || condjump_in_parallel_p (insn))
3254           && !ANY_RETURN_P (target_label = JUMP_LABEL (insn)))
3255         {
3256           target_label
3257             = skip_consecutive_labels (follow_jumps (target_label, insn,
3258                                                      &crossing));
3259           if (ANY_RETURN_P (target_label))
3260             target_label = find_end_label (target_label);
3261
3262           if (target_label && next_active_insn (target_label) == next
3263               && ! condjump_in_parallel_p (insn)
3264               && ! (next && switch_text_sections_between_p (insn, next)))
3265             {
3266               delete_jump (insn);
3267               continue;
3268             }
3269
3270           if (target_label && target_label != JUMP_LABEL (insn))
3271             {
3272               reorg_redirect_jump (insn, target_label);
3273               if (crossing)
3274                 CROSSING_JUMP_P (insn) = 1;
3275             }
3276
3277           /* See if this jump conditionally branches around an unconditional
3278              jump.  If so, invert this jump and point it to the target of the
3279              second jump.  Check if it's possible on the target.  */
3280           if (next && simplejump_or_return_p (next)
3281               && any_condjump_p (insn)
3282               && target_label
3283               && next_active_insn (target_label) == next_active_insn (next)
3284               && no_labels_between_p (insn, next)
3285               && targetm.can_follow_jump (insn, next))
3286             {
3287               rtx label = JUMP_LABEL (next);
3288
3289               /* Be careful how we do this to avoid deleting code or
3290                  labels that are momentarily dead.  See similar optimization
3291                  in jump.c.
3292
3293                  We also need to ensure we properly handle the case when
3294                  invert_jump fails.  */
3295
3296               ++LABEL_NUSES (target_label);
3297               if (!ANY_RETURN_P (label))
3298                 ++LABEL_NUSES (label);
3299
3300               if (invert_jump (insn, label, 1))
3301                 {
3302                   delete_related_insns (next);
3303                   next = insn;
3304                 }
3305
3306               if (!ANY_RETURN_P (label))
3307                 --LABEL_NUSES (label);
3308
3309               if (--LABEL_NUSES (target_label) == 0)
3310                 delete_related_insns (target_label);
3311
3312               continue;
3313             }
3314         }
3315
3316       /* If this is an unconditional jump and the previous insn is a
3317          conditional jump, try reversing the condition of the previous
3318          insn and swapping our targets.  The next pass might be able to
3319          fill the slots.
3320
3321          Don't do this if we expect the conditional branch to be true, because
3322          we would then be making the more common case longer.  */
3323
3324       if (simplejump_or_return_p (insn)
3325           && (other = prev_active_insn (insn)) != 0
3326           && any_condjump_p (other)
3327           && no_labels_between_p (other, insn)
3328           && 0 > mostly_true_jump (other))
3329         {
3330           rtx other_target = JUMP_LABEL (other);
3331           target_label = JUMP_LABEL (insn);
3332
3333           if (invert_jump (other, target_label, 0))
3334             reorg_redirect_jump (insn, other_target);
3335         }
3336
3337       /* Now look only at cases where we have a filled delay slot.  */
3338       if (!NONJUMP_INSN_P (insn) || GET_CODE (PATTERN (insn)) != SEQUENCE)
3339         continue;
3340
3341       pat = as_a <rtx_sequence *> (PATTERN (insn));
3342       delay_insn = pat->insn (0);
3343
3344       /* See if the first insn in the delay slot is redundant with some
3345          previous insn.  Remove it from the delay slot if so; then set up
3346          to reprocess this insn.  */
3347       if (redundant_insn (pat->insn (1), delay_insn, 0))
3348         {
3349           update_block (pat->insn (1), insn);
3350           delete_from_delay_slot (pat->insn (1));
3351           next = prev_active_insn (next);
3352           continue;
3353         }
3354
3355       /* See if we have a RETURN insn with a filled delay slot followed
3356          by a RETURN insn with an unfilled a delay slot.  If so, we can delete
3357          the first RETURN (but not its delay insn).  This gives the same
3358          effect in fewer instructions.
3359
3360          Only do so if optimizing for size since this results in slower, but
3361          smaller code.  */
3362       if (optimize_function_for_size_p (cfun)
3363           && ANY_RETURN_P (PATTERN (delay_insn))
3364           && next
3365           && JUMP_P (next)
3366           && PATTERN (next) == PATTERN (delay_insn))
3367         {
3368           rtx_insn *after;
3369           int i;
3370
3371           /* Delete the RETURN and just execute the delay list insns.
3372
3373              We do this by deleting the INSN containing the SEQUENCE, then
3374              re-emitting the insns separately, and then deleting the RETURN.
3375              This allows the count of the jump target to be properly
3376              decremented.
3377
3378              Note that we need to change the INSN_UID of the re-emitted insns
3379              since it is used to hash the insns for mark_target_live_regs and
3380              the re-emitted insns will no longer be wrapped up in a SEQUENCE.
3381
3382              Clear the from target bit, since these insns are no longer
3383              in delay slots.  */
3384           for (i = 0; i < XVECLEN (pat, 0); i++)
3385             INSN_FROM_TARGET_P (XVECEXP (pat, 0, i)) = 0;
3386
3387           trial = PREV_INSN (insn);
3388           delete_related_insns (insn);
3389           gcc_assert (GET_CODE (pat) == SEQUENCE);
3390           add_insn_after (delay_insn, trial, NULL);
3391           after = delay_insn;
3392           for (i = 1; i < pat->len (); i++)
3393             after = emit_copy_of_insn_after (pat->insn (i), after);
3394           delete_scheduled_jump (delay_insn);
3395           continue;
3396         }
3397
3398       /* Now look only at the cases where we have a filled JUMP_INSN.  */
3399       if (!JUMP_P (delay_insn)
3400           || !(condjump_p (delay_insn) || condjump_in_parallel_p (delay_insn)))
3401         continue;
3402
3403       target_label = JUMP_LABEL (delay_insn);
3404       if (target_label && ANY_RETURN_P (target_label))
3405         continue;
3406
3407       /* If this jump goes to another unconditional jump, thread it, but
3408          don't convert a jump into a RETURN here.  */
3409       trial = skip_consecutive_labels (follow_jumps (target_label, delay_insn,
3410                                                      &crossing));
3411       if (ANY_RETURN_P (trial))
3412         trial = find_end_label (trial);
3413
3414       if (trial && trial != target_label
3415           && redirect_with_delay_slots_safe_p (delay_insn, trial, insn))
3416         {
3417           reorg_redirect_jump (delay_insn, trial);
3418           target_label = trial;
3419           if (crossing)
3420             CROSSING_JUMP_P (insn) = 1;
3421         }
3422
3423       /* If the first insn at TARGET_LABEL is redundant with a previous
3424          insn, redirect the jump to the following insn and process again.
3425          We use next_real_insn instead of next_active_insn so we
3426          don't skip USE-markers, or we'll end up with incorrect
3427          liveness info.  */
3428       trial = next_real_insn (target_label);
3429       if (trial && GET_CODE (PATTERN (trial)) != SEQUENCE
3430           && redundant_insn (trial, insn, 0)
3431           && ! can_throw_internal (trial))
3432         {
3433           /* Figure out where to emit the special USE insn so we don't
3434              later incorrectly compute register live/death info.  */
3435           rtx_insn *tmp = next_active_insn (trial);
3436           if (tmp == 0)
3437             tmp = find_end_label (simple_return_rtx);
3438
3439           if (tmp)
3440             {
3441               /* Insert the special USE insn and update dataflow info.
3442                  We know "trial" is an insn here as it is the output of
3443                  next_real_insn () above.  */
3444               update_block (as_a <rtx_insn *> (trial), tmp);
3445               
3446               /* Now emit a label before the special USE insn, and
3447                  redirect our jump to the new label.  */
3448               target_label = get_label_before (PREV_INSN (tmp), target_label);
3449               reorg_redirect_jump (delay_insn, target_label);
3450               next = insn;
3451               continue;
3452             }
3453         }
3454
3455       /* Similarly, if it is an unconditional jump with one insn in its
3456          delay list and that insn is redundant, thread the jump.  */
3457       rtx_sequence *trial_seq =
3458         trial ? dyn_cast <rtx_sequence *> (PATTERN (trial)) : NULL;
3459       if (trial_seq
3460           && trial_seq->len () == 2
3461           && JUMP_P (trial_seq->insn (0))
3462           && simplejump_or_return_p (trial_seq->insn (0))
3463           && redundant_insn (trial_seq->insn (1), insn, 0))
3464         {
3465           target_label = JUMP_LABEL (trial_seq->insn (0));
3466           if (ANY_RETURN_P (target_label))
3467             target_label = find_end_label (target_label);
3468           
3469           if (target_label
3470               && redirect_with_delay_slots_safe_p (delay_insn, target_label,
3471                                                    insn))
3472             {
3473               update_block (trial_seq->insn (1), insn);
3474               reorg_redirect_jump (delay_insn, target_label);
3475               next = insn;
3476               continue;
3477             }
3478         }
3479
3480       /* See if we have a simple (conditional) jump that is useless.  */
3481       if (! INSN_ANNULLED_BRANCH_P (delay_insn)
3482           && ! condjump_in_parallel_p (delay_insn)
3483           && prev_active_insn (target_label) == insn
3484           && ! BARRIER_P (prev_nonnote_insn (target_label))
3485 #ifdef HAVE_cc0
3486           /* If the last insn in the delay slot sets CC0 for some insn,
3487              various code assumes that it is in a delay slot.  We could
3488              put it back where it belonged and delete the register notes,
3489              but it doesn't seem worthwhile in this uncommon case.  */
3490           && ! find_reg_note (XVECEXP (pat, 0, XVECLEN (pat, 0) - 1),
3491                               REG_CC_USER, NULL_RTX)
3492 #endif
3493           )
3494         {
3495           rtx_insn *after;
3496           int i;
3497
3498           /* All this insn does is execute its delay list and jump to the
3499              following insn.  So delete the jump and just execute the delay
3500              list insns.
3501
3502              We do this by deleting the INSN containing the SEQUENCE, then
3503              re-emitting the insns separately, and then deleting the jump.
3504              This allows the count of the jump target to be properly
3505              decremented.
3506
3507              Note that we need to change the INSN_UID of the re-emitted insns
3508              since it is used to hash the insns for mark_target_live_regs and
3509              the re-emitted insns will no longer be wrapped up in a SEQUENCE.
3510
3511              Clear the from target bit, since these insns are no longer
3512              in delay slots.  */
3513           for (i = 0; i < XVECLEN (pat, 0); i++)
3514             INSN_FROM_TARGET_P (XVECEXP (pat, 0, i)) = 0;
3515
3516           trial = PREV_INSN (insn);
3517           delete_related_insns (insn);
3518           gcc_assert (GET_CODE (pat) == SEQUENCE);
3519           add_insn_after (delay_insn, trial, NULL);
3520           after = delay_insn;
3521           for (i = 1; i < pat->len (); i++)
3522             after = emit_copy_of_insn_after (pat->insn (i), after);
3523           delete_scheduled_jump (delay_insn);
3524           continue;
3525         }
3526
3527       /* See if this is an unconditional jump around a single insn which is
3528          identical to the one in its delay slot.  In this case, we can just
3529          delete the branch and the insn in its delay slot.  */
3530       if (next && NONJUMP_INSN_P (next)
3531           && label_before_next_insn (next, insn) == target_label
3532           && simplejump_p (insn)
3533           && XVECLEN (pat, 0) == 2
3534           && rtx_equal_p (PATTERN (next), PATTERN (pat->insn (1))))
3535         {
3536           delete_related_insns (insn);
3537           continue;
3538         }
3539
3540       /* See if this jump (with its delay slots) conditionally branches
3541          around an unconditional jump (without delay slots).  If so, invert
3542          this jump and point it to the target of the second jump.  We cannot
3543          do this for annulled jumps, though.  Again, don't convert a jump to
3544          a RETURN here.  */
3545       if (! INSN_ANNULLED_BRANCH_P (delay_insn)
3546           && any_condjump_p (delay_insn)
3547           && next && simplejump_or_return_p (next)
3548           && next_active_insn (target_label) == next_active_insn (next)
3549           && no_labels_between_p (insn, next))
3550         {
3551           rtx label = JUMP_LABEL (next);
3552           rtx old_label = JUMP_LABEL (delay_insn);
3553
3554           if (ANY_RETURN_P (label))
3555             label = find_end_label (label);
3556
3557           /* find_end_label can generate a new label. Check this first.  */
3558           if (label
3559               && no_labels_between_p (insn, next)
3560               && redirect_with_delay_slots_safe_p (delay_insn, label, insn))
3561             {
3562               /* Be careful how we do this to avoid deleting code or labels
3563                  that are momentarily dead.  See similar optimization in
3564                  jump.c  */
3565               if (old_label)
3566                 ++LABEL_NUSES (old_label);
3567
3568               if (invert_jump (delay_insn, label, 1))
3569                 {
3570                   int i;
3571
3572                   /* Must update the INSN_FROM_TARGET_P bits now that
3573                      the branch is reversed, so that mark_target_live_regs
3574                      will handle the delay slot insn correctly.  */
3575                   for (i = 1; i < XVECLEN (PATTERN (insn), 0); i++)
3576                     {
3577                       rtx slot = XVECEXP (PATTERN (insn), 0, i);
3578                       INSN_FROM_TARGET_P (slot) = ! INSN_FROM_TARGET_P (slot);
3579                     }
3580
3581                   delete_related_insns (next);
3582                   next = insn;
3583                 }
3584
3585               if (old_label && --LABEL_NUSES (old_label) == 0)
3586                 delete_related_insns (old_label);
3587               continue;
3588             }
3589         }
3590
3591       /* If we own the thread opposite the way this insn branches, see if we
3592          can merge its delay slots with following insns.  */
3593       if (INSN_FROM_TARGET_P (pat->insn (1))
3594           && own_thread_p (NEXT_INSN (insn), 0, 1))
3595         try_merge_delay_insns (insn, next);
3596       else if (! INSN_FROM_TARGET_P (pat->insn (1))
3597                && own_thread_p (target_label, target_label, 0))
3598         try_merge_delay_insns (insn, next_active_insn (target_label));
3599
3600       /* If we get here, we haven't deleted INSN.  But we may have deleted
3601          NEXT, so recompute it.  */
3602       next = next_active_insn (insn);
3603     }
3604 }
3605 \f
3606
3607 /* Look for filled jumps to the end of function label.  We can try to convert
3608    them into RETURN insns if the insns in the delay slot are valid for the
3609    RETURN as well.  */
3610
3611 static void
3612 make_return_insns (rtx_insn *first)
3613 {
3614   rtx_insn *insn;
3615   rtx_insn *jump_insn;
3616   rtx real_return_label = function_return_label;
3617   rtx real_simple_return_label = function_simple_return_label;
3618   int slots, i;
3619
3620   /* See if there is a RETURN insn in the function other than the one we
3621      made for END_OF_FUNCTION_LABEL.  If so, set up anything we can't change
3622      into a RETURN to jump to it.  */
3623   for (insn = first; insn; insn = NEXT_INSN (insn))
3624     if (JUMP_P (insn) && ANY_RETURN_P (PATTERN (insn)))
3625       {
3626         rtx t = get_label_before (insn, NULL_RTX);
3627         if (PATTERN (insn) == ret_rtx)
3628           real_return_label = t;
3629         else
3630           real_simple_return_label = t;
3631         break;
3632       }
3633
3634   /* Show an extra usage of REAL_RETURN_LABEL so it won't go away if it
3635      was equal to END_OF_FUNCTION_LABEL.  */
3636   if (real_return_label)
3637     LABEL_NUSES (real_return_label)++;
3638   if (real_simple_return_label)
3639     LABEL_NUSES (real_simple_return_label)++;
3640
3641   /* Clear the list of insns to fill so we can use it.  */
3642   obstack_free (&unfilled_slots_obstack, unfilled_firstobj);
3643
3644   for (insn = first; insn; insn = NEXT_INSN (insn))
3645     {
3646       int flags;
3647       rtx kind, real_label;
3648
3649       /* Only look at filled JUMP_INSNs that go to the end of function
3650          label.  */
3651       if (!NONJUMP_INSN_P (insn))
3652         continue;
3653
3654       if (GET_CODE (PATTERN (insn)) != SEQUENCE)
3655         continue;
3656
3657       rtx_sequence *pat = as_a <rtx_sequence *> (PATTERN (insn));
3658
3659       if (!jump_to_label_p (pat->insn (0)))
3660         continue;
3661
3662       if (JUMP_LABEL (pat->insn (0)) == function_return_label)
3663         {
3664           kind = ret_rtx;
3665           real_label = real_return_label;
3666         }
3667       else if (JUMP_LABEL (pat->insn (0)) == function_simple_return_label)
3668         {
3669           kind = simple_return_rtx;
3670           real_label = real_simple_return_label;
3671         }
3672       else
3673         continue;
3674
3675       jump_insn = pat->insn (0);
3676
3677       /* If we can't make the jump into a RETURN, try to redirect it to the best
3678          RETURN and go on to the next insn.  */
3679       if (!reorg_redirect_jump (jump_insn, kind))
3680         {
3681           /* Make sure redirecting the jump will not invalidate the delay
3682              slot insns.  */
3683           if (redirect_with_delay_slots_safe_p (jump_insn, real_label, insn))
3684             reorg_redirect_jump (jump_insn, real_label);
3685           continue;
3686         }
3687
3688       /* See if this RETURN can accept the insns current in its delay slot.
3689          It can if it has more or an equal number of slots and the contents
3690          of each is valid.  */
3691
3692       flags = get_jump_flags (jump_insn, JUMP_LABEL (jump_insn));
3693       slots = num_delay_slots (jump_insn);
3694       if (slots >= XVECLEN (pat, 0) - 1)
3695         {
3696           for (i = 1; i < XVECLEN (pat, 0); i++)
3697             if (! (
3698 #ifdef ANNUL_IFFALSE_SLOTS
3699                    (INSN_ANNULLED_BRANCH_P (jump_insn)
3700                     && INSN_FROM_TARGET_P (pat->insn (i)))
3701                    ? eligible_for_annul_false (jump_insn, i - 1,
3702                                                pat->insn (i), flags) :
3703 #endif
3704 #ifdef ANNUL_IFTRUE_SLOTS
3705                    (INSN_ANNULLED_BRANCH_P (jump_insn)
3706                     && ! INSN_FROM_TARGET_P (pat->insn (i)))
3707                    ? eligible_for_annul_true (jump_insn, i - 1,
3708                                               pat->insn (i), flags) :
3709 #endif
3710                    eligible_for_delay (jump_insn, i - 1,
3711                                        pat->insn (i), flags)))
3712               break;
3713         }
3714       else
3715         i = 0;
3716
3717       if (i == XVECLEN (pat, 0))
3718         continue;
3719
3720       /* We have to do something with this insn.  If it is an unconditional
3721          RETURN, delete the SEQUENCE and output the individual insns,
3722          followed by the RETURN.  Then set things up so we try to find
3723          insns for its delay slots, if it needs some.  */
3724       if (ANY_RETURN_P (PATTERN (jump_insn)))
3725         {
3726           rtx_insn *prev = PREV_INSN (insn);
3727
3728           delete_related_insns (insn);
3729           for (i = 1; i < XVECLEN (pat, 0); i++)
3730             prev = emit_insn_after (PATTERN (XVECEXP (pat, 0, i)), prev);
3731
3732           insn = emit_jump_insn_after (PATTERN (jump_insn), prev);
3733           emit_barrier_after (insn);
3734
3735           if (slots)
3736             obstack_ptr_grow (&unfilled_slots_obstack, insn);
3737         }
3738       else
3739         /* It is probably more efficient to keep this with its current
3740            delay slot as a branch to a RETURN.  */
3741         reorg_redirect_jump (jump_insn, real_label);
3742     }
3743
3744   /* Now delete REAL_RETURN_LABEL if we never used it.  Then try to fill any
3745      new delay slots we have created.  */
3746   if (real_return_label != NULL_RTX && --LABEL_NUSES (real_return_label) == 0)
3747     delete_related_insns (real_return_label);
3748   if (real_simple_return_label != NULL_RTX
3749       && --LABEL_NUSES (real_simple_return_label) == 0)
3750     delete_related_insns (real_simple_return_label);
3751
3752   fill_simple_delay_slots (1);
3753   fill_simple_delay_slots (0);
3754 }
3755 \f
3756 /* Try to find insns to place in delay slots.  */
3757
3758 static void
3759 dbr_schedule (rtx_insn *first)
3760 {
3761   rtx_insn *insn, *next, *epilogue_insn = 0;
3762   int i;
3763   bool need_return_insns;
3764
3765   /* If the current function has no insns other than the prologue and
3766      epilogue, then do not try to fill any delay slots.  */
3767   if (n_basic_blocks_for_fn (cfun) == NUM_FIXED_BLOCKS)
3768     return;
3769
3770   /* Find the highest INSN_UID and allocate and initialize our map from
3771      INSN_UID's to position in code.  */
3772   for (max_uid = 0, insn = first; insn; insn = NEXT_INSN (insn))
3773     {
3774       if (INSN_UID (insn) > max_uid)
3775         max_uid = INSN_UID (insn);
3776       if (NOTE_P (insn)
3777           && NOTE_KIND (insn) == NOTE_INSN_EPILOGUE_BEG)
3778         epilogue_insn = insn;
3779     }
3780
3781   uid_to_ruid = XNEWVEC (int, max_uid + 1);
3782   for (i = 0, insn = first; insn; i++, insn = NEXT_INSN (insn))
3783     uid_to_ruid[INSN_UID (insn)] = i;
3784
3785   /* Initialize the list of insns that need filling.  */
3786   if (unfilled_firstobj == 0)
3787     {
3788       gcc_obstack_init (&unfilled_slots_obstack);
3789       unfilled_firstobj = XOBNEWVAR (&unfilled_slots_obstack, rtx, 0);
3790     }
3791
3792   for (insn = next_active_insn (first); insn; insn = next_active_insn (insn))
3793     {
3794       rtx target;
3795
3796       /* Skip vector tables.  We can't get attributes for them.  */
3797       if (JUMP_TABLE_DATA_P (insn))
3798         continue;
3799
3800       if (JUMP_P (insn))
3801         INSN_ANNULLED_BRANCH_P (insn) = 0;
3802       INSN_FROM_TARGET_P (insn) = 0;
3803
3804       if (num_delay_slots (insn) > 0)
3805         obstack_ptr_grow (&unfilled_slots_obstack, insn);
3806
3807       /* Ensure all jumps go to the last of a set of consecutive labels.  */
3808       if (JUMP_P (insn)
3809           && (condjump_p (insn) || condjump_in_parallel_p (insn))
3810           && !ANY_RETURN_P (JUMP_LABEL (insn))
3811           && ((target = skip_consecutive_labels (JUMP_LABEL (insn)))
3812               != JUMP_LABEL (insn)))
3813         redirect_jump (insn, target, 1);
3814     }
3815
3816   init_resource_info (epilogue_insn);
3817
3818   /* Show we haven't computed an end-of-function label yet.  */
3819   function_return_label = function_simple_return_label = NULL;
3820
3821   /* Initialize the statistics for this function.  */
3822   memset (num_insns_needing_delays, 0, sizeof num_insns_needing_delays);
3823   memset (num_filled_delays, 0, sizeof num_filled_delays);
3824
3825   /* Now do the delay slot filling.  Try everything twice in case earlier
3826      changes make more slots fillable.  */
3827
3828   for (reorg_pass_number = 0;
3829        reorg_pass_number < MAX_REORG_PASSES;
3830        reorg_pass_number++)
3831     {
3832       fill_simple_delay_slots (1);
3833       fill_simple_delay_slots (0);
3834       fill_eager_delay_slots ();
3835       relax_delay_slots (first);
3836     }
3837
3838   /* If we made an end of function label, indicate that it is now
3839      safe to delete it by undoing our prior adjustment to LABEL_NUSES.
3840      If it is now unused, delete it.  */
3841   if (function_return_label && --LABEL_NUSES (function_return_label) == 0)
3842     delete_related_insns (function_return_label);
3843   if (function_simple_return_label
3844       && --LABEL_NUSES (function_simple_return_label) == 0)
3845     delete_related_insns (function_simple_return_label);
3846
3847   need_return_insns = false;
3848 #ifdef HAVE_return
3849   need_return_insns |= HAVE_return && function_return_label != 0;
3850 #endif
3851 #ifdef HAVE_simple_return
3852   need_return_insns |= HAVE_simple_return && function_simple_return_label != 0;
3853 #endif
3854   if (need_return_insns)
3855     make_return_insns (first);
3856
3857   /* Delete any USE insns made by update_block; subsequent passes don't need
3858      them or know how to deal with them.  */
3859   for (insn = first; insn; insn = next)
3860     {
3861       next = NEXT_INSN (insn);
3862
3863       if (NONJUMP_INSN_P (insn) && GET_CODE (PATTERN (insn)) == USE
3864           && INSN_P (XEXP (PATTERN (insn), 0)))
3865         next = delete_related_insns (insn);
3866     }
3867
3868   obstack_free (&unfilled_slots_obstack, unfilled_firstobj);
3869
3870   /* It is not clear why the line below is needed, but it does seem to be.  */
3871   unfilled_firstobj = XOBNEWVAR (&unfilled_slots_obstack, rtx, 0);
3872
3873   if (dump_file)
3874     {
3875       int i, j, need_comma;
3876       int total_delay_slots[MAX_DELAY_HISTOGRAM + 1];
3877       int total_annul_slots[MAX_DELAY_HISTOGRAM + 1];
3878
3879       for (reorg_pass_number = 0;
3880            reorg_pass_number < MAX_REORG_PASSES;
3881            reorg_pass_number++)
3882         {
3883           fprintf (dump_file, ";; Reorg pass #%d:\n", reorg_pass_number + 1);
3884           for (i = 0; i < NUM_REORG_FUNCTIONS; i++)
3885             {
3886               need_comma = 0;
3887               fprintf (dump_file, ";; Reorg function #%d\n", i);
3888
3889               fprintf (dump_file, ";; %d insns needing delay slots\n;; ",
3890                        num_insns_needing_delays[i][reorg_pass_number]);
3891
3892               for (j = 0; j < MAX_DELAY_HISTOGRAM + 1; j++)
3893                 if (num_filled_delays[i][j][reorg_pass_number])
3894                   {
3895                     if (need_comma)
3896                       fprintf (dump_file, ", ");
3897                     need_comma = 1;
3898                     fprintf (dump_file, "%d got %d delays",
3899                              num_filled_delays[i][j][reorg_pass_number], j);
3900                   }
3901               fprintf (dump_file, "\n");
3902             }
3903         }
3904       memset (total_delay_slots, 0, sizeof total_delay_slots);
3905       memset (total_annul_slots, 0, sizeof total_annul_slots);
3906       for (insn = first; insn; insn = NEXT_INSN (insn))
3907         {
3908           if (! insn->deleted ()
3909               && NONJUMP_INSN_P (insn)
3910               && GET_CODE (PATTERN (insn)) != USE
3911               && GET_CODE (PATTERN (insn)) != CLOBBER)
3912             {
3913               if (GET_CODE (PATTERN (insn)) == SEQUENCE)
3914                 {
3915                   rtx control;
3916                   j = XVECLEN (PATTERN (insn), 0) - 1;
3917                   if (j > MAX_DELAY_HISTOGRAM)
3918                     j = MAX_DELAY_HISTOGRAM;
3919                   control = XVECEXP (PATTERN (insn), 0, 0);
3920                   if (JUMP_P (control) && INSN_ANNULLED_BRANCH_P (control))
3921                     total_annul_slots[j]++;
3922                   else
3923                     total_delay_slots[j]++;
3924                 }
3925               else if (num_delay_slots (insn) > 0)
3926                 total_delay_slots[0]++;
3927             }
3928         }
3929       fprintf (dump_file, ";; Reorg totals: ");
3930       need_comma = 0;
3931       for (j = 0; j < MAX_DELAY_HISTOGRAM + 1; j++)
3932         {
3933           if (total_delay_slots[j])
3934             {
3935               if (need_comma)
3936                 fprintf (dump_file, ", ");
3937               need_comma = 1;
3938               fprintf (dump_file, "%d got %d delays", total_delay_slots[j], j);
3939             }
3940         }
3941       fprintf (dump_file, "\n");
3942 #if defined (ANNUL_IFTRUE_SLOTS) || defined (ANNUL_IFFALSE_SLOTS)
3943       fprintf (dump_file, ";; Reorg annuls: ");
3944       need_comma = 0;
3945       for (j = 0; j < MAX_DELAY_HISTOGRAM + 1; j++)
3946         {
3947           if (total_annul_slots[j])
3948             {
3949               if (need_comma)
3950                 fprintf (dump_file, ", ");
3951               need_comma = 1;
3952               fprintf (dump_file, "%d got %d delays", total_annul_slots[j], j);
3953             }
3954         }
3955       fprintf (dump_file, "\n");
3956 #endif
3957       fprintf (dump_file, "\n");
3958     }
3959
3960   if (!sibling_labels.is_empty ())
3961     {
3962       update_alignments (sibling_labels);
3963       sibling_labels.release ();
3964     }
3965
3966   free_resource_info ();
3967   free (uid_to_ruid);
3968   crtl->dbr_scheduled_p = true;
3969 }
3970 #endif /* DELAY_SLOTS */
3971 \f
3972 /* Run delay slot optimization.  */
3973 static unsigned int
3974 rest_of_handle_delay_slots (void)
3975 {
3976 #ifdef DELAY_SLOTS
3977   dbr_schedule (get_insns ());
3978 #endif
3979   return 0;
3980 }
3981
3982 namespace {
3983
3984 const pass_data pass_data_delay_slots =
3985 {
3986   RTL_PASS, /* type */
3987   "dbr", /* name */
3988   OPTGROUP_NONE, /* optinfo_flags */
3989   TV_DBR_SCHED, /* tv_id */
3990   0, /* properties_required */
3991   0, /* properties_provided */
3992   0, /* properties_destroyed */
3993   0, /* todo_flags_start */
3994   0, /* todo_flags_finish */
3995 };
3996
3997 class pass_delay_slots : public rtl_opt_pass
3998 {
3999 public:
4000   pass_delay_slots (gcc::context *ctxt)
4001     : rtl_opt_pass (pass_data_delay_slots, ctxt)
4002   {}
4003
4004   /* opt_pass methods: */
4005   virtual bool gate (function *);
4006   virtual unsigned int execute (function *)
4007     {
4008       return rest_of_handle_delay_slots ();
4009     }
4010
4011 }; // class pass_delay_slots
4012
4013 bool
4014 pass_delay_slots::gate (function *)
4015 {
4016 #ifdef DELAY_SLOTS
4017   /* At -O0 dataflow info isn't updated after RA.  */
4018   return optimize > 0 && flag_delayed_branch && !crtl->dbr_scheduled_p;
4019 #else
4020   return 0;
4021 #endif
4022 }
4023
4024 } // anon namespace
4025
4026 rtl_opt_pass *
4027 make_pass_delay_slots (gcc::context *ctxt)
4028 {
4029   return new pass_delay_slots (ctxt);
4030 }
4031
4032 /* Machine dependent reorg pass.  */
4033
4034 namespace {
4035
4036 const pass_data pass_data_machine_reorg =
4037 {
4038   RTL_PASS, /* type */
4039   "mach", /* name */
4040   OPTGROUP_NONE, /* optinfo_flags */
4041   TV_MACH_DEP, /* tv_id */
4042   0, /* properties_required */
4043   0, /* properties_provided */
4044   0, /* properties_destroyed */
4045   0, /* todo_flags_start */
4046   0, /* todo_flags_finish */
4047 };
4048
4049 class pass_machine_reorg : public rtl_opt_pass
4050 {
4051 public:
4052   pass_machine_reorg (gcc::context *ctxt)
4053     : rtl_opt_pass (pass_data_machine_reorg, ctxt)
4054   {}
4055
4056   /* opt_pass methods: */
4057   virtual bool gate (function *)
4058     {
4059       return targetm.machine_dependent_reorg != 0;
4060     }
4061
4062   virtual unsigned int execute (function *)
4063     {
4064       targetm.machine_dependent_reorg ();
4065       return 0;
4066     }
4067
4068 }; // class pass_machine_reorg
4069
4070 } // anon namespace
4071
4072 rtl_opt_pass *
4073 make_pass_machine_reorg (gcc::context *ctxt)
4074 {
4075   return new pass_machine_reorg (ctxt);
4076 }