OSDN Git Service

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