1 /* Register renaming for the GNU compiler.
2 Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
3 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"
27 #include "insn-config.h"
29 #include "addresses.h"
30 #include "hard-reg-set.h"
31 #include "basic-block.h"
40 #include "tree-pass.h"
45 struct du_chain
*next_chain
;
46 struct du_chain
*next_use
;
50 ENUM_BITFIELD(reg_class
) cl
: 16;
51 unsigned int need_caller_save_reg
:1;
52 unsigned int earlyclobber
:1;
58 terminate_overlapping_read
,
63 /* mark_access is for marking the destination regs in
64 REG_FRAME_RELATED_EXPR notes (as if they were read) so that the
65 note is updated properly. */
69 static const char * const scan_actions_name
[] =
72 "terminate_overlapping_read",
80 static struct obstack rename_obstack
;
82 static void do_replace (struct du_chain
*, int);
83 static void scan_rtx_reg (rtx
, rtx
*, enum reg_class
,
84 enum scan_actions
, enum op_type
, int);
85 static void scan_rtx_address (rtx
, rtx
*, enum reg_class
,
86 enum scan_actions
, enum machine_mode
);
87 static void scan_rtx (rtx
, rtx
*, enum reg_class
, enum scan_actions
,
89 static struct du_chain
*build_def_use (basic_block
);
90 static void dump_def_use_chain (struct du_chain
*);
91 static void note_sets (rtx
, const_rtx
, void *);
92 static void clear_dead_regs (HARD_REG_SET
*, enum reg_note
, rtx
);
93 static void merge_overlapping_regs (basic_block
, HARD_REG_SET
*,
96 /* Called through note_stores. Find sets of registers, and
97 record them in *DATA (which is actually a HARD_REG_SET *). */
100 note_sets (rtx x
, const_rtx set ATTRIBUTE_UNUSED
, void *data
)
102 HARD_REG_SET
*pset
= (HARD_REG_SET
*) data
;
104 if (GET_CODE (x
) == SUBREG
)
108 /* There must not be pseudos at this point. */
109 gcc_assert (HARD_REGISTER_P (x
));
110 add_to_hard_reg_set (pset
, GET_MODE (x
), REGNO (x
));
113 /* Clear all registers from *PSET for which a note of kind KIND can be found
114 in the list NOTES. */
117 clear_dead_regs (HARD_REG_SET
*pset
, enum reg_note kind
, rtx notes
)
120 for (note
= notes
; note
; note
= XEXP (note
, 1))
121 if (REG_NOTE_KIND (note
) == kind
&& REG_P (XEXP (note
, 0)))
123 rtx reg
= XEXP (note
, 0);
124 /* There must not be pseudos at this point. */
125 gcc_assert (HARD_REGISTER_P (reg
));
126 remove_from_hard_reg_set (pset
, GET_MODE (reg
), REGNO (reg
));
130 /* For a def-use chain CHAIN in basic block B, find which registers overlap
131 its lifetime and set the corresponding bits in *PSET. */
134 merge_overlapping_regs (basic_block b
, HARD_REG_SET
*pset
,
135 struct du_chain
*chain
)
137 struct du_chain
*t
= chain
;
142 REG_SET_TO_HARD_REG_SET (live
, df_get_live_in (b
));
143 for (def_rec
= df_get_artificial_defs (b
->index
); *def_rec
; def_rec
++)
145 df_ref def
= *def_rec
;
146 if (DF_REF_FLAGS (def
) & DF_REF_AT_TOP
)
147 SET_HARD_REG_BIT (live
, DF_REF_REGNO (def
));
152 /* Search forward until the next reference to the register to be
154 while (insn
!= t
->insn
)
158 clear_dead_regs (&live
, REG_DEAD
, REG_NOTES (insn
));
159 note_stores (PATTERN (insn
), note_sets
, (void *) &live
);
160 /* Only record currently live regs if we are inside the
163 IOR_HARD_REG_SET (*pset
, live
);
164 clear_dead_regs (&live
, REG_UNUSED
, REG_NOTES (insn
));
166 insn
= NEXT_INSN (insn
);
169 IOR_HARD_REG_SET (*pset
, live
);
171 /* For the last reference, also merge in all registers set in the
173 @@@ We only have take earlyclobbered sets into account. */
175 note_stores (PATTERN (insn
), note_sets
, (void *) pset
);
181 /* Perform register renaming on the current function. */
184 regrename_optimize (void)
186 int tick
[FIRST_PSEUDO_REGISTER
];
191 df_set_flags (DF_LR_RUN_DCE
);
192 df_note_add_problem ();
194 df_set_flags (DF_DEFER_INSN_RESCAN
);
196 memset (tick
, 0, sizeof tick
);
198 gcc_obstack_init (&rename_obstack
);
199 first_obj
= XOBNEWVAR (&rename_obstack
, char, 0);
203 struct du_chain
*all_chains
= 0;
204 HARD_REG_SET unavailable
;
205 HARD_REG_SET regs_seen
;
207 CLEAR_HARD_REG_SET (unavailable
);
210 fprintf (dump_file
, "\nBasic block %d:\n", bb
->index
);
212 all_chains
= build_def_use (bb
);
215 dump_def_use_chain (all_chains
);
217 CLEAR_HARD_REG_SET (unavailable
);
218 /* Don't clobber traceback for noreturn functions. */
219 if (frame_pointer_needed
)
221 add_to_hard_reg_set (&unavailable
, Pmode
, FRAME_POINTER_REGNUM
);
222 #if FRAME_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM
223 add_to_hard_reg_set (&unavailable
, Pmode
, HARD_FRAME_POINTER_REGNUM
);
227 CLEAR_HARD_REG_SET (regs_seen
);
230 int new_reg
, best_new_reg
;
232 struct du_chain
*this_du
= all_chains
;
233 struct du_chain
*tmp
, *last
;
234 HARD_REG_SET this_unavailable
;
235 int reg
= REGNO (*this_du
->loc
);
238 all_chains
= this_du
->next_chain
;
242 #if 0 /* This just disables optimization opportunities. */
243 /* Only rename once we've seen the reg more than once. */
244 if (! TEST_HARD_REG_BIT (regs_seen
, reg
))
246 SET_HARD_REG_BIT (regs_seen
, reg
);
251 if (fixed_regs
[reg
] || global_regs
[reg
]
252 #if FRAME_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM
253 || (frame_pointer_needed
&& reg
== HARD_FRAME_POINTER_REGNUM
)
255 || (frame_pointer_needed
&& reg
== FRAME_POINTER_REGNUM
)
260 COPY_HARD_REG_SET (this_unavailable
, unavailable
);
262 /* Find last entry on chain (which has the need_caller_save bit),
263 count number of uses, and narrow the set of registers we can
266 for (last
= this_du
; last
->next_use
; last
= last
->next_use
)
269 IOR_COMPL_HARD_REG_SET (this_unavailable
,
270 reg_class_contents
[last
->cl
]);
275 IOR_COMPL_HARD_REG_SET (this_unavailable
,
276 reg_class_contents
[last
->cl
]);
278 if (this_du
->need_caller_save_reg
)
279 IOR_HARD_REG_SET (this_unavailable
, call_used_reg_set
);
281 merge_overlapping_regs (bb
, &this_unavailable
, this_du
);
283 /* Now potential_regs is a reasonable approximation, let's
284 have a closer look at each register still in there. */
285 for (new_reg
= 0; new_reg
< FIRST_PSEUDO_REGISTER
; new_reg
++)
287 int nregs
= hard_regno_nregs
[new_reg
][GET_MODE (*this_du
->loc
)];
289 for (i
= nregs
- 1; i
>= 0; --i
)
290 if (TEST_HARD_REG_BIT (this_unavailable
, new_reg
+ i
)
291 || fixed_regs
[new_reg
+ i
]
292 || global_regs
[new_reg
+ i
]
293 /* Can't use regs which aren't saved by the prologue. */
294 || (! df_regs_ever_live_p (new_reg
+ i
)
295 && ! call_used_regs
[new_reg
+ i
])
296 #ifdef LEAF_REGISTERS
297 /* We can't use a non-leaf register if we're in a
299 || (current_function_is_leaf
300 && !LEAF_REGISTERS
[new_reg
+ i
])
302 #ifdef HARD_REGNO_RENAME_OK
303 || ! HARD_REGNO_RENAME_OK (reg
+ i
, new_reg
+ i
)
310 /* See whether it accepts all modes that occur in
311 definition and uses. */
312 for (tmp
= this_du
; tmp
; tmp
= tmp
->next_use
)
313 if (! HARD_REGNO_MODE_OK (new_reg
, GET_MODE (*tmp
->loc
))
314 || (tmp
->need_caller_save_reg
315 && ! (HARD_REGNO_CALL_PART_CLOBBERED
316 (reg
, GET_MODE (*tmp
->loc
)))
317 && (HARD_REGNO_CALL_PART_CLOBBERED
318 (new_reg
, GET_MODE (*tmp
->loc
)))))
322 if (tick
[best_new_reg
] > tick
[new_reg
])
323 best_new_reg
= new_reg
;
329 fprintf (dump_file
, "Register %s in insn %d",
330 reg_names
[reg
], INSN_UID (last
->insn
));
331 if (last
->need_caller_save_reg
)
332 fprintf (dump_file
, " crosses a call");
335 if (best_new_reg
== reg
)
337 tick
[reg
] = ++this_tick
;
339 fprintf (dump_file
, "; no available better choice\n");
344 fprintf (dump_file
, ", renamed as %s\n", reg_names
[best_new_reg
]);
346 do_replace (this_du
, best_new_reg
);
347 tick
[best_new_reg
] = ++this_tick
;
348 df_set_regs_ever_live (best_new_reg
, true);
351 obstack_free (&rename_obstack
, first_obj
);
354 obstack_free (&rename_obstack
, NULL
);
357 fputc ('\n', dump_file
);
363 do_replace (struct du_chain
*chain
, int reg
)
367 unsigned int regno
= ORIGINAL_REGNO (*chain
->loc
);
368 struct reg_attrs
* attr
= REG_ATTRS (*chain
->loc
);
369 int reg_ptr
= REG_POINTER (*chain
->loc
);
371 *chain
->loc
= gen_raw_REG (GET_MODE (*chain
->loc
), reg
);
372 if (regno
>= FIRST_PSEUDO_REGISTER
)
373 ORIGINAL_REGNO (*chain
->loc
) = regno
;
374 REG_ATTRS (*chain
->loc
) = attr
;
375 REG_POINTER (*chain
->loc
) = reg_ptr
;
376 df_insn_rescan (chain
->insn
);
377 chain
= chain
->next_use
;
382 static struct du_chain
*open_chains
;
383 static struct du_chain
*closed_chains
;
386 scan_rtx_reg (rtx insn
, rtx
*loc
, enum reg_class cl
,
387 enum scan_actions action
, enum op_type type
, int earlyclobber
)
391 enum machine_mode mode
= GET_MODE (x
);
392 int this_regno
= REGNO (x
);
393 int this_nregs
= hard_regno_nregs
[this_regno
][mode
];
395 if (action
== mark_write
)
399 struct du_chain
*this_du
= XOBNEW (&rename_obstack
, struct du_chain
);
400 this_du
->next_use
= 0;
401 this_du
->next_chain
= open_chains
;
403 this_du
->insn
= insn
;
405 this_du
->need_caller_save_reg
= 0;
406 this_du
->earlyclobber
= earlyclobber
;
407 open_chains
= this_du
;
412 if ((type
== OP_OUT
) != (action
== terminate_write
|| action
== mark_access
))
415 for (p
= &open_chains
; *p
;)
417 struct du_chain
*this_du
= *p
;
419 /* Check if the chain has been terminated if it has then skip to
422 This can happen when we've already appended the location to
423 the chain in Step 3, but are trying to hide in-out operands
424 from terminate_write in Step 5. */
426 if (*this_du
->loc
== cc0_rtx
)
427 p
= &this_du
->next_chain
;
430 int regno
= REGNO (*this_du
->loc
);
431 int nregs
= hard_regno_nregs
[regno
][GET_MODE (*this_du
->loc
)];
432 int exact_match
= (regno
== this_regno
&& nregs
== this_nregs
);
434 if (regno
+ nregs
<= this_regno
435 || this_regno
+ this_nregs
<= regno
)
437 p
= &this_du
->next_chain
;
441 if (action
== mark_read
|| action
== mark_access
)
443 gcc_assert (exact_match
);
445 /* ??? Class NO_REGS can happen if the md file makes use of
446 EXTRA_CONSTRAINTS to match registers. Which is arguably
447 wrong, but there we are. Since we know not what this may
448 be replaced with, terminate the chain. */
451 this_du
= XOBNEW (&rename_obstack
, struct du_chain
);
452 this_du
->next_use
= 0;
453 this_du
->next_chain
= (*p
)->next_chain
;
455 this_du
->insn
= insn
;
457 this_du
->need_caller_save_reg
= 0;
465 if (action
!= terminate_overlapping_read
|| ! exact_match
)
467 struct du_chain
*next
= this_du
->next_chain
;
469 /* Whether the terminated chain can be used for renaming
470 depends on the action and this being an exact match.
471 In either case, we remove this element from open_chains. */
473 if ((action
== terminate_dead
|| action
== terminate_write
)
476 this_du
->next_chain
= closed_chains
;
477 closed_chains
= this_du
;
480 "Closing chain %s at insn %d (%s)\n",
481 reg_names
[REGNO (*this_du
->loc
)], INSN_UID (insn
),
482 scan_actions_name
[(int) action
]);
488 "Discarding chain %s at insn %d (%s)\n",
489 reg_names
[REGNO (*this_du
->loc
)], INSN_UID (insn
),
490 scan_actions_name
[(int) action
]);
495 p
= &this_du
->next_chain
;
500 /* Adapted from find_reloads_address_1. CL is INDEX_REG_CLASS or
501 BASE_REG_CLASS depending on how the register is being considered. */
504 scan_rtx_address (rtx insn
, rtx
*loc
, enum reg_class cl
,
505 enum scan_actions action
, enum machine_mode mode
)
508 RTX_CODE code
= GET_CODE (x
);
512 if (action
== mark_write
|| action
== mark_access
)
519 rtx orig_op0
= XEXP (x
, 0);
520 rtx orig_op1
= XEXP (x
, 1);
521 RTX_CODE code0
= GET_CODE (orig_op0
);
522 RTX_CODE code1
= GET_CODE (orig_op1
);
527 enum rtx_code index_code
= SCRATCH
;
529 if (GET_CODE (op0
) == SUBREG
)
531 op0
= SUBREG_REG (op0
);
532 code0
= GET_CODE (op0
);
535 if (GET_CODE (op1
) == SUBREG
)
537 op1
= SUBREG_REG (op1
);
538 code1
= GET_CODE (op1
);
541 if (code0
== MULT
|| code0
== SIGN_EXTEND
|| code0
== TRUNCATE
542 || code0
== ZERO_EXTEND
|| code1
== MEM
)
546 index_code
= GET_CODE (*locI
);
548 else if (code1
== MULT
|| code1
== SIGN_EXTEND
|| code1
== TRUNCATE
549 || code1
== ZERO_EXTEND
|| code0
== MEM
)
553 index_code
= GET_CODE (*locI
);
555 else if (code0
== CONST_INT
|| code0
== CONST
556 || code0
== SYMBOL_REF
|| code0
== LABEL_REF
)
559 index_code
= GET_CODE (XEXP (x
, 0));
561 else if (code1
== CONST_INT
|| code1
== CONST
562 || code1
== SYMBOL_REF
|| code1
== LABEL_REF
)
565 index_code
= GET_CODE (XEXP (x
, 1));
567 else if (code0
== REG
&& code1
== REG
)
570 unsigned regno0
= REGNO (op0
), regno1
= REGNO (op1
);
572 if (REGNO_OK_FOR_INDEX_P (regno1
)
573 && regno_ok_for_base_p (regno0
, mode
, PLUS
, REG
))
575 else if (REGNO_OK_FOR_INDEX_P (regno0
)
576 && regno_ok_for_base_p (regno1
, mode
, PLUS
, REG
))
578 else if (regno_ok_for_base_p (regno0
, mode
, PLUS
, REG
)
579 || REGNO_OK_FOR_INDEX_P (regno1
))
581 else if (regno_ok_for_base_p (regno1
, mode
, PLUS
, REG
))
586 locI
= &XEXP (x
, index_op
);
587 locB
= &XEXP (x
, !index_op
);
588 index_code
= GET_CODE (*locI
);
590 else if (code0
== REG
)
594 index_code
= GET_CODE (*locI
);
596 else if (code1
== REG
)
600 index_code
= GET_CODE (*locI
);
604 scan_rtx_address (insn
, locI
, INDEX_REG_CLASS
, action
, mode
);
606 scan_rtx_address (insn
, locB
, base_reg_class (mode
, PLUS
, index_code
),
619 /* If the target doesn't claim to handle autoinc, this must be
620 something special, like a stack push. Kill this chain. */
621 action
= terminate_all_read
;
626 scan_rtx_address (insn
, &XEXP (x
, 0),
627 base_reg_class (GET_MODE (x
), MEM
, SCRATCH
), action
,
632 scan_rtx_reg (insn
, loc
, cl
, action
, OP_IN
, 0);
639 fmt
= GET_RTX_FORMAT (code
);
640 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
643 scan_rtx_address (insn
, &XEXP (x
, i
), cl
, action
, mode
);
644 else if (fmt
[i
] == 'E')
645 for (j
= XVECLEN (x
, i
) - 1; j
>= 0; j
--)
646 scan_rtx_address (insn
, &XVECEXP (x
, i
, j
), cl
, action
, mode
);
651 scan_rtx (rtx insn
, rtx
*loc
, enum reg_class cl
,
652 enum scan_actions action
, enum op_type type
, int earlyclobber
)
656 enum rtx_code code
= GET_CODE (x
);
674 scan_rtx_reg (insn
, loc
, cl
, action
, type
, earlyclobber
);
678 scan_rtx_address (insn
, &XEXP (x
, 0),
679 base_reg_class (GET_MODE (x
), MEM
, SCRATCH
), action
,
684 scan_rtx (insn
, &SET_SRC (x
), cl
, action
, OP_IN
, 0);
685 scan_rtx (insn
, &SET_DEST (x
), cl
, action
,
686 GET_CODE (PATTERN (insn
)) == COND_EXEC
? OP_INOUT
: OP_OUT
, 0);
689 case STRICT_LOW_PART
:
690 scan_rtx (insn
, &XEXP (x
, 0), cl
, action
, OP_INOUT
, earlyclobber
);
695 scan_rtx (insn
, &XEXP (x
, 0), cl
, action
,
696 type
== OP_IN
? OP_IN
: OP_INOUT
, earlyclobber
);
697 scan_rtx (insn
, &XEXP (x
, 1), cl
, action
, OP_IN
, 0);
698 scan_rtx (insn
, &XEXP (x
, 2), cl
, action
, OP_IN
, 0);
707 /* Should only happen inside MEM. */
711 scan_rtx (insn
, &SET_DEST (x
), cl
, action
,
712 GET_CODE (PATTERN (insn
)) == COND_EXEC
? OP_INOUT
: OP_OUT
, 0);
716 scan_rtx (insn
, &XEXP (x
, 0), cl
, action
, type
, 0);
718 scan_rtx (insn
, &XEXP (x
, 1), cl
, action
, type
, 0);
725 fmt
= GET_RTX_FORMAT (code
);
726 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
729 scan_rtx (insn
, &XEXP (x
, i
), cl
, action
, type
, 0);
730 else if (fmt
[i
] == 'E')
731 for (j
= XVECLEN (x
, i
) - 1; j
>= 0; j
--)
732 scan_rtx (insn
, &XVECEXP (x
, i
, j
), cl
, action
, type
, 0);
736 /* Build def/use chain. */
738 static struct du_chain
*
739 build_def_use (basic_block bb
)
743 open_chains
= closed_chains
= NULL
;
745 for (insn
= BB_HEAD (bb
); ; insn
= NEXT_INSN (insn
))
751 rtx old_operands
[MAX_RECOG_OPERANDS
];
752 rtx old_dups
[MAX_DUP_OPERANDS
];
757 /* Process the insn, determining its effect on the def-use
758 chains. We perform the following steps with the register
759 references in the insn:
760 (1) Any read that overlaps an open chain, but doesn't exactly
761 match, causes that chain to be closed. We can't deal
763 (2) Any read outside an operand causes any chain it overlaps
764 with to be closed, since we can't replace it.
765 (3) Any read inside an operand is added if there's already
766 an open chain for it.
767 (4) For any REG_DEAD note we find, close open chains that
769 (5) For any write we find, close open chains that overlap it.
770 (6) For any write we find in an operand, make a new chain.
771 (7) For any REG_UNUSED, close any chains we just opened. */
773 icode
= recog_memoized (insn
);
775 if (! constrain_operands (1))
776 fatal_insn_not_found (insn
);
777 preprocess_constraints ();
778 alt
= which_alternative
;
779 n_ops
= recog_data
.n_operands
;
781 /* Simplify the code below by rewriting things to reflect
782 matching constraints. Also promote OP_OUT to OP_INOUT
783 in predicated instructions. */
785 predicated
= GET_CODE (PATTERN (insn
)) == COND_EXEC
;
786 for (i
= 0; i
< n_ops
; ++i
)
788 int matches
= recog_op_alt
[i
][alt
].matches
;
790 recog_op_alt
[i
][alt
].cl
= recog_op_alt
[matches
][alt
].cl
;
791 if (matches
>= 0 || recog_op_alt
[i
][alt
].matched
>= 0
792 || (predicated
&& recog_data
.operand_type
[i
] == OP_OUT
))
793 recog_data
.operand_type
[i
] = OP_INOUT
;
796 /* Step 1: Close chains for which we have overlapping reads. */
797 for (i
= 0; i
< n_ops
; i
++)
798 scan_rtx (insn
, recog_data
.operand_loc
[i
],
799 NO_REGS
, terminate_overlapping_read
,
800 recog_data
.operand_type
[i
], 0);
802 /* Step 2: Close chains for which we have reads outside operands.
803 We do this by munging all operands into CC0, and closing
804 everything remaining. */
806 for (i
= 0; i
< n_ops
; i
++)
808 old_operands
[i
] = recog_data
.operand
[i
];
809 /* Don't squash match_operator or match_parallel here, since
810 we don't know that all of the contained registers are
811 reachable by proper operands. */
812 if (recog_data
.constraints
[i
][0] == '\0')
814 *recog_data
.operand_loc
[i
] = cc0_rtx
;
816 for (i
= 0; i
< recog_data
.n_dups
; i
++)
818 old_dups
[i
] = *recog_data
.dup_loc
[i
];
819 *recog_data
.dup_loc
[i
] = cc0_rtx
;
822 scan_rtx (insn
, &PATTERN (insn
), NO_REGS
, terminate_all_read
,
825 for (i
= 0; i
< recog_data
.n_dups
; i
++)
826 *recog_data
.dup_loc
[i
] = old_dups
[i
];
827 for (i
= 0; i
< n_ops
; i
++)
828 *recog_data
.operand_loc
[i
] = old_operands
[i
];
829 if (recog_data
.n_dups
)
830 df_insn_rescan (insn
);
832 /* Step 2B: Can't rename function call argument registers. */
833 if (CALL_P (insn
) && CALL_INSN_FUNCTION_USAGE (insn
))
834 scan_rtx (insn
, &CALL_INSN_FUNCTION_USAGE (insn
),
835 NO_REGS
, terminate_all_read
, OP_IN
, 0);
837 /* Step 2C: Can't rename asm operands that were originally
839 if (asm_noperands (PATTERN (insn
)) > 0)
840 for (i
= 0; i
< n_ops
; i
++)
842 rtx
*loc
= recog_data
.operand_loc
[i
];
846 && REGNO (op
) == ORIGINAL_REGNO (op
)
847 && (recog_data
.operand_type
[i
] == OP_IN
848 || recog_data
.operand_type
[i
] == OP_INOUT
))
849 scan_rtx (insn
, loc
, NO_REGS
, terminate_all_read
, OP_IN
, 0);
852 /* Step 3: Append to chains for reads inside operands. */
853 for (i
= 0; i
< n_ops
+ recog_data
.n_dups
; i
++)
855 int opn
= i
< n_ops
? i
: recog_data
.dup_num
[i
- n_ops
];
856 rtx
*loc
= (i
< n_ops
857 ? recog_data
.operand_loc
[opn
]
858 : recog_data
.dup_loc
[i
- n_ops
]);
859 enum reg_class cl
= recog_op_alt
[opn
][alt
].cl
;
860 enum op_type type
= recog_data
.operand_type
[opn
];
862 /* Don't scan match_operand here, since we've no reg class
863 information to pass down. Any operands that we could
864 substitute in will be represented elsewhere. */
865 if (recog_data
.constraints
[opn
][0] == '\0')
868 if (recog_op_alt
[opn
][alt
].is_address
)
869 scan_rtx_address (insn
, loc
, cl
, mark_read
, VOIDmode
);
871 scan_rtx (insn
, loc
, cl
, mark_read
, type
, 0);
874 /* Step 3B: Record updates for regs in REG_INC notes, and
875 source regs in REG_FRAME_RELATED_EXPR notes. */
876 for (note
= REG_NOTES (insn
); note
; note
= XEXP (note
, 1))
877 if (REG_NOTE_KIND (note
) == REG_INC
878 || REG_NOTE_KIND (note
) == REG_FRAME_RELATED_EXPR
)
879 scan_rtx (insn
, &XEXP (note
, 0), ALL_REGS
, mark_read
,
882 /* Step 4: Close chains for registers that die here. */
883 for (note
= REG_NOTES (insn
); note
; note
= XEXP (note
, 1))
884 if (REG_NOTE_KIND (note
) == REG_DEAD
)
885 scan_rtx (insn
, &XEXP (note
, 0), NO_REGS
, terminate_dead
,
888 /* Step 4B: If this is a call, any chain live at this point
889 requires a caller-saved reg. */
893 for (p
= open_chains
; p
; p
= p
->next_chain
)
894 p
->need_caller_save_reg
= 1;
897 /* Step 5: Close open chains that overlap writes. Similar to
898 step 2, we hide in-out operands, since we do not want to
899 close these chains. */
901 for (i
= 0; i
< n_ops
; i
++)
903 old_operands
[i
] = recog_data
.operand
[i
];
904 if (recog_data
.operand_type
[i
] == OP_INOUT
)
905 *recog_data
.operand_loc
[i
] = cc0_rtx
;
907 for (i
= 0; i
< recog_data
.n_dups
; i
++)
909 int opn
= recog_data
.dup_num
[i
];
910 old_dups
[i
] = *recog_data
.dup_loc
[i
];
911 if (recog_data
.operand_type
[opn
] == OP_INOUT
)
912 *recog_data
.dup_loc
[i
] = cc0_rtx
;
915 scan_rtx (insn
, &PATTERN (insn
), NO_REGS
, terminate_write
, OP_IN
, 0);
917 for (i
= 0; i
< recog_data
.n_dups
; i
++)
918 *recog_data
.dup_loc
[i
] = old_dups
[i
];
919 for (i
= 0; i
< n_ops
; i
++)
920 *recog_data
.operand_loc
[i
] = old_operands
[i
];
922 /* Step 6: Begin new chains for writes inside operands. */
923 /* ??? Many targets have output constraints on the SET_DEST
924 of a call insn, which is stupid, since these are certainly
925 ABI defined hard registers. Don't change calls at all.
926 Similarly take special care for asm statement that originally
927 referenced hard registers. */
928 if (asm_noperands (PATTERN (insn
)) > 0)
930 for (i
= 0; i
< n_ops
; i
++)
931 if (recog_data
.operand_type
[i
] == OP_OUT
)
933 rtx
*loc
= recog_data
.operand_loc
[i
];
935 enum reg_class cl
= recog_op_alt
[i
][alt
].cl
;
938 && REGNO (op
) == ORIGINAL_REGNO (op
))
941 scan_rtx (insn
, loc
, cl
, mark_write
, OP_OUT
,
942 recog_op_alt
[i
][alt
].earlyclobber
);
945 else if (!CALL_P (insn
))
946 for (i
= 0; i
< n_ops
+ recog_data
.n_dups
; i
++)
948 int opn
= i
< n_ops
? i
: recog_data
.dup_num
[i
- n_ops
];
949 rtx
*loc
= (i
< n_ops
950 ? recog_data
.operand_loc
[opn
]
951 : recog_data
.dup_loc
[i
- n_ops
]);
952 enum reg_class cl
= recog_op_alt
[opn
][alt
].cl
;
954 if (recog_data
.operand_type
[opn
] == OP_OUT
)
955 scan_rtx (insn
, loc
, cl
, mark_write
, OP_OUT
,
956 recog_op_alt
[opn
][alt
].earlyclobber
);
959 /* Step 6B: Record destination regs in REG_FRAME_RELATED_EXPR
961 for (note
= REG_NOTES (insn
); note
; note
= XEXP (note
, 1))
962 if (REG_NOTE_KIND (note
) == REG_FRAME_RELATED_EXPR
)
963 scan_rtx (insn
, &XEXP (note
, 0), ALL_REGS
, mark_access
,
966 /* Step 7: Close chains for registers that were never
968 for (note
= REG_NOTES (insn
); note
; note
= XEXP (note
, 1))
969 if (REG_NOTE_KIND (note
) == REG_UNUSED
)
970 scan_rtx (insn
, &XEXP (note
, 0), NO_REGS
, terminate_dead
,
973 if (insn
== BB_END (bb
))
977 /* Since we close every chain when we find a REG_DEAD note, anything that
978 is still open lives past the basic block, so it can't be renamed. */
979 return closed_chains
;
982 /* Dump all def/use chains in CHAINS to DUMP_FILE. They are
983 printed in reverse order as that's how we build them. */
986 dump_def_use_chain (struct du_chain
*chains
)
990 struct du_chain
*this_du
= chains
;
991 int r
= REGNO (*this_du
->loc
);
992 int nregs
= hard_regno_nregs
[r
][GET_MODE (*this_du
->loc
)];
993 fprintf (dump_file
, "Register %s (%d):", reg_names
[r
], nregs
);
996 fprintf (dump_file
, " %d [%s]", INSN_UID (this_du
->insn
),
997 reg_class_names
[this_du
->cl
]);
998 this_du
= this_du
->next_use
;
1000 fprintf (dump_file
, "\n");
1001 chains
= chains
->next_chain
;
1007 gate_handle_regrename (void)
1009 return (optimize
> 0 && (flag_rename_registers
));
1012 struct rtl_opt_pass pass_regrename
=
1017 gate_handle_regrename
, /* gate */
1018 regrename_optimize
, /* execute */
1021 0, /* static_pass_number */
1022 TV_RENAME_REGISTERS
, /* tv_id */
1023 0, /* properties_required */
1024 0, /* properties_provided */
1025 0, /* properties_destroyed */
1026 0, /* todo_flags_start */
1027 TODO_df_finish
| TODO_verify_rtl_sharing
|
1028 TODO_dump_func
/* todo_flags_finish */