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"
26 #include "rtl-error.h"
28 #include "insn-config.h"
30 #include "addresses.h"
36 #include "tree-pass.h"
39 #include "regrename.h"
41 /* This file implements the RTL register renaming pass of the compiler. It is
42 a semi-local pass whose goal is to maximize the usage of the register file
43 of the processor by substituting registers for others in the solution given
44 by the register allocator. The algorithm is as follows:
46 1. Local def/use chains are built: within each basic block, chains are
47 opened and closed; if a chain isn't closed at the end of the block,
48 it is dropped. We pre-open chains if we have already examined a
49 predecessor block and found chains live at the end which match
50 live registers at the start of the new block.
52 2. We try to combine the local chains across basic block boundaries by
53 comparing chains that were open at the start or end of a block to
54 those in successor/predecessor blocks.
56 3. For each chain, the set of possible renaming registers is computed.
57 This takes into account the renaming of previously processed chains.
58 Optionally, a preferred class is computed for the renaming register.
60 4. The best renaming register is computed for the chain in the above set,
61 using a round-robin allocation. If a preferred class exists, then the
62 round-robin allocation is done within the class first, if possible.
63 The round-robin allocation of renaming registers itself is global.
65 5. If a renaming register has been found, it is substituted in the chain.
67 Targets can parameterize the pass by specifying a preferred class for the
68 renaming register for a given (super)class of registers to be renamed. */
70 #if HOST_BITS_PER_WIDE_INT <= MAX_RECOG_OPERANDS
71 #error "Use a different bitmap implementation for untracked_operands."
81 /* mark_access is for marking the destination regs in
82 REG_FRAME_RELATED_EXPR notes (as if they were read) so that the
83 note is updated properly. */
87 static const char * const scan_actions_name
[] =
97 /* TICK and THIS_TICK are used to record the last time we saw each
99 static int tick
[FIRST_PSEUDO_REGISTER
];
100 static int this_tick
= 0;
102 static struct obstack rename_obstack
;
104 /* If nonnull, the code calling into the register renamer requested
105 information about insn operands, and we store it here. */
106 vec
<insn_rr_info
> insn_rr
;
108 static void scan_rtx (rtx_insn
*, rtx
*, enum reg_class
, enum scan_actions
,
110 static bool build_def_use (basic_block
);
112 /* The id to be given to the next opened chain. */
113 static unsigned current_id
;
115 /* A mapping of unique id numbers to chains. */
116 static vec
<du_head_p
> id_to_chain
;
118 /* List of currently open chains. */
119 static struct du_head
*open_chains
;
121 /* Bitmap of open chains. The bits set always match the list found in
123 static bitmap_head open_chains_set
;
125 /* Record the registers being tracked in open_chains. */
126 static HARD_REG_SET live_in_chains
;
128 /* Record the registers that are live but not tracked. The intersection
129 between this and live_in_chains is empty. */
130 static HARD_REG_SET live_hard_regs
;
132 /* Set while scanning RTL if INSN_RR is nonnull, i.e. if the current analysis
133 is for a caller that requires operand data. Used in
134 record_operand_use. */
135 static operand_rr_info
*cur_operand
;
137 /* Return the chain corresponding to id number ID. Take into account that
138 chains may have been merged. */
140 regrename_chain_from_id (unsigned int id
)
142 du_head_p first_chain
= id_to_chain
[id
];
143 du_head_p chain
= first_chain
;
144 while (chain
->id
!= id
)
147 chain
= id_to_chain
[id
];
149 first_chain
->id
= id
;
153 /* Dump all def/use chains, starting at id FROM. */
156 dump_def_use_chain (int from
)
160 FOR_EACH_VEC_ELT_FROM (id_to_chain
, i
, head
, from
)
162 struct du_chain
*this_du
= head
->first
;
164 fprintf (dump_file
, "Register %s (%d):",
165 reg_names
[head
->regno
], head
->nregs
);
168 fprintf (dump_file
, " %d [%s]", INSN_UID (this_du
->insn
),
169 reg_class_names
[this_du
->cl
]);
170 this_du
= this_du
->next_use
;
172 fprintf (dump_file
, "\n");
173 head
= head
->next_chain
;
178 free_chain_data (void)
182 for (i
= 0; id_to_chain
.iterate (i
, &ptr
); i
++)
183 bitmap_clear (&ptr
->conflicts
);
185 id_to_chain
.release ();
188 /* Walk all chains starting with CHAINS and record that they conflict with
189 another chain whose id is ID. */
192 mark_conflict (struct du_head
*chains
, unsigned id
)
196 bitmap_set_bit (&chains
->conflicts
, id
);
197 chains
= chains
->next_chain
;
201 /* Examine cur_operand, and if it is nonnull, record information about the
202 use THIS_DU which is part of the chain HEAD. */
205 record_operand_use (struct du_head
*head
, struct du_chain
*this_du
)
207 if (cur_operand
== NULL
)
209 gcc_assert (cur_operand
->n_chains
< MAX_REGS_PER_ADDRESS
);
210 cur_operand
->heads
[cur_operand
->n_chains
] = head
;
211 cur_operand
->chains
[cur_operand
->n_chains
++] = this_du
;
214 /* Create a new chain for THIS_NREGS registers starting at THIS_REGNO,
215 and record its occurrence in *LOC, which is being written to in INSN.
216 This access requires a register of class CL. */
219 create_new_chain (unsigned this_regno
, unsigned this_nregs
, rtx
*loc
,
220 rtx_insn
*insn
, enum reg_class cl
)
222 struct du_head
*head
= XOBNEW (&rename_obstack
, struct du_head
);
223 struct du_chain
*this_du
;
226 head
->next_chain
= open_chains
;
227 head
->regno
= this_regno
;
228 head
->nregs
= this_nregs
;
229 head
->need_caller_save_reg
= 0;
230 head
->cannot_rename
= 0;
232 id_to_chain
.safe_push (head
);
233 head
->id
= current_id
++;
235 bitmap_initialize (&head
->conflicts
, &bitmap_default_obstack
);
236 bitmap_copy (&head
->conflicts
, &open_chains_set
);
237 mark_conflict (open_chains
, head
->id
);
239 /* Since we're tracking this as a chain now, remove it from the
240 list of conflicting live hard registers and track it in
241 live_in_chains instead. */
245 SET_HARD_REG_BIT (live_in_chains
, head
->regno
+ nregs
);
246 CLEAR_HARD_REG_BIT (live_hard_regs
, head
->regno
+ nregs
);
249 COPY_HARD_REG_SET (head
->hard_conflicts
, live_hard_regs
);
250 bitmap_set_bit (&open_chains_set
, head
->id
);
256 fprintf (dump_file
, "Creating chain %s (%d)",
257 reg_names
[head
->regno
], head
->id
);
258 if (insn
!= NULL_RTX
)
259 fprintf (dump_file
, " at insn %d", INSN_UID (insn
));
260 fprintf (dump_file
, "\n");
263 if (insn
== NULL_RTX
)
265 head
->first
= head
->last
= NULL
;
269 this_du
= XOBNEW (&rename_obstack
, struct du_chain
);
270 head
->first
= head
->last
= this_du
;
272 this_du
->next_use
= 0;
274 this_du
->insn
= insn
;
276 record_operand_use (head
, this_du
);
280 /* For a def-use chain HEAD, find which registers overlap its lifetime and
281 set the corresponding bits in *PSET. */
284 merge_overlapping_regs (HARD_REG_SET
*pset
, struct du_head
*head
)
288 IOR_HARD_REG_SET (*pset
, head
->hard_conflicts
);
289 EXECUTE_IF_SET_IN_BITMAP (&head
->conflicts
, 0, i
, bi
)
291 du_head_p other
= regrename_chain_from_id (i
);
292 unsigned j
= other
->nregs
;
293 gcc_assert (other
!= head
);
295 SET_HARD_REG_BIT (*pset
, other
->regno
+ j
);
299 /* Check if NEW_REG can be the candidate register to rename for
300 REG in THIS_HEAD chain. THIS_UNAVAILABLE is a set of unavailable hard
304 check_new_reg_p (int reg ATTRIBUTE_UNUSED
, int new_reg
,
305 struct du_head
*this_head
, HARD_REG_SET this_unavailable
)
307 machine_mode mode
= GET_MODE (*this_head
->first
->loc
);
308 int nregs
= hard_regno_nregs
[new_reg
][mode
];
310 struct du_chain
*tmp
;
312 for (i
= nregs
- 1; i
>= 0; --i
)
313 if (TEST_HARD_REG_BIT (this_unavailable
, new_reg
+ i
)
314 || fixed_regs
[new_reg
+ i
]
315 || global_regs
[new_reg
+ i
]
316 /* Can't use regs which aren't saved by the prologue. */
317 || (! df_regs_ever_live_p (new_reg
+ i
)
318 && ! call_used_regs
[new_reg
+ i
])
319 #ifdef LEAF_REGISTERS
320 /* We can't use a non-leaf register if we're in a
323 && !LEAF_REGISTERS
[new_reg
+ i
])
325 || ! HARD_REGNO_RENAME_OK (reg
+ i
, new_reg
+ i
))
328 /* See whether it accepts all modes that occur in
329 definition and uses. */
330 for (tmp
= this_head
->first
; tmp
; tmp
= tmp
->next_use
)
331 if ((! HARD_REGNO_MODE_OK (new_reg
, GET_MODE (*tmp
->loc
))
332 && ! DEBUG_INSN_P (tmp
->insn
))
333 || (this_head
->need_caller_save_reg
334 && ! (HARD_REGNO_CALL_PART_CLOBBERED
335 (reg
, GET_MODE (*tmp
->loc
)))
336 && (HARD_REGNO_CALL_PART_CLOBBERED
337 (new_reg
, GET_MODE (*tmp
->loc
)))))
343 /* For the chain THIS_HEAD, compute and return the best register to
344 rename to. SUPER_CLASS is the superunion of register classes in
345 the chain. UNAVAILABLE is a set of registers that cannot be used.
346 OLD_REG is the register currently used for the chain. BEST_RENAME
347 controls whether the register chosen must be better than the
348 current one or just respect the given constraint. */
351 find_rename_reg (du_head_p this_head
, enum reg_class super_class
,
352 HARD_REG_SET
*unavailable
, int old_reg
, bool best_rename
)
354 bool has_preferred_class
;
355 enum reg_class preferred_class
;
357 int best_new_reg
= old_reg
;
359 /* Further narrow the set of registers we can use for renaming.
360 If the chain needs a call-saved register, mark the call-used
361 registers as unavailable. */
362 if (this_head
->need_caller_save_reg
)
363 IOR_HARD_REG_SET (*unavailable
, call_used_reg_set
);
365 /* Mark registers that overlap this chain's lifetime as unavailable. */
366 merge_overlapping_regs (unavailable
, this_head
);
368 /* Compute preferred rename class of super union of all the classes
371 = (enum reg_class
) targetm
.preferred_rename_class (super_class
);
373 /* If PREFERRED_CLASS is not NO_REGS, we iterate in the first pass
374 over registers that belong to PREFERRED_CLASS and try to find the
375 best register within the class. If that failed, we iterate in
376 the second pass over registers that don't belong to the class.
377 If PREFERRED_CLASS is NO_REGS, we iterate over all registers in
378 ascending order without any preference. */
379 has_preferred_class
= (preferred_class
!= NO_REGS
);
380 for (pass
= (has_preferred_class
? 0 : 1); pass
< 2; pass
++)
383 for (new_reg
= 0; new_reg
< FIRST_PSEUDO_REGISTER
; new_reg
++)
385 if (has_preferred_class
387 != TEST_HARD_REG_BIT (reg_class_contents
[preferred_class
],
391 if (!check_new_reg_p (old_reg
, new_reg
, this_head
, *unavailable
))
397 /* In the first pass, we force the renaming of registers that
398 don't belong to PREFERRED_CLASS to registers that do, even
399 though the latters were used not very long ago. */
401 && !TEST_HARD_REG_BIT (reg_class_contents
[preferred_class
],
403 || tick
[best_new_reg
] > tick
[new_reg
])
404 best_new_reg
= new_reg
;
406 if (pass
== 0 && best_new_reg
!= old_reg
)
412 /* Perform register renaming on the current function. */
416 HARD_REG_SET unavailable
;
420 memset (tick
, 0, sizeof tick
);
422 CLEAR_HARD_REG_SET (unavailable
);
423 /* Don't clobber traceback for noreturn functions. */
424 if (frame_pointer_needed
)
426 add_to_hard_reg_set (&unavailable
, Pmode
, FRAME_POINTER_REGNUM
);
427 if (!HARD_FRAME_POINTER_IS_FRAME_POINTER
)
428 add_to_hard_reg_set (&unavailable
, Pmode
, HARD_FRAME_POINTER_REGNUM
);
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 || (!HARD_FRAME_POINTER_IS_FRAME_POINTER
&& frame_pointer_needed
445 && reg
== HARD_FRAME_POINTER_REGNUM
)
446 || (HARD_FRAME_POINTER_REGNUM
&& frame_pointer_needed
447 && reg
== FRAME_POINTER_REGNUM
))
450 COPY_HARD_REG_SET (this_unavailable
, unavailable
);
452 /* Iterate over elements in the chain in order to:
453 1. Count number of uses, and narrow the set of registers we can
455 2. Compute the superunion of register classes in this chain. */
457 super_class
= NO_REGS
;
458 for (tmp
= this_head
->first
; tmp
; tmp
= tmp
->next_use
)
460 if (DEBUG_INSN_P (tmp
->insn
))
463 IOR_COMPL_HARD_REG_SET (this_unavailable
,
464 reg_class_contents
[tmp
->cl
]);
466 = reg_class_superunion
[(int) super_class
][(int) tmp
->cl
];
472 best_new_reg
= find_rename_reg (this_head
, super_class
,
473 &this_unavailable
, reg
, true);
477 fprintf (dump_file
, "Register %s in insn %d",
478 reg_names
[reg
], INSN_UID (this_head
->first
->insn
));
479 if (this_head
->need_caller_save_reg
)
480 fprintf (dump_file
, " crosses a call");
483 if (best_new_reg
== reg
)
485 tick
[reg
] = ++this_tick
;
487 fprintf (dump_file
, "; no available better choice\n");
491 if (regrename_do_replace (this_head
, best_new_reg
))
494 fprintf (dump_file
, ", renamed as %s\n", reg_names
[best_new_reg
]);
495 tick
[best_new_reg
] = ++this_tick
;
496 df_set_regs_ever_live (best_new_reg
, true);
501 fprintf (dump_file
, ", renaming as %s failed\n",
502 reg_names
[best_new_reg
]);
503 tick
[reg
] = ++this_tick
;
508 /* A structure to record information for each hard register at the start of
510 struct incoming_reg_info
{
511 /* Holds the number of registers used in the chain that gave us information
512 about this register. Zero means no information known yet, while a
513 negative value is used for something that is part of, but not the first
514 register in a multi-register value. */
516 /* Set to true if we have accesses that conflict in the number of registers
521 /* A structure recording information about each basic block. It is saved
522 and restored around basic block boundaries.
523 A pointer to such a structure is stored in each basic block's aux field
524 during regrename_analyze, except for blocks we know can't be optimized
525 (such as entry and exit blocks). */
526 struct bb_rename_info
528 /* The basic block corresponding to this structure. */
530 /* Copies of the global information. */
531 bitmap_head open_chains_set
;
532 bitmap_head incoming_open_chains_set
;
533 struct incoming_reg_info incoming
[FIRST_PSEUDO_REGISTER
];
536 /* Initialize a rename_info structure P for basic block BB, which starts a new
539 init_rename_info (struct bb_rename_info
*p
, basic_block bb
)
543 HARD_REG_SET start_chains_set
;
546 bitmap_initialize (&p
->open_chains_set
, &bitmap_default_obstack
);
547 bitmap_initialize (&p
->incoming_open_chains_set
, &bitmap_default_obstack
);
550 bitmap_clear (&open_chains_set
);
552 CLEAR_HARD_REG_SET (live_in_chains
);
553 REG_SET_TO_HARD_REG_SET (live_hard_regs
, df_get_live_in (bb
));
554 FOR_EACH_ARTIFICIAL_DEF (def
, bb
->index
)
555 if (DF_REF_FLAGS (def
) & DF_REF_AT_TOP
)
556 SET_HARD_REG_BIT (live_hard_regs
, DF_REF_REGNO (def
));
558 /* Open chains based on information from (at least one) predecessor
559 block. This gives us a chance later on to combine chains across
560 basic block boundaries. Inconsistencies (in access sizes) will
561 be caught normally and dealt with conservatively by disabling the
562 chain for renaming, and there is no risk of losing optimization
563 opportunities by opening chains either: if we did not open the
564 chains, we'd have to track the live register as a hard reg, and
565 we'd be unable to rename it in any case. */
566 CLEAR_HARD_REG_SET (start_chains_set
);
567 for (i
= 0; i
< FIRST_PSEUDO_REGISTER
; i
++)
569 struct incoming_reg_info
*iri
= p
->incoming
+ i
;
570 if (iri
->nregs
> 0 && !iri
->unusable
571 && range_in_hard_reg_set_p (live_hard_regs
, i
, iri
->nregs
))
573 SET_HARD_REG_BIT (start_chains_set
, i
);
574 remove_range_from_hard_reg_set (&live_hard_regs
, i
, iri
->nregs
);
577 for (i
= 0; i
< FIRST_PSEUDO_REGISTER
; i
++)
579 struct incoming_reg_info
*iri
= p
->incoming
+ i
;
580 if (TEST_HARD_REG_BIT (start_chains_set
, i
))
584 fprintf (dump_file
, "opening incoming chain\n");
585 chain
= create_new_chain (i
, iri
->nregs
, NULL
, NULL
, NO_REGS
);
586 bitmap_set_bit (&p
->incoming_open_chains_set
, chain
->id
);
591 /* Record in RI that the block corresponding to it has an incoming
592 live value, described by CHAIN. */
594 set_incoming_from_chain (struct bb_rename_info
*ri
, du_head_p chain
)
597 int incoming_nregs
= ri
->incoming
[chain
->regno
].nregs
;
600 /* If we've recorded the same information before, everything is fine. */
601 if (incoming_nregs
== chain
->nregs
)
604 fprintf (dump_file
, "reg %d/%d already recorded\n",
605 chain
->regno
, chain
->nregs
);
609 /* If we have no information for any of the involved registers, update
610 the incoming array. */
611 nregs
= chain
->nregs
;
613 if (ri
->incoming
[chain
->regno
+ nregs
].nregs
!= 0
614 || ri
->incoming
[chain
->regno
+ nregs
].unusable
)
618 nregs
= chain
->nregs
;
619 ri
->incoming
[chain
->regno
].nregs
= nregs
;
621 ri
->incoming
[chain
->regno
+ nregs
].nregs
= -nregs
;
623 fprintf (dump_file
, "recorded reg %d/%d\n",
624 chain
->regno
, chain
->nregs
);
628 /* There must be some kind of conflict. Prevent both the old and
629 new ranges from being used. */
630 if (incoming_nregs
< 0)
631 ri
->incoming
[chain
->regno
+ incoming_nregs
].unusable
= true;
632 for (i
= 0; i
< chain
->nregs
; i
++)
633 ri
->incoming
[chain
->regno
+ i
].unusable
= true;
636 /* Merge the two chains C1 and C2 so that all conflict information is
637 recorded and C1, and the id of C2 is changed to that of C1. */
639 merge_chains (du_head_p c1
, du_head_p c2
)
644 if (c2
->first
!= NULL
)
646 if (c1
->first
== NULL
)
647 c1
->first
= c2
->first
;
649 c1
->last
->next_use
= c2
->first
;
653 c2
->first
= c2
->last
= NULL
;
656 IOR_HARD_REG_SET (c1
->hard_conflicts
, c2
->hard_conflicts
);
657 bitmap_ior_into (&c1
->conflicts
, &c2
->conflicts
);
659 c1
->need_caller_save_reg
|= c2
->need_caller_save_reg
;
660 c1
->cannot_rename
|= c2
->cannot_rename
;
663 /* Analyze the current function and build chains for renaming. */
666 regrename_analyze (bitmap bb_mask
)
668 struct bb_rename_info
*rename_info
;
672 int *inverse_postorder
;
674 inverse_postorder
= XNEWVEC (int, last_basic_block_for_fn (cfun
));
675 n_bbs
= pre_and_rev_post_order_compute (NULL
, inverse_postorder
, false);
677 /* Gather some information about the blocks in this function. */
678 rename_info
= XCNEWVEC (struct bb_rename_info
, n_basic_blocks_for_fn (cfun
));
680 FOR_EACH_BB_FN (bb
, cfun
)
682 struct bb_rename_info
*ri
= rename_info
+ i
;
684 if (bb_mask
!= NULL
&& !bitmap_bit_p (bb_mask
, bb
->index
))
692 id_to_chain
.create (0);
693 bitmap_initialize (&open_chains_set
, &bitmap_default_obstack
);
695 /* The order in which we visit blocks ensures that whenever
696 possible, we only process a block after at least one of its
697 predecessors, which provides a "seeding" effect to make the logic
698 in set_incoming_from_chain and init_rename_info useful. */
700 for (i
= 0; i
< n_bbs
; i
++)
702 basic_block bb1
= BASIC_BLOCK_FOR_FN (cfun
, inverse_postorder
[i
]);
703 struct bb_rename_info
*this_info
;
707 int old_length
= id_to_chain
.length ();
709 this_info
= (struct bb_rename_info
*) bb1
->aux
;
710 if (this_info
== NULL
)
714 fprintf (dump_file
, "\nprocessing block %d:\n", bb1
->index
);
716 init_rename_info (this_info
, bb1
);
718 success
= build_def_use (bb1
);
722 fprintf (dump_file
, "failed\n");
724 id_to_chain
.truncate (old_length
);
725 current_id
= old_length
;
726 bitmap_clear (&this_info
->incoming_open_chains_set
);
728 if (insn_rr
.exists ())
731 FOR_BB_INSNS (bb1
, insn
)
733 insn_rr_info
*p
= &insn_rr
[INSN_UID (insn
)];
741 dump_def_use_chain (old_length
);
742 bitmap_copy (&this_info
->open_chains_set
, &open_chains_set
);
744 /* Add successor blocks to the worklist if necessary, and record
745 data about our own open chains at the end of this block, which
746 will be used to pre-open chains when processing the successors. */
747 FOR_EACH_EDGE (e
, ei
, bb1
->succs
)
749 struct bb_rename_info
*dest_ri
;
750 struct du_head
*chain
;
753 fprintf (dump_file
, "successor block %d\n", e
->dest
->index
);
755 if (e
->flags
& (EDGE_EH
| EDGE_ABNORMAL
))
757 dest_ri
= (struct bb_rename_info
*)e
->dest
->aux
;
760 for (chain
= open_chains
; chain
; chain
= chain
->next_chain
)
761 set_incoming_from_chain (dest_ri
, chain
);
765 free (inverse_postorder
);
767 /* Now, combine the chains data we have gathered across basic block
770 For every basic block, there may be chains open at the start, or at the
771 end. Rather than exclude them from renaming, we look for open chains
772 with matching registers at the other side of the CFG edge.
774 For a given chain using register R, open at the start of block B, we
775 must find an open chain using R on the other side of every edge leading
776 to B, if the register is live across this edge. In the code below,
777 N_PREDS_USED counts the number of edges where the register is live, and
778 N_PREDS_JOINED counts those where we found an appropriate chain for
781 We perform the analysis for both incoming and outgoing edges, but we
782 only need to merge once (in the second part, after verifying outgoing
784 FOR_EACH_BB_FN (bb
, cfun
)
786 struct bb_rename_info
*bb_ri
= (struct bb_rename_info
*) bb
->aux
;
794 fprintf (dump_file
, "processing bb %d in edges\n", bb
->index
);
796 EXECUTE_IF_SET_IN_BITMAP (&bb_ri
->incoming_open_chains_set
, 0, j
, bi
)
800 struct du_head
*chain
= regrename_chain_from_id (j
);
801 int n_preds_used
= 0, n_preds_joined
= 0;
803 FOR_EACH_EDGE (e
, ei
, bb
->preds
)
805 struct bb_rename_info
*src_ri
;
809 bool success
= false;
811 REG_SET_TO_HARD_REG_SET (live
, df_get_live_out (e
->src
));
812 if (!range_overlaps_hard_reg_set_p (live
, chain
->regno
,
817 if (e
->flags
& (EDGE_EH
| EDGE_ABNORMAL
))
820 src_ri
= (struct bb_rename_info
*)e
->src
->aux
;
824 EXECUTE_IF_SET_IN_BITMAP (&src_ri
->open_chains_set
,
827 struct du_head
*outgoing_chain
= regrename_chain_from_id (k
);
829 if (outgoing_chain
->regno
== chain
->regno
830 && outgoing_chain
->nregs
== chain
->nregs
)
837 if (!success
&& dump_file
)
838 fprintf (dump_file
, "failure to match with pred block %d\n",
841 if (n_preds_joined
< n_preds_used
)
844 fprintf (dump_file
, "cannot rename chain %d\n", j
);
845 chain
->cannot_rename
= 1;
849 FOR_EACH_BB_FN (bb
, cfun
)
851 struct bb_rename_info
*bb_ri
= (struct bb_rename_info
*) bb
->aux
;
859 fprintf (dump_file
, "processing bb %d out edges\n", bb
->index
);
861 EXECUTE_IF_SET_IN_BITMAP (&bb_ri
->open_chains_set
, 0, j
, bi
)
865 struct du_head
*chain
= regrename_chain_from_id (j
);
866 int n_succs_used
= 0, n_succs_joined
= 0;
868 FOR_EACH_EDGE (e
, ei
, bb
->succs
)
870 bool printed
= false;
871 struct bb_rename_info
*dest_ri
;
876 REG_SET_TO_HARD_REG_SET (live
, df_get_live_in (e
->dest
));
877 if (!range_overlaps_hard_reg_set_p (live
, chain
->regno
,
883 dest_ri
= (struct bb_rename_info
*)e
->dest
->aux
;
887 EXECUTE_IF_SET_IN_BITMAP (&dest_ri
->incoming_open_chains_set
,
890 struct du_head
*incoming_chain
= regrename_chain_from_id (k
);
892 if (incoming_chain
->regno
== chain
->regno
893 && incoming_chain
->nregs
== chain
->nregs
)
899 "merging blocks for edge %d -> %d\n",
900 e
->src
->index
, e
->dest
->index
);
903 " merging chains %d (->%d) and %d (->%d) [%s]\n",
904 k
, incoming_chain
->id
, j
, chain
->id
,
905 reg_names
[incoming_chain
->regno
]);
908 merge_chains (chain
, incoming_chain
);
914 if (n_succs_joined
< n_succs_used
)
917 fprintf (dump_file
, "cannot rename chain %d\n",
919 chain
->cannot_rename
= 1;
926 FOR_EACH_BB_FN (bb
, cfun
)
930 /* Attempt to replace all uses of the register in the chain beginning with
931 HEAD with REG. Returns true on success and false if the replacement is
932 rejected because the insns would not validate. The latter can happen
933 e.g. if a match_parallel predicate enforces restrictions on register
934 numbering in its subpatterns. */
937 regrename_do_replace (struct du_head
*head
, int reg
)
939 struct du_chain
*chain
;
940 unsigned int base_regno
= head
->regno
;
943 for (chain
= head
->first
; chain
; chain
= chain
->next_use
)
945 unsigned int regno
= ORIGINAL_REGNO (*chain
->loc
);
946 struct reg_attrs
*attr
= REG_ATTRS (*chain
->loc
);
947 int reg_ptr
= REG_POINTER (*chain
->loc
);
949 if (DEBUG_INSN_P (chain
->insn
) && REGNO (*chain
->loc
) != base_regno
)
950 validate_change (chain
->insn
, &(INSN_VAR_LOCATION_LOC (chain
->insn
)),
951 gen_rtx_UNKNOWN_VAR_LOC (), true);
954 validate_change (chain
->insn
, chain
->loc
,
955 gen_raw_REG (GET_MODE (*chain
->loc
), reg
), true);
956 if (regno
>= FIRST_PSEUDO_REGISTER
)
957 ORIGINAL_REGNO (*chain
->loc
) = regno
;
958 REG_ATTRS (*chain
->loc
) = attr
;
959 REG_POINTER (*chain
->loc
) = reg_ptr
;
963 if (!apply_change_group ())
966 mode
= GET_MODE (*head
->first
->loc
);
968 head
->nregs
= hard_regno_nregs
[reg
][mode
];
973 /* True if we found a register with a size mismatch, which means that we
974 can't track its lifetime accurately. If so, we abort the current block
976 static bool fail_current_block
;
978 /* Return true if OP is a reg for which all bits are set in PSET, false
979 if all bits are clear.
980 In other cases, set fail_current_block and return false. */
983 verify_reg_in_set (rtx op
, HARD_REG_SET
*pset
)
985 unsigned regno
, nregs
;
986 bool all_live
, all_dead
;
991 nregs
= REG_NREGS (op
);
992 all_live
= all_dead
= true;
994 if (TEST_HARD_REG_BIT (*pset
, regno
+ nregs
))
998 if (!all_dead
&& !all_live
)
1000 fail_current_block
= true;
1006 /* Return true if OP is a reg that is being tracked already in some form.
1007 May set fail_current_block if it sees an unhandled case of overlap. */
1010 verify_reg_tracked (rtx op
)
1012 return (verify_reg_in_set (op
, &live_hard_regs
)
1013 || verify_reg_in_set (op
, &live_in_chains
));
1016 /* Called through note_stores. DATA points to a rtx_code, either SET or
1017 CLOBBER, which tells us which kind of rtx to look at. If we have a
1018 match, record the set register in live_hard_regs and in the hard_conflicts
1019 bitmap of open chains. */
1022 note_sets_clobbers (rtx x
, const_rtx set
, void *data
)
1024 enum rtx_code code
= *(enum rtx_code
*)data
;
1025 struct du_head
*chain
;
1027 if (GET_CODE (x
) == SUBREG
)
1029 if (!REG_P (x
) || GET_CODE (set
) != code
)
1031 /* There must not be pseudos at this point. */
1032 gcc_assert (HARD_REGISTER_P (x
));
1033 add_to_hard_reg_set (&live_hard_regs
, GET_MODE (x
), REGNO (x
));
1034 for (chain
= open_chains
; chain
; chain
= chain
->next_chain
)
1035 add_to_hard_reg_set (&chain
->hard_conflicts
, GET_MODE (x
), REGNO (x
));
1039 scan_rtx_reg (rtx_insn
*insn
, rtx
*loc
, enum reg_class cl
, enum scan_actions action
,
1044 unsigned this_regno
= REGNO (x
);
1045 int this_nregs
= REG_NREGS (x
);
1047 if (action
== mark_write
)
1050 create_new_chain (this_regno
, this_nregs
, loc
, insn
, cl
);
1054 if ((type
== OP_OUT
) != (action
== terminate_write
|| action
== mark_access
))
1057 for (p
= &open_chains
; *p
;)
1059 struct du_head
*head
= *p
;
1060 struct du_head
*next
= head
->next_chain
;
1061 int exact_match
= (head
->regno
== this_regno
1062 && head
->nregs
== this_nregs
);
1063 int superset
= (this_regno
<= head
->regno
1064 && this_regno
+ this_nregs
>= head
->regno
+ head
->nregs
);
1065 int subset
= (this_regno
>= head
->regno
1066 && this_regno
+ this_nregs
<= head
->regno
+ head
->nregs
);
1068 if (!bitmap_bit_p (&open_chains_set
, head
->id
)
1069 || head
->regno
+ head
->nregs
<= this_regno
1070 || this_regno
+ this_nregs
<= head
->regno
)
1072 p
= &head
->next_chain
;
1076 if (action
== mark_read
|| action
== mark_access
)
1078 /* ??? Class NO_REGS can happen if the md file makes use of
1079 EXTRA_CONSTRAINTS to match registers. Which is arguably
1080 wrong, but there we are. */
1082 if (cl
== NO_REGS
|| (!exact_match
&& !DEBUG_INSN_P (insn
)))
1086 "Cannot rename chain %s (%d) at insn %d (%s)\n",
1087 reg_names
[head
->regno
], head
->id
, INSN_UID (insn
),
1088 scan_actions_name
[(int) action
]);
1089 head
->cannot_rename
= 1;
1092 unsigned nregs
= this_nregs
;
1093 head
->regno
= this_regno
;
1094 head
->nregs
= this_nregs
;
1096 SET_HARD_REG_BIT (live_in_chains
, head
->regno
+ nregs
);
1099 "Widening register in chain %s (%d) at insn %d\n",
1100 reg_names
[head
->regno
], head
->id
, INSN_UID (insn
));
1104 fail_current_block
= true;
1107 "Failing basic block due to unhandled overlap\n");
1112 struct du_chain
*this_du
;
1113 this_du
= XOBNEW (&rename_obstack
, struct du_chain
);
1114 this_du
->next_use
= 0;
1116 this_du
->insn
= insn
;
1118 if (head
->first
== NULL
)
1119 head
->first
= this_du
;
1121 head
->last
->next_use
= this_du
;
1122 record_operand_use (head
, this_du
);
1123 head
->last
= this_du
;
1125 /* Avoid adding the same location in a DEBUG_INSN multiple times,
1126 which could happen with non-exact overlap. */
1127 if (DEBUG_INSN_P (insn
))
1129 /* Otherwise, find any other chains that do not match exactly;
1130 ensure they all get marked unrenamable. */
1131 p
= &head
->next_chain
;
1135 /* Whether the terminated chain can be used for renaming
1136 depends on the action and this being an exact match.
1137 In either case, we remove this element from open_chains. */
1139 if ((action
== terminate_dead
|| action
== terminate_write
)
1140 && (superset
|| subset
))
1144 if (subset
&& !superset
)
1145 head
->cannot_rename
= 1;
1146 bitmap_clear_bit (&open_chains_set
, head
->id
);
1148 nregs
= head
->nregs
;
1151 CLEAR_HARD_REG_BIT (live_in_chains
, head
->regno
+ nregs
);
1152 if (subset
&& !superset
1153 && (head
->regno
+ nregs
< this_regno
1154 || head
->regno
+ nregs
>= this_regno
+ this_nregs
))
1155 SET_HARD_REG_BIT (live_hard_regs
, head
->regno
+ nregs
);
1161 "Closing chain %s (%d) at insn %d (%s%s)\n",
1162 reg_names
[head
->regno
], head
->id
, INSN_UID (insn
),
1163 scan_actions_name
[(int) action
],
1164 superset
? ", superset" : subset
? ", subset" : "");
1166 else if (action
== terminate_dead
|| action
== terminate_write
)
1168 /* In this case, tracking liveness gets too hard. Fail the
1169 entire basic block. */
1172 "Failing basic block due to unhandled overlap\n");
1173 fail_current_block
= true;
1178 head
->cannot_rename
= 1;
1181 "Cannot rename chain %s (%d) at insn %d (%s)\n",
1182 reg_names
[head
->regno
], head
->id
, INSN_UID (insn
),
1183 scan_actions_name
[(int) action
]);
1184 p
= &head
->next_chain
;
1189 /* Adapted from find_reloads_address_1. CL is INDEX_REG_CLASS or
1190 BASE_REG_CLASS depending on how the register is being considered. */
1193 scan_rtx_address (rtx_insn
*insn
, rtx
*loc
, enum reg_class cl
,
1194 enum scan_actions action
, machine_mode mode
,
1198 RTX_CODE code
= GET_CODE (x
);
1202 if (action
== mark_write
|| action
== mark_access
)
1209 rtx orig_op0
= XEXP (x
, 0);
1210 rtx orig_op1
= XEXP (x
, 1);
1211 RTX_CODE code0
= GET_CODE (orig_op0
);
1212 RTX_CODE code1
= GET_CODE (orig_op1
);
1217 enum rtx_code index_code
= SCRATCH
;
1219 if (GET_CODE (op0
) == SUBREG
)
1221 op0
= SUBREG_REG (op0
);
1222 code0
= GET_CODE (op0
);
1225 if (GET_CODE (op1
) == SUBREG
)
1227 op1
= SUBREG_REG (op1
);
1228 code1
= GET_CODE (op1
);
1231 if (code0
== MULT
|| code0
== SIGN_EXTEND
|| code0
== TRUNCATE
1232 || code0
== ZERO_EXTEND
|| code1
== MEM
)
1234 locI
= &XEXP (x
, 0);
1235 locB
= &XEXP (x
, 1);
1236 index_code
= GET_CODE (*locI
);
1238 else if (code1
== MULT
|| code1
== SIGN_EXTEND
|| code1
== TRUNCATE
1239 || code1
== ZERO_EXTEND
|| code0
== MEM
)
1241 locI
= &XEXP (x
, 1);
1242 locB
= &XEXP (x
, 0);
1243 index_code
= GET_CODE (*locI
);
1245 else if (code0
== CONST_INT
|| code0
== CONST
1246 || code0
== SYMBOL_REF
|| code0
== LABEL_REF
)
1248 locB
= &XEXP (x
, 1);
1249 index_code
= GET_CODE (XEXP (x
, 0));
1251 else if (code1
== CONST_INT
|| code1
== CONST
1252 || code1
== SYMBOL_REF
|| code1
== LABEL_REF
)
1254 locB
= &XEXP (x
, 0);
1255 index_code
= GET_CODE (XEXP (x
, 1));
1257 else if (code0
== REG
&& code1
== REG
)
1260 unsigned regno0
= REGNO (op0
), regno1
= REGNO (op1
);
1262 if (REGNO_OK_FOR_INDEX_P (regno1
)
1263 && regno_ok_for_base_p (regno0
, mode
, as
, PLUS
, REG
))
1265 else if (REGNO_OK_FOR_INDEX_P (regno0
)
1266 && regno_ok_for_base_p (regno1
, mode
, as
, PLUS
, REG
))
1268 else if (regno_ok_for_base_p (regno0
, mode
, as
, PLUS
, REG
)
1269 || REGNO_OK_FOR_INDEX_P (regno1
))
1271 else if (regno_ok_for_base_p (regno1
, mode
, as
, PLUS
, REG
))
1276 locI
= &XEXP (x
, index_op
);
1277 locB
= &XEXP (x
, !index_op
);
1278 index_code
= GET_CODE (*locI
);
1280 else if (code0
== REG
)
1282 locI
= &XEXP (x
, 0);
1283 locB
= &XEXP (x
, 1);
1284 index_code
= GET_CODE (*locI
);
1286 else if (code1
== REG
)
1288 locI
= &XEXP (x
, 1);
1289 locB
= &XEXP (x
, 0);
1290 index_code
= GET_CODE (*locI
);
1294 scan_rtx_address (insn
, locI
, INDEX_REG_CLASS
, action
, mode
, as
);
1296 scan_rtx_address (insn
, locB
,
1297 base_reg_class (mode
, as
, PLUS
, index_code
),
1309 /* If the target doesn't claim to handle autoinc, this must be
1310 something special, like a stack push. Kill this chain. */
1312 action
= mark_all_read
;
1317 scan_rtx_address (insn
, &XEXP (x
, 0),
1318 base_reg_class (GET_MODE (x
), MEM_ADDR_SPACE (x
),
1320 action
, GET_MODE (x
), MEM_ADDR_SPACE (x
));
1324 scan_rtx_reg (insn
, loc
, cl
, action
, OP_IN
);
1331 fmt
= GET_RTX_FORMAT (code
);
1332 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
1335 scan_rtx_address (insn
, &XEXP (x
, i
), cl
, action
, mode
, as
);
1336 else if (fmt
[i
] == 'E')
1337 for (j
= XVECLEN (x
, i
) - 1; j
>= 0; j
--)
1338 scan_rtx_address (insn
, &XVECEXP (x
, i
, j
), cl
, action
, mode
, as
);
1343 scan_rtx (rtx_insn
*insn
, rtx
*loc
, enum reg_class cl
, enum scan_actions action
,
1348 enum rtx_code code
= GET_CODE (x
);
1351 code
= GET_CODE (x
);
1363 scan_rtx_reg (insn
, loc
, cl
, action
, type
);
1367 scan_rtx_address (insn
, &XEXP (x
, 0),
1368 base_reg_class (GET_MODE (x
), MEM_ADDR_SPACE (x
),
1370 action
, GET_MODE (x
), MEM_ADDR_SPACE (x
));
1374 scan_rtx (insn
, &SET_SRC (x
), cl
, action
, OP_IN
);
1375 scan_rtx (insn
, &SET_DEST (x
), cl
, action
,
1376 (GET_CODE (PATTERN (insn
)) == COND_EXEC
1377 && verify_reg_tracked (SET_DEST (x
))) ? OP_INOUT
: OP_OUT
);
1380 case STRICT_LOW_PART
:
1381 scan_rtx (insn
, &XEXP (x
, 0), cl
, action
,
1382 verify_reg_tracked (XEXP (x
, 0)) ? OP_INOUT
: OP_OUT
);
1387 scan_rtx (insn
, &XEXP (x
, 0), cl
, action
,
1388 (type
== OP_IN
? OP_IN
:
1389 verify_reg_tracked (XEXP (x
, 0)) ? OP_INOUT
: OP_OUT
));
1390 scan_rtx (insn
, &XEXP (x
, 1), cl
, action
, OP_IN
);
1391 scan_rtx (insn
, &XEXP (x
, 2), cl
, action
, OP_IN
);
1400 /* Should only happen inside MEM. */
1404 scan_rtx (insn
, &SET_DEST (x
), cl
, action
,
1405 (GET_CODE (PATTERN (insn
)) == COND_EXEC
1406 && verify_reg_tracked (SET_DEST (x
))) ? OP_INOUT
: OP_OUT
);
1410 scan_rtx (insn
, &XEXP (x
, 0), cl
, action
, type
);
1412 scan_rtx (insn
, &XEXP (x
, 1), cl
, action
, type
);
1419 fmt
= GET_RTX_FORMAT (code
);
1420 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
1423 scan_rtx (insn
, &XEXP (x
, i
), cl
, action
, type
);
1424 else if (fmt
[i
] == 'E')
1425 for (j
= XVECLEN (x
, i
) - 1; j
>= 0; j
--)
1426 scan_rtx (insn
, &XVECEXP (x
, i
, j
), cl
, action
, type
);
1430 /* Hide operands of the current insn (of which there are N_OPS) by
1431 substituting cc0 for them.
1432 Previous values are stored in the OLD_OPERANDS and OLD_DUPS.
1433 For every bit set in DO_NOT_HIDE, we leave the operand alone.
1434 If INOUT_AND_EC_ONLY is set, we only do this for OP_INOUT type operands
1435 and earlyclobbers. */
1438 hide_operands (int n_ops
, rtx
*old_operands
, rtx
*old_dups
,
1439 unsigned HOST_WIDE_INT do_not_hide
, bool inout_and_ec_only
)
1442 const operand_alternative
*op_alt
= which_op_alt ();
1443 for (i
= 0; i
< n_ops
; i
++)
1445 old_operands
[i
] = recog_data
.operand
[i
];
1446 /* Don't squash match_operator or match_parallel here, since
1447 we don't know that all of the contained registers are
1448 reachable by proper operands. */
1449 if (recog_data
.constraints
[i
][0] == '\0')
1451 if (do_not_hide
& (1 << i
))
1453 if (!inout_and_ec_only
|| recog_data
.operand_type
[i
] == OP_INOUT
1454 || op_alt
[i
].earlyclobber
)
1455 *recog_data
.operand_loc
[i
] = cc0_rtx
;
1457 for (i
= 0; i
< recog_data
.n_dups
; i
++)
1459 int opn
= recog_data
.dup_num
[i
];
1460 old_dups
[i
] = *recog_data
.dup_loc
[i
];
1461 if (do_not_hide
& (1 << opn
))
1463 if (!inout_and_ec_only
|| recog_data
.operand_type
[opn
] == OP_INOUT
1464 || op_alt
[opn
].earlyclobber
)
1465 *recog_data
.dup_loc
[i
] = cc0_rtx
;
1469 /* Undo the substitution performed by hide_operands. INSN is the insn we
1470 are processing; the arguments are the same as in hide_operands. */
1473 restore_operands (rtx_insn
*insn
, int n_ops
, rtx
*old_operands
, rtx
*old_dups
)
1476 for (i
= 0; i
< recog_data
.n_dups
; i
++)
1477 *recog_data
.dup_loc
[i
] = old_dups
[i
];
1478 for (i
= 0; i
< n_ops
; i
++)
1479 *recog_data
.operand_loc
[i
] = old_operands
[i
];
1480 if (recog_data
.n_dups
)
1481 df_insn_rescan (insn
);
1484 /* For each output operand of INSN, call scan_rtx to create a new
1485 open chain. Do this only for normal or earlyclobber outputs,
1486 depending on EARLYCLOBBER. If INSN_INFO is nonnull, use it to
1487 record information about the operands in the insn. */
1490 record_out_operands (rtx_insn
*insn
, bool earlyclobber
, insn_rr_info
*insn_info
)
1492 int n_ops
= recog_data
.n_operands
;
1493 const operand_alternative
*op_alt
= which_op_alt ();
1497 for (i
= 0; i
< n_ops
+ recog_data
.n_dups
; i
++)
1499 int opn
= i
< n_ops
? i
: recog_data
.dup_num
[i
- n_ops
];
1500 rtx
*loc
= (i
< n_ops
1501 ? recog_data
.operand_loc
[opn
]
1502 : recog_data
.dup_loc
[i
- n_ops
]);
1504 enum reg_class cl
= alternative_class (op_alt
, opn
);
1506 struct du_head
*prev_open
;
1508 if (recog_data
.operand_type
[opn
] != OP_OUT
1509 || op_alt
[opn
].earlyclobber
!= earlyclobber
)
1513 cur_operand
= insn_info
->op_info
+ i
;
1515 prev_open
= open_chains
;
1516 scan_rtx (insn
, loc
, cl
, mark_write
, OP_OUT
);
1518 /* ??? Many targets have output constraints on the SET_DEST
1519 of a call insn, which is stupid, since these are certainly
1520 ABI defined hard registers. For these, and for asm operands
1521 that originally referenced hard registers, we must record that
1522 the chain cannot be renamed. */
1524 || (asm_noperands (PATTERN (insn
)) > 0
1526 && REGNO (op
) == ORIGINAL_REGNO (op
)))
1528 if (prev_open
!= open_chains
)
1529 open_chains
->cannot_rename
= 1;
1535 /* Build def/use chain. */
1538 build_def_use (basic_block bb
)
1541 unsigned HOST_WIDE_INT untracked_operands
;
1543 fail_current_block
= false;
1545 for (insn
= BB_HEAD (bb
); ; insn
= NEXT_INSN (insn
))
1547 if (NONDEBUG_INSN_P (insn
))
1551 rtx old_operands
[MAX_RECOG_OPERANDS
];
1552 rtx old_dups
[MAX_DUP_OPERANDS
];
1555 enum rtx_code set_code
= SET
;
1556 enum rtx_code clobber_code
= CLOBBER
;
1557 insn_rr_info
*insn_info
= NULL
;
1559 /* Process the insn, determining its effect on the def-use
1560 chains and live hard registers. We perform the following
1561 steps with the register references in the insn, simulating
1563 (1) Deal with earlyclobber operands and CLOBBERs of non-operands
1564 by creating chains and marking hard regs live.
1565 (2) Any read outside an operand causes any chain it overlaps
1566 with to be marked unrenamable.
1567 (3) Any read inside an operand is added if there's already
1568 an open chain for it.
1569 (4) For any REG_DEAD note we find, close open chains that
1571 (5) For any non-earlyclobber write we find, close open chains
1573 (6) For any non-earlyclobber write we find in an operand, make
1574 a new chain or mark the hard register as live.
1575 (7) For any REG_UNUSED, close any chains we just opened.
1577 We cannot deal with situations where we track a reg in one mode
1578 and see a reference in another mode; these will cause the chain
1579 to be marked unrenamable or even cause us to abort the entire
1582 extract_constrain_insn (insn
);
1583 preprocess_constraints (insn
);
1584 const operand_alternative
*op_alt
= which_op_alt ();
1585 n_ops
= recog_data
.n_operands
;
1586 untracked_operands
= 0;
1588 if (insn_rr
.exists ())
1590 insn_info
= &insn_rr
[INSN_UID (insn
)];
1591 insn_info
->op_info
= XOBNEWVEC (&rename_obstack
, operand_rr_info
,
1592 recog_data
.n_operands
);
1593 memset (insn_info
->op_info
, 0,
1594 sizeof (operand_rr_info
) * recog_data
.n_operands
);
1597 /* Simplify the code below by promoting OP_OUT to OP_INOUT in
1598 predicated instructions, but only for register operands
1599 that are already tracked, so that we can create a chain
1600 when the first SET makes a register live. */
1602 predicated
= GET_CODE (PATTERN (insn
)) == COND_EXEC
;
1603 for (i
= 0; i
< n_ops
; ++i
)
1605 rtx op
= recog_data
.operand
[i
];
1606 int matches
= op_alt
[i
].matches
;
1607 if (matches
>= 0 || op_alt
[i
].matched
>= 0
1608 || (predicated
&& recog_data
.operand_type
[i
] == OP_OUT
))
1610 recog_data
.operand_type
[i
] = OP_INOUT
;
1611 /* A special case to deal with instruction patterns that
1612 have matching operands with different modes. If we're
1613 not already tracking such a reg, we won't start here,
1614 and we must instead make sure to make the operand visible
1615 to the machinery that tracks hard registers. */
1617 && (GET_MODE_SIZE (recog_data
.operand_mode
[i
])
1618 != GET_MODE_SIZE (recog_data
.operand_mode
[matches
]))
1619 && !verify_reg_in_set (op
, &live_in_chains
))
1621 untracked_operands
|= 1 << i
;
1622 untracked_operands
|= 1 << matches
;
1625 /* If there's an in-out operand with a register that is not
1626 being tracked at all yet, open a chain. */
1627 if (recog_data
.operand_type
[i
] == OP_INOUT
1628 && !(untracked_operands
& (1 << i
))
1630 && !verify_reg_tracked (op
))
1631 create_new_chain (REGNO (op
), REG_NREGS (op
), NULL
, NULL
,
1635 if (fail_current_block
)
1638 /* Step 1a: Mark hard registers that are clobbered in this insn,
1639 outside an operand, as live. */
1640 hide_operands (n_ops
, old_operands
, old_dups
, untracked_operands
,
1642 note_stores (PATTERN (insn
), note_sets_clobbers
, &clobber_code
);
1643 restore_operands (insn
, n_ops
, old_operands
, old_dups
);
1645 /* Step 1b: Begin new chains for earlyclobbered writes inside
1647 record_out_operands (insn
, true, insn_info
);
1649 /* Step 2: Mark chains for which we have reads outside operands
1651 We do this by munging all operands into CC0, and closing
1652 everything remaining. */
1654 hide_operands (n_ops
, old_operands
, old_dups
, untracked_operands
,
1656 scan_rtx (insn
, &PATTERN (insn
), NO_REGS
, mark_all_read
, OP_IN
);
1657 restore_operands (insn
, n_ops
, old_operands
, old_dups
);
1659 /* Step 2B: Can't rename function call argument registers. */
1660 if (CALL_P (insn
) && CALL_INSN_FUNCTION_USAGE (insn
))
1661 scan_rtx (insn
, &CALL_INSN_FUNCTION_USAGE (insn
),
1662 NO_REGS
, mark_all_read
, OP_IN
);
1664 /* Step 2C: Can't rename asm operands that were originally
1666 if (asm_noperands (PATTERN (insn
)) > 0)
1667 for (i
= 0; i
< n_ops
; i
++)
1669 rtx
*loc
= recog_data
.operand_loc
[i
];
1673 && REGNO (op
) == ORIGINAL_REGNO (op
)
1674 && (recog_data
.operand_type
[i
] == OP_IN
1675 || recog_data
.operand_type
[i
] == OP_INOUT
))
1676 scan_rtx (insn
, loc
, NO_REGS
, mark_all_read
, OP_IN
);
1679 /* Step 3: Append to chains for reads inside operands. */
1680 for (i
= 0; i
< n_ops
+ recog_data
.n_dups
; i
++)
1682 int opn
= i
< n_ops
? i
: recog_data
.dup_num
[i
- n_ops
];
1683 rtx
*loc
= (i
< n_ops
1684 ? recog_data
.operand_loc
[opn
]
1685 : recog_data
.dup_loc
[i
- n_ops
]);
1686 enum reg_class cl
= alternative_class (op_alt
, opn
);
1687 enum op_type type
= recog_data
.operand_type
[opn
];
1689 /* Don't scan match_operand here, since we've no reg class
1690 information to pass down. Any operands that we could
1691 substitute in will be represented elsewhere. */
1692 if (recog_data
.constraints
[opn
][0] == '\0'
1693 || untracked_operands
& (1 << opn
))
1697 cur_operand
= i
== opn
? insn_info
->op_info
+ i
: NULL
;
1698 if (op_alt
[opn
].is_address
)
1699 scan_rtx_address (insn
, loc
, cl
, mark_read
,
1700 VOIDmode
, ADDR_SPACE_GENERIC
);
1702 scan_rtx (insn
, loc
, cl
, mark_read
, type
);
1706 /* Step 3B: Record updates for regs in REG_INC notes, and
1707 source regs in REG_FRAME_RELATED_EXPR notes. */
1708 for (note
= REG_NOTES (insn
); note
; note
= XEXP (note
, 1))
1709 if (REG_NOTE_KIND (note
) == REG_INC
1710 || REG_NOTE_KIND (note
) == REG_FRAME_RELATED_EXPR
)
1711 scan_rtx (insn
, &XEXP (note
, 0), ALL_REGS
, mark_read
,
1714 /* Step 4: Close chains for registers that die here, unless
1715 the register is mentioned in a REG_UNUSED note. In that
1716 case we keep the chain open until step #7 below to ensure
1717 it conflicts with other output operands of this insn.
1718 See PR 52573. Arguably the insn should not have both
1719 notes; it has proven difficult to fix that without
1720 other undesirable side effects. */
1721 for (note
= REG_NOTES (insn
); note
; note
= XEXP (note
, 1))
1722 if (REG_NOTE_KIND (note
) == REG_DEAD
1723 && !find_regno_note (insn
, REG_UNUSED
, REGNO (XEXP (note
, 0))))
1725 remove_from_hard_reg_set (&live_hard_regs
,
1726 GET_MODE (XEXP (note
, 0)),
1727 REGNO (XEXP (note
, 0)));
1728 scan_rtx (insn
, &XEXP (note
, 0), NO_REGS
, terminate_dead
,
1732 /* Step 4B: If this is a call, any chain live at this point
1733 requires a caller-saved reg. */
1737 for (p
= open_chains
; p
; p
= p
->next_chain
)
1738 p
->need_caller_save_reg
= 1;
1741 /* Step 5: Close open chains that overlap writes. Similar to
1742 step 2, we hide in-out operands, since we do not want to
1743 close these chains. We also hide earlyclobber operands,
1744 since we've opened chains for them in step 1, and earlier
1745 chains they would overlap with must have been closed at
1746 the previous insn at the latest, as such operands cannot
1747 possibly overlap with any input operands. */
1749 hide_operands (n_ops
, old_operands
, old_dups
, untracked_operands
,
1751 scan_rtx (insn
, &PATTERN (insn
), NO_REGS
, terminate_write
, OP_IN
);
1752 restore_operands (insn
, n_ops
, old_operands
, old_dups
);
1754 /* Step 6a: Mark hard registers that are set in this insn,
1755 outside an operand, as live. */
1756 hide_operands (n_ops
, old_operands
, old_dups
, untracked_operands
,
1758 note_stores (PATTERN (insn
), note_sets_clobbers
, &set_code
);
1759 restore_operands (insn
, n_ops
, old_operands
, old_dups
);
1761 /* Step 6b: Begin new chains for writes inside operands. */
1762 record_out_operands (insn
, false, insn_info
);
1764 /* Step 6c: Record destination regs in REG_FRAME_RELATED_EXPR
1765 notes for update. */
1766 for (note
= REG_NOTES (insn
); note
; note
= XEXP (note
, 1))
1767 if (REG_NOTE_KIND (note
) == REG_FRAME_RELATED_EXPR
)
1768 scan_rtx (insn
, &XEXP (note
, 0), ALL_REGS
, mark_access
,
1771 /* Step 7: Close chains for registers that were never
1772 really used here. */
1773 for (note
= REG_NOTES (insn
); note
; note
= XEXP (note
, 1))
1774 if (REG_NOTE_KIND (note
) == REG_UNUSED
)
1776 remove_from_hard_reg_set (&live_hard_regs
,
1777 GET_MODE (XEXP (note
, 0)),
1778 REGNO (XEXP (note
, 0)));
1779 scan_rtx (insn
, &XEXP (note
, 0), NO_REGS
, terminate_dead
,
1783 else if (DEBUG_INSN_P (insn
)
1784 && !VAR_LOC_UNKNOWN_P (INSN_VAR_LOCATION_LOC (insn
)))
1786 scan_rtx (insn
, &INSN_VAR_LOCATION_LOC (insn
),
1787 ALL_REGS
, mark_read
, OP_IN
);
1789 if (insn
== BB_END (bb
))
1793 if (fail_current_block
)
1799 /* Initialize the register renamer. If INSN_INFO is true, ensure that
1800 insn_rr is nonnull. */
1802 regrename_init (bool insn_info
)
1804 gcc_obstack_init (&rename_obstack
);
1807 insn_rr
.safe_grow_cleared (get_max_uid ());
1810 /* Free all global data used by the register renamer. */
1812 regrename_finish (void)
1816 obstack_free (&rename_obstack
, NULL
);
1819 /* Perform register renaming on the current function. */
1822 regrename_optimize (void)
1824 df_set_flags (DF_LR_RUN_DCE
);
1825 df_note_add_problem ();
1827 df_set_flags (DF_DEFER_INSN_RESCAN
);
1829 regrename_init (false);
1831 regrename_analyze (NULL
);
1835 regrename_finish ();
1842 const pass_data pass_data_regrename
=
1844 RTL_PASS
, /* type */
1846 OPTGROUP_NONE
, /* optinfo_flags */
1847 TV_RENAME_REGISTERS
, /* tv_id */
1848 0, /* properties_required */
1849 0, /* properties_provided */
1850 0, /* properties_destroyed */
1851 0, /* todo_flags_start */
1852 TODO_df_finish
, /* todo_flags_finish */
1855 class pass_regrename
: public rtl_opt_pass
1858 pass_regrename (gcc::context
*ctxt
)
1859 : rtl_opt_pass (pass_data_regrename
, ctxt
)
1862 /* opt_pass methods: */
1863 virtual bool gate (function
*)
1865 return (optimize
> 0 && (flag_rename_registers
));
1868 virtual unsigned int execute (function
*) { return regrename_optimize (); }
1870 }; // class pass_regrename
1875 make_pass_regrename (gcc::context
*ctxt
)
1877 return new pass_regrename (ctxt
);