2015-06-11 Paul Thomas <pault@gcc.gnu.org>
[official-gcc.git] / gcc / regrename.c
blobd4b04694d688807fceb8b8863892adb3c1dad429
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 "input.h"
32 #include "function.h"
33 #include "dominance.h"
34 #include "cfg.h"
35 #include "cfganal.h"
36 #include "basic-block.h"
37 #include "reload.h"
38 #include "output.h"
39 #include "recog.h"
40 #include "flags.h"
41 #include "obstack.h"
42 #include "tree-pass.h"
43 #include "df.h"
44 #include "target.h"
45 #include "emit-rtl.h"
46 #include "regrename.h"
48 /* This file implements the RTL register renaming pass of the compiler. It is
49 a semi-local pass whose goal is to maximize the usage of the register file
50 of the processor by substituting registers for others in the solution given
51 by the register allocator. The algorithm is as follows:
53 1. Local def/use chains are built: within each basic block, chains are
54 opened and closed; if a chain isn't closed at the end of the block,
55 it is dropped. We pre-open chains if we have already examined a
56 predecessor block and found chains live at the end which match
57 live registers at the start of the new block.
59 2. We try to combine the local chains across basic block boundaries by
60 comparing chains that were open at the start or end of a block to
61 those in successor/predecessor blocks.
63 3. For each chain, the set of possible renaming registers is computed.
64 This takes into account the renaming of previously processed chains.
65 Optionally, a preferred class is computed for the renaming register.
67 4. The best renaming register is computed for the chain in the above set,
68 using a round-robin allocation. If a preferred class exists, then the
69 round-robin allocation is done within the class first, if possible.
70 The round-robin allocation of renaming registers itself is global.
72 5. If a renaming register has been found, it is substituted in the chain.
74 Targets can parameterize the pass by specifying a preferred class for the
75 renaming register for a given (super)class of registers to be renamed. */
77 #if HOST_BITS_PER_WIDE_INT <= MAX_RECOG_OPERANDS
78 #error "Use a different bitmap implementation for untracked_operands."
79 #endif
81 enum scan_actions
83 terminate_write,
84 terminate_dead,
85 mark_all_read,
86 mark_read,
87 mark_write,
88 /* mark_access is for marking the destination regs in
89 REG_FRAME_RELATED_EXPR notes (as if they were read) so that the
90 note is updated properly. */
91 mark_access
94 static const char * const scan_actions_name[] =
96 "terminate_write",
97 "terminate_dead",
98 "mark_all_read",
99 "mark_read",
100 "mark_write",
101 "mark_access"
104 /* TICK and THIS_TICK are used to record the last time we saw each
105 register. */
106 static int tick[FIRST_PSEUDO_REGISTER];
107 static int this_tick = 0;
109 static struct obstack rename_obstack;
111 /* If nonnull, the code calling into the register renamer requested
112 information about insn operands, and we store it here. */
113 vec<insn_rr_info> insn_rr;
115 static void scan_rtx (rtx_insn *, rtx *, enum reg_class, enum scan_actions,
116 enum op_type);
117 static bool build_def_use (basic_block);
119 /* The id to be given to the next opened chain. */
120 static unsigned current_id;
122 /* A mapping of unique id numbers to chains. */
123 static vec<du_head_p> id_to_chain;
125 /* List of currently open chains. */
126 static struct du_head *open_chains;
128 /* Bitmap of open chains. The bits set always match the list found in
129 open_chains. */
130 static bitmap_head open_chains_set;
132 /* Record the registers being tracked in open_chains. */
133 static HARD_REG_SET live_in_chains;
135 /* Record the registers that are live but not tracked. The intersection
136 between this and live_in_chains is empty. */
137 static HARD_REG_SET live_hard_regs;
139 /* Set while scanning RTL if INSN_RR is nonnull, i.e. if the current analysis
140 is for a caller that requires operand data. Used in
141 record_operand_use. */
142 static operand_rr_info *cur_operand;
144 /* Return the chain corresponding to id number ID. Take into account that
145 chains may have been merged. */
146 du_head_p
147 regrename_chain_from_id (unsigned int id)
149 du_head_p first_chain = id_to_chain[id];
150 du_head_p chain = first_chain;
151 while (chain->id != id)
153 id = chain->id;
154 chain = id_to_chain[id];
156 first_chain->id = id;
157 return chain;
160 /* Dump all def/use chains, starting at id FROM. */
162 static void
163 dump_def_use_chain (int from)
165 du_head_p head;
166 int i;
167 FOR_EACH_VEC_ELT_FROM (id_to_chain, i, head, from)
169 struct du_chain *this_du = head->first;
171 fprintf (dump_file, "Register %s (%d):",
172 reg_names[head->regno], head->nregs);
173 while (this_du)
175 fprintf (dump_file, " %d [%s]", INSN_UID (this_du->insn),
176 reg_class_names[this_du->cl]);
177 this_du = this_du->next_use;
179 fprintf (dump_file, "\n");
180 head = head->next_chain;
184 static void
185 free_chain_data (void)
187 int i;
188 du_head_p ptr;
189 for (i = 0; id_to_chain.iterate (i, &ptr); i++)
190 bitmap_clear (&ptr->conflicts);
192 id_to_chain.release ();
195 /* Walk all chains starting with CHAINS and record that they conflict with
196 another chain whose id is ID. */
198 static void
199 mark_conflict (struct du_head *chains, unsigned id)
201 while (chains)
203 bitmap_set_bit (&chains->conflicts, id);
204 chains = chains->next_chain;
208 /* Examine cur_operand, and if it is nonnull, record information about the
209 use THIS_DU which is part of the chain HEAD. */
211 static void
212 record_operand_use (struct du_head *head, struct du_chain *this_du)
214 if (cur_operand == NULL)
215 return;
216 gcc_assert (cur_operand->n_chains < MAX_REGS_PER_ADDRESS);
217 cur_operand->heads[cur_operand->n_chains] = head;
218 cur_operand->chains[cur_operand->n_chains++] = this_du;
221 /* Create a new chain for THIS_NREGS registers starting at THIS_REGNO,
222 and record its occurrence in *LOC, which is being written to in INSN.
223 This access requires a register of class CL. */
225 static du_head_p
226 create_new_chain (unsigned this_regno, unsigned this_nregs, rtx *loc,
227 rtx_insn *insn, enum reg_class cl)
229 struct du_head *head = XOBNEW (&rename_obstack, struct du_head);
230 struct du_chain *this_du;
231 int nregs;
233 head->next_chain = open_chains;
234 head->regno = this_regno;
235 head->nregs = this_nregs;
236 head->need_caller_save_reg = 0;
237 head->cannot_rename = 0;
239 id_to_chain.safe_push (head);
240 head->id = current_id++;
242 bitmap_initialize (&head->conflicts, &bitmap_default_obstack);
243 bitmap_copy (&head->conflicts, &open_chains_set);
244 mark_conflict (open_chains, head->id);
246 /* Since we're tracking this as a chain now, remove it from the
247 list of conflicting live hard registers and track it in
248 live_in_chains instead. */
249 nregs = head->nregs;
250 while (nregs-- > 0)
252 SET_HARD_REG_BIT (live_in_chains, head->regno + nregs);
253 CLEAR_HARD_REG_BIT (live_hard_regs, head->regno + nregs);
256 COPY_HARD_REG_SET (head->hard_conflicts, live_hard_regs);
257 bitmap_set_bit (&open_chains_set, head->id);
259 open_chains = head;
261 if (dump_file)
263 fprintf (dump_file, "Creating chain %s (%d)",
264 reg_names[head->regno], head->id);
265 if (insn != NULL_RTX)
266 fprintf (dump_file, " at insn %d", INSN_UID (insn));
267 fprintf (dump_file, "\n");
270 if (insn == NULL_RTX)
272 head->first = head->last = NULL;
273 return head;
276 this_du = XOBNEW (&rename_obstack, struct du_chain);
277 head->first = head->last = this_du;
279 this_du->next_use = 0;
280 this_du->loc = loc;
281 this_du->insn = insn;
282 this_du->cl = cl;
283 record_operand_use (head, this_du);
284 return head;
287 /* For a def-use chain HEAD, find which registers overlap its lifetime and
288 set the corresponding bits in *PSET. */
290 static void
291 merge_overlapping_regs (HARD_REG_SET *pset, struct du_head *head)
293 bitmap_iterator bi;
294 unsigned i;
295 IOR_HARD_REG_SET (*pset, head->hard_conflicts);
296 EXECUTE_IF_SET_IN_BITMAP (&head->conflicts, 0, i, bi)
298 du_head_p other = regrename_chain_from_id (i);
299 unsigned j = other->nregs;
300 gcc_assert (other != head);
301 while (j-- > 0)
302 SET_HARD_REG_BIT (*pset, other->regno + j);
306 /* Check if NEW_REG can be the candidate register to rename for
307 REG in THIS_HEAD chain. THIS_UNAVAILABLE is a set of unavailable hard
308 registers. */
310 static bool
311 check_new_reg_p (int reg ATTRIBUTE_UNUSED, int new_reg,
312 struct du_head *this_head, HARD_REG_SET this_unavailable)
314 machine_mode mode = GET_MODE (*this_head->first->loc);
315 int nregs = hard_regno_nregs[new_reg][mode];
316 int i;
317 struct du_chain *tmp;
319 for (i = nregs - 1; i >= 0; --i)
320 if (TEST_HARD_REG_BIT (this_unavailable, new_reg + i)
321 || fixed_regs[new_reg + i]
322 || global_regs[new_reg + i]
323 /* Can't use regs which aren't saved by the prologue. */
324 || (! df_regs_ever_live_p (new_reg + i)
325 && ! call_used_regs[new_reg + i])
326 #ifdef LEAF_REGISTERS
327 /* We can't use a non-leaf register if we're in a
328 leaf function. */
329 || (crtl->is_leaf
330 && !LEAF_REGISTERS[new_reg + i])
331 #endif
332 || ! HARD_REGNO_RENAME_OK (reg + i, new_reg + i))
333 return false;
335 /* See whether it accepts all modes that occur in
336 definition and uses. */
337 for (tmp = this_head->first; tmp; tmp = tmp->next_use)
338 if ((! HARD_REGNO_MODE_OK (new_reg, GET_MODE (*tmp->loc))
339 && ! DEBUG_INSN_P (tmp->insn))
340 || (this_head->need_caller_save_reg
341 && ! (HARD_REGNO_CALL_PART_CLOBBERED
342 (reg, GET_MODE (*tmp->loc)))
343 && (HARD_REGNO_CALL_PART_CLOBBERED
344 (new_reg, GET_MODE (*tmp->loc)))))
345 return false;
347 return true;
350 /* For the chain THIS_HEAD, compute and return the best register to
351 rename to. SUPER_CLASS is the superunion of register classes in
352 the chain. UNAVAILABLE is a set of registers that cannot be used.
353 OLD_REG is the register currently used for the chain. BEST_RENAME
354 controls whether the register chosen must be better than the
355 current one or just respect the given constraint. */
358 find_rename_reg (du_head_p this_head, enum reg_class super_class,
359 HARD_REG_SET *unavailable, int old_reg, bool best_rename)
361 bool has_preferred_class;
362 enum reg_class preferred_class;
363 int pass;
364 int best_new_reg = old_reg;
366 /* Further narrow the set of registers we can use for renaming.
367 If the chain needs a call-saved register, mark the call-used
368 registers as unavailable. */
369 if (this_head->need_caller_save_reg)
370 IOR_HARD_REG_SET (*unavailable, call_used_reg_set);
372 /* Mark registers that overlap this chain's lifetime as unavailable. */
373 merge_overlapping_regs (unavailable, this_head);
375 /* Compute preferred rename class of super union of all the classes
376 in the chain. */
377 preferred_class
378 = (enum reg_class) targetm.preferred_rename_class (super_class);
380 /* If PREFERRED_CLASS is not NO_REGS, we iterate in the first pass
381 over registers that belong to PREFERRED_CLASS and try to find the
382 best register within the class. If that failed, we iterate in
383 the second pass over registers that don't belong to the class.
384 If PREFERRED_CLASS is NO_REGS, we iterate over all registers in
385 ascending order without any preference. */
386 has_preferred_class = (preferred_class != NO_REGS);
387 for (pass = (has_preferred_class ? 0 : 1); pass < 2; pass++)
389 int new_reg;
390 for (new_reg = 0; new_reg < FIRST_PSEUDO_REGISTER; new_reg++)
392 if (has_preferred_class
393 && (pass == 0)
394 != TEST_HARD_REG_BIT (reg_class_contents[preferred_class],
395 new_reg))
396 continue;
398 if (!check_new_reg_p (old_reg, new_reg, this_head, *unavailable))
399 continue;
401 if (!best_rename)
402 return new_reg;
404 /* In the first pass, we force the renaming of registers that
405 don't belong to PREFERRED_CLASS to registers that do, even
406 though the latters were used not very long ago. */
407 if ((pass == 0
408 && !TEST_HARD_REG_BIT (reg_class_contents[preferred_class],
409 best_new_reg))
410 || tick[best_new_reg] > tick[new_reg])
411 best_new_reg = new_reg;
413 if (pass == 0 && best_new_reg != old_reg)
414 break;
416 return best_new_reg;
419 /* Perform register renaming on the current function. */
420 static void
421 rename_chains (void)
423 HARD_REG_SET unavailable;
424 du_head_p this_head;
425 int i;
427 memset (tick, 0, sizeof tick);
429 CLEAR_HARD_REG_SET (unavailable);
430 /* Don't clobber traceback for noreturn functions. */
431 if (frame_pointer_needed)
433 add_to_hard_reg_set (&unavailable, Pmode, FRAME_POINTER_REGNUM);
434 if (!HARD_FRAME_POINTER_IS_FRAME_POINTER)
435 add_to_hard_reg_set (&unavailable, Pmode, HARD_FRAME_POINTER_REGNUM);
438 FOR_EACH_VEC_ELT (id_to_chain, i, this_head)
440 int best_new_reg;
441 int n_uses;
442 struct du_chain *tmp;
443 HARD_REG_SET this_unavailable;
444 int reg = this_head->regno;
445 enum reg_class super_class = NO_REGS;
447 if (this_head->cannot_rename)
448 continue;
450 if (fixed_regs[reg] || global_regs[reg]
451 #if !HARD_FRAME_POINTER_IS_FRAME_POINTER
452 || (frame_pointer_needed && reg == HARD_FRAME_POINTER_REGNUM)
453 #else
454 || (frame_pointer_needed && reg == FRAME_POINTER_REGNUM)
455 #endif
457 continue;
459 COPY_HARD_REG_SET (this_unavailable, unavailable);
461 /* Iterate over elements in the chain in order to:
462 1. Count number of uses, and narrow the set of registers we can
463 use for renaming.
464 2. Compute the superunion of register classes in this chain. */
465 n_uses = 0;
466 super_class = NO_REGS;
467 for (tmp = this_head->first; tmp; tmp = tmp->next_use)
469 if (DEBUG_INSN_P (tmp->insn))
470 continue;
471 n_uses++;
472 IOR_COMPL_HARD_REG_SET (this_unavailable,
473 reg_class_contents[tmp->cl]);
474 super_class
475 = reg_class_superunion[(int) super_class][(int) tmp->cl];
478 if (n_uses < 2)
479 continue;
481 best_new_reg = find_rename_reg (this_head, super_class,
482 &this_unavailable, reg, true);
484 if (dump_file)
486 fprintf (dump_file, "Register %s in insn %d",
487 reg_names[reg], INSN_UID (this_head->first->insn));
488 if (this_head->need_caller_save_reg)
489 fprintf (dump_file, " crosses a call");
492 if (best_new_reg == reg)
494 tick[reg] = ++this_tick;
495 if (dump_file)
496 fprintf (dump_file, "; no available better choice\n");
497 continue;
500 if (dump_file)
501 fprintf (dump_file, ", renamed as %s\n", reg_names[best_new_reg]);
503 regrename_do_replace (this_head, best_new_reg);
504 tick[best_new_reg] = ++this_tick;
505 df_set_regs_ever_live (best_new_reg, true);
509 /* A structure to record information for each hard register at the start of
510 a basic block. */
511 struct incoming_reg_info {
512 /* Holds the number of registers used in the chain that gave us information
513 about this register. Zero means no information known yet, while a
514 negative value is used for something that is part of, but not the first
515 register in a multi-register value. */
516 int nregs;
517 /* Set to true if we have accesses that conflict in the number of registers
518 used. */
519 bool unusable;
522 /* A structure recording information about each basic block. It is saved
523 and restored around basic block boundaries.
524 A pointer to such a structure is stored in each basic block's aux field
525 during regrename_analyze, except for blocks we know can't be optimized
526 (such as entry and exit blocks). */
527 struct bb_rename_info
529 /* The basic block corresponding to this structure. */
530 basic_block bb;
531 /* Copies of the global information. */
532 bitmap_head open_chains_set;
533 bitmap_head incoming_open_chains_set;
534 struct incoming_reg_info incoming[FIRST_PSEUDO_REGISTER];
537 /* Initialize a rename_info structure P for basic block BB, which starts a new
538 scan. */
539 static void
540 init_rename_info (struct bb_rename_info *p, basic_block bb)
542 int i;
543 df_ref def;
544 HARD_REG_SET start_chains_set;
546 p->bb = bb;
547 bitmap_initialize (&p->open_chains_set, &bitmap_default_obstack);
548 bitmap_initialize (&p->incoming_open_chains_set, &bitmap_default_obstack);
550 open_chains = NULL;
551 bitmap_clear (&open_chains_set);
553 CLEAR_HARD_REG_SET (live_in_chains);
554 REG_SET_TO_HARD_REG_SET (live_hard_regs, df_get_live_in (bb));
555 FOR_EACH_ARTIFICIAL_DEF (def, bb->index)
556 if (DF_REF_FLAGS (def) & DF_REF_AT_TOP)
557 SET_HARD_REG_BIT (live_hard_regs, DF_REF_REGNO (def));
559 /* Open chains based on information from (at least one) predecessor
560 block. This gives us a chance later on to combine chains across
561 basic block boundaries. Inconsistencies (in access sizes) will
562 be caught normally and dealt with conservatively by disabling the
563 chain for renaming, and there is no risk of losing optimization
564 opportunities by opening chains either: if we did not open the
565 chains, we'd have to track the live register as a hard reg, and
566 we'd be unable to rename it in any case. */
567 CLEAR_HARD_REG_SET (start_chains_set);
568 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
570 struct incoming_reg_info *iri = p->incoming + i;
571 if (iri->nregs > 0 && !iri->unusable
572 && range_in_hard_reg_set_p (live_hard_regs, i, iri->nregs))
574 SET_HARD_REG_BIT (start_chains_set, i);
575 remove_range_from_hard_reg_set (&live_hard_regs, i, iri->nregs);
578 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
580 struct incoming_reg_info *iri = p->incoming + i;
581 if (TEST_HARD_REG_BIT (start_chains_set, i))
583 du_head_p chain;
584 if (dump_file)
585 fprintf (dump_file, "opening incoming chain\n");
586 chain = create_new_chain (i, iri->nregs, NULL, NULL, NO_REGS);
587 bitmap_set_bit (&p->incoming_open_chains_set, chain->id);
592 /* Record in RI that the block corresponding to it has an incoming
593 live value, described by CHAIN. */
594 static void
595 set_incoming_from_chain (struct bb_rename_info *ri, du_head_p chain)
597 int i;
598 int incoming_nregs = ri->incoming[chain->regno].nregs;
599 int nregs;
601 /* If we've recorded the same information before, everything is fine. */
602 if (incoming_nregs == chain->nregs)
604 if (dump_file)
605 fprintf (dump_file, "reg %d/%d already recorded\n",
606 chain->regno, chain->nregs);
607 return;
610 /* If we have no information for any of the involved registers, update
611 the incoming array. */
612 nregs = chain->nregs;
613 while (nregs-- > 0)
614 if (ri->incoming[chain->regno + nregs].nregs != 0
615 || ri->incoming[chain->regno + nregs].unusable)
616 break;
617 if (nregs < 0)
619 nregs = chain->nregs;
620 ri->incoming[chain->regno].nregs = nregs;
621 while (nregs-- > 1)
622 ri->incoming[chain->regno + nregs].nregs = -nregs;
623 if (dump_file)
624 fprintf (dump_file, "recorded reg %d/%d\n",
625 chain->regno, chain->nregs);
626 return;
629 /* There must be some kind of conflict. Prevent both the old and
630 new ranges from being used. */
631 if (incoming_nregs < 0)
632 ri->incoming[chain->regno + incoming_nregs].unusable = true;
633 for (i = 0; i < chain->nregs; i++)
634 ri->incoming[chain->regno + i].unusable = true;
637 /* Merge the two chains C1 and C2 so that all conflict information is
638 recorded and C1, and the id of C2 is changed to that of C1. */
639 static void
640 merge_chains (du_head_p c1, du_head_p c2)
642 if (c1 == c2)
643 return;
645 if (c2->first != NULL)
647 if (c1->first == NULL)
648 c1->first = c2->first;
649 else
650 c1->last->next_use = c2->first;
651 c1->last = c2->last;
654 c2->first = c2->last = NULL;
655 c2->id = c1->id;
657 IOR_HARD_REG_SET (c1->hard_conflicts, c2->hard_conflicts);
658 bitmap_ior_into (&c1->conflicts, &c2->conflicts);
660 c1->need_caller_save_reg |= c2->need_caller_save_reg;
661 c1->cannot_rename |= c2->cannot_rename;
664 /* Analyze the current function and build chains for renaming. */
666 void
667 regrename_analyze (bitmap bb_mask)
669 struct bb_rename_info *rename_info;
670 int i;
671 basic_block bb;
672 int n_bbs;
673 int *inverse_postorder;
675 inverse_postorder = XNEWVEC (int, last_basic_block_for_fn (cfun));
676 n_bbs = pre_and_rev_post_order_compute (NULL, inverse_postorder, false);
678 /* Gather some information about the blocks in this function. */
679 rename_info = XCNEWVEC (struct bb_rename_info, n_basic_blocks_for_fn (cfun));
680 i = 0;
681 FOR_EACH_BB_FN (bb, cfun)
683 struct bb_rename_info *ri = rename_info + i;
684 ri->bb = bb;
685 if (bb_mask != NULL && !bitmap_bit_p (bb_mask, bb->index))
686 bb->aux = NULL;
687 else
688 bb->aux = ri;
689 i++;
692 current_id = 0;
693 id_to_chain.create (0);
694 bitmap_initialize (&open_chains_set, &bitmap_default_obstack);
696 /* The order in which we visit blocks ensures that whenever
697 possible, we only process a block after at least one of its
698 predecessors, which provides a "seeding" effect to make the logic
699 in set_incoming_from_chain and init_rename_info useful. */
701 for (i = 0; i < n_bbs; i++)
703 basic_block bb1 = BASIC_BLOCK_FOR_FN (cfun, inverse_postorder[i]);
704 struct bb_rename_info *this_info;
705 bool success;
706 edge e;
707 edge_iterator ei;
708 int old_length = id_to_chain.length ();
710 this_info = (struct bb_rename_info *) bb1->aux;
711 if (this_info == NULL)
712 continue;
714 if (dump_file)
715 fprintf (dump_file, "\nprocessing block %d:\n", bb1->index);
717 init_rename_info (this_info, bb1);
719 success = build_def_use (bb1);
720 if (!success)
722 if (dump_file)
723 fprintf (dump_file, "failed\n");
724 bb1->aux = NULL;
725 id_to_chain.truncate (old_length);
726 current_id = old_length;
727 bitmap_clear (&this_info->incoming_open_chains_set);
728 open_chains = NULL;
729 if (insn_rr.exists ())
731 rtx_insn *insn;
732 FOR_BB_INSNS (bb1, insn)
734 insn_rr_info *p = &insn_rr[INSN_UID (insn)];
735 p->op_info = NULL;
738 continue;
741 if (dump_file)
742 dump_def_use_chain (old_length);
743 bitmap_copy (&this_info->open_chains_set, &open_chains_set);
745 /* Add successor blocks to the worklist if necessary, and record
746 data about our own open chains at the end of this block, which
747 will be used to pre-open chains when processing the successors. */
748 FOR_EACH_EDGE (e, ei, bb1->succs)
750 struct bb_rename_info *dest_ri;
751 struct du_head *chain;
753 if (dump_file)
754 fprintf (dump_file, "successor block %d\n", e->dest->index);
756 if (e->flags & (EDGE_EH | EDGE_ABNORMAL))
757 continue;
758 dest_ri = (struct bb_rename_info *)e->dest->aux;
759 if (dest_ri == NULL)
760 continue;
761 for (chain = open_chains; chain; chain = chain->next_chain)
762 set_incoming_from_chain (dest_ri, chain);
766 free (inverse_postorder);
768 /* Now, combine the chains data we have gathered across basic block
769 boundaries.
771 For every basic block, there may be chains open at the start, or at the
772 end. Rather than exclude them from renaming, we look for open chains
773 with matching registers at the other side of the CFG edge.
775 For a given chain using register R, open at the start of block B, we
776 must find an open chain using R on the other side of every edge leading
777 to B, if the register is live across this edge. In the code below,
778 N_PREDS_USED counts the number of edges where the register is live, and
779 N_PREDS_JOINED counts those where we found an appropriate chain for
780 joining.
782 We perform the analysis for both incoming and outgoing edges, but we
783 only need to merge once (in the second part, after verifying outgoing
784 edges). */
785 FOR_EACH_BB_FN (bb, cfun)
787 struct bb_rename_info *bb_ri = (struct bb_rename_info *) bb->aux;
788 unsigned j;
789 bitmap_iterator bi;
791 if (bb_ri == NULL)
792 continue;
794 if (dump_file)
795 fprintf (dump_file, "processing bb %d in edges\n", bb->index);
797 EXECUTE_IF_SET_IN_BITMAP (&bb_ri->incoming_open_chains_set, 0, j, bi)
799 edge e;
800 edge_iterator ei;
801 struct du_head *chain = regrename_chain_from_id (j);
802 int n_preds_used = 0, n_preds_joined = 0;
804 FOR_EACH_EDGE (e, ei, bb->preds)
806 struct bb_rename_info *src_ri;
807 unsigned k;
808 bitmap_iterator bi2;
809 HARD_REG_SET live;
810 bool success = false;
812 REG_SET_TO_HARD_REG_SET (live, df_get_live_out (e->src));
813 if (!range_overlaps_hard_reg_set_p (live, chain->regno,
814 chain->nregs))
815 continue;
816 n_preds_used++;
818 if (e->flags & (EDGE_EH | EDGE_ABNORMAL))
819 continue;
821 src_ri = (struct bb_rename_info *)e->src->aux;
822 if (src_ri == NULL)
823 continue;
825 EXECUTE_IF_SET_IN_BITMAP (&src_ri->open_chains_set,
826 0, k, bi2)
828 struct du_head *outgoing_chain = regrename_chain_from_id (k);
830 if (outgoing_chain->regno == chain->regno
831 && outgoing_chain->nregs == chain->nregs)
833 n_preds_joined++;
834 success = true;
835 break;
838 if (!success && dump_file)
839 fprintf (dump_file, "failure to match with pred block %d\n",
840 e->src->index);
842 if (n_preds_joined < n_preds_used)
844 if (dump_file)
845 fprintf (dump_file, "cannot rename chain %d\n", j);
846 chain->cannot_rename = 1;
850 FOR_EACH_BB_FN (bb, cfun)
852 struct bb_rename_info *bb_ri = (struct bb_rename_info *) bb->aux;
853 unsigned j;
854 bitmap_iterator bi;
856 if (bb_ri == NULL)
857 continue;
859 if (dump_file)
860 fprintf (dump_file, "processing bb %d out edges\n", bb->index);
862 EXECUTE_IF_SET_IN_BITMAP (&bb_ri->open_chains_set, 0, j, bi)
864 edge e;
865 edge_iterator ei;
866 struct du_head *chain = regrename_chain_from_id (j);
867 int n_succs_used = 0, n_succs_joined = 0;
869 FOR_EACH_EDGE (e, ei, bb->succs)
871 bool printed = false;
872 struct bb_rename_info *dest_ri;
873 unsigned k;
874 bitmap_iterator bi2;
875 HARD_REG_SET live;
877 REG_SET_TO_HARD_REG_SET (live, df_get_live_in (e->dest));
878 if (!range_overlaps_hard_reg_set_p (live, chain->regno,
879 chain->nregs))
880 continue;
882 n_succs_used++;
884 dest_ri = (struct bb_rename_info *)e->dest->aux;
885 if (dest_ri == NULL)
886 continue;
888 EXECUTE_IF_SET_IN_BITMAP (&dest_ri->incoming_open_chains_set,
889 0, k, bi2)
891 struct du_head *incoming_chain = regrename_chain_from_id (k);
893 if (incoming_chain->regno == chain->regno
894 && incoming_chain->nregs == chain->nregs)
896 if (dump_file)
898 if (!printed)
899 fprintf (dump_file,
900 "merging blocks for edge %d -> %d\n",
901 e->src->index, e->dest->index);
902 printed = true;
903 fprintf (dump_file,
904 " merging chains %d (->%d) and %d (->%d) [%s]\n",
905 k, incoming_chain->id, j, chain->id,
906 reg_names[incoming_chain->regno]);
909 merge_chains (chain, incoming_chain);
910 n_succs_joined++;
911 break;
915 if (n_succs_joined < n_succs_used)
917 if (dump_file)
918 fprintf (dump_file, "cannot rename chain %d\n",
920 chain->cannot_rename = 1;
925 free (rename_info);
927 FOR_EACH_BB_FN (bb, cfun)
928 bb->aux = NULL;
931 void
932 regrename_do_replace (struct du_head *head, int reg)
934 struct du_chain *chain;
935 unsigned int base_regno = head->regno;
936 machine_mode mode;
938 for (chain = head->first; chain; chain = chain->next_use)
940 unsigned int regno = ORIGINAL_REGNO (*chain->loc);
941 struct reg_attrs *attr = REG_ATTRS (*chain->loc);
942 int reg_ptr = REG_POINTER (*chain->loc);
944 if (DEBUG_INSN_P (chain->insn) && REGNO (*chain->loc) != base_regno)
945 INSN_VAR_LOCATION_LOC (chain->insn) = gen_rtx_UNKNOWN_VAR_LOC ();
946 else
948 *chain->loc = gen_raw_REG (GET_MODE (*chain->loc), reg);
949 if (regno >= FIRST_PSEUDO_REGISTER)
950 ORIGINAL_REGNO (*chain->loc) = regno;
951 REG_ATTRS (*chain->loc) = attr;
952 REG_POINTER (*chain->loc) = reg_ptr;
955 df_insn_rescan (chain->insn);
958 mode = GET_MODE (*head->first->loc);
959 head->regno = reg;
960 head->nregs = hard_regno_nregs[reg][mode];
964 /* True if we found a register with a size mismatch, which means that we
965 can't track its lifetime accurately. If so, we abort the current block
966 without renaming. */
967 static bool fail_current_block;
969 /* Return true if OP is a reg for which all bits are set in PSET, false
970 if all bits are clear.
971 In other cases, set fail_current_block and return false. */
973 static bool
974 verify_reg_in_set (rtx op, HARD_REG_SET *pset)
976 unsigned regno, nregs;
977 bool all_live, all_dead;
978 if (!REG_P (op))
979 return false;
981 regno = REGNO (op);
982 nregs = REG_NREGS (op);
983 all_live = all_dead = true;
984 while (nregs-- > 0)
985 if (TEST_HARD_REG_BIT (*pset, regno + nregs))
986 all_dead = false;
987 else
988 all_live = false;
989 if (!all_dead && !all_live)
991 fail_current_block = true;
992 return false;
994 return all_live;
997 /* Return true if OP is a reg that is being tracked already in some form.
998 May set fail_current_block if it sees an unhandled case of overlap. */
1000 static bool
1001 verify_reg_tracked (rtx op)
1003 return (verify_reg_in_set (op, &live_hard_regs)
1004 || verify_reg_in_set (op, &live_in_chains));
1007 /* Called through note_stores. DATA points to a rtx_code, either SET or
1008 CLOBBER, which tells us which kind of rtx to look at. If we have a
1009 match, record the set register in live_hard_regs and in the hard_conflicts
1010 bitmap of open chains. */
1012 static void
1013 note_sets_clobbers (rtx x, const_rtx set, void *data)
1015 enum rtx_code code = *(enum rtx_code *)data;
1016 struct du_head *chain;
1018 if (GET_CODE (x) == SUBREG)
1019 x = SUBREG_REG (x);
1020 if (!REG_P (x) || GET_CODE (set) != code)
1021 return;
1022 /* There must not be pseudos at this point. */
1023 gcc_assert (HARD_REGISTER_P (x));
1024 add_to_hard_reg_set (&live_hard_regs, GET_MODE (x), REGNO (x));
1025 for (chain = open_chains; chain; chain = chain->next_chain)
1026 add_to_hard_reg_set (&chain->hard_conflicts, GET_MODE (x), REGNO (x));
1029 static void
1030 scan_rtx_reg (rtx_insn *insn, rtx *loc, enum reg_class cl, enum scan_actions action,
1031 enum op_type type)
1033 struct du_head **p;
1034 rtx x = *loc;
1035 unsigned this_regno = REGNO (x);
1036 int this_nregs = REG_NREGS (x);
1038 if (action == mark_write)
1040 if (type == OP_OUT)
1041 create_new_chain (this_regno, this_nregs, loc, insn, cl);
1042 return;
1045 if ((type == OP_OUT) != (action == terminate_write || action == mark_access))
1046 return;
1048 for (p = &open_chains; *p;)
1050 struct du_head *head = *p;
1051 struct du_head *next = head->next_chain;
1052 int exact_match = (head->regno == this_regno
1053 && head->nregs == this_nregs);
1054 int superset = (this_regno <= head->regno
1055 && this_regno + this_nregs >= head->regno + head->nregs);
1056 int subset = (this_regno >= head->regno
1057 && this_regno + this_nregs <= head->regno + head->nregs);
1059 if (!bitmap_bit_p (&open_chains_set, head->id)
1060 || head->regno + head->nregs <= this_regno
1061 || this_regno + this_nregs <= head->regno)
1063 p = &head->next_chain;
1064 continue;
1067 if (action == mark_read || action == mark_access)
1069 /* ??? Class NO_REGS can happen if the md file makes use of
1070 EXTRA_CONSTRAINTS to match registers. Which is arguably
1071 wrong, but there we are. */
1073 if (cl == NO_REGS || (!exact_match && !DEBUG_INSN_P (insn)))
1075 if (dump_file)
1076 fprintf (dump_file,
1077 "Cannot rename chain %s (%d) at insn %d (%s)\n",
1078 reg_names[head->regno], head->id, INSN_UID (insn),
1079 scan_actions_name[(int) action]);
1080 head->cannot_rename = 1;
1081 if (superset)
1083 unsigned nregs = this_nregs;
1084 head->regno = this_regno;
1085 head->nregs = this_nregs;
1086 while (nregs-- > 0)
1087 SET_HARD_REG_BIT (live_in_chains, head->regno + nregs);
1088 if (dump_file)
1089 fprintf (dump_file,
1090 "Widening register in chain %s (%d) at insn %d\n",
1091 reg_names[head->regno], head->id, INSN_UID (insn));
1093 else if (!subset)
1095 fail_current_block = true;
1096 if (dump_file)
1097 fprintf (dump_file,
1098 "Failing basic block due to unhandled overlap\n");
1101 else
1103 struct du_chain *this_du;
1104 this_du = XOBNEW (&rename_obstack, struct du_chain);
1105 this_du->next_use = 0;
1106 this_du->loc = loc;
1107 this_du->insn = insn;
1108 this_du->cl = cl;
1109 if (head->first == NULL)
1110 head->first = this_du;
1111 else
1112 head->last->next_use = this_du;
1113 record_operand_use (head, this_du);
1114 head->last = this_du;
1116 /* Avoid adding the same location in a DEBUG_INSN multiple times,
1117 which could happen with non-exact overlap. */
1118 if (DEBUG_INSN_P (insn))
1119 return;
1120 /* Otherwise, find any other chains that do not match exactly;
1121 ensure they all get marked unrenamable. */
1122 p = &head->next_chain;
1123 continue;
1126 /* Whether the terminated chain can be used for renaming
1127 depends on the action and this being an exact match.
1128 In either case, we remove this element from open_chains. */
1130 if ((action == terminate_dead || action == terminate_write)
1131 && (superset || subset))
1133 unsigned nregs;
1135 if (subset && !superset)
1136 head->cannot_rename = 1;
1137 bitmap_clear_bit (&open_chains_set, head->id);
1139 nregs = head->nregs;
1140 while (nregs-- > 0)
1142 CLEAR_HARD_REG_BIT (live_in_chains, head->regno + nregs);
1143 if (subset && !superset
1144 && (head->regno + nregs < this_regno
1145 || head->regno + nregs >= this_regno + this_nregs))
1146 SET_HARD_REG_BIT (live_hard_regs, head->regno + nregs);
1149 *p = next;
1150 if (dump_file)
1151 fprintf (dump_file,
1152 "Closing chain %s (%d) at insn %d (%s%s)\n",
1153 reg_names[head->regno], head->id, INSN_UID (insn),
1154 scan_actions_name[(int) action],
1155 superset ? ", superset" : subset ? ", subset" : "");
1157 else if (action == terminate_dead || action == terminate_write)
1159 /* In this case, tracking liveness gets too hard. Fail the
1160 entire basic block. */
1161 if (dump_file)
1162 fprintf (dump_file,
1163 "Failing basic block due to unhandled overlap\n");
1164 fail_current_block = true;
1165 return;
1167 else
1169 head->cannot_rename = 1;
1170 if (dump_file)
1171 fprintf (dump_file,
1172 "Cannot rename chain %s (%d) at insn %d (%s)\n",
1173 reg_names[head->regno], head->id, INSN_UID (insn),
1174 scan_actions_name[(int) action]);
1175 p = &head->next_chain;
1180 /* Adapted from find_reloads_address_1. CL is INDEX_REG_CLASS or
1181 BASE_REG_CLASS depending on how the register is being considered. */
1183 static void
1184 scan_rtx_address (rtx_insn *insn, rtx *loc, enum reg_class cl,
1185 enum scan_actions action, machine_mode mode,
1186 addr_space_t as)
1188 rtx x = *loc;
1189 RTX_CODE code = GET_CODE (x);
1190 const char *fmt;
1191 int i, j;
1193 if (action == mark_write || action == mark_access)
1194 return;
1196 switch (code)
1198 case PLUS:
1200 rtx orig_op0 = XEXP (x, 0);
1201 rtx orig_op1 = XEXP (x, 1);
1202 RTX_CODE code0 = GET_CODE (orig_op0);
1203 RTX_CODE code1 = GET_CODE (orig_op1);
1204 rtx op0 = orig_op0;
1205 rtx op1 = orig_op1;
1206 rtx *locI = NULL;
1207 rtx *locB = NULL;
1208 enum rtx_code index_code = SCRATCH;
1210 if (GET_CODE (op0) == SUBREG)
1212 op0 = SUBREG_REG (op0);
1213 code0 = GET_CODE (op0);
1216 if (GET_CODE (op1) == SUBREG)
1218 op1 = SUBREG_REG (op1);
1219 code1 = GET_CODE (op1);
1222 if (code0 == MULT || code0 == SIGN_EXTEND || code0 == TRUNCATE
1223 || code0 == ZERO_EXTEND || code1 == MEM)
1225 locI = &XEXP (x, 0);
1226 locB = &XEXP (x, 1);
1227 index_code = GET_CODE (*locI);
1229 else if (code1 == MULT || code1 == SIGN_EXTEND || code1 == TRUNCATE
1230 || code1 == ZERO_EXTEND || code0 == MEM)
1232 locI = &XEXP (x, 1);
1233 locB = &XEXP (x, 0);
1234 index_code = GET_CODE (*locI);
1236 else if (code0 == CONST_INT || code0 == CONST
1237 || code0 == SYMBOL_REF || code0 == LABEL_REF)
1239 locB = &XEXP (x, 1);
1240 index_code = GET_CODE (XEXP (x, 0));
1242 else if (code1 == CONST_INT || code1 == CONST
1243 || code1 == SYMBOL_REF || code1 == LABEL_REF)
1245 locB = &XEXP (x, 0);
1246 index_code = GET_CODE (XEXP (x, 1));
1248 else if (code0 == REG && code1 == REG)
1250 int index_op;
1251 unsigned regno0 = REGNO (op0), regno1 = REGNO (op1);
1253 if (REGNO_OK_FOR_INDEX_P (regno1)
1254 && regno_ok_for_base_p (regno0, mode, as, PLUS, REG))
1255 index_op = 1;
1256 else if (REGNO_OK_FOR_INDEX_P (regno0)
1257 && regno_ok_for_base_p (regno1, mode, as, PLUS, REG))
1258 index_op = 0;
1259 else if (regno_ok_for_base_p (regno0, mode, as, PLUS, REG)
1260 || REGNO_OK_FOR_INDEX_P (regno1))
1261 index_op = 1;
1262 else if (regno_ok_for_base_p (regno1, mode, as, PLUS, REG))
1263 index_op = 0;
1264 else
1265 index_op = 1;
1267 locI = &XEXP (x, index_op);
1268 locB = &XEXP (x, !index_op);
1269 index_code = GET_CODE (*locI);
1271 else if (code0 == REG)
1273 locI = &XEXP (x, 0);
1274 locB = &XEXP (x, 1);
1275 index_code = GET_CODE (*locI);
1277 else if (code1 == REG)
1279 locI = &XEXP (x, 1);
1280 locB = &XEXP (x, 0);
1281 index_code = GET_CODE (*locI);
1284 if (locI)
1285 scan_rtx_address (insn, locI, INDEX_REG_CLASS, action, mode, as);
1286 if (locB)
1287 scan_rtx_address (insn, locB,
1288 base_reg_class (mode, as, PLUS, index_code),
1289 action, mode, as);
1291 return;
1294 case POST_INC:
1295 case POST_DEC:
1296 case POST_MODIFY:
1297 case PRE_INC:
1298 case PRE_DEC:
1299 case PRE_MODIFY:
1300 #ifndef AUTO_INC_DEC
1301 /* If the target doesn't claim to handle autoinc, this must be
1302 something special, like a stack push. Kill this chain. */
1303 action = mark_all_read;
1304 #endif
1305 break;
1307 case MEM:
1308 scan_rtx_address (insn, &XEXP (x, 0),
1309 base_reg_class (GET_MODE (x), MEM_ADDR_SPACE (x),
1310 MEM, SCRATCH),
1311 action, GET_MODE (x), MEM_ADDR_SPACE (x));
1312 return;
1314 case REG:
1315 scan_rtx_reg (insn, loc, cl, action, OP_IN);
1316 return;
1318 default:
1319 break;
1322 fmt = GET_RTX_FORMAT (code);
1323 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1325 if (fmt[i] == 'e')
1326 scan_rtx_address (insn, &XEXP (x, i), cl, action, mode, as);
1327 else if (fmt[i] == 'E')
1328 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
1329 scan_rtx_address (insn, &XVECEXP (x, i, j), cl, action, mode, as);
1333 static void
1334 scan_rtx (rtx_insn *insn, rtx *loc, enum reg_class cl, enum scan_actions action,
1335 enum op_type type)
1337 const char *fmt;
1338 rtx x = *loc;
1339 enum rtx_code code = GET_CODE (x);
1340 int i, j;
1342 code = GET_CODE (x);
1343 switch (code)
1345 case CONST:
1346 CASE_CONST_ANY:
1347 case SYMBOL_REF:
1348 case LABEL_REF:
1349 case CC0:
1350 case PC:
1351 return;
1353 case REG:
1354 scan_rtx_reg (insn, loc, cl, action, type);
1355 return;
1357 case MEM:
1358 scan_rtx_address (insn, &XEXP (x, 0),
1359 base_reg_class (GET_MODE (x), MEM_ADDR_SPACE (x),
1360 MEM, SCRATCH),
1361 action, GET_MODE (x), MEM_ADDR_SPACE (x));
1362 return;
1364 case SET:
1365 scan_rtx (insn, &SET_SRC (x), cl, action, OP_IN);
1366 scan_rtx (insn, &SET_DEST (x), cl, action,
1367 (GET_CODE (PATTERN (insn)) == COND_EXEC
1368 && verify_reg_tracked (SET_DEST (x))) ? OP_INOUT : OP_OUT);
1369 return;
1371 case STRICT_LOW_PART:
1372 scan_rtx (insn, &XEXP (x, 0), cl, action,
1373 verify_reg_tracked (XEXP (x, 0)) ? OP_INOUT : OP_OUT);
1374 return;
1376 case ZERO_EXTRACT:
1377 case SIGN_EXTRACT:
1378 scan_rtx (insn, &XEXP (x, 0), cl, action,
1379 (type == OP_IN ? OP_IN :
1380 verify_reg_tracked (XEXP (x, 0)) ? OP_INOUT : OP_OUT));
1381 scan_rtx (insn, &XEXP (x, 1), cl, action, OP_IN);
1382 scan_rtx (insn, &XEXP (x, 2), cl, action, OP_IN);
1383 return;
1385 case POST_INC:
1386 case PRE_INC:
1387 case POST_DEC:
1388 case PRE_DEC:
1389 case POST_MODIFY:
1390 case PRE_MODIFY:
1391 /* Should only happen inside MEM. */
1392 gcc_unreachable ();
1394 case CLOBBER:
1395 scan_rtx (insn, &SET_DEST (x), cl, action,
1396 (GET_CODE (PATTERN (insn)) == COND_EXEC
1397 && verify_reg_tracked (SET_DEST (x))) ? OP_INOUT : OP_OUT);
1398 return;
1400 case EXPR_LIST:
1401 scan_rtx (insn, &XEXP (x, 0), cl, action, type);
1402 if (XEXP (x, 1))
1403 scan_rtx (insn, &XEXP (x, 1), cl, action, type);
1404 return;
1406 default:
1407 break;
1410 fmt = GET_RTX_FORMAT (code);
1411 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1413 if (fmt[i] == 'e')
1414 scan_rtx (insn, &XEXP (x, i), cl, action, type);
1415 else if (fmt[i] == 'E')
1416 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
1417 scan_rtx (insn, &XVECEXP (x, i, j), cl, action, type);
1421 /* Hide operands of the current insn (of which there are N_OPS) by
1422 substituting cc0 for them.
1423 Previous values are stored in the OLD_OPERANDS and OLD_DUPS.
1424 For every bit set in DO_NOT_HIDE, we leave the operand alone.
1425 If INOUT_AND_EC_ONLY is set, we only do this for OP_INOUT type operands
1426 and earlyclobbers. */
1428 static void
1429 hide_operands (int n_ops, rtx *old_operands, rtx *old_dups,
1430 unsigned HOST_WIDE_INT do_not_hide, bool inout_and_ec_only)
1432 int i;
1433 const operand_alternative *op_alt = which_op_alt ();
1434 for (i = 0; i < n_ops; i++)
1436 old_operands[i] = recog_data.operand[i];
1437 /* Don't squash match_operator or match_parallel here, since
1438 we don't know that all of the contained registers are
1439 reachable by proper operands. */
1440 if (recog_data.constraints[i][0] == '\0')
1441 continue;
1442 if (do_not_hide & (1 << i))
1443 continue;
1444 if (!inout_and_ec_only || recog_data.operand_type[i] == OP_INOUT
1445 || op_alt[i].earlyclobber)
1446 *recog_data.operand_loc[i] = cc0_rtx;
1448 for (i = 0; i < recog_data.n_dups; i++)
1450 int opn = recog_data.dup_num[i];
1451 old_dups[i] = *recog_data.dup_loc[i];
1452 if (do_not_hide & (1 << opn))
1453 continue;
1454 if (!inout_and_ec_only || recog_data.operand_type[opn] == OP_INOUT
1455 || op_alt[opn].earlyclobber)
1456 *recog_data.dup_loc[i] = cc0_rtx;
1460 /* Undo the substitution performed by hide_operands. INSN is the insn we
1461 are processing; the arguments are the same as in hide_operands. */
1463 static void
1464 restore_operands (rtx_insn *insn, int n_ops, rtx *old_operands, rtx *old_dups)
1466 int i;
1467 for (i = 0; i < recog_data.n_dups; i++)
1468 *recog_data.dup_loc[i] = old_dups[i];
1469 for (i = 0; i < n_ops; i++)
1470 *recog_data.operand_loc[i] = old_operands[i];
1471 if (recog_data.n_dups)
1472 df_insn_rescan (insn);
1475 /* For each output operand of INSN, call scan_rtx to create a new
1476 open chain. Do this only for normal or earlyclobber outputs,
1477 depending on EARLYCLOBBER. If INSN_INFO is nonnull, use it to
1478 record information about the operands in the insn. */
1480 static void
1481 record_out_operands (rtx_insn *insn, bool earlyclobber, insn_rr_info *insn_info)
1483 int n_ops = recog_data.n_operands;
1484 const operand_alternative *op_alt = which_op_alt ();
1486 int i;
1488 for (i = 0; i < n_ops + recog_data.n_dups; i++)
1490 int opn = i < n_ops ? i : recog_data.dup_num[i - n_ops];
1491 rtx *loc = (i < n_ops
1492 ? recog_data.operand_loc[opn]
1493 : recog_data.dup_loc[i - n_ops]);
1494 rtx op = *loc;
1495 enum reg_class cl = alternative_class (op_alt, opn);
1497 struct du_head *prev_open;
1499 if (recog_data.operand_type[opn] != OP_OUT
1500 || op_alt[opn].earlyclobber != earlyclobber)
1501 continue;
1503 if (insn_info)
1504 cur_operand = insn_info->op_info + i;
1506 prev_open = open_chains;
1507 scan_rtx (insn, loc, cl, mark_write, OP_OUT);
1509 /* ??? Many targets have output constraints on the SET_DEST
1510 of a call insn, which is stupid, since these are certainly
1511 ABI defined hard registers. For these, and for asm operands
1512 that originally referenced hard registers, we must record that
1513 the chain cannot be renamed. */
1514 if (CALL_P (insn)
1515 || (asm_noperands (PATTERN (insn)) > 0
1516 && REG_P (op)
1517 && REGNO (op) == ORIGINAL_REGNO (op)))
1519 if (prev_open != open_chains)
1520 open_chains->cannot_rename = 1;
1523 cur_operand = NULL;
1526 /* Build def/use chain. */
1528 static bool
1529 build_def_use (basic_block bb)
1531 rtx_insn *insn;
1532 unsigned HOST_WIDE_INT untracked_operands;
1534 fail_current_block = false;
1536 for (insn = BB_HEAD (bb); ; insn = NEXT_INSN (insn))
1538 if (NONDEBUG_INSN_P (insn))
1540 int n_ops;
1541 rtx note;
1542 rtx old_operands[MAX_RECOG_OPERANDS];
1543 rtx old_dups[MAX_DUP_OPERANDS];
1544 int i;
1545 int predicated;
1546 enum rtx_code set_code = SET;
1547 enum rtx_code clobber_code = CLOBBER;
1548 insn_rr_info *insn_info = NULL;
1550 /* Process the insn, determining its effect on the def-use
1551 chains and live hard registers. We perform the following
1552 steps with the register references in the insn, simulating
1553 its effect:
1554 (1) Deal with earlyclobber operands and CLOBBERs of non-operands
1555 by creating chains and marking hard regs live.
1556 (2) Any read outside an operand causes any chain it overlaps
1557 with to be marked unrenamable.
1558 (3) Any read inside an operand is added if there's already
1559 an open chain for it.
1560 (4) For any REG_DEAD note we find, close open chains that
1561 overlap it.
1562 (5) For any non-earlyclobber write we find, close open chains
1563 that overlap it.
1564 (6) For any non-earlyclobber write we find in an operand, make
1565 a new chain or mark the hard register as live.
1566 (7) For any REG_UNUSED, close any chains we just opened.
1568 We cannot deal with situations where we track a reg in one mode
1569 and see a reference in another mode; these will cause the chain
1570 to be marked unrenamable or even cause us to abort the entire
1571 basic block. */
1573 extract_constrain_insn (insn);
1574 preprocess_constraints (insn);
1575 const operand_alternative *op_alt = which_op_alt ();
1576 n_ops = recog_data.n_operands;
1577 untracked_operands = 0;
1579 if (insn_rr.exists ())
1581 insn_info = &insn_rr[INSN_UID (insn)];
1582 insn_info->op_info = XOBNEWVEC (&rename_obstack, operand_rr_info,
1583 recog_data.n_operands);
1584 memset (insn_info->op_info, 0,
1585 sizeof (operand_rr_info) * recog_data.n_operands);
1588 /* Simplify the code below by promoting OP_OUT to OP_INOUT in
1589 predicated instructions, but only for register operands
1590 that are already tracked, so that we can create a chain
1591 when the first SET makes a register live. */
1593 predicated = GET_CODE (PATTERN (insn)) == COND_EXEC;
1594 for (i = 0; i < n_ops; ++i)
1596 rtx op = recog_data.operand[i];
1597 int matches = op_alt[i].matches;
1598 if (matches >= 0 || op_alt[i].matched >= 0
1599 || (predicated && recog_data.operand_type[i] == OP_OUT))
1601 recog_data.operand_type[i] = OP_INOUT;
1602 /* A special case to deal with instruction patterns that
1603 have matching operands with different modes. If we're
1604 not already tracking such a reg, we won't start here,
1605 and we must instead make sure to make the operand visible
1606 to the machinery that tracks hard registers. */
1607 if (matches >= 0
1608 && (GET_MODE_SIZE (recog_data.operand_mode[i])
1609 != GET_MODE_SIZE (recog_data.operand_mode[matches]))
1610 && !verify_reg_in_set (op, &live_in_chains))
1612 untracked_operands |= 1 << i;
1613 untracked_operands |= 1 << matches;
1616 /* If there's an in-out operand with a register that is not
1617 being tracked at all yet, open a chain. */
1618 if (recog_data.operand_type[i] == OP_INOUT
1619 && !(untracked_operands & (1 << i))
1620 && REG_P (op)
1621 && !verify_reg_tracked (op))
1622 create_new_chain (REGNO (op), REG_NREGS (op), NULL, NULL,
1623 NO_REGS);
1626 if (fail_current_block)
1627 break;
1629 /* Step 1a: Mark hard registers that are clobbered in this insn,
1630 outside an operand, as live. */
1631 hide_operands (n_ops, old_operands, old_dups, untracked_operands,
1632 false);
1633 note_stores (PATTERN (insn), note_sets_clobbers, &clobber_code);
1634 restore_operands (insn, n_ops, old_operands, old_dups);
1636 /* Step 1b: Begin new chains for earlyclobbered writes inside
1637 operands. */
1638 record_out_operands (insn, true, insn_info);
1640 /* Step 2: Mark chains for which we have reads outside operands
1641 as unrenamable.
1642 We do this by munging all operands into CC0, and closing
1643 everything remaining. */
1645 hide_operands (n_ops, old_operands, old_dups, untracked_operands,
1646 false);
1647 scan_rtx (insn, &PATTERN (insn), NO_REGS, mark_all_read, OP_IN);
1648 restore_operands (insn, n_ops, old_operands, old_dups);
1650 /* Step 2B: Can't rename function call argument registers. */
1651 if (CALL_P (insn) && CALL_INSN_FUNCTION_USAGE (insn))
1652 scan_rtx (insn, &CALL_INSN_FUNCTION_USAGE (insn),
1653 NO_REGS, mark_all_read, OP_IN);
1655 /* Step 2C: Can't rename asm operands that were originally
1656 hard registers. */
1657 if (asm_noperands (PATTERN (insn)) > 0)
1658 for (i = 0; i < n_ops; i++)
1660 rtx *loc = recog_data.operand_loc[i];
1661 rtx op = *loc;
1663 if (REG_P (op)
1664 && REGNO (op) == ORIGINAL_REGNO (op)
1665 && (recog_data.operand_type[i] == OP_IN
1666 || recog_data.operand_type[i] == OP_INOUT))
1667 scan_rtx (insn, loc, NO_REGS, mark_all_read, OP_IN);
1670 /* Step 3: Append to chains for reads inside operands. */
1671 for (i = 0; i < n_ops + recog_data.n_dups; i++)
1673 int opn = i < n_ops ? i : recog_data.dup_num[i - n_ops];
1674 rtx *loc = (i < n_ops
1675 ? recog_data.operand_loc[opn]
1676 : recog_data.dup_loc[i - n_ops]);
1677 enum reg_class cl = alternative_class (op_alt, opn);
1678 enum op_type type = recog_data.operand_type[opn];
1680 /* Don't scan match_operand here, since we've no reg class
1681 information to pass down. Any operands that we could
1682 substitute in will be represented elsewhere. */
1683 if (recog_data.constraints[opn][0] == '\0'
1684 || untracked_operands & (1 << opn))
1685 continue;
1687 if (insn_info)
1688 cur_operand = i == opn ? insn_info->op_info + i : NULL;
1689 if (op_alt[opn].is_address)
1690 scan_rtx_address (insn, loc, cl, mark_read,
1691 VOIDmode, ADDR_SPACE_GENERIC);
1692 else
1693 scan_rtx (insn, loc, cl, mark_read, type);
1695 cur_operand = NULL;
1697 /* Step 3B: Record updates for regs in REG_INC notes, and
1698 source regs in REG_FRAME_RELATED_EXPR notes. */
1699 for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
1700 if (REG_NOTE_KIND (note) == REG_INC
1701 || REG_NOTE_KIND (note) == REG_FRAME_RELATED_EXPR)
1702 scan_rtx (insn, &XEXP (note, 0), ALL_REGS, mark_read,
1703 OP_INOUT);
1705 /* Step 4: Close chains for registers that die here, unless
1706 the register is mentioned in a REG_UNUSED note. In that
1707 case we keep the chain open until step #7 below to ensure
1708 it conflicts with other output operands of this insn.
1709 See PR 52573. Arguably the insn should not have both
1710 notes; it has proven difficult to fix that without
1711 other undesirable side effects. */
1712 for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
1713 if (REG_NOTE_KIND (note) == REG_DEAD
1714 && !find_regno_note (insn, REG_UNUSED, REGNO (XEXP (note, 0))))
1716 remove_from_hard_reg_set (&live_hard_regs,
1717 GET_MODE (XEXP (note, 0)),
1718 REGNO (XEXP (note, 0)));
1719 scan_rtx (insn, &XEXP (note, 0), NO_REGS, terminate_dead,
1720 OP_IN);
1723 /* Step 4B: If this is a call, any chain live at this point
1724 requires a caller-saved reg. */
1725 if (CALL_P (insn))
1727 struct du_head *p;
1728 for (p = open_chains; p; p = p->next_chain)
1729 p->need_caller_save_reg = 1;
1732 /* Step 5: Close open chains that overlap writes. Similar to
1733 step 2, we hide in-out operands, since we do not want to
1734 close these chains. We also hide earlyclobber operands,
1735 since we've opened chains for them in step 1, and earlier
1736 chains they would overlap with must have been closed at
1737 the previous insn at the latest, as such operands cannot
1738 possibly overlap with any input operands. */
1740 hide_operands (n_ops, old_operands, old_dups, untracked_operands,
1741 true);
1742 scan_rtx (insn, &PATTERN (insn), NO_REGS, terminate_write, OP_IN);
1743 restore_operands (insn, n_ops, old_operands, old_dups);
1745 /* Step 6a: Mark hard registers that are set in this insn,
1746 outside an operand, as live. */
1747 hide_operands (n_ops, old_operands, old_dups, untracked_operands,
1748 false);
1749 note_stores (PATTERN (insn), note_sets_clobbers, &set_code);
1750 restore_operands (insn, n_ops, old_operands, old_dups);
1752 /* Step 6b: Begin new chains for writes inside operands. */
1753 record_out_operands (insn, false, insn_info);
1755 /* Step 6c: Record destination regs in REG_FRAME_RELATED_EXPR
1756 notes for update. */
1757 for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
1758 if (REG_NOTE_KIND (note) == REG_FRAME_RELATED_EXPR)
1759 scan_rtx (insn, &XEXP (note, 0), ALL_REGS, mark_access,
1760 OP_INOUT);
1762 /* Step 7: Close chains for registers that were never
1763 really used here. */
1764 for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
1765 if (REG_NOTE_KIND (note) == REG_UNUSED)
1767 remove_from_hard_reg_set (&live_hard_regs,
1768 GET_MODE (XEXP (note, 0)),
1769 REGNO (XEXP (note, 0)));
1770 scan_rtx (insn, &XEXP (note, 0), NO_REGS, terminate_dead,
1771 OP_IN);
1774 else if (DEBUG_INSN_P (insn)
1775 && !VAR_LOC_UNKNOWN_P (INSN_VAR_LOCATION_LOC (insn)))
1777 scan_rtx (insn, &INSN_VAR_LOCATION_LOC (insn),
1778 ALL_REGS, mark_read, OP_IN);
1780 if (insn == BB_END (bb))
1781 break;
1784 if (fail_current_block)
1785 return false;
1787 return true;
1790 /* Initialize the register renamer. If INSN_INFO is true, ensure that
1791 insn_rr is nonnull. */
1792 void
1793 regrename_init (bool insn_info)
1795 gcc_obstack_init (&rename_obstack);
1796 insn_rr.create (0);
1797 if (insn_info)
1798 insn_rr.safe_grow_cleared (get_max_uid ());
1801 /* Free all global data used by the register renamer. */
1802 void
1803 regrename_finish (void)
1805 insn_rr.release ();
1806 free_chain_data ();
1807 obstack_free (&rename_obstack, NULL);
1810 /* Perform register renaming on the current function. */
1812 static unsigned int
1813 regrename_optimize (void)
1815 df_set_flags (DF_LR_RUN_DCE);
1816 df_note_add_problem ();
1817 df_analyze ();
1818 df_set_flags (DF_DEFER_INSN_RESCAN);
1820 regrename_init (false);
1822 regrename_analyze (NULL);
1824 rename_chains ();
1826 regrename_finish ();
1828 return 0;
1831 namespace {
1833 const pass_data pass_data_regrename =
1835 RTL_PASS, /* type */
1836 "rnreg", /* name */
1837 OPTGROUP_NONE, /* optinfo_flags */
1838 TV_RENAME_REGISTERS, /* tv_id */
1839 0, /* properties_required */
1840 0, /* properties_provided */
1841 0, /* properties_destroyed */
1842 0, /* todo_flags_start */
1843 TODO_df_finish, /* todo_flags_finish */
1846 class pass_regrename : public rtl_opt_pass
1848 public:
1849 pass_regrename (gcc::context *ctxt)
1850 : rtl_opt_pass (pass_data_regrename, ctxt)
1853 /* opt_pass methods: */
1854 virtual bool gate (function *)
1856 return (optimize > 0 && (flag_rename_registers));
1859 virtual unsigned int execute (function *) { return regrename_optimize (); }
1861 }; // class pass_regrename
1863 } // anon namespace
1865 rtl_opt_pass *
1866 make_pass_regrename (gcc::context *ctxt)
1868 return new pass_regrename (ctxt);