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
= hard_regno_nregs
[regno
][GET_MODE (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 machine_mode mode
= GET_MODE (x
);
1040 unsigned this_regno
= REGNO (x
);
1041 int this_nregs
= hard_regno_nregs
[this_regno
][mode
];
1043 if (action
== mark_write
)
1046 create_new_chain (this_regno
, this_nregs
, loc
, insn
, cl
);
1050 if ((type
== OP_OUT
) != (action
== terminate_write
|| action
== mark_access
))
1053 for (p
= &open_chains
; *p
;)
1055 struct du_head
*head
= *p
;
1056 struct du_head
*next
= head
->next_chain
;
1057 int exact_match
= (head
->regno
== this_regno
1058 && head
->nregs
== this_nregs
);
1059 int superset
= (this_regno
<= head
->regno
1060 && this_regno
+ this_nregs
>= head
->regno
+ head
->nregs
);
1061 int subset
= (this_regno
>= head
->regno
1062 && this_regno
+ this_nregs
<= head
->regno
+ head
->nregs
);
1064 if (!bitmap_bit_p (&open_chains_set
, head
->id
)
1065 || head
->regno
+ head
->nregs
<= this_regno
1066 || this_regno
+ this_nregs
<= head
->regno
)
1068 p
= &head
->next_chain
;
1072 if (action
== mark_read
|| action
== mark_access
)
1074 /* ??? Class NO_REGS can happen if the md file makes use of
1075 EXTRA_CONSTRAINTS to match registers. Which is arguably
1076 wrong, but there we are. */
1078 if (cl
== NO_REGS
|| (!exact_match
&& !DEBUG_INSN_P (insn
)))
1082 "Cannot rename chain %s (%d) at insn %d (%s)\n",
1083 reg_names
[head
->regno
], head
->id
, INSN_UID (insn
),
1084 scan_actions_name
[(int) action
]);
1085 head
->cannot_rename
= 1;
1088 unsigned nregs
= this_nregs
;
1089 head
->regno
= this_regno
;
1090 head
->nregs
= this_nregs
;
1092 SET_HARD_REG_BIT (live_in_chains
, head
->regno
+ nregs
);
1095 "Widening register in chain %s (%d) at insn %d\n",
1096 reg_names
[head
->regno
], head
->id
, INSN_UID (insn
));
1100 fail_current_block
= true;
1103 "Failing basic block due to unhandled overlap\n");
1108 struct du_chain
*this_du
;
1109 this_du
= XOBNEW (&rename_obstack
, struct du_chain
);
1110 this_du
->next_use
= 0;
1112 this_du
->insn
= insn
;
1114 if (head
->first
== NULL
)
1115 head
->first
= this_du
;
1117 head
->last
->next_use
= this_du
;
1118 record_operand_use (head
, this_du
);
1119 head
->last
= this_du
;
1121 /* Avoid adding the same location in a DEBUG_INSN multiple times,
1122 which could happen with non-exact overlap. */
1123 if (DEBUG_INSN_P (insn
))
1125 /* Otherwise, find any other chains that do not match exactly;
1126 ensure they all get marked unrenamable. */
1127 p
= &head
->next_chain
;
1131 /* Whether the terminated chain can be used for renaming
1132 depends on the action and this being an exact match.
1133 In either case, we remove this element from open_chains. */
1135 if ((action
== terminate_dead
|| action
== terminate_write
)
1136 && (superset
|| subset
))
1140 if (subset
&& !superset
)
1141 head
->cannot_rename
= 1;
1142 bitmap_clear_bit (&open_chains_set
, head
->id
);
1144 nregs
= head
->nregs
;
1147 CLEAR_HARD_REG_BIT (live_in_chains
, head
->regno
+ nregs
);
1148 if (subset
&& !superset
1149 && (head
->regno
+ nregs
< this_regno
1150 || head
->regno
+ nregs
>= this_regno
+ this_nregs
))
1151 SET_HARD_REG_BIT (live_hard_regs
, head
->regno
+ nregs
);
1157 "Closing chain %s (%d) at insn %d (%s%s)\n",
1158 reg_names
[head
->regno
], head
->id
, INSN_UID (insn
),
1159 scan_actions_name
[(int) action
],
1160 superset
? ", superset" : subset
? ", subset" : "");
1162 else if (action
== terminate_dead
|| action
== terminate_write
)
1164 /* In this case, tracking liveness gets too hard. Fail the
1165 entire basic block. */
1168 "Failing basic block due to unhandled overlap\n");
1169 fail_current_block
= true;
1174 head
->cannot_rename
= 1;
1177 "Cannot rename chain %s (%d) at insn %d (%s)\n",
1178 reg_names
[head
->regno
], head
->id
, INSN_UID (insn
),
1179 scan_actions_name
[(int) action
]);
1180 p
= &head
->next_chain
;
1185 /* Adapted from find_reloads_address_1. CL is INDEX_REG_CLASS or
1186 BASE_REG_CLASS depending on how the register is being considered. */
1189 scan_rtx_address (rtx_insn
*insn
, rtx
*loc
, enum reg_class cl
,
1190 enum scan_actions action
, machine_mode mode
,
1194 RTX_CODE code
= GET_CODE (x
);
1198 if (action
== mark_write
|| action
== mark_access
)
1205 rtx orig_op0
= XEXP (x
, 0);
1206 rtx orig_op1
= XEXP (x
, 1);
1207 RTX_CODE code0
= GET_CODE (orig_op0
);
1208 RTX_CODE code1
= GET_CODE (orig_op1
);
1213 enum rtx_code index_code
= SCRATCH
;
1215 if (GET_CODE (op0
) == SUBREG
)
1217 op0
= SUBREG_REG (op0
);
1218 code0
= GET_CODE (op0
);
1221 if (GET_CODE (op1
) == SUBREG
)
1223 op1
= SUBREG_REG (op1
);
1224 code1
= GET_CODE (op1
);
1227 if (code0
== MULT
|| code0
== SIGN_EXTEND
|| code0
== TRUNCATE
1228 || code0
== ZERO_EXTEND
|| code1
== MEM
)
1230 locI
= &XEXP (x
, 0);
1231 locB
= &XEXP (x
, 1);
1232 index_code
= GET_CODE (*locI
);
1234 else if (code1
== MULT
|| code1
== SIGN_EXTEND
|| code1
== TRUNCATE
1235 || code1
== ZERO_EXTEND
|| code0
== MEM
)
1237 locI
= &XEXP (x
, 1);
1238 locB
= &XEXP (x
, 0);
1239 index_code
= GET_CODE (*locI
);
1241 else if (code0
== CONST_INT
|| code0
== CONST
1242 || code0
== SYMBOL_REF
|| code0
== LABEL_REF
)
1244 locB
= &XEXP (x
, 1);
1245 index_code
= GET_CODE (XEXP (x
, 0));
1247 else if (code1
== CONST_INT
|| code1
== CONST
1248 || code1
== SYMBOL_REF
|| code1
== LABEL_REF
)
1250 locB
= &XEXP (x
, 0);
1251 index_code
= GET_CODE (XEXP (x
, 1));
1253 else if (code0
== REG
&& code1
== REG
)
1256 unsigned regno0
= REGNO (op0
), regno1
= REGNO (op1
);
1258 if (REGNO_OK_FOR_INDEX_P (regno1
)
1259 && regno_ok_for_base_p (regno0
, mode
, as
, PLUS
, REG
))
1261 else if (REGNO_OK_FOR_INDEX_P (regno0
)
1262 && regno_ok_for_base_p (regno1
, mode
, as
, PLUS
, REG
))
1264 else if (regno_ok_for_base_p (regno0
, mode
, as
, PLUS
, REG
)
1265 || REGNO_OK_FOR_INDEX_P (regno1
))
1267 else if (regno_ok_for_base_p (regno1
, mode
, as
, PLUS
, REG
))
1272 locI
= &XEXP (x
, index_op
);
1273 locB
= &XEXP (x
, !index_op
);
1274 index_code
= GET_CODE (*locI
);
1276 else if (code0
== REG
)
1278 locI
= &XEXP (x
, 0);
1279 locB
= &XEXP (x
, 1);
1280 index_code
= GET_CODE (*locI
);
1282 else if (code1
== REG
)
1284 locI
= &XEXP (x
, 1);
1285 locB
= &XEXP (x
, 0);
1286 index_code
= GET_CODE (*locI
);
1290 scan_rtx_address (insn
, locI
, INDEX_REG_CLASS
, action
, mode
, as
);
1292 scan_rtx_address (insn
, locB
,
1293 base_reg_class (mode
, as
, PLUS
, index_code
),
1305 #ifndef AUTO_INC_DEC
1306 /* If the target doesn't claim to handle autoinc, this must be
1307 something special, like a stack push. Kill this chain. */
1308 action
= mark_all_read
;
1313 scan_rtx_address (insn
, &XEXP (x
, 0),
1314 base_reg_class (GET_MODE (x
), MEM_ADDR_SPACE (x
),
1316 action
, GET_MODE (x
), MEM_ADDR_SPACE (x
));
1320 scan_rtx_reg (insn
, loc
, cl
, action
, OP_IN
);
1327 fmt
= GET_RTX_FORMAT (code
);
1328 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
1331 scan_rtx_address (insn
, &XEXP (x
, i
), cl
, action
, mode
, as
);
1332 else if (fmt
[i
] == 'E')
1333 for (j
= XVECLEN (x
, i
) - 1; j
>= 0; j
--)
1334 scan_rtx_address (insn
, &XVECEXP (x
, i
, j
), cl
, action
, mode
, as
);
1339 scan_rtx (rtx_insn
*insn
, rtx
*loc
, enum reg_class cl
, enum scan_actions action
,
1344 enum rtx_code code
= GET_CODE (x
);
1347 code
= GET_CODE (x
);
1359 scan_rtx_reg (insn
, loc
, cl
, action
, type
);
1363 scan_rtx_address (insn
, &XEXP (x
, 0),
1364 base_reg_class (GET_MODE (x
), MEM_ADDR_SPACE (x
),
1366 action
, GET_MODE (x
), MEM_ADDR_SPACE (x
));
1370 scan_rtx (insn
, &SET_SRC (x
), cl
, action
, OP_IN
);
1371 scan_rtx (insn
, &SET_DEST (x
), cl
, action
,
1372 (GET_CODE (PATTERN (insn
)) == COND_EXEC
1373 && verify_reg_tracked (SET_DEST (x
))) ? OP_INOUT
: OP_OUT
);
1376 case STRICT_LOW_PART
:
1377 scan_rtx (insn
, &XEXP (x
, 0), cl
, action
,
1378 verify_reg_tracked (XEXP (x
, 0)) ? OP_INOUT
: OP_OUT
);
1383 scan_rtx (insn
, &XEXP (x
, 0), cl
, action
,
1384 (type
== OP_IN
? OP_IN
:
1385 verify_reg_tracked (XEXP (x
, 0)) ? OP_INOUT
: OP_OUT
));
1386 scan_rtx (insn
, &XEXP (x
, 1), cl
, action
, OP_IN
);
1387 scan_rtx (insn
, &XEXP (x
, 2), cl
, action
, OP_IN
);
1396 /* Should only happen inside MEM. */
1400 scan_rtx (insn
, &SET_DEST (x
), cl
, action
,
1401 (GET_CODE (PATTERN (insn
)) == COND_EXEC
1402 && verify_reg_tracked (SET_DEST (x
))) ? OP_INOUT
: OP_OUT
);
1406 scan_rtx (insn
, &XEXP (x
, 0), cl
, action
, type
);
1408 scan_rtx (insn
, &XEXP (x
, 1), cl
, action
, type
);
1415 fmt
= GET_RTX_FORMAT (code
);
1416 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
1419 scan_rtx (insn
, &XEXP (x
, i
), cl
, action
, type
);
1420 else if (fmt
[i
] == 'E')
1421 for (j
= XVECLEN (x
, i
) - 1; j
>= 0; j
--)
1422 scan_rtx (insn
, &XVECEXP (x
, i
, j
), cl
, action
, type
);
1426 /* Hide operands of the current insn (of which there are N_OPS) by
1427 substituting cc0 for them.
1428 Previous values are stored in the OLD_OPERANDS and OLD_DUPS.
1429 For every bit set in DO_NOT_HIDE, we leave the operand alone.
1430 If INOUT_AND_EC_ONLY is set, we only do this for OP_INOUT type operands
1431 and earlyclobbers. */
1434 hide_operands (int n_ops
, rtx
*old_operands
, rtx
*old_dups
,
1435 unsigned HOST_WIDE_INT do_not_hide
, bool inout_and_ec_only
)
1438 const operand_alternative
*op_alt
= which_op_alt ();
1439 for (i
= 0; i
< n_ops
; i
++)
1441 old_operands
[i
] = recog_data
.operand
[i
];
1442 /* Don't squash match_operator or match_parallel here, since
1443 we don't know that all of the contained registers are
1444 reachable by proper operands. */
1445 if (recog_data
.constraints
[i
][0] == '\0')
1447 if (do_not_hide
& (1 << i
))
1449 if (!inout_and_ec_only
|| recog_data
.operand_type
[i
] == OP_INOUT
1450 || op_alt
[i
].earlyclobber
)
1451 *recog_data
.operand_loc
[i
] = cc0_rtx
;
1453 for (i
= 0; i
< recog_data
.n_dups
; i
++)
1455 int opn
= recog_data
.dup_num
[i
];
1456 old_dups
[i
] = *recog_data
.dup_loc
[i
];
1457 if (do_not_hide
& (1 << opn
))
1459 if (!inout_and_ec_only
|| recog_data
.operand_type
[opn
] == OP_INOUT
1460 || op_alt
[opn
].earlyclobber
)
1461 *recog_data
.dup_loc
[i
] = cc0_rtx
;
1465 /* Undo the substitution performed by hide_operands. INSN is the insn we
1466 are processing; the arguments are the same as in hide_operands. */
1469 restore_operands (rtx_insn
*insn
, int n_ops
, rtx
*old_operands
, rtx
*old_dups
)
1472 for (i
= 0; i
< recog_data
.n_dups
; i
++)
1473 *recog_data
.dup_loc
[i
] = old_dups
[i
];
1474 for (i
= 0; i
< n_ops
; i
++)
1475 *recog_data
.operand_loc
[i
] = old_operands
[i
];
1476 if (recog_data
.n_dups
)
1477 df_insn_rescan (insn
);
1480 /* For each output operand of INSN, call scan_rtx to create a new
1481 open chain. Do this only for normal or earlyclobber outputs,
1482 depending on EARLYCLOBBER. If INSN_INFO is nonnull, use it to
1483 record information about the operands in the insn. */
1486 record_out_operands (rtx_insn
*insn
, bool earlyclobber
, insn_rr_info
*insn_info
)
1488 int n_ops
= recog_data
.n_operands
;
1489 const operand_alternative
*op_alt
= which_op_alt ();
1493 for (i
= 0; i
< n_ops
+ recog_data
.n_dups
; i
++)
1495 int opn
= i
< n_ops
? i
: recog_data
.dup_num
[i
- n_ops
];
1496 rtx
*loc
= (i
< n_ops
1497 ? recog_data
.operand_loc
[opn
]
1498 : recog_data
.dup_loc
[i
- n_ops
]);
1500 enum reg_class cl
= alternative_class (op_alt
, opn
);
1502 struct du_head
*prev_open
;
1504 if (recog_data
.operand_type
[opn
] != OP_OUT
1505 || op_alt
[opn
].earlyclobber
!= earlyclobber
)
1509 cur_operand
= insn_info
->op_info
+ i
;
1511 prev_open
= open_chains
;
1512 scan_rtx (insn
, loc
, cl
, mark_write
, OP_OUT
);
1514 /* ??? Many targets have output constraints on the SET_DEST
1515 of a call insn, which is stupid, since these are certainly
1516 ABI defined hard registers. For these, and for asm operands
1517 that originally referenced hard registers, we must record that
1518 the chain cannot be renamed. */
1520 || (asm_noperands (PATTERN (insn
)) > 0
1522 && REGNO (op
) == ORIGINAL_REGNO (op
)))
1524 if (prev_open
!= open_chains
)
1525 open_chains
->cannot_rename
= 1;
1531 /* Build def/use chain. */
1534 build_def_use (basic_block bb
)
1537 unsigned HOST_WIDE_INT untracked_operands
;
1539 fail_current_block
= false;
1541 for (insn
= BB_HEAD (bb
); ; insn
= NEXT_INSN (insn
))
1543 if (NONDEBUG_INSN_P (insn
))
1547 rtx old_operands
[MAX_RECOG_OPERANDS
];
1548 rtx old_dups
[MAX_DUP_OPERANDS
];
1551 enum rtx_code set_code
= SET
;
1552 enum rtx_code clobber_code
= CLOBBER
;
1553 insn_rr_info
*insn_info
= NULL
;
1555 /* Process the insn, determining its effect on the def-use
1556 chains and live hard registers. We perform the following
1557 steps with the register references in the insn, simulating
1559 (1) Deal with earlyclobber operands and CLOBBERs of non-operands
1560 by creating chains and marking hard regs live.
1561 (2) Any read outside an operand causes any chain it overlaps
1562 with to be marked unrenamable.
1563 (3) Any read inside an operand is added if there's already
1564 an open chain for it.
1565 (4) For any REG_DEAD note we find, close open chains that
1567 (5) For any non-earlyclobber write we find, close open chains
1569 (6) For any non-earlyclobber write we find in an operand, make
1570 a new chain or mark the hard register as live.
1571 (7) For any REG_UNUSED, close any chains we just opened.
1573 We cannot deal with situations where we track a reg in one mode
1574 and see a reference in another mode; these will cause the chain
1575 to be marked unrenamable or even cause us to abort the entire
1578 extract_constrain_insn (insn
);
1579 preprocess_constraints (insn
);
1580 const operand_alternative
*op_alt
= which_op_alt ();
1581 n_ops
= recog_data
.n_operands
;
1582 untracked_operands
= 0;
1584 if (insn_rr
.exists ())
1586 insn_info
= &insn_rr
[INSN_UID (insn
)];
1587 insn_info
->op_info
= XOBNEWVEC (&rename_obstack
, operand_rr_info
,
1588 recog_data
.n_operands
);
1589 memset (insn_info
->op_info
, 0,
1590 sizeof (operand_rr_info
) * recog_data
.n_operands
);
1593 /* Simplify the code below by promoting OP_OUT to OP_INOUT in
1594 predicated instructions, but only for register operands
1595 that are already tracked, so that we can create a chain
1596 when the first SET makes a register live. */
1598 predicated
= GET_CODE (PATTERN (insn
)) == COND_EXEC
;
1599 for (i
= 0; i
< n_ops
; ++i
)
1601 rtx op
= recog_data
.operand
[i
];
1602 int matches
= op_alt
[i
].matches
;
1603 if (matches
>= 0 || op_alt
[i
].matched
>= 0
1604 || (predicated
&& recog_data
.operand_type
[i
] == OP_OUT
))
1606 recog_data
.operand_type
[i
] = OP_INOUT
;
1607 /* A special case to deal with instruction patterns that
1608 have matching operands with different modes. If we're
1609 not already tracking such a reg, we won't start here,
1610 and we must instead make sure to make the operand visible
1611 to the machinery that tracks hard registers. */
1613 && (GET_MODE_SIZE (recog_data
.operand_mode
[i
])
1614 != GET_MODE_SIZE (recog_data
.operand_mode
[matches
]))
1615 && !verify_reg_in_set (op
, &live_in_chains
))
1617 untracked_operands
|= 1 << i
;
1618 untracked_operands
|= 1 << matches
;
1621 /* If there's an in-out operand with a register that is not
1622 being tracked at all yet, open a chain. */
1623 if (recog_data
.operand_type
[i
] == OP_INOUT
1624 && !(untracked_operands
& (1 << i
))
1626 && !verify_reg_tracked (op
))
1628 machine_mode mode
= GET_MODE (op
);
1629 unsigned this_regno
= REGNO (op
);
1630 unsigned this_nregs
= hard_regno_nregs
[this_regno
][mode
];
1631 create_new_chain (this_regno
, this_nregs
, NULL
, NULL
,
1636 if (fail_current_block
)
1639 /* Step 1a: Mark hard registers that are clobbered in this insn,
1640 outside an operand, as live. */
1641 hide_operands (n_ops
, old_operands
, old_dups
, untracked_operands
,
1643 note_stores (PATTERN (insn
), note_sets_clobbers
, &clobber_code
);
1644 restore_operands (insn
, n_ops
, old_operands
, old_dups
);
1646 /* Step 1b: Begin new chains for earlyclobbered writes inside
1648 record_out_operands (insn
, true, insn_info
);
1650 /* Step 2: Mark chains for which we have reads outside operands
1652 We do this by munging all operands into CC0, and closing
1653 everything remaining. */
1655 hide_operands (n_ops
, old_operands
, old_dups
, untracked_operands
,
1657 scan_rtx (insn
, &PATTERN (insn
), NO_REGS
, mark_all_read
, OP_IN
);
1658 restore_operands (insn
, n_ops
, old_operands
, old_dups
);
1660 /* Step 2B: Can't rename function call argument registers. */
1661 if (CALL_P (insn
) && CALL_INSN_FUNCTION_USAGE (insn
))
1662 scan_rtx (insn
, &CALL_INSN_FUNCTION_USAGE (insn
),
1663 NO_REGS
, mark_all_read
, OP_IN
);
1665 /* Step 2C: Can't rename asm operands that were originally
1667 if (asm_noperands (PATTERN (insn
)) > 0)
1668 for (i
= 0; i
< n_ops
; i
++)
1670 rtx
*loc
= recog_data
.operand_loc
[i
];
1674 && REGNO (op
) == ORIGINAL_REGNO (op
)
1675 && (recog_data
.operand_type
[i
] == OP_IN
1676 || recog_data
.operand_type
[i
] == OP_INOUT
))
1677 scan_rtx (insn
, loc
, NO_REGS
, mark_all_read
, OP_IN
);
1680 /* Step 3: Append to chains for reads inside operands. */
1681 for (i
= 0; i
< n_ops
+ recog_data
.n_dups
; i
++)
1683 int opn
= i
< n_ops
? i
: recog_data
.dup_num
[i
- n_ops
];
1684 rtx
*loc
= (i
< n_ops
1685 ? recog_data
.operand_loc
[opn
]
1686 : recog_data
.dup_loc
[i
- n_ops
]);
1687 enum reg_class cl
= alternative_class (op_alt
, opn
);
1688 enum op_type type
= recog_data
.operand_type
[opn
];
1690 /* Don't scan match_operand here, since we've no reg class
1691 information to pass down. Any operands that we could
1692 substitute in will be represented elsewhere. */
1693 if (recog_data
.constraints
[opn
][0] == '\0'
1694 || untracked_operands
& (1 << opn
))
1698 cur_operand
= i
== opn
? insn_info
->op_info
+ i
: NULL
;
1699 if (op_alt
[opn
].is_address
)
1700 scan_rtx_address (insn
, loc
, cl
, mark_read
,
1701 VOIDmode
, ADDR_SPACE_GENERIC
);
1703 scan_rtx (insn
, loc
, cl
, mark_read
, type
);
1707 /* Step 3B: Record updates for regs in REG_INC notes, and
1708 source regs in REG_FRAME_RELATED_EXPR notes. */
1709 for (note
= REG_NOTES (insn
); note
; note
= XEXP (note
, 1))
1710 if (REG_NOTE_KIND (note
) == REG_INC
1711 || REG_NOTE_KIND (note
) == REG_FRAME_RELATED_EXPR
)
1712 scan_rtx (insn
, &XEXP (note
, 0), ALL_REGS
, mark_read
,
1715 /* Step 4: Close chains for registers that die here, unless
1716 the register is mentioned in a REG_UNUSED note. In that
1717 case we keep the chain open until step #7 below to ensure
1718 it conflicts with other output operands of this insn.
1719 See PR 52573. Arguably the insn should not have both
1720 notes; it has proven difficult to fix that without
1721 other undesirable side effects. */
1722 for (note
= REG_NOTES (insn
); note
; note
= XEXP (note
, 1))
1723 if (REG_NOTE_KIND (note
) == REG_DEAD
1724 && !find_regno_note (insn
, REG_UNUSED
, REGNO (XEXP (note
, 0))))
1726 remove_from_hard_reg_set (&live_hard_regs
,
1727 GET_MODE (XEXP (note
, 0)),
1728 REGNO (XEXP (note
, 0)));
1729 scan_rtx (insn
, &XEXP (note
, 0), NO_REGS
, terminate_dead
,
1733 /* Step 4B: If this is a call, any chain live at this point
1734 requires a caller-saved reg. */
1738 for (p
= open_chains
; p
; p
= p
->next_chain
)
1739 p
->need_caller_save_reg
= 1;
1742 /* Step 5: Close open chains that overlap writes. Similar to
1743 step 2, we hide in-out operands, since we do not want to
1744 close these chains. We also hide earlyclobber operands,
1745 since we've opened chains for them in step 1, and earlier
1746 chains they would overlap with must have been closed at
1747 the previous insn at the latest, as such operands cannot
1748 possibly overlap with any input operands. */
1750 hide_operands (n_ops
, old_operands
, old_dups
, untracked_operands
,
1752 scan_rtx (insn
, &PATTERN (insn
), NO_REGS
, terminate_write
, OP_IN
);
1753 restore_operands (insn
, n_ops
, old_operands
, old_dups
);
1755 /* Step 6a: Mark hard registers that are set in this insn,
1756 outside an operand, as live. */
1757 hide_operands (n_ops
, old_operands
, old_dups
, untracked_operands
,
1759 note_stores (PATTERN (insn
), note_sets_clobbers
, &set_code
);
1760 restore_operands (insn
, n_ops
, old_operands
, old_dups
);
1762 /* Step 6b: Begin new chains for writes inside operands. */
1763 record_out_operands (insn
, false, insn_info
);
1765 /* Step 6c: Record destination regs in REG_FRAME_RELATED_EXPR
1766 notes for update. */
1767 for (note
= REG_NOTES (insn
); note
; note
= XEXP (note
, 1))
1768 if (REG_NOTE_KIND (note
) == REG_FRAME_RELATED_EXPR
)
1769 scan_rtx (insn
, &XEXP (note
, 0), ALL_REGS
, mark_access
,
1772 /* Step 7: Close chains for registers that were never
1773 really used here. */
1774 for (note
= REG_NOTES (insn
); note
; note
= XEXP (note
, 1))
1775 if (REG_NOTE_KIND (note
) == REG_UNUSED
)
1777 remove_from_hard_reg_set (&live_hard_regs
,
1778 GET_MODE (XEXP (note
, 0)),
1779 REGNO (XEXP (note
, 0)));
1780 scan_rtx (insn
, &XEXP (note
, 0), NO_REGS
, terminate_dead
,
1784 else if (DEBUG_INSN_P (insn
)
1785 && !VAR_LOC_UNKNOWN_P (INSN_VAR_LOCATION_LOC (insn
)))
1787 scan_rtx (insn
, &INSN_VAR_LOCATION_LOC (insn
),
1788 ALL_REGS
, mark_read
, OP_IN
);
1790 if (insn
== BB_END (bb
))
1794 if (fail_current_block
)
1800 /* Initialize the register renamer. If INSN_INFO is true, ensure that
1801 insn_rr is nonnull. */
1803 regrename_init (bool insn_info
)
1805 gcc_obstack_init (&rename_obstack
);
1808 insn_rr
.safe_grow_cleared (get_max_uid ());
1811 /* Free all global data used by the register renamer. */
1813 regrename_finish (void)
1817 obstack_free (&rename_obstack
, NULL
);
1820 /* Perform register renaming on the current function. */
1823 regrename_optimize (void)
1825 df_set_flags (DF_LR_RUN_DCE
);
1826 df_note_add_problem ();
1828 df_set_flags (DF_DEFER_INSN_RESCAN
);
1830 regrename_init (false);
1832 regrename_analyze (NULL
);
1836 regrename_finish ();
1843 const pass_data pass_data_regrename
=
1845 RTL_PASS
, /* type */
1847 OPTGROUP_NONE
, /* optinfo_flags */
1848 TV_RENAME_REGISTERS
, /* tv_id */
1849 0, /* properties_required */
1850 0, /* properties_provided */
1851 0, /* properties_destroyed */
1852 0, /* todo_flags_start */
1853 TODO_df_finish
, /* todo_flags_finish */
1856 class pass_regrename
: public rtl_opt_pass
1859 pass_regrename (gcc::context
*ctxt
)
1860 : rtl_opt_pass (pass_data_regrename
, ctxt
)
1863 /* opt_pass methods: */
1864 virtual bool gate (function
*)
1866 return (optimize
> 0 && (flag_rename_registers
));
1869 virtual unsigned int execute (function
*) { return regrename_optimize (); }
1871 }; // class pass_regrename
1876 make_pass_regrename (gcc::context
*ctxt
)
1878 return new pass_regrename (ctxt
);