OSDN Git Service

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