PR target/66563
[official-gcc.git] / gcc / regrename.c
blob0cba8ded8c2e75a6b4fbb24ebcde816b5db685e5
1 /* Register renaming for the GNU compiler.
2 Copyright (C) 2000-2015 Free Software Foundation, Inc.
4 This file is part of GCC.
6 GCC is free software; you can redistribute it and/or modify it
7 under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3, or (at your option)
9 any later version.
11 GCC is distributed in the hope that it will be useful, but WITHOUT
12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
14 License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3. If not see
18 <http://www.gnu.org/licenses/>. */
20 #include "config.h"
21 #include "system.h"
22 #include "coretypes.h"
23 #include "tm.h"
24 #include "rtl-error.h"
25 #include "tm_p.h"
26 #include "insn-config.h"
27 #include "regs.h"
28 #include "addresses.h"
29 #include "hard-reg-set.h"
30 #include "predict.h"
31 #include "function.h"
32 #include "dominance.h"
33 #include "cfg.h"
34 #include "cfganal.h"
35 #include "basic-block.h"
36 #include "reload.h"
37 #include "output.h"
38 #include "recog.h"
39 #include "flags.h"
40 #include "obstack.h"
41 #include "tree-pass.h"
42 #include "df.h"
43 #include "target.h"
44 #include "emit-rtl.h"
45 #include "regrename.h"
47 /* This file implements the RTL register renaming pass of the compiler. It is
48 a semi-local pass whose goal is to maximize the usage of the register file
49 of the processor by substituting registers for others in the solution given
50 by the register allocator. The algorithm is as follows:
52 1. Local def/use chains are built: within each basic block, chains are
53 opened and closed; if a chain isn't closed at the end of the block,
54 it is dropped. We pre-open chains if we have already examined a
55 predecessor block and found chains live at the end which match
56 live registers at the start of the new block.
58 2. We try to combine the local chains across basic block boundaries by
59 comparing chains that were open at the start or end of a block to
60 those in successor/predecessor blocks.
62 3. For each chain, the set of possible renaming registers is computed.
63 This takes into account the renaming of previously processed chains.
64 Optionally, a preferred class is computed for the renaming register.
66 4. The best renaming register is computed for the chain in the above set,
67 using a round-robin allocation. If a preferred class exists, then the
68 round-robin allocation is done within the class first, if possible.
69 The round-robin allocation of renaming registers itself is global.
71 5. If a renaming register has been found, it is substituted in the chain.
73 Targets can parameterize the pass by specifying a preferred class for the
74 renaming register for a given (super)class of registers to be renamed. */
76 #if HOST_BITS_PER_WIDE_INT <= MAX_RECOG_OPERANDS
77 #error "Use a different bitmap implementation for untracked_operands."
78 #endif
80 enum scan_actions
82 terminate_write,
83 terminate_dead,
84 mark_all_read,
85 mark_read,
86 mark_write,
87 /* mark_access is for marking the destination regs in
88 REG_FRAME_RELATED_EXPR notes (as if they were read) so that the
89 note is updated properly. */
90 mark_access
93 static const char * const scan_actions_name[] =
95 "terminate_write",
96 "terminate_dead",
97 "mark_all_read",
98 "mark_read",
99 "mark_write",
100 "mark_access"
103 /* TICK and THIS_TICK are used to record the last time we saw each
104 register. */
105 static int tick[FIRST_PSEUDO_REGISTER];
106 static int this_tick = 0;
108 static struct obstack rename_obstack;
110 /* If nonnull, the code calling into the register renamer requested
111 information about insn operands, and we store it here. */
112 vec<insn_rr_info> insn_rr;
114 static void scan_rtx (rtx_insn *, rtx *, enum reg_class, enum scan_actions,
115 enum op_type);
116 static bool build_def_use (basic_block);
118 /* The id to be given to the next opened chain. */
119 static unsigned current_id;
121 /* A mapping of unique id numbers to chains. */
122 static vec<du_head_p> id_to_chain;
124 /* List of currently open chains. */
125 static struct du_head *open_chains;
127 /* Bitmap of open chains. The bits set always match the list found in
128 open_chains. */
129 static bitmap_head open_chains_set;
131 /* Record the registers being tracked in open_chains. */
132 static HARD_REG_SET live_in_chains;
134 /* Record the registers that are live but not tracked. The intersection
135 between this and live_in_chains is empty. */
136 static HARD_REG_SET live_hard_regs;
138 /* Set while scanning RTL if INSN_RR is nonnull, i.e. if the current analysis
139 is for a caller that requires operand data. Used in
140 record_operand_use. */
141 static operand_rr_info *cur_operand;
143 /* Return the chain corresponding to id number ID. Take into account that
144 chains may have been merged. */
145 du_head_p
146 regrename_chain_from_id (unsigned int id)
148 du_head_p first_chain = id_to_chain[id];
149 du_head_p chain = first_chain;
150 while (chain->id != id)
152 id = chain->id;
153 chain = id_to_chain[id];
155 first_chain->id = id;
156 return chain;
159 /* Dump all def/use chains, starting at id FROM. */
161 static void
162 dump_def_use_chain (int from)
164 du_head_p head;
165 int i;
166 FOR_EACH_VEC_ELT_FROM (id_to_chain, i, head, from)
168 struct du_chain *this_du = head->first;
170 fprintf (dump_file, "Register %s (%d):",
171 reg_names[head->regno], head->nregs);
172 while (this_du)
174 fprintf (dump_file, " %d [%s]", INSN_UID (this_du->insn),
175 reg_class_names[this_du->cl]);
176 this_du = this_du->next_use;
178 fprintf (dump_file, "\n");
179 head = head->next_chain;
183 static void
184 free_chain_data (void)
186 int i;
187 du_head_p ptr;
188 for (i = 0; id_to_chain.iterate (i, &ptr); i++)
189 bitmap_clear (&ptr->conflicts);
191 id_to_chain.release ();
194 /* Walk all chains starting with CHAINS and record that they conflict with
195 another chain whose id is ID. */
197 static void
198 mark_conflict (struct du_head *chains, unsigned id)
200 while (chains)
202 bitmap_set_bit (&chains->conflicts, id);
203 chains = chains->next_chain;
207 /* Examine cur_operand, and if it is nonnull, record information about the
208 use THIS_DU which is part of the chain HEAD. */
210 static void
211 record_operand_use (struct du_head *head, struct du_chain *this_du)
213 if (cur_operand == NULL)
214 return;
215 gcc_assert (cur_operand->n_chains < MAX_REGS_PER_ADDRESS);
216 cur_operand->heads[cur_operand->n_chains] = head;
217 cur_operand->chains[cur_operand->n_chains++] = this_du;
220 /* Create a new chain for THIS_NREGS registers starting at THIS_REGNO,
221 and record its occurrence in *LOC, which is being written to in INSN.
222 This access requires a register of class CL. */
224 static du_head_p
225 create_new_chain (unsigned this_regno, unsigned this_nregs, rtx *loc,
226 rtx_insn *insn, enum reg_class cl)
228 struct du_head *head = XOBNEW (&rename_obstack, struct du_head);
229 struct du_chain *this_du;
230 int nregs;
232 head->next_chain = open_chains;
233 head->regno = this_regno;
234 head->nregs = this_nregs;
235 head->need_caller_save_reg = 0;
236 head->cannot_rename = 0;
238 id_to_chain.safe_push (head);
239 head->id = current_id++;
241 bitmap_initialize (&head->conflicts, &bitmap_default_obstack);
242 bitmap_copy (&head->conflicts, &open_chains_set);
243 mark_conflict (open_chains, head->id);
245 /* Since we're tracking this as a chain now, remove it from the
246 list of conflicting live hard registers and track it in
247 live_in_chains instead. */
248 nregs = head->nregs;
249 while (nregs-- > 0)
251 SET_HARD_REG_BIT (live_in_chains, head->regno + nregs);
252 CLEAR_HARD_REG_BIT (live_hard_regs, head->regno + nregs);
255 COPY_HARD_REG_SET (head->hard_conflicts, live_hard_regs);
256 bitmap_set_bit (&open_chains_set, head->id);
258 open_chains = head;
260 if (dump_file)
262 fprintf (dump_file, "Creating chain %s (%d)",
263 reg_names[head->regno], head->id);
264 if (insn != NULL_RTX)
265 fprintf (dump_file, " at insn %d", INSN_UID (insn));
266 fprintf (dump_file, "\n");
269 if (insn == NULL_RTX)
271 head->first = head->last = NULL;
272 return head;
275 this_du = XOBNEW (&rename_obstack, struct du_chain);
276 head->first = head->last = this_du;
278 this_du->next_use = 0;
279 this_du->loc = loc;
280 this_du->insn = insn;
281 this_du->cl = cl;
282 record_operand_use (head, this_du);
283 return head;
286 /* For a def-use chain HEAD, find which registers overlap its lifetime and
287 set the corresponding bits in *PSET. */
289 static void
290 merge_overlapping_regs (HARD_REG_SET *pset, struct du_head *head)
292 bitmap_iterator bi;
293 unsigned i;
294 IOR_HARD_REG_SET (*pset, head->hard_conflicts);
295 EXECUTE_IF_SET_IN_BITMAP (&head->conflicts, 0, i, bi)
297 du_head_p other = regrename_chain_from_id (i);
298 unsigned j = other->nregs;
299 gcc_assert (other != head);
300 while (j-- > 0)
301 SET_HARD_REG_BIT (*pset, other->regno + j);
305 /* Check if NEW_REG can be the candidate register to rename for
306 REG in THIS_HEAD chain. THIS_UNAVAILABLE is a set of unavailable hard
307 registers. */
309 static bool
310 check_new_reg_p (int reg ATTRIBUTE_UNUSED, int new_reg,
311 struct du_head *this_head, HARD_REG_SET this_unavailable)
313 machine_mode mode = GET_MODE (*this_head->first->loc);
314 int nregs = hard_regno_nregs[new_reg][mode];
315 int i;
316 struct du_chain *tmp;
318 for (i = nregs - 1; i >= 0; --i)
319 if (TEST_HARD_REG_BIT (this_unavailable, new_reg + i)
320 || fixed_regs[new_reg + i]
321 || global_regs[new_reg + i]
322 /* Can't use regs which aren't saved by the prologue. */
323 || (! df_regs_ever_live_p (new_reg + i)
324 && ! call_used_regs[new_reg + i])
325 #ifdef LEAF_REGISTERS
326 /* We can't use a non-leaf register if we're in a
327 leaf function. */
328 || (crtl->is_leaf
329 && !LEAF_REGISTERS[new_reg + i])
330 #endif
331 || ! HARD_REGNO_RENAME_OK (reg + i, new_reg + i))
332 return false;
334 /* See whether it accepts all modes that occur in
335 definition and uses. */
336 for (tmp = this_head->first; tmp; tmp = tmp->next_use)
337 if ((! HARD_REGNO_MODE_OK (new_reg, GET_MODE (*tmp->loc))
338 && ! DEBUG_INSN_P (tmp->insn))
339 || (this_head->need_caller_save_reg
340 && ! (HARD_REGNO_CALL_PART_CLOBBERED
341 (reg, GET_MODE (*tmp->loc)))
342 && (HARD_REGNO_CALL_PART_CLOBBERED
343 (new_reg, GET_MODE (*tmp->loc)))))
344 return false;
346 return true;
349 /* For the chain THIS_HEAD, compute and return the best register to
350 rename to. SUPER_CLASS is the superunion of register classes in
351 the chain. UNAVAILABLE is a set of registers that cannot be used.
352 OLD_REG is the register currently used for the chain. BEST_RENAME
353 controls whether the register chosen must be better than the
354 current one or just respect the given constraint. */
357 find_rename_reg (du_head_p this_head, enum reg_class super_class,
358 HARD_REG_SET *unavailable, int old_reg, bool best_rename)
360 bool has_preferred_class;
361 enum reg_class preferred_class;
362 int pass;
363 int best_new_reg = old_reg;
365 /* Further narrow the set of registers we can use for renaming.
366 If the chain needs a call-saved register, mark the call-used
367 registers as unavailable. */
368 if (this_head->need_caller_save_reg)
369 IOR_HARD_REG_SET (*unavailable, call_used_reg_set);
371 /* Mark registers that overlap this chain's lifetime as unavailable. */
372 merge_overlapping_regs (unavailable, this_head);
374 /* Compute preferred rename class of super union of all the classes
375 in the chain. */
376 preferred_class
377 = (enum reg_class) targetm.preferred_rename_class (super_class);
379 /* If PREFERRED_CLASS is not NO_REGS, we iterate in the first pass
380 over registers that belong to PREFERRED_CLASS and try to find the
381 best register within the class. If that failed, we iterate in
382 the second pass over registers that don't belong to the class.
383 If PREFERRED_CLASS is NO_REGS, we iterate over all registers in
384 ascending order without any preference. */
385 has_preferred_class = (preferred_class != NO_REGS);
386 for (pass = (has_preferred_class ? 0 : 1); pass < 2; pass++)
388 int new_reg;
389 for (new_reg = 0; new_reg < FIRST_PSEUDO_REGISTER; new_reg++)
391 if (has_preferred_class
392 && (pass == 0)
393 != TEST_HARD_REG_BIT (reg_class_contents[preferred_class],
394 new_reg))
395 continue;
397 if (!check_new_reg_p (old_reg, new_reg, this_head, *unavailable))
398 continue;
400 if (!best_rename)
401 return new_reg;
403 /* In the first pass, we force the renaming of registers that
404 don't belong to PREFERRED_CLASS to registers that do, even
405 though the latters were used not very long ago. */
406 if ((pass == 0
407 && !TEST_HARD_REG_BIT (reg_class_contents[preferred_class],
408 best_new_reg))
409 || tick[best_new_reg] > tick[new_reg])
410 best_new_reg = new_reg;
412 if (pass == 0 && best_new_reg != old_reg)
413 break;
415 return best_new_reg;
418 /* Perform register renaming on the current function. */
419 static void
420 rename_chains (void)
422 HARD_REG_SET unavailable;
423 du_head_p this_head;
424 int i;
426 memset (tick, 0, sizeof tick);
428 CLEAR_HARD_REG_SET (unavailable);
429 /* Don't clobber traceback for noreturn functions. */
430 if (frame_pointer_needed)
432 add_to_hard_reg_set (&unavailable, Pmode, FRAME_POINTER_REGNUM);
433 if (!HARD_FRAME_POINTER_IS_FRAME_POINTER)
434 add_to_hard_reg_set (&unavailable, Pmode, HARD_FRAME_POINTER_REGNUM);
437 FOR_EACH_VEC_ELT (id_to_chain, i, this_head)
439 int best_new_reg;
440 int n_uses;
441 struct du_chain *tmp;
442 HARD_REG_SET this_unavailable;
443 int reg = this_head->regno;
444 enum reg_class super_class = NO_REGS;
446 if (this_head->cannot_rename)
447 continue;
449 if (fixed_regs[reg] || global_regs[reg]
450 #if !HARD_FRAME_POINTER_IS_FRAME_POINTER
451 || (frame_pointer_needed && reg == HARD_FRAME_POINTER_REGNUM)
452 #else
453 || (frame_pointer_needed && reg == FRAME_POINTER_REGNUM)
454 #endif
456 continue;
458 COPY_HARD_REG_SET (this_unavailable, unavailable);
460 /* Iterate over elements in the chain in order to:
461 1. Count number of uses, and narrow the set of registers we can
462 use for renaming.
463 2. Compute the superunion of register classes in this chain. */
464 n_uses = 0;
465 super_class = NO_REGS;
466 for (tmp = this_head->first; tmp; tmp = tmp->next_use)
468 if (DEBUG_INSN_P (tmp->insn))
469 continue;
470 n_uses++;
471 IOR_COMPL_HARD_REG_SET (this_unavailable,
472 reg_class_contents[tmp->cl]);
473 super_class
474 = reg_class_superunion[(int) super_class][(int) tmp->cl];
477 if (n_uses < 2)
478 continue;
480 best_new_reg = find_rename_reg (this_head, super_class,
481 &this_unavailable, reg, true);
483 if (dump_file)
485 fprintf (dump_file, "Register %s in insn %d",
486 reg_names[reg], INSN_UID (this_head->first->insn));
487 if (this_head->need_caller_save_reg)
488 fprintf (dump_file, " crosses a call");
491 if (best_new_reg == reg)
493 tick[reg] = ++this_tick;
494 if (dump_file)
495 fprintf (dump_file, "; no available better choice\n");
496 continue;
499 if (dump_file)
500 fprintf (dump_file, ", renamed as %s\n", reg_names[best_new_reg]);
502 regrename_do_replace (this_head, best_new_reg);
503 tick[best_new_reg] = ++this_tick;
504 df_set_regs_ever_live (best_new_reg, true);
508 /* A structure to record information for each hard register at the start of
509 a basic block. */
510 struct incoming_reg_info {
511 /* Holds the number of registers used in the chain that gave us information
512 about this register. Zero means no information known yet, while a
513 negative value is used for something that is part of, but not the first
514 register in a multi-register value. */
515 int nregs;
516 /* Set to true if we have accesses that conflict in the number of registers
517 used. */
518 bool unusable;
521 /* A structure recording information about each basic block. It is saved
522 and restored around basic block boundaries.
523 A pointer to such a structure is stored in each basic block's aux field
524 during regrename_analyze, except for blocks we know can't be optimized
525 (such as entry and exit blocks). */
526 struct bb_rename_info
528 /* The basic block corresponding to this structure. */
529 basic_block bb;
530 /* Copies of the global information. */
531 bitmap_head open_chains_set;
532 bitmap_head incoming_open_chains_set;
533 struct incoming_reg_info incoming[FIRST_PSEUDO_REGISTER];
536 /* Initialize a rename_info structure P for basic block BB, which starts a new
537 scan. */
538 static void
539 init_rename_info (struct bb_rename_info *p, basic_block bb)
541 int i;
542 df_ref def;
543 HARD_REG_SET start_chains_set;
545 p->bb = bb;
546 bitmap_initialize (&p->open_chains_set, &bitmap_default_obstack);
547 bitmap_initialize (&p->incoming_open_chains_set, &bitmap_default_obstack);
549 open_chains = NULL;
550 bitmap_clear (&open_chains_set);
552 CLEAR_HARD_REG_SET (live_in_chains);
553 REG_SET_TO_HARD_REG_SET (live_hard_regs, df_get_live_in (bb));
554 FOR_EACH_ARTIFICIAL_DEF (def, bb->index)
555 if (DF_REF_FLAGS (def) & DF_REF_AT_TOP)
556 SET_HARD_REG_BIT (live_hard_regs, DF_REF_REGNO (def));
558 /* Open chains based on information from (at least one) predecessor
559 block. This gives us a chance later on to combine chains across
560 basic block boundaries. Inconsistencies (in access sizes) will
561 be caught normally and dealt with conservatively by disabling the
562 chain for renaming, and there is no risk of losing optimization
563 opportunities by opening chains either: if we did not open the
564 chains, we'd have to track the live register as a hard reg, and
565 we'd be unable to rename it in any case. */
566 CLEAR_HARD_REG_SET (start_chains_set);
567 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
569 struct incoming_reg_info *iri = p->incoming + i;
570 if (iri->nregs > 0 && !iri->unusable
571 && range_in_hard_reg_set_p (live_hard_regs, i, iri->nregs))
573 SET_HARD_REG_BIT (start_chains_set, i);
574 remove_range_from_hard_reg_set (&live_hard_regs, i, iri->nregs);
577 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
579 struct incoming_reg_info *iri = p->incoming + i;
580 if (TEST_HARD_REG_BIT (start_chains_set, i))
582 du_head_p chain;
583 if (dump_file)
584 fprintf (dump_file, "opening incoming chain\n");
585 chain = create_new_chain (i, iri->nregs, NULL, NULL, NO_REGS);
586 bitmap_set_bit (&p->incoming_open_chains_set, chain->id);
591 /* Record in RI that the block corresponding to it has an incoming
592 live value, described by CHAIN. */
593 static void
594 set_incoming_from_chain (struct bb_rename_info *ri, du_head_p chain)
596 int i;
597 int incoming_nregs = ri->incoming[chain->regno].nregs;
598 int nregs;
600 /* If we've recorded the same information before, everything is fine. */
601 if (incoming_nregs == chain->nregs)
603 if (dump_file)
604 fprintf (dump_file, "reg %d/%d already recorded\n",
605 chain->regno, chain->nregs);
606 return;
609 /* If we have no information for any of the involved registers, update
610 the incoming array. */
611 nregs = chain->nregs;
612 while (nregs-- > 0)
613 if (ri->incoming[chain->regno + nregs].nregs != 0
614 || ri->incoming[chain->regno + nregs].unusable)
615 break;
616 if (nregs < 0)
618 nregs = chain->nregs;
619 ri->incoming[chain->regno].nregs = nregs;
620 while (nregs-- > 1)
621 ri->incoming[chain->regno + nregs].nregs = -nregs;
622 if (dump_file)
623 fprintf (dump_file, "recorded reg %d/%d\n",
624 chain->regno, chain->nregs);
625 return;
628 /* There must be some kind of conflict. Prevent both the old and
629 new ranges from being used. */
630 if (incoming_nregs < 0)
631 ri->incoming[chain->regno + incoming_nregs].unusable = true;
632 for (i = 0; i < chain->nregs; i++)
633 ri->incoming[chain->regno + i].unusable = true;
636 /* Merge the two chains C1 and C2 so that all conflict information is
637 recorded and C1, and the id of C2 is changed to that of C1. */
638 static void
639 merge_chains (du_head_p c1, du_head_p c2)
641 if (c1 == c2)
642 return;
644 if (c2->first != NULL)
646 if (c1->first == NULL)
647 c1->first = c2->first;
648 else
649 c1->last->next_use = c2->first;
650 c1->last = c2->last;
653 c2->first = c2->last = NULL;
654 c2->id = c1->id;
656 IOR_HARD_REG_SET (c1->hard_conflicts, c2->hard_conflicts);
657 bitmap_ior_into (&c1->conflicts, &c2->conflicts);
659 c1->need_caller_save_reg |= c2->need_caller_save_reg;
660 c1->cannot_rename |= c2->cannot_rename;
663 /* Analyze the current function and build chains for renaming. */
665 void
666 regrename_analyze (bitmap bb_mask)
668 struct bb_rename_info *rename_info;
669 int i;
670 basic_block bb;
671 int n_bbs;
672 int *inverse_postorder;
674 inverse_postorder = XNEWVEC (int, last_basic_block_for_fn (cfun));
675 n_bbs = pre_and_rev_post_order_compute (NULL, inverse_postorder, false);
677 /* Gather some information about the blocks in this function. */
678 rename_info = XCNEWVEC (struct bb_rename_info, n_basic_blocks_for_fn (cfun));
679 i = 0;
680 FOR_EACH_BB_FN (bb, cfun)
682 struct bb_rename_info *ri = rename_info + i;
683 ri->bb = bb;
684 if (bb_mask != NULL && !bitmap_bit_p (bb_mask, bb->index))
685 bb->aux = NULL;
686 else
687 bb->aux = ri;
688 i++;
691 current_id = 0;
692 id_to_chain.create (0);
693 bitmap_initialize (&open_chains_set, &bitmap_default_obstack);
695 /* The order in which we visit blocks ensures that whenever
696 possible, we only process a block after at least one of its
697 predecessors, which provides a "seeding" effect to make the logic
698 in set_incoming_from_chain and init_rename_info useful. */
700 for (i = 0; i < n_bbs; i++)
702 basic_block bb1 = BASIC_BLOCK_FOR_FN (cfun, inverse_postorder[i]);
703 struct bb_rename_info *this_info;
704 bool success;
705 edge e;
706 edge_iterator ei;
707 int old_length = id_to_chain.length ();
709 this_info = (struct bb_rename_info *) bb1->aux;
710 if (this_info == NULL)
711 continue;
713 if (dump_file)
714 fprintf (dump_file, "\nprocessing block %d:\n", bb1->index);
716 init_rename_info (this_info, bb1);
718 success = build_def_use (bb1);
719 if (!success)
721 if (dump_file)
722 fprintf (dump_file, "failed\n");
723 bb1->aux = NULL;
724 id_to_chain.truncate (old_length);
725 current_id = old_length;
726 bitmap_clear (&this_info->incoming_open_chains_set);
727 open_chains = NULL;
728 if (insn_rr.exists ())
730 rtx_insn *insn;
731 FOR_BB_INSNS (bb1, insn)
733 insn_rr_info *p = &insn_rr[INSN_UID (insn)];
734 p->op_info = NULL;
737 continue;
740 if (dump_file)
741 dump_def_use_chain (old_length);
742 bitmap_copy (&this_info->open_chains_set, &open_chains_set);
744 /* Add successor blocks to the worklist if necessary, and record
745 data about our own open chains at the end of this block, which
746 will be used to pre-open chains when processing the successors. */
747 FOR_EACH_EDGE (e, ei, bb1->succs)
749 struct bb_rename_info *dest_ri;
750 struct du_head *chain;
752 if (dump_file)
753 fprintf (dump_file, "successor block %d\n", e->dest->index);
755 if (e->flags & (EDGE_EH | EDGE_ABNORMAL))
756 continue;
757 dest_ri = (struct bb_rename_info *)e->dest->aux;
758 if (dest_ri == NULL)
759 continue;
760 for (chain = open_chains; chain; chain = chain->next_chain)
761 set_incoming_from_chain (dest_ri, chain);
765 free (inverse_postorder);
767 /* Now, combine the chains data we have gathered across basic block
768 boundaries.
770 For every basic block, there may be chains open at the start, or at the
771 end. Rather than exclude them from renaming, we look for open chains
772 with matching registers at the other side of the CFG edge.
774 For a given chain using register R, open at the start of block B, we
775 must find an open chain using R on the other side of every edge leading
776 to B, if the register is live across this edge. In the code below,
777 N_PREDS_USED counts the number of edges where the register is live, and
778 N_PREDS_JOINED counts those where we found an appropriate chain for
779 joining.
781 We perform the analysis for both incoming and outgoing edges, but we
782 only need to merge once (in the second part, after verifying outgoing
783 edges). */
784 FOR_EACH_BB_FN (bb, cfun)
786 struct bb_rename_info *bb_ri = (struct bb_rename_info *) bb->aux;
787 unsigned j;
788 bitmap_iterator bi;
790 if (bb_ri == NULL)
791 continue;
793 if (dump_file)
794 fprintf (dump_file, "processing bb %d in edges\n", bb->index);
796 EXECUTE_IF_SET_IN_BITMAP (&bb_ri->incoming_open_chains_set, 0, j, bi)
798 edge e;
799 edge_iterator ei;
800 struct du_head *chain = regrename_chain_from_id (j);
801 int n_preds_used = 0, n_preds_joined = 0;
803 FOR_EACH_EDGE (e, ei, bb->preds)
805 struct bb_rename_info *src_ri;
806 unsigned k;
807 bitmap_iterator bi2;
808 HARD_REG_SET live;
809 bool success = false;
811 REG_SET_TO_HARD_REG_SET (live, df_get_live_out (e->src));
812 if (!range_overlaps_hard_reg_set_p (live, chain->regno,
813 chain->nregs))
814 continue;
815 n_preds_used++;
817 if (e->flags & (EDGE_EH | EDGE_ABNORMAL))
818 continue;
820 src_ri = (struct bb_rename_info *)e->src->aux;
821 if (src_ri == NULL)
822 continue;
824 EXECUTE_IF_SET_IN_BITMAP (&src_ri->open_chains_set,
825 0, k, bi2)
827 struct du_head *outgoing_chain = regrename_chain_from_id (k);
829 if (outgoing_chain->regno == chain->regno
830 && outgoing_chain->nregs == chain->nregs)
832 n_preds_joined++;
833 success = true;
834 break;
837 if (!success && dump_file)
838 fprintf (dump_file, "failure to match with pred block %d\n",
839 e->src->index);
841 if (n_preds_joined < n_preds_used)
843 if (dump_file)
844 fprintf (dump_file, "cannot rename chain %d\n", j);
845 chain->cannot_rename = 1;
849 FOR_EACH_BB_FN (bb, cfun)
851 struct bb_rename_info *bb_ri = (struct bb_rename_info *) bb->aux;
852 unsigned j;
853 bitmap_iterator bi;
855 if (bb_ri == NULL)
856 continue;
858 if (dump_file)
859 fprintf (dump_file, "processing bb %d out edges\n", bb->index);
861 EXECUTE_IF_SET_IN_BITMAP (&bb_ri->open_chains_set, 0, j, bi)
863 edge e;
864 edge_iterator ei;
865 struct du_head *chain = regrename_chain_from_id (j);
866 int n_succs_used = 0, n_succs_joined = 0;
868 FOR_EACH_EDGE (e, ei, bb->succs)
870 bool printed = false;
871 struct bb_rename_info *dest_ri;
872 unsigned k;
873 bitmap_iterator bi2;
874 HARD_REG_SET live;
876 REG_SET_TO_HARD_REG_SET (live, df_get_live_in (e->dest));
877 if (!range_overlaps_hard_reg_set_p (live, chain->regno,
878 chain->nregs))
879 continue;
881 n_succs_used++;
883 dest_ri = (struct bb_rename_info *)e->dest->aux;
884 if (dest_ri == NULL)
885 continue;
887 EXECUTE_IF_SET_IN_BITMAP (&dest_ri->incoming_open_chains_set,
888 0, k, bi2)
890 struct du_head *incoming_chain = regrename_chain_from_id (k);
892 if (incoming_chain->regno == chain->regno
893 && incoming_chain->nregs == chain->nregs)
895 if (dump_file)
897 if (!printed)
898 fprintf (dump_file,
899 "merging blocks for edge %d -> %d\n",
900 e->src->index, e->dest->index);
901 printed = true;
902 fprintf (dump_file,
903 " merging chains %d (->%d) and %d (->%d) [%s]\n",
904 k, incoming_chain->id, j, chain->id,
905 reg_names[incoming_chain->regno]);
908 merge_chains (chain, incoming_chain);
909 n_succs_joined++;
910 break;
914 if (n_succs_joined < n_succs_used)
916 if (dump_file)
917 fprintf (dump_file, "cannot rename chain %d\n",
919 chain->cannot_rename = 1;
924 free (rename_info);
926 FOR_EACH_BB_FN (bb, cfun)
927 bb->aux = NULL;
930 void
931 regrename_do_replace (struct du_head *head, int reg)
933 struct du_chain *chain;
934 unsigned int base_regno = head->regno;
935 machine_mode mode;
937 for (chain = head->first; chain; chain = chain->next_use)
939 unsigned int regno = ORIGINAL_REGNO (*chain->loc);
940 struct reg_attrs *attr = REG_ATTRS (*chain->loc);
941 int reg_ptr = REG_POINTER (*chain->loc);
943 if (DEBUG_INSN_P (chain->insn) && REGNO (*chain->loc) != base_regno)
944 INSN_VAR_LOCATION_LOC (chain->insn) = gen_rtx_UNKNOWN_VAR_LOC ();
945 else
947 *chain->loc = gen_raw_REG (GET_MODE (*chain->loc), reg);
948 if (regno >= FIRST_PSEUDO_REGISTER)
949 ORIGINAL_REGNO (*chain->loc) = regno;
950 REG_ATTRS (*chain->loc) = attr;
951 REG_POINTER (*chain->loc) = reg_ptr;
954 df_insn_rescan (chain->insn);
957 mode = GET_MODE (*head->first->loc);
958 head->regno = reg;
959 head->nregs = hard_regno_nregs[reg][mode];
963 /* True if we found a register with a size mismatch, which means that we
964 can't track its lifetime accurately. If so, we abort the current block
965 without renaming. */
966 static bool fail_current_block;
968 /* Return true if OP is a reg for which all bits are set in PSET, false
969 if all bits are clear.
970 In other cases, set fail_current_block and return false. */
972 static bool
973 verify_reg_in_set (rtx op, HARD_REG_SET *pset)
975 unsigned regno, nregs;
976 bool all_live, all_dead;
977 if (!REG_P (op))
978 return false;
980 regno = REGNO (op);
981 nregs = REG_NREGS (op);
982 all_live = all_dead = true;
983 while (nregs-- > 0)
984 if (TEST_HARD_REG_BIT (*pset, regno + nregs))
985 all_dead = false;
986 else
987 all_live = false;
988 if (!all_dead && !all_live)
990 fail_current_block = true;
991 return false;
993 return all_live;
996 /* Return true if OP is a reg that is being tracked already in some form.
997 May set fail_current_block if it sees an unhandled case of overlap. */
999 static bool
1000 verify_reg_tracked (rtx op)
1002 return (verify_reg_in_set (op, &live_hard_regs)
1003 || verify_reg_in_set (op, &live_in_chains));
1006 /* Called through note_stores. DATA points to a rtx_code, either SET or
1007 CLOBBER, which tells us which kind of rtx to look at. If we have a
1008 match, record the set register in live_hard_regs and in the hard_conflicts
1009 bitmap of open chains. */
1011 static void
1012 note_sets_clobbers (rtx x, const_rtx set, void *data)
1014 enum rtx_code code = *(enum rtx_code *)data;
1015 struct du_head *chain;
1017 if (GET_CODE (x) == SUBREG)
1018 x = SUBREG_REG (x);
1019 if (!REG_P (x) || GET_CODE (set) != code)
1020 return;
1021 /* There must not be pseudos at this point. */
1022 gcc_assert (HARD_REGISTER_P (x));
1023 add_to_hard_reg_set (&live_hard_regs, GET_MODE (x), REGNO (x));
1024 for (chain = open_chains; chain; chain = chain->next_chain)
1025 add_to_hard_reg_set (&chain->hard_conflicts, GET_MODE (x), REGNO (x));
1028 static void
1029 scan_rtx_reg (rtx_insn *insn, rtx *loc, enum reg_class cl, enum scan_actions action,
1030 enum op_type type)
1032 struct du_head **p;
1033 rtx x = *loc;
1034 unsigned this_regno = REGNO (x);
1035 int this_nregs = REG_NREGS (x);
1037 if (action == mark_write)
1039 if (type == OP_OUT)
1040 create_new_chain (this_regno, this_nregs, loc, insn, cl);
1041 return;
1044 if ((type == OP_OUT) != (action == terminate_write || action == mark_access))
1045 return;
1047 for (p = &open_chains; *p;)
1049 struct du_head *head = *p;
1050 struct du_head *next = head->next_chain;
1051 int exact_match = (head->regno == this_regno
1052 && head->nregs == this_nregs);
1053 int superset = (this_regno <= head->regno
1054 && this_regno + this_nregs >= head->regno + head->nregs);
1055 int subset = (this_regno >= head->regno
1056 && this_regno + this_nregs <= head->regno + head->nregs);
1058 if (!bitmap_bit_p (&open_chains_set, head->id)
1059 || head->regno + head->nregs <= this_regno
1060 || this_regno + this_nregs <= head->regno)
1062 p = &head->next_chain;
1063 continue;
1066 if (action == mark_read || action == mark_access)
1068 /* ??? Class NO_REGS can happen if the md file makes use of
1069 EXTRA_CONSTRAINTS to match registers. Which is arguably
1070 wrong, but there we are. */
1072 if (cl == NO_REGS || (!exact_match && !DEBUG_INSN_P (insn)))
1074 if (dump_file)
1075 fprintf (dump_file,
1076 "Cannot rename chain %s (%d) at insn %d (%s)\n",
1077 reg_names[head->regno], head->id, INSN_UID (insn),
1078 scan_actions_name[(int) action]);
1079 head->cannot_rename = 1;
1080 if (superset)
1082 unsigned nregs = this_nregs;
1083 head->regno = this_regno;
1084 head->nregs = this_nregs;
1085 while (nregs-- > 0)
1086 SET_HARD_REG_BIT (live_in_chains, head->regno + nregs);
1087 if (dump_file)
1088 fprintf (dump_file,
1089 "Widening register in chain %s (%d) at insn %d\n",
1090 reg_names[head->regno], head->id, INSN_UID (insn));
1092 else if (!subset)
1094 fail_current_block = true;
1095 if (dump_file)
1096 fprintf (dump_file,
1097 "Failing basic block due to unhandled overlap\n");
1100 else
1102 struct du_chain *this_du;
1103 this_du = XOBNEW (&rename_obstack, struct du_chain);
1104 this_du->next_use = 0;
1105 this_du->loc = loc;
1106 this_du->insn = insn;
1107 this_du->cl = cl;
1108 if (head->first == NULL)
1109 head->first = this_du;
1110 else
1111 head->last->next_use = this_du;
1112 record_operand_use (head, this_du);
1113 head->last = this_du;
1115 /* Avoid adding the same location in a DEBUG_INSN multiple times,
1116 which could happen with non-exact overlap. */
1117 if (DEBUG_INSN_P (insn))
1118 return;
1119 /* Otherwise, find any other chains that do not match exactly;
1120 ensure they all get marked unrenamable. */
1121 p = &head->next_chain;
1122 continue;
1125 /* Whether the terminated chain can be used for renaming
1126 depends on the action and this being an exact match.
1127 In either case, we remove this element from open_chains. */
1129 if ((action == terminate_dead || action == terminate_write)
1130 && (superset || subset))
1132 unsigned nregs;
1134 if (subset && !superset)
1135 head->cannot_rename = 1;
1136 bitmap_clear_bit (&open_chains_set, head->id);
1138 nregs = head->nregs;
1139 while (nregs-- > 0)
1141 CLEAR_HARD_REG_BIT (live_in_chains, head->regno + nregs);
1142 if (subset && !superset
1143 && (head->regno + nregs < this_regno
1144 || head->regno + nregs >= this_regno + this_nregs))
1145 SET_HARD_REG_BIT (live_hard_regs, head->regno + nregs);
1148 *p = next;
1149 if (dump_file)
1150 fprintf (dump_file,
1151 "Closing chain %s (%d) at insn %d (%s%s)\n",
1152 reg_names[head->regno], head->id, INSN_UID (insn),
1153 scan_actions_name[(int) action],
1154 superset ? ", superset" : subset ? ", subset" : "");
1156 else if (action == terminate_dead || action == terminate_write)
1158 /* In this case, tracking liveness gets too hard. Fail the
1159 entire basic block. */
1160 if (dump_file)
1161 fprintf (dump_file,
1162 "Failing basic block due to unhandled overlap\n");
1163 fail_current_block = true;
1164 return;
1166 else
1168 head->cannot_rename = 1;
1169 if (dump_file)
1170 fprintf (dump_file,
1171 "Cannot rename chain %s (%d) at insn %d (%s)\n",
1172 reg_names[head->regno], head->id, INSN_UID (insn),
1173 scan_actions_name[(int) action]);
1174 p = &head->next_chain;
1179 /* Adapted from find_reloads_address_1. CL is INDEX_REG_CLASS or
1180 BASE_REG_CLASS depending on how the register is being considered. */
1182 static void
1183 scan_rtx_address (rtx_insn *insn, rtx *loc, enum reg_class cl,
1184 enum scan_actions action, machine_mode mode,
1185 addr_space_t as)
1187 rtx x = *loc;
1188 RTX_CODE code = GET_CODE (x);
1189 const char *fmt;
1190 int i, j;
1192 if (action == mark_write || action == mark_access)
1193 return;
1195 switch (code)
1197 case PLUS:
1199 rtx orig_op0 = XEXP (x, 0);
1200 rtx orig_op1 = XEXP (x, 1);
1201 RTX_CODE code0 = GET_CODE (orig_op0);
1202 RTX_CODE code1 = GET_CODE (orig_op1);
1203 rtx op0 = orig_op0;
1204 rtx op1 = orig_op1;
1205 rtx *locI = NULL;
1206 rtx *locB = NULL;
1207 enum rtx_code index_code = SCRATCH;
1209 if (GET_CODE (op0) == SUBREG)
1211 op0 = SUBREG_REG (op0);
1212 code0 = GET_CODE (op0);
1215 if (GET_CODE (op1) == SUBREG)
1217 op1 = SUBREG_REG (op1);
1218 code1 = GET_CODE (op1);
1221 if (code0 == MULT || code0 == SIGN_EXTEND || code0 == TRUNCATE
1222 || code0 == ZERO_EXTEND || code1 == MEM)
1224 locI = &XEXP (x, 0);
1225 locB = &XEXP (x, 1);
1226 index_code = GET_CODE (*locI);
1228 else if (code1 == MULT || code1 == SIGN_EXTEND || code1 == TRUNCATE
1229 || code1 == ZERO_EXTEND || code0 == MEM)
1231 locI = &XEXP (x, 1);
1232 locB = &XEXP (x, 0);
1233 index_code = GET_CODE (*locI);
1235 else if (code0 == CONST_INT || code0 == CONST
1236 || code0 == SYMBOL_REF || code0 == LABEL_REF)
1238 locB = &XEXP (x, 1);
1239 index_code = GET_CODE (XEXP (x, 0));
1241 else if (code1 == CONST_INT || code1 == CONST
1242 || code1 == SYMBOL_REF || code1 == LABEL_REF)
1244 locB = &XEXP (x, 0);
1245 index_code = GET_CODE (XEXP (x, 1));
1247 else if (code0 == REG && code1 == REG)
1249 int index_op;
1250 unsigned regno0 = REGNO (op0), regno1 = REGNO (op1);
1252 if (REGNO_OK_FOR_INDEX_P (regno1)
1253 && regno_ok_for_base_p (regno0, mode, as, PLUS, REG))
1254 index_op = 1;
1255 else if (REGNO_OK_FOR_INDEX_P (regno0)
1256 && regno_ok_for_base_p (regno1, mode, as, PLUS, REG))
1257 index_op = 0;
1258 else if (regno_ok_for_base_p (regno0, mode, as, PLUS, REG)
1259 || REGNO_OK_FOR_INDEX_P (regno1))
1260 index_op = 1;
1261 else if (regno_ok_for_base_p (regno1, mode, as, PLUS, REG))
1262 index_op = 0;
1263 else
1264 index_op = 1;
1266 locI = &XEXP (x, index_op);
1267 locB = &XEXP (x, !index_op);
1268 index_code = GET_CODE (*locI);
1270 else if (code0 == REG)
1272 locI = &XEXP (x, 0);
1273 locB = &XEXP (x, 1);
1274 index_code = GET_CODE (*locI);
1276 else if (code1 == REG)
1278 locI = &XEXP (x, 1);
1279 locB = &XEXP (x, 0);
1280 index_code = GET_CODE (*locI);
1283 if (locI)
1284 scan_rtx_address (insn, locI, INDEX_REG_CLASS, action, mode, as);
1285 if (locB)
1286 scan_rtx_address (insn, locB,
1287 base_reg_class (mode, as, PLUS, index_code),
1288 action, mode, as);
1290 return;
1293 case POST_INC:
1294 case POST_DEC:
1295 case POST_MODIFY:
1296 case PRE_INC:
1297 case PRE_DEC:
1298 case PRE_MODIFY:
1299 #ifndef AUTO_INC_DEC
1300 /* If the target doesn't claim to handle autoinc, this must be
1301 something special, like a stack push. Kill this chain. */
1302 action = mark_all_read;
1303 #endif
1304 break;
1306 case MEM:
1307 scan_rtx_address (insn, &XEXP (x, 0),
1308 base_reg_class (GET_MODE (x), MEM_ADDR_SPACE (x),
1309 MEM, SCRATCH),
1310 action, GET_MODE (x), MEM_ADDR_SPACE (x));
1311 return;
1313 case REG:
1314 scan_rtx_reg (insn, loc, cl, action, OP_IN);
1315 return;
1317 default:
1318 break;
1321 fmt = GET_RTX_FORMAT (code);
1322 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1324 if (fmt[i] == 'e')
1325 scan_rtx_address (insn, &XEXP (x, i), cl, action, mode, as);
1326 else if (fmt[i] == 'E')
1327 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
1328 scan_rtx_address (insn, &XVECEXP (x, i, j), cl, action, mode, as);
1332 static void
1333 scan_rtx (rtx_insn *insn, rtx *loc, enum reg_class cl, enum scan_actions action,
1334 enum op_type type)
1336 const char *fmt;
1337 rtx x = *loc;
1338 enum rtx_code code = GET_CODE (x);
1339 int i, j;
1341 code = GET_CODE (x);
1342 switch (code)
1344 case CONST:
1345 CASE_CONST_ANY:
1346 case SYMBOL_REF:
1347 case LABEL_REF:
1348 case CC0:
1349 case PC:
1350 return;
1352 case REG:
1353 scan_rtx_reg (insn, loc, cl, action, type);
1354 return;
1356 case MEM:
1357 scan_rtx_address (insn, &XEXP (x, 0),
1358 base_reg_class (GET_MODE (x), MEM_ADDR_SPACE (x),
1359 MEM, SCRATCH),
1360 action, GET_MODE (x), MEM_ADDR_SPACE (x));
1361 return;
1363 case SET:
1364 scan_rtx (insn, &SET_SRC (x), cl, action, OP_IN);
1365 scan_rtx (insn, &SET_DEST (x), cl, action,
1366 (GET_CODE (PATTERN (insn)) == COND_EXEC
1367 && verify_reg_tracked (SET_DEST (x))) ? OP_INOUT : OP_OUT);
1368 return;
1370 case STRICT_LOW_PART:
1371 scan_rtx (insn, &XEXP (x, 0), cl, action,
1372 verify_reg_tracked (XEXP (x, 0)) ? OP_INOUT : OP_OUT);
1373 return;
1375 case ZERO_EXTRACT:
1376 case SIGN_EXTRACT:
1377 scan_rtx (insn, &XEXP (x, 0), cl, action,
1378 (type == OP_IN ? OP_IN :
1379 verify_reg_tracked (XEXP (x, 0)) ? OP_INOUT : OP_OUT));
1380 scan_rtx (insn, &XEXP (x, 1), cl, action, OP_IN);
1381 scan_rtx (insn, &XEXP (x, 2), cl, action, OP_IN);
1382 return;
1384 case POST_INC:
1385 case PRE_INC:
1386 case POST_DEC:
1387 case PRE_DEC:
1388 case POST_MODIFY:
1389 case PRE_MODIFY:
1390 /* Should only happen inside MEM. */
1391 gcc_unreachable ();
1393 case CLOBBER:
1394 scan_rtx (insn, &SET_DEST (x), cl, action,
1395 (GET_CODE (PATTERN (insn)) == COND_EXEC
1396 && verify_reg_tracked (SET_DEST (x))) ? OP_INOUT : OP_OUT);
1397 return;
1399 case EXPR_LIST:
1400 scan_rtx (insn, &XEXP (x, 0), cl, action, type);
1401 if (XEXP (x, 1))
1402 scan_rtx (insn, &XEXP (x, 1), cl, action, type);
1403 return;
1405 default:
1406 break;
1409 fmt = GET_RTX_FORMAT (code);
1410 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1412 if (fmt[i] == 'e')
1413 scan_rtx (insn, &XEXP (x, i), cl, action, type);
1414 else if (fmt[i] == 'E')
1415 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
1416 scan_rtx (insn, &XVECEXP (x, i, j), cl, action, type);
1420 /* Hide operands of the current insn (of which there are N_OPS) by
1421 substituting cc0 for them.
1422 Previous values are stored in the OLD_OPERANDS and OLD_DUPS.
1423 For every bit set in DO_NOT_HIDE, we leave the operand alone.
1424 If INOUT_AND_EC_ONLY is set, we only do this for OP_INOUT type operands
1425 and earlyclobbers. */
1427 static void
1428 hide_operands (int n_ops, rtx *old_operands, rtx *old_dups,
1429 unsigned HOST_WIDE_INT do_not_hide, bool inout_and_ec_only)
1431 int i;
1432 const operand_alternative *op_alt = which_op_alt ();
1433 for (i = 0; i < n_ops; i++)
1435 old_operands[i] = recog_data.operand[i];
1436 /* Don't squash match_operator or match_parallel here, since
1437 we don't know that all of the contained registers are
1438 reachable by proper operands. */
1439 if (recog_data.constraints[i][0] == '\0')
1440 continue;
1441 if (do_not_hide & (1 << i))
1442 continue;
1443 if (!inout_and_ec_only || recog_data.operand_type[i] == OP_INOUT
1444 || op_alt[i].earlyclobber)
1445 *recog_data.operand_loc[i] = cc0_rtx;
1447 for (i = 0; i < recog_data.n_dups; i++)
1449 int opn = recog_data.dup_num[i];
1450 old_dups[i] = *recog_data.dup_loc[i];
1451 if (do_not_hide & (1 << opn))
1452 continue;
1453 if (!inout_and_ec_only || recog_data.operand_type[opn] == OP_INOUT
1454 || op_alt[opn].earlyclobber)
1455 *recog_data.dup_loc[i] = cc0_rtx;
1459 /* Undo the substitution performed by hide_operands. INSN is the insn we
1460 are processing; the arguments are the same as in hide_operands. */
1462 static void
1463 restore_operands (rtx_insn *insn, int n_ops, rtx *old_operands, rtx *old_dups)
1465 int i;
1466 for (i = 0; i < recog_data.n_dups; i++)
1467 *recog_data.dup_loc[i] = old_dups[i];
1468 for (i = 0; i < n_ops; i++)
1469 *recog_data.operand_loc[i] = old_operands[i];
1470 if (recog_data.n_dups)
1471 df_insn_rescan (insn);
1474 /* For each output operand of INSN, call scan_rtx to create a new
1475 open chain. Do this only for normal or earlyclobber outputs,
1476 depending on EARLYCLOBBER. If INSN_INFO is nonnull, use it to
1477 record information about the operands in the insn. */
1479 static void
1480 record_out_operands (rtx_insn *insn, bool earlyclobber, insn_rr_info *insn_info)
1482 int n_ops = recog_data.n_operands;
1483 const operand_alternative *op_alt = which_op_alt ();
1485 int i;
1487 for (i = 0; i < n_ops + recog_data.n_dups; i++)
1489 int opn = i < n_ops ? i : recog_data.dup_num[i - n_ops];
1490 rtx *loc = (i < n_ops
1491 ? recog_data.operand_loc[opn]
1492 : recog_data.dup_loc[i - n_ops]);
1493 rtx op = *loc;
1494 enum reg_class cl = alternative_class (op_alt, opn);
1496 struct du_head *prev_open;
1498 if (recog_data.operand_type[opn] != OP_OUT
1499 || op_alt[opn].earlyclobber != earlyclobber)
1500 continue;
1502 if (insn_info)
1503 cur_operand = insn_info->op_info + i;
1505 prev_open = open_chains;
1506 scan_rtx (insn, loc, cl, mark_write, OP_OUT);
1508 /* ??? Many targets have output constraints on the SET_DEST
1509 of a call insn, which is stupid, since these are certainly
1510 ABI defined hard registers. For these, and for asm operands
1511 that originally referenced hard registers, we must record that
1512 the chain cannot be renamed. */
1513 if (CALL_P (insn)
1514 || (asm_noperands (PATTERN (insn)) > 0
1515 && REG_P (op)
1516 && REGNO (op) == ORIGINAL_REGNO (op)))
1518 if (prev_open != open_chains)
1519 open_chains->cannot_rename = 1;
1522 cur_operand = NULL;
1525 /* Build def/use chain. */
1527 static bool
1528 build_def_use (basic_block bb)
1530 rtx_insn *insn;
1531 unsigned HOST_WIDE_INT untracked_operands;
1533 fail_current_block = false;
1535 for (insn = BB_HEAD (bb); ; insn = NEXT_INSN (insn))
1537 if (NONDEBUG_INSN_P (insn))
1539 int n_ops;
1540 rtx note;
1541 rtx old_operands[MAX_RECOG_OPERANDS];
1542 rtx old_dups[MAX_DUP_OPERANDS];
1543 int i;
1544 int predicated;
1545 enum rtx_code set_code = SET;
1546 enum rtx_code clobber_code = CLOBBER;
1547 insn_rr_info *insn_info = NULL;
1549 /* Process the insn, determining its effect on the def-use
1550 chains and live hard registers. We perform the following
1551 steps with the register references in the insn, simulating
1552 its effect:
1553 (1) Deal with earlyclobber operands and CLOBBERs of non-operands
1554 by creating chains and marking hard regs live.
1555 (2) Any read outside an operand causes any chain it overlaps
1556 with to be marked unrenamable.
1557 (3) Any read inside an operand is added if there's already
1558 an open chain for it.
1559 (4) For any REG_DEAD note we find, close open chains that
1560 overlap it.
1561 (5) For any non-earlyclobber write we find, close open chains
1562 that overlap it.
1563 (6) For any non-earlyclobber write we find in an operand, make
1564 a new chain or mark the hard register as live.
1565 (7) For any REG_UNUSED, close any chains we just opened.
1567 We cannot deal with situations where we track a reg in one mode
1568 and see a reference in another mode; these will cause the chain
1569 to be marked unrenamable or even cause us to abort the entire
1570 basic block. */
1572 extract_constrain_insn (insn);
1573 preprocess_constraints (insn);
1574 const operand_alternative *op_alt = which_op_alt ();
1575 n_ops = recog_data.n_operands;
1576 untracked_operands = 0;
1578 if (insn_rr.exists ())
1580 insn_info = &insn_rr[INSN_UID (insn)];
1581 insn_info->op_info = XOBNEWVEC (&rename_obstack, operand_rr_info,
1582 recog_data.n_operands);
1583 memset (insn_info->op_info, 0,
1584 sizeof (operand_rr_info) * recog_data.n_operands);
1587 /* Simplify the code below by promoting OP_OUT to OP_INOUT in
1588 predicated instructions, but only for register operands
1589 that are already tracked, so that we can create a chain
1590 when the first SET makes a register live. */
1592 predicated = GET_CODE (PATTERN (insn)) == COND_EXEC;
1593 for (i = 0; i < n_ops; ++i)
1595 rtx op = recog_data.operand[i];
1596 int matches = op_alt[i].matches;
1597 if (matches >= 0 || op_alt[i].matched >= 0
1598 || (predicated && recog_data.operand_type[i] == OP_OUT))
1600 recog_data.operand_type[i] = OP_INOUT;
1601 /* A special case to deal with instruction patterns that
1602 have matching operands with different modes. If we're
1603 not already tracking such a reg, we won't start here,
1604 and we must instead make sure to make the operand visible
1605 to the machinery that tracks hard registers. */
1606 if (matches >= 0
1607 && (GET_MODE_SIZE (recog_data.operand_mode[i])
1608 != GET_MODE_SIZE (recog_data.operand_mode[matches]))
1609 && !verify_reg_in_set (op, &live_in_chains))
1611 untracked_operands |= 1 << i;
1612 untracked_operands |= 1 << matches;
1615 /* If there's an in-out operand with a register that is not
1616 being tracked at all yet, open a chain. */
1617 if (recog_data.operand_type[i] == OP_INOUT
1618 && !(untracked_operands & (1 << i))
1619 && REG_P (op)
1620 && !verify_reg_tracked (op))
1621 create_new_chain (REGNO (op), REG_NREGS (op), NULL, NULL,
1622 NO_REGS);
1625 if (fail_current_block)
1626 break;
1628 /* Step 1a: Mark hard registers that are clobbered in this insn,
1629 outside an operand, as live. */
1630 hide_operands (n_ops, old_operands, old_dups, untracked_operands,
1631 false);
1632 note_stores (PATTERN (insn), note_sets_clobbers, &clobber_code);
1633 restore_operands (insn, n_ops, old_operands, old_dups);
1635 /* Step 1b: Begin new chains for earlyclobbered writes inside
1636 operands. */
1637 record_out_operands (insn, true, insn_info);
1639 /* Step 2: Mark chains for which we have reads outside operands
1640 as unrenamable.
1641 We do this by munging all operands into CC0, and closing
1642 everything remaining. */
1644 hide_operands (n_ops, old_operands, old_dups, untracked_operands,
1645 false);
1646 scan_rtx (insn, &PATTERN (insn), NO_REGS, mark_all_read, OP_IN);
1647 restore_operands (insn, n_ops, old_operands, old_dups);
1649 /* Step 2B: Can't rename function call argument registers. */
1650 if (CALL_P (insn) && CALL_INSN_FUNCTION_USAGE (insn))
1651 scan_rtx (insn, &CALL_INSN_FUNCTION_USAGE (insn),
1652 NO_REGS, mark_all_read, OP_IN);
1654 /* Step 2C: Can't rename asm operands that were originally
1655 hard registers. */
1656 if (asm_noperands (PATTERN (insn)) > 0)
1657 for (i = 0; i < n_ops; i++)
1659 rtx *loc = recog_data.operand_loc[i];
1660 rtx op = *loc;
1662 if (REG_P (op)
1663 && REGNO (op) == ORIGINAL_REGNO (op)
1664 && (recog_data.operand_type[i] == OP_IN
1665 || recog_data.operand_type[i] == OP_INOUT))
1666 scan_rtx (insn, loc, NO_REGS, mark_all_read, OP_IN);
1669 /* Step 3: Append to chains for reads inside operands. */
1670 for (i = 0; i < n_ops + recog_data.n_dups; i++)
1672 int opn = i < n_ops ? i : recog_data.dup_num[i - n_ops];
1673 rtx *loc = (i < n_ops
1674 ? recog_data.operand_loc[opn]
1675 : recog_data.dup_loc[i - n_ops]);
1676 enum reg_class cl = alternative_class (op_alt, opn);
1677 enum op_type type = recog_data.operand_type[opn];
1679 /* Don't scan match_operand here, since we've no reg class
1680 information to pass down. Any operands that we could
1681 substitute in will be represented elsewhere. */
1682 if (recog_data.constraints[opn][0] == '\0'
1683 || untracked_operands & (1 << opn))
1684 continue;
1686 if (insn_info)
1687 cur_operand = i == opn ? insn_info->op_info + i : NULL;
1688 if (op_alt[opn].is_address)
1689 scan_rtx_address (insn, loc, cl, mark_read,
1690 VOIDmode, ADDR_SPACE_GENERIC);
1691 else
1692 scan_rtx (insn, loc, cl, mark_read, type);
1694 cur_operand = NULL;
1696 /* Step 3B: Record updates for regs in REG_INC notes, and
1697 source regs in REG_FRAME_RELATED_EXPR notes. */
1698 for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
1699 if (REG_NOTE_KIND (note) == REG_INC
1700 || REG_NOTE_KIND (note) == REG_FRAME_RELATED_EXPR)
1701 scan_rtx (insn, &XEXP (note, 0), ALL_REGS, mark_read,
1702 OP_INOUT);
1704 /* Step 4: Close chains for registers that die here, unless
1705 the register is mentioned in a REG_UNUSED note. In that
1706 case we keep the chain open until step #7 below to ensure
1707 it conflicts with other output operands of this insn.
1708 See PR 52573. Arguably the insn should not have both
1709 notes; it has proven difficult to fix that without
1710 other undesirable side effects. */
1711 for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
1712 if (REG_NOTE_KIND (note) == REG_DEAD
1713 && !find_regno_note (insn, REG_UNUSED, REGNO (XEXP (note, 0))))
1715 remove_from_hard_reg_set (&live_hard_regs,
1716 GET_MODE (XEXP (note, 0)),
1717 REGNO (XEXP (note, 0)));
1718 scan_rtx (insn, &XEXP (note, 0), NO_REGS, terminate_dead,
1719 OP_IN);
1722 /* Step 4B: If this is a call, any chain live at this point
1723 requires a caller-saved reg. */
1724 if (CALL_P (insn))
1726 struct du_head *p;
1727 for (p = open_chains; p; p = p->next_chain)
1728 p->need_caller_save_reg = 1;
1731 /* Step 5: Close open chains that overlap writes. Similar to
1732 step 2, we hide in-out operands, since we do not want to
1733 close these chains. We also hide earlyclobber operands,
1734 since we've opened chains for them in step 1, and earlier
1735 chains they would overlap with must have been closed at
1736 the previous insn at the latest, as such operands cannot
1737 possibly overlap with any input operands. */
1739 hide_operands (n_ops, old_operands, old_dups, untracked_operands,
1740 true);
1741 scan_rtx (insn, &PATTERN (insn), NO_REGS, terminate_write, OP_IN);
1742 restore_operands (insn, n_ops, old_operands, old_dups);
1744 /* Step 6a: Mark hard registers that are set in this insn,
1745 outside an operand, as live. */
1746 hide_operands (n_ops, old_operands, old_dups, untracked_operands,
1747 false);
1748 note_stores (PATTERN (insn), note_sets_clobbers, &set_code);
1749 restore_operands (insn, n_ops, old_operands, old_dups);
1751 /* Step 6b: Begin new chains for writes inside operands. */
1752 record_out_operands (insn, false, insn_info);
1754 /* Step 6c: Record destination regs in REG_FRAME_RELATED_EXPR
1755 notes for update. */
1756 for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
1757 if (REG_NOTE_KIND (note) == REG_FRAME_RELATED_EXPR)
1758 scan_rtx (insn, &XEXP (note, 0), ALL_REGS, mark_access,
1759 OP_INOUT);
1761 /* Step 7: Close chains for registers that were never
1762 really used here. */
1763 for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
1764 if (REG_NOTE_KIND (note) == REG_UNUSED)
1766 remove_from_hard_reg_set (&live_hard_regs,
1767 GET_MODE (XEXP (note, 0)),
1768 REGNO (XEXP (note, 0)));
1769 scan_rtx (insn, &XEXP (note, 0), NO_REGS, terminate_dead,
1770 OP_IN);
1773 else if (DEBUG_INSN_P (insn)
1774 && !VAR_LOC_UNKNOWN_P (INSN_VAR_LOCATION_LOC (insn)))
1776 scan_rtx (insn, &INSN_VAR_LOCATION_LOC (insn),
1777 ALL_REGS, mark_read, OP_IN);
1779 if (insn == BB_END (bb))
1780 break;
1783 if (fail_current_block)
1784 return false;
1786 return true;
1789 /* Initialize the register renamer. If INSN_INFO is true, ensure that
1790 insn_rr is nonnull. */
1791 void
1792 regrename_init (bool insn_info)
1794 gcc_obstack_init (&rename_obstack);
1795 insn_rr.create (0);
1796 if (insn_info)
1797 insn_rr.safe_grow_cleared (get_max_uid ());
1800 /* Free all global data used by the register renamer. */
1801 void
1802 regrename_finish (void)
1804 insn_rr.release ();
1805 free_chain_data ();
1806 obstack_free (&rename_obstack, NULL);
1809 /* Perform register renaming on the current function. */
1811 static unsigned int
1812 regrename_optimize (void)
1814 df_set_flags (DF_LR_RUN_DCE);
1815 df_note_add_problem ();
1816 df_analyze ();
1817 df_set_flags (DF_DEFER_INSN_RESCAN);
1819 regrename_init (false);
1821 regrename_analyze (NULL);
1823 rename_chains ();
1825 regrename_finish ();
1827 return 0;
1830 namespace {
1832 const pass_data pass_data_regrename =
1834 RTL_PASS, /* type */
1835 "rnreg", /* name */
1836 OPTGROUP_NONE, /* optinfo_flags */
1837 TV_RENAME_REGISTERS, /* tv_id */
1838 0, /* properties_required */
1839 0, /* properties_provided */
1840 0, /* properties_destroyed */
1841 0, /* todo_flags_start */
1842 TODO_df_finish, /* todo_flags_finish */
1845 class pass_regrename : public rtl_opt_pass
1847 public:
1848 pass_regrename (gcc::context *ctxt)
1849 : rtl_opt_pass (pass_data_regrename, ctxt)
1852 /* opt_pass methods: */
1853 virtual bool gate (function *)
1855 return (optimize > 0 && (flag_rename_registers));
1858 virtual unsigned int execute (function *) { return regrename_optimize (); }
1860 }; // class pass_regrename
1862 } // anon namespace
1864 rtl_opt_pass *
1865 make_pass_regrename (gcc::context *ctxt)
1867 return new pass_regrename (ctxt);