OSDN Git Service

Daily bump.
[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 *, unsigned 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       /* If there's a REG_EQUIV note, this must be an insn that loads an
707          argument.  Prefer keeping the note over doing this optimization.  */
708       || find_reg_note (p, REG_EQUIV, NULL_RTX)
709       || SET_DEST (set) != src_reg)
710     return;
711
712   /* Be conserative: although this optimization is also valid for
713      volatile memory references, that could cause trouble in later passes.  */
714   if (MEM_VOLATILE_P (SET_SRC (set)))
715     return;
716
717   /* Do not use a SUBREG to truncate from one mode to another if truncation
718      is not a nop.  */
719   if (GET_MODE_BITSIZE (GET_MODE (src_reg)) <= GET_MODE_BITSIZE (GET_MODE (src))
720       && !TRULY_NOOP_TRUNCATION (GET_MODE_BITSIZE (GET_MODE (src)),
721                                  GET_MODE_BITSIZE (GET_MODE (src_reg))))
722     return;
723
724   old_mode = GET_MODE (src_reg);
725   PUT_MODE (src_reg, GET_MODE (src));
726   XEXP (src, 0) = SET_SRC (set);
727
728   /* Include this change in the group so that it's easily undone if
729      one of the changes in the group is invalid.  */
730   validate_change (p, &SET_SRC (set), src, 1);
731
732   /* Now walk forward making additional replacements.  We want to be able
733      to undo all the changes if a later substitution fails.  */
734   subreg = gen_lowpart_SUBREG (old_mode, src_reg);
735   while (p = NEXT_INSN (p), p != insn)
736     {
737       if (! INSN_P (p))
738         continue;
739
740       /* Make a tenative change.  */
741       validate_replace_rtx_group (src_reg, subreg, p);
742     }
743
744   validate_replace_rtx_group (src, src_reg, insn);
745
746   /* Now see if all the changes are valid.  */
747   if (! apply_change_group ())
748     {
749       /* One or more changes were no good.  Back out everything.  */
750       PUT_MODE (src_reg, old_mode);
751       XEXP (src, 0) = src_reg;
752     }
753   else
754     {
755       rtx note = find_reg_note (p, REG_EQUAL, NULL_RTX);
756       if (note)
757         remove_note (p, note);
758     }
759 }
760
761 \f
762 /* If we were not able to update the users of src to use dest directly, try
763    instead moving the value to dest directly before the operation.  */
764
765 static void
766 copy_src_to_dest (insn, src, dest, old_max_uid)
767      rtx insn;
768      rtx src;
769      rtx dest;
770      int old_max_uid;
771 {
772   rtx seq;
773   rtx link;
774   rtx next;
775   rtx set;
776   rtx move_insn;
777   rtx *p_insn_notes;
778   rtx *p_move_notes;
779   int src_regno;
780   int dest_regno;
781   int bb;
782   int insn_uid;
783   int move_uid;
784
785   /* A REG_LIVE_LENGTH of -1 indicates the register is equivalent to a constant
786      or memory location and is used infrequently; a REG_LIVE_LENGTH of -2 is
787      parameter when there is no frame pointer that is not allocated a register.
788      For now, we just reject them, rather than incrementing the live length.  */
789
790   if (GET_CODE (src) == REG
791       && REG_LIVE_LENGTH (REGNO (src)) > 0
792       && GET_CODE (dest) == REG
793       && !RTX_UNCHANGING_P (dest)
794       && REG_LIVE_LENGTH (REGNO (dest)) > 0
795       && (set = single_set (insn)) != NULL_RTX
796       && !reg_mentioned_p (dest, SET_SRC (set))
797       && GET_MODE (src) == GET_MODE (dest))
798     {
799       int old_num_regs = reg_rtx_no;
800
801       /* Generate the src->dest move.  */
802       start_sequence ();
803       emit_move_insn (dest, src);
804       seq = gen_sequence ();
805       end_sequence ();
806       /* If this sequence uses new registers, we may not use it.  */
807       if (old_num_regs != reg_rtx_no
808           || ! validate_replace_rtx (src, dest, insn))
809         {
810           /* We have to restore reg_rtx_no to its old value, lest
811              recompute_reg_usage will try to compute the usage of the
812              new regs, yet reg_n_info is not valid for them.  */
813           reg_rtx_no = old_num_regs;
814           return;
815         }
816       emit_insn_before (seq, insn);
817       move_insn = PREV_INSN (insn);
818       p_move_notes = &REG_NOTES (move_insn);
819       p_insn_notes = &REG_NOTES (insn);
820
821       /* Move any notes mentioning src to the move instruction */
822       for (link = REG_NOTES (insn); link != NULL_RTX; link = next)
823         {
824           next = XEXP (link, 1);
825           if (XEXP (link, 0) == src)
826             {
827               *p_move_notes = link;
828               p_move_notes = &XEXP (link, 1);
829             }
830           else
831             {
832               *p_insn_notes = link;
833               p_insn_notes = &XEXP (link, 1);
834             }
835         }
836
837       *p_move_notes = NULL_RTX;
838       *p_insn_notes = NULL_RTX;
839
840       /* Is the insn the head of a basic block?  If so extend it */
841       insn_uid = INSN_UID (insn);
842       move_uid = INSN_UID (move_insn);
843       if (insn_uid < old_max_uid)
844         {
845           bb = regmove_bb_head[insn_uid];
846           if (bb >= 0)
847             {
848               BLOCK_HEAD (bb) = move_insn;
849               regmove_bb_head[insn_uid] = -1;
850             }
851         }
852
853       /* Update the various register tables.  */
854       dest_regno = REGNO (dest);
855       REG_N_SETS (dest_regno) ++;
856       REG_LIVE_LENGTH (dest_regno)++;
857       if (REGNO_FIRST_UID (dest_regno) == insn_uid)
858         REGNO_FIRST_UID (dest_regno) = move_uid;
859
860       src_regno = REGNO (src);
861       if (! find_reg_note (move_insn, REG_DEAD, src))
862         REG_LIVE_LENGTH (src_regno)++;
863
864       if (REGNO_FIRST_UID (src_regno) == insn_uid)
865         REGNO_FIRST_UID (src_regno) = move_uid;
866
867       if (REGNO_LAST_UID (src_regno) == insn_uid)
868         REGNO_LAST_UID (src_regno) = move_uid;
869
870       if (REGNO_LAST_NOTE_UID (src_regno) == insn_uid)
871         REGNO_LAST_NOTE_UID (src_regno) = move_uid;
872     }
873 }
874
875 \f
876 /* Return whether REG is set in only one location, and is set to a
877    constant, but is set in a different basic block from INSN (an
878    instructions which uses REG).  In this case REG is equivalent to a
879    constant, and we don't want to break that equivalence, because that
880    may increase register pressure and make reload harder.  If REG is
881    set in the same basic block as INSN, we don't worry about it,
882    because we'll probably need a register anyhow (??? but what if REG
883    is used in a different basic block as well as this one?).  FIRST is
884    the first insn in the function.  */
885
886 static int
887 reg_is_remote_constant_p (reg, insn, first)
888      rtx reg;
889      rtx insn;
890      rtx first;
891 {
892   register rtx p;
893
894   if (REG_N_SETS (REGNO (reg)) != 1)
895     return 0;
896
897   /* Look for the set.  */
898   for (p = LOG_LINKS (insn); p; p = XEXP (p, 1))
899     {
900       rtx s;
901
902       if (REG_NOTE_KIND (p) != 0)
903         continue;
904       s = single_set (XEXP (p, 0));
905       if (s != 0
906           && GET_CODE (SET_DEST (s)) == REG
907           && REGNO (SET_DEST (s)) == REGNO (reg))
908         {
909           /* The register is set in the same basic block.  */
910           return 0;
911         }
912     }
913
914   for (p = first; p && p != insn; p = NEXT_INSN (p))
915     {
916       rtx s;
917
918       if (! INSN_P (p))
919         continue;
920       s = single_set (p);
921       if (s != 0
922           && GET_CODE (SET_DEST (s)) == REG
923           && REGNO (SET_DEST (s)) == REGNO (reg))
924         {
925           /* This is the instruction which sets REG.  If there is a
926              REG_EQUAL note, then REG is equivalent to a constant.  */
927           if (find_reg_note (p, REG_EQUAL, NULL_RTX))
928             return 1;
929           return 0;
930         }
931     }
932
933   return 0;
934 }
935
936 /* INSN is adding a CONST_INT to a REG.  We search backwards looking for
937    another add immediate instruction with the same source and dest registers,
938    and if we find one, we change INSN to an increment, and return 1.  If
939    no changes are made, we return 0.
940
941    This changes
942      (set (reg100) (plus reg1 offset1))
943      ...
944      (set (reg100) (plus reg1 offset2))
945    to
946      (set (reg100) (plus reg1 offset1))
947      ...
948      (set (reg100) (plus reg100 offset2-offset1))  */
949
950 /* ??? What does this comment mean?  */
951 /* cse disrupts preincrement / postdecrement squences when it finds a
952    hard register as ultimate source, like the frame pointer.  */
953
954 static int
955 fixup_match_2 (insn, dst, src, offset, regmove_dump_file)
956      rtx insn, dst, src, offset;
957      FILE *regmove_dump_file;
958 {
959   rtx p, dst_death = 0;
960   int length, num_calls = 0;
961
962   /* If SRC dies in INSN, we'd have to move the death note.  This is
963      considered to be very unlikely, so we just skip the optimization
964      in this case.  */
965   if (find_regno_note (insn, REG_DEAD, REGNO (src)))
966     return 0;
967
968   /* Scan backward to find the first instruction that sets DST.  */
969
970   for (length = 0, p = PREV_INSN (insn); p; p = PREV_INSN (p))
971     {
972       rtx pset;
973
974       /* ??? We can't scan past the end of a basic block without updating
975          the register lifetime info (REG_DEAD/basic_block_live_at_start).  */
976       if (perhaps_ends_bb_p (p))
977         break;
978       else if (! INSN_P (p))
979         continue;
980
981       if (find_regno_note (p, REG_DEAD, REGNO (dst)))
982         dst_death = p;
983       if (! dst_death)
984         length++;
985
986       pset = single_set (p);
987       if (pset && SET_DEST (pset) == dst
988           && GET_CODE (SET_SRC (pset)) == PLUS
989           && XEXP (SET_SRC (pset), 0) == src
990           && GET_CODE (XEXP (SET_SRC (pset), 1)) == CONST_INT)
991         {
992           HOST_WIDE_INT newconst
993             = INTVAL (offset) - INTVAL (XEXP (SET_SRC (pset), 1));
994           rtx add = gen_add3_insn (dst, dst, GEN_INT (newconst));
995
996           if (add && validate_change (insn, &PATTERN (insn), add, 0))
997             {
998               /* Remove the death note for DST from DST_DEATH.  */
999               if (dst_death)
1000                 {
1001                   remove_death (REGNO (dst), dst_death);
1002                   REG_LIVE_LENGTH (REGNO (dst)) += length;
1003                   REG_N_CALLS_CROSSED (REGNO (dst)) += num_calls;
1004                 }
1005
1006               if (regmove_dump_file)
1007                 fprintf (regmove_dump_file,
1008                          "Fixed operand of insn %d.\n",
1009                           INSN_UID (insn));
1010
1011 #ifdef AUTO_INC_DEC
1012               for (p = PREV_INSN (insn); p; p = PREV_INSN (p))
1013                 {
1014                   if (GET_CODE (p) == CODE_LABEL
1015                       || GET_CODE (p) == JUMP_INSN)
1016                     break;
1017                   if (! INSN_P (p))
1018                     continue;
1019                   if (reg_overlap_mentioned_p (dst, PATTERN (p)))
1020                     {
1021                       if (try_auto_increment (p, insn, 0, dst, newconst, 0))
1022                         return 1;
1023                       break;
1024                     }
1025                 }
1026               for (p = NEXT_INSN (insn); p; p = NEXT_INSN (p))
1027                 {
1028                   if (GET_CODE (p) == CODE_LABEL
1029                       || GET_CODE (p) == JUMP_INSN)
1030                     break;
1031                   if (! INSN_P (p))
1032                     continue;
1033                   if (reg_overlap_mentioned_p (dst, PATTERN (p)))
1034                     {
1035                       try_auto_increment (p, insn, 0, dst, newconst, 1);
1036                       break;
1037                     }
1038                 }
1039 #endif
1040               return 1;
1041             }
1042         }
1043
1044       if (reg_set_p (dst, PATTERN (p)))
1045         break;
1046
1047       /* If we have passed a call instruction, and the
1048          pseudo-reg SRC is not already live across a call,
1049          then don't perform the optimization.  */
1050       /* reg_set_p is overly conservative for CALL_INSNS, thinks that all
1051          hard regs are clobbered.  Thus, we only use it for src for
1052          non-call insns.  */
1053       if (GET_CODE (p) == CALL_INSN)
1054         {
1055           if (! dst_death)
1056             num_calls++;
1057
1058           if (REG_N_CALLS_CROSSED (REGNO (src)) == 0)
1059             break;
1060
1061           if (call_used_regs [REGNO (dst)]
1062               || find_reg_fusage (p, CLOBBER, dst))
1063             break;
1064         }
1065       else if (reg_set_p (src, PATTERN (p)))
1066         break;
1067     }
1068
1069   return 0;
1070 }
1071
1072 /* Main entry for the register move optimization.
1073    F is the first instruction.
1074    NREGS is one plus the highest pseudo-reg number used in the instruction.
1075    REGMOVE_DUMP_FILE is a stream for output of a trace of actions taken
1076    (or 0 if none should be output).  */
1077
1078 void
1079 regmove_optimize (f, nregs, regmove_dump_file)
1080      rtx f;
1081      int nregs;
1082      FILE *regmove_dump_file;
1083 {
1084   int old_max_uid = get_max_uid ();
1085   rtx insn;
1086   struct match match;
1087   int pass;
1088   int i;
1089   rtx copy_src, copy_dst;
1090
1091   /* ??? Hack.  Regmove doesn't examine the CFG, and gets mightily
1092      confused by non-call exceptions ending blocks.  */
1093   if (flag_non_call_exceptions)
1094     return;
1095
1096   /* Find out where a potential flags register is live, and so that we
1097      can supress some optimizations in those zones.  */
1098   mark_flags_life_zones (discover_flags_reg ());
1099
1100   regno_src_regno = (int *) xmalloc (sizeof *regno_src_regno * nregs);
1101   for (i = nregs; --i >= 0; ) regno_src_regno[i] = -1;
1102
1103   regmove_bb_head = (int *) xmalloc (sizeof (int) * (old_max_uid + 1));
1104   for (i = old_max_uid; i >= 0; i--) regmove_bb_head[i] = -1;
1105   for (i = 0; i < n_basic_blocks; i++)
1106     regmove_bb_head[INSN_UID (BLOCK_HEAD (i))] = i;
1107
1108   /* A forward/backward pass.  Replace output operands with input operands.  */
1109
1110   for (pass = 0; pass <= 2; pass++)
1111     {
1112       if (! flag_regmove && pass >= flag_expensive_optimizations)
1113         goto done;
1114
1115       if (regmove_dump_file)
1116         fprintf (regmove_dump_file, "Starting %s pass...\n",
1117                  pass ? "backward" : "forward");
1118
1119       for (insn = pass ? get_last_insn () : f; insn;
1120            insn = pass ? PREV_INSN (insn) : NEXT_INSN (insn))
1121         {
1122           rtx set;
1123           int op_no, match_no;
1124
1125           set = single_set (insn);
1126           if (! set)
1127             continue;
1128
1129           if (flag_expensive_optimizations && ! pass
1130               && (GET_CODE (SET_SRC (set)) == SIGN_EXTEND
1131                   || GET_CODE (SET_SRC (set)) == ZERO_EXTEND)
1132               && GET_CODE (XEXP (SET_SRC (set), 0)) == REG
1133               && GET_CODE (SET_DEST(set)) == REG)
1134             optimize_reg_copy_3 (insn, SET_DEST (set), SET_SRC (set));
1135
1136           if (flag_expensive_optimizations && ! pass
1137               && GET_CODE (SET_SRC (set)) == REG
1138               && GET_CODE (SET_DEST(set)) == REG)
1139             {
1140               /* If this is a register-register copy where SRC is not dead,
1141                  see if we can optimize it.  If this optimization succeeds,
1142                  it will become a copy where SRC is dead.  */
1143               if ((find_reg_note (insn, REG_DEAD, SET_SRC (set))
1144                    || optimize_reg_copy_1 (insn, SET_DEST (set), SET_SRC (set)))
1145                   && REGNO (SET_DEST (set)) >= FIRST_PSEUDO_REGISTER)
1146                 {
1147                   /* Similarly for a pseudo-pseudo copy when SRC is dead.  */
1148                   if (REGNO (SET_SRC (set)) >= FIRST_PSEUDO_REGISTER)
1149                     optimize_reg_copy_2 (insn, SET_DEST (set), SET_SRC (set));
1150                   if (regno_src_regno[REGNO (SET_DEST (set))] < 0
1151                       && SET_SRC (set) != SET_DEST (set))
1152                     {
1153                       int srcregno = REGNO (SET_SRC(set));
1154                       if (regno_src_regno[srcregno] >= 0)
1155                         srcregno = regno_src_regno[srcregno];
1156                       regno_src_regno[REGNO (SET_DEST (set))] = srcregno;
1157                     }
1158                 }
1159             }
1160           if (! flag_regmove)
1161             continue;
1162
1163           if (! find_matches (insn, &match))
1164             continue;
1165
1166           /* Now scan through the operands looking for a source operand
1167              which is supposed to match the destination operand.
1168              Then scan forward for an instruction which uses the dest
1169              operand.
1170              If it dies there, then replace the dest in both operands with
1171              the source operand.  */
1172
1173           for (op_no = 0; op_no < recog_data.n_operands; op_no++)
1174             {
1175               rtx src, dst, src_subreg;
1176               enum reg_class src_class, dst_class;
1177
1178               match_no = match.with[op_no];
1179
1180               /* Nothing to do if the two operands aren't supposed to match.  */
1181               if (match_no < 0)
1182                 continue;
1183
1184               src = recog_data.operand[op_no];
1185               dst = recog_data.operand[match_no];
1186
1187               if (GET_CODE (src) != REG)
1188                 continue;
1189
1190               src_subreg = src;
1191               if (GET_CODE (dst) == SUBREG
1192                   && GET_MODE_SIZE (GET_MODE (dst))
1193                      >= GET_MODE_SIZE (GET_MODE (SUBREG_REG (dst))))
1194                 {
1195                   src_subreg
1196                     = gen_rtx_SUBREG (GET_MODE (SUBREG_REG (dst)),
1197                                       src, SUBREG_BYTE (dst));
1198                   dst = SUBREG_REG (dst);
1199                 }
1200               if (GET_CODE (dst) != REG
1201                   || REGNO (dst) < FIRST_PSEUDO_REGISTER)
1202                 continue;
1203
1204               if (REGNO (src) < FIRST_PSEUDO_REGISTER)
1205                 {
1206                   if (match.commutative[op_no] < op_no)
1207                     regno_src_regno[REGNO (dst)] = REGNO (src);
1208                   continue;
1209                 }
1210
1211               if (REG_LIVE_LENGTH (REGNO (src)) < 0)
1212                 continue;
1213
1214               /* op_no/src must be a read-only operand, and
1215                  match_operand/dst must be a write-only operand.  */
1216               if (match.use[op_no] != READ
1217                   || match.use[match_no] != WRITE)
1218                 continue;
1219
1220               if (match.early_clobber[match_no]
1221                   && count_occurrences (PATTERN (insn), src, 0) > 1)
1222                 continue;
1223
1224               /* Make sure match_operand is the destination.  */
1225               if (recog_data.operand[match_no] != SET_DEST (set))
1226                 continue;
1227
1228               /* If the operands already match, then there is nothing to do. */
1229               if (operands_match_p (src, dst))
1230                 continue;
1231
1232               /* But in the commutative case, we might find a better match.  */
1233               if (match.commutative[op_no] >= 0)
1234                 {
1235                   rtx comm = recog_data.operand[match.commutative[op_no]];
1236                   if (operands_match_p (comm, dst)
1237                       && (replacement_quality (comm)
1238                           >= replacement_quality (src)))
1239                     continue;
1240                 }
1241
1242               src_class = reg_preferred_class (REGNO (src));
1243               dst_class = reg_preferred_class (REGNO (dst));
1244               if (! regclass_compatible_p (src_class, dst_class))
1245                 continue;
1246
1247               if (GET_MODE (src) != GET_MODE (dst))
1248                 continue;
1249
1250               if (fixup_match_1 (insn, set, src, src_subreg, dst, pass,
1251                                  op_no, match_no,
1252                                  regmove_dump_file))
1253                 break;
1254             }
1255         }
1256     }
1257
1258   /* A backward pass.  Replace input operands with output operands.  */
1259
1260   if (regmove_dump_file)
1261     fprintf (regmove_dump_file, "Starting backward pass...\n");
1262
1263   for (insn = get_last_insn (); insn; insn = PREV_INSN (insn))
1264     {
1265       if (INSN_P (insn))
1266         {
1267           int op_no, match_no;
1268           int success = 0;
1269
1270           if (! find_matches (insn, &match))
1271             continue;
1272
1273           /* Now scan through the operands looking for a destination operand
1274              which is supposed to match a source operand.
1275              Then scan backward for an instruction which sets the source
1276              operand.  If safe, then replace the source operand with the
1277              dest operand in both instructions.  */
1278
1279           copy_src = NULL_RTX;
1280           copy_dst = NULL_RTX;
1281           for (op_no = 0; op_no < recog_data.n_operands; op_no++)
1282             {
1283               rtx set, p, src, dst;
1284               rtx src_note, dst_note;
1285               int num_calls = 0;
1286               enum reg_class src_class, dst_class;
1287               int length;
1288
1289               match_no = match.with[op_no];
1290
1291               /* Nothing to do if the two operands aren't supposed to match.  */
1292               if (match_no < 0)
1293                 continue;
1294
1295               dst = recog_data.operand[match_no];
1296               src = recog_data.operand[op_no];
1297
1298               if (GET_CODE (src) != REG)
1299                 continue;
1300
1301               if (GET_CODE (dst) != REG
1302                   || REGNO (dst) < FIRST_PSEUDO_REGISTER
1303                   || REG_LIVE_LENGTH (REGNO (dst)) < 0
1304                   || RTX_UNCHANGING_P (dst))
1305                 continue;
1306
1307               /* If the operands already match, then there is nothing to do. */
1308               if (operands_match_p (src, dst))
1309                 continue;
1310
1311               if (match.commutative[op_no] >= 0)
1312                 {
1313                   rtx comm = recog_data.operand[match.commutative[op_no]];
1314                   if (operands_match_p (comm, dst))
1315                     continue;
1316                 }
1317
1318               set = single_set (insn);
1319               if (! set)
1320                 continue;
1321
1322               /* match_no/dst must be a write-only operand, and
1323                  operand_operand/src must be a read-only operand.  */
1324               if (match.use[op_no] != READ
1325                   || match.use[match_no] != WRITE)
1326                 continue;
1327
1328               if (match.early_clobber[match_no]
1329                   && count_occurrences (PATTERN (insn), src, 0) > 1)
1330                 continue;
1331
1332               /* Make sure match_no is the destination.  */
1333               if (recog_data.operand[match_no] != SET_DEST (set))
1334                 continue;
1335
1336               if (REGNO (src) < FIRST_PSEUDO_REGISTER)
1337                 {
1338                   if (GET_CODE (SET_SRC (set)) == PLUS
1339                       && GET_CODE (XEXP (SET_SRC (set), 1)) == CONST_INT
1340                       && XEXP (SET_SRC (set), 0) == src
1341                       && fixup_match_2 (insn, dst, src,
1342                                         XEXP (SET_SRC (set), 1),
1343                                         regmove_dump_file))
1344                     break;
1345                   continue;
1346                 }
1347               src_class = reg_preferred_class (REGNO (src));
1348               dst_class = reg_preferred_class (REGNO (dst));
1349               if (! regclass_compatible_p (src_class, dst_class))
1350                 {
1351                   if (!copy_src)
1352                     {
1353                       copy_src = src;
1354                       copy_dst = dst;
1355                     }
1356                   continue;
1357                 }
1358
1359               /* Can not modify an earlier insn to set dst if this insn
1360                  uses an old value in the source.  */
1361               if (reg_overlap_mentioned_p (dst, SET_SRC (set)))
1362                 {
1363                   if (!copy_src)
1364                     {
1365                       copy_src = src;
1366                       copy_dst = dst;
1367                     }
1368                   continue;
1369                 }
1370
1371               if (! (src_note = find_reg_note (insn, REG_DEAD, src)))
1372                 {
1373                   if (!copy_src)
1374                     {
1375                       copy_src = src;
1376                       copy_dst = dst;
1377                     }
1378                   continue;
1379                 }
1380
1381
1382               /* If src is set once in a different basic block,
1383                  and is set equal to a constant, then do not use
1384                  it for this optimization, as this would make it
1385                  no longer equivalent to a constant.  */
1386
1387               if (reg_is_remote_constant_p (src, insn, f))
1388                 {
1389                   if (!copy_src)
1390                     {
1391                       copy_src = src;
1392                       copy_dst = dst;
1393                     }
1394                   continue;
1395                 }
1396
1397
1398               if (regmove_dump_file)
1399                 fprintf (regmove_dump_file,
1400                          "Could fix operand %d of insn %d matching operand %d.\n",
1401                          op_no, INSN_UID (insn), match_no);
1402
1403               /* Scan backward to find the first instruction that uses
1404                  the input operand.  If the operand is set here, then
1405                  replace it in both instructions with match_no.  */
1406
1407               for (length = 0, p = PREV_INSN (insn); p; p = PREV_INSN (p))
1408                 {
1409                   rtx pset;
1410
1411                   /* ??? We can't scan past the end of a basic block without
1412                      updating the register lifetime info
1413                      (REG_DEAD/basic_block_live_at_start).  */
1414                   if (perhaps_ends_bb_p (p))
1415                     break;
1416                   else if (! INSN_P (p))
1417                     continue;
1418
1419                   length++;
1420
1421                   /* ??? See if all of SRC is set in P.  This test is much
1422                      more conservative than it needs to be.  */
1423                   pset = single_set (p);
1424                   if (pset && SET_DEST (pset) == src)
1425                     {
1426                       /* We use validate_replace_rtx, in case there
1427                          are multiple identical source operands.  All of
1428                          them have to be changed at the same time.  */
1429                       if (validate_replace_rtx (src, dst, insn))
1430                         {
1431                           if (validate_change (p, &SET_DEST (pset),
1432                                                dst, 0))
1433                             success = 1;
1434                           else
1435                             {
1436                               /* Change all source operands back.
1437                                  This modifies the dst as a side-effect.  */
1438                               validate_replace_rtx (dst, src, insn);
1439                               /* Now make sure the dst is right.  */
1440                               validate_change (insn,
1441                                                recog_data.operand_loc[match_no],
1442                                                dst, 0);
1443                             }
1444                         }
1445                       break;
1446                     }
1447
1448                   if (reg_overlap_mentioned_p (src, PATTERN (p))
1449                       || reg_overlap_mentioned_p (dst, PATTERN (p)))
1450                     break;
1451
1452                   /* If we have passed a call instruction, and the
1453                      pseudo-reg DST is not already live across a call,
1454                      then don't perform the optimization.  */
1455                   if (GET_CODE (p) == CALL_INSN)
1456                     {
1457                       num_calls++;
1458
1459                       if (REG_N_CALLS_CROSSED (REGNO (dst)) == 0)
1460                         break;
1461                     }
1462                 }
1463
1464               if (success)
1465                 {
1466                   int dstno, srcno;
1467
1468                   /* Remove the death note for SRC from INSN.  */
1469                   remove_note (insn, src_note);
1470                   /* Move the death note for SRC to P if it is used
1471                      there.  */
1472                   if (reg_overlap_mentioned_p (src, PATTERN (p)))
1473                     {
1474                       XEXP (src_note, 1) = REG_NOTES (p);
1475                       REG_NOTES (p) = src_note;
1476                     }
1477                   /* If there is a REG_DEAD note for DST on P, then remove
1478                      it, because DST is now set there.  */
1479                   if ((dst_note = find_reg_note (p, REG_DEAD, dst)))
1480                     remove_note (p, dst_note);
1481
1482                   dstno = REGNO (dst);
1483                   srcno = REGNO (src);
1484
1485                   REG_N_SETS (dstno)++;
1486                   REG_N_SETS (srcno)--;
1487
1488                   REG_N_CALLS_CROSSED (dstno) += num_calls;
1489                   REG_N_CALLS_CROSSED (srcno) -= num_calls;
1490
1491                   REG_LIVE_LENGTH (dstno) += length;
1492                   if (REG_LIVE_LENGTH (srcno) >= 0)
1493                     {
1494                       REG_LIVE_LENGTH (srcno) -= length;
1495                       /* REG_LIVE_LENGTH is only an approximation after
1496                          combine if sched is not run, so make sure that we
1497                          still have a reasonable value.  */
1498                       if (REG_LIVE_LENGTH (srcno) < 2)
1499                         REG_LIVE_LENGTH (srcno) = 2;
1500                     }
1501
1502                   if (regmove_dump_file)
1503                     fprintf (regmove_dump_file,
1504                              "Fixed operand %d of insn %d matching operand %d.\n",
1505                              op_no, INSN_UID (insn), match_no);
1506
1507                   break;
1508                 }
1509             }
1510
1511           /* If we weren't able to replace any of the alternatives, try an
1512              alternative appoach of copying the source to the destination.  */
1513           if (!success && copy_src != NULL_RTX)
1514             copy_src_to_dest (insn, copy_src, copy_dst, old_max_uid);
1515
1516         }
1517     }
1518
1519   /* In fixup_match_1, some insns may have been inserted after basic block
1520      ends.  Fix that here.  */
1521   for (i = 0; i < n_basic_blocks; i++)
1522     {
1523       rtx end = BLOCK_END (i);
1524       rtx new = end;
1525       rtx next = NEXT_INSN (new);
1526       while (next != 0 && INSN_UID (next) >= old_max_uid
1527              && (i == n_basic_blocks - 1 || BLOCK_HEAD (i + 1) != next))
1528         new = next, next = NEXT_INSN (new);
1529       BLOCK_END (i) = new;
1530     }
1531
1532  done:
1533   /* Clean up.  */
1534   free (regno_src_regno);
1535   free (regmove_bb_head);
1536 }
1537
1538 /* Returns nonzero if INSN's pattern has matching constraints for any operand.
1539    Returns 0 if INSN can't be recognized, or if the alternative can't be
1540    determined.
1541
1542    Initialize the info in MATCHP based on the constraints.  */
1543
1544 static int
1545 find_matches (insn, matchp)
1546      rtx insn;
1547      struct match *matchp;
1548 {
1549   int likely_spilled[MAX_RECOG_OPERANDS];
1550   int op_no;
1551   int any_matches = 0;
1552
1553   extract_insn (insn);
1554   if (! constrain_operands (0))
1555     return 0;
1556
1557   /* Must initialize this before main loop, because the code for
1558      the commutative case may set matches for operands other than
1559      the current one.  */
1560   for (op_no = recog_data.n_operands; --op_no >= 0; )
1561     matchp->with[op_no] = matchp->commutative[op_no] = -1;
1562
1563   for (op_no = 0; op_no < recog_data.n_operands; op_no++)
1564     {
1565       const char *p;
1566       char c;
1567       int i = 0;
1568
1569       p = recog_data.constraints[op_no];
1570
1571       likely_spilled[op_no] = 0;
1572       matchp->use[op_no] = READ;
1573       matchp->early_clobber[op_no] = 0;
1574       if (*p == '=')
1575         matchp->use[op_no] = WRITE;
1576       else if (*p == '+')
1577         matchp->use[op_no] = READWRITE;
1578
1579       for (;*p && i < which_alternative; p++)
1580         if (*p == ',')
1581           i++;
1582
1583       while ((c = *p++) != '\0' && c != ',')
1584         switch (c)
1585           {
1586           case '=':
1587             break;
1588           case '+':
1589             break;
1590           case '&':
1591             matchp->early_clobber[op_no] = 1;
1592             break;
1593           case '%':
1594             matchp->commutative[op_no] = op_no + 1;
1595             matchp->commutative[op_no + 1] = op_no;
1596             break;
1597           case '0': case '1': case '2': case '3': case '4':
1598           case '5': case '6': case '7': case '8': case '9':
1599             c -= '0';
1600             if (c < op_no && likely_spilled[(unsigned char) c])
1601               break;
1602             matchp->with[op_no] = c;
1603             any_matches = 1;
1604             if (matchp->commutative[op_no] >= 0)
1605               matchp->with[matchp->commutative[op_no]] = c;
1606             break;
1607           case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'h':
1608           case 'j': case 'k': case 'l': case 'p': case 'q': case 't': case 'u':
1609           case 'v': case 'w': case 'x': case 'y': case 'z': case 'A': case 'B':
1610           case 'C': case 'D': case 'W': case 'Y': case 'Z':
1611             if (CLASS_LIKELY_SPILLED_P (REG_CLASS_FROM_LETTER ((unsigned char)c)))
1612               likely_spilled[op_no] = 1;
1613             break;
1614           }
1615     }
1616   return any_matches;
1617 }
1618
1619 /* Try to replace all occurrences of DST_REG with SRC in LOC, that is
1620    assumed to be in INSN.  */
1621
1622 static void
1623 replace_in_call_usage (loc, dst_reg, src, insn)
1624      rtx *loc;
1625      unsigned int dst_reg;
1626      rtx src;
1627      rtx insn;
1628 {
1629   rtx x = *loc;
1630   enum rtx_code code;
1631   const char *fmt;
1632   int i, j;
1633
1634   if (! x)
1635     return;
1636
1637   code = GET_CODE (x);
1638   if (code == REG)
1639     {
1640       if (REGNO (x) != dst_reg)
1641         return;
1642
1643       validate_change (insn, loc, src, 1);
1644
1645       return;
1646     }
1647
1648   /* Process each of our operands recursively.  */
1649   fmt = GET_RTX_FORMAT (code);
1650   for (i = 0; i < GET_RTX_LENGTH (code); i++, fmt++)
1651     if (*fmt == 'e')
1652       replace_in_call_usage (&XEXP (x, i), dst_reg, src, insn);
1653     else if (*fmt == 'E')
1654       for (j = 0; j < XVECLEN (x, i); j++)
1655         replace_in_call_usage (& XVECEXP (x, i, j), dst_reg, src, insn);
1656 }
1657
1658 /* Try to replace output operand DST in SET, with input operand SRC.  SET is
1659    the only set in INSN.  INSN has just been recognized and constrained.
1660    SRC is operand number OPERAND_NUMBER in INSN.
1661    DST is operand number MATCH_NUMBER in INSN.
1662    If BACKWARD is nonzero, we have been called in a backward pass.
1663    Return nonzero for success.  */
1664
1665 static int
1666 fixup_match_1 (insn, set, src, src_subreg, dst, backward, operand_number,
1667                match_number, regmove_dump_file)
1668      rtx insn, set, src, src_subreg, dst;
1669      int backward, operand_number, match_number;
1670      FILE *regmove_dump_file;
1671 {
1672   rtx p;
1673   rtx post_inc = 0, post_inc_set = 0, search_end = 0;
1674   int success = 0;
1675   int num_calls = 0, s_num_calls = 0;
1676   enum rtx_code code = NOTE;
1677   HOST_WIDE_INT insn_const = 0, newconst;
1678   rtx overlap = 0; /* need to move insn ? */
1679   rtx src_note = find_reg_note (insn, REG_DEAD, src), dst_note = NULL_RTX;
1680   int length, s_length;
1681
1682   /* If SRC is marked as unchanging, we may not change it.
1683      ??? Maybe we could get better code by removing the unchanging bit
1684      instead, and changing it back if we don't succeed?  */
1685   if (RTX_UNCHANGING_P (src))
1686     return 0;
1687
1688   if (! src_note)
1689     {
1690       /* Look for (set (regX) (op regA constX))
1691                   (set (regY) (op regA constY))
1692          and change that to
1693                   (set (regA) (op regA constX)).
1694                   (set (regY) (op regA constY-constX)).
1695          This works for add and shift operations, if
1696          regA is dead after or set by the second insn.  */
1697
1698       code = GET_CODE (SET_SRC (set));
1699       if ((code == PLUS || code == LSHIFTRT
1700            || code == ASHIFT || code == ASHIFTRT)
1701           && XEXP (SET_SRC (set), 0) == src
1702           && GET_CODE (XEXP (SET_SRC (set), 1)) == CONST_INT)
1703         insn_const = INTVAL (XEXP (SET_SRC (set), 1));
1704       else if (! stable_and_no_regs_but_for_p (SET_SRC (set), src, dst))
1705         return 0;
1706       else
1707         /* We might find a src_note while scanning.  */
1708         code = NOTE;
1709     }
1710
1711   if (regmove_dump_file)
1712     fprintf (regmove_dump_file,
1713              "Could fix operand %d of insn %d matching operand %d.\n",
1714              operand_number, INSN_UID (insn), match_number);
1715
1716   /* If SRC is equivalent to a constant set in a different basic block,
1717      then do not use it for this optimization.  We want the equivalence
1718      so that if we have to reload this register, we can reload the
1719      constant, rather than extending the lifespan of the register.  */
1720   if (reg_is_remote_constant_p (src, insn, get_insns ()))
1721     return 0;
1722
1723   /* Scan forward to find the next instruction that
1724      uses the output operand.  If the operand dies here,
1725      then replace it in both instructions with
1726      operand_number.  */
1727
1728   for (length = s_length = 0, p = NEXT_INSN (insn); p; p = NEXT_INSN (p))
1729     {
1730       if (GET_CODE (p) == CALL_INSN)
1731         replace_in_call_usage (& CALL_INSN_FUNCTION_USAGE (p),
1732                                REGNO (dst), src, p);
1733
1734       /* ??? We can't scan past the end of a basic block without updating
1735          the register lifetime info (REG_DEAD/basic_block_live_at_start).  */
1736       if (perhaps_ends_bb_p (p))
1737         break;
1738       else if (! INSN_P (p))
1739         continue;
1740
1741       length++;
1742       if (src_note)
1743         s_length++;
1744
1745       if (reg_set_p (src, p) || reg_set_p (dst, p)
1746           || (GET_CODE (PATTERN (p)) == USE
1747               && reg_overlap_mentioned_p (src, XEXP (PATTERN (p), 0))))
1748         break;
1749
1750       /* See if all of DST dies in P.  This test is
1751          slightly more conservative than it needs to be.  */
1752       if ((dst_note = find_regno_note (p, REG_DEAD, REGNO (dst)))
1753           && (GET_MODE (XEXP (dst_note, 0)) == GET_MODE (dst)))
1754         {
1755           /* If we would be moving INSN, check that we won't move it
1756              into the shadow of a live a live flags register.  */
1757           /* ??? We only try to move it in front of P, although
1758                  we could move it anywhere between OVERLAP and P.  */
1759           if (overlap && GET_MODE (PREV_INSN (p)) != VOIDmode)
1760             break;
1761
1762           if (! src_note)
1763             {
1764               rtx q;
1765               rtx set2 = NULL_RTX;
1766
1767               /* If an optimization is done, the value of SRC while P
1768                  is executed will be changed.  Check that this is OK.  */
1769               if (reg_overlap_mentioned_p (src, PATTERN (p)))
1770                 break;
1771               for (q = p; q; q = NEXT_INSN (q))
1772                 {
1773                   /* ??? We can't scan past the end of a basic block without
1774                      updating the register lifetime info
1775                      (REG_DEAD/basic_block_live_at_start).  */
1776                   if (perhaps_ends_bb_p (q))
1777                     {
1778                       q = 0;
1779                       break;
1780                     }
1781                   else if (! INSN_P (q))
1782                     continue;
1783                   else if (reg_overlap_mentioned_p (src, PATTERN (q))
1784                            || reg_set_p (src, q))
1785                     break;
1786                 }
1787               if (q)
1788                 set2 = single_set (q);
1789               if (! q || ! set2 || GET_CODE (SET_SRC (set2)) != code
1790                   || XEXP (SET_SRC (set2), 0) != src
1791                   || GET_CODE (XEXP (SET_SRC (set2), 1)) != CONST_INT
1792                   || (SET_DEST (set2) != src
1793                       && ! find_reg_note (q, REG_DEAD, src)))
1794                 {
1795                   /* If this is a PLUS, we can still save a register by doing
1796                      src += insn_const;
1797                      P;
1798                      src -= insn_const; .
1799                      This also gives opportunities for subsequent
1800                      optimizations in the backward pass, so do it there.  */
1801                   if (code == PLUS && backward
1802                       /* Don't do this if we can likely tie DST to SET_DEST
1803                          of P later; we can't do this tying here if we got a
1804                          hard register.  */
1805                       && ! (dst_note && ! REG_N_CALLS_CROSSED (REGNO (dst))
1806                             && single_set (p)
1807                             && GET_CODE (SET_DEST (single_set (p))) == REG
1808                             && (REGNO (SET_DEST (single_set (p)))
1809                                 < FIRST_PSEUDO_REGISTER))
1810                       /* We may only emit an insn directly after P if we
1811                          are not in the shadow of a live flags register.  */
1812                       && GET_MODE (p) == VOIDmode)
1813                     {
1814                       search_end = q;
1815                       q = insn;
1816                       set2 = set;
1817                       newconst = -insn_const;
1818                       code = MINUS;
1819                     }
1820                   else
1821                     break;
1822                 }
1823               else
1824                 {
1825                   newconst = INTVAL (XEXP (SET_SRC (set2), 1)) - insn_const;
1826                   /* Reject out of range shifts.  */
1827                   if (code != PLUS
1828                       && (newconst < 0
1829                           || ((unsigned HOST_WIDE_INT) newconst
1830                               >= (GET_MODE_BITSIZE (GET_MODE
1831                                                     (SET_SRC (set2)))))))
1832                     break;
1833                   if (code == PLUS)
1834                     {
1835                       post_inc = q;
1836                       if (SET_DEST (set2) != src)
1837                         post_inc_set = set2;
1838                     }
1839                 }
1840               /* We use 1 as last argument to validate_change so that all
1841                  changes are accepted or rejected together by apply_change_group
1842                  when it is called by validate_replace_rtx .  */
1843               validate_change (q, &XEXP (SET_SRC (set2), 1),
1844                                GEN_INT (newconst), 1);
1845             }
1846           validate_change (insn, recog_data.operand_loc[match_number], src, 1);
1847           if (validate_replace_rtx (dst, src_subreg, p))
1848             success = 1;
1849           break;
1850         }
1851
1852       if (reg_overlap_mentioned_p (dst, PATTERN (p)))
1853         break;
1854       if (! src_note && reg_overlap_mentioned_p (src, PATTERN (p)))
1855         {
1856           /* INSN was already checked to be movable wrt. the registers that it
1857              sets / uses when we found no REG_DEAD note for src on it, but it
1858              still might clobber the flags register.  We'll have to check that
1859              we won't insert it into the shadow of a live flags register when
1860              we finally know where we are to move it.  */
1861           overlap = p;
1862           src_note = find_reg_note (p, REG_DEAD, src);
1863         }
1864
1865       /* If we have passed a call instruction, and the pseudo-reg SRC is not
1866          already live across a call, then don't perform the optimization.  */
1867       if (GET_CODE (p) == CALL_INSN)
1868         {
1869           if (REG_N_CALLS_CROSSED (REGNO (src)) == 0)
1870             break;
1871
1872           num_calls++;
1873
1874           if (src_note)
1875             s_num_calls++;
1876
1877         }
1878     }
1879
1880   if (! success)
1881     return 0;
1882
1883   /* Remove the death note for DST from P.  */
1884   remove_note (p, dst_note);
1885   if (code == MINUS)
1886     {
1887       post_inc = emit_insn_after (copy_rtx (PATTERN (insn)), p);
1888       if ((HAVE_PRE_INCREMENT || HAVE_PRE_DECREMENT)
1889           && search_end
1890           && try_auto_increment (search_end, post_inc, 0, src, newconst, 1))
1891         post_inc = 0;
1892       validate_change (insn, &XEXP (SET_SRC (set), 1), GEN_INT (insn_const), 0);
1893       REG_N_SETS (REGNO (src))++;
1894       REG_LIVE_LENGTH (REGNO (src))++;
1895     }
1896   if (overlap)
1897     {
1898       /* The lifetime of src and dest overlap,
1899          but we can change this by moving insn.  */
1900       rtx pat = PATTERN (insn);
1901       if (src_note)
1902         remove_note (overlap, src_note);
1903       if ((HAVE_POST_INCREMENT || HAVE_POST_DECREMENT)
1904           && code == PLUS
1905           && try_auto_increment (overlap, insn, 0, src, insn_const, 0))
1906         insn = overlap;
1907       else
1908         {
1909           rtx notes = REG_NOTES (insn);
1910
1911           emit_insn_after_with_line_notes (pat, PREV_INSN (p), insn);
1912           PUT_CODE (insn, NOTE);
1913           NOTE_LINE_NUMBER (insn) = NOTE_INSN_DELETED;
1914           NOTE_SOURCE_FILE (insn) = 0;
1915           /* emit_insn_after_with_line_notes has no
1916              return value, so search for the new insn.  */
1917           insn = p;
1918           while (! INSN_P (insn) || PATTERN (insn) != pat)
1919             insn = PREV_INSN (insn);
1920
1921           REG_NOTES (insn) = notes;
1922         }
1923     }
1924   /* Sometimes we'd generate src = const; src += n;
1925      if so, replace the instruction that set src
1926      in the first place.  */
1927
1928   if (! overlap && (code == PLUS || code == MINUS))
1929     {
1930       rtx note = find_reg_note (insn, REG_EQUAL, NULL_RTX);
1931       rtx q, set2 = NULL_RTX;
1932       int num_calls2 = 0, s_length2 = 0;
1933
1934       if (note && CONSTANT_P (XEXP (note, 0)))
1935         {
1936           for (q = PREV_INSN (insn); q; q = PREV_INSN(q))
1937             {
1938               /* ??? We can't scan past the end of a basic block without
1939                  updating the register lifetime info
1940                  (REG_DEAD/basic_block_live_at_start).  */
1941               if (perhaps_ends_bb_p (q))
1942                 {
1943                   q = 0;
1944                   break;
1945                 }
1946               else if (! INSN_P (q))
1947                 continue;
1948
1949               s_length2++;
1950               if (reg_set_p (src, q))
1951                 {
1952                   set2 = single_set (q);
1953                   break;
1954                 }
1955               if (reg_overlap_mentioned_p (src, PATTERN (q)))
1956                 {
1957                   q = 0;
1958                   break;
1959                 }
1960               if (GET_CODE (p) == CALL_INSN)
1961                 num_calls2++;
1962             }
1963           if (q && set2 && SET_DEST (set2) == src && CONSTANT_P (SET_SRC (set2))
1964               && validate_change (insn, &SET_SRC (set), XEXP (note, 0), 0))
1965             {
1966               PUT_CODE (q, NOTE);
1967               NOTE_LINE_NUMBER (q) = NOTE_INSN_DELETED;
1968               NOTE_SOURCE_FILE (q) = 0;
1969               REG_N_SETS (REGNO (src))--;
1970               REG_N_CALLS_CROSSED (REGNO (src)) -= num_calls2;
1971               REG_LIVE_LENGTH (REGNO (src)) -= s_length2;
1972               insn_const = 0;
1973             }
1974         }
1975     }
1976
1977   if ((HAVE_PRE_INCREMENT || HAVE_PRE_DECREMENT)
1978            && (code == PLUS || code == MINUS) && insn_const
1979            && try_auto_increment (p, insn, 0, src, insn_const, 1))
1980     insn = p;
1981   else if ((HAVE_POST_INCREMENT || HAVE_POST_DECREMENT)
1982            && post_inc
1983            && try_auto_increment (p, post_inc, post_inc_set, src, newconst, 0))
1984     post_inc = 0;
1985   /* If post_inc still prevails, try to find an
1986      insn where it can be used as a pre-in/decrement.
1987      If code is MINUS, this was already tried.  */
1988   if (post_inc && code == PLUS
1989   /* Check that newconst is likely to be usable
1990      in a pre-in/decrement before starting the search.  */
1991       && ((HAVE_PRE_INCREMENT && newconst > 0 && newconst <= MOVE_MAX)
1992           || (HAVE_PRE_DECREMENT && newconst < 0 && newconst >= -MOVE_MAX))
1993       && exact_log2 (newconst))
1994     {
1995       rtx q, inc_dest;
1996
1997       inc_dest = post_inc_set ? SET_DEST (post_inc_set) : src;
1998       for (q = post_inc; (q = NEXT_INSN (q)); )
1999         {
2000           /* ??? We can't scan past the end of a basic block without updating
2001              the register lifetime info
2002              (REG_DEAD/basic_block_live_at_start). */
2003           if (perhaps_ends_bb_p (q))
2004             break;
2005           else if (! INSN_P (q))
2006             continue;
2007           else if (src != inc_dest
2008                    && (reg_overlap_mentioned_p (src, PATTERN (q))
2009                        || reg_set_p (src, q)))
2010             break;
2011           else if (reg_set_p (inc_dest, q))
2012             break;
2013           else if (reg_overlap_mentioned_p (inc_dest, PATTERN (q)))
2014             {
2015               try_auto_increment (q, post_inc,
2016                                   post_inc_set, inc_dest, newconst, 1);
2017               break;
2018             }
2019         }
2020     }
2021
2022   /* Move the death note for DST to INSN if it is used
2023      there.  */
2024   if (reg_overlap_mentioned_p (dst, PATTERN (insn)))
2025     {
2026       XEXP (dst_note, 1) = REG_NOTES (insn);
2027       REG_NOTES (insn) = dst_note;
2028     }
2029
2030   if (src_note)
2031     {
2032       /* Move the death note for SRC from INSN to P.  */
2033       if (! overlap)
2034         remove_note (insn, src_note);
2035       XEXP (src_note, 1) = REG_NOTES (p);
2036       REG_NOTES (p) = src_note;
2037
2038       REG_N_CALLS_CROSSED (REGNO (src)) += s_num_calls;
2039     }
2040
2041   REG_N_SETS (REGNO (src))++;
2042   REG_N_SETS (REGNO (dst))--;
2043
2044   REG_N_CALLS_CROSSED (REGNO (dst)) -= num_calls;
2045
2046   REG_LIVE_LENGTH (REGNO (src)) += s_length;
2047   if (REG_LIVE_LENGTH (REGNO (dst)) >= 0)
2048     {
2049       REG_LIVE_LENGTH (REGNO (dst)) -= length;
2050       /* REG_LIVE_LENGTH is only an approximation after
2051          combine if sched is not run, so make sure that we
2052          still have a reasonable value.  */
2053       if (REG_LIVE_LENGTH (REGNO (dst)) < 2)
2054         REG_LIVE_LENGTH (REGNO (dst)) = 2;
2055     }
2056   if (regmove_dump_file)
2057     fprintf (regmove_dump_file,
2058              "Fixed operand %d of insn %d matching operand %d.\n",
2059              operand_number, INSN_UID (insn), match_number);
2060   return 1;
2061 }
2062
2063
2064 /* return nonzero if X is stable and mentions no regsiters but for
2065    mentioning SRC or mentioning / changing DST .  If in doubt, presume
2066    it is unstable.
2067    The rationale is that we want to check if we can move an insn easily
2068    while just paying attention to SRC and DST.  A register is considered
2069    stable if it has the RTX_UNCHANGING_P bit set, but that would still
2070    leave the burden to update REG_DEAD / REG_UNUSED notes, so we don't
2071    want any registers but SRC and DST.  */
2072 static int
2073 stable_and_no_regs_but_for_p (x, src, dst)
2074      rtx x, src, dst;
2075 {
2076   RTX_CODE code = GET_CODE (x);
2077   switch (GET_RTX_CLASS (code))
2078     {
2079     case '<': case '1': case 'c': case '2': case 'b': case '3':
2080       {
2081         int i;
2082         const char *fmt = GET_RTX_FORMAT (code);
2083         for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
2084           if (fmt[i] == 'e'
2085               && ! stable_and_no_regs_but_for_p (XEXP (x, i), src, dst))
2086               return 0;
2087         return 1;
2088       }
2089     case 'o':
2090       if (code == REG)
2091         return x == src || x == dst;
2092       /* If this is a MEM, look inside - there might be a register hidden in
2093          the address of an unchanging MEM.  */
2094       if (code == MEM
2095           && ! stable_and_no_regs_but_for_p (XEXP (x, 0), src, dst))
2096         return 0;
2097       /* fall through */
2098     default:
2099       return ! rtx_unstable_p (x);
2100     }
2101 }
2102 \f
2103 /* Track stack adjustments and stack memory references.  Attempt to
2104    reduce the number of stack adjustments by back-propogating across
2105    the memory references.
2106
2107    This is intended primarily for use with targets that do not define
2108    ACCUMULATE_OUTGOING_ARGS.  It is of significantly more value to
2109    targets that define PREFERRED_STACK_BOUNDARY more aligned than
2110    STACK_BOUNDARY (e.g. x86), or if not all registers can be pushed
2111    (e.g. x86 fp regs) which would ordinarily have to be implemented
2112    as a sub/mov pair due to restrictions in calls.c.
2113
2114    Propogation stops when any of the insns that need adjusting are
2115    (a) no longer valid because we've exceeded their range, (b) a
2116    non-trivial push instruction, or (c) a call instruction.
2117
2118    Restriction B is based on the assumption that push instructions
2119    are smaller or faster.  If a port really wants to remove all
2120    pushes, it should have defined ACCUMULATE_OUTGOING_ARGS.  The
2121    one exception that is made is for an add immediately followed
2122    by a push.  */
2123
2124 /* This structure records stack memory references between stack adjusting
2125    instructions.  */
2126
2127 struct csa_memlist
2128 {
2129   HOST_WIDE_INT sp_offset;
2130   rtx insn, *mem;
2131   struct csa_memlist *next;
2132 };
2133
2134 static int stack_memref_p               PARAMS ((rtx));
2135 static rtx single_set_for_csa           PARAMS ((rtx));
2136 static void free_csa_memlist            PARAMS ((struct csa_memlist *));
2137 static struct csa_memlist *record_one_stack_memref
2138   PARAMS ((rtx, rtx *, struct csa_memlist *));
2139 static int try_apply_stack_adjustment
2140   PARAMS ((rtx, struct csa_memlist *, HOST_WIDE_INT, HOST_WIDE_INT));
2141 static void combine_stack_adjustments_for_block PARAMS ((basic_block));
2142 static int record_stack_memrefs PARAMS ((rtx *, void *));
2143
2144
2145 /* Main entry point for stack adjustment combination.  */
2146
2147 void
2148 combine_stack_adjustments ()
2149 {
2150   int i;
2151
2152   for (i = 0; i < n_basic_blocks; ++i)
2153     combine_stack_adjustments_for_block (BASIC_BLOCK (i));
2154 }
2155
2156 /* Recognize a MEM of the form (sp) or (plus sp const).  */
2157
2158 static int
2159 stack_memref_p (x)
2160      rtx x;
2161 {
2162   if (GET_CODE (x) != MEM)
2163     return 0;
2164   x = XEXP (x, 0);
2165
2166   if (x == stack_pointer_rtx)
2167     return 1;
2168   if (GET_CODE (x) == PLUS
2169       && XEXP (x, 0) == stack_pointer_rtx
2170       && GET_CODE (XEXP (x, 1)) == CONST_INT)
2171     return 1;
2172
2173   return 0;
2174 }
2175
2176 /* Recognize either normal single_set or the hack in i386.md for
2177    tying fp and sp adjustments.  */
2178
2179 static rtx
2180 single_set_for_csa (insn)
2181      rtx insn;
2182 {
2183   int i;
2184   rtx tmp = single_set (insn);
2185   if (tmp)
2186     return tmp;
2187
2188   if (GET_CODE (insn) != INSN
2189       || GET_CODE (PATTERN (insn)) != PARALLEL)
2190     return NULL_RTX;
2191
2192   tmp = PATTERN (insn);
2193   if (GET_CODE (XVECEXP (tmp, 0, 0)) != SET)
2194     return NULL_RTX;
2195
2196   for (i = 1; i < XVECLEN (tmp, 0); ++i)
2197     {
2198       rtx this = XVECEXP (tmp, 0, i);
2199
2200       /* The special case is allowing a no-op set.  */
2201       if (GET_CODE (this) == SET
2202           && SET_SRC (this) == SET_DEST (this))
2203         ;
2204       else if (GET_CODE (this) != CLOBBER
2205                && GET_CODE (this) != USE)
2206         return NULL_RTX;
2207     }
2208
2209   return XVECEXP (tmp, 0, 0);
2210 }
2211
2212 /* Free the list of csa_memlist nodes.  */
2213
2214 static void
2215 free_csa_memlist (memlist)
2216      struct csa_memlist *memlist;
2217 {
2218   struct csa_memlist *next;
2219   for (; memlist ; memlist = next)
2220     {
2221       next = memlist->next;
2222       free (memlist);
2223     }
2224 }
2225
2226 /* Create a new csa_memlist node from the given memory reference.
2227    It is already known that the memory is stack_memref_p.  */
2228
2229 static struct csa_memlist *
2230 record_one_stack_memref (insn, mem, next_memlist)
2231      rtx insn, *mem;
2232      struct csa_memlist *next_memlist;
2233 {
2234   struct csa_memlist *ml;
2235
2236   ml = (struct csa_memlist *) xmalloc (sizeof (*ml));
2237
2238   if (XEXP (*mem, 0) == stack_pointer_rtx)
2239     ml->sp_offset = 0;
2240   else
2241     ml->sp_offset = INTVAL (XEXP (XEXP (*mem, 0), 1));
2242
2243   ml->insn = insn;
2244   ml->mem = mem;
2245   ml->next = next_memlist;
2246
2247   return ml;
2248 }
2249
2250 /* Attempt to apply ADJUST to the stack adjusting insn INSN, as well
2251    as each of the memories in MEMLIST.  Return true on success.  */
2252
2253 static int
2254 try_apply_stack_adjustment (insn, memlist, new_adjust, delta)
2255      rtx insn;
2256      struct csa_memlist *memlist;
2257      HOST_WIDE_INT new_adjust, delta;
2258 {
2259   struct csa_memlist *ml;
2260   rtx set;
2261
2262   set = single_set_for_csa (insn);
2263   validate_change (insn, &XEXP (SET_SRC (set), 1), GEN_INT (new_adjust), 1);
2264
2265   for (ml = memlist; ml ; ml = ml->next)
2266     validate_change
2267       (ml->insn, ml->mem,
2268        replace_equiv_address_nv (*ml->mem,
2269                                  plus_constant (stack_pointer_rtx,
2270                                                 ml->sp_offset - delta)), 1);
2271
2272   if (apply_change_group ())
2273     {
2274       /* Succeeded.  Update our knowledge of the memory references.  */
2275       for (ml = memlist; ml ; ml = ml->next)
2276         ml->sp_offset -= delta;
2277
2278       return 1;
2279     }
2280   else
2281     return 0;
2282 }
2283
2284 /* Called via for_each_rtx and used to record all stack memory references in
2285    the insn and discard all other stack pointer references.  */
2286 struct record_stack_memrefs_data
2287 {
2288   rtx insn;
2289   struct csa_memlist *memlist;
2290 };
2291
2292 static int
2293 record_stack_memrefs (xp, data)
2294      rtx *xp;
2295      void *data;
2296 {
2297   rtx x = *xp;
2298   struct record_stack_memrefs_data *d =
2299     (struct record_stack_memrefs_data *) data;
2300   if (!x)
2301     return 0;
2302   switch (GET_CODE (x))
2303     {
2304     case MEM:
2305       if (!reg_mentioned_p (stack_pointer_rtx, x))
2306         return -1;
2307       /* We are not able to handle correctly all possible memrefs containing
2308          stack pointer, so this check is neccesary.  */
2309       if (stack_memref_p (x))
2310         {
2311           d->memlist = record_one_stack_memref (d->insn, xp, d->memlist);
2312           return -1;
2313         }
2314       return 1;
2315     case REG:
2316       /* ??? We want be able to handle non-memory stack pointer
2317          references later.  For now just discard all insns refering to
2318          stack pointer outside mem expressions.  We would probably
2319          want to teach validate_replace to simplify expressions first.
2320
2321          We can't just compare with STACK_POINTER_RTX because the
2322          reference to the stack pointer might be in some other mode.
2323          In particular, an explict clobber in an asm statement will
2324          result in a QImode clober.  */
2325       if (REGNO (x) == STACK_POINTER_REGNUM)
2326         return 1;
2327       break;
2328     default:
2329       break;
2330     }
2331   return 0;
2332 }
2333
2334 /* Subroutine of combine_stack_adjustments, called for each basic block.  */
2335
2336 static void
2337 combine_stack_adjustments_for_block (bb)
2338      basic_block bb;
2339 {
2340   HOST_WIDE_INT last_sp_adjust = 0;
2341   rtx last_sp_set = NULL_RTX;
2342   struct csa_memlist *memlist = NULL;
2343   rtx pending_delete;
2344   rtx insn, next;
2345   struct record_stack_memrefs_data data;
2346
2347   for (insn = bb->head; ; insn = next)
2348     {
2349       rtx set;
2350
2351       pending_delete = NULL_RTX;
2352       next = NEXT_INSN (insn);
2353
2354       if (! INSN_P (insn))
2355         goto processed;
2356
2357       set = single_set_for_csa (insn);
2358       if (set)
2359         {
2360           rtx dest = SET_DEST (set);
2361           rtx src = SET_SRC (set);
2362
2363           /* Find constant additions to the stack pointer.  */
2364           if (dest == stack_pointer_rtx
2365               && GET_CODE (src) == PLUS
2366               && XEXP (src, 0) == stack_pointer_rtx
2367               && GET_CODE (XEXP (src, 1)) == CONST_INT)
2368             {
2369               HOST_WIDE_INT this_adjust = INTVAL (XEXP (src, 1));
2370
2371               /* If we've not seen an adjustment previously, record
2372                  it now and continue.  */
2373               if (! last_sp_set)
2374                 {
2375                   last_sp_set = insn;
2376                   last_sp_adjust = this_adjust;
2377                   goto processed;
2378                 }
2379
2380               /* If not all recorded memrefs can be adjusted, or the
2381                  adjustment is now too large for a constant addition,
2382                  we cannot merge the two stack adjustments.
2383
2384                  Also we need to be carefull to not move stack pointer
2385                  such that we create stack accesses outside the allocated
2386                  area.  We can combine an allocation into the first insn,
2387                  or a deallocation into the second insn.  We can not
2388                  combine an allocation followed by a deallocation.
2389
2390                  The only somewhat frequent ocurrence of the later is when
2391                  a function allocates a stack frame but does not use it.
2392                  For this case, we would need to analyze rtl stream to be
2393                  sure that allocated area is really unused.  This means not
2394                  only checking the memory references, but also all registers
2395                  or global memory references possibly containing a stack
2396                  frame address.
2397
2398                  Perhaps the best way to address this problem is to teach
2399                  gcc not to allocate stack for objects never used.  */
2400
2401               /* Combine an allocation into the first instruction.  */
2402               if (STACK_GROWS_DOWNWARD ? this_adjust <= 0 : this_adjust >= 0)
2403                 {
2404                   if (try_apply_stack_adjustment (last_sp_set, memlist,
2405                                                   last_sp_adjust + this_adjust,
2406                                                   this_adjust))
2407                     {
2408                       /* It worked!  */
2409                       pending_delete = insn;
2410                       last_sp_adjust += this_adjust;
2411                       goto processed;
2412                     }
2413                 }
2414
2415               /* Otherwise we have a deallocation.  Do not combine with
2416                  a previous allocation.  Combine into the second insn.  */
2417               else if (STACK_GROWS_DOWNWARD
2418                        ? last_sp_adjust >= 0 : last_sp_adjust <= 0)
2419                 {
2420                   if (try_apply_stack_adjustment (insn, memlist,
2421                                                   last_sp_adjust + this_adjust,
2422                                                   -last_sp_adjust))
2423                     {
2424                       /* It worked!  */
2425                       flow_delete_insn (last_sp_set);
2426                       last_sp_set = insn;
2427                       last_sp_adjust += this_adjust;
2428                       free_csa_memlist (memlist);
2429                       memlist = NULL;
2430                       goto processed;
2431                     }
2432                 }
2433
2434               /* Combination failed.  Restart processing from here.  */
2435               free_csa_memlist (memlist);
2436               memlist = NULL;
2437               last_sp_set = insn;
2438               last_sp_adjust = this_adjust;
2439               goto processed;
2440             }
2441
2442           /* Find a predecrement of exactly the previous adjustment and
2443              turn it into a direct store.  Obviously we can't do this if
2444              there were any intervening uses of the stack pointer.  */
2445           if (memlist == NULL
2446               && GET_CODE (dest) == MEM
2447               && ((GET_CODE (XEXP (dest, 0)) == PRE_DEC
2448                    && (last_sp_adjust
2449                        == (HOST_WIDE_INT) GET_MODE_SIZE (GET_MODE (dest))))
2450                   || (GET_CODE (XEXP (dest, 0)) == PRE_MODIFY
2451                       && GET_CODE (XEXP (XEXP (dest, 0), 1)) == PLUS
2452                       && XEXP (XEXP (XEXP (dest, 0), 1), 0) == stack_pointer_rtx
2453                       && (GET_CODE (XEXP (XEXP (XEXP (dest, 0), 1), 1))
2454                           == CONST_INT)
2455                       && (INTVAL (XEXP (XEXP (XEXP (dest, 0), 1), 1))
2456                           == -last_sp_adjust)))
2457               && XEXP (XEXP (dest, 0), 0) == stack_pointer_rtx
2458               && ! reg_mentioned_p (stack_pointer_rtx, src)
2459               && memory_address_p (GET_MODE (dest), stack_pointer_rtx)
2460               && validate_change (insn, &SET_DEST (set),
2461                                   replace_equiv_address (dest,
2462                                                          stack_pointer_rtx),
2463                                   0))
2464             {
2465               if (last_sp_set == bb->head)
2466                 bb->head = NEXT_INSN (last_sp_set);
2467               flow_delete_insn (last_sp_set);
2468
2469               free_csa_memlist (memlist);
2470               memlist = NULL;
2471               last_sp_set = NULL_RTX;
2472               last_sp_adjust = 0;
2473               goto processed;
2474             }
2475         }
2476
2477       data.insn = insn;
2478       data.memlist = memlist;
2479       if (GET_CODE (insn) != CALL_INSN && last_sp_set
2480           && !for_each_rtx (&PATTERN (insn), record_stack_memrefs, &data))
2481         {
2482            memlist = data.memlist;
2483            goto processed;
2484         }
2485       memlist = data.memlist;
2486
2487       /* Otherwise, we were not able to process the instruction.
2488          Do not continue collecting data across such a one.  */
2489       if (last_sp_set
2490           && (GET_CODE (insn) == CALL_INSN
2491               || reg_mentioned_p (stack_pointer_rtx, PATTERN (insn))))
2492         {
2493           free_csa_memlist (memlist);
2494           memlist = NULL;
2495           last_sp_set = NULL_RTX;
2496           last_sp_adjust = 0;
2497         }
2498
2499     processed:
2500       if (insn == bb->end)
2501         break;
2502
2503       if (pending_delete)
2504         flow_delete_insn (pending_delete);
2505     }
2506
2507   if (pending_delete)
2508     {
2509       bb->end = PREV_INSN (pending_delete);
2510       flow_delete_insn (pending_delete);
2511     }
2512 }