* include/bits/alloc_traits.h (__alloctr_rebind): Remove.
[official-gcc.git] / gcc / regrename.c
blob6c7d650ea836ed38c8af2fbd94c49bf1f34d4106
1 /* Register renaming for the GNU compiler.
2 Copyright (C) 2000-2015 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 "tm.h"
24 #include "rtl-error.h"
25 #include "tm_p.h"
26 #include "insn-config.h"
27 #include "regs.h"
28 #include "addresses.h"
29 #include "hard-reg-set.h"
30 #include "predict.h"
31 #include "function.h"
32 #include "dominance.h"
33 #include "cfg.h"
34 #include "cfganal.h"
35 #include "basic-block.h"
36 #include "reload.h"
37 #include "output.h"
38 #include "recog.h"
39 #include "flags.h"
40 #include "obstack.h"
41 #include "tree-pass.h"
42 #include "df.h"
43 #include "target.h"
44 #include "emit-rtl.h"
45 #include "regrename.h"
47 /* This file implements the RTL register renaming pass of the compiler. It is
48 a semi-local pass whose goal is to maximize the usage of the register file
49 of the processor by substituting registers for others in the solution given
50 by the register allocator. The algorithm is as follows:
52 1. Local def/use chains are built: within each basic block, chains are
53 opened and closed; if a chain isn't closed at the end of the block,
54 it is dropped. We pre-open chains if we have already examined a
55 predecessor block and found chains live at the end which match
56 live registers at the start of the new block.
58 2. We try to combine the local chains across basic block boundaries by
59 comparing chains that were open at the start or end of a block to
60 those in successor/predecessor blocks.
62 3. For each chain, the set of possible renaming registers is computed.
63 This takes into account the renaming of previously processed chains.
64 Optionally, a preferred class is computed for the renaming register.
66 4. The best renaming register is computed for the chain in the above set,
67 using a round-robin allocation. If a preferred class exists, then the
68 round-robin allocation is done within the class first, if possible.
69 The round-robin allocation of renaming registers itself is global.
71 5. If a renaming register has been found, it is substituted in the chain.
73 Targets can parameterize the pass by specifying a preferred class for the
74 renaming register for a given (super)class of registers to be renamed. */
76 #if HOST_BITS_PER_WIDE_INT <= MAX_RECOG_OPERANDS
77 #error "Use a different bitmap implementation for untracked_operands."
78 #endif
80 enum scan_actions
82 terminate_write,
83 terminate_dead,
84 mark_all_read,
85 mark_read,
86 mark_write,
87 /* mark_access is for marking the destination regs in
88 REG_FRAME_RELATED_EXPR notes (as if they were read) so that the
89 note is updated properly. */
90 mark_access
93 static const char * const scan_actions_name[] =
95 "terminate_write",
96 "terminate_dead",
97 "mark_all_read",
98 "mark_read",
99 "mark_write",
100 "mark_access"
103 /* TICK and THIS_TICK are used to record the last time we saw each
104 register. */
105 static int tick[FIRST_PSEUDO_REGISTER];
106 static int this_tick = 0;
108 static struct obstack rename_obstack;
110 /* If nonnull, the code calling into the register renamer requested
111 information about insn operands, and we store it here. */
112 vec<insn_rr_info> insn_rr;
114 static void scan_rtx (rtx_insn *, rtx *, enum reg_class, enum scan_actions,
115 enum op_type);
116 static bool build_def_use (basic_block);
118 /* The id to be given to the next opened chain. */
119 static unsigned current_id;
121 /* A mapping of unique id numbers to chains. */
122 static vec<du_head_p> id_to_chain;
124 /* List of currently open chains. */
125 static struct du_head *open_chains;
127 /* Bitmap of open chains. The bits set always match the list found in
128 open_chains. */
129 static bitmap_head open_chains_set;
131 /* Record the registers being tracked in open_chains. */
132 static HARD_REG_SET live_in_chains;
134 /* Record the registers that are live but not tracked. The intersection
135 between this and live_in_chains is empty. */
136 static HARD_REG_SET live_hard_regs;
138 /* Set while scanning RTL if INSN_RR is nonnull, i.e. if the current analysis
139 is for a caller that requires operand data. Used in
140 record_operand_use. */
141 static operand_rr_info *cur_operand;
143 /* Return the chain corresponding to id number ID. Take into account that
144 chains may have been merged. */
145 du_head_p
146 regrename_chain_from_id (unsigned int id)
148 du_head_p first_chain = id_to_chain[id];
149 du_head_p chain = first_chain;
150 while (chain->id != id)
152 id = chain->id;
153 chain = id_to_chain[id];
155 first_chain->id = id;
156 return chain;
159 /* Dump all def/use chains, starting at id FROM. */
161 static void
162 dump_def_use_chain (int from)
164 du_head_p head;
165 int i;
166 FOR_EACH_VEC_ELT_FROM (id_to_chain, i, head, from)
168 struct du_chain *this_du = head->first;
170 fprintf (dump_file, "Register %s (%d):",
171 reg_names[head->regno], head->nregs);
172 while (this_du)
174 fprintf (dump_file, " %d [%s]", INSN_UID (this_du->insn),
175 reg_class_names[this_du->cl]);
176 this_du = this_du->next_use;
178 fprintf (dump_file, "\n");
179 head = head->next_chain;
183 static void
184 free_chain_data (void)
186 int i;
187 du_head_p ptr;
188 for (i = 0; id_to_chain.iterate (i, &ptr); i++)
189 bitmap_clear (&ptr->conflicts);
191 id_to_chain.release ();
194 /* Walk all chains starting with CHAINS and record that they conflict with
195 another chain whose id is ID. */
197 static void
198 mark_conflict (struct du_head *chains, unsigned id)
200 while (chains)
202 bitmap_set_bit (&chains->conflicts, id);
203 chains = chains->next_chain;
207 /* Examine cur_operand, and if it is nonnull, record information about the
208 use THIS_DU which is part of the chain HEAD. */
210 static void
211 record_operand_use (struct du_head *head, struct du_chain *this_du)
213 if (cur_operand == NULL)
214 return;
215 gcc_assert (cur_operand->n_chains < MAX_REGS_PER_ADDRESS);
216 cur_operand->heads[cur_operand->n_chains] = head;
217 cur_operand->chains[cur_operand->n_chains++] = this_du;
220 /* Create a new chain for THIS_NREGS registers starting at THIS_REGNO,
221 and record its occurrence in *LOC, which is being written to in INSN.
222 This access requires a register of class CL. */
224 static du_head_p
225 create_new_chain (unsigned this_regno, unsigned this_nregs, rtx *loc,
226 rtx_insn *insn, enum reg_class cl)
228 struct du_head *head = XOBNEW (&rename_obstack, struct du_head);
229 struct du_chain *this_du;
230 int nregs;
232 head->next_chain = open_chains;
233 head->regno = this_regno;
234 head->nregs = this_nregs;
235 head->need_caller_save_reg = 0;
236 head->cannot_rename = 0;
238 id_to_chain.safe_push (head);
239 head->id = current_id++;
241 bitmap_initialize (&head->conflicts, &bitmap_default_obstack);
242 bitmap_copy (&head->conflicts, &open_chains_set);
243 mark_conflict (open_chains, head->id);
245 /* Since we're tracking this as a chain now, remove it from the
246 list of conflicting live hard registers and track it in
247 live_in_chains instead. */
248 nregs = head->nregs;
249 while (nregs-- > 0)
251 SET_HARD_REG_BIT (live_in_chains, head->regno + nregs);
252 CLEAR_HARD_REG_BIT (live_hard_regs, head->regno + nregs);
255 COPY_HARD_REG_SET (head->hard_conflicts, live_hard_regs);
256 bitmap_set_bit (&open_chains_set, head->id);
258 open_chains = head;
260 if (dump_file)
262 fprintf (dump_file, "Creating chain %s (%d)",
263 reg_names[head->regno], head->id);
264 if (insn != NULL_RTX)
265 fprintf (dump_file, " at insn %d", INSN_UID (insn));
266 fprintf (dump_file, "\n");
269 if (insn == NULL_RTX)
271 head->first = head->last = NULL;
272 return head;
275 this_du = XOBNEW (&rename_obstack, struct du_chain);
276 head->first = head->last = this_du;
278 this_du->next_use = 0;
279 this_du->loc = loc;
280 this_du->insn = insn;
281 this_du->cl = cl;
282 record_operand_use (head, this_du);
283 return head;
286 /* For a def-use chain HEAD, find which registers overlap its lifetime and
287 set the corresponding bits in *PSET. */
289 static void
290 merge_overlapping_regs (HARD_REG_SET *pset, struct du_head *head)
292 bitmap_iterator bi;
293 unsigned i;
294 IOR_HARD_REG_SET (*pset, head->hard_conflicts);
295 EXECUTE_IF_SET_IN_BITMAP (&head->conflicts, 0, i, bi)
297 du_head_p other = regrename_chain_from_id (i);
298 unsigned j = other->nregs;
299 gcc_assert (other != head);
300 while (j-- > 0)
301 SET_HARD_REG_BIT (*pset, other->regno + j);
305 /* Check if NEW_REG can be the candidate register to rename for
306 REG in THIS_HEAD chain. THIS_UNAVAILABLE is a set of unavailable hard
307 registers. */
309 static bool
310 check_new_reg_p (int reg ATTRIBUTE_UNUSED, int new_reg,
311 struct du_head *this_head, HARD_REG_SET this_unavailable)
313 machine_mode mode = GET_MODE (*this_head->first->loc);
314 int nregs = hard_regno_nregs[new_reg][mode];
315 int i;
316 struct du_chain *tmp;
318 for (i = nregs - 1; i >= 0; --i)
319 if (TEST_HARD_REG_BIT (this_unavailable, new_reg + i)
320 || fixed_regs[new_reg + i]
321 || global_regs[new_reg + i]
322 /* Can't use regs which aren't saved by the prologue. */
323 || (! df_regs_ever_live_p (new_reg + i)
324 && ! call_used_regs[new_reg + i])
325 #ifdef LEAF_REGISTERS
326 /* We can't use a non-leaf register if we're in a
327 leaf function. */
328 || (crtl->is_leaf
329 && !LEAF_REGISTERS[new_reg + i])
330 #endif
331 || ! HARD_REGNO_RENAME_OK (reg + i, new_reg + i))
332 return false;
334 /* See whether it accepts all modes that occur in
335 definition and uses. */
336 for (tmp = this_head->first; tmp; tmp = tmp->next_use)
337 if ((! HARD_REGNO_MODE_OK (new_reg, GET_MODE (*tmp->loc))
338 && ! DEBUG_INSN_P (tmp->insn))
339 || (this_head->need_caller_save_reg
340 && ! (HARD_REGNO_CALL_PART_CLOBBERED
341 (reg, GET_MODE (*tmp->loc)))
342 && (HARD_REGNO_CALL_PART_CLOBBERED
343 (new_reg, GET_MODE (*tmp->loc)))))
344 return false;
346 return true;
349 /* For the chain THIS_HEAD, compute and return the best register to
350 rename to. SUPER_CLASS is the superunion of register classes in
351 the chain. UNAVAILABLE is a set of registers that cannot be used.
352 OLD_REG is the register currently used for the chain. BEST_RENAME
353 controls whether the register chosen must be better than the
354 current one or just respect the given constraint. */
357 find_rename_reg (du_head_p this_head, enum reg_class super_class,
358 HARD_REG_SET *unavailable, int old_reg, bool best_rename)
360 bool has_preferred_class;
361 enum reg_class preferred_class;
362 int pass;
363 int best_new_reg = old_reg;
365 /* Further narrow the set of registers we can use for renaming.
366 If the chain needs a call-saved register, mark the call-used
367 registers as unavailable. */
368 if (this_head->need_caller_save_reg)
369 IOR_HARD_REG_SET (*unavailable, call_used_reg_set);
371 /* Mark registers that overlap this chain's lifetime as unavailable. */
372 merge_overlapping_regs (unavailable, this_head);
374 /* Compute preferred rename class of super union of all the classes
375 in the chain. */
376 preferred_class
377 = (enum reg_class) targetm.preferred_rename_class (super_class);
379 /* If PREFERRED_CLASS is not NO_REGS, we iterate in the first pass
380 over registers that belong to PREFERRED_CLASS and try to find the
381 best register within the class. If that failed, we iterate in
382 the second pass over registers that don't belong to the class.
383 If PREFERRED_CLASS is NO_REGS, we iterate over all registers in
384 ascending order without any preference. */
385 has_preferred_class = (preferred_class != NO_REGS);
386 for (pass = (has_preferred_class ? 0 : 1); pass < 2; pass++)
388 int new_reg;
389 for (new_reg = 0; new_reg < FIRST_PSEUDO_REGISTER; new_reg++)
391 if (has_preferred_class
392 && (pass == 0)
393 != TEST_HARD_REG_BIT (reg_class_contents[preferred_class],
394 new_reg))
395 continue;
397 if (!check_new_reg_p (old_reg, new_reg, this_head, *unavailable))
398 continue;
400 if (!best_rename)
401 return new_reg;
403 /* In the first pass, we force the renaming of registers that
404 don't belong to PREFERRED_CLASS to registers that do, even
405 though the latters were used not very long ago. */
406 if ((pass == 0
407 && !TEST_HARD_REG_BIT (reg_class_contents[preferred_class],
408 best_new_reg))
409 || tick[best_new_reg] > tick[new_reg])
410 best_new_reg = new_reg;
412 if (pass == 0 && best_new_reg != old_reg)
413 break;
415 return best_new_reg;
418 /* Perform register renaming on the current function. */
419 static void
420 rename_chains (void)
422 HARD_REG_SET unavailable;
423 du_head_p this_head;
424 int i;
426 memset (tick, 0, sizeof tick);
428 CLEAR_HARD_REG_SET (unavailable);
429 /* Don't clobber traceback for noreturn functions. */
430 if (frame_pointer_needed)
432 add_to_hard_reg_set (&unavailable, Pmode, FRAME_POINTER_REGNUM);
433 if (!HARD_FRAME_POINTER_IS_FRAME_POINTER)
434 add_to_hard_reg_set (&unavailable, Pmode, HARD_FRAME_POINTER_REGNUM);
437 FOR_EACH_VEC_ELT (id_to_chain, i, this_head)
439 int best_new_reg;
440 int n_uses;
441 struct du_chain *tmp;
442 HARD_REG_SET this_unavailable;
443 int reg = this_head->regno;
444 enum reg_class super_class = NO_REGS;
446 if (this_head->cannot_rename)
447 continue;
449 if (fixed_regs[reg] || global_regs[reg]
450 #if !HARD_FRAME_POINTER_IS_FRAME_POINTER
451 || (frame_pointer_needed && reg == HARD_FRAME_POINTER_REGNUM)
452 #else
453 || (frame_pointer_needed && reg == FRAME_POINTER_REGNUM)
454 #endif
456 continue;
458 COPY_HARD_REG_SET (this_unavailable, unavailable);
460 /* Iterate over elements in the chain in order to:
461 1. Count number of uses, and narrow the set of registers we can
462 use for renaming.
463 2. Compute the superunion of register classes in this chain. */
464 n_uses = 0;
465 super_class = NO_REGS;
466 for (tmp = this_head->first; tmp; tmp = tmp->next_use)
468 if (DEBUG_INSN_P (tmp->insn))
469 continue;
470 n_uses++;
471 IOR_COMPL_HARD_REG_SET (this_unavailable,
472 reg_class_contents[tmp->cl]);
473 super_class
474 = reg_class_superunion[(int) super_class][(int) tmp->cl];
477 if (n_uses < 2)
478 continue;
480 best_new_reg = find_rename_reg (this_head, super_class,
481 &this_unavailable, reg, true);
483 if (dump_file)
485 fprintf (dump_file, "Register %s in insn %d",
486 reg_names[reg], INSN_UID (this_head->first->insn));
487 if (this_head->need_caller_save_reg)
488 fprintf (dump_file, " crosses a call");
491 if (best_new_reg == reg)
493 tick[reg] = ++this_tick;
494 if (dump_file)
495 fprintf (dump_file, "; no available better choice\n");
496 continue;
499 if (regrename_do_replace (this_head, best_new_reg))
501 if (dump_file)
502 fprintf (dump_file, ", renamed as %s\n", reg_names[best_new_reg]);
503 tick[best_new_reg] = ++this_tick;
504 df_set_regs_ever_live (best_new_reg, true);
506 else
508 if (dump_file)
509 fprintf (dump_file, ", renaming as %s failed\n",
510 reg_names[best_new_reg]);
511 tick[reg] = ++this_tick;
516 /* A structure to record information for each hard register at the start of
517 a basic block. */
518 struct incoming_reg_info {
519 /* Holds the number of registers used in the chain that gave us information
520 about this register. Zero means no information known yet, while a
521 negative value is used for something that is part of, but not the first
522 register in a multi-register value. */
523 int nregs;
524 /* Set to true if we have accesses that conflict in the number of registers
525 used. */
526 bool unusable;
529 /* A structure recording information about each basic block. It is saved
530 and restored around basic block boundaries.
531 A pointer to such a structure is stored in each basic block's aux field
532 during regrename_analyze, except for blocks we know can't be optimized
533 (such as entry and exit blocks). */
534 struct bb_rename_info
536 /* The basic block corresponding to this structure. */
537 basic_block bb;
538 /* Copies of the global information. */
539 bitmap_head open_chains_set;
540 bitmap_head incoming_open_chains_set;
541 struct incoming_reg_info incoming[FIRST_PSEUDO_REGISTER];
544 /* Initialize a rename_info structure P for basic block BB, which starts a new
545 scan. */
546 static void
547 init_rename_info (struct bb_rename_info *p, basic_block bb)
549 int i;
550 df_ref def;
551 HARD_REG_SET start_chains_set;
553 p->bb = bb;
554 bitmap_initialize (&p->open_chains_set, &bitmap_default_obstack);
555 bitmap_initialize (&p->incoming_open_chains_set, &bitmap_default_obstack);
557 open_chains = NULL;
558 bitmap_clear (&open_chains_set);
560 CLEAR_HARD_REG_SET (live_in_chains);
561 REG_SET_TO_HARD_REG_SET (live_hard_regs, df_get_live_in (bb));
562 FOR_EACH_ARTIFICIAL_DEF (def, bb->index)
563 if (DF_REF_FLAGS (def) & DF_REF_AT_TOP)
564 SET_HARD_REG_BIT (live_hard_regs, DF_REF_REGNO (def));
566 /* Open chains based on information from (at least one) predecessor
567 block. This gives us a chance later on to combine chains across
568 basic block boundaries. Inconsistencies (in access sizes) will
569 be caught normally and dealt with conservatively by disabling the
570 chain for renaming, and there is no risk of losing optimization
571 opportunities by opening chains either: if we did not open the
572 chains, we'd have to track the live register as a hard reg, and
573 we'd be unable to rename it in any case. */
574 CLEAR_HARD_REG_SET (start_chains_set);
575 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
577 struct incoming_reg_info *iri = p->incoming + i;
578 if (iri->nregs > 0 && !iri->unusable
579 && range_in_hard_reg_set_p (live_hard_regs, i, iri->nregs))
581 SET_HARD_REG_BIT (start_chains_set, i);
582 remove_range_from_hard_reg_set (&live_hard_regs, i, iri->nregs);
585 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
587 struct incoming_reg_info *iri = p->incoming + i;
588 if (TEST_HARD_REG_BIT (start_chains_set, i))
590 du_head_p chain;
591 if (dump_file)
592 fprintf (dump_file, "opening incoming chain\n");
593 chain = create_new_chain (i, iri->nregs, NULL, NULL, NO_REGS);
594 bitmap_set_bit (&p->incoming_open_chains_set, chain->id);
599 /* Record in RI that the block corresponding to it has an incoming
600 live value, described by CHAIN. */
601 static void
602 set_incoming_from_chain (struct bb_rename_info *ri, du_head_p chain)
604 int i;
605 int incoming_nregs = ri->incoming[chain->regno].nregs;
606 int nregs;
608 /* If we've recorded the same information before, everything is fine. */
609 if (incoming_nregs == chain->nregs)
611 if (dump_file)
612 fprintf (dump_file, "reg %d/%d already recorded\n",
613 chain->regno, chain->nregs);
614 return;
617 /* If we have no information for any of the involved registers, update
618 the incoming array. */
619 nregs = chain->nregs;
620 while (nregs-- > 0)
621 if (ri->incoming[chain->regno + nregs].nregs != 0
622 || ri->incoming[chain->regno + nregs].unusable)
623 break;
624 if (nregs < 0)
626 nregs = chain->nregs;
627 ri->incoming[chain->regno].nregs = nregs;
628 while (nregs-- > 1)
629 ri->incoming[chain->regno + nregs].nregs = -nregs;
630 if (dump_file)
631 fprintf (dump_file, "recorded reg %d/%d\n",
632 chain->regno, chain->nregs);
633 return;
636 /* There must be some kind of conflict. Prevent both the old and
637 new ranges from being used. */
638 if (incoming_nregs < 0)
639 ri->incoming[chain->regno + incoming_nregs].unusable = true;
640 for (i = 0; i < chain->nregs; i++)
641 ri->incoming[chain->regno + i].unusable = true;
644 /* Merge the two chains C1 and C2 so that all conflict information is
645 recorded and C1, and the id of C2 is changed to that of C1. */
646 static void
647 merge_chains (du_head_p c1, du_head_p c2)
649 if (c1 == c2)
650 return;
652 if (c2->first != NULL)
654 if (c1->first == NULL)
655 c1->first = c2->first;
656 else
657 c1->last->next_use = c2->first;
658 c1->last = c2->last;
661 c2->first = c2->last = NULL;
662 c2->id = c1->id;
664 IOR_HARD_REG_SET (c1->hard_conflicts, c2->hard_conflicts);
665 bitmap_ior_into (&c1->conflicts, &c2->conflicts);
667 c1->need_caller_save_reg |= c2->need_caller_save_reg;
668 c1->cannot_rename |= c2->cannot_rename;
671 /* Analyze the current function and build chains for renaming. */
673 void
674 regrename_analyze (bitmap bb_mask)
676 struct bb_rename_info *rename_info;
677 int i;
678 basic_block bb;
679 int n_bbs;
680 int *inverse_postorder;
682 inverse_postorder = XNEWVEC (int, last_basic_block_for_fn (cfun));
683 n_bbs = pre_and_rev_post_order_compute (NULL, inverse_postorder, false);
685 /* Gather some information about the blocks in this function. */
686 rename_info = XCNEWVEC (struct bb_rename_info, n_basic_blocks_for_fn (cfun));
687 i = 0;
688 FOR_EACH_BB_FN (bb, cfun)
690 struct bb_rename_info *ri = rename_info + i;
691 ri->bb = bb;
692 if (bb_mask != NULL && !bitmap_bit_p (bb_mask, bb->index))
693 bb->aux = NULL;
694 else
695 bb->aux = ri;
696 i++;
699 current_id = 0;
700 id_to_chain.create (0);
701 bitmap_initialize (&open_chains_set, &bitmap_default_obstack);
703 /* The order in which we visit blocks ensures that whenever
704 possible, we only process a block after at least one of its
705 predecessors, which provides a "seeding" effect to make the logic
706 in set_incoming_from_chain and init_rename_info useful. */
708 for (i = 0; i < n_bbs; i++)
710 basic_block bb1 = BASIC_BLOCK_FOR_FN (cfun, inverse_postorder[i]);
711 struct bb_rename_info *this_info;
712 bool success;
713 edge e;
714 edge_iterator ei;
715 int old_length = id_to_chain.length ();
717 this_info = (struct bb_rename_info *) bb1->aux;
718 if (this_info == NULL)
719 continue;
721 if (dump_file)
722 fprintf (dump_file, "\nprocessing block %d:\n", bb1->index);
724 init_rename_info (this_info, bb1);
726 success = build_def_use (bb1);
727 if (!success)
729 if (dump_file)
730 fprintf (dump_file, "failed\n");
731 bb1->aux = NULL;
732 id_to_chain.truncate (old_length);
733 current_id = old_length;
734 bitmap_clear (&this_info->incoming_open_chains_set);
735 open_chains = NULL;
736 if (insn_rr.exists ())
738 rtx_insn *insn;
739 FOR_BB_INSNS (bb1, insn)
741 insn_rr_info *p = &insn_rr[INSN_UID (insn)];
742 p->op_info = NULL;
745 continue;
748 if (dump_file)
749 dump_def_use_chain (old_length);
750 bitmap_copy (&this_info->open_chains_set, &open_chains_set);
752 /* Add successor blocks to the worklist if necessary, and record
753 data about our own open chains at the end of this block, which
754 will be used to pre-open chains when processing the successors. */
755 FOR_EACH_EDGE (e, ei, bb1->succs)
757 struct bb_rename_info *dest_ri;
758 struct du_head *chain;
760 if (dump_file)
761 fprintf (dump_file, "successor block %d\n", e->dest->index);
763 if (e->flags & (EDGE_EH | EDGE_ABNORMAL))
764 continue;
765 dest_ri = (struct bb_rename_info *)e->dest->aux;
766 if (dest_ri == NULL)
767 continue;
768 for (chain = open_chains; chain; chain = chain->next_chain)
769 set_incoming_from_chain (dest_ri, chain);
773 free (inverse_postorder);
775 /* Now, combine the chains data we have gathered across basic block
776 boundaries.
778 For every basic block, there may be chains open at the start, or at the
779 end. Rather than exclude them from renaming, we look for open chains
780 with matching registers at the other side of the CFG edge.
782 For a given chain using register R, open at the start of block B, we
783 must find an open chain using R on the other side of every edge leading
784 to B, if the register is live across this edge. In the code below,
785 N_PREDS_USED counts the number of edges where the register is live, and
786 N_PREDS_JOINED counts those where we found an appropriate chain for
787 joining.
789 We perform the analysis for both incoming and outgoing edges, but we
790 only need to merge once (in the second part, after verifying outgoing
791 edges). */
792 FOR_EACH_BB_FN (bb, cfun)
794 struct bb_rename_info *bb_ri = (struct bb_rename_info *) bb->aux;
795 unsigned j;
796 bitmap_iterator bi;
798 if (bb_ri == NULL)
799 continue;
801 if (dump_file)
802 fprintf (dump_file, "processing bb %d in edges\n", bb->index);
804 EXECUTE_IF_SET_IN_BITMAP (&bb_ri->incoming_open_chains_set, 0, j, bi)
806 edge e;
807 edge_iterator ei;
808 struct du_head *chain = regrename_chain_from_id (j);
809 int n_preds_used = 0, n_preds_joined = 0;
811 FOR_EACH_EDGE (e, ei, bb->preds)
813 struct bb_rename_info *src_ri;
814 unsigned k;
815 bitmap_iterator bi2;
816 HARD_REG_SET live;
817 bool success = false;
819 REG_SET_TO_HARD_REG_SET (live, df_get_live_out (e->src));
820 if (!range_overlaps_hard_reg_set_p (live, chain->regno,
821 chain->nregs))
822 continue;
823 n_preds_used++;
825 if (e->flags & (EDGE_EH | EDGE_ABNORMAL))
826 continue;
828 src_ri = (struct bb_rename_info *)e->src->aux;
829 if (src_ri == NULL)
830 continue;
832 EXECUTE_IF_SET_IN_BITMAP (&src_ri->open_chains_set,
833 0, k, bi2)
835 struct du_head *outgoing_chain = regrename_chain_from_id (k);
837 if (outgoing_chain->regno == chain->regno
838 && outgoing_chain->nregs == chain->nregs)
840 n_preds_joined++;
841 success = true;
842 break;
845 if (!success && dump_file)
846 fprintf (dump_file, "failure to match with pred block %d\n",
847 e->src->index);
849 if (n_preds_joined < n_preds_used)
851 if (dump_file)
852 fprintf (dump_file, "cannot rename chain %d\n", j);
853 chain->cannot_rename = 1;
857 FOR_EACH_BB_FN (bb, cfun)
859 struct bb_rename_info *bb_ri = (struct bb_rename_info *) bb->aux;
860 unsigned j;
861 bitmap_iterator bi;
863 if (bb_ri == NULL)
864 continue;
866 if (dump_file)
867 fprintf (dump_file, "processing bb %d out edges\n", bb->index);
869 EXECUTE_IF_SET_IN_BITMAP (&bb_ri->open_chains_set, 0, j, bi)
871 edge e;
872 edge_iterator ei;
873 struct du_head *chain = regrename_chain_from_id (j);
874 int n_succs_used = 0, n_succs_joined = 0;
876 FOR_EACH_EDGE (e, ei, bb->succs)
878 bool printed = false;
879 struct bb_rename_info *dest_ri;
880 unsigned k;
881 bitmap_iterator bi2;
882 HARD_REG_SET live;
884 REG_SET_TO_HARD_REG_SET (live, df_get_live_in (e->dest));
885 if (!range_overlaps_hard_reg_set_p (live, chain->regno,
886 chain->nregs))
887 continue;
889 n_succs_used++;
891 dest_ri = (struct bb_rename_info *)e->dest->aux;
892 if (dest_ri == NULL)
893 continue;
895 EXECUTE_IF_SET_IN_BITMAP (&dest_ri->incoming_open_chains_set,
896 0, k, bi2)
898 struct du_head *incoming_chain = regrename_chain_from_id (k);
900 if (incoming_chain->regno == chain->regno
901 && incoming_chain->nregs == chain->nregs)
903 if (dump_file)
905 if (!printed)
906 fprintf (dump_file,
907 "merging blocks for edge %d -> %d\n",
908 e->src->index, e->dest->index);
909 printed = true;
910 fprintf (dump_file,
911 " merging chains %d (->%d) and %d (->%d) [%s]\n",
912 k, incoming_chain->id, j, chain->id,
913 reg_names[incoming_chain->regno]);
916 merge_chains (chain, incoming_chain);
917 n_succs_joined++;
918 break;
922 if (n_succs_joined < n_succs_used)
924 if (dump_file)
925 fprintf (dump_file, "cannot rename chain %d\n",
927 chain->cannot_rename = 1;
932 free (rename_info);
934 FOR_EACH_BB_FN (bb, cfun)
935 bb->aux = NULL;
938 /* Attempt to replace all uses of the register in the chain beginning with
939 HEAD with REG. Returns true on success and false if the replacement is
940 rejected because the insns would not validate. The latter can happen
941 e.g. if a match_parallel predicate enforces restrictions on register
942 numbering in its subpatterns. */
944 bool
945 regrename_do_replace (struct du_head *head, int reg)
947 struct du_chain *chain;
948 unsigned int base_regno = head->regno;
949 machine_mode mode;
951 for (chain = head->first; chain; chain = chain->next_use)
953 unsigned int regno = ORIGINAL_REGNO (*chain->loc);
954 struct reg_attrs *attr = REG_ATTRS (*chain->loc);
955 int reg_ptr = REG_POINTER (*chain->loc);
957 if (DEBUG_INSN_P (chain->insn) && REGNO (*chain->loc) != base_regno)
958 validate_change (chain->insn, &(INSN_VAR_LOCATION_LOC (chain->insn)),
959 gen_rtx_UNKNOWN_VAR_LOC (), true);
960 else
962 validate_change (chain->insn, chain->loc,
963 gen_raw_REG (GET_MODE (*chain->loc), reg), true);
964 if (regno >= FIRST_PSEUDO_REGISTER)
965 ORIGINAL_REGNO (*chain->loc) = regno;
966 REG_ATTRS (*chain->loc) = attr;
967 REG_POINTER (*chain->loc) = reg_ptr;
971 if (!apply_change_group ())
972 return false;
974 mode = GET_MODE (*head->first->loc);
975 head->regno = reg;
976 head->nregs = hard_regno_nregs[reg][mode];
977 return true;
981 /* True if we found a register with a size mismatch, which means that we
982 can't track its lifetime accurately. If so, we abort the current block
983 without renaming. */
984 static bool fail_current_block;
986 /* Return true if OP is a reg for which all bits are set in PSET, false
987 if all bits are clear.
988 In other cases, set fail_current_block and return false. */
990 static bool
991 verify_reg_in_set (rtx op, HARD_REG_SET *pset)
993 unsigned regno, nregs;
994 bool all_live, all_dead;
995 if (!REG_P (op))
996 return false;
998 regno = REGNO (op);
999 nregs = REG_NREGS (op);
1000 all_live = all_dead = true;
1001 while (nregs-- > 0)
1002 if (TEST_HARD_REG_BIT (*pset, regno + nregs))
1003 all_dead = false;
1004 else
1005 all_live = false;
1006 if (!all_dead && !all_live)
1008 fail_current_block = true;
1009 return false;
1011 return all_live;
1014 /* Return true if OP is a reg that is being tracked already in some form.
1015 May set fail_current_block if it sees an unhandled case of overlap. */
1017 static bool
1018 verify_reg_tracked (rtx op)
1020 return (verify_reg_in_set (op, &live_hard_regs)
1021 || verify_reg_in_set (op, &live_in_chains));
1024 /* Called through note_stores. DATA points to a rtx_code, either SET or
1025 CLOBBER, which tells us which kind of rtx to look at. If we have a
1026 match, record the set register in live_hard_regs and in the hard_conflicts
1027 bitmap of open chains. */
1029 static void
1030 note_sets_clobbers (rtx x, const_rtx set, void *data)
1032 enum rtx_code code = *(enum rtx_code *)data;
1033 struct du_head *chain;
1035 if (GET_CODE (x) == SUBREG)
1036 x = SUBREG_REG (x);
1037 if (!REG_P (x) || GET_CODE (set) != code)
1038 return;
1039 /* There must not be pseudos at this point. */
1040 gcc_assert (HARD_REGISTER_P (x));
1041 add_to_hard_reg_set (&live_hard_regs, GET_MODE (x), REGNO (x));
1042 for (chain = open_chains; chain; chain = chain->next_chain)
1043 add_to_hard_reg_set (&chain->hard_conflicts, GET_MODE (x), REGNO (x));
1046 static void
1047 scan_rtx_reg (rtx_insn *insn, rtx *loc, enum reg_class cl, enum scan_actions action,
1048 enum op_type type)
1050 struct du_head **p;
1051 rtx x = *loc;
1052 unsigned this_regno = REGNO (x);
1053 int this_nregs = REG_NREGS (x);
1055 if (action == mark_write)
1057 if (type == OP_OUT)
1058 create_new_chain (this_regno, this_nregs, loc, insn, cl);
1059 return;
1062 if ((type == OP_OUT) != (action == terminate_write || action == mark_access))
1063 return;
1065 for (p = &open_chains; *p;)
1067 struct du_head *head = *p;
1068 struct du_head *next = head->next_chain;
1069 int exact_match = (head->regno == this_regno
1070 && head->nregs == this_nregs);
1071 int superset = (this_regno <= head->regno
1072 && this_regno + this_nregs >= head->regno + head->nregs);
1073 int subset = (this_regno >= head->regno
1074 && this_regno + this_nregs <= head->regno + head->nregs);
1076 if (!bitmap_bit_p (&open_chains_set, head->id)
1077 || head->regno + head->nregs <= this_regno
1078 || this_regno + this_nregs <= head->regno)
1080 p = &head->next_chain;
1081 continue;
1084 if (action == mark_read || action == mark_access)
1086 /* ??? Class NO_REGS can happen if the md file makes use of
1087 EXTRA_CONSTRAINTS to match registers. Which is arguably
1088 wrong, but there we are. */
1090 if (cl == NO_REGS || (!exact_match && !DEBUG_INSN_P (insn)))
1092 if (dump_file)
1093 fprintf (dump_file,
1094 "Cannot rename chain %s (%d) at insn %d (%s)\n",
1095 reg_names[head->regno], head->id, INSN_UID (insn),
1096 scan_actions_name[(int) action]);
1097 head->cannot_rename = 1;
1098 if (superset)
1100 unsigned nregs = this_nregs;
1101 head->regno = this_regno;
1102 head->nregs = this_nregs;
1103 while (nregs-- > 0)
1104 SET_HARD_REG_BIT (live_in_chains, head->regno + nregs);
1105 if (dump_file)
1106 fprintf (dump_file,
1107 "Widening register in chain %s (%d) at insn %d\n",
1108 reg_names[head->regno], head->id, INSN_UID (insn));
1110 else if (!subset)
1112 fail_current_block = true;
1113 if (dump_file)
1114 fprintf (dump_file,
1115 "Failing basic block due to unhandled overlap\n");
1118 else
1120 struct du_chain *this_du;
1121 this_du = XOBNEW (&rename_obstack, struct du_chain);
1122 this_du->next_use = 0;
1123 this_du->loc = loc;
1124 this_du->insn = insn;
1125 this_du->cl = cl;
1126 if (head->first == NULL)
1127 head->first = this_du;
1128 else
1129 head->last->next_use = this_du;
1130 record_operand_use (head, this_du);
1131 head->last = this_du;
1133 /* Avoid adding the same location in a DEBUG_INSN multiple times,
1134 which could happen with non-exact overlap. */
1135 if (DEBUG_INSN_P (insn))
1136 return;
1137 /* Otherwise, find any other chains that do not match exactly;
1138 ensure they all get marked unrenamable. */
1139 p = &head->next_chain;
1140 continue;
1143 /* Whether the terminated chain can be used for renaming
1144 depends on the action and this being an exact match.
1145 In either case, we remove this element from open_chains. */
1147 if ((action == terminate_dead || action == terminate_write)
1148 && (superset || subset))
1150 unsigned nregs;
1152 if (subset && !superset)
1153 head->cannot_rename = 1;
1154 bitmap_clear_bit (&open_chains_set, head->id);
1156 nregs = head->nregs;
1157 while (nregs-- > 0)
1159 CLEAR_HARD_REG_BIT (live_in_chains, head->regno + nregs);
1160 if (subset && !superset
1161 && (head->regno + nregs < this_regno
1162 || head->regno + nregs >= this_regno + this_nregs))
1163 SET_HARD_REG_BIT (live_hard_regs, head->regno + nregs);
1166 *p = next;
1167 if (dump_file)
1168 fprintf (dump_file,
1169 "Closing chain %s (%d) at insn %d (%s%s)\n",
1170 reg_names[head->regno], head->id, INSN_UID (insn),
1171 scan_actions_name[(int) action],
1172 superset ? ", superset" : subset ? ", subset" : "");
1174 else if (action == terminate_dead || action == terminate_write)
1176 /* In this case, tracking liveness gets too hard. Fail the
1177 entire basic block. */
1178 if (dump_file)
1179 fprintf (dump_file,
1180 "Failing basic block due to unhandled overlap\n");
1181 fail_current_block = true;
1182 return;
1184 else
1186 head->cannot_rename = 1;
1187 if (dump_file)
1188 fprintf (dump_file,
1189 "Cannot rename chain %s (%d) at insn %d (%s)\n",
1190 reg_names[head->regno], head->id, INSN_UID (insn),
1191 scan_actions_name[(int) action]);
1192 p = &head->next_chain;
1197 /* Adapted from find_reloads_address_1. CL is INDEX_REG_CLASS or
1198 BASE_REG_CLASS depending on how the register is being considered. */
1200 static void
1201 scan_rtx_address (rtx_insn *insn, rtx *loc, enum reg_class cl,
1202 enum scan_actions action, machine_mode mode,
1203 addr_space_t as)
1205 rtx x = *loc;
1206 RTX_CODE code = GET_CODE (x);
1207 const char *fmt;
1208 int i, j;
1210 if (action == mark_write || action == mark_access)
1211 return;
1213 switch (code)
1215 case PLUS:
1217 rtx orig_op0 = XEXP (x, 0);
1218 rtx orig_op1 = XEXP (x, 1);
1219 RTX_CODE code0 = GET_CODE (orig_op0);
1220 RTX_CODE code1 = GET_CODE (orig_op1);
1221 rtx op0 = orig_op0;
1222 rtx op1 = orig_op1;
1223 rtx *locI = NULL;
1224 rtx *locB = NULL;
1225 enum rtx_code index_code = SCRATCH;
1227 if (GET_CODE (op0) == SUBREG)
1229 op0 = SUBREG_REG (op0);
1230 code0 = GET_CODE (op0);
1233 if (GET_CODE (op1) == SUBREG)
1235 op1 = SUBREG_REG (op1);
1236 code1 = GET_CODE (op1);
1239 if (code0 == MULT || code0 == SIGN_EXTEND || code0 == TRUNCATE
1240 || code0 == ZERO_EXTEND || code1 == MEM)
1242 locI = &XEXP (x, 0);
1243 locB = &XEXP (x, 1);
1244 index_code = GET_CODE (*locI);
1246 else if (code1 == MULT || code1 == SIGN_EXTEND || code1 == TRUNCATE
1247 || code1 == ZERO_EXTEND || code0 == MEM)
1249 locI = &XEXP (x, 1);
1250 locB = &XEXP (x, 0);
1251 index_code = GET_CODE (*locI);
1253 else if (code0 == CONST_INT || code0 == CONST
1254 || code0 == SYMBOL_REF || code0 == LABEL_REF)
1256 locB = &XEXP (x, 1);
1257 index_code = GET_CODE (XEXP (x, 0));
1259 else if (code1 == CONST_INT || code1 == CONST
1260 || code1 == SYMBOL_REF || code1 == LABEL_REF)
1262 locB = &XEXP (x, 0);
1263 index_code = GET_CODE (XEXP (x, 1));
1265 else if (code0 == REG && code1 == REG)
1267 int index_op;
1268 unsigned regno0 = REGNO (op0), regno1 = REGNO (op1);
1270 if (REGNO_OK_FOR_INDEX_P (regno1)
1271 && regno_ok_for_base_p (regno0, mode, as, PLUS, REG))
1272 index_op = 1;
1273 else if (REGNO_OK_FOR_INDEX_P (regno0)
1274 && regno_ok_for_base_p (regno1, mode, as, PLUS, REG))
1275 index_op = 0;
1276 else if (regno_ok_for_base_p (regno0, mode, as, PLUS, REG)
1277 || REGNO_OK_FOR_INDEX_P (regno1))
1278 index_op = 1;
1279 else if (regno_ok_for_base_p (regno1, mode, as, PLUS, REG))
1280 index_op = 0;
1281 else
1282 index_op = 1;
1284 locI = &XEXP (x, index_op);
1285 locB = &XEXP (x, !index_op);
1286 index_code = GET_CODE (*locI);
1288 else if (code0 == REG)
1290 locI = &XEXP (x, 0);
1291 locB = &XEXP (x, 1);
1292 index_code = GET_CODE (*locI);
1294 else if (code1 == REG)
1296 locI = &XEXP (x, 1);
1297 locB = &XEXP (x, 0);
1298 index_code = GET_CODE (*locI);
1301 if (locI)
1302 scan_rtx_address (insn, locI, INDEX_REG_CLASS, action, mode, as);
1303 if (locB)
1304 scan_rtx_address (insn, locB,
1305 base_reg_class (mode, as, PLUS, index_code),
1306 action, mode, as);
1308 return;
1311 case POST_INC:
1312 case POST_DEC:
1313 case POST_MODIFY:
1314 case PRE_INC:
1315 case PRE_DEC:
1316 case PRE_MODIFY:
1317 #ifndef AUTO_INC_DEC
1318 /* If the target doesn't claim to handle autoinc, this must be
1319 something special, like a stack push. Kill this chain. */
1320 action = mark_all_read;
1321 #endif
1322 break;
1324 case MEM:
1325 scan_rtx_address (insn, &XEXP (x, 0),
1326 base_reg_class (GET_MODE (x), MEM_ADDR_SPACE (x),
1327 MEM, SCRATCH),
1328 action, GET_MODE (x), MEM_ADDR_SPACE (x));
1329 return;
1331 case REG:
1332 scan_rtx_reg (insn, loc, cl, action, OP_IN);
1333 return;
1335 default:
1336 break;
1339 fmt = GET_RTX_FORMAT (code);
1340 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1342 if (fmt[i] == 'e')
1343 scan_rtx_address (insn, &XEXP (x, i), cl, action, mode, as);
1344 else if (fmt[i] == 'E')
1345 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
1346 scan_rtx_address (insn, &XVECEXP (x, i, j), cl, action, mode, as);
1350 static void
1351 scan_rtx (rtx_insn *insn, rtx *loc, enum reg_class cl, enum scan_actions action,
1352 enum op_type type)
1354 const char *fmt;
1355 rtx x = *loc;
1356 enum rtx_code code = GET_CODE (x);
1357 int i, j;
1359 code = GET_CODE (x);
1360 switch (code)
1362 case CONST:
1363 CASE_CONST_ANY:
1364 case SYMBOL_REF:
1365 case LABEL_REF:
1366 case CC0:
1367 case PC:
1368 return;
1370 case REG:
1371 scan_rtx_reg (insn, loc, cl, action, type);
1372 return;
1374 case MEM:
1375 scan_rtx_address (insn, &XEXP (x, 0),
1376 base_reg_class (GET_MODE (x), MEM_ADDR_SPACE (x),
1377 MEM, SCRATCH),
1378 action, GET_MODE (x), MEM_ADDR_SPACE (x));
1379 return;
1381 case SET:
1382 scan_rtx (insn, &SET_SRC (x), cl, action, OP_IN);
1383 scan_rtx (insn, &SET_DEST (x), cl, action,
1384 (GET_CODE (PATTERN (insn)) == COND_EXEC
1385 && verify_reg_tracked (SET_DEST (x))) ? OP_INOUT : OP_OUT);
1386 return;
1388 case STRICT_LOW_PART:
1389 scan_rtx (insn, &XEXP (x, 0), cl, action,
1390 verify_reg_tracked (XEXP (x, 0)) ? OP_INOUT : OP_OUT);
1391 return;
1393 case ZERO_EXTRACT:
1394 case SIGN_EXTRACT:
1395 scan_rtx (insn, &XEXP (x, 0), cl, action,
1396 (type == OP_IN ? OP_IN :
1397 verify_reg_tracked (XEXP (x, 0)) ? OP_INOUT : OP_OUT));
1398 scan_rtx (insn, &XEXP (x, 1), cl, action, OP_IN);
1399 scan_rtx (insn, &XEXP (x, 2), cl, action, OP_IN);
1400 return;
1402 case POST_INC:
1403 case PRE_INC:
1404 case POST_DEC:
1405 case PRE_DEC:
1406 case POST_MODIFY:
1407 case PRE_MODIFY:
1408 /* Should only happen inside MEM. */
1409 gcc_unreachable ();
1411 case CLOBBER:
1412 scan_rtx (insn, &SET_DEST (x), cl, action,
1413 (GET_CODE (PATTERN (insn)) == COND_EXEC
1414 && verify_reg_tracked (SET_DEST (x))) ? OP_INOUT : OP_OUT);
1415 return;
1417 case EXPR_LIST:
1418 scan_rtx (insn, &XEXP (x, 0), cl, action, type);
1419 if (XEXP (x, 1))
1420 scan_rtx (insn, &XEXP (x, 1), cl, action, type);
1421 return;
1423 default:
1424 break;
1427 fmt = GET_RTX_FORMAT (code);
1428 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1430 if (fmt[i] == 'e')
1431 scan_rtx (insn, &XEXP (x, i), cl, action, type);
1432 else if (fmt[i] == 'E')
1433 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
1434 scan_rtx (insn, &XVECEXP (x, i, j), cl, action, type);
1438 /* Hide operands of the current insn (of which there are N_OPS) by
1439 substituting cc0 for them.
1440 Previous values are stored in the OLD_OPERANDS and OLD_DUPS.
1441 For every bit set in DO_NOT_HIDE, we leave the operand alone.
1442 If INOUT_AND_EC_ONLY is set, we only do this for OP_INOUT type operands
1443 and earlyclobbers. */
1445 static void
1446 hide_operands (int n_ops, rtx *old_operands, rtx *old_dups,
1447 unsigned HOST_WIDE_INT do_not_hide, bool inout_and_ec_only)
1449 int i;
1450 const operand_alternative *op_alt = which_op_alt ();
1451 for (i = 0; i < n_ops; i++)
1453 old_operands[i] = recog_data.operand[i];
1454 /* Don't squash match_operator or match_parallel here, since
1455 we don't know that all of the contained registers are
1456 reachable by proper operands. */
1457 if (recog_data.constraints[i][0] == '\0')
1458 continue;
1459 if (do_not_hide & (1 << i))
1460 continue;
1461 if (!inout_and_ec_only || recog_data.operand_type[i] == OP_INOUT
1462 || op_alt[i].earlyclobber)
1463 *recog_data.operand_loc[i] = cc0_rtx;
1465 for (i = 0; i < recog_data.n_dups; i++)
1467 int opn = recog_data.dup_num[i];
1468 old_dups[i] = *recog_data.dup_loc[i];
1469 if (do_not_hide & (1 << opn))
1470 continue;
1471 if (!inout_and_ec_only || recog_data.operand_type[opn] == OP_INOUT
1472 || op_alt[opn].earlyclobber)
1473 *recog_data.dup_loc[i] = cc0_rtx;
1477 /* Undo the substitution performed by hide_operands. INSN is the insn we
1478 are processing; the arguments are the same as in hide_operands. */
1480 static void
1481 restore_operands (rtx_insn *insn, int n_ops, rtx *old_operands, rtx *old_dups)
1483 int i;
1484 for (i = 0; i < recog_data.n_dups; i++)
1485 *recog_data.dup_loc[i] = old_dups[i];
1486 for (i = 0; i < n_ops; i++)
1487 *recog_data.operand_loc[i] = old_operands[i];
1488 if (recog_data.n_dups)
1489 df_insn_rescan (insn);
1492 /* For each output operand of INSN, call scan_rtx to create a new
1493 open chain. Do this only for normal or earlyclobber outputs,
1494 depending on EARLYCLOBBER. If INSN_INFO is nonnull, use it to
1495 record information about the operands in the insn. */
1497 static void
1498 record_out_operands (rtx_insn *insn, bool earlyclobber, insn_rr_info *insn_info)
1500 int n_ops = recog_data.n_operands;
1501 const operand_alternative *op_alt = which_op_alt ();
1503 int i;
1505 for (i = 0; i < n_ops + recog_data.n_dups; i++)
1507 int opn = i < n_ops ? i : recog_data.dup_num[i - n_ops];
1508 rtx *loc = (i < n_ops
1509 ? recog_data.operand_loc[opn]
1510 : recog_data.dup_loc[i - n_ops]);
1511 rtx op = *loc;
1512 enum reg_class cl = alternative_class (op_alt, opn);
1514 struct du_head *prev_open;
1516 if (recog_data.operand_type[opn] != OP_OUT
1517 || op_alt[opn].earlyclobber != earlyclobber)
1518 continue;
1520 if (insn_info)
1521 cur_operand = insn_info->op_info + i;
1523 prev_open = open_chains;
1524 scan_rtx (insn, loc, cl, mark_write, OP_OUT);
1526 /* ??? Many targets have output constraints on the SET_DEST
1527 of a call insn, which is stupid, since these are certainly
1528 ABI defined hard registers. For these, and for asm operands
1529 that originally referenced hard registers, we must record that
1530 the chain cannot be renamed. */
1531 if (CALL_P (insn)
1532 || (asm_noperands (PATTERN (insn)) > 0
1533 && REG_P (op)
1534 && REGNO (op) == ORIGINAL_REGNO (op)))
1536 if (prev_open != open_chains)
1537 open_chains->cannot_rename = 1;
1540 cur_operand = NULL;
1543 /* Build def/use chain. */
1545 static bool
1546 build_def_use (basic_block bb)
1548 rtx_insn *insn;
1549 unsigned HOST_WIDE_INT untracked_operands;
1551 fail_current_block = false;
1553 for (insn = BB_HEAD (bb); ; insn = NEXT_INSN (insn))
1555 if (NONDEBUG_INSN_P (insn))
1557 int n_ops;
1558 rtx note;
1559 rtx old_operands[MAX_RECOG_OPERANDS];
1560 rtx old_dups[MAX_DUP_OPERANDS];
1561 int i;
1562 int predicated;
1563 enum rtx_code set_code = SET;
1564 enum rtx_code clobber_code = CLOBBER;
1565 insn_rr_info *insn_info = NULL;
1567 /* Process the insn, determining its effect on the def-use
1568 chains and live hard registers. We perform the following
1569 steps with the register references in the insn, simulating
1570 its effect:
1571 (1) Deal with earlyclobber operands and CLOBBERs of non-operands
1572 by creating chains and marking hard regs live.
1573 (2) Any read outside an operand causes any chain it overlaps
1574 with to be marked unrenamable.
1575 (3) Any read inside an operand is added if there's already
1576 an open chain for it.
1577 (4) For any REG_DEAD note we find, close open chains that
1578 overlap it.
1579 (5) For any non-earlyclobber write we find, close open chains
1580 that overlap it.
1581 (6) For any non-earlyclobber write we find in an operand, make
1582 a new chain or mark the hard register as live.
1583 (7) For any REG_UNUSED, close any chains we just opened.
1585 We cannot deal with situations where we track a reg in one mode
1586 and see a reference in another mode; these will cause the chain
1587 to be marked unrenamable or even cause us to abort the entire
1588 basic block. */
1590 extract_constrain_insn (insn);
1591 preprocess_constraints (insn);
1592 const operand_alternative *op_alt = which_op_alt ();
1593 n_ops = recog_data.n_operands;
1594 untracked_operands = 0;
1596 if (insn_rr.exists ())
1598 insn_info = &insn_rr[INSN_UID (insn)];
1599 insn_info->op_info = XOBNEWVEC (&rename_obstack, operand_rr_info,
1600 recog_data.n_operands);
1601 memset (insn_info->op_info, 0,
1602 sizeof (operand_rr_info) * recog_data.n_operands);
1605 /* Simplify the code below by promoting OP_OUT to OP_INOUT in
1606 predicated instructions, but only for register operands
1607 that are already tracked, so that we can create a chain
1608 when the first SET makes a register live. */
1610 predicated = GET_CODE (PATTERN (insn)) == COND_EXEC;
1611 for (i = 0; i < n_ops; ++i)
1613 rtx op = recog_data.operand[i];
1614 int matches = op_alt[i].matches;
1615 if (matches >= 0 || op_alt[i].matched >= 0
1616 || (predicated && recog_data.operand_type[i] == OP_OUT))
1618 recog_data.operand_type[i] = OP_INOUT;
1619 /* A special case to deal with instruction patterns that
1620 have matching operands with different modes. If we're
1621 not already tracking such a reg, we won't start here,
1622 and we must instead make sure to make the operand visible
1623 to the machinery that tracks hard registers. */
1624 if (matches >= 0
1625 && (GET_MODE_SIZE (recog_data.operand_mode[i])
1626 != GET_MODE_SIZE (recog_data.operand_mode[matches]))
1627 && !verify_reg_in_set (op, &live_in_chains))
1629 untracked_operands |= 1 << i;
1630 untracked_operands |= 1 << matches;
1633 /* If there's an in-out operand with a register that is not
1634 being tracked at all yet, open a chain. */
1635 if (recog_data.operand_type[i] == OP_INOUT
1636 && !(untracked_operands & (1 << i))
1637 && REG_P (op)
1638 && !verify_reg_tracked (op))
1639 create_new_chain (REGNO (op), REG_NREGS (op), NULL, NULL,
1640 NO_REGS);
1643 if (fail_current_block)
1644 break;
1646 /* Step 1a: Mark hard registers that are clobbered in this insn,
1647 outside an operand, as live. */
1648 hide_operands (n_ops, old_operands, old_dups, untracked_operands,
1649 false);
1650 note_stores (PATTERN (insn), note_sets_clobbers, &clobber_code);
1651 restore_operands (insn, n_ops, old_operands, old_dups);
1653 /* Step 1b: Begin new chains for earlyclobbered writes inside
1654 operands. */
1655 record_out_operands (insn, true, insn_info);
1657 /* Step 2: Mark chains for which we have reads outside operands
1658 as unrenamable.
1659 We do this by munging all operands into CC0, and closing
1660 everything remaining. */
1662 hide_operands (n_ops, old_operands, old_dups, untracked_operands,
1663 false);
1664 scan_rtx (insn, &PATTERN (insn), NO_REGS, mark_all_read, OP_IN);
1665 restore_operands (insn, n_ops, old_operands, old_dups);
1667 /* Step 2B: Can't rename function call argument registers. */
1668 if (CALL_P (insn) && CALL_INSN_FUNCTION_USAGE (insn))
1669 scan_rtx (insn, &CALL_INSN_FUNCTION_USAGE (insn),
1670 NO_REGS, mark_all_read, OP_IN);
1672 /* Step 2C: Can't rename asm operands that were originally
1673 hard registers. */
1674 if (asm_noperands (PATTERN (insn)) > 0)
1675 for (i = 0; i < n_ops; i++)
1677 rtx *loc = recog_data.operand_loc[i];
1678 rtx op = *loc;
1680 if (REG_P (op)
1681 && REGNO (op) == ORIGINAL_REGNO (op)
1682 && (recog_data.operand_type[i] == OP_IN
1683 || recog_data.operand_type[i] == OP_INOUT))
1684 scan_rtx (insn, loc, NO_REGS, mark_all_read, OP_IN);
1687 /* Step 3: Append to chains for reads inside operands. */
1688 for (i = 0; i < n_ops + recog_data.n_dups; i++)
1690 int opn = i < n_ops ? i : recog_data.dup_num[i - n_ops];
1691 rtx *loc = (i < n_ops
1692 ? recog_data.operand_loc[opn]
1693 : recog_data.dup_loc[i - n_ops]);
1694 enum reg_class cl = alternative_class (op_alt, opn);
1695 enum op_type type = recog_data.operand_type[opn];
1697 /* Don't scan match_operand here, since we've no reg class
1698 information to pass down. Any operands that we could
1699 substitute in will be represented elsewhere. */
1700 if (recog_data.constraints[opn][0] == '\0'
1701 || untracked_operands & (1 << opn))
1702 continue;
1704 if (insn_info)
1705 cur_operand = i == opn ? insn_info->op_info + i : NULL;
1706 if (op_alt[opn].is_address)
1707 scan_rtx_address (insn, loc, cl, mark_read,
1708 VOIDmode, ADDR_SPACE_GENERIC);
1709 else
1710 scan_rtx (insn, loc, cl, mark_read, type);
1712 cur_operand = NULL;
1714 /* Step 3B: Record updates for regs in REG_INC notes, and
1715 source regs in REG_FRAME_RELATED_EXPR notes. */
1716 for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
1717 if (REG_NOTE_KIND (note) == REG_INC
1718 || REG_NOTE_KIND (note) == REG_FRAME_RELATED_EXPR)
1719 scan_rtx (insn, &XEXP (note, 0), ALL_REGS, mark_read,
1720 OP_INOUT);
1722 /* Step 4: Close chains for registers that die here, unless
1723 the register is mentioned in a REG_UNUSED note. In that
1724 case we keep the chain open until step #7 below to ensure
1725 it conflicts with other output operands of this insn.
1726 See PR 52573. Arguably the insn should not have both
1727 notes; it has proven difficult to fix that without
1728 other undesirable side effects. */
1729 for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
1730 if (REG_NOTE_KIND (note) == REG_DEAD
1731 && !find_regno_note (insn, REG_UNUSED, REGNO (XEXP (note, 0))))
1733 remove_from_hard_reg_set (&live_hard_regs,
1734 GET_MODE (XEXP (note, 0)),
1735 REGNO (XEXP (note, 0)));
1736 scan_rtx (insn, &XEXP (note, 0), NO_REGS, terminate_dead,
1737 OP_IN);
1740 /* Step 4B: If this is a call, any chain live at this point
1741 requires a caller-saved reg. */
1742 if (CALL_P (insn))
1744 struct du_head *p;
1745 for (p = open_chains; p; p = p->next_chain)
1746 p->need_caller_save_reg = 1;
1749 /* Step 5: Close open chains that overlap writes. Similar to
1750 step 2, we hide in-out operands, since we do not want to
1751 close these chains. We also hide earlyclobber operands,
1752 since we've opened chains for them in step 1, and earlier
1753 chains they would overlap with must have been closed at
1754 the previous insn at the latest, as such operands cannot
1755 possibly overlap with any input operands. */
1757 hide_operands (n_ops, old_operands, old_dups, untracked_operands,
1758 true);
1759 scan_rtx (insn, &PATTERN (insn), NO_REGS, terminate_write, OP_IN);
1760 restore_operands (insn, n_ops, old_operands, old_dups);
1762 /* Step 6a: Mark hard registers that are set in this insn,
1763 outside an operand, as live. */
1764 hide_operands (n_ops, old_operands, old_dups, untracked_operands,
1765 false);
1766 note_stores (PATTERN (insn), note_sets_clobbers, &set_code);
1767 restore_operands (insn, n_ops, old_operands, old_dups);
1769 /* Step 6b: Begin new chains for writes inside operands. */
1770 record_out_operands (insn, false, insn_info);
1772 /* Step 6c: Record destination regs in REG_FRAME_RELATED_EXPR
1773 notes for update. */
1774 for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
1775 if (REG_NOTE_KIND (note) == REG_FRAME_RELATED_EXPR)
1776 scan_rtx (insn, &XEXP (note, 0), ALL_REGS, mark_access,
1777 OP_INOUT);
1779 /* Step 7: Close chains for registers that were never
1780 really used here. */
1781 for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
1782 if (REG_NOTE_KIND (note) == REG_UNUSED)
1784 remove_from_hard_reg_set (&live_hard_regs,
1785 GET_MODE (XEXP (note, 0)),
1786 REGNO (XEXP (note, 0)));
1787 scan_rtx (insn, &XEXP (note, 0), NO_REGS, terminate_dead,
1788 OP_IN);
1791 else if (DEBUG_INSN_P (insn)
1792 && !VAR_LOC_UNKNOWN_P (INSN_VAR_LOCATION_LOC (insn)))
1794 scan_rtx (insn, &INSN_VAR_LOCATION_LOC (insn),
1795 ALL_REGS, mark_read, OP_IN);
1797 if (insn == BB_END (bb))
1798 break;
1801 if (fail_current_block)
1802 return false;
1804 return true;
1807 /* Initialize the register renamer. If INSN_INFO is true, ensure that
1808 insn_rr is nonnull. */
1809 void
1810 regrename_init (bool insn_info)
1812 gcc_obstack_init (&rename_obstack);
1813 insn_rr.create (0);
1814 if (insn_info)
1815 insn_rr.safe_grow_cleared (get_max_uid ());
1818 /* Free all global data used by the register renamer. */
1819 void
1820 regrename_finish (void)
1822 insn_rr.release ();
1823 free_chain_data ();
1824 obstack_free (&rename_obstack, NULL);
1827 /* Perform register renaming on the current function. */
1829 static unsigned int
1830 regrename_optimize (void)
1832 df_set_flags (DF_LR_RUN_DCE);
1833 df_note_add_problem ();
1834 df_analyze ();
1835 df_set_flags (DF_DEFER_INSN_RESCAN);
1837 regrename_init (false);
1839 regrename_analyze (NULL);
1841 rename_chains ();
1843 regrename_finish ();
1845 return 0;
1848 namespace {
1850 const pass_data pass_data_regrename =
1852 RTL_PASS, /* type */
1853 "rnreg", /* name */
1854 OPTGROUP_NONE, /* optinfo_flags */
1855 TV_RENAME_REGISTERS, /* tv_id */
1856 0, /* properties_required */
1857 0, /* properties_provided */
1858 0, /* properties_destroyed */
1859 0, /* todo_flags_start */
1860 TODO_df_finish, /* todo_flags_finish */
1863 class pass_regrename : public rtl_opt_pass
1865 public:
1866 pass_regrename (gcc::context *ctxt)
1867 : rtl_opt_pass (pass_data_regrename, ctxt)
1870 /* opt_pass methods: */
1871 virtual bool gate (function *)
1873 return (optimize > 0 && (flag_rename_registers));
1876 virtual unsigned int execute (function *) { return regrename_optimize (); }
1878 }; // class pass_regrename
1880 } // anon namespace
1882 rtl_opt_pass *
1883 make_pass_regrename (gcc::context *ctxt)
1885 return new pass_regrename (ctxt);