xref: /dragonfly/contrib/gcc-4.7/gcc/regrename.c (revision 335b9e93)
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 #include "emit-rtl.h"
43 #include "regrename.h"
44 
45 /* This file implements the RTL register renaming pass of the compiler.  It is
46    a semi-local pass whose goal is to maximize the usage of the register file
47    of the processor by substituting registers for others in the solution given
48    by the register allocator.  The algorithm is as follows:
49 
50      1. Local def/use chains are built: within each basic block, chains are
51 	opened and closed; if a chain isn't closed at the end of the block,
52 	it is dropped.  We pre-open chains if we have already examined a
53 	predecessor block and found chains live at the end which match
54 	live registers at the start of the new block.
55 
56      2. We try to combine the local chains across basic block boundaries by
57         comparing chains that were open at the start or end of a block to
58 	those in successor/predecessor blocks.
59 
60      3. For each chain, the set of possible renaming registers is computed.
61 	This takes into account the renaming of previously processed chains.
62 	Optionally, a preferred class is computed for the renaming register.
63 
64      4. The best renaming register is computed for the chain in the above set,
65 	using a round-robin allocation.  If a preferred class exists, then the
66 	round-robin allocation is done within the class first, if possible.
67 	The round-robin allocation of renaming registers itself is global.
68 
69      5. If a renaming register has been found, it is substituted in the chain.
70 
71   Targets can parameterize the pass by specifying a preferred class for the
72   renaming register for a given (super)class of registers to be renamed.  */
73 
74 #if HOST_BITS_PER_WIDE_INT <= MAX_RECOG_OPERANDS
75 #error "Use a different bitmap implementation for untracked_operands."
76 #endif
77 
78 enum scan_actions
79 {
80   terminate_write,
81   terminate_dead,
82   mark_all_read,
83   mark_read,
84   mark_write,
85   /* mark_access is for marking the destination regs in
86      REG_FRAME_RELATED_EXPR notes (as if they were read) so that the
87      note is updated properly.  */
88   mark_access
89 };
90 
91 static const char * const scan_actions_name[] =
92 {
93   "terminate_write",
94   "terminate_dead",
95   "mark_all_read",
96   "mark_read",
97   "mark_write",
98   "mark_access"
99 };
100 
101 /* TICK and THIS_TICK are used to record the last time we saw each
102    register.  */
103 static int tick[FIRST_PSEUDO_REGISTER];
104 static int this_tick = 0;
105 
106 static struct obstack rename_obstack;
107 
108 /* If nonnull, the code calling into the register renamer requested
109    information about insn operands, and we store it here.  */
110 VEC(insn_rr_info, heap) *insn_rr;
111 
112 static void scan_rtx (rtx, rtx *, enum reg_class, enum scan_actions,
113 		      enum op_type);
114 static bool build_def_use (basic_block);
115 
116 /* The id to be given to the next opened chain.  */
117 static unsigned current_id;
118 
119 /* A mapping of unique id numbers to chains.  */
120 static VEC(du_head_p, heap) *id_to_chain;
121 
122 /* List of currently open chains.  */
123 static struct du_head *open_chains;
124 
125 /* Bitmap of open chains.  The bits set always match the list found in
126    open_chains.  */
127 static bitmap_head open_chains_set;
128 
129 /* Record the registers being tracked in open_chains.  */
130 static HARD_REG_SET live_in_chains;
131 
132 /* Record the registers that are live but not tracked.  The intersection
133    between this and live_in_chains is empty.  */
134 static HARD_REG_SET live_hard_regs;
135 
136 /* Set while scanning RTL if INSN_RR is nonnull, i.e. if the current analysis
137    is for a caller that requires operand data.  Used in
138    record_operand_use.  */
139 static operand_rr_info *cur_operand;
140 
141 /* Return the chain corresponding to id number ID.  Take into account that
142    chains may have been merged.  */
143 du_head_p
144 regrename_chain_from_id (unsigned int id)
145 {
146   du_head_p first_chain = VEC_index (du_head_p, id_to_chain, id);
147   du_head_p chain = first_chain;
148   while (chain->id != id)
149     {
150       id = chain->id;
151       chain = VEC_index (du_head_p, id_to_chain, id);
152     }
153   first_chain->id = id;
154   return chain;
155 }
156 
157 /* Dump all def/use chains, starting at id FROM.  */
158 
159 static void
160 dump_def_use_chain (int from)
161 {
162   du_head_p head;
163   int i;
164   FOR_EACH_VEC_ELT_FROM (du_head_p, id_to_chain, i, head, from)
165     {
166       struct du_chain *this_du = head->first;
167 
168       fprintf (dump_file, "Register %s (%d):",
169 	       reg_names[head->regno], head->nregs);
170       while (this_du)
171 	{
172 	  fprintf (dump_file, " %d [%s]", INSN_UID (this_du->insn),
173 		   reg_class_names[this_du->cl]);
174 	  this_du = this_du->next_use;
175 	}
176       fprintf (dump_file, "\n");
177       head = head->next_chain;
178     }
179 }
180 
181 static void
182 free_chain_data (void)
183 {
184   int i;
185   du_head_p ptr;
186   for (i = 0; VEC_iterate(du_head_p, id_to_chain, i, ptr); i++)
187     bitmap_clear (&ptr->conflicts);
188 
189   VEC_free (du_head_p, heap, id_to_chain);
190 }
191 
192 /* Walk all chains starting with CHAINS and record that they conflict with
193    another chain whose id is ID.  */
194 
195 static void
196 mark_conflict (struct du_head *chains, unsigned id)
197 {
198   while (chains)
199     {
200       bitmap_set_bit (&chains->conflicts, id);
201       chains = chains->next_chain;
202     }
203 }
204 
205 /* Examine cur_operand, and if it is nonnull, record information about the
206    use THIS_DU which is part of the chain HEAD.  */
207 
208 static void
209 record_operand_use (struct du_head *head, struct du_chain *this_du)
210 {
211   if (cur_operand == NULL)
212     return;
213   gcc_assert (cur_operand->n_chains < MAX_REGS_PER_ADDRESS);
214   cur_operand->heads[cur_operand->n_chains] = head;
215   cur_operand->chains[cur_operand->n_chains++] = this_du;
216 }
217 
218 /* Create a new chain for THIS_NREGS registers starting at THIS_REGNO,
219    and record its occurrence in *LOC, which is being written to in INSN.
220    This access requires a register of class CL.  */
221 
222 static du_head_p
223 create_new_chain (unsigned this_regno, unsigned this_nregs, rtx *loc,
224 		  rtx insn, enum reg_class cl)
225 {
226   struct du_head *head = XOBNEW (&rename_obstack, struct du_head);
227   struct du_chain *this_du;
228   int nregs;
229 
230   head->next_chain = open_chains;
231   head->regno = this_regno;
232   head->nregs = this_nregs;
233   head->need_caller_save_reg = 0;
234   head->cannot_rename = 0;
235 
236   VEC_safe_push (du_head_p, heap, id_to_chain, head);
237   head->id = current_id++;
238 
239   bitmap_initialize (&head->conflicts, &bitmap_default_obstack);
240   bitmap_copy (&head->conflicts, &open_chains_set);
241   mark_conflict (open_chains, head->id);
242 
243   /* Since we're tracking this as a chain now, remove it from the
244      list of conflicting live hard registers and track it in
245      live_in_chains instead.  */
246   nregs = head->nregs;
247   while (nregs-- > 0)
248     {
249       SET_HARD_REG_BIT (live_in_chains, head->regno + nregs);
250       CLEAR_HARD_REG_BIT (live_hard_regs, head->regno + nregs);
251     }
252 
253   COPY_HARD_REG_SET (head->hard_conflicts, live_hard_regs);
254   bitmap_set_bit (&open_chains_set, head->id);
255 
256   open_chains = head;
257 
258   if (dump_file)
259     {
260       fprintf (dump_file, "Creating chain %s (%d)",
261 	       reg_names[head->regno], head->id);
262       if (insn != NULL_RTX)
263 	fprintf (dump_file, " at insn %d", INSN_UID (insn));
264       fprintf (dump_file, "\n");
265     }
266 
267   if (insn == NULL_RTX)
268     {
269       head->first = head->last = NULL;
270       return head;
271     }
272 
273   this_du = XOBNEW (&rename_obstack, struct du_chain);
274   head->first = head->last = this_du;
275 
276   this_du->next_use = 0;
277   this_du->loc = loc;
278   this_du->insn = insn;
279   this_du->cl = cl;
280   record_operand_use (head, this_du);
281   return head;
282 }
283 
284 /* For a def-use chain HEAD, find which registers overlap its lifetime and
285    set the corresponding bits in *PSET.  */
286 
287 static void
288 merge_overlapping_regs (HARD_REG_SET *pset, struct du_head *head)
289 {
290   bitmap_iterator bi;
291   unsigned i;
292   IOR_HARD_REG_SET (*pset, head->hard_conflicts);
293   EXECUTE_IF_SET_IN_BITMAP (&head->conflicts, 0, i, bi)
294     {
295       du_head_p other = regrename_chain_from_id (i);
296       unsigned j = other->nregs;
297       gcc_assert (other != head);
298       while (j-- > 0)
299 	SET_HARD_REG_BIT (*pset, other->regno + j);
300     }
301 }
302 
303 /* Check if NEW_REG can be the candidate register to rename for
304    REG in THIS_HEAD chain.  THIS_UNAVAILABLE is a set of unavailable hard
305    registers.  */
306 
307 static bool
308 check_new_reg_p (int reg ATTRIBUTE_UNUSED, int new_reg,
309 		 struct du_head *this_head, HARD_REG_SET this_unavailable)
310 {
311   enum machine_mode mode = GET_MODE (*this_head->first->loc);
312   int nregs = hard_regno_nregs[new_reg][mode];
313   int i;
314   struct du_chain *tmp;
315 
316   for (i = nregs - 1; i >= 0; --i)
317     if (TEST_HARD_REG_BIT (this_unavailable, new_reg + i)
318 	|| fixed_regs[new_reg + i]
319 	|| global_regs[new_reg + i]
320 	/* Can't use regs which aren't saved by the prologue.  */
321 	|| (! df_regs_ever_live_p (new_reg + i)
322 	    && ! call_used_regs[new_reg + i])
323 #ifdef LEAF_REGISTERS
324 	/* We can't use a non-leaf register if we're in a
325 	   leaf function.  */
326 	|| (current_function_is_leaf
327 	    && !LEAF_REGISTERS[new_reg + i])
328 #endif
329 #ifdef HARD_REGNO_RENAME_OK
330 	|| ! HARD_REGNO_RENAME_OK (reg + i, new_reg + i)
331 #endif
332 	)
333       return false;
334 
335   /* See whether it accepts all modes that occur in
336      definition and uses.  */
337   for (tmp = this_head->first; tmp; tmp = tmp->next_use)
338     if ((! HARD_REGNO_MODE_OK (new_reg, GET_MODE (*tmp->loc))
339 	 && ! DEBUG_INSN_P (tmp->insn))
340 	|| (this_head->need_caller_save_reg
341 	    && ! (HARD_REGNO_CALL_PART_CLOBBERED
342 		  (reg, GET_MODE (*tmp->loc)))
343 	    && (HARD_REGNO_CALL_PART_CLOBBERED
344 		(new_reg, GET_MODE (*tmp->loc)))))
345       return false;
346 
347   return true;
348 }
349 
350 /* For the chain THIS_HEAD, compute and return the best register to
351    rename to.  SUPER_CLASS is the superunion of register classes in
352    the chain.  UNAVAILABLE is a set of registers that cannot be used.
353    OLD_REG is the register currently used for the chain.  */
354 
355 int
356 find_best_rename_reg (du_head_p this_head, enum reg_class super_class,
357 		      HARD_REG_SET *unavailable, int old_reg)
358 {
359   bool has_preferred_class;
360   enum reg_class preferred_class;
361   int pass;
362   int best_new_reg = old_reg;
363 
364   /* Further narrow the set of registers we can use for renaming.
365      If the chain needs a call-saved register, mark the call-used
366      registers as unavailable.  */
367   if (this_head->need_caller_save_reg)
368     IOR_HARD_REG_SET (*unavailable, call_used_reg_set);
369 
370   /* Mark registers that overlap this chain's lifetime as unavailable.  */
371   merge_overlapping_regs (unavailable, this_head);
372 
373   /* Compute preferred rename class of super union of all the classes
374      in the chain.  */
375   preferred_class
376     = (enum reg_class) targetm.preferred_rename_class (super_class);
377 
378   /* If PREFERRED_CLASS is not NO_REGS, we iterate in the first pass
379      over registers that belong to PREFERRED_CLASS and try to find the
380      best register within the class.  If that failed, we iterate in
381      the second pass over registers that don't belong to the class.
382      If PREFERRED_CLASS is NO_REGS, we iterate over all registers in
383      ascending order without any preference.  */
384   has_preferred_class = (preferred_class != NO_REGS);
385   for (pass = (has_preferred_class ? 0 : 1); pass < 2; pass++)
386     {
387       int new_reg;
388       for (new_reg = 0; new_reg < FIRST_PSEUDO_REGISTER; new_reg++)
389 	{
390 	  if (has_preferred_class
391 	      && (pass == 0)
392 	      != TEST_HARD_REG_BIT (reg_class_contents[preferred_class],
393 				    new_reg))
394 	    continue;
395 
396 	  /* In the first pass, we force the renaming of registers that
397 	     don't belong to PREFERRED_CLASS to registers that do, even
398 	     though the latters were used not very long ago.  */
399 	  if (check_new_reg_p (old_reg, new_reg, this_head,
400 			       *unavailable)
401 	      && ((pass == 0
402 		   && !TEST_HARD_REG_BIT (reg_class_contents[preferred_class],
403 					  best_new_reg))
404 		  || tick[best_new_reg] > tick[new_reg]))
405 	    best_new_reg = new_reg;
406 	}
407       if (pass == 0 && best_new_reg != old_reg)
408 	break;
409     }
410   return best_new_reg;
411 }
412 
413 /* Perform register renaming on the current function.  */
414 static void
415 rename_chains (void)
416 {
417   HARD_REG_SET unavailable;
418   du_head_p this_head;
419   int i;
420 
421   memset (tick, 0, sizeof tick);
422 
423   CLEAR_HARD_REG_SET (unavailable);
424   /* Don't clobber traceback for noreturn functions.  */
425   if (frame_pointer_needed)
426     {
427       add_to_hard_reg_set (&unavailable, Pmode, FRAME_POINTER_REGNUM);
428 #if !HARD_FRAME_POINTER_IS_FRAME_POINTER
429       add_to_hard_reg_set (&unavailable, Pmode, HARD_FRAME_POINTER_REGNUM);
430 #endif
431     }
432 
433   FOR_EACH_VEC_ELT (du_head_p, id_to_chain, i, this_head)
434     {
435       int best_new_reg;
436       int n_uses;
437       struct du_chain *tmp;
438       HARD_REG_SET this_unavailable;
439       int reg = this_head->regno;
440       enum reg_class super_class = NO_REGS;
441 
442       if (this_head->cannot_rename)
443 	continue;
444 
445       if (fixed_regs[reg] || global_regs[reg]
446 #if !HARD_FRAME_POINTER_IS_FRAME_POINTER
447 	  || (frame_pointer_needed && reg == HARD_FRAME_POINTER_REGNUM)
448 #else
449 	  || (frame_pointer_needed && reg == FRAME_POINTER_REGNUM)
450 #endif
451 	  )
452 	continue;
453 
454       COPY_HARD_REG_SET (this_unavailable, unavailable);
455 
456       /* Iterate over elements in the chain in order to:
457 	 1. Count number of uses, and narrow the set of registers we can
458 	    use for renaming.
459 	 2. Compute the superunion of register classes in this chain.  */
460       n_uses = 0;
461       super_class = NO_REGS;
462       for (tmp = this_head->first; tmp; tmp = tmp->next_use)
463 	{
464 	  if (DEBUG_INSN_P (tmp->insn))
465 	    continue;
466 	  n_uses++;
467 	  IOR_COMPL_HARD_REG_SET (this_unavailable,
468 				  reg_class_contents[tmp->cl]);
469 	  super_class
470 	    = reg_class_superunion[(int) super_class][(int) tmp->cl];
471 	}
472 
473       if (n_uses < 2)
474 	continue;
475 
476       best_new_reg = find_best_rename_reg (this_head, super_class,
477 					   &this_unavailable, reg);
478 
479       if (dump_file)
480 	{
481 	  fprintf (dump_file, "Register %s in insn %d",
482 		   reg_names[reg], INSN_UID (this_head->first->insn));
483 	  if (this_head->need_caller_save_reg)
484 	    fprintf (dump_file, " crosses a call");
485 	}
486 
487       if (best_new_reg == reg)
488 	{
489 	  tick[reg] = ++this_tick;
490 	  if (dump_file)
491 	    fprintf (dump_file, "; no available better choice\n");
492 	  continue;
493 	}
494 
495       if (dump_file)
496 	fprintf (dump_file, ", renamed as %s\n", reg_names[best_new_reg]);
497 
498       regrename_do_replace (this_head, best_new_reg);
499       tick[best_new_reg] = ++this_tick;
500       df_set_regs_ever_live (best_new_reg, true);
501     }
502 }
503 
504 /* A structure to record information for each hard register at the start of
505    a basic block.  */
506 struct incoming_reg_info {
507   /* Holds the number of registers used in the chain that gave us information
508      about this register.  Zero means no information known yet, while a
509      negative value is used for something that is part of, but not the first
510      register in a multi-register value.  */
511   int nregs;
512   /* Set to true if we have accesses that conflict in the number of registers
513      used.  */
514   bool unusable;
515 };
516 
517 /* A structure recording information about each basic block.  It is saved
518    and restored around basic block boundaries.
519    A pointer to such a structure is stored in each basic block's aux field
520    during regrename_analyze, except for blocks we know can't be optimized
521    (such as entry and exit blocks).  */
522 struct bb_rename_info
523 {
524   /* The basic block corresponding to this structure.  */
525   basic_block bb;
526   /* Copies of the global information.  */
527   bitmap_head open_chains_set;
528   bitmap_head incoming_open_chains_set;
529   struct incoming_reg_info incoming[FIRST_PSEUDO_REGISTER];
530 };
531 
532 /* Initialize a rename_info structure P for basic block BB, which starts a new
533    scan.  */
534 static void
535 init_rename_info (struct bb_rename_info *p, basic_block bb)
536 {
537   int i;
538   df_ref *def_rec;
539   HARD_REG_SET start_chains_set;
540 
541   p->bb = bb;
542   bitmap_initialize (&p->open_chains_set, &bitmap_default_obstack);
543   bitmap_initialize (&p->incoming_open_chains_set, &bitmap_default_obstack);
544 
545   open_chains = NULL;
546   bitmap_clear (&open_chains_set);
547 
548   CLEAR_HARD_REG_SET (live_in_chains);
549   REG_SET_TO_HARD_REG_SET (live_hard_regs, df_get_live_in (bb));
550   for (def_rec = df_get_artificial_defs (bb->index); *def_rec; def_rec++)
551     {
552       df_ref def = *def_rec;
553       if (DF_REF_FLAGS (def) & DF_REF_AT_TOP)
554 	SET_HARD_REG_BIT (live_hard_regs, DF_REF_REGNO (def));
555     }
556 
557   /* Open chains based on information from (at least one) predecessor
558      block.  This gives us a chance later on to combine chains across
559      basic block boundaries.  Inconsistencies (in access sizes) will
560      be caught normally and dealt with conservatively by disabling the
561      chain for renaming, and there is no risk of losing optimization
562      opportunities by opening chains either: if we did not open the
563      chains, we'd have to track the live register as a hard reg, and
564      we'd be unable to rename it in any case.  */
565   CLEAR_HARD_REG_SET (start_chains_set);
566   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
567     {
568       struct incoming_reg_info *iri = p->incoming + i;
569       if (iri->nregs > 0 && !iri->unusable
570 	  && range_in_hard_reg_set_p (live_hard_regs, i, iri->nregs))
571 	{
572 	  SET_HARD_REG_BIT (start_chains_set, i);
573 	  remove_range_from_hard_reg_set (&live_hard_regs, i, iri->nregs);
574 	}
575     }
576   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
577     {
578       struct incoming_reg_info *iri = p->incoming + i;
579       if (TEST_HARD_REG_BIT (start_chains_set, i))
580 	{
581 	  du_head_p chain;
582 	  if (dump_file)
583 	    fprintf (dump_file, "opening incoming chain\n");
584 	  chain = create_new_chain (i, iri->nregs, NULL, NULL_RTX, NO_REGS);
585 	  bitmap_set_bit (&p->incoming_open_chains_set, chain->id);
586 	}
587     }
588 }
589 
590 /* Record in RI that the block corresponding to it has an incoming
591    live value, described by CHAIN.  */
592 static void
593 set_incoming_from_chain (struct bb_rename_info *ri, du_head_p chain)
594 {
595   int i;
596   int incoming_nregs = ri->incoming[chain->regno].nregs;
597   int nregs;
598 
599   /* If we've recorded the same information before, everything is fine.  */
600   if (incoming_nregs == chain->nregs)
601     {
602       if (dump_file)
603 	fprintf (dump_file, "reg %d/%d already recorded\n",
604 		 chain->regno, chain->nregs);
605       return;
606     }
607 
608   /* If we have no information for any of the involved registers, update
609      the incoming array.  */
610   nregs = chain->nregs;
611   while (nregs-- > 0)
612     if (ri->incoming[chain->regno + nregs].nregs != 0
613 	|| ri->incoming[chain->regno + nregs].unusable)
614       break;
615   if (nregs < 0)
616     {
617       nregs = chain->nregs;
618       ri->incoming[chain->regno].nregs = nregs;
619       while (nregs-- > 1)
620 	ri->incoming[chain->regno + nregs].nregs = -nregs;
621       if (dump_file)
622 	fprintf (dump_file, "recorded reg %d/%d\n",
623 		 chain->regno, chain->nregs);
624       return;
625     }
626 
627   /* There must be some kind of conflict.  Prevent both the old and
628      new ranges from being used.  */
629   if (incoming_nregs < 0)
630     ri->incoming[chain->regno + incoming_nregs].unusable = true;
631   for (i = 0; i < chain->nregs; i++)
632     ri->incoming[chain->regno + i].unusable = true;
633 }
634 
635 /* Merge the two chains C1 and C2 so that all conflict information is
636    recorded and C1, and the id of C2 is changed to that of C1.  */
637 static void
638 merge_chains (du_head_p c1, du_head_p c2)
639 {
640   if (c1 == c2)
641     return;
642 
643   if (c2->first != NULL)
644     {
645       if (c1->first == NULL)
646 	c1->first = c2->first;
647       else
648 	c1->last->next_use = c2->first;
649       c1->last = c2->last;
650     }
651 
652   c2->first = c2->last = NULL;
653   c2->id = c1->id;
654 
655   IOR_HARD_REG_SET (c1->hard_conflicts, c2->hard_conflicts);
656   bitmap_ior_into (&c1->conflicts, &c2->conflicts);
657 
658   c1->need_caller_save_reg |= c2->need_caller_save_reg;
659   c1->cannot_rename |= c2->cannot_rename;
660 }
661 
662 /* Analyze the current function and build chains for renaming.  */
663 
664 void
665 regrename_analyze (bitmap bb_mask)
666 {
667   struct bb_rename_info *rename_info;
668   int i;
669   basic_block bb;
670   int n_bbs;
671   int *inverse_postorder;
672 
673   inverse_postorder = XNEWVEC (int, last_basic_block);
674   n_bbs = pre_and_rev_post_order_compute (NULL, inverse_postorder, false);
675 
676   /* Gather some information about the blocks in this function.  */
677   rename_info = XCNEWVEC (struct bb_rename_info, n_basic_blocks);
678   i = 0;
679   FOR_EACH_BB (bb)
680     {
681       struct bb_rename_info *ri = rename_info + i;
682       ri->bb = bb;
683       if (bb_mask != NULL && !bitmap_bit_p (bb_mask, bb->index))
684 	bb->aux = NULL;
685       else
686 	bb->aux = ri;
687       i++;
688     }
689 
690   current_id = 0;
691   id_to_chain = VEC_alloc (du_head_p, heap, 0);
692   bitmap_initialize (&open_chains_set, &bitmap_default_obstack);
693 
694   /* The order in which we visit blocks ensures that whenever
695      possible, we only process a block after at least one of its
696      predecessors, which provides a "seeding" effect to make the logic
697      in set_incoming_from_chain and init_rename_info useful.  */
698 
699   for (i = 0; i < n_bbs; i++)
700     {
701       basic_block bb1 = BASIC_BLOCK (inverse_postorder[i]);
702       struct bb_rename_info *this_info;
703       bool success;
704       edge e;
705       edge_iterator ei;
706       int old_length = VEC_length (du_head_p, id_to_chain);
707 
708       this_info = (struct bb_rename_info *) bb1->aux;
709       if (this_info == NULL)
710 	continue;
711 
712       if (dump_file)
713 	fprintf (dump_file, "\nprocessing block %d:\n", bb1->index);
714 
715       init_rename_info (this_info, bb1);
716 
717       success = build_def_use (bb1);
718       if (!success)
719 	{
720 	  if (dump_file)
721 	    fprintf (dump_file, "failed\n");
722 	  bb1->aux = NULL;
723 	  VEC_truncate (du_head_p, id_to_chain, old_length);
724 	  current_id = old_length;
725 	  bitmap_clear (&this_info->incoming_open_chains_set);
726 	  open_chains = NULL;
727 	  if (insn_rr != NULL)
728 	    {
729 	      rtx insn;
730 	      FOR_BB_INSNS (bb1, insn)
731 		{
732 		  insn_rr_info *p = VEC_index (insn_rr_info, insn_rr,
733 					       INSN_UID (insn));
734 		  p->op_info = NULL;
735 		}
736 	    }
737 	  continue;
738 	}
739 
740       if (dump_file)
741 	dump_def_use_chain (old_length);
742       bitmap_copy (&this_info->open_chains_set, &open_chains_set);
743 
744       /* Add successor blocks to the worklist if necessary, and record
745 	 data about our own open chains at the end of this block, which
746 	 will be used to pre-open chains when processing the successors.  */
747       FOR_EACH_EDGE (e, ei, bb1->succs)
748 	{
749 	  struct bb_rename_info *dest_ri;
750 	  struct du_head *chain;
751 
752 	  if (dump_file)
753 	    fprintf (dump_file, "successor block %d\n", e->dest->index);
754 
755 	  if (e->flags & (EDGE_EH | EDGE_ABNORMAL))
756 	    continue;
757 	  dest_ri = (struct bb_rename_info *)e->dest->aux;
758 	  if (dest_ri == NULL)
759 	    continue;
760 	  for (chain = open_chains; chain; chain = chain->next_chain)
761 	    set_incoming_from_chain (dest_ri, chain);
762 	}
763     }
764 
765   free (inverse_postorder);
766 
767   /* Now, combine the chains data we have gathered across basic block
768      boundaries.
769 
770      For every basic block, there may be chains open at the start, or at the
771      end.  Rather than exclude them from renaming, we look for open chains
772      with matching registers at the other side of the CFG edge.
773 
774      For a given chain using register R, open at the start of block B, we
775      must find an open chain using R on the other side of every edge leading
776      to B, if the register is live across this edge.  In the code below,
777      N_PREDS_USED counts the number of edges where the register is live, and
778      N_PREDS_JOINED counts those where we found an appropriate chain for
779      joining.
780 
781      We perform the analysis for both incoming and outgoing edges, but we
782      only need to merge once (in the second part, after verifying outgoing
783      edges).  */
784   FOR_EACH_BB (bb)
785     {
786       struct bb_rename_info *bb_ri = (struct bb_rename_info *) bb->aux;
787       unsigned j;
788       bitmap_iterator bi;
789 
790       if (bb_ri == NULL)
791 	continue;
792 
793       if (dump_file)
794 	fprintf (dump_file, "processing bb %d in edges\n", bb->index);
795 
796       EXECUTE_IF_SET_IN_BITMAP (&bb_ri->incoming_open_chains_set, 0, j, bi)
797 	{
798 	  edge e;
799 	  edge_iterator ei;
800 	  struct du_head *chain = regrename_chain_from_id (j);
801 	  int n_preds_used = 0, n_preds_joined = 0;
802 
803 	  FOR_EACH_EDGE (e, ei, bb->preds)
804 	    {
805 	      struct bb_rename_info *src_ri;
806 	      unsigned k;
807 	      bitmap_iterator bi2;
808 	      HARD_REG_SET live;
809 	      bool success = false;
810 
811 	      REG_SET_TO_HARD_REG_SET (live, df_get_live_out (e->src));
812 	      if (!range_overlaps_hard_reg_set_p (live, chain->regno,
813 						  chain->nregs))
814 		continue;
815 	      n_preds_used++;
816 
817 	      if (e->flags & (EDGE_EH | EDGE_ABNORMAL))
818 		continue;
819 
820 	      src_ri = (struct bb_rename_info *)e->src->aux;
821 	      if (src_ri == NULL)
822 		continue;
823 
824 	      EXECUTE_IF_SET_IN_BITMAP (&src_ri->open_chains_set,
825 					0, k, bi2)
826 		{
827 		  struct du_head *outgoing_chain = regrename_chain_from_id (k);
828 
829 		  if (outgoing_chain->regno == chain->regno
830 		      && outgoing_chain->nregs == chain->nregs)
831 		    {
832 		      n_preds_joined++;
833 		      success = true;
834 		      break;
835 		    }
836 		}
837 	      if (!success && dump_file)
838 		fprintf (dump_file, "failure to match with pred block %d\n",
839 			 e->src->index);
840 	    }
841 	  if (n_preds_joined < n_preds_used)
842 	    {
843 	      if (dump_file)
844 		fprintf (dump_file, "cannot rename chain %d\n", j);
845 	      chain->cannot_rename = 1;
846 	    }
847 	}
848     }
849   FOR_EACH_BB (bb)
850     {
851       struct bb_rename_info *bb_ri = (struct bb_rename_info *) bb->aux;
852       unsigned j;
853       bitmap_iterator bi;
854 
855       if (bb_ri == NULL)
856 	continue;
857 
858       if (dump_file)
859 	fprintf (dump_file, "processing bb %d out edges\n", bb->index);
860 
861       EXECUTE_IF_SET_IN_BITMAP (&bb_ri->open_chains_set, 0, j, bi)
862 	{
863 	  edge e;
864 	  edge_iterator ei;
865 	  struct du_head *chain = regrename_chain_from_id (j);
866 	  int n_succs_used = 0, n_succs_joined = 0;
867 
868 	  FOR_EACH_EDGE (e, ei, bb->succs)
869 	    {
870 	      bool printed = false;
871 	      struct bb_rename_info *dest_ri;
872 	      unsigned k;
873 	      bitmap_iterator bi2;
874 	      HARD_REG_SET live;
875 
876 	      REG_SET_TO_HARD_REG_SET (live, df_get_live_in (e->dest));
877 	      if (!range_overlaps_hard_reg_set_p (live, chain->regno,
878 						  chain->nregs))
879 		continue;
880 
881 	      n_succs_used++;
882 
883 	      dest_ri = (struct bb_rename_info *)e->dest->aux;
884 	      if (dest_ri == NULL)
885 		continue;
886 
887 	      EXECUTE_IF_SET_IN_BITMAP (&dest_ri->incoming_open_chains_set,
888 					0, k, bi2)
889 		{
890 		  struct du_head *incoming_chain = regrename_chain_from_id (k);
891 
892 		  if (incoming_chain->regno == chain->regno
893 		      && incoming_chain->nregs == chain->nregs)
894 		    {
895 		      if (dump_file)
896 			{
897 			  if (!printed)
898 			    fprintf (dump_file,
899 				     "merging blocks for edge %d -> %d\n",
900 				     e->src->index, e->dest->index);
901 			  printed = true;
902 			  fprintf (dump_file,
903 				   "  merging chains %d (->%d) and %d (->%d) [%s]\n",
904 				   k, incoming_chain->id, j, chain->id,
905 				   reg_names[incoming_chain->regno]);
906 			}
907 
908 		      merge_chains (chain, incoming_chain);
909 		      n_succs_joined++;
910 		      break;
911 		    }
912 		}
913 	    }
914 	  if (n_succs_joined < n_succs_used)
915 	    {
916 	      if (dump_file)
917 		fprintf (dump_file, "cannot rename chain %d\n",
918 			 j);
919 	      chain->cannot_rename = 1;
920 	    }
921 	}
922     }
923 
924   free (rename_info);
925 
926   FOR_EACH_BB (bb)
927     bb->aux = NULL;
928 }
929 
930 void
931 regrename_do_replace (struct du_head *head, int reg)
932 {
933   struct du_chain *chain;
934   unsigned int base_regno = head->regno;
935   enum machine_mode mode;
936 
937   for (chain = head->first; chain; chain = chain->next_use)
938     {
939       unsigned int regno = ORIGINAL_REGNO (*chain->loc);
940       struct reg_attrs *attr = REG_ATTRS (*chain->loc);
941       int reg_ptr = REG_POINTER (*chain->loc);
942 
943       if (DEBUG_INSN_P (chain->insn) && REGNO (*chain->loc) != base_regno)
944 	INSN_VAR_LOCATION_LOC (chain->insn) = gen_rtx_UNKNOWN_VAR_LOC ();
945       else
946 	{
947 	  *chain->loc = gen_raw_REG (GET_MODE (*chain->loc), reg);
948 	  if (regno >= FIRST_PSEUDO_REGISTER)
949 	    ORIGINAL_REGNO (*chain->loc) = regno;
950 	  REG_ATTRS (*chain->loc) = attr;
951 	  REG_POINTER (*chain->loc) = reg_ptr;
952 	}
953 
954       df_insn_rescan (chain->insn);
955     }
956 
957   mode = GET_MODE (*head->first->loc);
958   head->regno = reg;
959   head->nregs = hard_regno_nregs[reg][mode];
960 }
961 
962 
963 /* True if we found a register with a size mismatch, which means that we
964    can't track its lifetime accurately.  If so, we abort the current block
965    without renaming.  */
966 static bool fail_current_block;
967 
968 /* Return true if OP is a reg for which all bits are set in PSET, false
969    if all bits are clear.
970    In other cases, set fail_current_block and return false.  */
971 
972 static bool
973 verify_reg_in_set (rtx op, HARD_REG_SET *pset)
974 {
975   unsigned regno, nregs;
976   bool all_live, all_dead;
977   if (!REG_P (op))
978     return false;
979 
980   regno = REGNO (op);
981   nregs = hard_regno_nregs[regno][GET_MODE (op)];
982   all_live = all_dead = true;
983   while (nregs-- > 0)
984     if (TEST_HARD_REG_BIT (*pset, regno + nregs))
985       all_dead = false;
986     else
987       all_live = false;
988   if (!all_dead && !all_live)
989     {
990       fail_current_block = true;
991       return false;
992     }
993   return all_live;
994 }
995 
996 /* Return true if OP is a reg that is being tracked already in some form.
997    May set fail_current_block if it sees an unhandled case of overlap.  */
998 
999 static bool
1000 verify_reg_tracked (rtx op)
1001 {
1002   return (verify_reg_in_set (op, &live_hard_regs)
1003 	  || verify_reg_in_set (op, &live_in_chains));
1004 }
1005 
1006 /* Called through note_stores.  DATA points to a rtx_code, either SET or
1007    CLOBBER, which tells us which kind of rtx to look at.  If we have a
1008    match, record the set register in live_hard_regs and in the hard_conflicts
1009    bitmap of open chains.  */
1010 
1011 static void
1012 note_sets_clobbers (rtx x, const_rtx set, void *data)
1013 {
1014   enum rtx_code code = *(enum rtx_code *)data;
1015   struct du_head *chain;
1016 
1017   if (GET_CODE (x) == SUBREG)
1018     x = SUBREG_REG (x);
1019   if (!REG_P (x) || GET_CODE (set) != code)
1020     return;
1021   /* There must not be pseudos at this point.  */
1022   gcc_assert (HARD_REGISTER_P (x));
1023   add_to_hard_reg_set (&live_hard_regs, GET_MODE (x), REGNO (x));
1024   for (chain = open_chains; chain; chain = chain->next_chain)
1025     add_to_hard_reg_set (&chain->hard_conflicts, GET_MODE (x), REGNO (x));
1026 }
1027 
1028 static void
1029 scan_rtx_reg (rtx insn, rtx *loc, enum reg_class cl, enum scan_actions action,
1030 	      enum op_type type)
1031 {
1032   struct du_head **p;
1033   rtx x = *loc;
1034   enum machine_mode mode = GET_MODE (x);
1035   unsigned this_regno = REGNO (x);
1036   int this_nregs = hard_regno_nregs[this_regno][mode];
1037 
1038   if (action == mark_write)
1039     {
1040       if (type == OP_OUT)
1041 	create_new_chain (this_regno, this_nregs, loc, insn, cl);
1042       return;
1043     }
1044 
1045   if ((type == OP_OUT) != (action == terminate_write || action == mark_access))
1046     return;
1047 
1048   for (p = &open_chains; *p;)
1049     {
1050       struct du_head *head = *p;
1051       struct du_head *next = head->next_chain;
1052       int exact_match = (head->regno == this_regno
1053 			 && head->nregs == this_nregs);
1054       int superset = (this_regno <= head->regno
1055 		      && this_regno + this_nregs >= head->regno + head->nregs);
1056       int subset = (this_regno >= head->regno
1057 		      && this_regno + this_nregs <= head->regno + head->nregs);
1058 
1059       if (!bitmap_bit_p (&open_chains_set, head->id)
1060 	  || head->regno + head->nregs <= this_regno
1061 	  || this_regno + this_nregs <= head->regno)
1062 	{
1063 	  p = &head->next_chain;
1064 	  continue;
1065 	}
1066 
1067       if (action == mark_read || action == mark_access)
1068 	{
1069 	  /* ??? Class NO_REGS can happen if the md file makes use of
1070 	     EXTRA_CONSTRAINTS to match registers.  Which is arguably
1071 	     wrong, but there we are.  */
1072 
1073 	  if (cl == NO_REGS || (!exact_match && !DEBUG_INSN_P (insn)))
1074 	    {
1075 	      if (dump_file)
1076 		fprintf (dump_file,
1077 			 "Cannot rename chain %s (%d) at insn %d (%s)\n",
1078 			 reg_names[head->regno], head->id, INSN_UID (insn),
1079 			 scan_actions_name[(int) action]);
1080 	      head->cannot_rename = 1;
1081 	      if (superset)
1082 		{
1083 		  unsigned nregs = this_nregs;
1084 		  head->regno = this_regno;
1085 		  head->nregs = this_nregs;
1086 		  while (nregs-- > 0)
1087 		    SET_HARD_REG_BIT (live_in_chains, head->regno + nregs);
1088 		  if (dump_file)
1089 		    fprintf (dump_file,
1090 			     "Widening register in chain %s (%d) at insn %d\n",
1091 			     reg_names[head->regno], head->id, INSN_UID (insn));
1092 		}
1093 	      else if (!subset)
1094 		{
1095 		  fail_current_block = true;
1096 		  if (dump_file)
1097 		    fprintf (dump_file,
1098 			     "Failing basic block due to unhandled overlap\n");
1099 		}
1100 	    }
1101 	  else
1102 	    {
1103 	      struct du_chain *this_du;
1104 	      this_du = XOBNEW (&rename_obstack, struct du_chain);
1105 	      this_du->next_use = 0;
1106 	      this_du->loc = loc;
1107 	      this_du->insn = insn;
1108 	      this_du->cl = cl;
1109 	      if (head->first == NULL)
1110 		head->first = this_du;
1111 	      else
1112 		head->last->next_use = this_du;
1113 	      record_operand_use (head, this_du);
1114 	      head->last = this_du;
1115 	    }
1116 	  /* Avoid adding the same location in a DEBUG_INSN multiple times,
1117 	     which could happen with non-exact overlap.  */
1118 	  if (DEBUG_INSN_P (insn))
1119 	    return;
1120 	  /* Otherwise, find any other chains that do not match exactly;
1121 	     ensure they all get marked unrenamable.  */
1122 	  p = &head->next_chain;
1123 	  continue;
1124 	}
1125 
1126       /* Whether the terminated chain can be used for renaming
1127 	 depends on the action and this being an exact match.
1128 	 In either case, we remove this element from open_chains.  */
1129 
1130       if ((action == terminate_dead || action == terminate_write)
1131 	  && (superset || subset))
1132 	{
1133 	  unsigned nregs;
1134 
1135 	  if (subset && !superset)
1136 	    head->cannot_rename = 1;
1137 	  bitmap_clear_bit (&open_chains_set, head->id);
1138 
1139 	  nregs = head->nregs;
1140 	  while (nregs-- > 0)
1141 	    {
1142 	      CLEAR_HARD_REG_BIT (live_in_chains, head->regno + nregs);
1143 	      if (subset && !superset
1144 		  && (head->regno + nregs < this_regno
1145 		      || head->regno + nregs >= this_regno + this_nregs))
1146 		SET_HARD_REG_BIT (live_hard_regs, head->regno + nregs);
1147 	    }
1148 
1149 	  *p = next;
1150 	  if (dump_file)
1151 	    fprintf (dump_file,
1152 		     "Closing chain %s (%d) at insn %d (%s%s)\n",
1153 		     reg_names[head->regno], head->id, INSN_UID (insn),
1154 		     scan_actions_name[(int) action],
1155 		     superset ? ", superset" : subset ? ", subset" : "");
1156 	}
1157       else if (action == terminate_dead || action == terminate_write)
1158 	{
1159 	  /* In this case, tracking liveness gets too hard.  Fail the
1160 	     entire basic block.  */
1161 	  if (dump_file)
1162 	    fprintf (dump_file,
1163 		     "Failing basic block due to unhandled overlap\n");
1164 	  fail_current_block = true;
1165 	  return;
1166 	}
1167       else
1168 	{
1169 	  head->cannot_rename = 1;
1170 	  if (dump_file)
1171 	    fprintf (dump_file,
1172 		     "Cannot rename chain %s (%d) at insn %d (%s)\n",
1173 		     reg_names[head->regno], head->id, INSN_UID (insn),
1174 		     scan_actions_name[(int) action]);
1175 	  p = &head->next_chain;
1176 	}
1177     }
1178 }
1179 
1180 /* Adapted from find_reloads_address_1.  CL is INDEX_REG_CLASS or
1181    BASE_REG_CLASS depending on how the register is being considered.  */
1182 
1183 static void
1184 scan_rtx_address (rtx insn, rtx *loc, enum reg_class cl,
1185 		  enum scan_actions action, enum machine_mode mode,
1186 		  addr_space_t as)
1187 {
1188   rtx x = *loc;
1189   RTX_CODE code = GET_CODE (x);
1190   const char *fmt;
1191   int i, j;
1192 
1193   if (action == mark_write || action == mark_access)
1194     return;
1195 
1196   switch (code)
1197     {
1198     case PLUS:
1199       {
1200 	rtx orig_op0 = XEXP (x, 0);
1201 	rtx orig_op1 = XEXP (x, 1);
1202 	RTX_CODE code0 = GET_CODE (orig_op0);
1203 	RTX_CODE code1 = GET_CODE (orig_op1);
1204 	rtx op0 = orig_op0;
1205 	rtx op1 = orig_op1;
1206 	rtx *locI = NULL;
1207 	rtx *locB = NULL;
1208 	enum rtx_code index_code = SCRATCH;
1209 
1210 	if (GET_CODE (op0) == SUBREG)
1211 	  {
1212 	    op0 = SUBREG_REG (op0);
1213 	    code0 = GET_CODE (op0);
1214 	  }
1215 
1216 	if (GET_CODE (op1) == SUBREG)
1217 	  {
1218 	    op1 = SUBREG_REG (op1);
1219 	    code1 = GET_CODE (op1);
1220 	  }
1221 
1222 	if (code0 == MULT || code0 == SIGN_EXTEND || code0 == TRUNCATE
1223 	    || code0 == ZERO_EXTEND || code1 == MEM)
1224 	  {
1225 	    locI = &XEXP (x, 0);
1226 	    locB = &XEXP (x, 1);
1227 	    index_code = GET_CODE (*locI);
1228 	  }
1229 	else if (code1 == MULT || code1 == SIGN_EXTEND || code1 == TRUNCATE
1230 		 || code1 == ZERO_EXTEND || code0 == MEM)
1231 	  {
1232 	    locI = &XEXP (x, 1);
1233 	    locB = &XEXP (x, 0);
1234 	    index_code = GET_CODE (*locI);
1235 	  }
1236 	else if (code0 == CONST_INT || code0 == CONST
1237 		 || code0 == SYMBOL_REF || code0 == LABEL_REF)
1238 	  {
1239 	    locB = &XEXP (x, 1);
1240 	    index_code = GET_CODE (XEXP (x, 0));
1241 	  }
1242 	else if (code1 == CONST_INT || code1 == CONST
1243 		 || code1 == SYMBOL_REF || code1 == LABEL_REF)
1244 	  {
1245 	    locB = &XEXP (x, 0);
1246 	    index_code = GET_CODE (XEXP (x, 1));
1247 	  }
1248 	else if (code0 == REG && code1 == REG)
1249 	  {
1250 	    int index_op;
1251 	    unsigned regno0 = REGNO (op0), regno1 = REGNO (op1);
1252 
1253 	    if (REGNO_OK_FOR_INDEX_P (regno1)
1254 		&& regno_ok_for_base_p (regno0, mode, as, PLUS, REG))
1255 	      index_op = 1;
1256 	    else if (REGNO_OK_FOR_INDEX_P (regno0)
1257 		     && regno_ok_for_base_p (regno1, mode, as, PLUS, REG))
1258 	      index_op = 0;
1259 	    else if (regno_ok_for_base_p (regno0, mode, as, PLUS, REG)
1260 		     || REGNO_OK_FOR_INDEX_P (regno1))
1261 	      index_op = 1;
1262 	    else if (regno_ok_for_base_p (regno1, mode, as, PLUS, REG))
1263 	      index_op = 0;
1264 	    else
1265 	      index_op = 1;
1266 
1267 	    locI = &XEXP (x, index_op);
1268 	    locB = &XEXP (x, !index_op);
1269 	    index_code = GET_CODE (*locI);
1270 	  }
1271 	else if (code0 == REG)
1272 	  {
1273 	    locI = &XEXP (x, 0);
1274 	    locB = &XEXP (x, 1);
1275 	    index_code = GET_CODE (*locI);
1276 	  }
1277 	else if (code1 == REG)
1278 	  {
1279 	    locI = &XEXP (x, 1);
1280 	    locB = &XEXP (x, 0);
1281 	    index_code = GET_CODE (*locI);
1282 	  }
1283 
1284 	if (locI)
1285 	  scan_rtx_address (insn, locI, INDEX_REG_CLASS, action, mode, as);
1286 	if (locB)
1287 	  scan_rtx_address (insn, locB,
1288 			    base_reg_class (mode, as, PLUS, index_code),
1289 			    action, mode, as);
1290 
1291 	return;
1292       }
1293 
1294     case POST_INC:
1295     case POST_DEC:
1296     case POST_MODIFY:
1297     case PRE_INC:
1298     case PRE_DEC:
1299     case PRE_MODIFY:
1300 #ifndef AUTO_INC_DEC
1301       /* If the target doesn't claim to handle autoinc, this must be
1302 	 something special, like a stack push.  Kill this chain.  */
1303       action = mark_all_read;
1304 #endif
1305       break;
1306 
1307     case MEM:
1308       scan_rtx_address (insn, &XEXP (x, 0),
1309 			base_reg_class (GET_MODE (x), MEM_ADDR_SPACE (x),
1310 					MEM, SCRATCH),
1311 			action, GET_MODE (x), MEM_ADDR_SPACE (x));
1312       return;
1313 
1314     case REG:
1315       scan_rtx_reg (insn, loc, cl, action, OP_IN);
1316       return;
1317 
1318     default:
1319       break;
1320     }
1321 
1322   fmt = GET_RTX_FORMAT (code);
1323   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1324     {
1325       if (fmt[i] == 'e')
1326 	scan_rtx_address (insn, &XEXP (x, i), cl, action, mode, as);
1327       else if (fmt[i] == 'E')
1328 	for (j = XVECLEN (x, i) - 1; j >= 0; j--)
1329 	  scan_rtx_address (insn, &XVECEXP (x, i, j), cl, action, mode, as);
1330     }
1331 }
1332 
1333 static void
1334 scan_rtx (rtx insn, rtx *loc, enum reg_class cl, enum scan_actions action,
1335 	  enum op_type type)
1336 {
1337   const char *fmt;
1338   rtx x = *loc;
1339   enum rtx_code code = GET_CODE (x);
1340   int i, j;
1341 
1342   code = GET_CODE (x);
1343   switch (code)
1344     {
1345     case CONST:
1346     case CONST_INT:
1347     case CONST_DOUBLE:
1348     case CONST_FIXED:
1349     case CONST_VECTOR:
1350     case SYMBOL_REF:
1351     case LABEL_REF:
1352     case CC0:
1353     case PC:
1354       return;
1355 
1356     case REG:
1357       scan_rtx_reg (insn, loc, cl, action, type);
1358       return;
1359 
1360     case MEM:
1361       scan_rtx_address (insn, &XEXP (x, 0),
1362 			base_reg_class (GET_MODE (x), MEM_ADDR_SPACE (x),
1363 					MEM, SCRATCH),
1364 			action, GET_MODE (x), MEM_ADDR_SPACE (x));
1365       return;
1366 
1367     case SET:
1368       scan_rtx (insn, &SET_SRC (x), cl, action, OP_IN);
1369       scan_rtx (insn, &SET_DEST (x), cl, action,
1370 		(GET_CODE (PATTERN (insn)) == COND_EXEC
1371 		 && verify_reg_tracked (SET_DEST (x))) ? OP_INOUT : OP_OUT);
1372       return;
1373 
1374     case STRICT_LOW_PART:
1375       scan_rtx (insn, &XEXP (x, 0), cl, action,
1376 		verify_reg_tracked (XEXP (x, 0)) ? OP_INOUT : OP_OUT);
1377       return;
1378 
1379     case ZERO_EXTRACT:
1380     case SIGN_EXTRACT:
1381       scan_rtx (insn, &XEXP (x, 0), cl, action,
1382 		(type == OP_IN ? OP_IN :
1383 		 verify_reg_tracked (XEXP (x, 0)) ? OP_INOUT : OP_OUT));
1384       scan_rtx (insn, &XEXP (x, 1), cl, action, OP_IN);
1385       scan_rtx (insn, &XEXP (x, 2), cl, action, OP_IN);
1386       return;
1387 
1388     case POST_INC:
1389     case PRE_INC:
1390     case POST_DEC:
1391     case PRE_DEC:
1392     case POST_MODIFY:
1393     case PRE_MODIFY:
1394       /* Should only happen inside MEM.  */
1395       gcc_unreachable ();
1396 
1397     case CLOBBER:
1398       scan_rtx (insn, &SET_DEST (x), cl, action,
1399 		(GET_CODE (PATTERN (insn)) == COND_EXEC
1400 		 && verify_reg_tracked (SET_DEST (x))) ? OP_INOUT : OP_OUT);
1401       return;
1402 
1403     case EXPR_LIST:
1404       scan_rtx (insn, &XEXP (x, 0), cl, action, type);
1405       if (XEXP (x, 1))
1406 	scan_rtx (insn, &XEXP (x, 1), cl, action, type);
1407       return;
1408 
1409     default:
1410       break;
1411     }
1412 
1413   fmt = GET_RTX_FORMAT (code);
1414   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1415     {
1416       if (fmt[i] == 'e')
1417 	scan_rtx (insn, &XEXP (x, i), cl, action, type);
1418       else if (fmt[i] == 'E')
1419 	for (j = XVECLEN (x, i) - 1; j >= 0; j--)
1420 	  scan_rtx (insn, &XVECEXP (x, i, j), cl, action, type);
1421     }
1422 }
1423 
1424 /* Hide operands of the current insn (of which there are N_OPS) by
1425    substituting cc0 for them.
1426    Previous values are stored in the OLD_OPERANDS and OLD_DUPS.
1427    For every bit set in DO_NOT_HIDE, we leave the operand alone.
1428    If INOUT_AND_EC_ONLY is set, we only do this for OP_INOUT type operands
1429    and earlyclobbers.  */
1430 
1431 static void
1432 hide_operands (int n_ops, rtx *old_operands, rtx *old_dups,
1433 	       unsigned HOST_WIDE_INT do_not_hide, bool inout_and_ec_only)
1434 {
1435   int i;
1436   int alt = which_alternative;
1437   for (i = 0; i < n_ops; i++)
1438     {
1439       old_operands[i] = recog_data.operand[i];
1440       /* Don't squash match_operator or match_parallel here, since
1441 	 we don't know that all of the contained registers are
1442 	 reachable by proper operands.  */
1443       if (recog_data.constraints[i][0] == '\0')
1444 	continue;
1445       if (do_not_hide & (1 << i))
1446 	continue;
1447       if (!inout_and_ec_only || recog_data.operand_type[i] == OP_INOUT
1448 	  || recog_op_alt[i][alt].earlyclobber)
1449 	*recog_data.operand_loc[i] = cc0_rtx;
1450     }
1451   for (i = 0; i < recog_data.n_dups; i++)
1452     {
1453       int opn = recog_data.dup_num[i];
1454       old_dups[i] = *recog_data.dup_loc[i];
1455       if (do_not_hide & (1 << opn))
1456 	continue;
1457       if (!inout_and_ec_only || recog_data.operand_type[opn] == OP_INOUT
1458 	  || recog_op_alt[opn][alt].earlyclobber)
1459 	*recog_data.dup_loc[i] = cc0_rtx;
1460     }
1461 }
1462 
1463 /* Undo the substitution performed by hide_operands.  INSN is the insn we
1464    are processing; the arguments are the same as in hide_operands.  */
1465 
1466 static void
1467 restore_operands (rtx insn, int n_ops, rtx *old_operands, rtx *old_dups)
1468 {
1469   int i;
1470   for (i = 0; i < recog_data.n_dups; i++)
1471     *recog_data.dup_loc[i] = old_dups[i];
1472   for (i = 0; i < n_ops; i++)
1473     *recog_data.operand_loc[i] = old_operands[i];
1474   if (recog_data.n_dups)
1475     df_insn_rescan (insn);
1476 }
1477 
1478 /* For each output operand of INSN, call scan_rtx to create a new
1479    open chain.  Do this only for normal or earlyclobber outputs,
1480    depending on EARLYCLOBBER.  If INSN_INFO is nonnull, use it to
1481    record information about the operands in the insn.  */
1482 
1483 static void
1484 record_out_operands (rtx insn, bool earlyclobber, insn_rr_info *insn_info)
1485 {
1486   int n_ops = recog_data.n_operands;
1487   int alt = which_alternative;
1488 
1489   int i;
1490 
1491   for (i = 0; i < n_ops + recog_data.n_dups; i++)
1492     {
1493       int opn = i < n_ops ? i : recog_data.dup_num[i - n_ops];
1494       rtx *loc = (i < n_ops
1495 		  ? recog_data.operand_loc[opn]
1496 		  : recog_data.dup_loc[i - n_ops]);
1497       rtx op = *loc;
1498       enum reg_class cl = recog_op_alt[opn][alt].cl;
1499 
1500       struct du_head *prev_open;
1501 
1502       if (recog_data.operand_type[opn] != OP_OUT
1503 	  || recog_op_alt[opn][alt].earlyclobber != earlyclobber)
1504 	continue;
1505 
1506       if (insn_info)
1507 	cur_operand = insn_info->op_info + i;
1508 
1509       prev_open = open_chains;
1510       scan_rtx (insn, loc, cl, mark_write, OP_OUT);
1511 
1512       /* ??? Many targets have output constraints on the SET_DEST
1513 	 of a call insn, which is stupid, since these are certainly
1514 	 ABI defined hard registers.  For these, and for asm operands
1515 	 that originally referenced hard registers, we must record that
1516 	 the chain cannot be renamed.  */
1517       if (CALL_P (insn)
1518 	  || (asm_noperands (PATTERN (insn)) > 0
1519 	      && REG_P (op)
1520 	      && REGNO (op) == ORIGINAL_REGNO (op)))
1521 	{
1522 	  if (prev_open != open_chains)
1523 	    open_chains->cannot_rename = 1;
1524 	}
1525     }
1526   cur_operand = NULL;
1527 }
1528 
1529 /* Build def/use chain.  */
1530 
1531 static bool
1532 build_def_use (basic_block bb)
1533 {
1534   rtx insn;
1535   unsigned HOST_WIDE_INT untracked_operands;
1536 
1537   fail_current_block = false;
1538 
1539   for (insn = BB_HEAD (bb); ; insn = NEXT_INSN (insn))
1540     {
1541       if (NONDEBUG_INSN_P (insn))
1542 	{
1543 	  int n_ops;
1544 	  rtx note;
1545 	  rtx old_operands[MAX_RECOG_OPERANDS];
1546 	  rtx old_dups[MAX_DUP_OPERANDS];
1547 	  int i;
1548 	  int alt;
1549 	  int predicated;
1550 	  enum rtx_code set_code = SET;
1551 	  enum rtx_code clobber_code = CLOBBER;
1552 	  insn_rr_info *insn_info = NULL;
1553 
1554 	  /* Process the insn, determining its effect on the def-use
1555 	     chains and live hard registers.  We perform the following
1556 	     steps with the register references in the insn, simulating
1557 	     its effect:
1558 	     (1) Deal with earlyclobber operands and CLOBBERs of non-operands
1559 	         by creating chains and marking hard regs live.
1560 	     (2) Any read outside an operand causes any chain it overlaps
1561 	         with to be marked unrenamable.
1562 	     (3) Any read inside an operand is added if there's already
1563 	         an open chain for it.
1564 	     (4) For any REG_DEAD note we find, close open chains that
1565 	         overlap it.
1566 	     (5) For any non-earlyclobber write we find, close open chains
1567 	         that overlap it.
1568 	     (6) For any non-earlyclobber write we find in an operand, make
1569 	         a new chain or mark the hard register as live.
1570 	     (7) For any REG_UNUSED, close any chains we just opened.
1571 
1572 	     We cannot deal with situations where we track a reg in one mode
1573 	     and see a reference in another mode; these will cause the chain
1574 	     to be marked unrenamable or even cause us to abort the entire
1575 	     basic block.  */
1576 
1577 	  extract_insn (insn);
1578 	  if (! constrain_operands (1))
1579 	    fatal_insn_not_found (insn);
1580 	  preprocess_constraints ();
1581 	  alt = which_alternative;
1582 	  n_ops = recog_data.n_operands;
1583 	  untracked_operands = 0;
1584 
1585 	  if (insn_rr != NULL)
1586 	    {
1587 	      insn_info = VEC_index (insn_rr_info, insn_rr, INSN_UID (insn));
1588 	      insn_info->op_info = XOBNEWVEC (&rename_obstack, operand_rr_info,
1589 					      recog_data.n_operands);
1590 	      memset (insn_info->op_info, 0,
1591 		      sizeof (operand_rr_info) * recog_data.n_operands);
1592 	    }
1593 
1594 	  /* Simplify the code below by rewriting things to reflect
1595 	     matching constraints.  Also promote OP_OUT to OP_INOUT in
1596 	     predicated instructions, but only for register operands
1597 	     that are already tracked, so that we can create a chain
1598 	     when the first SET makes a register live.  */
1599 
1600 	  predicated = GET_CODE (PATTERN (insn)) == COND_EXEC;
1601 	  for (i = 0; i < n_ops; ++i)
1602 	    {
1603 	      rtx op = recog_data.operand[i];
1604 	      int matches = recog_op_alt[i][alt].matches;
1605 	      if (matches >= 0)
1606 		recog_op_alt[i][alt].cl = recog_op_alt[matches][alt].cl;
1607 	      if (matches >= 0 || recog_op_alt[i][alt].matched >= 0
1608 	          || (predicated && recog_data.operand_type[i] == OP_OUT))
1609 		{
1610 		  recog_data.operand_type[i] = OP_INOUT;
1611 		  /* A special case to deal with instruction patterns that
1612 		     have matching operands with different modes.  If we're
1613 		     not already tracking such a reg, we won't start here,
1614 		     and we must instead make sure to make the operand visible
1615 		     to the machinery that tracks hard registers.  */
1616 		  if (matches >= 0
1617 		      && (GET_MODE_SIZE (recog_data.operand_mode[i])
1618 			  != GET_MODE_SIZE (recog_data.operand_mode[matches]))
1619 		      && !verify_reg_in_set (op, &live_in_chains))
1620 		    {
1621 		      untracked_operands |= 1 << i;
1622 		      untracked_operands |= 1 << matches;
1623 		    }
1624 		}
1625 	      /* If there's an in-out operand with a register that is not
1626 		 being tracked at all yet, open a chain.  */
1627 	      if (recog_data.operand_type[i] == OP_INOUT
1628 		  && !(untracked_operands & (1 << i))
1629 		  && REG_P (op)
1630 		  && !verify_reg_tracked (op))
1631 		{
1632 		  enum machine_mode mode = GET_MODE (op);
1633 		  unsigned this_regno = REGNO (op);
1634 		  unsigned this_nregs = hard_regno_nregs[this_regno][mode];
1635 		  create_new_chain (this_regno, this_nregs, NULL, NULL_RTX,
1636 				    NO_REGS);
1637 		}
1638 	    }
1639 
1640 	  if (fail_current_block)
1641 	    break;
1642 
1643 	  /* Step 1a: Mark hard registers that are clobbered in this insn,
1644 	     outside an operand, as live.  */
1645 	  hide_operands (n_ops, old_operands, old_dups, untracked_operands,
1646 			 false);
1647 	  note_stores (PATTERN (insn), note_sets_clobbers, &clobber_code);
1648 	  restore_operands (insn, n_ops, old_operands, old_dups);
1649 
1650 	  /* Step 1b: Begin new chains for earlyclobbered writes inside
1651 	     operands.  */
1652 	  record_out_operands (insn, true, insn_info);
1653 
1654 	  /* Step 2: Mark chains for which we have reads outside operands
1655 	     as unrenamable.
1656 	     We do this by munging all operands into CC0, and closing
1657 	     everything remaining.  */
1658 
1659 	  hide_operands (n_ops, old_operands, old_dups, untracked_operands,
1660 			 false);
1661 	  scan_rtx (insn, &PATTERN (insn), NO_REGS, mark_all_read, OP_IN);
1662 	  restore_operands (insn, n_ops, old_operands, old_dups);
1663 
1664 	  /* Step 2B: Can't rename function call argument registers.  */
1665 	  if (CALL_P (insn) && CALL_INSN_FUNCTION_USAGE (insn))
1666 	    scan_rtx (insn, &CALL_INSN_FUNCTION_USAGE (insn),
1667 		      NO_REGS, mark_all_read, OP_IN);
1668 
1669 	  /* Step 2C: Can't rename asm operands that were originally
1670 	     hard registers.  */
1671 	  if (asm_noperands (PATTERN (insn)) > 0)
1672 	    for (i = 0; i < n_ops; i++)
1673 	      {
1674 		rtx *loc = recog_data.operand_loc[i];
1675 		rtx op = *loc;
1676 
1677 		if (REG_P (op)
1678 		    && REGNO (op) == ORIGINAL_REGNO (op)
1679 		    && (recog_data.operand_type[i] == OP_IN
1680 			|| recog_data.operand_type[i] == OP_INOUT))
1681 		  scan_rtx (insn, loc, NO_REGS, mark_all_read, OP_IN);
1682 	      }
1683 
1684 	  /* Step 3: Append to chains for reads inside operands.  */
1685 	  for (i = 0; i < n_ops + recog_data.n_dups; i++)
1686 	    {
1687 	      int opn = i < n_ops ? i : recog_data.dup_num[i - n_ops];
1688 	      rtx *loc = (i < n_ops
1689 			  ? recog_data.operand_loc[opn]
1690 			  : recog_data.dup_loc[i - n_ops]);
1691 	      enum reg_class cl = recog_op_alt[opn][alt].cl;
1692 	      enum op_type type = recog_data.operand_type[opn];
1693 
1694 	      /* Don't scan match_operand here, since we've no reg class
1695 		 information to pass down.  Any operands that we could
1696 		 substitute in will be represented elsewhere.  */
1697 	      if (recog_data.constraints[opn][0] == '\0'
1698 		  || untracked_operands & (1 << opn))
1699 		continue;
1700 
1701 	      if (insn_info)
1702 		cur_operand = i == opn ? insn_info->op_info + i : NULL;
1703 	      if (recog_op_alt[opn][alt].is_address)
1704 		scan_rtx_address (insn, loc, cl, mark_read,
1705 				  VOIDmode, ADDR_SPACE_GENERIC);
1706 	      else
1707 		scan_rtx (insn, loc, cl, mark_read, type);
1708 	    }
1709 	  cur_operand = NULL;
1710 
1711 	  /* Step 3B: Record updates for regs in REG_INC notes, and
1712 	     source regs in REG_FRAME_RELATED_EXPR notes.  */
1713 	  for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
1714 	    if (REG_NOTE_KIND (note) == REG_INC
1715 		|| REG_NOTE_KIND (note) == REG_FRAME_RELATED_EXPR)
1716 	      scan_rtx (insn, &XEXP (note, 0), ALL_REGS, mark_read,
1717 			OP_INOUT);
1718 
1719 	  /* Step 4: Close chains for registers that die here.  */
1720 	  for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
1721 	    if (REG_NOTE_KIND (note) == REG_DEAD)
1722 	      {
1723 		remove_from_hard_reg_set (&live_hard_regs,
1724 					  GET_MODE (XEXP (note, 0)),
1725 					  REGNO (XEXP (note, 0)));
1726 		scan_rtx (insn, &XEXP (note, 0), NO_REGS, terminate_dead,
1727 			  OP_IN);
1728 	      }
1729 
1730 	  /* Step 4B: If this is a call, any chain live at this point
1731 	     requires a caller-saved reg.  */
1732 	  if (CALL_P (insn))
1733 	    {
1734 	      struct du_head *p;
1735 	      for (p = open_chains; p; p = p->next_chain)
1736 		p->need_caller_save_reg = 1;
1737 	    }
1738 
1739 	  /* Step 5: Close open chains that overlap writes.  Similar to
1740 	     step 2, we hide in-out operands, since we do not want to
1741 	     close these chains.  We also hide earlyclobber operands,
1742 	     since we've opened chains for them in step 1, and earlier
1743 	     chains they would overlap with must have been closed at
1744 	     the previous insn at the latest, as such operands cannot
1745 	     possibly overlap with any input operands.  */
1746 
1747 	  hide_operands (n_ops, old_operands, old_dups, untracked_operands,
1748 			 true);
1749 	  scan_rtx (insn, &PATTERN (insn), NO_REGS, terminate_write, OP_IN);
1750 	  restore_operands (insn, n_ops, old_operands, old_dups);
1751 
1752 	  /* Step 6a: Mark hard registers that are set in this insn,
1753 	     outside an operand, as live.  */
1754 	  hide_operands (n_ops, old_operands, old_dups, untracked_operands,
1755 			 false);
1756 	  note_stores (PATTERN (insn), note_sets_clobbers, &set_code);
1757 	  restore_operands (insn, n_ops, old_operands, old_dups);
1758 
1759 	  /* Step 6b: Begin new chains for writes inside operands.  */
1760 	  record_out_operands (insn, false, insn_info);
1761 
1762 	  /* Step 6c: Record destination regs in REG_FRAME_RELATED_EXPR
1763 	     notes for update.  */
1764 	  for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
1765 	    if (REG_NOTE_KIND (note) == REG_FRAME_RELATED_EXPR)
1766 	      scan_rtx (insn, &XEXP (note, 0), ALL_REGS, mark_access,
1767 			OP_INOUT);
1768 
1769 	  /* Step 7: Close chains for registers that were never
1770 	     really used here.  */
1771 	  for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
1772 	    if (REG_NOTE_KIND (note) == REG_UNUSED)
1773 	      {
1774 		remove_from_hard_reg_set (&live_hard_regs,
1775 					  GET_MODE (XEXP (note, 0)),
1776 					  REGNO (XEXP (note, 0)));
1777 		scan_rtx (insn, &XEXP (note, 0), NO_REGS, terminate_dead,
1778 			  OP_IN);
1779 	      }
1780 	}
1781       else if (DEBUG_INSN_P (insn)
1782 	       && !VAR_LOC_UNKNOWN_P (INSN_VAR_LOCATION_LOC (insn)))
1783 	{
1784 	  scan_rtx (insn, &INSN_VAR_LOCATION_LOC (insn),
1785 		    ALL_REGS, mark_read, OP_IN);
1786 	}
1787       if (insn == BB_END (bb))
1788 	break;
1789     }
1790 
1791   if (fail_current_block)
1792     return false;
1793 
1794   return true;
1795 }
1796 
1797 /* Initialize the register renamer.  If INSN_INFO is true, ensure that
1798    insn_rr is nonnull.  */
1799 void
1800 regrename_init (bool insn_info)
1801 {
1802   gcc_obstack_init (&rename_obstack);
1803   insn_rr = NULL;
1804   if (insn_info)
1805     VEC_safe_grow_cleared (insn_rr_info, heap, insn_rr, get_max_uid ());
1806 }
1807 
1808 /* Free all global data used by the register renamer.  */
1809 void
1810 regrename_finish (void)
1811 {
1812   VEC_free (insn_rr_info, heap, insn_rr);
1813   free_chain_data ();
1814   obstack_free (&rename_obstack, NULL);
1815 }
1816 
1817 /* Perform register renaming on the current function.  */
1818 
1819 static unsigned int
1820 regrename_optimize (void)
1821 {
1822   df_set_flags (DF_LR_RUN_DCE);
1823   df_note_add_problem ();
1824   df_analyze ();
1825   df_set_flags (DF_DEFER_INSN_RESCAN);
1826 
1827   regrename_init (false);
1828 
1829   regrename_analyze (NULL);
1830 
1831   rename_chains ();
1832 
1833   regrename_finish ();
1834 
1835   return 0;
1836 }
1837 
1838 static bool
1839 gate_handle_regrename (void)
1840 {
1841   return (optimize > 0 && (flag_rename_registers));
1842 }
1843 
1844 struct rtl_opt_pass pass_regrename =
1845 {
1846  {
1847   RTL_PASS,
1848   "rnreg",                              /* name */
1849   gate_handle_regrename,                /* gate */
1850   regrename_optimize,                   /* execute */
1851   NULL,                                 /* sub */
1852   NULL,                                 /* next */
1853   0,                                    /* static_pass_number */
1854   TV_RENAME_REGISTERS,                  /* tv_id */
1855   0,                                    /* properties_required */
1856   0,                                    /* properties_provided */
1857   0,                                    /* properties_destroyed */
1858   0,                                    /* todo_flags_start */
1859   TODO_df_finish | TODO_verify_rtl_sharing |
1860   0                                     /* todo_flags_finish */
1861  }
1862 };
1863