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

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-old/] [gcc-4.2.2/] [gcc/] [reorg.c] - Blame information for rev 858

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

Line No. Rev Author Line
1 38 julius
/* 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, 2007
4
   Free Software Foundation, Inc.
5
   Contributed by Richard Kenner (kenner@vlsi1.ultra.nyu.edu).
6
   Hacked by Michael Tiemann (tiemann@cygnus.com).
7
 
8
This file is part of GCC.
9
 
10
GCC is free software; you can redistribute it and/or modify it under
11
the terms of the GNU General Public License as published by the Free
12
Software Foundation; either version 3, or (at your option) any later
13
version.
14
 
15
GCC is distributed in the hope that it will be useful, but WITHOUT ANY
16
WARRANTY; without even the implied warranty of MERCHANTABILITY or
17
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
18
for more details.
19
 
20
You should have received a copy of the GNU General Public License
21
along with GCC; see the file COPYING3.  If not see
22
<http://www.gnu.org/licenses/>.  */
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 note;
967
  int rare_dest, rare_fallthrough;
968
 
969
  /* If branch probabilities are available, then use that number since it
970
     always gives a correct answer.  */
971
  note = find_reg_note (jump_insn, REG_BR_PROB, 0);
972
  if (note)
973
    {
974
      int prob = INTVAL (XEXP (note, 0));
975
 
976
      if (prob >= REG_BR_PROB_BASE * 9 / 10)
977
        return 2;
978
      else if (prob >= REG_BR_PROB_BASE / 2)
979
        return 1;
980
      else if (prob >= REG_BR_PROB_BASE / 10)
981
        return 0;
982
      else
983
        return -1;
984
    }
985
 
986
  /* Look at the relative rarities of the fallthrough and destination.  If
987
     they differ, we can predict the branch that way.  */
988
  rare_dest = rare_destination (target_label);
989
  rare_fallthrough = rare_destination (NEXT_INSN (jump_insn));
990
 
991
  switch (rare_fallthrough - rare_dest)
992
    {
993
    case -2:
994
      return -1;
995
    case -1:
996
      return 0;
997
    case 0:
998
      break;
999
    case 1:
1000
      return 1;
1001
    case 2:
1002
      return 2;
1003
    }
1004
 
1005
  /* If we couldn't figure out what this jump was, assume it won't be
1006
     taken.  This should be rare.  */
1007
  if (condition == 0)
1008
    return 0;
1009
 
1010
  /* Predict backward branches usually take, forward branches usually not.  If
1011
     we don't know whether this is forward or backward, assume the branch
1012
     will be taken, since most are.  */
1013
  return (target_label == 0 || INSN_UID (jump_insn) > max_uid
1014
          || INSN_UID (target_label) > max_uid
1015
          || (uid_to_ruid[INSN_UID (jump_insn)]
1016
              > uid_to_ruid[INSN_UID (target_label)]));
1017
}
1018
 
1019
/* Return the condition under which INSN will branch to TARGET.  If TARGET
1020
   is zero, return the condition under which INSN will return.  If INSN is
1021
   an unconditional branch, return const_true_rtx.  If INSN isn't a simple
1022
   type of jump, or it doesn't go to TARGET, return 0.  */
1023
 
1024
static rtx
1025
get_branch_condition (rtx insn, rtx target)
1026
{
1027
  rtx pat = PATTERN (insn);
1028
  rtx src;
1029
 
1030
  if (condjump_in_parallel_p (insn))
1031
    pat = XVECEXP (pat, 0, 0);
1032
 
1033
  if (GET_CODE (pat) == RETURN)
1034
    return target == 0 ? const_true_rtx : 0;
1035
 
1036
  else if (GET_CODE (pat) != SET || SET_DEST (pat) != pc_rtx)
1037
    return 0;
1038
 
1039
  src = SET_SRC (pat);
1040
  if (GET_CODE (src) == LABEL_REF && XEXP (src, 0) == target)
1041
    return const_true_rtx;
1042
 
1043
  else if (GET_CODE (src) == IF_THEN_ELSE
1044
           && ((target == 0 && GET_CODE (XEXP (src, 1)) == RETURN)
1045
               || (GET_CODE (XEXP (src, 1)) == LABEL_REF
1046
                   && XEXP (XEXP (src, 1), 0) == target))
1047
           && XEXP (src, 2) == pc_rtx)
1048
    return XEXP (src, 0);
1049
 
1050
  else if (GET_CODE (src) == IF_THEN_ELSE
1051
           && ((target == 0 && GET_CODE (XEXP (src, 2)) == RETURN)
1052
               || (GET_CODE (XEXP (src, 2)) == LABEL_REF
1053
                   && XEXP (XEXP (src, 2), 0) == target))
1054
           && XEXP (src, 1) == pc_rtx)
1055
    {
1056
      enum rtx_code rev;
1057
      rev = reversed_comparison_code (XEXP (src, 0), insn);
1058
      if (rev != UNKNOWN)
1059
        return gen_rtx_fmt_ee (rev, GET_MODE (XEXP (src, 0)),
1060
                               XEXP (XEXP (src, 0), 0),
1061
                               XEXP (XEXP (src, 0), 1));
1062
    }
1063
 
1064
  return 0;
1065
}
1066
 
1067
/* Return nonzero if CONDITION is more strict than the condition of
1068
   INSN, i.e., if INSN will always branch if CONDITION is true.  */
1069
 
1070
static int
1071
condition_dominates_p (rtx condition, rtx insn)
1072
{
1073
  rtx other_condition = get_branch_condition (insn, JUMP_LABEL (insn));
1074
  enum rtx_code code = GET_CODE (condition);
1075
  enum rtx_code other_code;
1076
 
1077
  if (rtx_equal_p (condition, other_condition)
1078
      || other_condition == const_true_rtx)
1079
    return 1;
1080
 
1081
  else if (condition == const_true_rtx || other_condition == 0)
1082
    return 0;
1083
 
1084
  other_code = GET_CODE (other_condition);
1085
  if (GET_RTX_LENGTH (code) != 2 || GET_RTX_LENGTH (other_code) != 2
1086
      || ! rtx_equal_p (XEXP (condition, 0), XEXP (other_condition, 0))
1087
      || ! rtx_equal_p (XEXP (condition, 1), XEXP (other_condition, 1)))
1088
    return 0;
1089
 
1090
  return comparison_dominates_p (code, other_code);
1091
}
1092
 
1093
/* Return nonzero if redirecting JUMP to NEWLABEL does not invalidate
1094
   any insns already in the delay slot of JUMP.  */
1095
 
1096
static int
1097
redirect_with_delay_slots_safe_p (rtx jump, rtx newlabel, rtx seq)
1098
{
1099
  int flags, i;
1100
  rtx pat = PATTERN (seq);
1101
 
1102
  /* Make sure all the delay slots of this jump would still
1103
     be valid after threading the jump.  If they are still
1104
     valid, then return nonzero.  */
1105
 
1106
  flags = get_jump_flags (jump, newlabel);
1107
  for (i = 1; i < XVECLEN (pat, 0); i++)
1108
    if (! (
1109
#ifdef ANNUL_IFFALSE_SLOTS
1110
           (INSN_ANNULLED_BRANCH_P (jump)
1111
            && INSN_FROM_TARGET_P (XVECEXP (pat, 0, i)))
1112
           ? eligible_for_annul_false (jump, i - 1,
1113
                                       XVECEXP (pat, 0, i), flags) :
1114
#endif
1115
#ifdef ANNUL_IFTRUE_SLOTS
1116
           (INSN_ANNULLED_BRANCH_P (jump)
1117
            && ! INSN_FROM_TARGET_P (XVECEXP (pat, 0, i)))
1118
           ? eligible_for_annul_true (jump, i - 1,
1119
                                      XVECEXP (pat, 0, i), flags) :
1120
#endif
1121
           eligible_for_delay (jump, i - 1, XVECEXP (pat, 0, i), flags)))
1122
      break;
1123
 
1124
  return (i == XVECLEN (pat, 0));
1125
}
1126
 
1127
/* Return nonzero if redirecting JUMP to NEWLABEL does not invalidate
1128
   any insns we wish to place in the delay slot of JUMP.  */
1129
 
1130
static int
1131
redirect_with_delay_list_safe_p (rtx jump, rtx newlabel, rtx delay_list)
1132
{
1133
  int flags, i;
1134
  rtx li;
1135
 
1136
  /* Make sure all the insns in DELAY_LIST would still be
1137
     valid after threading the jump.  If they are still
1138
     valid, then return nonzero.  */
1139
 
1140
  flags = get_jump_flags (jump, newlabel);
1141
  for (li = delay_list, i = 0; li; li = XEXP (li, 1), i++)
1142
    if (! (
1143
#ifdef ANNUL_IFFALSE_SLOTS
1144
           (INSN_ANNULLED_BRANCH_P (jump)
1145
            && INSN_FROM_TARGET_P (XEXP (li, 0)))
1146
           ? eligible_for_annul_false (jump, i, XEXP (li, 0), flags) :
1147
#endif
1148
#ifdef ANNUL_IFTRUE_SLOTS
1149
           (INSN_ANNULLED_BRANCH_P (jump)
1150
            && ! INSN_FROM_TARGET_P (XEXP (li, 0)))
1151
           ? eligible_for_annul_true (jump, i, XEXP (li, 0), flags) :
1152
#endif
1153
           eligible_for_delay (jump, i, XEXP (li, 0), flags)))
1154
      break;
1155
 
1156
  return (li == NULL);
1157
}
1158
 
1159
/* DELAY_LIST is a list of insns that have already been placed into delay
1160
   slots.  See if all of them have the same annulling status as ANNUL_TRUE_P.
1161
   If not, return 0; otherwise return 1.  */
1162
 
1163
static int
1164
check_annul_list_true_false (int annul_true_p, rtx delay_list)
1165
{
1166
  rtx temp;
1167
 
1168
  if (delay_list)
1169
    {
1170
      for (temp = delay_list; temp; temp = XEXP (temp, 1))
1171
        {
1172
          rtx trial = XEXP (temp, 0);
1173
 
1174
          if ((annul_true_p && INSN_FROM_TARGET_P (trial))
1175
              || (!annul_true_p && !INSN_FROM_TARGET_P (trial)))
1176
            return 0;
1177
        }
1178
    }
1179
 
1180
  return 1;
1181
}
1182
 
1183
/* INSN branches to an insn whose pattern SEQ is a SEQUENCE.  Given that
1184
   the condition tested by INSN is CONDITION and the resources shown in
1185
   OTHER_NEEDED are needed after INSN, see whether INSN can take all the insns
1186
   from SEQ's delay list, in addition to whatever insns it may execute
1187
   (in DELAY_LIST).   SETS and NEEDED are denote resources already set and
1188
   needed while searching for delay slot insns.  Return the concatenated
1189
   delay list if possible, otherwise, return 0.
1190
 
1191
   SLOTS_TO_FILL is the total number of slots required by INSN, and
1192
   PSLOTS_FILLED points to the number filled so far (also the number of
1193
   insns in DELAY_LIST).  It is updated with the number that have been
1194
   filled from the SEQUENCE, if any.
1195
 
1196
   PANNUL_P points to a nonzero value if we already know that we need
1197
   to annul INSN.  If this routine determines that annulling is needed,
1198
   it may set that value nonzero.
1199
 
1200
   PNEW_THREAD points to a location that is to receive the place at which
1201
   execution should continue.  */
1202
 
1203
static rtx
1204
steal_delay_list_from_target (rtx insn, rtx condition, rtx seq,
1205
                              rtx delay_list, struct resources *sets,
1206
                              struct resources *needed,
1207
                              struct resources *other_needed,
1208
                              int slots_to_fill, int *pslots_filled,
1209
                              int *pannul_p, rtx *pnew_thread)
1210
{
1211
  rtx temp;
1212
  int slots_remaining = slots_to_fill - *pslots_filled;
1213
  int total_slots_filled = *pslots_filled;
1214
  rtx new_delay_list = 0;
1215
  int must_annul = *pannul_p;
1216
  int used_annul = 0;
1217
  int i;
1218
  struct resources cc_set;
1219
 
1220
  /* We can't do anything if there are more delay slots in SEQ than we
1221
     can handle, or if we don't know that it will be a taken branch.
1222
     We know that it will be a taken branch if it is either an unconditional
1223
     branch or a conditional branch with a stricter branch condition.
1224
 
1225
     Also, exit if the branch has more than one set, since then it is computing
1226
     other results that can't be ignored, e.g. the HPPA mov&branch instruction.
1227
     ??? It may be possible to move other sets into INSN in addition to
1228
     moving the instructions in the delay slots.
1229
 
1230
     We can not steal the delay list if one of the instructions in the
1231
     current delay_list modifies the condition codes and the jump in the
1232
     sequence is a conditional jump. We can not do this because we can
1233
     not change the direction of the jump because the condition codes
1234
     will effect the direction of the jump in the sequence.  */
1235
 
1236
  CLEAR_RESOURCE (&cc_set);
1237
  for (temp = delay_list; temp; temp = XEXP (temp, 1))
1238
    {
1239
      rtx trial = XEXP (temp, 0);
1240
 
1241
      mark_set_resources (trial, &cc_set, 0, MARK_SRC_DEST_CALL);
1242
      if (insn_references_resource_p (XVECEXP (seq , 0, 0), &cc_set, 0))
1243
        return delay_list;
1244
    }
1245
 
1246
  if (XVECLEN (seq, 0) - 1 > slots_remaining
1247
      || ! condition_dominates_p (condition, XVECEXP (seq, 0, 0))
1248
      || ! single_set (XVECEXP (seq, 0, 0)))
1249
    return delay_list;
1250
 
1251
#ifdef MD_CAN_REDIRECT_BRANCH
1252
  /* On some targets, branches with delay slots can have a limited
1253
     displacement.  Give the back end a chance to tell us we can't do
1254
     this.  */
1255
  if (! MD_CAN_REDIRECT_BRANCH (insn, XVECEXP (seq, 0, 0)))
1256
    return delay_list;
1257
#endif
1258
 
1259
  for (i = 1; i < XVECLEN (seq, 0); i++)
1260
    {
1261
      rtx trial = XVECEXP (seq, 0, i);
1262
      int flags;
1263
 
1264
      if (insn_references_resource_p (trial, sets, 0)
1265
          || insn_sets_resource_p (trial, needed, 0)
1266
          || insn_sets_resource_p (trial, sets, 0)
1267
#ifdef HAVE_cc0
1268
          /* If TRIAL sets CC0, we can't copy it, so we can't steal this
1269
             delay list.  */
1270
          || find_reg_note (trial, REG_CC_USER, NULL_RTX)
1271
#endif
1272
          /* If TRIAL is from the fallthrough code of an annulled branch insn
1273
             in SEQ, we cannot use it.  */
1274
          || (INSN_ANNULLED_BRANCH_P (XVECEXP (seq, 0, 0))
1275
              && ! INSN_FROM_TARGET_P (trial)))
1276
        return delay_list;
1277
 
1278
      /* If this insn was already done (usually in a previous delay slot),
1279
         pretend we put it in our delay slot.  */
1280
      if (redundant_insn (trial, insn, new_delay_list))
1281
        continue;
1282
 
1283
      /* We will end up re-vectoring this branch, so compute flags
1284
         based on jumping to the new label.  */
1285
      flags = get_jump_flags (insn, JUMP_LABEL (XVECEXP (seq, 0, 0)));
1286
 
1287
      if (! must_annul
1288
          && ((condition == const_true_rtx
1289
               || (! insn_sets_resource_p (trial, other_needed, 0)
1290
                   && ! may_trap_or_fault_p (PATTERN (trial)))))
1291
          ? eligible_for_delay (insn, total_slots_filled, trial, flags)
1292
          : (must_annul || (delay_list == NULL && new_delay_list == NULL))
1293
             && (must_annul = 1,
1294
                 check_annul_list_true_false (0, delay_list)
1295
                 && check_annul_list_true_false (0, new_delay_list)
1296
                 && eligible_for_annul_false (insn, total_slots_filled,
1297
                                              trial, flags)))
1298
        {
1299
          if (must_annul)
1300
            used_annul = 1;
1301
          temp = copy_rtx (trial);
1302
          INSN_FROM_TARGET_P (temp) = 1;
1303
          new_delay_list = add_to_delay_list (temp, new_delay_list);
1304
          total_slots_filled++;
1305
 
1306
          if (--slots_remaining == 0)
1307
            break;
1308
        }
1309
      else
1310
        return delay_list;
1311
    }
1312
 
1313
  /* Show the place to which we will be branching.  */
1314
  *pnew_thread = next_active_insn (JUMP_LABEL (XVECEXP (seq, 0, 0)));
1315
 
1316
  /* Add any new insns to the delay list and update the count of the
1317
     number of slots filled.  */
1318
  *pslots_filled = total_slots_filled;
1319
  if (used_annul)
1320
    *pannul_p = 1;
1321
 
1322
  if (delay_list == 0)
1323
    return new_delay_list;
1324
 
1325
  for (temp = new_delay_list; temp; temp = XEXP (temp, 1))
1326
    delay_list = add_to_delay_list (XEXP (temp, 0), delay_list);
1327
 
1328
  return delay_list;
1329
}
1330
 
1331
/* Similar to steal_delay_list_from_target except that SEQ is on the
1332
   fallthrough path of INSN.  Here we only do something if the delay insn
1333
   of SEQ is an unconditional branch.  In that case we steal its delay slot
1334
   for INSN since unconditional branches are much easier to fill.  */
1335
 
1336
static rtx
1337
steal_delay_list_from_fallthrough (rtx insn, rtx condition, rtx seq,
1338
                                   rtx delay_list, struct resources *sets,
1339
                                   struct resources *needed,
1340
                                   struct resources *other_needed,
1341
                                   int slots_to_fill, int *pslots_filled,
1342
                                   int *pannul_p)
1343
{
1344
  int i;
1345
  int flags;
1346
  int must_annul = *pannul_p;
1347
  int used_annul = 0;
1348
 
1349
  flags = get_jump_flags (insn, JUMP_LABEL (insn));
1350
 
1351
  /* We can't do anything if SEQ's delay insn isn't an
1352
     unconditional branch.  */
1353
 
1354
  if (! simplejump_p (XVECEXP (seq, 0, 0))
1355
      && GET_CODE (PATTERN (XVECEXP (seq, 0, 0))) != RETURN)
1356
    return delay_list;
1357
 
1358
  for (i = 1; i < XVECLEN (seq, 0); i++)
1359
    {
1360
      rtx trial = XVECEXP (seq, 0, i);
1361
 
1362
      /* If TRIAL sets CC0, stealing it will move it too far from the use
1363
         of CC0.  */
1364
      if (insn_references_resource_p (trial, sets, 0)
1365
          || insn_sets_resource_p (trial, needed, 0)
1366
          || insn_sets_resource_p (trial, sets, 0)
1367
#ifdef HAVE_cc0
1368
          || sets_cc0_p (PATTERN (trial))
1369
#endif
1370
          )
1371
 
1372
        break;
1373
 
1374
      /* If this insn was already done, we don't need it.  */
1375
      if (redundant_insn (trial, insn, delay_list))
1376
        {
1377
          delete_from_delay_slot (trial);
1378
          continue;
1379
        }
1380
 
1381
      if (! must_annul
1382
          && ((condition == const_true_rtx
1383
               || (! insn_sets_resource_p (trial, other_needed, 0)
1384
                   && ! may_trap_or_fault_p (PATTERN (trial)))))
1385
          ? eligible_for_delay (insn, *pslots_filled, trial, flags)
1386
          : (must_annul || delay_list == NULL) && (must_annul = 1,
1387
             check_annul_list_true_false (1, delay_list)
1388
             && eligible_for_annul_true (insn, *pslots_filled, trial, flags)))
1389
        {
1390
          if (must_annul)
1391
            used_annul = 1;
1392
          delete_from_delay_slot (trial);
1393
          delay_list = add_to_delay_list (trial, delay_list);
1394
 
1395
          if (++(*pslots_filled) == slots_to_fill)
1396
            break;
1397
        }
1398
      else
1399
        break;
1400
    }
1401
 
1402
  if (used_annul)
1403
    *pannul_p = 1;
1404
  return delay_list;
1405
}
1406
 
1407
/* Try merging insns starting at THREAD which match exactly the insns in
1408
   INSN's delay list.
1409
 
1410
   If all insns were matched and the insn was previously annulling, the
1411
   annul bit will be cleared.
1412
 
1413
   For each insn that is merged, if the branch is or will be non-annulling,
1414
   we delete the merged insn.  */
1415
 
1416
static void
1417
try_merge_delay_insns (rtx insn, rtx thread)
1418
{
1419
  rtx trial, next_trial;
1420
  rtx delay_insn = XVECEXP (PATTERN (insn), 0, 0);
1421
  int annul_p = INSN_ANNULLED_BRANCH_P (delay_insn);
1422
  int slot_number = 1;
1423
  int num_slots = XVECLEN (PATTERN (insn), 0);
1424
  rtx next_to_match = XVECEXP (PATTERN (insn), 0, slot_number);
1425
  struct resources set, needed;
1426
  rtx merged_insns = 0;
1427
  int i;
1428
  int flags;
1429
 
1430
  flags = get_jump_flags (delay_insn, JUMP_LABEL (delay_insn));
1431
 
1432
  CLEAR_RESOURCE (&needed);
1433
  CLEAR_RESOURCE (&set);
1434
 
1435
  /* If this is not an annulling branch, take into account anything needed in
1436
     INSN's delay slot.  This prevents two increments from being incorrectly
1437
     folded into one.  If we are annulling, this would be the correct
1438
     thing to do.  (The alternative, looking at things set in NEXT_TO_MATCH
1439
     will essentially disable this optimization.  This method is somewhat of
1440
     a kludge, but I don't see a better way.)  */
1441
  if (! annul_p)
1442
    for (i = 1 ; i < num_slots; i++)
1443
      if (XVECEXP (PATTERN (insn), 0, i))
1444
        mark_referenced_resources (XVECEXP (PATTERN (insn), 0, i), &needed, 1);
1445
 
1446
  for (trial = thread; !stop_search_p (trial, 1); trial = next_trial)
1447
    {
1448
      rtx pat = PATTERN (trial);
1449
      rtx oldtrial = trial;
1450
 
1451
      next_trial = next_nonnote_insn (trial);
1452
 
1453
      /* TRIAL must be a CALL_INSN or INSN.  Skip USE and CLOBBER.  */
1454
      if (NONJUMP_INSN_P (trial)
1455
          && (GET_CODE (pat) == USE || GET_CODE (pat) == CLOBBER))
1456
        continue;
1457
 
1458
      if (GET_CODE (next_to_match) == GET_CODE (trial)
1459
#ifdef HAVE_cc0
1460
          /* We can't share an insn that sets cc0.  */
1461
          && ! sets_cc0_p (pat)
1462
#endif
1463
          && ! insn_references_resource_p (trial, &set, 1)
1464
          && ! insn_sets_resource_p (trial, &set, 1)
1465
          && ! insn_sets_resource_p (trial, &needed, 1)
1466
          && (trial = try_split (pat, trial, 0)) != 0
1467
          /* Update next_trial, in case try_split succeeded.  */
1468
          && (next_trial = next_nonnote_insn (trial))
1469
          /* Likewise THREAD.  */
1470
          && (thread = oldtrial == thread ? trial : thread)
1471
          && rtx_equal_p (PATTERN (next_to_match), PATTERN (trial))
1472
          /* Have to test this condition if annul condition is different
1473
             from (and less restrictive than) non-annulling one.  */
1474
          && eligible_for_delay (delay_insn, slot_number - 1, trial, flags))
1475
        {
1476
 
1477
          if (! annul_p)
1478
            {
1479
              update_block (trial, thread);
1480
              if (trial == thread)
1481
                thread = next_active_insn (thread);
1482
 
1483
              delete_related_insns (trial);
1484
              INSN_FROM_TARGET_P (next_to_match) = 0;
1485
            }
1486
          else
1487
            merged_insns = gen_rtx_INSN_LIST (VOIDmode, trial, merged_insns);
1488
 
1489
          if (++slot_number == num_slots)
1490
            break;
1491
 
1492
          next_to_match = XVECEXP (PATTERN (insn), 0, slot_number);
1493
        }
1494
 
1495
      mark_set_resources (trial, &set, 0, MARK_SRC_DEST_CALL);
1496
      mark_referenced_resources (trial, &needed, 1);
1497
    }
1498
 
1499
  /* See if we stopped on a filled insn.  If we did, try to see if its
1500
     delay slots match.  */
1501
  if (slot_number != num_slots
1502
      && trial && NONJUMP_INSN_P (trial)
1503
      && GET_CODE (PATTERN (trial)) == SEQUENCE
1504
      && ! INSN_ANNULLED_BRANCH_P (XVECEXP (PATTERN (trial), 0, 0)))
1505
    {
1506
      rtx pat = PATTERN (trial);
1507
      rtx filled_insn = XVECEXP (pat, 0, 0);
1508
 
1509
      /* Account for resources set/needed by the filled insn.  */
1510
      mark_set_resources (filled_insn, &set, 0, MARK_SRC_DEST_CALL);
1511
      mark_referenced_resources (filled_insn, &needed, 1);
1512
 
1513
      for (i = 1; i < XVECLEN (pat, 0); i++)
1514
        {
1515
          rtx dtrial = XVECEXP (pat, 0, i);
1516
 
1517
          if (! insn_references_resource_p (dtrial, &set, 1)
1518
              && ! insn_sets_resource_p (dtrial, &set, 1)
1519
              && ! insn_sets_resource_p (dtrial, &needed, 1)
1520
#ifdef HAVE_cc0
1521
              && ! sets_cc0_p (PATTERN (dtrial))
1522
#endif
1523
              && rtx_equal_p (PATTERN (next_to_match), PATTERN (dtrial))
1524
              && eligible_for_delay (delay_insn, slot_number - 1, dtrial, flags))
1525
            {
1526
              if (! annul_p)
1527
                {
1528
                  rtx new;
1529
 
1530
                  update_block (dtrial, thread);
1531
                  new = delete_from_delay_slot (dtrial);
1532
                  if (INSN_DELETED_P (thread))
1533
                    thread = new;
1534
                  INSN_FROM_TARGET_P (next_to_match) = 0;
1535
                }
1536
              else
1537
                merged_insns = gen_rtx_INSN_LIST (SImode, dtrial,
1538
                                                  merged_insns);
1539
 
1540
              if (++slot_number == num_slots)
1541
                break;
1542
 
1543
              next_to_match = XVECEXP (PATTERN (insn), 0, slot_number);
1544
            }
1545
          else
1546
            {
1547
              /* Keep track of the set/referenced resources for the delay
1548
                 slots of any trial insns we encounter.  */
1549
              mark_set_resources (dtrial, &set, 0, MARK_SRC_DEST_CALL);
1550
              mark_referenced_resources (dtrial, &needed, 1);
1551
            }
1552
        }
1553
    }
1554
 
1555
  /* If all insns in the delay slot have been matched and we were previously
1556
     annulling the branch, we need not any more.  In that case delete all the
1557
     merged insns.  Also clear the INSN_FROM_TARGET_P bit of each insn in
1558
     the delay list so that we know that it isn't only being used at the
1559
     target.  */
1560
  if (slot_number == num_slots && annul_p)
1561
    {
1562
      for (; merged_insns; merged_insns = XEXP (merged_insns, 1))
1563
        {
1564
          if (GET_MODE (merged_insns) == SImode)
1565
            {
1566
              rtx new;
1567
 
1568
              update_block (XEXP (merged_insns, 0), thread);
1569
              new = delete_from_delay_slot (XEXP (merged_insns, 0));
1570
              if (INSN_DELETED_P (thread))
1571
                thread = new;
1572
            }
1573
          else
1574
            {
1575
              update_block (XEXP (merged_insns, 0), thread);
1576
              delete_related_insns (XEXP (merged_insns, 0));
1577
            }
1578
        }
1579
 
1580
      INSN_ANNULLED_BRANCH_P (delay_insn) = 0;
1581
 
1582
      for (i = 0; i < XVECLEN (PATTERN (insn), 0); i++)
1583
        INSN_FROM_TARGET_P (XVECEXP (PATTERN (insn), 0, i)) = 0;
1584
    }
1585
}
1586
 
1587
/* See if INSN is redundant with an insn in front of TARGET.  Often this
1588
   is called when INSN is a candidate for a delay slot of TARGET.
1589
   DELAY_LIST are insns that will be placed in delay slots of TARGET in front
1590
   of INSN.  Often INSN will be redundant with an insn in a delay slot of
1591
   some previous insn.  This happens when we have a series of branches to the
1592
   same label; in that case the first insn at the target might want to go
1593
   into each of the delay slots.
1594
 
1595
   If we are not careful, this routine can take up a significant fraction
1596
   of the total compilation time (4%), but only wins rarely.  Hence we
1597
   speed this routine up by making two passes.  The first pass goes back
1598
   until it hits a label and sees if it finds an insn with an identical
1599
   pattern.  Only in this (relatively rare) event does it check for
1600
   data conflicts.
1601
 
1602
   We do not split insns we encounter.  This could cause us not to find a
1603
   redundant insn, but the cost of splitting seems greater than the possible
1604
   gain in rare cases.  */
1605
 
1606
static rtx
1607
redundant_insn (rtx insn, rtx target, rtx delay_list)
1608
{
1609
  rtx target_main = target;
1610
  rtx ipat = PATTERN (insn);
1611
  rtx trial, pat;
1612
  struct resources needed, set;
1613
  int i;
1614
  unsigned insns_to_search;
1615
 
1616
  /* If INSN has any REG_UNUSED notes, it can't match anything since we
1617
     are allowed to not actually assign to such a register.  */
1618
  if (find_reg_note (insn, REG_UNUSED, NULL_RTX) != 0)
1619
    return 0;
1620
 
1621
  /* Scan backwards looking for a match.  */
1622
  for (trial = PREV_INSN (target),
1623
         insns_to_search = MAX_DELAY_SLOT_INSN_SEARCH;
1624
       trial && insns_to_search > 0;
1625
       trial = PREV_INSN (trial), --insns_to_search)
1626
    {
1627
      if (LABEL_P (trial))
1628
        return 0;
1629
 
1630
      if (! INSN_P (trial))
1631
        continue;
1632
 
1633
      pat = PATTERN (trial);
1634
      if (GET_CODE (pat) == USE || GET_CODE (pat) == CLOBBER)
1635
        continue;
1636
 
1637
      if (GET_CODE (pat) == SEQUENCE)
1638
        {
1639
          /* Stop for a CALL and its delay slots because it is difficult to
1640
             track its resource needs correctly.  */
1641
          if (CALL_P (XVECEXP (pat, 0, 0)))
1642
            return 0;
1643
 
1644
          /* Stop for an INSN or JUMP_INSN with delayed effects and its delay
1645
             slots because it is difficult to track its resource needs
1646
             correctly.  */
1647
 
1648
#ifdef INSN_SETS_ARE_DELAYED
1649
          if (INSN_SETS_ARE_DELAYED (XVECEXP (pat, 0, 0)))
1650
            return 0;
1651
#endif
1652
 
1653
#ifdef INSN_REFERENCES_ARE_DELAYED
1654
          if (INSN_REFERENCES_ARE_DELAYED (XVECEXP (pat, 0, 0)))
1655
            return 0;
1656
#endif
1657
 
1658
          /* See if any of the insns in the delay slot match, updating
1659
             resource requirements as we go.  */
1660
          for (i = XVECLEN (pat, 0) - 1; i > 0; i--)
1661
            if (GET_CODE (XVECEXP (pat, 0, i)) == GET_CODE (insn)
1662
                && rtx_equal_p (PATTERN (XVECEXP (pat, 0, i)), ipat)
1663
                && ! find_reg_note (XVECEXP (pat, 0, i), REG_UNUSED, NULL_RTX))
1664
              break;
1665
 
1666
          /* If found a match, exit this loop early.  */
1667
          if (i > 0)
1668
            break;
1669
        }
1670
 
1671
      else if (GET_CODE (trial) == GET_CODE (insn) && rtx_equal_p (pat, ipat)
1672
               && ! find_reg_note (trial, REG_UNUSED, NULL_RTX))
1673
        break;
1674
    }
1675
 
1676
  /* If we didn't find an insn that matches, return 0.  */
1677
  if (trial == 0)
1678
    return 0;
1679
 
1680
  /* See what resources this insn sets and needs.  If they overlap, or
1681
     if this insn references CC0, it can't be redundant.  */
1682
 
1683
  CLEAR_RESOURCE (&needed);
1684
  CLEAR_RESOURCE (&set);
1685
  mark_set_resources (insn, &set, 0, MARK_SRC_DEST_CALL);
1686
  mark_referenced_resources (insn, &needed, 1);
1687
 
1688
  /* If TARGET is a SEQUENCE, get the main insn.  */
1689
  if (NONJUMP_INSN_P (target) && GET_CODE (PATTERN (target)) == SEQUENCE)
1690
    target_main = XVECEXP (PATTERN (target), 0, 0);
1691
 
1692
  if (resource_conflicts_p (&needed, &set)
1693
#ifdef HAVE_cc0
1694
      || reg_mentioned_p (cc0_rtx, ipat)
1695
#endif
1696
      /* The insn requiring the delay may not set anything needed or set by
1697
         INSN.  */
1698
      || insn_sets_resource_p (target_main, &needed, 1)
1699
      || insn_sets_resource_p (target_main, &set, 1))
1700
    return 0;
1701
 
1702
  /* Insns we pass may not set either NEEDED or SET, so merge them for
1703
     simpler tests.  */
1704
  needed.memory |= set.memory;
1705
  needed.unch_memory |= set.unch_memory;
1706
  IOR_HARD_REG_SET (needed.regs, set.regs);
1707
 
1708
  /* This insn isn't redundant if it conflicts with an insn that either is
1709
     or will be in a delay slot of TARGET.  */
1710
 
1711
  while (delay_list)
1712
    {
1713
      if (insn_sets_resource_p (XEXP (delay_list, 0), &needed, 1))
1714
        return 0;
1715
      delay_list = XEXP (delay_list, 1);
1716
    }
1717
 
1718
  if (NONJUMP_INSN_P (target) && GET_CODE (PATTERN (target)) == SEQUENCE)
1719
    for (i = 1; i < XVECLEN (PATTERN (target), 0); i++)
1720
      if (insn_sets_resource_p (XVECEXP (PATTERN (target), 0, i), &needed, 1))
1721
        return 0;
1722
 
1723
  /* Scan backwards until we reach a label or an insn that uses something
1724
     INSN sets or sets something insn uses or sets.  */
1725
 
1726
  for (trial = PREV_INSN (target),
1727
         insns_to_search = MAX_DELAY_SLOT_INSN_SEARCH;
1728
       trial && !LABEL_P (trial) && insns_to_search > 0;
1729
       trial = PREV_INSN (trial), --insns_to_search)
1730
    {
1731
      if (!INSN_P (trial))
1732
        continue;
1733
 
1734
      pat = PATTERN (trial);
1735
      if (GET_CODE (pat) == USE || GET_CODE (pat) == CLOBBER)
1736
        continue;
1737
 
1738
      if (GET_CODE (pat) == SEQUENCE)
1739
        {
1740
          /* If this is a CALL_INSN and its delay slots, it is hard to track
1741
             the resource needs properly, so give up.  */
1742
          if (CALL_P (XVECEXP (pat, 0, 0)))
1743
            return 0;
1744
 
1745
          /* If this is an INSN or JUMP_INSN with delayed effects, it
1746
             is hard to track the resource needs properly, so give up.  */
1747
 
1748
#ifdef INSN_SETS_ARE_DELAYED
1749
          if (INSN_SETS_ARE_DELAYED (XVECEXP (pat, 0, 0)))
1750
            return 0;
1751
#endif
1752
 
1753
#ifdef INSN_REFERENCES_ARE_DELAYED
1754
          if (INSN_REFERENCES_ARE_DELAYED (XVECEXP (pat, 0, 0)))
1755
            return 0;
1756
#endif
1757
 
1758
          /* See if any of the insns in the delay slot match, updating
1759
             resource requirements as we go.  */
1760
          for (i = XVECLEN (pat, 0) - 1; i > 0; i--)
1761
            {
1762
              rtx candidate = XVECEXP (pat, 0, i);
1763
 
1764
              /* If an insn will be annulled if the branch is false, it isn't
1765
                 considered as a possible duplicate insn.  */
1766
              if (rtx_equal_p (PATTERN (candidate), ipat)
1767
                  && ! (INSN_ANNULLED_BRANCH_P (XVECEXP (pat, 0, 0))
1768
                        && INSN_FROM_TARGET_P (candidate)))
1769
                {
1770
                  /* Show that this insn will be used in the sequel.  */
1771
                  INSN_FROM_TARGET_P (candidate) = 0;
1772
                  return candidate;
1773
                }
1774
 
1775
              /* Unless this is an annulled insn from the target of a branch,
1776
                 we must stop if it sets anything needed or set by INSN.  */
1777
              if ((! INSN_ANNULLED_BRANCH_P (XVECEXP (pat, 0, 0))
1778
                   || ! INSN_FROM_TARGET_P (candidate))
1779
                  && insn_sets_resource_p (candidate, &needed, 1))
1780
                return 0;
1781
            }
1782
 
1783
          /* If the insn requiring the delay slot conflicts with INSN, we
1784
             must stop.  */
1785
          if (insn_sets_resource_p (XVECEXP (pat, 0, 0), &needed, 1))
1786
            return 0;
1787
        }
1788
      else
1789
        {
1790
          /* See if TRIAL is the same as INSN.  */
1791
          pat = PATTERN (trial);
1792
          if (rtx_equal_p (pat, ipat))
1793
            return trial;
1794
 
1795
          /* Can't go any further if TRIAL conflicts with INSN.  */
1796
          if (insn_sets_resource_p (trial, &needed, 1))
1797
            return 0;
1798
        }
1799
    }
1800
 
1801
  return 0;
1802
}
1803
 
1804
/* Return 1 if THREAD can only be executed in one way.  If LABEL is nonzero,
1805
   it is the target of the branch insn being scanned.  If ALLOW_FALLTHROUGH
1806
   is nonzero, we are allowed to fall into this thread; otherwise, we are
1807
   not.
1808
 
1809
   If LABEL is used more than one or we pass a label other than LABEL before
1810
   finding an active insn, we do not own this thread.  */
1811
 
1812
static int
1813
own_thread_p (rtx thread, rtx label, int allow_fallthrough)
1814
{
1815
  rtx active_insn;
1816
  rtx insn;
1817
 
1818
  /* We don't own the function end.  */
1819
  if (thread == 0)
1820
    return 0;
1821
 
1822
  /* Get the first active insn, or THREAD, if it is an active insn.  */
1823
  active_insn = next_active_insn (PREV_INSN (thread));
1824
 
1825
  for (insn = thread; insn != active_insn; insn = NEXT_INSN (insn))
1826
    if (LABEL_P (insn)
1827
        && (insn != label || LABEL_NUSES (insn) != 1))
1828
      return 0;
1829
 
1830
  if (allow_fallthrough)
1831
    return 1;
1832
 
1833
  /* Ensure that we reach a BARRIER before any insn or label.  */
1834
  for (insn = prev_nonnote_insn (thread);
1835
       insn == 0 || !BARRIER_P (insn);
1836
       insn = prev_nonnote_insn (insn))
1837
    if (insn == 0
1838
        || LABEL_P (insn)
1839
        || (NONJUMP_INSN_P (insn)
1840
            && GET_CODE (PATTERN (insn)) != USE
1841
            && GET_CODE (PATTERN (insn)) != CLOBBER))
1842
      return 0;
1843
 
1844
  return 1;
1845
}
1846
 
1847
/* Called when INSN is being moved from a location near the target of a jump.
1848
   We leave a marker of the form (use (INSN)) immediately in front
1849
   of WHERE for mark_target_live_regs.  These markers will be deleted when
1850
   reorg finishes.
1851
 
1852
   We used to try to update the live status of registers if WHERE is at
1853
   the start of a basic block, but that can't work since we may remove a
1854
   BARRIER in relax_delay_slots.  */
1855
 
1856
static void
1857
update_block (rtx insn, rtx where)
1858
{
1859
  /* Ignore if this was in a delay slot and it came from the target of
1860
     a branch.  */
1861
  if (INSN_FROM_TARGET_P (insn))
1862
    return;
1863
 
1864
  emit_insn_before (gen_rtx_USE (VOIDmode, insn), where);
1865
 
1866
  /* INSN might be making a value live in a block where it didn't use to
1867
     be.  So recompute liveness information for this block.  */
1868
 
1869
  incr_ticks_for_insn (insn);
1870
}
1871
 
1872
/* Similar to REDIRECT_JUMP except that we update the BB_TICKS entry for
1873
   the basic block containing the jump.  */
1874
 
1875
static int
1876
reorg_redirect_jump (rtx jump, rtx nlabel)
1877
{
1878
  incr_ticks_for_insn (jump);
1879
  return redirect_jump (jump, nlabel, 1);
1880
}
1881
 
1882
/* Called when INSN is being moved forward into a delay slot of DELAYED_INSN.
1883
   We check every instruction between INSN and DELAYED_INSN for REG_DEAD notes
1884
   that reference values used in INSN.  If we find one, then we move the
1885
   REG_DEAD note to INSN.
1886
 
1887
   This is needed to handle the case where a later insn (after INSN) has a
1888
   REG_DEAD note for a register used by INSN, and this later insn subsequently
1889
   gets moved before a CODE_LABEL because it is a redundant insn.  In this
1890
   case, mark_target_live_regs may be confused into thinking the register
1891
   is dead because it sees a REG_DEAD note immediately before a CODE_LABEL.  */
1892
 
1893
static void
1894
update_reg_dead_notes (rtx insn, rtx delayed_insn)
1895
{
1896
  rtx p, link, next;
1897
 
1898
  for (p = next_nonnote_insn (insn); p != delayed_insn;
1899
       p = next_nonnote_insn (p))
1900
    for (link = REG_NOTES (p); link; link = next)
1901
      {
1902
        next = XEXP (link, 1);
1903
 
1904
        if (REG_NOTE_KIND (link) != REG_DEAD
1905
            || !REG_P (XEXP (link, 0)))
1906
          continue;
1907
 
1908
        if (reg_referenced_p (XEXP (link, 0), PATTERN (insn)))
1909
          {
1910
            /* Move the REG_DEAD note from P to INSN.  */
1911
            remove_note (p, link);
1912
            XEXP (link, 1) = REG_NOTES (insn);
1913
            REG_NOTES (insn) = link;
1914
          }
1915
      }
1916
}
1917
 
1918
/* Called when an insn redundant with start_insn is deleted.  If there
1919
   is a REG_DEAD note for the target of start_insn between start_insn
1920
   and stop_insn, then the REG_DEAD note needs to be deleted since the
1921
   value no longer dies there.
1922
 
1923
   If the REG_DEAD note isn't deleted, then mark_target_live_regs may be
1924
   confused into thinking the register is dead.  */
1925
 
1926
static void
1927
fix_reg_dead_note (rtx start_insn, rtx stop_insn)
1928
{
1929
  rtx p, link, next;
1930
 
1931
  for (p = next_nonnote_insn (start_insn); p != stop_insn;
1932
       p = next_nonnote_insn (p))
1933
    for (link = REG_NOTES (p); link; link = next)
1934
      {
1935
        next = XEXP (link, 1);
1936
 
1937
        if (REG_NOTE_KIND (link) != REG_DEAD
1938
            || !REG_P (XEXP (link, 0)))
1939
          continue;
1940
 
1941
        if (reg_set_p (XEXP (link, 0), PATTERN (start_insn)))
1942
          {
1943
            remove_note (p, link);
1944
            return;
1945
          }
1946
      }
1947
}
1948
 
1949
/* Delete any REG_UNUSED notes that exist on INSN but not on REDUNDANT_INSN.
1950
 
1951
   This handles the case of udivmodXi4 instructions which optimize their
1952
   output depending on whether any REG_UNUSED notes are present.
1953
   we must make sure that INSN calculates as many results as REDUNDANT_INSN
1954
   does.  */
1955
 
1956
static void
1957
update_reg_unused_notes (rtx insn, rtx redundant_insn)
1958
{
1959
  rtx link, next;
1960
 
1961
  for (link = REG_NOTES (insn); link; link = next)
1962
    {
1963
      next = XEXP (link, 1);
1964
 
1965
      if (REG_NOTE_KIND (link) != REG_UNUSED
1966
          || !REG_P (XEXP (link, 0)))
1967
        continue;
1968
 
1969
      if (! find_regno_note (redundant_insn, REG_UNUSED,
1970
                             REGNO (XEXP (link, 0))))
1971
        remove_note (insn, link);
1972
    }
1973
}
1974
 
1975
/* Scan a function looking for insns that need a delay slot and find insns to
1976
   put into the delay slot.
1977
 
1978
   NON_JUMPS_P is nonzero if we are to only try to fill non-jump insns (such
1979
   as calls).  We do these first since we don't want jump insns (that are
1980
   easier to fill) to get the only insns that could be used for non-jump insns.
1981
   When it is zero, only try to fill JUMP_INSNs.
1982
 
1983
   When slots are filled in this manner, the insns (including the
1984
   delay_insn) are put together in a SEQUENCE rtx.  In this fashion,
1985
   it is possible to tell whether a delay slot has really been filled
1986
   or not.  `final' knows how to deal with this, by communicating
1987
   through FINAL_SEQUENCE.  */
1988
 
1989
static void
1990
fill_simple_delay_slots (int non_jumps_p)
1991
{
1992
  rtx insn, pat, trial, next_trial;
1993
  int i;
1994
  int num_unfilled_slots = unfilled_slots_next - unfilled_slots_base;
1995
  struct resources needed, set;
1996
  int slots_to_fill, slots_filled;
1997
  rtx delay_list;
1998
 
1999
  for (i = 0; i < num_unfilled_slots; i++)
2000
    {
2001
      int flags;
2002
      /* Get the next insn to fill.  If it has already had any slots assigned,
2003
         we can't do anything with it.  Maybe we'll improve this later.  */
2004
 
2005
      insn = unfilled_slots_base[i];
2006
      if (insn == 0
2007
          || INSN_DELETED_P (insn)
2008
          || (NONJUMP_INSN_P (insn)
2009
              && GET_CODE (PATTERN (insn)) == SEQUENCE)
2010
          || (JUMP_P (insn) && non_jumps_p)
2011
          || (!JUMP_P (insn) && ! non_jumps_p))
2012
        continue;
2013
 
2014
      /* It may have been that this insn used to need delay slots, but
2015
         now doesn't; ignore in that case.  This can happen, for example,
2016
         on the HP PA RISC, where the number of delay slots depends on
2017
         what insns are nearby.  */
2018
      slots_to_fill = num_delay_slots (insn);
2019
 
2020
      /* Some machine description have defined instructions to have
2021
         delay slots only in certain circumstances which may depend on
2022
         nearby insns (which change due to reorg's actions).
2023
 
2024
         For example, the PA port normally has delay slots for unconditional
2025
         jumps.
2026
 
2027
         However, the PA port claims such jumps do not have a delay slot
2028
         if they are immediate successors of certain CALL_INSNs.  This
2029
         allows the port to favor filling the delay slot of the call with
2030
         the unconditional jump.  */
2031
      if (slots_to_fill == 0)
2032
        continue;
2033
 
2034
      /* This insn needs, or can use, some delay slots.  SLOTS_TO_FILL
2035
         says how many.  After initialization, first try optimizing
2036
 
2037
         call _foo              call _foo
2038
         nop                    add %o7,.-L1,%o7
2039
         b,a L1
2040
         nop
2041
 
2042
         If this case applies, the delay slot of the call is filled with
2043
         the unconditional jump.  This is done first to avoid having the
2044
         delay slot of the call filled in the backward scan.  Also, since
2045
         the unconditional jump is likely to also have a delay slot, that
2046
         insn must exist when it is subsequently scanned.
2047
 
2048
         This is tried on each insn with delay slots as some machines
2049
         have insns which perform calls, but are not represented as
2050
         CALL_INSNs.  */
2051
 
2052
      slots_filled = 0;
2053
      delay_list = 0;
2054
 
2055
      if (JUMP_P (insn))
2056
        flags = get_jump_flags (insn, JUMP_LABEL (insn));
2057
      else
2058
        flags = get_jump_flags (insn, NULL_RTX);
2059
 
2060
      if ((trial = next_active_insn (insn))
2061
          && JUMP_P (trial)
2062
          && simplejump_p (trial)
2063
          && eligible_for_delay (insn, slots_filled, trial, flags)
2064
          && no_labels_between_p (insn, trial)
2065
          && ! can_throw_internal (trial))
2066
        {
2067
          rtx *tmp;
2068
          slots_filled++;
2069
          delay_list = add_to_delay_list (trial, delay_list);
2070
 
2071
          /* TRIAL may have had its delay slot filled, then unfilled.  When
2072
             the delay slot is unfilled, TRIAL is placed back on the unfilled
2073
             slots obstack.  Unfortunately, it is placed on the end of the
2074
             obstack, not in its original location.  Therefore, we must search
2075
             from entry i + 1 to the end of the unfilled slots obstack to
2076
             try and find TRIAL.  */
2077
          tmp = &unfilled_slots_base[i + 1];
2078
          while (*tmp != trial && tmp != unfilled_slots_next)
2079
            tmp++;
2080
 
2081
          /* Remove the unconditional jump from consideration for delay slot
2082
             filling and unthread it.  */
2083
          if (*tmp == trial)
2084
            *tmp = 0;
2085
          {
2086
            rtx next = NEXT_INSN (trial);
2087
            rtx prev = PREV_INSN (trial);
2088
            if (prev)
2089
              NEXT_INSN (prev) = next;
2090
            if (next)
2091
              PREV_INSN (next) = prev;
2092
          }
2093
        }
2094
 
2095
      /* Now, scan backwards from the insn to search for a potential
2096
         delay-slot candidate.  Stop searching when a label or jump is hit.
2097
 
2098
         For each candidate, if it is to go into the delay slot (moved
2099
         forward in execution sequence), it must not need or set any resources
2100
         that were set by later insns and must not set any resources that
2101
         are needed for those insns.
2102
 
2103
         The delay slot insn itself sets resources unless it is a call
2104
         (in which case the called routine, not the insn itself, is doing
2105
         the setting).  */
2106
 
2107
      if (slots_filled < slots_to_fill)
2108
        {
2109
          CLEAR_RESOURCE (&needed);
2110
          CLEAR_RESOURCE (&set);
2111
          mark_set_resources (insn, &set, 0, MARK_SRC_DEST);
2112
          mark_referenced_resources (insn, &needed, 0);
2113
 
2114
          for (trial = prev_nonnote_insn (insn); ! stop_search_p (trial, 1);
2115
               trial = next_trial)
2116
            {
2117
              next_trial = prev_nonnote_insn (trial);
2118
 
2119
              /* This must be an INSN or CALL_INSN.  */
2120
              pat = PATTERN (trial);
2121
 
2122
              /* USE and CLOBBER at this level was just for flow; ignore it.  */
2123
              if (GET_CODE (pat) == USE || GET_CODE (pat) == CLOBBER)
2124
                continue;
2125
 
2126
              /* Check for resource conflict first, to avoid unnecessary
2127
                 splitting.  */
2128
              if (! insn_references_resource_p (trial, &set, 1)
2129
                  && ! insn_sets_resource_p (trial, &set, 1)
2130
                  && ! insn_sets_resource_p (trial, &needed, 1)
2131
#ifdef HAVE_cc0
2132
                  /* Can't separate set of cc0 from its use.  */
2133
                  && ! (reg_mentioned_p (cc0_rtx, pat) && ! sets_cc0_p (pat))
2134
#endif
2135
                  && ! can_throw_internal (trial))
2136
                {
2137
                  trial = try_split (pat, trial, 1);
2138
                  next_trial = prev_nonnote_insn (trial);
2139
                  if (eligible_for_delay (insn, slots_filled, trial, flags))
2140
                    {
2141
                      /* In this case, we are searching backward, so if we
2142
                         find insns to put on the delay list, we want
2143
                         to put them at the head, rather than the
2144
                         tail, of the list.  */
2145
 
2146
                      update_reg_dead_notes (trial, insn);
2147
                      delay_list = gen_rtx_INSN_LIST (VOIDmode,
2148
                                                      trial, delay_list);
2149
                      update_block (trial, trial);
2150
                      delete_related_insns (trial);
2151
                      if (slots_to_fill == ++slots_filled)
2152
                        break;
2153
                      continue;
2154
                    }
2155
                }
2156
 
2157
              mark_set_resources (trial, &set, 0, MARK_SRC_DEST_CALL);
2158
              mark_referenced_resources (trial, &needed, 1);
2159
            }
2160
        }
2161
 
2162
      /* If all needed slots haven't been filled, we come here.  */
2163
 
2164
      /* Try to optimize case of jumping around a single insn.  */
2165
#if defined(ANNUL_IFFALSE_SLOTS) || defined(ANNUL_IFTRUE_SLOTS)
2166
      if (slots_filled != slots_to_fill
2167
          && delay_list == 0
2168
          && JUMP_P (insn)
2169
          && (condjump_p (insn) || condjump_in_parallel_p (insn)))
2170
        {
2171
          delay_list = optimize_skip (insn);
2172
          if (delay_list)
2173
            slots_filled += 1;
2174
        }
2175
#endif
2176
 
2177
      /* Try to get insns from beyond the insn needing the delay slot.
2178
         These insns can neither set or reference resources set in insns being
2179
         skipped, cannot set resources in the insn being skipped, and, if this
2180
         is a CALL_INSN (or a CALL_INSN is passed), cannot trap (because the
2181
         call might not return).
2182
 
2183
         There used to be code which continued past the target label if
2184
         we saw all uses of the target label.  This code did not work,
2185
         because it failed to account for some instructions which were
2186
         both annulled and marked as from the target.  This can happen as a
2187
         result of optimize_skip.  Since this code was redundant with
2188
         fill_eager_delay_slots anyways, it was just deleted.  */
2189
 
2190
      if (slots_filled != slots_to_fill
2191
          /* If this instruction could throw an exception which is
2192
             caught in the same function, then it's not safe to fill
2193
             the delay slot with an instruction from beyond this
2194
             point.  For example, consider:
2195
 
2196
               int i = 2;
2197
 
2198
               try {
2199
                 f();
2200
                 i = 3;
2201
               } catch (...) {}
2202
 
2203
               return i;
2204
 
2205
             Even though `i' is a local variable, we must be sure not
2206
             to put `i = 3' in the delay slot if `f' might throw an
2207
             exception.
2208
 
2209
             Presumably, we should also check to see if we could get
2210
             back to this function via `setjmp'.  */
2211
          && ! can_throw_internal (insn)
2212
          && (!JUMP_P (insn)
2213
              || ((condjump_p (insn) || condjump_in_parallel_p (insn))
2214
                  && ! simplejump_p (insn)
2215
                  && JUMP_LABEL (insn) != 0)))
2216
        {
2217
          /* Invariant: If insn is a JUMP_INSN, the insn's jump
2218
             label.  Otherwise, zero.  */
2219
          rtx target = 0;
2220
          int maybe_never = 0;
2221
          rtx pat, trial_delay;
2222
 
2223
          CLEAR_RESOURCE (&needed);
2224
          CLEAR_RESOURCE (&set);
2225
 
2226
          if (CALL_P (insn))
2227
            {
2228
              mark_set_resources (insn, &set, 0, MARK_SRC_DEST_CALL);
2229
              mark_referenced_resources (insn, &needed, 1);
2230
              maybe_never = 1;
2231
            }
2232
          else
2233
            {
2234
              mark_set_resources (insn, &set, 0, MARK_SRC_DEST_CALL);
2235
              mark_referenced_resources (insn, &needed, 1);
2236
              if (JUMP_P (insn))
2237
                target = JUMP_LABEL (insn);
2238
            }
2239
 
2240
          if (target == 0)
2241
            for (trial = next_nonnote_insn (insn); trial; trial = next_trial)
2242
              {
2243
                next_trial = next_nonnote_insn (trial);
2244
 
2245
                if (LABEL_P (trial)
2246
                    || BARRIER_P (trial))
2247
                  break;
2248
 
2249
                /* We must have an INSN, JUMP_INSN, or CALL_INSN.  */
2250
                pat = PATTERN (trial);
2251
 
2252
                /* Stand-alone USE and CLOBBER are just for flow.  */
2253
                if (GET_CODE (pat) == USE || GET_CODE (pat) == CLOBBER)
2254
                  continue;
2255
 
2256
                /* If this already has filled delay slots, get the insn needing
2257
                   the delay slots.  */
2258
                if (GET_CODE (pat) == SEQUENCE)
2259
                  trial_delay = XVECEXP (pat, 0, 0);
2260
                else
2261
                  trial_delay = trial;
2262
 
2263
                /* Stop our search when seeing an unconditional jump.  */
2264
                if (JUMP_P (trial_delay))
2265
                  break;
2266
 
2267
                /* See if we have a resource problem before we try to
2268
                   split.  */
2269
                if (GET_CODE (pat) != SEQUENCE
2270
                    && ! insn_references_resource_p (trial, &set, 1)
2271
                    && ! insn_sets_resource_p (trial, &set, 1)
2272
                    && ! insn_sets_resource_p (trial, &needed, 1)
2273
#ifdef HAVE_cc0
2274
                    && ! (reg_mentioned_p (cc0_rtx, pat) && ! sets_cc0_p (pat))
2275
#endif
2276
                    && ! (maybe_never && may_trap_or_fault_p (pat))
2277
                    && (trial = try_split (pat, trial, 0))
2278
                    && eligible_for_delay (insn, slots_filled, trial, flags)
2279
                    && ! can_throw_internal(trial))
2280
                  {
2281
                    next_trial = next_nonnote_insn (trial);
2282
                    delay_list = add_to_delay_list (trial, delay_list);
2283
 
2284
#ifdef HAVE_cc0
2285
                    if (reg_mentioned_p (cc0_rtx, pat))
2286
                      link_cc0_insns (trial);
2287
#endif
2288
 
2289
                    delete_related_insns (trial);
2290
                    if (slots_to_fill == ++slots_filled)
2291
                      break;
2292
                    continue;
2293
                  }
2294
 
2295
                mark_set_resources (trial, &set, 0, MARK_SRC_DEST_CALL);
2296
                mark_referenced_resources (trial, &needed, 1);
2297
 
2298
                /* Ensure we don't put insns between the setting of cc and the
2299
                   comparison by moving a setting of cc into an earlier delay
2300
                   slot since these insns could clobber the condition code.  */
2301
                set.cc = 1;
2302
 
2303
                /* If this is a call or jump, we might not get here.  */
2304
                if (CALL_P (trial_delay)
2305
                    || JUMP_P (trial_delay))
2306
                  maybe_never = 1;
2307
              }
2308
 
2309
          /* If there are slots left to fill and our search was stopped by an
2310
             unconditional branch, try the insn at the branch target.  We can
2311
             redirect the branch if it works.
2312
 
2313
             Don't do this if the insn at the branch target is a branch.  */
2314
          if (slots_to_fill != slots_filled
2315
              && trial
2316
              && JUMP_P (trial)
2317
              && simplejump_p (trial)
2318
              && (target == 0 || JUMP_LABEL (trial) == target)
2319
              && (next_trial = next_active_insn (JUMP_LABEL (trial))) != 0
2320
              && ! (NONJUMP_INSN_P (next_trial)
2321
                    && GET_CODE (PATTERN (next_trial)) == SEQUENCE)
2322
              && !JUMP_P (next_trial)
2323
              && ! insn_references_resource_p (next_trial, &set, 1)
2324
              && ! insn_sets_resource_p (next_trial, &set, 1)
2325
              && ! insn_sets_resource_p (next_trial, &needed, 1)
2326
#ifdef HAVE_cc0
2327
              && ! reg_mentioned_p (cc0_rtx, PATTERN (next_trial))
2328
#endif
2329
              && ! (maybe_never && may_trap_or_fault_p (PATTERN (next_trial)))
2330
              && (next_trial = try_split (PATTERN (next_trial), next_trial, 0))
2331
              && eligible_for_delay (insn, slots_filled, next_trial, flags)
2332
              && ! can_throw_internal (trial))
2333
            {
2334
              /* See comment in relax_delay_slots about necessity of using
2335
                 next_real_insn here.  */
2336
              rtx new_label = next_real_insn (next_trial);
2337
 
2338
              if (new_label != 0)
2339
                new_label = get_label_before (new_label);
2340
              else
2341
                new_label = find_end_label ();
2342
 
2343
              if (new_label)
2344
                {
2345
                  delay_list
2346
                    = add_to_delay_list (copy_rtx (next_trial), delay_list);
2347
                  slots_filled++;
2348
                  reorg_redirect_jump (trial, new_label);
2349
 
2350
                  /* If we merged because we both jumped to the same place,
2351
                     redirect the original insn also.  */
2352
                  if (target)
2353
                    reorg_redirect_jump (insn, new_label);
2354
                }
2355
            }
2356
        }
2357
 
2358
      /* If this is an unconditional jump, then try to get insns from the
2359
         target of the jump.  */
2360
      if (JUMP_P (insn)
2361
          && simplejump_p (insn)
2362
          && slots_filled != slots_to_fill)
2363
        delay_list
2364
          = fill_slots_from_thread (insn, const_true_rtx,
2365
                                    next_active_insn (JUMP_LABEL (insn)),
2366
                                    NULL, 1, 1,
2367
                                    own_thread_p (JUMP_LABEL (insn),
2368
                                                  JUMP_LABEL (insn), 0),
2369
                                    slots_to_fill, &slots_filled,
2370
                                    delay_list);
2371
 
2372
      if (delay_list)
2373
        unfilled_slots_base[i]
2374
          = emit_delay_sequence (insn, delay_list, slots_filled);
2375
 
2376
      if (slots_to_fill == slots_filled)
2377
        unfilled_slots_base[i] = 0;
2378
 
2379
      note_delay_statistics (slots_filled, 0);
2380
    }
2381
 
2382
#ifdef DELAY_SLOTS_FOR_EPILOGUE
2383
  /* See if the epilogue needs any delay slots.  Try to fill them if so.
2384
     The only thing we can do is scan backwards from the end of the
2385
     function.  If we did this in a previous pass, it is incorrect to do it
2386
     again.  */
2387
  if (current_function_epilogue_delay_list)
2388
    return;
2389
 
2390
  slots_to_fill = DELAY_SLOTS_FOR_EPILOGUE;
2391
  if (slots_to_fill == 0)
2392
    return;
2393
 
2394
  slots_filled = 0;
2395
  CLEAR_RESOURCE (&set);
2396
 
2397
  /* The frame pointer and stack pointer are needed at the beginning of
2398
     the epilogue, so instructions setting them can not be put in the
2399
     epilogue delay slot.  However, everything else needed at function
2400
     end is safe, so we don't want to use end_of_function_needs here.  */
2401
  CLEAR_RESOURCE (&needed);
2402
  if (frame_pointer_needed)
2403
    {
2404
      SET_HARD_REG_BIT (needed.regs, FRAME_POINTER_REGNUM);
2405
#if HARD_FRAME_POINTER_REGNUM != FRAME_POINTER_REGNUM
2406
      SET_HARD_REG_BIT (needed.regs, HARD_FRAME_POINTER_REGNUM);
2407
#endif
2408
      if (! EXIT_IGNORE_STACK
2409
          || current_function_sp_is_unchanging)
2410
        SET_HARD_REG_BIT (needed.regs, STACK_POINTER_REGNUM);
2411
    }
2412
  else
2413
    SET_HARD_REG_BIT (needed.regs, STACK_POINTER_REGNUM);
2414
 
2415
#ifdef EPILOGUE_USES
2416
  for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
2417
    {
2418
      if (EPILOGUE_USES (i))
2419
        SET_HARD_REG_BIT (needed.regs, i);
2420
    }
2421
#endif
2422
 
2423
  for (trial = get_last_insn (); ! stop_search_p (trial, 1);
2424
       trial = PREV_INSN (trial))
2425
    {
2426
      if (NOTE_P (trial))
2427
        continue;
2428
      pat = PATTERN (trial);
2429
      if (GET_CODE (pat) == USE || GET_CODE (pat) == CLOBBER)
2430
        continue;
2431
 
2432
      if (! insn_references_resource_p (trial, &set, 1)
2433
          && ! insn_sets_resource_p (trial, &needed, 1)
2434
          && ! insn_sets_resource_p (trial, &set, 1)
2435
#ifdef HAVE_cc0
2436
          /* Don't want to mess with cc0 here.  */
2437
          && ! reg_mentioned_p (cc0_rtx, pat)
2438
#endif
2439
          && ! can_throw_internal (trial))
2440
        {
2441
          trial = try_split (pat, trial, 1);
2442
          if (ELIGIBLE_FOR_EPILOGUE_DELAY (trial, slots_filled))
2443
            {
2444
              /* Here as well we are searching backward, so put the
2445
                 insns we find on the head of the list.  */
2446
 
2447
              current_function_epilogue_delay_list
2448
                = gen_rtx_INSN_LIST (VOIDmode, trial,
2449
                                     current_function_epilogue_delay_list);
2450
              mark_end_of_function_resources (trial, 1);
2451
              update_block (trial, trial);
2452
              delete_related_insns (trial);
2453
 
2454
              /* Clear deleted bit so final.c will output the insn.  */
2455
              INSN_DELETED_P (trial) = 0;
2456
 
2457
              if (slots_to_fill == ++slots_filled)
2458
                break;
2459
              continue;
2460
            }
2461
        }
2462
 
2463
      mark_set_resources (trial, &set, 0, MARK_SRC_DEST_CALL);
2464
      mark_referenced_resources (trial, &needed, 1);
2465
    }
2466
 
2467
  note_delay_statistics (slots_filled, 0);
2468
#endif
2469
}
2470
 
2471
/* Try to find insns to place in delay slots.
2472
 
2473
   INSN is the jump needing SLOTS_TO_FILL delay slots.  It tests CONDITION
2474
   or is an unconditional branch if CONDITION is const_true_rtx.
2475
   *PSLOTS_FILLED is updated with the number of slots that we have filled.
2476
 
2477
   THREAD is a flow-of-control, either the insns to be executed if the
2478
   branch is true or if the branch is false, THREAD_IF_TRUE says which.
2479
 
2480
   OPPOSITE_THREAD is the thread in the opposite direction.  It is used
2481
   to see if any potential delay slot insns set things needed there.
2482
 
2483
   LIKELY is nonzero if it is extremely likely that the branch will be
2484
   taken and THREAD_IF_TRUE is set.  This is used for the branch at the
2485
   end of a loop back up to the top.
2486
 
2487
   OWN_THREAD and OWN_OPPOSITE_THREAD are true if we are the only user of the
2488
   thread.  I.e., it is the fallthrough code of our jump or the target of the
2489
   jump when we are the only jump going there.
2490
 
2491
   If OWN_THREAD is false, it must be the "true" thread of a jump.  In that
2492
   case, we can only take insns from the head of the thread for our delay
2493
   slot.  We then adjust the jump to point after the insns we have taken.  */
2494
 
2495
static rtx
2496
fill_slots_from_thread (rtx insn, rtx condition, rtx thread,
2497
                        rtx opposite_thread, int likely, int thread_if_true,
2498
                        int own_thread, int slots_to_fill,
2499
                        int *pslots_filled, rtx delay_list)
2500
{
2501
  rtx new_thread;
2502
  struct resources opposite_needed, set, needed;
2503
  rtx trial;
2504
  int lose = 0;
2505
  int must_annul = 0;
2506
  int flags;
2507
 
2508
  /* Validate our arguments.  */
2509
  gcc_assert(condition != const_true_rtx || thread_if_true);
2510
  gcc_assert(own_thread || thread_if_true);
2511
 
2512
  flags = get_jump_flags (insn, JUMP_LABEL (insn));
2513
 
2514
  /* If our thread is the end of subroutine, we can't get any delay
2515
     insns from that.  */
2516
  if (thread == 0)
2517
    return delay_list;
2518
 
2519
  /* If this is an unconditional branch, nothing is needed at the
2520
     opposite thread.  Otherwise, compute what is needed there.  */
2521
  if (condition == const_true_rtx)
2522
    CLEAR_RESOURCE (&opposite_needed);
2523
  else
2524
    mark_target_live_regs (get_insns (), opposite_thread, &opposite_needed);
2525
 
2526
  /* If the insn at THREAD can be split, do it here to avoid having to
2527
     update THREAD and NEW_THREAD if it is done in the loop below.  Also
2528
     initialize NEW_THREAD.  */
2529
 
2530
  new_thread = thread = try_split (PATTERN (thread), thread, 0);
2531
 
2532
  /* Scan insns at THREAD.  We are looking for an insn that can be removed
2533
     from THREAD (it neither sets nor references resources that were set
2534
     ahead of it and it doesn't set anything needs by the insns ahead of
2535
     it) and that either can be placed in an annulling insn or aren't
2536
     needed at OPPOSITE_THREAD.  */
2537
 
2538
  CLEAR_RESOURCE (&needed);
2539
  CLEAR_RESOURCE (&set);
2540
 
2541
  /* If we do not own this thread, we must stop as soon as we find
2542
     something that we can't put in a delay slot, since all we can do
2543
     is branch into THREAD at a later point.  Therefore, labels stop
2544
     the search if this is not the `true' thread.  */
2545
 
2546
  for (trial = thread;
2547
       ! stop_search_p (trial, ! thread_if_true) && (! lose || own_thread);
2548
       trial = next_nonnote_insn (trial))
2549
    {
2550
      rtx pat, old_trial;
2551
 
2552
      /* If we have passed a label, we no longer own this thread.  */
2553
      if (LABEL_P (trial))
2554
        {
2555
          own_thread = 0;
2556
          continue;
2557
        }
2558
 
2559
      pat = PATTERN (trial);
2560
      if (GET_CODE (pat) == USE || GET_CODE (pat) == CLOBBER)
2561
        continue;
2562
 
2563
      /* If TRIAL conflicts with the insns ahead of it, we lose.  Also,
2564
         don't separate or copy insns that set and use CC0.  */
2565
      if (! insn_references_resource_p (trial, &set, 1)
2566
          && ! insn_sets_resource_p (trial, &set, 1)
2567
          && ! insn_sets_resource_p (trial, &needed, 1)
2568
#ifdef HAVE_cc0
2569
          && ! (reg_mentioned_p (cc0_rtx, pat)
2570
                && (! own_thread || ! sets_cc0_p (pat)))
2571
#endif
2572
          && ! can_throw_internal (trial))
2573
        {
2574
          rtx prior_insn;
2575
 
2576
          /* If TRIAL is redundant with some insn before INSN, we don't
2577
             actually need to add it to the delay list; we can merely pretend
2578
             we did.  */
2579
          if ((prior_insn = redundant_insn (trial, insn, delay_list)))
2580
            {
2581
              fix_reg_dead_note (prior_insn, insn);
2582
              if (own_thread)
2583
                {
2584
                  update_block (trial, thread);
2585
                  if (trial == thread)
2586
                    {
2587
                      thread = next_active_insn (thread);
2588
                      if (new_thread == trial)
2589
                        new_thread = thread;
2590
                    }
2591
 
2592
                  delete_related_insns (trial);
2593
                }
2594
              else
2595
                {
2596
                  update_reg_unused_notes (prior_insn, trial);
2597
                  new_thread = next_active_insn (trial);
2598
                }
2599
 
2600
              continue;
2601
            }
2602
 
2603
          /* There are two ways we can win:  If TRIAL doesn't set anything
2604
             needed at the opposite thread and can't trap, or if it can
2605
             go into an annulled delay slot.  */
2606
          if (!must_annul
2607
              && (condition == const_true_rtx
2608
                  || (! insn_sets_resource_p (trial, &opposite_needed, 1)
2609
                      && ! may_trap_or_fault_p (pat))))
2610
            {
2611
              old_trial = trial;
2612
              trial = try_split (pat, trial, 0);
2613
              if (new_thread == old_trial)
2614
                new_thread = trial;
2615
              if (thread == old_trial)
2616
                thread = trial;
2617
              pat = PATTERN (trial);
2618
              if (eligible_for_delay (insn, *pslots_filled, trial, flags))
2619
                goto winner;
2620
            }
2621
          else if (0
2622
#ifdef ANNUL_IFTRUE_SLOTS
2623
                   || ! thread_if_true
2624
#endif
2625
#ifdef ANNUL_IFFALSE_SLOTS
2626
                   || thread_if_true
2627
#endif
2628
                   )
2629
            {
2630
              old_trial = trial;
2631
              trial = try_split (pat, trial, 0);
2632
              if (new_thread == old_trial)
2633
                new_thread = trial;
2634
              if (thread == old_trial)
2635
                thread = trial;
2636
              pat = PATTERN (trial);
2637
              if ((must_annul || delay_list == NULL) && (thread_if_true
2638
                   ? check_annul_list_true_false (0, delay_list)
2639
                     && eligible_for_annul_false (insn, *pslots_filled, trial, flags)
2640
                   : check_annul_list_true_false (1, delay_list)
2641
                     && eligible_for_annul_true (insn, *pslots_filled, trial, flags)))
2642
                {
2643
                  rtx temp;
2644
 
2645
                  must_annul = 1;
2646
                winner:
2647
 
2648
#ifdef HAVE_cc0
2649
                  if (reg_mentioned_p (cc0_rtx, pat))
2650
                    link_cc0_insns (trial);
2651
#endif
2652
 
2653
                  /* If we own this thread, delete the insn.  If this is the
2654
                     destination of a branch, show that a basic block status
2655
                     may have been updated.  In any case, mark the new
2656
                     starting point of this thread.  */
2657
                  if (own_thread)
2658
                    {
2659
                      rtx note;
2660
 
2661
                      update_block (trial, thread);
2662
                      if (trial == thread)
2663
                        {
2664
                          thread = next_active_insn (thread);
2665
                          if (new_thread == trial)
2666
                            new_thread = thread;
2667
                        }
2668
 
2669
                      /* We are moving this insn, not deleting it.  We must
2670
                         temporarily increment the use count on any referenced
2671
                         label lest it be deleted by delete_related_insns.  */
2672
                      note = find_reg_note (trial, REG_LABEL, 0);
2673
                      /* REG_LABEL could be NOTE_INSN_DELETED_LABEL too.  */
2674
                      if (note && LABEL_P (XEXP (note, 0)))
2675
                        LABEL_NUSES (XEXP (note, 0))++;
2676
 
2677
                      delete_related_insns (trial);
2678
 
2679
                      if (note && LABEL_P (XEXP (note, 0)))
2680
                        LABEL_NUSES (XEXP (note, 0))--;
2681
                    }
2682
                  else
2683
                    new_thread = next_active_insn (trial);
2684
 
2685
                  temp = own_thread ? trial : copy_rtx (trial);
2686
                  if (thread_if_true)
2687
                    INSN_FROM_TARGET_P (temp) = 1;
2688
 
2689
                  delay_list = add_to_delay_list (temp, delay_list);
2690
 
2691
                  if (slots_to_fill == ++(*pslots_filled))
2692
                    {
2693
                      /* Even though we have filled all the slots, we
2694
                         may be branching to a location that has a
2695
                         redundant insn.  Skip any if so.  */
2696
                      while (new_thread && ! own_thread
2697
                             && ! insn_sets_resource_p (new_thread, &set, 1)
2698
                             && ! insn_sets_resource_p (new_thread, &needed, 1)
2699
                             && ! insn_references_resource_p (new_thread,
2700
                                                              &set, 1)
2701
                             && (prior_insn
2702
                                 = redundant_insn (new_thread, insn,
2703
                                                   delay_list)))
2704
                        {
2705
                          /* We know we do not own the thread, so no need
2706
                             to call update_block and delete_insn.  */
2707
                          fix_reg_dead_note (prior_insn, insn);
2708
                          update_reg_unused_notes (prior_insn, new_thread);
2709
                          new_thread = next_active_insn (new_thread);
2710
                        }
2711
                      break;
2712
                    }
2713
 
2714
                  continue;
2715
                }
2716
            }
2717
        }
2718
 
2719
      /* This insn can't go into a delay slot.  */
2720
      lose = 1;
2721
      mark_set_resources (trial, &set, 0, MARK_SRC_DEST_CALL);
2722
      mark_referenced_resources (trial, &needed, 1);
2723
 
2724
      /* Ensure we don't put insns between the setting of cc and the comparison
2725
         by moving a setting of cc into an earlier delay slot since these insns
2726
         could clobber the condition code.  */
2727
      set.cc = 1;
2728
 
2729
      /* If this insn is a register-register copy and the next insn has
2730
         a use of our destination, change it to use our source.  That way,
2731
         it will become a candidate for our delay slot the next time
2732
         through this loop.  This case occurs commonly in loops that
2733
         scan a list.
2734
 
2735
         We could check for more complex cases than those tested below,
2736
         but it doesn't seem worth it.  It might also be a good idea to try
2737
         to swap the two insns.  That might do better.
2738
 
2739
         We can't do this if the next insn modifies our destination, because
2740
         that would make the replacement into the insn invalid.  We also can't
2741
         do this if it modifies our source, because it might be an earlyclobber
2742
         operand.  This latter test also prevents updating the contents of
2743
         a PRE_INC.  We also can't do this if there's overlap of source and
2744
         destination.  Overlap may happen for larger-than-register-size modes.  */
2745
 
2746
      if (NONJUMP_INSN_P (trial) && GET_CODE (pat) == SET
2747
          && REG_P (SET_SRC (pat))
2748
          && REG_P (SET_DEST (pat))
2749
          && !reg_overlap_mentioned_p (SET_DEST (pat), SET_SRC (pat)))
2750
        {
2751
          rtx next = next_nonnote_insn (trial);
2752
 
2753
          if (next && NONJUMP_INSN_P (next)
2754
              && GET_CODE (PATTERN (next)) != USE
2755
              && ! reg_set_p (SET_DEST (pat), next)
2756
              && ! reg_set_p (SET_SRC (pat), next)
2757
              && reg_referenced_p (SET_DEST (pat), PATTERN (next))
2758
              && ! modified_in_p (SET_DEST (pat), next))
2759
            validate_replace_rtx (SET_DEST (pat), SET_SRC (pat), next);
2760
        }
2761
    }
2762
 
2763
  /* If we stopped on a branch insn that has delay slots, see if we can
2764
     steal some of the insns in those slots.  */
2765
  if (trial && NONJUMP_INSN_P (trial)
2766
      && GET_CODE (PATTERN (trial)) == SEQUENCE
2767
      && JUMP_P (XVECEXP (PATTERN (trial), 0, 0)))
2768
    {
2769
      /* If this is the `true' thread, we will want to follow the jump,
2770
         so we can only do this if we have taken everything up to here.  */
2771
      if (thread_if_true && trial == new_thread)
2772
        {
2773
          delay_list
2774
            = steal_delay_list_from_target (insn, condition, PATTERN (trial),
2775
                                            delay_list, &set, &needed,
2776
                                            &opposite_needed, slots_to_fill,
2777
                                            pslots_filled, &must_annul,
2778
                                            &new_thread);
2779
          /* If we owned the thread and are told that it branched
2780
             elsewhere, make sure we own the thread at the new location.  */
2781
          if (own_thread && trial != new_thread)
2782
            own_thread = own_thread_p (new_thread, new_thread, 0);
2783
        }
2784
      else if (! thread_if_true)
2785
        delay_list
2786
          = steal_delay_list_from_fallthrough (insn, condition,
2787
                                               PATTERN (trial),
2788
                                               delay_list, &set, &needed,
2789
                                               &opposite_needed, slots_to_fill,
2790
                                               pslots_filled, &must_annul);
2791
    }
2792
 
2793
  /* If we haven't found anything for this delay slot and it is very
2794
     likely that the branch will be taken, see if the insn at our target
2795
     increments or decrements a register with an increment that does not
2796
     depend on the destination register.  If so, try to place the opposite
2797
     arithmetic insn after the jump insn and put the arithmetic insn in the
2798
     delay slot.  If we can't do this, return.  */
2799
  if (delay_list == 0 && likely && new_thread
2800
      && NONJUMP_INSN_P (new_thread)
2801
      && GET_CODE (PATTERN (new_thread)) != ASM_INPUT
2802
      && asm_noperands (PATTERN (new_thread)) < 0)
2803
    {
2804
      rtx pat = PATTERN (new_thread);
2805
      rtx dest;
2806
      rtx src;
2807
 
2808
      trial = new_thread;
2809
      pat = PATTERN (trial);
2810
 
2811
      if (!NONJUMP_INSN_P (trial)
2812
          || GET_CODE (pat) != SET
2813
          || ! eligible_for_delay (insn, 0, trial, flags)
2814
          || can_throw_internal (trial))
2815
        return 0;
2816
 
2817
      dest = SET_DEST (pat), src = SET_SRC (pat);
2818
      if ((GET_CODE (src) == PLUS || GET_CODE (src) == MINUS)
2819
          && rtx_equal_p (XEXP (src, 0), dest)
2820
          && (!FLOAT_MODE_P (GET_MODE (src))
2821
              || flag_unsafe_math_optimizations)
2822
          && ! reg_overlap_mentioned_p (dest, XEXP (src, 1))
2823
          && ! side_effects_p (pat))
2824
        {
2825
          rtx other = XEXP (src, 1);
2826
          rtx new_arith;
2827
          rtx ninsn;
2828
 
2829
          /* If this is a constant adjustment, use the same code with
2830
             the negated constant.  Otherwise, reverse the sense of the
2831
             arithmetic.  */
2832
          if (GET_CODE (other) == CONST_INT)
2833
            new_arith = gen_rtx_fmt_ee (GET_CODE (src), GET_MODE (src), dest,
2834
                                        negate_rtx (GET_MODE (src), other));
2835
          else
2836
            new_arith = gen_rtx_fmt_ee (GET_CODE (src) == PLUS ? MINUS : PLUS,
2837
                                        GET_MODE (src), dest, other);
2838
 
2839
          ninsn = emit_insn_after (gen_rtx_SET (VOIDmode, dest, new_arith),
2840
                                   insn);
2841
 
2842
          if (recog_memoized (ninsn) < 0
2843
              || (extract_insn (ninsn), ! constrain_operands (1)))
2844
            {
2845
              delete_related_insns (ninsn);
2846
              return 0;
2847
            }
2848
 
2849
          if (own_thread)
2850
            {
2851
              update_block (trial, thread);
2852
              if (trial == thread)
2853
                {
2854
                  thread = next_active_insn (thread);
2855
                  if (new_thread == trial)
2856
                    new_thread = thread;
2857
                }
2858
              delete_related_insns (trial);
2859
            }
2860
          else
2861
            new_thread = next_active_insn (trial);
2862
 
2863
          ninsn = own_thread ? trial : copy_rtx (trial);
2864
          if (thread_if_true)
2865
            INSN_FROM_TARGET_P (ninsn) = 1;
2866
 
2867
          delay_list = add_to_delay_list (ninsn, NULL_RTX);
2868
          (*pslots_filled)++;
2869
        }
2870
    }
2871
 
2872
  if (delay_list && must_annul)
2873
    INSN_ANNULLED_BRANCH_P (insn) = 1;
2874
 
2875
  /* If we are to branch into the middle of this thread, find an appropriate
2876
     label or make a new one if none, and redirect INSN to it.  If we hit the
2877
     end of the function, use the end-of-function label.  */
2878
  if (new_thread != thread)
2879
    {
2880
      rtx label;
2881
 
2882
      gcc_assert (thread_if_true);
2883
 
2884
      if (new_thread && JUMP_P (new_thread)
2885
          && (simplejump_p (new_thread)
2886
              || GET_CODE (PATTERN (new_thread)) == RETURN)
2887
          && redirect_with_delay_list_safe_p (insn,
2888
                                              JUMP_LABEL (new_thread),
2889
                                              delay_list))
2890
        new_thread = follow_jumps (JUMP_LABEL (new_thread));
2891
 
2892
      if (new_thread == 0)
2893
        label = find_end_label ();
2894
      else if (LABEL_P (new_thread))
2895
        label = new_thread;
2896
      else
2897
        label = get_label_before (new_thread);
2898
 
2899
      if (label)
2900
        reorg_redirect_jump (insn, label);
2901
    }
2902
 
2903
  return delay_list;
2904
}
2905
 
2906
/* Make another attempt to find insns to place in delay slots.
2907
 
2908
   We previously looked for insns located in front of the delay insn
2909
   and, for non-jump delay insns, located behind the delay insn.
2910
 
2911
   Here only try to schedule jump insns and try to move insns from either
2912
   the target or the following insns into the delay slot.  If annulling is
2913
   supported, we will be likely to do this.  Otherwise, we can do this only
2914
   if safe.  */
2915
 
2916
static void
2917
fill_eager_delay_slots (void)
2918
{
2919
  rtx insn;
2920
  int i;
2921
  int num_unfilled_slots = unfilled_slots_next - unfilled_slots_base;
2922
 
2923
  for (i = 0; i < num_unfilled_slots; i++)
2924
    {
2925
      rtx condition;
2926
      rtx target_label, insn_at_target, fallthrough_insn;
2927
      rtx delay_list = 0;
2928
      int own_target;
2929
      int own_fallthrough;
2930
      int prediction, slots_to_fill, slots_filled;
2931
 
2932
      insn = unfilled_slots_base[i];
2933
      if (insn == 0
2934
          || INSN_DELETED_P (insn)
2935
          || !JUMP_P (insn)
2936
          || ! (condjump_p (insn) || condjump_in_parallel_p (insn)))
2937
        continue;
2938
 
2939
      slots_to_fill = num_delay_slots (insn);
2940
      /* Some machine description have defined instructions to have
2941
         delay slots only in certain circumstances which may depend on
2942
         nearby insns (which change due to reorg's actions).
2943
 
2944
         For example, the PA port normally has delay slots for unconditional
2945
         jumps.
2946
 
2947
         However, the PA port claims such jumps do not have a delay slot
2948
         if they are immediate successors of certain CALL_INSNs.  This
2949
         allows the port to favor filling the delay slot of the call with
2950
         the unconditional jump.  */
2951
      if (slots_to_fill == 0)
2952
        continue;
2953
 
2954
      slots_filled = 0;
2955
      target_label = JUMP_LABEL (insn);
2956
      condition = get_branch_condition (insn, target_label);
2957
 
2958
      if (condition == 0)
2959
        continue;
2960
 
2961
      /* Get the next active fallthrough and target insns and see if we own
2962
         them.  Then see whether the branch is likely true.  We don't need
2963
         to do a lot of this for unconditional branches.  */
2964
 
2965
      insn_at_target = next_active_insn (target_label);
2966
      own_target = own_thread_p (target_label, target_label, 0);
2967
 
2968
      if (condition == const_true_rtx)
2969
        {
2970
          own_fallthrough = 0;
2971
          fallthrough_insn = 0;
2972
          prediction = 2;
2973
        }
2974
      else
2975
        {
2976
          fallthrough_insn = next_active_insn (insn);
2977
          own_fallthrough = own_thread_p (NEXT_INSN (insn), NULL_RTX, 1);
2978
          prediction = mostly_true_jump (insn, condition);
2979
        }
2980
 
2981
      /* If this insn is expected to branch, first try to get insns from our
2982
         target, then our fallthrough insns.  If it is not expected to branch,
2983
         try the other order.  */
2984
 
2985
      if (prediction > 0)
2986
        {
2987
          delay_list
2988
            = fill_slots_from_thread (insn, condition, insn_at_target,
2989
                                      fallthrough_insn, prediction == 2, 1,
2990
                                      own_target,
2991
                                      slots_to_fill, &slots_filled, delay_list);
2992
 
2993
          if (delay_list == 0 && own_fallthrough)
2994
            {
2995
              /* Even though we didn't find anything for delay slots,
2996
                 we might have found a redundant insn which we deleted
2997
                 from the thread that was filled.  So we have to recompute
2998
                 the next insn at the target.  */
2999
              target_label = JUMP_LABEL (insn);
3000
              insn_at_target = next_active_insn (target_label);
3001
 
3002
              delay_list
3003
                = fill_slots_from_thread (insn, condition, fallthrough_insn,
3004
                                          insn_at_target, 0, 0,
3005
                                          own_fallthrough,
3006
                                          slots_to_fill, &slots_filled,
3007
                                          delay_list);
3008
            }
3009
        }
3010
      else
3011
        {
3012
          if (own_fallthrough)
3013
            delay_list
3014
              = fill_slots_from_thread (insn, condition, fallthrough_insn,
3015
                                        insn_at_target, 0, 0,
3016
                                        own_fallthrough,
3017
                                        slots_to_fill, &slots_filled,
3018
                                        delay_list);
3019
 
3020
          if (delay_list == 0)
3021
            delay_list
3022
              = fill_slots_from_thread (insn, condition, insn_at_target,
3023
                                        next_active_insn (insn), 0, 1,
3024
                                        own_target,
3025
                                        slots_to_fill, &slots_filled,
3026
                                        delay_list);
3027
        }
3028
 
3029
      if (delay_list)
3030
        unfilled_slots_base[i]
3031
          = emit_delay_sequence (insn, delay_list, slots_filled);
3032
 
3033
      if (slots_to_fill == slots_filled)
3034
        unfilled_slots_base[i] = 0;
3035
 
3036
      note_delay_statistics (slots_filled, 1);
3037
    }
3038
}
3039
 
3040
/* Once we have tried two ways to fill a delay slot, make a pass over the
3041
   code to try to improve the results and to do such things as more jump
3042
   threading.  */
3043
 
3044
static void
3045
relax_delay_slots (rtx first)
3046
{
3047
  rtx insn, next, pat;
3048
  rtx trial, delay_insn, target_label;
3049
 
3050
  /* Look at every JUMP_INSN and see if we can improve it.  */
3051
  for (insn = first; insn; insn = next)
3052
    {
3053
      rtx other;
3054
 
3055
      next = next_active_insn (insn);
3056
 
3057
      /* If this is a jump insn, see if it now jumps to a jump, jumps to
3058
         the next insn, or jumps to a label that is not the last of a
3059
         group of consecutive labels.  */
3060
      if (JUMP_P (insn)
3061
          && (condjump_p (insn) || condjump_in_parallel_p (insn))
3062
          && (target_label = JUMP_LABEL (insn)) != 0)
3063
        {
3064
          target_label = skip_consecutive_labels (follow_jumps (target_label));
3065
          if (target_label == 0)
3066
            target_label = find_end_label ();
3067
 
3068
          if (target_label && next_active_insn (target_label) == next
3069
              && ! condjump_in_parallel_p (insn))
3070
            {
3071
              delete_jump (insn);
3072
              continue;
3073
            }
3074
 
3075
          if (target_label && target_label != JUMP_LABEL (insn))
3076
            reorg_redirect_jump (insn, target_label);
3077
 
3078
          /* See if this jump conditionally branches around an unconditional
3079
             jump.  If so, invert this jump and point it to the target of the
3080
             second jump.  */
3081
          if (next && JUMP_P (next)
3082
              && any_condjump_p (insn)
3083
              && (simplejump_p (next) || GET_CODE (PATTERN (next)) == RETURN)
3084
              && target_label
3085
              && next_active_insn (target_label) == next_active_insn (next)
3086
              && no_labels_between_p (insn, next))
3087
            {
3088
              rtx label = JUMP_LABEL (next);
3089
 
3090
              /* Be careful how we do this to avoid deleting code or
3091
                 labels that are momentarily dead.  See similar optimization
3092
                 in jump.c.
3093
 
3094
                 We also need to ensure we properly handle the case when
3095
                 invert_jump fails.  */
3096
 
3097
              ++LABEL_NUSES (target_label);
3098
              if (label)
3099
                ++LABEL_NUSES (label);
3100
 
3101
              if (invert_jump (insn, label, 1))
3102
                {
3103
                  delete_related_insns (next);
3104
                  next = insn;
3105
                }
3106
 
3107
              if (label)
3108
                --LABEL_NUSES (label);
3109
 
3110
              if (--LABEL_NUSES (target_label) == 0)
3111
                delete_related_insns (target_label);
3112
 
3113
              continue;
3114
            }
3115
        }
3116
 
3117
      /* If this is an unconditional jump and the previous insn is a
3118
         conditional jump, try reversing the condition of the previous
3119
         insn and swapping our targets.  The next pass might be able to
3120
         fill the slots.
3121
 
3122
         Don't do this if we expect the conditional branch to be true, because
3123
         we would then be making the more common case longer.  */
3124
 
3125
      if (JUMP_P (insn)
3126
          && (simplejump_p (insn) || GET_CODE (PATTERN (insn)) == RETURN)
3127
          && (other = prev_active_insn (insn)) != 0
3128
          && any_condjump_p (other)
3129
          && no_labels_between_p (other, insn)
3130
          && 0 > mostly_true_jump (other,
3131
                                   get_branch_condition (other,
3132
                                                         JUMP_LABEL (other))))
3133
        {
3134
          rtx other_target = JUMP_LABEL (other);
3135
          target_label = JUMP_LABEL (insn);
3136
 
3137
          if (invert_jump (other, target_label, 0))
3138
            reorg_redirect_jump (insn, other_target);
3139
        }
3140
 
3141
      /* Now look only at cases where we have filled a delay slot.  */
3142
      if (!NONJUMP_INSN_P (insn)
3143
          || GET_CODE (PATTERN (insn)) != SEQUENCE)
3144
        continue;
3145
 
3146
      pat = PATTERN (insn);
3147
      delay_insn = XVECEXP (pat, 0, 0);
3148
 
3149
      /* See if the first insn in the delay slot is redundant with some
3150
         previous insn.  Remove it from the delay slot if so; then set up
3151
         to reprocess this insn.  */
3152
      if (redundant_insn (XVECEXP (pat, 0, 1), delay_insn, 0))
3153
        {
3154
          delete_from_delay_slot (XVECEXP (pat, 0, 1));
3155
          next = prev_active_insn (next);
3156
          continue;
3157
        }
3158
 
3159
      /* See if we have a RETURN insn with a filled delay slot followed
3160
         by a RETURN insn with an unfilled a delay slot.  If so, we can delete
3161
         the first RETURN (but not its delay insn).  This gives the same
3162
         effect in fewer instructions.
3163
 
3164
         Only do so if optimizing for size since this results in slower, but
3165
         smaller code.  */
3166
      if (optimize_size
3167
          && GET_CODE (PATTERN (delay_insn)) == RETURN
3168
          && next
3169
          && JUMP_P (next)
3170
          && GET_CODE (PATTERN (next)) == RETURN)
3171
        {
3172
          rtx after;
3173
          int i;
3174
 
3175
          /* Delete the RETURN and just execute the delay list insns.
3176
 
3177
             We do this by deleting the INSN containing the SEQUENCE, then
3178
             re-emitting the insns separately, and then deleting the RETURN.
3179
             This allows the count of the jump target to be properly
3180
             decremented.  */
3181
 
3182
          /* Clear the from target bit, since these insns are no longer
3183
             in delay slots.  */
3184
          for (i = 0; i < XVECLEN (pat, 0); i++)
3185
            INSN_FROM_TARGET_P (XVECEXP (pat, 0, i)) = 0;
3186
 
3187
          trial = PREV_INSN (insn);
3188
          delete_related_insns (insn);
3189
          gcc_assert (GET_CODE (pat) == SEQUENCE);
3190
          after = trial;
3191
          for (i = 0; i < XVECLEN (pat, 0); i++)
3192
            {
3193
              rtx this_insn = XVECEXP (pat, 0, i);
3194
              add_insn_after (this_insn, after);
3195
              after = this_insn;
3196
            }
3197
          delete_scheduled_jump (delay_insn);
3198
          continue;
3199
        }
3200
 
3201
      /* Now look only at the cases where we have a filled JUMP_INSN.  */
3202
      if (!JUMP_P (XVECEXP (PATTERN (insn), 0, 0))
3203
          || ! (condjump_p (XVECEXP (PATTERN (insn), 0, 0))
3204
                || condjump_in_parallel_p (XVECEXP (PATTERN (insn), 0, 0))))
3205
        continue;
3206
 
3207
      target_label = JUMP_LABEL (delay_insn);
3208
 
3209
      if (target_label)
3210
        {
3211
          /* If this jump goes to another unconditional jump, thread it, but
3212
             don't convert a jump into a RETURN here.  */
3213
          trial = skip_consecutive_labels (follow_jumps (target_label));
3214
          if (trial == 0)
3215
            trial = find_end_label ();
3216
 
3217
          if (trial && trial != target_label
3218
              && redirect_with_delay_slots_safe_p (delay_insn, trial, insn))
3219
            {
3220
              reorg_redirect_jump (delay_insn, trial);
3221
              target_label = trial;
3222
            }
3223
 
3224
          /* If the first insn at TARGET_LABEL is redundant with a previous
3225
             insn, redirect the jump to the following insn process again.  */
3226
          trial = next_active_insn (target_label);
3227
          if (trial && GET_CODE (PATTERN (trial)) != SEQUENCE
3228
              && redundant_insn (trial, insn, 0)
3229
              && ! can_throw_internal (trial))
3230
            {
3231
              /* Figure out where to emit the special USE insn so we don't
3232
                 later incorrectly compute register live/death info.  */
3233
              rtx tmp = next_active_insn (trial);
3234
              if (tmp == 0)
3235
                tmp = find_end_label ();
3236
 
3237
              if (tmp)
3238
                {
3239
                  /* Insert the special USE insn and update dataflow info.  */
3240
                  update_block (trial, tmp);
3241
 
3242
                  /* Now emit a label before the special USE insn, and
3243
                     redirect our jump to the new label.  */
3244
                  target_label = get_label_before (PREV_INSN (tmp));
3245
                  reorg_redirect_jump (delay_insn, target_label);
3246
                  next = insn;
3247
                  continue;
3248
                }
3249
            }
3250
 
3251
          /* Similarly, if it is an unconditional jump with one insn in its
3252
             delay list and that insn is redundant, thread the jump.  */
3253
          if (trial && GET_CODE (PATTERN (trial)) == SEQUENCE
3254
              && XVECLEN (PATTERN (trial), 0) == 2
3255
              && JUMP_P (XVECEXP (PATTERN (trial), 0, 0))
3256
              && (simplejump_p (XVECEXP (PATTERN (trial), 0, 0))
3257
                  || GET_CODE (PATTERN (XVECEXP (PATTERN (trial), 0, 0))) == RETURN)
3258
              && redundant_insn (XVECEXP (PATTERN (trial), 0, 1), insn, 0))
3259
            {
3260
              target_label = JUMP_LABEL (XVECEXP (PATTERN (trial), 0, 0));
3261
              if (target_label == 0)
3262
                target_label = find_end_label ();
3263
 
3264
              if (target_label
3265
                  && redirect_with_delay_slots_safe_p (delay_insn, target_label,
3266
                                                       insn))
3267
                {
3268
                  reorg_redirect_jump (delay_insn, target_label);
3269
                  next = insn;
3270
                  continue;
3271
                }
3272
            }
3273
        }
3274
 
3275
      if (! INSN_ANNULLED_BRANCH_P (delay_insn)
3276
          && prev_active_insn (target_label) == insn
3277
          && ! condjump_in_parallel_p (delay_insn)
3278
#ifdef HAVE_cc0
3279
          /* If the last insn in the delay slot sets CC0 for some insn,
3280
             various code assumes that it is in a delay slot.  We could
3281
             put it back where it belonged and delete the register notes,
3282
             but it doesn't seem worthwhile in this uncommon case.  */
3283
          && ! find_reg_note (XVECEXP (pat, 0, XVECLEN (pat, 0) - 1),
3284
                              REG_CC_USER, NULL_RTX)
3285
#endif
3286
          )
3287
        {
3288
          rtx after;
3289
          int i;
3290
 
3291
          /* All this insn does is execute its delay list and jump to the
3292
             following insn.  So delete the jump and just execute the delay
3293
             list insns.
3294
 
3295
             We do this by deleting the INSN containing the SEQUENCE, then
3296
             re-emitting the insns separately, and then deleting the jump.
3297
             This allows the count of the jump target to be properly
3298
             decremented.  */
3299
 
3300
          /* Clear the from target bit, since these insns are no longer
3301
             in delay slots.  */
3302
          for (i = 0; i < XVECLEN (pat, 0); i++)
3303
            INSN_FROM_TARGET_P (XVECEXP (pat, 0, i)) = 0;
3304
 
3305
          trial = PREV_INSN (insn);
3306
          delete_related_insns (insn);
3307
          gcc_assert (GET_CODE (pat) == SEQUENCE);
3308
          after = trial;
3309
          for (i = 0; i < XVECLEN (pat, 0); i++)
3310
            {
3311
              rtx this_insn = XVECEXP (pat, 0, i);
3312
              add_insn_after (this_insn, after);
3313
              after = this_insn;
3314
            }
3315
          delete_scheduled_jump (delay_insn);
3316
          continue;
3317
        }
3318
 
3319
      /* See if this is an unconditional jump around a single insn which is
3320
         identical to the one in its delay slot.  In this case, we can just
3321
         delete the branch and the insn in its delay slot.  */
3322
      if (next && NONJUMP_INSN_P (next)
3323
          && prev_label (next_active_insn (next)) == target_label
3324
          && simplejump_p (insn)
3325
          && XVECLEN (pat, 0) == 2
3326
          && rtx_equal_p (PATTERN (next), PATTERN (XVECEXP (pat, 0, 1))))
3327
        {
3328
          delete_related_insns (insn);
3329
          continue;
3330
        }
3331
 
3332
      /* See if this jump (with its delay slots) conditionally branches
3333
         around an unconditional jump (without delay slots).  If so, invert
3334
         this jump and point it to the target of the second jump.  We cannot
3335
         do this for annulled jumps, though.  Again, don't convert a jump to
3336
         a RETURN here.  */
3337
      if (! INSN_ANNULLED_BRANCH_P (delay_insn)
3338
          && any_condjump_p (delay_insn)
3339
          && next && JUMP_P (next)
3340
          && (simplejump_p (next) || GET_CODE (PATTERN (next)) == RETURN)
3341
          && next_active_insn (target_label) == next_active_insn (next)
3342
          && no_labels_between_p (insn, next))
3343
        {
3344
          rtx label = JUMP_LABEL (next);
3345
          rtx old_label = JUMP_LABEL (delay_insn);
3346
 
3347
          if (label == 0)
3348
            label = find_end_label ();
3349
 
3350
          /* find_end_label can generate a new label. Check this first.  */
3351
          if (label
3352
              && no_labels_between_p (insn, next)
3353
              && redirect_with_delay_slots_safe_p (delay_insn, label, insn))
3354
            {
3355
              /* Be careful how we do this to avoid deleting code or labels
3356
                 that are momentarily dead.  See similar optimization in
3357
                 jump.c  */
3358
              if (old_label)
3359
                ++LABEL_NUSES (old_label);
3360
 
3361
              if (invert_jump (delay_insn, label, 1))
3362
                {
3363
                  int i;
3364
 
3365
                  /* Must update the INSN_FROM_TARGET_P bits now that
3366
                     the branch is reversed, so that mark_target_live_regs
3367
                     will handle the delay slot insn correctly.  */
3368
                  for (i = 1; i < XVECLEN (PATTERN (insn), 0); i++)
3369
                    {
3370
                      rtx slot = XVECEXP (PATTERN (insn), 0, i);
3371
                      INSN_FROM_TARGET_P (slot) = ! INSN_FROM_TARGET_P (slot);
3372
                    }
3373
 
3374
                  delete_related_insns (next);
3375
                  next = insn;
3376
                }
3377
 
3378
              if (old_label && --LABEL_NUSES (old_label) == 0)
3379
                delete_related_insns (old_label);
3380
              continue;
3381
            }
3382
        }
3383
 
3384
      /* If we own the thread opposite the way this insn branches, see if we
3385
         can merge its delay slots with following insns.  */
3386
      if (INSN_FROM_TARGET_P (XVECEXP (pat, 0, 1))
3387
          && own_thread_p (NEXT_INSN (insn), 0, 1))
3388
        try_merge_delay_insns (insn, next);
3389
      else if (! INSN_FROM_TARGET_P (XVECEXP (pat, 0, 1))
3390
               && own_thread_p (target_label, target_label, 0))
3391
        try_merge_delay_insns (insn, next_active_insn (target_label));
3392
 
3393
      /* If we get here, we haven't deleted INSN.  But we may have deleted
3394
         NEXT, so recompute it.  */
3395
      next = next_active_insn (insn);
3396
    }
3397
}
3398
 
3399
#ifdef HAVE_return
3400
 
3401
/* Look for filled jumps to the end of function label.  We can try to convert
3402
   them into RETURN insns if the insns in the delay slot are valid for the
3403
   RETURN as well.  */
3404
 
3405
static void
3406
make_return_insns (rtx first)
3407
{
3408
  rtx insn, jump_insn, pat;
3409
  rtx real_return_label = end_of_function_label;
3410
  int slots, i;
3411
 
3412
#ifdef DELAY_SLOTS_FOR_EPILOGUE
3413
  /* If a previous pass filled delay slots in the epilogue, things get a
3414
     bit more complicated, as those filler insns would generally (without
3415
     data flow analysis) have to be executed after any existing branch
3416
     delay slot filler insns.  It is also unknown whether such a
3417
     transformation would actually be profitable.  Note that the existing
3418
     code only cares for branches with (some) filled delay slots.  */
3419
  if (current_function_epilogue_delay_list != NULL)
3420
    return;
3421
#endif
3422
 
3423
  /* See if there is a RETURN insn in the function other than the one we
3424
     made for END_OF_FUNCTION_LABEL.  If so, set up anything we can't change
3425
     into a RETURN to jump to it.  */
3426
  for (insn = first; insn; insn = NEXT_INSN (insn))
3427
    if (JUMP_P (insn) && GET_CODE (PATTERN (insn)) == RETURN)
3428
      {
3429
        real_return_label = get_label_before (insn);
3430
        break;
3431
      }
3432
 
3433
  /* Show an extra usage of REAL_RETURN_LABEL so it won't go away if it
3434
     was equal to END_OF_FUNCTION_LABEL.  */
3435
  LABEL_NUSES (real_return_label)++;
3436
 
3437
  /* Clear the list of insns to fill so we can use it.  */
3438
  obstack_free (&unfilled_slots_obstack, unfilled_firstobj);
3439
 
3440
  for (insn = first; insn; insn = NEXT_INSN (insn))
3441
    {
3442
      int flags;
3443
 
3444
      /* Only look at filled JUMP_INSNs that go to the end of function
3445
         label.  */
3446
      if (!NONJUMP_INSN_P (insn)
3447
          || GET_CODE (PATTERN (insn)) != SEQUENCE
3448
          || !JUMP_P (XVECEXP (PATTERN (insn), 0, 0))
3449
          || JUMP_LABEL (XVECEXP (PATTERN (insn), 0, 0)) != end_of_function_label)
3450
        continue;
3451
 
3452
      pat = PATTERN (insn);
3453
      jump_insn = XVECEXP (pat, 0, 0);
3454
 
3455
      /* If we can't make the jump into a RETURN, try to redirect it to the best
3456
         RETURN and go on to the next insn.  */
3457
      if (! reorg_redirect_jump (jump_insn, NULL_RTX))
3458
        {
3459
          /* Make sure redirecting the jump will not invalidate the delay
3460
             slot insns.  */
3461
          if (redirect_with_delay_slots_safe_p (jump_insn,
3462
                                                real_return_label,
3463
                                                insn))
3464
            reorg_redirect_jump (jump_insn, real_return_label);
3465
          continue;
3466
        }
3467
 
3468
      /* See if this RETURN can accept the insns current in its delay slot.
3469
         It can if it has more or an equal number of slots and the contents
3470
         of each is valid.  */
3471
 
3472
      flags = get_jump_flags (jump_insn, JUMP_LABEL (jump_insn));
3473
      slots = num_delay_slots (jump_insn);
3474
      if (slots >= XVECLEN (pat, 0) - 1)
3475
        {
3476
          for (i = 1; i < XVECLEN (pat, 0); i++)
3477
            if (! (
3478
#ifdef ANNUL_IFFALSE_SLOTS
3479
                   (INSN_ANNULLED_BRANCH_P (jump_insn)
3480
                    && INSN_FROM_TARGET_P (XVECEXP (pat, 0, i)))
3481
                   ? eligible_for_annul_false (jump_insn, i - 1,
3482
                                               XVECEXP (pat, 0, i), flags) :
3483
#endif
3484
#ifdef ANNUL_IFTRUE_SLOTS
3485
                   (INSN_ANNULLED_BRANCH_P (jump_insn)
3486
                    && ! INSN_FROM_TARGET_P (XVECEXP (pat, 0, i)))
3487
                   ? eligible_for_annul_true (jump_insn, i - 1,
3488
                                              XVECEXP (pat, 0, i), flags) :
3489
#endif
3490
                   eligible_for_delay (jump_insn, i - 1,
3491
                                       XVECEXP (pat, 0, i), flags)))
3492
              break;
3493
        }
3494
      else
3495
        i = 0;
3496
 
3497
      if (i == XVECLEN (pat, 0))
3498
        continue;
3499
 
3500
      /* We have to do something with this insn.  If it is an unconditional
3501
         RETURN, delete the SEQUENCE and output the individual insns,
3502
         followed by the RETURN.  Then set things up so we try to find
3503
         insns for its delay slots, if it needs some.  */
3504
      if (GET_CODE (PATTERN (jump_insn)) == RETURN)
3505
        {
3506
          rtx prev = PREV_INSN (insn);
3507
 
3508
          delete_related_insns (insn);
3509
          for (i = 1; i < XVECLEN (pat, 0); i++)
3510
            prev = emit_insn_after (PATTERN (XVECEXP (pat, 0, i)), prev);
3511
 
3512
          insn = emit_jump_insn_after (PATTERN (jump_insn), prev);
3513
          emit_barrier_after (insn);
3514
 
3515
          if (slots)
3516
            obstack_ptr_grow (&unfilled_slots_obstack, insn);
3517
        }
3518
      else
3519
        /* It is probably more efficient to keep this with its current
3520
           delay slot as a branch to a RETURN.  */
3521
        reorg_redirect_jump (jump_insn, real_return_label);
3522
    }
3523
 
3524
  /* Now delete REAL_RETURN_LABEL if we never used it.  Then try to fill any
3525
     new delay slots we have created.  */
3526
  if (--LABEL_NUSES (real_return_label) == 0)
3527
    delete_related_insns (real_return_label);
3528
 
3529
  fill_simple_delay_slots (1);
3530
  fill_simple_delay_slots (0);
3531
}
3532
#endif
3533
 
3534
/* Try to find insns to place in delay slots.  */
3535
 
3536
void
3537
dbr_schedule (rtx first)
3538
{
3539
  rtx insn, next, epilogue_insn = 0;
3540
  int i;
3541
 
3542
  /* If the current function has no insns other than the prologue and
3543
     epilogue, then do not try to fill any delay slots.  */
3544
  if (n_basic_blocks == NUM_FIXED_BLOCKS)
3545
    return;
3546
 
3547
  /* Find the highest INSN_UID and allocate and initialize our map from
3548
     INSN_UID's to position in code.  */
3549
  for (max_uid = 0, insn = first; insn; insn = NEXT_INSN (insn))
3550
    {
3551
      if (INSN_UID (insn) > max_uid)
3552
        max_uid = INSN_UID (insn);
3553
      if (NOTE_P (insn)
3554
          && NOTE_LINE_NUMBER (insn) == NOTE_INSN_EPILOGUE_BEG)
3555
        epilogue_insn = insn;
3556
    }
3557
 
3558
  uid_to_ruid = xmalloc ((max_uid + 1) * sizeof (int));
3559
  for (i = 0, insn = first; insn; i++, insn = NEXT_INSN (insn))
3560
    uid_to_ruid[INSN_UID (insn)] = i;
3561
 
3562
  /* Initialize the list of insns that need filling.  */
3563
  if (unfilled_firstobj == 0)
3564
    {
3565
      gcc_obstack_init (&unfilled_slots_obstack);
3566
      unfilled_firstobj = obstack_alloc (&unfilled_slots_obstack, 0);
3567
    }
3568
 
3569
  for (insn = next_active_insn (first); insn; insn = next_active_insn (insn))
3570
    {
3571
      rtx target;
3572
 
3573
      INSN_ANNULLED_BRANCH_P (insn) = 0;
3574
      INSN_FROM_TARGET_P (insn) = 0;
3575
 
3576
      /* Skip vector tables.  We can't get attributes for them.  */
3577
      if (JUMP_P (insn)
3578
          && (GET_CODE (PATTERN (insn)) == ADDR_VEC
3579
              || GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC))
3580
        continue;
3581
 
3582
      if (num_delay_slots (insn) > 0)
3583
        obstack_ptr_grow (&unfilled_slots_obstack, insn);
3584
 
3585
      /* Ensure all jumps go to the last of a set of consecutive labels.  */
3586
      if (JUMP_P (insn)
3587
          && (condjump_p (insn) || condjump_in_parallel_p (insn))
3588
          && JUMP_LABEL (insn) != 0
3589
          && ((target = skip_consecutive_labels (JUMP_LABEL (insn)))
3590
              != JUMP_LABEL (insn)))
3591
        redirect_jump (insn, target, 1);
3592
    }
3593
 
3594
  init_resource_info (epilogue_insn);
3595
 
3596
  /* Show we haven't computed an end-of-function label yet.  */
3597
  end_of_function_label = 0;
3598
 
3599
  /* Initialize the statistics for this function.  */
3600
  memset (num_insns_needing_delays, 0, sizeof num_insns_needing_delays);
3601
  memset (num_filled_delays, 0, sizeof num_filled_delays);
3602
 
3603
  /* Now do the delay slot filling.  Try everything twice in case earlier
3604
     changes make more slots fillable.  */
3605
 
3606
  for (reorg_pass_number = 0;
3607
       reorg_pass_number < MAX_REORG_PASSES;
3608
       reorg_pass_number++)
3609
    {
3610
      fill_simple_delay_slots (1);
3611
      fill_simple_delay_slots (0);
3612
      fill_eager_delay_slots ();
3613
      relax_delay_slots (first);
3614
    }
3615
 
3616
  /* Delete any USE insns made by update_block; subsequent passes don't need
3617
     them or know how to deal with them.  */
3618
  for (insn = first; insn; insn = next)
3619
    {
3620
      next = NEXT_INSN (insn);
3621
 
3622
      if (NONJUMP_INSN_P (insn) && GET_CODE (PATTERN (insn)) == USE
3623
          && INSN_P (XEXP (PATTERN (insn), 0)))
3624
        next = delete_related_insns (insn);
3625
    }
3626
 
3627
  /* If we made an end of function label, indicate that it is now
3628
     safe to delete it by undoing our prior adjustment to LABEL_NUSES.
3629
     If it is now unused, delete it.  */
3630
  if (end_of_function_label && --LABEL_NUSES (end_of_function_label) == 0)
3631
    delete_related_insns (end_of_function_label);
3632
 
3633
#ifdef HAVE_return
3634
  if (HAVE_return && end_of_function_label != 0)
3635
    make_return_insns (first);
3636
#endif
3637
 
3638
  obstack_free (&unfilled_slots_obstack, unfilled_firstobj);
3639
 
3640
  /* It is not clear why the line below is needed, but it does seem to be.  */
3641
  unfilled_firstobj = obstack_alloc (&unfilled_slots_obstack, 0);
3642
 
3643
  if (dump_file)
3644
    {
3645
      int i, j, need_comma;
3646
      int total_delay_slots[MAX_DELAY_HISTOGRAM + 1];
3647
      int total_annul_slots[MAX_DELAY_HISTOGRAM + 1];
3648
 
3649
      for (reorg_pass_number = 0;
3650
           reorg_pass_number < MAX_REORG_PASSES;
3651
           reorg_pass_number++)
3652
        {
3653
          fprintf (dump_file, ";; Reorg pass #%d:\n", reorg_pass_number + 1);
3654
          for (i = 0; i < NUM_REORG_FUNCTIONS; i++)
3655
            {
3656
              need_comma = 0;
3657
              fprintf (dump_file, ";; Reorg function #%d\n", i);
3658
 
3659
              fprintf (dump_file, ";; %d insns needing delay slots\n;; ",
3660
                       num_insns_needing_delays[i][reorg_pass_number]);
3661
 
3662
              for (j = 0; j < MAX_DELAY_HISTOGRAM + 1; j++)
3663
                if (num_filled_delays[i][j][reorg_pass_number])
3664
                  {
3665
                    if (need_comma)
3666
                      fprintf (dump_file, ", ");
3667
                    need_comma = 1;
3668
                    fprintf (dump_file, "%d got %d delays",
3669
                             num_filled_delays[i][j][reorg_pass_number], j);
3670
                  }
3671
              fprintf (dump_file, "\n");
3672
            }
3673
        }
3674
      memset (total_delay_slots, 0, sizeof total_delay_slots);
3675
      memset (total_annul_slots, 0, sizeof total_annul_slots);
3676
      for (insn = first; insn; insn = NEXT_INSN (insn))
3677
        {
3678
          if (! INSN_DELETED_P (insn)
3679
              && NONJUMP_INSN_P (insn)
3680
              && GET_CODE (PATTERN (insn)) != USE
3681
              && GET_CODE (PATTERN (insn)) != CLOBBER)
3682
            {
3683
              if (GET_CODE (PATTERN (insn)) == SEQUENCE)
3684
                {
3685
                  j = XVECLEN (PATTERN (insn), 0) - 1;
3686
                  if (j > MAX_DELAY_HISTOGRAM)
3687
                    j = MAX_DELAY_HISTOGRAM;
3688
                  if (INSN_ANNULLED_BRANCH_P (XVECEXP (PATTERN (insn), 0, 0)))
3689
                    total_annul_slots[j]++;
3690
                  else
3691
                    total_delay_slots[j]++;
3692
                }
3693
              else if (num_delay_slots (insn) > 0)
3694
                total_delay_slots[0]++;
3695
            }
3696
        }
3697
      fprintf (dump_file, ";; Reorg totals: ");
3698
      need_comma = 0;
3699
      for (j = 0; j < MAX_DELAY_HISTOGRAM + 1; j++)
3700
        {
3701
          if (total_delay_slots[j])
3702
            {
3703
              if (need_comma)
3704
                fprintf (dump_file, ", ");
3705
              need_comma = 1;
3706
              fprintf (dump_file, "%d got %d delays", total_delay_slots[j], j);
3707
            }
3708
        }
3709
      fprintf (dump_file, "\n");
3710
#if defined (ANNUL_IFTRUE_SLOTS) || defined (ANNUL_IFFALSE_SLOTS)
3711
      fprintf (dump_file, ";; Reorg annuls: ");
3712
      need_comma = 0;
3713
      for (j = 0; j < MAX_DELAY_HISTOGRAM + 1; j++)
3714
        {
3715
          if (total_annul_slots[j])
3716
            {
3717
              if (need_comma)
3718
                fprintf (dump_file, ", ");
3719
              need_comma = 1;
3720
              fprintf (dump_file, "%d got %d delays", total_annul_slots[j], j);
3721
            }
3722
        }
3723
      fprintf (dump_file, "\n");
3724
#endif
3725
      fprintf (dump_file, "\n");
3726
    }
3727
 
3728
  /* For all JUMP insns, fill in branch prediction notes, so that during
3729
     assembler output a target can set branch prediction bits in the code.
3730
     We have to do this now, as up until this point the destinations of
3731
     JUMPS can be moved around and changed, but past right here that cannot
3732
     happen.  */
3733
  for (insn = first; insn; insn = NEXT_INSN (insn))
3734
    {
3735
      int pred_flags;
3736
 
3737
      if (NONJUMP_INSN_P (insn))
3738
        {
3739
          rtx pat = PATTERN (insn);
3740
 
3741
          if (GET_CODE (pat) == SEQUENCE)
3742
            insn = XVECEXP (pat, 0, 0);
3743
        }
3744
      if (!JUMP_P (insn))
3745
        continue;
3746
 
3747
      pred_flags = get_jump_flags (insn, JUMP_LABEL (insn));
3748
      REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_BR_PRED,
3749
                                            GEN_INT (pred_flags),
3750
                                            REG_NOTES (insn));
3751
    }
3752
  free_resource_info ();
3753
  free (uid_to_ruid);
3754
#ifdef DELAY_SLOTS_FOR_EPILOGUE
3755
  /* SPARC assembler, for instance, emit warning when debug info is output
3756
     into the delay slot.  */
3757
  {
3758
    rtx link;
3759
 
3760
    for (link = current_function_epilogue_delay_list;
3761
         link;
3762
         link = XEXP (link, 1))
3763
      INSN_LOCATOR (XEXP (link, 0)) = 0;
3764
  }
3765
#endif
3766
}
3767
#endif /* DELAY_SLOTS */
3768
 
3769
static bool
3770
gate_handle_delay_slots (void)
3771
{
3772
#ifdef DELAY_SLOTS
3773
  return flag_delayed_branch;
3774
#else 
3775
  return 0;
3776
#endif
3777
}
3778
 
3779
/* Run delay slot optimization.  */
3780
static unsigned int
3781
rest_of_handle_delay_slots (void)
3782
{
3783
#ifdef DELAY_SLOTS
3784
  dbr_schedule (get_insns ());
3785
#endif
3786
  return 0;
3787
}
3788
 
3789
struct tree_opt_pass pass_delay_slots =
3790
{
3791
  "dbr",                                /* name */
3792
  gate_handle_delay_slots,              /* gate */
3793
  rest_of_handle_delay_slots,           /* execute */
3794
  NULL,                                 /* sub */
3795
  NULL,                                 /* next */
3796
  0,                                    /* static_pass_number */
3797
  TV_DBR_SCHED,                         /* tv_id */
3798
  0,                                    /* properties_required */
3799
  0,                                    /* properties_provided */
3800
  0,                                    /* properties_destroyed */
3801
  0,                                    /* todo_flags_start */
3802
  TODO_dump_func |
3803
  TODO_ggc_collect,                     /* todo_flags_finish */
3804
  'd'                                   /* letter */
3805
};
3806
 
3807
/* Machine dependent reorg pass.  */
3808
static bool
3809
gate_handle_machine_reorg (void)
3810
{
3811
  return targetm.machine_dependent_reorg != 0;
3812
}
3813
 
3814
 
3815
static unsigned int
3816
rest_of_handle_machine_reorg (void)
3817
{
3818
  targetm.machine_dependent_reorg ();
3819
  return 0;
3820
}
3821
 
3822
struct tree_opt_pass pass_machine_reorg =
3823
{
3824
  "mach",                               /* name */
3825
  gate_handle_machine_reorg,            /* gate */
3826
  rest_of_handle_machine_reorg,         /* execute */
3827
  NULL,                                 /* sub */
3828
  NULL,                                 /* next */
3829
  0,                                    /* static_pass_number */
3830
  TV_MACH_DEP,                          /* tv_id */
3831
  0,                                    /* properties_required */
3832
  0,                                    /* properties_provided */
3833
  0,                                    /* properties_destroyed */
3834
  0,                                    /* todo_flags_start */
3835
  TODO_dump_func |
3836
  TODO_ggc_collect,                     /* todo_flags_finish */
3837
  'M'                                   /* letter */
3838
};
3839
 

powered by: WebSVN 2.1.0

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