OSDN Git Service

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