1 /* Register renaming for the GNU compiler.
2 Copyright (C) 2000-2013 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"
30 #include "basic-block.h"
37 #include "tree-pass.h"
41 #include "regrename.h"
43 /* This file implements the RTL register renaming pass of the compiler. It is
44 a semi-local pass whose goal is to maximize the usage of the register file
45 of the processor by substituting registers for others in the solution given
46 by the register allocator. The algorithm is as follows:
48 1. Local def/use chains are built: within each basic block, chains are
49 opened and closed; if a chain isn't closed at the end of the block,
50 it is dropped. We pre-open chains if we have already examined a
51 predecessor block and found chains live at the end which match
52 live registers at the start of the new block.
54 2. We try to combine the local chains across basic block boundaries by
55 comparing chains that were open at the start or end of a block to
56 those in successor/predecessor blocks.
58 3. For each chain, the set of possible renaming registers is computed.
59 This takes into account the renaming of previously processed chains.
60 Optionally, a preferred class is computed for the renaming register.
62 4. The best renaming register is computed for the chain in the above set,
63 using a round-robin allocation. If a preferred class exists, then the
64 round-robin allocation is done within the class first, if possible.
65 The round-robin allocation of renaming registers itself is global.
67 5. If a renaming register has been found, it is substituted in the chain.
69 Targets can parameterize the pass by specifying a preferred class for the
70 renaming register for a given (super)class of registers to be renamed. */
72 #if HOST_BITS_PER_WIDE_INT <= MAX_RECOG_OPERANDS
73 #error "Use a different bitmap implementation for untracked_operands."
83 /* mark_access is for marking the destination regs in
84 REG_FRAME_RELATED_EXPR notes (as if they were read) so that the
85 note is updated properly. */
89 static const char * const scan_actions_name
[] =
99 /* TICK and THIS_TICK are used to record the last time we saw each
101 static int tick
[FIRST_PSEUDO_REGISTER
];
102 static int this_tick
= 0;
104 static struct obstack rename_obstack
;
106 /* If nonnull, the code calling into the register renamer requested
107 information about insn operands, and we store it here. */
108 vec
<insn_rr_info
> insn_rr
;
110 static void scan_rtx (rtx
, rtx
*, enum reg_class
, enum scan_actions
,
112 static bool build_def_use (basic_block
);
114 /* The id to be given to the next opened chain. */
115 static unsigned current_id
;
117 /* A mapping of unique id numbers to chains. */
118 static vec
<du_head_p
> id_to_chain
;
120 /* List of currently open chains. */
121 static struct du_head
*open_chains
;
123 /* Bitmap of open chains. The bits set always match the list found in
125 static bitmap_head open_chains_set
;
127 /* Record the registers being tracked in open_chains. */
128 static HARD_REG_SET live_in_chains
;
130 /* Record the registers that are live but not tracked. The intersection
131 between this and live_in_chains is empty. */
132 static HARD_REG_SET live_hard_regs
;
134 /* Set while scanning RTL if INSN_RR is nonnull, i.e. if the current analysis
135 is for a caller that requires operand data. Used in
136 record_operand_use. */
137 static operand_rr_info
*cur_operand
;
139 /* Return the chain corresponding to id number ID. Take into account that
140 chains may have been merged. */
142 regrename_chain_from_id (unsigned int id
)
144 du_head_p first_chain
= id_to_chain
[id
];
145 du_head_p chain
= first_chain
;
146 while (chain
->id
!= id
)
149 chain
= id_to_chain
[id
];
151 first_chain
->id
= id
;
155 /* Dump all def/use chains, starting at id FROM. */
158 dump_def_use_chain (int from
)
162 FOR_EACH_VEC_ELT_FROM (id_to_chain
, i
, head
, from
)
164 struct du_chain
*this_du
= head
->first
;
166 fprintf (dump_file
, "Register %s (%d):",
167 reg_names
[head
->regno
], head
->nregs
);
170 fprintf (dump_file
, " %d [%s]", INSN_UID (this_du
->insn
),
171 reg_class_names
[this_du
->cl
]);
172 this_du
= this_du
->next_use
;
174 fprintf (dump_file
, "\n");
175 head
= head
->next_chain
;
180 free_chain_data (void)
184 for (i
= 0; id_to_chain
.iterate (i
, &ptr
); i
++)
185 bitmap_clear (&ptr
->conflicts
);
187 id_to_chain
.release ();
190 /* Walk all chains starting with CHAINS and record that they conflict with
191 another chain whose id is ID. */
194 mark_conflict (struct du_head
*chains
, unsigned id
)
198 bitmap_set_bit (&chains
->conflicts
, id
);
199 chains
= chains
->next_chain
;
203 /* Examine cur_operand, and if it is nonnull, record information about the
204 use THIS_DU which is part of the chain HEAD. */
207 record_operand_use (struct du_head
*head
, struct du_chain
*this_du
)
209 if (cur_operand
== NULL
)
211 gcc_assert (cur_operand
->n_chains
< MAX_REGS_PER_ADDRESS
);
212 cur_operand
->heads
[cur_operand
->n_chains
] = head
;
213 cur_operand
->chains
[cur_operand
->n_chains
++] = this_du
;
216 /* Create a new chain for THIS_NREGS registers starting at THIS_REGNO,
217 and record its occurrence in *LOC, which is being written to in INSN.
218 This access requires a register of class CL. */
221 create_new_chain (unsigned this_regno
, unsigned this_nregs
, rtx
*loc
,
222 rtx insn
, enum reg_class cl
)
224 struct du_head
*head
= XOBNEW (&rename_obstack
, struct du_head
);
225 struct du_chain
*this_du
;
228 head
->next_chain
= open_chains
;
229 head
->regno
= this_regno
;
230 head
->nregs
= this_nregs
;
231 head
->need_caller_save_reg
= 0;
232 head
->cannot_rename
= 0;
234 id_to_chain
.safe_push (head
);
235 head
->id
= current_id
++;
237 bitmap_initialize (&head
->conflicts
, &bitmap_default_obstack
);
238 bitmap_copy (&head
->conflicts
, &open_chains_set
);
239 mark_conflict (open_chains
, head
->id
);
241 /* Since we're tracking this as a chain now, remove it from the
242 list of conflicting live hard registers and track it in
243 live_in_chains instead. */
247 SET_HARD_REG_BIT (live_in_chains
, head
->regno
+ nregs
);
248 CLEAR_HARD_REG_BIT (live_hard_regs
, head
->regno
+ nregs
);
251 COPY_HARD_REG_SET (head
->hard_conflicts
, live_hard_regs
);
252 bitmap_set_bit (&open_chains_set
, head
->id
);
258 fprintf (dump_file
, "Creating chain %s (%d)",
259 reg_names
[head
->regno
], head
->id
);
260 if (insn
!= NULL_RTX
)
261 fprintf (dump_file
, " at insn %d", INSN_UID (insn
));
262 fprintf (dump_file
, "\n");
265 if (insn
== NULL_RTX
)
267 head
->first
= head
->last
= NULL
;
271 this_du
= XOBNEW (&rename_obstack
, struct du_chain
);
272 head
->first
= head
->last
= this_du
;
274 this_du
->next_use
= 0;
276 this_du
->insn
= insn
;
278 record_operand_use (head
, this_du
);
282 /* For a def-use chain HEAD, find which registers overlap its lifetime and
283 set the corresponding bits in *PSET. */
286 merge_overlapping_regs (HARD_REG_SET
*pset
, struct du_head
*head
)
290 IOR_HARD_REG_SET (*pset
, head
->hard_conflicts
);
291 EXECUTE_IF_SET_IN_BITMAP (&head
->conflicts
, 0, i
, bi
)
293 du_head_p other
= regrename_chain_from_id (i
);
294 unsigned j
= other
->nregs
;
295 gcc_assert (other
!= head
);
297 SET_HARD_REG_BIT (*pset
, other
->regno
+ j
);
301 /* Check if NEW_REG can be the candidate register to rename for
302 REG in THIS_HEAD chain. THIS_UNAVAILABLE is a set of unavailable hard
306 check_new_reg_p (int reg ATTRIBUTE_UNUSED
, int new_reg
,
307 struct du_head
*this_head
, HARD_REG_SET this_unavailable
)
309 enum machine_mode mode
= GET_MODE (*this_head
->first
->loc
);
310 int nregs
= hard_regno_nregs
[new_reg
][mode
];
312 struct du_chain
*tmp
;
314 for (i
= nregs
- 1; i
>= 0; --i
)
315 if (TEST_HARD_REG_BIT (this_unavailable
, new_reg
+ i
)
316 || fixed_regs
[new_reg
+ i
]
317 || global_regs
[new_reg
+ i
]
318 /* Can't use regs which aren't saved by the prologue. */
319 || (! df_regs_ever_live_p (new_reg
+ i
)
320 && ! call_used_regs
[new_reg
+ i
])
321 #ifdef LEAF_REGISTERS
322 /* We can't use a non-leaf register if we're in a
325 && !LEAF_REGISTERS
[new_reg
+ i
])
327 #ifdef HARD_REGNO_RENAME_OK
328 || ! HARD_REGNO_RENAME_OK (reg
+ i
, new_reg
+ i
)
333 /* See whether it accepts all modes that occur in
334 definition and uses. */
335 for (tmp
= this_head
->first
; tmp
; tmp
= tmp
->next_use
)
336 if ((! HARD_REGNO_MODE_OK (new_reg
, GET_MODE (*tmp
->loc
))
337 && ! DEBUG_INSN_P (tmp
->insn
))
338 || (this_head
->need_caller_save_reg
339 && ! (HARD_REGNO_CALL_PART_CLOBBERED
340 (reg
, GET_MODE (*tmp
->loc
)))
341 && (HARD_REGNO_CALL_PART_CLOBBERED
342 (new_reg
, GET_MODE (*tmp
->loc
)))))
348 /* For the chain THIS_HEAD, compute and return the best register to
349 rename to. SUPER_CLASS is the superunion of register classes in
350 the chain. UNAVAILABLE is a set of registers that cannot be used.
351 OLD_REG is the register currently used for the chain. */
354 find_best_rename_reg (du_head_p this_head
, enum reg_class super_class
,
355 HARD_REG_SET
*unavailable
, int old_reg
)
357 bool has_preferred_class
;
358 enum reg_class preferred_class
;
360 int best_new_reg
= old_reg
;
362 /* Further narrow the set of registers we can use for renaming.
363 If the chain needs a call-saved register, mark the call-used
364 registers as unavailable. */
365 if (this_head
->need_caller_save_reg
)
366 IOR_HARD_REG_SET (*unavailable
, call_used_reg_set
);
368 /* Mark registers that overlap this chain's lifetime as unavailable. */
369 merge_overlapping_regs (unavailable
, this_head
);
371 /* Compute preferred rename class of super union of all the classes
374 = (enum reg_class
) targetm
.preferred_rename_class (super_class
);
376 /* If PREFERRED_CLASS is not NO_REGS, we iterate in the first pass
377 over registers that belong to PREFERRED_CLASS and try to find the
378 best register within the class. If that failed, we iterate in
379 the second pass over registers that don't belong to the class.
380 If PREFERRED_CLASS is NO_REGS, we iterate over all registers in
381 ascending order without any preference. */
382 has_preferred_class
= (preferred_class
!= NO_REGS
);
383 for (pass
= (has_preferred_class
? 0 : 1); pass
< 2; pass
++)
386 for (new_reg
= 0; new_reg
< FIRST_PSEUDO_REGISTER
; new_reg
++)
388 if (has_preferred_class
390 != TEST_HARD_REG_BIT (reg_class_contents
[preferred_class
],
394 /* In the first pass, we force the renaming of registers that
395 don't belong to PREFERRED_CLASS to registers that do, even
396 though the latters were used not very long ago. */
397 if (check_new_reg_p (old_reg
, new_reg
, this_head
,
400 && !TEST_HARD_REG_BIT (reg_class_contents
[preferred_class
],
402 || tick
[best_new_reg
] > tick
[new_reg
]))
403 best_new_reg
= new_reg
;
405 if (pass
== 0 && best_new_reg
!= old_reg
)
411 /* Perform register renaming on the current function. */
415 HARD_REG_SET unavailable
;
419 memset (tick
, 0, sizeof tick
);
421 CLEAR_HARD_REG_SET (unavailable
);
422 /* Don't clobber traceback for noreturn functions. */
423 if (frame_pointer_needed
)
425 add_to_hard_reg_set (&unavailable
, Pmode
, FRAME_POINTER_REGNUM
);
426 #if !HARD_FRAME_POINTER_IS_FRAME_POINTER
427 add_to_hard_reg_set (&unavailable
, Pmode
, HARD_FRAME_POINTER_REGNUM
);
431 FOR_EACH_VEC_ELT (id_to_chain
, i
, this_head
)
435 struct du_chain
*tmp
;
436 HARD_REG_SET this_unavailable
;
437 int reg
= this_head
->regno
;
438 enum reg_class super_class
= NO_REGS
;
440 if (this_head
->cannot_rename
)
443 if (fixed_regs
[reg
] || global_regs
[reg
]
444 #if !HARD_FRAME_POINTER_IS_FRAME_POINTER
445 || (frame_pointer_needed
&& reg
== HARD_FRAME_POINTER_REGNUM
)
447 || (frame_pointer_needed
&& reg
== FRAME_POINTER_REGNUM
)
452 COPY_HARD_REG_SET (this_unavailable
, unavailable
);
454 /* Iterate over elements in the chain in order to:
455 1. Count number of uses, and narrow the set of registers we can
457 2. Compute the superunion of register classes in this chain. */
459 super_class
= NO_REGS
;
460 for (tmp
= this_head
->first
; tmp
; tmp
= tmp
->next_use
)
462 if (DEBUG_INSN_P (tmp
->insn
))
465 IOR_COMPL_HARD_REG_SET (this_unavailable
,
466 reg_class_contents
[tmp
->cl
]);
468 = reg_class_superunion
[(int) super_class
][(int) tmp
->cl
];
474 best_new_reg
= find_best_rename_reg (this_head
, super_class
,
475 &this_unavailable
, reg
);
479 fprintf (dump_file
, "Register %s in insn %d",
480 reg_names
[reg
], INSN_UID (this_head
->first
->insn
));
481 if (this_head
->need_caller_save_reg
)
482 fprintf (dump_file
, " crosses a call");
485 if (best_new_reg
== reg
)
487 tick
[reg
] = ++this_tick
;
489 fprintf (dump_file
, "; no available better choice\n");
494 fprintf (dump_file
, ", renamed as %s\n", reg_names
[best_new_reg
]);
496 regrename_do_replace (this_head
, best_new_reg
);
497 tick
[best_new_reg
] = ++this_tick
;
498 df_set_regs_ever_live (best_new_reg
, true);
502 /* A structure to record information for each hard register at the start of
504 struct incoming_reg_info
{
505 /* Holds the number of registers used in the chain that gave us information
506 about this register. Zero means no information known yet, while a
507 negative value is used for something that is part of, but not the first
508 register in a multi-register value. */
510 /* Set to true if we have accesses that conflict in the number of registers
515 /* A structure recording information about each basic block. It is saved
516 and restored around basic block boundaries.
517 A pointer to such a structure is stored in each basic block's aux field
518 during regrename_analyze, except for blocks we know can't be optimized
519 (such as entry and exit blocks). */
520 struct bb_rename_info
522 /* The basic block corresponding to this structure. */
524 /* Copies of the global information. */
525 bitmap_head open_chains_set
;
526 bitmap_head incoming_open_chains_set
;
527 struct incoming_reg_info incoming
[FIRST_PSEUDO_REGISTER
];
530 /* Initialize a rename_info structure P for basic block BB, which starts a new
533 init_rename_info (struct bb_rename_info
*p
, basic_block bb
)
537 HARD_REG_SET start_chains_set
;
540 bitmap_initialize (&p
->open_chains_set
, &bitmap_default_obstack
);
541 bitmap_initialize (&p
->incoming_open_chains_set
, &bitmap_default_obstack
);
544 bitmap_clear (&open_chains_set
);
546 CLEAR_HARD_REG_SET (live_in_chains
);
547 REG_SET_TO_HARD_REG_SET (live_hard_regs
, df_get_live_in (bb
));
548 for (def_rec
= df_get_artificial_defs (bb
->index
); *def_rec
; def_rec
++)
550 df_ref def
= *def_rec
;
551 if (DF_REF_FLAGS (def
) & DF_REF_AT_TOP
)
552 SET_HARD_REG_BIT (live_hard_regs
, DF_REF_REGNO (def
));
555 /* Open chains based on information from (at least one) predecessor
556 block. This gives us a chance later on to combine chains across
557 basic block boundaries. Inconsistencies (in access sizes) will
558 be caught normally and dealt with conservatively by disabling the
559 chain for renaming, and there is no risk of losing optimization
560 opportunities by opening chains either: if we did not open the
561 chains, we'd have to track the live register as a hard reg, and
562 we'd be unable to rename it in any case. */
563 CLEAR_HARD_REG_SET (start_chains_set
);
564 for (i
= 0; i
< FIRST_PSEUDO_REGISTER
; i
++)
566 struct incoming_reg_info
*iri
= p
->incoming
+ i
;
567 if (iri
->nregs
> 0 && !iri
->unusable
568 && range_in_hard_reg_set_p (live_hard_regs
, i
, iri
->nregs
))
570 SET_HARD_REG_BIT (start_chains_set
, i
);
571 remove_range_from_hard_reg_set (&live_hard_regs
, i
, iri
->nregs
);
574 for (i
= 0; i
< FIRST_PSEUDO_REGISTER
; i
++)
576 struct incoming_reg_info
*iri
= p
->incoming
+ i
;
577 if (TEST_HARD_REG_BIT (start_chains_set
, i
))
581 fprintf (dump_file
, "opening incoming chain\n");
582 chain
= create_new_chain (i
, iri
->nregs
, NULL
, NULL_RTX
, NO_REGS
);
583 bitmap_set_bit (&p
->incoming_open_chains_set
, chain
->id
);
588 /* Record in RI that the block corresponding to it has an incoming
589 live value, described by CHAIN. */
591 set_incoming_from_chain (struct bb_rename_info
*ri
, du_head_p chain
)
594 int incoming_nregs
= ri
->incoming
[chain
->regno
].nregs
;
597 /* If we've recorded the same information before, everything is fine. */
598 if (incoming_nregs
== chain
->nregs
)
601 fprintf (dump_file
, "reg %d/%d already recorded\n",
602 chain
->regno
, chain
->nregs
);
606 /* If we have no information for any of the involved registers, update
607 the incoming array. */
608 nregs
= chain
->nregs
;
610 if (ri
->incoming
[chain
->regno
+ nregs
].nregs
!= 0
611 || ri
->incoming
[chain
->regno
+ nregs
].unusable
)
615 nregs
= chain
->nregs
;
616 ri
->incoming
[chain
->regno
].nregs
= nregs
;
618 ri
->incoming
[chain
->regno
+ nregs
].nregs
= -nregs
;
620 fprintf (dump_file
, "recorded reg %d/%d\n",
621 chain
->regno
, chain
->nregs
);
625 /* There must be some kind of conflict. Prevent both the old and
626 new ranges from being used. */
627 if (incoming_nregs
< 0)
628 ri
->incoming
[chain
->regno
+ incoming_nregs
].unusable
= true;
629 for (i
= 0; i
< chain
->nregs
; i
++)
630 ri
->incoming
[chain
->regno
+ i
].unusable
= true;
633 /* Merge the two chains C1 and C2 so that all conflict information is
634 recorded and C1, and the id of C2 is changed to that of C1. */
636 merge_chains (du_head_p c1
, du_head_p c2
)
641 if (c2
->first
!= NULL
)
643 if (c1
->first
== NULL
)
644 c1
->first
= c2
->first
;
646 c1
->last
->next_use
= c2
->first
;
650 c2
->first
= c2
->last
= NULL
;
653 IOR_HARD_REG_SET (c1
->hard_conflicts
, c2
->hard_conflicts
);
654 bitmap_ior_into (&c1
->conflicts
, &c2
->conflicts
);
656 c1
->need_caller_save_reg
|= c2
->need_caller_save_reg
;
657 c1
->cannot_rename
|= c2
->cannot_rename
;
660 /* Analyze the current function and build chains for renaming. */
663 regrename_analyze (bitmap bb_mask
)
665 struct bb_rename_info
*rename_info
;
669 int *inverse_postorder
;
671 inverse_postorder
= XNEWVEC (int, last_basic_block
);
672 n_bbs
= pre_and_rev_post_order_compute (NULL
, inverse_postorder
, false);
674 /* Gather some information about the blocks in this function. */
675 rename_info
= XCNEWVEC (struct bb_rename_info
, n_basic_blocks
);
679 struct bb_rename_info
*ri
= rename_info
+ i
;
681 if (bb_mask
!= NULL
&& !bitmap_bit_p (bb_mask
, bb
->index
))
689 id_to_chain
.create (0);
690 bitmap_initialize (&open_chains_set
, &bitmap_default_obstack
);
692 /* The order in which we visit blocks ensures that whenever
693 possible, we only process a block after at least one of its
694 predecessors, which provides a "seeding" effect to make the logic
695 in set_incoming_from_chain and init_rename_info useful. */
697 for (i
= 0; i
< n_bbs
; i
++)
699 basic_block bb1
= BASIC_BLOCK (inverse_postorder
[i
]);
700 struct bb_rename_info
*this_info
;
704 int old_length
= id_to_chain
.length ();
706 this_info
= (struct bb_rename_info
*) bb1
->aux
;
707 if (this_info
== NULL
)
711 fprintf (dump_file
, "\nprocessing block %d:\n", bb1
->index
);
713 init_rename_info (this_info
, bb1
);
715 success
= build_def_use (bb1
);
719 fprintf (dump_file
, "failed\n");
721 id_to_chain
.truncate (old_length
);
722 current_id
= old_length
;
723 bitmap_clear (&this_info
->incoming_open_chains_set
);
725 if (insn_rr
.exists ())
728 FOR_BB_INSNS (bb1
, insn
)
730 insn_rr_info
*p
= &insn_rr
[INSN_UID (insn
)];
738 dump_def_use_chain (old_length
);
739 bitmap_copy (&this_info
->open_chains_set
, &open_chains_set
);
741 /* Add successor blocks to the worklist if necessary, and record
742 data about our own open chains at the end of this block, which
743 will be used to pre-open chains when processing the successors. */
744 FOR_EACH_EDGE (e
, ei
, bb1
->succs
)
746 struct bb_rename_info
*dest_ri
;
747 struct du_head
*chain
;
750 fprintf (dump_file
, "successor block %d\n", e
->dest
->index
);
752 if (e
->flags
& (EDGE_EH
| EDGE_ABNORMAL
))
754 dest_ri
= (struct bb_rename_info
*)e
->dest
->aux
;
757 for (chain
= open_chains
; chain
; chain
= chain
->next_chain
)
758 set_incoming_from_chain (dest_ri
, chain
);
762 free (inverse_postorder
);
764 /* Now, combine the chains data we have gathered across basic block
767 For every basic block, there may be chains open at the start, or at the
768 end. Rather than exclude them from renaming, we look for open chains
769 with matching registers at the other side of the CFG edge.
771 For a given chain using register R, open at the start of block B, we
772 must find an open chain using R on the other side of every edge leading
773 to B, if the register is live across this edge. In the code below,
774 N_PREDS_USED counts the number of edges where the register is live, and
775 N_PREDS_JOINED counts those where we found an appropriate chain for
778 We perform the analysis for both incoming and outgoing edges, but we
779 only need to merge once (in the second part, after verifying outgoing
783 struct bb_rename_info
*bb_ri
= (struct bb_rename_info
*) bb
->aux
;
791 fprintf (dump_file
, "processing bb %d in edges\n", bb
->index
);
793 EXECUTE_IF_SET_IN_BITMAP (&bb_ri
->incoming_open_chains_set
, 0, j
, bi
)
797 struct du_head
*chain
= regrename_chain_from_id (j
);
798 int n_preds_used
= 0, n_preds_joined
= 0;
800 FOR_EACH_EDGE (e
, ei
, bb
->preds
)
802 struct bb_rename_info
*src_ri
;
806 bool success
= false;
808 REG_SET_TO_HARD_REG_SET (live
, df_get_live_out (e
->src
));
809 if (!range_overlaps_hard_reg_set_p (live
, chain
->regno
,
814 if (e
->flags
& (EDGE_EH
| EDGE_ABNORMAL
))
817 src_ri
= (struct bb_rename_info
*)e
->src
->aux
;
821 EXECUTE_IF_SET_IN_BITMAP (&src_ri
->open_chains_set
,
824 struct du_head
*outgoing_chain
= regrename_chain_from_id (k
);
826 if (outgoing_chain
->regno
== chain
->regno
827 && outgoing_chain
->nregs
== chain
->nregs
)
834 if (!success
&& dump_file
)
835 fprintf (dump_file
, "failure to match with pred block %d\n",
838 if (n_preds_joined
< n_preds_used
)
841 fprintf (dump_file
, "cannot rename chain %d\n", j
);
842 chain
->cannot_rename
= 1;
848 struct bb_rename_info
*bb_ri
= (struct bb_rename_info
*) bb
->aux
;
856 fprintf (dump_file
, "processing bb %d out edges\n", bb
->index
);
858 EXECUTE_IF_SET_IN_BITMAP (&bb_ri
->open_chains_set
, 0, j
, bi
)
862 struct du_head
*chain
= regrename_chain_from_id (j
);
863 int n_succs_used
= 0, n_succs_joined
= 0;
865 FOR_EACH_EDGE (e
, ei
, bb
->succs
)
867 bool printed
= false;
868 struct bb_rename_info
*dest_ri
;
873 REG_SET_TO_HARD_REG_SET (live
, df_get_live_in (e
->dest
));
874 if (!range_overlaps_hard_reg_set_p (live
, chain
->regno
,
880 dest_ri
= (struct bb_rename_info
*)e
->dest
->aux
;
884 EXECUTE_IF_SET_IN_BITMAP (&dest_ri
->incoming_open_chains_set
,
887 struct du_head
*incoming_chain
= regrename_chain_from_id (k
);
889 if (incoming_chain
->regno
== chain
->regno
890 && incoming_chain
->nregs
== chain
->nregs
)
896 "merging blocks for edge %d -> %d\n",
897 e
->src
->index
, e
->dest
->index
);
900 " merging chains %d (->%d) and %d (->%d) [%s]\n",
901 k
, incoming_chain
->id
, j
, chain
->id
,
902 reg_names
[incoming_chain
->regno
]);
905 merge_chains (chain
, incoming_chain
);
911 if (n_succs_joined
< n_succs_used
)
914 fprintf (dump_file
, "cannot rename chain %d\n",
916 chain
->cannot_rename
= 1;
928 regrename_do_replace (struct du_head
*head
, int reg
)
930 struct du_chain
*chain
;
931 unsigned int base_regno
= head
->regno
;
932 enum machine_mode mode
;
934 for (chain
= head
->first
; chain
; chain
= chain
->next_use
)
936 unsigned int regno
= ORIGINAL_REGNO (*chain
->loc
);
937 struct reg_attrs
*attr
= REG_ATTRS (*chain
->loc
);
938 int reg_ptr
= REG_POINTER (*chain
->loc
);
940 if (DEBUG_INSN_P (chain
->insn
) && REGNO (*chain
->loc
) != base_regno
)
941 INSN_VAR_LOCATION_LOC (chain
->insn
) = gen_rtx_UNKNOWN_VAR_LOC ();
944 *chain
->loc
= gen_raw_REG (GET_MODE (*chain
->loc
), reg
);
945 if (regno
>= FIRST_PSEUDO_REGISTER
)
946 ORIGINAL_REGNO (*chain
->loc
) = regno
;
947 REG_ATTRS (*chain
->loc
) = attr
;
948 REG_POINTER (*chain
->loc
) = reg_ptr
;
951 df_insn_rescan (chain
->insn
);
954 mode
= GET_MODE (*head
->first
->loc
);
956 head
->nregs
= hard_regno_nregs
[reg
][mode
];
960 /* True if we found a register with a size mismatch, which means that we
961 can't track its lifetime accurately. If so, we abort the current block
963 static bool fail_current_block
;
965 /* Return true if OP is a reg for which all bits are set in PSET, false
966 if all bits are clear.
967 In other cases, set fail_current_block and return false. */
970 verify_reg_in_set (rtx op
, HARD_REG_SET
*pset
)
972 unsigned regno
, nregs
;
973 bool all_live
, all_dead
;
978 nregs
= hard_regno_nregs
[regno
][GET_MODE (op
)];
979 all_live
= all_dead
= true;
981 if (TEST_HARD_REG_BIT (*pset
, regno
+ nregs
))
985 if (!all_dead
&& !all_live
)
987 fail_current_block
= true;
993 /* Return true if OP is a reg that is being tracked already in some form.
994 May set fail_current_block if it sees an unhandled case of overlap. */
997 verify_reg_tracked (rtx op
)
999 return (verify_reg_in_set (op
, &live_hard_regs
)
1000 || verify_reg_in_set (op
, &live_in_chains
));
1003 /* Called through note_stores. DATA points to a rtx_code, either SET or
1004 CLOBBER, which tells us which kind of rtx to look at. If we have a
1005 match, record the set register in live_hard_regs and in the hard_conflicts
1006 bitmap of open chains. */
1009 note_sets_clobbers (rtx x
, const_rtx set
, void *data
)
1011 enum rtx_code code
= *(enum rtx_code
*)data
;
1012 struct du_head
*chain
;
1014 if (GET_CODE (x
) == SUBREG
)
1016 if (!REG_P (x
) || GET_CODE (set
) != code
)
1018 /* There must not be pseudos at this point. */
1019 gcc_assert (HARD_REGISTER_P (x
));
1020 add_to_hard_reg_set (&live_hard_regs
, GET_MODE (x
), REGNO (x
));
1021 for (chain
= open_chains
; chain
; chain
= chain
->next_chain
)
1022 add_to_hard_reg_set (&chain
->hard_conflicts
, GET_MODE (x
), REGNO (x
));
1026 scan_rtx_reg (rtx insn
, rtx
*loc
, enum reg_class cl
, enum scan_actions action
,
1031 enum machine_mode mode
= GET_MODE (x
);
1032 unsigned this_regno
= REGNO (x
);
1033 int this_nregs
= hard_regno_nregs
[this_regno
][mode
];
1035 if (action
== mark_write
)
1038 create_new_chain (this_regno
, this_nregs
, loc
, insn
, cl
);
1042 if ((type
== OP_OUT
) != (action
== terminate_write
|| action
== mark_access
))
1045 for (p
= &open_chains
; *p
;)
1047 struct du_head
*head
= *p
;
1048 struct du_head
*next
= head
->next_chain
;
1049 int exact_match
= (head
->regno
== this_regno
1050 && head
->nregs
== this_nregs
);
1051 int superset
= (this_regno
<= head
->regno
1052 && this_regno
+ this_nregs
>= head
->regno
+ head
->nregs
);
1053 int subset
= (this_regno
>= head
->regno
1054 && this_regno
+ this_nregs
<= head
->regno
+ head
->nregs
);
1056 if (!bitmap_bit_p (&open_chains_set
, head
->id
)
1057 || head
->regno
+ head
->nregs
<= this_regno
1058 || this_regno
+ this_nregs
<= head
->regno
)
1060 p
= &head
->next_chain
;
1064 if (action
== mark_read
|| action
== mark_access
)
1066 /* ??? Class NO_REGS can happen if the md file makes use of
1067 EXTRA_CONSTRAINTS to match registers. Which is arguably
1068 wrong, but there we are. */
1070 if (cl
== NO_REGS
|| (!exact_match
&& !DEBUG_INSN_P (insn
)))
1074 "Cannot rename chain %s (%d) at insn %d (%s)\n",
1075 reg_names
[head
->regno
], head
->id
, INSN_UID (insn
),
1076 scan_actions_name
[(int) action
]);
1077 head
->cannot_rename
= 1;
1080 unsigned nregs
= this_nregs
;
1081 head
->regno
= this_regno
;
1082 head
->nregs
= this_nregs
;
1084 SET_HARD_REG_BIT (live_in_chains
, head
->regno
+ nregs
);
1087 "Widening register in chain %s (%d) at insn %d\n",
1088 reg_names
[head
->regno
], head
->id
, INSN_UID (insn
));
1092 fail_current_block
= true;
1095 "Failing basic block due to unhandled overlap\n");
1100 struct du_chain
*this_du
;
1101 this_du
= XOBNEW (&rename_obstack
, struct du_chain
);
1102 this_du
->next_use
= 0;
1104 this_du
->insn
= insn
;
1106 if (head
->first
== NULL
)
1107 head
->first
= this_du
;
1109 head
->last
->next_use
= this_du
;
1110 record_operand_use (head
, this_du
);
1111 head
->last
= this_du
;
1113 /* Avoid adding the same location in a DEBUG_INSN multiple times,
1114 which could happen with non-exact overlap. */
1115 if (DEBUG_INSN_P (insn
))
1117 /* Otherwise, find any other chains that do not match exactly;
1118 ensure they all get marked unrenamable. */
1119 p
= &head
->next_chain
;
1123 /* Whether the terminated chain can be used for renaming
1124 depends on the action and this being an exact match.
1125 In either case, we remove this element from open_chains. */
1127 if ((action
== terminate_dead
|| action
== terminate_write
)
1128 && (superset
|| subset
))
1132 if (subset
&& !superset
)
1133 head
->cannot_rename
= 1;
1134 bitmap_clear_bit (&open_chains_set
, head
->id
);
1136 nregs
= head
->nregs
;
1139 CLEAR_HARD_REG_BIT (live_in_chains
, head
->regno
+ nregs
);
1140 if (subset
&& !superset
1141 && (head
->regno
+ nregs
< this_regno
1142 || head
->regno
+ nregs
>= this_regno
+ this_nregs
))
1143 SET_HARD_REG_BIT (live_hard_regs
, head
->regno
+ nregs
);
1149 "Closing chain %s (%d) at insn %d (%s%s)\n",
1150 reg_names
[head
->regno
], head
->id
, INSN_UID (insn
),
1151 scan_actions_name
[(int) action
],
1152 superset
? ", superset" : subset
? ", subset" : "");
1154 else if (action
== terminate_dead
|| action
== terminate_write
)
1156 /* In this case, tracking liveness gets too hard. Fail the
1157 entire basic block. */
1160 "Failing basic block due to unhandled overlap\n");
1161 fail_current_block
= true;
1166 head
->cannot_rename
= 1;
1169 "Cannot rename chain %s (%d) at insn %d (%s)\n",
1170 reg_names
[head
->regno
], head
->id
, INSN_UID (insn
),
1171 scan_actions_name
[(int) action
]);
1172 p
= &head
->next_chain
;
1177 /* Adapted from find_reloads_address_1. CL is INDEX_REG_CLASS or
1178 BASE_REG_CLASS depending on how the register is being considered. */
1181 scan_rtx_address (rtx insn
, rtx
*loc
, enum reg_class cl
,
1182 enum scan_actions action
, enum machine_mode mode
,
1186 RTX_CODE code
= GET_CODE (x
);
1190 if (action
== mark_write
|| action
== mark_access
)
1197 rtx orig_op0
= XEXP (x
, 0);
1198 rtx orig_op1
= XEXP (x
, 1);
1199 RTX_CODE code0
= GET_CODE (orig_op0
);
1200 RTX_CODE code1
= GET_CODE (orig_op1
);
1205 enum rtx_code index_code
= SCRATCH
;
1207 if (GET_CODE (op0
) == SUBREG
)
1209 op0
= SUBREG_REG (op0
);
1210 code0
= GET_CODE (op0
);
1213 if (GET_CODE (op1
) == SUBREG
)
1215 op1
= SUBREG_REG (op1
);
1216 code1
= GET_CODE (op1
);
1219 if (code0
== MULT
|| code0
== SIGN_EXTEND
|| code0
== TRUNCATE
1220 || code0
== ZERO_EXTEND
|| code1
== MEM
)
1222 locI
= &XEXP (x
, 0);
1223 locB
= &XEXP (x
, 1);
1224 index_code
= GET_CODE (*locI
);
1226 else if (code1
== MULT
|| code1
== SIGN_EXTEND
|| code1
== TRUNCATE
1227 || code1
== ZERO_EXTEND
|| code0
== MEM
)
1229 locI
= &XEXP (x
, 1);
1230 locB
= &XEXP (x
, 0);
1231 index_code
= GET_CODE (*locI
);
1233 else if (code0
== CONST_INT
|| code0
== CONST
1234 || code0
== SYMBOL_REF
|| code0
== LABEL_REF
)
1236 locB
= &XEXP (x
, 1);
1237 index_code
= GET_CODE (XEXP (x
, 0));
1239 else if (code1
== CONST_INT
|| code1
== CONST
1240 || code1
== SYMBOL_REF
|| code1
== LABEL_REF
)
1242 locB
= &XEXP (x
, 0);
1243 index_code
= GET_CODE (XEXP (x
, 1));
1245 else if (code0
== REG
&& code1
== REG
)
1248 unsigned regno0
= REGNO (op0
), regno1
= REGNO (op1
);
1250 if (REGNO_OK_FOR_INDEX_P (regno1
)
1251 && regno_ok_for_base_p (regno0
, mode
, as
, PLUS
, REG
))
1253 else if (REGNO_OK_FOR_INDEX_P (regno0
)
1254 && regno_ok_for_base_p (regno1
, mode
, as
, PLUS
, REG
))
1256 else if (regno_ok_for_base_p (regno0
, mode
, as
, PLUS
, REG
)
1257 || REGNO_OK_FOR_INDEX_P (regno1
))
1259 else if (regno_ok_for_base_p (regno1
, mode
, as
, PLUS
, REG
))
1264 locI
= &XEXP (x
, index_op
);
1265 locB
= &XEXP (x
, !index_op
);
1266 index_code
= GET_CODE (*locI
);
1268 else if (code0
== REG
)
1270 locI
= &XEXP (x
, 0);
1271 locB
= &XEXP (x
, 1);
1272 index_code
= GET_CODE (*locI
);
1274 else if (code1
== REG
)
1276 locI
= &XEXP (x
, 1);
1277 locB
= &XEXP (x
, 0);
1278 index_code
= GET_CODE (*locI
);
1282 scan_rtx_address (insn
, locI
, INDEX_REG_CLASS
, action
, mode
, as
);
1284 scan_rtx_address (insn
, locB
,
1285 base_reg_class (mode
, as
, PLUS
, index_code
),
1297 #ifndef AUTO_INC_DEC
1298 /* If the target doesn't claim to handle autoinc, this must be
1299 something special, like a stack push. Kill this chain. */
1300 action
= mark_all_read
;
1305 scan_rtx_address (insn
, &XEXP (x
, 0),
1306 base_reg_class (GET_MODE (x
), MEM_ADDR_SPACE (x
),
1308 action
, GET_MODE (x
), MEM_ADDR_SPACE (x
));
1312 scan_rtx_reg (insn
, loc
, cl
, action
, OP_IN
);
1319 fmt
= GET_RTX_FORMAT (code
);
1320 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
1323 scan_rtx_address (insn
, &XEXP (x
, i
), cl
, action
, mode
, as
);
1324 else if (fmt
[i
] == 'E')
1325 for (j
= XVECLEN (x
, i
) - 1; j
>= 0; j
--)
1326 scan_rtx_address (insn
, &XVECEXP (x
, i
, j
), cl
, action
, mode
, as
);
1331 scan_rtx (rtx insn
, rtx
*loc
, enum reg_class cl
, enum scan_actions action
,
1336 enum rtx_code code
= GET_CODE (x
);
1339 code
= GET_CODE (x
);
1351 scan_rtx_reg (insn
, loc
, cl
, action
, type
);
1355 scan_rtx_address (insn
, &XEXP (x
, 0),
1356 base_reg_class (GET_MODE (x
), MEM_ADDR_SPACE (x
),
1358 action
, GET_MODE (x
), MEM_ADDR_SPACE (x
));
1362 scan_rtx (insn
, &SET_SRC (x
), cl
, action
, OP_IN
);
1363 scan_rtx (insn
, &SET_DEST (x
), cl
, action
,
1364 (GET_CODE (PATTERN (insn
)) == COND_EXEC
1365 && verify_reg_tracked (SET_DEST (x
))) ? OP_INOUT
: OP_OUT
);
1368 case STRICT_LOW_PART
:
1369 scan_rtx (insn
, &XEXP (x
, 0), cl
, action
,
1370 verify_reg_tracked (XEXP (x
, 0)) ? OP_INOUT
: OP_OUT
);
1375 scan_rtx (insn
, &XEXP (x
, 0), cl
, action
,
1376 (type
== OP_IN
? OP_IN
:
1377 verify_reg_tracked (XEXP (x
, 0)) ? OP_INOUT
: OP_OUT
));
1378 scan_rtx (insn
, &XEXP (x
, 1), cl
, action
, OP_IN
);
1379 scan_rtx (insn
, &XEXP (x
, 2), cl
, action
, OP_IN
);
1388 /* Should only happen inside MEM. */
1392 scan_rtx (insn
, &SET_DEST (x
), cl
, action
,
1393 (GET_CODE (PATTERN (insn
)) == COND_EXEC
1394 && verify_reg_tracked (SET_DEST (x
))) ? OP_INOUT
: OP_OUT
);
1398 scan_rtx (insn
, &XEXP (x
, 0), cl
, action
, type
);
1400 scan_rtx (insn
, &XEXP (x
, 1), cl
, action
, type
);
1407 fmt
= GET_RTX_FORMAT (code
);
1408 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
1411 scan_rtx (insn
, &XEXP (x
, i
), cl
, action
, type
);
1412 else if (fmt
[i
] == 'E')
1413 for (j
= XVECLEN (x
, i
) - 1; j
>= 0; j
--)
1414 scan_rtx (insn
, &XVECEXP (x
, i
, j
), cl
, action
, type
);
1418 /* Hide operands of the current insn (of which there are N_OPS) by
1419 substituting cc0 for them.
1420 Previous values are stored in the OLD_OPERANDS and OLD_DUPS.
1421 For every bit set in DO_NOT_HIDE, we leave the operand alone.
1422 If INOUT_AND_EC_ONLY is set, we only do this for OP_INOUT type operands
1423 and earlyclobbers. */
1426 hide_operands (int n_ops
, rtx
*old_operands
, rtx
*old_dups
,
1427 unsigned HOST_WIDE_INT do_not_hide
, bool inout_and_ec_only
)
1430 int alt
= which_alternative
;
1431 for (i
= 0; i
< n_ops
; i
++)
1433 old_operands
[i
] = recog_data
.operand
[i
];
1434 /* Don't squash match_operator or match_parallel here, since
1435 we don't know that all of the contained registers are
1436 reachable by proper operands. */
1437 if (recog_data
.constraints
[i
][0] == '\0')
1439 if (do_not_hide
& (1 << i
))
1441 if (!inout_and_ec_only
|| recog_data
.operand_type
[i
] == OP_INOUT
1442 || recog_op_alt
[i
][alt
].earlyclobber
)
1443 *recog_data
.operand_loc
[i
] = cc0_rtx
;
1445 for (i
= 0; i
< recog_data
.n_dups
; i
++)
1447 int opn
= recog_data
.dup_num
[i
];
1448 old_dups
[i
] = *recog_data
.dup_loc
[i
];
1449 if (do_not_hide
& (1 << opn
))
1451 if (!inout_and_ec_only
|| recog_data
.operand_type
[opn
] == OP_INOUT
1452 || recog_op_alt
[opn
][alt
].earlyclobber
)
1453 *recog_data
.dup_loc
[i
] = cc0_rtx
;
1457 /* Undo the substitution performed by hide_operands. INSN is the insn we
1458 are processing; the arguments are the same as in hide_operands. */
1461 restore_operands (rtx insn
, int n_ops
, rtx
*old_operands
, rtx
*old_dups
)
1464 for (i
= 0; i
< recog_data
.n_dups
; i
++)
1465 *recog_data
.dup_loc
[i
] = old_dups
[i
];
1466 for (i
= 0; i
< n_ops
; i
++)
1467 *recog_data
.operand_loc
[i
] = old_operands
[i
];
1468 if (recog_data
.n_dups
)
1469 df_insn_rescan (insn
);
1472 /* For each output operand of INSN, call scan_rtx to create a new
1473 open chain. Do this only for normal or earlyclobber outputs,
1474 depending on EARLYCLOBBER. If INSN_INFO is nonnull, use it to
1475 record information about the operands in the insn. */
1478 record_out_operands (rtx insn
, bool earlyclobber
, insn_rr_info
*insn_info
)
1480 int n_ops
= recog_data
.n_operands
;
1481 int alt
= which_alternative
;
1485 for (i
= 0; i
< n_ops
+ recog_data
.n_dups
; i
++)
1487 int opn
= i
< n_ops
? i
: recog_data
.dup_num
[i
- n_ops
];
1488 rtx
*loc
= (i
< n_ops
1489 ? recog_data
.operand_loc
[opn
]
1490 : recog_data
.dup_loc
[i
- n_ops
]);
1492 enum reg_class cl
= recog_op_alt
[opn
][alt
].cl
;
1494 struct du_head
*prev_open
;
1496 if (recog_data
.operand_type
[opn
] != OP_OUT
1497 || recog_op_alt
[opn
][alt
].earlyclobber
!= earlyclobber
)
1501 cur_operand
= insn_info
->op_info
+ i
;
1503 prev_open
= open_chains
;
1504 scan_rtx (insn
, loc
, cl
, mark_write
, OP_OUT
);
1506 /* ??? Many targets have output constraints on the SET_DEST
1507 of a call insn, which is stupid, since these are certainly
1508 ABI defined hard registers. For these, and for asm operands
1509 that originally referenced hard registers, we must record that
1510 the chain cannot be renamed. */
1512 || (asm_noperands (PATTERN (insn
)) > 0
1514 && REGNO (op
) == ORIGINAL_REGNO (op
)))
1516 if (prev_open
!= open_chains
)
1517 open_chains
->cannot_rename
= 1;
1523 /* Build def/use chain. */
1526 build_def_use (basic_block bb
)
1529 unsigned HOST_WIDE_INT untracked_operands
;
1531 fail_current_block
= false;
1533 for (insn
= BB_HEAD (bb
); ; insn
= NEXT_INSN (insn
))
1535 if (NONDEBUG_INSN_P (insn
))
1539 rtx old_operands
[MAX_RECOG_OPERANDS
];
1540 rtx old_dups
[MAX_DUP_OPERANDS
];
1544 enum rtx_code set_code
= SET
;
1545 enum rtx_code clobber_code
= CLOBBER
;
1546 insn_rr_info
*insn_info
= NULL
;
1548 /* Process the insn, determining its effect on the def-use
1549 chains and live hard registers. We perform the following
1550 steps with the register references in the insn, simulating
1552 (1) Deal with earlyclobber operands and CLOBBERs of non-operands
1553 by creating chains and marking hard regs live.
1554 (2) Any read outside an operand causes any chain it overlaps
1555 with to be marked unrenamable.
1556 (3) Any read inside an operand is added if there's already
1557 an open chain for it.
1558 (4) For any REG_DEAD note we find, close open chains that
1560 (5) For any non-earlyclobber write we find, close open chains
1562 (6) For any non-earlyclobber write we find in an operand, make
1563 a new chain or mark the hard register as live.
1564 (7) For any REG_UNUSED, close any chains we just opened.
1566 We cannot deal with situations where we track a reg in one mode
1567 and see a reference in another mode; these will cause the chain
1568 to be marked unrenamable or even cause us to abort the entire
1571 extract_insn (insn
);
1572 if (! constrain_operands (1))
1573 fatal_insn_not_found (insn
);
1574 preprocess_constraints ();
1575 alt
= which_alternative
;
1576 n_ops
= recog_data
.n_operands
;
1577 untracked_operands
= 0;
1579 if (insn_rr
.exists ())
1581 insn_info
= &insn_rr
[INSN_UID (insn
)];
1582 insn_info
->op_info
= XOBNEWVEC (&rename_obstack
, operand_rr_info
,
1583 recog_data
.n_operands
);
1584 memset (insn_info
->op_info
, 0,
1585 sizeof (operand_rr_info
) * recog_data
.n_operands
);
1588 /* Simplify the code below by rewriting things to reflect
1589 matching constraints. Also promote OP_OUT to OP_INOUT in
1590 predicated instructions, but only for register operands
1591 that are already tracked, so that we can create a chain
1592 when the first SET makes a register live. */
1594 predicated
= GET_CODE (PATTERN (insn
)) == COND_EXEC
;
1595 for (i
= 0; i
< n_ops
; ++i
)
1597 rtx op
= recog_data
.operand
[i
];
1598 int matches
= recog_op_alt
[i
][alt
].matches
;
1600 recog_op_alt
[i
][alt
].cl
= recog_op_alt
[matches
][alt
].cl
;
1601 if (matches
>= 0 || recog_op_alt
[i
][alt
].matched
>= 0
1602 || (predicated
&& recog_data
.operand_type
[i
] == OP_OUT
))
1604 recog_data
.operand_type
[i
] = OP_INOUT
;
1605 /* A special case to deal with instruction patterns that
1606 have matching operands with different modes. If we're
1607 not already tracking such a reg, we won't start here,
1608 and we must instead make sure to make the operand visible
1609 to the machinery that tracks hard registers. */
1611 && (GET_MODE_SIZE (recog_data
.operand_mode
[i
])
1612 != GET_MODE_SIZE (recog_data
.operand_mode
[matches
]))
1613 && !verify_reg_in_set (op
, &live_in_chains
))
1615 untracked_operands
|= 1 << i
;
1616 untracked_operands
|= 1 << matches
;
1619 /* If there's an in-out operand with a register that is not
1620 being tracked at all yet, open a chain. */
1621 if (recog_data
.operand_type
[i
] == OP_INOUT
1622 && !(untracked_operands
& (1 << i
))
1624 && !verify_reg_tracked (op
))
1626 enum machine_mode mode
= GET_MODE (op
);
1627 unsigned this_regno
= REGNO (op
);
1628 unsigned this_nregs
= hard_regno_nregs
[this_regno
][mode
];
1629 create_new_chain (this_regno
, this_nregs
, NULL
, NULL_RTX
,
1634 if (fail_current_block
)
1637 /* Step 1a: Mark hard registers that are clobbered in this insn,
1638 outside an operand, as live. */
1639 hide_operands (n_ops
, old_operands
, old_dups
, untracked_operands
,
1641 note_stores (PATTERN (insn
), note_sets_clobbers
, &clobber_code
);
1642 restore_operands (insn
, n_ops
, old_operands
, old_dups
);
1644 /* Step 1b: Begin new chains for earlyclobbered writes inside
1646 record_out_operands (insn
, true, insn_info
);
1648 /* Step 2: Mark chains for which we have reads outside operands
1650 We do this by munging all operands into CC0, and closing
1651 everything remaining. */
1653 hide_operands (n_ops
, old_operands
, old_dups
, untracked_operands
,
1655 scan_rtx (insn
, &PATTERN (insn
), NO_REGS
, mark_all_read
, OP_IN
);
1656 restore_operands (insn
, n_ops
, old_operands
, old_dups
);
1658 /* Step 2B: Can't rename function call argument registers. */
1659 if (CALL_P (insn
) && CALL_INSN_FUNCTION_USAGE (insn
))
1660 scan_rtx (insn
, &CALL_INSN_FUNCTION_USAGE (insn
),
1661 NO_REGS
, mark_all_read
, OP_IN
);
1663 /* Step 2C: Can't rename asm operands that were originally
1665 if (asm_noperands (PATTERN (insn
)) > 0)
1666 for (i
= 0; i
< n_ops
; i
++)
1668 rtx
*loc
= recog_data
.operand_loc
[i
];
1672 && REGNO (op
) == ORIGINAL_REGNO (op
)
1673 && (recog_data
.operand_type
[i
] == OP_IN
1674 || recog_data
.operand_type
[i
] == OP_INOUT
))
1675 scan_rtx (insn
, loc
, NO_REGS
, mark_all_read
, OP_IN
);
1678 /* Step 3: Append to chains for reads inside operands. */
1679 for (i
= 0; i
< n_ops
+ recog_data
.n_dups
; i
++)
1681 int opn
= i
< n_ops
? i
: recog_data
.dup_num
[i
- n_ops
];
1682 rtx
*loc
= (i
< n_ops
1683 ? recog_data
.operand_loc
[opn
]
1684 : recog_data
.dup_loc
[i
- n_ops
]);
1685 enum reg_class cl
= recog_op_alt
[opn
][alt
].cl
;
1686 enum op_type type
= recog_data
.operand_type
[opn
];
1688 /* Don't scan match_operand here, since we've no reg class
1689 information to pass down. Any operands that we could
1690 substitute in will be represented elsewhere. */
1691 if (recog_data
.constraints
[opn
][0] == '\0'
1692 || untracked_operands
& (1 << opn
))
1696 cur_operand
= i
== opn
? insn_info
->op_info
+ i
: NULL
;
1697 if (recog_op_alt
[opn
][alt
].is_address
)
1698 scan_rtx_address (insn
, loc
, cl
, mark_read
,
1699 VOIDmode
, ADDR_SPACE_GENERIC
);
1701 scan_rtx (insn
, loc
, cl
, mark_read
, type
);
1705 /* Step 3B: Record updates for regs in REG_INC notes, and
1706 source regs in REG_FRAME_RELATED_EXPR notes. */
1707 for (note
= REG_NOTES (insn
); note
; note
= XEXP (note
, 1))
1708 if (REG_NOTE_KIND (note
) == REG_INC
1709 || REG_NOTE_KIND (note
) == REG_FRAME_RELATED_EXPR
)
1710 scan_rtx (insn
, &XEXP (note
, 0), ALL_REGS
, mark_read
,
1713 /* Step 4: Close chains for registers that die here, unless
1714 the register is mentioned in a REG_UNUSED note. In that
1715 case we keep the chain open until step #7 below to ensure
1716 it conflicts with other output operands of this insn.
1717 See PR 52573. Arguably the insn should not have both
1718 notes; it has proven difficult to fix that without
1719 other undesirable side effects. */
1720 for (note
= REG_NOTES (insn
); note
; note
= XEXP (note
, 1))
1721 if (REG_NOTE_KIND (note
) == REG_DEAD
1722 && !find_regno_note (insn
, REG_UNUSED
, REGNO (XEXP (note
, 0))))
1724 remove_from_hard_reg_set (&live_hard_regs
,
1725 GET_MODE (XEXP (note
, 0)),
1726 REGNO (XEXP (note
, 0)));
1727 scan_rtx (insn
, &XEXP (note
, 0), NO_REGS
, terminate_dead
,
1731 /* Step 4B: If this is a call, any chain live at this point
1732 requires a caller-saved reg. */
1736 for (p
= open_chains
; p
; p
= p
->next_chain
)
1737 p
->need_caller_save_reg
= 1;
1740 /* Step 5: Close open chains that overlap writes. Similar to
1741 step 2, we hide in-out operands, since we do not want to
1742 close these chains. We also hide earlyclobber operands,
1743 since we've opened chains for them in step 1, and earlier
1744 chains they would overlap with must have been closed at
1745 the previous insn at the latest, as such operands cannot
1746 possibly overlap with any input operands. */
1748 hide_operands (n_ops
, old_operands
, old_dups
, untracked_operands
,
1750 scan_rtx (insn
, &PATTERN (insn
), NO_REGS
, terminate_write
, OP_IN
);
1751 restore_operands (insn
, n_ops
, old_operands
, old_dups
);
1753 /* Step 6a: Mark hard registers that are set in this insn,
1754 outside an operand, as live. */
1755 hide_operands (n_ops
, old_operands
, old_dups
, untracked_operands
,
1757 note_stores (PATTERN (insn
), note_sets_clobbers
, &set_code
);
1758 restore_operands (insn
, n_ops
, old_operands
, old_dups
);
1760 /* Step 6b: Begin new chains for writes inside operands. */
1761 record_out_operands (insn
, false, insn_info
);
1763 /* Step 6c: Record destination regs in REG_FRAME_RELATED_EXPR
1764 notes for update. */
1765 for (note
= REG_NOTES (insn
); note
; note
= XEXP (note
, 1))
1766 if (REG_NOTE_KIND (note
) == REG_FRAME_RELATED_EXPR
)
1767 scan_rtx (insn
, &XEXP (note
, 0), ALL_REGS
, mark_access
,
1770 /* Step 7: Close chains for registers that were never
1771 really used here. */
1772 for (note
= REG_NOTES (insn
); note
; note
= XEXP (note
, 1))
1773 if (REG_NOTE_KIND (note
) == REG_UNUSED
)
1775 remove_from_hard_reg_set (&live_hard_regs
,
1776 GET_MODE (XEXP (note
, 0)),
1777 REGNO (XEXP (note
, 0)));
1778 scan_rtx (insn
, &XEXP (note
, 0), NO_REGS
, terminate_dead
,
1782 else if (DEBUG_INSN_P (insn
)
1783 && !VAR_LOC_UNKNOWN_P (INSN_VAR_LOCATION_LOC (insn
)))
1785 scan_rtx (insn
, &INSN_VAR_LOCATION_LOC (insn
),
1786 ALL_REGS
, mark_read
, OP_IN
);
1788 if (insn
== BB_END (bb
))
1792 if (fail_current_block
)
1798 /* Initialize the register renamer. If INSN_INFO is true, ensure that
1799 insn_rr is nonnull. */
1801 regrename_init (bool insn_info
)
1803 gcc_obstack_init (&rename_obstack
);
1806 insn_rr
.safe_grow_cleared (get_max_uid ());
1809 /* Free all global data used by the register renamer. */
1811 regrename_finish (void)
1815 obstack_free (&rename_obstack
, NULL
);
1818 /* Perform register renaming on the current function. */
1821 regrename_optimize (void)
1823 df_set_flags (DF_LR_RUN_DCE
);
1824 df_note_add_problem ();
1826 df_set_flags (DF_DEFER_INSN_RESCAN
);
1828 regrename_init (false);
1830 regrename_analyze (NULL
);
1834 regrename_finish ();
1840 gate_handle_regrename (void)
1842 return (optimize
> 0 && (flag_rename_registers
));
1845 struct rtl_opt_pass pass_regrename
=
1850 OPTGROUP_NONE
, /* optinfo_flags */
1851 gate_handle_regrename
, /* gate */
1852 regrename_optimize
, /* execute */
1855 0, /* static_pass_number */
1856 TV_RENAME_REGISTERS
, /* tv_id */
1857 0, /* properties_required */
1858 0, /* properties_provided */
1859 0, /* properties_destroyed */
1860 0, /* todo_flags_start */
1861 TODO_df_finish
| TODO_verify_rtl_sharing
|
1862 0 /* todo_flags_finish */