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