1 /* Register renaming for the GNU compiler.
2 Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
3 2010 Free Software Foundation, Inc.
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it
8 under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3, or (at your option)
12 GCC is distributed in the hope that it will be useful, but WITHOUT
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
15 License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
23 #include "coretypes.h"
25 #include "rtl-error.h"
27 #include "insn-config.h"
29 #include "addresses.h"
30 #include "hard-reg-set.h"
31 #include "basic-block.h"
39 #include "tree-pass.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,
52 2. For each chain, the set of possible renaming registers is computed.
53 This takes into account the renaming of previously processed chains.
54 Optionally, a preferred class is computed for the renaming register.
56 3. The best renaming register is computed for the chain in the above set,
57 using a round-robin allocation. If a preferred class exists, then the
58 round-robin allocation is done within the class first, if possible.
59 The round-robin allocation of renaming registers itself is global.
61 4. If a renaming register has been found, it is substituted in the chain.
63 Targets can parameterize the pass by specifying a preferred class for the
64 renaming register for a given (super)class of registers to be renamed. */
66 #if HOST_BITS_PER_WIDE_INT <= MAX_RECOG_OPERANDS
67 #error "Use a different bitmap implementation for untracked_operands."
70 /* We keep linked lists of DU_HEAD structures, each of which describes
71 a chain of occurrences of a reg. */
75 struct du_head
*next_chain
;
76 /* The first and last elements of this chain. */
77 struct du_chain
*first
, *last
;
78 /* Describes the register being tracked. */
79 unsigned regno
, nregs
;
81 /* A unique id to be used as an index into the conflicts bitmaps. */
83 /* A bitmap to record conflicts with other chains. */
84 bitmap_head conflicts
;
85 /* Conflicts with untracked hard registers. */
86 HARD_REG_SET hard_conflicts
;
88 /* Nonzero if the chain is finished; zero if it is still open. */
89 unsigned int terminated
:1;
90 /* Nonzero if the chain crosses a call. */
91 unsigned int need_caller_save_reg
:1;
92 /* Nonzero if the register is used in a way that prevents renaming,
93 such as the SET_DEST of a CALL_INSN or an asm operand that used
94 to be a hard register. */
95 unsigned int cannot_rename
:1;
98 /* This struct describes a single occurrence of a register. */
101 /* Links to the next occurrence of the register. */
102 struct du_chain
*next_use
;
104 /* The insn where the register appears. */
106 /* The location inside the insn. */
108 /* The register class required by the insn at this location. */
109 ENUM_BITFIELD(reg_class
) cl
: 16;
119 /* mark_access is for marking the destination regs in
120 REG_FRAME_RELATED_EXPR notes (as if they were read) so that the
121 note is updated properly. */
125 static const char * const scan_actions_name
[] =
135 static struct obstack rename_obstack
;
137 static void do_replace (struct du_head
*, int);
138 static void scan_rtx_reg (rtx
, rtx
*, enum reg_class
,
139 enum scan_actions
, enum op_type
);
140 static void scan_rtx_address (rtx
, rtx
*, enum reg_class
,
141 enum scan_actions
, enum machine_mode
);
142 static void scan_rtx (rtx
, rtx
*, enum reg_class
, enum scan_actions
,
144 static struct du_head
*build_def_use (basic_block
);
145 static void dump_def_use_chain (struct du_head
*);
147 typedef struct du_head
*du_head_p
;
148 DEF_VEC_P (du_head_p
);
149 DEF_VEC_ALLOC_P (du_head_p
, heap
);
150 static VEC(du_head_p
, heap
) *id_to_chain
;
153 free_chain_data (void)
157 for (i
= 0; VEC_iterate(du_head_p
, id_to_chain
, i
, ptr
); i
++)
158 bitmap_clear (&ptr
->conflicts
);
160 VEC_free (du_head_p
, heap
, id_to_chain
);
163 /* For a def-use chain HEAD, find which registers overlap its lifetime and
164 set the corresponding bits in *PSET. */
167 merge_overlapping_regs (HARD_REG_SET
*pset
, struct du_head
*head
)
171 IOR_HARD_REG_SET (*pset
, head
->hard_conflicts
);
172 EXECUTE_IF_SET_IN_BITMAP (&head
->conflicts
, 0, i
, bi
)
174 du_head_p other
= VEC_index (du_head_p
, id_to_chain
, i
);
175 unsigned j
= other
->nregs
;
177 SET_HARD_REG_BIT (*pset
, other
->regno
+ j
);
181 /* Check if NEW_REG can be the candidate register to rename for
182 REG in THIS_HEAD chain. THIS_UNAVAILABLE is a set of unavailable hard
186 check_new_reg_p (int reg ATTRIBUTE_UNUSED
, int new_reg
,
187 struct du_head
*this_head
, HARD_REG_SET this_unavailable
)
189 enum machine_mode mode
= GET_MODE (*this_head
->first
->loc
);
190 int nregs
= hard_regno_nregs
[new_reg
][mode
];
192 struct du_chain
*tmp
;
194 for (i
= nregs
- 1; i
>= 0; --i
)
195 if (TEST_HARD_REG_BIT (this_unavailable
, new_reg
+ i
)
196 || fixed_regs
[new_reg
+ i
]
197 || global_regs
[new_reg
+ i
]
198 /* Can't use regs which aren't saved by the prologue. */
199 || (! df_regs_ever_live_p (new_reg
+ i
)
200 && ! call_used_regs
[new_reg
+ i
])
201 #ifdef LEAF_REGISTERS
202 /* We can't use a non-leaf register if we're in a
204 || (current_function_is_leaf
205 && !LEAF_REGISTERS
[new_reg
+ i
])
207 #ifdef HARD_REGNO_RENAME_OK
208 || ! HARD_REGNO_RENAME_OK (reg
+ i
, new_reg
+ i
)
213 /* See whether it accepts all modes that occur in
214 definition and uses. */
215 for (tmp
= this_head
->first
; tmp
; tmp
= tmp
->next_use
)
216 if ((! HARD_REGNO_MODE_OK (new_reg
, GET_MODE (*tmp
->loc
))
217 && ! DEBUG_INSN_P (tmp
->insn
))
218 || (this_head
->need_caller_save_reg
219 && ! (HARD_REGNO_CALL_PART_CLOBBERED
220 (reg
, GET_MODE (*tmp
->loc
)))
221 && (HARD_REGNO_CALL_PART_CLOBBERED
222 (new_reg
, GET_MODE (*tmp
->loc
)))))
228 /* Perform register renaming on the current function. */
231 regrename_optimize (void)
233 int tick
[FIRST_PSEUDO_REGISTER
];
238 df_set_flags (DF_LR_RUN_DCE
);
239 df_note_add_problem ();
241 df_set_flags (DF_DEFER_INSN_RESCAN
);
243 memset (tick
, 0, sizeof tick
);
245 gcc_obstack_init (&rename_obstack
);
246 first_obj
= XOBNEWVAR (&rename_obstack
, char, 0);
250 struct du_head
*all_chains
= 0;
251 HARD_REG_SET unavailable
;
253 HARD_REG_SET regs_seen
;
254 CLEAR_HARD_REG_SET (regs_seen
);
257 id_to_chain
= VEC_alloc (du_head_p
, heap
, 0);
259 CLEAR_HARD_REG_SET (unavailable
);
262 fprintf (dump_file
, "\nBasic block %d:\n", bb
->index
);
264 all_chains
= build_def_use (bb
);
267 dump_def_use_chain (all_chains
);
269 CLEAR_HARD_REG_SET (unavailable
);
270 /* Don't clobber traceback for noreturn functions. */
271 if (frame_pointer_needed
)
273 add_to_hard_reg_set (&unavailable
, Pmode
, FRAME_POINTER_REGNUM
);
274 #if !HARD_FRAME_POINTER_IS_FRAME_POINTER
275 add_to_hard_reg_set (&unavailable
, Pmode
, HARD_FRAME_POINTER_REGNUM
);
281 int new_reg
, best_new_reg
, best_nregs
;
283 struct du_head
*this_head
= all_chains
;
284 struct du_chain
*tmp
;
285 HARD_REG_SET this_unavailable
;
286 int reg
= this_head
->regno
;
288 enum reg_class super_class
= NO_REGS
;
289 enum reg_class preferred_class
;
290 bool has_preferred_class
;
292 all_chains
= this_head
->next_chain
;
294 if (this_head
->cannot_rename
)
298 best_nregs
= this_head
->nregs
;
300 #if 0 /* This just disables optimization opportunities. */
301 /* Only rename once we've seen the reg more than once. */
302 if (! TEST_HARD_REG_BIT (regs_seen
, reg
))
304 SET_HARD_REG_BIT (regs_seen
, reg
);
309 if (fixed_regs
[reg
] || global_regs
[reg
]
310 #if !HARD_FRAME_POINTER_IS_FRAME_POINTER
311 || (frame_pointer_needed
&& reg
== HARD_FRAME_POINTER_REGNUM
)
313 || (frame_pointer_needed
&& reg
== FRAME_POINTER_REGNUM
)
318 COPY_HARD_REG_SET (this_unavailable
, unavailable
);
320 /* Iterate over elements in the chain in order to:
321 1. Count number of uses, and narrow the set of registers we can
323 2. Compute the superunion of register classes in this chain. */
325 super_class
= NO_REGS
;
326 for (tmp
= this_head
->first
; tmp
; tmp
= tmp
->next_use
)
328 if (DEBUG_INSN_P (tmp
->insn
))
331 IOR_COMPL_HARD_REG_SET (this_unavailable
,
332 reg_class_contents
[tmp
->cl
]);
334 = reg_class_superunion
[(int) super_class
][(int) tmp
->cl
];
340 /* Further narrow the set of registers we can use for renaming.
341 If the chain needs a call-saved register, mark the call-used
342 registers as unavailable. */
343 if (this_head
->need_caller_save_reg
)
344 IOR_HARD_REG_SET (this_unavailable
, call_used_reg_set
);
346 /* And mark registers that overlap its lifetime as unavailable. */
347 merge_overlapping_regs (&this_unavailable
, this_head
);
349 /* Compute preferred rename class of super union of all the classes
352 = (enum reg_class
) targetm
.preferred_rename_class (super_class
);
354 /* If PREFERRED_CLASS is not NO_REGS, we iterate in the first pass
355 over registers that belong to PREFERRED_CLASS and try to find the
356 best register within the class. If that failed, we iterate in
357 the second pass over registers that don't belong to the class.
358 If PREFERRED_CLASS is NO_REGS, we iterate over all registers in
359 ascending order without any preference. */
360 has_preferred_class
= (preferred_class
!= NO_REGS
);
361 for (pass
= (has_preferred_class
? 0 : 1); pass
< 2; pass
++)
363 for (new_reg
= 0; new_reg
< FIRST_PSEUDO_REGISTER
; new_reg
++)
365 if (has_preferred_class
368 (reg_class_contents
[preferred_class
], new_reg
))
371 /* In the first pass, we force the renaming of registers that
372 don't belong to PREFERRED_CLASS to registers that do, even
373 though the latters were used not very long ago. */
374 if (check_new_reg_p (reg
, new_reg
, this_head
,
377 && !TEST_HARD_REG_BIT
378 (reg_class_contents
[preferred_class
],
380 || tick
[best_new_reg
] > tick
[new_reg
]))
382 enum machine_mode mode
383 = GET_MODE (*this_head
->first
->loc
);
384 best_new_reg
= new_reg
;
385 best_nregs
= hard_regno_nregs
[new_reg
][mode
];
388 if (pass
== 0 && best_new_reg
!= reg
)
394 fprintf (dump_file
, "Register %s in insn %d",
395 reg_names
[reg
], INSN_UID (this_head
->first
->insn
));
396 if (this_head
->need_caller_save_reg
)
397 fprintf (dump_file
, " crosses a call");
400 if (best_new_reg
== reg
)
402 tick
[reg
] = ++this_tick
;
404 fprintf (dump_file
, "; no available better choice\n");
409 fprintf (dump_file
, ", renamed as %s\n", reg_names
[best_new_reg
]);
411 do_replace (this_head
, best_new_reg
);
412 this_head
->regno
= best_new_reg
;
413 this_head
->nregs
= best_nregs
;
414 tick
[best_new_reg
] = ++this_tick
;
415 df_set_regs_ever_live (best_new_reg
, true);
419 obstack_free (&rename_obstack
, first_obj
);
422 obstack_free (&rename_obstack
, NULL
);
425 fputc ('\n', dump_file
);
431 do_replace (struct du_head
*head
, int reg
)
433 struct du_chain
*chain
;
434 unsigned int base_regno
= head
->regno
;
435 bool found_note
= false;
437 gcc_assert (! DEBUG_INSN_P (head
->first
->insn
));
439 for (chain
= head
->first
; chain
; chain
= chain
->next_use
)
441 unsigned int regno
= ORIGINAL_REGNO (*chain
->loc
);
442 struct reg_attrs
*attr
= REG_ATTRS (*chain
->loc
);
443 int reg_ptr
= REG_POINTER (*chain
->loc
);
445 if (DEBUG_INSN_P (chain
->insn
) && REGNO (*chain
->loc
) != base_regno
)
446 INSN_VAR_LOCATION_LOC (chain
->insn
) = gen_rtx_UNKNOWN_VAR_LOC ();
451 *chain
->loc
= gen_raw_REG (GET_MODE (*chain
->loc
), reg
);
452 if (regno
>= FIRST_PSEUDO_REGISTER
)
453 ORIGINAL_REGNO (*chain
->loc
) = regno
;
454 REG_ATTRS (*chain
->loc
) = attr
;
455 REG_POINTER (*chain
->loc
) = reg_ptr
;
457 for (note
= REG_NOTES (chain
->insn
); note
; note
= XEXP (note
, 1))
459 enum reg_note kind
= REG_NOTE_KIND (note
);
460 if (kind
== REG_DEAD
|| kind
== REG_UNUSED
)
462 rtx reg
= XEXP (note
, 0);
463 gcc_assert (HARD_REGISTER_P (reg
));
465 if (REGNO (reg
) == base_regno
)
469 && reg_set_p (*chain
->loc
, chain
->insn
))
470 remove_note (chain
->insn
, note
);
472 XEXP (note
, 0) = *chain
->loc
;
479 df_insn_rescan (chain
->insn
);
483 /* If the chain's first insn is the same as the last, we should have
484 found a REG_UNUSED note. */
485 gcc_assert (head
->first
->insn
!= head
->last
->insn
);
486 if (!reg_set_p (*head
->last
->loc
, head
->last
->insn
))
487 add_reg_note (head
->last
->insn
, REG_DEAD
, *head
->last
->loc
);
492 /* Walk all chains starting with CHAINS and record that they conflict with
493 another chain whose id is ID. */
496 mark_conflict (struct du_head
*chains
, unsigned id
)
500 bitmap_set_bit (&chains
->conflicts
, id
);
501 chains
= chains
->next_chain
;
505 /* True if we found a register with a size mismatch, which means that we
506 can't track its lifetime accurately. If so, we abort the current block
508 static bool fail_current_block
;
510 /* The id to be given to the next opened chain. */
511 static unsigned current_id
;
513 /* List of currently open chains, and closed chains that can be renamed. */
514 static struct du_head
*open_chains
;
515 static struct du_head
*closed_chains
;
517 /* Bitmap of open chains. The bits set always match the list found in
519 static bitmap_head open_chains_set
;
521 /* Record the registers being tracked in open_chains. */
522 static HARD_REG_SET live_in_chains
;
524 /* Record the registers that are live but not tracked. The intersection
525 between this and live_in_chains is empty. */
526 static HARD_REG_SET live_hard_regs
;
528 /* Return true if OP is a reg for which all bits are set in PSET, false
529 if all bits are clear.
530 In other cases, set fail_current_block and return false. */
533 verify_reg_in_set (rtx op
, HARD_REG_SET
*pset
)
535 unsigned regno
, nregs
;
536 bool all_live
, all_dead
;
541 nregs
= hard_regno_nregs
[regno
][GET_MODE (op
)];
542 all_live
= all_dead
= true;
544 if (TEST_HARD_REG_BIT (*pset
, regno
+ nregs
))
548 if (!all_dead
&& !all_live
)
550 fail_current_block
= true;
556 /* Return true if OP is a reg that is being tracked already in some form.
557 May set fail_current_block if it sees an unhandled case of overlap. */
560 verify_reg_tracked (rtx op
)
562 return (verify_reg_in_set (op
, &live_hard_regs
)
563 || verify_reg_in_set (op
, &live_in_chains
));
566 /* Called through note_stores. DATA points to a rtx_code, either SET or
567 CLOBBER, which tells us which kind of rtx to look at. If we have a
568 match, record the set register in live_hard_regs and in the hard_conflicts
569 bitmap of open chains. */
572 note_sets_clobbers (rtx x
, const_rtx set
, void *data
)
574 enum rtx_code code
= *(enum rtx_code
*)data
;
575 struct du_head
*chain
;
577 if (GET_CODE (x
) == SUBREG
)
579 if (!REG_P (x
) || GET_CODE (set
) != code
)
581 /* There must not be pseudos at this point. */
582 gcc_assert (HARD_REGISTER_P (x
));
583 add_to_hard_reg_set (&live_hard_regs
, GET_MODE (x
), REGNO (x
));
584 for (chain
= open_chains
; chain
; chain
= chain
->next_chain
)
585 add_to_hard_reg_set (&chain
->hard_conflicts
, GET_MODE (x
), REGNO (x
));
588 /* Create a new chain for THIS_NREGS registers starting at THIS_REGNO,
589 and record its occurrence in *LOC, which is being written to in INSN.
590 This access requires a register of class CL. */
593 create_new_chain (unsigned this_regno
, unsigned this_nregs
, rtx
*loc
,
594 rtx insn
, enum reg_class cl
)
596 struct du_head
*head
= XOBNEW (&rename_obstack
, struct du_head
);
597 struct du_chain
*this_du
;
600 head
->next_chain
= open_chains
;
602 head
->regno
= this_regno
;
603 head
->nregs
= this_nregs
;
604 head
->need_caller_save_reg
= 0;
605 head
->cannot_rename
= 0;
606 head
->terminated
= 0;
608 VEC_safe_push (du_head_p
, heap
, id_to_chain
, head
);
609 head
->id
= current_id
++;
611 bitmap_initialize (&head
->conflicts
, &bitmap_default_obstack
);
612 bitmap_copy (&head
->conflicts
, &open_chains_set
);
613 mark_conflict (open_chains
, head
->id
);
615 /* Since we're tracking this as a chain now, remove it from the
616 list of conflicting live hard registers and track it in
617 live_in_chains instead. */
621 SET_HARD_REG_BIT (live_in_chains
, head
->regno
+ nregs
);
622 CLEAR_HARD_REG_BIT (live_hard_regs
, head
->regno
+ nregs
);
625 COPY_HARD_REG_SET (head
->hard_conflicts
, live_hard_regs
);
626 bitmap_set_bit (&open_chains_set
, head
->id
);
632 fprintf (dump_file
, "Creating chain %s (%d)",
633 reg_names
[head
->regno
], head
->id
);
634 if (insn
!= NULL_RTX
)
635 fprintf (dump_file
, " at insn %d", INSN_UID (insn
));
636 fprintf (dump_file
, "\n");
639 if (insn
== NULL_RTX
)
641 head
->first
= head
->last
= NULL
;
645 this_du
= XOBNEW (&rename_obstack
, struct du_chain
);
646 head
->first
= head
->last
= this_du
;
648 this_du
->next_use
= 0;
650 this_du
->insn
= insn
;
655 scan_rtx_reg (rtx insn
, rtx
*loc
, enum reg_class cl
, enum scan_actions action
,
660 enum machine_mode mode
= GET_MODE (x
);
661 unsigned this_regno
= REGNO (x
);
662 unsigned this_nregs
= hard_regno_nregs
[this_regno
][mode
];
664 if (action
== mark_write
)
667 create_new_chain (this_regno
, this_nregs
, loc
, insn
, cl
);
671 if ((type
== OP_OUT
) != (action
== terminate_write
|| action
== mark_access
))
674 for (p
= &open_chains
; *p
;)
676 struct du_head
*head
= *p
;
677 struct du_head
*next
= head
->next_chain
;
678 int exact_match
= (head
->regno
== this_regno
679 && head
->nregs
== this_nregs
);
680 int superset
= (this_regno
<= head
->regno
681 && this_regno
+ this_nregs
>= head
->regno
+ head
->nregs
);
682 int subset
= (this_regno
>= head
->regno
683 && this_regno
+ this_nregs
<= head
->regno
+ head
->nregs
);
686 || head
->regno
+ head
->nregs
<= this_regno
687 || this_regno
+ this_nregs
<= head
->regno
)
689 p
= &head
->next_chain
;
693 if (action
== mark_read
|| action
== mark_access
)
695 /* ??? Class NO_REGS can happen if the md file makes use of
696 EXTRA_CONSTRAINTS to match registers. Which is arguably
697 wrong, but there we are. */
699 if (cl
== NO_REGS
|| (!exact_match
&& !DEBUG_INSN_P (insn
)))
703 "Cannot rename chain %s (%d) at insn %d (%s)\n",
704 reg_names
[head
->regno
], head
->id
, INSN_UID (insn
),
705 scan_actions_name
[(int) action
]);
706 head
->cannot_rename
= 1;
709 unsigned nregs
= this_nregs
;
710 head
->regno
= this_regno
;
711 head
->nregs
= this_nregs
;
713 SET_HARD_REG_BIT (live_in_chains
, head
->regno
+ nregs
);
716 "Widening register in chain %s (%d) at insn %d\n",
717 reg_names
[head
->regno
], head
->id
, INSN_UID (insn
));
721 fail_current_block
= true;
724 "Failing basic block due to unhandled overlap\n");
729 struct du_chain
*this_du
;
730 this_du
= XOBNEW (&rename_obstack
, struct du_chain
);
731 this_du
->next_use
= 0;
733 this_du
->insn
= insn
;
735 if (head
->first
== NULL
)
736 head
->first
= this_du
;
738 head
->last
->next_use
= this_du
;
739 head
->last
= this_du
;
741 /* Avoid adding the same location in a DEBUG_INSN multiple times,
742 which could happen with non-exact overlap. */
743 if (DEBUG_INSN_P (insn
))
745 /* Otherwise, find any other chains that do not match exactly;
746 ensure they all get marked unrenamable. */
747 p
= &head
->next_chain
;
751 /* Whether the terminated chain can be used for renaming
752 depends on the action and this being an exact match.
753 In either case, we remove this element from open_chains. */
755 if ((action
== terminate_dead
|| action
== terminate_write
)
760 head
->terminated
= 1;
761 head
->next_chain
= closed_chains
;
762 closed_chains
= head
;
763 bitmap_clear_bit (&open_chains_set
, head
->id
);
767 CLEAR_HARD_REG_BIT (live_in_chains
, head
->regno
+ nregs
);
772 "Closing chain %s (%d) at insn %d (%s)\n",
773 reg_names
[head
->regno
], head
->id
, INSN_UID (insn
),
774 scan_actions_name
[(int) action
]);
776 else if (action
== terminate_dead
|| action
== terminate_write
)
778 /* In this case, tracking liveness gets too hard. Fail the
779 entire basic block. */
782 "Failing basic block due to unhandled overlap\n");
783 fail_current_block
= true;
788 head
->cannot_rename
= 1;
791 "Cannot rename chain %s (%d) at insn %d (%s)\n",
792 reg_names
[head
->regno
], head
->id
, INSN_UID (insn
),
793 scan_actions_name
[(int) action
]);
794 p
= &head
->next_chain
;
799 /* Adapted from find_reloads_address_1. CL is INDEX_REG_CLASS or
800 BASE_REG_CLASS depending on how the register is being considered. */
803 scan_rtx_address (rtx insn
, rtx
*loc
, enum reg_class cl
,
804 enum scan_actions action
, enum machine_mode mode
)
807 RTX_CODE code
= GET_CODE (x
);
811 if (action
== mark_write
|| action
== mark_access
)
818 rtx orig_op0
= XEXP (x
, 0);
819 rtx orig_op1
= XEXP (x
, 1);
820 RTX_CODE code0
= GET_CODE (orig_op0
);
821 RTX_CODE code1
= GET_CODE (orig_op1
);
826 enum rtx_code index_code
= SCRATCH
;
828 if (GET_CODE (op0
) == SUBREG
)
830 op0
= SUBREG_REG (op0
);
831 code0
= GET_CODE (op0
);
834 if (GET_CODE (op1
) == SUBREG
)
836 op1
= SUBREG_REG (op1
);
837 code1
= GET_CODE (op1
);
840 if (code0
== MULT
|| code0
== SIGN_EXTEND
|| code0
== TRUNCATE
841 || code0
== ZERO_EXTEND
|| code1
== MEM
)
845 index_code
= GET_CODE (*locI
);
847 else if (code1
== MULT
|| code1
== SIGN_EXTEND
|| code1
== TRUNCATE
848 || code1
== ZERO_EXTEND
|| code0
== MEM
)
852 index_code
= GET_CODE (*locI
);
854 else if (code0
== CONST_INT
|| code0
== CONST
855 || code0
== SYMBOL_REF
|| code0
== LABEL_REF
)
858 index_code
= GET_CODE (XEXP (x
, 0));
860 else if (code1
== CONST_INT
|| code1
== CONST
861 || code1
== SYMBOL_REF
|| code1
== LABEL_REF
)
864 index_code
= GET_CODE (XEXP (x
, 1));
866 else if (code0
== REG
&& code1
== REG
)
869 unsigned regno0
= REGNO (op0
), regno1
= REGNO (op1
);
871 if (REGNO_OK_FOR_INDEX_P (regno1
)
872 && regno_ok_for_base_p (regno0
, mode
, PLUS
, REG
))
874 else if (REGNO_OK_FOR_INDEX_P (regno0
)
875 && regno_ok_for_base_p (regno1
, mode
, PLUS
, REG
))
877 else if (regno_ok_for_base_p (regno0
, mode
, PLUS
, REG
)
878 || REGNO_OK_FOR_INDEX_P (regno1
))
880 else if (regno_ok_for_base_p (regno1
, mode
, PLUS
, REG
))
885 locI
= &XEXP (x
, index_op
);
886 locB
= &XEXP (x
, !index_op
);
887 index_code
= GET_CODE (*locI
);
889 else if (code0
== REG
)
893 index_code
= GET_CODE (*locI
);
895 else if (code1
== REG
)
899 index_code
= GET_CODE (*locI
);
903 scan_rtx_address (insn
, locI
, INDEX_REG_CLASS
, action
, mode
);
905 scan_rtx_address (insn
, locB
, base_reg_class (mode
, PLUS
, index_code
),
918 /* If the target doesn't claim to handle autoinc, this must be
919 something special, like a stack push. Kill this chain. */
920 action
= mark_all_read
;
925 scan_rtx_address (insn
, &XEXP (x
, 0),
926 base_reg_class (GET_MODE (x
), MEM
, SCRATCH
), action
,
931 scan_rtx_reg (insn
, loc
, cl
, action
, OP_IN
);
938 fmt
= GET_RTX_FORMAT (code
);
939 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
942 scan_rtx_address (insn
, &XEXP (x
, i
), cl
, action
, mode
);
943 else if (fmt
[i
] == 'E')
944 for (j
= XVECLEN (x
, i
) - 1; j
>= 0; j
--)
945 scan_rtx_address (insn
, &XVECEXP (x
, i
, j
), cl
, action
, mode
);
950 scan_rtx (rtx insn
, rtx
*loc
, enum reg_class cl
, enum scan_actions action
,
955 enum rtx_code code
= GET_CODE (x
);
973 scan_rtx_reg (insn
, loc
, cl
, action
, type
);
977 scan_rtx_address (insn
, &XEXP (x
, 0),
978 base_reg_class (GET_MODE (x
), MEM
, SCRATCH
), action
,
983 scan_rtx (insn
, &SET_SRC (x
), cl
, action
, OP_IN
);
984 scan_rtx (insn
, &SET_DEST (x
), cl
, action
,
985 (GET_CODE (PATTERN (insn
)) == COND_EXEC
986 && verify_reg_tracked (SET_DEST (x
))) ? OP_INOUT
: OP_OUT
);
989 case STRICT_LOW_PART
:
990 scan_rtx (insn
, &XEXP (x
, 0), cl
, action
,
991 verify_reg_tracked (XEXP (x
, 0)) ? OP_INOUT
: OP_OUT
);
996 scan_rtx (insn
, &XEXP (x
, 0), cl
, action
,
997 (type
== OP_IN
? OP_IN
:
998 verify_reg_tracked (XEXP (x
, 0)) ? OP_INOUT
: OP_OUT
));
999 scan_rtx (insn
, &XEXP (x
, 1), cl
, action
, OP_IN
);
1000 scan_rtx (insn
, &XEXP (x
, 2), cl
, action
, OP_IN
);
1009 /* Should only happen inside MEM. */
1013 scan_rtx (insn
, &SET_DEST (x
), cl
, action
,
1014 (GET_CODE (PATTERN (insn
)) == COND_EXEC
1015 && verify_reg_tracked (SET_DEST (x
))) ? OP_INOUT
: OP_OUT
);
1019 scan_rtx (insn
, &XEXP (x
, 0), cl
, action
, type
);
1021 scan_rtx (insn
, &XEXP (x
, 1), cl
, action
, type
);
1028 fmt
= GET_RTX_FORMAT (code
);
1029 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
1032 scan_rtx (insn
, &XEXP (x
, i
), cl
, action
, type
);
1033 else if (fmt
[i
] == 'E')
1034 for (j
= XVECLEN (x
, i
) - 1; j
>= 0; j
--)
1035 scan_rtx (insn
, &XVECEXP (x
, i
, j
), cl
, action
, type
);
1039 /* Hide operands of the current insn (of which there are N_OPS) by
1040 substituting cc0 for them.
1041 Previous values are stored in the OLD_OPERANDS and OLD_DUPS.
1042 For every bit set in DO_NOT_HIDE, we leave the operand alone.
1043 If INOUT_AND_EC_ONLY is set, we only do this for OP_INOUT type operands
1044 and earlyclobbers. */
1047 hide_operands (int n_ops
, rtx
*old_operands
, rtx
*old_dups
,
1048 unsigned HOST_WIDE_INT do_not_hide
, bool inout_and_ec_only
)
1051 int alt
= which_alternative
;
1052 for (i
= 0; i
< n_ops
; i
++)
1054 old_operands
[i
] = recog_data
.operand
[i
];
1055 /* Don't squash match_operator or match_parallel here, since
1056 we don't know that all of the contained registers are
1057 reachable by proper operands. */
1058 if (recog_data
.constraints
[i
][0] == '\0')
1060 if (do_not_hide
& (1 << i
))
1062 if (!inout_and_ec_only
|| recog_data
.operand_type
[i
] == OP_INOUT
1063 || recog_op_alt
[i
][alt
].earlyclobber
)
1064 *recog_data
.operand_loc
[i
] = cc0_rtx
;
1066 for (i
= 0; i
< recog_data
.n_dups
; i
++)
1068 int opn
= recog_data
.dup_num
[i
];
1069 old_dups
[i
] = *recog_data
.dup_loc
[i
];
1070 if (do_not_hide
& (1 << opn
))
1072 if (!inout_and_ec_only
|| recog_data
.operand_type
[opn
] == OP_INOUT
1073 || recog_op_alt
[opn
][alt
].earlyclobber
)
1074 *recog_data
.dup_loc
[i
] = cc0_rtx
;
1078 /* Undo the substitution performed by hide_operands. INSN is the insn we
1079 are processing; the arguments are the same as in hide_operands. */
1082 restore_operands (rtx insn
, int n_ops
, rtx
*old_operands
, rtx
*old_dups
)
1085 for (i
= 0; i
< recog_data
.n_dups
; i
++)
1086 *recog_data
.dup_loc
[i
] = old_dups
[i
];
1087 for (i
= 0; i
< n_ops
; i
++)
1088 *recog_data
.operand_loc
[i
] = old_operands
[i
];
1089 if (recog_data
.n_dups
)
1090 df_insn_rescan (insn
);
1093 /* For each output operand of INSN, call scan_rtx to create a new
1094 open chain. Do this only for normal or earlyclobber outputs,
1095 depending on EARLYCLOBBER. */
1098 record_out_operands (rtx insn
, bool earlyclobber
)
1100 int n_ops
= recog_data
.n_operands
;
1101 int alt
= which_alternative
;
1105 for (i
= 0; i
< n_ops
+ recog_data
.n_dups
; i
++)
1107 int opn
= i
< n_ops
? i
: recog_data
.dup_num
[i
- n_ops
];
1108 rtx
*loc
= (i
< n_ops
1109 ? recog_data
.operand_loc
[opn
]
1110 : recog_data
.dup_loc
[i
- n_ops
]);
1112 enum reg_class cl
= recog_op_alt
[opn
][alt
].cl
;
1114 struct du_head
*prev_open
;
1116 if (recog_data
.operand_type
[opn
] != OP_OUT
1117 || recog_op_alt
[opn
][alt
].earlyclobber
!= earlyclobber
)
1120 prev_open
= open_chains
;
1121 scan_rtx (insn
, loc
, cl
, mark_write
, OP_OUT
);
1123 /* ??? Many targets have output constraints on the SET_DEST
1124 of a call insn, which is stupid, since these are certainly
1125 ABI defined hard registers. For these, and for asm operands
1126 that originally referenced hard registers, we must record that
1127 the chain cannot be renamed. */
1129 || (asm_noperands (PATTERN (insn
)) > 0
1131 && REGNO (op
) == ORIGINAL_REGNO (op
)))
1133 if (prev_open
!= open_chains
)
1134 open_chains
->cannot_rename
= 1;
1139 /* Build def/use chain. */
1141 static struct du_head
*
1142 build_def_use (basic_block bb
)
1146 unsigned HOST_WIDE_INT untracked_operands
;
1148 open_chains
= closed_chains
= NULL
;
1150 fail_current_block
= false;
1153 bitmap_initialize (&open_chains_set
, &bitmap_default_obstack
);
1154 CLEAR_HARD_REG_SET (live_in_chains
);
1155 REG_SET_TO_HARD_REG_SET (live_hard_regs
, df_get_live_in (bb
));
1156 for (def_rec
= df_get_artificial_defs (bb
->index
); *def_rec
; def_rec
++)
1158 df_ref def
= *def_rec
;
1159 if (DF_REF_FLAGS (def
) & DF_REF_AT_TOP
)
1160 SET_HARD_REG_BIT (live_hard_regs
, DF_REF_REGNO (def
));
1163 for (insn
= BB_HEAD (bb
); ; insn
= NEXT_INSN (insn
))
1165 if (NONDEBUG_INSN_P (insn
))
1169 rtx old_operands
[MAX_RECOG_OPERANDS
];
1170 rtx old_dups
[MAX_DUP_OPERANDS
];
1174 enum rtx_code set_code
= SET
;
1175 enum rtx_code clobber_code
= CLOBBER
;
1177 /* Process the insn, determining its effect on the def-use
1178 chains and live hard registers. We perform the following
1179 steps with the register references in the insn, simulating
1181 (1) Deal with earlyclobber operands and CLOBBERs of non-operands
1182 by creating chains and marking hard regs live.
1183 (2) Any read outside an operand causes any chain it overlaps
1184 with to be marked unrenamable.
1185 (3) Any read inside an operand is added if there's already
1186 an open chain for it.
1187 (4) For any REG_DEAD note we find, close open chains that
1189 (5) For any non-earlyclobber write we find, close open chains
1191 (6) For any non-earlyclobber write we find in an operand, make
1192 a new chain or mark the hard register as live.
1193 (7) For any REG_UNUSED, close any chains we just opened.
1195 We cannot deal with situations where we track a reg in one mode
1196 and see a reference in another mode; these will cause the chain
1197 to be marked unrenamable or even cause us to abort the entire
1200 extract_insn (insn
);
1201 if (! constrain_operands (1))
1202 fatal_insn_not_found (insn
);
1203 preprocess_constraints ();
1204 alt
= which_alternative
;
1205 n_ops
= recog_data
.n_operands
;
1206 untracked_operands
= 0;
1208 /* Simplify the code below by rewriting things to reflect
1209 matching constraints. Also promote OP_OUT to OP_INOUT in
1210 predicated instructions, but only for register operands
1211 that are already tracked, so that we can create a chain
1212 when the first SET makes a register live. */
1214 predicated
= GET_CODE (PATTERN (insn
)) == COND_EXEC
;
1215 for (i
= 0; i
< n_ops
; ++i
)
1217 rtx op
= recog_data
.operand
[i
];
1218 int matches
= recog_op_alt
[i
][alt
].matches
;
1220 recog_op_alt
[i
][alt
].cl
= recog_op_alt
[matches
][alt
].cl
;
1221 if (matches
>= 0 || recog_op_alt
[i
][alt
].matched
>= 0
1222 || (predicated
&& recog_data
.operand_type
[i
] == OP_OUT
))
1224 recog_data
.operand_type
[i
] = OP_INOUT
;
1225 /* A special case to deal with instruction patterns that
1226 have matching operands with different modes. If we're
1227 not already tracking such a reg, we won't start here,
1228 and we must instead make sure to make the operand visible
1229 to the machinery that tracks hard registers. */
1231 && (GET_MODE_SIZE (recog_data
.operand_mode
[i
])
1232 != GET_MODE_SIZE (recog_data
.operand_mode
[matches
]))
1233 && !verify_reg_in_set (op
, &live_in_chains
))
1235 untracked_operands
|= 1 << i
;
1236 untracked_operands
|= 1 << matches
;
1239 /* If there's an in-out operand with a register that is not
1240 being tracked at all yet, open a chain. */
1241 if (recog_data
.operand_type
[i
] == OP_INOUT
1242 && !(untracked_operands
& (1 << i
))
1244 && !verify_reg_tracked (op
))
1246 enum machine_mode mode
= GET_MODE (op
);
1247 unsigned this_regno
= REGNO (op
);
1248 unsigned this_nregs
= hard_regno_nregs
[this_regno
][mode
];
1249 create_new_chain (this_regno
, this_nregs
, NULL
, NULL_RTX
,
1254 if (fail_current_block
)
1257 /* Step 1a: Mark hard registers that are clobbered in this insn,
1258 outside an operand, as live. */
1259 hide_operands (n_ops
, old_operands
, old_dups
, untracked_operands
,
1261 note_stores (PATTERN (insn
), note_sets_clobbers
, &clobber_code
);
1262 restore_operands (insn
, n_ops
, old_operands
, old_dups
);
1264 /* Step 1b: Begin new chains for earlyclobbered writes inside
1266 record_out_operands (insn
, true);
1268 /* Step 2: Mark chains for which we have reads outside operands
1270 We do this by munging all operands into CC0, and closing
1271 everything remaining. */
1273 hide_operands (n_ops
, old_operands
, old_dups
, untracked_operands
,
1275 scan_rtx (insn
, &PATTERN (insn
), NO_REGS
, mark_all_read
, OP_IN
);
1276 restore_operands (insn
, n_ops
, old_operands
, old_dups
);
1278 /* Step 2B: Can't rename function call argument registers. */
1279 if (CALL_P (insn
) && CALL_INSN_FUNCTION_USAGE (insn
))
1280 scan_rtx (insn
, &CALL_INSN_FUNCTION_USAGE (insn
),
1281 NO_REGS
, mark_all_read
, OP_IN
);
1283 /* Step 2C: Can't rename asm operands that were originally
1285 if (asm_noperands (PATTERN (insn
)) > 0)
1286 for (i
= 0; i
< n_ops
; i
++)
1288 rtx
*loc
= recog_data
.operand_loc
[i
];
1292 && REGNO (op
) == ORIGINAL_REGNO (op
)
1293 && (recog_data
.operand_type
[i
] == OP_IN
1294 || recog_data
.operand_type
[i
] == OP_INOUT
))
1295 scan_rtx (insn
, loc
, NO_REGS
, mark_all_read
, OP_IN
);
1298 /* Step 3: Append to chains for reads inside operands. */
1299 for (i
= 0; i
< n_ops
+ recog_data
.n_dups
; i
++)
1301 int opn
= i
< n_ops
? i
: recog_data
.dup_num
[i
- n_ops
];
1302 rtx
*loc
= (i
< n_ops
1303 ? recog_data
.operand_loc
[opn
]
1304 : recog_data
.dup_loc
[i
- n_ops
]);
1305 enum reg_class cl
= recog_op_alt
[opn
][alt
].cl
;
1306 enum op_type type
= recog_data
.operand_type
[opn
];
1308 /* Don't scan match_operand here, since we've no reg class
1309 information to pass down. Any operands that we could
1310 substitute in will be represented elsewhere. */
1311 if (recog_data
.constraints
[opn
][0] == '\0'
1312 || untracked_operands
& (1 << opn
))
1315 if (recog_op_alt
[opn
][alt
].is_address
)
1316 scan_rtx_address (insn
, loc
, cl
, mark_read
, VOIDmode
);
1318 scan_rtx (insn
, loc
, cl
, mark_read
, type
);
1321 /* Step 3B: Record updates for regs in REG_INC notes, and
1322 source regs in REG_FRAME_RELATED_EXPR notes. */
1323 for (note
= REG_NOTES (insn
); note
; note
= XEXP (note
, 1))
1324 if (REG_NOTE_KIND (note
) == REG_INC
1325 || REG_NOTE_KIND (note
) == REG_FRAME_RELATED_EXPR
)
1326 scan_rtx (insn
, &XEXP (note
, 0), ALL_REGS
, mark_read
,
1329 /* Step 4: Close chains for registers that die here. */
1330 for (note
= REG_NOTES (insn
); note
; note
= XEXP (note
, 1))
1331 if (REG_NOTE_KIND (note
) == REG_DEAD
)
1333 remove_from_hard_reg_set (&live_hard_regs
,
1334 GET_MODE (XEXP (note
, 0)),
1335 REGNO (XEXP (note
, 0)));
1336 scan_rtx (insn
, &XEXP (note
, 0), NO_REGS
, terminate_dead
,
1340 /* Step 4B: If this is a call, any chain live at this point
1341 requires a caller-saved reg. */
1345 for (p
= open_chains
; p
; p
= p
->next_chain
)
1346 p
->need_caller_save_reg
= 1;
1349 /* Step 5: Close open chains that overlap writes. Similar to
1350 step 2, we hide in-out operands, since we do not want to
1351 close these chains. We also hide earlyclobber operands,
1352 since we've opened chains for them in step 1, and earlier
1353 chains they would overlap with must have been closed at
1354 the previous insn at the latest, as such operands cannot
1355 possibly overlap with any input operands. */
1357 hide_operands (n_ops
, old_operands
, old_dups
, untracked_operands
,
1359 scan_rtx (insn
, &PATTERN (insn
), NO_REGS
, terminate_write
, OP_IN
);
1360 restore_operands (insn
, n_ops
, old_operands
, old_dups
);
1362 /* Step 6a: Mark hard registers that are set in this insn,
1363 outside an operand, as live. */
1364 hide_operands (n_ops
, old_operands
, old_dups
, untracked_operands
,
1366 note_stores (PATTERN (insn
), note_sets_clobbers
, &set_code
);
1367 restore_operands (insn
, n_ops
, old_operands
, old_dups
);
1369 /* Step 6b: Begin new chains for writes inside operands. */
1370 record_out_operands (insn
, false);
1372 /* Step 6c: Record destination regs in REG_FRAME_RELATED_EXPR
1373 notes for update. */
1374 for (note
= REG_NOTES (insn
); note
; note
= XEXP (note
, 1))
1375 if (REG_NOTE_KIND (note
) == REG_FRAME_RELATED_EXPR
)
1376 scan_rtx (insn
, &XEXP (note
, 0), ALL_REGS
, mark_access
,
1379 /* Step 7: Close chains for registers that were never
1380 really used here. */
1381 for (note
= REG_NOTES (insn
); note
; note
= XEXP (note
, 1))
1382 if (REG_NOTE_KIND (note
) == REG_UNUSED
)
1384 remove_from_hard_reg_set (&live_hard_regs
,
1385 GET_MODE (XEXP (note
, 0)),
1386 REGNO (XEXP (note
, 0)));
1387 scan_rtx (insn
, &XEXP (note
, 0), NO_REGS
, terminate_dead
,
1391 else if (DEBUG_INSN_P (insn
)
1392 && !VAR_LOC_UNKNOWN_P (INSN_VAR_LOCATION_LOC (insn
)))
1394 scan_rtx (insn
, &INSN_VAR_LOCATION_LOC (insn
),
1395 ALL_REGS
, mark_read
, OP_IN
);
1397 if (insn
== BB_END (bb
))
1401 bitmap_clear (&open_chains_set
);
1403 if (fail_current_block
)
1406 /* Since we close every chain when we find a REG_DEAD note, anything that
1407 is still open lives past the basic block, so it can't be renamed. */
1408 return closed_chains
;
1411 /* Dump all def/use chains in CHAINS to DUMP_FILE. They are
1412 printed in reverse order as that's how we build them. */
1415 dump_def_use_chain (struct du_head
*head
)
1419 struct du_chain
*this_du
= head
->first
;
1420 fprintf (dump_file
, "Register %s (%d):",
1421 reg_names
[head
->regno
], head
->nregs
);
1424 fprintf (dump_file
, " %d [%s]", INSN_UID (this_du
->insn
),
1425 reg_class_names
[this_du
->cl
]);
1426 this_du
= this_du
->next_use
;
1428 fprintf (dump_file
, "\n");
1429 head
= head
->next_chain
;
1435 gate_handle_regrename (void)
1437 return (optimize
> 0 && (flag_rename_registers
));
1440 struct rtl_opt_pass pass_regrename
=
1445 gate_handle_regrename
, /* gate */
1446 regrename_optimize
, /* execute */
1449 0, /* static_pass_number */
1450 TV_RENAME_REGISTERS
, /* tv_id */
1451 0, /* properties_required */
1452 0, /* properties_provided */
1453 0, /* properties_destroyed */
1454 0, /* todo_flags_start */
1455 TODO_df_finish
| TODO_verify_rtl_sharing
|
1456 TODO_dump_func
/* todo_flags_finish */