x86: Add a test for PR rtl-optimization/111673
[official-gcc.git] / gcc / regrename.cc
blob7de88812e4cb0b9322b720197125c0921705b1df
1 /* Register renaming for the GNU compiler.
2 Copyright (C) 2000-2025 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 int nregs = 1;
328 int i;
329 struct du_chain *tmp;
331 /* See whether new_reg accepts all modes that occur in
332 definition and uses and record the number of regs it would take. */
333 for (tmp = this_head->first; tmp; tmp = tmp->next_use)
335 int n;
336 /* Completely ignore DEBUG_INSNs, otherwise we can get
337 -fcompare-debug failures. */
338 if (DEBUG_INSN_P (tmp->insn))
339 continue;
341 if (!targetm.hard_regno_mode_ok (new_reg, GET_MODE (*tmp->loc)))
342 return false;
343 n = hard_regno_nregs (new_reg, GET_MODE (*tmp->loc));
344 if (n > nregs)
345 nregs = n;
348 for (i = nregs - 1; i >= 0; --i)
349 if (TEST_HARD_REG_BIT (this_unavailable, new_reg + i)
350 || fixed_regs[new_reg + i]
351 || global_regs[new_reg + i]
352 /* Can't use regs which aren't saved by the prologue. */
353 || (! df_regs_ever_live_p (new_reg + i)
354 && ! crtl->abi->clobbers_full_reg_p (new_reg + i))
355 #ifdef LEAF_REGISTERS
356 /* We can't use a non-leaf register if we're in a
357 leaf function. */
358 || (crtl->is_leaf
359 && !LEAF_REGISTERS[new_reg + i])
360 #endif
361 || ! HARD_REGNO_RENAME_OK (reg + i, new_reg + i))
362 return false;
364 /* See whether it accepts all modes that occur in
365 definition and uses. */
366 for (tmp = this_head->first; tmp; tmp = tmp->next_use)
368 if (DEBUG_INSN_P (tmp->insn))
369 continue;
371 if (call_clobbered_in_chain_p (this_head, GET_MODE (*tmp->loc), new_reg))
372 return false;
375 return true;
378 /* For the chain THIS_HEAD, compute and return the best register to
379 rename to. SUPER_CLASS is the superunion of register classes in
380 the chain. UNAVAILABLE is a set of registers that cannot be used.
381 OLD_REG is the register currently used for the chain. BEST_RENAME
382 controls whether the register chosen must be better than the
383 current one or just respect the given constraint. */
386 find_rename_reg (du_head_p this_head, enum reg_class super_class,
387 HARD_REG_SET *unavailable, int old_reg, bool best_rename)
389 bool has_preferred_class;
390 enum reg_class preferred_class;
391 int pass;
392 int best_new_reg = old_reg;
394 /* Mark registers that overlap this chain's lifetime as unavailable. */
395 merge_overlapping_regs (unavailable, this_head);
397 /* Compute preferred rename class of super union of all the classes
398 in the chain. */
399 preferred_class
400 = (enum reg_class) targetm.preferred_rename_class (super_class);
402 /* Pick and check the register from the tied chain iff the tied chain
403 is not renamed. */
404 if (this_head->tied_chain && !this_head->tied_chain->renamed
405 && check_new_reg_p (old_reg, this_head->tied_chain->regno,
406 this_head, *unavailable))
407 return this_head->tied_chain->regno;
409 /* If the first non-debug insn is a noop move, then do not rename in this
410 chain as doing so would inhibit removal of the noop move. */
411 for (struct du_chain *tmp = this_head->first; tmp; tmp = tmp->next_use)
412 if (DEBUG_INSN_P (tmp->insn))
413 continue;
414 else if (noop_move_p (tmp->insn))
415 return best_new_reg;
416 else
417 break;
419 /* If PREFERRED_CLASS is not NO_REGS, we iterate in the first pass
420 over registers that belong to PREFERRED_CLASS and try to find the
421 best register within the class. If that failed, we iterate in
422 the second pass over registers that don't belong to the class.
423 If PREFERRED_CLASS is NO_REGS, we iterate over all registers in
424 ascending order without any preference. */
425 has_preferred_class = (preferred_class != NO_REGS);
426 for (pass = (has_preferred_class ? 0 : 1); pass < 2; pass++)
428 int new_reg;
429 for (new_reg = 0; new_reg < FIRST_PSEUDO_REGISTER; new_reg++)
431 if (has_preferred_class
432 && (pass == 0)
433 != TEST_HARD_REG_BIT (reg_class_contents[preferred_class],
434 new_reg))
435 continue;
437 if (!check_new_reg_p (old_reg, new_reg, this_head, *unavailable))
438 continue;
440 if (!best_rename)
441 return new_reg;
443 /* In the first pass, we force the renaming of registers that
444 don't belong to PREFERRED_CLASS to registers that do, even
445 though the latters were used not very long ago. */
446 if ((pass == 0
447 && !TEST_HARD_REG_BIT (reg_class_contents[preferred_class],
448 best_new_reg))
449 || tick[best_new_reg] > tick[new_reg])
450 best_new_reg = new_reg;
452 if (pass == 0 && best_new_reg != old_reg)
453 break;
455 return best_new_reg;
458 /* Iterate over elements in the chain HEAD in order to:
459 1. Count number of uses, storing it in *PN_USES.
460 2. Narrow the set of registers we can use for renaming, adding
461 unavailable registers to *PUNAVAILABLE, which must be
462 initialized by the caller.
463 3. Compute the superunion of register classes in this chain
464 and return it. */
465 reg_class
466 regrename_find_superclass (du_head_p head, int *pn_uses,
467 HARD_REG_SET *punavailable)
469 int n_uses = 0;
470 reg_class super_class = NO_REGS;
471 for (du_chain *tmp = head->first; tmp; tmp = tmp->next_use)
473 if (DEBUG_INSN_P (tmp->insn))
474 continue;
475 n_uses++;
476 *punavailable |= ~reg_class_contents[tmp->cl];
477 super_class
478 = reg_class_superunion[(int) super_class][(int) tmp->cl];
480 *pn_uses = n_uses;
481 return super_class;
484 /* Perform register renaming on the current function. */
485 static void
486 rename_chains (void)
488 HARD_REG_SET unavailable;
489 du_head_p this_head;
490 int i;
492 memset (tick, 0, sizeof tick);
494 CLEAR_HARD_REG_SET (unavailable);
495 /* Don't clobber traceback for noreturn functions. */
496 if (frame_pointer_needed)
498 add_to_hard_reg_set (&unavailable, Pmode, FRAME_POINTER_REGNUM);
499 if (!HARD_FRAME_POINTER_IS_FRAME_POINTER)
500 add_to_hard_reg_set (&unavailable, Pmode, HARD_FRAME_POINTER_REGNUM);
503 FOR_EACH_VEC_ELT (id_to_chain, i, this_head)
505 int best_new_reg;
506 int n_uses;
507 HARD_REG_SET this_unavailable;
508 int reg = this_head->regno;
510 if (this_head->cannot_rename)
511 continue;
513 if (fixed_regs[reg] || global_regs[reg]
514 || (!HARD_FRAME_POINTER_IS_FRAME_POINTER && frame_pointer_needed
515 && reg == HARD_FRAME_POINTER_REGNUM)
516 || (HARD_FRAME_POINTER_IS_FRAME_POINTER && frame_pointer_needed
517 && reg == FRAME_POINTER_REGNUM))
518 continue;
520 this_unavailable = unavailable;
522 reg_class super_class = regrename_find_superclass (this_head, &n_uses,
523 &this_unavailable);
524 if (n_uses < 2)
525 continue;
527 best_new_reg = find_rename_reg (this_head, super_class,
528 &this_unavailable, reg, true);
530 if (dump_file)
532 fprintf (dump_file, "Register %s in insn %d",
533 reg_names[reg], INSN_UID (this_head->first->insn));
534 if (this_head->call_abis)
535 fprintf (dump_file, " crosses a call");
538 if (best_new_reg == reg)
540 tick[reg] = ++this_tick;
541 if (dump_file)
542 fprintf (dump_file, "; no available better choice\n");
543 continue;
546 if (regrename_do_replace (this_head, best_new_reg))
548 if (dump_file)
549 fprintf (dump_file, ", renamed as %s\n", reg_names[best_new_reg]);
550 tick[best_new_reg] = ++this_tick;
551 df_set_regs_ever_live (best_new_reg, true);
553 else
555 if (dump_file)
556 fprintf (dump_file, ", renaming as %s failed\n",
557 reg_names[best_new_reg]);
558 tick[reg] = ++this_tick;
563 /* A structure to record information for each hard register at the start of
564 a basic block. */
565 struct incoming_reg_info {
566 /* Holds the number of registers used in the chain that gave us information
567 about this register. Zero means no information known yet, while a
568 negative value is used for something that is part of, but not the first
569 register in a multi-register value. */
570 int nregs;
571 /* Set to true if we have accesses that conflict in the number of registers
572 used. */
573 bool unusable;
576 /* A structure recording information about each basic block. It is saved
577 and restored around basic block boundaries.
578 A pointer to such a structure is stored in each basic block's aux field
579 during regrename_analyze, except for blocks we know can't be optimized
580 (such as entry and exit blocks). */
581 class bb_rename_info
583 public:
584 /* The basic block corresponding to this structure. */
585 basic_block bb;
586 /* Copies of the global information. */
587 bitmap_head open_chains_set;
588 bitmap_head incoming_open_chains_set;
589 struct incoming_reg_info incoming[FIRST_PSEUDO_REGISTER];
592 /* Initialize a rename_info structure P for basic block BB, which starts a new
593 scan. */
594 static void
595 init_rename_info (class bb_rename_info *p, basic_block bb)
597 int i;
598 df_ref def;
599 HARD_REG_SET start_chains_set;
601 p->bb = bb;
602 bitmap_initialize (&p->open_chains_set, &bitmap_default_obstack);
603 bitmap_initialize (&p->incoming_open_chains_set, &bitmap_default_obstack);
605 open_chains = NULL;
606 bitmap_clear (&open_chains_set);
608 CLEAR_HARD_REG_SET (live_in_chains);
609 REG_SET_TO_HARD_REG_SET (live_hard_regs, df_get_live_in (bb));
610 FOR_EACH_ARTIFICIAL_DEF (def, bb->index)
611 if (DF_REF_FLAGS (def) & DF_REF_AT_TOP)
612 SET_HARD_REG_BIT (live_hard_regs, DF_REF_REGNO (def));
614 /* Open chains based on information from (at least one) predecessor
615 block. This gives us a chance later on to combine chains across
616 basic block boundaries. Inconsistencies (in access sizes) will
617 be caught normally and dealt with conservatively by disabling the
618 chain for renaming, and there is no risk of losing optimization
619 opportunities by opening chains either: if we did not open the
620 chains, we'd have to track the live register as a hard reg, and
621 we'd be unable to rename it in any case. */
622 CLEAR_HARD_REG_SET (start_chains_set);
623 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
625 struct incoming_reg_info *iri = p->incoming + i;
626 if (iri->nregs > 0 && !iri->unusable
627 && range_in_hard_reg_set_p (live_hard_regs, i, iri->nregs))
629 SET_HARD_REG_BIT (start_chains_set, i);
630 remove_range_from_hard_reg_set (&live_hard_regs, i, iri->nregs);
633 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
635 struct incoming_reg_info *iri = p->incoming + i;
636 if (TEST_HARD_REG_BIT (start_chains_set, i))
638 du_head_p chain;
639 if (dump_file)
640 fprintf (dump_file, "opening incoming chain\n");
641 chain = create_new_chain (i, iri->nregs, NULL, NULL, NO_REGS);
642 bitmap_set_bit (&p->incoming_open_chains_set, chain->id);
647 /* Record in RI that the block corresponding to it has an incoming
648 live value, described by CHAIN. */
649 static void
650 set_incoming_from_chain (class bb_rename_info *ri, du_head_p chain)
652 int i;
653 int incoming_nregs = ri->incoming[chain->regno].nregs;
654 int nregs;
656 /* If we've recorded the same information before, everything is fine. */
657 if (incoming_nregs == chain->nregs)
659 if (dump_file)
660 fprintf (dump_file, "reg %d/%d already recorded\n",
661 chain->regno, chain->nregs);
662 return;
665 /* If we have no information for any of the involved registers, update
666 the incoming array. */
667 nregs = chain->nregs;
668 while (nregs-- > 0)
669 if (ri->incoming[chain->regno + nregs].nregs != 0
670 || ri->incoming[chain->regno + nregs].unusable)
671 break;
672 if (nregs < 0)
674 nregs = chain->nregs;
675 ri->incoming[chain->regno].nregs = nregs;
676 while (nregs-- > 1)
677 ri->incoming[chain->regno + nregs].nregs = -nregs;
678 if (dump_file)
679 fprintf (dump_file, "recorded reg %d/%d\n",
680 chain->regno, chain->nregs);
681 return;
684 /* There must be some kind of conflict. Prevent both the old and
685 new ranges from being used. */
686 if (incoming_nregs < 0)
687 ri->incoming[chain->regno + incoming_nregs].unusable = true;
688 for (i = 0; i < chain->nregs; i++)
689 ri->incoming[chain->regno + i].unusable = true;
692 /* Merge the two chains C1 and C2 so that all conflict information is
693 recorded and C1, and the id of C2 is changed to that of C1. */
694 static void
695 merge_chains (du_head_p c1, du_head_p c2)
697 if (c1 == c2)
698 return;
700 if (c2->first != NULL)
702 if (c1->first == NULL)
703 c1->first = c2->first;
704 else
705 c1->last->next_use = c2->first;
706 c1->last = c2->last;
709 c2->first = c2->last = NULL;
710 c2->id = c1->id;
712 c1->hard_conflicts |= c2->hard_conflicts;
713 bitmap_ior_into (&c1->conflicts, &c2->conflicts);
715 c1->call_clobber_mask |= c2->call_clobber_mask;
716 c1->call_abis |= c2->call_abis;
717 c1->cannot_rename |= c2->cannot_rename;
720 /* Analyze the current function and build chains for renaming.
721 If INCLUDE_ALL_BLOCKS_P is set to true, process all blocks,
722 ignoring BB_DISABLE_SCHEDULE. The default value is true. */
724 void
725 regrename_analyze (bitmap bb_mask, bool include_all_block_p)
727 class bb_rename_info *rename_info;
728 int i;
729 basic_block bb;
730 int n_bbs;
731 int *inverse_postorder;
733 inverse_postorder = XNEWVEC (int, last_basic_block_for_fn (cfun));
734 n_bbs = pre_and_rev_post_order_compute (NULL, inverse_postorder, false);
736 /* Gather some information about the blocks in this function. */
737 rename_info = XCNEWVEC (class bb_rename_info, n_basic_blocks_for_fn (cfun));
738 i = 0;
739 FOR_EACH_BB_FN (bb, cfun)
741 class bb_rename_info *ri = rename_info + i;
742 ri->bb = bb;
743 if (bb_mask != NULL && !bitmap_bit_p (bb_mask, bb->index))
744 bb->aux = NULL;
745 else
746 bb->aux = ri;
747 i++;
750 current_id = 0;
751 id_to_chain.create (0);
752 bitmap_initialize (&open_chains_set, &bitmap_default_obstack);
754 /* The order in which we visit blocks ensures that whenever
755 possible, we only process a block after at least one of its
756 predecessors, which provides a "seeding" effect to make the logic
757 in set_incoming_from_chain and init_rename_info useful. */
759 for (i = 0; i < n_bbs; i++)
761 basic_block bb1 = BASIC_BLOCK_FOR_FN (cfun, inverse_postorder[i]);
762 class bb_rename_info *this_info;
763 bool success;
764 edge e;
765 edge_iterator ei;
766 int old_length = id_to_chain.length ();
768 this_info = (class bb_rename_info *) bb1->aux;
769 if (this_info == NULL)
770 continue;
772 if (dump_file)
773 fprintf (dump_file, "\nprocessing block %d:\n", bb1->index);
775 if (!include_all_block_p && (bb1->flags & BB_DISABLE_SCHEDULE) != 0)
777 if (dump_file)
778 fprintf (dump_file, "avoid disrupting the sms schedule of bb %d\n",
779 bb1->index);
780 continue;
783 init_rename_info (this_info, bb1);
785 success = build_def_use (bb1);
786 if (!success)
788 if (dump_file)
789 fprintf (dump_file, "failed\n");
790 bb1->aux = NULL;
791 id_to_chain.truncate (old_length);
792 current_id = old_length;
793 bitmap_clear (&this_info->incoming_open_chains_set);
794 open_chains = NULL;
795 if (insn_rr.exists ())
797 rtx_insn *insn;
798 FOR_BB_INSNS (bb1, insn)
800 insn_rr_info *p = &insn_rr[INSN_UID (insn)];
801 p->op_info = NULL;
804 continue;
807 if (dump_file)
808 dump_def_use_chain (old_length);
809 bitmap_copy (&this_info->open_chains_set, &open_chains_set);
811 /* Add successor blocks to the worklist if necessary, and record
812 data about our own open chains at the end of this block, which
813 will be used to pre-open chains when processing the successors. */
814 FOR_EACH_EDGE (e, ei, bb1->succs)
816 class bb_rename_info *dest_ri;
817 class du_head *chain;
819 if (dump_file)
820 fprintf (dump_file, "successor block %d\n", e->dest->index);
822 if (e->flags & (EDGE_EH | EDGE_ABNORMAL))
823 continue;
824 dest_ri = (class bb_rename_info *)e->dest->aux;
825 if (dest_ri == NULL)
826 continue;
827 for (chain = open_chains; chain; chain = chain->next_chain)
828 set_incoming_from_chain (dest_ri, chain);
832 free (inverse_postorder);
834 /* Now, combine the chains data we have gathered across basic block
835 boundaries.
837 For every basic block, there may be chains open at the start, or at the
838 end. Rather than exclude them from renaming, we look for open chains
839 with matching registers at the other side of the CFG edge.
841 For a given chain using register R, open at the start of block B, we
842 must find an open chain using R on the other side of every edge leading
843 to B, if the register is live across this edge. In the code below,
844 N_PREDS_USED counts the number of edges where the register is live, and
845 N_PREDS_JOINED counts those where we found an appropriate chain for
846 joining.
848 We perform the analysis for both incoming and outgoing edges, but we
849 only need to merge once (in the second part, after verifying outgoing
850 edges). */
851 FOR_EACH_BB_FN (bb, cfun)
853 class bb_rename_info *bb_ri = (class bb_rename_info *) bb->aux;
854 unsigned j;
855 bitmap_iterator bi;
857 if (bb_ri == NULL)
858 continue;
860 if (dump_file)
861 fprintf (dump_file, "processing bb %d in edges\n", bb->index);
863 EXECUTE_IF_SET_IN_BITMAP (&bb_ri->incoming_open_chains_set, 0, j, bi)
865 edge e;
866 edge_iterator ei;
867 class du_head *chain = regrename_chain_from_id (j);
868 int n_preds_used = 0, n_preds_joined = 0;
870 FOR_EACH_EDGE (e, ei, bb->preds)
872 class bb_rename_info *src_ri;
873 unsigned k;
874 bitmap_iterator bi2;
875 HARD_REG_SET live;
876 bool success = false;
878 REG_SET_TO_HARD_REG_SET (live, df_get_live_out (e->src));
879 if (!range_overlaps_hard_reg_set_p (live, chain->regno,
880 chain->nregs))
881 continue;
882 n_preds_used++;
884 if (e->flags & (EDGE_EH | EDGE_ABNORMAL))
885 continue;
887 src_ri = (class bb_rename_info *)e->src->aux;
888 if (src_ri == NULL)
889 continue;
891 EXECUTE_IF_SET_IN_BITMAP (&src_ri->open_chains_set,
892 0, k, bi2)
894 class du_head *outgoing_chain = regrename_chain_from_id (k);
896 if (outgoing_chain->regno == chain->regno
897 && outgoing_chain->nregs == chain->nregs)
899 n_preds_joined++;
900 success = true;
901 break;
904 if (!success && dump_file)
905 fprintf (dump_file, "failure to match with pred block %d\n",
906 e->src->index);
908 if (n_preds_joined < n_preds_used)
910 if (dump_file)
911 fprintf (dump_file, "cannot rename chain %d\n", j);
912 chain->cannot_rename = 1;
916 FOR_EACH_BB_FN (bb, cfun)
918 class bb_rename_info *bb_ri = (class bb_rename_info *) bb->aux;
919 unsigned j;
920 bitmap_iterator bi;
922 if (bb_ri == NULL)
923 continue;
925 if (dump_file)
926 fprintf (dump_file, "processing bb %d out edges\n", bb->index);
928 EXECUTE_IF_SET_IN_BITMAP (&bb_ri->open_chains_set, 0, j, bi)
930 edge e;
931 edge_iterator ei;
932 class du_head *chain = regrename_chain_from_id (j);
933 int n_succs_used = 0, n_succs_joined = 0;
935 FOR_EACH_EDGE (e, ei, bb->succs)
937 bool printed = false;
938 class bb_rename_info *dest_ri;
939 unsigned k;
940 bitmap_iterator bi2;
941 HARD_REG_SET live;
943 REG_SET_TO_HARD_REG_SET (live, df_get_live_in (e->dest));
944 if (!range_overlaps_hard_reg_set_p (live, chain->regno,
945 chain->nregs))
946 continue;
948 n_succs_used++;
950 dest_ri = (class bb_rename_info *)e->dest->aux;
951 if (dest_ri == NULL)
952 continue;
954 EXECUTE_IF_SET_IN_BITMAP (&dest_ri->incoming_open_chains_set,
955 0, k, bi2)
957 class du_head *incoming_chain = regrename_chain_from_id (k);
959 if (incoming_chain->regno == chain->regno
960 && incoming_chain->nregs == chain->nregs)
962 if (dump_file)
964 if (!printed)
965 fprintf (dump_file,
966 "merging blocks for edge %d -> %d\n",
967 e->src->index, e->dest->index);
968 printed = true;
969 fprintf (dump_file,
970 " merging chains %d (->%d) and %d (->%d) [%s]\n",
971 k, incoming_chain->id, j, chain->id,
972 reg_names[incoming_chain->regno]);
975 merge_chains (chain, incoming_chain);
976 n_succs_joined++;
977 break;
981 if (n_succs_joined < n_succs_used)
983 if (dump_file)
984 fprintf (dump_file, "cannot rename chain %d\n",
986 chain->cannot_rename = 1;
991 free (rename_info);
993 FOR_EACH_BB_FN (bb, cfun)
994 bb->aux = NULL;
997 /* Attempt to replace all uses of the register in the chain beginning with
998 HEAD with REG. Returns true on success and false if the replacement is
999 rejected because the insns would not validate. The latter can happen
1000 e.g. if a match_parallel predicate enforces restrictions on register
1001 numbering in its subpatterns. */
1003 bool
1004 regrename_do_replace (class du_head *head, int reg)
1006 struct du_chain *chain;
1007 unsigned int base_regno = head->regno;
1008 machine_mode mode;
1009 rtx last_reg = NULL_RTX, last_repl = NULL_RTX;
1011 for (chain = head->first; chain; chain = chain->next_use)
1013 unsigned int regno = ORIGINAL_REGNO (*chain->loc);
1014 class reg_attrs *attr = REG_ATTRS (*chain->loc);
1015 int reg_ptr = REG_POINTER (*chain->loc);
1017 if (DEBUG_INSN_P (chain->insn) && REGNO (*chain->loc) != base_regno)
1018 validate_change (chain->insn, &(INSN_VAR_LOCATION_LOC (chain->insn)),
1019 gen_rtx_UNKNOWN_VAR_LOC (), true);
1020 else
1022 if (*chain->loc != last_reg)
1024 last_repl = gen_raw_REG (GET_MODE (*chain->loc), reg);
1025 if (regno >= FIRST_PSEUDO_REGISTER)
1026 ORIGINAL_REGNO (last_repl) = regno;
1027 REG_ATTRS (last_repl) = attr;
1028 REG_POINTER (last_repl) = reg_ptr;
1029 last_reg = *chain->loc;
1031 validate_change (chain->insn, chain->loc, last_repl, true);
1035 if (!apply_change_group ())
1036 return false;
1038 mode = GET_MODE (*head->first->loc);
1039 head->renamed = 1;
1040 head->regno = reg;
1041 head->nregs = hard_regno_nregs (reg, mode);
1042 return true;
1046 /* True if we found a register with a size mismatch, which means that we
1047 can't track its lifetime accurately. If so, we abort the current block
1048 without renaming. */
1049 static bool fail_current_block;
1051 /* Return true if OP is a reg for which all bits are set in PSET, false
1052 if all bits are clear.
1053 In other cases, set fail_current_block and return false. */
1055 static bool
1056 verify_reg_in_set (rtx op, HARD_REG_SET *pset)
1058 unsigned regno, nregs;
1059 bool all_live, all_dead;
1060 if (!REG_P (op))
1061 return false;
1063 regno = REGNO (op);
1064 nregs = REG_NREGS (op);
1065 all_live = all_dead = true;
1066 while (nregs-- > 0)
1067 if (TEST_HARD_REG_BIT (*pset, regno + nregs))
1068 all_dead = false;
1069 else
1070 all_live = false;
1071 if (!all_dead && !all_live)
1073 fail_current_block = true;
1074 return false;
1076 return all_live;
1079 /* Return true if OP is a reg that is being tracked already in some form.
1080 May set fail_current_block if it sees an unhandled case of overlap. */
1082 static bool
1083 verify_reg_tracked (rtx op)
1085 return (verify_reg_in_set (op, &live_hard_regs)
1086 || verify_reg_in_set (op, &live_in_chains));
1089 /* Called through note_stores. DATA points to a rtx_code, either SET or
1090 CLOBBER, which tells us which kind of rtx to look at. If we have a
1091 match, record the set register in live_hard_regs and in the hard_conflicts
1092 bitmap of open chains. */
1094 static void
1095 note_sets_clobbers (rtx x, const_rtx set, void *data)
1097 enum rtx_code code = *(enum rtx_code *)data;
1098 class du_head *chain;
1100 if (GET_CODE (x) == SUBREG)
1101 x = SUBREG_REG (x);
1102 if (!REG_P (x) || GET_CODE (set) != code)
1103 return;
1104 /* There must not be pseudos at this point. */
1105 gcc_assert (HARD_REGISTER_P (x));
1106 add_to_hard_reg_set (&live_hard_regs, GET_MODE (x), REGNO (x));
1107 for (chain = open_chains; chain; chain = chain->next_chain)
1108 add_to_hard_reg_set (&chain->hard_conflicts, GET_MODE (x), REGNO (x));
1111 static void
1112 scan_rtx_reg (rtx_insn *insn, rtx *loc, enum reg_class cl, enum scan_actions action,
1113 enum op_type type)
1115 class du_head **p;
1116 rtx x = *loc;
1117 unsigned this_regno = REGNO (x);
1118 int this_nregs = REG_NREGS (x);
1120 if (action == mark_write)
1122 if (type == OP_OUT)
1124 du_head_p c;
1125 rtx pat = PATTERN (insn);
1127 c = create_new_chain (this_regno, this_nregs, loc, insn, cl);
1129 /* We try to tie chains in a move instruction for
1130 a single output. */
1131 if (recog_data.n_operands == 2
1132 && GET_CODE (pat) == SET
1133 && GET_CODE (SET_DEST (pat)) == REG
1134 && GET_CODE (SET_SRC (pat)) == REG
1135 && terminated_this_insn
1136 && terminated_this_insn->nregs
1137 == REG_NREGS (recog_data.operand[1]))
1139 gcc_assert (terminated_this_insn->regno
1140 == REGNO (recog_data.operand[1]));
1142 c->tied_chain = terminated_this_insn;
1143 terminated_this_insn->tied_chain = c;
1145 if (dump_file)
1146 fprintf (dump_file, "Tying chain %s (%d) with %s (%d)\n",
1147 reg_names[c->regno], c->id,
1148 reg_names[terminated_this_insn->regno],
1149 terminated_this_insn->id);
1153 return;
1156 if ((type == OP_OUT) != (action == terminate_write || action == mark_access))
1157 return;
1159 for (p = &open_chains; *p;)
1161 class du_head *head = *p;
1162 class du_head *next = head->next_chain;
1163 int exact_match = (head->regno == this_regno
1164 && head->nregs == this_nregs);
1165 int superset = (this_regno <= head->regno
1166 && this_regno + this_nregs >= head->regno + head->nregs);
1167 int subset = (this_regno >= head->regno
1168 && this_regno + this_nregs <= head->regno + head->nregs);
1170 if (!bitmap_bit_p (&open_chains_set, head->id)
1171 || head->regno + head->nregs <= this_regno
1172 || this_regno + this_nregs <= head->regno)
1174 p = &head->next_chain;
1175 continue;
1178 if (action == mark_read || action == mark_access)
1180 /* ??? Class NO_REGS can happen if the md file makes use of
1181 EXTRA_CONSTRAINTS to match registers. Which is arguably
1182 wrong, but there we are. */
1184 if (cl == NO_REGS || (!exact_match && !DEBUG_INSN_P (insn)))
1186 if (dump_file)
1187 fprintf (dump_file,
1188 "Cannot rename chain %s (%d) at insn %d (%s)\n",
1189 reg_names[head->regno], head->id, INSN_UID (insn),
1190 scan_actions_name[(int) action]);
1191 head->cannot_rename = 1;
1192 if (superset)
1194 unsigned nregs = this_nregs;
1195 head->regno = this_regno;
1196 head->nregs = this_nregs;
1197 while (nregs-- > 0)
1198 SET_HARD_REG_BIT (live_in_chains, head->regno + nregs);
1199 if (dump_file)
1200 fprintf (dump_file,
1201 "Widening register in chain %s (%d) at insn %d\n",
1202 reg_names[head->regno], head->id, INSN_UID (insn));
1204 else if (!subset)
1206 fail_current_block = true;
1207 if (dump_file)
1208 fprintf (dump_file,
1209 "Failing basic block due to unhandled overlap\n");
1212 else
1214 struct du_chain *this_du;
1215 this_du = XOBNEW (&rename_obstack, struct du_chain);
1216 this_du->next_use = 0;
1217 this_du->loc = loc;
1218 this_du->insn = insn;
1219 this_du->cl = cl;
1220 if (head->first == NULL)
1221 head->first = this_du;
1222 else
1223 head->last->next_use = this_du;
1224 record_operand_use (head, this_du);
1225 head->last = this_du;
1227 /* Avoid adding the same location in a DEBUG_INSN multiple times,
1228 which could happen with non-exact overlap. */
1229 if (DEBUG_INSN_P (insn))
1230 return;
1231 /* Otherwise, find any other chains that do not match exactly;
1232 ensure they all get marked unrenamable. */
1233 p = &head->next_chain;
1234 continue;
1237 /* Whether the terminated chain can be used for renaming
1238 depends on the action and this being an exact match.
1239 In either case, we remove this element from open_chains. */
1241 if ((action == terminate_dead || action == terminate_write)
1242 && (superset || subset))
1244 unsigned nregs;
1246 if (subset && !superset)
1247 head->cannot_rename = 1;
1248 bitmap_clear_bit (&open_chains_set, head->id);
1250 nregs = head->nregs;
1251 while (nregs-- > 0)
1253 CLEAR_HARD_REG_BIT (live_in_chains, head->regno + nregs);
1254 if (subset && !superset
1255 && (head->regno + nregs < this_regno
1256 || head->regno + nregs >= this_regno + this_nregs))
1257 SET_HARD_REG_BIT (live_hard_regs, head->regno + nregs);
1260 if (action == terminate_dead)
1261 terminated_this_insn = *p;
1262 *p = next;
1263 if (dump_file)
1264 fprintf (dump_file,
1265 "Closing chain %s (%d) at insn %d (%s%s)\n",
1266 reg_names[head->regno], head->id, INSN_UID (insn),
1267 scan_actions_name[(int) action],
1268 superset ? ", superset" : subset ? ", subset" : "");
1270 else if (action == terminate_dead || action == terminate_write)
1272 /* In this case, tracking liveness gets too hard. Fail the
1273 entire basic block. */
1274 if (dump_file)
1275 fprintf (dump_file,
1276 "Failing basic block due to unhandled overlap\n");
1277 fail_current_block = true;
1278 return;
1280 else
1282 head->cannot_rename = 1;
1283 if (dump_file)
1284 fprintf (dump_file,
1285 "Cannot rename chain %s (%d) at insn %d (%s)\n",
1286 reg_names[head->regno], head->id, INSN_UID (insn),
1287 scan_actions_name[(int) action]);
1288 p = &head->next_chain;
1293 /* A wrapper around base_reg_class which returns ALL_REGS if INSN is a
1294 DEBUG_INSN. The arguments MODE, AS, CODE and INDEX_CODE are as for
1295 base_reg_class. */
1297 static reg_class
1298 base_reg_class_for_rename (rtx_insn *insn, machine_mode mode, addr_space_t as,
1299 rtx_code code, rtx_code index_code)
1301 if (DEBUG_INSN_P (insn))
1302 return ALL_REGS;
1303 return base_reg_class (mode, as, code, index_code);
1306 /* Adapted from find_reloads_address_1. CL is INDEX_REG_CLASS or
1307 BASE_REG_CLASS depending on how the register is being considered. */
1309 static void
1310 scan_rtx_address (rtx_insn *insn, rtx *loc, enum reg_class cl,
1311 enum scan_actions action, machine_mode mode,
1312 addr_space_t as)
1314 rtx x = *loc;
1315 RTX_CODE code = GET_CODE (x);
1316 const char *fmt;
1317 int i, j;
1319 if (action == mark_write || action == mark_access)
1320 return;
1322 switch (code)
1324 case PLUS:
1326 rtx orig_op0 = XEXP (x, 0);
1327 rtx orig_op1 = XEXP (x, 1);
1328 RTX_CODE code0 = GET_CODE (orig_op0);
1329 RTX_CODE code1 = GET_CODE (orig_op1);
1330 rtx op0 = orig_op0;
1331 rtx op1 = orig_op1;
1332 rtx *locI = NULL;
1333 rtx *locB = NULL;
1334 enum rtx_code index_code = SCRATCH;
1336 if (GET_CODE (op0) == SUBREG)
1338 op0 = SUBREG_REG (op0);
1339 code0 = GET_CODE (op0);
1342 if (GET_CODE (op1) == SUBREG)
1344 op1 = SUBREG_REG (op1);
1345 code1 = GET_CODE (op1);
1348 if (code0 == MULT || code0 == SIGN_EXTEND || code0 == TRUNCATE
1349 || code0 == ZERO_EXTEND || code1 == MEM)
1351 locI = &XEXP (x, 0);
1352 locB = &XEXP (x, 1);
1353 index_code = GET_CODE (*locI);
1355 else if (code1 == MULT || code1 == SIGN_EXTEND || code1 == TRUNCATE
1356 || code1 == ZERO_EXTEND || code0 == MEM)
1358 locI = &XEXP (x, 1);
1359 locB = &XEXP (x, 0);
1360 index_code = GET_CODE (*locI);
1362 else if (code0 == CONST_INT || code0 == CONST
1363 || code0 == SYMBOL_REF || code0 == LABEL_REF)
1365 locB = &XEXP (x, 1);
1366 index_code = GET_CODE (XEXP (x, 0));
1368 else if (code1 == CONST_INT || code1 == CONST
1369 || code1 == SYMBOL_REF || code1 == LABEL_REF)
1371 locB = &XEXP (x, 0);
1372 index_code = GET_CODE (XEXP (x, 1));
1374 else if (code0 == REG && code1 == REG)
1376 int index_op;
1377 unsigned regno0 = REGNO (op0), regno1 = REGNO (op1);
1379 if (REGNO_OK_FOR_INDEX_P (regno1)
1380 && regno_ok_for_base_p (regno0, mode, as, PLUS, REG))
1381 index_op = 1;
1382 else if (REGNO_OK_FOR_INDEX_P (regno0)
1383 && regno_ok_for_base_p (regno1, mode, as, PLUS, REG))
1384 index_op = 0;
1385 else if (regno_ok_for_base_p (regno0, mode, as, PLUS, REG)
1386 || REGNO_OK_FOR_INDEX_P (regno1))
1387 index_op = 1;
1388 else if (regno_ok_for_base_p (regno1, mode, as, PLUS, REG))
1389 index_op = 0;
1390 else
1391 index_op = 1;
1393 locI = &XEXP (x, index_op);
1394 locB = &XEXP (x, !index_op);
1395 index_code = GET_CODE (*locI);
1397 else if (code0 == REG)
1399 locI = &XEXP (x, 0);
1400 locB = &XEXP (x, 1);
1401 index_code = GET_CODE (*locI);
1403 else if (code1 == REG)
1405 locI = &XEXP (x, 1);
1406 locB = &XEXP (x, 0);
1407 index_code = GET_CODE (*locI);
1410 if (locI)
1412 reg_class iclass = DEBUG_INSN_P (insn) ? ALL_REGS : INDEX_REG_CLASS;
1413 scan_rtx_address (insn, locI, iclass, action, mode, as);
1415 if (locB)
1417 reg_class bclass = base_reg_class_for_rename (insn, mode, as, PLUS,
1418 index_code);
1419 scan_rtx_address (insn, locB, bclass, action, mode, as);
1421 return;
1424 case POST_INC:
1425 case POST_DEC:
1426 case POST_MODIFY:
1427 case PRE_INC:
1428 case PRE_DEC:
1429 case PRE_MODIFY:
1430 /* If the target doesn't claim to handle autoinc, this must be
1431 something special, like a stack push. Kill this chain. */
1432 if (!AUTO_INC_DEC)
1433 action = mark_all_read;
1435 break;
1437 case MEM:
1439 reg_class bclass = base_reg_class_for_rename (insn, GET_MODE (x),
1440 MEM_ADDR_SPACE (x),
1441 MEM, SCRATCH);
1442 scan_rtx_address (insn, &XEXP (x, 0), bclass, action, GET_MODE (x),
1443 MEM_ADDR_SPACE (x));
1445 return;
1447 case REG:
1448 scan_rtx_reg (insn, loc, cl, action, OP_IN);
1449 return;
1451 default:
1452 break;
1455 fmt = GET_RTX_FORMAT (code);
1456 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1458 if (fmt[i] == 'e')
1459 scan_rtx_address (insn, &XEXP (x, i), cl, action, mode, as);
1460 else if (fmt[i] == 'E')
1461 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
1462 scan_rtx_address (insn, &XVECEXP (x, i, j), cl, action, mode, as);
1466 static void
1467 scan_rtx (rtx_insn *insn, rtx *loc, enum reg_class cl, enum scan_actions action,
1468 enum op_type type)
1470 const char *fmt;
1471 rtx x = *loc;
1472 int i, j;
1474 enum rtx_code code = GET_CODE (x);
1475 switch (code)
1477 case CONST:
1478 CASE_CONST_ANY:
1479 case SYMBOL_REF:
1480 case LABEL_REF:
1481 case PC:
1482 return;
1484 case REG:
1485 scan_rtx_reg (insn, loc, cl, action, type);
1486 return;
1488 case MEM:
1490 reg_class bclass = base_reg_class_for_rename (insn, GET_MODE (x),
1491 MEM_ADDR_SPACE (x),
1492 MEM, SCRATCH);
1494 scan_rtx_address (insn, &XEXP (x, 0), bclass, action, GET_MODE (x),
1495 MEM_ADDR_SPACE (x));
1497 return;
1499 case SET:
1500 scan_rtx (insn, &SET_SRC (x), cl, action, OP_IN);
1501 scan_rtx (insn, &SET_DEST (x), cl, action,
1502 (GET_CODE (PATTERN (insn)) == COND_EXEC
1503 && verify_reg_tracked (SET_DEST (x))) ? OP_INOUT : OP_OUT);
1504 return;
1506 case STRICT_LOW_PART:
1507 scan_rtx (insn, &XEXP (x, 0), cl, action,
1508 verify_reg_tracked (XEXP (x, 0)) ? OP_INOUT : OP_OUT);
1509 return;
1511 case ZERO_EXTRACT:
1512 case SIGN_EXTRACT:
1513 scan_rtx (insn, &XEXP (x, 0), cl, action,
1514 (type == OP_IN ? OP_IN :
1515 verify_reg_tracked (XEXP (x, 0)) ? OP_INOUT : OP_OUT));
1516 scan_rtx (insn, &XEXP (x, 1), cl, action, OP_IN);
1517 scan_rtx (insn, &XEXP (x, 2), cl, action, OP_IN);
1518 return;
1520 case POST_INC:
1521 case PRE_INC:
1522 case POST_DEC:
1523 case PRE_DEC:
1524 case POST_MODIFY:
1525 case PRE_MODIFY:
1526 /* Should only happen inside MEM. */
1527 gcc_unreachable ();
1529 case CLOBBER:
1530 scan_rtx (insn, &SET_DEST (x), cl, action,
1531 (GET_CODE (PATTERN (insn)) == COND_EXEC
1532 && verify_reg_tracked (SET_DEST (x))) ? OP_INOUT : OP_OUT);
1533 return;
1535 case EXPR_LIST:
1536 scan_rtx (insn, &XEXP (x, 0), cl, action, type);
1537 if (XEXP (x, 1))
1538 scan_rtx (insn, &XEXP (x, 1), cl, action, type);
1539 return;
1541 default:
1542 break;
1545 fmt = GET_RTX_FORMAT (code);
1546 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1548 if (fmt[i] == 'e')
1549 scan_rtx (insn, &XEXP (x, i), cl, action, type);
1550 else if (fmt[i] == 'E')
1551 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
1552 scan_rtx (insn, &XVECEXP (x, i, j), cl, action, type);
1556 /* Hide operands of the current insn (of which there are N_OPS) by
1557 substituting pc for them.
1558 Previous values are stored in the OLD_OPERANDS and OLD_DUPS.
1559 For every bit set in DO_NOT_HIDE, we leave the operand alone.
1560 If INOUT_AND_EC_ONLY is set, we only do this for OP_INOUT type operands
1561 and earlyclobbers. */
1563 static void
1564 hide_operands (int n_ops, rtx *old_operands, rtx *old_dups,
1565 unsigned HOST_WIDE_INT do_not_hide, bool inout_and_ec_only)
1567 int i;
1568 const operand_alternative *op_alt = which_op_alt ();
1569 for (i = 0; i < n_ops; i++)
1571 old_operands[i] = recog_data.operand[i];
1572 /* Don't squash match_operator or match_parallel here, since
1573 we don't know that all of the contained registers are
1574 reachable by proper operands. */
1575 if (recog_data.constraints[i][0] == '\0')
1576 continue;
1577 if (do_not_hide & (1 << i))
1578 continue;
1579 if (!inout_and_ec_only || recog_data.operand_type[i] == OP_INOUT
1580 || op_alt[i].earlyclobber)
1581 *recog_data.operand_loc[i] = pc_rtx;
1583 for (i = 0; i < recog_data.n_dups; i++)
1585 int opn = recog_data.dup_num[i];
1586 old_dups[i] = *recog_data.dup_loc[i];
1587 if (do_not_hide & (1 << opn))
1588 continue;
1589 if (!inout_and_ec_only || recog_data.operand_type[opn] == OP_INOUT
1590 || op_alt[opn].earlyclobber)
1591 *recog_data.dup_loc[i] = pc_rtx;
1595 /* Undo the substitution performed by hide_operands. INSN is the insn we
1596 are processing; the arguments are the same as in hide_operands. */
1598 static void
1599 restore_operands (rtx_insn *insn, int n_ops, rtx *old_operands, rtx *old_dups)
1601 int i;
1602 for (i = 0; i < recog_data.n_dups; i++)
1603 *recog_data.dup_loc[i] = old_dups[i];
1604 for (i = 0; i < n_ops; i++)
1605 *recog_data.operand_loc[i] = old_operands[i];
1606 if (recog_data.n_dups)
1607 df_insn_rescan (insn);
1610 /* For each output operand of INSN, call scan_rtx to create a new
1611 open chain. Do this only for normal or earlyclobber outputs,
1612 depending on EARLYCLOBBER. If INSN_INFO is nonnull, use it to
1613 record information about the operands in the insn. */
1615 static void
1616 record_out_operands (rtx_insn *insn, bool earlyclobber, insn_rr_info *insn_info)
1618 int n_ops = recog_data.n_operands;
1619 const operand_alternative *op_alt = which_op_alt ();
1621 int i;
1623 for (i = 0; i < n_ops + recog_data.n_dups; i++)
1625 int opn = i < n_ops ? i : recog_data.dup_num[i - n_ops];
1626 rtx *loc = (i < n_ops
1627 ? recog_data.operand_loc[opn]
1628 : recog_data.dup_loc[i - n_ops]);
1629 rtx op = *loc;
1630 enum reg_class cl = alternative_class (op_alt, opn);
1632 class du_head *prev_open;
1634 if (recog_data.operand_type[opn] != OP_OUT
1635 || op_alt[opn].earlyclobber != earlyclobber)
1636 continue;
1638 if (insn_info)
1639 cur_operand = insn_info->op_info + i;
1641 prev_open = open_chains;
1642 if (earlyclobber)
1643 scan_rtx (insn, loc, cl, terminate_write, OP_OUT);
1644 scan_rtx (insn, loc, cl, mark_write, OP_OUT);
1646 /* ??? Many targets have output constraints on the SET_DEST
1647 of a call insn, which is stupid, since these are certainly
1648 ABI defined hard registers. For these, and for asm operands
1649 that originally referenced hard registers, we must record that
1650 the chain cannot be renamed. */
1651 if (CALL_P (insn)
1652 || (asm_noperands (PATTERN (insn)) > 0
1653 && REG_P (op)
1654 && REGNO (op) == ORIGINAL_REGNO (op)))
1656 if (prev_open != open_chains)
1657 open_chains->cannot_rename = 1;
1660 cur_operand = NULL;
1663 /* Build def/use chain. */
1665 static bool
1666 build_def_use (basic_block bb)
1668 rtx_insn *insn;
1669 unsigned HOST_WIDE_INT untracked_operands;
1671 fail_current_block = false;
1673 for (insn = BB_HEAD (bb); ; insn = NEXT_INSN (insn))
1675 if (NONDEBUG_INSN_P (insn))
1677 int n_ops;
1678 rtx note;
1679 rtx old_operands[MAX_RECOG_OPERANDS];
1680 rtx old_dups[MAX_DUP_OPERANDS];
1681 int i;
1682 int predicated;
1683 enum rtx_code set_code = SET;
1684 enum rtx_code clobber_code = CLOBBER;
1685 insn_rr_info *insn_info = NULL;
1686 terminated_this_insn = NULL;
1688 /* Process the insn, determining its effect on the def-use
1689 chains and live hard registers. We perform the following
1690 steps with the register references in the insn, simulating
1691 its effect:
1692 (1) Deal with earlyclobber operands and CLOBBERs of non-operands
1693 by creating chains and marking hard regs live.
1694 (2) Any read outside an operand causes any chain it overlaps
1695 with to be marked unrenamable.
1696 (3) Any read inside an operand is added if there's already
1697 an open chain for it.
1698 (4) For any REG_DEAD note we find, close open chains that
1699 overlap it.
1700 (5) For any non-earlyclobber write we find, close open chains
1701 that overlap it.
1702 (6) For any non-earlyclobber write we find in an operand, make
1703 a new chain or mark the hard register as live.
1704 (7) For any REG_UNUSED, close any chains we just opened.
1705 (8) For any REG_CFA_RESTORE or REG_CFA_REGISTER, kill any chain
1706 containing its dest.
1708 We cannot deal with situations where we track a reg in one mode
1709 and see a reference in another mode; these will cause the chain
1710 to be marked unrenamable or even cause us to abort the entire
1711 basic block. */
1713 extract_constrain_insn (insn);
1714 preprocess_constraints (insn);
1715 const operand_alternative *op_alt = which_op_alt ();
1716 n_ops = recog_data.n_operands;
1717 untracked_operands = 0;
1719 if (insn_rr.exists ())
1721 insn_info = &insn_rr[INSN_UID (insn)];
1722 insn_info->op_info = XOBNEWVEC (&rename_obstack, operand_rr_info,
1723 recog_data.n_operands);
1724 memset (insn_info->op_info, 0,
1725 sizeof (operand_rr_info) * recog_data.n_operands);
1728 /* Simplify the code below by promoting OP_OUT to OP_INOUT in
1729 predicated instructions, but only for register operands
1730 that are already tracked, so that we can create a chain
1731 when the first SET makes a register live. */
1733 predicated = GET_CODE (PATTERN (insn)) == COND_EXEC;
1734 for (i = 0; i < n_ops; ++i)
1736 rtx op = recog_data.operand[i];
1737 int matches = op_alt[i].matches;
1738 if (matches >= 0 || op_alt[i].matched >= 0
1739 || (predicated && recog_data.operand_type[i] == OP_OUT))
1741 recog_data.operand_type[i] = OP_INOUT;
1742 /* A special case to deal with instruction patterns that
1743 have matching operands with different modes. If we're
1744 not already tracking such a reg, we won't start here,
1745 and we must instead make sure to make the operand visible
1746 to the machinery that tracks hard registers. */
1747 machine_mode i_mode = recog_data.operand_mode[i];
1748 if (matches >= 0)
1750 machine_mode matches_mode
1751 = recog_data.operand_mode[matches];
1753 if (maybe_ne (GET_MODE_SIZE (i_mode),
1754 GET_MODE_SIZE (matches_mode))
1755 && !verify_reg_in_set (op, &live_in_chains))
1757 untracked_operands |= 1 << i;
1758 untracked_operands |= 1 << matches;
1762 #ifdef STACK_REGS
1763 if (regstack_completed
1764 && REG_P (op)
1765 && IN_RANGE (REGNO (op), FIRST_STACK_REG, LAST_STACK_REG))
1766 untracked_operands |= 1 << i;
1767 #endif
1768 /* If there's an in-out operand with a register that is not
1769 being tracked at all yet, open a chain. */
1770 if (recog_data.operand_type[i] == OP_INOUT
1771 && !(untracked_operands & (1 << i))
1772 && REG_P (op)
1773 && !verify_reg_tracked (op))
1774 create_new_chain (REGNO (op), REG_NREGS (op), NULL, NULL,
1775 NO_REGS);
1778 if (fail_current_block)
1779 break;
1781 /* Step 1a: Mark hard registers that are clobbered in this insn,
1782 outside an operand, as live. */
1783 hide_operands (n_ops, old_operands, old_dups, untracked_operands,
1784 false);
1785 note_stores (insn, note_sets_clobbers, &clobber_code);
1786 restore_operands (insn, n_ops, old_operands, old_dups);
1788 /* Step 1b: Begin new chains for earlyclobbered writes inside
1789 operands. */
1790 record_out_operands (insn, true, insn_info);
1792 /* Step 2: Mark chains for which we have reads outside operands
1793 as unrenamable.
1794 We do this by munging all operands into PC, and closing
1795 everything remaining. */
1797 hide_operands (n_ops, old_operands, old_dups, untracked_operands,
1798 false);
1799 scan_rtx (insn, &PATTERN (insn), NO_REGS, mark_all_read, OP_IN);
1800 restore_operands (insn, n_ops, old_operands, old_dups);
1802 /* Step 2B: Can't rename function call argument registers. */
1803 if (CALL_P (insn) && CALL_INSN_FUNCTION_USAGE (insn))
1804 scan_rtx (insn, &CALL_INSN_FUNCTION_USAGE (insn),
1805 NO_REGS, mark_all_read, OP_IN);
1807 /* Step 2C: Can't rename asm operands that were originally
1808 hard registers. */
1809 if (asm_noperands (PATTERN (insn)) > 0)
1810 for (i = 0; i < n_ops; i++)
1812 rtx *loc = recog_data.operand_loc[i];
1813 rtx op = *loc;
1815 if (REG_P (op)
1816 && REGNO (op) == ORIGINAL_REGNO (op)
1817 && (recog_data.operand_type[i] == OP_IN
1818 || recog_data.operand_type[i] == OP_INOUT))
1819 scan_rtx (insn, loc, NO_REGS, mark_all_read, OP_IN);
1822 /* Step 3: Append to chains for reads inside operands. */
1823 for (i = 0; i < n_ops + recog_data.n_dups; i++)
1825 int opn = i < n_ops ? i : recog_data.dup_num[i - n_ops];
1826 rtx *loc = (i < n_ops
1827 ? recog_data.operand_loc[opn]
1828 : recog_data.dup_loc[i - n_ops]);
1829 enum reg_class cl = alternative_class (op_alt, opn);
1830 enum op_type type = recog_data.operand_type[opn];
1832 /* Don't scan match_operand here, since we've no reg class
1833 information to pass down. Any operands that we could
1834 substitute in will be represented elsewhere. */
1835 if (recog_data.constraints[opn][0] == '\0'
1836 || untracked_operands & (1 << opn))
1837 continue;
1839 if (insn_info)
1840 cur_operand = i == opn ? insn_info->op_info + i : NULL;
1841 if (op_alt[opn].is_address)
1842 scan_rtx_address (insn, loc, cl, mark_read,
1843 VOIDmode, ADDR_SPACE_GENERIC);
1844 else
1845 scan_rtx (insn, loc, cl, mark_read, type);
1847 cur_operand = NULL;
1849 /* Step 3B: Record updates for regs in REG_INC notes, and
1850 source regs in REG_FRAME_RELATED_EXPR notes. */
1851 for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
1852 if (REG_NOTE_KIND (note) == REG_INC
1853 || REG_NOTE_KIND (note) == REG_FRAME_RELATED_EXPR)
1854 scan_rtx (insn, &XEXP (note, 0), ALL_REGS, mark_read,
1855 OP_INOUT);
1857 /* Step 4: Close chains for registers that die here, unless
1858 the register is mentioned in a REG_UNUSED note. In that
1859 case we keep the chain open until step #7 below to ensure
1860 it conflicts with other output operands of this insn.
1861 See PR 52573. Arguably the insn should not have both
1862 notes; it has proven difficult to fix that without
1863 other undesirable side effects. */
1864 for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
1865 if (REG_NOTE_KIND (note) == REG_DEAD
1866 && !find_regno_note (insn, REG_UNUSED, REGNO (XEXP (note, 0))))
1868 remove_from_hard_reg_set (&live_hard_regs,
1869 GET_MODE (XEXP (note, 0)),
1870 REGNO (XEXP (note, 0)));
1871 scan_rtx (insn, &XEXP (note, 0), NO_REGS, terminate_dead,
1872 OP_IN);
1875 /* Step 4B: If this is a call, any chain live at this point
1876 requires a caller-saved reg. */
1877 if (CALL_P (insn))
1879 function_abi callee_abi = insn_callee_abi (insn);
1880 class du_head *p;
1881 for (p = open_chains; p; p = p->next_chain)
1883 p->call_abis |= (1 << callee_abi.id ());
1884 p->call_clobber_mask
1885 |= callee_abi.full_and_partial_reg_clobbers ();
1886 p->hard_conflicts |= callee_abi.full_reg_clobbers ();
1890 /* Step 5: Close open chains that overlap writes. Similar to
1891 step 2, we hide in-out operands, since we do not want to
1892 close these chains. We also hide earlyclobber operands,
1893 since we've opened chains for them in step 1, and earlier
1894 chains they would overlap with must have been closed at
1895 the previous insn at the latest, as such operands cannot
1896 possibly overlap with any input operands. */
1898 hide_operands (n_ops, old_operands, old_dups, untracked_operands,
1899 true);
1900 scan_rtx (insn, &PATTERN (insn), NO_REGS, terminate_write, OP_IN);
1901 restore_operands (insn, n_ops, old_operands, old_dups);
1903 /* Step 6a: Mark hard registers that are set in this insn,
1904 outside an operand, as live. */
1905 hide_operands (n_ops, old_operands, old_dups, untracked_operands,
1906 false);
1907 note_stores (insn, note_sets_clobbers, &set_code);
1908 restore_operands (insn, n_ops, old_operands, old_dups);
1910 /* Step 6b: Begin new chains for writes inside operands. */
1911 record_out_operands (insn, false, insn_info);
1913 /* Step 6c: Record destination regs in REG_FRAME_RELATED_EXPR
1914 notes for update. */
1915 for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
1916 if (REG_NOTE_KIND (note) == REG_FRAME_RELATED_EXPR)
1917 scan_rtx (insn, &XEXP (note, 0), ALL_REGS, mark_access,
1918 OP_INOUT);
1920 /* Step 7: Close chains for registers that were never
1921 really used here. */
1922 for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
1923 if (REG_NOTE_KIND (note) == REG_UNUSED)
1925 remove_from_hard_reg_set (&live_hard_regs,
1926 GET_MODE (XEXP (note, 0)),
1927 REGNO (XEXP (note, 0)));
1928 scan_rtx (insn, &XEXP (note, 0), NO_REGS, terminate_dead,
1929 OP_IN);
1932 /* Step 8: Kill the chains involving register restores. Those
1933 should restore _that_ register. Similar for REG_CFA_REGISTER. */
1934 for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
1935 if (REG_NOTE_KIND (note) == REG_CFA_RESTORE
1936 || REG_NOTE_KIND (note) == REG_CFA_REGISTER)
1938 rtx *x = &XEXP (note, 0);
1939 if (!*x)
1940 x = &PATTERN (insn);
1941 if (GET_CODE (*x) == PARALLEL)
1942 x = &XVECEXP (*x, 0, 0);
1943 if (GET_CODE (*x) == SET)
1944 x = &SET_DEST (*x);
1945 scan_rtx (insn, x, NO_REGS, mark_all_read, OP_IN);
1948 else if (DEBUG_BIND_INSN_P (insn)
1949 && !VAR_LOC_UNKNOWN_P (INSN_VAR_LOCATION_LOC (insn)))
1951 scan_rtx (insn, &INSN_VAR_LOCATION_LOC (insn),
1952 ALL_REGS, mark_read, OP_IN);
1954 if (insn == BB_END (bb))
1955 break;
1958 if (fail_current_block)
1959 return false;
1961 return true;
1964 /* Initialize the register renamer. If INSN_INFO is true, ensure that
1965 insn_rr is nonnull. */
1966 void
1967 regrename_init (bool insn_info)
1969 gcc_obstack_init (&rename_obstack);
1970 insn_rr.create (0);
1971 if (insn_info)
1972 insn_rr.safe_grow_cleared (get_max_uid (), true);
1975 /* Free all global data used by the register renamer. */
1976 void
1977 regrename_finish (void)
1979 insn_rr.release ();
1980 free_chain_data ();
1981 obstack_free (&rename_obstack, NULL);
1984 /* Perform register renaming on the current function. */
1986 static unsigned int
1987 regrename_optimize (void)
1989 df_set_flags (DF_LR_RUN_DCE);
1990 df_note_add_problem ();
1991 df_analyze ();
1992 df_set_flags (DF_DEFER_INSN_RESCAN);
1994 regrename_init (false);
1996 regrename_analyze (NULL, false);
1998 rename_chains ();
2000 regrename_finish ();
2002 return 0;
2005 namespace {
2007 const pass_data pass_data_regrename =
2009 RTL_PASS, /* type */
2010 "rnreg", /* name */
2011 OPTGROUP_NONE, /* optinfo_flags */
2012 TV_RENAME_REGISTERS, /* tv_id */
2013 0, /* properties_required */
2014 0, /* properties_provided */
2015 0, /* properties_destroyed */
2016 0, /* todo_flags_start */
2017 TODO_df_finish, /* todo_flags_finish */
2020 class pass_regrename : public rtl_opt_pass
2022 public:
2023 pass_regrename (gcc::context *ctxt)
2024 : rtl_opt_pass (pass_data_regrename, ctxt)
2027 /* opt_pass methods: */
2028 bool gate (function *) final override
2030 return (optimize > 0 && (flag_rename_registers));
2033 unsigned int execute (function *) final override
2035 return regrename_optimize ();
2038 }; // class pass_regrename
2040 } // anon namespace
2042 rtl_opt_pass *
2043 make_pass_regrename (gcc::context *ctxt)
2045 return new pass_regrename (ctxt);