Fix issue for pointers to anonymous types with -fdump-ada-spec
[official-gcc.git] / gcc / regrename.cc
blob10271e1b17d4b3375b38687ed462e7361a472977
1 /* Register renaming for the GNU compiler.
2 Copyright (C) 2000-2022 Free Software Foundation, Inc.
4 This file is part of GCC.
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.
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.
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/>. */
20 #include "config.h"
21 #include "system.h"
22 #include "coretypes.h"
23 #include "backend.h"
24 #include "target.h"
25 #include "rtl.h"
26 #include "df.h"
27 #include "memmodel.h"
28 #include "tm_p.h"
29 #include "insn-config.h"
30 #include "regs.h"
31 #include "emit-rtl.h"
32 #include "recog.h"
33 #include "addresses.h"
34 #include "cfganal.h"
35 #include "tree-pass.h"
36 #include "function-abi.h"
37 #include "regrename.h"
39 /* This file implements the RTL register renaming pass of the compiler. It is
40 a semi-local pass whose goal is to maximize the usage of the register file
41 of the processor by substituting registers for others in the solution given
42 by the register allocator. The algorithm is as follows:
44 1. Local def/use chains are built: within each basic block, chains are
45 opened and closed; if a chain isn't closed at the end of the block,
46 it is dropped. We pre-open chains if we have already examined a
47 predecessor block and found chains live at the end which match
48 live registers at the start of the new block.
50 2. We try to combine the local chains across basic block boundaries by
51 comparing chains that were open at the start or end of a block to
52 those in successor/predecessor blocks.
54 3. For each chain, the set of possible renaming registers is computed.
55 This takes into account the renaming of previously processed chains.
56 Optionally, a preferred class is computed for the renaming register.
58 4. The best renaming register is computed for the chain in the above set,
59 using a round-robin allocation. If a preferred class exists, then the
60 round-robin allocation is done within the class first, if possible.
61 The round-robin allocation of renaming registers itself is global.
63 5. If a renaming register has been found, it is substituted in the chain.
65 Targets can parameterize the pass by specifying a preferred class for the
66 renaming register for a given (super)class of registers to be renamed.
68 DEBUG_INSNs are treated specially, in particular registers occurring inside
69 them are treated as requiring ALL_REGS as a class. */
71 #if HOST_BITS_PER_WIDE_INT <= MAX_RECOG_OPERANDS
72 #error "Use a different bitmap implementation for untracked_operands."
73 #endif
75 enum scan_actions
77 terminate_write,
78 terminate_dead,
79 mark_all_read,
80 mark_read,
81 mark_write,
82 /* mark_access is for marking the destination regs in
83 REG_FRAME_RELATED_EXPR notes (as if they were read) so that the
84 note is updated properly. */
85 mark_access
88 static const char * const scan_actions_name[] =
90 "terminate_write",
91 "terminate_dead",
92 "mark_all_read",
93 "mark_read",
94 "mark_write",
95 "mark_access"
98 /* TICK and THIS_TICK are used to record the last time we saw each
99 register. */
100 static int tick[FIRST_PSEUDO_REGISTER];
101 static int this_tick = 0;
103 static struct obstack rename_obstack;
105 /* If nonnull, the code calling into the register renamer requested
106 information about insn operands, and we store it here. */
107 vec<insn_rr_info> insn_rr;
109 static void scan_rtx (rtx_insn *, rtx *, enum reg_class, enum scan_actions,
110 enum op_type);
111 static bool build_def_use (basic_block);
113 /* The id to be given to the next opened chain. */
114 static unsigned current_id;
116 /* A mapping of unique id numbers to chains. */
117 static vec<du_head_p> id_to_chain;
119 /* List of currently open chains. */
120 static class du_head *open_chains;
122 /* Bitmap of open chains. The bits set always match the list found in
123 open_chains. */
124 static bitmap_head open_chains_set;
126 /* Record the registers being tracked in open_chains. */
127 static HARD_REG_SET live_in_chains;
129 /* Record the registers that are live but not tracked. The intersection
130 between this and live_in_chains is empty. */
131 static HARD_REG_SET live_hard_regs;
133 /* Set while scanning RTL if INSN_RR is nonnull, i.e. if the current analysis
134 is for a caller that requires operand data. Used in
135 record_operand_use. */
136 static operand_rr_info *cur_operand;
138 /* Set while scanning RTL if a register dies. Used to tie chains. */
139 static class du_head *terminated_this_insn;
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)
146 du_head_p first_chain = id_to_chain[id];
147 du_head_p chain = first_chain;
148 while (chain->id != id)
150 id = chain->id;
151 chain = id_to_chain[id];
153 first_chain->id = id;
154 return chain;
157 /* Dump all def/use chains, starting at id FROM. */
159 static void
160 dump_def_use_chain (int from)
162 du_head_p head;
163 int i;
164 FOR_EACH_VEC_ELT_FROM (id_to_chain, i, head, from)
166 struct du_chain *this_du = head->first;
168 fprintf (dump_file, "Register %s (%d):",
169 reg_names[head->regno], head->nregs);
170 while (this_du)
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;
176 fprintf (dump_file, "\n");
177 head = head->next_chain;
181 static void
182 free_chain_data (void)
184 int i;
185 du_head_p ptr;
186 for (i = 0; id_to_chain.iterate (i, &ptr); i++)
187 bitmap_clear (&ptr->conflicts);
189 id_to_chain.release ();
192 /* Walk all chains starting with CHAINS and record that they conflict with
193 another chain whose id is ID. */
195 static void
196 mark_conflict (class du_head *chains, unsigned id)
198 while (chains)
200 bitmap_set_bit (&chains->conflicts, id);
201 chains = chains->next_chain;
205 /* Examine cur_operand, and if it is nonnull, record information about the
206 use THIS_DU which is part of the chain HEAD. */
208 static void
209 record_operand_use (class du_head *head, struct du_chain *this_du)
211 if (cur_operand == NULL || cur_operand->failed)
212 return;
213 if (head->cannot_rename)
215 cur_operand->failed = true;
216 return;
218 gcc_assert (cur_operand->n_chains < MAX_REGS_PER_ADDRESS);
219 cur_operand->heads[cur_operand->n_chains] = head;
220 cur_operand->chains[cur_operand->n_chains++] = this_du;
223 /* Create a new chain for THIS_NREGS registers starting at THIS_REGNO,
224 and record its occurrence in *LOC, which is being written to in INSN.
225 This access requires a register of class CL. */
227 static du_head_p
228 create_new_chain (unsigned this_regno, unsigned this_nregs, rtx *loc,
229 rtx_insn *insn, enum reg_class cl)
231 class du_head *head = XOBNEW (&rename_obstack, class du_head);
232 struct du_chain *this_du;
233 int nregs;
235 memset ((void *)head, 0, sizeof *head);
236 head->next_chain = open_chains;
237 head->regno = this_regno;
238 head->nregs = this_nregs;
240 id_to_chain.safe_push (head);
241 head->id = current_id++;
243 bitmap_initialize (&head->conflicts, &bitmap_default_obstack);
244 bitmap_copy (&head->conflicts, &open_chains_set);
245 mark_conflict (open_chains, head->id);
247 /* Since we're tracking this as a chain now, remove it from the
248 list of conflicting live hard registers and track it in
249 live_in_chains instead. */
250 nregs = head->nregs;
251 while (nregs-- > 0)
253 SET_HARD_REG_BIT (live_in_chains, head->regno + nregs);
254 CLEAR_HARD_REG_BIT (live_hard_regs, head->regno + nregs);
257 head->hard_conflicts = live_hard_regs;
258 bitmap_set_bit (&open_chains_set, head->id);
260 open_chains = head;
262 if (dump_file)
264 fprintf (dump_file, "Creating chain %s (%d)",
265 reg_names[head->regno], head->id);
266 if (insn != NULL_RTX)
267 fprintf (dump_file, " at insn %d", INSN_UID (insn));
268 fprintf (dump_file, "\n");
271 if (insn == NULL_RTX)
273 head->first = head->last = NULL;
274 return head;
277 this_du = XOBNEW (&rename_obstack, struct du_chain);
278 head->first = head->last = this_du;
280 this_du->next_use = 0;
281 this_du->loc = loc;
282 this_du->insn = insn;
283 this_du->cl = cl;
284 record_operand_use (head, this_du);
285 return head;
288 /* For a def-use chain HEAD, find which registers overlap its lifetime and
289 set the corresponding bits in *PSET. */
291 static void
292 merge_overlapping_regs (HARD_REG_SET *pset, class du_head *head)
294 bitmap_iterator bi;
295 unsigned i;
296 *pset |= head->hard_conflicts;
297 EXECUTE_IF_SET_IN_BITMAP (&head->conflicts, 0, i, bi)
299 du_head_p other = regrename_chain_from_id (i);
300 unsigned j = other->nregs;
301 gcc_assert (other != head);
302 while (j-- > 0)
303 SET_HARD_REG_BIT (*pset, other->regno + j);
307 /* Return true if (reg:MODE REGNO) would be clobbered by a call covered
308 by THIS_HEAD. */
310 static bool
311 call_clobbered_in_chain_p (du_head *this_head, machine_mode mode,
312 unsigned int regno)
314 return call_clobbered_in_region_p (this_head->call_abis,
315 this_head->call_clobber_mask,
316 mode, regno);
319 /* Check if NEW_REG can be the candidate register to rename for
320 REG in THIS_HEAD chain. THIS_UNAVAILABLE is a set of unavailable hard
321 registers. */
323 static bool
324 check_new_reg_p (int reg ATTRIBUTE_UNUSED, int new_reg,
325 class du_head *this_head, HARD_REG_SET this_unavailable)
327 machine_mode mode = GET_MODE (*this_head->first->loc);
328 int nregs = hard_regno_nregs (new_reg, mode);
329 int i;
330 struct du_chain *tmp;
332 for (i = nregs - 1; i >= 0; --i)
333 if (TEST_HARD_REG_BIT (this_unavailable, new_reg + i)
334 || fixed_regs[new_reg + i]
335 || global_regs[new_reg + i]
336 /* Can't use regs which aren't saved by the prologue. */
337 || (! df_regs_ever_live_p (new_reg + i)
338 && ! crtl->abi->clobbers_full_reg_p (new_reg + i))
339 #ifdef LEAF_REGISTERS
340 /* We can't use a non-leaf register if we're in a
341 leaf function. */
342 || (crtl->is_leaf
343 && !LEAF_REGISTERS[new_reg + i])
344 #endif
345 || ! HARD_REGNO_RENAME_OK (reg + i, new_reg + i))
346 return false;
348 /* See whether it accepts all modes that occur in
349 definition and uses. */
350 for (tmp = this_head->first; tmp; tmp = tmp->next_use)
352 /* Completely ignore DEBUG_INSNs, otherwise we can get
353 -fcompare-debug failures. */
354 if (DEBUG_INSN_P (tmp->insn))
355 continue;
357 if (!targetm.hard_regno_mode_ok (new_reg, GET_MODE (*tmp->loc))
358 || call_clobbered_in_chain_p (this_head, GET_MODE (*tmp->loc),
359 new_reg))
360 return false;
363 return true;
366 /* For the chain THIS_HEAD, compute and return the best register to
367 rename to. SUPER_CLASS is the superunion of register classes in
368 the chain. UNAVAILABLE is a set of registers that cannot be used.
369 OLD_REG is the register currently used for the chain. BEST_RENAME
370 controls whether the register chosen must be better than the
371 current one or just respect the given constraint. */
374 find_rename_reg (du_head_p this_head, enum reg_class super_class,
375 HARD_REG_SET *unavailable, int old_reg, bool best_rename)
377 bool has_preferred_class;
378 enum reg_class preferred_class;
379 int pass;
380 int best_new_reg = old_reg;
382 /* Mark registers that overlap this chain's lifetime as unavailable. */
383 merge_overlapping_regs (unavailable, this_head);
385 /* Compute preferred rename class of super union of all the classes
386 in the chain. */
387 preferred_class
388 = (enum reg_class) targetm.preferred_rename_class (super_class);
390 /* Pick and check the register from the tied chain iff the tied chain
391 is not renamed. */
392 if (this_head->tied_chain && !this_head->tied_chain->renamed
393 && check_new_reg_p (old_reg, this_head->tied_chain->regno,
394 this_head, *unavailable))
395 return this_head->tied_chain->regno;
397 /* If the first non-debug insn is a noop move, then do not rename in this
398 chain as doing so would inhibit removal of the noop move. */
399 for (struct du_chain *tmp = this_head->first; tmp; tmp = tmp->next_use)
400 if (DEBUG_INSN_P (tmp->insn))
401 continue;
402 else if (noop_move_p (tmp->insn))
403 return best_new_reg;
404 else
405 break;
407 /* If PREFERRED_CLASS is not NO_REGS, we iterate in the first pass
408 over registers that belong to PREFERRED_CLASS and try to find the
409 best register within the class. If that failed, we iterate in
410 the second pass over registers that don't belong to the class.
411 If PREFERRED_CLASS is NO_REGS, we iterate over all registers in
412 ascending order without any preference. */
413 has_preferred_class = (preferred_class != NO_REGS);
414 for (pass = (has_preferred_class ? 0 : 1); pass < 2; pass++)
416 int new_reg;
417 for (new_reg = 0; new_reg < FIRST_PSEUDO_REGISTER; new_reg++)
419 if (has_preferred_class
420 && (pass == 0)
421 != TEST_HARD_REG_BIT (reg_class_contents[preferred_class],
422 new_reg))
423 continue;
425 if (!check_new_reg_p (old_reg, new_reg, this_head, *unavailable))
426 continue;
428 if (!best_rename)
429 return new_reg;
431 /* In the first pass, we force the renaming of registers that
432 don't belong to PREFERRED_CLASS to registers that do, even
433 though the latters were used not very long ago. */
434 if ((pass == 0
435 && !TEST_HARD_REG_BIT (reg_class_contents[preferred_class],
436 best_new_reg))
437 || tick[best_new_reg] > tick[new_reg])
438 best_new_reg = new_reg;
440 if (pass == 0 && best_new_reg != old_reg)
441 break;
443 return best_new_reg;
446 /* Iterate over elements in the chain HEAD in order to:
447 1. Count number of uses, storing it in *PN_USES.
448 2. Narrow the set of registers we can use for renaming, adding
449 unavailable registers to *PUNAVAILABLE, which must be
450 initialized by the caller.
451 3. Compute the superunion of register classes in this chain
452 and return it. */
453 reg_class
454 regrename_find_superclass (du_head_p head, int *pn_uses,
455 HARD_REG_SET *punavailable)
457 int n_uses = 0;
458 reg_class super_class = NO_REGS;
459 for (du_chain *tmp = head->first; tmp; tmp = tmp->next_use)
461 if (DEBUG_INSN_P (tmp->insn))
462 continue;
463 n_uses++;
464 *punavailable |= ~reg_class_contents[tmp->cl];
465 super_class
466 = reg_class_superunion[(int) super_class][(int) tmp->cl];
468 *pn_uses = n_uses;
469 return super_class;
472 /* Perform register renaming on the current function. */
473 static void
474 rename_chains (void)
476 HARD_REG_SET unavailable;
477 du_head_p this_head;
478 int i;
480 memset (tick, 0, sizeof tick);
482 CLEAR_HARD_REG_SET (unavailable);
483 /* Don't clobber traceback for noreturn functions. */
484 if (frame_pointer_needed)
486 add_to_hard_reg_set (&unavailable, Pmode, FRAME_POINTER_REGNUM);
487 if (!HARD_FRAME_POINTER_IS_FRAME_POINTER)
488 add_to_hard_reg_set (&unavailable, Pmode, HARD_FRAME_POINTER_REGNUM);
491 FOR_EACH_VEC_ELT (id_to_chain, i, this_head)
493 int best_new_reg;
494 int n_uses;
495 HARD_REG_SET this_unavailable;
496 int reg = this_head->regno;
498 if (this_head->cannot_rename)
499 continue;
501 if (fixed_regs[reg] || global_regs[reg]
502 || (!HARD_FRAME_POINTER_IS_FRAME_POINTER && frame_pointer_needed
503 && reg == HARD_FRAME_POINTER_REGNUM)
504 || (HARD_FRAME_POINTER_IS_FRAME_POINTER && frame_pointer_needed
505 && reg == FRAME_POINTER_REGNUM))
506 continue;
508 this_unavailable = unavailable;
510 reg_class super_class = regrename_find_superclass (this_head, &n_uses,
511 &this_unavailable);
512 if (n_uses < 2)
513 continue;
515 best_new_reg = find_rename_reg (this_head, super_class,
516 &this_unavailable, reg, true);
518 if (dump_file)
520 fprintf (dump_file, "Register %s in insn %d",
521 reg_names[reg], INSN_UID (this_head->first->insn));
522 if (this_head->call_abis)
523 fprintf (dump_file, " crosses a call");
526 if (best_new_reg == reg)
528 tick[reg] = ++this_tick;
529 if (dump_file)
530 fprintf (dump_file, "; no available better choice\n");
531 continue;
534 if (regrename_do_replace (this_head, best_new_reg))
536 if (dump_file)
537 fprintf (dump_file, ", renamed as %s\n", reg_names[best_new_reg]);
538 tick[best_new_reg] = ++this_tick;
539 df_set_regs_ever_live (best_new_reg, true);
541 else
543 if (dump_file)
544 fprintf (dump_file, ", renaming as %s failed\n",
545 reg_names[best_new_reg]);
546 tick[reg] = ++this_tick;
551 /* A structure to record information for each hard register at the start of
552 a basic block. */
553 struct incoming_reg_info {
554 /* Holds the number of registers used in the chain that gave us information
555 about this register. Zero means no information known yet, while a
556 negative value is used for something that is part of, but not the first
557 register in a multi-register value. */
558 int nregs;
559 /* Set to true if we have accesses that conflict in the number of registers
560 used. */
561 bool unusable;
564 /* A structure recording information about each basic block. It is saved
565 and restored around basic block boundaries.
566 A pointer to such a structure is stored in each basic block's aux field
567 during regrename_analyze, except for blocks we know can't be optimized
568 (such as entry and exit blocks). */
569 class bb_rename_info
571 public:
572 /* The basic block corresponding to this structure. */
573 basic_block bb;
574 /* Copies of the global information. */
575 bitmap_head open_chains_set;
576 bitmap_head incoming_open_chains_set;
577 struct incoming_reg_info incoming[FIRST_PSEUDO_REGISTER];
580 /* Initialize a rename_info structure P for basic block BB, which starts a new
581 scan. */
582 static void
583 init_rename_info (class bb_rename_info *p, basic_block bb)
585 int i;
586 df_ref def;
587 HARD_REG_SET start_chains_set;
589 p->bb = bb;
590 bitmap_initialize (&p->open_chains_set, &bitmap_default_obstack);
591 bitmap_initialize (&p->incoming_open_chains_set, &bitmap_default_obstack);
593 open_chains = NULL;
594 bitmap_clear (&open_chains_set);
596 CLEAR_HARD_REG_SET (live_in_chains);
597 REG_SET_TO_HARD_REG_SET (live_hard_regs, df_get_live_in (bb));
598 FOR_EACH_ARTIFICIAL_DEF (def, bb->index)
599 if (DF_REF_FLAGS (def) & DF_REF_AT_TOP)
600 SET_HARD_REG_BIT (live_hard_regs, DF_REF_REGNO (def));
602 /* Open chains based on information from (at least one) predecessor
603 block. This gives us a chance later on to combine chains across
604 basic block boundaries. Inconsistencies (in access sizes) will
605 be caught normally and dealt with conservatively by disabling the
606 chain for renaming, and there is no risk of losing optimization
607 opportunities by opening chains either: if we did not open the
608 chains, we'd have to track the live register as a hard reg, and
609 we'd be unable to rename it in any case. */
610 CLEAR_HARD_REG_SET (start_chains_set);
611 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
613 struct incoming_reg_info *iri = p->incoming + i;
614 if (iri->nregs > 0 && !iri->unusable
615 && range_in_hard_reg_set_p (live_hard_regs, i, iri->nregs))
617 SET_HARD_REG_BIT (start_chains_set, i);
618 remove_range_from_hard_reg_set (&live_hard_regs, i, iri->nregs);
621 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
623 struct incoming_reg_info *iri = p->incoming + i;
624 if (TEST_HARD_REG_BIT (start_chains_set, i))
626 du_head_p chain;
627 if (dump_file)
628 fprintf (dump_file, "opening incoming chain\n");
629 chain = create_new_chain (i, iri->nregs, NULL, NULL, NO_REGS);
630 bitmap_set_bit (&p->incoming_open_chains_set, chain->id);
635 /* Record in RI that the block corresponding to it has an incoming
636 live value, described by CHAIN. */
637 static void
638 set_incoming_from_chain (class bb_rename_info *ri, du_head_p chain)
640 int i;
641 int incoming_nregs = ri->incoming[chain->regno].nregs;
642 int nregs;
644 /* If we've recorded the same information before, everything is fine. */
645 if (incoming_nregs == chain->nregs)
647 if (dump_file)
648 fprintf (dump_file, "reg %d/%d already recorded\n",
649 chain->regno, chain->nregs);
650 return;
653 /* If we have no information for any of the involved registers, update
654 the incoming array. */
655 nregs = chain->nregs;
656 while (nregs-- > 0)
657 if (ri->incoming[chain->regno + nregs].nregs != 0
658 || ri->incoming[chain->regno + nregs].unusable)
659 break;
660 if (nregs < 0)
662 nregs = chain->nregs;
663 ri->incoming[chain->regno].nregs = nregs;
664 while (nregs-- > 1)
665 ri->incoming[chain->regno + nregs].nregs = -nregs;
666 if (dump_file)
667 fprintf (dump_file, "recorded reg %d/%d\n",
668 chain->regno, chain->nregs);
669 return;
672 /* There must be some kind of conflict. Prevent both the old and
673 new ranges from being used. */
674 if (incoming_nregs < 0)
675 ri->incoming[chain->regno + incoming_nregs].unusable = true;
676 for (i = 0; i < chain->nregs; i++)
677 ri->incoming[chain->regno + i].unusable = true;
680 /* Merge the two chains C1 and C2 so that all conflict information is
681 recorded and C1, and the id of C2 is changed to that of C1. */
682 static void
683 merge_chains (du_head_p c1, du_head_p c2)
685 if (c1 == c2)
686 return;
688 if (c2->first != NULL)
690 if (c1->first == NULL)
691 c1->first = c2->first;
692 else
693 c1->last->next_use = c2->first;
694 c1->last = c2->last;
697 c2->first = c2->last = NULL;
698 c2->id = c1->id;
700 c1->hard_conflicts |= c2->hard_conflicts;
701 bitmap_ior_into (&c1->conflicts, &c2->conflicts);
703 c1->call_clobber_mask |= c2->call_clobber_mask;
704 c1->call_abis |= c2->call_abis;
705 c1->cannot_rename |= c2->cannot_rename;
708 /* Analyze the current function and build chains for renaming.
709 If INCLUDE_ALL_BLOCKS_P is set to true, process all blocks,
710 ignoring BB_DISABLE_SCHEDULE. The default value is true. */
712 void
713 regrename_analyze (bitmap bb_mask, bool include_all_block_p)
715 class bb_rename_info *rename_info;
716 int i;
717 basic_block bb;
718 int n_bbs;
719 int *inverse_postorder;
721 inverse_postorder = XNEWVEC (int, last_basic_block_for_fn (cfun));
722 n_bbs = pre_and_rev_post_order_compute (NULL, inverse_postorder, false);
724 /* Gather some information about the blocks in this function. */
725 rename_info = XCNEWVEC (class bb_rename_info, n_basic_blocks_for_fn (cfun));
726 i = 0;
727 FOR_EACH_BB_FN (bb, cfun)
729 class bb_rename_info *ri = rename_info + i;
730 ri->bb = bb;
731 if (bb_mask != NULL && !bitmap_bit_p (bb_mask, bb->index))
732 bb->aux = NULL;
733 else
734 bb->aux = ri;
735 i++;
738 current_id = 0;
739 id_to_chain.create (0);
740 bitmap_initialize (&open_chains_set, &bitmap_default_obstack);
742 /* The order in which we visit blocks ensures that whenever
743 possible, we only process a block after at least one of its
744 predecessors, which provides a "seeding" effect to make the logic
745 in set_incoming_from_chain and init_rename_info useful. */
747 for (i = 0; i < n_bbs; i++)
749 basic_block bb1 = BASIC_BLOCK_FOR_FN (cfun, inverse_postorder[i]);
750 class bb_rename_info *this_info;
751 bool success;
752 edge e;
753 edge_iterator ei;
754 int old_length = id_to_chain.length ();
756 this_info = (class bb_rename_info *) bb1->aux;
757 if (this_info == NULL)
758 continue;
760 if (dump_file)
761 fprintf (dump_file, "\nprocessing block %d:\n", bb1->index);
763 if (!include_all_block_p && (bb1->flags & BB_DISABLE_SCHEDULE) != 0)
765 if (dump_file)
766 fprintf (dump_file, "avoid disrupting the sms schedule of bb %d\n",
767 bb1->index);
768 continue;
771 init_rename_info (this_info, bb1);
773 success = build_def_use (bb1);
774 if (!success)
776 if (dump_file)
777 fprintf (dump_file, "failed\n");
778 bb1->aux = NULL;
779 id_to_chain.truncate (old_length);
780 current_id = old_length;
781 bitmap_clear (&this_info->incoming_open_chains_set);
782 open_chains = NULL;
783 if (insn_rr.exists ())
785 rtx_insn *insn;
786 FOR_BB_INSNS (bb1, insn)
788 insn_rr_info *p = &insn_rr[INSN_UID (insn)];
789 p->op_info = NULL;
792 continue;
795 if (dump_file)
796 dump_def_use_chain (old_length);
797 bitmap_copy (&this_info->open_chains_set, &open_chains_set);
799 /* Add successor blocks to the worklist if necessary, and record
800 data about our own open chains at the end of this block, which
801 will be used to pre-open chains when processing the successors. */
802 FOR_EACH_EDGE (e, ei, bb1->succs)
804 class bb_rename_info *dest_ri;
805 class du_head *chain;
807 if (dump_file)
808 fprintf (dump_file, "successor block %d\n", e->dest->index);
810 if (e->flags & (EDGE_EH | EDGE_ABNORMAL))
811 continue;
812 dest_ri = (class bb_rename_info *)e->dest->aux;
813 if (dest_ri == NULL)
814 continue;
815 for (chain = open_chains; chain; chain = chain->next_chain)
816 set_incoming_from_chain (dest_ri, chain);
820 free (inverse_postorder);
822 /* Now, combine the chains data we have gathered across basic block
823 boundaries.
825 For every basic block, there may be chains open at the start, or at the
826 end. Rather than exclude them from renaming, we look for open chains
827 with matching registers at the other side of the CFG edge.
829 For a given chain using register R, open at the start of block B, we
830 must find an open chain using R on the other side of every edge leading
831 to B, if the register is live across this edge. In the code below,
832 N_PREDS_USED counts the number of edges where the register is live, and
833 N_PREDS_JOINED counts those where we found an appropriate chain for
834 joining.
836 We perform the analysis for both incoming and outgoing edges, but we
837 only need to merge once (in the second part, after verifying outgoing
838 edges). */
839 FOR_EACH_BB_FN (bb, cfun)
841 class bb_rename_info *bb_ri = (class bb_rename_info *) bb->aux;
842 unsigned j;
843 bitmap_iterator bi;
845 if (bb_ri == NULL)
846 continue;
848 if (dump_file)
849 fprintf (dump_file, "processing bb %d in edges\n", bb->index);
851 EXECUTE_IF_SET_IN_BITMAP (&bb_ri->incoming_open_chains_set, 0, j, bi)
853 edge e;
854 edge_iterator ei;
855 class du_head *chain = regrename_chain_from_id (j);
856 int n_preds_used = 0, n_preds_joined = 0;
858 FOR_EACH_EDGE (e, ei, bb->preds)
860 class bb_rename_info *src_ri;
861 unsigned k;
862 bitmap_iterator bi2;
863 HARD_REG_SET live;
864 bool success = false;
866 REG_SET_TO_HARD_REG_SET (live, df_get_live_out (e->src));
867 if (!range_overlaps_hard_reg_set_p (live, chain->regno,
868 chain->nregs))
869 continue;
870 n_preds_used++;
872 if (e->flags & (EDGE_EH | EDGE_ABNORMAL))
873 continue;
875 src_ri = (class bb_rename_info *)e->src->aux;
876 if (src_ri == NULL)
877 continue;
879 EXECUTE_IF_SET_IN_BITMAP (&src_ri->open_chains_set,
880 0, k, bi2)
882 class du_head *outgoing_chain = regrename_chain_from_id (k);
884 if (outgoing_chain->regno == chain->regno
885 && outgoing_chain->nregs == chain->nregs)
887 n_preds_joined++;
888 success = true;
889 break;
892 if (!success && dump_file)
893 fprintf (dump_file, "failure to match with pred block %d\n",
894 e->src->index);
896 if (n_preds_joined < n_preds_used)
898 if (dump_file)
899 fprintf (dump_file, "cannot rename chain %d\n", j);
900 chain->cannot_rename = 1;
904 FOR_EACH_BB_FN (bb, cfun)
906 class bb_rename_info *bb_ri = (class bb_rename_info *) bb->aux;
907 unsigned j;
908 bitmap_iterator bi;
910 if (bb_ri == NULL)
911 continue;
913 if (dump_file)
914 fprintf (dump_file, "processing bb %d out edges\n", bb->index);
916 EXECUTE_IF_SET_IN_BITMAP (&bb_ri->open_chains_set, 0, j, bi)
918 edge e;
919 edge_iterator ei;
920 class du_head *chain = regrename_chain_from_id (j);
921 int n_succs_used = 0, n_succs_joined = 0;
923 FOR_EACH_EDGE (e, ei, bb->succs)
925 bool printed = false;
926 class bb_rename_info *dest_ri;
927 unsigned k;
928 bitmap_iterator bi2;
929 HARD_REG_SET live;
931 REG_SET_TO_HARD_REG_SET (live, df_get_live_in (e->dest));
932 if (!range_overlaps_hard_reg_set_p (live, chain->regno,
933 chain->nregs))
934 continue;
936 n_succs_used++;
938 dest_ri = (class bb_rename_info *)e->dest->aux;
939 if (dest_ri == NULL)
940 continue;
942 EXECUTE_IF_SET_IN_BITMAP (&dest_ri->incoming_open_chains_set,
943 0, k, bi2)
945 class du_head *incoming_chain = regrename_chain_from_id (k);
947 if (incoming_chain->regno == chain->regno
948 && incoming_chain->nregs == chain->nregs)
950 if (dump_file)
952 if (!printed)
953 fprintf (dump_file,
954 "merging blocks for edge %d -> %d\n",
955 e->src->index, e->dest->index);
956 printed = true;
957 fprintf (dump_file,
958 " merging chains %d (->%d) and %d (->%d) [%s]\n",
959 k, incoming_chain->id, j, chain->id,
960 reg_names[incoming_chain->regno]);
963 merge_chains (chain, incoming_chain);
964 n_succs_joined++;
965 break;
969 if (n_succs_joined < n_succs_used)
971 if (dump_file)
972 fprintf (dump_file, "cannot rename chain %d\n",
974 chain->cannot_rename = 1;
979 free (rename_info);
981 FOR_EACH_BB_FN (bb, cfun)
982 bb->aux = NULL;
985 /* Attempt to replace all uses of the register in the chain beginning with
986 HEAD with REG. Returns true on success and false if the replacement is
987 rejected because the insns would not validate. The latter can happen
988 e.g. if a match_parallel predicate enforces restrictions on register
989 numbering in its subpatterns. */
991 bool
992 regrename_do_replace (class du_head *head, int reg)
994 struct du_chain *chain;
995 unsigned int base_regno = head->regno;
996 machine_mode mode;
997 rtx last_reg = NULL_RTX, last_repl = NULL_RTX;
999 for (chain = head->first; chain; chain = chain->next_use)
1001 unsigned int regno = ORIGINAL_REGNO (*chain->loc);
1002 class reg_attrs *attr = REG_ATTRS (*chain->loc);
1003 int reg_ptr = REG_POINTER (*chain->loc);
1005 if (DEBUG_INSN_P (chain->insn) && REGNO (*chain->loc) != base_regno)
1006 validate_change (chain->insn, &(INSN_VAR_LOCATION_LOC (chain->insn)),
1007 gen_rtx_UNKNOWN_VAR_LOC (), true);
1008 else
1010 if (*chain->loc != last_reg)
1012 last_repl = gen_raw_REG (GET_MODE (*chain->loc), reg);
1013 if (regno >= FIRST_PSEUDO_REGISTER)
1014 ORIGINAL_REGNO (last_repl) = regno;
1015 REG_ATTRS (last_repl) = attr;
1016 REG_POINTER (last_repl) = reg_ptr;
1017 last_reg = *chain->loc;
1019 validate_change (chain->insn, chain->loc, last_repl, true);
1023 if (!apply_change_group ())
1024 return false;
1026 mode = GET_MODE (*head->first->loc);
1027 head->renamed = 1;
1028 head->regno = reg;
1029 head->nregs = hard_regno_nregs (reg, mode);
1030 return true;
1034 /* True if we found a register with a size mismatch, which means that we
1035 can't track its lifetime accurately. If so, we abort the current block
1036 without renaming. */
1037 static bool fail_current_block;
1039 /* Return true if OP is a reg for which all bits are set in PSET, false
1040 if all bits are clear.
1041 In other cases, set fail_current_block and return false. */
1043 static bool
1044 verify_reg_in_set (rtx op, HARD_REG_SET *pset)
1046 unsigned regno, nregs;
1047 bool all_live, all_dead;
1048 if (!REG_P (op))
1049 return false;
1051 regno = REGNO (op);
1052 nregs = REG_NREGS (op);
1053 all_live = all_dead = true;
1054 while (nregs-- > 0)
1055 if (TEST_HARD_REG_BIT (*pset, regno + nregs))
1056 all_dead = false;
1057 else
1058 all_live = false;
1059 if (!all_dead && !all_live)
1061 fail_current_block = true;
1062 return false;
1064 return all_live;
1067 /* Return true if OP is a reg that is being tracked already in some form.
1068 May set fail_current_block if it sees an unhandled case of overlap. */
1070 static bool
1071 verify_reg_tracked (rtx op)
1073 return (verify_reg_in_set (op, &live_hard_regs)
1074 || verify_reg_in_set (op, &live_in_chains));
1077 /* Called through note_stores. DATA points to a rtx_code, either SET or
1078 CLOBBER, which tells us which kind of rtx to look at. If we have a
1079 match, record the set register in live_hard_regs and in the hard_conflicts
1080 bitmap of open chains. */
1082 static void
1083 note_sets_clobbers (rtx x, const_rtx set, void *data)
1085 enum rtx_code code = *(enum rtx_code *)data;
1086 class du_head *chain;
1088 if (GET_CODE (x) == SUBREG)
1089 x = SUBREG_REG (x);
1090 if (!REG_P (x) || GET_CODE (set) != code)
1091 return;
1092 /* There must not be pseudos at this point. */
1093 gcc_assert (HARD_REGISTER_P (x));
1094 add_to_hard_reg_set (&live_hard_regs, GET_MODE (x), REGNO (x));
1095 for (chain = open_chains; chain; chain = chain->next_chain)
1096 add_to_hard_reg_set (&chain->hard_conflicts, GET_MODE (x), REGNO (x));
1099 static void
1100 scan_rtx_reg (rtx_insn *insn, rtx *loc, enum reg_class cl, enum scan_actions action,
1101 enum op_type type)
1103 class du_head **p;
1104 rtx x = *loc;
1105 unsigned this_regno = REGNO (x);
1106 int this_nregs = REG_NREGS (x);
1108 if (action == mark_write)
1110 if (type == OP_OUT)
1112 du_head_p c;
1113 rtx pat = PATTERN (insn);
1115 c = create_new_chain (this_regno, this_nregs, loc, insn, cl);
1117 /* We try to tie chains in a move instruction for
1118 a single output. */
1119 if (recog_data.n_operands == 2
1120 && GET_CODE (pat) == SET
1121 && GET_CODE (SET_DEST (pat)) == REG
1122 && GET_CODE (SET_SRC (pat)) == REG
1123 && terminated_this_insn
1124 && terminated_this_insn->nregs
1125 == REG_NREGS (recog_data.operand[1]))
1127 gcc_assert (terminated_this_insn->regno
1128 == REGNO (recog_data.operand[1]));
1130 c->tied_chain = terminated_this_insn;
1131 terminated_this_insn->tied_chain = c;
1133 if (dump_file)
1134 fprintf (dump_file, "Tying chain %s (%d) with %s (%d)\n",
1135 reg_names[c->regno], c->id,
1136 reg_names[terminated_this_insn->regno],
1137 terminated_this_insn->id);
1141 return;
1144 if ((type == OP_OUT) != (action == terminate_write || action == mark_access))
1145 return;
1147 for (p = &open_chains; *p;)
1149 class du_head *head = *p;
1150 class du_head *next = head->next_chain;
1151 int exact_match = (head->regno == this_regno
1152 && head->nregs == this_nregs);
1153 int superset = (this_regno <= head->regno
1154 && this_regno + this_nregs >= head->regno + head->nregs);
1155 int subset = (this_regno >= head->regno
1156 && this_regno + this_nregs <= head->regno + head->nregs);
1158 if (!bitmap_bit_p (&open_chains_set, head->id)
1159 || head->regno + head->nregs <= this_regno
1160 || this_regno + this_nregs <= head->regno)
1162 p = &head->next_chain;
1163 continue;
1166 if (action == mark_read || action == mark_access)
1168 /* ??? Class NO_REGS can happen if the md file makes use of
1169 EXTRA_CONSTRAINTS to match registers. Which is arguably
1170 wrong, but there we are. */
1172 if (cl == NO_REGS || (!exact_match && !DEBUG_INSN_P (insn)))
1174 if (dump_file)
1175 fprintf (dump_file,
1176 "Cannot rename chain %s (%d) at insn %d (%s)\n",
1177 reg_names[head->regno], head->id, INSN_UID (insn),
1178 scan_actions_name[(int) action]);
1179 head->cannot_rename = 1;
1180 if (superset)
1182 unsigned nregs = this_nregs;
1183 head->regno = this_regno;
1184 head->nregs = this_nregs;
1185 while (nregs-- > 0)
1186 SET_HARD_REG_BIT (live_in_chains, head->regno + nregs);
1187 if (dump_file)
1188 fprintf (dump_file,
1189 "Widening register in chain %s (%d) at insn %d\n",
1190 reg_names[head->regno], head->id, INSN_UID (insn));
1192 else if (!subset)
1194 fail_current_block = true;
1195 if (dump_file)
1196 fprintf (dump_file,
1197 "Failing basic block due to unhandled overlap\n");
1200 else
1202 struct du_chain *this_du;
1203 this_du = XOBNEW (&rename_obstack, struct du_chain);
1204 this_du->next_use = 0;
1205 this_du->loc = loc;
1206 this_du->insn = insn;
1207 this_du->cl = cl;
1208 if (head->first == NULL)
1209 head->first = this_du;
1210 else
1211 head->last->next_use = this_du;
1212 record_operand_use (head, this_du);
1213 head->last = this_du;
1215 /* Avoid adding the same location in a DEBUG_INSN multiple times,
1216 which could happen with non-exact overlap. */
1217 if (DEBUG_INSN_P (insn))
1218 return;
1219 /* Otherwise, find any other chains that do not match exactly;
1220 ensure they all get marked unrenamable. */
1221 p = &head->next_chain;
1222 continue;
1225 /* Whether the terminated chain can be used for renaming
1226 depends on the action and this being an exact match.
1227 In either case, we remove this element from open_chains. */
1229 if ((action == terminate_dead || action == terminate_write)
1230 && (superset || subset))
1232 unsigned nregs;
1234 if (subset && !superset)
1235 head->cannot_rename = 1;
1236 bitmap_clear_bit (&open_chains_set, head->id);
1238 nregs = head->nregs;
1239 while (nregs-- > 0)
1241 CLEAR_HARD_REG_BIT (live_in_chains, head->regno + nregs);
1242 if (subset && !superset
1243 && (head->regno + nregs < this_regno
1244 || head->regno + nregs >= this_regno + this_nregs))
1245 SET_HARD_REG_BIT (live_hard_regs, head->regno + nregs);
1248 if (action == terminate_dead)
1249 terminated_this_insn = *p;
1250 *p = next;
1251 if (dump_file)
1252 fprintf (dump_file,
1253 "Closing chain %s (%d) at insn %d (%s%s)\n",
1254 reg_names[head->regno], head->id, INSN_UID (insn),
1255 scan_actions_name[(int) action],
1256 superset ? ", superset" : subset ? ", subset" : "");
1258 else if (action == terminate_dead || action == terminate_write)
1260 /* In this case, tracking liveness gets too hard. Fail the
1261 entire basic block. */
1262 if (dump_file)
1263 fprintf (dump_file,
1264 "Failing basic block due to unhandled overlap\n");
1265 fail_current_block = true;
1266 return;
1268 else
1270 head->cannot_rename = 1;
1271 if (dump_file)
1272 fprintf (dump_file,
1273 "Cannot rename chain %s (%d) at insn %d (%s)\n",
1274 reg_names[head->regno], head->id, INSN_UID (insn),
1275 scan_actions_name[(int) action]);
1276 p = &head->next_chain;
1281 /* A wrapper around base_reg_class which returns ALL_REGS if INSN is a
1282 DEBUG_INSN. The arguments MODE, AS, CODE and INDEX_CODE are as for
1283 base_reg_class. */
1285 static reg_class
1286 base_reg_class_for_rename (rtx_insn *insn, machine_mode mode, addr_space_t as,
1287 rtx_code code, rtx_code index_code)
1289 if (DEBUG_INSN_P (insn))
1290 return ALL_REGS;
1291 return base_reg_class (mode, as, code, index_code);
1294 /* Adapted from find_reloads_address_1. CL is INDEX_REG_CLASS or
1295 BASE_REG_CLASS depending on how the register is being considered. */
1297 static void
1298 scan_rtx_address (rtx_insn *insn, rtx *loc, enum reg_class cl,
1299 enum scan_actions action, machine_mode mode,
1300 addr_space_t as)
1302 rtx x = *loc;
1303 RTX_CODE code = GET_CODE (x);
1304 const char *fmt;
1305 int i, j;
1307 if (action == mark_write || action == mark_access)
1308 return;
1310 switch (code)
1312 case PLUS:
1314 rtx orig_op0 = XEXP (x, 0);
1315 rtx orig_op1 = XEXP (x, 1);
1316 RTX_CODE code0 = GET_CODE (orig_op0);
1317 RTX_CODE code1 = GET_CODE (orig_op1);
1318 rtx op0 = orig_op0;
1319 rtx op1 = orig_op1;
1320 rtx *locI = NULL;
1321 rtx *locB = NULL;
1322 enum rtx_code index_code = SCRATCH;
1324 if (GET_CODE (op0) == SUBREG)
1326 op0 = SUBREG_REG (op0);
1327 code0 = GET_CODE (op0);
1330 if (GET_CODE (op1) == SUBREG)
1332 op1 = SUBREG_REG (op1);
1333 code1 = GET_CODE (op1);
1336 if (code0 == MULT || code0 == SIGN_EXTEND || code0 == TRUNCATE
1337 || code0 == ZERO_EXTEND || code1 == MEM)
1339 locI = &XEXP (x, 0);
1340 locB = &XEXP (x, 1);
1341 index_code = GET_CODE (*locI);
1343 else if (code1 == MULT || code1 == SIGN_EXTEND || code1 == TRUNCATE
1344 || code1 == ZERO_EXTEND || code0 == MEM)
1346 locI = &XEXP (x, 1);
1347 locB = &XEXP (x, 0);
1348 index_code = GET_CODE (*locI);
1350 else if (code0 == CONST_INT || code0 == CONST
1351 || code0 == SYMBOL_REF || code0 == LABEL_REF)
1353 locB = &XEXP (x, 1);
1354 index_code = GET_CODE (XEXP (x, 0));
1356 else if (code1 == CONST_INT || code1 == CONST
1357 || code1 == SYMBOL_REF || code1 == LABEL_REF)
1359 locB = &XEXP (x, 0);
1360 index_code = GET_CODE (XEXP (x, 1));
1362 else if (code0 == REG && code1 == REG)
1364 int index_op;
1365 unsigned regno0 = REGNO (op0), regno1 = REGNO (op1);
1367 if (REGNO_OK_FOR_INDEX_P (regno1)
1368 && regno_ok_for_base_p (regno0, mode, as, PLUS, REG))
1369 index_op = 1;
1370 else if (REGNO_OK_FOR_INDEX_P (regno0)
1371 && regno_ok_for_base_p (regno1, mode, as, PLUS, REG))
1372 index_op = 0;
1373 else if (regno_ok_for_base_p (regno0, mode, as, PLUS, REG)
1374 || REGNO_OK_FOR_INDEX_P (regno1))
1375 index_op = 1;
1376 else if (regno_ok_for_base_p (regno1, mode, as, PLUS, REG))
1377 index_op = 0;
1378 else
1379 index_op = 1;
1381 locI = &XEXP (x, index_op);
1382 locB = &XEXP (x, !index_op);
1383 index_code = GET_CODE (*locI);
1385 else if (code0 == REG)
1387 locI = &XEXP (x, 0);
1388 locB = &XEXP (x, 1);
1389 index_code = GET_CODE (*locI);
1391 else if (code1 == REG)
1393 locI = &XEXP (x, 1);
1394 locB = &XEXP (x, 0);
1395 index_code = GET_CODE (*locI);
1398 if (locI)
1400 reg_class iclass = DEBUG_INSN_P (insn) ? ALL_REGS : INDEX_REG_CLASS;
1401 scan_rtx_address (insn, locI, iclass, action, mode, as);
1403 if (locB)
1405 reg_class bclass = base_reg_class_for_rename (insn, mode, as, PLUS,
1406 index_code);
1407 scan_rtx_address (insn, locB, bclass, action, mode, as);
1409 return;
1412 case POST_INC:
1413 case POST_DEC:
1414 case POST_MODIFY:
1415 case PRE_INC:
1416 case PRE_DEC:
1417 case PRE_MODIFY:
1418 /* If the target doesn't claim to handle autoinc, this must be
1419 something special, like a stack push. Kill this chain. */
1420 if (!AUTO_INC_DEC)
1421 action = mark_all_read;
1423 break;
1425 case MEM:
1427 reg_class bclass = base_reg_class_for_rename (insn, GET_MODE (x),
1428 MEM_ADDR_SPACE (x),
1429 MEM, SCRATCH);
1430 scan_rtx_address (insn, &XEXP (x, 0), bclass, action, GET_MODE (x),
1431 MEM_ADDR_SPACE (x));
1433 return;
1435 case REG:
1436 scan_rtx_reg (insn, loc, cl, action, OP_IN);
1437 return;
1439 default:
1440 break;
1443 fmt = GET_RTX_FORMAT (code);
1444 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1446 if (fmt[i] == 'e')
1447 scan_rtx_address (insn, &XEXP (x, i), cl, action, mode, as);
1448 else if (fmt[i] == 'E')
1449 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
1450 scan_rtx_address (insn, &XVECEXP (x, i, j), cl, action, mode, as);
1454 static void
1455 scan_rtx (rtx_insn *insn, rtx *loc, enum reg_class cl, enum scan_actions action,
1456 enum op_type type)
1458 const char *fmt;
1459 rtx x = *loc;
1460 int i, j;
1462 enum rtx_code code = GET_CODE (x);
1463 switch (code)
1465 case CONST:
1466 CASE_CONST_ANY:
1467 case SYMBOL_REF:
1468 case LABEL_REF:
1469 case PC:
1470 return;
1472 case REG:
1473 scan_rtx_reg (insn, loc, cl, action, type);
1474 return;
1476 case MEM:
1478 reg_class bclass = base_reg_class_for_rename (insn, GET_MODE (x),
1479 MEM_ADDR_SPACE (x),
1480 MEM, SCRATCH);
1482 scan_rtx_address (insn, &XEXP (x, 0), bclass, action, GET_MODE (x),
1483 MEM_ADDR_SPACE (x));
1485 return;
1487 case SET:
1488 scan_rtx (insn, &SET_SRC (x), cl, action, OP_IN);
1489 scan_rtx (insn, &SET_DEST (x), cl, action,
1490 (GET_CODE (PATTERN (insn)) == COND_EXEC
1491 && verify_reg_tracked (SET_DEST (x))) ? OP_INOUT : OP_OUT);
1492 return;
1494 case STRICT_LOW_PART:
1495 scan_rtx (insn, &XEXP (x, 0), cl, action,
1496 verify_reg_tracked (XEXP (x, 0)) ? OP_INOUT : OP_OUT);
1497 return;
1499 case ZERO_EXTRACT:
1500 case SIGN_EXTRACT:
1501 scan_rtx (insn, &XEXP (x, 0), cl, action,
1502 (type == OP_IN ? OP_IN :
1503 verify_reg_tracked (XEXP (x, 0)) ? OP_INOUT : OP_OUT));
1504 scan_rtx (insn, &XEXP (x, 1), cl, action, OP_IN);
1505 scan_rtx (insn, &XEXP (x, 2), cl, action, OP_IN);
1506 return;
1508 case POST_INC:
1509 case PRE_INC:
1510 case POST_DEC:
1511 case PRE_DEC:
1512 case POST_MODIFY:
1513 case PRE_MODIFY:
1514 /* Should only happen inside MEM. */
1515 gcc_unreachable ();
1517 case CLOBBER:
1518 scan_rtx (insn, &SET_DEST (x), cl, action,
1519 (GET_CODE (PATTERN (insn)) == COND_EXEC
1520 && verify_reg_tracked (SET_DEST (x))) ? OP_INOUT : OP_OUT);
1521 return;
1523 case EXPR_LIST:
1524 scan_rtx (insn, &XEXP (x, 0), cl, action, type);
1525 if (XEXP (x, 1))
1526 scan_rtx (insn, &XEXP (x, 1), cl, action, type);
1527 return;
1529 default:
1530 break;
1533 fmt = GET_RTX_FORMAT (code);
1534 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1536 if (fmt[i] == 'e')
1537 scan_rtx (insn, &XEXP (x, i), cl, action, type);
1538 else if (fmt[i] == 'E')
1539 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
1540 scan_rtx (insn, &XVECEXP (x, i, j), cl, action, type);
1544 /* Hide operands of the current insn (of which there are N_OPS) by
1545 substituting pc for them.
1546 Previous values are stored in the OLD_OPERANDS and OLD_DUPS.
1547 For every bit set in DO_NOT_HIDE, we leave the operand alone.
1548 If INOUT_AND_EC_ONLY is set, we only do this for OP_INOUT type operands
1549 and earlyclobbers. */
1551 static void
1552 hide_operands (int n_ops, rtx *old_operands, rtx *old_dups,
1553 unsigned HOST_WIDE_INT do_not_hide, bool inout_and_ec_only)
1555 int i;
1556 const operand_alternative *op_alt = which_op_alt ();
1557 for (i = 0; i < n_ops; i++)
1559 old_operands[i] = recog_data.operand[i];
1560 /* Don't squash match_operator or match_parallel here, since
1561 we don't know that all of the contained registers are
1562 reachable by proper operands. */
1563 if (recog_data.constraints[i][0] == '\0')
1564 continue;
1565 if (do_not_hide & (1 << i))
1566 continue;
1567 if (!inout_and_ec_only || recog_data.operand_type[i] == OP_INOUT
1568 || op_alt[i].earlyclobber)
1569 *recog_data.operand_loc[i] = pc_rtx;
1571 for (i = 0; i < recog_data.n_dups; i++)
1573 int opn = recog_data.dup_num[i];
1574 old_dups[i] = *recog_data.dup_loc[i];
1575 if (do_not_hide & (1 << opn))
1576 continue;
1577 if (!inout_and_ec_only || recog_data.operand_type[opn] == OP_INOUT
1578 || op_alt[opn].earlyclobber)
1579 *recog_data.dup_loc[i] = pc_rtx;
1583 /* Undo the substitution performed by hide_operands. INSN is the insn we
1584 are processing; the arguments are the same as in hide_operands. */
1586 static void
1587 restore_operands (rtx_insn *insn, int n_ops, rtx *old_operands, rtx *old_dups)
1589 int i;
1590 for (i = 0; i < recog_data.n_dups; i++)
1591 *recog_data.dup_loc[i] = old_dups[i];
1592 for (i = 0; i < n_ops; i++)
1593 *recog_data.operand_loc[i] = old_operands[i];
1594 if (recog_data.n_dups)
1595 df_insn_rescan (insn);
1598 /* For each output operand of INSN, call scan_rtx to create a new
1599 open chain. Do this only for normal or earlyclobber outputs,
1600 depending on EARLYCLOBBER. If INSN_INFO is nonnull, use it to
1601 record information about the operands in the insn. */
1603 static void
1604 record_out_operands (rtx_insn *insn, bool earlyclobber, insn_rr_info *insn_info)
1606 int n_ops = recog_data.n_operands;
1607 const operand_alternative *op_alt = which_op_alt ();
1609 int i;
1611 for (i = 0; i < n_ops + recog_data.n_dups; i++)
1613 int opn = i < n_ops ? i : recog_data.dup_num[i - n_ops];
1614 rtx *loc = (i < n_ops
1615 ? recog_data.operand_loc[opn]
1616 : recog_data.dup_loc[i - n_ops]);
1617 rtx op = *loc;
1618 enum reg_class cl = alternative_class (op_alt, opn);
1620 class du_head *prev_open;
1622 if (recog_data.operand_type[opn] != OP_OUT
1623 || op_alt[opn].earlyclobber != earlyclobber)
1624 continue;
1626 if (insn_info)
1627 cur_operand = insn_info->op_info + i;
1629 prev_open = open_chains;
1630 if (earlyclobber)
1631 scan_rtx (insn, loc, cl, terminate_write, OP_OUT);
1632 scan_rtx (insn, loc, cl, mark_write, OP_OUT);
1634 /* ??? Many targets have output constraints on the SET_DEST
1635 of a call insn, which is stupid, since these are certainly
1636 ABI defined hard registers. For these, and for asm operands
1637 that originally referenced hard registers, we must record that
1638 the chain cannot be renamed. */
1639 if (CALL_P (insn)
1640 || (asm_noperands (PATTERN (insn)) > 0
1641 && REG_P (op)
1642 && REGNO (op) == ORIGINAL_REGNO (op)))
1644 if (prev_open != open_chains)
1645 open_chains->cannot_rename = 1;
1648 cur_operand = NULL;
1651 /* Build def/use chain. */
1653 static bool
1654 build_def_use (basic_block bb)
1656 rtx_insn *insn;
1657 unsigned HOST_WIDE_INT untracked_operands;
1659 fail_current_block = false;
1661 for (insn = BB_HEAD (bb); ; insn = NEXT_INSN (insn))
1663 if (NONDEBUG_INSN_P (insn))
1665 int n_ops;
1666 rtx note;
1667 rtx old_operands[MAX_RECOG_OPERANDS];
1668 rtx old_dups[MAX_DUP_OPERANDS];
1669 int i;
1670 int predicated;
1671 enum rtx_code set_code = SET;
1672 enum rtx_code clobber_code = CLOBBER;
1673 insn_rr_info *insn_info = NULL;
1674 terminated_this_insn = NULL;
1676 /* Process the insn, determining its effect on the def-use
1677 chains and live hard registers. We perform the following
1678 steps with the register references in the insn, simulating
1679 its effect:
1680 (1) Deal with earlyclobber operands and CLOBBERs of non-operands
1681 by creating chains and marking hard regs live.
1682 (2) Any read outside an operand causes any chain it overlaps
1683 with to be marked unrenamable.
1684 (3) Any read inside an operand is added if there's already
1685 an open chain for it.
1686 (4) For any REG_DEAD note we find, close open chains that
1687 overlap it.
1688 (5) For any non-earlyclobber write we find, close open chains
1689 that overlap it.
1690 (6) For any non-earlyclobber write we find in an operand, make
1691 a new chain or mark the hard register as live.
1692 (7) For any REG_UNUSED, close any chains we just opened.
1693 (8) For any REG_CFA_RESTORE or REG_CFA_REGISTER, kill any chain
1694 containing its dest.
1696 We cannot deal with situations where we track a reg in one mode
1697 and see a reference in another mode; these will cause the chain
1698 to be marked unrenamable or even cause us to abort the entire
1699 basic block. */
1701 extract_constrain_insn (insn);
1702 preprocess_constraints (insn);
1703 const operand_alternative *op_alt = which_op_alt ();
1704 n_ops = recog_data.n_operands;
1705 untracked_operands = 0;
1707 if (insn_rr.exists ())
1709 insn_info = &insn_rr[INSN_UID (insn)];
1710 insn_info->op_info = XOBNEWVEC (&rename_obstack, operand_rr_info,
1711 recog_data.n_operands);
1712 memset (insn_info->op_info, 0,
1713 sizeof (operand_rr_info) * recog_data.n_operands);
1716 /* Simplify the code below by promoting OP_OUT to OP_INOUT in
1717 predicated instructions, but only for register operands
1718 that are already tracked, so that we can create a chain
1719 when the first SET makes a register live. */
1721 predicated = GET_CODE (PATTERN (insn)) == COND_EXEC;
1722 for (i = 0; i < n_ops; ++i)
1724 rtx op = recog_data.operand[i];
1725 int matches = op_alt[i].matches;
1726 if (matches >= 0 || op_alt[i].matched >= 0
1727 || (predicated && recog_data.operand_type[i] == OP_OUT))
1729 recog_data.operand_type[i] = OP_INOUT;
1730 /* A special case to deal with instruction patterns that
1731 have matching operands with different modes. If we're
1732 not already tracking such a reg, we won't start here,
1733 and we must instead make sure to make the operand visible
1734 to the machinery that tracks hard registers. */
1735 machine_mode i_mode = recog_data.operand_mode[i];
1736 if (matches >= 0)
1738 machine_mode matches_mode
1739 = recog_data.operand_mode[matches];
1741 if (maybe_ne (GET_MODE_SIZE (i_mode),
1742 GET_MODE_SIZE (matches_mode))
1743 && !verify_reg_in_set (op, &live_in_chains))
1745 untracked_operands |= 1 << i;
1746 untracked_operands |= 1 << matches;
1750 #ifdef STACK_REGS
1751 if (regstack_completed
1752 && REG_P (op)
1753 && IN_RANGE (REGNO (op), FIRST_STACK_REG, LAST_STACK_REG))
1754 untracked_operands |= 1 << i;
1755 #endif
1756 /* If there's an in-out operand with a register that is not
1757 being tracked at all yet, open a chain. */
1758 if (recog_data.operand_type[i] == OP_INOUT
1759 && !(untracked_operands & (1 << i))
1760 && REG_P (op)
1761 && !verify_reg_tracked (op))
1762 create_new_chain (REGNO (op), REG_NREGS (op), NULL, NULL,
1763 NO_REGS);
1766 if (fail_current_block)
1767 break;
1769 /* Step 1a: Mark hard registers that are clobbered in this insn,
1770 outside an operand, as live. */
1771 hide_operands (n_ops, old_operands, old_dups, untracked_operands,
1772 false);
1773 note_stores (insn, note_sets_clobbers, &clobber_code);
1774 restore_operands (insn, n_ops, old_operands, old_dups);
1776 /* Step 1b: Begin new chains for earlyclobbered writes inside
1777 operands. */
1778 record_out_operands (insn, true, insn_info);
1780 /* Step 2: Mark chains for which we have reads outside operands
1781 as unrenamable.
1782 We do this by munging all operands into PC, and closing
1783 everything remaining. */
1785 hide_operands (n_ops, old_operands, old_dups, untracked_operands,
1786 false);
1787 scan_rtx (insn, &PATTERN (insn), NO_REGS, mark_all_read, OP_IN);
1788 restore_operands (insn, n_ops, old_operands, old_dups);
1790 /* Step 2B: Can't rename function call argument registers. */
1791 if (CALL_P (insn) && CALL_INSN_FUNCTION_USAGE (insn))
1792 scan_rtx (insn, &CALL_INSN_FUNCTION_USAGE (insn),
1793 NO_REGS, mark_all_read, OP_IN);
1795 /* Step 2C: Can't rename asm operands that were originally
1796 hard registers. */
1797 if (asm_noperands (PATTERN (insn)) > 0)
1798 for (i = 0; i < n_ops; i++)
1800 rtx *loc = recog_data.operand_loc[i];
1801 rtx op = *loc;
1803 if (REG_P (op)
1804 && REGNO (op) == ORIGINAL_REGNO (op)
1805 && (recog_data.operand_type[i] == OP_IN
1806 || recog_data.operand_type[i] == OP_INOUT))
1807 scan_rtx (insn, loc, NO_REGS, mark_all_read, OP_IN);
1810 /* Step 3: Append to chains for reads inside operands. */
1811 for (i = 0; i < n_ops + recog_data.n_dups; i++)
1813 int opn = i < n_ops ? i : recog_data.dup_num[i - n_ops];
1814 rtx *loc = (i < n_ops
1815 ? recog_data.operand_loc[opn]
1816 : recog_data.dup_loc[i - n_ops]);
1817 enum reg_class cl = alternative_class (op_alt, opn);
1818 enum op_type type = recog_data.operand_type[opn];
1820 /* Don't scan match_operand here, since we've no reg class
1821 information to pass down. Any operands that we could
1822 substitute in will be represented elsewhere. */
1823 if (recog_data.constraints[opn][0] == '\0'
1824 || untracked_operands & (1 << opn))
1825 continue;
1827 if (insn_info)
1828 cur_operand = i == opn ? insn_info->op_info + i : NULL;
1829 if (op_alt[opn].is_address)
1830 scan_rtx_address (insn, loc, cl, mark_read,
1831 VOIDmode, ADDR_SPACE_GENERIC);
1832 else
1833 scan_rtx (insn, loc, cl, mark_read, type);
1835 cur_operand = NULL;
1837 /* Step 3B: Record updates for regs in REG_INC notes, and
1838 source regs in REG_FRAME_RELATED_EXPR notes. */
1839 for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
1840 if (REG_NOTE_KIND (note) == REG_INC
1841 || REG_NOTE_KIND (note) == REG_FRAME_RELATED_EXPR)
1842 scan_rtx (insn, &XEXP (note, 0), ALL_REGS, mark_read,
1843 OP_INOUT);
1845 /* Step 4: Close chains for registers that die here, unless
1846 the register is mentioned in a REG_UNUSED note. In that
1847 case we keep the chain open until step #7 below to ensure
1848 it conflicts with other output operands of this insn.
1849 See PR 52573. Arguably the insn should not have both
1850 notes; it has proven difficult to fix that without
1851 other undesirable side effects. */
1852 for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
1853 if (REG_NOTE_KIND (note) == REG_DEAD
1854 && !find_regno_note (insn, REG_UNUSED, REGNO (XEXP (note, 0))))
1856 remove_from_hard_reg_set (&live_hard_regs,
1857 GET_MODE (XEXP (note, 0)),
1858 REGNO (XEXP (note, 0)));
1859 scan_rtx (insn, &XEXP (note, 0), NO_REGS, terminate_dead,
1860 OP_IN);
1863 /* Step 4B: If this is a call, any chain live at this point
1864 requires a caller-saved reg. */
1865 if (CALL_P (insn))
1867 function_abi callee_abi = insn_callee_abi (insn);
1868 class du_head *p;
1869 for (p = open_chains; p; p = p->next_chain)
1871 p->call_abis |= (1 << callee_abi.id ());
1872 p->call_clobber_mask
1873 |= callee_abi.full_and_partial_reg_clobbers ();
1874 p->hard_conflicts |= callee_abi.full_reg_clobbers ();
1878 /* Step 5: Close open chains that overlap writes. Similar to
1879 step 2, we hide in-out operands, since we do not want to
1880 close these chains. We also hide earlyclobber operands,
1881 since we've opened chains for them in step 1, and earlier
1882 chains they would overlap with must have been closed at
1883 the previous insn at the latest, as such operands cannot
1884 possibly overlap with any input operands. */
1886 hide_operands (n_ops, old_operands, old_dups, untracked_operands,
1887 true);
1888 scan_rtx (insn, &PATTERN (insn), NO_REGS, terminate_write, OP_IN);
1889 restore_operands (insn, n_ops, old_operands, old_dups);
1891 /* Step 6a: Mark hard registers that are set in this insn,
1892 outside an operand, as live. */
1893 hide_operands (n_ops, old_operands, old_dups, untracked_operands,
1894 false);
1895 note_stores (insn, note_sets_clobbers, &set_code);
1896 restore_operands (insn, n_ops, old_operands, old_dups);
1898 /* Step 6b: Begin new chains for writes inside operands. */
1899 record_out_operands (insn, false, insn_info);
1901 /* Step 6c: Record destination regs in REG_FRAME_RELATED_EXPR
1902 notes for update. */
1903 for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
1904 if (REG_NOTE_KIND (note) == REG_FRAME_RELATED_EXPR)
1905 scan_rtx (insn, &XEXP (note, 0), ALL_REGS, mark_access,
1906 OP_INOUT);
1908 /* Step 7: Close chains for registers that were never
1909 really used here. */
1910 for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
1911 if (REG_NOTE_KIND (note) == REG_UNUSED)
1913 remove_from_hard_reg_set (&live_hard_regs,
1914 GET_MODE (XEXP (note, 0)),
1915 REGNO (XEXP (note, 0)));
1916 scan_rtx (insn, &XEXP (note, 0), NO_REGS, terminate_dead,
1917 OP_IN);
1920 /* Step 8: Kill the chains involving register restores. Those
1921 should restore _that_ register. Similar for REG_CFA_REGISTER. */
1922 for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
1923 if (REG_NOTE_KIND (note) == REG_CFA_RESTORE
1924 || REG_NOTE_KIND (note) == REG_CFA_REGISTER)
1926 rtx *x = &XEXP (note, 0);
1927 if (!*x)
1928 x = &PATTERN (insn);
1929 if (GET_CODE (*x) == PARALLEL)
1930 x = &XVECEXP (*x, 0, 0);
1931 if (GET_CODE (*x) == SET)
1932 x = &SET_DEST (*x);
1933 scan_rtx (insn, x, NO_REGS, mark_all_read, OP_IN);
1936 else if (DEBUG_BIND_INSN_P (insn)
1937 && !VAR_LOC_UNKNOWN_P (INSN_VAR_LOCATION_LOC (insn)))
1939 scan_rtx (insn, &INSN_VAR_LOCATION_LOC (insn),
1940 ALL_REGS, mark_read, OP_IN);
1942 if (insn == BB_END (bb))
1943 break;
1946 if (fail_current_block)
1947 return false;
1949 return true;
1952 /* Initialize the register renamer. If INSN_INFO is true, ensure that
1953 insn_rr is nonnull. */
1954 void
1955 regrename_init (bool insn_info)
1957 gcc_obstack_init (&rename_obstack);
1958 insn_rr.create (0);
1959 if (insn_info)
1960 insn_rr.safe_grow_cleared (get_max_uid (), true);
1963 /* Free all global data used by the register renamer. */
1964 void
1965 regrename_finish (void)
1967 insn_rr.release ();
1968 free_chain_data ();
1969 obstack_free (&rename_obstack, NULL);
1972 /* Perform register renaming on the current function. */
1974 static unsigned int
1975 regrename_optimize (void)
1977 df_set_flags (DF_LR_RUN_DCE);
1978 df_note_add_problem ();
1979 df_analyze ();
1980 df_set_flags (DF_DEFER_INSN_RESCAN);
1982 regrename_init (false);
1984 regrename_analyze (NULL, false);
1986 rename_chains ();
1988 regrename_finish ();
1990 return 0;
1993 namespace {
1995 const pass_data pass_data_regrename =
1997 RTL_PASS, /* type */
1998 "rnreg", /* name */
1999 OPTGROUP_NONE, /* optinfo_flags */
2000 TV_RENAME_REGISTERS, /* tv_id */
2001 0, /* properties_required */
2002 0, /* properties_provided */
2003 0, /* properties_destroyed */
2004 0, /* todo_flags_start */
2005 TODO_df_finish, /* todo_flags_finish */
2008 class pass_regrename : public rtl_opt_pass
2010 public:
2011 pass_regrename (gcc::context *ctxt)
2012 : rtl_opt_pass (pass_data_regrename, ctxt)
2015 /* opt_pass methods: */
2016 virtual bool gate (function *)
2018 return (optimize > 0 && (flag_rename_registers));
2021 virtual unsigned int execute (function *) { return regrename_optimize (); }
2023 }; // class pass_regrename
2025 } // anon namespace
2027 rtl_opt_pass *
2028 make_pass_regrename (gcc::context *ctxt)
2030 return new pass_regrename (ctxt);