OSDN Git Service

PR middle-end/49875
[pf3gnuchains/gcc-fork.git] / gcc / regrename.c
1 /* Register renaming for the GNU compiler.
2    Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
3    2010 Free Software Foundation, Inc.
4
5    This file is part of GCC.
6
7    GCC is free software; you can redistribute it and/or modify it
8    under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 3, or (at your option)
10    any later version.
11
12    GCC is distributed in the hope that it will be useful, but WITHOUT
13    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14    or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
15    License for more details.
16
17    You should have received a copy of the GNU General Public License
18    along with GCC; see the file COPYING3.  If not see
19    <http://www.gnu.org/licenses/>.  */
20
21 #include "config.h"
22 #include "system.h"
23 #include "coretypes.h"
24 #include "tm.h"
25 #include "rtl-error.h"
26 #include "tm_p.h"
27 #include "insn-config.h"
28 #include "regs.h"
29 #include "addresses.h"
30 #include "hard-reg-set.h"
31 #include "basic-block.h"
32 #include "reload.h"
33 #include "output.h"
34 #include "function.h"
35 #include "recog.h"
36 #include "flags.h"
37 #include "obstack.h"
38 #include "timevar.h"
39 #include "tree-pass.h"
40 #include "df.h"
41 #include "target.h"
42
43 /* This file implements the RTL register renaming pass of the compiler.  It is
44    a semi-local pass whose goal is to maximize the usage of the register file
45    of the processor by substituting registers for others in the solution given
46    by the register allocator.  The algorithm is as follows:
47
48      1. Local def/use chains are built: within each basic block, chains are
49         opened and closed; if a chain isn't closed at the end of the block,
50         it is dropped.
51
52      2. For each chain, the set of possible renaming registers is computed.
53         This takes into account the renaming of previously processed chains.
54         Optionally, a preferred class is computed for the renaming register.
55
56      3. The best renaming register is computed for the chain in the above set,
57         using a round-robin allocation.  If a preferred class exists, then the
58         round-robin allocation is done within the class first, if possible.
59         The round-robin allocation of renaming registers itself is global.
60
61      4. If a renaming register has been found, it is substituted in the chain.
62
63   Targets can parameterize the pass by specifying a preferred class for the
64   renaming register for a given (super)class of registers to be renamed.  */
65
66 #if HOST_BITS_PER_WIDE_INT <= MAX_RECOG_OPERANDS
67 #error "Use a different bitmap implementation for untracked_operands."
68 #endif
69
70 /* We keep linked lists of DU_HEAD structures, each of which describes
71    a chain of occurrences of a reg.  */
72 struct du_head
73 {
74   /* The next chain.  */
75   struct du_head *next_chain;
76   /* The first and last elements of this chain.  */
77   struct du_chain *first, *last;
78   /* Describes the register being tracked.  */
79   unsigned regno, nregs;
80
81   /* A unique id to be used as an index into the conflicts bitmaps.  */
82   unsigned id;
83   /* A bitmap to record conflicts with other chains.  */
84   bitmap_head conflicts;
85   /* Conflicts with untracked hard registers.  */
86   HARD_REG_SET hard_conflicts;
87
88   /* Nonzero if the chain is finished; zero if it is still open.  */
89   unsigned int terminated:1;
90   /* Nonzero if the chain crosses a call.  */
91   unsigned int need_caller_save_reg:1;
92   /* Nonzero if the register is used in a way that prevents renaming,
93      such as the SET_DEST of a CALL_INSN or an asm operand that used
94      to be a hard register.  */
95   unsigned int cannot_rename:1;
96 };
97
98 /* This struct describes a single occurrence of a register.  */
99 struct du_chain
100 {
101   /* Links to the next occurrence of the register.  */
102   struct du_chain *next_use;
103
104   /* The insn where the register appears.  */
105   rtx insn;
106   /* The location inside the insn.  */
107   rtx *loc;
108   /* The register class required by the insn at this location.  */
109   ENUM_BITFIELD(reg_class) cl : 16;
110 };
111
112 enum scan_actions
113 {
114   terminate_write,
115   terminate_dead,
116   mark_all_read,
117   mark_read,
118   mark_write,
119   /* mark_access is for marking the destination regs in
120      REG_FRAME_RELATED_EXPR notes (as if they were read) so that the
121      note is updated properly.  */
122   mark_access
123 };
124
125 static const char * const scan_actions_name[] =
126 {
127   "terminate_write",
128   "terminate_dead",
129   "mark_all_read",
130   "mark_read",
131   "mark_write",
132   "mark_access"
133 };
134
135 static struct obstack rename_obstack;
136
137 static void do_replace (struct du_head *, int);
138 static void scan_rtx_reg (rtx, rtx *, enum reg_class,
139                           enum scan_actions, enum op_type);
140 static void scan_rtx_address (rtx, rtx *, enum reg_class,
141                               enum scan_actions, enum machine_mode);
142 static void scan_rtx (rtx, rtx *, enum reg_class, enum scan_actions,
143                       enum op_type);
144 static struct du_head *build_def_use (basic_block);
145 static void dump_def_use_chain (struct du_head *);
146
147 typedef struct du_head *du_head_p;
148 DEF_VEC_P (du_head_p);
149 DEF_VEC_ALLOC_P (du_head_p, heap);
150 static VEC(du_head_p, heap) *id_to_chain;
151
152 static void
153 free_chain_data (void)
154 {
155   int i;
156   du_head_p ptr;
157   for (i = 0; VEC_iterate(du_head_p, id_to_chain, i, ptr); i++)
158     bitmap_clear (&ptr->conflicts);
159
160   VEC_free (du_head_p, heap, id_to_chain);
161 }
162
163 /* For a def-use chain HEAD, find which registers overlap its lifetime and
164    set the corresponding bits in *PSET.  */
165
166 static void
167 merge_overlapping_regs (HARD_REG_SET *pset, struct du_head *head)
168 {
169   bitmap_iterator bi;
170   unsigned i;
171   IOR_HARD_REG_SET (*pset, head->hard_conflicts);
172   EXECUTE_IF_SET_IN_BITMAP (&head->conflicts, 0, i, bi)
173     {
174       du_head_p other = VEC_index (du_head_p, id_to_chain, i);
175       unsigned j = other->nregs;
176       while (j-- > 0)
177         SET_HARD_REG_BIT (*pset, other->regno + j);
178     }
179 }
180
181 /* Check if NEW_REG can be the candidate register to rename for
182    REG in THIS_HEAD chain.  THIS_UNAVAILABLE is a set of unavailable hard
183    registers.  */
184
185 static bool
186 check_new_reg_p (int reg ATTRIBUTE_UNUSED, int new_reg,
187                  struct du_head *this_head, HARD_REG_SET this_unavailable)
188 {
189   enum machine_mode mode = GET_MODE (*this_head->first->loc);
190   int nregs = hard_regno_nregs[new_reg][mode];
191   int i;
192   struct du_chain *tmp;
193
194   for (i = nregs - 1; i >= 0; --i)
195     if (TEST_HARD_REG_BIT (this_unavailable, new_reg + i)
196         || fixed_regs[new_reg + i]
197         || global_regs[new_reg + i]
198         /* Can't use regs which aren't saved by the prologue.  */
199         || (! df_regs_ever_live_p (new_reg + i)
200             && ! call_used_regs[new_reg + i])
201 #ifdef LEAF_REGISTERS
202         /* We can't use a non-leaf register if we're in a
203            leaf function.  */
204         || (current_function_is_leaf
205             && !LEAF_REGISTERS[new_reg + i])
206 #endif
207 #ifdef HARD_REGNO_RENAME_OK
208         || ! HARD_REGNO_RENAME_OK (reg + i, new_reg + i)
209 #endif
210         )
211       return false;
212
213   /* See whether it accepts all modes that occur in
214      definition and uses.  */
215   for (tmp = this_head->first; tmp; tmp = tmp->next_use)
216     if ((! HARD_REGNO_MODE_OK (new_reg, GET_MODE (*tmp->loc))
217          && ! DEBUG_INSN_P (tmp->insn))
218         || (this_head->need_caller_save_reg
219             && ! (HARD_REGNO_CALL_PART_CLOBBERED
220                   (reg, GET_MODE (*tmp->loc)))
221             && (HARD_REGNO_CALL_PART_CLOBBERED
222                 (new_reg, GET_MODE (*tmp->loc)))))
223       return false;
224
225   return true;
226 }
227
228 /* Perform register renaming on the current function.  */
229
230 static unsigned int
231 regrename_optimize (void)
232 {
233   int tick[FIRST_PSEUDO_REGISTER];
234   int this_tick = 0;
235   basic_block bb;
236   char *first_obj;
237
238   df_set_flags (DF_LR_RUN_DCE);
239   df_note_add_problem ();
240   df_analyze ();
241   df_set_flags (DF_DEFER_INSN_RESCAN);
242
243   memset (tick, 0, sizeof tick);
244
245   gcc_obstack_init (&rename_obstack);
246   first_obj = XOBNEWVAR (&rename_obstack, char, 0);
247
248   FOR_EACH_BB (bb)
249     {
250       struct du_head *all_chains = 0;
251       HARD_REG_SET unavailable;
252 #if 0
253       HARD_REG_SET regs_seen;
254       CLEAR_HARD_REG_SET (regs_seen);
255 #endif
256
257       id_to_chain = VEC_alloc (du_head_p, heap, 0);
258
259       CLEAR_HARD_REG_SET (unavailable);
260
261       if (dump_file)
262         fprintf (dump_file, "\nBasic block %d:\n", bb->index);
263
264       all_chains = build_def_use (bb);
265
266       if (dump_file)
267         dump_def_use_chain (all_chains);
268
269       CLEAR_HARD_REG_SET (unavailable);
270       /* Don't clobber traceback for noreturn functions.  */
271       if (frame_pointer_needed)
272         {
273           add_to_hard_reg_set (&unavailable, Pmode, FRAME_POINTER_REGNUM);
274 #if !HARD_FRAME_POINTER_IS_FRAME_POINTER
275           add_to_hard_reg_set (&unavailable, Pmode, HARD_FRAME_POINTER_REGNUM);
276 #endif
277         }
278
279       while (all_chains)
280         {
281           int new_reg, best_new_reg, best_nregs;
282           int n_uses;
283           struct du_head *this_head = all_chains;
284           struct du_chain *tmp;
285           HARD_REG_SET this_unavailable;
286           int reg = this_head->regno;
287           int pass;
288           enum reg_class super_class = NO_REGS;
289           enum reg_class preferred_class;
290           bool has_preferred_class;
291
292           all_chains = this_head->next_chain;
293
294           if (this_head->cannot_rename)
295             continue;
296
297           best_new_reg = reg;
298           best_nregs = this_head->nregs;
299
300 #if 0 /* This just disables optimization opportunities.  */
301           /* Only rename once we've seen the reg more than once.  */
302           if (! TEST_HARD_REG_BIT (regs_seen, reg))
303             {
304               SET_HARD_REG_BIT (regs_seen, reg);
305               continue;
306             }
307 #endif
308
309           if (fixed_regs[reg] || global_regs[reg]
310 #if !HARD_FRAME_POINTER_IS_FRAME_POINTER
311               || (frame_pointer_needed && reg == HARD_FRAME_POINTER_REGNUM)
312 #else
313               || (frame_pointer_needed && reg == FRAME_POINTER_REGNUM)
314 #endif
315               )
316             continue;
317
318           COPY_HARD_REG_SET (this_unavailable, unavailable);
319
320           /* Iterate over elements in the chain in order to:
321              1. Count number of uses, and narrow the set of registers we can
322                 use for renaming.
323              2. Compute the superunion of register classes in this chain.  */
324           n_uses = 0;
325           super_class = NO_REGS;
326           for (tmp = this_head->first; tmp; tmp = tmp->next_use)
327             {
328               if (DEBUG_INSN_P (tmp->insn))
329                 continue;
330               n_uses++;
331               IOR_COMPL_HARD_REG_SET (this_unavailable,
332                                       reg_class_contents[tmp->cl]);
333               super_class
334                 = reg_class_superunion[(int) super_class][(int) tmp->cl];
335             }
336
337           if (n_uses < 2)
338             continue;
339
340           /* Further narrow the set of registers we can use for renaming.
341              If the chain needs a call-saved register, mark the call-used
342              registers as unavailable.  */
343           if (this_head->need_caller_save_reg)
344             IOR_HARD_REG_SET (this_unavailable, call_used_reg_set);
345
346           /* And mark registers that overlap its lifetime as unavailable.  */
347           merge_overlapping_regs (&this_unavailable, this_head);
348
349           /* Compute preferred rename class of super union of all the classes
350              in the chain.  */
351           preferred_class
352             = (enum reg_class) targetm.preferred_rename_class (super_class);
353
354           /* If PREFERRED_CLASS is not NO_REGS, we iterate in the first pass
355              over registers that belong to PREFERRED_CLASS and try to find the
356              best register within the class.  If that failed, we iterate in
357              the second pass over registers that don't belong to the class.
358              If PREFERRED_CLASS is NO_REGS, we iterate over all registers in
359              ascending order without any preference.  */
360           has_preferred_class = (preferred_class != NO_REGS);
361           for (pass = (has_preferred_class ? 0 : 1); pass < 2; pass++)
362             {
363               for (new_reg = 0; new_reg < FIRST_PSEUDO_REGISTER; new_reg++)
364                 {
365                   if (has_preferred_class
366                       && (pass == 0)
367                          != TEST_HARD_REG_BIT
368                             (reg_class_contents[preferred_class], new_reg))
369                     continue;
370
371                   /* In the first pass, we force the renaming of registers that
372                      don't belong to PREFERRED_CLASS to registers that do, even
373                      though the latters were used not very long ago.  */
374                   if (check_new_reg_p (reg, new_reg, this_head,
375                                        this_unavailable)
376                       && ((pass == 0
377                            && !TEST_HARD_REG_BIT
378                                (reg_class_contents[preferred_class],
379                                 best_new_reg))
380                           || tick[best_new_reg] > tick[new_reg]))
381                     {
382                       enum machine_mode mode
383                         = GET_MODE (*this_head->first->loc);
384                       best_new_reg = new_reg;
385                       best_nregs = hard_regno_nregs[new_reg][mode];
386                     }
387                 }
388               if (pass == 0 && best_new_reg != reg)
389                 break;
390             }
391
392           if (dump_file)
393             {
394               fprintf (dump_file, "Register %s in insn %d",
395                        reg_names[reg], INSN_UID (this_head->first->insn));
396               if (this_head->need_caller_save_reg)
397                 fprintf (dump_file, " crosses a call");
398             }
399
400           if (best_new_reg == reg)
401             {
402               tick[reg] = ++this_tick;
403               if (dump_file)
404                 fprintf (dump_file, "; no available better choice\n");
405               continue;
406             }
407
408           if (dump_file)
409             fprintf (dump_file, ", renamed as %s\n", reg_names[best_new_reg]);
410
411           do_replace (this_head, best_new_reg);
412           this_head->regno = best_new_reg;
413           this_head->nregs = best_nregs;
414           tick[best_new_reg] = ++this_tick;
415           df_set_regs_ever_live (best_new_reg, true);
416         }
417
418       free_chain_data ();
419       obstack_free (&rename_obstack, first_obj);
420     }
421
422   obstack_free (&rename_obstack, NULL);
423
424   if (dump_file)
425     fputc ('\n', dump_file);
426
427   return 0;
428 }
429
430 static void
431 do_replace (struct du_head *head, int reg)
432 {
433   struct du_chain *chain;
434   unsigned int base_regno = head->regno;
435
436   gcc_assert (! DEBUG_INSN_P (head->first->insn));
437
438   for (chain = head->first; chain; chain = chain->next_use)
439     {
440       unsigned int regno = ORIGINAL_REGNO (*chain->loc);
441       struct reg_attrs *attr = REG_ATTRS (*chain->loc);
442       int reg_ptr = REG_POINTER (*chain->loc);
443
444       if (DEBUG_INSN_P (chain->insn) && REGNO (*chain->loc) != base_regno)
445         INSN_VAR_LOCATION_LOC (chain->insn) = gen_rtx_UNKNOWN_VAR_LOC ();
446       else
447         {
448           *chain->loc = gen_raw_REG (GET_MODE (*chain->loc), reg);
449           if (regno >= FIRST_PSEUDO_REGISTER)
450             ORIGINAL_REGNO (*chain->loc) = regno;
451           REG_ATTRS (*chain->loc) = attr;
452           REG_POINTER (*chain->loc) = reg_ptr;
453         }
454
455       df_insn_rescan (chain->insn);
456     }
457 }
458
459
460 /* Walk all chains starting with CHAINS and record that they conflict with
461    another chain whose id is ID.  */
462
463 static void
464 mark_conflict (struct du_head *chains, unsigned id)
465 {
466   while (chains)
467     {
468       bitmap_set_bit (&chains->conflicts, id);
469       chains = chains->next_chain;
470     }
471 }
472
473 /* True if we found a register with a size mismatch, which means that we
474    can't track its lifetime accurately.  If so, we abort the current block
475    without renaming.  */
476 static bool fail_current_block;
477
478 /* The id to be given to the next opened chain.  */
479 static unsigned current_id;
480
481 /* List of currently open chains, and closed chains that can be renamed.  */
482 static struct du_head *open_chains;
483 static struct du_head *closed_chains;
484
485 /* Bitmap of open chains.  The bits set always match the list found in
486    open_chains.  */
487 static bitmap_head open_chains_set;
488
489 /* Record the registers being tracked in open_chains.  */
490 static HARD_REG_SET live_in_chains;
491
492 /* Record the registers that are live but not tracked.  The intersection
493    between this and live_in_chains is empty.  */
494 static HARD_REG_SET live_hard_regs;
495
496 /* Return true if OP is a reg for which all bits are set in PSET, false
497    if all bits are clear.
498    In other cases, set fail_current_block and return false.  */
499
500 static bool
501 verify_reg_in_set (rtx op, HARD_REG_SET *pset)
502 {
503   unsigned regno, nregs;
504   bool all_live, all_dead;
505   if (!REG_P (op))
506     return false;
507
508   regno = REGNO (op);
509   nregs = hard_regno_nregs[regno][GET_MODE (op)];
510   all_live = all_dead = true;
511   while (nregs-- > 0)
512     if (TEST_HARD_REG_BIT (*pset, regno + nregs))
513       all_dead = false;
514     else
515       all_live = false;
516   if (!all_dead && !all_live)
517     {
518       fail_current_block = true;
519       return false;
520     }
521   return all_live;
522 }
523
524 /* Return true if OP is a reg that is being tracked already in some form.
525    May set fail_current_block if it sees an unhandled case of overlap.  */
526
527 static bool
528 verify_reg_tracked (rtx op)
529 {
530   return (verify_reg_in_set (op, &live_hard_regs)
531           || verify_reg_in_set (op, &live_in_chains));
532 }
533
534 /* Called through note_stores.  DATA points to a rtx_code, either SET or
535    CLOBBER, which tells us which kind of rtx to look at.  If we have a
536    match, record the set register in live_hard_regs and in the hard_conflicts
537    bitmap of open chains.  */
538
539 static void
540 note_sets_clobbers (rtx x, const_rtx set, void *data)
541 {
542   enum rtx_code code = *(enum rtx_code *)data;
543   struct du_head *chain;
544
545   if (GET_CODE (x) == SUBREG)
546     x = SUBREG_REG (x);
547   if (!REG_P (x) || GET_CODE (set) != code)
548     return;
549   /* There must not be pseudos at this point.  */
550   gcc_assert (HARD_REGISTER_P (x));
551   add_to_hard_reg_set (&live_hard_regs, GET_MODE (x), REGNO (x));
552   for (chain = open_chains; chain; chain = chain->next_chain)
553     add_to_hard_reg_set (&chain->hard_conflicts, GET_MODE (x), REGNO (x));
554 }
555
556 /* Create a new chain for THIS_NREGS registers starting at THIS_REGNO,
557    and record its occurrence in *LOC, which is being written to in INSN.
558    This access requires a register of class CL.  */
559
560 static void
561 create_new_chain (unsigned this_regno, unsigned this_nregs, rtx *loc,
562                   rtx insn, enum reg_class cl)
563 {
564   struct du_head *head = XOBNEW (&rename_obstack, struct du_head);
565   struct du_chain *this_du;
566   int nregs;
567
568   head->next_chain = open_chains;
569   open_chains = head;
570   head->regno = this_regno;
571   head->nregs = this_nregs;
572   head->need_caller_save_reg = 0;
573   head->cannot_rename = 0;
574   head->terminated = 0;
575
576   VEC_safe_push (du_head_p, heap, id_to_chain, head);
577   head->id = current_id++;
578
579   bitmap_initialize (&head->conflicts, &bitmap_default_obstack);
580   bitmap_copy (&head->conflicts, &open_chains_set);
581   mark_conflict (open_chains, head->id);
582
583   /* Since we're tracking this as a chain now, remove it from the
584      list of conflicting live hard registers and track it in
585      live_in_chains instead.  */
586   nregs = head->nregs;
587   while (nregs-- > 0)
588     {
589       SET_HARD_REG_BIT (live_in_chains, head->regno + nregs);
590       CLEAR_HARD_REG_BIT (live_hard_regs, head->regno + nregs);
591     }
592
593   COPY_HARD_REG_SET (head->hard_conflicts, live_hard_regs);
594   bitmap_set_bit (&open_chains_set, head->id);
595
596   open_chains = head;
597
598   if (dump_file)
599     {
600       fprintf (dump_file, "Creating chain %s (%d)",
601                reg_names[head->regno], head->id);
602       if (insn != NULL_RTX)
603         fprintf (dump_file, " at insn %d", INSN_UID (insn));
604       fprintf (dump_file, "\n");
605     }
606
607   if (insn == NULL_RTX)
608     {
609       head->first = head->last = NULL;
610       return;
611     }
612
613   this_du = XOBNEW (&rename_obstack, struct du_chain);
614   head->first = head->last = this_du;
615
616   this_du->next_use = 0;
617   this_du->loc = loc;
618   this_du->insn = insn;
619   this_du->cl = cl;
620 }
621
622 static void
623 scan_rtx_reg (rtx insn, rtx *loc, enum reg_class cl, enum scan_actions action,
624               enum op_type type)
625 {
626   struct du_head **p;
627   rtx x = *loc;
628   enum machine_mode mode = GET_MODE (x);
629   unsigned this_regno = REGNO (x);
630   unsigned this_nregs = hard_regno_nregs[this_regno][mode];
631
632   if (action == mark_write)
633     {
634       if (type == OP_OUT)
635         create_new_chain (this_regno, this_nregs, loc, insn, cl);
636       return;
637     }
638
639   if ((type == OP_OUT) != (action == terminate_write || action == mark_access))
640     return;
641
642   for (p = &open_chains; *p;)
643     {
644       struct du_head *head = *p;
645       struct du_head *next = head->next_chain;
646       int exact_match = (head->regno == this_regno
647                          && head->nregs == this_nregs);
648       int superset = (this_regno <= head->regno
649                       && this_regno + this_nregs >= head->regno + head->nregs);
650       int subset = (this_regno >= head->regno
651                       && this_regno + this_nregs <= head->regno + head->nregs);
652
653       if (head->terminated
654           || head->regno + head->nregs <= this_regno
655           || this_regno + this_nregs <= head->regno)
656         {
657           p = &head->next_chain;
658           continue;
659         }
660
661       if (action == mark_read || action == mark_access)
662         {
663           /* ??? Class NO_REGS can happen if the md file makes use of
664              EXTRA_CONSTRAINTS to match registers.  Which is arguably
665              wrong, but there we are.  */
666
667           if (cl == NO_REGS || (!exact_match && !DEBUG_INSN_P (insn)))
668             {
669               if (dump_file)
670                 fprintf (dump_file,
671                          "Cannot rename chain %s (%d) at insn %d (%s)\n",
672                          reg_names[head->regno], head->id, INSN_UID (insn),
673                          scan_actions_name[(int) action]);
674               head->cannot_rename = 1;
675               if (superset)
676                 {
677                   unsigned nregs = this_nregs;
678                   head->regno = this_regno;
679                   head->nregs = this_nregs;
680                   while (nregs-- > 0)
681                     SET_HARD_REG_BIT (live_in_chains, head->regno + nregs);
682                   if (dump_file)
683                     fprintf (dump_file,
684                              "Widening register in chain %s (%d) at insn %d\n",
685                              reg_names[head->regno], head->id, INSN_UID (insn));
686                 }
687               else if (!subset)
688                 {
689                   fail_current_block = true;
690                   if (dump_file)
691                     fprintf (dump_file,
692                              "Failing basic block due to unhandled overlap\n");
693                 }
694             }
695           else
696             {
697               struct du_chain *this_du;
698               this_du = XOBNEW (&rename_obstack, struct du_chain);
699               this_du->next_use = 0;
700               this_du->loc = loc;
701               this_du->insn = insn;
702               this_du->cl = cl;
703               if (head->first == NULL)
704                 head->first = this_du;
705               else
706                 head->last->next_use = this_du;
707               head->last = this_du;
708             }
709           /* Avoid adding the same location in a DEBUG_INSN multiple times,
710              which could happen with non-exact overlap.  */
711           if (DEBUG_INSN_P (insn))
712             return;
713           /* Otherwise, find any other chains that do not match exactly;
714              ensure they all get marked unrenamable.  */
715           p = &head->next_chain;
716           continue;
717         }
718
719       /* Whether the terminated chain can be used for renaming
720          depends on the action and this being an exact match.
721          In either case, we remove this element from open_chains.  */
722
723       if ((action == terminate_dead || action == terminate_write)
724           && (superset || subset))
725         {
726           unsigned nregs;
727
728           head->terminated = 1;
729           if (subset && !superset)
730             head->cannot_rename = 1;
731           head->next_chain = closed_chains;
732           closed_chains = head;
733           bitmap_clear_bit (&open_chains_set, head->id);
734
735           nregs = head->nregs;
736           while (nregs-- > 0)
737             {
738               CLEAR_HARD_REG_BIT (live_in_chains, head->regno + nregs);
739               if (subset && !superset
740                   && (head->regno + nregs < this_regno
741                       || head->regno + nregs >= this_regno + this_nregs))
742                 SET_HARD_REG_BIT (live_hard_regs, head->regno + nregs);
743             }
744
745           *p = next;
746           if (dump_file)
747             fprintf (dump_file,
748                      "Closing chain %s (%d) at insn %d (%s%s)\n",
749                      reg_names[head->regno], head->id, INSN_UID (insn),
750                      scan_actions_name[(int) action],
751                      superset ? ", superset" : subset ? ", subset" : "");
752         }
753       else if (action == terminate_dead || action == terminate_write)
754         {
755           /* In this case, tracking liveness gets too hard.  Fail the
756              entire basic block.  */
757           if (dump_file)
758             fprintf (dump_file,
759                      "Failing basic block due to unhandled overlap\n");
760           fail_current_block = true;
761           return;
762         }
763       else
764         {
765           head->cannot_rename = 1;
766           if (dump_file)
767             fprintf (dump_file,
768                      "Cannot rename chain %s (%d) at insn %d (%s)\n",
769                      reg_names[head->regno], head->id, INSN_UID (insn),
770                      scan_actions_name[(int) action]);
771           p = &head->next_chain;
772         }
773     }
774 }
775
776 /* Adapted from find_reloads_address_1.  CL is INDEX_REG_CLASS or
777    BASE_REG_CLASS depending on how the register is being considered.  */
778
779 static void
780 scan_rtx_address (rtx insn, rtx *loc, enum reg_class cl,
781                   enum scan_actions action, enum machine_mode mode)
782 {
783   rtx x = *loc;
784   RTX_CODE code = GET_CODE (x);
785   const char *fmt;
786   int i, j;
787
788   if (action == mark_write || action == mark_access)
789     return;
790
791   switch (code)
792     {
793     case PLUS:
794       {
795         rtx orig_op0 = XEXP (x, 0);
796         rtx orig_op1 = XEXP (x, 1);
797         RTX_CODE code0 = GET_CODE (orig_op0);
798         RTX_CODE code1 = GET_CODE (orig_op1);
799         rtx op0 = orig_op0;
800         rtx op1 = orig_op1;
801         rtx *locI = NULL;
802         rtx *locB = NULL;
803         enum rtx_code index_code = SCRATCH;
804
805         if (GET_CODE (op0) == SUBREG)
806           {
807             op0 = SUBREG_REG (op0);
808             code0 = GET_CODE (op0);
809           }
810
811         if (GET_CODE (op1) == SUBREG)
812           {
813             op1 = SUBREG_REG (op1);
814             code1 = GET_CODE (op1);
815           }
816
817         if (code0 == MULT || code0 == SIGN_EXTEND || code0 == TRUNCATE
818             || code0 == ZERO_EXTEND || code1 == MEM)
819           {
820             locI = &XEXP (x, 0);
821             locB = &XEXP (x, 1);
822             index_code = GET_CODE (*locI);
823           }
824         else if (code1 == MULT || code1 == SIGN_EXTEND || code1 == TRUNCATE
825                  || code1 == ZERO_EXTEND || code0 == MEM)
826           {
827             locI = &XEXP (x, 1);
828             locB = &XEXP (x, 0);
829             index_code = GET_CODE (*locI);
830           }
831         else if (code0 == CONST_INT || code0 == CONST
832                  || code0 == SYMBOL_REF || code0 == LABEL_REF)
833           {
834             locB = &XEXP (x, 1);
835             index_code = GET_CODE (XEXP (x, 0));
836           }
837         else if (code1 == CONST_INT || code1 == CONST
838                  || code1 == SYMBOL_REF || code1 == LABEL_REF)
839           {
840             locB = &XEXP (x, 0);
841             index_code = GET_CODE (XEXP (x, 1));
842           }
843         else if (code0 == REG && code1 == REG)
844           {
845             int index_op;
846             unsigned regno0 = REGNO (op0), regno1 = REGNO (op1);
847
848             if (REGNO_OK_FOR_INDEX_P (regno1)
849                 && regno_ok_for_base_p (regno0, mode, PLUS, REG))
850               index_op = 1;
851             else if (REGNO_OK_FOR_INDEX_P (regno0)
852                      && regno_ok_for_base_p (regno1, mode, PLUS, REG))
853               index_op = 0;
854             else if (regno_ok_for_base_p (regno0, mode, PLUS, REG)
855                      || REGNO_OK_FOR_INDEX_P (regno1))
856               index_op = 1;
857             else if (regno_ok_for_base_p (regno1, mode, PLUS, REG))
858               index_op = 0;
859             else
860               index_op = 1;
861
862             locI = &XEXP (x, index_op);
863             locB = &XEXP (x, !index_op);
864             index_code = GET_CODE (*locI);
865           }
866         else if (code0 == REG)
867           {
868             locI = &XEXP (x, 0);
869             locB = &XEXP (x, 1);
870             index_code = GET_CODE (*locI);
871           }
872         else if (code1 == REG)
873           {
874             locI = &XEXP (x, 1);
875             locB = &XEXP (x, 0);
876             index_code = GET_CODE (*locI);
877           }
878
879         if (locI)
880           scan_rtx_address (insn, locI, INDEX_REG_CLASS, action, mode);
881         if (locB)
882           scan_rtx_address (insn, locB, base_reg_class (mode, PLUS, index_code),
883                             action, mode);
884
885         return;
886       }
887
888     case POST_INC:
889     case POST_DEC:
890     case POST_MODIFY:
891     case PRE_INC:
892     case PRE_DEC:
893     case PRE_MODIFY:
894 #ifndef AUTO_INC_DEC
895       /* If the target doesn't claim to handle autoinc, this must be
896          something special, like a stack push.  Kill this chain.  */
897       action = mark_all_read;
898 #endif
899       break;
900
901     case MEM:
902       scan_rtx_address (insn, &XEXP (x, 0),
903                         base_reg_class (GET_MODE (x), MEM, SCRATCH), action,
904                         GET_MODE (x));
905       return;
906
907     case REG:
908       scan_rtx_reg (insn, loc, cl, action, OP_IN);
909       return;
910
911     default:
912       break;
913     }
914
915   fmt = GET_RTX_FORMAT (code);
916   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
917     {
918       if (fmt[i] == 'e')
919         scan_rtx_address (insn, &XEXP (x, i), cl, action, mode);
920       else if (fmt[i] == 'E')
921         for (j = XVECLEN (x, i) - 1; j >= 0; j--)
922           scan_rtx_address (insn, &XVECEXP (x, i, j), cl, action, mode);
923     }
924 }
925
926 static void
927 scan_rtx (rtx insn, rtx *loc, enum reg_class cl, enum scan_actions action,
928           enum op_type type)
929 {
930   const char *fmt;
931   rtx x = *loc;
932   enum rtx_code code = GET_CODE (x);
933   int i, j;
934
935   code = GET_CODE (x);
936   switch (code)
937     {
938     case CONST:
939     case CONST_INT:
940     case CONST_DOUBLE:
941     case CONST_FIXED:
942     case CONST_VECTOR:
943     case SYMBOL_REF:
944     case LABEL_REF:
945     case CC0:
946     case PC:
947       return;
948
949     case REG:
950       scan_rtx_reg (insn, loc, cl, action, type);
951       return;
952
953     case MEM:
954       scan_rtx_address (insn, &XEXP (x, 0),
955                         base_reg_class (GET_MODE (x), MEM, SCRATCH), action,
956                         GET_MODE (x));
957       return;
958
959     case SET:
960       scan_rtx (insn, &SET_SRC (x), cl, action, OP_IN);
961       scan_rtx (insn, &SET_DEST (x), cl, action,
962                 (GET_CODE (PATTERN (insn)) == COND_EXEC
963                  && verify_reg_tracked (SET_DEST (x))) ? OP_INOUT : OP_OUT);
964       return;
965
966     case STRICT_LOW_PART:
967       scan_rtx (insn, &XEXP (x, 0), cl, action,
968                 verify_reg_tracked (XEXP (x, 0)) ? OP_INOUT : OP_OUT);
969       return;
970
971     case ZERO_EXTRACT:
972     case SIGN_EXTRACT:
973       scan_rtx (insn, &XEXP (x, 0), cl, action,
974                 (type == OP_IN ? OP_IN :
975                  verify_reg_tracked (XEXP (x, 0)) ? OP_INOUT : OP_OUT));
976       scan_rtx (insn, &XEXP (x, 1), cl, action, OP_IN);
977       scan_rtx (insn, &XEXP (x, 2), cl, action, OP_IN);
978       return;
979
980     case POST_INC:
981     case PRE_INC:
982     case POST_DEC:
983     case PRE_DEC:
984     case POST_MODIFY:
985     case PRE_MODIFY:
986       /* Should only happen inside MEM.  */
987       gcc_unreachable ();
988
989     case CLOBBER:
990       scan_rtx (insn, &SET_DEST (x), cl, action,
991                 (GET_CODE (PATTERN (insn)) == COND_EXEC
992                  && verify_reg_tracked (SET_DEST (x))) ? OP_INOUT : OP_OUT);
993       return;
994
995     case EXPR_LIST:
996       scan_rtx (insn, &XEXP (x, 0), cl, action, type);
997       if (XEXP (x, 1))
998         scan_rtx (insn, &XEXP (x, 1), cl, action, type);
999       return;
1000
1001     default:
1002       break;
1003     }
1004
1005   fmt = GET_RTX_FORMAT (code);
1006   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1007     {
1008       if (fmt[i] == 'e')
1009         scan_rtx (insn, &XEXP (x, i), cl, action, type);
1010       else if (fmt[i] == 'E')
1011         for (j = XVECLEN (x, i) - 1; j >= 0; j--)
1012           scan_rtx (insn, &XVECEXP (x, i, j), cl, action, type);
1013     }
1014 }
1015
1016 /* Hide operands of the current insn (of which there are N_OPS) by
1017    substituting cc0 for them.
1018    Previous values are stored in the OLD_OPERANDS and OLD_DUPS.
1019    For every bit set in DO_NOT_HIDE, we leave the operand alone.
1020    If INOUT_AND_EC_ONLY is set, we only do this for OP_INOUT type operands
1021    and earlyclobbers.  */
1022
1023 static void
1024 hide_operands (int n_ops, rtx *old_operands, rtx *old_dups,
1025                unsigned HOST_WIDE_INT do_not_hide, bool inout_and_ec_only)
1026 {
1027   int i;
1028   int alt = which_alternative;
1029   for (i = 0; i < n_ops; i++)
1030     {
1031       old_operands[i] = recog_data.operand[i];
1032       /* Don't squash match_operator or match_parallel here, since
1033          we don't know that all of the contained registers are
1034          reachable by proper operands.  */
1035       if (recog_data.constraints[i][0] == '\0')
1036         continue;
1037       if (do_not_hide & (1 << i))
1038         continue;
1039       if (!inout_and_ec_only || recog_data.operand_type[i] == OP_INOUT
1040           || recog_op_alt[i][alt].earlyclobber)
1041         *recog_data.operand_loc[i] = cc0_rtx;
1042     }
1043   for (i = 0; i < recog_data.n_dups; i++)
1044     {
1045       int opn = recog_data.dup_num[i];
1046       old_dups[i] = *recog_data.dup_loc[i];
1047       if (do_not_hide & (1 << opn))
1048         continue;
1049       if (!inout_and_ec_only || recog_data.operand_type[opn] == OP_INOUT
1050           || recog_op_alt[opn][alt].earlyclobber)
1051         *recog_data.dup_loc[i] = cc0_rtx;
1052     }
1053 }
1054
1055 /* Undo the substitution performed by hide_operands.  INSN is the insn we
1056    are processing; the arguments are the same as in hide_operands.  */
1057
1058 static void
1059 restore_operands (rtx insn, int n_ops, rtx *old_operands, rtx *old_dups)
1060 {
1061   int i;
1062   for (i = 0; i < recog_data.n_dups; i++)
1063     *recog_data.dup_loc[i] = old_dups[i];
1064   for (i = 0; i < n_ops; i++)
1065     *recog_data.operand_loc[i] = old_operands[i];
1066   if (recog_data.n_dups)
1067     df_insn_rescan (insn);
1068 }
1069
1070 /* For each output operand of INSN, call scan_rtx to create a new
1071    open chain.  Do this only for normal or earlyclobber outputs,
1072    depending on EARLYCLOBBER.  */
1073
1074 static void
1075 record_out_operands (rtx insn, bool earlyclobber)
1076 {
1077   int n_ops = recog_data.n_operands;
1078   int alt = which_alternative;
1079
1080   int i;
1081
1082   for (i = 0; i < n_ops + recog_data.n_dups; i++)
1083     {
1084       int opn = i < n_ops ? i : recog_data.dup_num[i - n_ops];
1085       rtx *loc = (i < n_ops
1086                   ? recog_data.operand_loc[opn]
1087                   : recog_data.dup_loc[i - n_ops]);
1088       rtx op = *loc;
1089       enum reg_class cl = recog_op_alt[opn][alt].cl;
1090
1091       struct du_head *prev_open;
1092
1093       if (recog_data.operand_type[opn] != OP_OUT
1094           || recog_op_alt[opn][alt].earlyclobber != earlyclobber)
1095         continue;
1096
1097       prev_open = open_chains;
1098       scan_rtx (insn, loc, cl, mark_write, OP_OUT);
1099
1100       /* ??? Many targets have output constraints on the SET_DEST
1101          of a call insn, which is stupid, since these are certainly
1102          ABI defined hard registers.  For these, and for asm operands
1103          that originally referenced hard registers, we must record that
1104          the chain cannot be renamed.  */
1105       if (CALL_P (insn)
1106           || (asm_noperands (PATTERN (insn)) > 0
1107               && REG_P (op)
1108               && REGNO (op) == ORIGINAL_REGNO (op)))
1109         {
1110           if (prev_open != open_chains)
1111             open_chains->cannot_rename = 1;
1112         }
1113     }
1114 }
1115
1116 /* Build def/use chain.  */
1117
1118 static struct du_head *
1119 build_def_use (basic_block bb)
1120 {
1121   rtx insn;
1122   df_ref *def_rec;
1123   unsigned HOST_WIDE_INT untracked_operands;
1124
1125   open_chains = closed_chains = NULL;
1126
1127   fail_current_block = false;
1128
1129   current_id = 0;
1130   bitmap_initialize (&open_chains_set, &bitmap_default_obstack);
1131   CLEAR_HARD_REG_SET (live_in_chains);
1132   REG_SET_TO_HARD_REG_SET (live_hard_regs, df_get_live_in (bb));
1133   for (def_rec = df_get_artificial_defs (bb->index); *def_rec; def_rec++)
1134     {
1135       df_ref def = *def_rec;
1136       if (DF_REF_FLAGS (def) & DF_REF_AT_TOP)
1137         SET_HARD_REG_BIT (live_hard_regs, DF_REF_REGNO (def));
1138     }
1139
1140   for (insn = BB_HEAD (bb); ; insn = NEXT_INSN (insn))
1141     {
1142       if (NONDEBUG_INSN_P (insn))
1143         {
1144           int n_ops;
1145           rtx note;
1146           rtx old_operands[MAX_RECOG_OPERANDS];
1147           rtx old_dups[MAX_DUP_OPERANDS];
1148           int i;
1149           int alt;
1150           int predicated;
1151           enum rtx_code set_code = SET;
1152           enum rtx_code clobber_code = CLOBBER;
1153
1154           /* Process the insn, determining its effect on the def-use
1155              chains and live hard registers.  We perform the following
1156              steps with the register references in the insn, simulating
1157              its effect:
1158              (1) Deal with earlyclobber operands and CLOBBERs of non-operands
1159                  by creating chains and marking hard regs live.
1160              (2) Any read outside an operand causes any chain it overlaps
1161                  with to be marked unrenamable.
1162              (3) Any read inside an operand is added if there's already
1163                  an open chain for it.
1164              (4) For any REG_DEAD note we find, close open chains that
1165                  overlap it.
1166              (5) For any non-earlyclobber write we find, close open chains
1167                  that overlap it.
1168              (6) For any non-earlyclobber write we find in an operand, make
1169                  a new chain or mark the hard register as live.
1170              (7) For any REG_UNUSED, close any chains we just opened.
1171
1172              We cannot deal with situations where we track a reg in one mode
1173              and see a reference in another mode; these will cause the chain
1174              to be marked unrenamable or even cause us to abort the entire
1175              basic block.  */
1176
1177           extract_insn (insn);
1178           if (! constrain_operands (1))
1179             fatal_insn_not_found (insn);
1180           preprocess_constraints ();
1181           alt = which_alternative;
1182           n_ops = recog_data.n_operands;
1183           untracked_operands = 0;
1184
1185           /* Simplify the code below by rewriting things to reflect
1186              matching constraints.  Also promote OP_OUT to OP_INOUT in
1187              predicated instructions, but only for register operands
1188              that are already tracked, so that we can create a chain
1189              when the first SET makes a register live.  */
1190
1191           predicated = GET_CODE (PATTERN (insn)) == COND_EXEC;
1192           for (i = 0; i < n_ops; ++i)
1193             {
1194               rtx op = recog_data.operand[i];
1195               int matches = recog_op_alt[i][alt].matches;
1196               if (matches >= 0)
1197                 recog_op_alt[i][alt].cl = recog_op_alt[matches][alt].cl;
1198               if (matches >= 0 || recog_op_alt[i][alt].matched >= 0
1199                   || (predicated && recog_data.operand_type[i] == OP_OUT))
1200                 {
1201                   recog_data.operand_type[i] = OP_INOUT;
1202                   /* A special case to deal with instruction patterns that
1203                      have matching operands with different modes.  If we're
1204                      not already tracking such a reg, we won't start here,
1205                      and we must instead make sure to make the operand visible
1206                      to the machinery that tracks hard registers.  */
1207                   if (matches >= 0
1208                       && (GET_MODE_SIZE (recog_data.operand_mode[i])
1209                           != GET_MODE_SIZE (recog_data.operand_mode[matches]))
1210                       && !verify_reg_in_set (op, &live_in_chains))
1211                     {
1212                       untracked_operands |= 1 << i;
1213                       untracked_operands |= 1 << matches;
1214                     }
1215                 }
1216               /* If there's an in-out operand with a register that is not
1217                  being tracked at all yet, open a chain.  */
1218               if (recog_data.operand_type[i] == OP_INOUT
1219                   && !(untracked_operands & (1 << i))
1220                   && REG_P (op)
1221                   && !verify_reg_tracked (op))
1222                 {
1223                   enum machine_mode mode = GET_MODE (op);
1224                   unsigned this_regno = REGNO (op);
1225                   unsigned this_nregs = hard_regno_nregs[this_regno][mode];
1226                   create_new_chain (this_regno, this_nregs, NULL, NULL_RTX,
1227                                     NO_REGS);
1228                 }
1229             }
1230
1231           if (fail_current_block)
1232             break;
1233
1234           /* Step 1a: Mark hard registers that are clobbered in this insn,
1235              outside an operand, as live.  */
1236           hide_operands (n_ops, old_operands, old_dups, untracked_operands,
1237                          false);
1238           note_stores (PATTERN (insn), note_sets_clobbers, &clobber_code);
1239           restore_operands (insn, n_ops, old_operands, old_dups);
1240
1241           /* Step 1b: Begin new chains for earlyclobbered writes inside
1242              operands.  */
1243           record_out_operands (insn, true);
1244
1245           /* Step 2: Mark chains for which we have reads outside operands
1246              as unrenamable.
1247              We do this by munging all operands into CC0, and closing
1248              everything remaining.  */
1249
1250           hide_operands (n_ops, old_operands, old_dups, untracked_operands,
1251                          false);
1252           scan_rtx (insn, &PATTERN (insn), NO_REGS, mark_all_read, OP_IN);
1253           restore_operands (insn, n_ops, old_operands, old_dups);
1254
1255           /* Step 2B: Can't rename function call argument registers.  */
1256           if (CALL_P (insn) && CALL_INSN_FUNCTION_USAGE (insn))
1257             scan_rtx (insn, &CALL_INSN_FUNCTION_USAGE (insn),
1258                       NO_REGS, mark_all_read, OP_IN);
1259
1260           /* Step 2C: Can't rename asm operands that were originally
1261              hard registers.  */
1262           if (asm_noperands (PATTERN (insn)) > 0)
1263             for (i = 0; i < n_ops; i++)
1264               {
1265                 rtx *loc = recog_data.operand_loc[i];
1266                 rtx op = *loc;
1267
1268                 if (REG_P (op)
1269                     && REGNO (op) == ORIGINAL_REGNO (op)
1270                     && (recog_data.operand_type[i] == OP_IN
1271                         || recog_data.operand_type[i] == OP_INOUT))
1272                   scan_rtx (insn, loc, NO_REGS, mark_all_read, OP_IN);
1273               }
1274
1275           /* Step 3: Append to chains for reads inside operands.  */
1276           for (i = 0; i < n_ops + recog_data.n_dups; i++)
1277             {
1278               int opn = i < n_ops ? i : recog_data.dup_num[i - n_ops];
1279               rtx *loc = (i < n_ops
1280                           ? recog_data.operand_loc[opn]
1281                           : recog_data.dup_loc[i - n_ops]);
1282               enum reg_class cl = recog_op_alt[opn][alt].cl;
1283               enum op_type type = recog_data.operand_type[opn];
1284
1285               /* Don't scan match_operand here, since we've no reg class
1286                  information to pass down.  Any operands that we could
1287                  substitute in will be represented elsewhere.  */
1288               if (recog_data.constraints[opn][0] == '\0'
1289                   || untracked_operands & (1 << opn))
1290                 continue;
1291
1292               if (recog_op_alt[opn][alt].is_address)
1293                 scan_rtx_address (insn, loc, cl, mark_read, VOIDmode);
1294               else
1295                 scan_rtx (insn, loc, cl, mark_read, type);
1296             }
1297
1298           /* Step 3B: Record updates for regs in REG_INC notes, and
1299              source regs in REG_FRAME_RELATED_EXPR notes.  */
1300           for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
1301             if (REG_NOTE_KIND (note) == REG_INC
1302                 || REG_NOTE_KIND (note) == REG_FRAME_RELATED_EXPR)
1303               scan_rtx (insn, &XEXP (note, 0), ALL_REGS, mark_read,
1304                         OP_INOUT);
1305
1306           /* Step 4: Close chains for registers that die here.  */
1307           for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
1308             if (REG_NOTE_KIND (note) == REG_DEAD)
1309               {
1310                 remove_from_hard_reg_set (&live_hard_regs,
1311                                           GET_MODE (XEXP (note, 0)),
1312                                           REGNO (XEXP (note, 0)));
1313                 scan_rtx (insn, &XEXP (note, 0), NO_REGS, terminate_dead,
1314                           OP_IN);
1315               }
1316
1317           /* Step 4B: If this is a call, any chain live at this point
1318              requires a caller-saved reg.  */
1319           if (CALL_P (insn))
1320             {
1321               struct du_head *p;
1322               for (p = open_chains; p; p = p->next_chain)
1323                 p->need_caller_save_reg = 1;
1324             }
1325
1326           /* Step 5: Close open chains that overlap writes.  Similar to
1327              step 2, we hide in-out operands, since we do not want to
1328              close these chains.  We also hide earlyclobber operands,
1329              since we've opened chains for them in step 1, and earlier
1330              chains they would overlap with must have been closed at
1331              the previous insn at the latest, as such operands cannot
1332              possibly overlap with any input operands.  */
1333
1334           hide_operands (n_ops, old_operands, old_dups, untracked_operands,
1335                          true);
1336           scan_rtx (insn, &PATTERN (insn), NO_REGS, terminate_write, OP_IN);
1337           restore_operands (insn, n_ops, old_operands, old_dups);
1338
1339           /* Step 6a: Mark hard registers that are set in this insn,
1340              outside an operand, as live.  */
1341           hide_operands (n_ops, old_operands, old_dups, untracked_operands,
1342                          false);
1343           note_stores (PATTERN (insn), note_sets_clobbers, &set_code);
1344           restore_operands (insn, n_ops, old_operands, old_dups);
1345
1346           /* Step 6b: Begin new chains for writes inside operands.  */
1347           record_out_operands (insn, false);
1348
1349           /* Step 6c: Record destination regs in REG_FRAME_RELATED_EXPR
1350              notes for update.  */
1351           for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
1352             if (REG_NOTE_KIND (note) == REG_FRAME_RELATED_EXPR)
1353               scan_rtx (insn, &XEXP (note, 0), ALL_REGS, mark_access,
1354                         OP_INOUT);
1355
1356           /* Step 7: Close chains for registers that were never
1357              really used here.  */
1358           for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
1359             if (REG_NOTE_KIND (note) == REG_UNUSED)
1360               {
1361                 remove_from_hard_reg_set (&live_hard_regs,
1362                                           GET_MODE (XEXP (note, 0)),
1363                                           REGNO (XEXP (note, 0)));
1364                 scan_rtx (insn, &XEXP (note, 0), NO_REGS, terminate_dead,
1365                           OP_IN);
1366               }
1367         }
1368       else if (DEBUG_INSN_P (insn)
1369                && !VAR_LOC_UNKNOWN_P (INSN_VAR_LOCATION_LOC (insn)))
1370         {
1371           scan_rtx (insn, &INSN_VAR_LOCATION_LOC (insn),
1372                     ALL_REGS, mark_read, OP_IN);
1373         }
1374       if (insn == BB_END (bb))
1375         break;
1376     }
1377
1378   bitmap_clear (&open_chains_set);
1379
1380   if (fail_current_block)
1381     return NULL;
1382
1383   /* Since we close every chain when we find a REG_DEAD note, anything that
1384      is still open lives past the basic block, so it can't be renamed.  */
1385   return closed_chains;
1386 }
1387
1388 /* Dump all def/use chains in CHAINS to DUMP_FILE.  They are
1389    printed in reverse order as that's how we build them.  */
1390
1391 static void
1392 dump_def_use_chain (struct du_head *head)
1393 {
1394   while (head)
1395     {
1396       struct du_chain *this_du = head->first;
1397       fprintf (dump_file, "Register %s (%d):",
1398                reg_names[head->regno], head->nregs);
1399       while (this_du)
1400         {
1401           fprintf (dump_file, " %d [%s]", INSN_UID (this_du->insn),
1402                    reg_class_names[this_du->cl]);
1403           this_du = this_du->next_use;
1404         }
1405       fprintf (dump_file, "\n");
1406       head = head->next_chain;
1407     }
1408 }
1409
1410 \f
1411 static bool
1412 gate_handle_regrename (void)
1413 {
1414   return (optimize > 0 && (flag_rename_registers));
1415 }
1416
1417 struct rtl_opt_pass pass_regrename =
1418 {
1419  {
1420   RTL_PASS,
1421   "rnreg",                              /* name */
1422   gate_handle_regrename,                /* gate */
1423   regrename_optimize,                   /* execute */
1424   NULL,                                 /* sub */
1425   NULL,                                 /* next */
1426   0,                                    /* static_pass_number */
1427   TV_RENAME_REGISTERS,                  /* tv_id */
1428   0,                                    /* properties_required */
1429   0,                                    /* properties_provided */
1430   0,                                    /* properties_destroyed */
1431   0,                                    /* todo_flags_start */
1432   TODO_df_finish | TODO_verify_rtl_sharing |
1433   0                                     /* todo_flags_finish */
1434  }
1435 };