OSDN Git Service

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