2012-12-01 Alessandro Fanfarillo <alessandro.fanfarillo@gmail.com>
[official-gcc.git] / gcc / regrename.c
blobb15deee9b7a4f9d490487191224156a33d43314d
1 /* Register renaming for the GNU compiler.
2 Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
3 2010 Free Software Foundation, Inc.
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it
8 under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3, or (at your option)
10 any later version.
12 GCC is distributed in the hope that it will be useful, but WITHOUT
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
15 License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
21 #include "config.h"
22 #include "system.h"
23 #include "coretypes.h"
24 #include "tm.h"
25 #include "rtl-error.h"
26 #include "tm_p.h"
27 #include "insn-config.h"
28 #include "regs.h"
29 #include "addresses.h"
30 #include "hard-reg-set.h"
31 #include "basic-block.h"
32 #include "reload.h"
33 #include "output.h"
34 #include "function.h"
35 #include "recog.h"
36 #include "flags.h"
37 #include "obstack.h"
38 #include "tree-pass.h"
39 #include "df.h"
40 #include "target.h"
41 #include "emit-rtl.h"
42 #include "regrename.h"
44 /* This file implements the RTL register renaming pass of the compiler. It is
45 a semi-local pass whose goal is to maximize the usage of the register file
46 of the processor by substituting registers for others in the solution given
47 by the register allocator. The algorithm is as follows:
49 1. Local def/use chains are built: within each basic block, chains are
50 opened and closed; if a chain isn't closed at the end of the block,
51 it is dropped. We pre-open chains if we have already examined a
52 predecessor block and found chains live at the end which match
53 live registers at the start of the new block.
55 2. We try to combine the local chains across basic block boundaries by
56 comparing chains that were open at the start or end of a block to
57 those in successor/predecessor blocks.
59 3. For each chain, the set of possible renaming registers is computed.
60 This takes into account the renaming of previously processed chains.
61 Optionally, a preferred class is computed for the renaming register.
63 4. The best renaming register is computed for the chain in the above set,
64 using a round-robin allocation. If a preferred class exists, then the
65 round-robin allocation is done within the class first, if possible.
66 The round-robin allocation of renaming registers itself is global.
68 5. If a renaming register has been found, it is substituted in the chain.
70 Targets can parameterize the pass by specifying a preferred class for the
71 renaming register for a given (super)class of registers to be renamed. */
73 #if HOST_BITS_PER_WIDE_INT <= MAX_RECOG_OPERANDS
74 #error "Use a different bitmap implementation for untracked_operands."
75 #endif
77 enum scan_actions
79 terminate_write,
80 terminate_dead,
81 mark_all_read,
82 mark_read,
83 mark_write,
84 /* mark_access is for marking the destination regs in
85 REG_FRAME_RELATED_EXPR notes (as if they were read) so that the
86 note is updated properly. */
87 mark_access
90 static const char * const scan_actions_name[] =
92 "terminate_write",
93 "terminate_dead",
94 "mark_all_read",
95 "mark_read",
96 "mark_write",
97 "mark_access"
100 /* TICK and THIS_TICK are used to record the last time we saw each
101 register. */
102 static int tick[FIRST_PSEUDO_REGISTER];
103 static int this_tick = 0;
105 static struct obstack rename_obstack;
107 /* If nonnull, the code calling into the register renamer requested
108 information about insn operands, and we store it here. */
109 vec<insn_rr_info> insn_rr;
111 static void scan_rtx (rtx, rtx *, enum reg_class, enum scan_actions,
112 enum op_type);
113 static bool build_def_use (basic_block);
115 /* The id to be given to the next opened chain. */
116 static unsigned current_id;
118 /* A mapping of unique id numbers to chains. */
119 static vec<du_head_p> id_to_chain;
121 /* List of currently open chains. */
122 static struct du_head *open_chains;
124 /* Bitmap of open chains. The bits set always match the list found in
125 open_chains. */
126 static bitmap_head open_chains_set;
128 /* Record the registers being tracked in open_chains. */
129 static HARD_REG_SET live_in_chains;
131 /* Record the registers that are live but not tracked. The intersection
132 between this and live_in_chains is empty. */
133 static HARD_REG_SET live_hard_regs;
135 /* Set while scanning RTL if INSN_RR is nonnull, i.e. if the current analysis
136 is for a caller that requires operand data. Used in
137 record_operand_use. */
138 static operand_rr_info *cur_operand;
140 /* Return the chain corresponding to id number ID. Take into account that
141 chains may have been merged. */
142 du_head_p
143 regrename_chain_from_id (unsigned int id)
145 du_head_p first_chain = id_to_chain[id];
146 du_head_p chain = first_chain;
147 while (chain->id != id)
149 id = chain->id;
150 chain = id_to_chain[id];
152 first_chain->id = id;
153 return chain;
156 /* Dump all def/use chains, starting at id FROM. */
158 static void
159 dump_def_use_chain (int from)
161 du_head_p head;
162 int i;
163 FOR_EACH_VEC_ELT_FROM (id_to_chain, i, head, from)
165 struct du_chain *this_du = head->first;
167 fprintf (dump_file, "Register %s (%d):",
168 reg_names[head->regno], head->nregs);
169 while (this_du)
171 fprintf (dump_file, " %d [%s]", INSN_UID (this_du->insn),
172 reg_class_names[this_du->cl]);
173 this_du = this_du->next_use;
175 fprintf (dump_file, "\n");
176 head = head->next_chain;
180 static void
181 free_chain_data (void)
183 int i;
184 du_head_p ptr;
185 for (i = 0; id_to_chain.iterate (i, &ptr); i++)
186 bitmap_clear (&ptr->conflicts);
188 id_to_chain.release ();
191 /* Walk all chains starting with CHAINS and record that they conflict with
192 another chain whose id is ID. */
194 static void
195 mark_conflict (struct du_head *chains, unsigned id)
197 while (chains)
199 bitmap_set_bit (&chains->conflicts, id);
200 chains = chains->next_chain;
204 /* Examine cur_operand, and if it is nonnull, record information about the
205 use THIS_DU which is part of the chain HEAD. */
207 static void
208 record_operand_use (struct du_head *head, struct du_chain *this_du)
210 if (cur_operand == NULL)
211 return;
212 gcc_assert (cur_operand->n_chains < MAX_REGS_PER_ADDRESS);
213 cur_operand->heads[cur_operand->n_chains] = head;
214 cur_operand->chains[cur_operand->n_chains++] = this_du;
217 /* Create a new chain for THIS_NREGS registers starting at THIS_REGNO,
218 and record its occurrence in *LOC, which is being written to in INSN.
219 This access requires a register of class CL. */
221 static du_head_p
222 create_new_chain (unsigned this_regno, unsigned this_nregs, rtx *loc,
223 rtx insn, enum reg_class cl)
225 struct du_head *head = XOBNEW (&rename_obstack, struct du_head);
226 struct du_chain *this_du;
227 int nregs;
229 head->next_chain = open_chains;
230 head->regno = this_regno;
231 head->nregs = this_nregs;
232 head->need_caller_save_reg = 0;
233 head->cannot_rename = 0;
235 id_to_chain.safe_push (head);
236 head->id = current_id++;
238 bitmap_initialize (&head->conflicts, &bitmap_default_obstack);
239 bitmap_copy (&head->conflicts, &open_chains_set);
240 mark_conflict (open_chains, head->id);
242 /* Since we're tracking this as a chain now, remove it from the
243 list of conflicting live hard registers and track it in
244 live_in_chains instead. */
245 nregs = head->nregs;
246 while (nregs-- > 0)
248 SET_HARD_REG_BIT (live_in_chains, head->regno + nregs);
249 CLEAR_HARD_REG_BIT (live_hard_regs, head->regno + nregs);
252 COPY_HARD_REG_SET (head->hard_conflicts, live_hard_regs);
253 bitmap_set_bit (&open_chains_set, head->id);
255 open_chains = head;
257 if (dump_file)
259 fprintf (dump_file, "Creating chain %s (%d)",
260 reg_names[head->regno], head->id);
261 if (insn != NULL_RTX)
262 fprintf (dump_file, " at insn %d", INSN_UID (insn));
263 fprintf (dump_file, "\n");
266 if (insn == NULL_RTX)
268 head->first = head->last = NULL;
269 return head;
272 this_du = XOBNEW (&rename_obstack, struct du_chain);
273 head->first = head->last = this_du;
275 this_du->next_use = 0;
276 this_du->loc = loc;
277 this_du->insn = insn;
278 this_du->cl = cl;
279 record_operand_use (head, this_du);
280 return head;
283 /* For a def-use chain HEAD, find which registers overlap its lifetime and
284 set the corresponding bits in *PSET. */
286 static void
287 merge_overlapping_regs (HARD_REG_SET *pset, struct du_head *head)
289 bitmap_iterator bi;
290 unsigned i;
291 IOR_HARD_REG_SET (*pset, head->hard_conflicts);
292 EXECUTE_IF_SET_IN_BITMAP (&head->conflicts, 0, i, bi)
294 du_head_p other = regrename_chain_from_id (i);
295 unsigned j = other->nregs;
296 gcc_assert (other != head);
297 while (j-- > 0)
298 SET_HARD_REG_BIT (*pset, other->regno + j);
302 /* Check if NEW_REG can be the candidate register to rename for
303 REG in THIS_HEAD chain. THIS_UNAVAILABLE is a set of unavailable hard
304 registers. */
306 static bool
307 check_new_reg_p (int reg ATTRIBUTE_UNUSED, int new_reg,
308 struct du_head *this_head, HARD_REG_SET this_unavailable)
310 enum machine_mode mode = GET_MODE (*this_head->first->loc);
311 int nregs = hard_regno_nregs[new_reg][mode];
312 int i;
313 struct du_chain *tmp;
315 for (i = nregs - 1; i >= 0; --i)
316 if (TEST_HARD_REG_BIT (this_unavailable, new_reg + i)
317 || fixed_regs[new_reg + i]
318 || global_regs[new_reg + i]
319 /* Can't use regs which aren't saved by the prologue. */
320 || (! df_regs_ever_live_p (new_reg + i)
321 && ! call_used_regs[new_reg + i])
322 #ifdef LEAF_REGISTERS
323 /* We can't use a non-leaf register if we're in a
324 leaf function. */
325 || (crtl->is_leaf
326 && !LEAF_REGISTERS[new_reg + i])
327 #endif
328 #ifdef HARD_REGNO_RENAME_OK
329 || ! HARD_REGNO_RENAME_OK (reg + i, new_reg + i)
330 #endif
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. */
355 find_best_rename_reg (du_head_p this_head, enum reg_class super_class,
356 HARD_REG_SET *unavailable, int old_reg)
358 bool has_preferred_class;
359 enum reg_class preferred_class;
360 int pass;
361 int best_new_reg = old_reg;
363 /* Further narrow the set of registers we can use for renaming.
364 If the chain needs a call-saved register, mark the call-used
365 registers as unavailable. */
366 if (this_head->need_caller_save_reg)
367 IOR_HARD_REG_SET (*unavailable, call_used_reg_set);
369 /* Mark registers that overlap this chain's lifetime as unavailable. */
370 merge_overlapping_regs (unavailable, this_head);
372 /* Compute preferred rename class of super union of all the classes
373 in the chain. */
374 preferred_class
375 = (enum reg_class) targetm.preferred_rename_class (super_class);
377 /* If PREFERRED_CLASS is not NO_REGS, we iterate in the first pass
378 over registers that belong to PREFERRED_CLASS and try to find the
379 best register within the class. If that failed, we iterate in
380 the second pass over registers that don't belong to the class.
381 If PREFERRED_CLASS is NO_REGS, we iterate over all registers in
382 ascending order without any preference. */
383 has_preferred_class = (preferred_class != NO_REGS);
384 for (pass = (has_preferred_class ? 0 : 1); pass < 2; pass++)
386 int new_reg;
387 for (new_reg = 0; new_reg < FIRST_PSEUDO_REGISTER; new_reg++)
389 if (has_preferred_class
390 && (pass == 0)
391 != TEST_HARD_REG_BIT (reg_class_contents[preferred_class],
392 new_reg))
393 continue;
395 /* In the first pass, we force the renaming of registers that
396 don't belong to PREFERRED_CLASS to registers that do, even
397 though the latters were used not very long ago. */
398 if (check_new_reg_p (old_reg, new_reg, this_head,
399 *unavailable)
400 && ((pass == 0
401 && !TEST_HARD_REG_BIT (reg_class_contents[preferred_class],
402 best_new_reg))
403 || tick[best_new_reg] > tick[new_reg]))
404 best_new_reg = new_reg;
406 if (pass == 0 && best_new_reg != old_reg)
407 break;
409 return best_new_reg;
412 /* Perform register renaming on the current function. */
413 static void
414 rename_chains (void)
416 HARD_REG_SET unavailable;
417 du_head_p this_head;
418 int i;
420 memset (tick, 0, sizeof tick);
422 CLEAR_HARD_REG_SET (unavailable);
423 /* Don't clobber traceback for noreturn functions. */
424 if (frame_pointer_needed)
426 add_to_hard_reg_set (&unavailable, Pmode, FRAME_POINTER_REGNUM);
427 #if !HARD_FRAME_POINTER_IS_FRAME_POINTER
428 add_to_hard_reg_set (&unavailable, Pmode, HARD_FRAME_POINTER_REGNUM);
429 #endif
432 FOR_EACH_VEC_ELT (id_to_chain, i, this_head)
434 int best_new_reg;
435 int n_uses;
436 struct du_chain *tmp;
437 HARD_REG_SET this_unavailable;
438 int reg = this_head->regno;
439 enum reg_class super_class = NO_REGS;
441 if (this_head->cannot_rename)
442 continue;
444 if (fixed_regs[reg] || global_regs[reg]
445 #if !HARD_FRAME_POINTER_IS_FRAME_POINTER
446 || (frame_pointer_needed && reg == HARD_FRAME_POINTER_REGNUM)
447 #else
448 || (frame_pointer_needed && reg == FRAME_POINTER_REGNUM)
449 #endif
451 continue;
453 COPY_HARD_REG_SET (this_unavailable, unavailable);
455 /* Iterate over elements in the chain in order to:
456 1. Count number of uses, and narrow the set of registers we can
457 use for renaming.
458 2. Compute the superunion of register classes in this chain. */
459 n_uses = 0;
460 super_class = NO_REGS;
461 for (tmp = this_head->first; tmp; tmp = tmp->next_use)
463 if (DEBUG_INSN_P (tmp->insn))
464 continue;
465 n_uses++;
466 IOR_COMPL_HARD_REG_SET (this_unavailable,
467 reg_class_contents[tmp->cl]);
468 super_class
469 = reg_class_superunion[(int) super_class][(int) tmp->cl];
472 if (n_uses < 2)
473 continue;
475 best_new_reg = find_best_rename_reg (this_head, super_class,
476 &this_unavailable, reg);
478 if (dump_file)
480 fprintf (dump_file, "Register %s in insn %d",
481 reg_names[reg], INSN_UID (this_head->first->insn));
482 if (this_head->need_caller_save_reg)
483 fprintf (dump_file, " crosses a call");
486 if (best_new_reg == reg)
488 tick[reg] = ++this_tick;
489 if (dump_file)
490 fprintf (dump_file, "; no available better choice\n");
491 continue;
494 if (dump_file)
495 fprintf (dump_file, ", renamed as %s\n", reg_names[best_new_reg]);
497 regrename_do_replace (this_head, best_new_reg);
498 tick[best_new_reg] = ++this_tick;
499 df_set_regs_ever_live (best_new_reg, true);
503 /* A structure to record information for each hard register at the start of
504 a basic block. */
505 struct incoming_reg_info {
506 /* Holds the number of registers used in the chain that gave us information
507 about this register. Zero means no information known yet, while a
508 negative value is used for something that is part of, but not the first
509 register in a multi-register value. */
510 int nregs;
511 /* Set to true if we have accesses that conflict in the number of registers
512 used. */
513 bool unusable;
516 /* A structure recording information about each basic block. It is saved
517 and restored around basic block boundaries.
518 A pointer to such a structure is stored in each basic block's aux field
519 during regrename_analyze, except for blocks we know can't be optimized
520 (such as entry and exit blocks). */
521 struct bb_rename_info
523 /* The basic block corresponding to this structure. */
524 basic_block bb;
525 /* Copies of the global information. */
526 bitmap_head open_chains_set;
527 bitmap_head incoming_open_chains_set;
528 struct incoming_reg_info incoming[FIRST_PSEUDO_REGISTER];
531 /* Initialize a rename_info structure P for basic block BB, which starts a new
532 scan. */
533 static void
534 init_rename_info (struct bb_rename_info *p, basic_block bb)
536 int i;
537 df_ref *def_rec;
538 HARD_REG_SET start_chains_set;
540 p->bb = bb;
541 bitmap_initialize (&p->open_chains_set, &bitmap_default_obstack);
542 bitmap_initialize (&p->incoming_open_chains_set, &bitmap_default_obstack);
544 open_chains = NULL;
545 bitmap_clear (&open_chains_set);
547 CLEAR_HARD_REG_SET (live_in_chains);
548 REG_SET_TO_HARD_REG_SET (live_hard_regs, df_get_live_in (bb));
549 for (def_rec = df_get_artificial_defs (bb->index); *def_rec; def_rec++)
551 df_ref def = *def_rec;
552 if (DF_REF_FLAGS (def) & DF_REF_AT_TOP)
553 SET_HARD_REG_BIT (live_hard_regs, DF_REF_REGNO (def));
556 /* Open chains based on information from (at least one) predecessor
557 block. This gives us a chance later on to combine chains across
558 basic block boundaries. Inconsistencies (in access sizes) will
559 be caught normally and dealt with conservatively by disabling the
560 chain for renaming, and there is no risk of losing optimization
561 opportunities by opening chains either: if we did not open the
562 chains, we'd have to track the live register as a hard reg, and
563 we'd be unable to rename it in any case. */
564 CLEAR_HARD_REG_SET (start_chains_set);
565 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
567 struct incoming_reg_info *iri = p->incoming + i;
568 if (iri->nregs > 0 && !iri->unusable
569 && range_in_hard_reg_set_p (live_hard_regs, i, iri->nregs))
571 SET_HARD_REG_BIT (start_chains_set, i);
572 remove_range_from_hard_reg_set (&live_hard_regs, i, iri->nregs);
575 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
577 struct incoming_reg_info *iri = p->incoming + i;
578 if (TEST_HARD_REG_BIT (start_chains_set, i))
580 du_head_p chain;
581 if (dump_file)
582 fprintf (dump_file, "opening incoming chain\n");
583 chain = create_new_chain (i, iri->nregs, NULL, NULL_RTX, NO_REGS);
584 bitmap_set_bit (&p->incoming_open_chains_set, chain->id);
589 /* Record in RI that the block corresponding to it has an incoming
590 live value, described by CHAIN. */
591 static void
592 set_incoming_from_chain (struct bb_rename_info *ri, du_head_p chain)
594 int i;
595 int incoming_nregs = ri->incoming[chain->regno].nregs;
596 int nregs;
598 /* If we've recorded the same information before, everything is fine. */
599 if (incoming_nregs == chain->nregs)
601 if (dump_file)
602 fprintf (dump_file, "reg %d/%d already recorded\n",
603 chain->regno, chain->nregs);
604 return;
607 /* If we have no information for any of the involved registers, update
608 the incoming array. */
609 nregs = chain->nregs;
610 while (nregs-- > 0)
611 if (ri->incoming[chain->regno + nregs].nregs != 0
612 || ri->incoming[chain->regno + nregs].unusable)
613 break;
614 if (nregs < 0)
616 nregs = chain->nregs;
617 ri->incoming[chain->regno].nregs = nregs;
618 while (nregs-- > 1)
619 ri->incoming[chain->regno + nregs].nregs = -nregs;
620 if (dump_file)
621 fprintf (dump_file, "recorded reg %d/%d\n",
622 chain->regno, chain->nregs);
623 return;
626 /* There must be some kind of conflict. Prevent both the old and
627 new ranges from being used. */
628 if (incoming_nregs < 0)
629 ri->incoming[chain->regno + incoming_nregs].unusable = true;
630 for (i = 0; i < chain->nregs; i++)
631 ri->incoming[chain->regno + i].unusable = true;
634 /* Merge the two chains C1 and C2 so that all conflict information is
635 recorded and C1, and the id of C2 is changed to that of C1. */
636 static void
637 merge_chains (du_head_p c1, du_head_p c2)
639 if (c1 == c2)
640 return;
642 if (c2->first != NULL)
644 if (c1->first == NULL)
645 c1->first = c2->first;
646 else
647 c1->last->next_use = c2->first;
648 c1->last = c2->last;
651 c2->first = c2->last = NULL;
652 c2->id = c1->id;
654 IOR_HARD_REG_SET (c1->hard_conflicts, c2->hard_conflicts);
655 bitmap_ior_into (&c1->conflicts, &c2->conflicts);
657 c1->need_caller_save_reg |= c2->need_caller_save_reg;
658 c1->cannot_rename |= c2->cannot_rename;
661 /* Analyze the current function and build chains for renaming. */
663 void
664 regrename_analyze (bitmap bb_mask)
666 struct bb_rename_info *rename_info;
667 int i;
668 basic_block bb;
669 int n_bbs;
670 int *inverse_postorder;
672 inverse_postorder = XNEWVEC (int, last_basic_block);
673 n_bbs = pre_and_rev_post_order_compute (NULL, inverse_postorder, false);
675 /* Gather some information about the blocks in this function. */
676 rename_info = XCNEWVEC (struct bb_rename_info, n_basic_blocks);
677 i = 0;
678 FOR_EACH_BB (bb)
680 struct bb_rename_info *ri = rename_info + i;
681 ri->bb = bb;
682 if (bb_mask != NULL && !bitmap_bit_p (bb_mask, bb->index))
683 bb->aux = NULL;
684 else
685 bb->aux = ri;
686 i++;
689 current_id = 0;
690 id_to_chain.create (0);
691 bitmap_initialize (&open_chains_set, &bitmap_default_obstack);
693 /* The order in which we visit blocks ensures that whenever
694 possible, we only process a block after at least one of its
695 predecessors, which provides a "seeding" effect to make the logic
696 in set_incoming_from_chain and init_rename_info useful. */
698 for (i = 0; i < n_bbs; i++)
700 basic_block bb1 = BASIC_BLOCK (inverse_postorder[i]);
701 struct bb_rename_info *this_info;
702 bool success;
703 edge e;
704 edge_iterator ei;
705 int old_length = id_to_chain.length ();
707 this_info = (struct bb_rename_info *) bb1->aux;
708 if (this_info == NULL)
709 continue;
711 if (dump_file)
712 fprintf (dump_file, "\nprocessing block %d:\n", bb1->index);
714 init_rename_info (this_info, bb1);
716 success = build_def_use (bb1);
717 if (!success)
719 if (dump_file)
720 fprintf (dump_file, "failed\n");
721 bb1->aux = NULL;
722 id_to_chain.truncate (old_length);
723 current_id = old_length;
724 bitmap_clear (&this_info->incoming_open_chains_set);
725 open_chains = NULL;
726 if (insn_rr.exists ())
728 rtx insn;
729 FOR_BB_INSNS (bb1, insn)
731 insn_rr_info *p = &insn_rr[INSN_UID (insn)];
732 p->op_info = NULL;
735 continue;
738 if (dump_file)
739 dump_def_use_chain (old_length);
740 bitmap_copy (&this_info->open_chains_set, &open_chains_set);
742 /* Add successor blocks to the worklist if necessary, and record
743 data about our own open chains at the end of this block, which
744 will be used to pre-open chains when processing the successors. */
745 FOR_EACH_EDGE (e, ei, bb1->succs)
747 struct bb_rename_info *dest_ri;
748 struct du_head *chain;
750 if (dump_file)
751 fprintf (dump_file, "successor block %d\n", e->dest->index);
753 if (e->flags & (EDGE_EH | EDGE_ABNORMAL))
754 continue;
755 dest_ri = (struct bb_rename_info *)e->dest->aux;
756 if (dest_ri == NULL)
757 continue;
758 for (chain = open_chains; chain; chain = chain->next_chain)
759 set_incoming_from_chain (dest_ri, chain);
763 free (inverse_postorder);
765 /* Now, combine the chains data we have gathered across basic block
766 boundaries.
768 For every basic block, there may be chains open at the start, or at the
769 end. Rather than exclude them from renaming, we look for open chains
770 with matching registers at the other side of the CFG edge.
772 For a given chain using register R, open at the start of block B, we
773 must find an open chain using R on the other side of every edge leading
774 to B, if the register is live across this edge. In the code below,
775 N_PREDS_USED counts the number of edges where the register is live, and
776 N_PREDS_JOINED counts those where we found an appropriate chain for
777 joining.
779 We perform the analysis for both incoming and outgoing edges, but we
780 only need to merge once (in the second part, after verifying outgoing
781 edges). */
782 FOR_EACH_BB (bb)
784 struct bb_rename_info *bb_ri = (struct bb_rename_info *) bb->aux;
785 unsigned j;
786 bitmap_iterator bi;
788 if (bb_ri == NULL)
789 continue;
791 if (dump_file)
792 fprintf (dump_file, "processing bb %d in edges\n", bb->index);
794 EXECUTE_IF_SET_IN_BITMAP (&bb_ri->incoming_open_chains_set, 0, j, bi)
796 edge e;
797 edge_iterator ei;
798 struct du_head *chain = regrename_chain_from_id (j);
799 int n_preds_used = 0, n_preds_joined = 0;
801 FOR_EACH_EDGE (e, ei, bb->preds)
803 struct bb_rename_info *src_ri;
804 unsigned k;
805 bitmap_iterator bi2;
806 HARD_REG_SET live;
807 bool success = false;
809 REG_SET_TO_HARD_REG_SET (live, df_get_live_out (e->src));
810 if (!range_overlaps_hard_reg_set_p (live, chain->regno,
811 chain->nregs))
812 continue;
813 n_preds_used++;
815 if (e->flags & (EDGE_EH | EDGE_ABNORMAL))
816 continue;
818 src_ri = (struct bb_rename_info *)e->src->aux;
819 if (src_ri == NULL)
820 continue;
822 EXECUTE_IF_SET_IN_BITMAP (&src_ri->open_chains_set,
823 0, k, bi2)
825 struct du_head *outgoing_chain = regrename_chain_from_id (k);
827 if (outgoing_chain->regno == chain->regno
828 && outgoing_chain->nregs == chain->nregs)
830 n_preds_joined++;
831 success = true;
832 break;
835 if (!success && dump_file)
836 fprintf (dump_file, "failure to match with pred block %d\n",
837 e->src->index);
839 if (n_preds_joined < n_preds_used)
841 if (dump_file)
842 fprintf (dump_file, "cannot rename chain %d\n", j);
843 chain->cannot_rename = 1;
847 FOR_EACH_BB (bb)
849 struct bb_rename_info *bb_ri = (struct bb_rename_info *) bb->aux;
850 unsigned j;
851 bitmap_iterator bi;
853 if (bb_ri == NULL)
854 continue;
856 if (dump_file)
857 fprintf (dump_file, "processing bb %d out edges\n", bb->index);
859 EXECUTE_IF_SET_IN_BITMAP (&bb_ri->open_chains_set, 0, j, bi)
861 edge e;
862 edge_iterator ei;
863 struct du_head *chain = regrename_chain_from_id (j);
864 int n_succs_used = 0, n_succs_joined = 0;
866 FOR_EACH_EDGE (e, ei, bb->succs)
868 bool printed = false;
869 struct bb_rename_info *dest_ri;
870 unsigned k;
871 bitmap_iterator bi2;
872 HARD_REG_SET live;
874 REG_SET_TO_HARD_REG_SET (live, df_get_live_in (e->dest));
875 if (!range_overlaps_hard_reg_set_p (live, chain->regno,
876 chain->nregs))
877 continue;
879 n_succs_used++;
881 dest_ri = (struct bb_rename_info *)e->dest->aux;
882 if (dest_ri == NULL)
883 continue;
885 EXECUTE_IF_SET_IN_BITMAP (&dest_ri->incoming_open_chains_set,
886 0, k, bi2)
888 struct du_head *incoming_chain = regrename_chain_from_id (k);
890 if (incoming_chain->regno == chain->regno
891 && incoming_chain->nregs == chain->nregs)
893 if (dump_file)
895 if (!printed)
896 fprintf (dump_file,
897 "merging blocks for edge %d -> %d\n",
898 e->src->index, e->dest->index);
899 printed = true;
900 fprintf (dump_file,
901 " merging chains %d (->%d) and %d (->%d) [%s]\n",
902 k, incoming_chain->id, j, chain->id,
903 reg_names[incoming_chain->regno]);
906 merge_chains (chain, incoming_chain);
907 n_succs_joined++;
908 break;
912 if (n_succs_joined < n_succs_used)
914 if (dump_file)
915 fprintf (dump_file, "cannot rename chain %d\n",
917 chain->cannot_rename = 1;
922 free (rename_info);
924 FOR_EACH_BB (bb)
925 bb->aux = NULL;
928 void
929 regrename_do_replace (struct du_head *head, int reg)
931 struct du_chain *chain;
932 unsigned int base_regno = head->regno;
933 enum machine_mode mode;
935 for (chain = head->first; chain; chain = chain->next_use)
937 unsigned int regno = ORIGINAL_REGNO (*chain->loc);
938 struct reg_attrs *attr = REG_ATTRS (*chain->loc);
939 int reg_ptr = REG_POINTER (*chain->loc);
941 if (DEBUG_INSN_P (chain->insn) && REGNO (*chain->loc) != base_regno)
942 INSN_VAR_LOCATION_LOC (chain->insn) = gen_rtx_UNKNOWN_VAR_LOC ();
943 else
945 *chain->loc = gen_raw_REG (GET_MODE (*chain->loc), reg);
946 if (regno >= FIRST_PSEUDO_REGISTER)
947 ORIGINAL_REGNO (*chain->loc) = regno;
948 REG_ATTRS (*chain->loc) = attr;
949 REG_POINTER (*chain->loc) = reg_ptr;
952 df_insn_rescan (chain->insn);
955 mode = GET_MODE (*head->first->loc);
956 head->regno = reg;
957 head->nregs = hard_regno_nregs[reg][mode];
961 /* True if we found a register with a size mismatch, which means that we
962 can't track its lifetime accurately. If so, we abort the current block
963 without renaming. */
964 static bool fail_current_block;
966 /* Return true if OP is a reg for which all bits are set in PSET, false
967 if all bits are clear.
968 In other cases, set fail_current_block and return false. */
970 static bool
971 verify_reg_in_set (rtx op, HARD_REG_SET *pset)
973 unsigned regno, nregs;
974 bool all_live, all_dead;
975 if (!REG_P (op))
976 return false;
978 regno = REGNO (op);
979 nregs = hard_regno_nregs[regno][GET_MODE (op)];
980 all_live = all_dead = true;
981 while (nregs-- > 0)
982 if (TEST_HARD_REG_BIT (*pset, regno + nregs))
983 all_dead = false;
984 else
985 all_live = false;
986 if (!all_dead && !all_live)
988 fail_current_block = true;
989 return false;
991 return all_live;
994 /* Return true if OP is a reg that is being tracked already in some form.
995 May set fail_current_block if it sees an unhandled case of overlap. */
997 static bool
998 verify_reg_tracked (rtx op)
1000 return (verify_reg_in_set (op, &live_hard_regs)
1001 || verify_reg_in_set (op, &live_in_chains));
1004 /* Called through note_stores. DATA points to a rtx_code, either SET or
1005 CLOBBER, which tells us which kind of rtx to look at. If we have a
1006 match, record the set register in live_hard_regs and in the hard_conflicts
1007 bitmap of open chains. */
1009 static void
1010 note_sets_clobbers (rtx x, const_rtx set, void *data)
1012 enum rtx_code code = *(enum rtx_code *)data;
1013 struct du_head *chain;
1015 if (GET_CODE (x) == SUBREG)
1016 x = SUBREG_REG (x);
1017 if (!REG_P (x) || GET_CODE (set) != code)
1018 return;
1019 /* There must not be pseudos at this point. */
1020 gcc_assert (HARD_REGISTER_P (x));
1021 add_to_hard_reg_set (&live_hard_regs, GET_MODE (x), REGNO (x));
1022 for (chain = open_chains; chain; chain = chain->next_chain)
1023 add_to_hard_reg_set (&chain->hard_conflicts, GET_MODE (x), REGNO (x));
1026 static void
1027 scan_rtx_reg (rtx insn, rtx *loc, enum reg_class cl, enum scan_actions action,
1028 enum op_type type)
1030 struct du_head **p;
1031 rtx x = *loc;
1032 enum machine_mode mode = GET_MODE (x);
1033 unsigned this_regno = REGNO (x);
1034 int this_nregs = hard_regno_nregs[this_regno][mode];
1036 if (action == mark_write)
1038 if (type == OP_OUT)
1039 create_new_chain (this_regno, this_nregs, loc, insn, cl);
1040 return;
1043 if ((type == OP_OUT) != (action == terminate_write || action == mark_access))
1044 return;
1046 for (p = &open_chains; *p;)
1048 struct du_head *head = *p;
1049 struct du_head *next = head->next_chain;
1050 int exact_match = (head->regno == this_regno
1051 && head->nregs == this_nregs);
1052 int superset = (this_regno <= head->regno
1053 && this_regno + this_nregs >= head->regno + head->nregs);
1054 int subset = (this_regno >= head->regno
1055 && this_regno + this_nregs <= head->regno + head->nregs);
1057 if (!bitmap_bit_p (&open_chains_set, head->id)
1058 || head->regno + head->nregs <= this_regno
1059 || this_regno + this_nregs <= head->regno)
1061 p = &head->next_chain;
1062 continue;
1065 if (action == mark_read || action == mark_access)
1067 /* ??? Class NO_REGS can happen if the md file makes use of
1068 EXTRA_CONSTRAINTS to match registers. Which is arguably
1069 wrong, but there we are. */
1071 if (cl == NO_REGS || (!exact_match && !DEBUG_INSN_P (insn)))
1073 if (dump_file)
1074 fprintf (dump_file,
1075 "Cannot rename chain %s (%d) at insn %d (%s)\n",
1076 reg_names[head->regno], head->id, INSN_UID (insn),
1077 scan_actions_name[(int) action]);
1078 head->cannot_rename = 1;
1079 if (superset)
1081 unsigned nregs = this_nregs;
1082 head->regno = this_regno;
1083 head->nregs = this_nregs;
1084 while (nregs-- > 0)
1085 SET_HARD_REG_BIT (live_in_chains, head->regno + nregs);
1086 if (dump_file)
1087 fprintf (dump_file,
1088 "Widening register in chain %s (%d) at insn %d\n",
1089 reg_names[head->regno], head->id, INSN_UID (insn));
1091 else if (!subset)
1093 fail_current_block = true;
1094 if (dump_file)
1095 fprintf (dump_file,
1096 "Failing basic block due to unhandled overlap\n");
1099 else
1101 struct du_chain *this_du;
1102 this_du = XOBNEW (&rename_obstack, struct du_chain);
1103 this_du->next_use = 0;
1104 this_du->loc = loc;
1105 this_du->insn = insn;
1106 this_du->cl = cl;
1107 if (head->first == NULL)
1108 head->first = this_du;
1109 else
1110 head->last->next_use = this_du;
1111 record_operand_use (head, this_du);
1112 head->last = this_du;
1114 /* Avoid adding the same location in a DEBUG_INSN multiple times,
1115 which could happen with non-exact overlap. */
1116 if (DEBUG_INSN_P (insn))
1117 return;
1118 /* Otherwise, find any other chains that do not match exactly;
1119 ensure they all get marked unrenamable. */
1120 p = &head->next_chain;
1121 continue;
1124 /* Whether the terminated chain can be used for renaming
1125 depends on the action and this being an exact match.
1126 In either case, we remove this element from open_chains. */
1128 if ((action == terminate_dead || action == terminate_write)
1129 && (superset || subset))
1131 unsigned nregs;
1133 if (subset && !superset)
1134 head->cannot_rename = 1;
1135 bitmap_clear_bit (&open_chains_set, head->id);
1137 nregs = head->nregs;
1138 while (nregs-- > 0)
1140 CLEAR_HARD_REG_BIT (live_in_chains, head->regno + nregs);
1141 if (subset && !superset
1142 && (head->regno + nregs < this_regno
1143 || head->regno + nregs >= this_regno + this_nregs))
1144 SET_HARD_REG_BIT (live_hard_regs, head->regno + nregs);
1147 *p = next;
1148 if (dump_file)
1149 fprintf (dump_file,
1150 "Closing chain %s (%d) at insn %d (%s%s)\n",
1151 reg_names[head->regno], head->id, INSN_UID (insn),
1152 scan_actions_name[(int) action],
1153 superset ? ", superset" : subset ? ", subset" : "");
1155 else if (action == terminate_dead || action == terminate_write)
1157 /* In this case, tracking liveness gets too hard. Fail the
1158 entire basic block. */
1159 if (dump_file)
1160 fprintf (dump_file,
1161 "Failing basic block due to unhandled overlap\n");
1162 fail_current_block = true;
1163 return;
1165 else
1167 head->cannot_rename = 1;
1168 if (dump_file)
1169 fprintf (dump_file,
1170 "Cannot rename chain %s (%d) at insn %d (%s)\n",
1171 reg_names[head->regno], head->id, INSN_UID (insn),
1172 scan_actions_name[(int) action]);
1173 p = &head->next_chain;
1178 /* Adapted from find_reloads_address_1. CL is INDEX_REG_CLASS or
1179 BASE_REG_CLASS depending on how the register is being considered. */
1181 static void
1182 scan_rtx_address (rtx insn, rtx *loc, enum reg_class cl,
1183 enum scan_actions action, enum machine_mode mode,
1184 addr_space_t as)
1186 rtx x = *loc;
1187 RTX_CODE code = GET_CODE (x);
1188 const char *fmt;
1189 int i, j;
1191 if (action == mark_write || action == mark_access)
1192 return;
1194 switch (code)
1196 case PLUS:
1198 rtx orig_op0 = XEXP (x, 0);
1199 rtx orig_op1 = XEXP (x, 1);
1200 RTX_CODE code0 = GET_CODE (orig_op0);
1201 RTX_CODE code1 = GET_CODE (orig_op1);
1202 rtx op0 = orig_op0;
1203 rtx op1 = orig_op1;
1204 rtx *locI = NULL;
1205 rtx *locB = NULL;
1206 enum rtx_code index_code = SCRATCH;
1208 if (GET_CODE (op0) == SUBREG)
1210 op0 = SUBREG_REG (op0);
1211 code0 = GET_CODE (op0);
1214 if (GET_CODE (op1) == SUBREG)
1216 op1 = SUBREG_REG (op1);
1217 code1 = GET_CODE (op1);
1220 if (code0 == MULT || code0 == SIGN_EXTEND || code0 == TRUNCATE
1221 || code0 == ZERO_EXTEND || code1 == MEM)
1223 locI = &XEXP (x, 0);
1224 locB = &XEXP (x, 1);
1225 index_code = GET_CODE (*locI);
1227 else if (code1 == MULT || code1 == SIGN_EXTEND || code1 == TRUNCATE
1228 || code1 == ZERO_EXTEND || code0 == MEM)
1230 locI = &XEXP (x, 1);
1231 locB = &XEXP (x, 0);
1232 index_code = GET_CODE (*locI);
1234 else if (code0 == CONST_INT || code0 == CONST
1235 || code0 == SYMBOL_REF || code0 == LABEL_REF)
1237 locB = &XEXP (x, 1);
1238 index_code = GET_CODE (XEXP (x, 0));
1240 else if (code1 == CONST_INT || code1 == CONST
1241 || code1 == SYMBOL_REF || code1 == LABEL_REF)
1243 locB = &XEXP (x, 0);
1244 index_code = GET_CODE (XEXP (x, 1));
1246 else if (code0 == REG && code1 == REG)
1248 int index_op;
1249 unsigned regno0 = REGNO (op0), regno1 = REGNO (op1);
1251 if (REGNO_OK_FOR_INDEX_P (regno1)
1252 && regno_ok_for_base_p (regno0, mode, as, PLUS, REG))
1253 index_op = 1;
1254 else if (REGNO_OK_FOR_INDEX_P (regno0)
1255 && regno_ok_for_base_p (regno1, mode, as, PLUS, REG))
1256 index_op = 0;
1257 else if (regno_ok_for_base_p (regno0, mode, as, PLUS, REG)
1258 || REGNO_OK_FOR_INDEX_P (regno1))
1259 index_op = 1;
1260 else if (regno_ok_for_base_p (regno1, mode, as, PLUS, REG))
1261 index_op = 0;
1262 else
1263 index_op = 1;
1265 locI = &XEXP (x, index_op);
1266 locB = &XEXP (x, !index_op);
1267 index_code = GET_CODE (*locI);
1269 else if (code0 == REG)
1271 locI = &XEXP (x, 0);
1272 locB = &XEXP (x, 1);
1273 index_code = GET_CODE (*locI);
1275 else if (code1 == REG)
1277 locI = &XEXP (x, 1);
1278 locB = &XEXP (x, 0);
1279 index_code = GET_CODE (*locI);
1282 if (locI)
1283 scan_rtx_address (insn, locI, INDEX_REG_CLASS, action, mode, as);
1284 if (locB)
1285 scan_rtx_address (insn, locB,
1286 base_reg_class (mode, as, PLUS, index_code),
1287 action, mode, as);
1289 return;
1292 case POST_INC:
1293 case POST_DEC:
1294 case POST_MODIFY:
1295 case PRE_INC:
1296 case PRE_DEC:
1297 case PRE_MODIFY:
1298 #ifndef AUTO_INC_DEC
1299 /* If the target doesn't claim to handle autoinc, this must be
1300 something special, like a stack push. Kill this chain. */
1301 action = mark_all_read;
1302 #endif
1303 break;
1305 case MEM:
1306 scan_rtx_address (insn, &XEXP (x, 0),
1307 base_reg_class (GET_MODE (x), MEM_ADDR_SPACE (x),
1308 MEM, SCRATCH),
1309 action, GET_MODE (x), MEM_ADDR_SPACE (x));
1310 return;
1312 case REG:
1313 scan_rtx_reg (insn, loc, cl, action, OP_IN);
1314 return;
1316 default:
1317 break;
1320 fmt = GET_RTX_FORMAT (code);
1321 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1323 if (fmt[i] == 'e')
1324 scan_rtx_address (insn, &XEXP (x, i), cl, action, mode, as);
1325 else if (fmt[i] == 'E')
1326 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
1327 scan_rtx_address (insn, &XVECEXP (x, i, j), cl, action, mode, as);
1331 static void
1332 scan_rtx (rtx insn, rtx *loc, enum reg_class cl, enum scan_actions action,
1333 enum op_type type)
1335 const char *fmt;
1336 rtx x = *loc;
1337 enum rtx_code code = GET_CODE (x);
1338 int i, j;
1340 code = GET_CODE (x);
1341 switch (code)
1343 case CONST:
1344 CASE_CONST_ANY:
1345 case SYMBOL_REF:
1346 case LABEL_REF:
1347 case CC0:
1348 case PC:
1349 return;
1351 case REG:
1352 scan_rtx_reg (insn, loc, cl, action, type);
1353 return;
1355 case MEM:
1356 scan_rtx_address (insn, &XEXP (x, 0),
1357 base_reg_class (GET_MODE (x), MEM_ADDR_SPACE (x),
1358 MEM, SCRATCH),
1359 action, GET_MODE (x), MEM_ADDR_SPACE (x));
1360 return;
1362 case SET:
1363 scan_rtx (insn, &SET_SRC (x), cl, action, OP_IN);
1364 scan_rtx (insn, &SET_DEST (x), cl, action,
1365 (GET_CODE (PATTERN (insn)) == COND_EXEC
1366 && verify_reg_tracked (SET_DEST (x))) ? OP_INOUT : OP_OUT);
1367 return;
1369 case STRICT_LOW_PART:
1370 scan_rtx (insn, &XEXP (x, 0), cl, action,
1371 verify_reg_tracked (XEXP (x, 0)) ? OP_INOUT : OP_OUT);
1372 return;
1374 case ZERO_EXTRACT:
1375 case SIGN_EXTRACT:
1376 scan_rtx (insn, &XEXP (x, 0), cl, action,
1377 (type == OP_IN ? OP_IN :
1378 verify_reg_tracked (XEXP (x, 0)) ? OP_INOUT : OP_OUT));
1379 scan_rtx (insn, &XEXP (x, 1), cl, action, OP_IN);
1380 scan_rtx (insn, &XEXP (x, 2), cl, action, OP_IN);
1381 return;
1383 case POST_INC:
1384 case PRE_INC:
1385 case POST_DEC:
1386 case PRE_DEC:
1387 case POST_MODIFY:
1388 case PRE_MODIFY:
1389 /* Should only happen inside MEM. */
1390 gcc_unreachable ();
1392 case CLOBBER:
1393 scan_rtx (insn, &SET_DEST (x), cl, action,
1394 (GET_CODE (PATTERN (insn)) == COND_EXEC
1395 && verify_reg_tracked (SET_DEST (x))) ? OP_INOUT : OP_OUT);
1396 return;
1398 case EXPR_LIST:
1399 scan_rtx (insn, &XEXP (x, 0), cl, action, type);
1400 if (XEXP (x, 1))
1401 scan_rtx (insn, &XEXP (x, 1), cl, action, type);
1402 return;
1404 default:
1405 break;
1408 fmt = GET_RTX_FORMAT (code);
1409 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1411 if (fmt[i] == 'e')
1412 scan_rtx (insn, &XEXP (x, i), cl, action, type);
1413 else if (fmt[i] == 'E')
1414 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
1415 scan_rtx (insn, &XVECEXP (x, i, j), cl, action, type);
1419 /* Hide operands of the current insn (of which there are N_OPS) by
1420 substituting cc0 for them.
1421 Previous values are stored in the OLD_OPERANDS and OLD_DUPS.
1422 For every bit set in DO_NOT_HIDE, we leave the operand alone.
1423 If INOUT_AND_EC_ONLY is set, we only do this for OP_INOUT type operands
1424 and earlyclobbers. */
1426 static void
1427 hide_operands (int n_ops, rtx *old_operands, rtx *old_dups,
1428 unsigned HOST_WIDE_INT do_not_hide, bool inout_and_ec_only)
1430 int i;
1431 int alt = which_alternative;
1432 for (i = 0; i < n_ops; i++)
1434 old_operands[i] = recog_data.operand[i];
1435 /* Don't squash match_operator or match_parallel here, since
1436 we don't know that all of the contained registers are
1437 reachable by proper operands. */
1438 if (recog_data.constraints[i][0] == '\0')
1439 continue;
1440 if (do_not_hide & (1 << i))
1441 continue;
1442 if (!inout_and_ec_only || recog_data.operand_type[i] == OP_INOUT
1443 || recog_op_alt[i][alt].earlyclobber)
1444 *recog_data.operand_loc[i] = cc0_rtx;
1446 for (i = 0; i < recog_data.n_dups; i++)
1448 int opn = recog_data.dup_num[i];
1449 old_dups[i] = *recog_data.dup_loc[i];
1450 if (do_not_hide & (1 << opn))
1451 continue;
1452 if (!inout_and_ec_only || recog_data.operand_type[opn] == OP_INOUT
1453 || recog_op_alt[opn][alt].earlyclobber)
1454 *recog_data.dup_loc[i] = cc0_rtx;
1458 /* Undo the substitution performed by hide_operands. INSN is the insn we
1459 are processing; the arguments are the same as in hide_operands. */
1461 static void
1462 restore_operands (rtx insn, int n_ops, rtx *old_operands, rtx *old_dups)
1464 int i;
1465 for (i = 0; i < recog_data.n_dups; i++)
1466 *recog_data.dup_loc[i] = old_dups[i];
1467 for (i = 0; i < n_ops; i++)
1468 *recog_data.operand_loc[i] = old_operands[i];
1469 if (recog_data.n_dups)
1470 df_insn_rescan (insn);
1473 /* For each output operand of INSN, call scan_rtx to create a new
1474 open chain. Do this only for normal or earlyclobber outputs,
1475 depending on EARLYCLOBBER. If INSN_INFO is nonnull, use it to
1476 record information about the operands in the insn. */
1478 static void
1479 record_out_operands (rtx insn, bool earlyclobber, insn_rr_info *insn_info)
1481 int n_ops = recog_data.n_operands;
1482 int alt = which_alternative;
1484 int i;
1486 for (i = 0; i < n_ops + recog_data.n_dups; i++)
1488 int opn = i < n_ops ? i : recog_data.dup_num[i - n_ops];
1489 rtx *loc = (i < n_ops
1490 ? recog_data.operand_loc[opn]
1491 : recog_data.dup_loc[i - n_ops]);
1492 rtx op = *loc;
1493 enum reg_class cl = recog_op_alt[opn][alt].cl;
1495 struct du_head *prev_open;
1497 if (recog_data.operand_type[opn] != OP_OUT
1498 || recog_op_alt[opn][alt].earlyclobber != earlyclobber)
1499 continue;
1501 if (insn_info)
1502 cur_operand = insn_info->op_info + i;
1504 prev_open = open_chains;
1505 scan_rtx (insn, loc, cl, mark_write, OP_OUT);
1507 /* ??? Many targets have output constraints on the SET_DEST
1508 of a call insn, which is stupid, since these are certainly
1509 ABI defined hard registers. For these, and for asm operands
1510 that originally referenced hard registers, we must record that
1511 the chain cannot be renamed. */
1512 if (CALL_P (insn)
1513 || (asm_noperands (PATTERN (insn)) > 0
1514 && REG_P (op)
1515 && REGNO (op) == ORIGINAL_REGNO (op)))
1517 if (prev_open != open_chains)
1518 open_chains->cannot_rename = 1;
1521 cur_operand = NULL;
1524 /* Build def/use chain. */
1526 static bool
1527 build_def_use (basic_block bb)
1529 rtx insn;
1530 unsigned HOST_WIDE_INT untracked_operands;
1532 fail_current_block = false;
1534 for (insn = BB_HEAD (bb); ; insn = NEXT_INSN (insn))
1536 if (NONDEBUG_INSN_P (insn))
1538 int n_ops;
1539 rtx note;
1540 rtx old_operands[MAX_RECOG_OPERANDS];
1541 rtx old_dups[MAX_DUP_OPERANDS];
1542 int i;
1543 int alt;
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_insn (insn);
1573 if (! constrain_operands (1))
1574 fatal_insn_not_found (insn);
1575 preprocess_constraints ();
1576 alt = which_alternative;
1577 n_ops = recog_data.n_operands;
1578 untracked_operands = 0;
1580 if (insn_rr.exists ())
1582 insn_info = &insn_rr[INSN_UID (insn)];
1583 insn_info->op_info = XOBNEWVEC (&rename_obstack, operand_rr_info,
1584 recog_data.n_operands);
1585 memset (insn_info->op_info, 0,
1586 sizeof (operand_rr_info) * recog_data.n_operands);
1589 /* Simplify the code below by rewriting things to reflect
1590 matching constraints. Also promote OP_OUT to OP_INOUT in
1591 predicated instructions, but only for register operands
1592 that are already tracked, so that we can create a chain
1593 when the first SET makes a register live. */
1595 predicated = GET_CODE (PATTERN (insn)) == COND_EXEC;
1596 for (i = 0; i < n_ops; ++i)
1598 rtx op = recog_data.operand[i];
1599 int matches = recog_op_alt[i][alt].matches;
1600 if (matches >= 0)
1601 recog_op_alt[i][alt].cl = recog_op_alt[matches][alt].cl;
1602 if (matches >= 0 || recog_op_alt[i][alt].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))
1627 enum machine_mode mode = GET_MODE (op);
1628 unsigned this_regno = REGNO (op);
1629 unsigned this_nregs = hard_regno_nregs[this_regno][mode];
1630 create_new_chain (this_regno, this_nregs, NULL, NULL_RTX,
1631 NO_REGS);
1635 if (fail_current_block)
1636 break;
1638 /* Step 1a: Mark hard registers that are clobbered in this insn,
1639 outside an operand, as live. */
1640 hide_operands (n_ops, old_operands, old_dups, untracked_operands,
1641 false);
1642 note_stores (PATTERN (insn), note_sets_clobbers, &clobber_code);
1643 restore_operands (insn, n_ops, old_operands, old_dups);
1645 /* Step 1b: Begin new chains for earlyclobbered writes inside
1646 operands. */
1647 record_out_operands (insn, true, insn_info);
1649 /* Step 2: Mark chains for which we have reads outside operands
1650 as unrenamable.
1651 We do this by munging all operands into CC0, and closing
1652 everything remaining. */
1654 hide_operands (n_ops, old_operands, old_dups, untracked_operands,
1655 false);
1656 scan_rtx (insn, &PATTERN (insn), NO_REGS, mark_all_read, OP_IN);
1657 restore_operands (insn, n_ops, old_operands, old_dups);
1659 /* Step 2B: Can't rename function call argument registers. */
1660 if (CALL_P (insn) && CALL_INSN_FUNCTION_USAGE (insn))
1661 scan_rtx (insn, &CALL_INSN_FUNCTION_USAGE (insn),
1662 NO_REGS, mark_all_read, OP_IN);
1664 /* Step 2C: Can't rename asm operands that were originally
1665 hard registers. */
1666 if (asm_noperands (PATTERN (insn)) > 0)
1667 for (i = 0; i < n_ops; i++)
1669 rtx *loc = recog_data.operand_loc[i];
1670 rtx op = *loc;
1672 if (REG_P (op)
1673 && REGNO (op) == ORIGINAL_REGNO (op)
1674 && (recog_data.operand_type[i] == OP_IN
1675 || recog_data.operand_type[i] == OP_INOUT))
1676 scan_rtx (insn, loc, NO_REGS, mark_all_read, OP_IN);
1679 /* Step 3: Append to chains for reads inside operands. */
1680 for (i = 0; i < n_ops + recog_data.n_dups; i++)
1682 int opn = i < n_ops ? i : recog_data.dup_num[i - n_ops];
1683 rtx *loc = (i < n_ops
1684 ? recog_data.operand_loc[opn]
1685 : recog_data.dup_loc[i - n_ops]);
1686 enum reg_class cl = recog_op_alt[opn][alt].cl;
1687 enum op_type type = recog_data.operand_type[opn];
1689 /* Don't scan match_operand here, since we've no reg class
1690 information to pass down. Any operands that we could
1691 substitute in will be represented elsewhere. */
1692 if (recog_data.constraints[opn][0] == '\0'
1693 || untracked_operands & (1 << opn))
1694 continue;
1696 if (insn_info)
1697 cur_operand = i == opn ? insn_info->op_info + i : NULL;
1698 if (recog_op_alt[opn][alt].is_address)
1699 scan_rtx_address (insn, loc, cl, mark_read,
1700 VOIDmode, ADDR_SPACE_GENERIC);
1701 else
1702 scan_rtx (insn, loc, cl, mark_read, type);
1704 cur_operand = NULL;
1706 /* Step 3B: Record updates for regs in REG_INC notes, and
1707 source regs in REG_FRAME_RELATED_EXPR notes. */
1708 for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
1709 if (REG_NOTE_KIND (note) == REG_INC
1710 || REG_NOTE_KIND (note) == REG_FRAME_RELATED_EXPR)
1711 scan_rtx (insn, &XEXP (note, 0), ALL_REGS, mark_read,
1712 OP_INOUT);
1714 /* Step 4: Close chains for registers that die here. */
1715 for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
1716 if (REG_NOTE_KIND (note) == REG_DEAD)
1718 remove_from_hard_reg_set (&live_hard_regs,
1719 GET_MODE (XEXP (note, 0)),
1720 REGNO (XEXP (note, 0)));
1721 scan_rtx (insn, &XEXP (note, 0), NO_REGS, terminate_dead,
1722 OP_IN);
1725 /* Step 4B: If this is a call, any chain live at this point
1726 requires a caller-saved reg. */
1727 if (CALL_P (insn))
1729 struct du_head *p;
1730 for (p = open_chains; p; p = p->next_chain)
1731 p->need_caller_save_reg = 1;
1734 /* Step 5: Close open chains that overlap writes. Similar to
1735 step 2, we hide in-out operands, since we do not want to
1736 close these chains. We also hide earlyclobber operands,
1737 since we've opened chains for them in step 1, and earlier
1738 chains they would overlap with must have been closed at
1739 the previous insn at the latest, as such operands cannot
1740 possibly overlap with any input operands. */
1742 hide_operands (n_ops, old_operands, old_dups, untracked_operands,
1743 true);
1744 scan_rtx (insn, &PATTERN (insn), NO_REGS, terminate_write, OP_IN);
1745 restore_operands (insn, n_ops, old_operands, old_dups);
1747 /* Step 6a: Mark hard registers that are set in this insn,
1748 outside an operand, as live. */
1749 hide_operands (n_ops, old_operands, old_dups, untracked_operands,
1750 false);
1751 note_stores (PATTERN (insn), note_sets_clobbers, &set_code);
1752 restore_operands (insn, n_ops, old_operands, old_dups);
1754 /* Step 6b: Begin new chains for writes inside operands. */
1755 record_out_operands (insn, false, insn_info);
1757 /* Step 6c: Record destination regs in REG_FRAME_RELATED_EXPR
1758 notes for update. */
1759 for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
1760 if (REG_NOTE_KIND (note) == REG_FRAME_RELATED_EXPR)
1761 scan_rtx (insn, &XEXP (note, 0), ALL_REGS, mark_access,
1762 OP_INOUT);
1764 /* Step 7: Close chains for registers that were never
1765 really used here. */
1766 for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
1767 if (REG_NOTE_KIND (note) == REG_UNUSED)
1769 remove_from_hard_reg_set (&live_hard_regs,
1770 GET_MODE (XEXP (note, 0)),
1771 REGNO (XEXP (note, 0)));
1772 scan_rtx (insn, &XEXP (note, 0), NO_REGS, terminate_dead,
1773 OP_IN);
1776 else if (DEBUG_INSN_P (insn)
1777 && !VAR_LOC_UNKNOWN_P (INSN_VAR_LOCATION_LOC (insn)))
1779 scan_rtx (insn, &INSN_VAR_LOCATION_LOC (insn),
1780 ALL_REGS, mark_read, OP_IN);
1782 if (insn == BB_END (bb))
1783 break;
1786 if (fail_current_block)
1787 return false;
1789 return true;
1792 /* Initialize the register renamer. If INSN_INFO is true, ensure that
1793 insn_rr is nonnull. */
1794 void
1795 regrename_init (bool insn_info)
1797 gcc_obstack_init (&rename_obstack);
1798 insn_rr.create (0);
1799 if (insn_info)
1800 insn_rr.safe_grow_cleared (get_max_uid ());
1803 /* Free all global data used by the register renamer. */
1804 void
1805 regrename_finish (void)
1807 insn_rr.release ();
1808 free_chain_data ();
1809 obstack_free (&rename_obstack, NULL);
1812 /* Perform register renaming on the current function. */
1814 static unsigned int
1815 regrename_optimize (void)
1817 df_set_flags (DF_LR_RUN_DCE);
1818 df_note_add_problem ();
1819 df_analyze ();
1820 df_set_flags (DF_DEFER_INSN_RESCAN);
1822 regrename_init (false);
1824 regrename_analyze (NULL);
1826 rename_chains ();
1828 regrename_finish ();
1830 return 0;
1833 static bool
1834 gate_handle_regrename (void)
1836 return (optimize > 0 && (flag_rename_registers));
1839 struct rtl_opt_pass pass_regrename =
1842 RTL_PASS,
1843 "rnreg", /* name */
1844 OPTGROUP_NONE, /* optinfo_flags */
1845 gate_handle_regrename, /* gate */
1846 regrename_optimize, /* execute */
1847 NULL, /* sub */
1848 NULL, /* next */
1849 0, /* static_pass_number */
1850 TV_RENAME_REGISTERS, /* tv_id */
1851 0, /* properties_required */
1852 0, /* properties_provided */
1853 0, /* properties_destroyed */
1854 0, /* todo_flags_start */
1855 TODO_df_finish | TODO_verify_rtl_sharing |
1856 0 /* todo_flags_finish */