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

Subversion Repositories scarts

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

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

Line No. Rev Author Line
1 12 jlechner
/* Move registers around to reduce number of move instructions needed.
2
   Copyright (C) 1987, 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
3
   1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
4
 
5
This file is part of GCC.
6
 
7
GCC is free software; you can redistribute it and/or modify it under
8
the terms of the GNU General Public License as published by the Free
9
Software Foundation; either version 2, or (at your option) any later
10
version.
11
 
12
GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13
WARRANTY; without even the implied warranty of MERCHANTABILITY or
14
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15
for more details.
16
 
17
You should have received a copy of the GNU General Public License
18
along with GCC; see the file COPYING.  If not, write to the Free
19
Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
20
02110-1301, USA.  */
21
 
22
 
23
/* This module looks for cases where matching constraints would force
24
   an instruction to need a reload, and this reload would be a register
25
   to register move.  It then attempts to change the registers used by the
26
   instruction to avoid the move instruction.  */
27
 
28
#include "config.h"
29
#include "system.h"
30
#include "coretypes.h"
31
#include "tm.h"
32
#include "rtl.h" /* stdio.h must precede rtl.h for FFS.  */
33
#include "tm_p.h"
34
#include "insn-config.h"
35
#include "recog.h"
36
#include "output.h"
37
#include "regs.h"
38
#include "hard-reg-set.h"
39
#include "flags.h"
40
#include "function.h"
41
#include "expr.h"
42
#include "basic-block.h"
43
#include "except.h"
44
#include "toplev.h"
45
#include "reload.h"
46
#include "timevar.h"
47
#include "tree-pass.h"
48
 
49
 
50
/* Turn STACK_GROWS_DOWNWARD into a boolean.  */
51
#ifdef STACK_GROWS_DOWNWARD
52
#undef STACK_GROWS_DOWNWARD
53
#define STACK_GROWS_DOWNWARD 1
54
#else
55
#define STACK_GROWS_DOWNWARD 0
56
#endif
57
 
58
static int perhaps_ends_bb_p (rtx);
59
static int optimize_reg_copy_1 (rtx, rtx, rtx);
60
static void optimize_reg_copy_2 (rtx, rtx, rtx);
61
static void optimize_reg_copy_3 (rtx, rtx, rtx);
62
static void copy_src_to_dest (rtx, rtx, rtx, int);
63
static int *regmove_bb_head;
64
 
65
struct match {
66
  int with[MAX_RECOG_OPERANDS];
67
  enum { READ, WRITE, READWRITE } use[MAX_RECOG_OPERANDS];
68
  int commutative[MAX_RECOG_OPERANDS];
69
  int early_clobber[MAX_RECOG_OPERANDS];
70
};
71
 
72
static rtx discover_flags_reg (void);
73
static void mark_flags_life_zones (rtx);
74
static void flags_set_1 (rtx, rtx, void *);
75
 
76
static int try_auto_increment (rtx, rtx, rtx, rtx, HOST_WIDE_INT, int);
77
static int find_matches (rtx, struct match *);
78
static void replace_in_call_usage (rtx *, unsigned int, rtx, rtx);
79
static int fixup_match_1 (rtx, rtx, rtx, rtx, rtx, int, int, int, FILE *);
80
static int reg_is_remote_constant_p (rtx, rtx, rtx);
81
static int stable_and_no_regs_but_for_p (rtx, rtx, rtx);
82
static int regclass_compatible_p (int, int);
83
static int replacement_quality (rtx);
84
static int fixup_match_2 (rtx, rtx, rtx, rtx, FILE *);
85
 
86
/* Return nonzero if registers with CLASS1 and CLASS2 can be merged without
87
   causing too much register allocation problems.  */
88
static int
89
regclass_compatible_p (int class0, int class1)
90
{
91
  return (class0 == class1
92
          || (reg_class_subset_p (class0, class1)
93
              && ! CLASS_LIKELY_SPILLED_P (class0))
94
          || (reg_class_subset_p (class1, class0)
95
              && ! CLASS_LIKELY_SPILLED_P (class1)));
96
}
97
 
98
/* INC_INSN is an instruction that adds INCREMENT to REG.
99
   Try to fold INC_INSN as a post/pre in/decrement into INSN.
100
   Iff INC_INSN_SET is nonzero, inc_insn has a destination different from src.
101
   Return nonzero for success.  */
102
static int
103
try_auto_increment (rtx insn, rtx inc_insn, rtx inc_insn_set, rtx reg,
104
                    HOST_WIDE_INT increment, int pre)
105
{
106
  enum rtx_code inc_code;
107
 
108
  rtx pset = single_set (insn);
109
  if (pset)
110
    {
111
      /* Can't use the size of SET_SRC, we might have something like
112
         (sign_extend:SI (mem:QI ...  */
113
      rtx use = find_use_as_address (pset, reg, 0);
114
      if (use != 0 && use != (rtx) (size_t) 1)
115
        {
116
          int size = GET_MODE_SIZE (GET_MODE (use));
117
          if (0
118
              || (HAVE_POST_INCREMENT
119
                  && pre == 0 && (inc_code = POST_INC, increment == size))
120
              || (HAVE_PRE_INCREMENT
121
                  && pre == 1 && (inc_code = PRE_INC, increment == size))
122
              || (HAVE_POST_DECREMENT
123
                  && pre == 0 && (inc_code = POST_DEC, increment == -size))
124
              || (HAVE_PRE_DECREMENT
125
                  && pre == 1 && (inc_code = PRE_DEC, increment == -size))
126
          )
127
            {
128
              if (inc_insn_set)
129
                validate_change
130
                  (inc_insn,
131
                   &SET_SRC (inc_insn_set),
132
                   XEXP (SET_SRC (inc_insn_set), 0), 1);
133
              validate_change (insn, &XEXP (use, 0),
134
                               gen_rtx_fmt_e (inc_code, Pmode, reg), 1);
135
              if (apply_change_group ())
136
                {
137
                  /* If there is a REG_DEAD note on this insn, we must
138
                     change this not to REG_UNUSED meaning that the register
139
                     is set, but the value is dead.  Failure to do so will
140
                     result in a sched1 dieing -- when it recomputes lifetime
141
                     information, the number of REG_DEAD notes will have
142
                     changed.  */
143
                  rtx note = find_reg_note (insn, REG_DEAD, reg);
144
                  if (note)
145
                    PUT_MODE (note, REG_UNUSED);
146
 
147
                  REG_NOTES (insn)
148
                    = gen_rtx_EXPR_LIST (REG_INC,
149
                                         reg, REG_NOTES (insn));
150
                  if (! inc_insn_set)
151
                    delete_insn (inc_insn);
152
                  return 1;
153
                }
154
            }
155
        }
156
    }
157
  return 0;
158
}
159
 
160
/* Determine if the pattern generated by add_optab has a clobber,
161
   such as might be issued for a flags hard register.  To make the
162
   code elsewhere simpler, we handle cc0 in this same framework.
163
 
164
   Return the register if one was discovered.  Return NULL_RTX if
165
   if no flags were found.  Return pc_rtx if we got confused.  */
166
 
167
static rtx
168
discover_flags_reg (void)
169
{
170
  rtx tmp;
171
  tmp = gen_rtx_REG (word_mode, 10000);
172
  tmp = gen_add3_insn (tmp, tmp, const2_rtx);
173
 
174
  /* If we get something that isn't a simple set, or a
175
     [(set ..) (clobber ..)], this whole function will go wrong.  */
176
  if (GET_CODE (tmp) == SET)
177
    return NULL_RTX;
178
  else if (GET_CODE (tmp) == PARALLEL)
179
    {
180
      int found;
181
 
182
      if (XVECLEN (tmp, 0) != 2)
183
        return pc_rtx;
184
      tmp = XVECEXP (tmp, 0, 1);
185
      if (GET_CODE (tmp) != CLOBBER)
186
        return pc_rtx;
187
      tmp = XEXP (tmp, 0);
188
 
189
      /* Don't do anything foolish if the md wanted to clobber a
190
         scratch or something.  We only care about hard regs.
191
         Moreover we don't like the notion of subregs of hard regs.  */
192
      if (GET_CODE (tmp) == SUBREG
193
          && REG_P (SUBREG_REG (tmp))
194
          && REGNO (SUBREG_REG (tmp)) < FIRST_PSEUDO_REGISTER)
195
        return pc_rtx;
196
      found = (REG_P (tmp) && REGNO (tmp) < FIRST_PSEUDO_REGISTER);
197
 
198
      return (found ? tmp : NULL_RTX);
199
    }
200
 
201
  return pc_rtx;
202
}
203
 
204
/* It is a tedious task identifying when the flags register is live and
205
   when it is safe to optimize.  Since we process the instruction stream
206
   multiple times, locate and record these live zones by marking the
207
   mode of the instructions --
208
 
209
   QImode is used on the instruction at which the flags becomes live.
210
 
211
   HImode is used within the range (exclusive) that the flags are
212
   live.  Thus the user of the flags is not marked.
213
 
214
   All other instructions are cleared to VOIDmode.  */
215
 
216
/* Used to communicate with flags_set_1.  */
217
static rtx flags_set_1_rtx;
218
static int flags_set_1_set;
219
 
220
static void
221
mark_flags_life_zones (rtx flags)
222
{
223
  int flags_regno;
224
  int flags_nregs;
225
  basic_block block;
226
 
227
#ifdef HAVE_cc0
228
  /* If we found a flags register on a cc0 host, bail.  */
229
  if (flags == NULL_RTX)
230
    flags = cc0_rtx;
231
  else if (flags != cc0_rtx)
232
    flags = pc_rtx;
233
#endif
234
 
235
  /* Simple cases first: if no flags, clear all modes.  If confusing,
236
     mark the entire function as being in a flags shadow.  */
237
  if (flags == NULL_RTX || flags == pc_rtx)
238
    {
239
      enum machine_mode mode = (flags ? HImode : VOIDmode);
240
      rtx insn;
241
      for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
242
        PUT_MODE (insn, mode);
243
      return;
244
    }
245
 
246
#ifdef HAVE_cc0
247
  flags_regno = -1;
248
  flags_nregs = 1;
249
#else
250
  flags_regno = REGNO (flags);
251
  flags_nregs = hard_regno_nregs[flags_regno][GET_MODE (flags)];
252
#endif
253
  flags_set_1_rtx = flags;
254
 
255
  /* Process each basic block.  */
256
  FOR_EACH_BB_REVERSE (block)
257
    {
258
      rtx insn, end;
259
      int live;
260
 
261
      insn = BB_HEAD (block);
262
      end = BB_END (block);
263
 
264
      /* Look out for the (unlikely) case of flags being live across
265
         basic block boundaries.  */
266
      live = 0;
267
#ifndef HAVE_cc0
268
      {
269
        int i;
270
        for (i = 0; i < flags_nregs; ++i)
271
          live |= REGNO_REG_SET_P (block->il.rtl->global_live_at_start,
272
                                   flags_regno + i);
273
      }
274
#endif
275
 
276
      while (1)
277
        {
278
          /* Process liveness in reverse order of importance --
279
             alive, death, birth.  This lets more important info
280
             overwrite the mode of lesser info.  */
281
 
282
          if (INSN_P (insn))
283
            {
284
#ifdef HAVE_cc0
285
              /* In the cc0 case, death is not marked in reg notes,
286
                 but is instead the mere use of cc0 when it is alive.  */
287
              if (live && reg_mentioned_p (cc0_rtx, PATTERN (insn)))
288
                live = 0;
289
#else
290
              /* In the hard reg case, we watch death notes.  */
291
              if (live && find_regno_note (insn, REG_DEAD, flags_regno))
292
                live = 0;
293
#endif
294
              PUT_MODE (insn, (live ? HImode : VOIDmode));
295
 
296
              /* In either case, birth is denoted simply by its presence
297
                 as the destination of a set.  */
298
              flags_set_1_set = 0;
299
              note_stores (PATTERN (insn), flags_set_1, NULL);
300
              if (flags_set_1_set)
301
                {
302
                  live = 1;
303
                  PUT_MODE (insn, QImode);
304
                }
305
            }
306
          else
307
            PUT_MODE (insn, (live ? HImode : VOIDmode));
308
 
309
          if (insn == end)
310
            break;
311
          insn = NEXT_INSN (insn);
312
        }
313
    }
314
}
315
 
316
/* A subroutine of mark_flags_life_zones, called through note_stores.  */
317
 
318
static void
319
flags_set_1 (rtx x, rtx pat, void *data ATTRIBUTE_UNUSED)
320
{
321
  if (GET_CODE (pat) == SET
322
      && reg_overlap_mentioned_p (x, flags_set_1_rtx))
323
    flags_set_1_set = 1;
324
}
325
 
326
static int *regno_src_regno;
327
 
328
/* Indicate how good a choice REG (which appears as a source) is to replace
329
   a destination register with.  The higher the returned value, the better
330
   the choice.  The main objective is to avoid using a register that is
331
   a candidate for tying to a hard register, since the output might in
332
   turn be a candidate to be tied to a different hard register.  */
333
static int
334
replacement_quality (rtx reg)
335
{
336
  int src_regno;
337
 
338
  /* Bad if this isn't a register at all.  */
339
  if (!REG_P (reg))
340
    return 0;
341
 
342
  /* If this register is not meant to get a hard register,
343
     it is a poor choice.  */
344
  if (REG_LIVE_LENGTH (REGNO (reg)) < 0)
345
    return 0;
346
 
347
  src_regno = regno_src_regno[REGNO (reg)];
348
 
349
  /* If it was not copied from another register, it is fine.  */
350
  if (src_regno < 0)
351
    return 3;
352
 
353
  /* Copied from a hard register?  */
354
  if (src_regno < FIRST_PSEUDO_REGISTER)
355
    return 1;
356
 
357
  /* Copied from a pseudo register - not as bad as from a hard register,
358
     yet still cumbersome, since the register live length will be lengthened
359
     when the registers get tied.  */
360
  return 2;
361
}
362
 
363
/* Return 1 if INSN might end a basic block.  */
364
 
365
static int perhaps_ends_bb_p (rtx insn)
366
{
367
  switch (GET_CODE (insn))
368
    {
369
    case CODE_LABEL:
370
    case JUMP_INSN:
371
      /* These always end a basic block.  */
372
      return 1;
373
 
374
    case CALL_INSN:
375
      /* A CALL_INSN might be the last insn of a basic block, if it is inside
376
         an EH region or if there are nonlocal gotos.  Note that this test is
377
         very conservative.  */
378
      if (nonlocal_goto_handler_labels)
379
        return 1;
380
      /* Fall through.  */
381
    default:
382
      return can_throw_internal (insn);
383
    }
384
}
385
 
386
/* INSN is a copy from SRC to DEST, both registers, and SRC does not die
387
   in INSN.
388
 
389
   Search forward to see if SRC dies before either it or DEST is modified,
390
   but don't scan past the end of a basic block.  If so, we can replace SRC
391
   with DEST and let SRC die in INSN.
392
 
393
   This will reduce the number of registers live in that range and may enable
394
   DEST to be tied to SRC, thus often saving one register in addition to a
395
   register-register copy.  */
396
 
397
static int
398
optimize_reg_copy_1 (rtx insn, rtx dest, rtx src)
399
{
400
  rtx p, q;
401
  rtx note;
402
  rtx dest_death = 0;
403
  int sregno = REGNO (src);
404
  int dregno = REGNO (dest);
405
 
406
  /* We don't want to mess with hard regs if register classes are small.  */
407
  if (sregno == dregno
408
      || (SMALL_REGISTER_CLASSES
409
          && (sregno < FIRST_PSEUDO_REGISTER
410
              || dregno < FIRST_PSEUDO_REGISTER))
411
      /* We don't see all updates to SP if they are in an auto-inc memory
412
         reference, so we must disallow this optimization on them.  */
413
      || sregno == STACK_POINTER_REGNUM || dregno == STACK_POINTER_REGNUM)
414
    return 0;
415
 
416
  for (p = NEXT_INSN (insn); p; p = NEXT_INSN (p))
417
    {
418
      /* ??? We can't scan past the end of a basic block without updating
419
         the register lifetime info (REG_DEAD/basic_block_live_at_start).  */
420
      if (perhaps_ends_bb_p (p))
421
        break;
422
      else if (! INSN_P (p))
423
        continue;
424
 
425
      if (reg_set_p (src, p) || reg_set_p (dest, p)
426
          /* If SRC is an asm-declared register, it must not be replaced
427
             in any asm.  Unfortunately, the REG_EXPR tree for the asm
428
             variable may be absent in the SRC rtx, so we can't check the
429
             actual register declaration easily (the asm operand will have
430
             it, though).  To avoid complicating the test for a rare case,
431
             we just don't perform register replacement for a hard reg
432
             mentioned in an asm.  */
433
          || (sregno < FIRST_PSEUDO_REGISTER
434
              && asm_noperands (PATTERN (p)) >= 0
435
              && reg_overlap_mentioned_p (src, PATTERN (p)))
436
          /* Don't change hard registers used by a call.  */
437
          || (CALL_P (p) && sregno < FIRST_PSEUDO_REGISTER
438
              && find_reg_fusage (p, USE, src))
439
          /* Don't change a USE of a register.  */
440
          || (GET_CODE (PATTERN (p)) == USE
441
              && reg_overlap_mentioned_p (src, XEXP (PATTERN (p), 0))))
442
        break;
443
 
444
      /* See if all of SRC dies in P.  This test is slightly more
445
         conservative than it needs to be.  */
446
      if ((note = find_regno_note (p, REG_DEAD, sregno)) != 0
447
          && GET_MODE (XEXP (note, 0)) == GET_MODE (src))
448
        {
449
          int failed = 0;
450
          int d_length = 0;
451
          int s_length = 0;
452
          int d_n_calls = 0;
453
          int s_n_calls = 0;
454
 
455
          /* We can do the optimization.  Scan forward from INSN again,
456
             replacing regs as we go.  Set FAILED if a replacement can't
457
             be done.  In that case, we can't move the death note for SRC.
458
             This should be rare.  */
459
 
460
          /* Set to stop at next insn.  */
461
          for (q = next_real_insn (insn);
462
               q != next_real_insn (p);
463
               q = next_real_insn (q))
464
            {
465
              if (reg_overlap_mentioned_p (src, PATTERN (q)))
466
                {
467
                  /* If SRC is a hard register, we might miss some
468
                     overlapping registers with validate_replace_rtx,
469
                     so we would have to undo it.  We can't if DEST is
470
                     present in the insn, so fail in that combination
471
                     of cases.  */
472
                  if (sregno < FIRST_PSEUDO_REGISTER
473
                      && reg_mentioned_p (dest, PATTERN (q)))
474
                    failed = 1;
475
 
476
                  /* Replace all uses and make sure that the register
477
                     isn't still present.  */
478
                  else if (validate_replace_rtx (src, dest, q)
479
                           && (sregno >= FIRST_PSEUDO_REGISTER
480
                               || ! reg_overlap_mentioned_p (src,
481
                                                             PATTERN (q))))
482
                    ;
483
                  else
484
                    {
485
                      validate_replace_rtx (dest, src, q);
486
                      failed = 1;
487
                    }
488
                }
489
 
490
              /* For SREGNO, count the total number of insns scanned.
491
                 For DREGNO, count the total number of insns scanned after
492
                 passing the death note for DREGNO.  */
493
              s_length++;
494
              if (dest_death)
495
                d_length++;
496
 
497
              /* If the insn in which SRC dies is a CALL_INSN, don't count it
498
                 as a call that has been crossed.  Otherwise, count it.  */
499
              if (q != p && CALL_P (q))
500
                {
501
                  /* Similarly, total calls for SREGNO, total calls beyond
502
                     the death note for DREGNO.  */
503
                  s_n_calls++;
504
                  if (dest_death)
505
                    d_n_calls++;
506
                }
507
 
508
              /* If DEST dies here, remove the death note and save it for
509
                 later.  Make sure ALL of DEST dies here; again, this is
510
                 overly conservative.  */
511
              if (dest_death == 0
512
                  && (dest_death = find_regno_note (q, REG_DEAD, dregno)) != 0)
513
                {
514
                  if (GET_MODE (XEXP (dest_death, 0)) != GET_MODE (dest))
515
                    failed = 1, dest_death = 0;
516
                  else
517
                    remove_note (q, dest_death);
518
                }
519
            }
520
 
521
          if (! failed)
522
            {
523
              /* These counters need to be updated if and only if we are
524
                 going to move the REG_DEAD note.  */
525
              if (sregno >= FIRST_PSEUDO_REGISTER)
526
                {
527
                  if (REG_LIVE_LENGTH (sregno) >= 0)
528
                    {
529
                      REG_LIVE_LENGTH (sregno) -= s_length;
530
                      /* REG_LIVE_LENGTH is only an approximation after
531
                         combine if sched is not run, so make sure that we
532
                         still have a reasonable value.  */
533
                      if (REG_LIVE_LENGTH (sregno) < 2)
534
                        REG_LIVE_LENGTH (sregno) = 2;
535
                    }
536
 
537
                  REG_N_CALLS_CROSSED (sregno) -= s_n_calls;
538
                }
539
 
540
              /* Move death note of SRC from P to INSN.  */
541
              remove_note (p, note);
542
              XEXP (note, 1) = REG_NOTES (insn);
543
              REG_NOTES (insn) = note;
544
            }
545
 
546
          /* DEST is also dead if INSN has a REG_UNUSED note for DEST.  */
547
          if (! dest_death
548
              && (dest_death = find_regno_note (insn, REG_UNUSED, dregno)))
549
            {
550
              PUT_REG_NOTE_KIND (dest_death, REG_DEAD);
551
              remove_note (insn, dest_death);
552
            }
553
 
554
          /* Put death note of DEST on P if we saw it die.  */
555
          if (dest_death)
556
            {
557
              XEXP (dest_death, 1) = REG_NOTES (p);
558
              REG_NOTES (p) = dest_death;
559
 
560
              if (dregno >= FIRST_PSEUDO_REGISTER)
561
                {
562
                  /* If and only if we are moving the death note for DREGNO,
563
                     then we need to update its counters.  */
564
                  if (REG_LIVE_LENGTH (dregno) >= 0)
565
                    REG_LIVE_LENGTH (dregno) += d_length;
566
                  REG_N_CALLS_CROSSED (dregno) += d_n_calls;
567
                }
568
            }
569
 
570
          return ! failed;
571
        }
572
 
573
      /* If SRC is a hard register which is set or killed in some other
574
         way, we can't do this optimization.  */
575
      else if (sregno < FIRST_PSEUDO_REGISTER
576
               && dead_or_set_p (p, src))
577
        break;
578
    }
579
  return 0;
580
}
581
 
582
/* INSN is a copy of SRC to DEST, in which SRC dies.  See if we now have
583
   a sequence of insns that modify DEST followed by an insn that sets
584
   SRC to DEST in which DEST dies, with no prior modification of DEST.
585
   (There is no need to check if the insns in between actually modify
586
   DEST.  We should not have cases where DEST is not modified, but
587
   the optimization is safe if no such modification is detected.)
588
   In that case, we can replace all uses of DEST, starting with INSN and
589
   ending with the set of SRC to DEST, with SRC.  We do not do this
590
   optimization if a CALL_INSN is crossed unless SRC already crosses a
591
   call or if DEST dies before the copy back to SRC.
592
 
593
   It is assumed that DEST and SRC are pseudos; it is too complicated to do
594
   this for hard registers since the substitutions we may make might fail.  */
595
 
596
static void
597
optimize_reg_copy_2 (rtx insn, rtx dest, rtx src)
598
{
599
  rtx p, q;
600
  rtx set;
601
  int sregno = REGNO (src);
602
  int dregno = REGNO (dest);
603
 
604
  for (p = NEXT_INSN (insn); p; p = NEXT_INSN (p))
605
    {
606
      /* ??? We can't scan past the end of a basic block without updating
607
         the register lifetime info (REG_DEAD/basic_block_live_at_start).  */
608
      if (perhaps_ends_bb_p (p))
609
        break;
610
      else if (! INSN_P (p))
611
        continue;
612
 
613
      set = single_set (p);
614
      if (set && SET_SRC (set) == dest && SET_DEST (set) == src
615
          && find_reg_note (p, REG_DEAD, dest))
616
        {
617
          /* We can do the optimization.  Scan forward from INSN again,
618
             replacing regs as we go.  */
619
 
620
          /* Set to stop at next insn.  */
621
          for (q = insn; q != NEXT_INSN (p); q = NEXT_INSN (q))
622
            if (INSN_P (q))
623
              {
624
                if (reg_mentioned_p (dest, PATTERN (q)))
625
                  PATTERN (q) = replace_rtx (PATTERN (q), dest, src);
626
 
627
 
628
              if (CALL_P (q))
629
                {
630
                  REG_N_CALLS_CROSSED (dregno)--;
631
                  REG_N_CALLS_CROSSED (sregno)++;
632
                }
633
              }
634
 
635
          remove_note (p, find_reg_note (p, REG_DEAD, dest));
636
          REG_N_DEATHS (dregno)--;
637
          remove_note (insn, find_reg_note (insn, REG_DEAD, src));
638
          REG_N_DEATHS (sregno)--;
639
          return;
640
        }
641
 
642
      if (reg_set_p (src, p)
643
          || find_reg_note (p, REG_DEAD, dest)
644
          || (CALL_P (p) && REG_N_CALLS_CROSSED (sregno) == 0))
645
        break;
646
    }
647
}
648
/* INSN is a ZERO_EXTEND or SIGN_EXTEND of SRC to DEST.
649
   Look if SRC dies there, and if it is only set once, by loading
650
   it from memory.  If so, try to incorporate the zero/sign extension
651
   into the memory read, change SRC to the mode of DEST, and alter
652
   the remaining accesses to use the appropriate SUBREG.  This allows
653
   SRC and DEST to be tied later.  */
654
static void
655
optimize_reg_copy_3 (rtx insn, rtx dest, rtx src)
656
{
657
  rtx src_reg = XEXP (src, 0);
658
  int src_no = REGNO (src_reg);
659
  int dst_no = REGNO (dest);
660
  rtx p, set;
661
  enum machine_mode old_mode;
662
 
663
  if (src_no < FIRST_PSEUDO_REGISTER
664
      || dst_no < FIRST_PSEUDO_REGISTER
665
      || ! find_reg_note (insn, REG_DEAD, src_reg)
666
      || REG_N_DEATHS (src_no) != 1
667
      || REG_N_SETS (src_no) != 1)
668
    return;
669
  for (p = PREV_INSN (insn); p && ! reg_set_p (src_reg, p); p = PREV_INSN (p))
670
    /* ??? We can't scan past the end of a basic block without updating
671
       the register lifetime info (REG_DEAD/basic_block_live_at_start).  */
672
    if (perhaps_ends_bb_p (p))
673
      break;
674
 
675
  if (! p)
676
    return;
677
 
678
  if (! (set = single_set (p))
679
      || !MEM_P (SET_SRC (set))
680
      /* If there's a REG_EQUIV note, this must be an insn that loads an
681
         argument.  Prefer keeping the note over doing this optimization.  */
682
      || find_reg_note (p, REG_EQUIV, NULL_RTX)
683
      || SET_DEST (set) != src_reg)
684
    return;
685
 
686
  /* Be conservative: although this optimization is also valid for
687
     volatile memory references, that could cause trouble in later passes.  */
688
  if (MEM_VOLATILE_P (SET_SRC (set)))
689
    return;
690
 
691
  /* Do not use a SUBREG to truncate from one mode to another if truncation
692
     is not a nop.  */
693
  if (GET_MODE_BITSIZE (GET_MODE (src_reg)) <= GET_MODE_BITSIZE (GET_MODE (src))
694
      && !TRULY_NOOP_TRUNCATION (GET_MODE_BITSIZE (GET_MODE (src)),
695
                                 GET_MODE_BITSIZE (GET_MODE (src_reg))))
696
    return;
697
 
698
  old_mode = GET_MODE (src_reg);
699
  PUT_MODE (src_reg, GET_MODE (src));
700
  XEXP (src, 0) = SET_SRC (set);
701
 
702
  /* Include this change in the group so that it's easily undone if
703
     one of the changes in the group is invalid.  */
704
  validate_change (p, &SET_SRC (set), src, 1);
705
 
706
  /* Now walk forward making additional replacements.  We want to be able
707
     to undo all the changes if a later substitution fails.  */
708
  while (p = NEXT_INSN (p), p != insn)
709
    {
710
      if (! INSN_P (p))
711
        continue;
712
 
713
      /* Make a tentative change.  */
714
      validate_replace_rtx_group (src_reg,
715
                                  gen_lowpart_SUBREG (old_mode, src_reg),
716
                                  p);
717
    }
718
 
719
  validate_replace_rtx_group (src, src_reg, insn);
720
 
721
  /* Now see if all the changes are valid.  */
722
  if (! apply_change_group ())
723
    {
724
      /* One or more changes were no good.  Back out everything.  */
725
      PUT_MODE (src_reg, old_mode);
726
      XEXP (src, 0) = src_reg;
727
    }
728
  else
729
    {
730
      rtx note = find_reg_note (p, REG_EQUAL, NULL_RTX);
731
      if (note)
732
        remove_note (p, note);
733
    }
734
}
735
 
736
 
737
/* If we were not able to update the users of src to use dest directly, try
738
   instead moving the value to dest directly before the operation.  */
739
 
740
static void
741
copy_src_to_dest (rtx insn, rtx src, rtx dest, int old_max_uid)
742
{
743
  rtx seq;
744
  rtx link;
745
  rtx next;
746
  rtx set;
747
  rtx move_insn;
748
  rtx *p_insn_notes;
749
  rtx *p_move_notes;
750
  int src_regno;
751
  int dest_regno;
752
  int bb;
753
  int insn_uid;
754
  int move_uid;
755
 
756
  /* A REG_LIVE_LENGTH of -1 indicates the register is equivalent to a constant
757
     or memory location and is used infrequently; a REG_LIVE_LENGTH of -2 is
758
     parameter when there is no frame pointer that is not allocated a register.
759
     For now, we just reject them, rather than incrementing the live length.  */
760
 
761
  if (REG_P (src)
762
      && REG_LIVE_LENGTH (REGNO (src)) > 0
763
      && REG_P (dest)
764
      && REG_LIVE_LENGTH (REGNO (dest)) > 0
765
      && (set = single_set (insn)) != NULL_RTX
766
      && !reg_mentioned_p (dest, SET_SRC (set))
767
      && GET_MODE (src) == GET_MODE (dest))
768
    {
769
      int old_num_regs = reg_rtx_no;
770
 
771
      /* Generate the src->dest move.  */
772
      start_sequence ();
773
      emit_move_insn (dest, src);
774
      seq = get_insns ();
775
      end_sequence ();
776
      /* If this sequence uses new registers, we may not use it.  */
777
      if (old_num_regs != reg_rtx_no
778
          || ! validate_replace_rtx (src, dest, insn))
779
        {
780
          /* We have to restore reg_rtx_no to its old value, lest
781
             recompute_reg_usage will try to compute the usage of the
782
             new regs, yet reg_n_info is not valid for them.  */
783
          reg_rtx_no = old_num_regs;
784
          return;
785
        }
786
      emit_insn_before (seq, insn);
787
      move_insn = PREV_INSN (insn);
788
      p_move_notes = &REG_NOTES (move_insn);
789
      p_insn_notes = &REG_NOTES (insn);
790
 
791
      /* Move any notes mentioning src to the move instruction.  */
792
      for (link = REG_NOTES (insn); link != NULL_RTX; link = next)
793
        {
794
          next = XEXP (link, 1);
795
          if (XEXP (link, 0) == src)
796
            {
797
              *p_move_notes = link;
798
              p_move_notes = &XEXP (link, 1);
799
            }
800
          else
801
            {
802
              *p_insn_notes = link;
803
              p_insn_notes = &XEXP (link, 1);
804
            }
805
        }
806
 
807
      *p_move_notes = NULL_RTX;
808
      *p_insn_notes = NULL_RTX;
809
 
810
      /* Is the insn the head of a basic block?  If so extend it.  */
811
      insn_uid = INSN_UID (insn);
812
      move_uid = INSN_UID (move_insn);
813
      if (insn_uid < old_max_uid)
814
        {
815
          bb = regmove_bb_head[insn_uid];
816
          if (bb >= 0)
817
            {
818
              BB_HEAD (BASIC_BLOCK (bb)) = move_insn;
819
              regmove_bb_head[insn_uid] = -1;
820
            }
821
        }
822
 
823
      /* Update the various register tables.  */
824
      dest_regno = REGNO (dest);
825
      REG_N_SETS (dest_regno) ++;
826
      REG_LIVE_LENGTH (dest_regno)++;
827
      if (REGNO_FIRST_UID (dest_regno) == insn_uid)
828
        REGNO_FIRST_UID (dest_regno) = move_uid;
829
 
830
      src_regno = REGNO (src);
831
      if (! find_reg_note (move_insn, REG_DEAD, src))
832
        REG_LIVE_LENGTH (src_regno)++;
833
 
834
      if (REGNO_FIRST_UID (src_regno) == insn_uid)
835
        REGNO_FIRST_UID (src_regno) = move_uid;
836
 
837
      if (REGNO_LAST_UID (src_regno) == insn_uid)
838
        REGNO_LAST_UID (src_regno) = move_uid;
839
    }
840
}
841
 
842
 
843
/* Return whether REG is set in only one location, and is set to a
844
   constant, but is set in a different basic block from INSN (an
845
   instructions which uses REG).  In this case REG is equivalent to a
846
   constant, and we don't want to break that equivalence, because that
847
   may increase register pressure and make reload harder.  If REG is
848
   set in the same basic block as INSN, we don't worry about it,
849
   because we'll probably need a register anyhow (??? but what if REG
850
   is used in a different basic block as well as this one?).  FIRST is
851
   the first insn in the function.  */
852
 
853
static int
854
reg_is_remote_constant_p (rtx reg, rtx insn, rtx first)
855
{
856
  rtx p;
857
 
858
  if (REG_N_SETS (REGNO (reg)) != 1)
859
    return 0;
860
 
861
  /* Look for the set.  */
862
  for (p = BB_HEAD (BLOCK_FOR_INSN (insn)); p != insn; p = NEXT_INSN (p))
863
    {
864
      rtx s;
865
 
866
      if (!INSN_P (p))
867
        continue;
868
      s = single_set (p);
869
      if (s != 0
870
          && REG_P (SET_DEST (s))
871
          && REGNO (SET_DEST (s)) == REGNO (reg))
872
        {
873
          /* The register is set in the same basic block.  */
874
          return 0;
875
        }
876
    }
877
 
878
  for (p = first; p && p != insn; p = NEXT_INSN (p))
879
    {
880
      rtx s;
881
 
882
      if (! INSN_P (p))
883
        continue;
884
      s = single_set (p);
885
      if (s != 0
886
          && REG_P (SET_DEST (s))
887
          && REGNO (SET_DEST (s)) == REGNO (reg))
888
        {
889
          /* This is the instruction which sets REG.  If there is a
890
             REG_EQUAL note, then REG is equivalent to a constant.  */
891
          if (find_reg_note (p, REG_EQUAL, NULL_RTX))
892
            return 1;
893
          return 0;
894
        }
895
    }
896
 
897
  return 0;
898
}
899
 
900
/* INSN is adding a CONST_INT to a REG.  We search backwards looking for
901
   another add immediate instruction with the same source and dest registers,
902
   and if we find one, we change INSN to an increment, and return 1.  If
903
   no changes are made, we return 0.
904
 
905
   This changes
906
     (set (reg100) (plus reg1 offset1))
907
     ...
908
     (set (reg100) (plus reg1 offset2))
909
   to
910
     (set (reg100) (plus reg1 offset1))
911
     ...
912
     (set (reg100) (plus reg100 offset2-offset1))  */
913
 
914
/* ??? What does this comment mean?  */
915
/* cse disrupts preincrement / postdecrement sequences when it finds a
916
   hard register as ultimate source, like the frame pointer.  */
917
 
918
static int
919
fixup_match_2 (rtx insn, rtx dst, rtx src, rtx offset, FILE *regmove_dump_file)
920
{
921
  rtx p, dst_death = 0;
922
  int length, num_calls = 0;
923
 
924
  /* If SRC dies in INSN, we'd have to move the death note.  This is
925
     considered to be very unlikely, so we just skip the optimization
926
     in this case.  */
927
  if (find_regno_note (insn, REG_DEAD, REGNO (src)))
928
    return 0;
929
 
930
  /* Scan backward to find the first instruction that sets DST.  */
931
 
932
  for (length = 0, p = PREV_INSN (insn); p; p = PREV_INSN (p))
933
    {
934
      rtx pset;
935
 
936
      /* ??? We can't scan past the end of a basic block without updating
937
         the register lifetime info (REG_DEAD/basic_block_live_at_start).  */
938
      if (perhaps_ends_bb_p (p))
939
        break;
940
      else if (! INSN_P (p))
941
        continue;
942
 
943
      if (find_regno_note (p, REG_DEAD, REGNO (dst)))
944
        dst_death = p;
945
      if (! dst_death)
946
        length++;
947
 
948
      pset = single_set (p);
949
      if (pset && SET_DEST (pset) == dst
950
          && GET_CODE (SET_SRC (pset)) == PLUS
951
          && XEXP (SET_SRC (pset), 0) == src
952
          && GET_CODE (XEXP (SET_SRC (pset), 1)) == CONST_INT)
953
        {
954
          HOST_WIDE_INT newconst
955
            = INTVAL (offset) - INTVAL (XEXP (SET_SRC (pset), 1));
956
          rtx add = gen_add3_insn (dst, dst, GEN_INT (newconst));
957
 
958
          if (add && validate_change (insn, &PATTERN (insn), add, 0))
959
            {
960
              /* Remove the death note for DST from DST_DEATH.  */
961
              if (dst_death)
962
                {
963
                  remove_death (REGNO (dst), dst_death);
964
                  REG_LIVE_LENGTH (REGNO (dst)) += length;
965
                  REG_N_CALLS_CROSSED (REGNO (dst)) += num_calls;
966
                }
967
 
968
              if (regmove_dump_file)
969
                fprintf (regmove_dump_file,
970
                         "Fixed operand of insn %d.\n",
971
                          INSN_UID (insn));
972
 
973
#ifdef AUTO_INC_DEC
974
              for (p = PREV_INSN (insn); p; p = PREV_INSN (p))
975
                {
976
                  if (LABEL_P (p)
977
                      || JUMP_P (p))
978
                    break;
979
                  if (! INSN_P (p))
980
                    continue;
981
                  if (reg_overlap_mentioned_p (dst, PATTERN (p)))
982
                    {
983
                      if (try_auto_increment (p, insn, 0, dst, newconst, 0))
984
                        return 1;
985
                      break;
986
                    }
987
                }
988
              for (p = NEXT_INSN (insn); p; p = NEXT_INSN (p))
989
                {
990
                  if (LABEL_P (p)
991
                      || JUMP_P (p))
992
                    break;
993
                  if (! INSN_P (p))
994
                    continue;
995
                  if (reg_overlap_mentioned_p (dst, PATTERN (p)))
996
                    {
997
                      try_auto_increment (p, insn, 0, dst, newconst, 1);
998
                      break;
999
                    }
1000
                }
1001
#endif
1002
              return 1;
1003
            }
1004
        }
1005
 
1006
      if (reg_set_p (dst, PATTERN (p)))
1007
        break;
1008
 
1009
      /* If we have passed a call instruction, and the
1010
         pseudo-reg SRC is not already live across a call,
1011
         then don't perform the optimization.  */
1012
      /* reg_set_p is overly conservative for CALL_INSNS, thinks that all
1013
         hard regs are clobbered.  Thus, we only use it for src for
1014
         non-call insns.  */
1015
      if (CALL_P (p))
1016
        {
1017
          if (! dst_death)
1018
            num_calls++;
1019
 
1020
          if (REG_N_CALLS_CROSSED (REGNO (src)) == 0)
1021
            break;
1022
 
1023
          if (call_used_regs [REGNO (dst)]
1024
              || find_reg_fusage (p, CLOBBER, dst))
1025
            break;
1026
        }
1027
      else if (reg_set_p (src, PATTERN (p)))
1028
        break;
1029
    }
1030
 
1031
  return 0;
1032
}
1033
 
1034
/* Main entry for the register move optimization.
1035
   F is the first instruction.
1036
   NREGS is one plus the highest pseudo-reg number used in the instruction.
1037
   REGMOVE_DUMP_FILE is a stream for output of a trace of actions taken
1038
   (or 0 if none should be output).  */
1039
 
1040
void
1041
regmove_optimize (rtx f, int nregs, FILE *regmove_dump_file)
1042
{
1043
  int old_max_uid = get_max_uid ();
1044
  rtx insn;
1045
  struct match match;
1046
  int pass;
1047
  int i;
1048
  rtx copy_src, copy_dst;
1049
  basic_block bb;
1050
 
1051
  /* ??? Hack.  Regmove doesn't examine the CFG, and gets mightily
1052
     confused by non-call exceptions ending blocks.  */
1053
  if (flag_non_call_exceptions)
1054
    return;
1055
 
1056
  /* Find out where a potential flags register is live, and so that we
1057
     can suppress some optimizations in those zones.  */
1058
  mark_flags_life_zones (discover_flags_reg ());
1059
 
1060
  regno_src_regno = xmalloc (sizeof *regno_src_regno * nregs);
1061
  for (i = nregs; --i >= 0; ) regno_src_regno[i] = -1;
1062
 
1063
  regmove_bb_head = xmalloc (sizeof (int) * (old_max_uid + 1));
1064
  for (i = old_max_uid; i >= 0; i--) regmove_bb_head[i] = -1;
1065
  FOR_EACH_BB (bb)
1066
    regmove_bb_head[INSN_UID (BB_HEAD (bb))] = bb->index;
1067
 
1068
  /* A forward/backward pass.  Replace output operands with input operands.  */
1069
 
1070
  for (pass = 0; pass <= 2; pass++)
1071
    {
1072
      if (! flag_regmove && pass >= flag_expensive_optimizations)
1073
        goto done;
1074
 
1075
      if (regmove_dump_file)
1076
        fprintf (regmove_dump_file, "Starting %s pass...\n",
1077
                 pass ? "backward" : "forward");
1078
 
1079
      for (insn = pass ? get_last_insn () : f; insn;
1080
           insn = pass ? PREV_INSN (insn) : NEXT_INSN (insn))
1081
        {
1082
          rtx set;
1083
          int op_no, match_no;
1084
 
1085
          set = single_set (insn);
1086
          if (! set)
1087
            continue;
1088
 
1089
          if (flag_expensive_optimizations && ! pass
1090
              && (GET_CODE (SET_SRC (set)) == SIGN_EXTEND
1091
                  || GET_CODE (SET_SRC (set)) == ZERO_EXTEND)
1092
              && REG_P (XEXP (SET_SRC (set), 0))
1093
              && REG_P (SET_DEST (set)))
1094
            optimize_reg_copy_3 (insn, SET_DEST (set), SET_SRC (set));
1095
 
1096
          if (flag_expensive_optimizations && ! pass
1097
              && REG_P (SET_SRC (set))
1098
              && REG_P (SET_DEST (set)))
1099
            {
1100
              /* If this is a register-register copy where SRC is not dead,
1101
                 see if we can optimize it.  If this optimization succeeds,
1102
                 it will become a copy where SRC is dead.  */
1103
              if ((find_reg_note (insn, REG_DEAD, SET_SRC (set))
1104
                   || optimize_reg_copy_1 (insn, SET_DEST (set), SET_SRC (set)))
1105
                  && REGNO (SET_DEST (set)) >= FIRST_PSEUDO_REGISTER)
1106
                {
1107
                  /* Similarly for a pseudo-pseudo copy when SRC is dead.  */
1108
                  if (REGNO (SET_SRC (set)) >= FIRST_PSEUDO_REGISTER)
1109
                    optimize_reg_copy_2 (insn, SET_DEST (set), SET_SRC (set));
1110
                  if (regno_src_regno[REGNO (SET_DEST (set))] < 0
1111
                      && SET_SRC (set) != SET_DEST (set))
1112
                    {
1113
                      int srcregno = REGNO (SET_SRC (set));
1114
                      if (regno_src_regno[srcregno] >= 0)
1115
                        srcregno = regno_src_regno[srcregno];
1116
                      regno_src_regno[REGNO (SET_DEST (set))] = srcregno;
1117
                    }
1118
                }
1119
            }
1120
          if (! flag_regmove)
1121
            continue;
1122
 
1123
          if (! find_matches (insn, &match))
1124
            continue;
1125
 
1126
          /* Now scan through the operands looking for a source operand
1127
             which is supposed to match the destination operand.
1128
             Then scan forward for an instruction which uses the dest
1129
             operand.
1130
             If it dies there, then replace the dest in both operands with
1131
             the source operand.  */
1132
 
1133
          for (op_no = 0; op_no < recog_data.n_operands; op_no++)
1134
            {
1135
              rtx src, dst, src_subreg;
1136
              enum reg_class src_class, dst_class;
1137
 
1138
              match_no = match.with[op_no];
1139
 
1140
              /* Nothing to do if the two operands aren't supposed to match.  */
1141
              if (match_no < 0)
1142
                continue;
1143
 
1144
              src = recog_data.operand[op_no];
1145
              dst = recog_data.operand[match_no];
1146
 
1147
              if (!REG_P (src))
1148
                continue;
1149
 
1150
              src_subreg = src;
1151
              if (GET_CODE (dst) == SUBREG
1152
                  && GET_MODE_SIZE (GET_MODE (dst))
1153
                     >= GET_MODE_SIZE (GET_MODE (SUBREG_REG (dst))))
1154
                {
1155
                  dst = SUBREG_REG (dst);
1156
                  src_subreg = lowpart_subreg (GET_MODE (dst),
1157
                                               src, GET_MODE (src));
1158
                  if (!src_subreg)
1159
                    continue;
1160
                }
1161
              if (!REG_P (dst)
1162
                  || REGNO (dst) < FIRST_PSEUDO_REGISTER)
1163
                continue;
1164
 
1165
              if (REGNO (src) < FIRST_PSEUDO_REGISTER)
1166
                {
1167
                  if (match.commutative[op_no] < op_no)
1168
                    regno_src_regno[REGNO (dst)] = REGNO (src);
1169
                  continue;
1170
                }
1171
 
1172
              if (REG_LIVE_LENGTH (REGNO (src)) < 0)
1173
                continue;
1174
 
1175
              /* op_no/src must be a read-only operand, and
1176
                 match_operand/dst must be a write-only operand.  */
1177
              if (match.use[op_no] != READ
1178
                  || match.use[match_no] != WRITE)
1179
                continue;
1180
 
1181
              if (match.early_clobber[match_no]
1182
                  && count_occurrences (PATTERN (insn), src, 0) > 1)
1183
                continue;
1184
 
1185
              /* Make sure match_operand is the destination.  */
1186
              if (recog_data.operand[match_no] != SET_DEST (set))
1187
                continue;
1188
 
1189
              /* If the operands already match, then there is nothing to do.  */
1190
              if (operands_match_p (src, dst))
1191
                continue;
1192
 
1193
              /* But in the commutative case, we might find a better match.  */
1194
              if (match.commutative[op_no] >= 0)
1195
                {
1196
                  rtx comm = recog_data.operand[match.commutative[op_no]];
1197
                  if (operands_match_p (comm, dst)
1198
                      && (replacement_quality (comm)
1199
                          >= replacement_quality (src)))
1200
                    continue;
1201
                }
1202
 
1203
              src_class = reg_preferred_class (REGNO (src));
1204
              dst_class = reg_preferred_class (REGNO (dst));
1205
              if (! regclass_compatible_p (src_class, dst_class))
1206
                continue;
1207
 
1208
              if (GET_MODE (src) != GET_MODE (dst))
1209
                continue;
1210
 
1211
              if (fixup_match_1 (insn, set, src, src_subreg, dst, pass,
1212
                                 op_no, match_no,
1213
                                 regmove_dump_file))
1214
                break;
1215
            }
1216
        }
1217
    }
1218
 
1219
  /* A backward pass.  Replace input operands with output operands.  */
1220
 
1221
  if (regmove_dump_file)
1222
    fprintf (regmove_dump_file, "Starting backward pass...\n");
1223
 
1224
  for (insn = get_last_insn (); insn; insn = PREV_INSN (insn))
1225
    {
1226
      if (INSN_P (insn))
1227
        {
1228
          int op_no, match_no;
1229
          int success = 0;
1230
 
1231
          if (! find_matches (insn, &match))
1232
            continue;
1233
 
1234
          /* Now scan through the operands looking for a destination operand
1235
             which is supposed to match a source operand.
1236
             Then scan backward for an instruction which sets the source
1237
             operand.  If safe, then replace the source operand with the
1238
             dest operand in both instructions.  */
1239
 
1240
          copy_src = NULL_RTX;
1241
          copy_dst = NULL_RTX;
1242
          for (op_no = 0; op_no < recog_data.n_operands; op_no++)
1243
            {
1244
              rtx set, p, src, dst;
1245
              rtx src_note, dst_note;
1246
              int num_calls = 0;
1247
              enum reg_class src_class, dst_class;
1248
              int length;
1249
 
1250
              match_no = match.with[op_no];
1251
 
1252
              /* Nothing to do if the two operands aren't supposed to match.  */
1253
              if (match_no < 0)
1254
                continue;
1255
 
1256
              dst = recog_data.operand[match_no];
1257
              src = recog_data.operand[op_no];
1258
 
1259
              if (!REG_P (src))
1260
                continue;
1261
 
1262
              if (!REG_P (dst)
1263
                  || REGNO (dst) < FIRST_PSEUDO_REGISTER
1264
                  || REG_LIVE_LENGTH (REGNO (dst)) < 0
1265
                  || GET_MODE (src) != GET_MODE (dst))
1266
                continue;
1267
 
1268
              /* If the operands already match, then there is nothing to do.  */
1269
              if (operands_match_p (src, dst))
1270
                continue;
1271
 
1272
              if (match.commutative[op_no] >= 0)
1273
                {
1274
                  rtx comm = recog_data.operand[match.commutative[op_no]];
1275
                  if (operands_match_p (comm, dst))
1276
                    continue;
1277
                }
1278
 
1279
              set = single_set (insn);
1280
              if (! set)
1281
                continue;
1282
 
1283
              /* Note that single_set ignores parts of a parallel set for
1284
                 which one of the destinations is REG_UNUSED.  We can't
1285
                 handle that here, since we can wind up rewriting things
1286
                 such that a single register is set twice within a single
1287
                 parallel.  */
1288
              if (reg_set_p (src, insn))
1289
                continue;
1290
 
1291
              /* match_no/dst must be a write-only operand, and
1292
                 operand_operand/src must be a read-only operand.  */
1293
              if (match.use[op_no] != READ
1294
                  || match.use[match_no] != WRITE)
1295
                continue;
1296
 
1297
              if (match.early_clobber[match_no]
1298
                  && count_occurrences (PATTERN (insn), src, 0) > 1)
1299
                continue;
1300
 
1301
              /* Make sure match_no is the destination.  */
1302
              if (recog_data.operand[match_no] != SET_DEST (set))
1303
                continue;
1304
 
1305
              if (REGNO (src) < FIRST_PSEUDO_REGISTER)
1306
                {
1307
                  if (GET_CODE (SET_SRC (set)) == PLUS
1308
                      && GET_CODE (XEXP (SET_SRC (set), 1)) == CONST_INT
1309
                      && XEXP (SET_SRC (set), 0) == src
1310
                      && fixup_match_2 (insn, dst, src,
1311
                                        XEXP (SET_SRC (set), 1),
1312
                                        regmove_dump_file))
1313
                    break;
1314
                  continue;
1315
                }
1316
              src_class = reg_preferred_class (REGNO (src));
1317
              dst_class = reg_preferred_class (REGNO (dst));
1318
 
1319
              if (! (src_note = find_reg_note (insn, REG_DEAD, src)))
1320
                {
1321
                  /* We used to force the copy here like in other cases, but
1322
                     it produces worse code, as it eliminates no copy
1323
                     instructions and the copy emitted will be produced by
1324
                     reload anyway.  On patterns with multiple alternatives,
1325
                     there may be better solution available.
1326
 
1327
                     In particular this change produced slower code for numeric
1328
                     i387 programs.  */
1329
 
1330
                  continue;
1331
                }
1332
 
1333
              if (! regclass_compatible_p (src_class, dst_class))
1334
                {
1335
                  if (!copy_src)
1336
                    {
1337
                      copy_src = src;
1338
                      copy_dst = dst;
1339
                    }
1340
                  continue;
1341
                }
1342
 
1343
              /* Can not modify an earlier insn to set dst if this insn
1344
                 uses an old value in the source.  */
1345
              if (reg_overlap_mentioned_p (dst, SET_SRC (set)))
1346
                {
1347
                  if (!copy_src)
1348
                    {
1349
                      copy_src = src;
1350
                      copy_dst = dst;
1351
                    }
1352
                  continue;
1353
                }
1354
 
1355
              /* If src is set once in a different basic block,
1356
                 and is set equal to a constant, then do not use
1357
                 it for this optimization, as this would make it
1358
                 no longer equivalent to a constant.  */
1359
 
1360
              if (reg_is_remote_constant_p (src, insn, f))
1361
                {
1362
                  if (!copy_src)
1363
                    {
1364
                      copy_src = src;
1365
                      copy_dst = dst;
1366
                    }
1367
                  continue;
1368
                }
1369
 
1370
 
1371
              if (regmove_dump_file)
1372
                fprintf (regmove_dump_file,
1373
                         "Could fix operand %d of insn %d matching operand %d.\n",
1374
                         op_no, INSN_UID (insn), match_no);
1375
 
1376
              /* Scan backward to find the first instruction that uses
1377
                 the input operand.  If the operand is set here, then
1378
                 replace it in both instructions with match_no.  */
1379
 
1380
              for (length = 0, p = PREV_INSN (insn); p; p = PREV_INSN (p))
1381
                {
1382
                  rtx pset;
1383
 
1384
                  /* ??? We can't scan past the end of a basic block without
1385
                     updating the register lifetime info
1386
                     (REG_DEAD/basic_block_live_at_start).  */
1387
                  if (perhaps_ends_bb_p (p))
1388
                    break;
1389
                  else if (! INSN_P (p))
1390
                    continue;
1391
 
1392
                  length++;
1393
 
1394
                  /* ??? See if all of SRC is set in P.  This test is much
1395
                     more conservative than it needs to be.  */
1396
                  pset = single_set (p);
1397
                  if (pset && SET_DEST (pset) == src)
1398
                    {
1399
                      /* We use validate_replace_rtx, in case there
1400
                         are multiple identical source operands.  All of
1401
                         them have to be changed at the same time.  */
1402
                      if (validate_replace_rtx (src, dst, insn))
1403
                        {
1404
                          if (validate_change (p, &SET_DEST (pset),
1405
                                               dst, 0))
1406
                            success = 1;
1407
                          else
1408
                            {
1409
                              /* Change all source operands back.
1410
                                 This modifies the dst as a side-effect.  */
1411
                              validate_replace_rtx (dst, src, insn);
1412
                              /* Now make sure the dst is right.  */
1413
                              validate_change (insn,
1414
                                               recog_data.operand_loc[match_no],
1415
                                               dst, 0);
1416
                            }
1417
                        }
1418
                      break;
1419
                    }
1420
 
1421
                  if (reg_overlap_mentioned_p (src, PATTERN (p))
1422
                      || reg_overlap_mentioned_p (dst, PATTERN (p)))
1423
                    break;
1424
 
1425
                  /* If we have passed a call instruction, and the
1426
                     pseudo-reg DST is not already live across a call,
1427
                     then don't perform the optimization.  */
1428
                  if (CALL_P (p))
1429
                    {
1430
                      num_calls++;
1431
 
1432
                      if (REG_N_CALLS_CROSSED (REGNO (dst)) == 0)
1433
                        break;
1434
                    }
1435
                }
1436
 
1437
              if (success)
1438
                {
1439
                  int dstno, srcno;
1440
 
1441
                  /* Remove the death note for SRC from INSN.  */
1442
                  remove_note (insn, src_note);
1443
                  /* Move the death note for SRC to P if it is used
1444
                     there.  */
1445
                  if (reg_overlap_mentioned_p (src, PATTERN (p)))
1446
                    {
1447
                      XEXP (src_note, 1) = REG_NOTES (p);
1448
                      REG_NOTES (p) = src_note;
1449
                    }
1450
                  /* If there is a REG_DEAD note for DST on P, then remove
1451
                     it, because DST is now set there.  */
1452
                  if ((dst_note = find_reg_note (p, REG_DEAD, dst)))
1453
                    remove_note (p, dst_note);
1454
 
1455
                  dstno = REGNO (dst);
1456
                  srcno = REGNO (src);
1457
 
1458
                  REG_N_SETS (dstno)++;
1459
                  REG_N_SETS (srcno)--;
1460
 
1461
                  REG_N_CALLS_CROSSED (dstno) += num_calls;
1462
                  REG_N_CALLS_CROSSED (srcno) -= num_calls;
1463
 
1464
                  REG_LIVE_LENGTH (dstno) += length;
1465
                  if (REG_LIVE_LENGTH (srcno) >= 0)
1466
                    {
1467
                      REG_LIVE_LENGTH (srcno) -= length;
1468
                      /* REG_LIVE_LENGTH is only an approximation after
1469
                         combine if sched is not run, so make sure that we
1470
                         still have a reasonable value.  */
1471
                      if (REG_LIVE_LENGTH (srcno) < 2)
1472
                        REG_LIVE_LENGTH (srcno) = 2;
1473
                    }
1474
 
1475
                  if (regmove_dump_file)
1476
                    fprintf (regmove_dump_file,
1477
                             "Fixed operand %d of insn %d matching operand %d.\n",
1478
                             op_no, INSN_UID (insn), match_no);
1479
 
1480
                  break;
1481
                }
1482
            }
1483
 
1484
          /* If we weren't able to replace any of the alternatives, try an
1485
             alternative approach of copying the source to the destination.  */
1486
          if (!success && copy_src != NULL_RTX)
1487
            copy_src_to_dest (insn, copy_src, copy_dst, old_max_uid);
1488
 
1489
        }
1490
    }
1491
 
1492
  /* In fixup_match_1, some insns may have been inserted after basic block
1493
     ends.  Fix that here.  */
1494
  FOR_EACH_BB (bb)
1495
    {
1496
      rtx end = BB_END (bb);
1497
      rtx new = end;
1498
      rtx next = NEXT_INSN (new);
1499
      while (next != 0 && INSN_UID (next) >= old_max_uid
1500
             && (bb->next_bb == EXIT_BLOCK_PTR || BB_HEAD (bb->next_bb) != next))
1501
        new = next, next = NEXT_INSN (new);
1502
      BB_END (bb) = new;
1503
    }
1504
 
1505
 done:
1506
  /* Clean up.  */
1507
  free (regno_src_regno);
1508
  free (regmove_bb_head);
1509
}
1510
 
1511
/* Returns nonzero if INSN's pattern has matching constraints for any operand.
1512
   Returns 0 if INSN can't be recognized, or if the alternative can't be
1513
   determined.
1514
 
1515
   Initialize the info in MATCHP based on the constraints.  */
1516
 
1517
static int
1518
find_matches (rtx insn, struct match *matchp)
1519
{
1520
  int likely_spilled[MAX_RECOG_OPERANDS];
1521
  int op_no;
1522
  int any_matches = 0;
1523
 
1524
  extract_insn (insn);
1525
  if (! constrain_operands (0))
1526
    return 0;
1527
 
1528
  /* Must initialize this before main loop, because the code for
1529
     the commutative case may set matches for operands other than
1530
     the current one.  */
1531
  for (op_no = recog_data.n_operands; --op_no >= 0; )
1532
    matchp->with[op_no] = matchp->commutative[op_no] = -1;
1533
 
1534
  for (op_no = 0; op_no < recog_data.n_operands; op_no++)
1535
    {
1536
      const char *p;
1537
      char c;
1538
      int i = 0;
1539
 
1540
      p = recog_data.constraints[op_no];
1541
 
1542
      likely_spilled[op_no] = 0;
1543
      matchp->use[op_no] = READ;
1544
      matchp->early_clobber[op_no] = 0;
1545
      if (*p == '=')
1546
        matchp->use[op_no] = WRITE;
1547
      else if (*p == '+')
1548
        matchp->use[op_no] = READWRITE;
1549
 
1550
      for (;*p && i < which_alternative; p++)
1551
        if (*p == ',')
1552
          i++;
1553
 
1554
      while ((c = *p) != '\0' && c != ',')
1555
        {
1556
          switch (c)
1557
            {
1558
            case '=':
1559
              break;
1560
            case '+':
1561
              break;
1562
            case '&':
1563
              matchp->early_clobber[op_no] = 1;
1564
              break;
1565
            case '%':
1566
              matchp->commutative[op_no] = op_no + 1;
1567
              matchp->commutative[op_no + 1] = op_no;
1568
              break;
1569
 
1570
            case '0': case '1': case '2': case '3': case '4':
1571
            case '5': case '6': case '7': case '8': case '9':
1572
              {
1573
                char *end;
1574
                unsigned long match_ul = strtoul (p, &end, 10);
1575
                int match = match_ul;
1576
 
1577
                p = end;
1578
 
1579
                if (match < op_no && likely_spilled[match])
1580
                  continue;
1581
                matchp->with[op_no] = match;
1582
                any_matches = 1;
1583
                if (matchp->commutative[op_no] >= 0)
1584
                  matchp->with[matchp->commutative[op_no]] = match;
1585
              }
1586
            continue;
1587
 
1588
          case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'h':
1589
          case 'j': case 'k': case 'l': case 'p': case 'q': case 't': case 'u':
1590
          case 'v': case 'w': case 'x': case 'y': case 'z': case 'A': case 'B':
1591
          case 'C': case 'D': case 'W': case 'Y': case 'Z':
1592
            if (CLASS_LIKELY_SPILLED_P (REG_CLASS_FROM_CONSTRAINT ((unsigned char) c, p) ))
1593
              likely_spilled[op_no] = 1;
1594
            break;
1595
          }
1596
          p += CONSTRAINT_LEN (c, p);
1597
        }
1598
    }
1599
  return any_matches;
1600
}
1601
 
1602
/* Try to replace all occurrences of DST_REG with SRC in LOC, that is
1603
   assumed to be in INSN.  */
1604
 
1605
static void
1606
replace_in_call_usage (rtx *loc, unsigned int dst_reg, rtx src, rtx insn)
1607
{
1608
  rtx x = *loc;
1609
  enum rtx_code code;
1610
  const char *fmt;
1611
  int i, j;
1612
 
1613
  if (! x)
1614
    return;
1615
 
1616
  code = GET_CODE (x);
1617
  if (code == REG)
1618
    {
1619
      if (REGNO (x) != dst_reg)
1620
        return;
1621
 
1622
      validate_change (insn, loc, src, 1);
1623
 
1624
      return;
1625
    }
1626
 
1627
  /* Process each of our operands recursively.  */
1628
  fmt = GET_RTX_FORMAT (code);
1629
  for (i = 0; i < GET_RTX_LENGTH (code); i++, fmt++)
1630
    if (*fmt == 'e')
1631
      replace_in_call_usage (&XEXP (x, i), dst_reg, src, insn);
1632
    else if (*fmt == 'E')
1633
      for (j = 0; j < XVECLEN (x, i); j++)
1634
        replace_in_call_usage (& XVECEXP (x, i, j), dst_reg, src, insn);
1635
}
1636
 
1637
/* Try to replace output operand DST in SET, with input operand SRC.  SET is
1638
   the only set in INSN.  INSN has just been recognized and constrained.
1639
   SRC is operand number OPERAND_NUMBER in INSN.
1640
   DST is operand number MATCH_NUMBER in INSN.
1641
   If BACKWARD is nonzero, we have been called in a backward pass.
1642
   Return nonzero for success.  */
1643
 
1644
static int
1645
fixup_match_1 (rtx insn, rtx set, rtx src, rtx src_subreg, rtx dst,
1646
               int backward, int operand_number, int match_number,
1647
               FILE *regmove_dump_file)
1648
{
1649
  rtx p;
1650
  rtx post_inc = 0, post_inc_set = 0, search_end = 0;
1651
  int success = 0;
1652
  int num_calls = 0, s_num_calls = 0;
1653
  enum rtx_code code = NOTE;
1654
  HOST_WIDE_INT insn_const = 0, newconst = 0;
1655
  rtx overlap = 0; /* need to move insn ? */
1656
  rtx src_note = find_reg_note (insn, REG_DEAD, src), dst_note = NULL_RTX;
1657
  int length, s_length;
1658
 
1659
  if (! src_note)
1660
    {
1661
      /* Look for (set (regX) (op regA constX))
1662
                  (set (regY) (op regA constY))
1663
         and change that to
1664
                  (set (regA) (op regA constX)).
1665
                  (set (regY) (op regA constY-constX)).
1666
         This works for add and shift operations, if
1667
         regA is dead after or set by the second insn.  */
1668
 
1669
      code = GET_CODE (SET_SRC (set));
1670
      if ((code == PLUS || code == LSHIFTRT
1671
           || code == ASHIFT || code == ASHIFTRT)
1672
          && XEXP (SET_SRC (set), 0) == src
1673
          && GET_CODE (XEXP (SET_SRC (set), 1)) == CONST_INT)
1674
        insn_const = INTVAL (XEXP (SET_SRC (set), 1));
1675
      else if (! stable_and_no_regs_but_for_p (SET_SRC (set), src, dst))
1676
        return 0;
1677
      else
1678
        /* We might find a src_note while scanning.  */
1679
        code = NOTE;
1680
    }
1681
 
1682
  if (regmove_dump_file)
1683
    fprintf (regmove_dump_file,
1684
             "Could fix operand %d of insn %d matching operand %d.\n",
1685
             operand_number, INSN_UID (insn), match_number);
1686
 
1687
  /* If SRC is equivalent to a constant set in a different basic block,
1688
     then do not use it for this optimization.  We want the equivalence
1689
     so that if we have to reload this register, we can reload the
1690
     constant, rather than extending the lifespan of the register.  */
1691
  if (reg_is_remote_constant_p (src, insn, get_insns ()))
1692
    return 0;
1693
 
1694
  /* Scan forward to find the next instruction that
1695
     uses the output operand.  If the operand dies here,
1696
     then replace it in both instructions with
1697
     operand_number.  */
1698
 
1699
  for (length = s_length = 0, p = NEXT_INSN (insn); p; p = NEXT_INSN (p))
1700
    {
1701
      if (CALL_P (p))
1702
        replace_in_call_usage (& CALL_INSN_FUNCTION_USAGE (p),
1703
                               REGNO (dst), src, p);
1704
 
1705
      /* ??? We can't scan past the end of a basic block without updating
1706
         the register lifetime info (REG_DEAD/basic_block_live_at_start).  */
1707
      if (perhaps_ends_bb_p (p))
1708
        break;
1709
      else if (! INSN_P (p))
1710
        continue;
1711
 
1712
      length++;
1713
      if (src_note)
1714
        s_length++;
1715
 
1716
      if (reg_set_p (src, p) || reg_set_p (dst, p)
1717
          || (GET_CODE (PATTERN (p)) == USE
1718
              && reg_overlap_mentioned_p (src, XEXP (PATTERN (p), 0))))
1719
        break;
1720
 
1721
      /* See if all of DST dies in P.  This test is
1722
         slightly more conservative than it needs to be.  */
1723
      if ((dst_note = find_regno_note (p, REG_DEAD, REGNO (dst)))
1724
          && (GET_MODE (XEXP (dst_note, 0)) == GET_MODE (dst)))
1725
        {
1726
          /* If we would be moving INSN, check that we won't move it
1727
             into the shadow of a live a live flags register.  */
1728
          /* ??? We only try to move it in front of P, although
1729
                 we could move it anywhere between OVERLAP and P.  */
1730
          if (overlap && GET_MODE (PREV_INSN (p)) != VOIDmode)
1731
            break;
1732
 
1733
          if (! src_note)
1734
            {
1735
              rtx q;
1736
              rtx set2 = NULL_RTX;
1737
 
1738
              /* If an optimization is done, the value of SRC while P
1739
                 is executed will be changed.  Check that this is OK.  */
1740
              if (reg_overlap_mentioned_p (src, PATTERN (p)))
1741
                break;
1742
              for (q = p; q; q = NEXT_INSN (q))
1743
                {
1744
                  /* ??? We can't scan past the end of a basic block without
1745
                     updating the register lifetime info
1746
                     (REG_DEAD/basic_block_live_at_start).  */
1747
                  if (perhaps_ends_bb_p (q))
1748
                    {
1749
                      q = 0;
1750
                      break;
1751
                    }
1752
                  else if (! INSN_P (q))
1753
                    continue;
1754
                  else if (reg_overlap_mentioned_p (src, PATTERN (q))
1755
                           || reg_set_p (src, q))
1756
                    break;
1757
                }
1758
              if (q)
1759
                set2 = single_set (q);
1760
              if (! q || ! set2 || GET_CODE (SET_SRC (set2)) != code
1761
                  || XEXP (SET_SRC (set2), 0) != src
1762
                  || GET_CODE (XEXP (SET_SRC (set2), 1)) != CONST_INT
1763
                  || (SET_DEST (set2) != src
1764
                      && ! find_reg_note (q, REG_DEAD, src)))
1765
                {
1766
                  /* If this is a PLUS, we can still save a register by doing
1767
                     src += insn_const;
1768
                     P;
1769
                     src -= insn_const; .
1770
                     This also gives opportunities for subsequent
1771
                     optimizations in the backward pass, so do it there.  */
1772
                  if (code == PLUS && backward
1773
                      /* Don't do this if we can likely tie DST to SET_DEST
1774
                         of P later; we can't do this tying here if we got a
1775
                         hard register.  */
1776
                      && ! (dst_note && ! REG_N_CALLS_CROSSED (REGNO (dst))
1777
                            && single_set (p)
1778
                            && REG_P (SET_DEST (single_set (p)))
1779
                            && (REGNO (SET_DEST (single_set (p)))
1780
                                < FIRST_PSEUDO_REGISTER))
1781
                      /* We may only emit an insn directly after P if we
1782
                         are not in the shadow of a live flags register.  */
1783
                      && GET_MODE (p) == VOIDmode)
1784
                    {
1785
                      search_end = q;
1786
                      q = insn;
1787
                      set2 = set;
1788
                      newconst = -insn_const;
1789
                      code = MINUS;
1790
                    }
1791
                  else
1792
                    break;
1793
                }
1794
              else
1795
                {
1796
                  newconst = INTVAL (XEXP (SET_SRC (set2), 1)) - insn_const;
1797
                  /* Reject out of range shifts.  */
1798
                  if (code != PLUS
1799
                      && (newconst < 0
1800
                          || ((unsigned HOST_WIDE_INT) newconst
1801
                              >= (GET_MODE_BITSIZE (GET_MODE
1802
                                                    (SET_SRC (set2)))))))
1803
                    break;
1804
                  if (code == PLUS)
1805
                    {
1806
                      post_inc = q;
1807
                      if (SET_DEST (set2) != src)
1808
                        post_inc_set = set2;
1809
                    }
1810
                }
1811
              /* We use 1 as last argument to validate_change so that all
1812
                 changes are accepted or rejected together by apply_change_group
1813
                 when it is called by validate_replace_rtx .  */
1814
              validate_change (q, &XEXP (SET_SRC (set2), 1),
1815
                               GEN_INT (newconst), 1);
1816
            }
1817
          validate_change (insn, recog_data.operand_loc[match_number], src, 1);
1818
          if (validate_replace_rtx (dst, src_subreg, p))
1819
            success = 1;
1820
          break;
1821
        }
1822
 
1823
      if (reg_overlap_mentioned_p (dst, PATTERN (p)))
1824
        break;
1825
      if (! src_note && reg_overlap_mentioned_p (src, PATTERN (p)))
1826
        {
1827
          /* INSN was already checked to be movable wrt. the registers that it
1828
             sets / uses when we found no REG_DEAD note for src on it, but it
1829
             still might clobber the flags register.  We'll have to check that
1830
             we won't insert it into the shadow of a live flags register when
1831
             we finally know where we are to move it.  */
1832
          overlap = p;
1833
          src_note = find_reg_note (p, REG_DEAD, src);
1834
        }
1835
 
1836
      /* If we have passed a call instruction, and the pseudo-reg SRC is not
1837
         already live across a call, then don't perform the optimization.  */
1838
      if (CALL_P (p))
1839
        {
1840
          if (REG_N_CALLS_CROSSED (REGNO (src)) == 0)
1841
            break;
1842
 
1843
          num_calls++;
1844
 
1845
          if (src_note)
1846
            s_num_calls++;
1847
 
1848
        }
1849
    }
1850
 
1851
  if (! success)
1852
    return 0;
1853
 
1854
  /* Remove the death note for DST from P.  */
1855
  remove_note (p, dst_note);
1856
  if (code == MINUS)
1857
    {
1858
      post_inc = emit_insn_after (copy_rtx (PATTERN (insn)), p);
1859
      if ((HAVE_PRE_INCREMENT || HAVE_PRE_DECREMENT)
1860
          && search_end
1861
          && try_auto_increment (search_end, post_inc, 0, src, newconst, 1))
1862
        post_inc = 0;
1863
      validate_change (insn, &XEXP (SET_SRC (set), 1), GEN_INT (insn_const), 0);
1864
      REG_N_SETS (REGNO (src))++;
1865
      REG_LIVE_LENGTH (REGNO (src))++;
1866
    }
1867
  if (overlap)
1868
    {
1869
      /* The lifetime of src and dest overlap,
1870
         but we can change this by moving insn.  */
1871
      rtx pat = PATTERN (insn);
1872
      if (src_note)
1873
        remove_note (overlap, src_note);
1874
      if ((HAVE_POST_INCREMENT || HAVE_POST_DECREMENT)
1875
          && code == PLUS
1876
          && try_auto_increment (overlap, insn, 0, src, insn_const, 0))
1877
        insn = overlap;
1878
      else
1879
        {
1880
          rtx notes = REG_NOTES (insn);
1881
 
1882
          emit_insn_after_with_line_notes (pat, PREV_INSN (p), insn);
1883
          delete_insn (insn);
1884
          /* emit_insn_after_with_line_notes has no
1885
             return value, so search for the new insn.  */
1886
          insn = p;
1887
          while (! INSN_P (insn) || PATTERN (insn) != pat)
1888
            insn = PREV_INSN (insn);
1889
 
1890
          REG_NOTES (insn) = notes;
1891
        }
1892
    }
1893
  /* Sometimes we'd generate src = const; src += n;
1894
     if so, replace the instruction that set src
1895
     in the first place.  */
1896
 
1897
  if (! overlap && (code == PLUS || code == MINUS))
1898
    {
1899
      rtx note = find_reg_note (insn, REG_EQUAL, NULL_RTX);
1900
      rtx q, set2 = NULL_RTX;
1901
      int num_calls2 = 0, s_length2 = 0;
1902
 
1903
      if (note && CONSTANT_P (XEXP (note, 0)))
1904
        {
1905
          for (q = PREV_INSN (insn); q; q = PREV_INSN (q))
1906
            {
1907
              /* ??? We can't scan past the end of a basic block without
1908
                 updating the register lifetime info
1909
                 (REG_DEAD/basic_block_live_at_start).  */
1910
              if (perhaps_ends_bb_p (q))
1911
                {
1912
                  q = 0;
1913
                  break;
1914
                }
1915
              else if (! INSN_P (q))
1916
                continue;
1917
 
1918
              s_length2++;
1919
              if (reg_set_p (src, q))
1920
                {
1921
                  set2 = single_set (q);
1922
                  break;
1923
                }
1924
              if (reg_overlap_mentioned_p (src, PATTERN (q)))
1925
                {
1926
                  q = 0;
1927
                  break;
1928
                }
1929
              if (CALL_P (p))
1930
                num_calls2++;
1931
            }
1932
          if (q && set2 && SET_DEST (set2) == src && CONSTANT_P (SET_SRC (set2))
1933
              && validate_change (insn, &SET_SRC (set), XEXP (note, 0), 0))
1934
            {
1935
              delete_insn (q);
1936
              REG_N_SETS (REGNO (src))--;
1937
              REG_N_CALLS_CROSSED (REGNO (src)) -= num_calls2;
1938
              REG_LIVE_LENGTH (REGNO (src)) -= s_length2;
1939
              insn_const = 0;
1940
            }
1941
        }
1942
    }
1943
 
1944
  if ((HAVE_PRE_INCREMENT || HAVE_PRE_DECREMENT)
1945
           && (code == PLUS || code == MINUS) && insn_const
1946
           && try_auto_increment (p, insn, 0, src, insn_const, 1))
1947
    insn = p;
1948
  else if ((HAVE_POST_INCREMENT || HAVE_POST_DECREMENT)
1949
           && post_inc
1950
           && try_auto_increment (p, post_inc, post_inc_set, src, newconst, 0))
1951
    post_inc = 0;
1952
  /* If post_inc still prevails, try to find an
1953
     insn where it can be used as a pre-in/decrement.
1954
     If code is MINUS, this was already tried.  */
1955
  if (post_inc && code == PLUS
1956
  /* Check that newconst is likely to be usable
1957
     in a pre-in/decrement before starting the search.  */
1958
      && ((HAVE_PRE_INCREMENT && newconst > 0 && newconst <= MOVE_MAX)
1959
          || (HAVE_PRE_DECREMENT && newconst < 0 && newconst >= -MOVE_MAX))
1960
      && exact_log2 (newconst))
1961
    {
1962
      rtx q, inc_dest;
1963
 
1964
      inc_dest = post_inc_set ? SET_DEST (post_inc_set) : src;
1965
      for (q = post_inc; (q = NEXT_INSN (q)); )
1966
        {
1967
          /* ??? We can't scan past the end of a basic block without updating
1968
             the register lifetime info
1969
             (REG_DEAD/basic_block_live_at_start).  */
1970
          if (perhaps_ends_bb_p (q))
1971
            break;
1972
          else if (! INSN_P (q))
1973
            continue;
1974
          else if (src != inc_dest
1975
                   && (reg_overlap_mentioned_p (src, PATTERN (q))
1976
                       || reg_set_p (src, q)))
1977
            break;
1978
          else if (reg_set_p (inc_dest, q))
1979
            break;
1980
          else if (reg_overlap_mentioned_p (inc_dest, PATTERN (q)))
1981
            {
1982
              try_auto_increment (q, post_inc,
1983
                                  post_inc_set, inc_dest, newconst, 1);
1984
              break;
1985
            }
1986
        }
1987
    }
1988
 
1989
  /* Move the death note for DST to INSN if it is used
1990
     there.  */
1991
  if (reg_overlap_mentioned_p (dst, PATTERN (insn)))
1992
    {
1993
      XEXP (dst_note, 1) = REG_NOTES (insn);
1994
      REG_NOTES (insn) = dst_note;
1995
    }
1996
 
1997
  if (src_note)
1998
    {
1999
      /* Move the death note for SRC from INSN to P.  */
2000
      if (! overlap)
2001
        remove_note (insn, src_note);
2002
      XEXP (src_note, 1) = REG_NOTES (p);
2003
      REG_NOTES (p) = src_note;
2004
 
2005
      REG_N_CALLS_CROSSED (REGNO (src)) += s_num_calls;
2006
    }
2007
 
2008
  REG_N_SETS (REGNO (src))++;
2009
  REG_N_SETS (REGNO (dst))--;
2010
 
2011
  REG_N_CALLS_CROSSED (REGNO (dst)) -= num_calls;
2012
 
2013
  REG_LIVE_LENGTH (REGNO (src)) += s_length;
2014
  if (REG_LIVE_LENGTH (REGNO (dst)) >= 0)
2015
    {
2016
      REG_LIVE_LENGTH (REGNO (dst)) -= length;
2017
      /* REG_LIVE_LENGTH is only an approximation after
2018
         combine if sched is not run, so make sure that we
2019
         still have a reasonable value.  */
2020
      if (REG_LIVE_LENGTH (REGNO (dst)) < 2)
2021
        REG_LIVE_LENGTH (REGNO (dst)) = 2;
2022
    }
2023
  if (regmove_dump_file)
2024
    fprintf (regmove_dump_file,
2025
             "Fixed operand %d of insn %d matching operand %d.\n",
2026
             operand_number, INSN_UID (insn), match_number);
2027
  return 1;
2028
}
2029
 
2030
 
2031
/* Return nonzero if X is stable and mentions no registers but for
2032
   mentioning SRC or mentioning / changing DST .  If in doubt, presume
2033
   it is unstable.
2034
   The rationale is that we want to check if we can move an insn easily
2035
   while just paying attention to SRC and DST.  */
2036
static int
2037
stable_and_no_regs_but_for_p (rtx x, rtx src, rtx dst)
2038
{
2039
  RTX_CODE code = GET_CODE (x);
2040
  switch (GET_RTX_CLASS (code))
2041
    {
2042
    case RTX_UNARY:
2043
    case RTX_BIN_ARITH:
2044
    case RTX_COMM_ARITH:
2045
    case RTX_COMPARE:
2046
    case RTX_COMM_COMPARE:
2047
    case RTX_TERNARY:
2048
    case RTX_BITFIELD_OPS:
2049
      {
2050
        int i;
2051
        const char *fmt = GET_RTX_FORMAT (code);
2052
        for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
2053
          if (fmt[i] == 'e'
2054
              && ! stable_and_no_regs_but_for_p (XEXP (x, i), src, dst))
2055
              return 0;
2056
        return 1;
2057
      }
2058
    case RTX_OBJ:
2059
      if (code == REG)
2060
        return x == src || x == dst;
2061
      /* If this is a MEM, look inside - there might be a register hidden in
2062
         the address of an unchanging MEM.  */
2063
      if (code == MEM
2064
          && ! stable_and_no_regs_but_for_p (XEXP (x, 0), src, dst))
2065
        return 0;
2066
      /* Fall through.  */
2067
    default:
2068
      return ! rtx_unstable_p (x);
2069
    }
2070
}
2071
 
2072
/* Track stack adjustments and stack memory references.  Attempt to
2073
   reduce the number of stack adjustments by back-propagating across
2074
   the memory references.
2075
 
2076
   This is intended primarily for use with targets that do not define
2077
   ACCUMULATE_OUTGOING_ARGS.  It is of significantly more value to
2078
   targets that define PREFERRED_STACK_BOUNDARY more aligned than
2079
   STACK_BOUNDARY (e.g. x86), or if not all registers can be pushed
2080
   (e.g. x86 fp regs) which would ordinarily have to be implemented
2081
   as a sub/mov pair due to restrictions in calls.c.
2082
 
2083
   Propagation stops when any of the insns that need adjusting are
2084
   (a) no longer valid because we've exceeded their range, (b) a
2085
   non-trivial push instruction, or (c) a call instruction.
2086
 
2087
   Restriction B is based on the assumption that push instructions
2088
   are smaller or faster.  If a port really wants to remove all
2089
   pushes, it should have defined ACCUMULATE_OUTGOING_ARGS.  The
2090
   one exception that is made is for an add immediately followed
2091
   by a push.  */
2092
 
2093
/* This structure records stack memory references between stack adjusting
2094
   instructions.  */
2095
 
2096
struct csa_memlist
2097
{
2098
  HOST_WIDE_INT sp_offset;
2099
  rtx insn, *mem;
2100
  struct csa_memlist *next;
2101
};
2102
 
2103
static int stack_memref_p (rtx);
2104
static rtx single_set_for_csa (rtx);
2105
static void free_csa_memlist (struct csa_memlist *);
2106
static struct csa_memlist *record_one_stack_memref (rtx, rtx *,
2107
                                                    struct csa_memlist *);
2108
static int try_apply_stack_adjustment (rtx, struct csa_memlist *,
2109
                                       HOST_WIDE_INT, HOST_WIDE_INT);
2110
static void combine_stack_adjustments_for_block (basic_block);
2111
static int record_stack_memrefs (rtx *, void *);
2112
 
2113
 
2114
/* Main entry point for stack adjustment combination.  */
2115
 
2116
void
2117
combine_stack_adjustments (void)
2118
{
2119
  basic_block bb;
2120
 
2121
  FOR_EACH_BB (bb)
2122
    combine_stack_adjustments_for_block (bb);
2123
}
2124
 
2125
/* Recognize a MEM of the form (sp) or (plus sp const).  */
2126
 
2127
static int
2128
stack_memref_p (rtx x)
2129
{
2130
  if (!MEM_P (x))
2131
    return 0;
2132
  x = XEXP (x, 0);
2133
 
2134
  if (x == stack_pointer_rtx)
2135
    return 1;
2136
  if (GET_CODE (x) == PLUS
2137
      && XEXP (x, 0) == stack_pointer_rtx
2138
      && GET_CODE (XEXP (x, 1)) == CONST_INT)
2139
    return 1;
2140
 
2141
  return 0;
2142
}
2143
 
2144
/* Recognize either normal single_set or the hack in i386.md for
2145
   tying fp and sp adjustments.  */
2146
 
2147
static rtx
2148
single_set_for_csa (rtx insn)
2149
{
2150
  int i;
2151
  rtx tmp = single_set (insn);
2152
  if (tmp)
2153
    return tmp;
2154
 
2155
  if (!NONJUMP_INSN_P (insn)
2156
      || GET_CODE (PATTERN (insn)) != PARALLEL)
2157
    return NULL_RTX;
2158
 
2159
  tmp = PATTERN (insn);
2160
  if (GET_CODE (XVECEXP (tmp, 0, 0)) != SET)
2161
    return NULL_RTX;
2162
 
2163
  for (i = 1; i < XVECLEN (tmp, 0); ++i)
2164
    {
2165
      rtx this = XVECEXP (tmp, 0, i);
2166
 
2167
      /* The special case is allowing a no-op set.  */
2168
      if (GET_CODE (this) == SET
2169
          && SET_SRC (this) == SET_DEST (this))
2170
        ;
2171
      else if (GET_CODE (this) != CLOBBER
2172
               && GET_CODE (this) != USE)
2173
        return NULL_RTX;
2174
    }
2175
 
2176
  return XVECEXP (tmp, 0, 0);
2177
}
2178
 
2179
/* Free the list of csa_memlist nodes.  */
2180
 
2181
static void
2182
free_csa_memlist (struct csa_memlist *memlist)
2183
{
2184
  struct csa_memlist *next;
2185
  for (; memlist ; memlist = next)
2186
    {
2187
      next = memlist->next;
2188
      free (memlist);
2189
    }
2190
}
2191
 
2192
/* Create a new csa_memlist node from the given memory reference.
2193
   It is already known that the memory is stack_memref_p.  */
2194
 
2195
static struct csa_memlist *
2196
record_one_stack_memref (rtx insn, rtx *mem, struct csa_memlist *next_memlist)
2197
{
2198
  struct csa_memlist *ml;
2199
 
2200
  ml = xmalloc (sizeof (*ml));
2201
 
2202
  if (XEXP (*mem, 0) == stack_pointer_rtx)
2203
    ml->sp_offset = 0;
2204
  else
2205
    ml->sp_offset = INTVAL (XEXP (XEXP (*mem, 0), 1));
2206
 
2207
  ml->insn = insn;
2208
  ml->mem = mem;
2209
  ml->next = next_memlist;
2210
 
2211
  return ml;
2212
}
2213
 
2214
/* Attempt to apply ADJUST to the stack adjusting insn INSN, as well
2215
   as each of the memories in MEMLIST.  Return true on success.  */
2216
 
2217
static int
2218
try_apply_stack_adjustment (rtx insn, struct csa_memlist *memlist, HOST_WIDE_INT new_adjust,
2219
                            HOST_WIDE_INT delta)
2220
{
2221
  struct csa_memlist *ml;
2222
  rtx set;
2223
 
2224
  set = single_set_for_csa (insn);
2225
  validate_change (insn, &XEXP (SET_SRC (set), 1), GEN_INT (new_adjust), 1);
2226
 
2227
  for (ml = memlist; ml ; ml = ml->next)
2228
    validate_change
2229
      (ml->insn, ml->mem,
2230
       replace_equiv_address_nv (*ml->mem,
2231
                                 plus_constant (stack_pointer_rtx,
2232
                                                ml->sp_offset - delta)), 1);
2233
 
2234
  if (apply_change_group ())
2235
    {
2236
      /* Succeeded.  Update our knowledge of the memory references.  */
2237
      for (ml = memlist; ml ; ml = ml->next)
2238
        ml->sp_offset -= delta;
2239
 
2240
      return 1;
2241
    }
2242
  else
2243
    return 0;
2244
}
2245
 
2246
/* Called via for_each_rtx and used to record all stack memory references in
2247
   the insn and discard all other stack pointer references.  */
2248
struct record_stack_memrefs_data
2249
{
2250
  rtx insn;
2251
  struct csa_memlist *memlist;
2252
};
2253
 
2254
static int
2255
record_stack_memrefs (rtx *xp, void *data)
2256
{
2257
  rtx x = *xp;
2258
  struct record_stack_memrefs_data *d =
2259
    (struct record_stack_memrefs_data *) data;
2260
  if (!x)
2261
    return 0;
2262
  switch (GET_CODE (x))
2263
    {
2264
    case MEM:
2265
      if (!reg_mentioned_p (stack_pointer_rtx, x))
2266
        return -1;
2267
      /* We are not able to handle correctly all possible memrefs containing
2268
         stack pointer, so this check is necessary.  */
2269
      if (stack_memref_p (x))
2270
        {
2271
          d->memlist = record_one_stack_memref (d->insn, xp, d->memlist);
2272
          return -1;
2273
        }
2274
      return 1;
2275
    case REG:
2276
      /* ??? We want be able to handle non-memory stack pointer
2277
         references later.  For now just discard all insns referring to
2278
         stack pointer outside mem expressions.  We would probably
2279
         want to teach validate_replace to simplify expressions first.
2280
 
2281
         We can't just compare with STACK_POINTER_RTX because the
2282
         reference to the stack pointer might be in some other mode.
2283
         In particular, an explicit clobber in an asm statement will
2284
         result in a QImode clobber.  */
2285
      if (REGNO (x) == STACK_POINTER_REGNUM)
2286
        return 1;
2287
      break;
2288
    default:
2289
      break;
2290
    }
2291
  return 0;
2292
}
2293
 
2294
/* Subroutine of combine_stack_adjustments, called for each basic block.  */
2295
 
2296
static void
2297
combine_stack_adjustments_for_block (basic_block bb)
2298
{
2299
  HOST_WIDE_INT last_sp_adjust = 0;
2300
  rtx last_sp_set = NULL_RTX;
2301
  struct csa_memlist *memlist = NULL;
2302
  rtx insn, next, set;
2303
  struct record_stack_memrefs_data data;
2304
  bool end_of_block = false;
2305
 
2306
  for (insn = BB_HEAD (bb); !end_of_block ; insn = next)
2307
    {
2308
      end_of_block = insn == BB_END (bb);
2309
      next = NEXT_INSN (insn);
2310
 
2311
      if (! INSN_P (insn))
2312
        continue;
2313
 
2314
      set = single_set_for_csa (insn);
2315
      if (set)
2316
        {
2317
          rtx dest = SET_DEST (set);
2318
          rtx src = SET_SRC (set);
2319
 
2320
          /* Find constant additions to the stack pointer.  */
2321
          if (dest == stack_pointer_rtx
2322
              && GET_CODE (src) == PLUS
2323
              && XEXP (src, 0) == stack_pointer_rtx
2324
              && GET_CODE (XEXP (src, 1)) == CONST_INT)
2325
            {
2326
              HOST_WIDE_INT this_adjust = INTVAL (XEXP (src, 1));
2327
 
2328
              /* If we've not seen an adjustment previously, record
2329
                 it now and continue.  */
2330
              if (! last_sp_set)
2331
                {
2332
                  last_sp_set = insn;
2333
                  last_sp_adjust = this_adjust;
2334
                  continue;
2335
                }
2336
 
2337
              /* If not all recorded memrefs can be adjusted, or the
2338
                 adjustment is now too large for a constant addition,
2339
                 we cannot merge the two stack adjustments.
2340
 
2341
                 Also we need to be careful to not move stack pointer
2342
                 such that we create stack accesses outside the allocated
2343
                 area.  We can combine an allocation into the first insn,
2344
                 or a deallocation into the second insn.  We can not
2345
                 combine an allocation followed by a deallocation.
2346
 
2347
                 The only somewhat frequent occurrence of the later is when
2348
                 a function allocates a stack frame but does not use it.
2349
                 For this case, we would need to analyze rtl stream to be
2350
                 sure that allocated area is really unused.  This means not
2351
                 only checking the memory references, but also all registers
2352
                 or global memory references possibly containing a stack
2353
                 frame address.
2354
 
2355
                 Perhaps the best way to address this problem is to teach
2356
                 gcc not to allocate stack for objects never used.  */
2357
 
2358
              /* Combine an allocation into the first instruction.  */
2359
              if (STACK_GROWS_DOWNWARD ? this_adjust <= 0 : this_adjust >= 0)
2360
                {
2361
                  if (try_apply_stack_adjustment (last_sp_set, memlist,
2362
                                                  last_sp_adjust + this_adjust,
2363
                                                  this_adjust))
2364
                    {
2365
                      /* It worked!  */
2366
                      delete_insn (insn);
2367
                      last_sp_adjust += this_adjust;
2368
                      continue;
2369
                    }
2370
                }
2371
 
2372
              /* Otherwise we have a deallocation.  Do not combine with
2373
                 a previous allocation.  Combine into the second insn.  */
2374
              else if (STACK_GROWS_DOWNWARD
2375
                       ? last_sp_adjust >= 0 : last_sp_adjust <= 0)
2376
                {
2377
                  if (try_apply_stack_adjustment (insn, memlist,
2378
                                                  last_sp_adjust + this_adjust,
2379
                                                  -last_sp_adjust))
2380
                    {
2381
                      /* It worked!  */
2382
                      delete_insn (last_sp_set);
2383
                      last_sp_set = insn;
2384
                      last_sp_adjust += this_adjust;
2385
                      free_csa_memlist (memlist);
2386
                      memlist = NULL;
2387
                      continue;
2388
                    }
2389
                }
2390
 
2391
              /* Combination failed.  Restart processing from here.  If
2392
                 deallocation+allocation conspired to cancel, we can
2393
                 delete the old deallocation insn.  */
2394
              if (last_sp_set && last_sp_adjust == 0)
2395
                delete_insn (insn);
2396
              free_csa_memlist (memlist);
2397
              memlist = NULL;
2398
              last_sp_set = insn;
2399
              last_sp_adjust = this_adjust;
2400
              continue;
2401
            }
2402
 
2403
          /* Find a predecrement of exactly the previous adjustment and
2404
             turn it into a direct store.  Obviously we can't do this if
2405
             there were any intervening uses of the stack pointer.  */
2406
          if (memlist == NULL
2407
              && MEM_P (dest)
2408
              && ((GET_CODE (XEXP (dest, 0)) == PRE_DEC
2409
                   && (last_sp_adjust
2410
                       == (HOST_WIDE_INT) GET_MODE_SIZE (GET_MODE (dest))))
2411
                  || (GET_CODE (XEXP (dest, 0)) == PRE_MODIFY
2412
                      && GET_CODE (XEXP (XEXP (dest, 0), 1)) == PLUS
2413
                      && XEXP (XEXP (XEXP (dest, 0), 1), 0) == stack_pointer_rtx
2414
                      && (GET_CODE (XEXP (XEXP (XEXP (dest, 0), 1), 1))
2415
                          == CONST_INT)
2416
                      && (INTVAL (XEXP (XEXP (XEXP (dest, 0), 1), 1))
2417
                          == -last_sp_adjust)))
2418
              && XEXP (XEXP (dest, 0), 0) == stack_pointer_rtx
2419
              && ! reg_mentioned_p (stack_pointer_rtx, src)
2420
              && memory_address_p (GET_MODE (dest), stack_pointer_rtx)
2421
              && validate_change (insn, &SET_DEST (set),
2422
                                  replace_equiv_address (dest,
2423
                                                         stack_pointer_rtx),
2424
                                  0))
2425
            {
2426
              delete_insn (last_sp_set);
2427
              free_csa_memlist (memlist);
2428
              memlist = NULL;
2429
              last_sp_set = NULL_RTX;
2430
              last_sp_adjust = 0;
2431
              continue;
2432
            }
2433
        }
2434
 
2435
      data.insn = insn;
2436
      data.memlist = memlist;
2437
      if (!CALL_P (insn) && last_sp_set
2438
          && !for_each_rtx (&PATTERN (insn), record_stack_memrefs, &data))
2439
        {
2440
           memlist = data.memlist;
2441
           continue;
2442
        }
2443
      memlist = data.memlist;
2444
 
2445
      /* Otherwise, we were not able to process the instruction.
2446
         Do not continue collecting data across such a one.  */
2447
      if (last_sp_set
2448
          && (CALL_P (insn)
2449
              || reg_mentioned_p (stack_pointer_rtx, PATTERN (insn))))
2450
        {
2451
          if (last_sp_set && last_sp_adjust == 0)
2452
            delete_insn (last_sp_set);
2453
          free_csa_memlist (memlist);
2454
          memlist = NULL;
2455
          last_sp_set = NULL_RTX;
2456
          last_sp_adjust = 0;
2457
        }
2458
    }
2459
 
2460
  if (last_sp_set && last_sp_adjust == 0)
2461
    delete_insn (last_sp_set);
2462
 
2463
  if (memlist)
2464
    free_csa_memlist (memlist);
2465
}
2466
 
2467
static bool
2468
gate_handle_regmove (void)
2469
{
2470
  return (optimize > 0 && flag_regmove);
2471
}
2472
 
2473
 
2474
/* Register allocation pre-pass, to reduce number of moves necessary
2475
   for two-address machines.  */
2476
static void
2477
rest_of_handle_regmove (void)
2478
{
2479
  regmove_optimize (get_insns (), max_reg_num (), dump_file);
2480
  cleanup_cfg (CLEANUP_EXPENSIVE | CLEANUP_UPDATE_LIFE);
2481
}
2482
 
2483
struct tree_opt_pass pass_regmove =
2484
{
2485
  "regmove",                            /* name */
2486
  gate_handle_regmove,                  /* gate */
2487
  rest_of_handle_regmove,               /* execute */
2488
  NULL,                                 /* sub */
2489
  NULL,                                 /* next */
2490
  0,                                    /* static_pass_number */
2491
  TV_REGMOVE,                           /* tv_id */
2492
  0,                                    /* properties_required */
2493
  0,                                    /* properties_provided */
2494
  0,                                    /* properties_destroyed */
2495
  0,                                    /* todo_flags_start */
2496
  TODO_dump_func |
2497
  TODO_ggc_collect,                     /* todo_flags_finish */
2498
  'N'                                   /* letter */
2499
};
2500
 
2501
 
2502
static bool
2503
gate_handle_stack_adjustments (void)
2504
{
2505
  return (optimize > 0);
2506
}
2507
 
2508
static void
2509
rest_of_handle_stack_adjustments (void)
2510
{
2511
  life_analysis (dump_file, PROP_POSTRELOAD);
2512
  cleanup_cfg (CLEANUP_EXPENSIVE | CLEANUP_UPDATE_LIFE
2513
               | (flag_crossjumping ? CLEANUP_CROSSJUMP : 0));
2514
 
2515
  /* This is kind of a heuristic.  We need to run combine_stack_adjustments
2516
     even for machines with possibly nonzero RETURN_POPS_ARGS
2517
     and ACCUMULATE_OUTGOING_ARGS.  We expect that only ports having
2518
     push instructions will have popping returns.  */
2519
#ifndef PUSH_ROUNDING
2520
  if (!ACCUMULATE_OUTGOING_ARGS)
2521
#endif
2522
    combine_stack_adjustments ();
2523
}
2524
 
2525
struct tree_opt_pass pass_stack_adjustments =
2526
{
2527
  "csa",                                /* name */
2528
  gate_handle_stack_adjustments,        /* gate */
2529
  rest_of_handle_stack_adjustments,     /* execute */
2530
  NULL,                                 /* sub */
2531
  NULL,                                 /* next */
2532
  0,                                    /* static_pass_number */
2533
  0,                                    /* tv_id */
2534
  0,                                    /* properties_required */
2535
  0,                                    /* properties_provided */
2536
  0,                                    /* properties_destroyed */
2537
  0,                                    /* todo_flags_start */
2538
  TODO_dump_func |
2539
  TODO_ggc_collect,                     /* todo_flags_finish */
2540
 
2541
};
2542
 

powered by: WebSVN 2.1.0

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