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