OSDN Git Service

* rs6000.c (rs6000_override_options): Only use DI ops when
[pf3gnuchains/gcc-fork.git] / gcc / regrename.c
1 /* Register renaming for the GNU compiler.
2    Copyright (C) 2000, 2001 Free Software Foundation, Inc.
3
4    This file is part of GCC.
5
6    GCC is free software; you can redistribute it and/or modify it
7    under the terms of the GNU General Public License as published by
8    the Free Software Foundation; either version 2, or (at your option)
9    any later version.
10
11    GCC is distributed in the hope that it will be useful, but WITHOUT
12    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13    or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
14    License for more details.
15
16    You should have received a copy of the GNU General Public License
17    along with GCC; see the file COPYING.  If not, write to the Free
18    Software Foundation, 59 Temple Place - Suite 330, Boston, MA
19    02111-1307, USA.  */
20
21 #define REG_OK_STRICT
22
23 #include "config.h"
24 #include "system.h"
25 #include "rtl.h"
26 #include "tm_p.h"
27 #include "insn-config.h"
28 #include "regs.h"
29 #include "hard-reg-set.h"
30 #include "basic-block.h"
31 #include "reload.h"
32 #include "output.h"
33 #include "function.h"
34 #include "recog.h"
35 #include "flags.h"
36 #include "toplev.h"
37 #include "obstack.h"
38
39 #define obstack_chunk_alloc xmalloc
40 #define obstack_chunk_free free
41
42 #ifndef REGNO_MODE_OK_FOR_BASE_P
43 #define REGNO_MODE_OK_FOR_BASE_P(REGNO, MODE) REGNO_OK_FOR_BASE_P (REGNO)
44 #endif
45
46 #ifndef REG_MODE_OK_FOR_BASE_P
47 #define REG_MODE_OK_FOR_BASE_P(REGNO, MODE) REG_OK_FOR_BASE_P (REGNO)
48 #endif
49
50 static const char *const reg_class_names[] = REG_CLASS_NAMES;
51
52 struct du_chain
53 {
54   struct du_chain *next_chain;
55   struct du_chain *next_use;
56
57   rtx insn;
58   rtx *loc;
59   enum reg_class class;
60   unsigned int need_caller_save_reg:1;
61   unsigned int earlyclobber:1;
62 };
63
64 enum scan_actions
65 {
66   terminate_all_read,
67   terminate_overlapping_read,
68   terminate_write,
69   terminate_dead,
70   mark_read,
71   mark_write
72 };
73
74 static const char * const scan_actions_name[] =
75 {
76   "terminate_all_read",
77   "terminate_overlapping_read",
78   "terminate_write",
79   "terminate_dead",
80   "mark_read",
81   "mark_write"
82 };
83
84 static struct obstack rename_obstack;
85
86 static void do_replace PARAMS ((struct du_chain *, int));
87 static void scan_rtx_reg PARAMS ((rtx, rtx *, enum reg_class,
88                                   enum scan_actions, enum op_type, int));
89 static void scan_rtx_address PARAMS ((rtx, rtx *, enum reg_class,
90                                       enum scan_actions, enum machine_mode));
91 static void scan_rtx PARAMS ((rtx, rtx *, enum reg_class,
92                               enum scan_actions, enum op_type, int));
93 static struct du_chain *build_def_use PARAMS ((basic_block));
94 static void dump_def_use_chain PARAMS ((struct du_chain *));
95 static void note_sets PARAMS ((rtx, rtx, void *));
96 static void clear_dead_regs PARAMS ((HARD_REG_SET *, enum machine_mode, rtx));
97 static void merge_overlapping_regs PARAMS ((basic_block, HARD_REG_SET *,
98                                             struct du_chain *));
99
100 /* Called through note_stores from update_life.  Find sets of registers, and
101    record them in *DATA (which is actually a HARD_REG_SET *).  */
102
103 static void
104 note_sets (x, set, data)
105      rtx x;
106      rtx set ATTRIBUTE_UNUSED;
107      void *data;
108 {
109   HARD_REG_SET *pset = (HARD_REG_SET *) data;
110   unsigned int regno;
111   int nregs;
112   if (GET_CODE (x) != REG)
113     return;
114   regno = REGNO (x);
115   nregs = HARD_REGNO_NREGS (regno, GET_MODE (x));
116
117   /* There must not be pseudos at this point.  */
118   if (regno + nregs > FIRST_PSEUDO_REGISTER)
119     abort ();
120
121   while (nregs-- > 0)
122     SET_HARD_REG_BIT (*pset, regno + nregs);
123 }
124
125 /* Clear all registers from *PSET for which a note of kind KIND can be found
126    in the list NOTES.  */
127
128 static void
129 clear_dead_regs (pset, kind, notes)
130      HARD_REG_SET *pset;
131      enum machine_mode kind;
132      rtx notes;
133 {
134   rtx note;
135   for (note = notes; note; note = XEXP (note, 1))
136     if (REG_NOTE_KIND (note) == kind && REG_P (XEXP (note, 0)))
137       {
138         rtx reg = XEXP (note, 0);
139         unsigned int regno = REGNO (reg);
140         int nregs = HARD_REGNO_NREGS (regno, GET_MODE (reg));
141
142         /* There must not be pseudos at this point.  */
143         if (regno + nregs > FIRST_PSEUDO_REGISTER)
144           abort ();
145
146         while (nregs-- > 0)
147           CLEAR_HARD_REG_BIT (*pset, regno + nregs);
148       }
149 }
150
151 /* For a def-use chain CHAIN in basic block B, find which registers overlap
152    its lifetime and set the corresponding bits in *PSET.  */
153
154 static void
155 merge_overlapping_regs (b, pset, chain)
156      basic_block b;
157      HARD_REG_SET *pset;
158      struct du_chain *chain;
159 {
160   struct du_chain *t = chain;
161   rtx insn;
162   HARD_REG_SET live;
163
164   REG_SET_TO_HARD_REG_SET (live, b->global_live_at_start);
165   insn = b->head;
166   while (t)
167     {
168       /* Search forward until the next reference to the register to be
169          renamed.  */
170       while (insn != t->insn)
171         {
172           if (INSN_P (insn))
173             {
174               clear_dead_regs (&live, REG_DEAD, REG_NOTES (insn));
175               note_stores (PATTERN (insn), note_sets, (void *) &live);
176               /* Only record currently live regs if we are inside the
177                  reg's live range.  */
178               if (t != chain)
179                 IOR_HARD_REG_SET (*pset, live);
180               clear_dead_regs (&live, REG_UNUSED, REG_NOTES (insn));  
181             }
182           insn = NEXT_INSN (insn);
183         }
184
185       IOR_HARD_REG_SET (*pset, live);
186
187       /* For the last reference, also merge in all registers set in the
188          same insn.
189          @@@ We only have take earlyclobbered sets into account.  */
190       if (! t->next_use)
191         note_stores (PATTERN (insn), note_sets, (void *) pset);
192
193       t = t->next_use;
194     }
195 }
196
197 /* Perform register renaming on the current function.  */
198
199 void
200 regrename_optimize ()
201 {
202   int tick[FIRST_PSEUDO_REGISTER];
203   int this_tick = 0;
204   int b;
205   char *first_obj;
206
207   memset (tick, 0, sizeof tick);
208
209   gcc_obstack_init (&rename_obstack);
210   first_obj = (char *) obstack_alloc (&rename_obstack, 0);
211
212   for (b = 0; b < n_basic_blocks; b++)
213     {
214       basic_block bb = BASIC_BLOCK (b);
215       struct du_chain *all_chains = 0;
216       HARD_REG_SET unavailable;
217       HARD_REG_SET regs_seen;
218
219       CLEAR_HARD_REG_SET (unavailable);
220
221       if (rtl_dump_file)
222         fprintf (rtl_dump_file, "\nBasic block %d:\n", b);
223
224       all_chains = build_def_use (bb);
225
226       if (rtl_dump_file)
227         dump_def_use_chain (all_chains);
228
229       CLEAR_HARD_REG_SET (unavailable);
230       /* Don't clobber traceback for noreturn functions.  */
231       if (frame_pointer_needed)
232         {
233           int i;
234           
235           for (i = HARD_REGNO_NREGS (FRAME_POINTER_REGNUM, Pmode); i--;)
236             SET_HARD_REG_BIT (unavailable, FRAME_POINTER_REGNUM + i);
237           
238 #if FRAME_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM
239           for (i = HARD_REGNO_NREGS (HARD_FRAME_POINTER_REGNUM, Pmode); i--;)
240             SET_HARD_REG_BIT (unavailable, HARD_FRAME_POINTER_REGNUM + i);
241 #endif
242         }
243
244       CLEAR_HARD_REG_SET (regs_seen);
245       while (all_chains)
246         {
247           int new_reg, best_new_reg = -1;
248           int n_uses;
249           struct du_chain *this = all_chains;
250           struct du_chain *tmp, *last;
251           HARD_REG_SET this_unavailable;
252           int reg = REGNO (*this->loc);
253           int i;
254
255           all_chains = this->next_chain;
256           
257 #if 0 /* This just disables optimization opportunities.  */
258           /* Only rename once we've seen the reg more than once.  */
259           if (! TEST_HARD_REG_BIT (regs_seen, reg))
260             {
261               SET_HARD_REG_BIT (regs_seen, reg);
262               continue;
263             }
264 #endif
265
266           if (fixed_regs[reg] || global_regs[reg]
267 #if FRAME_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM
268               || (frame_pointer_needed && reg == HARD_FRAME_POINTER_REGNUM)
269 #else
270               || (frame_pointer_needed && reg == FRAME_POINTER_REGNUM)
271 #endif
272               )
273             continue;
274
275           COPY_HARD_REG_SET (this_unavailable, unavailable);
276
277           /* Find last entry on chain (which has the need_caller_save bit),
278              count number of uses, and narrow the set of registers we can
279              use for renaming.  */
280           n_uses = 0;
281           for (last = this; last->next_use; last = last->next_use)
282             {
283               n_uses++;
284               IOR_COMPL_HARD_REG_SET (this_unavailable,
285                                       reg_class_contents[last->class]);
286             }
287           if (n_uses < 1)
288             continue;
289
290           IOR_COMPL_HARD_REG_SET (this_unavailable,
291                                   reg_class_contents[last->class]);
292
293           if (this->need_caller_save_reg)
294             IOR_HARD_REG_SET (this_unavailable, call_used_reg_set);
295
296           merge_overlapping_regs (bb, &this_unavailable, this);
297
298           /* Now potential_regs is a reasonable approximation, let's
299              have a closer look at each register still in there.  */
300           for (new_reg = 0; new_reg < FIRST_PSEUDO_REGISTER; new_reg++)
301             {
302               int nregs = HARD_REGNO_NREGS (new_reg, GET_MODE (*this->loc));
303
304               for (i = nregs - 1; i >= 0; --i)
305                 if (TEST_HARD_REG_BIT (this_unavailable, new_reg + i)
306                     || fixed_regs[new_reg + i]
307                     || global_regs[new_reg + i]
308                     /* Can't use regs which aren't saved by the prologue.  */
309                     || (! regs_ever_live[new_reg + i]
310                         && ! call_used_regs[new_reg + i])
311 #ifdef LEAF_REGISTERS
312                     /* We can't use a non-leaf register if we're in a 
313                        leaf function.  */
314                     || (current_function_is_leaf 
315                         && !LEAF_REGISTERS[new_reg + i])
316 #endif
317 #ifdef HARD_REGNO_RENAME_OK
318                     || ! HARD_REGNO_RENAME_OK (reg + i, new_reg + i)
319 #endif
320                     )
321                   break;
322               if (i >= 0)
323                 continue;
324
325               /* See whether it accepts all modes that occur in
326                  definition and uses.  */
327               for (tmp = this; tmp; tmp = tmp->next_use)
328                 if (! HARD_REGNO_MODE_OK (new_reg, GET_MODE (*tmp->loc)))
329                   break;
330               if (! tmp)
331                 {
332                   if (best_new_reg == -1
333                       || tick[best_new_reg] > tick[new_reg])
334                     best_new_reg = new_reg;
335                 }
336             }
337
338           if (rtl_dump_file)
339             {
340               fprintf (rtl_dump_file, "Register %s in insn %d",
341                        reg_names[reg], INSN_UID (last->insn));
342               if (last->need_caller_save_reg)
343                 fprintf (rtl_dump_file, " crosses a call");
344               }
345
346           if (best_new_reg == -1)
347             {
348               if (rtl_dump_file)
349                 fprintf (rtl_dump_file, "; no available registers\n");
350               continue;
351             }
352
353           do_replace (this, best_new_reg);
354           tick[best_new_reg] = this_tick++;
355
356           if (rtl_dump_file)
357             fprintf (rtl_dump_file, ", renamed as %s\n", reg_names[best_new_reg]);
358         }
359
360       obstack_free (&rename_obstack, first_obj);
361     }
362
363   obstack_free (&rename_obstack, NULL);
364
365   if (rtl_dump_file)
366     fputc ('\n', rtl_dump_file);
367
368   count_or_remove_death_notes (NULL, 1);
369   update_life_info (NULL, UPDATE_LIFE_LOCAL,
370                     PROP_REG_INFO | PROP_DEATH_NOTES);
371 }
372
373 static void
374 do_replace (chain, reg)
375      struct du_chain *chain;
376      int reg;
377 {
378   while (chain)
379     {
380       unsigned int regno = ORIGINAL_REGNO (*chain->loc);
381       *chain->loc = gen_raw_REG (GET_MODE (*chain->loc), reg);
382       if (regno >= FIRST_PSEUDO_REGISTER)
383         ORIGINAL_REGNO (*chain->loc) = regno;
384       chain = chain->next_use;
385     }
386 }
387
388
389 static struct du_chain *open_chains;
390 static struct du_chain *closed_chains;
391
392 static void
393 scan_rtx_reg (insn, loc, class, action, type, earlyclobber)
394      rtx insn;
395      rtx *loc;
396      enum reg_class class;
397      enum scan_actions action;
398      enum op_type type;
399      int earlyclobber;
400 {
401   struct du_chain **p;
402   rtx x = *loc;
403   enum machine_mode mode = GET_MODE (x);
404   int this_regno = REGNO (x);
405   int this_nregs = HARD_REGNO_NREGS (this_regno, mode);
406
407   if (action == mark_write)
408     {
409       if (type == OP_OUT)
410         {
411           struct du_chain *this = (struct du_chain *)
412             obstack_alloc (&rename_obstack, sizeof (struct du_chain));
413           this->next_use = 0;
414           this->next_chain = open_chains;
415           this->loc = loc;
416           this->insn = insn;
417           this->class = class;
418           this->need_caller_save_reg = 0;
419           this->earlyclobber = earlyclobber;
420           open_chains = this;
421         }
422       return;
423     }
424
425   if ((type == OP_OUT && action != terminate_write)
426       || (type != OP_OUT && action == terminate_write))
427     return;
428
429   for (p = &open_chains; *p;)
430     {
431       struct du_chain *this = *p;
432
433       /* Check if the chain has been terminated if it has then skip to
434          the next chain.
435
436          This can happen when we've already appended the location to
437          the chain in Step 3, but are trying to hide in-out operands
438          from terminate_write in Step 5.  */
439
440       if (*this->loc == cc0_rtx)
441         p = &this->next_chain;
442       else
443         {
444           int regno = REGNO (*this->loc);
445           int nregs = HARD_REGNO_NREGS (regno, GET_MODE (*this->loc));
446           int exact_match = (regno == this_regno && nregs == this_nregs);
447
448           if (regno + nregs <= this_regno
449               || this_regno + this_nregs <= regno)
450             {
451               p = &this->next_chain;
452               continue;
453             }
454
455           if (action == mark_read)
456             {
457               if (! exact_match)
458                 abort ();
459
460               /* ??? Class NO_REGS can happen if the md file makes use of 
461                  EXTRA_CONSTRAINTS to match registers.  Which is arguably
462                  wrong, but there we are.  Since we know not what this may
463                  be replaced with, terminate the chain.  */
464               if (class != NO_REGS)
465                 {
466                   this = (struct du_chain *)
467                     obstack_alloc (&rename_obstack, sizeof (struct du_chain));
468                   this->next_use = 0;
469                   this->next_chain = (*p)->next_chain;
470                   this->loc = loc;
471                   this->insn = insn;
472                   this->class = class;
473                   this->need_caller_save_reg = 0;
474                   while (*p)
475                     p = &(*p)->next_use;
476                   *p = this;
477                   return;
478                 }
479             }
480
481           if (action != terminate_overlapping_read || ! exact_match)
482             {
483               struct du_chain *next = this->next_chain;
484
485               /* Whether the terminated chain can be used for renaming
486                  depends on the action and this being an exact match.
487                  In either case, we remove this element from open_chains.  */
488
489               if ((action == terminate_dead || action == terminate_write)
490                   && exact_match)
491                 {
492                   this->next_chain = closed_chains;
493                   closed_chains = this;
494                   if (rtl_dump_file)
495                     fprintf (rtl_dump_file,
496                              "Closing chain %s at insn %d (%s)\n",
497                              reg_names[REGNO (*this->loc)], INSN_UID (insn),
498                              scan_actions_name[(int) action]);
499                 }
500               else
501                 {
502                   if (rtl_dump_file)
503                     fprintf (rtl_dump_file,
504                              "Discarding chain %s at insn %d (%s)\n",
505                              reg_names[REGNO (*this->loc)], INSN_UID (insn),
506                              scan_actions_name[(int) action]);
507                 }
508               *p = next;
509             }
510           else
511             p = &this->next_chain;
512         }
513     }
514 }
515
516 /* Adapted from find_reloads_address_1.  CLASS is INDEX_REG_CLASS or
517    BASE_REG_CLASS depending on how the register is being considered.  */
518
519 static void
520 scan_rtx_address (insn, loc, class, action, mode)
521      rtx insn;
522      rtx *loc;
523      enum reg_class class;
524      enum scan_actions action;
525      enum machine_mode mode;
526 {
527   rtx x = *loc;
528   RTX_CODE code = GET_CODE (x);
529   const char *fmt;
530   int i, j;
531
532   if (action == mark_write)
533     return;
534
535   switch (code)
536     {
537     case PLUS:
538       {
539         rtx orig_op0 = XEXP (x, 0);
540         rtx orig_op1 = XEXP (x, 1);
541         RTX_CODE code0 = GET_CODE (orig_op0);
542         RTX_CODE code1 = GET_CODE (orig_op1);
543         rtx op0 = orig_op0;
544         rtx op1 = orig_op1;
545         rtx *locI = NULL;
546         rtx *locB = NULL;
547
548         if (GET_CODE (op0) == SUBREG)
549           {
550             op0 = SUBREG_REG (op0);
551             code0 = GET_CODE (op0);
552           }
553
554         if (GET_CODE (op1) == SUBREG)
555           {
556             op1 = SUBREG_REG (op1);
557             code1 = GET_CODE (op1);
558           }
559
560         if (code0 == MULT || code0 == SIGN_EXTEND || code0 == TRUNCATE
561             || code0 == ZERO_EXTEND || code1 == MEM)
562           {
563             locI = &XEXP (x, 0);
564             locB = &XEXP (x, 1);
565           }
566         else if (code1 == MULT || code1 == SIGN_EXTEND || code1 == TRUNCATE
567                  || code1 == ZERO_EXTEND || code0 == MEM)
568           {
569             locI = &XEXP (x, 1);
570             locB = &XEXP (x, 0);
571           }
572         else if (code0 == CONST_INT || code0 == CONST
573                  || code0 == SYMBOL_REF || code0 == LABEL_REF)
574           locB = &XEXP (x, 1);
575         else if (code1 == CONST_INT || code1 == CONST
576                  || code1 == SYMBOL_REF || code1 == LABEL_REF)
577           locB = &XEXP (x, 0);
578         else if (code0 == REG && code1 == REG)
579           {
580             int index_op;
581
582             if (REG_OK_FOR_INDEX_P (op0)
583                 && REG_MODE_OK_FOR_BASE_P (op1, mode))
584               index_op = 0;
585             else if (REG_OK_FOR_INDEX_P (op1)
586                      && REG_MODE_OK_FOR_BASE_P (op0, mode))
587               index_op = 1;
588             else if (REG_MODE_OK_FOR_BASE_P (op1, mode))
589               index_op = 0;
590             else if (REG_MODE_OK_FOR_BASE_P (op0, mode))
591               index_op = 1;
592             else if (REG_OK_FOR_INDEX_P (op1))
593               index_op = 1;
594             else
595               index_op = 0;
596
597             locI = &XEXP (x, index_op);
598             locB = &XEXP (x, !index_op);
599           }
600         else if (code0 == REG)
601           {
602             locI = &XEXP (x, 0);
603             locB = &XEXP (x, 1);
604           }
605         else if (code1 == REG)
606           {
607             locI = &XEXP (x, 1);
608             locB = &XEXP (x, 0);
609           }
610
611         if (locI)
612           scan_rtx_address (insn, locI, INDEX_REG_CLASS, action, mode);
613         if (locB)
614           scan_rtx_address (insn, locB, MODE_BASE_REG_CLASS (mode), action, mode);
615         return;
616       }
617
618     case POST_INC:
619     case POST_DEC:
620     case POST_MODIFY:
621     case PRE_INC:
622     case PRE_DEC:
623     case PRE_MODIFY:
624 #ifndef AUTO_INC_DEC
625       /* If the target doesn't claim to handle autoinc, this must be
626          something special, like a stack push.  Kill this chain.  */
627       action = terminate_all_read;
628 #endif
629       break;
630
631     case MEM:
632       scan_rtx_address (insn, &XEXP (x, 0),
633                         MODE_BASE_REG_CLASS (GET_MODE (x)), action,
634                         GET_MODE (x));
635       return;
636
637     case REG:
638       scan_rtx_reg (insn, loc, class, action, OP_IN, 0);
639       return;
640
641     default:
642       break;
643     }
644
645   fmt = GET_RTX_FORMAT (code);
646   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
647     {
648       if (fmt[i] == 'e')
649         scan_rtx_address (insn, &XEXP (x, i), class, action, mode);
650       else if (fmt[i] == 'E')
651         for (j = XVECLEN (x, i) - 1; j >= 0; j--)
652           scan_rtx_address (insn, &XVECEXP (x, i, j), class, action, mode);
653     }
654 }
655
656 static void
657 scan_rtx (insn, loc, class, action, type, earlyclobber)
658      rtx insn;
659      rtx *loc;
660      enum reg_class class;
661      enum scan_actions action;
662      enum op_type type;
663      int earlyclobber;
664 {
665   const char *fmt;
666   rtx x = *loc;
667   enum rtx_code code = GET_CODE (x);
668   int i, j;
669
670   code = GET_CODE (x);
671   switch (code)
672     {
673     case CONST:
674     case CONST_INT:
675     case CONST_DOUBLE:
676     case SYMBOL_REF:
677     case LABEL_REF:
678     case CC0:
679     case PC:
680       return;
681
682     case REG:
683       scan_rtx_reg (insn, loc, class, action, type, earlyclobber);
684       return;
685
686     case MEM:
687       scan_rtx_address (insn, &XEXP (x, 0),
688                         MODE_BASE_REG_CLASS (GET_MODE (x)), action,
689                         GET_MODE (x));
690       return;
691
692     case SET:
693       scan_rtx (insn, &SET_SRC (x), class, action, OP_IN, 0);
694       scan_rtx (insn, &SET_DEST (x), class, action, OP_OUT, 0);
695       return;
696
697     case STRICT_LOW_PART:
698       scan_rtx (insn, &XEXP (x, 0), class, action, OP_INOUT, earlyclobber);
699       return;
700
701     case ZERO_EXTRACT:
702     case SIGN_EXTRACT: 
703       scan_rtx (insn, &XEXP (x, 0), class, action,
704                 type == OP_IN ? OP_IN : OP_INOUT, earlyclobber);
705       scan_rtx (insn, &XEXP (x, 1), class, action, OP_IN, 0);
706       scan_rtx (insn, &XEXP (x, 2), class, action, OP_IN, 0);
707       return;
708
709     case POST_INC:
710     case PRE_INC:
711     case POST_DEC:
712     case PRE_DEC:
713     case POST_MODIFY:
714     case PRE_MODIFY:
715       /* Should only happen inside MEM.  */
716       abort ();
717
718     case CLOBBER:
719       scan_rtx (insn, &SET_DEST (x), class, action, OP_OUT, 1);
720       return;
721
722     case EXPR_LIST:
723       scan_rtx (insn, &XEXP (x, 0), class, action, type, 0);
724       if (XEXP (x, 1))
725         scan_rtx (insn, &XEXP (x, 1), class, action, type, 0);
726       return;
727
728     default:
729       break;
730     }
731
732   fmt = GET_RTX_FORMAT (code);
733   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
734     {
735       if (fmt[i] == 'e')
736         scan_rtx (insn, &XEXP (x, i), class, action, type, 0);
737       else if (fmt[i] == 'E')
738         for (j = XVECLEN (x, i) - 1; j >= 0; j--)
739           scan_rtx (insn, &XVECEXP (x, i, j), class, action, type, 0);
740     }
741 }
742
743 /* Build def/use chain */
744
745 static struct du_chain *
746 build_def_use (bb)
747      basic_block bb;
748 {
749   rtx insn;
750
751   open_chains = closed_chains = NULL;
752
753   for (insn = bb->head; ; insn = NEXT_INSN (insn))
754     {
755       if (INSN_P (insn))
756         {
757           int n_ops;
758           rtx note;
759           rtx old_operands[MAX_RECOG_OPERANDS];
760           rtx old_dups[MAX_DUP_OPERANDS];
761           int i;
762           int alt;
763           int predicated;
764
765           /* Process the insn, determining its effect on the def-use
766              chains.  We perform the following steps with the register
767              references in the insn:
768              (1) Any read that overlaps an open chain, but doesn't exactly
769                  match, causes that chain to be closed.  We can't deal
770                  with overlaps yet.
771              (2) Any read outside an operand causes any chain it overlaps
772                  with to be closed, since we can't replace it.
773              (3) Any read inside an operand is added if there's already
774                  an open chain for it.
775              (4) For any REG_DEAD note we find, close open chains that
776                  overlap it.
777              (5) For any write we find, close open chains that overlap it.
778              (6) For any write we find in an operand, make a new chain.
779              (7) For any REG_UNUSED, close any chains we just opened.  */
780
781           extract_insn (insn);
782           constrain_operands (1);
783           preprocess_constraints ();
784           alt = which_alternative;
785           n_ops = recog_data.n_operands;
786
787           /* Simplify the code below by rewriting things to reflect
788              matching constraints.  Also promote OP_OUT to OP_INOUT
789              in predicated instructions.  */
790
791           predicated = GET_CODE (PATTERN (insn)) == COND_EXEC;
792           for (i = 0; i < n_ops; ++i)
793             {
794               int matches = recog_op_alt[i][alt].matches;
795               if (matches >= 0)
796                 recog_op_alt[i][alt].class = recog_op_alt[matches][alt].class;
797               if (matches >= 0 || recog_op_alt[i][alt].matched >= 0
798                   || (predicated && recog_data.operand_type[i] == OP_OUT))
799                 recog_data.operand_type[i] = OP_INOUT;
800             }
801
802           /* Step 1: Close chains for which we have overlapping reads.  */
803           for (i = 0; i < n_ops; i++)
804             scan_rtx (insn, recog_data.operand_loc[i],
805                       NO_REGS, terminate_overlapping_read,
806                       recog_data.operand_type[i], 0);
807
808           /* Step 2: Close chains for which we have reads outside operands.
809              We do this by munging all operands into CC0, and closing 
810              everything remaining.  */
811
812           for (i = 0; i < n_ops; i++)
813             {
814               old_operands[i] = recog_data.operand[i];
815               /* Don't squash match_operator or match_parallel here, since
816                  we don't know that all of the contained registers are 
817                  reachable by proper operands.  */
818               if (recog_data.constraints[i][0] == '\0')
819                 continue;
820               *recog_data.operand_loc[i] = cc0_rtx;
821             }
822           for (i = 0; i < recog_data.n_dups; i++)
823             {
824               old_dups[i] = *recog_data.dup_loc[i];
825               *recog_data.dup_loc[i] = cc0_rtx;
826             }
827
828           scan_rtx (insn, &PATTERN (insn), NO_REGS, terminate_all_read,
829                     OP_IN, 0);
830
831           for (i = 0; i < recog_data.n_dups; i++)
832             *recog_data.dup_loc[i] = old_dups[i];
833           for (i = 0; i < n_ops; i++)
834             *recog_data.operand_loc[i] = old_operands[i];
835
836           /* Step 2B: Can't rename function call argument registers.  */
837           if (GET_CODE (insn) == CALL_INSN && CALL_INSN_FUNCTION_USAGE (insn))
838             scan_rtx (insn, &CALL_INSN_FUNCTION_USAGE (insn),
839                       NO_REGS, terminate_all_read, OP_IN, 0);
840
841           /* Step 3: Append to chains for reads inside operands.  */
842           for (i = 0; i < n_ops + recog_data.n_dups; i++)
843             {
844               int opn = i < n_ops ? i : recog_data.dup_num[i - n_ops];
845               rtx *loc = (i < n_ops
846                           ? recog_data.operand_loc[opn]
847                           : recog_data.dup_loc[i - n_ops]);
848               enum reg_class class = recog_op_alt[opn][alt].class;
849               enum op_type type = recog_data.operand_type[opn];
850
851               /* Don't scan match_operand here, since we've no reg class
852                  information to pass down.  Any operands that we could
853                  substitute in will be represented elsewhere.  */
854               if (recog_data.constraints[opn][0] == '\0')
855                 continue;
856
857               if (recog_op_alt[opn][alt].is_address)
858                 scan_rtx_address (insn, loc, class, mark_read, VOIDmode);
859               else
860                 scan_rtx (insn, loc, class, mark_read, type, 0);
861             }
862
863           /* Step 4: Close chains for registers that die here.
864              Also record updates for REG_INC notes.  */
865           for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
866             {
867               if (REG_NOTE_KIND (note) == REG_DEAD)
868                 scan_rtx (insn, &XEXP (note, 0), NO_REGS, terminate_dead,
869                           OP_IN, 0);
870               else if (REG_NOTE_KIND (note) == REG_INC)
871                 scan_rtx (insn, &XEXP (note, 0), ALL_REGS, mark_read,
872                           OP_INOUT, 0);
873             }
874
875           /* Step 4B: If this is a call, any chain live at this point
876              requires a caller-saved reg.  */
877           if (GET_CODE (insn) == CALL_INSN)
878             {
879               struct du_chain *p;
880               for (p = open_chains; p; p = p->next_chain)
881                 p->need_caller_save_reg = 1;
882             }
883
884           /* Step 5: Close open chains that overlap writes.  Similar to
885              step 2, we hide in-out operands, since we do not want to
886              close these chains.  */
887
888           for (i = 0; i < n_ops; i++)
889             {
890               old_operands[i] = recog_data.operand[i];
891               if (recog_data.operand_type[i] == OP_INOUT)
892                 *recog_data.operand_loc[i] = cc0_rtx;
893             }
894           for (i = 0; i < recog_data.n_dups; i++)
895             {
896               int opn = recog_data.dup_num[i];
897               old_dups[i] = *recog_data.dup_loc[i];
898               if (recog_data.operand_type[opn] == OP_INOUT)
899                 *recog_data.dup_loc[i] = cc0_rtx;
900             }
901
902           scan_rtx (insn, &PATTERN (insn), NO_REGS, terminate_write, OP_IN, 0);
903
904           for (i = 0; i < recog_data.n_dups; i++)
905             *recog_data.dup_loc[i] = old_dups[i];
906           for (i = 0; i < n_ops; i++)
907             *recog_data.operand_loc[i] = old_operands[i];
908
909           /* Step 6: Begin new chains for writes inside operands.  */
910           /* ??? Many targets have output constraints on the SET_DEST
911              of a call insn, which is stupid, since these are certainly
912              ABI defined hard registers.  Don't change calls at all.  */
913           if (GET_CODE (insn) != CALL_INSN)
914             for (i = 0; i < n_ops + recog_data.n_dups; i++)
915               {
916                 int opn = i < n_ops ? i : recog_data.dup_num[i - n_ops];
917                 rtx *loc = (i < n_ops
918                             ? recog_data.operand_loc[opn]
919                             : recog_data.dup_loc[i - n_ops]);
920                 enum reg_class class = recog_op_alt[opn][alt].class;
921
922                 if (recog_data.operand_type[opn] == OP_OUT)
923                   scan_rtx (insn, loc, class, mark_write, OP_OUT,
924                             recog_op_alt[opn][alt].earlyclobber);
925               }
926
927           /* Step 7: Close chains for registers that were never
928              really used here.  */
929           for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
930             if (REG_NOTE_KIND (note) == REG_UNUSED)
931               scan_rtx (insn, &XEXP (note, 0), NO_REGS, terminate_dead,
932                         OP_IN, 0);
933         }
934       if (insn == bb->end)
935         break;
936     }
937
938   /* Since we close every chain when we find a REG_DEAD note, anything that
939      is still open lives past the basic block, so it can't be renamed.  */
940   return closed_chains;
941 }
942
943 /* Dump all def/use chains in CHAINS to RTL_DUMP_FILE.  They are
944    printed in reverse order as that's how we build them.  */
945
946 static void
947 dump_def_use_chain (chains)
948      struct du_chain *chains;
949 {
950   while (chains)
951     {
952       struct du_chain *this = chains;
953       int r = REGNO (*this->loc);
954       int nregs = HARD_REGNO_NREGS (r, GET_MODE (*this->loc));
955       fprintf (rtl_dump_file, "Register %s (%d):", reg_names[r], nregs);
956       while (this)
957         {
958           fprintf (rtl_dump_file, " %d [%s]", INSN_UID (this->insn),
959                    reg_class_names[this->class]);
960           this = this->next_use;
961         }
962       fprintf (rtl_dump_file, "\n");
963       chains = chains->next_chain;
964     }
965 }
966 \f
967 /* The following code does forward propagation of hard register copies.
968    The object is to eliminate as many dependencies as possible, so that
969    we have the most scheduling freedom.  As a side effect, we also clean
970    up some silly register allocation decisions made by reload.  This 
971    code may be obsoleted by a new register allocator.  */
972
973 /* For each register, we have a list of registers that contain the same
974    value.  The OLDEST_REGNO field points to the head of the list, and 
975    the NEXT_REGNO field runs through the list.  The MODE field indicates
976    what mode the data is known to be in; this field is VOIDmode when the
977    register is not known to contain valid data.  */
978
979 struct value_data_entry
980 {
981   enum machine_mode mode;
982   unsigned int oldest_regno;
983   unsigned int next_regno;
984 };
985
986 struct value_data
987 {
988   struct value_data_entry e[FIRST_PSEUDO_REGISTER];
989   unsigned int max_value_regs;
990 };
991
992 static void kill_value_regno PARAMS ((unsigned, struct value_data *));
993 static void kill_value PARAMS ((rtx, struct value_data *));
994 static void set_value_regno PARAMS ((unsigned, enum machine_mode,
995                                      struct value_data *));
996 static void init_value_data PARAMS ((struct value_data *));
997 static void kill_clobbered_value PARAMS ((rtx, rtx, void *));
998 static void kill_set_value PARAMS ((rtx, rtx, void *));
999 static int kill_autoinc_value PARAMS ((rtx *, void *));
1000 static void copy_value PARAMS ((rtx, rtx, struct value_data *));
1001 static bool mode_change_ok PARAMS ((enum machine_mode, enum machine_mode,
1002                                     unsigned int));
1003 static rtx find_oldest_value_reg PARAMS ((enum reg_class, unsigned int,
1004                                             enum machine_mode,
1005                                             struct value_data *));
1006 static bool replace_oldest_value_reg PARAMS ((rtx *, enum reg_class, rtx,
1007                                               struct value_data *));
1008 static bool replace_oldest_value_addr PARAMS ((rtx *, enum reg_class,
1009                                                enum machine_mode, rtx,
1010                                                struct value_data *));
1011 static bool replace_oldest_value_mem PARAMS ((rtx, rtx, struct value_data *));
1012 static bool copyprop_hardreg_forward_1 PARAMS ((basic_block,
1013                                                  struct value_data *));
1014 extern void debug_value_data PARAMS ((struct value_data *));
1015 #ifdef ENABLE_CHECKING
1016 static void validate_value_data PARAMS ((struct value_data *));
1017 #endif
1018
1019 /* Kill register REGNO.  This involves removing it from any value lists,
1020    and resetting the value mode to VOIDmode.  */
1021
1022 static void
1023 kill_value_regno (regno, vd)
1024      unsigned int regno;
1025      struct value_data *vd;
1026 {
1027   unsigned int i, next;
1028
1029   if (vd->e[regno].oldest_regno != regno)
1030     {
1031       for (i = vd->e[regno].oldest_regno;
1032            vd->e[i].next_regno != regno;
1033            i = vd->e[i].next_regno)
1034         continue;
1035       vd->e[i].next_regno = vd->e[regno].next_regno;
1036     }
1037   else if ((next = vd->e[regno].next_regno) != INVALID_REGNUM)
1038     {
1039       for (i = next; i != INVALID_REGNUM; i = vd->e[i].next_regno)
1040         vd->e[i].oldest_regno = next;
1041     }
1042
1043   vd->e[regno].mode = VOIDmode;
1044   vd->e[regno].oldest_regno = regno;
1045   vd->e[regno].next_regno = INVALID_REGNUM;
1046
1047 #ifdef ENABLE_CHECKING
1048   validate_value_data (vd);
1049 #endif
1050 }
1051
1052 /* Kill X.  This is a convenience function for kill_value_regno
1053    so that we mind the mode the register is in.  */
1054
1055 static void
1056 kill_value (x, vd)
1057      rtx x;
1058      struct value_data *vd;
1059 {
1060   if (REG_P (x))
1061     {
1062       unsigned int regno = REGNO (x);
1063       unsigned int n = HARD_REGNO_NREGS (regno, GET_MODE (x));
1064       unsigned int i, j;
1065
1066       /* Kill the value we're told to kill.  */
1067       for (i = 0; i < n; ++i)
1068         kill_value_regno (regno + i, vd);
1069
1070       /* Kill everything that overlapped what we're told to kill.  */
1071       if (regno < vd->max_value_regs)
1072         j = 0;
1073       else
1074         j = regno - vd->max_value_regs;
1075       for (; j < regno; ++j)
1076         {
1077           if (vd->e[j].mode == VOIDmode)
1078             continue;
1079           n = HARD_REGNO_NREGS (regno, vd->e[j].mode);
1080           if (j + n > regno)
1081             for (i = 0; i < n; ++i)
1082               kill_value_regno (j + i, vd);
1083         }
1084     }
1085 }
1086
1087 /* Remember that REGNO is valid in MODE.  */
1088
1089 static void
1090 set_value_regno (regno, mode, vd)
1091      unsigned int regno;
1092      enum machine_mode mode;
1093      struct value_data *vd;
1094 {
1095   unsigned int nregs;
1096
1097   vd->e[regno].mode = mode;
1098
1099   nregs = HARD_REGNO_NREGS (regno, mode);
1100   if (nregs > vd->max_value_regs)
1101     vd->max_value_regs = nregs;
1102 }
1103
1104 /* Initialize VD such that there are no known relationships between regs.  */
1105
1106 static void
1107 init_value_data (vd)
1108      struct value_data *vd;
1109 {
1110   int i;
1111   for (i = 0; i < FIRST_PSEUDO_REGISTER; ++i)
1112     {
1113       vd->e[i].mode = VOIDmode;
1114       vd->e[i].oldest_regno = i;
1115       vd->e[i].next_regno = INVALID_REGNUM;
1116     }
1117   vd->max_value_regs = 0;
1118 }
1119
1120 /* Called through note_stores.  If X is clobbered, kill its value.  */
1121
1122 static void
1123 kill_clobbered_value (x, set, data)
1124      rtx x;
1125      rtx set;
1126      void *data;
1127 {
1128   struct value_data *vd = data;
1129   if (GET_CODE (set) == CLOBBER)
1130     kill_value (x, vd);
1131 }
1132
1133 /* Called through note_stores.  If X is set, not clobbered, kill its 
1134    current value and install it as the root of its own value list.  */
1135
1136 static void
1137 kill_set_value (x, set, data)
1138      rtx x;
1139      rtx set;
1140      void *data;
1141 {
1142   struct value_data *vd = data;
1143   if (GET_CODE (set) != CLOBBER && REG_P (x))
1144     {
1145       kill_value (x, vd);
1146       set_value_regno (REGNO (x), GET_MODE (x), vd);
1147     }
1148 }
1149
1150 /* Called through for_each_rtx.  Kill any register used as the base of an
1151    auto-increment expression, and install that register as the root of its
1152    own value list.  */
1153
1154 static int
1155 kill_autoinc_value (px, data)
1156      rtx *px;
1157      void *data;
1158 {
1159   rtx x = *px;
1160   struct value_data *vd = data;
1161
1162   if (GET_RTX_CLASS (GET_CODE (x)) == 'a')
1163     {
1164       x = XEXP (x, 0);
1165       kill_value (x, vd);
1166       set_value_regno (REGNO (x), Pmode, vd);
1167       return -1;
1168     }
1169
1170   return 0;
1171 }
1172
1173 /* Assert that SRC has been copied to DEST.  Adjust the data structures
1174    to reflect that SRC contains an older copy of the shared value.  */
1175
1176 static void
1177 copy_value (dest, src, vd)
1178      rtx dest;
1179      rtx src;
1180      struct value_data *vd;
1181 {
1182   unsigned int dr = REGNO (dest);
1183   unsigned int sr = REGNO (src);
1184   unsigned int i;
1185
1186   /* ??? At present, it's possible to see noop sets.  It'd be nice if
1187      this were cleaned up beforehand...  */
1188   if (sr == dr)
1189     return;
1190
1191   /* Do not propagate copies to the stack pointer, as that can leave
1192      memory accesses with no scheduling dependancy on the stack update.  */
1193   if (dr == STACK_POINTER_REGNUM)
1194     return;
1195
1196   /* Likewise with the frame pointer, if we're using one.  */
1197   if (frame_pointer_needed && dr == HARD_FRAME_POINTER_REGNUM)
1198     return;
1199
1200   /* If SRC had no assigned mode (i.e. we didn't know it was live)
1201      assign it now and assume the value came from an input argument
1202      or somesuch.  */
1203   if (vd->e[sr].mode == VOIDmode)
1204     set_value_regno (sr, vd->e[dr].mode, vd);
1205
1206   /* Link DR at the end of the value chain used by SR.  */
1207
1208   vd->e[dr].oldest_regno = vd->e[sr].oldest_regno;
1209
1210   for (i = sr; vd->e[i].next_regno != INVALID_REGNUM; i = vd->e[i].next_regno)
1211     continue;
1212   vd->e[i].next_regno = dr;
1213
1214 #ifdef ENABLE_CHECKING
1215   validate_value_data (vd);
1216 #endif
1217 }
1218
1219 /* Return true if a mode change from ORIG to NEW is allowed for REGNO.  */
1220
1221 static bool
1222 mode_change_ok (orig_mode, new_mode, regno)
1223      enum machine_mode orig_mode, new_mode;
1224      unsigned int regno ATTRIBUTE_UNUSED;
1225 {
1226   if (GET_MODE_SIZE (orig_mode) < GET_MODE_SIZE (new_mode))
1227     return false;
1228
1229 #ifdef CLASS_CANNOT_CHANGE_MODE
1230   if (TEST_HARD_REG_BIT (reg_class_contents[CLASS_CANNOT_CHANGE_MODE], regno)
1231       && CLASS_CANNOT_CHANGE_MODE_P (orig_mode, new_mode))
1232     return false;
1233 #endif
1234
1235   return true;
1236 }
1237
1238 /* Find the oldest copy of the value contained in REGNO that is in
1239    register class CLASS and has mode MODE.  If found, return an rtx
1240    of that oldest register, otherwise return NULL.  */
1241
1242 static rtx
1243 find_oldest_value_reg (class, regno, mode, vd)
1244      enum reg_class class;
1245      unsigned int regno;
1246      enum machine_mode mode;
1247      struct value_data *vd;
1248 {
1249   unsigned int i;
1250
1251   for (i = vd->e[regno].oldest_regno; i != regno; i = vd->e[i].next_regno)
1252     if (TEST_HARD_REG_BIT (reg_class_contents[class], i)
1253         && (vd->e[i].mode == mode
1254             || mode_change_ok (vd->e[i].mode, mode, regno)))
1255       return gen_rtx_REG (mode, i);
1256
1257   return NULL_RTX;
1258 }
1259
1260 /* If possible, replace the register at *LOC with the oldest register
1261    in register class CLASS.  Return true if successfully replaced.  */
1262
1263 static bool
1264 replace_oldest_value_reg (loc, class, insn, vd)
1265      rtx *loc;
1266      enum reg_class class;
1267      rtx insn;
1268      struct value_data *vd;
1269 {
1270   rtx new = find_oldest_value_reg (class, REGNO (*loc), GET_MODE (*loc), vd);
1271   if (new)
1272     {
1273       if (rtl_dump_file)
1274         fprintf (rtl_dump_file, "insn %u: replaced reg %u with %u\n",
1275                  INSN_UID (insn), REGNO (*loc), REGNO (new));
1276
1277       *loc = new;
1278       return true;
1279     }
1280   return false;
1281 }
1282
1283 /* Similar to replace_oldest_value_reg, but *LOC contains an address.
1284    Adapted from find_reloads_address_1.  CLASS is INDEX_REG_CLASS or
1285    BASE_REG_CLASS depending on how the register is being considered.  */
1286
1287 static bool
1288 replace_oldest_value_addr (loc, class, mode, insn, vd)
1289      rtx *loc;
1290      enum reg_class class;
1291      enum machine_mode mode;
1292      rtx insn;
1293      struct value_data *vd;
1294 {
1295   rtx x = *loc;
1296   RTX_CODE code = GET_CODE (x);
1297   const char *fmt;
1298   int i, j;
1299   bool changed = false;
1300
1301   switch (code)
1302     {
1303     case PLUS:
1304       {
1305         rtx orig_op0 = XEXP (x, 0);
1306         rtx orig_op1 = XEXP (x, 1);
1307         RTX_CODE code0 = GET_CODE (orig_op0);
1308         RTX_CODE code1 = GET_CODE (orig_op1);
1309         rtx op0 = orig_op0;
1310         rtx op1 = orig_op1;
1311         rtx *locI = NULL;
1312         rtx *locB = NULL;
1313
1314         if (GET_CODE (op0) == SUBREG)
1315           {
1316             op0 = SUBREG_REG (op0);
1317             code0 = GET_CODE (op0);
1318           }
1319
1320         if (GET_CODE (op1) == SUBREG)
1321           {
1322             op1 = SUBREG_REG (op1);
1323             code1 = GET_CODE (op1);
1324           }
1325
1326         if (code0 == MULT || code0 == SIGN_EXTEND || code0 == TRUNCATE
1327             || code0 == ZERO_EXTEND || code1 == MEM)
1328           {
1329             locI = &XEXP (x, 0);
1330             locB = &XEXP (x, 1);
1331           }
1332         else if (code1 == MULT || code1 == SIGN_EXTEND || code1 == TRUNCATE
1333                  || code1 == ZERO_EXTEND || code0 == MEM)
1334           {
1335             locI = &XEXP (x, 1);
1336             locB = &XEXP (x, 0);
1337           }
1338         else if (code0 == CONST_INT || code0 == CONST
1339                  || code0 == SYMBOL_REF || code0 == LABEL_REF)
1340           locB = &XEXP (x, 1);
1341         else if (code1 == CONST_INT || code1 == CONST
1342                  || code1 == SYMBOL_REF || code1 == LABEL_REF)
1343           locB = &XEXP (x, 0);
1344         else if (code0 == REG && code1 == REG)
1345           {
1346             int index_op;
1347
1348             if (REG_OK_FOR_INDEX_P (op0)
1349                 && REG_MODE_OK_FOR_BASE_P (op1, mode))
1350               index_op = 0;
1351             else if (REG_OK_FOR_INDEX_P (op1)
1352                      && REG_MODE_OK_FOR_BASE_P (op0, mode))
1353               index_op = 1;
1354             else if (REG_MODE_OK_FOR_BASE_P (op1, mode))
1355               index_op = 0;
1356             else if (REG_MODE_OK_FOR_BASE_P (op0, mode))
1357               index_op = 1;
1358             else if (REG_OK_FOR_INDEX_P (op1))
1359               index_op = 1;
1360             else
1361               index_op = 0;
1362
1363             locI = &XEXP (x, index_op);
1364             locB = &XEXP (x, !index_op);
1365           }
1366         else if (code0 == REG)
1367           {
1368             locI = &XEXP (x, 0);
1369             locB = &XEXP (x, 1);
1370           }
1371         else if (code1 == REG)
1372           {
1373             locI = &XEXP (x, 1);
1374             locB = &XEXP (x, 0);
1375           }
1376
1377         if (locI)
1378           changed |= replace_oldest_value_addr (locI, INDEX_REG_CLASS, mode,
1379                                                 insn, vd);
1380         if (locB)
1381           changed |= replace_oldest_value_addr (locB,
1382                                                 MODE_BASE_REG_CLASS (mode),
1383                                                 mode, insn, vd);
1384         return changed;
1385       }
1386
1387     case POST_INC:
1388     case POST_DEC:
1389     case POST_MODIFY:
1390     case PRE_INC:
1391     case PRE_DEC:
1392     case PRE_MODIFY:
1393       return false;
1394
1395     case MEM:
1396       return replace_oldest_value_mem (x, insn, vd);
1397
1398     case REG:
1399       return replace_oldest_value_reg (loc, class, insn, vd);
1400
1401     default:
1402       break;
1403     }
1404
1405   fmt = GET_RTX_FORMAT (code);
1406   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1407     {
1408       if (fmt[i] == 'e')
1409         changed |= replace_oldest_value_addr (&XEXP (x, i), class, mode,
1410                                               insn, vd);
1411       else if (fmt[i] == 'E')
1412         for (j = XVECLEN (x, i) - 1; j >= 0; j--)
1413           changed |= replace_oldest_value_addr (&XVECEXP (x, i, j), class,
1414                                                 mode, insn, vd);
1415     }
1416
1417   return changed;
1418 }
1419
1420 /* Similar to replace_oldest_value_reg, but X contains a memory.  */
1421
1422 static bool
1423 replace_oldest_value_mem (x, insn, vd)
1424      rtx x;
1425      rtx insn;
1426      struct value_data *vd;
1427 {
1428   return replace_oldest_value_addr (&XEXP (x, 0),
1429                                     MODE_BASE_REG_CLASS (GET_MODE (x)),
1430                                     GET_MODE (x), insn, vd);
1431 }
1432
1433 /* Perform the forward copy propagation on basic block BB.  */
1434
1435 static bool
1436 copyprop_hardreg_forward_1 (bb, vd)
1437      basic_block bb;
1438      struct value_data *vd;
1439 {
1440   bool changed = false;
1441   rtx insn;
1442
1443   for (insn = bb->head; ; insn = NEXT_INSN (insn))
1444     {
1445       int n_ops, i, alt, predicated;
1446       rtx set;
1447
1448       if (! INSN_P (insn))
1449         {
1450           if (insn == bb->end)
1451             break;
1452           else
1453             continue;
1454         }
1455
1456       set = single_set (insn);
1457       extract_insn (insn);
1458       constrain_operands (1);
1459       preprocess_constraints ();
1460       alt = which_alternative;
1461       n_ops = recog_data.n_operands;
1462
1463       /* Simplify the code below by rewriting things to reflect
1464          matching constraints.  Also promote OP_OUT to OP_INOUT
1465          in predicated instructions.  */
1466
1467       predicated = GET_CODE (PATTERN (insn)) == COND_EXEC;
1468       for (i = 0; i < n_ops; ++i)
1469         {
1470           int matches = recog_op_alt[i][alt].matches;
1471           if (matches >= 0)
1472             recog_op_alt[i][alt].class = recog_op_alt[matches][alt].class;
1473           if (matches >= 0 || recog_op_alt[i][alt].matched >= 0
1474               || (predicated && recog_data.operand_type[i] == OP_OUT))
1475             recog_data.operand_type[i] = OP_INOUT;
1476         }
1477
1478       /* For each earlyclobber operand, zap the value data.  */
1479       for (i = 0; i < n_ops; i++)
1480         if (recog_op_alt[i][alt].earlyclobber)
1481           kill_value (recog_data.operand[i], vd);
1482
1483       /* Within asms, a clobber cannot overlap inputs or outputs.
1484          I wouldn't think this were true for regular insns, but
1485          scan_rtx treats them like that...  */
1486       note_stores (PATTERN (insn), kill_clobbered_value, vd);
1487
1488       /* Kill all auto-incremented values.  */
1489       /* ??? REG_INC is useless, since stack pushes aren't done that way.  */
1490       for_each_rtx (&PATTERN (insn), kill_autoinc_value, vd);
1491
1492       /* Kill all early-clobbered operands.  */
1493       for (i = 0; i < n_ops; i++)
1494         if (recog_op_alt[i][alt].earlyclobber)
1495           kill_value (recog_data.operand[i], vd);
1496
1497       /* Special-case plain move instructions, since we may well
1498          be able to do the move from a different register class.  */
1499       if (set && REG_P (SET_SRC (set)))
1500         {
1501           unsigned int regno = REGNO (SET_SRC (set));
1502           enum machine_mode mode = GET_MODE (SET_SRC (set));
1503           unsigned int i;
1504           rtx new;
1505
1506           /* If the destination is also a register, try to find a source
1507              register in the same class.  */
1508           if (REG_P (SET_DEST (set)))
1509             {
1510               new = find_oldest_value_reg (REGNO_REG_CLASS (regno),
1511                                            regno, mode, vd);
1512               if (new && validate_change (insn, &SET_SRC (set), new, 0))
1513                 {
1514                   if (rtl_dump_file)
1515                     fprintf (rtl_dump_file,
1516                              "insn %u: replaced reg %u with %u\n",
1517                              INSN_UID (insn), regno, REGNO (new));
1518                   changed = true;
1519                   goto did_replacement;
1520                 }
1521             }
1522
1523           /* Otherwise, try all valid registers and see if its valid.  */
1524           for (i = vd->e[regno].oldest_regno; i != regno;
1525                i = vd->e[i].next_regno)
1526             if (mode == vd->e[regno].mode)
1527               {
1528                 new = gen_rtx_REG (mode, i);
1529                 if (validate_change (insn, &SET_SRC (set), new, 0))
1530                   {
1531                     if (rtl_dump_file)
1532                       fprintf (rtl_dump_file,
1533                                "insn %u: replaced reg %u with %u\n",
1534                                INSN_UID (insn), regno, REGNO (new));
1535                     changed = true;
1536                     goto did_replacement;
1537                   }
1538               }
1539         }
1540
1541       /* For each input operand, replace a hard register with the
1542          eldest live copy that's in an appropriate register class.  */
1543       for (i = 0; i < n_ops; i++)
1544         {
1545           bool replaced = false;
1546
1547           /* Don't scan match_operand here, since we've no reg class
1548              information to pass down.  Any operands that we could
1549              substitute in will be represented elsewhere.  */
1550           if (recog_data.constraints[i][0] == '\0')
1551             continue;
1552
1553           if (recog_data.operand_type[i] == OP_IN)
1554             {
1555               if (recog_op_alt[i][alt].is_address)
1556                 replaced
1557                   = replace_oldest_value_addr (recog_data.operand_loc[i],
1558                                                recog_op_alt[i][alt].class,
1559                                                VOIDmode, insn, vd);
1560               else if (REG_P (recog_data.operand[i]))
1561                 replaced
1562                   = replace_oldest_value_reg (recog_data.operand_loc[i],
1563                                               recog_op_alt[i][alt].class,
1564                                               insn, vd);
1565               else if (GET_CODE (recog_data.operand[i]) == MEM)
1566                 replaced = replace_oldest_value_mem (recog_data.operand[i],
1567                                                      insn, vd);
1568             }
1569           else if (GET_CODE (recog_data.operand[i]) == MEM)
1570             replaced = replace_oldest_value_mem (recog_data.operand[i],
1571                                                  insn, vd);
1572
1573           /* If we performed any replacement, update match_dups.  */
1574           if (replaced)
1575             {
1576               int j;
1577               rtx new;
1578
1579               changed = true;
1580
1581               new = *recog_data.operand_loc[i];
1582               recog_data.operand[i] = new;
1583               for (j = 0; j < recog_data.n_dups; j++)
1584                 if (recog_data.dup_num[j] == i)
1585                   *recog_data.dup_loc[j] = new;
1586             }
1587         }
1588
1589     did_replacement:
1590       /* Clobber call-clobbered registers.  */
1591       if (GET_CODE (insn) == CALL_INSN)
1592         for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
1593           if (TEST_HARD_REG_BIT (regs_invalidated_by_call, i))
1594             kill_value_regno (i, vd);
1595
1596       /* Notice stores.  */
1597       note_stores (PATTERN (insn), kill_set_value, vd);
1598
1599       /* Notice copies.  */
1600       if (set && REG_P (SET_DEST (set)) && REG_P (SET_SRC (set)))
1601         copy_value (SET_DEST (set), SET_SRC (set), vd);
1602
1603       if (insn == bb->end)
1604         break;
1605     }
1606
1607   return changed;
1608 }
1609
1610 /* Main entry point for the forward copy propagation optimization.  */
1611
1612 void
1613 copyprop_hardreg_forward ()
1614 {
1615   struct value_data *all_vd;
1616   bool need_refresh;
1617   int b;
1618
1619   need_refresh = false;
1620
1621   all_vd = xmalloc (sizeof (struct value_data) * n_basic_blocks);
1622
1623   for (b = 0; b < n_basic_blocks; b++)
1624     {
1625       basic_block bb = BASIC_BLOCK (b);
1626
1627       /* If a block has a single predecessor, that we've already
1628          processed, begin with the value data that was live at
1629          the end of the predecessor block.  */
1630       /* ??? Ought to use more intelligent queueing of blocks.  */
1631       if (bb->pred
1632           && ! bb->pred->pred_next 
1633           && ! (bb->pred->flags & (EDGE_ABNORMAL_CALL | EDGE_EH))
1634           && bb->pred->src->index != ENTRY_BLOCK
1635           && bb->pred->src->index < b)
1636         all_vd[b] = all_vd[bb->pred->src->index];
1637       else
1638         init_value_data (all_vd + b);
1639
1640       if (copyprop_hardreg_forward_1 (bb, all_vd + b))
1641         need_refresh = true;
1642     }
1643
1644   if (need_refresh)
1645     {
1646       if (rtl_dump_file)
1647         fputs ("\n\n", rtl_dump_file);
1648
1649       /* ??? Irritatingly, delete_noop_moves does not take a set of blocks
1650          to scan, so we have to do a life update with no initial set of
1651          blocks Just In Case.  */
1652       delete_noop_moves (get_insns ());
1653       update_life_info (NULL, UPDATE_LIFE_GLOBAL_RM_NOTES,
1654                         PROP_DEATH_NOTES
1655                         | PROP_SCAN_DEAD_CODE
1656                         | PROP_KILL_DEAD_CODE);
1657     }
1658
1659   free (all_vd);
1660 }
1661
1662 /* Dump the value chain data to stderr.  */
1663
1664 void
1665 debug_value_data (vd)
1666      struct value_data *vd;
1667 {
1668   HARD_REG_SET set;
1669   unsigned int i, j;
1670
1671   CLEAR_HARD_REG_SET (set);
1672
1673   for (i = 0; i < FIRST_PSEUDO_REGISTER; ++i)
1674     if (vd->e[i].oldest_regno == i)
1675       {
1676         if (vd->e[i].mode == VOIDmode)
1677           {
1678             if (vd->e[i].next_regno != INVALID_REGNUM)
1679               fprintf (stderr, "[%u] Bad next_regno for empty chain (%u)\n",
1680                        i, vd->e[i].next_regno);
1681             continue;
1682           }
1683
1684         SET_HARD_REG_BIT (set, i);
1685         fprintf (stderr, "[%u %s] ", i, GET_MODE_NAME (vd->e[i].mode));
1686
1687         for (j = vd->e[i].next_regno;
1688              j != INVALID_REGNUM;
1689              j = vd->e[j].next_regno)
1690           {
1691             if (TEST_HARD_REG_BIT (set, vd->e[j].next_regno))
1692               {
1693                 fprintf (stderr, "[%u] Loop in regno chain\n", j);
1694                 return;
1695               }
1696
1697             if (vd->e[j].oldest_regno != i)
1698               {
1699                 fprintf (stderr, "[%u] Bad oldest_regno (%u)\n",
1700                          j, vd->e[j].oldest_regno);
1701                 return;
1702               }
1703             SET_HARD_REG_BIT (set, j);
1704             fprintf (stderr, "[%u %s] ", j, GET_MODE_NAME (vd->e[j].mode));
1705           }
1706         fputc ('\n', stderr);
1707       }
1708
1709   for (i = 0; i < FIRST_PSEUDO_REGISTER; ++i)
1710     if (! TEST_HARD_REG_BIT (set, i)
1711         && (vd->e[i].mode != VOIDmode
1712             || vd->e[i].oldest_regno != i
1713             || vd->e[i].next_regno != INVALID_REGNUM))
1714       fprintf (stderr, "[%u] Non-empty reg in chain (%s %u %i)\n",
1715                i, GET_MODE_NAME (vd->e[i].mode), vd->e[i].oldest_regno,
1716                vd->e[i].next_regno);
1717 }
1718
1719 #ifdef ENABLE_CHECKING
1720 static void
1721 validate_value_data (vd)
1722      struct value_data *vd;
1723 {
1724   HARD_REG_SET set;
1725   unsigned int i, j;
1726
1727   CLEAR_HARD_REG_SET (set);
1728
1729   for (i = 0; i < FIRST_PSEUDO_REGISTER; ++i)
1730     if (vd->e[i].oldest_regno == i)
1731       {
1732         if (vd->e[i].mode == VOIDmode)
1733           {
1734             if (vd->e[i].next_regno != INVALID_REGNUM)
1735               internal_error ("validate_value_data: [%u] Bad next_regno for empty chain (%u)",
1736                               i, vd->e[i].next_regno);
1737             continue;
1738           }
1739
1740         SET_HARD_REG_BIT (set, i);
1741
1742         for (j = vd->e[i].next_regno;
1743              j != INVALID_REGNUM;
1744              j = vd->e[j].next_regno)
1745           {
1746             if (TEST_HARD_REG_BIT (set, j))
1747               internal_error ("validate_value_data: Loop in regno chain (%u)",
1748                               j);
1749             if (vd->e[j].oldest_regno != i)
1750               internal_error ("validate_value_data: [%u] Bad oldest_regno (%u)",
1751                               j, vd->e[j].oldest_regno);
1752
1753             SET_HARD_REG_BIT (set, j);
1754           }
1755       }
1756
1757   for (i = 0; i < FIRST_PSEUDO_REGISTER; ++i)
1758     if (! TEST_HARD_REG_BIT (set, i)
1759         && (vd->e[i].mode != VOIDmode
1760             || vd->e[i].oldest_regno != i
1761             || vd->e[i].next_regno != INVALID_REGNUM))
1762       internal_error ("validate_value_data: [%u] Non-empty reg in chain (%s %u %i)",
1763                       i, GET_MODE_NAME (vd->e[i].mode), vd->e[i].oldest_regno,
1764                       vd->e[i].next_regno);
1765 }
1766 #endif