OSDN Git Service

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