OpenCores
URL https://opencores.org/ocsvn/scarts/scarts/trunk

Subversion Repositories scarts

[/] [scarts/] [trunk/] [toolchain/] [scarts-gcc/] [gcc-4.1.1/] [gcc/] [reorg.c] - Blame information for rev 20

Go to most recent revision | Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.