Fix testuite for updated ICF dumps.
[official-gcc.git] / gcc / regrename.c
blob147aaa89e4e0c3cf1fe2917bc1de3cff12590dfe
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 #ifdef HARD_REGNO_RENAME_OK
337 || ! HARD_REGNO_RENAME_OK (reg + i, new_reg + i)
338 #endif
340 return false;
342 /* See whether it accepts all modes that occur in
343 definition and uses. */
344 for (tmp = this_head->first; tmp; tmp = tmp->next_use)
345 if ((! HARD_REGNO_MODE_OK (new_reg, GET_MODE (*tmp->loc))
346 && ! DEBUG_INSN_P (tmp->insn))
347 || (this_head->need_caller_save_reg
348 && ! (HARD_REGNO_CALL_PART_CLOBBERED
349 (reg, GET_MODE (*tmp->loc)))
350 && (HARD_REGNO_CALL_PART_CLOBBERED
351 (new_reg, GET_MODE (*tmp->loc)))))
352 return false;
354 return true;
357 /* For the chain THIS_HEAD, compute and return the best register to
358 rename to. SUPER_CLASS is the superunion of register classes in
359 the chain. UNAVAILABLE is a set of registers that cannot be used.
360 OLD_REG is the register currently used for the chain. BEST_RENAME
361 controls whether the register chosen must be better than the
362 current one or just respect the given constraint. */
365 find_rename_reg (du_head_p this_head, enum reg_class super_class,
366 HARD_REG_SET *unavailable, int old_reg, bool best_rename)
368 bool has_preferred_class;
369 enum reg_class preferred_class;
370 int pass;
371 int best_new_reg = old_reg;
373 /* Further narrow the set of registers we can use for renaming.
374 If the chain needs a call-saved register, mark the call-used
375 registers as unavailable. */
376 if (this_head->need_caller_save_reg)
377 IOR_HARD_REG_SET (*unavailable, call_used_reg_set);
379 /* Mark registers that overlap this chain's lifetime as unavailable. */
380 merge_overlapping_regs (unavailable, this_head);
382 /* Compute preferred rename class of super union of all the classes
383 in the chain. */
384 preferred_class
385 = (enum reg_class) targetm.preferred_rename_class (super_class);
387 /* If PREFERRED_CLASS is not NO_REGS, we iterate in the first pass
388 over registers that belong to PREFERRED_CLASS and try to find the
389 best register within the class. If that failed, we iterate in
390 the second pass over registers that don't belong to the class.
391 If PREFERRED_CLASS is NO_REGS, we iterate over all registers in
392 ascending order without any preference. */
393 has_preferred_class = (preferred_class != NO_REGS);
394 for (pass = (has_preferred_class ? 0 : 1); pass < 2; pass++)
396 int new_reg;
397 for (new_reg = 0; new_reg < FIRST_PSEUDO_REGISTER; new_reg++)
399 if (has_preferred_class
400 && (pass == 0)
401 != TEST_HARD_REG_BIT (reg_class_contents[preferred_class],
402 new_reg))
403 continue;
405 if (!check_new_reg_p (old_reg, new_reg, this_head, *unavailable))
406 continue;
408 if (!best_rename)
409 return new_reg;
411 /* In the first pass, we force the renaming of registers that
412 don't belong to PREFERRED_CLASS to registers that do, even
413 though the latters were used not very long ago. */
414 if ((pass == 0
415 && !TEST_HARD_REG_BIT (reg_class_contents[preferred_class],
416 best_new_reg))
417 || tick[best_new_reg] > tick[new_reg])
418 best_new_reg = new_reg;
420 if (pass == 0 && best_new_reg != old_reg)
421 break;
423 return best_new_reg;
426 /* Perform register renaming on the current function. */
427 static void
428 rename_chains (void)
430 HARD_REG_SET unavailable;
431 du_head_p this_head;
432 int i;
434 memset (tick, 0, sizeof tick);
436 CLEAR_HARD_REG_SET (unavailable);
437 /* Don't clobber traceback for noreturn functions. */
438 if (frame_pointer_needed)
440 add_to_hard_reg_set (&unavailable, Pmode, FRAME_POINTER_REGNUM);
441 if (!HARD_FRAME_POINTER_IS_FRAME_POINTER)
442 add_to_hard_reg_set (&unavailable, Pmode, HARD_FRAME_POINTER_REGNUM);
445 FOR_EACH_VEC_ELT (id_to_chain, i, this_head)
447 int best_new_reg;
448 int n_uses;
449 struct du_chain *tmp;
450 HARD_REG_SET this_unavailable;
451 int reg = this_head->regno;
452 enum reg_class super_class = NO_REGS;
454 if (this_head->cannot_rename)
455 continue;
457 if (fixed_regs[reg] || global_regs[reg]
458 #if !HARD_FRAME_POINTER_IS_FRAME_POINTER
459 || (frame_pointer_needed && reg == HARD_FRAME_POINTER_REGNUM)
460 #else
461 || (frame_pointer_needed && reg == FRAME_POINTER_REGNUM)
462 #endif
464 continue;
466 COPY_HARD_REG_SET (this_unavailable, unavailable);
468 /* Iterate over elements in the chain in order to:
469 1. Count number of uses, and narrow the set of registers we can
470 use for renaming.
471 2. Compute the superunion of register classes in this chain. */
472 n_uses = 0;
473 super_class = NO_REGS;
474 for (tmp = this_head->first; tmp; tmp = tmp->next_use)
476 if (DEBUG_INSN_P (tmp->insn))
477 continue;
478 n_uses++;
479 IOR_COMPL_HARD_REG_SET (this_unavailable,
480 reg_class_contents[tmp->cl]);
481 super_class
482 = reg_class_superunion[(int) super_class][(int) tmp->cl];
485 if (n_uses < 2)
486 continue;
488 best_new_reg = find_rename_reg (this_head, super_class,
489 &this_unavailable, reg, true);
491 if (dump_file)
493 fprintf (dump_file, "Register %s in insn %d",
494 reg_names[reg], INSN_UID (this_head->first->insn));
495 if (this_head->need_caller_save_reg)
496 fprintf (dump_file, " crosses a call");
499 if (best_new_reg == reg)
501 tick[reg] = ++this_tick;
502 if (dump_file)
503 fprintf (dump_file, "; no available better choice\n");
504 continue;
507 if (dump_file)
508 fprintf (dump_file, ", renamed as %s\n", reg_names[best_new_reg]);
510 regrename_do_replace (this_head, best_new_reg);
511 tick[best_new_reg] = ++this_tick;
512 df_set_regs_ever_live (best_new_reg, true);
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 void
939 regrename_do_replace (struct du_head *head, int reg)
941 struct du_chain *chain;
942 unsigned int base_regno = head->regno;
943 machine_mode mode;
945 for (chain = head->first; chain; chain = chain->next_use)
947 unsigned int regno = ORIGINAL_REGNO (*chain->loc);
948 struct reg_attrs *attr = REG_ATTRS (*chain->loc);
949 int reg_ptr = REG_POINTER (*chain->loc);
951 if (DEBUG_INSN_P (chain->insn) && REGNO (*chain->loc) != base_regno)
952 INSN_VAR_LOCATION_LOC (chain->insn) = gen_rtx_UNKNOWN_VAR_LOC ();
953 else
955 *chain->loc = gen_raw_REG (GET_MODE (*chain->loc), reg);
956 if (regno >= FIRST_PSEUDO_REGISTER)
957 ORIGINAL_REGNO (*chain->loc) = regno;
958 REG_ATTRS (*chain->loc) = attr;
959 REG_POINTER (*chain->loc) = reg_ptr;
962 df_insn_rescan (chain->insn);
965 mode = GET_MODE (*head->first->loc);
966 head->regno = reg;
967 head->nregs = hard_regno_nregs[reg][mode];
971 /* True if we found a register with a size mismatch, which means that we
972 can't track its lifetime accurately. If so, we abort the current block
973 without renaming. */
974 static bool fail_current_block;
976 /* Return true if OP is a reg for which all bits are set in PSET, false
977 if all bits are clear.
978 In other cases, set fail_current_block and return false. */
980 static bool
981 verify_reg_in_set (rtx op, HARD_REG_SET *pset)
983 unsigned regno, nregs;
984 bool all_live, all_dead;
985 if (!REG_P (op))
986 return false;
988 regno = REGNO (op);
989 nregs = hard_regno_nregs[regno][GET_MODE (op)];
990 all_live = all_dead = true;
991 while (nregs-- > 0)
992 if (TEST_HARD_REG_BIT (*pset, regno + nregs))
993 all_dead = false;
994 else
995 all_live = false;
996 if (!all_dead && !all_live)
998 fail_current_block = true;
999 return false;
1001 return all_live;
1004 /* Return true if OP is a reg that is being tracked already in some form.
1005 May set fail_current_block if it sees an unhandled case of overlap. */
1007 static bool
1008 verify_reg_tracked (rtx op)
1010 return (verify_reg_in_set (op, &live_hard_regs)
1011 || verify_reg_in_set (op, &live_in_chains));
1014 /* Called through note_stores. DATA points to a rtx_code, either SET or
1015 CLOBBER, which tells us which kind of rtx to look at. If we have a
1016 match, record the set register in live_hard_regs and in the hard_conflicts
1017 bitmap of open chains. */
1019 static void
1020 note_sets_clobbers (rtx x, const_rtx set, void *data)
1022 enum rtx_code code = *(enum rtx_code *)data;
1023 struct du_head *chain;
1025 if (GET_CODE (x) == SUBREG)
1026 x = SUBREG_REG (x);
1027 if (!REG_P (x) || GET_CODE (set) != code)
1028 return;
1029 /* There must not be pseudos at this point. */
1030 gcc_assert (HARD_REGISTER_P (x));
1031 add_to_hard_reg_set (&live_hard_regs, GET_MODE (x), REGNO (x));
1032 for (chain = open_chains; chain; chain = chain->next_chain)
1033 add_to_hard_reg_set (&chain->hard_conflicts, GET_MODE (x), REGNO (x));
1036 static void
1037 scan_rtx_reg (rtx_insn *insn, rtx *loc, enum reg_class cl, enum scan_actions action,
1038 enum op_type type)
1040 struct du_head **p;
1041 rtx x = *loc;
1042 machine_mode mode = GET_MODE (x);
1043 unsigned this_regno = REGNO (x);
1044 int this_nregs = hard_regno_nregs[this_regno][mode];
1046 if (action == mark_write)
1048 if (type == OP_OUT)
1049 create_new_chain (this_regno, this_nregs, loc, insn, cl);
1050 return;
1053 if ((type == OP_OUT) != (action == terminate_write || action == mark_access))
1054 return;
1056 for (p = &open_chains; *p;)
1058 struct du_head *head = *p;
1059 struct du_head *next = head->next_chain;
1060 int exact_match = (head->regno == this_regno
1061 && head->nregs == this_nregs);
1062 int superset = (this_regno <= head->regno
1063 && this_regno + this_nregs >= head->regno + head->nregs);
1064 int subset = (this_regno >= head->regno
1065 && this_regno + this_nregs <= head->regno + head->nregs);
1067 if (!bitmap_bit_p (&open_chains_set, head->id)
1068 || head->regno + head->nregs <= this_regno
1069 || this_regno + this_nregs <= head->regno)
1071 p = &head->next_chain;
1072 continue;
1075 if (action == mark_read || action == mark_access)
1077 /* ??? Class NO_REGS can happen if the md file makes use of
1078 EXTRA_CONSTRAINTS to match registers. Which is arguably
1079 wrong, but there we are. */
1081 if (cl == NO_REGS || (!exact_match && !DEBUG_INSN_P (insn)))
1083 if (dump_file)
1084 fprintf (dump_file,
1085 "Cannot rename chain %s (%d) at insn %d (%s)\n",
1086 reg_names[head->regno], head->id, INSN_UID (insn),
1087 scan_actions_name[(int) action]);
1088 head->cannot_rename = 1;
1089 if (superset)
1091 unsigned nregs = this_nregs;
1092 head->regno = this_regno;
1093 head->nregs = this_nregs;
1094 while (nregs-- > 0)
1095 SET_HARD_REG_BIT (live_in_chains, head->regno + nregs);
1096 if (dump_file)
1097 fprintf (dump_file,
1098 "Widening register in chain %s (%d) at insn %d\n",
1099 reg_names[head->regno], head->id, INSN_UID (insn));
1101 else if (!subset)
1103 fail_current_block = true;
1104 if (dump_file)
1105 fprintf (dump_file,
1106 "Failing basic block due to unhandled overlap\n");
1109 else
1111 struct du_chain *this_du;
1112 this_du = XOBNEW (&rename_obstack, struct du_chain);
1113 this_du->next_use = 0;
1114 this_du->loc = loc;
1115 this_du->insn = insn;
1116 this_du->cl = cl;
1117 if (head->first == NULL)
1118 head->first = this_du;
1119 else
1120 head->last->next_use = this_du;
1121 record_operand_use (head, this_du);
1122 head->last = this_du;
1124 /* Avoid adding the same location in a DEBUG_INSN multiple times,
1125 which could happen with non-exact overlap. */
1126 if (DEBUG_INSN_P (insn))
1127 return;
1128 /* Otherwise, find any other chains that do not match exactly;
1129 ensure they all get marked unrenamable. */
1130 p = &head->next_chain;
1131 continue;
1134 /* Whether the terminated chain can be used for renaming
1135 depends on the action and this being an exact match.
1136 In either case, we remove this element from open_chains. */
1138 if ((action == terminate_dead || action == terminate_write)
1139 && (superset || subset))
1141 unsigned nregs;
1143 if (subset && !superset)
1144 head->cannot_rename = 1;
1145 bitmap_clear_bit (&open_chains_set, head->id);
1147 nregs = head->nregs;
1148 while (nregs-- > 0)
1150 CLEAR_HARD_REG_BIT (live_in_chains, head->regno + nregs);
1151 if (subset && !superset
1152 && (head->regno + nregs < this_regno
1153 || head->regno + nregs >= this_regno + this_nregs))
1154 SET_HARD_REG_BIT (live_hard_regs, head->regno + nregs);
1157 *p = next;
1158 if (dump_file)
1159 fprintf (dump_file,
1160 "Closing chain %s (%d) at insn %d (%s%s)\n",
1161 reg_names[head->regno], head->id, INSN_UID (insn),
1162 scan_actions_name[(int) action],
1163 superset ? ", superset" : subset ? ", subset" : "");
1165 else if (action == terminate_dead || action == terminate_write)
1167 /* In this case, tracking liveness gets too hard. Fail the
1168 entire basic block. */
1169 if (dump_file)
1170 fprintf (dump_file,
1171 "Failing basic block due to unhandled overlap\n");
1172 fail_current_block = true;
1173 return;
1175 else
1177 head->cannot_rename = 1;
1178 if (dump_file)
1179 fprintf (dump_file,
1180 "Cannot rename chain %s (%d) at insn %d (%s)\n",
1181 reg_names[head->regno], head->id, INSN_UID (insn),
1182 scan_actions_name[(int) action]);
1183 p = &head->next_chain;
1188 /* Adapted from find_reloads_address_1. CL is INDEX_REG_CLASS or
1189 BASE_REG_CLASS depending on how the register is being considered. */
1191 static void
1192 scan_rtx_address (rtx_insn *insn, rtx *loc, enum reg_class cl,
1193 enum scan_actions action, machine_mode mode,
1194 addr_space_t as)
1196 rtx x = *loc;
1197 RTX_CODE code = GET_CODE (x);
1198 const char *fmt;
1199 int i, j;
1201 if (action == mark_write || action == mark_access)
1202 return;
1204 switch (code)
1206 case PLUS:
1208 rtx orig_op0 = XEXP (x, 0);
1209 rtx orig_op1 = XEXP (x, 1);
1210 RTX_CODE code0 = GET_CODE (orig_op0);
1211 RTX_CODE code1 = GET_CODE (orig_op1);
1212 rtx op0 = orig_op0;
1213 rtx op1 = orig_op1;
1214 rtx *locI = NULL;
1215 rtx *locB = NULL;
1216 enum rtx_code index_code = SCRATCH;
1218 if (GET_CODE (op0) == SUBREG)
1220 op0 = SUBREG_REG (op0);
1221 code0 = GET_CODE (op0);
1224 if (GET_CODE (op1) == SUBREG)
1226 op1 = SUBREG_REG (op1);
1227 code1 = GET_CODE (op1);
1230 if (code0 == MULT || code0 == SIGN_EXTEND || code0 == TRUNCATE
1231 || code0 == ZERO_EXTEND || code1 == MEM)
1233 locI = &XEXP (x, 0);
1234 locB = &XEXP (x, 1);
1235 index_code = GET_CODE (*locI);
1237 else if (code1 == MULT || code1 == SIGN_EXTEND || code1 == TRUNCATE
1238 || code1 == ZERO_EXTEND || code0 == MEM)
1240 locI = &XEXP (x, 1);
1241 locB = &XEXP (x, 0);
1242 index_code = GET_CODE (*locI);
1244 else if (code0 == CONST_INT || code0 == CONST
1245 || code0 == SYMBOL_REF || code0 == LABEL_REF)
1247 locB = &XEXP (x, 1);
1248 index_code = GET_CODE (XEXP (x, 0));
1250 else if (code1 == CONST_INT || code1 == CONST
1251 || code1 == SYMBOL_REF || code1 == LABEL_REF)
1253 locB = &XEXP (x, 0);
1254 index_code = GET_CODE (XEXP (x, 1));
1256 else if (code0 == REG && code1 == REG)
1258 int index_op;
1259 unsigned regno0 = REGNO (op0), regno1 = REGNO (op1);
1261 if (REGNO_OK_FOR_INDEX_P (regno1)
1262 && regno_ok_for_base_p (regno0, mode, as, PLUS, REG))
1263 index_op = 1;
1264 else if (REGNO_OK_FOR_INDEX_P (regno0)
1265 && regno_ok_for_base_p (regno1, mode, as, PLUS, REG))
1266 index_op = 0;
1267 else if (regno_ok_for_base_p (regno0, mode, as, PLUS, REG)
1268 || REGNO_OK_FOR_INDEX_P (regno1))
1269 index_op = 1;
1270 else if (regno_ok_for_base_p (regno1, mode, as, PLUS, REG))
1271 index_op = 0;
1272 else
1273 index_op = 1;
1275 locI = &XEXP (x, index_op);
1276 locB = &XEXP (x, !index_op);
1277 index_code = GET_CODE (*locI);
1279 else if (code0 == REG)
1281 locI = &XEXP (x, 0);
1282 locB = &XEXP (x, 1);
1283 index_code = GET_CODE (*locI);
1285 else if (code1 == REG)
1287 locI = &XEXP (x, 1);
1288 locB = &XEXP (x, 0);
1289 index_code = GET_CODE (*locI);
1292 if (locI)
1293 scan_rtx_address (insn, locI, INDEX_REG_CLASS, action, mode, as);
1294 if (locB)
1295 scan_rtx_address (insn, locB,
1296 base_reg_class (mode, as, PLUS, index_code),
1297 action, mode, as);
1299 return;
1302 case POST_INC:
1303 case POST_DEC:
1304 case POST_MODIFY:
1305 case PRE_INC:
1306 case PRE_DEC:
1307 case PRE_MODIFY:
1308 #ifndef AUTO_INC_DEC
1309 /* If the target doesn't claim to handle autoinc, this must be
1310 something special, like a stack push. Kill this chain. */
1311 action = mark_all_read;
1312 #endif
1313 break;
1315 case MEM:
1316 scan_rtx_address (insn, &XEXP (x, 0),
1317 base_reg_class (GET_MODE (x), MEM_ADDR_SPACE (x),
1318 MEM, SCRATCH),
1319 action, GET_MODE (x), MEM_ADDR_SPACE (x));
1320 return;
1322 case REG:
1323 scan_rtx_reg (insn, loc, cl, action, OP_IN);
1324 return;
1326 default:
1327 break;
1330 fmt = GET_RTX_FORMAT (code);
1331 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1333 if (fmt[i] == 'e')
1334 scan_rtx_address (insn, &XEXP (x, i), cl, action, mode, as);
1335 else if (fmt[i] == 'E')
1336 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
1337 scan_rtx_address (insn, &XVECEXP (x, i, j), cl, action, mode, as);
1341 static void
1342 scan_rtx (rtx_insn *insn, rtx *loc, enum reg_class cl, enum scan_actions action,
1343 enum op_type type)
1345 const char *fmt;
1346 rtx x = *loc;
1347 enum rtx_code code = GET_CODE (x);
1348 int i, j;
1350 code = GET_CODE (x);
1351 switch (code)
1353 case CONST:
1354 CASE_CONST_ANY:
1355 case SYMBOL_REF:
1356 case LABEL_REF:
1357 case CC0:
1358 case PC:
1359 return;
1361 case REG:
1362 scan_rtx_reg (insn, loc, cl, action, type);
1363 return;
1365 case MEM:
1366 scan_rtx_address (insn, &XEXP (x, 0),
1367 base_reg_class (GET_MODE (x), MEM_ADDR_SPACE (x),
1368 MEM, SCRATCH),
1369 action, GET_MODE (x), MEM_ADDR_SPACE (x));
1370 return;
1372 case SET:
1373 scan_rtx (insn, &SET_SRC (x), cl, action, OP_IN);
1374 scan_rtx (insn, &SET_DEST (x), cl, action,
1375 (GET_CODE (PATTERN (insn)) == COND_EXEC
1376 && verify_reg_tracked (SET_DEST (x))) ? OP_INOUT : OP_OUT);
1377 return;
1379 case STRICT_LOW_PART:
1380 scan_rtx (insn, &XEXP (x, 0), cl, action,
1381 verify_reg_tracked (XEXP (x, 0)) ? OP_INOUT : OP_OUT);
1382 return;
1384 case ZERO_EXTRACT:
1385 case SIGN_EXTRACT:
1386 scan_rtx (insn, &XEXP (x, 0), cl, action,
1387 (type == OP_IN ? OP_IN :
1388 verify_reg_tracked (XEXP (x, 0)) ? OP_INOUT : OP_OUT));
1389 scan_rtx (insn, &XEXP (x, 1), cl, action, OP_IN);
1390 scan_rtx (insn, &XEXP (x, 2), cl, action, OP_IN);
1391 return;
1393 case POST_INC:
1394 case PRE_INC:
1395 case POST_DEC:
1396 case PRE_DEC:
1397 case POST_MODIFY:
1398 case PRE_MODIFY:
1399 /* Should only happen inside MEM. */
1400 gcc_unreachable ();
1402 case CLOBBER:
1403 scan_rtx (insn, &SET_DEST (x), cl, action,
1404 (GET_CODE (PATTERN (insn)) == COND_EXEC
1405 && verify_reg_tracked (SET_DEST (x))) ? OP_INOUT : OP_OUT);
1406 return;
1408 case EXPR_LIST:
1409 scan_rtx (insn, &XEXP (x, 0), cl, action, type);
1410 if (XEXP (x, 1))
1411 scan_rtx (insn, &XEXP (x, 1), cl, action, type);
1412 return;
1414 default:
1415 break;
1418 fmt = GET_RTX_FORMAT (code);
1419 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1421 if (fmt[i] == 'e')
1422 scan_rtx (insn, &XEXP (x, i), cl, action, type);
1423 else if (fmt[i] == 'E')
1424 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
1425 scan_rtx (insn, &XVECEXP (x, i, j), cl, action, type);
1429 /* Hide operands of the current insn (of which there are N_OPS) by
1430 substituting cc0 for them.
1431 Previous values are stored in the OLD_OPERANDS and OLD_DUPS.
1432 For every bit set in DO_NOT_HIDE, we leave the operand alone.
1433 If INOUT_AND_EC_ONLY is set, we only do this for OP_INOUT type operands
1434 and earlyclobbers. */
1436 static void
1437 hide_operands (int n_ops, rtx *old_operands, rtx *old_dups,
1438 unsigned HOST_WIDE_INT do_not_hide, bool inout_and_ec_only)
1440 int i;
1441 const operand_alternative *op_alt = which_op_alt ();
1442 for (i = 0; i < n_ops; i++)
1444 old_operands[i] = recog_data.operand[i];
1445 /* Don't squash match_operator or match_parallel here, since
1446 we don't know that all of the contained registers are
1447 reachable by proper operands. */
1448 if (recog_data.constraints[i][0] == '\0')
1449 continue;
1450 if (do_not_hide & (1 << i))
1451 continue;
1452 if (!inout_and_ec_only || recog_data.operand_type[i] == OP_INOUT
1453 || op_alt[i].earlyclobber)
1454 *recog_data.operand_loc[i] = cc0_rtx;
1456 for (i = 0; i < recog_data.n_dups; i++)
1458 int opn = recog_data.dup_num[i];
1459 old_dups[i] = *recog_data.dup_loc[i];
1460 if (do_not_hide & (1 << opn))
1461 continue;
1462 if (!inout_and_ec_only || recog_data.operand_type[opn] == OP_INOUT
1463 || op_alt[opn].earlyclobber)
1464 *recog_data.dup_loc[i] = cc0_rtx;
1468 /* Undo the substitution performed by hide_operands. INSN is the insn we
1469 are processing; the arguments are the same as in hide_operands. */
1471 static void
1472 restore_operands (rtx_insn *insn, int n_ops, rtx *old_operands, rtx *old_dups)
1474 int i;
1475 for (i = 0; i < recog_data.n_dups; i++)
1476 *recog_data.dup_loc[i] = old_dups[i];
1477 for (i = 0; i < n_ops; i++)
1478 *recog_data.operand_loc[i] = old_operands[i];
1479 if (recog_data.n_dups)
1480 df_insn_rescan (insn);
1483 /* For each output operand of INSN, call scan_rtx to create a new
1484 open chain. Do this only for normal or earlyclobber outputs,
1485 depending on EARLYCLOBBER. If INSN_INFO is nonnull, use it to
1486 record information about the operands in the insn. */
1488 static void
1489 record_out_operands (rtx_insn *insn, bool earlyclobber, insn_rr_info *insn_info)
1491 int n_ops = recog_data.n_operands;
1492 const operand_alternative *op_alt = which_op_alt ();
1494 int i;
1496 for (i = 0; i < n_ops + recog_data.n_dups; i++)
1498 int opn = i < n_ops ? i : recog_data.dup_num[i - n_ops];
1499 rtx *loc = (i < n_ops
1500 ? recog_data.operand_loc[opn]
1501 : recog_data.dup_loc[i - n_ops]);
1502 rtx op = *loc;
1503 enum reg_class cl = alternative_class (op_alt, opn);
1505 struct du_head *prev_open;
1507 if (recog_data.operand_type[opn] != OP_OUT
1508 || op_alt[opn].earlyclobber != earlyclobber)
1509 continue;
1511 if (insn_info)
1512 cur_operand = insn_info->op_info + i;
1514 prev_open = open_chains;
1515 scan_rtx (insn, loc, cl, mark_write, OP_OUT);
1517 /* ??? Many targets have output constraints on the SET_DEST
1518 of a call insn, which is stupid, since these are certainly
1519 ABI defined hard registers. For these, and for asm operands
1520 that originally referenced hard registers, we must record that
1521 the chain cannot be renamed. */
1522 if (CALL_P (insn)
1523 || (asm_noperands (PATTERN (insn)) > 0
1524 && REG_P (op)
1525 && REGNO (op) == ORIGINAL_REGNO (op)))
1527 if (prev_open != open_chains)
1528 open_chains->cannot_rename = 1;
1531 cur_operand = NULL;
1534 /* Build def/use chain. */
1536 static bool
1537 build_def_use (basic_block bb)
1539 rtx_insn *insn;
1540 unsigned HOST_WIDE_INT untracked_operands;
1542 fail_current_block = false;
1544 for (insn = BB_HEAD (bb); ; insn = NEXT_INSN (insn))
1546 if (NONDEBUG_INSN_P (insn))
1548 int n_ops;
1549 rtx note;
1550 rtx old_operands[MAX_RECOG_OPERANDS];
1551 rtx old_dups[MAX_DUP_OPERANDS];
1552 int i;
1553 int predicated;
1554 enum rtx_code set_code = SET;
1555 enum rtx_code clobber_code = CLOBBER;
1556 insn_rr_info *insn_info = NULL;
1558 /* Process the insn, determining its effect on the def-use
1559 chains and live hard registers. We perform the following
1560 steps with the register references in the insn, simulating
1561 its effect:
1562 (1) Deal with earlyclobber operands and CLOBBERs of non-operands
1563 by creating chains and marking hard regs live.
1564 (2) Any read outside an operand causes any chain it overlaps
1565 with to be marked unrenamable.
1566 (3) Any read inside an operand is added if there's already
1567 an open chain for it.
1568 (4) For any REG_DEAD note we find, close open chains that
1569 overlap it.
1570 (5) For any non-earlyclobber write we find, close open chains
1571 that overlap it.
1572 (6) For any non-earlyclobber write we find in an operand, make
1573 a new chain or mark the hard register as live.
1574 (7) For any REG_UNUSED, close any chains we just opened.
1576 We cannot deal with situations where we track a reg in one mode
1577 and see a reference in another mode; these will cause the chain
1578 to be marked unrenamable or even cause us to abort the entire
1579 basic block. */
1581 extract_constrain_insn (insn);
1582 preprocess_constraints (insn);
1583 const operand_alternative *op_alt = which_op_alt ();
1584 n_ops = recog_data.n_operands;
1585 untracked_operands = 0;
1587 if (insn_rr.exists ())
1589 insn_info = &insn_rr[INSN_UID (insn)];
1590 insn_info->op_info = XOBNEWVEC (&rename_obstack, operand_rr_info,
1591 recog_data.n_operands);
1592 memset (insn_info->op_info, 0,
1593 sizeof (operand_rr_info) * recog_data.n_operands);
1596 /* Simplify the code below by promoting OP_OUT to OP_INOUT in
1597 predicated instructions, but only for register operands
1598 that are already tracked, so that we can create a chain
1599 when the first SET makes a register live. */
1601 predicated = GET_CODE (PATTERN (insn)) == COND_EXEC;
1602 for (i = 0; i < n_ops; ++i)
1604 rtx op = recog_data.operand[i];
1605 int matches = op_alt[i].matches;
1606 if (matches >= 0 || op_alt[i].matched >= 0
1607 || (predicated && recog_data.operand_type[i] == OP_OUT))
1609 recog_data.operand_type[i] = OP_INOUT;
1610 /* A special case to deal with instruction patterns that
1611 have matching operands with different modes. If we're
1612 not already tracking such a reg, we won't start here,
1613 and we must instead make sure to make the operand visible
1614 to the machinery that tracks hard registers. */
1615 if (matches >= 0
1616 && (GET_MODE_SIZE (recog_data.operand_mode[i])
1617 != GET_MODE_SIZE (recog_data.operand_mode[matches]))
1618 && !verify_reg_in_set (op, &live_in_chains))
1620 untracked_operands |= 1 << i;
1621 untracked_operands |= 1 << matches;
1624 /* If there's an in-out operand with a register that is not
1625 being tracked at all yet, open a chain. */
1626 if (recog_data.operand_type[i] == OP_INOUT
1627 && !(untracked_operands & (1 << i))
1628 && REG_P (op)
1629 && !verify_reg_tracked (op))
1631 machine_mode mode = GET_MODE (op);
1632 unsigned this_regno = REGNO (op);
1633 unsigned this_nregs = hard_regno_nregs[this_regno][mode];
1634 create_new_chain (this_regno, this_nregs, NULL, NULL,
1635 NO_REGS);
1639 if (fail_current_block)
1640 break;
1642 /* Step 1a: Mark hard registers that are clobbered in this insn,
1643 outside an operand, as live. */
1644 hide_operands (n_ops, old_operands, old_dups, untracked_operands,
1645 false);
1646 note_stores (PATTERN (insn), note_sets_clobbers, &clobber_code);
1647 restore_operands (insn, n_ops, old_operands, old_dups);
1649 /* Step 1b: Begin new chains for earlyclobbered writes inside
1650 operands. */
1651 record_out_operands (insn, true, insn_info);
1653 /* Step 2: Mark chains for which we have reads outside operands
1654 as unrenamable.
1655 We do this by munging all operands into CC0, and closing
1656 everything remaining. */
1658 hide_operands (n_ops, old_operands, old_dups, untracked_operands,
1659 false);
1660 scan_rtx (insn, &PATTERN (insn), NO_REGS, mark_all_read, OP_IN);
1661 restore_operands (insn, n_ops, old_operands, old_dups);
1663 /* Step 2B: Can't rename function call argument registers. */
1664 if (CALL_P (insn) && CALL_INSN_FUNCTION_USAGE (insn))
1665 scan_rtx (insn, &CALL_INSN_FUNCTION_USAGE (insn),
1666 NO_REGS, mark_all_read, OP_IN);
1668 /* Step 2C: Can't rename asm operands that were originally
1669 hard registers. */
1670 if (asm_noperands (PATTERN (insn)) > 0)
1671 for (i = 0; i < n_ops; i++)
1673 rtx *loc = recog_data.operand_loc[i];
1674 rtx op = *loc;
1676 if (REG_P (op)
1677 && REGNO (op) == ORIGINAL_REGNO (op)
1678 && (recog_data.operand_type[i] == OP_IN
1679 || recog_data.operand_type[i] == OP_INOUT))
1680 scan_rtx (insn, loc, NO_REGS, mark_all_read, OP_IN);
1683 /* Step 3: Append to chains for reads inside operands. */
1684 for (i = 0; i < n_ops + recog_data.n_dups; i++)
1686 int opn = i < n_ops ? i : recog_data.dup_num[i - n_ops];
1687 rtx *loc = (i < n_ops
1688 ? recog_data.operand_loc[opn]
1689 : recog_data.dup_loc[i - n_ops]);
1690 enum reg_class cl = alternative_class (op_alt, opn);
1691 enum op_type type = recog_data.operand_type[opn];
1693 /* Don't scan match_operand here, since we've no reg class
1694 information to pass down. Any operands that we could
1695 substitute in will be represented elsewhere. */
1696 if (recog_data.constraints[opn][0] == '\0'
1697 || untracked_operands & (1 << opn))
1698 continue;
1700 if (insn_info)
1701 cur_operand = i == opn ? insn_info->op_info + i : NULL;
1702 if (op_alt[opn].is_address)
1703 scan_rtx_address (insn, loc, cl, mark_read,
1704 VOIDmode, ADDR_SPACE_GENERIC);
1705 else
1706 scan_rtx (insn, loc, cl, mark_read, type);
1708 cur_operand = NULL;
1710 /* Step 3B: Record updates for regs in REG_INC notes, and
1711 source regs in REG_FRAME_RELATED_EXPR notes. */
1712 for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
1713 if (REG_NOTE_KIND (note) == REG_INC
1714 || REG_NOTE_KIND (note) == REG_FRAME_RELATED_EXPR)
1715 scan_rtx (insn, &XEXP (note, 0), ALL_REGS, mark_read,
1716 OP_INOUT);
1718 /* Step 4: Close chains for registers that die here, unless
1719 the register is mentioned in a REG_UNUSED note. In that
1720 case we keep the chain open until step #7 below to ensure
1721 it conflicts with other output operands of this insn.
1722 See PR 52573. Arguably the insn should not have both
1723 notes; it has proven difficult to fix that without
1724 other undesirable side effects. */
1725 for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
1726 if (REG_NOTE_KIND (note) == REG_DEAD
1727 && !find_regno_note (insn, REG_UNUSED, REGNO (XEXP (note, 0))))
1729 remove_from_hard_reg_set (&live_hard_regs,
1730 GET_MODE (XEXP (note, 0)),
1731 REGNO (XEXP (note, 0)));
1732 scan_rtx (insn, &XEXP (note, 0), NO_REGS, terminate_dead,
1733 OP_IN);
1736 /* Step 4B: If this is a call, any chain live at this point
1737 requires a caller-saved reg. */
1738 if (CALL_P (insn))
1740 struct du_head *p;
1741 for (p = open_chains; p; p = p->next_chain)
1742 p->need_caller_save_reg = 1;
1745 /* Step 5: Close open chains that overlap writes. Similar to
1746 step 2, we hide in-out operands, since we do not want to
1747 close these chains. We also hide earlyclobber operands,
1748 since we've opened chains for them in step 1, and earlier
1749 chains they would overlap with must have been closed at
1750 the previous insn at the latest, as such operands cannot
1751 possibly overlap with any input operands. */
1753 hide_operands (n_ops, old_operands, old_dups, untracked_operands,
1754 true);
1755 scan_rtx (insn, &PATTERN (insn), NO_REGS, terminate_write, OP_IN);
1756 restore_operands (insn, n_ops, old_operands, old_dups);
1758 /* Step 6a: Mark hard registers that are set in this insn,
1759 outside an operand, as live. */
1760 hide_operands (n_ops, old_operands, old_dups, untracked_operands,
1761 false);
1762 note_stores (PATTERN (insn), note_sets_clobbers, &set_code);
1763 restore_operands (insn, n_ops, old_operands, old_dups);
1765 /* Step 6b: Begin new chains for writes inside operands. */
1766 record_out_operands (insn, false, insn_info);
1768 /* Step 6c: Record destination regs in REG_FRAME_RELATED_EXPR
1769 notes for update. */
1770 for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
1771 if (REG_NOTE_KIND (note) == REG_FRAME_RELATED_EXPR)
1772 scan_rtx (insn, &XEXP (note, 0), ALL_REGS, mark_access,
1773 OP_INOUT);
1775 /* Step 7: Close chains for registers that were never
1776 really used here. */
1777 for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
1778 if (REG_NOTE_KIND (note) == REG_UNUSED)
1780 remove_from_hard_reg_set (&live_hard_regs,
1781 GET_MODE (XEXP (note, 0)),
1782 REGNO (XEXP (note, 0)));
1783 scan_rtx (insn, &XEXP (note, 0), NO_REGS, terminate_dead,
1784 OP_IN);
1787 else if (DEBUG_INSN_P (insn)
1788 && !VAR_LOC_UNKNOWN_P (INSN_VAR_LOCATION_LOC (insn)))
1790 scan_rtx (insn, &INSN_VAR_LOCATION_LOC (insn),
1791 ALL_REGS, mark_read, OP_IN);
1793 if (insn == BB_END (bb))
1794 break;
1797 if (fail_current_block)
1798 return false;
1800 return true;
1803 /* Initialize the register renamer. If INSN_INFO is true, ensure that
1804 insn_rr is nonnull. */
1805 void
1806 regrename_init (bool insn_info)
1808 gcc_obstack_init (&rename_obstack);
1809 insn_rr.create (0);
1810 if (insn_info)
1811 insn_rr.safe_grow_cleared (get_max_uid ());
1814 /* Free all global data used by the register renamer. */
1815 void
1816 regrename_finish (void)
1818 insn_rr.release ();
1819 free_chain_data ();
1820 obstack_free (&rename_obstack, NULL);
1823 /* Perform register renaming on the current function. */
1825 static unsigned int
1826 regrename_optimize (void)
1828 df_set_flags (DF_LR_RUN_DCE);
1829 df_note_add_problem ();
1830 df_analyze ();
1831 df_set_flags (DF_DEFER_INSN_RESCAN);
1833 regrename_init (false);
1835 regrename_analyze (NULL);
1837 rename_chains ();
1839 regrename_finish ();
1841 return 0;
1844 namespace {
1846 const pass_data pass_data_regrename =
1848 RTL_PASS, /* type */
1849 "rnreg", /* name */
1850 OPTGROUP_NONE, /* optinfo_flags */
1851 TV_RENAME_REGISTERS, /* tv_id */
1852 0, /* properties_required */
1853 0, /* properties_provided */
1854 0, /* properties_destroyed */
1855 0, /* todo_flags_start */
1856 TODO_df_finish, /* todo_flags_finish */
1859 class pass_regrename : public rtl_opt_pass
1861 public:
1862 pass_regrename (gcc::context *ctxt)
1863 : rtl_opt_pass (pass_data_regrename, ctxt)
1866 /* opt_pass methods: */
1867 virtual bool gate (function *)
1869 return (optimize > 0 && (flag_rename_registers));
1872 virtual unsigned int execute (function *) { return regrename_optimize (); }
1874 }; // class pass_regrename
1876 } // anon namespace
1878 rtl_opt_pass *
1879 make_pass_regrename (gcc::context *ctxt)
1881 return new pass_regrename (ctxt);