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