OSDN Git Service

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