Daily bump.
[official-gcc.git] / gcc / regrename.c
blobd45ad0a568a8ea371dfe93eff957d50e1c5536cc
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 "vec.h"
32 #include "hashtab.h"
33 #include "hash-set.h"
34 #include "machmode.h"
35 #include "input.h"
36 #include "function.h"
37 #include "dominance.h"
38 #include "cfg.h"
39 #include "cfganal.h"
40 #include "basic-block.h"
41 #include "reload.h"
42 #include "output.h"
43 #include "recog.h"
44 #include "flags.h"
45 #include "obstack.h"
46 #include "tree-pass.h"
47 #include "df.h"
48 #include "target.h"
49 #include "emit-rtl.h"
50 #include "regrename.h"
52 /* This file implements the RTL register renaming pass of the compiler. It is
53 a semi-local pass whose goal is to maximize the usage of the register file
54 of the processor by substituting registers for others in the solution given
55 by the register allocator. The algorithm is as follows:
57 1. Local def/use chains are built: within each basic block, chains are
58 opened and closed; if a chain isn't closed at the end of the block,
59 it is dropped. We pre-open chains if we have already examined a
60 predecessor block and found chains live at the end which match
61 live registers at the start of the new block.
63 2. We try to combine the local chains across basic block boundaries by
64 comparing chains that were open at the start or end of a block to
65 those in successor/predecessor blocks.
67 3. For each chain, the set of possible renaming registers is computed.
68 This takes into account the renaming of previously processed chains.
69 Optionally, a preferred class is computed for the renaming register.
71 4. The best renaming register is computed for the chain in the above set,
72 using a round-robin allocation. If a preferred class exists, then the
73 round-robin allocation is done within the class first, if possible.
74 The round-robin allocation of renaming registers itself is global.
76 5. If a renaming register has been found, it is substituted in the chain.
78 Targets can parameterize the pass by specifying a preferred class for the
79 renaming register for a given (super)class of registers to be renamed. */
81 #if HOST_BITS_PER_WIDE_INT <= MAX_RECOG_OPERANDS
82 #error "Use a different bitmap implementation for untracked_operands."
83 #endif
85 enum scan_actions
87 terminate_write,
88 terminate_dead,
89 mark_all_read,
90 mark_read,
91 mark_write,
92 /* mark_access is for marking the destination regs in
93 REG_FRAME_RELATED_EXPR notes (as if they were read) so that the
94 note is updated properly. */
95 mark_access
98 static const char * const scan_actions_name[] =
100 "terminate_write",
101 "terminate_dead",
102 "mark_all_read",
103 "mark_read",
104 "mark_write",
105 "mark_access"
108 /* TICK and THIS_TICK are used to record the last time we saw each
109 register. */
110 static int tick[FIRST_PSEUDO_REGISTER];
111 static int this_tick = 0;
113 static struct obstack rename_obstack;
115 /* If nonnull, the code calling into the register renamer requested
116 information about insn operands, and we store it here. */
117 vec<insn_rr_info> insn_rr;
119 static void scan_rtx (rtx_insn *, rtx *, enum reg_class, enum scan_actions,
120 enum op_type);
121 static bool build_def_use (basic_block);
123 /* The id to be given to the next opened chain. */
124 static unsigned current_id;
126 /* A mapping of unique id numbers to chains. */
127 static vec<du_head_p> id_to_chain;
129 /* List of currently open chains. */
130 static struct du_head *open_chains;
132 /* Bitmap of open chains. The bits set always match the list found in
133 open_chains. */
134 static bitmap_head open_chains_set;
136 /* Record the registers being tracked in open_chains. */
137 static HARD_REG_SET live_in_chains;
139 /* Record the registers that are live but not tracked. The intersection
140 between this and live_in_chains is empty. */
141 static HARD_REG_SET live_hard_regs;
143 /* Set while scanning RTL if INSN_RR is nonnull, i.e. if the current analysis
144 is for a caller that requires operand data. Used in
145 record_operand_use. */
146 static operand_rr_info *cur_operand;
148 /* Return the chain corresponding to id number ID. Take into account that
149 chains may have been merged. */
150 du_head_p
151 regrename_chain_from_id (unsigned int id)
153 du_head_p first_chain = id_to_chain[id];
154 du_head_p chain = first_chain;
155 while (chain->id != id)
157 id = chain->id;
158 chain = id_to_chain[id];
160 first_chain->id = id;
161 return chain;
164 /* Dump all def/use chains, starting at id FROM. */
166 static void
167 dump_def_use_chain (int from)
169 du_head_p head;
170 int i;
171 FOR_EACH_VEC_ELT_FROM (id_to_chain, i, head, from)
173 struct du_chain *this_du = head->first;
175 fprintf (dump_file, "Register %s (%d):",
176 reg_names[head->regno], head->nregs);
177 while (this_du)
179 fprintf (dump_file, " %d [%s]", INSN_UID (this_du->insn),
180 reg_class_names[this_du->cl]);
181 this_du = this_du->next_use;
183 fprintf (dump_file, "\n");
184 head = head->next_chain;
188 static void
189 free_chain_data (void)
191 int i;
192 du_head_p ptr;
193 for (i = 0; id_to_chain.iterate (i, &ptr); i++)
194 bitmap_clear (&ptr->conflicts);
196 id_to_chain.release ();
199 /* Walk all chains starting with CHAINS and record that they conflict with
200 another chain whose id is ID. */
202 static void
203 mark_conflict (struct du_head *chains, unsigned id)
205 while (chains)
207 bitmap_set_bit (&chains->conflicts, id);
208 chains = chains->next_chain;
212 /* Examine cur_operand, and if it is nonnull, record information about the
213 use THIS_DU which is part of the chain HEAD. */
215 static void
216 record_operand_use (struct du_head *head, struct du_chain *this_du)
218 if (cur_operand == NULL)
219 return;
220 gcc_assert (cur_operand->n_chains < MAX_REGS_PER_ADDRESS);
221 cur_operand->heads[cur_operand->n_chains] = head;
222 cur_operand->chains[cur_operand->n_chains++] = this_du;
225 /* Create a new chain for THIS_NREGS registers starting at THIS_REGNO,
226 and record its occurrence in *LOC, which is being written to in INSN.
227 This access requires a register of class CL. */
229 static du_head_p
230 create_new_chain (unsigned this_regno, unsigned this_nregs, rtx *loc,
231 rtx_insn *insn, enum reg_class cl)
233 struct du_head *head = XOBNEW (&rename_obstack, struct du_head);
234 struct du_chain *this_du;
235 int nregs;
237 head->next_chain = open_chains;
238 head->regno = this_regno;
239 head->nregs = this_nregs;
240 head->need_caller_save_reg = 0;
241 head->cannot_rename = 0;
243 id_to_chain.safe_push (head);
244 head->id = current_id++;
246 bitmap_initialize (&head->conflicts, &bitmap_default_obstack);
247 bitmap_copy (&head->conflicts, &open_chains_set);
248 mark_conflict (open_chains, head->id);
250 /* Since we're tracking this as a chain now, remove it from the
251 list of conflicting live hard registers and track it in
252 live_in_chains instead. */
253 nregs = head->nregs;
254 while (nregs-- > 0)
256 SET_HARD_REG_BIT (live_in_chains, head->regno + nregs);
257 CLEAR_HARD_REG_BIT (live_hard_regs, head->regno + nregs);
260 COPY_HARD_REG_SET (head->hard_conflicts, live_hard_regs);
261 bitmap_set_bit (&open_chains_set, head->id);
263 open_chains = head;
265 if (dump_file)
267 fprintf (dump_file, "Creating chain %s (%d)",
268 reg_names[head->regno], head->id);
269 if (insn != NULL_RTX)
270 fprintf (dump_file, " at insn %d", INSN_UID (insn));
271 fprintf (dump_file, "\n");
274 if (insn == NULL_RTX)
276 head->first = head->last = NULL;
277 return head;
280 this_du = XOBNEW (&rename_obstack, struct du_chain);
281 head->first = head->last = this_du;
283 this_du->next_use = 0;
284 this_du->loc = loc;
285 this_du->insn = insn;
286 this_du->cl = cl;
287 record_operand_use (head, this_du);
288 return head;
291 /* For a def-use chain HEAD, find which registers overlap its lifetime and
292 set the corresponding bits in *PSET. */
294 static void
295 merge_overlapping_regs (HARD_REG_SET *pset, struct du_head *head)
297 bitmap_iterator bi;
298 unsigned i;
299 IOR_HARD_REG_SET (*pset, head->hard_conflicts);
300 EXECUTE_IF_SET_IN_BITMAP (&head->conflicts, 0, i, bi)
302 du_head_p other = regrename_chain_from_id (i);
303 unsigned j = other->nregs;
304 gcc_assert (other != head);
305 while (j-- > 0)
306 SET_HARD_REG_BIT (*pset, other->regno + j);
310 /* Check if NEW_REG can be the candidate register to rename for
311 REG in THIS_HEAD chain. THIS_UNAVAILABLE is a set of unavailable hard
312 registers. */
314 static bool
315 check_new_reg_p (int reg ATTRIBUTE_UNUSED, int new_reg,
316 struct du_head *this_head, HARD_REG_SET this_unavailable)
318 machine_mode mode = GET_MODE (*this_head->first->loc);
319 int nregs = hard_regno_nregs[new_reg][mode];
320 int i;
321 struct du_chain *tmp;
323 for (i = nregs - 1; i >= 0; --i)
324 if (TEST_HARD_REG_BIT (this_unavailable, new_reg + i)
325 || fixed_regs[new_reg + i]
326 || global_regs[new_reg + i]
327 /* Can't use regs which aren't saved by the prologue. */
328 || (! df_regs_ever_live_p (new_reg + i)
329 && ! call_used_regs[new_reg + i])
330 #ifdef LEAF_REGISTERS
331 /* We can't use a non-leaf register if we're in a
332 leaf function. */
333 || (crtl->is_leaf
334 && !LEAF_REGISTERS[new_reg + i])
335 #endif
336 || ! HARD_REGNO_RENAME_OK (reg + i, new_reg + i))
337 return false;
339 /* See whether it accepts all modes that occur in
340 definition and uses. */
341 for (tmp = this_head->first; tmp; tmp = tmp->next_use)
342 if ((! HARD_REGNO_MODE_OK (new_reg, GET_MODE (*tmp->loc))
343 && ! DEBUG_INSN_P (tmp->insn))
344 || (this_head->need_caller_save_reg
345 && ! (HARD_REGNO_CALL_PART_CLOBBERED
346 (reg, GET_MODE (*tmp->loc)))
347 && (HARD_REGNO_CALL_PART_CLOBBERED
348 (new_reg, GET_MODE (*tmp->loc)))))
349 return false;
351 return true;
354 /* For the chain THIS_HEAD, compute and return the best register to
355 rename to. SUPER_CLASS is the superunion of register classes in
356 the chain. UNAVAILABLE is a set of registers that cannot be used.
357 OLD_REG is the register currently used for the chain. BEST_RENAME
358 controls whether the register chosen must be better than the
359 current one or just respect the given constraint. */
362 find_rename_reg (du_head_p this_head, enum reg_class super_class,
363 HARD_REG_SET *unavailable, int old_reg, bool best_rename)
365 bool has_preferred_class;
366 enum reg_class preferred_class;
367 int pass;
368 int best_new_reg = old_reg;
370 /* Further narrow the set of registers we can use for renaming.
371 If the chain needs a call-saved register, mark the call-used
372 registers as unavailable. */
373 if (this_head->need_caller_save_reg)
374 IOR_HARD_REG_SET (*unavailable, call_used_reg_set);
376 /* Mark registers that overlap this chain's lifetime as unavailable. */
377 merge_overlapping_regs (unavailable, this_head);
379 /* Compute preferred rename class of super union of all the classes
380 in the chain. */
381 preferred_class
382 = (enum reg_class) targetm.preferred_rename_class (super_class);
384 /* If PREFERRED_CLASS is not NO_REGS, we iterate in the first pass
385 over registers that belong to PREFERRED_CLASS and try to find the
386 best register within the class. If that failed, we iterate in
387 the second pass over registers that don't belong to the class.
388 If PREFERRED_CLASS is NO_REGS, we iterate over all registers in
389 ascending order without any preference. */
390 has_preferred_class = (preferred_class != NO_REGS);
391 for (pass = (has_preferred_class ? 0 : 1); pass < 2; pass++)
393 int new_reg;
394 for (new_reg = 0; new_reg < FIRST_PSEUDO_REGISTER; new_reg++)
396 if (has_preferred_class
397 && (pass == 0)
398 != TEST_HARD_REG_BIT (reg_class_contents[preferred_class],
399 new_reg))
400 continue;
402 if (!check_new_reg_p (old_reg, new_reg, this_head, *unavailable))
403 continue;
405 if (!best_rename)
406 return new_reg;
408 /* In the first pass, we force the renaming of registers that
409 don't belong to PREFERRED_CLASS to registers that do, even
410 though the latters were used not very long ago. */
411 if ((pass == 0
412 && !TEST_HARD_REG_BIT (reg_class_contents[preferred_class],
413 best_new_reg))
414 || tick[best_new_reg] > tick[new_reg])
415 best_new_reg = new_reg;
417 if (pass == 0 && best_new_reg != old_reg)
418 break;
420 return best_new_reg;
423 /* Perform register renaming on the current function. */
424 static void
425 rename_chains (void)
427 HARD_REG_SET unavailable;
428 du_head_p this_head;
429 int i;
431 memset (tick, 0, sizeof tick);
433 CLEAR_HARD_REG_SET (unavailable);
434 /* Don't clobber traceback for noreturn functions. */
435 if (frame_pointer_needed)
437 add_to_hard_reg_set (&unavailable, Pmode, FRAME_POINTER_REGNUM);
438 if (!HARD_FRAME_POINTER_IS_FRAME_POINTER)
439 add_to_hard_reg_set (&unavailable, Pmode, HARD_FRAME_POINTER_REGNUM);
442 FOR_EACH_VEC_ELT (id_to_chain, i, this_head)
444 int best_new_reg;
445 int n_uses;
446 struct du_chain *tmp;
447 HARD_REG_SET this_unavailable;
448 int reg = this_head->regno;
449 enum reg_class super_class = NO_REGS;
451 if (this_head->cannot_rename)
452 continue;
454 if (fixed_regs[reg] || global_regs[reg]
455 #if !HARD_FRAME_POINTER_IS_FRAME_POINTER
456 || (frame_pointer_needed && reg == HARD_FRAME_POINTER_REGNUM)
457 #else
458 || (frame_pointer_needed && reg == FRAME_POINTER_REGNUM)
459 #endif
461 continue;
463 COPY_HARD_REG_SET (this_unavailable, unavailable);
465 /* Iterate over elements in the chain in order to:
466 1. Count number of uses, and narrow the set of registers we can
467 use for renaming.
468 2. Compute the superunion of register classes in this chain. */
469 n_uses = 0;
470 super_class = NO_REGS;
471 for (tmp = this_head->first; tmp; tmp = tmp->next_use)
473 if (DEBUG_INSN_P (tmp->insn))
474 continue;
475 n_uses++;
476 IOR_COMPL_HARD_REG_SET (this_unavailable,
477 reg_class_contents[tmp->cl]);
478 super_class
479 = reg_class_superunion[(int) super_class][(int) tmp->cl];
482 if (n_uses < 2)
483 continue;
485 best_new_reg = find_rename_reg (this_head, super_class,
486 &this_unavailable, reg, true);
488 if (dump_file)
490 fprintf (dump_file, "Register %s in insn %d",
491 reg_names[reg], INSN_UID (this_head->first->insn));
492 if (this_head->need_caller_save_reg)
493 fprintf (dump_file, " crosses a call");
496 if (best_new_reg == reg)
498 tick[reg] = ++this_tick;
499 if (dump_file)
500 fprintf (dump_file, "; no available better choice\n");
501 continue;
504 if (dump_file)
505 fprintf (dump_file, ", renamed as %s\n", reg_names[best_new_reg]);
507 regrename_do_replace (this_head, best_new_reg);
508 tick[best_new_reg] = ++this_tick;
509 df_set_regs_ever_live (best_new_reg, true);
513 /* A structure to record information for each hard register at the start of
514 a basic block. */
515 struct incoming_reg_info {
516 /* Holds the number of registers used in the chain that gave us information
517 about this register. Zero means no information known yet, while a
518 negative value is used for something that is part of, but not the first
519 register in a multi-register value. */
520 int nregs;
521 /* Set to true if we have accesses that conflict in the number of registers
522 used. */
523 bool unusable;
526 /* A structure recording information about each basic block. It is saved
527 and restored around basic block boundaries.
528 A pointer to such a structure is stored in each basic block's aux field
529 during regrename_analyze, except for blocks we know can't be optimized
530 (such as entry and exit blocks). */
531 struct bb_rename_info
533 /* The basic block corresponding to this structure. */
534 basic_block bb;
535 /* Copies of the global information. */
536 bitmap_head open_chains_set;
537 bitmap_head incoming_open_chains_set;
538 struct incoming_reg_info incoming[FIRST_PSEUDO_REGISTER];
541 /* Initialize a rename_info structure P for basic block BB, which starts a new
542 scan. */
543 static void
544 init_rename_info (struct bb_rename_info *p, basic_block bb)
546 int i;
547 df_ref def;
548 HARD_REG_SET start_chains_set;
550 p->bb = bb;
551 bitmap_initialize (&p->open_chains_set, &bitmap_default_obstack);
552 bitmap_initialize (&p->incoming_open_chains_set, &bitmap_default_obstack);
554 open_chains = NULL;
555 bitmap_clear (&open_chains_set);
557 CLEAR_HARD_REG_SET (live_in_chains);
558 REG_SET_TO_HARD_REG_SET (live_hard_regs, df_get_live_in (bb));
559 FOR_EACH_ARTIFICIAL_DEF (def, bb->index)
560 if (DF_REF_FLAGS (def) & DF_REF_AT_TOP)
561 SET_HARD_REG_BIT (live_hard_regs, DF_REF_REGNO (def));
563 /* Open chains based on information from (at least one) predecessor
564 block. This gives us a chance later on to combine chains across
565 basic block boundaries. Inconsistencies (in access sizes) will
566 be caught normally and dealt with conservatively by disabling the
567 chain for renaming, and there is no risk of losing optimization
568 opportunities by opening chains either: if we did not open the
569 chains, we'd have to track the live register as a hard reg, and
570 we'd be unable to rename it in any case. */
571 CLEAR_HARD_REG_SET (start_chains_set);
572 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
574 struct incoming_reg_info *iri = p->incoming + i;
575 if (iri->nregs > 0 && !iri->unusable
576 && range_in_hard_reg_set_p (live_hard_regs, i, iri->nregs))
578 SET_HARD_REG_BIT (start_chains_set, i);
579 remove_range_from_hard_reg_set (&live_hard_regs, i, iri->nregs);
582 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
584 struct incoming_reg_info *iri = p->incoming + i;
585 if (TEST_HARD_REG_BIT (start_chains_set, i))
587 du_head_p chain;
588 if (dump_file)
589 fprintf (dump_file, "opening incoming chain\n");
590 chain = create_new_chain (i, iri->nregs, NULL, NULL, NO_REGS);
591 bitmap_set_bit (&p->incoming_open_chains_set, chain->id);
596 /* Record in RI that the block corresponding to it has an incoming
597 live value, described by CHAIN. */
598 static void
599 set_incoming_from_chain (struct bb_rename_info *ri, du_head_p chain)
601 int i;
602 int incoming_nregs = ri->incoming[chain->regno].nregs;
603 int nregs;
605 /* If we've recorded the same information before, everything is fine. */
606 if (incoming_nregs == chain->nregs)
608 if (dump_file)
609 fprintf (dump_file, "reg %d/%d already recorded\n",
610 chain->regno, chain->nregs);
611 return;
614 /* If we have no information for any of the involved registers, update
615 the incoming array. */
616 nregs = chain->nregs;
617 while (nregs-- > 0)
618 if (ri->incoming[chain->regno + nregs].nregs != 0
619 || ri->incoming[chain->regno + nregs].unusable)
620 break;
621 if (nregs < 0)
623 nregs = chain->nregs;
624 ri->incoming[chain->regno].nregs = nregs;
625 while (nregs-- > 1)
626 ri->incoming[chain->regno + nregs].nregs = -nregs;
627 if (dump_file)
628 fprintf (dump_file, "recorded reg %d/%d\n",
629 chain->regno, chain->nregs);
630 return;
633 /* There must be some kind of conflict. Prevent both the old and
634 new ranges from being used. */
635 if (incoming_nregs < 0)
636 ri->incoming[chain->regno + incoming_nregs].unusable = true;
637 for (i = 0; i < chain->nregs; i++)
638 ri->incoming[chain->regno + i].unusable = true;
641 /* Merge the two chains C1 and C2 so that all conflict information is
642 recorded and C1, and the id of C2 is changed to that of C1. */
643 static void
644 merge_chains (du_head_p c1, du_head_p c2)
646 if (c1 == c2)
647 return;
649 if (c2->first != NULL)
651 if (c1->first == NULL)
652 c1->first = c2->first;
653 else
654 c1->last->next_use = c2->first;
655 c1->last = c2->last;
658 c2->first = c2->last = NULL;
659 c2->id = c1->id;
661 IOR_HARD_REG_SET (c1->hard_conflicts, c2->hard_conflicts);
662 bitmap_ior_into (&c1->conflicts, &c2->conflicts);
664 c1->need_caller_save_reg |= c2->need_caller_save_reg;
665 c1->cannot_rename |= c2->cannot_rename;
668 /* Analyze the current function and build chains for renaming. */
670 void
671 regrename_analyze (bitmap bb_mask)
673 struct bb_rename_info *rename_info;
674 int i;
675 basic_block bb;
676 int n_bbs;
677 int *inverse_postorder;
679 inverse_postorder = XNEWVEC (int, last_basic_block_for_fn (cfun));
680 n_bbs = pre_and_rev_post_order_compute (NULL, inverse_postorder, false);
682 /* Gather some information about the blocks in this function. */
683 rename_info = XCNEWVEC (struct bb_rename_info, n_basic_blocks_for_fn (cfun));
684 i = 0;
685 FOR_EACH_BB_FN (bb, cfun)
687 struct bb_rename_info *ri = rename_info + i;
688 ri->bb = bb;
689 if (bb_mask != NULL && !bitmap_bit_p (bb_mask, bb->index))
690 bb->aux = NULL;
691 else
692 bb->aux = ri;
693 i++;
696 current_id = 0;
697 id_to_chain.create (0);
698 bitmap_initialize (&open_chains_set, &bitmap_default_obstack);
700 /* The order in which we visit blocks ensures that whenever
701 possible, we only process a block after at least one of its
702 predecessors, which provides a "seeding" effect to make the logic
703 in set_incoming_from_chain and init_rename_info useful. */
705 for (i = 0; i < n_bbs; i++)
707 basic_block bb1 = BASIC_BLOCK_FOR_FN (cfun, inverse_postorder[i]);
708 struct bb_rename_info *this_info;
709 bool success;
710 edge e;
711 edge_iterator ei;
712 int old_length = id_to_chain.length ();
714 this_info = (struct bb_rename_info *) bb1->aux;
715 if (this_info == NULL)
716 continue;
718 if (dump_file)
719 fprintf (dump_file, "\nprocessing block %d:\n", bb1->index);
721 init_rename_info (this_info, bb1);
723 success = build_def_use (bb1);
724 if (!success)
726 if (dump_file)
727 fprintf (dump_file, "failed\n");
728 bb1->aux = NULL;
729 id_to_chain.truncate (old_length);
730 current_id = old_length;
731 bitmap_clear (&this_info->incoming_open_chains_set);
732 open_chains = NULL;
733 if (insn_rr.exists ())
735 rtx_insn *insn;
736 FOR_BB_INSNS (bb1, insn)
738 insn_rr_info *p = &insn_rr[INSN_UID (insn)];
739 p->op_info = NULL;
742 continue;
745 if (dump_file)
746 dump_def_use_chain (old_length);
747 bitmap_copy (&this_info->open_chains_set, &open_chains_set);
749 /* Add successor blocks to the worklist if necessary, and record
750 data about our own open chains at the end of this block, which
751 will be used to pre-open chains when processing the successors. */
752 FOR_EACH_EDGE (e, ei, bb1->succs)
754 struct bb_rename_info *dest_ri;
755 struct du_head *chain;
757 if (dump_file)
758 fprintf (dump_file, "successor block %d\n", e->dest->index);
760 if (e->flags & (EDGE_EH | EDGE_ABNORMAL))
761 continue;
762 dest_ri = (struct bb_rename_info *)e->dest->aux;
763 if (dest_ri == NULL)
764 continue;
765 for (chain = open_chains; chain; chain = chain->next_chain)
766 set_incoming_from_chain (dest_ri, chain);
770 free (inverse_postorder);
772 /* Now, combine the chains data we have gathered across basic block
773 boundaries.
775 For every basic block, there may be chains open at the start, or at the
776 end. Rather than exclude them from renaming, we look for open chains
777 with matching registers at the other side of the CFG edge.
779 For a given chain using register R, open at the start of block B, we
780 must find an open chain using R on the other side of every edge leading
781 to B, if the register is live across this edge. In the code below,
782 N_PREDS_USED counts the number of edges where the register is live, and
783 N_PREDS_JOINED counts those where we found an appropriate chain for
784 joining.
786 We perform the analysis for both incoming and outgoing edges, but we
787 only need to merge once (in the second part, after verifying outgoing
788 edges). */
789 FOR_EACH_BB_FN (bb, cfun)
791 struct bb_rename_info *bb_ri = (struct bb_rename_info *) bb->aux;
792 unsigned j;
793 bitmap_iterator bi;
795 if (bb_ri == NULL)
796 continue;
798 if (dump_file)
799 fprintf (dump_file, "processing bb %d in edges\n", bb->index);
801 EXECUTE_IF_SET_IN_BITMAP (&bb_ri->incoming_open_chains_set, 0, j, bi)
803 edge e;
804 edge_iterator ei;
805 struct du_head *chain = regrename_chain_from_id (j);
806 int n_preds_used = 0, n_preds_joined = 0;
808 FOR_EACH_EDGE (e, ei, bb->preds)
810 struct bb_rename_info *src_ri;
811 unsigned k;
812 bitmap_iterator bi2;
813 HARD_REG_SET live;
814 bool success = false;
816 REG_SET_TO_HARD_REG_SET (live, df_get_live_out (e->src));
817 if (!range_overlaps_hard_reg_set_p (live, chain->regno,
818 chain->nregs))
819 continue;
820 n_preds_used++;
822 if (e->flags & (EDGE_EH | EDGE_ABNORMAL))
823 continue;
825 src_ri = (struct bb_rename_info *)e->src->aux;
826 if (src_ri == NULL)
827 continue;
829 EXECUTE_IF_SET_IN_BITMAP (&src_ri->open_chains_set,
830 0, k, bi2)
832 struct du_head *outgoing_chain = regrename_chain_from_id (k);
834 if (outgoing_chain->regno == chain->regno
835 && outgoing_chain->nregs == chain->nregs)
837 n_preds_joined++;
838 success = true;
839 break;
842 if (!success && dump_file)
843 fprintf (dump_file, "failure to match with pred block %d\n",
844 e->src->index);
846 if (n_preds_joined < n_preds_used)
848 if (dump_file)
849 fprintf (dump_file, "cannot rename chain %d\n", j);
850 chain->cannot_rename = 1;
854 FOR_EACH_BB_FN (bb, cfun)
856 struct bb_rename_info *bb_ri = (struct bb_rename_info *) bb->aux;
857 unsigned j;
858 bitmap_iterator bi;
860 if (bb_ri == NULL)
861 continue;
863 if (dump_file)
864 fprintf (dump_file, "processing bb %d out edges\n", bb->index);
866 EXECUTE_IF_SET_IN_BITMAP (&bb_ri->open_chains_set, 0, j, bi)
868 edge e;
869 edge_iterator ei;
870 struct du_head *chain = regrename_chain_from_id (j);
871 int n_succs_used = 0, n_succs_joined = 0;
873 FOR_EACH_EDGE (e, ei, bb->succs)
875 bool printed = false;
876 struct bb_rename_info *dest_ri;
877 unsigned k;
878 bitmap_iterator bi2;
879 HARD_REG_SET live;
881 REG_SET_TO_HARD_REG_SET (live, df_get_live_in (e->dest));
882 if (!range_overlaps_hard_reg_set_p (live, chain->regno,
883 chain->nregs))
884 continue;
886 n_succs_used++;
888 dest_ri = (struct bb_rename_info *)e->dest->aux;
889 if (dest_ri == NULL)
890 continue;
892 EXECUTE_IF_SET_IN_BITMAP (&dest_ri->incoming_open_chains_set,
893 0, k, bi2)
895 struct du_head *incoming_chain = regrename_chain_from_id (k);
897 if (incoming_chain->regno == chain->regno
898 && incoming_chain->nregs == chain->nregs)
900 if (dump_file)
902 if (!printed)
903 fprintf (dump_file,
904 "merging blocks for edge %d -> %d\n",
905 e->src->index, e->dest->index);
906 printed = true;
907 fprintf (dump_file,
908 " merging chains %d (->%d) and %d (->%d) [%s]\n",
909 k, incoming_chain->id, j, chain->id,
910 reg_names[incoming_chain->regno]);
913 merge_chains (chain, incoming_chain);
914 n_succs_joined++;
915 break;
919 if (n_succs_joined < n_succs_used)
921 if (dump_file)
922 fprintf (dump_file, "cannot rename chain %d\n",
924 chain->cannot_rename = 1;
929 free (rename_info);
931 FOR_EACH_BB_FN (bb, cfun)
932 bb->aux = NULL;
935 void
936 regrename_do_replace (struct du_head *head, int reg)
938 struct du_chain *chain;
939 unsigned int base_regno = head->regno;
940 machine_mode mode;
942 for (chain = head->first; chain; chain = chain->next_use)
944 unsigned int regno = ORIGINAL_REGNO (*chain->loc);
945 struct reg_attrs *attr = REG_ATTRS (*chain->loc);
946 int reg_ptr = REG_POINTER (*chain->loc);
948 if (DEBUG_INSN_P (chain->insn) && REGNO (*chain->loc) != base_regno)
949 INSN_VAR_LOCATION_LOC (chain->insn) = gen_rtx_UNKNOWN_VAR_LOC ();
950 else
952 *chain->loc = gen_raw_REG (GET_MODE (*chain->loc), reg);
953 if (regno >= FIRST_PSEUDO_REGISTER)
954 ORIGINAL_REGNO (*chain->loc) = regno;
955 REG_ATTRS (*chain->loc) = attr;
956 REG_POINTER (*chain->loc) = reg_ptr;
959 df_insn_rescan (chain->insn);
962 mode = GET_MODE (*head->first->loc);
963 head->regno = reg;
964 head->nregs = hard_regno_nregs[reg][mode];
968 /* True if we found a register with a size mismatch, which means that we
969 can't track its lifetime accurately. If so, we abort the current block
970 without renaming. */
971 static bool fail_current_block;
973 /* Return true if OP is a reg for which all bits are set in PSET, false
974 if all bits are clear.
975 In other cases, set fail_current_block and return false. */
977 static bool
978 verify_reg_in_set (rtx op, HARD_REG_SET *pset)
980 unsigned regno, nregs;
981 bool all_live, all_dead;
982 if (!REG_P (op))
983 return false;
985 regno = REGNO (op);
986 nregs = hard_regno_nregs[regno][GET_MODE (op)];
987 all_live = all_dead = true;
988 while (nregs-- > 0)
989 if (TEST_HARD_REG_BIT (*pset, regno + nregs))
990 all_dead = false;
991 else
992 all_live = false;
993 if (!all_dead && !all_live)
995 fail_current_block = true;
996 return false;
998 return all_live;
1001 /* Return true if OP is a reg that is being tracked already in some form.
1002 May set fail_current_block if it sees an unhandled case of overlap. */
1004 static bool
1005 verify_reg_tracked (rtx op)
1007 return (verify_reg_in_set (op, &live_hard_regs)
1008 || verify_reg_in_set (op, &live_in_chains));
1011 /* Called through note_stores. DATA points to a rtx_code, either SET or
1012 CLOBBER, which tells us which kind of rtx to look at. If we have a
1013 match, record the set register in live_hard_regs and in the hard_conflicts
1014 bitmap of open chains. */
1016 static void
1017 note_sets_clobbers (rtx x, const_rtx set, void *data)
1019 enum rtx_code code = *(enum rtx_code *)data;
1020 struct du_head *chain;
1022 if (GET_CODE (x) == SUBREG)
1023 x = SUBREG_REG (x);
1024 if (!REG_P (x) || GET_CODE (set) != code)
1025 return;
1026 /* There must not be pseudos at this point. */
1027 gcc_assert (HARD_REGISTER_P (x));
1028 add_to_hard_reg_set (&live_hard_regs, GET_MODE (x), REGNO (x));
1029 for (chain = open_chains; chain; chain = chain->next_chain)
1030 add_to_hard_reg_set (&chain->hard_conflicts, GET_MODE (x), REGNO (x));
1033 static void
1034 scan_rtx_reg (rtx_insn *insn, rtx *loc, enum reg_class cl, enum scan_actions action,
1035 enum op_type type)
1037 struct du_head **p;
1038 rtx x = *loc;
1039 machine_mode mode = GET_MODE (x);
1040 unsigned this_regno = REGNO (x);
1041 int this_nregs = hard_regno_nregs[this_regno][mode];
1043 if (action == mark_write)
1045 if (type == OP_OUT)
1046 create_new_chain (this_regno, this_nregs, loc, insn, cl);
1047 return;
1050 if ((type == OP_OUT) != (action == terminate_write || action == mark_access))
1051 return;
1053 for (p = &open_chains; *p;)
1055 struct du_head *head = *p;
1056 struct du_head *next = head->next_chain;
1057 int exact_match = (head->regno == this_regno
1058 && head->nregs == this_nregs);
1059 int superset = (this_regno <= head->regno
1060 && this_regno + this_nregs >= head->regno + head->nregs);
1061 int subset = (this_regno >= head->regno
1062 && this_regno + this_nregs <= head->regno + head->nregs);
1064 if (!bitmap_bit_p (&open_chains_set, head->id)
1065 || head->regno + head->nregs <= this_regno
1066 || this_regno + this_nregs <= head->regno)
1068 p = &head->next_chain;
1069 continue;
1072 if (action == mark_read || action == mark_access)
1074 /* ??? Class NO_REGS can happen if the md file makes use of
1075 EXTRA_CONSTRAINTS to match registers. Which is arguably
1076 wrong, but there we are. */
1078 if (cl == NO_REGS || (!exact_match && !DEBUG_INSN_P (insn)))
1080 if (dump_file)
1081 fprintf (dump_file,
1082 "Cannot rename chain %s (%d) at insn %d (%s)\n",
1083 reg_names[head->regno], head->id, INSN_UID (insn),
1084 scan_actions_name[(int) action]);
1085 head->cannot_rename = 1;
1086 if (superset)
1088 unsigned nregs = this_nregs;
1089 head->regno = this_regno;
1090 head->nregs = this_nregs;
1091 while (nregs-- > 0)
1092 SET_HARD_REG_BIT (live_in_chains, head->regno + nregs);
1093 if (dump_file)
1094 fprintf (dump_file,
1095 "Widening register in chain %s (%d) at insn %d\n",
1096 reg_names[head->regno], head->id, INSN_UID (insn));
1098 else if (!subset)
1100 fail_current_block = true;
1101 if (dump_file)
1102 fprintf (dump_file,
1103 "Failing basic block due to unhandled overlap\n");
1106 else
1108 struct du_chain *this_du;
1109 this_du = XOBNEW (&rename_obstack, struct du_chain);
1110 this_du->next_use = 0;
1111 this_du->loc = loc;
1112 this_du->insn = insn;
1113 this_du->cl = cl;
1114 if (head->first == NULL)
1115 head->first = this_du;
1116 else
1117 head->last->next_use = this_du;
1118 record_operand_use (head, this_du);
1119 head->last = this_du;
1121 /* Avoid adding the same location in a DEBUG_INSN multiple times,
1122 which could happen with non-exact overlap. */
1123 if (DEBUG_INSN_P (insn))
1124 return;
1125 /* Otherwise, find any other chains that do not match exactly;
1126 ensure they all get marked unrenamable. */
1127 p = &head->next_chain;
1128 continue;
1131 /* Whether the terminated chain can be used for renaming
1132 depends on the action and this being an exact match.
1133 In either case, we remove this element from open_chains. */
1135 if ((action == terminate_dead || action == terminate_write)
1136 && (superset || subset))
1138 unsigned nregs;
1140 if (subset && !superset)
1141 head->cannot_rename = 1;
1142 bitmap_clear_bit (&open_chains_set, head->id);
1144 nregs = head->nregs;
1145 while (nregs-- > 0)
1147 CLEAR_HARD_REG_BIT (live_in_chains, head->regno + nregs);
1148 if (subset && !superset
1149 && (head->regno + nregs < this_regno
1150 || head->regno + nregs >= this_regno + this_nregs))
1151 SET_HARD_REG_BIT (live_hard_regs, head->regno + nregs);
1154 *p = next;
1155 if (dump_file)
1156 fprintf (dump_file,
1157 "Closing chain %s (%d) at insn %d (%s%s)\n",
1158 reg_names[head->regno], head->id, INSN_UID (insn),
1159 scan_actions_name[(int) action],
1160 superset ? ", superset" : subset ? ", subset" : "");
1162 else if (action == terminate_dead || action == terminate_write)
1164 /* In this case, tracking liveness gets too hard. Fail the
1165 entire basic block. */
1166 if (dump_file)
1167 fprintf (dump_file,
1168 "Failing basic block due to unhandled overlap\n");
1169 fail_current_block = true;
1170 return;
1172 else
1174 head->cannot_rename = 1;
1175 if (dump_file)
1176 fprintf (dump_file,
1177 "Cannot rename chain %s (%d) at insn %d (%s)\n",
1178 reg_names[head->regno], head->id, INSN_UID (insn),
1179 scan_actions_name[(int) action]);
1180 p = &head->next_chain;
1185 /* Adapted from find_reloads_address_1. CL is INDEX_REG_CLASS or
1186 BASE_REG_CLASS depending on how the register is being considered. */
1188 static void
1189 scan_rtx_address (rtx_insn *insn, rtx *loc, enum reg_class cl,
1190 enum scan_actions action, machine_mode mode,
1191 addr_space_t as)
1193 rtx x = *loc;
1194 RTX_CODE code = GET_CODE (x);
1195 const char *fmt;
1196 int i, j;
1198 if (action == mark_write || action == mark_access)
1199 return;
1201 switch (code)
1203 case PLUS:
1205 rtx orig_op0 = XEXP (x, 0);
1206 rtx orig_op1 = XEXP (x, 1);
1207 RTX_CODE code0 = GET_CODE (orig_op0);
1208 RTX_CODE code1 = GET_CODE (orig_op1);
1209 rtx op0 = orig_op0;
1210 rtx op1 = orig_op1;
1211 rtx *locI = NULL;
1212 rtx *locB = NULL;
1213 enum rtx_code index_code = SCRATCH;
1215 if (GET_CODE (op0) == SUBREG)
1217 op0 = SUBREG_REG (op0);
1218 code0 = GET_CODE (op0);
1221 if (GET_CODE (op1) == SUBREG)
1223 op1 = SUBREG_REG (op1);
1224 code1 = GET_CODE (op1);
1227 if (code0 == MULT || code0 == SIGN_EXTEND || code0 == TRUNCATE
1228 || code0 == ZERO_EXTEND || code1 == MEM)
1230 locI = &XEXP (x, 0);
1231 locB = &XEXP (x, 1);
1232 index_code = GET_CODE (*locI);
1234 else if (code1 == MULT || code1 == SIGN_EXTEND || code1 == TRUNCATE
1235 || code1 == ZERO_EXTEND || code0 == MEM)
1237 locI = &XEXP (x, 1);
1238 locB = &XEXP (x, 0);
1239 index_code = GET_CODE (*locI);
1241 else if (code0 == CONST_INT || code0 == CONST
1242 || code0 == SYMBOL_REF || code0 == LABEL_REF)
1244 locB = &XEXP (x, 1);
1245 index_code = GET_CODE (XEXP (x, 0));
1247 else if (code1 == CONST_INT || code1 == CONST
1248 || code1 == SYMBOL_REF || code1 == LABEL_REF)
1250 locB = &XEXP (x, 0);
1251 index_code = GET_CODE (XEXP (x, 1));
1253 else if (code0 == REG && code1 == REG)
1255 int index_op;
1256 unsigned regno0 = REGNO (op0), regno1 = REGNO (op1);
1258 if (REGNO_OK_FOR_INDEX_P (regno1)
1259 && regno_ok_for_base_p (regno0, mode, as, PLUS, REG))
1260 index_op = 1;
1261 else if (REGNO_OK_FOR_INDEX_P (regno0)
1262 && regno_ok_for_base_p (regno1, mode, as, PLUS, REG))
1263 index_op = 0;
1264 else if (regno_ok_for_base_p (regno0, mode, as, PLUS, REG)
1265 || REGNO_OK_FOR_INDEX_P (regno1))
1266 index_op = 1;
1267 else if (regno_ok_for_base_p (regno1, mode, as, PLUS, REG))
1268 index_op = 0;
1269 else
1270 index_op = 1;
1272 locI = &XEXP (x, index_op);
1273 locB = &XEXP (x, !index_op);
1274 index_code = GET_CODE (*locI);
1276 else if (code0 == REG)
1278 locI = &XEXP (x, 0);
1279 locB = &XEXP (x, 1);
1280 index_code = GET_CODE (*locI);
1282 else if (code1 == REG)
1284 locI = &XEXP (x, 1);
1285 locB = &XEXP (x, 0);
1286 index_code = GET_CODE (*locI);
1289 if (locI)
1290 scan_rtx_address (insn, locI, INDEX_REG_CLASS, action, mode, as);
1291 if (locB)
1292 scan_rtx_address (insn, locB,
1293 base_reg_class (mode, as, PLUS, index_code),
1294 action, mode, as);
1296 return;
1299 case POST_INC:
1300 case POST_DEC:
1301 case POST_MODIFY:
1302 case PRE_INC:
1303 case PRE_DEC:
1304 case PRE_MODIFY:
1305 #ifndef AUTO_INC_DEC
1306 /* If the target doesn't claim to handle autoinc, this must be
1307 something special, like a stack push. Kill this chain. */
1308 action = mark_all_read;
1309 #endif
1310 break;
1312 case MEM:
1313 scan_rtx_address (insn, &XEXP (x, 0),
1314 base_reg_class (GET_MODE (x), MEM_ADDR_SPACE (x),
1315 MEM, SCRATCH),
1316 action, GET_MODE (x), MEM_ADDR_SPACE (x));
1317 return;
1319 case REG:
1320 scan_rtx_reg (insn, loc, cl, action, OP_IN);
1321 return;
1323 default:
1324 break;
1327 fmt = GET_RTX_FORMAT (code);
1328 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1330 if (fmt[i] == 'e')
1331 scan_rtx_address (insn, &XEXP (x, i), cl, action, mode, as);
1332 else if (fmt[i] == 'E')
1333 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
1334 scan_rtx_address (insn, &XVECEXP (x, i, j), cl, action, mode, as);
1338 static void
1339 scan_rtx (rtx_insn *insn, rtx *loc, enum reg_class cl, enum scan_actions action,
1340 enum op_type type)
1342 const char *fmt;
1343 rtx x = *loc;
1344 enum rtx_code code = GET_CODE (x);
1345 int i, j;
1347 code = GET_CODE (x);
1348 switch (code)
1350 case CONST:
1351 CASE_CONST_ANY:
1352 case SYMBOL_REF:
1353 case LABEL_REF:
1354 case CC0:
1355 case PC:
1356 return;
1358 case REG:
1359 scan_rtx_reg (insn, loc, cl, action, type);
1360 return;
1362 case MEM:
1363 scan_rtx_address (insn, &XEXP (x, 0),
1364 base_reg_class (GET_MODE (x), MEM_ADDR_SPACE (x),
1365 MEM, SCRATCH),
1366 action, GET_MODE (x), MEM_ADDR_SPACE (x));
1367 return;
1369 case SET:
1370 scan_rtx (insn, &SET_SRC (x), cl, action, OP_IN);
1371 scan_rtx (insn, &SET_DEST (x), cl, action,
1372 (GET_CODE (PATTERN (insn)) == COND_EXEC
1373 && verify_reg_tracked (SET_DEST (x))) ? OP_INOUT : OP_OUT);
1374 return;
1376 case STRICT_LOW_PART:
1377 scan_rtx (insn, &XEXP (x, 0), cl, action,
1378 verify_reg_tracked (XEXP (x, 0)) ? OP_INOUT : OP_OUT);
1379 return;
1381 case ZERO_EXTRACT:
1382 case SIGN_EXTRACT:
1383 scan_rtx (insn, &XEXP (x, 0), cl, action,
1384 (type == OP_IN ? OP_IN :
1385 verify_reg_tracked (XEXP (x, 0)) ? OP_INOUT : OP_OUT));
1386 scan_rtx (insn, &XEXP (x, 1), cl, action, OP_IN);
1387 scan_rtx (insn, &XEXP (x, 2), cl, action, OP_IN);
1388 return;
1390 case POST_INC:
1391 case PRE_INC:
1392 case POST_DEC:
1393 case PRE_DEC:
1394 case POST_MODIFY:
1395 case PRE_MODIFY:
1396 /* Should only happen inside MEM. */
1397 gcc_unreachable ();
1399 case CLOBBER:
1400 scan_rtx (insn, &SET_DEST (x), cl, action,
1401 (GET_CODE (PATTERN (insn)) == COND_EXEC
1402 && verify_reg_tracked (SET_DEST (x))) ? OP_INOUT : OP_OUT);
1403 return;
1405 case EXPR_LIST:
1406 scan_rtx (insn, &XEXP (x, 0), cl, action, type);
1407 if (XEXP (x, 1))
1408 scan_rtx (insn, &XEXP (x, 1), cl, action, type);
1409 return;
1411 default:
1412 break;
1415 fmt = GET_RTX_FORMAT (code);
1416 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1418 if (fmt[i] == 'e')
1419 scan_rtx (insn, &XEXP (x, i), cl, action, type);
1420 else if (fmt[i] == 'E')
1421 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
1422 scan_rtx (insn, &XVECEXP (x, i, j), cl, action, type);
1426 /* Hide operands of the current insn (of which there are N_OPS) by
1427 substituting cc0 for them.
1428 Previous values are stored in the OLD_OPERANDS and OLD_DUPS.
1429 For every bit set in DO_NOT_HIDE, we leave the operand alone.
1430 If INOUT_AND_EC_ONLY is set, we only do this for OP_INOUT type operands
1431 and earlyclobbers. */
1433 static void
1434 hide_operands (int n_ops, rtx *old_operands, rtx *old_dups,
1435 unsigned HOST_WIDE_INT do_not_hide, bool inout_and_ec_only)
1437 int i;
1438 const operand_alternative *op_alt = which_op_alt ();
1439 for (i = 0; i < n_ops; i++)
1441 old_operands[i] = recog_data.operand[i];
1442 /* Don't squash match_operator or match_parallel here, since
1443 we don't know that all of the contained registers are
1444 reachable by proper operands. */
1445 if (recog_data.constraints[i][0] == '\0')
1446 continue;
1447 if (do_not_hide & (1 << i))
1448 continue;
1449 if (!inout_and_ec_only || recog_data.operand_type[i] == OP_INOUT
1450 || op_alt[i].earlyclobber)
1451 *recog_data.operand_loc[i] = cc0_rtx;
1453 for (i = 0; i < recog_data.n_dups; i++)
1455 int opn = recog_data.dup_num[i];
1456 old_dups[i] = *recog_data.dup_loc[i];
1457 if (do_not_hide & (1 << opn))
1458 continue;
1459 if (!inout_and_ec_only || recog_data.operand_type[opn] == OP_INOUT
1460 || op_alt[opn].earlyclobber)
1461 *recog_data.dup_loc[i] = cc0_rtx;
1465 /* Undo the substitution performed by hide_operands. INSN is the insn we
1466 are processing; the arguments are the same as in hide_operands. */
1468 static void
1469 restore_operands (rtx_insn *insn, int n_ops, rtx *old_operands, rtx *old_dups)
1471 int i;
1472 for (i = 0; i < recog_data.n_dups; i++)
1473 *recog_data.dup_loc[i] = old_dups[i];
1474 for (i = 0; i < n_ops; i++)
1475 *recog_data.operand_loc[i] = old_operands[i];
1476 if (recog_data.n_dups)
1477 df_insn_rescan (insn);
1480 /* For each output operand of INSN, call scan_rtx to create a new
1481 open chain. Do this only for normal or earlyclobber outputs,
1482 depending on EARLYCLOBBER. If INSN_INFO is nonnull, use it to
1483 record information about the operands in the insn. */
1485 static void
1486 record_out_operands (rtx_insn *insn, bool earlyclobber, insn_rr_info *insn_info)
1488 int n_ops = recog_data.n_operands;
1489 const operand_alternative *op_alt = which_op_alt ();
1491 int i;
1493 for (i = 0; i < n_ops + recog_data.n_dups; i++)
1495 int opn = i < n_ops ? i : recog_data.dup_num[i - n_ops];
1496 rtx *loc = (i < n_ops
1497 ? recog_data.operand_loc[opn]
1498 : recog_data.dup_loc[i - n_ops]);
1499 rtx op = *loc;
1500 enum reg_class cl = alternative_class (op_alt, opn);
1502 struct du_head *prev_open;
1504 if (recog_data.operand_type[opn] != OP_OUT
1505 || op_alt[opn].earlyclobber != earlyclobber)
1506 continue;
1508 if (insn_info)
1509 cur_operand = insn_info->op_info + i;
1511 prev_open = open_chains;
1512 scan_rtx (insn, loc, cl, mark_write, OP_OUT);
1514 /* ??? Many targets have output constraints on the SET_DEST
1515 of a call insn, which is stupid, since these are certainly
1516 ABI defined hard registers. For these, and for asm operands
1517 that originally referenced hard registers, we must record that
1518 the chain cannot be renamed. */
1519 if (CALL_P (insn)
1520 || (asm_noperands (PATTERN (insn)) > 0
1521 && REG_P (op)
1522 && REGNO (op) == ORIGINAL_REGNO (op)))
1524 if (prev_open != open_chains)
1525 open_chains->cannot_rename = 1;
1528 cur_operand = NULL;
1531 /* Build def/use chain. */
1533 static bool
1534 build_def_use (basic_block bb)
1536 rtx_insn *insn;
1537 unsigned HOST_WIDE_INT untracked_operands;
1539 fail_current_block = false;
1541 for (insn = BB_HEAD (bb); ; insn = NEXT_INSN (insn))
1543 if (NONDEBUG_INSN_P (insn))
1545 int n_ops;
1546 rtx note;
1547 rtx old_operands[MAX_RECOG_OPERANDS];
1548 rtx old_dups[MAX_DUP_OPERANDS];
1549 int i;
1550 int predicated;
1551 enum rtx_code set_code = SET;
1552 enum rtx_code clobber_code = CLOBBER;
1553 insn_rr_info *insn_info = NULL;
1555 /* Process the insn, determining its effect on the def-use
1556 chains and live hard registers. We perform the following
1557 steps with the register references in the insn, simulating
1558 its effect:
1559 (1) Deal with earlyclobber operands and CLOBBERs of non-operands
1560 by creating chains and marking hard regs live.
1561 (2) Any read outside an operand causes any chain it overlaps
1562 with to be marked unrenamable.
1563 (3) Any read inside an operand is added if there's already
1564 an open chain for it.
1565 (4) For any REG_DEAD note we find, close open chains that
1566 overlap it.
1567 (5) For any non-earlyclobber write we find, close open chains
1568 that overlap it.
1569 (6) For any non-earlyclobber write we find in an operand, make
1570 a new chain or mark the hard register as live.
1571 (7) For any REG_UNUSED, close any chains we just opened.
1573 We cannot deal with situations where we track a reg in one mode
1574 and see a reference in another mode; these will cause the chain
1575 to be marked unrenamable or even cause us to abort the entire
1576 basic block. */
1578 extract_constrain_insn (insn);
1579 preprocess_constraints (insn);
1580 const operand_alternative *op_alt = which_op_alt ();
1581 n_ops = recog_data.n_operands;
1582 untracked_operands = 0;
1584 if (insn_rr.exists ())
1586 insn_info = &insn_rr[INSN_UID (insn)];
1587 insn_info->op_info = XOBNEWVEC (&rename_obstack, operand_rr_info,
1588 recog_data.n_operands);
1589 memset (insn_info->op_info, 0,
1590 sizeof (operand_rr_info) * recog_data.n_operands);
1593 /* Simplify the code below by promoting OP_OUT to OP_INOUT in
1594 predicated instructions, but only for register operands
1595 that are already tracked, so that we can create a chain
1596 when the first SET makes a register live. */
1598 predicated = GET_CODE (PATTERN (insn)) == COND_EXEC;
1599 for (i = 0; i < n_ops; ++i)
1601 rtx op = recog_data.operand[i];
1602 int matches = op_alt[i].matches;
1603 if (matches >= 0 || op_alt[i].matched >= 0
1604 || (predicated && recog_data.operand_type[i] == OP_OUT))
1606 recog_data.operand_type[i] = OP_INOUT;
1607 /* A special case to deal with instruction patterns that
1608 have matching operands with different modes. If we're
1609 not already tracking such a reg, we won't start here,
1610 and we must instead make sure to make the operand visible
1611 to the machinery that tracks hard registers. */
1612 if (matches >= 0
1613 && (GET_MODE_SIZE (recog_data.operand_mode[i])
1614 != GET_MODE_SIZE (recog_data.operand_mode[matches]))
1615 && !verify_reg_in_set (op, &live_in_chains))
1617 untracked_operands |= 1 << i;
1618 untracked_operands |= 1 << matches;
1621 /* If there's an in-out operand with a register that is not
1622 being tracked at all yet, open a chain. */
1623 if (recog_data.operand_type[i] == OP_INOUT
1624 && !(untracked_operands & (1 << i))
1625 && REG_P (op)
1626 && !verify_reg_tracked (op))
1628 machine_mode mode = GET_MODE (op);
1629 unsigned this_regno = REGNO (op);
1630 unsigned this_nregs = hard_regno_nregs[this_regno][mode];
1631 create_new_chain (this_regno, this_nregs, NULL, NULL,
1632 NO_REGS);
1636 if (fail_current_block)
1637 break;
1639 /* Step 1a: Mark hard registers that are clobbered in this insn,
1640 outside an operand, as live. */
1641 hide_operands (n_ops, old_operands, old_dups, untracked_operands,
1642 false);
1643 note_stores (PATTERN (insn), note_sets_clobbers, &clobber_code);
1644 restore_operands (insn, n_ops, old_operands, old_dups);
1646 /* Step 1b: Begin new chains for earlyclobbered writes inside
1647 operands. */
1648 record_out_operands (insn, true, insn_info);
1650 /* Step 2: Mark chains for which we have reads outside operands
1651 as unrenamable.
1652 We do this by munging all operands into CC0, and closing
1653 everything remaining. */
1655 hide_operands (n_ops, old_operands, old_dups, untracked_operands,
1656 false);
1657 scan_rtx (insn, &PATTERN (insn), NO_REGS, mark_all_read, OP_IN);
1658 restore_operands (insn, n_ops, old_operands, old_dups);
1660 /* Step 2B: Can't rename function call argument registers. */
1661 if (CALL_P (insn) && CALL_INSN_FUNCTION_USAGE (insn))
1662 scan_rtx (insn, &CALL_INSN_FUNCTION_USAGE (insn),
1663 NO_REGS, mark_all_read, OP_IN);
1665 /* Step 2C: Can't rename asm operands that were originally
1666 hard registers. */
1667 if (asm_noperands (PATTERN (insn)) > 0)
1668 for (i = 0; i < n_ops; i++)
1670 rtx *loc = recog_data.operand_loc[i];
1671 rtx op = *loc;
1673 if (REG_P (op)
1674 && REGNO (op) == ORIGINAL_REGNO (op)
1675 && (recog_data.operand_type[i] == OP_IN
1676 || recog_data.operand_type[i] == OP_INOUT))
1677 scan_rtx (insn, loc, NO_REGS, mark_all_read, OP_IN);
1680 /* Step 3: Append to chains for reads inside operands. */
1681 for (i = 0; i < n_ops + recog_data.n_dups; i++)
1683 int opn = i < n_ops ? i : recog_data.dup_num[i - n_ops];
1684 rtx *loc = (i < n_ops
1685 ? recog_data.operand_loc[opn]
1686 : recog_data.dup_loc[i - n_ops]);
1687 enum reg_class cl = alternative_class (op_alt, opn);
1688 enum op_type type = recog_data.operand_type[opn];
1690 /* Don't scan match_operand here, since we've no reg class
1691 information to pass down. Any operands that we could
1692 substitute in will be represented elsewhere. */
1693 if (recog_data.constraints[opn][0] == '\0'
1694 || untracked_operands & (1 << opn))
1695 continue;
1697 if (insn_info)
1698 cur_operand = i == opn ? insn_info->op_info + i : NULL;
1699 if (op_alt[opn].is_address)
1700 scan_rtx_address (insn, loc, cl, mark_read,
1701 VOIDmode, ADDR_SPACE_GENERIC);
1702 else
1703 scan_rtx (insn, loc, cl, mark_read, type);
1705 cur_operand = NULL;
1707 /* Step 3B: Record updates for regs in REG_INC notes, and
1708 source regs in REG_FRAME_RELATED_EXPR notes. */
1709 for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
1710 if (REG_NOTE_KIND (note) == REG_INC
1711 || REG_NOTE_KIND (note) == REG_FRAME_RELATED_EXPR)
1712 scan_rtx (insn, &XEXP (note, 0), ALL_REGS, mark_read,
1713 OP_INOUT);
1715 /* Step 4: Close chains for registers that die here, unless
1716 the register is mentioned in a REG_UNUSED note. In that
1717 case we keep the chain open until step #7 below to ensure
1718 it conflicts with other output operands of this insn.
1719 See PR 52573. Arguably the insn should not have both
1720 notes; it has proven difficult to fix that without
1721 other undesirable side effects. */
1722 for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
1723 if (REG_NOTE_KIND (note) == REG_DEAD
1724 && !find_regno_note (insn, REG_UNUSED, REGNO (XEXP (note, 0))))
1726 remove_from_hard_reg_set (&live_hard_regs,
1727 GET_MODE (XEXP (note, 0)),
1728 REGNO (XEXP (note, 0)));
1729 scan_rtx (insn, &XEXP (note, 0), NO_REGS, terminate_dead,
1730 OP_IN);
1733 /* Step 4B: If this is a call, any chain live at this point
1734 requires a caller-saved reg. */
1735 if (CALL_P (insn))
1737 struct du_head *p;
1738 for (p = open_chains; p; p = p->next_chain)
1739 p->need_caller_save_reg = 1;
1742 /* Step 5: Close open chains that overlap writes. Similar to
1743 step 2, we hide in-out operands, since we do not want to
1744 close these chains. We also hide earlyclobber operands,
1745 since we've opened chains for them in step 1, and earlier
1746 chains they would overlap with must have been closed at
1747 the previous insn at the latest, as such operands cannot
1748 possibly overlap with any input operands. */
1750 hide_operands (n_ops, old_operands, old_dups, untracked_operands,
1751 true);
1752 scan_rtx (insn, &PATTERN (insn), NO_REGS, terminate_write, OP_IN);
1753 restore_operands (insn, n_ops, old_operands, old_dups);
1755 /* Step 6a: Mark hard registers that are set in this insn,
1756 outside an operand, as live. */
1757 hide_operands (n_ops, old_operands, old_dups, untracked_operands,
1758 false);
1759 note_stores (PATTERN (insn), note_sets_clobbers, &set_code);
1760 restore_operands (insn, n_ops, old_operands, old_dups);
1762 /* Step 6b: Begin new chains for writes inside operands. */
1763 record_out_operands (insn, false, insn_info);
1765 /* Step 6c: Record destination regs in REG_FRAME_RELATED_EXPR
1766 notes for update. */
1767 for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
1768 if (REG_NOTE_KIND (note) == REG_FRAME_RELATED_EXPR)
1769 scan_rtx (insn, &XEXP (note, 0), ALL_REGS, mark_access,
1770 OP_INOUT);
1772 /* Step 7: Close chains for registers that were never
1773 really used here. */
1774 for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
1775 if (REG_NOTE_KIND (note) == REG_UNUSED)
1777 remove_from_hard_reg_set (&live_hard_regs,
1778 GET_MODE (XEXP (note, 0)),
1779 REGNO (XEXP (note, 0)));
1780 scan_rtx (insn, &XEXP (note, 0), NO_REGS, terminate_dead,
1781 OP_IN);
1784 else if (DEBUG_INSN_P (insn)
1785 && !VAR_LOC_UNKNOWN_P (INSN_VAR_LOCATION_LOC (insn)))
1787 scan_rtx (insn, &INSN_VAR_LOCATION_LOC (insn),
1788 ALL_REGS, mark_read, OP_IN);
1790 if (insn == BB_END (bb))
1791 break;
1794 if (fail_current_block)
1795 return false;
1797 return true;
1800 /* Initialize the register renamer. If INSN_INFO is true, ensure that
1801 insn_rr is nonnull. */
1802 void
1803 regrename_init (bool insn_info)
1805 gcc_obstack_init (&rename_obstack);
1806 insn_rr.create (0);
1807 if (insn_info)
1808 insn_rr.safe_grow_cleared (get_max_uid ());
1811 /* Free all global data used by the register renamer. */
1812 void
1813 regrename_finish (void)
1815 insn_rr.release ();
1816 free_chain_data ();
1817 obstack_free (&rename_obstack, NULL);
1820 /* Perform register renaming on the current function. */
1822 static unsigned int
1823 regrename_optimize (void)
1825 df_set_flags (DF_LR_RUN_DCE);
1826 df_note_add_problem ();
1827 df_analyze ();
1828 df_set_flags (DF_DEFER_INSN_RESCAN);
1830 regrename_init (false);
1832 regrename_analyze (NULL);
1834 rename_chains ();
1836 regrename_finish ();
1838 return 0;
1841 namespace {
1843 const pass_data pass_data_regrename =
1845 RTL_PASS, /* type */
1846 "rnreg", /* name */
1847 OPTGROUP_NONE, /* optinfo_flags */
1848 TV_RENAME_REGISTERS, /* tv_id */
1849 0, /* properties_required */
1850 0, /* properties_provided */
1851 0, /* properties_destroyed */
1852 0, /* todo_flags_start */
1853 TODO_df_finish, /* todo_flags_finish */
1856 class pass_regrename : public rtl_opt_pass
1858 public:
1859 pass_regrename (gcc::context *ctxt)
1860 : rtl_opt_pass (pass_data_regrename, ctxt)
1863 /* opt_pass methods: */
1864 virtual bool gate (function *)
1866 return (optimize > 0 && (flag_rename_registers));
1869 virtual unsigned int execute (function *) { return regrename_optimize (); }
1871 }; // class pass_regrename
1873 } // anon namespace
1875 rtl_opt_pass *
1876 make_pass_regrename (gcc::context *ctxt)
1878 return new pass_regrename (ctxt);