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)
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/>. */
22 #include "coretypes.h"
24 #include "rtl-error.h"
26 #include "insn-config.h"
28 #include "addresses.h"
29 #include "hard-reg-set.h"
37 #include "dominance.h"
40 #include "basic-block.h"
46 #include "tree-pass.h"
50 #include "regrename.h"
52 /* This file implements the RTL register renaming pass of the compiler. It is
53 a semi-local pass whose goal is to maximize the usage of the register file
54 of the processor by substituting registers for others in the solution given
55 by the register allocator. The algorithm is as follows:
57 1. Local def/use chains are built: within each basic block, chains are
58 opened and closed; if a chain isn't closed at the end of the block,
59 it is dropped. We pre-open chains if we have already examined a
60 predecessor block and found chains live at the end which match
61 live registers at the start of the new block.
63 2. We try to combine the local chains across basic block boundaries by
64 comparing chains that were open at the start or end of a block to
65 those in successor/predecessor blocks.
67 3. For each chain, the set of possible renaming registers is computed.
68 This takes into account the renaming of previously processed chains.
69 Optionally, a preferred class is computed for the renaming register.
71 4. The best renaming register is computed for the chain in the above set,
72 using a round-robin allocation. If a preferred class exists, then the
73 round-robin allocation is done within the class first, if possible.
74 The round-robin allocation of renaming registers itself is global.
76 5. If a renaming register has been found, it is substituted in the chain.
78 Targets can parameterize the pass by specifying a preferred class for the
79 renaming register for a given (super)class of registers to be renamed. */
81 #if HOST_BITS_PER_WIDE_INT <= MAX_RECOG_OPERANDS
82 #error "Use a different bitmap implementation for untracked_operands."
92 /* mark_access is for marking the destination regs in
93 REG_FRAME_RELATED_EXPR notes (as if they were read) so that the
94 note is updated properly. */
98 static const char * const scan_actions_name
[] =
108 /* TICK and THIS_TICK are used to record the last time we saw each
110 static int tick
[FIRST_PSEUDO_REGISTER
];
111 static int this_tick
= 0;
113 static struct obstack rename_obstack
;
115 /* If nonnull, the code calling into the register renamer requested
116 information about insn operands, and we store it here. */
117 vec
<insn_rr_info
> insn_rr
;
119 static void scan_rtx (rtx_insn
*, rtx
*, enum reg_class
, enum scan_actions
,
121 static bool build_def_use (basic_block
);
123 /* The id to be given to the next opened chain. */
124 static unsigned current_id
;
126 /* A mapping of unique id numbers to chains. */
127 static vec
<du_head_p
> id_to_chain
;
129 /* List of currently open chains. */
130 static struct du_head
*open_chains
;
132 /* Bitmap of open chains. The bits set always match the list found in
134 static bitmap_head open_chains_set
;
136 /* Record the registers being tracked in open_chains. */
137 static HARD_REG_SET live_in_chains
;
139 /* Record the registers that are live but not tracked. The intersection
140 between this and live_in_chains is empty. */
141 static HARD_REG_SET live_hard_regs
;
143 /* Set while scanning RTL if INSN_RR is nonnull, i.e. if the current analysis
144 is for a caller that requires operand data. Used in
145 record_operand_use. */
146 static operand_rr_info
*cur_operand
;
148 /* Return the chain corresponding to id number ID. Take into account that
149 chains may have been merged. */
151 regrename_chain_from_id (unsigned int id
)
153 du_head_p first_chain
= id_to_chain
[id
];
154 du_head_p chain
= first_chain
;
155 while (chain
->id
!= id
)
158 chain
= id_to_chain
[id
];
160 first_chain
->id
= id
;
164 /* Dump all def/use chains, starting at id FROM. */
167 dump_def_use_chain (int from
)
171 FOR_EACH_VEC_ELT_FROM (id_to_chain
, i
, head
, from
)
173 struct du_chain
*this_du
= head
->first
;
175 fprintf (dump_file
, "Register %s (%d):",
176 reg_names
[head
->regno
], head
->nregs
);
179 fprintf (dump_file
, " %d [%s]", INSN_UID (this_du
->insn
),
180 reg_class_names
[this_du
->cl
]);
181 this_du
= this_du
->next_use
;
183 fprintf (dump_file
, "\n");
184 head
= head
->next_chain
;
189 free_chain_data (void)
193 for (i
= 0; id_to_chain
.iterate (i
, &ptr
); i
++)
194 bitmap_clear (&ptr
->conflicts
);
196 id_to_chain
.release ();
199 /* Walk all chains starting with CHAINS and record that they conflict with
200 another chain whose id is ID. */
203 mark_conflict (struct du_head
*chains
, unsigned id
)
207 bitmap_set_bit (&chains
->conflicts
, id
);
208 chains
= chains
->next_chain
;
212 /* Examine cur_operand, and if it is nonnull, record information about the
213 use THIS_DU which is part of the chain HEAD. */
216 record_operand_use (struct du_head
*head
, struct du_chain
*this_du
)
218 if (cur_operand
== NULL
)
220 gcc_assert (cur_operand
->n_chains
< MAX_REGS_PER_ADDRESS
);
221 cur_operand
->heads
[cur_operand
->n_chains
] = head
;
222 cur_operand
->chains
[cur_operand
->n_chains
++] = this_du
;
225 /* Create a new chain for THIS_NREGS registers starting at THIS_REGNO,
226 and record its occurrence in *LOC, which is being written to in INSN.
227 This access requires a register of class CL. */
230 create_new_chain (unsigned this_regno
, unsigned this_nregs
, rtx
*loc
,
231 rtx_insn
*insn
, enum reg_class cl
)
233 struct du_head
*head
= XOBNEW (&rename_obstack
, struct du_head
);
234 struct du_chain
*this_du
;
237 head
->next_chain
= open_chains
;
238 head
->regno
= this_regno
;
239 head
->nregs
= this_nregs
;
240 head
->need_caller_save_reg
= 0;
241 head
->cannot_rename
= 0;
243 id_to_chain
.safe_push (head
);
244 head
->id
= current_id
++;
246 bitmap_initialize (&head
->conflicts
, &bitmap_default_obstack
);
247 bitmap_copy (&head
->conflicts
, &open_chains_set
);
248 mark_conflict (open_chains
, head
->id
);
250 /* Since we're tracking this as a chain now, remove it from the
251 list of conflicting live hard registers and track it in
252 live_in_chains instead. */
256 SET_HARD_REG_BIT (live_in_chains
, head
->regno
+ nregs
);
257 CLEAR_HARD_REG_BIT (live_hard_regs
, head
->regno
+ nregs
);
260 COPY_HARD_REG_SET (head
->hard_conflicts
, live_hard_regs
);
261 bitmap_set_bit (&open_chains_set
, head
->id
);
267 fprintf (dump_file
, "Creating chain %s (%d)",
268 reg_names
[head
->regno
], head
->id
);
269 if (insn
!= NULL_RTX
)
270 fprintf (dump_file
, " at insn %d", INSN_UID (insn
));
271 fprintf (dump_file
, "\n");
274 if (insn
== NULL_RTX
)
276 head
->first
= head
->last
= NULL
;
280 this_du
= XOBNEW (&rename_obstack
, struct du_chain
);
281 head
->first
= head
->last
= this_du
;
283 this_du
->next_use
= 0;
285 this_du
->insn
= insn
;
287 record_operand_use (head
, this_du
);
291 /* For a def-use chain HEAD, find which registers overlap its lifetime and
292 set the corresponding bits in *PSET. */
295 merge_overlapping_regs (HARD_REG_SET
*pset
, struct du_head
*head
)
299 IOR_HARD_REG_SET (*pset
, head
->hard_conflicts
);
300 EXECUTE_IF_SET_IN_BITMAP (&head
->conflicts
, 0, i
, bi
)
302 du_head_p other
= regrename_chain_from_id (i
);
303 unsigned j
= other
->nregs
;
304 gcc_assert (other
!= head
);
306 SET_HARD_REG_BIT (*pset
, other
->regno
+ j
);
310 /* Check if NEW_REG can be the candidate register to rename for
311 REG in THIS_HEAD chain. THIS_UNAVAILABLE is a set of unavailable hard
315 check_new_reg_p (int reg ATTRIBUTE_UNUSED
, int new_reg
,
316 struct du_head
*this_head
, HARD_REG_SET this_unavailable
)
318 machine_mode mode
= GET_MODE (*this_head
->first
->loc
);
319 int nregs
= hard_regno_nregs
[new_reg
][mode
];
321 struct du_chain
*tmp
;
323 for (i
= nregs
- 1; i
>= 0; --i
)
324 if (TEST_HARD_REG_BIT (this_unavailable
, new_reg
+ i
)
325 || fixed_regs
[new_reg
+ i
]
326 || global_regs
[new_reg
+ i
]
327 /* Can't use regs which aren't saved by the prologue. */
328 || (! df_regs_ever_live_p (new_reg
+ i
)
329 && ! call_used_regs
[new_reg
+ i
])
330 #ifdef LEAF_REGISTERS
331 /* We can't use a non-leaf register if we're in a
334 && !LEAF_REGISTERS
[new_reg
+ i
])
336 || ! HARD_REGNO_RENAME_OK (reg
+ i
, new_reg
+ i
))
339 /* See whether it accepts all modes that occur in
340 definition and uses. */
341 for (tmp
= this_head
->first
; tmp
; tmp
= tmp
->next_use
)
342 if ((! HARD_REGNO_MODE_OK (new_reg
, GET_MODE (*tmp
->loc
))
343 && ! DEBUG_INSN_P (tmp
->insn
))
344 || (this_head
->need_caller_save_reg
345 && ! (HARD_REGNO_CALL_PART_CLOBBERED
346 (reg
, GET_MODE (*tmp
->loc
)))
347 && (HARD_REGNO_CALL_PART_CLOBBERED
348 (new_reg
, GET_MODE (*tmp
->loc
)))))
354 /* For the chain THIS_HEAD, compute and return the best register to
355 rename to. SUPER_CLASS is the superunion of register classes in
356 the chain. UNAVAILABLE is a set of registers that cannot be used.
357 OLD_REG is the register currently used for the chain. BEST_RENAME
358 controls whether the register chosen must be better than the
359 current one or just respect the given constraint. */
362 find_rename_reg (du_head_p this_head
, enum reg_class super_class
,
363 HARD_REG_SET
*unavailable
, int old_reg
, bool best_rename
)
365 bool has_preferred_class
;
366 enum reg_class preferred_class
;
368 int best_new_reg
= old_reg
;
370 /* Further narrow the set of registers we can use for renaming.
371 If the chain needs a call-saved register, mark the call-used
372 registers as unavailable. */
373 if (this_head
->need_caller_save_reg
)
374 IOR_HARD_REG_SET (*unavailable
, call_used_reg_set
);
376 /* Mark registers that overlap this chain's lifetime as unavailable. */
377 merge_overlapping_regs (unavailable
, this_head
);
379 /* Compute preferred rename class of super union of all the classes
382 = (enum reg_class
) targetm
.preferred_rename_class (super_class
);
384 /* If PREFERRED_CLASS is not NO_REGS, we iterate in the first pass
385 over registers that belong to PREFERRED_CLASS and try to find the
386 best register within the class. If that failed, we iterate in
387 the second pass over registers that don't belong to the class.
388 If PREFERRED_CLASS is NO_REGS, we iterate over all registers in
389 ascending order without any preference. */
390 has_preferred_class
= (preferred_class
!= NO_REGS
);
391 for (pass
= (has_preferred_class
? 0 : 1); pass
< 2; pass
++)
394 for (new_reg
= 0; new_reg
< FIRST_PSEUDO_REGISTER
; new_reg
++)
396 if (has_preferred_class
398 != TEST_HARD_REG_BIT (reg_class_contents
[preferred_class
],
402 if (!check_new_reg_p (old_reg
, new_reg
, this_head
, *unavailable
))
408 /* In the first pass, we force the renaming of registers that
409 don't belong to PREFERRED_CLASS to registers that do, even
410 though the latters were used not very long ago. */
412 && !TEST_HARD_REG_BIT (reg_class_contents
[preferred_class
],
414 || tick
[best_new_reg
] > tick
[new_reg
])
415 best_new_reg
= new_reg
;
417 if (pass
== 0 && best_new_reg
!= old_reg
)
423 /* Perform register renaming on the current function. */
427 HARD_REG_SET unavailable
;
431 memset (tick
, 0, sizeof tick
);
433 CLEAR_HARD_REG_SET (unavailable
);
434 /* Don't clobber traceback for noreturn functions. */
435 if (frame_pointer_needed
)
437 add_to_hard_reg_set (&unavailable
, Pmode
, FRAME_POINTER_REGNUM
);
438 if (!HARD_FRAME_POINTER_IS_FRAME_POINTER
)
439 add_to_hard_reg_set (&unavailable
, Pmode
, HARD_FRAME_POINTER_REGNUM
);
442 FOR_EACH_VEC_ELT (id_to_chain
, i
, this_head
)
446 struct du_chain
*tmp
;
447 HARD_REG_SET this_unavailable
;
448 int reg
= this_head
->regno
;
449 enum reg_class super_class
= NO_REGS
;
451 if (this_head
->cannot_rename
)
454 if (fixed_regs
[reg
] || global_regs
[reg
]
455 #if !HARD_FRAME_POINTER_IS_FRAME_POINTER
456 || (frame_pointer_needed
&& reg
== HARD_FRAME_POINTER_REGNUM
)
458 || (frame_pointer_needed
&& reg
== FRAME_POINTER_REGNUM
)
463 COPY_HARD_REG_SET (this_unavailable
, unavailable
);
465 /* Iterate over elements in the chain in order to:
466 1. Count number of uses, and narrow the set of registers we can
468 2. Compute the superunion of register classes in this chain. */
470 super_class
= NO_REGS
;
471 for (tmp
= this_head
->first
; tmp
; tmp
= tmp
->next_use
)
473 if (DEBUG_INSN_P (tmp
->insn
))
476 IOR_COMPL_HARD_REG_SET (this_unavailable
,
477 reg_class_contents
[tmp
->cl
]);
479 = reg_class_superunion
[(int) super_class
][(int) tmp
->cl
];
485 best_new_reg
= find_rename_reg (this_head
, super_class
,
486 &this_unavailable
, reg
, true);
490 fprintf (dump_file
, "Register %s in insn %d",
491 reg_names
[reg
], INSN_UID (this_head
->first
->insn
));
492 if (this_head
->need_caller_save_reg
)
493 fprintf (dump_file
, " crosses a call");
496 if (best_new_reg
== reg
)
498 tick
[reg
] = ++this_tick
;
500 fprintf (dump_file
, "; no available better choice\n");
505 fprintf (dump_file
, ", renamed as %s\n", reg_names
[best_new_reg
]);
507 regrename_do_replace (this_head
, best_new_reg
);
508 tick
[best_new_reg
] = ++this_tick
;
509 df_set_regs_ever_live (best_new_reg
, true);
513 /* A structure to record information for each hard register at the start of
515 struct incoming_reg_info
{
516 /* Holds the number of registers used in the chain that gave us information
517 about this register. Zero means no information known yet, while a
518 negative value is used for something that is part of, but not the first
519 register in a multi-register value. */
521 /* Set to true if we have accesses that conflict in the number of registers
526 /* A structure recording information about each basic block. It is saved
527 and restored around basic block boundaries.
528 A pointer to such a structure is stored in each basic block's aux field
529 during regrename_analyze, except for blocks we know can't be optimized
530 (such as entry and exit blocks). */
531 struct bb_rename_info
533 /* The basic block corresponding to this structure. */
535 /* Copies of the global information. */
536 bitmap_head open_chains_set
;
537 bitmap_head incoming_open_chains_set
;
538 struct incoming_reg_info incoming
[FIRST_PSEUDO_REGISTER
];
541 /* Initialize a rename_info structure P for basic block BB, which starts a new
544 init_rename_info (struct bb_rename_info
*p
, basic_block bb
)
548 HARD_REG_SET start_chains_set
;
551 bitmap_initialize (&p
->open_chains_set
, &bitmap_default_obstack
);
552 bitmap_initialize (&p
->incoming_open_chains_set
, &bitmap_default_obstack
);
555 bitmap_clear (&open_chains_set
);
557 CLEAR_HARD_REG_SET (live_in_chains
);
558 REG_SET_TO_HARD_REG_SET (live_hard_regs
, df_get_live_in (bb
));
559 FOR_EACH_ARTIFICIAL_DEF (def
, bb
->index
)
560 if (DF_REF_FLAGS (def
) & DF_REF_AT_TOP
)
561 SET_HARD_REG_BIT (live_hard_regs
, DF_REF_REGNO (def
));
563 /* Open chains based on information from (at least one) predecessor
564 block. This gives us a chance later on to combine chains across
565 basic block boundaries. Inconsistencies (in access sizes) will
566 be caught normally and dealt with conservatively by disabling the
567 chain for renaming, and there is no risk of losing optimization
568 opportunities by opening chains either: if we did not open the
569 chains, we'd have to track the live register as a hard reg, and
570 we'd be unable to rename it in any case. */
571 CLEAR_HARD_REG_SET (start_chains_set
);
572 for (i
= 0; i
< FIRST_PSEUDO_REGISTER
; i
++)
574 struct incoming_reg_info
*iri
= p
->incoming
+ i
;
575 if (iri
->nregs
> 0 && !iri
->unusable
576 && range_in_hard_reg_set_p (live_hard_regs
, i
, iri
->nregs
))
578 SET_HARD_REG_BIT (start_chains_set
, i
);
579 remove_range_from_hard_reg_set (&live_hard_regs
, i
, iri
->nregs
);
582 for (i
= 0; i
< FIRST_PSEUDO_REGISTER
; i
++)
584 struct incoming_reg_info
*iri
= p
->incoming
+ i
;
585 if (TEST_HARD_REG_BIT (start_chains_set
, i
))
589 fprintf (dump_file
, "opening incoming chain\n");
590 chain
= create_new_chain (i
, iri
->nregs
, NULL
, NULL
, NO_REGS
);
591 bitmap_set_bit (&p
->incoming_open_chains_set
, chain
->id
);
596 /* Record in RI that the block corresponding to it has an incoming
597 live value, described by CHAIN. */
599 set_incoming_from_chain (struct bb_rename_info
*ri
, du_head_p chain
)
602 int incoming_nregs
= ri
->incoming
[chain
->regno
].nregs
;
605 /* If we've recorded the same information before, everything is fine. */
606 if (incoming_nregs
== chain
->nregs
)
609 fprintf (dump_file
, "reg %d/%d already recorded\n",
610 chain
->regno
, chain
->nregs
);
614 /* If we have no information for any of the involved registers, update
615 the incoming array. */
616 nregs
= chain
->nregs
;
618 if (ri
->incoming
[chain
->regno
+ nregs
].nregs
!= 0
619 || ri
->incoming
[chain
->regno
+ nregs
].unusable
)
623 nregs
= chain
->nregs
;
624 ri
->incoming
[chain
->regno
].nregs
= nregs
;
626 ri
->incoming
[chain
->regno
+ nregs
].nregs
= -nregs
;
628 fprintf (dump_file
, "recorded reg %d/%d\n",
629 chain
->regno
, chain
->nregs
);
633 /* There must be some kind of conflict. Prevent both the old and
634 new ranges from being used. */
635 if (incoming_nregs
< 0)
636 ri
->incoming
[chain
->regno
+ incoming_nregs
].unusable
= true;
637 for (i
= 0; i
< chain
->nregs
; i
++)
638 ri
->incoming
[chain
->regno
+ i
].unusable
= true;
641 /* Merge the two chains C1 and C2 so that all conflict information is
642 recorded and C1, and the id of C2 is changed to that of C1. */
644 merge_chains (du_head_p c1
, du_head_p c2
)
649 if (c2
->first
!= NULL
)
651 if (c1
->first
== NULL
)
652 c1
->first
= c2
->first
;
654 c1
->last
->next_use
= c2
->first
;
658 c2
->first
= c2
->last
= NULL
;
661 IOR_HARD_REG_SET (c1
->hard_conflicts
, c2
->hard_conflicts
);
662 bitmap_ior_into (&c1
->conflicts
, &c2
->conflicts
);
664 c1
->need_caller_save_reg
|= c2
->need_caller_save_reg
;
665 c1
->cannot_rename
|= c2
->cannot_rename
;
668 /* Analyze the current function and build chains for renaming. */
671 regrename_analyze (bitmap bb_mask
)
673 struct bb_rename_info
*rename_info
;
677 int *inverse_postorder
;
679 inverse_postorder
= XNEWVEC (int, last_basic_block_for_fn (cfun
));
680 n_bbs
= pre_and_rev_post_order_compute (NULL
, inverse_postorder
, false);
682 /* Gather some information about the blocks in this function. */
683 rename_info
= XCNEWVEC (struct bb_rename_info
, n_basic_blocks_for_fn (cfun
));
685 FOR_EACH_BB_FN (bb
, cfun
)
687 struct bb_rename_info
*ri
= rename_info
+ i
;
689 if (bb_mask
!= NULL
&& !bitmap_bit_p (bb_mask
, bb
->index
))
697 id_to_chain
.create (0);
698 bitmap_initialize (&open_chains_set
, &bitmap_default_obstack
);
700 /* The order in which we visit blocks ensures that whenever
701 possible, we only process a block after at least one of its
702 predecessors, which provides a "seeding" effect to make the logic
703 in set_incoming_from_chain and init_rename_info useful. */
705 for (i
= 0; i
< n_bbs
; i
++)
707 basic_block bb1
= BASIC_BLOCK_FOR_FN (cfun
, inverse_postorder
[i
]);
708 struct bb_rename_info
*this_info
;
712 int old_length
= id_to_chain
.length ();
714 this_info
= (struct bb_rename_info
*) bb1
->aux
;
715 if (this_info
== NULL
)
719 fprintf (dump_file
, "\nprocessing block %d:\n", bb1
->index
);
721 init_rename_info (this_info
, bb1
);
723 success
= build_def_use (bb1
);
727 fprintf (dump_file
, "failed\n");
729 id_to_chain
.truncate (old_length
);
730 current_id
= old_length
;
731 bitmap_clear (&this_info
->incoming_open_chains_set
);
733 if (insn_rr
.exists ())
736 FOR_BB_INSNS (bb1
, insn
)
738 insn_rr_info
*p
= &insn_rr
[INSN_UID (insn
)];
746 dump_def_use_chain (old_length
);
747 bitmap_copy (&this_info
->open_chains_set
, &open_chains_set
);
749 /* Add successor blocks to the worklist if necessary, and record
750 data about our own open chains at the end of this block, which
751 will be used to pre-open chains when processing the successors. */
752 FOR_EACH_EDGE (e
, ei
, bb1
->succs
)
754 struct bb_rename_info
*dest_ri
;
755 struct du_head
*chain
;
758 fprintf (dump_file
, "successor block %d\n", e
->dest
->index
);
760 if (e
->flags
& (EDGE_EH
| EDGE_ABNORMAL
))
762 dest_ri
= (struct bb_rename_info
*)e
->dest
->aux
;
765 for (chain
= open_chains
; chain
; chain
= chain
->next_chain
)
766 set_incoming_from_chain (dest_ri
, chain
);
770 free (inverse_postorder
);
772 /* Now, combine the chains data we have gathered across basic block
775 For every basic block, there may be chains open at the start, or at the
776 end. Rather than exclude them from renaming, we look for open chains
777 with matching registers at the other side of the CFG edge.
779 For a given chain using register R, open at the start of block B, we
780 must find an open chain using R on the other side of every edge leading
781 to B, if the register is live across this edge. In the code below,
782 N_PREDS_USED counts the number of edges where the register is live, and
783 N_PREDS_JOINED counts those where we found an appropriate chain for
786 We perform the analysis for both incoming and outgoing edges, but we
787 only need to merge once (in the second part, after verifying outgoing
789 FOR_EACH_BB_FN (bb
, cfun
)
791 struct bb_rename_info
*bb_ri
= (struct bb_rename_info
*) bb
->aux
;
799 fprintf (dump_file
, "processing bb %d in edges\n", bb
->index
);
801 EXECUTE_IF_SET_IN_BITMAP (&bb_ri
->incoming_open_chains_set
, 0, j
, bi
)
805 struct du_head
*chain
= regrename_chain_from_id (j
);
806 int n_preds_used
= 0, n_preds_joined
= 0;
808 FOR_EACH_EDGE (e
, ei
, bb
->preds
)
810 struct bb_rename_info
*src_ri
;
814 bool success
= false;
816 REG_SET_TO_HARD_REG_SET (live
, df_get_live_out (e
->src
));
817 if (!range_overlaps_hard_reg_set_p (live
, chain
->regno
,
822 if (e
->flags
& (EDGE_EH
| EDGE_ABNORMAL
))
825 src_ri
= (struct bb_rename_info
*)e
->src
->aux
;
829 EXECUTE_IF_SET_IN_BITMAP (&src_ri
->open_chains_set
,
832 struct du_head
*outgoing_chain
= regrename_chain_from_id (k
);
834 if (outgoing_chain
->regno
== chain
->regno
835 && outgoing_chain
->nregs
== chain
->nregs
)
842 if (!success
&& dump_file
)
843 fprintf (dump_file
, "failure to match with pred block %d\n",
846 if (n_preds_joined
< n_preds_used
)
849 fprintf (dump_file
, "cannot rename chain %d\n", j
);
850 chain
->cannot_rename
= 1;
854 FOR_EACH_BB_FN (bb
, cfun
)
856 struct bb_rename_info
*bb_ri
= (struct bb_rename_info
*) bb
->aux
;
864 fprintf (dump_file
, "processing bb %d out edges\n", bb
->index
);
866 EXECUTE_IF_SET_IN_BITMAP (&bb_ri
->open_chains_set
, 0, j
, bi
)
870 struct du_head
*chain
= regrename_chain_from_id (j
);
871 int n_succs_used
= 0, n_succs_joined
= 0;
873 FOR_EACH_EDGE (e
, ei
, bb
->succs
)
875 bool printed
= false;
876 struct bb_rename_info
*dest_ri
;
881 REG_SET_TO_HARD_REG_SET (live
, df_get_live_in (e
->dest
));
882 if (!range_overlaps_hard_reg_set_p (live
, chain
->regno
,
888 dest_ri
= (struct bb_rename_info
*)e
->dest
->aux
;
892 EXECUTE_IF_SET_IN_BITMAP (&dest_ri
->incoming_open_chains_set
,
895 struct du_head
*incoming_chain
= regrename_chain_from_id (k
);
897 if (incoming_chain
->regno
== chain
->regno
898 && incoming_chain
->nregs
== chain
->nregs
)
904 "merging blocks for edge %d -> %d\n",
905 e
->src
->index
, e
->dest
->index
);
908 " merging chains %d (->%d) and %d (->%d) [%s]\n",
909 k
, incoming_chain
->id
, j
, chain
->id
,
910 reg_names
[incoming_chain
->regno
]);
913 merge_chains (chain
, incoming_chain
);
919 if (n_succs_joined
< n_succs_used
)
922 fprintf (dump_file
, "cannot rename chain %d\n",
924 chain
->cannot_rename
= 1;
931 FOR_EACH_BB_FN (bb
, cfun
)
936 regrename_do_replace (struct du_head
*head
, int reg
)
938 struct du_chain
*chain
;
939 unsigned int base_regno
= head
->regno
;
942 for (chain
= head
->first
; chain
; chain
= chain
->next_use
)
944 unsigned int regno
= ORIGINAL_REGNO (*chain
->loc
);
945 struct reg_attrs
*attr
= REG_ATTRS (*chain
->loc
);
946 int reg_ptr
= REG_POINTER (*chain
->loc
);
948 if (DEBUG_INSN_P (chain
->insn
) && REGNO (*chain
->loc
) != base_regno
)
949 INSN_VAR_LOCATION_LOC (chain
->insn
) = gen_rtx_UNKNOWN_VAR_LOC ();
952 *chain
->loc
= gen_raw_REG (GET_MODE (*chain
->loc
), reg
);
953 if (regno
>= FIRST_PSEUDO_REGISTER
)
954 ORIGINAL_REGNO (*chain
->loc
) = regno
;
955 REG_ATTRS (*chain
->loc
) = attr
;
956 REG_POINTER (*chain
->loc
) = reg_ptr
;
959 df_insn_rescan (chain
->insn
);
962 mode
= GET_MODE (*head
->first
->loc
);
964 head
->nregs
= hard_regno_nregs
[reg
][mode
];
968 /* True if we found a register with a size mismatch, which means that we
969 can't track its lifetime accurately. If so, we abort the current block
971 static bool fail_current_block
;
973 /* Return true if OP is a reg for which all bits are set in PSET, false
974 if all bits are clear.
975 In other cases, set fail_current_block and return false. */
978 verify_reg_in_set (rtx op
, HARD_REG_SET
*pset
)
980 unsigned regno
, nregs
;
981 bool all_live
, all_dead
;
986 nregs
= REG_NREGS (op
);
987 all_live
= all_dead
= true;
989 if (TEST_HARD_REG_BIT (*pset
, regno
+ nregs
))
993 if (!all_dead
&& !all_live
)
995 fail_current_block
= true;
1001 /* Return true if OP is a reg that is being tracked already in some form.
1002 May set fail_current_block if it sees an unhandled case of overlap. */
1005 verify_reg_tracked (rtx op
)
1007 return (verify_reg_in_set (op
, &live_hard_regs
)
1008 || verify_reg_in_set (op
, &live_in_chains
));
1011 /* Called through note_stores. DATA points to a rtx_code, either SET or
1012 CLOBBER, which tells us which kind of rtx to look at. If we have a
1013 match, record the set register in live_hard_regs and in the hard_conflicts
1014 bitmap of open chains. */
1017 note_sets_clobbers (rtx x
, const_rtx set
, void *data
)
1019 enum rtx_code code
= *(enum rtx_code
*)data
;
1020 struct du_head
*chain
;
1022 if (GET_CODE (x
) == SUBREG
)
1024 if (!REG_P (x
) || GET_CODE (set
) != code
)
1026 /* There must not be pseudos at this point. */
1027 gcc_assert (HARD_REGISTER_P (x
));
1028 add_to_hard_reg_set (&live_hard_regs
, GET_MODE (x
), REGNO (x
));
1029 for (chain
= open_chains
; chain
; chain
= chain
->next_chain
)
1030 add_to_hard_reg_set (&chain
->hard_conflicts
, GET_MODE (x
), REGNO (x
));
1034 scan_rtx_reg (rtx_insn
*insn
, rtx
*loc
, enum reg_class cl
, enum scan_actions action
,
1039 unsigned this_regno
= REGNO (x
);
1040 int this_nregs
= REG_NREGS (x
);
1042 if (action
== mark_write
)
1045 create_new_chain (this_regno
, this_nregs
, loc
, insn
, cl
);
1049 if ((type
== OP_OUT
) != (action
== terminate_write
|| action
== mark_access
))
1052 for (p
= &open_chains
; *p
;)
1054 struct du_head
*head
= *p
;
1055 struct du_head
*next
= head
->next_chain
;
1056 int exact_match
= (head
->regno
== this_regno
1057 && head
->nregs
== this_nregs
);
1058 int superset
= (this_regno
<= head
->regno
1059 && this_regno
+ this_nregs
>= head
->regno
+ head
->nregs
);
1060 int subset
= (this_regno
>= head
->regno
1061 && this_regno
+ this_nregs
<= head
->regno
+ head
->nregs
);
1063 if (!bitmap_bit_p (&open_chains_set
, head
->id
)
1064 || head
->regno
+ head
->nregs
<= this_regno
1065 || this_regno
+ this_nregs
<= head
->regno
)
1067 p
= &head
->next_chain
;
1071 if (action
== mark_read
|| action
== mark_access
)
1073 /* ??? Class NO_REGS can happen if the md file makes use of
1074 EXTRA_CONSTRAINTS to match registers. Which is arguably
1075 wrong, but there we are. */
1077 if (cl
== NO_REGS
|| (!exact_match
&& !DEBUG_INSN_P (insn
)))
1081 "Cannot rename chain %s (%d) at insn %d (%s)\n",
1082 reg_names
[head
->regno
], head
->id
, INSN_UID (insn
),
1083 scan_actions_name
[(int) action
]);
1084 head
->cannot_rename
= 1;
1087 unsigned nregs
= this_nregs
;
1088 head
->regno
= this_regno
;
1089 head
->nregs
= this_nregs
;
1091 SET_HARD_REG_BIT (live_in_chains
, head
->regno
+ nregs
);
1094 "Widening register in chain %s (%d) at insn %d\n",
1095 reg_names
[head
->regno
], head
->id
, INSN_UID (insn
));
1099 fail_current_block
= true;
1102 "Failing basic block due to unhandled overlap\n");
1107 struct du_chain
*this_du
;
1108 this_du
= XOBNEW (&rename_obstack
, struct du_chain
);
1109 this_du
->next_use
= 0;
1111 this_du
->insn
= insn
;
1113 if (head
->first
== NULL
)
1114 head
->first
= this_du
;
1116 head
->last
->next_use
= this_du
;
1117 record_operand_use (head
, this_du
);
1118 head
->last
= this_du
;
1120 /* Avoid adding the same location in a DEBUG_INSN multiple times,
1121 which could happen with non-exact overlap. */
1122 if (DEBUG_INSN_P (insn
))
1124 /* Otherwise, find any other chains that do not match exactly;
1125 ensure they all get marked unrenamable. */
1126 p
= &head
->next_chain
;
1130 /* Whether the terminated chain can be used for renaming
1131 depends on the action and this being an exact match.
1132 In either case, we remove this element from open_chains. */
1134 if ((action
== terminate_dead
|| action
== terminate_write
)
1135 && (superset
|| subset
))
1139 if (subset
&& !superset
)
1140 head
->cannot_rename
= 1;
1141 bitmap_clear_bit (&open_chains_set
, head
->id
);
1143 nregs
= head
->nregs
;
1146 CLEAR_HARD_REG_BIT (live_in_chains
, head
->regno
+ nregs
);
1147 if (subset
&& !superset
1148 && (head
->regno
+ nregs
< this_regno
1149 || head
->regno
+ nregs
>= this_regno
+ this_nregs
))
1150 SET_HARD_REG_BIT (live_hard_regs
, head
->regno
+ nregs
);
1156 "Closing chain %s (%d) at insn %d (%s%s)\n",
1157 reg_names
[head
->regno
], head
->id
, INSN_UID (insn
),
1158 scan_actions_name
[(int) action
],
1159 superset
? ", superset" : subset
? ", subset" : "");
1161 else if (action
== terminate_dead
|| action
== terminate_write
)
1163 /* In this case, tracking liveness gets too hard. Fail the
1164 entire basic block. */
1167 "Failing basic block due to unhandled overlap\n");
1168 fail_current_block
= true;
1173 head
->cannot_rename
= 1;
1176 "Cannot rename chain %s (%d) at insn %d (%s)\n",
1177 reg_names
[head
->regno
], head
->id
, INSN_UID (insn
),
1178 scan_actions_name
[(int) action
]);
1179 p
= &head
->next_chain
;
1184 /* Adapted from find_reloads_address_1. CL is INDEX_REG_CLASS or
1185 BASE_REG_CLASS depending on how the register is being considered. */
1188 scan_rtx_address (rtx_insn
*insn
, rtx
*loc
, enum reg_class cl
,
1189 enum scan_actions action
, machine_mode mode
,
1193 RTX_CODE code
= GET_CODE (x
);
1197 if (action
== mark_write
|| action
== mark_access
)
1204 rtx orig_op0
= XEXP (x
, 0);
1205 rtx orig_op1
= XEXP (x
, 1);
1206 RTX_CODE code0
= GET_CODE (orig_op0
);
1207 RTX_CODE code1
= GET_CODE (orig_op1
);
1212 enum rtx_code index_code
= SCRATCH
;
1214 if (GET_CODE (op0
) == SUBREG
)
1216 op0
= SUBREG_REG (op0
);
1217 code0
= GET_CODE (op0
);
1220 if (GET_CODE (op1
) == SUBREG
)
1222 op1
= SUBREG_REG (op1
);
1223 code1
= GET_CODE (op1
);
1226 if (code0
== MULT
|| code0
== SIGN_EXTEND
|| code0
== TRUNCATE
1227 || code0
== ZERO_EXTEND
|| code1
== MEM
)
1229 locI
= &XEXP (x
, 0);
1230 locB
= &XEXP (x
, 1);
1231 index_code
= GET_CODE (*locI
);
1233 else if (code1
== MULT
|| code1
== SIGN_EXTEND
|| code1
== TRUNCATE
1234 || code1
== ZERO_EXTEND
|| code0
== MEM
)
1236 locI
= &XEXP (x
, 1);
1237 locB
= &XEXP (x
, 0);
1238 index_code
= GET_CODE (*locI
);
1240 else if (code0
== CONST_INT
|| code0
== CONST
1241 || code0
== SYMBOL_REF
|| code0
== LABEL_REF
)
1243 locB
= &XEXP (x
, 1);
1244 index_code
= GET_CODE (XEXP (x
, 0));
1246 else if (code1
== CONST_INT
|| code1
== CONST
1247 || code1
== SYMBOL_REF
|| code1
== LABEL_REF
)
1249 locB
= &XEXP (x
, 0);
1250 index_code
= GET_CODE (XEXP (x
, 1));
1252 else if (code0
== REG
&& code1
== REG
)
1255 unsigned regno0
= REGNO (op0
), regno1
= REGNO (op1
);
1257 if (REGNO_OK_FOR_INDEX_P (regno1
)
1258 && regno_ok_for_base_p (regno0
, mode
, as
, PLUS
, REG
))
1260 else if (REGNO_OK_FOR_INDEX_P (regno0
)
1261 && regno_ok_for_base_p (regno1
, mode
, as
, PLUS
, REG
))
1263 else if (regno_ok_for_base_p (regno0
, mode
, as
, PLUS
, REG
)
1264 || REGNO_OK_FOR_INDEX_P (regno1
))
1266 else if (regno_ok_for_base_p (regno1
, mode
, as
, PLUS
, REG
))
1271 locI
= &XEXP (x
, index_op
);
1272 locB
= &XEXP (x
, !index_op
);
1273 index_code
= GET_CODE (*locI
);
1275 else if (code0
== REG
)
1277 locI
= &XEXP (x
, 0);
1278 locB
= &XEXP (x
, 1);
1279 index_code
= GET_CODE (*locI
);
1281 else if (code1
== REG
)
1283 locI
= &XEXP (x
, 1);
1284 locB
= &XEXP (x
, 0);
1285 index_code
= GET_CODE (*locI
);
1289 scan_rtx_address (insn
, locI
, INDEX_REG_CLASS
, action
, mode
, as
);
1291 scan_rtx_address (insn
, locB
,
1292 base_reg_class (mode
, as
, PLUS
, index_code
),
1304 #ifndef AUTO_INC_DEC
1305 /* If the target doesn't claim to handle autoinc, this must be
1306 something special, like a stack push. Kill this chain. */
1307 action
= mark_all_read
;
1312 scan_rtx_address (insn
, &XEXP (x
, 0),
1313 base_reg_class (GET_MODE (x
), MEM_ADDR_SPACE (x
),
1315 action
, GET_MODE (x
), MEM_ADDR_SPACE (x
));
1319 scan_rtx_reg (insn
, loc
, cl
, action
, OP_IN
);
1326 fmt
= GET_RTX_FORMAT (code
);
1327 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
1330 scan_rtx_address (insn
, &XEXP (x
, i
), cl
, action
, mode
, as
);
1331 else if (fmt
[i
] == 'E')
1332 for (j
= XVECLEN (x
, i
) - 1; j
>= 0; j
--)
1333 scan_rtx_address (insn
, &XVECEXP (x
, i
, j
), cl
, action
, mode
, as
);
1338 scan_rtx (rtx_insn
*insn
, rtx
*loc
, enum reg_class cl
, enum scan_actions action
,
1343 enum rtx_code code
= GET_CODE (x
);
1346 code
= GET_CODE (x
);
1358 scan_rtx_reg (insn
, loc
, cl
, action
, type
);
1362 scan_rtx_address (insn
, &XEXP (x
, 0),
1363 base_reg_class (GET_MODE (x
), MEM_ADDR_SPACE (x
),
1365 action
, GET_MODE (x
), MEM_ADDR_SPACE (x
));
1369 scan_rtx (insn
, &SET_SRC (x
), cl
, action
, OP_IN
);
1370 scan_rtx (insn
, &SET_DEST (x
), cl
, action
,
1371 (GET_CODE (PATTERN (insn
)) == COND_EXEC
1372 && verify_reg_tracked (SET_DEST (x
))) ? OP_INOUT
: OP_OUT
);
1375 case STRICT_LOW_PART
:
1376 scan_rtx (insn
, &XEXP (x
, 0), cl
, action
,
1377 verify_reg_tracked (XEXP (x
, 0)) ? OP_INOUT
: OP_OUT
);
1382 scan_rtx (insn
, &XEXP (x
, 0), cl
, action
,
1383 (type
== OP_IN
? OP_IN
:
1384 verify_reg_tracked (XEXP (x
, 0)) ? OP_INOUT
: OP_OUT
));
1385 scan_rtx (insn
, &XEXP (x
, 1), cl
, action
, OP_IN
);
1386 scan_rtx (insn
, &XEXP (x
, 2), cl
, action
, OP_IN
);
1395 /* Should only happen inside MEM. */
1399 scan_rtx (insn
, &SET_DEST (x
), cl
, action
,
1400 (GET_CODE (PATTERN (insn
)) == COND_EXEC
1401 && verify_reg_tracked (SET_DEST (x
))) ? OP_INOUT
: OP_OUT
);
1405 scan_rtx (insn
, &XEXP (x
, 0), cl
, action
, type
);
1407 scan_rtx (insn
, &XEXP (x
, 1), cl
, action
, type
);
1414 fmt
= GET_RTX_FORMAT (code
);
1415 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
1418 scan_rtx (insn
, &XEXP (x
, i
), cl
, action
, type
);
1419 else if (fmt
[i
] == 'E')
1420 for (j
= XVECLEN (x
, i
) - 1; j
>= 0; j
--)
1421 scan_rtx (insn
, &XVECEXP (x
, i
, j
), cl
, action
, type
);
1425 /* Hide operands of the current insn (of which there are N_OPS) by
1426 substituting cc0 for them.
1427 Previous values are stored in the OLD_OPERANDS and OLD_DUPS.
1428 For every bit set in DO_NOT_HIDE, we leave the operand alone.
1429 If INOUT_AND_EC_ONLY is set, we only do this for OP_INOUT type operands
1430 and earlyclobbers. */
1433 hide_operands (int n_ops
, rtx
*old_operands
, rtx
*old_dups
,
1434 unsigned HOST_WIDE_INT do_not_hide
, bool inout_and_ec_only
)
1437 const operand_alternative
*op_alt
= which_op_alt ();
1438 for (i
= 0; i
< n_ops
; i
++)
1440 old_operands
[i
] = recog_data
.operand
[i
];
1441 /* Don't squash match_operator or match_parallel here, since
1442 we don't know that all of the contained registers are
1443 reachable by proper operands. */
1444 if (recog_data
.constraints
[i
][0] == '\0')
1446 if (do_not_hide
& (1 << i
))
1448 if (!inout_and_ec_only
|| recog_data
.operand_type
[i
] == OP_INOUT
1449 || op_alt
[i
].earlyclobber
)
1450 *recog_data
.operand_loc
[i
] = cc0_rtx
;
1452 for (i
= 0; i
< recog_data
.n_dups
; i
++)
1454 int opn
= recog_data
.dup_num
[i
];
1455 old_dups
[i
] = *recog_data
.dup_loc
[i
];
1456 if (do_not_hide
& (1 << opn
))
1458 if (!inout_and_ec_only
|| recog_data
.operand_type
[opn
] == OP_INOUT
1459 || op_alt
[opn
].earlyclobber
)
1460 *recog_data
.dup_loc
[i
] = cc0_rtx
;
1464 /* Undo the substitution performed by hide_operands. INSN is the insn we
1465 are processing; the arguments are the same as in hide_operands. */
1468 restore_operands (rtx_insn
*insn
, int n_ops
, rtx
*old_operands
, rtx
*old_dups
)
1471 for (i
= 0; i
< recog_data
.n_dups
; i
++)
1472 *recog_data
.dup_loc
[i
] = old_dups
[i
];
1473 for (i
= 0; i
< n_ops
; i
++)
1474 *recog_data
.operand_loc
[i
] = old_operands
[i
];
1475 if (recog_data
.n_dups
)
1476 df_insn_rescan (insn
);
1479 /* For each output operand of INSN, call scan_rtx to create a new
1480 open chain. Do this only for normal or earlyclobber outputs,
1481 depending on EARLYCLOBBER. If INSN_INFO is nonnull, use it to
1482 record information about the operands in the insn. */
1485 record_out_operands (rtx_insn
*insn
, bool earlyclobber
, insn_rr_info
*insn_info
)
1487 int n_ops
= recog_data
.n_operands
;
1488 const operand_alternative
*op_alt
= which_op_alt ();
1492 for (i
= 0; i
< n_ops
+ recog_data
.n_dups
; i
++)
1494 int opn
= i
< n_ops
? i
: recog_data
.dup_num
[i
- n_ops
];
1495 rtx
*loc
= (i
< n_ops
1496 ? recog_data
.operand_loc
[opn
]
1497 : recog_data
.dup_loc
[i
- n_ops
]);
1499 enum reg_class cl
= alternative_class (op_alt
, opn
);
1501 struct du_head
*prev_open
;
1503 if (recog_data
.operand_type
[opn
] != OP_OUT
1504 || op_alt
[opn
].earlyclobber
!= earlyclobber
)
1508 cur_operand
= insn_info
->op_info
+ i
;
1510 prev_open
= open_chains
;
1511 scan_rtx (insn
, loc
, cl
, mark_write
, OP_OUT
);
1513 /* ??? Many targets have output constraints on the SET_DEST
1514 of a call insn, which is stupid, since these are certainly
1515 ABI defined hard registers. For these, and for asm operands
1516 that originally referenced hard registers, we must record that
1517 the chain cannot be renamed. */
1519 || (asm_noperands (PATTERN (insn
)) > 0
1521 && REGNO (op
) == ORIGINAL_REGNO (op
)))
1523 if (prev_open
!= open_chains
)
1524 open_chains
->cannot_rename
= 1;
1530 /* Build def/use chain. */
1533 build_def_use (basic_block bb
)
1536 unsigned HOST_WIDE_INT untracked_operands
;
1538 fail_current_block
= false;
1540 for (insn
= BB_HEAD (bb
); ; insn
= NEXT_INSN (insn
))
1542 if (NONDEBUG_INSN_P (insn
))
1546 rtx old_operands
[MAX_RECOG_OPERANDS
];
1547 rtx old_dups
[MAX_DUP_OPERANDS
];
1550 enum rtx_code set_code
= SET
;
1551 enum rtx_code clobber_code
= CLOBBER
;
1552 insn_rr_info
*insn_info
= NULL
;
1554 /* Process the insn, determining its effect on the def-use
1555 chains and live hard registers. We perform the following
1556 steps with the register references in the insn, simulating
1558 (1) Deal with earlyclobber operands and CLOBBERs of non-operands
1559 by creating chains and marking hard regs live.
1560 (2) Any read outside an operand causes any chain it overlaps
1561 with to be marked unrenamable.
1562 (3) Any read inside an operand is added if there's already
1563 an open chain for it.
1564 (4) For any REG_DEAD note we find, close open chains that
1566 (5) For any non-earlyclobber write we find, close open chains
1568 (6) For any non-earlyclobber write we find in an operand, make
1569 a new chain or mark the hard register as live.
1570 (7) For any REG_UNUSED, close any chains we just opened.
1572 We cannot deal with situations where we track a reg in one mode
1573 and see a reference in another mode; these will cause the chain
1574 to be marked unrenamable or even cause us to abort the entire
1577 extract_constrain_insn (insn
);
1578 preprocess_constraints (insn
);
1579 const operand_alternative
*op_alt
= which_op_alt ();
1580 n_ops
= recog_data
.n_operands
;
1581 untracked_operands
= 0;
1583 if (insn_rr
.exists ())
1585 insn_info
= &insn_rr
[INSN_UID (insn
)];
1586 insn_info
->op_info
= XOBNEWVEC (&rename_obstack
, operand_rr_info
,
1587 recog_data
.n_operands
);
1588 memset (insn_info
->op_info
, 0,
1589 sizeof (operand_rr_info
) * recog_data
.n_operands
);
1592 /* Simplify the code below by promoting OP_OUT to OP_INOUT in
1593 predicated instructions, but only for register operands
1594 that are already tracked, so that we can create a chain
1595 when the first SET makes a register live. */
1597 predicated
= GET_CODE (PATTERN (insn
)) == COND_EXEC
;
1598 for (i
= 0; i
< n_ops
; ++i
)
1600 rtx op
= recog_data
.operand
[i
];
1601 int matches
= op_alt
[i
].matches
;
1602 if (matches
>= 0 || op_alt
[i
].matched
>= 0
1603 || (predicated
&& recog_data
.operand_type
[i
] == OP_OUT
))
1605 recog_data
.operand_type
[i
] = OP_INOUT
;
1606 /* A special case to deal with instruction patterns that
1607 have matching operands with different modes. If we're
1608 not already tracking such a reg, we won't start here,
1609 and we must instead make sure to make the operand visible
1610 to the machinery that tracks hard registers. */
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
))
1625 && !verify_reg_tracked (op
))
1626 create_new_chain (REGNO (op
), REG_NREGS (op
), NULL
, NULL
,
1630 if (fail_current_block
)
1633 /* Step 1a: Mark hard registers that are clobbered in this insn,
1634 outside an operand, as live. */
1635 hide_operands (n_ops
, old_operands
, old_dups
, untracked_operands
,
1637 note_stores (PATTERN (insn
), note_sets_clobbers
, &clobber_code
);
1638 restore_operands (insn
, n_ops
, old_operands
, old_dups
);
1640 /* Step 1b: Begin new chains for earlyclobbered writes inside
1642 record_out_operands (insn
, true, insn_info
);
1644 /* Step 2: Mark chains for which we have reads outside operands
1646 We do this by munging all operands into CC0, and closing
1647 everything remaining. */
1649 hide_operands (n_ops
, old_operands
, old_dups
, untracked_operands
,
1651 scan_rtx (insn
, &PATTERN (insn
), NO_REGS
, mark_all_read
, OP_IN
);
1652 restore_operands (insn
, n_ops
, old_operands
, old_dups
);
1654 /* Step 2B: Can't rename function call argument registers. */
1655 if (CALL_P (insn
) && CALL_INSN_FUNCTION_USAGE (insn
))
1656 scan_rtx (insn
, &CALL_INSN_FUNCTION_USAGE (insn
),
1657 NO_REGS
, mark_all_read
, OP_IN
);
1659 /* Step 2C: Can't rename asm operands that were originally
1661 if (asm_noperands (PATTERN (insn
)) > 0)
1662 for (i
= 0; i
< n_ops
; i
++)
1664 rtx
*loc
= recog_data
.operand_loc
[i
];
1668 && REGNO (op
) == ORIGINAL_REGNO (op
)
1669 && (recog_data
.operand_type
[i
] == OP_IN
1670 || recog_data
.operand_type
[i
] == OP_INOUT
))
1671 scan_rtx (insn
, loc
, NO_REGS
, mark_all_read
, OP_IN
);
1674 /* Step 3: Append to chains for reads inside operands. */
1675 for (i
= 0; i
< n_ops
+ recog_data
.n_dups
; i
++)
1677 int opn
= i
< n_ops
? i
: recog_data
.dup_num
[i
- n_ops
];
1678 rtx
*loc
= (i
< n_ops
1679 ? recog_data
.operand_loc
[opn
]
1680 : recog_data
.dup_loc
[i
- n_ops
]);
1681 enum reg_class cl
= alternative_class (op_alt
, opn
);
1682 enum op_type type
= recog_data
.operand_type
[opn
];
1684 /* Don't scan match_operand here, since we've no reg class
1685 information to pass down. Any operands that we could
1686 substitute in will be represented elsewhere. */
1687 if (recog_data
.constraints
[opn
][0] == '\0'
1688 || untracked_operands
& (1 << opn
))
1692 cur_operand
= i
== opn
? insn_info
->op_info
+ i
: NULL
;
1693 if (op_alt
[opn
].is_address
)
1694 scan_rtx_address (insn
, loc
, cl
, mark_read
,
1695 VOIDmode
, ADDR_SPACE_GENERIC
);
1697 scan_rtx (insn
, loc
, cl
, mark_read
, type
);
1701 /* Step 3B: Record updates for regs in REG_INC notes, and
1702 source regs in REG_FRAME_RELATED_EXPR notes. */
1703 for (note
= REG_NOTES (insn
); note
; note
= XEXP (note
, 1))
1704 if (REG_NOTE_KIND (note
) == REG_INC
1705 || REG_NOTE_KIND (note
) == REG_FRAME_RELATED_EXPR
)
1706 scan_rtx (insn
, &XEXP (note
, 0), ALL_REGS
, mark_read
,
1709 /* Step 4: Close chains for registers that die here, unless
1710 the register is mentioned in a REG_UNUSED note. In that
1711 case we keep the chain open until step #7 below to ensure
1712 it conflicts with other output operands of this insn.
1713 See PR 52573. Arguably the insn should not have both
1714 notes; it has proven difficult to fix that without
1715 other undesirable side effects. */
1716 for (note
= REG_NOTES (insn
); note
; note
= XEXP (note
, 1))
1717 if (REG_NOTE_KIND (note
) == REG_DEAD
1718 && !find_regno_note (insn
, REG_UNUSED
, REGNO (XEXP (note
, 0))))
1720 remove_from_hard_reg_set (&live_hard_regs
,
1721 GET_MODE (XEXP (note
, 0)),
1722 REGNO (XEXP (note
, 0)));
1723 scan_rtx (insn
, &XEXP (note
, 0), NO_REGS
, terminate_dead
,
1727 /* Step 4B: If this is a call, any chain live at this point
1728 requires a caller-saved reg. */
1732 for (p
= open_chains
; p
; p
= p
->next_chain
)
1733 p
->need_caller_save_reg
= 1;
1736 /* Step 5: Close open chains that overlap writes. Similar to
1737 step 2, we hide in-out operands, since we do not want to
1738 close these chains. We also hide earlyclobber operands,
1739 since we've opened chains for them in step 1, and earlier
1740 chains they would overlap with must have been closed at
1741 the previous insn at the latest, as such operands cannot
1742 possibly overlap with any input operands. */
1744 hide_operands (n_ops
, old_operands
, old_dups
, untracked_operands
,
1746 scan_rtx (insn
, &PATTERN (insn
), NO_REGS
, terminate_write
, OP_IN
);
1747 restore_operands (insn
, n_ops
, old_operands
, old_dups
);
1749 /* Step 6a: Mark hard registers that are set in this insn,
1750 outside an operand, as live. */
1751 hide_operands (n_ops
, old_operands
, old_dups
, untracked_operands
,
1753 note_stores (PATTERN (insn
), note_sets_clobbers
, &set_code
);
1754 restore_operands (insn
, n_ops
, old_operands
, old_dups
);
1756 /* Step 6b: Begin new chains for writes inside operands. */
1757 record_out_operands (insn
, false, insn_info
);
1759 /* Step 6c: Record destination regs in REG_FRAME_RELATED_EXPR
1760 notes for update. */
1761 for (note
= REG_NOTES (insn
); note
; note
= XEXP (note
, 1))
1762 if (REG_NOTE_KIND (note
) == REG_FRAME_RELATED_EXPR
)
1763 scan_rtx (insn
, &XEXP (note
, 0), ALL_REGS
, mark_access
,
1766 /* Step 7: Close chains for registers that were never
1767 really used here. */
1768 for (note
= REG_NOTES (insn
); note
; note
= XEXP (note
, 1))
1769 if (REG_NOTE_KIND (note
) == REG_UNUSED
)
1771 remove_from_hard_reg_set (&live_hard_regs
,
1772 GET_MODE (XEXP (note
, 0)),
1773 REGNO (XEXP (note
, 0)));
1774 scan_rtx (insn
, &XEXP (note
, 0), NO_REGS
, terminate_dead
,
1778 else if (DEBUG_INSN_P (insn
)
1779 && !VAR_LOC_UNKNOWN_P (INSN_VAR_LOCATION_LOC (insn
)))
1781 scan_rtx (insn
, &INSN_VAR_LOCATION_LOC (insn
),
1782 ALL_REGS
, mark_read
, OP_IN
);
1784 if (insn
== BB_END (bb
))
1788 if (fail_current_block
)
1794 /* Initialize the register renamer. If INSN_INFO is true, ensure that
1795 insn_rr is nonnull. */
1797 regrename_init (bool insn_info
)
1799 gcc_obstack_init (&rename_obstack
);
1802 insn_rr
.safe_grow_cleared (get_max_uid ());
1805 /* Free all global data used by the register renamer. */
1807 regrename_finish (void)
1811 obstack_free (&rename_obstack
, NULL
);
1814 /* Perform register renaming on the current function. */
1817 regrename_optimize (void)
1819 df_set_flags (DF_LR_RUN_DCE
);
1820 df_note_add_problem ();
1822 df_set_flags (DF_DEFER_INSN_RESCAN
);
1824 regrename_init (false);
1826 regrename_analyze (NULL
);
1830 regrename_finish ();
1837 const pass_data pass_data_regrename
=
1839 RTL_PASS
, /* type */
1841 OPTGROUP_NONE
, /* optinfo_flags */
1842 TV_RENAME_REGISTERS
, /* tv_id */
1843 0, /* properties_required */
1844 0, /* properties_provided */
1845 0, /* properties_destroyed */
1846 0, /* todo_flags_start */
1847 TODO_df_finish
, /* todo_flags_finish */
1850 class pass_regrename
: public rtl_opt_pass
1853 pass_regrename (gcc::context
*ctxt
)
1854 : rtl_opt_pass (pass_data_regrename
, ctxt
)
1857 /* opt_pass methods: */
1858 virtual bool gate (function
*)
1860 return (optimize
> 0 && (flag_rename_registers
));
1863 virtual unsigned int execute (function
*) { return regrename_optimize (); }
1865 }; // class pass_regrename
1870 make_pass_regrename (gcc::context
*ctxt
)
1872 return new pass_regrename (ctxt
);