OSDN Git Service

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