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