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"
42 #if HOST_BITS_PER_WIDE_INT <= MAX_RECOG_OPERANDS
43 #error "Use a different bitmap implementation for untracked_operands."
46 /* We keep linked lists of DU_HEAD structures, each of which describes
47 a chain of occurrences of a reg. */
51 struct du_head
*next_chain
;
52 /* The first and last elements of this chain. */
53 struct du_chain
*first
, *last
;
54 /* Describes the register being tracked. */
55 unsigned regno
, nregs
;
57 /* A unique id to be used as an index into the conflicts bitmaps. */
59 /* A bitmap to record conflicts with other chains. */
60 bitmap_head conflicts
;
61 /* Conflicts with untracked hard registers. */
62 HARD_REG_SET hard_conflicts
;
64 /* Nonzero if the chain is finished; zero if it is still open. */
65 unsigned int terminated
:1;
66 /* Nonzero if the chain crosses a call. */
67 unsigned int need_caller_save_reg
:1;
68 /* Nonzero if the register is used in a way that prevents renaming,
69 such as the SET_DEST of a CALL_INSN or an asm operand that used
70 to be a hard register. */
71 unsigned int cannot_rename
:1;
74 /* This struct describes a single occurrence of a register. */
77 /* Links to the next occurrence of the register. */
78 struct du_chain
*next_use
;
80 /* The insn where the register appears. */
82 /* The location inside the insn. */
84 /* The register class required by the insn at this location. */
85 ENUM_BITFIELD(reg_class
) cl
: 16;
95 /* mark_access is for marking the destination regs in
96 REG_FRAME_RELATED_EXPR notes (as if they were read) so that the
97 note is updated properly. */
101 static const char * const scan_actions_name
[] =
111 static struct obstack rename_obstack
;
113 static void do_replace (struct du_head
*, int);
114 static void scan_rtx_reg (rtx
, rtx
*, enum reg_class
,
115 enum scan_actions
, enum op_type
);
116 static void scan_rtx_address (rtx
, rtx
*, enum reg_class
,
117 enum scan_actions
, enum machine_mode
);
118 static void scan_rtx (rtx
, rtx
*, enum reg_class
, enum scan_actions
,
120 static struct du_head
*build_def_use (basic_block
);
121 static void dump_def_use_chain (struct du_head
*);
123 typedef struct du_head
*du_head_p
;
124 DEF_VEC_P (du_head_p
);
125 DEF_VEC_ALLOC_P (du_head_p
, heap
);
126 static VEC(du_head_p
, heap
) *id_to_chain
;
129 free_chain_data (void)
133 for (i
= 0; VEC_iterate(du_head_p
, id_to_chain
, i
, ptr
); i
++)
134 bitmap_clear (&ptr
->conflicts
);
136 VEC_free (du_head_p
, heap
, id_to_chain
);
139 /* For a def-use chain HEAD, find which registers overlap its lifetime and
140 set the corresponding bits in *PSET. */
143 merge_overlapping_regs (HARD_REG_SET
*pset
, struct du_head
*head
)
147 IOR_HARD_REG_SET (*pset
, head
->hard_conflicts
);
148 EXECUTE_IF_SET_IN_BITMAP (&head
->conflicts
, 0, i
, bi
)
150 du_head_p other
= VEC_index (du_head_p
, id_to_chain
, i
);
151 unsigned j
= other
->nregs
;
153 SET_HARD_REG_BIT (*pset
, other
->regno
+ j
);
157 /* Perform register renaming on the current function. */
160 regrename_optimize (void)
162 int tick
[FIRST_PSEUDO_REGISTER
];
167 df_set_flags (DF_LR_RUN_DCE
);
168 df_note_add_problem ();
170 df_set_flags (DF_DEFER_INSN_RESCAN
);
172 memset (tick
, 0, sizeof tick
);
174 gcc_obstack_init (&rename_obstack
);
175 first_obj
= XOBNEWVAR (&rename_obstack
, char, 0);
179 struct du_head
*all_chains
= 0;
180 HARD_REG_SET unavailable
;
182 HARD_REG_SET regs_seen
;
183 CLEAR_HARD_REG_SET (regs_seen
);
186 id_to_chain
= VEC_alloc (du_head_p
, heap
, 0);
188 CLEAR_HARD_REG_SET (unavailable
);
191 fprintf (dump_file
, "\nBasic block %d:\n", bb
->index
);
193 all_chains
= build_def_use (bb
);
196 dump_def_use_chain (all_chains
);
198 CLEAR_HARD_REG_SET (unavailable
);
199 /* Don't clobber traceback for noreturn functions. */
200 if (frame_pointer_needed
)
202 add_to_hard_reg_set (&unavailable
, Pmode
, FRAME_POINTER_REGNUM
);
203 #if FRAME_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM
204 add_to_hard_reg_set (&unavailable
, Pmode
, HARD_FRAME_POINTER_REGNUM
);
210 int new_reg
, best_new_reg
, best_nregs
;
212 struct du_head
*this_head
= all_chains
;
213 struct du_chain
*tmp
;
214 HARD_REG_SET this_unavailable
;
215 int reg
= this_head
->regno
;
218 all_chains
= this_head
->next_chain
;
220 if (this_head
->cannot_rename
)
224 best_nregs
= this_head
->nregs
;
226 #if 0 /* This just disables optimization opportunities. */
227 /* Only rename once we've seen the reg more than once. */
228 if (! TEST_HARD_REG_BIT (regs_seen
, reg
))
230 SET_HARD_REG_BIT (regs_seen
, reg
);
235 if (fixed_regs
[reg
] || global_regs
[reg
]
236 #if FRAME_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM
237 || (frame_pointer_needed
&& reg
== HARD_FRAME_POINTER_REGNUM
)
239 || (frame_pointer_needed
&& reg
== FRAME_POINTER_REGNUM
)
244 COPY_HARD_REG_SET (this_unavailable
, unavailable
);
246 /* Count number of uses, and narrow the set of registers we can
249 for (tmp
= this_head
->first
; tmp
; tmp
= tmp
->next_use
)
251 if (DEBUG_INSN_P (tmp
->insn
))
254 IOR_COMPL_HARD_REG_SET (this_unavailable
,
255 reg_class_contents
[tmp
->cl
]);
261 if (this_head
->need_caller_save_reg
)
262 IOR_HARD_REG_SET (this_unavailable
, call_used_reg_set
);
264 merge_overlapping_regs (&this_unavailable
, this_head
);
266 /* Now potential_regs is a reasonable approximation, let's
267 have a closer look at each register still in there. */
268 for (new_reg
= 0; new_reg
< FIRST_PSEUDO_REGISTER
; new_reg
++)
270 enum machine_mode mode
= GET_MODE (*this_head
->first
->loc
);
271 int nregs
= hard_regno_nregs
[new_reg
][mode
];
273 for (i
= nregs
- 1; i
>= 0; --i
)
274 if (TEST_HARD_REG_BIT (this_unavailable
, new_reg
+ i
)
275 || fixed_regs
[new_reg
+ i
]
276 || global_regs
[new_reg
+ i
]
277 /* Can't use regs which aren't saved by the prologue. */
278 || (! df_regs_ever_live_p (new_reg
+ i
)
279 && ! call_used_regs
[new_reg
+ i
])
280 #ifdef LEAF_REGISTERS
281 /* We can't use a non-leaf register if we're in a
283 || (current_function_is_leaf
284 && !LEAF_REGISTERS
[new_reg
+ i
])
286 #ifdef HARD_REGNO_RENAME_OK
287 || ! HARD_REGNO_RENAME_OK (reg
+ i
, new_reg
+ i
)
294 /* See whether it accepts all modes that occur in
295 definition and uses. */
296 for (tmp
= this_head
->first
; tmp
; tmp
= tmp
->next_use
)
297 if ((! HARD_REGNO_MODE_OK (new_reg
, GET_MODE (*tmp
->loc
))
298 && ! DEBUG_INSN_P (tmp
->insn
))
299 || (this_head
->need_caller_save_reg
300 && ! (HARD_REGNO_CALL_PART_CLOBBERED
301 (reg
, GET_MODE (*tmp
->loc
)))
302 && (HARD_REGNO_CALL_PART_CLOBBERED
303 (new_reg
, GET_MODE (*tmp
->loc
)))))
307 if (tick
[best_new_reg
] > tick
[new_reg
])
309 best_new_reg
= new_reg
;
317 fprintf (dump_file
, "Register %s in insn %d",
318 reg_names
[reg
], INSN_UID (this_head
->first
->insn
));
319 if (this_head
->need_caller_save_reg
)
320 fprintf (dump_file
, " crosses a call");
323 if (best_new_reg
== reg
)
325 tick
[reg
] = ++this_tick
;
327 fprintf (dump_file
, "; no available better choice\n");
332 fprintf (dump_file
, ", renamed as %s\n", reg_names
[best_new_reg
]);
334 do_replace (this_head
, best_new_reg
);
335 this_head
->regno
= best_new_reg
;
336 this_head
->nregs
= best_nregs
;
337 tick
[best_new_reg
] = ++this_tick
;
338 df_set_regs_ever_live (best_new_reg
, true);
342 obstack_free (&rename_obstack
, first_obj
);
345 obstack_free (&rename_obstack
, NULL
);
348 fputc ('\n', dump_file
);
354 do_replace (struct du_head
*head
, int reg
)
356 struct du_chain
*chain
;
357 unsigned int base_regno
= head
->regno
;
358 bool found_note
= false;
360 gcc_assert (! DEBUG_INSN_P (head
->first
->insn
));
362 for (chain
= head
->first
; chain
; chain
= chain
->next_use
)
364 unsigned int regno
= ORIGINAL_REGNO (*chain
->loc
);
365 struct reg_attrs
*attr
= REG_ATTRS (*chain
->loc
);
366 int reg_ptr
= REG_POINTER (*chain
->loc
);
368 if (DEBUG_INSN_P (chain
->insn
) && REGNO (*chain
->loc
) != base_regno
)
369 INSN_VAR_LOCATION_LOC (chain
->insn
) = gen_rtx_UNKNOWN_VAR_LOC ();
374 *chain
->loc
= gen_raw_REG (GET_MODE (*chain
->loc
), reg
);
375 if (regno
>= FIRST_PSEUDO_REGISTER
)
376 ORIGINAL_REGNO (*chain
->loc
) = regno
;
377 REG_ATTRS (*chain
->loc
) = attr
;
378 REG_POINTER (*chain
->loc
) = reg_ptr
;
380 for (note
= REG_NOTES (chain
->insn
); note
; note
= XEXP (note
, 1))
382 enum reg_note kind
= REG_NOTE_KIND (note
);
383 if (kind
== REG_DEAD
|| kind
== REG_UNUSED
)
385 rtx reg
= XEXP (note
, 0);
386 gcc_assert (HARD_REGISTER_P (reg
));
388 if (REGNO (reg
) == base_regno
)
392 && reg_set_p (*chain
->loc
, chain
->insn
))
393 remove_note (chain
->insn
, note
);
395 XEXP (note
, 0) = *chain
->loc
;
402 df_insn_rescan (chain
->insn
);
406 /* If the chain's first insn is the same as the last, we should have
407 found a REG_UNUSED note. */
408 gcc_assert (head
->first
->insn
!= head
->last
->insn
);
409 if (!reg_set_p (*head
->last
->loc
, head
->last
->insn
))
410 add_reg_note (head
->last
->insn
, REG_DEAD
, *head
->last
->loc
);
415 /* Walk all chains starting with CHAINS and record that they conflict with
416 another chain whose id is ID. */
419 mark_conflict (struct du_head
*chains
, unsigned id
)
423 bitmap_set_bit (&chains
->conflicts
, id
);
424 chains
= chains
->next_chain
;
428 /* True if we found a register with a size mismatch, which means that we
429 can't track its lifetime accurately. If so, we abort the current block
431 static bool fail_current_block
;
433 /* The id to be given to the next opened chain. */
434 static unsigned current_id
;
436 /* List of currently open chains, and closed chains that can be renamed. */
437 static struct du_head
*open_chains
;
438 static struct du_head
*closed_chains
;
440 /* Bitmap of open chains. The bits set always match the list found in
442 static bitmap_head open_chains_set
;
444 /* Record the registers being tracked in open_chains. */
445 static HARD_REG_SET live_in_chains
;
447 /* Record the registers that are live but not tracked. The intersection
448 between this and live_in_chains is empty. */
449 static HARD_REG_SET live_hard_regs
;
451 /* Return true if OP is a reg for which all bits are set in PSET, false
452 if all bits are clear.
453 In other cases, set fail_current_block and return false. */
456 verify_reg_in_set (rtx op
, HARD_REG_SET
*pset
)
458 unsigned regno
, nregs
;
459 bool all_live
, all_dead
;
464 nregs
= hard_regno_nregs
[regno
][GET_MODE (op
)];
465 all_live
= all_dead
= true;
467 if (TEST_HARD_REG_BIT (*pset
, regno
+ nregs
))
471 if (!all_dead
&& !all_live
)
473 fail_current_block
= true;
479 /* Return true if OP is a reg that is being tracked already in some form.
480 May set fail_current_block if it sees an unhandled case of overlap. */
483 verify_reg_tracked (rtx op
)
485 return (verify_reg_in_set (op
, &live_hard_regs
)
486 || verify_reg_in_set (op
, &live_in_chains
));
489 /* Called through note_stores. DATA points to a rtx_code, either SET or
490 CLOBBER, which tells us which kind of rtx to look at. If we have a
491 match, record the set register in live_hard_regs and in the hard_conflicts
492 bitmap of open chains. */
495 note_sets_clobbers (rtx x
, const_rtx set
, void *data
)
497 enum rtx_code code
= *(enum rtx_code
*)data
;
498 struct du_head
*chain
;
500 if (GET_CODE (x
) == SUBREG
)
502 if (!REG_P (x
) || GET_CODE (set
) != code
)
504 /* There must not be pseudos at this point. */
505 gcc_assert (HARD_REGISTER_P (x
));
506 add_to_hard_reg_set (&live_hard_regs
, GET_MODE (x
), REGNO (x
));
507 for (chain
= open_chains
; chain
; chain
= chain
->next_chain
)
508 add_to_hard_reg_set (&chain
->hard_conflicts
, GET_MODE (x
), REGNO (x
));
511 /* Create a new chain for THIS_NREGS registers starting at THIS_REGNO,
512 and record its occurrence in *LOC, which is being written to in INSN.
513 This access requires a register of class CL. */
516 create_new_chain (unsigned this_regno
, unsigned this_nregs
, rtx
*loc
,
517 rtx insn
, enum reg_class cl
)
519 struct du_head
*head
= XOBNEW (&rename_obstack
, struct du_head
);
520 struct du_chain
*this_du
;
523 head
->next_chain
= open_chains
;
525 head
->regno
= this_regno
;
526 head
->nregs
= this_nregs
;
527 head
->need_caller_save_reg
= 0;
528 head
->cannot_rename
= 0;
529 head
->terminated
= 0;
531 VEC_safe_push (du_head_p
, heap
, id_to_chain
, head
);
532 head
->id
= current_id
++;
534 bitmap_initialize (&head
->conflicts
, &bitmap_default_obstack
);
535 bitmap_copy (&head
->conflicts
, &open_chains_set
);
536 mark_conflict (open_chains
, head
->id
);
538 /* Since we're tracking this as a chain now, remove it from the
539 list of conflicting live hard registers and track it in
540 live_in_chains instead. */
544 SET_HARD_REG_BIT (live_in_chains
, head
->regno
+ nregs
);
545 CLEAR_HARD_REG_BIT (live_hard_regs
, head
->regno
+ nregs
);
548 COPY_HARD_REG_SET (head
->hard_conflicts
, live_hard_regs
);
549 bitmap_set_bit (&open_chains_set
, head
->id
);
555 fprintf (dump_file
, "Creating chain %s (%d)",
556 reg_names
[head
->regno
], head
->id
);
557 if (insn
!= NULL_RTX
)
558 fprintf (dump_file
, " at insn %d", INSN_UID (insn
));
559 fprintf (dump_file
, "\n");
562 if (insn
== NULL_RTX
)
564 head
->first
= head
->last
= NULL
;
568 this_du
= XOBNEW (&rename_obstack
, struct du_chain
);
569 head
->first
= head
->last
= this_du
;
571 this_du
->next_use
= 0;
573 this_du
->insn
= insn
;
578 scan_rtx_reg (rtx insn
, rtx
*loc
, enum reg_class cl
, enum scan_actions action
,
583 enum machine_mode mode
= GET_MODE (x
);
584 unsigned this_regno
= REGNO (x
);
585 unsigned this_nregs
= hard_regno_nregs
[this_regno
][mode
];
587 if (action
== mark_write
)
590 create_new_chain (this_regno
, this_nregs
, loc
, insn
, cl
);
594 if ((type
== OP_OUT
) != (action
== terminate_write
|| action
== mark_access
))
597 for (p
= &open_chains
; *p
;)
599 struct du_head
*head
= *p
;
600 struct du_head
*next
= head
->next_chain
;
601 int exact_match
= (head
->regno
== this_regno
602 && head
->nregs
== this_nregs
);
603 int superset
= (this_regno
<= head
->regno
604 && this_regno
+ this_nregs
>= head
->regno
+ head
->nregs
);
605 int subset
= (this_regno
>= head
->regno
606 && this_regno
+ this_nregs
<= head
->regno
+ head
->nregs
);
609 || head
->regno
+ head
->nregs
<= this_regno
610 || this_regno
+ this_nregs
<= head
->regno
)
612 p
= &head
->next_chain
;
616 if (action
== mark_read
|| action
== mark_access
)
618 /* ??? Class NO_REGS can happen if the md file makes use of
619 EXTRA_CONSTRAINTS to match registers. Which is arguably
620 wrong, but there we are. */
622 if (cl
== NO_REGS
|| (!exact_match
&& !DEBUG_INSN_P (insn
)))
626 "Cannot rename chain %s (%d) at insn %d (%s)\n",
627 reg_names
[head
->regno
], head
->id
, INSN_UID (insn
),
628 scan_actions_name
[(int) action
]);
629 head
->cannot_rename
= 1;
632 unsigned nregs
= this_nregs
;
633 head
->regno
= this_regno
;
634 head
->nregs
= this_nregs
;
636 SET_HARD_REG_BIT (live_in_chains
, head
->regno
+ nregs
);
639 "Widening register in chain %s (%d) at insn %d\n",
640 reg_names
[head
->regno
], head
->id
, INSN_UID (insn
));
644 fail_current_block
= true;
647 "Failing basic block due to unhandled overlap\n");
652 struct du_chain
*this_du
;
653 this_du
= XOBNEW (&rename_obstack
, struct du_chain
);
654 this_du
->next_use
= 0;
656 this_du
->insn
= insn
;
658 if (head
->first
== NULL
)
659 head
->first
= this_du
;
661 head
->last
->next_use
= this_du
;
662 head
->last
= this_du
;
665 /* Avoid adding the same location in a DEBUG_INSN multiple times,
666 which could happen with non-exact overlap. */
667 if (DEBUG_INSN_P (insn
))
669 /* Otherwise, find any other chains that do not match exactly;
670 ensure they all get marked unrenamable. */
671 p
= &head
->next_chain
;
675 /* Whether the terminated chain can be used for renaming
676 depends on the action and this being an exact match.
677 In either case, we remove this element from open_chains. */
679 if ((action
== terminate_dead
|| action
== terminate_write
)
684 head
->terminated
= 1;
685 head
->next_chain
= closed_chains
;
686 closed_chains
= head
;
687 bitmap_clear_bit (&open_chains_set
, head
->id
);
691 CLEAR_HARD_REG_BIT (live_in_chains
, head
->regno
+ nregs
);
696 "Closing chain %s (%d) at insn %d (%s)\n",
697 reg_names
[head
->regno
], head
->id
, INSN_UID (insn
),
698 scan_actions_name
[(int) action
]);
700 else if (action
== terminate_dead
|| action
== terminate_write
)
702 /* In this case, tracking liveness gets too hard. Fail the
703 entire basic block. */
706 "Failing basic block due to unhandled overlap\n");
707 fail_current_block
= true;
712 head
->cannot_rename
= 1;
715 "Cannot rename chain %s (%d) at insn %d (%s)\n",
716 reg_names
[head
->regno
], head
->id
, INSN_UID (insn
),
717 scan_actions_name
[(int) action
]);
718 p
= &head
->next_chain
;
723 /* Adapted from find_reloads_address_1. CL is INDEX_REG_CLASS or
724 BASE_REG_CLASS depending on how the register is being considered. */
727 scan_rtx_address (rtx insn
, rtx
*loc
, enum reg_class cl
,
728 enum scan_actions action
, enum machine_mode mode
)
731 RTX_CODE code
= GET_CODE (x
);
735 if (action
== mark_write
|| action
== mark_access
)
742 rtx orig_op0
= XEXP (x
, 0);
743 rtx orig_op1
= XEXP (x
, 1);
744 RTX_CODE code0
= GET_CODE (orig_op0
);
745 RTX_CODE code1
= GET_CODE (orig_op1
);
750 enum rtx_code index_code
= SCRATCH
;
752 if (GET_CODE (op0
) == SUBREG
)
754 op0
= SUBREG_REG (op0
);
755 code0
= GET_CODE (op0
);
758 if (GET_CODE (op1
) == SUBREG
)
760 op1
= SUBREG_REG (op1
);
761 code1
= GET_CODE (op1
);
764 if (code0
== MULT
|| code0
== SIGN_EXTEND
|| code0
== TRUNCATE
765 || code0
== ZERO_EXTEND
|| code1
== MEM
)
769 index_code
= GET_CODE (*locI
);
771 else if (code1
== MULT
|| code1
== SIGN_EXTEND
|| code1
== TRUNCATE
772 || code1
== ZERO_EXTEND
|| code0
== MEM
)
776 index_code
= GET_CODE (*locI
);
778 else if (code0
== CONST_INT
|| code0
== CONST
779 || code0
== SYMBOL_REF
|| code0
== LABEL_REF
)
782 index_code
= GET_CODE (XEXP (x
, 0));
784 else if (code1
== CONST_INT
|| code1
== CONST
785 || code1
== SYMBOL_REF
|| code1
== LABEL_REF
)
788 index_code
= GET_CODE (XEXP (x
, 1));
790 else if (code0
== REG
&& code1
== REG
)
793 unsigned regno0
= REGNO (op0
), regno1
= REGNO (op1
);
795 if (REGNO_OK_FOR_INDEX_P (regno1
)
796 && regno_ok_for_base_p (regno0
, mode
, PLUS
, REG
))
798 else if (REGNO_OK_FOR_INDEX_P (regno0
)
799 && regno_ok_for_base_p (regno1
, mode
, PLUS
, REG
))
801 else if (regno_ok_for_base_p (regno0
, mode
, PLUS
, REG
)
802 || REGNO_OK_FOR_INDEX_P (regno1
))
804 else if (regno_ok_for_base_p (regno1
, mode
, PLUS
, REG
))
809 locI
= &XEXP (x
, index_op
);
810 locB
= &XEXP (x
, !index_op
);
811 index_code
= GET_CODE (*locI
);
813 else if (code0
== REG
)
817 index_code
= GET_CODE (*locI
);
819 else if (code1
== REG
)
823 index_code
= GET_CODE (*locI
);
827 scan_rtx_address (insn
, locI
, INDEX_REG_CLASS
, action
, mode
);
829 scan_rtx_address (insn
, locB
, base_reg_class (mode
, PLUS
, index_code
),
842 /* If the target doesn't claim to handle autoinc, this must be
843 something special, like a stack push. Kill this chain. */
844 action
= mark_all_read
;
849 scan_rtx_address (insn
, &XEXP (x
, 0),
850 base_reg_class (GET_MODE (x
), MEM
, SCRATCH
), action
,
855 scan_rtx_reg (insn
, loc
, cl
, action
, OP_IN
);
862 fmt
= GET_RTX_FORMAT (code
);
863 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
866 scan_rtx_address (insn
, &XEXP (x
, i
), cl
, action
, mode
);
867 else if (fmt
[i
] == 'E')
868 for (j
= XVECLEN (x
, i
) - 1; j
>= 0; j
--)
869 scan_rtx_address (insn
, &XVECEXP (x
, i
, j
), cl
, action
, mode
);
874 scan_rtx (rtx insn
, rtx
*loc
, enum reg_class cl
, enum scan_actions action
,
879 enum rtx_code code
= GET_CODE (x
);
897 scan_rtx_reg (insn
, loc
, cl
, action
, type
);
901 scan_rtx_address (insn
, &XEXP (x
, 0),
902 base_reg_class (GET_MODE (x
), MEM
, SCRATCH
), action
,
907 scan_rtx (insn
, &SET_SRC (x
), cl
, action
, OP_IN
);
908 scan_rtx (insn
, &SET_DEST (x
), cl
, action
,
909 (GET_CODE (PATTERN (insn
)) == COND_EXEC
910 && verify_reg_tracked (SET_DEST (x
))) ? OP_INOUT
: OP_OUT
);
913 case STRICT_LOW_PART
:
914 scan_rtx (insn
, &XEXP (x
, 0), cl
, action
,
915 verify_reg_tracked (XEXP (x
, 0)) ? OP_INOUT
: OP_OUT
);
920 scan_rtx (insn
, &XEXP (x
, 0), cl
, action
,
921 (type
== OP_IN
? OP_IN
:
922 verify_reg_tracked (XEXP (x
, 0)) ? OP_INOUT
: OP_OUT
));
923 scan_rtx (insn
, &XEXP (x
, 1), cl
, action
, OP_IN
);
924 scan_rtx (insn
, &XEXP (x
, 2), cl
, action
, OP_IN
);
933 /* Should only happen inside MEM. */
937 scan_rtx (insn
, &SET_DEST (x
), cl
, action
,
938 (GET_CODE (PATTERN (insn
)) == COND_EXEC
939 && verify_reg_tracked (SET_DEST (x
))) ? OP_INOUT
: OP_OUT
);
943 scan_rtx (insn
, &XEXP (x
, 0), cl
, action
, type
);
945 scan_rtx (insn
, &XEXP (x
, 1), cl
, action
, type
);
952 fmt
= GET_RTX_FORMAT (code
);
953 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
956 scan_rtx (insn
, &XEXP (x
, i
), cl
, action
, type
);
957 else if (fmt
[i
] == 'E')
958 for (j
= XVECLEN (x
, i
) - 1; j
>= 0; j
--)
959 scan_rtx (insn
, &XVECEXP (x
, i
, j
), cl
, action
, type
);
963 /* Hide operands of the current insn (of which there are N_OPS) by
964 substituting cc0 for them.
965 Previous values are stored in the OLD_OPERANDS and OLD_DUPS.
966 For every bit set in DO_NOT_HIDE, we leave the operand alone.
967 If INOUT_AND_EC_ONLY is set, we only do this for OP_INOUT type operands
968 and earlyclobbers. */
971 hide_operands (int n_ops
, rtx
*old_operands
, rtx
*old_dups
,
972 unsigned HOST_WIDE_INT do_not_hide
, bool inout_and_ec_only
)
975 int alt
= which_alternative
;
976 for (i
= 0; i
< n_ops
; i
++)
978 old_operands
[i
] = recog_data
.operand
[i
];
979 /* Don't squash match_operator or match_parallel here, since
980 we don't know that all of the contained registers are
981 reachable by proper operands. */
982 if (recog_data
.constraints
[i
][0] == '\0')
984 if (do_not_hide
& (1 << i
))
986 if (!inout_and_ec_only
|| recog_data
.operand_type
[i
] == OP_INOUT
987 || recog_op_alt
[i
][alt
].earlyclobber
)
988 *recog_data
.operand_loc
[i
] = cc0_rtx
;
990 for (i
= 0; i
< recog_data
.n_dups
; i
++)
992 int opn
= recog_data
.dup_num
[i
];
993 old_dups
[i
] = *recog_data
.dup_loc
[i
];
994 if (do_not_hide
& (1 << opn
))
996 if (!inout_and_ec_only
|| recog_data
.operand_type
[opn
] == OP_INOUT
997 || recog_op_alt
[opn
][alt
].earlyclobber
)
998 *recog_data
.dup_loc
[i
] = cc0_rtx
;
1002 /* Undo the substitution performed by hide_operands. INSN is the insn we
1003 are processing; the arguments are the same as in hide_operands. */
1006 restore_operands (rtx insn
, int n_ops
, rtx
*old_operands
, rtx
*old_dups
)
1009 for (i
= 0; i
< recog_data
.n_dups
; i
++)
1010 *recog_data
.dup_loc
[i
] = old_dups
[i
];
1011 for (i
= 0; i
< n_ops
; i
++)
1012 *recog_data
.operand_loc
[i
] = old_operands
[i
];
1013 if (recog_data
.n_dups
)
1014 df_insn_rescan (insn
);
1017 /* For each output operand of INSN, call scan_rtx to create a new
1018 open chain. Do this only for normal or earlyclobber outputs,
1019 depending on EARLYCLOBBER. */
1022 record_out_operands (rtx insn
, bool earlyclobber
)
1024 int n_ops
= recog_data
.n_operands
;
1025 int alt
= which_alternative
;
1029 for (i
= 0; i
< n_ops
+ recog_data
.n_dups
; i
++)
1031 int opn
= i
< n_ops
? i
: recog_data
.dup_num
[i
- n_ops
];
1032 rtx
*loc
= (i
< n_ops
1033 ? recog_data
.operand_loc
[opn
]
1034 : recog_data
.dup_loc
[i
- n_ops
]);
1036 enum reg_class cl
= recog_op_alt
[opn
][alt
].cl
;
1038 struct du_head
*prev_open
;
1040 if (recog_data
.operand_type
[opn
] != OP_OUT
1041 || recog_op_alt
[opn
][alt
].earlyclobber
!= earlyclobber
)
1044 prev_open
= open_chains
;
1045 scan_rtx (insn
, loc
, cl
, mark_write
, OP_OUT
);
1047 /* ??? Many targets have output constraints on the SET_DEST
1048 of a call insn, which is stupid, since these are certainly
1049 ABI defined hard registers. For these, and for asm operands
1050 that originally referenced hard registers, we must record that
1051 the chain cannot be renamed. */
1053 || (asm_noperands (PATTERN (insn
)) > 0
1055 && REGNO (op
) == ORIGINAL_REGNO (op
)))
1057 if (prev_open
!= open_chains
)
1058 open_chains
->cannot_rename
= 1;
1063 /* Build def/use chain. */
1065 static struct du_head
*
1066 build_def_use (basic_block bb
)
1070 unsigned HOST_WIDE_INT untracked_operands
;
1072 open_chains
= closed_chains
= NULL
;
1074 fail_current_block
= false;
1077 bitmap_initialize (&open_chains_set
, &bitmap_default_obstack
);
1078 CLEAR_HARD_REG_SET (live_in_chains
);
1079 REG_SET_TO_HARD_REG_SET (live_hard_regs
, df_get_live_in (bb
));
1080 for (def_rec
= df_get_artificial_defs (bb
->index
); *def_rec
; def_rec
++)
1082 df_ref def
= *def_rec
;
1083 if (DF_REF_FLAGS (def
) & DF_REF_AT_TOP
)
1084 SET_HARD_REG_BIT (live_hard_regs
, DF_REF_REGNO (def
));
1087 for (insn
= BB_HEAD (bb
); ; insn
= NEXT_INSN (insn
))
1089 if (NONDEBUG_INSN_P (insn
))
1093 rtx old_operands
[MAX_RECOG_OPERANDS
];
1094 rtx old_dups
[MAX_DUP_OPERANDS
];
1098 enum rtx_code set_code
= SET
;
1099 enum rtx_code clobber_code
= CLOBBER
;
1101 /* Process the insn, determining its effect on the def-use
1102 chains and live hard registers. We perform the following
1103 steps with the register references in the insn, simulating
1105 (1) Deal with earlyclobber operands and CLOBBERs of non-operands
1106 by creating chains and marking hard regs live.
1107 (2) Any read outside an operand causes any chain it overlaps
1108 with to be marked unrenamable.
1109 (3) Any read inside an operand is added if there's already
1110 an open chain for it.
1111 (4) For any REG_DEAD note we find, close open chains that
1113 (5) For any non-earlyclobber write we find, close open chains
1115 (6) For any non-earlyclobber write we find in an operand, make
1116 a new chain or mark the hard register as live.
1117 (7) For any REG_UNUSED, close any chains we just opened.
1119 We cannot deal with situations where we track a reg in one mode
1120 and see a reference in another mode; these will cause the chain
1121 to be marked unrenamable or even cause us to abort the entire
1124 extract_insn (insn
);
1125 if (! constrain_operands (1))
1126 fatal_insn_not_found (insn
);
1127 preprocess_constraints ();
1128 alt
= which_alternative
;
1129 n_ops
= recog_data
.n_operands
;
1130 untracked_operands
= 0;
1132 /* Simplify the code below by rewriting things to reflect
1133 matching constraints. Also promote OP_OUT to OP_INOUT in
1134 predicated instructions, but only for register operands
1135 that are already tracked, so that we can create a chain
1136 when the first SET makes a register live. */
1138 predicated
= GET_CODE (PATTERN (insn
)) == COND_EXEC
;
1139 for (i
= 0; i
< n_ops
; ++i
)
1141 rtx op
= recog_data
.operand
[i
];
1142 int matches
= recog_op_alt
[i
][alt
].matches
;
1144 recog_op_alt
[i
][alt
].cl
= recog_op_alt
[matches
][alt
].cl
;
1145 if (matches
>= 0 || recog_op_alt
[i
][alt
].matched
>= 0
1146 || (predicated
&& recog_data
.operand_type
[i
] == OP_OUT
))
1148 recog_data
.operand_type
[i
] = OP_INOUT
;
1149 /* A special case to deal with instruction patterns that
1150 have matching operands with different modes. If we're
1151 not already tracking such a reg, we won't start here,
1152 and we must instead make sure to make the operand visible
1153 to the machinery that tracks hard registers. */
1155 && (GET_MODE_SIZE (recog_data
.operand_mode
[i
])
1156 != GET_MODE_SIZE (recog_data
.operand_mode
[matches
]))
1157 && !verify_reg_in_set (op
, &live_in_chains
))
1159 untracked_operands
|= 1 << i
;
1160 untracked_operands
|= 1 << matches
;
1163 /* If there's an in-out operand with a register that is not
1164 being tracked at all yet, open a chain. */
1165 if (recog_data
.operand_type
[i
] == OP_INOUT
1166 && !(untracked_operands
& (1 << i
))
1168 && !verify_reg_tracked (op
))
1170 enum machine_mode mode
= GET_MODE (op
);
1171 unsigned this_regno
= REGNO (op
);
1172 unsigned this_nregs
= hard_regno_nregs
[this_regno
][mode
];
1173 create_new_chain (this_regno
, this_nregs
, NULL
, NULL_RTX
,
1178 if (fail_current_block
)
1181 /* Step 1a: Mark hard registers that are clobbered in this insn,
1182 outside an operand, as live. */
1183 hide_operands (n_ops
, old_operands
, old_dups
, untracked_operands
,
1185 note_stores (PATTERN (insn
), note_sets_clobbers
, &clobber_code
);
1186 restore_operands (insn
, n_ops
, old_operands
, old_dups
);
1188 /* Step 1b: Begin new chains for earlyclobbered writes inside
1190 record_out_operands (insn
, true);
1192 /* Step 2: Mark chains for which we have reads outside operands
1194 We do this by munging all operands into CC0, and closing
1195 everything remaining. */
1197 hide_operands (n_ops
, old_operands
, old_dups
, untracked_operands
,
1199 scan_rtx (insn
, &PATTERN (insn
), NO_REGS
, mark_all_read
, OP_IN
);
1200 restore_operands (insn
, n_ops
, old_operands
, old_dups
);
1202 /* Step 2B: Can't rename function call argument registers. */
1203 if (CALL_P (insn
) && CALL_INSN_FUNCTION_USAGE (insn
))
1204 scan_rtx (insn
, &CALL_INSN_FUNCTION_USAGE (insn
),
1205 NO_REGS
, mark_all_read
, OP_IN
);
1207 /* Step 2C: Can't rename asm operands that were originally
1209 if (asm_noperands (PATTERN (insn
)) > 0)
1210 for (i
= 0; i
< n_ops
; i
++)
1212 rtx
*loc
= recog_data
.operand_loc
[i
];
1216 && REGNO (op
) == ORIGINAL_REGNO (op
)
1217 && (recog_data
.operand_type
[i
] == OP_IN
1218 || recog_data
.operand_type
[i
] == OP_INOUT
))
1219 scan_rtx (insn
, loc
, NO_REGS
, mark_all_read
, OP_IN
);
1222 /* Step 3: Append to chains for reads inside operands. */
1223 for (i
= 0; i
< n_ops
+ recog_data
.n_dups
; i
++)
1225 int opn
= i
< n_ops
? i
: recog_data
.dup_num
[i
- n_ops
];
1226 rtx
*loc
= (i
< n_ops
1227 ? recog_data
.operand_loc
[opn
]
1228 : recog_data
.dup_loc
[i
- n_ops
]);
1229 enum reg_class cl
= recog_op_alt
[opn
][alt
].cl
;
1230 enum op_type type
= recog_data
.operand_type
[opn
];
1232 /* Don't scan match_operand here, since we've no reg class
1233 information to pass down. Any operands that we could
1234 substitute in will be represented elsewhere. */
1235 if (recog_data
.constraints
[opn
][0] == '\0'
1236 || untracked_operands
& (1 << opn
))
1239 if (recog_op_alt
[opn
][alt
].is_address
)
1240 scan_rtx_address (insn
, loc
, cl
, mark_read
, VOIDmode
);
1242 scan_rtx (insn
, loc
, cl
, mark_read
, type
);
1245 /* Step 3B: Record updates for regs in REG_INC notes, and
1246 source regs in REG_FRAME_RELATED_EXPR notes. */
1247 for (note
= REG_NOTES (insn
); note
; note
= XEXP (note
, 1))
1248 if (REG_NOTE_KIND (note
) == REG_INC
1249 || REG_NOTE_KIND (note
) == REG_FRAME_RELATED_EXPR
)
1250 scan_rtx (insn
, &XEXP (note
, 0), ALL_REGS
, mark_read
,
1253 /* Step 4: Close chains for registers that die here. */
1254 for (note
= REG_NOTES (insn
); note
; note
= XEXP (note
, 1))
1255 if (REG_NOTE_KIND (note
) == REG_DEAD
)
1257 remove_from_hard_reg_set (&live_hard_regs
,
1258 GET_MODE (XEXP (note
, 0)),
1259 REGNO (XEXP (note
, 0)));
1260 scan_rtx (insn
, &XEXP (note
, 0), NO_REGS
, terminate_dead
,
1264 /* Step 4B: If this is a call, any chain live at this point
1265 requires a caller-saved reg. */
1269 for (p
= open_chains
; p
; p
= p
->next_chain
)
1270 p
->need_caller_save_reg
= 1;
1273 /* Step 5: Close open chains that overlap writes. Similar to
1274 step 2, we hide in-out operands, since we do not want to
1275 close these chains. We also hide earlyclobber operands,
1276 since we've opened chains for them in step 1, and earlier
1277 chains they would overlap with must have been closed at
1278 the previous insn at the latest, as such operands cannot
1279 possibly overlap with any input operands. */
1281 hide_operands (n_ops
, old_operands
, old_dups
, untracked_operands
,
1283 scan_rtx (insn
, &PATTERN (insn
), NO_REGS
, terminate_write
, OP_IN
);
1284 restore_operands (insn
, n_ops
, old_operands
, old_dups
);
1286 /* Step 6a: Mark hard registers that are set in this insn,
1287 outside an operand, as live. */
1288 hide_operands (n_ops
, old_operands
, old_dups
, untracked_operands
,
1290 note_stores (PATTERN (insn
), note_sets_clobbers
, &set_code
);
1291 restore_operands (insn
, n_ops
, old_operands
, old_dups
);
1293 /* Step 6b: Begin new chains for writes inside operands. */
1294 record_out_operands (insn
, false);
1296 /* Step 6c: Record destination regs in REG_FRAME_RELATED_EXPR
1297 notes for update. */
1298 for (note
= REG_NOTES (insn
); note
; note
= XEXP (note
, 1))
1299 if (REG_NOTE_KIND (note
) == REG_FRAME_RELATED_EXPR
)
1300 scan_rtx (insn
, &XEXP (note
, 0), ALL_REGS
, mark_access
,
1303 /* Step 7: Close chains for registers that were never
1304 really used here. */
1305 for (note
= REG_NOTES (insn
); note
; note
= XEXP (note
, 1))
1306 if (REG_NOTE_KIND (note
) == REG_UNUSED
)
1308 remove_from_hard_reg_set (&live_hard_regs
,
1309 GET_MODE (XEXP (note
, 0)),
1310 REGNO (XEXP (note
, 0)));
1311 scan_rtx (insn
, &XEXP (note
, 0), NO_REGS
, terminate_dead
,
1315 else if (DEBUG_INSN_P (insn
)
1316 && !VAR_LOC_UNKNOWN_P (INSN_VAR_LOCATION_LOC (insn
)))
1318 scan_rtx (insn
, &INSN_VAR_LOCATION_LOC (insn
),
1319 ALL_REGS
, mark_read
, OP_IN
);
1321 if (insn
== BB_END (bb
))
1325 bitmap_clear (&open_chains_set
);
1327 if (fail_current_block
)
1330 /* Since we close every chain when we find a REG_DEAD note, anything that
1331 is still open lives past the basic block, so it can't be renamed. */
1332 return closed_chains
;
1335 /* Dump all def/use chains in CHAINS to DUMP_FILE. They are
1336 printed in reverse order as that's how we build them. */
1339 dump_def_use_chain (struct du_head
*head
)
1343 struct du_chain
*this_du
= head
->first
;
1344 fprintf (dump_file
, "Register %s (%d):",
1345 reg_names
[head
->regno
], head
->nregs
);
1348 fprintf (dump_file
, " %d [%s]", INSN_UID (this_du
->insn
),
1349 reg_class_names
[this_du
->cl
]);
1350 this_du
= this_du
->next_use
;
1352 fprintf (dump_file
, "\n");
1353 head
= head
->next_chain
;
1359 gate_handle_regrename (void)
1361 return (optimize
> 0 && (flag_rename_registers
));
1364 struct rtl_opt_pass pass_regrename
=
1369 gate_handle_regrename
, /* gate */
1370 regrename_optimize
, /* execute */
1373 0, /* static_pass_number */
1374 TV_RENAME_REGISTERS
, /* tv_id */
1375 0, /* properties_required */
1376 0, /* properties_provided */
1377 0, /* properties_destroyed */
1378 0, /* todo_flags_start */
1379 TODO_df_finish
| TODO_verify_rtl_sharing
|
1380 TODO_dump_func
/* todo_flags_finish */