OSDN Git Service

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