OSDN Git Service

2012-11-01 Vladimir Makarov <vmakarov@redhat.com>
[pf3gnuchains/gcc-fork.git] / gcc / regmove.c
1 /* Move registers around to reduce number of move instructions needed.
2    Copyright (C) 1987, 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
3    1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
4    2012
5    Free Software Foundation, Inc.
6
7 This file is part of GCC.
8
9 GCC is free software; you can redistribute it and/or modify it under
10 the terms of the GNU General Public License as published by the Free
11 Software Foundation; either version 3, or (at your option) any later
12 version.
13
14 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
15 WARRANTY; without even the implied warranty of MERCHANTABILITY or
16 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
17 for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with GCC; see the file COPYING3.  If not see
21 <http://www.gnu.org/licenses/>.  */
22
23
24 /* This module makes some simple RTL code transformations which
25    improve the subsequent register allocation.  */
26
27 #include "config.h"
28 #include "system.h"
29 #include "coretypes.h"
30 #include "tm.h"
31 #include "rtl.h"
32 #include "tm_p.h"
33 #include "insn-config.h"
34 #include "recog.h"
35 #include "target.h"
36 #include "regs.h"
37 #include "hard-reg-set.h"
38 #include "flags.h"
39 #include "function.h"
40 #include "expr.h"
41 #include "basic-block.h"
42 #include "except.h"
43 #include "diagnostic-core.h"
44 #include "reload.h"
45 #include "tree-pass.h"
46 #include "df.h"
47 #include "ira.h"
48
49 static int optimize_reg_copy_1 (rtx, rtx, rtx);
50 static void optimize_reg_copy_2 (rtx, rtx, rtx);
51 static void optimize_reg_copy_3 (rtx, rtx, rtx);
52 static void copy_src_to_dest (rtx, rtx, rtx);
53
54 enum match_use
55 {
56   READ,
57   WRITE,
58   READWRITE
59 };
60
61 struct match {
62   int with[MAX_RECOG_OPERANDS];
63   enum match_use use[MAX_RECOG_OPERANDS];
64   int commutative[MAX_RECOG_OPERANDS];
65   int early_clobber[MAX_RECOG_OPERANDS];
66 };
67
68 static int find_matches (rtx, struct match *);
69 static int fixup_match_2 (rtx, rtx, rtx, rtx);
70
71 /* Return nonzero if registers with CLASS1 and CLASS2 can be merged without
72    causing too much register allocation problems.  */
73 static int
74 regclass_compatible_p (reg_class_t class0, reg_class_t class1)
75 {
76   return (class0 == class1
77           || (reg_class_subset_p (class0, class1)
78               && ! targetm.class_likely_spilled_p (class0))
79           || (reg_class_subset_p (class1, class0)
80               && ! targetm.class_likely_spilled_p (class1)));
81 }
82
83 \f
84 #ifdef AUTO_INC_DEC
85
86 /* Find the place in the rtx X where REG is used as a memory address.
87    Return the MEM rtx that so uses it.
88    If PLUSCONST is nonzero, search instead for a memory address equivalent to
89    (plus REG (const_int PLUSCONST)).
90
91    If such an address does not appear, return 0.
92    If REG appears more than once, or is used other than in such an address,
93    return (rtx) 1.  */
94
95 static rtx
96 find_use_as_address (rtx x, rtx reg, HOST_WIDE_INT plusconst)
97 {
98   enum rtx_code code = GET_CODE (x);
99   const char * const fmt = GET_RTX_FORMAT (code);
100   int i;
101   rtx value = 0;
102   rtx tem;
103
104   if (code == MEM && XEXP (x, 0) == reg && plusconst == 0)
105     return x;
106
107   if (code == MEM && GET_CODE (XEXP (x, 0)) == PLUS
108       && XEXP (XEXP (x, 0), 0) == reg
109       && CONST_INT_P (XEXP (XEXP (x, 0), 1))
110       && INTVAL (XEXP (XEXP (x, 0), 1)) == plusconst)
111     return x;
112
113   if (code == SIGN_EXTRACT || code == ZERO_EXTRACT)
114     {
115       /* If REG occurs inside a MEM used in a bit-field reference,
116          that is unacceptable.  */
117       if (find_use_as_address (XEXP (x, 0), reg, 0) != 0)
118         return (rtx) (size_t) 1;
119     }
120
121   if (x == reg)
122     return (rtx) (size_t) 1;
123
124   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
125     {
126       if (fmt[i] == 'e')
127         {
128           tem = find_use_as_address (XEXP (x, i), reg, plusconst);
129           if (value == 0)
130             value = tem;
131           else if (tem != 0)
132             return (rtx) (size_t) 1;
133         }
134       else if (fmt[i] == 'E')
135         {
136           int j;
137           for (j = XVECLEN (x, i) - 1; j >= 0; j--)
138             {
139               tem = find_use_as_address (XVECEXP (x, i, j), reg, plusconst);
140               if (value == 0)
141                 value = tem;
142               else if (tem != 0)
143                 return (rtx) (size_t) 1;
144             }
145         }
146     }
147
148   return value;
149 }
150
151
152 /* INC_INSN is an instruction that adds INCREMENT to REG.
153    Try to fold INC_INSN as a post/pre in/decrement into INSN.
154    Iff INC_INSN_SET is nonzero, inc_insn has a destination different from src.
155    Return nonzero for success.  */
156 static int
157 try_auto_increment (rtx insn, rtx inc_insn, rtx inc_insn_set, rtx reg,
158                     HOST_WIDE_INT increment, int pre)
159 {
160   enum rtx_code inc_code;
161
162   rtx pset = single_set (insn);
163   if (pset)
164     {
165       /* Can't use the size of SET_SRC, we might have something like
166          (sign_extend:SI (mem:QI ...  */
167       rtx use = find_use_as_address (pset, reg, 0);
168       if (use != 0 && use != (rtx) (size_t) 1)
169         {
170           int size = GET_MODE_SIZE (GET_MODE (use));
171           if (0
172               || (HAVE_POST_INCREMENT
173                   && pre == 0 && (inc_code = POST_INC, increment == size))
174               || (HAVE_PRE_INCREMENT
175                   && pre == 1 && (inc_code = PRE_INC, increment == size))
176               || (HAVE_POST_DECREMENT
177                   && pre == 0 && (inc_code = POST_DEC, increment == -size))
178               || (HAVE_PRE_DECREMENT
179                   && pre == 1 && (inc_code = PRE_DEC, increment == -size))
180           )
181             {
182               if (inc_insn_set)
183                 validate_change
184                   (inc_insn,
185                    &SET_SRC (inc_insn_set),
186                    XEXP (SET_SRC (inc_insn_set), 0), 1);
187               validate_change (insn, &XEXP (use, 0),
188                                gen_rtx_fmt_e (inc_code,
189                                               GET_MODE (XEXP (use, 0)), reg),
190                                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_REG_NOTE_KIND (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 #endif
215
216 \f
217 static int *regno_src_regno;
218
219 /* INSN is a copy from SRC to DEST, both registers, and SRC does not die
220    in INSN.
221
222    Search forward to see if SRC dies before either it or DEST is modified,
223    but don't scan past the end of a basic block.  If so, we can replace SRC
224    with DEST and let SRC die in INSN.
225
226    This will reduce the number of registers live in that range and may enable
227    DEST to be tied to SRC, thus often saving one register in addition to a
228    register-register copy.  */
229
230 static int
231 optimize_reg_copy_1 (rtx insn, rtx dest, rtx src)
232 {
233   rtx p, q;
234   rtx note;
235   rtx dest_death = 0;
236   int sregno = REGNO (src);
237   int dregno = REGNO (dest);
238   basic_block bb = BLOCK_FOR_INSN (insn);
239
240   /* We don't want to mess with hard regs if register classes are small.  */
241   if (sregno == dregno
242       || (targetm.small_register_classes_for_mode_p (GET_MODE (src))
243           && (sregno < FIRST_PSEUDO_REGISTER
244               || dregno < FIRST_PSEUDO_REGISTER))
245       /* We don't see all updates to SP if they are in an auto-inc memory
246          reference, so we must disallow this optimization on them.  */
247       || sregno == STACK_POINTER_REGNUM || dregno == STACK_POINTER_REGNUM)
248     return 0;
249
250   for (p = NEXT_INSN (insn); p; p = NEXT_INSN (p))
251     {
252       if (! INSN_P (p))
253         continue;
254       if (BLOCK_FOR_INSN (p) != bb)
255         break;
256
257       if (reg_set_p (src, p) || reg_set_p (dest, p)
258           /* If SRC is an asm-declared register, it must not be replaced
259              in any asm.  Unfortunately, the REG_EXPR tree for the asm
260              variable may be absent in the SRC rtx, so we can't check the
261              actual register declaration easily (the asm operand will have
262              it, though).  To avoid complicating the test for a rare case,
263              we just don't perform register replacement for a hard reg
264              mentioned in an asm.  */
265           || (sregno < FIRST_PSEUDO_REGISTER
266               && asm_noperands (PATTERN (p)) >= 0
267               && reg_overlap_mentioned_p (src, PATTERN (p)))
268           /* Don't change hard registers used by a call.  */
269           || (CALL_P (p) && sregno < FIRST_PSEUDO_REGISTER
270               && find_reg_fusage (p, USE, src))
271           /* Don't change a USE of a register.  */
272           || (GET_CODE (PATTERN (p)) == USE
273               && reg_overlap_mentioned_p (src, XEXP (PATTERN (p), 0))))
274         break;
275
276       /* See if all of SRC dies in P.  This test is slightly more
277          conservative than it needs to be.  */
278       if ((note = find_regno_note (p, REG_DEAD, sregno)) != 0
279           && GET_MODE (XEXP (note, 0)) == GET_MODE (src))
280         {
281           int failed = 0;
282           int d_length = 0;
283           int s_length = 0;
284           int d_n_calls = 0;
285           int s_n_calls = 0;
286           int s_freq_calls = 0;
287           int d_freq_calls = 0;
288
289           /* We can do the optimization.  Scan forward from INSN again,
290              replacing regs as we go.  Set FAILED if a replacement can't
291              be done.  In that case, we can't move the death note for SRC.
292              This should be rare.  */
293
294           /* Set to stop at next insn.  */
295           for (q = next_real_insn (insn);
296                q != next_real_insn (p);
297                q = next_real_insn (q))
298             {
299               if (reg_overlap_mentioned_p (src, PATTERN (q)))
300                 {
301                   /* If SRC is a hard register, we might miss some
302                      overlapping registers with validate_replace_rtx,
303                      so we would have to undo it.  We can't if DEST is
304                      present in the insn, so fail in that combination
305                      of cases.  */
306                   if (sregno < FIRST_PSEUDO_REGISTER
307                       && reg_mentioned_p (dest, PATTERN (q)))
308                     failed = 1;
309
310                   /* Attempt to replace all uses.  */
311                   else if (!validate_replace_rtx (src, dest, q))
312                     failed = 1;
313
314                   /* If this succeeded, but some part of the register
315                      is still present, undo the replacement.  */
316                   else if (sregno < FIRST_PSEUDO_REGISTER
317                            && reg_overlap_mentioned_p (src, PATTERN (q)))
318                     {
319                       validate_replace_rtx (dest, src, q);
320                       failed = 1;
321                     }
322                 }
323
324               /* For SREGNO, count the total number of insns scanned.
325                  For DREGNO, count the total number of insns scanned after
326                  passing the death note for DREGNO.  */
327               if (!DEBUG_INSN_P (p))
328                 {
329                   s_length++;
330                   if (dest_death)
331                     d_length++;
332                 }
333
334               /* If the insn in which SRC dies is a CALL_INSN, don't count it
335                  as a call that has been crossed.  Otherwise, count it.  */
336               if (q != p && CALL_P (q))
337                 {
338                   /* Similarly, total calls for SREGNO, total calls beyond
339                      the death note for DREGNO.  */
340                   s_n_calls++;
341                   s_freq_calls += REG_FREQ_FROM_BB  (BLOCK_FOR_INSN (q));
342                   if (dest_death)
343                     {
344                       d_n_calls++;
345                       d_freq_calls += REG_FREQ_FROM_BB  (BLOCK_FOR_INSN (q));
346                     }
347                 }
348
349               /* If DEST dies here, remove the death note and save it for
350                  later.  Make sure ALL of DEST dies here; again, this is
351                  overly conservative.  */
352               if (dest_death == 0
353                   && (dest_death = find_regno_note (q, REG_DEAD, dregno)) != 0)
354                 {
355                   if (GET_MODE (XEXP (dest_death, 0)) != GET_MODE (dest))
356                     failed = 1, dest_death = 0;
357                   else
358                     remove_note (q, dest_death);
359                 }
360             }
361
362           if (! failed)
363             {
364               /* These counters need to be updated if and only if we are
365                  going to move the REG_DEAD note.  */
366               if (sregno >= FIRST_PSEUDO_REGISTER)
367                 {
368                   if (REG_LIVE_LENGTH (sregno) >= 0)
369                     {
370                       REG_LIVE_LENGTH (sregno) -= s_length;
371                       /* REG_LIVE_LENGTH is only an approximation after
372                          combine if sched is not run, so make sure that we
373                          still have a reasonable value.  */
374                       if (REG_LIVE_LENGTH (sregno) < 2)
375                         REG_LIVE_LENGTH (sregno) = 2;
376                     }
377
378                   REG_N_CALLS_CROSSED (sregno) -= s_n_calls;
379                   REG_FREQ_CALLS_CROSSED (sregno) -= s_freq_calls;
380                 }
381
382               /* Move death note of SRC from P to INSN.  */
383               remove_note (p, note);
384               XEXP (note, 1) = REG_NOTES (insn);
385               REG_NOTES (insn) = note;
386             }
387
388           /* DEST is also dead if INSN has a REG_UNUSED note for DEST.  */
389           if (! dest_death
390               && (dest_death = find_regno_note (insn, REG_UNUSED, dregno)))
391             {
392               PUT_REG_NOTE_KIND (dest_death, REG_DEAD);
393               remove_note (insn, dest_death);
394             }
395
396           /* Put death note of DEST on P if we saw it die.  */
397           if (dest_death)
398             {
399               XEXP (dest_death, 1) = REG_NOTES (p);
400               REG_NOTES (p) = dest_death;
401
402               if (dregno >= FIRST_PSEUDO_REGISTER)
403                 {
404                   /* If and only if we are moving the death note for DREGNO,
405                      then we need to update its counters.  */
406                   if (REG_LIVE_LENGTH (dregno) >= 0)
407                     REG_LIVE_LENGTH (dregno) += d_length;
408                   REG_N_CALLS_CROSSED (dregno) += d_n_calls;
409                   REG_FREQ_CALLS_CROSSED (dregno) += d_freq_calls;
410                 }
411             }
412
413           return ! failed;
414         }
415
416       /* If SRC is a hard register which is set or killed in some other
417          way, we can't do this optimization.  */
418       else if (sregno < FIRST_PSEUDO_REGISTER
419                && dead_or_set_p (p, src))
420         break;
421     }
422   return 0;
423 }
424 \f
425 /* INSN is a copy of SRC to DEST, in which SRC dies.  See if we now have
426    a sequence of insns that modify DEST followed by an insn that sets
427    SRC to DEST in which DEST dies, with no prior modification of DEST.
428    (There is no need to check if the insns in between actually modify
429    DEST.  We should not have cases where DEST is not modified, but
430    the optimization is safe if no such modification is detected.)
431    In that case, we can replace all uses of DEST, starting with INSN and
432    ending with the set of SRC to DEST, with SRC.  We do not do this
433    optimization if a CALL_INSN is crossed unless SRC already crosses a
434    call or if DEST dies before the copy back to SRC.
435
436    It is assumed that DEST and SRC are pseudos; it is too complicated to do
437    this for hard registers since the substitutions we may make might fail.  */
438
439 static void
440 optimize_reg_copy_2 (rtx insn, rtx dest, rtx src)
441 {
442   rtx p, q;
443   rtx set;
444   int sregno = REGNO (src);
445   int dregno = REGNO (dest);
446   basic_block bb = BLOCK_FOR_INSN (insn);
447
448   for (p = NEXT_INSN (insn); p; p = NEXT_INSN (p))
449     {
450       if (! INSN_P (p))
451         continue;
452       if (BLOCK_FOR_INSN (p) != bb)
453         break;
454
455       set = single_set (p);
456       if (set && SET_SRC (set) == dest && SET_DEST (set) == src
457           && find_reg_note (p, REG_DEAD, dest))
458         {
459           /* We can do the optimization.  Scan forward from INSN again,
460              replacing regs as we go.  */
461
462           /* Set to stop at next insn.  */
463           for (q = insn; q != NEXT_INSN (p); q = NEXT_INSN (q))
464             if (INSN_P (q))
465               {
466                 if (reg_mentioned_p (dest, PATTERN (q)))
467                   {
468                     rtx note;
469
470                     PATTERN (q) = replace_rtx (PATTERN (q), dest, src);
471                     note = FIND_REG_INC_NOTE (q, dest);
472                     if (note)
473                       {
474                         remove_note (q, note);
475                         add_reg_note (q, REG_INC, src);
476                       }
477                     df_insn_rescan (q);
478                   }
479
480                 if (CALL_P (q))
481                   {
482                     int freq = REG_FREQ_FROM_BB  (BLOCK_FOR_INSN (q));
483                     REG_N_CALLS_CROSSED (dregno)--;
484                     REG_N_CALLS_CROSSED (sregno)++;
485                     REG_FREQ_CALLS_CROSSED (dregno) -= freq;
486                     REG_FREQ_CALLS_CROSSED (sregno) += freq;
487                   }
488               }
489
490           remove_note (p, find_reg_note (p, REG_DEAD, dest));
491           REG_N_DEATHS (dregno)--;
492           remove_note (insn, find_reg_note (insn, REG_DEAD, src));
493           REG_N_DEATHS (sregno)--;
494           return;
495         }
496
497       if (reg_set_p (src, p)
498           || find_reg_note (p, REG_DEAD, dest)
499           || (CALL_P (p) && REG_N_CALLS_CROSSED (sregno) == 0))
500         break;
501     }
502 }
503
504 /* INSN is a ZERO_EXTEND or SIGN_EXTEND of SRC to DEST.
505    Look if SRC dies there, and if it is only set once, by loading
506    it from memory.  If so, try to incorporate the zero/sign extension
507    into the memory read, change SRC to the mode of DEST, and alter
508    the remaining accesses to use the appropriate SUBREG.  This allows
509    SRC and DEST to be tied later.  */
510 static void
511 optimize_reg_copy_3 (rtx insn, rtx dest, rtx src)
512 {
513   rtx src_reg = XEXP (src, 0);
514   int src_no = REGNO (src_reg);
515   int dst_no = REGNO (dest);
516   rtx p, set, set_insn;
517   enum machine_mode old_mode;
518   basic_block bb = BLOCK_FOR_INSN (insn);
519
520   if (src_no < FIRST_PSEUDO_REGISTER
521       || dst_no < FIRST_PSEUDO_REGISTER
522       || ! find_reg_note (insn, REG_DEAD, src_reg)
523       || REG_N_DEATHS (src_no) != 1
524       || REG_N_SETS (src_no) != 1)
525     return;
526
527   for (p = PREV_INSN (insn); p && ! reg_set_p (src_reg, p); p = PREV_INSN (p))
528     if (INSN_P (p) && BLOCK_FOR_INSN (p) != bb)
529       break;
530
531   if (! p || BLOCK_FOR_INSN (p) != bb)
532     return;
533
534   if (! (set = single_set (p))
535       || !MEM_P (SET_SRC (set))
536       /* If there's a REG_EQUIV note, this must be an insn that loads an
537          argument.  Prefer keeping the note over doing this optimization.  */
538       || find_reg_note (p, REG_EQUIV, NULL_RTX)
539       || SET_DEST (set) != src_reg)
540     return;
541
542   /* Be conservative: although this optimization is also valid for
543      volatile memory references, that could cause trouble in later passes.  */
544   if (MEM_VOLATILE_P (SET_SRC (set)))
545     return;
546
547   /* Do not use a SUBREG to truncate from one mode to another if truncation
548      is not a nop.  */
549   if (GET_MODE_BITSIZE (GET_MODE (src_reg)) <= GET_MODE_BITSIZE (GET_MODE (src))
550       && !TRULY_NOOP_TRUNCATION_MODES_P (GET_MODE (src), GET_MODE (src_reg)))
551     return;
552
553   set_insn = p;
554   old_mode = GET_MODE (src_reg);
555   PUT_MODE (src_reg, GET_MODE (src));
556   XEXP (src, 0) = SET_SRC (set);
557
558   /* Include this change in the group so that it's easily undone if
559      one of the changes in the group is invalid.  */
560   validate_change (p, &SET_SRC (set), src, 1);
561
562   /* Now walk forward making additional replacements.  We want to be able
563      to undo all the changes if a later substitution fails.  */
564   while (p = NEXT_INSN (p), p != insn)
565     {
566       if (! INSN_P (p))
567         continue;
568
569       /* Make a tentative change.  */
570       validate_replace_rtx_group (src_reg,
571                                   gen_lowpart_SUBREG (old_mode, src_reg),
572                                   p);
573     }
574
575   validate_replace_rtx_group (src, src_reg, insn);
576
577   /* Now see if all the changes are valid.  */
578   if (! apply_change_group ())
579     {
580       /* One or more changes were no good.  Back out everything.  */
581       PUT_MODE (src_reg, old_mode);
582       XEXP (src, 0) = src_reg;
583     }
584   else
585     {
586       rtx note = find_reg_note (set_insn, REG_EQUAL, NULL_RTX);
587       if (note)
588         {
589           if (rtx_equal_p (XEXP (note, 0), XEXP (src, 0)))
590             {
591               XEXP (note, 0)
592                 = gen_rtx_fmt_e (GET_CODE (src), GET_MODE (src),
593                                  XEXP (note, 0));
594               df_notes_rescan (set_insn);
595             }
596           else
597             remove_note (set_insn, note);
598         }
599     }
600 }
601
602 \f
603 /* If we were not able to update the users of src to use dest directly, try
604    instead moving the value to dest directly before the operation.  */
605
606 static void
607 copy_src_to_dest (rtx insn, rtx src, rtx dest)
608 {
609   rtx seq;
610   rtx link;
611   rtx next;
612   rtx set;
613   rtx move_insn;
614   rtx *p_insn_notes;
615   rtx *p_move_notes;
616   int src_regno;
617   int dest_regno;
618
619   /* A REG_LIVE_LENGTH of -1 indicates the register is equivalent to a constant
620      or memory location and is used infrequently; a REG_LIVE_LENGTH of -2 is
621      parameter when there is no frame pointer that is not allocated a register.
622      For now, we just reject them, rather than incrementing the live length.  */
623
624   if (REG_P (src)
625       && REG_LIVE_LENGTH (REGNO (src)) > 0
626       && REG_P (dest)
627       && REG_LIVE_LENGTH (REGNO (dest)) > 0
628       && (set = single_set (insn)) != NULL_RTX
629       && !reg_mentioned_p (dest, SET_SRC (set))
630       && GET_MODE (src) == GET_MODE (dest))
631     {
632       int old_num_regs = reg_rtx_no;
633
634       /* Generate the src->dest move.  */
635       start_sequence ();
636       emit_move_insn (dest, src);
637       seq = get_insns ();
638       end_sequence ();
639       /* If this sequence uses new registers, we may not use it.  */
640       if (old_num_regs != reg_rtx_no
641           || ! validate_replace_rtx (src, dest, insn))
642         {
643           /* We have to restore reg_rtx_no to its old value, lest
644              recompute_reg_usage will try to compute the usage of the
645              new regs, yet reg_n_info is not valid for them.  */
646           reg_rtx_no = old_num_regs;
647           return;
648         }
649       emit_insn_before (seq, insn);
650       move_insn = PREV_INSN (insn);
651       p_move_notes = &REG_NOTES (move_insn);
652       p_insn_notes = &REG_NOTES (insn);
653
654       /* Move any notes mentioning src to the move instruction.  */
655       for (link = REG_NOTES (insn); link != NULL_RTX; link = next)
656         {
657           next = XEXP (link, 1);
658           if (XEXP (link, 0) == src)
659             {
660               *p_move_notes = link;
661               p_move_notes = &XEXP (link, 1);
662             }
663           else
664             {
665               *p_insn_notes = link;
666               p_insn_notes = &XEXP (link, 1);
667             }
668         }
669
670       *p_move_notes = NULL_RTX;
671       *p_insn_notes = NULL_RTX;
672
673       /* Update the various register tables.  */
674       dest_regno = REGNO (dest);
675       INC_REG_N_SETS (dest_regno, 1);
676       REG_LIVE_LENGTH (dest_regno)++;
677       src_regno = REGNO (src);
678       if (! find_reg_note (move_insn, REG_DEAD, src))
679         REG_LIVE_LENGTH (src_regno)++;
680     }
681 }
682
683 /* reg_set_in_bb[REGNO] points to basic block iff the register is set
684    only once in the given block and has REG_EQUAL note.  */
685
686 static basic_block *reg_set_in_bb;
687
688 /* Size of reg_set_in_bb array.  */
689 static unsigned int max_reg_computed;
690
691 \f
692 /* Return whether REG is set in only one location, and is set to a
693    constant, but is set in a different basic block from INSN (an
694    instructions which uses REG).  In this case REG is equivalent to a
695    constant, and we don't want to break that equivalence, because that
696    may increase register pressure and make reload harder.  If REG is
697    set in the same basic block as INSN, we don't worry about it,
698    because we'll probably need a register anyhow (??? but what if REG
699    is used in a different basic block as well as this one?).  */
700
701 static bool
702 reg_is_remote_constant_p (rtx reg, rtx insn)
703 {
704   basic_block bb;
705   rtx p;
706   int max;
707
708   if (!reg_set_in_bb)
709     {
710       max_reg_computed = max = max_reg_num ();
711       reg_set_in_bb = XCNEWVEC (basic_block, max);
712
713       FOR_EACH_BB (bb)
714         FOR_BB_INSNS (bb, p)
715           {
716             rtx s;
717
718             if (!INSN_P (p))
719               continue;
720             s = single_set (p);
721             /* This is the instruction which sets REG.  If there is a
722                REG_EQUAL note, then REG is equivalent to a constant.  */
723             if (s != 0
724                 && REG_P (SET_DEST (s))
725                 && REG_N_SETS (REGNO (SET_DEST (s))) == 1
726                 && find_reg_note (p, REG_EQUAL, NULL_RTX))
727               reg_set_in_bb[REGNO (SET_DEST (s))] = bb;
728           }
729     }
730
731   gcc_assert (REGNO (reg) < max_reg_computed);
732   if (reg_set_in_bb[REGNO (reg)] == NULL)
733     return false;
734   return (reg_set_in_bb[REGNO (reg)] != BLOCK_FOR_INSN (insn));
735 }
736
737 /* INSN is adding a CONST_INT to a REG.  We search backwards looking for
738    another add immediate instruction with the same source and dest registers,
739    and if we find one, we change INSN to an increment, and return 1.  If
740    no changes are made, we return 0.
741
742    This changes
743      (set (reg100) (plus reg1 offset1))
744      ...
745      (set (reg100) (plus reg1 offset2))
746    to
747      (set (reg100) (plus reg1 offset1))
748      ...
749      (set (reg100) (plus reg100 offset2-offset1))  */
750
751 /* ??? What does this comment mean?  */
752 /* cse disrupts preincrement / postdecrement sequences when it finds a
753    hard register as ultimate source, like the frame pointer.  */
754
755 static int
756 fixup_match_2 (rtx insn, rtx dst, rtx src, rtx offset)
757 {
758   rtx p, dst_death = 0;
759   int length, num_calls = 0, freq_calls = 0;
760   basic_block bb = BLOCK_FOR_INSN (insn);
761
762   /* If SRC dies in INSN, we'd have to move the death note.  This is
763      considered to be very unlikely, so we just skip the optimization
764      in this case.  */
765   if (find_regno_note (insn, REG_DEAD, REGNO (src)))
766     return 0;
767
768   /* Scan backward to find the first instruction that sets DST.  */
769
770   for (length = 0, p = PREV_INSN (insn); p; p = PREV_INSN (p))
771     {
772       rtx pset;
773
774       if (! INSN_P (p))
775         continue;
776       if (BLOCK_FOR_INSN (p) != bb)
777         break;
778
779       if (find_regno_note (p, REG_DEAD, REGNO (dst)))
780         dst_death = p;
781       if (! dst_death && !DEBUG_INSN_P (p))
782         length++;
783
784       pset = single_set (p);
785       if (pset && SET_DEST (pset) == dst
786           && GET_CODE (SET_SRC (pset)) == PLUS
787           && XEXP (SET_SRC (pset), 0) == src
788           && CONST_INT_P (XEXP (SET_SRC (pset), 1)))
789         {
790           HOST_WIDE_INT newconst
791             = INTVAL (offset) - INTVAL (XEXP (SET_SRC (pset), 1));
792           rtx add = gen_add3_insn (dst, dst, GEN_INT (newconst));
793
794           if (add && validate_change (insn, &PATTERN (insn), add, 0))
795             {
796               /* Remove the death note for DST from DST_DEATH.  */
797               if (dst_death)
798                 {
799                   remove_death (REGNO (dst), dst_death);
800                   REG_LIVE_LENGTH (REGNO (dst)) += length;
801                   REG_N_CALLS_CROSSED (REGNO (dst)) += num_calls;
802                   REG_FREQ_CALLS_CROSSED (REGNO (dst)) += freq_calls;
803                 }
804
805               if (dump_file)
806                 fprintf (dump_file,
807                          "Fixed operand of insn %d.\n",
808                           INSN_UID (insn));
809
810 #ifdef AUTO_INC_DEC
811               for (p = PREV_INSN (insn); p; p = PREV_INSN (p))
812                 {
813                   if (! INSN_P (p))
814                     continue;
815                   if (BLOCK_FOR_INSN (p) != bb)
816                     break;
817                   if (reg_overlap_mentioned_p (dst, PATTERN (p)))
818                     {
819                       if (try_auto_increment (p, insn, 0, dst, newconst, 0))
820                         return 1;
821                       break;
822                     }
823                 }
824               for (p = NEXT_INSN (insn); p; p = NEXT_INSN (p))
825                 {
826                   if (! INSN_P (p))
827                     continue;
828                   if (BLOCK_FOR_INSN (p) != bb)
829                     break;
830                   if (reg_overlap_mentioned_p (dst, PATTERN (p)))
831                     {
832                       try_auto_increment (p, insn, 0, dst, newconst, 1);
833                       break;
834                     }
835                 }
836 #endif
837               return 1;
838             }
839         }
840
841       if (reg_set_p (dst, PATTERN (p)))
842         break;
843
844       /* If we have passed a call instruction, and the
845          pseudo-reg SRC is not already live across a call,
846          then don't perform the optimization.  */
847       /* reg_set_p is overly conservative for CALL_INSNS, thinks that all
848          hard regs are clobbered.  Thus, we only use it for src for
849          non-call insns.  */
850       if (CALL_P (p))
851         {
852           if (! dst_death)
853             {
854               num_calls++;
855               freq_calls += REG_FREQ_FROM_BB  (BLOCK_FOR_INSN (p));
856             }
857
858           if (REG_N_CALLS_CROSSED (REGNO (src)) == 0)
859             break;
860
861           if ((HARD_REGISTER_P (dst) && call_used_regs [REGNO (dst)])
862               || find_reg_fusage (p, CLOBBER, dst))
863             break;
864         }
865       else if (reg_set_p (src, PATTERN (p)))
866         break;
867     }
868
869   return 0;
870 }
871
872 /* A forward pass.  Replace output operands with input operands.  */
873
874 static void
875 regmove_forward_pass (void)
876 {
877   basic_block bb;
878   rtx insn;
879
880   if (! flag_expensive_optimizations)
881     return;
882
883   if (dump_file)
884     fprintf (dump_file, "Starting forward pass...\n");
885
886   FOR_EACH_BB (bb)
887     {
888       FOR_BB_INSNS (bb, insn)
889         {
890           rtx set = single_set (insn);
891           if (! set)
892             continue;
893
894           if ((GET_CODE (SET_SRC (set)) == SIGN_EXTEND
895                || GET_CODE (SET_SRC (set)) == ZERO_EXTEND)
896               && REG_P (XEXP (SET_SRC (set), 0))
897               && REG_P (SET_DEST (set)))
898             optimize_reg_copy_3 (insn, SET_DEST (set), SET_SRC (set));
899
900           if (REG_P (SET_SRC (set))
901               && REG_P (SET_DEST (set)))
902             {
903               /* If this is a register-register copy where SRC is not dead,
904                  see if we can optimize it.  If this optimization succeeds,
905                  it will become a copy where SRC is dead.  */
906               if ((find_reg_note (insn, REG_DEAD, SET_SRC (set))
907                    || optimize_reg_copy_1 (insn, SET_DEST (set), SET_SRC (set)))
908                   && REGNO (SET_DEST (set)) >= FIRST_PSEUDO_REGISTER)
909                 {
910                   /* Similarly for a pseudo-pseudo copy when SRC is dead.  */
911                   if (REGNO (SET_SRC (set)) >= FIRST_PSEUDO_REGISTER)
912                     optimize_reg_copy_2 (insn, SET_DEST (set), SET_SRC (set));
913                   if (regno_src_regno[REGNO (SET_DEST (set))] < 0
914                       && SET_SRC (set) != SET_DEST (set))
915                     {
916                       int srcregno = REGNO (SET_SRC (set));
917                       if (regno_src_regno[srcregno] >= 0)
918                         srcregno = regno_src_regno[srcregno];
919                       regno_src_regno[REGNO (SET_DEST (set))] = srcregno;
920                     }
921                 }
922             }
923         }
924     }
925 }
926
927 /* A backward pass.  Replace input operands with output operands.  */
928
929 static void
930 regmove_backward_pass (void)
931 {
932   basic_block bb;
933   rtx insn, prev;
934
935   if (dump_file)
936     fprintf (dump_file, "Starting backward pass...\n");
937
938   FOR_EACH_BB_REVERSE (bb)
939     {
940       /* ??? Use the safe iterator because fixup_match_2 can remove
941              insns via try_auto_increment.  */
942       FOR_BB_INSNS_REVERSE_SAFE (bb, insn, prev)
943         {
944           struct match match;
945           rtx copy_src, copy_dst;
946           int op_no, match_no;
947           int success = 0;
948
949           if (! INSN_P (insn))
950             continue;
951
952           if (! find_matches (insn, &match))
953             continue;
954
955           /* Now scan through the operands looking for a destination operand
956              which is supposed to match a source operand.
957              Then scan backward for an instruction which sets the source
958              operand.  If safe, then replace the source operand with the
959              dest operand in both instructions.  */
960
961           copy_src = NULL_RTX;
962           copy_dst = NULL_RTX;
963           for (op_no = 0; op_no < recog_data.n_operands; op_no++)
964             {
965               rtx set, p, src, dst;
966               rtx src_note, dst_note;
967               int num_calls = 0, freq_calls = 0;
968               enum reg_class src_class, dst_class;
969               int length;
970
971               match_no = match.with[op_no];
972
973               /* Nothing to do if the two operands aren't supposed to match.  */
974               if (match_no < 0)
975                 continue;
976
977               dst = recog_data.operand[match_no];
978               src = recog_data.operand[op_no];
979
980               if (!REG_P (src))
981                 continue;
982
983               if (!REG_P (dst)
984                   || REGNO (dst) < FIRST_PSEUDO_REGISTER
985                   || REG_LIVE_LENGTH (REGNO (dst)) < 0
986                   || GET_MODE (src) != GET_MODE (dst))
987                 continue;
988
989               /* If the operands already match, then there is nothing to do.  */
990               if (operands_match_p (src, dst))
991                 continue;
992
993               if (match.commutative[op_no] >= 0)
994                 {
995                   rtx comm = recog_data.operand[match.commutative[op_no]];
996                   if (operands_match_p (comm, dst))
997                     continue;
998                 }
999
1000               set = single_set (insn);
1001               if (! set)
1002                 continue;
1003
1004               /* Note that single_set ignores parts of a parallel set for
1005                  which one of the destinations is REG_UNUSED.  We can't
1006                  handle that here, since we can wind up rewriting things
1007                  such that a single register is set twice within a single
1008                  parallel.  */
1009               if (reg_set_p (src, insn))
1010                 continue;
1011
1012               /* match_no/dst must be a write-only operand, and
1013                  operand_operand/src must be a read-only operand.  */
1014               if (match.use[op_no] != READ
1015                   || match.use[match_no] != WRITE)
1016                 continue;
1017
1018               if (match.early_clobber[match_no]
1019                   && count_occurrences (PATTERN (insn), src, 0) > 1)
1020                 continue;
1021
1022               /* Make sure match_no is the destination.  */
1023               if (recog_data.operand[match_no] != SET_DEST (set))
1024                 continue;
1025
1026               if (REGNO (src) < FIRST_PSEUDO_REGISTER)
1027                 {
1028                   if (GET_CODE (SET_SRC (set)) == PLUS
1029                       && CONST_INT_P (XEXP (SET_SRC (set), 1))
1030                       && XEXP (SET_SRC (set), 0) == src
1031                       && fixup_match_2 (insn, dst, src,
1032                                         XEXP (SET_SRC (set), 1)))
1033                     break;
1034                   continue;
1035                 }
1036               src_class = reg_preferred_class (REGNO (src));
1037               dst_class = reg_preferred_class (REGNO (dst));
1038
1039               if (! (src_note = find_reg_note (insn, REG_DEAD, src)))
1040                 {
1041                   /* We used to force the copy here like in other cases, but
1042                      it produces worse code, as it eliminates no copy
1043                      instructions and the copy emitted will be produced by
1044                      reload anyway.  On patterns with multiple alternatives,
1045                      there may be better solution available.
1046
1047                      In particular this change produced slower code for numeric
1048                      i387 programs.  */
1049
1050                   continue;
1051                 }
1052
1053               if (! regclass_compatible_p (src_class, dst_class))
1054                 {
1055                   if (!copy_src)
1056                     {
1057                       copy_src = src;
1058                       copy_dst = dst;
1059                     }
1060                   continue;
1061                 }
1062
1063               /* Can not modify an earlier insn to set dst if this insn
1064                  uses an old value in the source.  */
1065               if (reg_overlap_mentioned_p (dst, SET_SRC (set)))
1066                 {
1067                   if (!copy_src)
1068                     {
1069                       copy_src = src;
1070                       copy_dst = dst;
1071                     }
1072                   continue;
1073                 }
1074
1075               /* If src is set once in a different basic block,
1076                  and is set equal to a constant, then do not use
1077                  it for this optimization, as this would make it
1078                  no longer equivalent to a constant.  */
1079
1080               if (reg_is_remote_constant_p (src, insn))
1081                 {
1082                   if (!copy_src)
1083                     {
1084                       copy_src = src;
1085                       copy_dst = dst;
1086                     }
1087                   continue;
1088                 }
1089
1090
1091               if (dump_file)
1092                 fprintf (dump_file,
1093                          "Could fix operand %d of insn %d matching operand %d.\n",
1094                          op_no, INSN_UID (insn), match_no);
1095
1096               /* Scan backward to find the first instruction that uses
1097                  the input operand.  If the operand is set here, then
1098                  replace it in both instructions with match_no.  */
1099
1100               for (length = 0, p = PREV_INSN (insn); p; p = PREV_INSN (p))
1101                 {
1102                   rtx pset;
1103
1104                   if (! INSN_P (p))
1105                     continue;
1106                   if (BLOCK_FOR_INSN (p) != bb)
1107                     break;
1108
1109                   if (!DEBUG_INSN_P (p))
1110                     length++;
1111
1112                   /* ??? See if all of SRC is set in P.  This test is much
1113                      more conservative than it needs to be.  */
1114                   pset = single_set (p);
1115                   if (pset && SET_DEST (pset) == src)
1116                     {
1117                       /* We use validate_replace_rtx, in case there
1118                          are multiple identical source operands.  All
1119                          of them have to be changed at the same time:
1120                          when validate_replace_rtx() calls
1121                          apply_change_group().  */
1122                       validate_change (p, &SET_DEST (pset), dst, 1);
1123                       if (validate_replace_rtx (src, dst, insn))
1124                         success = 1;
1125                       break;
1126                     }
1127
1128                   /* We can't make this change if DST is mentioned at
1129                      all in P, since we are going to change its value.
1130                      We can't make this change if SRC is read or
1131                      partially written in P, since we are going to
1132                      eliminate SRC.  However, if it's a debug insn, we
1133                      can't refrain from making the change, for this
1134                      would cause codegen differences, so instead we
1135                      invalidate debug expressions that reference DST,
1136                      and adjust references to SRC in them so that they
1137                      become references to DST.  */
1138                   if (reg_mentioned_p (dst, PATTERN (p)))
1139                     {
1140                       if (DEBUG_INSN_P (p))
1141                         validate_change (p, &INSN_VAR_LOCATION_LOC (p),
1142                                          gen_rtx_UNKNOWN_VAR_LOC (), 1);
1143                       else
1144                         break;
1145                     }
1146                   if (reg_overlap_mentioned_p (src, PATTERN (p)))
1147                     {
1148                       if (DEBUG_INSN_P (p))
1149                         validate_replace_rtx_group (src, dst, p);
1150                       else
1151                         break;
1152                     }
1153
1154                   /* If we have passed a call instruction, and the
1155                      pseudo-reg DST is not already live across a call,
1156                      then don't perform the optimization.  */
1157                   if (CALL_P (p))
1158                     {
1159                       num_calls++;
1160                       freq_calls += REG_FREQ_FROM_BB  (BLOCK_FOR_INSN (p));
1161
1162                       if (REG_N_CALLS_CROSSED (REGNO (dst)) == 0)
1163                         break;
1164                     }
1165                 }
1166
1167               if (success)
1168                 {
1169                   int dstno, srcno;
1170
1171                   /* Remove the death note for SRC from INSN.  */
1172                   remove_note (insn, src_note);
1173                   /* Move the death note for SRC to P if it is used
1174                      there.  */
1175                   if (reg_overlap_mentioned_p (src, PATTERN (p)))
1176                     {
1177                       XEXP (src_note, 1) = REG_NOTES (p);
1178                       REG_NOTES (p) = src_note;
1179                     }
1180                   /* If there is a REG_DEAD note for DST on P, then remove
1181                      it, because DST is now set there.  */
1182                   if ((dst_note = find_reg_note (p, REG_DEAD, dst)))
1183                     remove_note (p, dst_note);
1184
1185                   dstno = REGNO (dst);
1186                   srcno = REGNO (src);
1187
1188                   INC_REG_N_SETS (dstno, 1);
1189                   INC_REG_N_SETS (srcno, -1);
1190
1191                   REG_N_CALLS_CROSSED (dstno) += num_calls;
1192                   REG_N_CALLS_CROSSED (srcno) -= num_calls;
1193                   REG_FREQ_CALLS_CROSSED (dstno) += freq_calls;
1194                   REG_FREQ_CALLS_CROSSED (srcno) -= freq_calls;
1195
1196                   REG_LIVE_LENGTH (dstno) += length;
1197                   if (REG_LIVE_LENGTH (srcno) >= 0)
1198                     {
1199                       REG_LIVE_LENGTH (srcno) -= length;
1200                       /* REG_LIVE_LENGTH is only an approximation after
1201                          combine if sched is not run, so make sure that we
1202                          still have a reasonable value.  */
1203                       if (REG_LIVE_LENGTH (srcno) < 2)
1204                         REG_LIVE_LENGTH (srcno) = 2;
1205                     }
1206
1207                   if (dump_file)
1208                     fprintf (dump_file,
1209                              "Fixed operand %d of insn %d matching operand %d.\n",
1210                              op_no, INSN_UID (insn), match_no);
1211
1212                   break;
1213                 }
1214               else if (num_changes_pending () > 0)
1215                 cancel_changes (0);
1216             }
1217
1218           /* If we weren't able to replace any of the alternatives, try an
1219              alternative approach of copying the source to the destination.  */
1220           if (!success && copy_src != NULL_RTX)
1221             copy_src_to_dest (insn, copy_src, copy_dst);
1222         }
1223     }
1224 }
1225
1226 /* Main entry for the register move optimization.  */
1227
1228 static unsigned int
1229 regmove_optimize (void)
1230 {
1231   int i;
1232   int nregs = max_reg_num ();
1233
1234   df_note_add_problem ();
1235   df_analyze ();
1236
1237   regstat_init_n_sets_and_refs ();
1238   regstat_compute_ri ();
1239
1240   if (flag_ira_loop_pressure)
1241     ira_set_pseudo_classes (true, dump_file);
1242
1243   regno_src_regno = XNEWVEC (int, nregs);
1244   for (i = nregs; --i >= 0; )
1245     regno_src_regno[i] = -1;
1246
1247   /* A forward pass.  Replace output operands with input operands.  */
1248   regmove_forward_pass ();
1249
1250   /* A backward pass.  Replace input operands with output operands.  */
1251   regmove_backward_pass ();
1252
1253   /* Clean up.  */
1254   free (regno_src_regno);
1255   if (reg_set_in_bb)
1256     {
1257       free (reg_set_in_bb);
1258       reg_set_in_bb = NULL;
1259     }
1260   regstat_free_n_sets_and_refs ();
1261   regstat_free_ri ();
1262   if (flag_ira_loop_pressure)
1263     free_reg_info ();
1264   return 0;
1265 }
1266
1267 /* Returns nonzero if INSN's pattern has matching constraints for any operand.
1268    Returns 0 if INSN can't be recognized, or if the alternative can't be
1269    determined.
1270
1271    Initialize the info in MATCHP based on the constraints.  */
1272
1273 static int
1274 find_matches (rtx insn, struct match *matchp)
1275 {
1276   int likely_spilled[MAX_RECOG_OPERANDS];
1277   int op_no;
1278   int any_matches = 0;
1279
1280   extract_insn (insn);
1281   if (! constrain_operands (0))
1282     return 0;
1283
1284   /* Must initialize this before main loop, because the code for
1285      the commutative case may set matches for operands other than
1286      the current one.  */
1287   for (op_no = recog_data.n_operands; --op_no >= 0; )
1288     matchp->with[op_no] = matchp->commutative[op_no] = -1;
1289
1290   for (op_no = 0; op_no < recog_data.n_operands; op_no++)
1291     {
1292       const char *p;
1293       char c;
1294       int i = 0;
1295
1296       p = recog_data.constraints[op_no];
1297
1298       likely_spilled[op_no] = 0;
1299       matchp->use[op_no] = READ;
1300       matchp->early_clobber[op_no] = 0;
1301       if (*p == '=')
1302         matchp->use[op_no] = WRITE;
1303       else if (*p == '+')
1304         matchp->use[op_no] = READWRITE;
1305
1306       for (;*p && i < which_alternative; p++)
1307         if (*p == ',')
1308           i++;
1309
1310       while ((c = *p) != '\0' && c != ',')
1311         {
1312           switch (c)
1313             {
1314             case '=':
1315               break;
1316             case '+':
1317               break;
1318             case '&':
1319               matchp->early_clobber[op_no] = 1;
1320               break;
1321             case '%':
1322               matchp->commutative[op_no] = op_no + 1;
1323               matchp->commutative[op_no + 1] = op_no;
1324               break;
1325
1326             case '0': case '1': case '2': case '3': case '4':
1327             case '5': case '6': case '7': case '8': case '9':
1328               {
1329                 char *end;
1330                 unsigned long match_ul = strtoul (p, &end, 10);
1331                 int match = match_ul;
1332
1333                 p = end;
1334
1335                 if (match < op_no && likely_spilled[match])
1336                   continue;
1337                 matchp->with[op_no] = match;
1338                 any_matches = 1;
1339                 if (matchp->commutative[op_no] >= 0)
1340                   matchp->with[matchp->commutative[op_no]] = match;
1341               }
1342             continue;
1343
1344           case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'h':
1345           case 'j': case 'k': case 'l': case 'p': case 'q': case 't': case 'u':
1346           case 'v': case 'w': case 'x': case 'y': case 'z': case 'A': case 'B':
1347           case 'C': case 'D': case 'W': case 'Y': case 'Z':
1348             if (targetm.class_likely_spilled_p (REG_CLASS_FROM_CONSTRAINT ((unsigned char) c, p)))
1349               likely_spilled[op_no] = 1;
1350             break;
1351           }
1352           p += CONSTRAINT_LEN (c, p);
1353         }
1354     }
1355   return any_matches;
1356 }
1357
1358 \f
1359
1360 static bool
1361 gate_handle_regmove (void)
1362 {
1363   return (optimize > 0 && flag_regmove);
1364 }
1365
1366
1367 struct rtl_opt_pass pass_regmove =
1368 {
1369  {
1370   RTL_PASS,
1371   "regmove",                            /* name */
1372   OPTGROUP_NONE,                        /* optinfo_flags */
1373   gate_handle_regmove,                  /* gate */
1374   regmove_optimize,                     /* execute */
1375   NULL,                                 /* sub */
1376   NULL,                                 /* next */
1377   0,                                    /* static_pass_number */
1378   TV_REGMOVE,                           /* tv_id */
1379   0,                                    /* properties_required */
1380   0,                                    /* properties_provided */
1381   0,                                    /* properties_destroyed */
1382   0,                                    /* todo_flags_start */
1383   TODO_df_finish | TODO_verify_rtl_sharing |
1384   TODO_ggc_collect                      /* todo_flags_finish */
1385  }
1386 };