2010-11-11 Jakub Jelinek <jakub@redhat.com>
[official-gcc.git] / gcc / regrename.c
blob2535ab74ab9b2a0c45bec9be099cb7122333f717
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)
10 any later version.
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/>. */
21 #include "config.h"
22 #include "system.h"
23 #include "coretypes.h"
24 #include "tm.h"
25 #include "rtl-error.h"
26 #include "tm_p.h"
27 #include "insn-config.h"
28 #include "regs.h"
29 #include "addresses.h"
30 #include "hard-reg-set.h"
31 #include "basic-block.h"
32 #include "reload.h"
33 #include "output.h"
34 #include "function.h"
35 #include "recog.h"
36 #include "flags.h"
37 #include "obstack.h"
38 #include "timevar.h"
39 #include "tree-pass.h"
40 #include "df.h"
42 #if HOST_BITS_PER_WIDE_INT <= MAX_RECOG_OPERANDS
43 #error "Use a different bitmap implementation for untracked_operands."
44 #endif
46 /* We keep linked lists of DU_HEAD structures, each of which describes
47 a chain of occurrences of a reg. */
48 struct du_head
50 /* The next chain. */
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. */
58 unsigned id;
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. */
75 struct du_chain
77 /* Links to the next occurrence of the register. */
78 struct du_chain *next_use;
80 /* The insn where the register appears. */
81 rtx insn;
82 /* The location inside the insn. */
83 rtx *loc;
84 /* The register class required by the insn at this location. */
85 ENUM_BITFIELD(reg_class) cl : 16;
88 enum scan_actions
90 terminate_write,
91 terminate_dead,
92 mark_all_read,
93 mark_read,
94 mark_write,
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. */
98 mark_access
101 static const char * const scan_actions_name[] =
103 "terminate_write",
104 "terminate_dead",
105 "mark_all_read",
106 "mark_read",
107 "mark_write",
108 "mark_access"
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,
119 enum op_type);
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;
128 static void
129 free_chain_data (void)
131 int i;
132 du_head_p ptr;
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. */
142 static void
143 merge_overlapping_regs (HARD_REG_SET *pset, struct du_head *head)
145 bitmap_iterator bi;
146 unsigned i;
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;
152 while (j-- > 0)
153 SET_HARD_REG_BIT (*pset, other->regno + j);
157 /* Perform register renaming on the current function. */
159 static unsigned int
160 regrename_optimize (void)
162 int tick[FIRST_PSEUDO_REGISTER];
163 int this_tick = 0;
164 basic_block bb;
165 char *first_obj;
167 df_set_flags (DF_LR_RUN_DCE);
168 df_note_add_problem ();
169 df_analyze ();
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);
177 FOR_EACH_BB (bb)
179 struct du_head *all_chains = 0;
180 HARD_REG_SET unavailable;
181 #if 0
182 HARD_REG_SET regs_seen;
183 CLEAR_HARD_REG_SET (regs_seen);
184 #endif
186 id_to_chain = VEC_alloc (du_head_p, heap, 0);
188 CLEAR_HARD_REG_SET (unavailable);
190 if (dump_file)
191 fprintf (dump_file, "\nBasic block %d:\n", bb->index);
193 all_chains = build_def_use (bb);
195 if (dump_file)
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 !HARD_FRAME_POINTER_IS_FRAME_POINTER
204 add_to_hard_reg_set (&unavailable, Pmode, HARD_FRAME_POINTER_REGNUM);
205 #endif
208 while (all_chains)
210 int new_reg, best_new_reg, best_nregs;
211 int n_uses;
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;
216 int i;
218 all_chains = this_head->next_chain;
220 if (this_head->cannot_rename)
221 continue;
223 best_new_reg = reg;
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);
231 continue;
233 #endif
235 if (fixed_regs[reg] || global_regs[reg]
236 #if !HARD_FRAME_POINTER_IS_FRAME_POINTER
237 || (frame_pointer_needed && reg == HARD_FRAME_POINTER_REGNUM)
238 #else
239 || (frame_pointer_needed && reg == FRAME_POINTER_REGNUM)
240 #endif
242 continue;
244 COPY_HARD_REG_SET (this_unavailable, unavailable);
246 /* Count number of uses, and narrow the set of registers we can
247 use for renaming. */
248 n_uses = 0;
249 for (tmp = this_head->first; tmp; tmp = tmp->next_use)
251 if (DEBUG_INSN_P (tmp->insn))
252 continue;
253 n_uses++;
254 IOR_COMPL_HARD_REG_SET (this_unavailable,
255 reg_class_contents[tmp->cl]);
258 if (n_uses < 2)
259 continue;
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
282 leaf function. */
283 || (current_function_is_leaf
284 && !LEAF_REGISTERS[new_reg + i])
285 #endif
286 #ifdef HARD_REGNO_RENAME_OK
287 || ! HARD_REGNO_RENAME_OK (reg + i, new_reg + i)
288 #endif
290 break;
291 if (i >= 0)
292 continue;
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)))))
304 break;
305 if (! tmp)
307 if (tick[best_new_reg] > tick[new_reg])
309 best_new_reg = new_reg;
310 best_nregs = nregs;
315 if (dump_file)
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;
326 if (dump_file)
327 fprintf (dump_file, "; no available better choice\n");
328 continue;
331 if (dump_file)
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);
341 free_chain_data ();
342 obstack_free (&rename_obstack, first_obj);
345 obstack_free (&rename_obstack, NULL);
347 if (dump_file)
348 fputc ('\n', dump_file);
350 return 0;
353 static void
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 ();
370 else
372 rtx note;
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)
390 found_note = true;
391 if (kind == REG_DEAD
392 && reg_set_p (*chain->loc, chain->insn))
393 remove_note (chain->insn, note);
394 else
395 XEXP (note, 0) = *chain->loc;
396 break;
402 df_insn_rescan (chain->insn);
404 if (!found_note)
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. */
418 static void
419 mark_conflict (struct du_head *chains, unsigned id)
421 while (chains)
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
430 without renaming. */
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
441 open_chains. */
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. */
455 static bool
456 verify_reg_in_set (rtx op, HARD_REG_SET *pset)
458 unsigned regno, nregs;
459 bool all_live, all_dead;
460 if (!REG_P (op))
461 return false;
463 regno = REGNO (op);
464 nregs = hard_regno_nregs[regno][GET_MODE (op)];
465 all_live = all_dead = true;
466 while (nregs-- > 0)
467 if (TEST_HARD_REG_BIT (*pset, regno + nregs))
468 all_dead = false;
469 else
470 all_live = false;
471 if (!all_dead && !all_live)
473 fail_current_block = true;
474 return false;
476 return all_live;
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. */
482 static bool
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. */
494 static void
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)
501 x = SUBREG_REG (x);
502 if (!REG_P (x) || GET_CODE (set) != code)
503 return;
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. */
515 static void
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;
521 int nregs;
523 head->next_chain = open_chains;
524 open_chains = head;
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. */
541 nregs = head->nregs;
542 while (nregs-- > 0)
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);
551 open_chains = head;
553 if (dump_file)
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;
565 return;
568 this_du = XOBNEW (&rename_obstack, struct du_chain);
569 head->first = head->last = this_du;
571 this_du->next_use = 0;
572 this_du->loc = loc;
573 this_du->insn = insn;
574 this_du->cl = cl;
577 static void
578 scan_rtx_reg (rtx insn, rtx *loc, enum reg_class cl, enum scan_actions action,
579 enum op_type type)
581 struct du_head **p;
582 rtx x = *loc;
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)
589 if (type == OP_OUT)
590 create_new_chain (this_regno, this_nregs, loc, insn, cl);
591 return;
594 if ((type == OP_OUT) != (action == terminate_write || action == mark_access))
595 return;
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);
608 if (head->terminated
609 || head->regno + head->nregs <= this_regno
610 || this_regno + this_nregs <= head->regno)
612 p = &head->next_chain;
613 continue;
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)))
624 if (dump_file)
625 fprintf (dump_file,
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;
630 if (superset)
632 unsigned nregs = this_nregs;
633 head->regno = this_regno;
634 head->nregs = this_nregs;
635 while (nregs-- > 0)
636 SET_HARD_REG_BIT (live_in_chains, head->regno + nregs);
637 if (dump_file)
638 fprintf (dump_file,
639 "Widening register in chain %s (%d) at insn %d\n",
640 reg_names[head->regno], head->id, INSN_UID (insn));
642 else if (!subset)
644 fail_current_block = true;
645 if (dump_file)
646 fprintf (dump_file,
647 "Failing basic block due to unhandled overlap\n");
650 else
652 struct du_chain *this_du;
653 this_du = XOBNEW (&rename_obstack, struct du_chain);
654 this_du->next_use = 0;
655 this_du->loc = loc;
656 this_du->insn = insn;
657 this_du->cl = cl;
658 if (head->first == NULL)
659 head->first = this_du;
660 else
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))
668 return;
669 /* Otherwise, find any other chains that do not match exactly;
670 ensure they all get marked unrenamable. */
671 p = &head->next_chain;
672 continue;
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)
680 && superset)
682 unsigned nregs;
684 head->terminated = 1;
685 head->next_chain = closed_chains;
686 closed_chains = head;
687 bitmap_clear_bit (&open_chains_set, head->id);
689 nregs = head->nregs;
690 while (nregs-- > 0)
691 CLEAR_HARD_REG_BIT (live_in_chains, head->regno + nregs);
693 *p = next;
694 if (dump_file)
695 fprintf (dump_file,
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. */
704 if (dump_file)
705 fprintf (dump_file,
706 "Failing basic block due to unhandled overlap\n");
707 fail_current_block = true;
708 return;
710 else
712 head->cannot_rename = 1;
713 if (dump_file)
714 fprintf (dump_file,
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. */
726 static void
727 scan_rtx_address (rtx insn, rtx *loc, enum reg_class cl,
728 enum scan_actions action, enum machine_mode mode)
730 rtx x = *loc;
731 RTX_CODE code = GET_CODE (x);
732 const char *fmt;
733 int i, j;
735 if (action == mark_write || action == mark_access)
736 return;
738 switch (code)
740 case PLUS:
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);
746 rtx op0 = orig_op0;
747 rtx op1 = orig_op1;
748 rtx *locI = NULL;
749 rtx *locB = NULL;
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)
767 locI = &XEXP (x, 0);
768 locB = &XEXP (x, 1);
769 index_code = GET_CODE (*locI);
771 else if (code1 == MULT || code1 == SIGN_EXTEND || code1 == TRUNCATE
772 || code1 == ZERO_EXTEND || code0 == MEM)
774 locI = &XEXP (x, 1);
775 locB = &XEXP (x, 0);
776 index_code = GET_CODE (*locI);
778 else if (code0 == CONST_INT || code0 == CONST
779 || code0 == SYMBOL_REF || code0 == LABEL_REF)
781 locB = &XEXP (x, 1);
782 index_code = GET_CODE (XEXP (x, 0));
784 else if (code1 == CONST_INT || code1 == CONST
785 || code1 == SYMBOL_REF || code1 == LABEL_REF)
787 locB = &XEXP (x, 0);
788 index_code = GET_CODE (XEXP (x, 1));
790 else if (code0 == REG && code1 == REG)
792 int index_op;
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))
797 index_op = 1;
798 else if (REGNO_OK_FOR_INDEX_P (regno0)
799 && regno_ok_for_base_p (regno1, mode, PLUS, REG))
800 index_op = 0;
801 else if (regno_ok_for_base_p (regno0, mode, PLUS, REG)
802 || REGNO_OK_FOR_INDEX_P (regno1))
803 index_op = 1;
804 else if (regno_ok_for_base_p (regno1, mode, PLUS, REG))
805 index_op = 0;
806 else
807 index_op = 1;
809 locI = &XEXP (x, index_op);
810 locB = &XEXP (x, !index_op);
811 index_code = GET_CODE (*locI);
813 else if (code0 == REG)
815 locI = &XEXP (x, 0);
816 locB = &XEXP (x, 1);
817 index_code = GET_CODE (*locI);
819 else if (code1 == REG)
821 locI = &XEXP (x, 1);
822 locB = &XEXP (x, 0);
823 index_code = GET_CODE (*locI);
826 if (locI)
827 scan_rtx_address (insn, locI, INDEX_REG_CLASS, action, mode);
828 if (locB)
829 scan_rtx_address (insn, locB, base_reg_class (mode, PLUS, index_code),
830 action, mode);
832 return;
835 case POST_INC:
836 case POST_DEC:
837 case POST_MODIFY:
838 case PRE_INC:
839 case PRE_DEC:
840 case PRE_MODIFY:
841 #ifndef AUTO_INC_DEC
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;
845 #endif
846 break;
848 case MEM:
849 scan_rtx_address (insn, &XEXP (x, 0),
850 base_reg_class (GET_MODE (x), MEM, SCRATCH), action,
851 GET_MODE (x));
852 return;
854 case REG:
855 scan_rtx_reg (insn, loc, cl, action, OP_IN);
856 return;
858 default:
859 break;
862 fmt = GET_RTX_FORMAT (code);
863 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
865 if (fmt[i] == 'e')
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);
873 static void
874 scan_rtx (rtx insn, rtx *loc, enum reg_class cl, enum scan_actions action,
875 enum op_type type)
877 const char *fmt;
878 rtx x = *loc;
879 enum rtx_code code = GET_CODE (x);
880 int i, j;
882 code = GET_CODE (x);
883 switch (code)
885 case CONST:
886 case CONST_INT:
887 case CONST_DOUBLE:
888 case CONST_FIXED:
889 case CONST_VECTOR:
890 case SYMBOL_REF:
891 case LABEL_REF:
892 case CC0:
893 case PC:
894 return;
896 case REG:
897 scan_rtx_reg (insn, loc, cl, action, type);
898 return;
900 case MEM:
901 scan_rtx_address (insn, &XEXP (x, 0),
902 base_reg_class (GET_MODE (x), MEM, SCRATCH), action,
903 GET_MODE (x));
904 return;
906 case SET:
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);
911 return;
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);
916 return;
918 case ZERO_EXTRACT:
919 case SIGN_EXTRACT:
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);
925 return;
927 case POST_INC:
928 case PRE_INC:
929 case POST_DEC:
930 case PRE_DEC:
931 case POST_MODIFY:
932 case PRE_MODIFY:
933 /* Should only happen inside MEM. */
934 gcc_unreachable ();
936 case CLOBBER:
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);
940 return;
942 case EXPR_LIST:
943 scan_rtx (insn, &XEXP (x, 0), cl, action, type);
944 if (XEXP (x, 1))
945 scan_rtx (insn, &XEXP (x, 1), cl, action, type);
946 return;
948 default:
949 break;
952 fmt = GET_RTX_FORMAT (code);
953 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
955 if (fmt[i] == 'e')
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. */
970 static void
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)
974 int i;
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')
983 continue;
984 if (do_not_hide & (1 << i))
985 continue;
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))
995 continue;
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. */
1005 static void
1006 restore_operands (rtx insn, int n_ops, rtx *old_operands, rtx *old_dups)
1008 int i;
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. */
1021 static void
1022 record_out_operands (rtx insn, bool earlyclobber)
1024 int n_ops = recog_data.n_operands;
1025 int alt = which_alternative;
1027 int i;
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]);
1035 rtx op = *loc;
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)
1042 continue;
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. */
1052 if (CALL_P (insn)
1053 || (asm_noperands (PATTERN (insn)) > 0
1054 && REG_P (op)
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)
1068 rtx insn;
1069 df_ref *def_rec;
1070 unsigned HOST_WIDE_INT untracked_operands;
1072 open_chains = closed_chains = NULL;
1074 fail_current_block = false;
1076 current_id = 0;
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))
1091 int n_ops;
1092 rtx note;
1093 rtx old_operands[MAX_RECOG_OPERANDS];
1094 rtx old_dups[MAX_DUP_OPERANDS];
1095 int i;
1096 int alt;
1097 int predicated;
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
1104 its effect:
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
1112 overlap it.
1113 (5) For any non-earlyclobber write we find, close open chains
1114 that overlap it.
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
1122 basic block. */
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;
1143 if (matches >= 0)
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. */
1154 if (matches >= 0
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))
1167 && REG_P (op)
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,
1174 NO_REGS);
1178 if (fail_current_block)
1179 break;
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,
1184 false);
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
1189 operands. */
1190 record_out_operands (insn, true);
1192 /* Step 2: Mark chains for which we have reads outside operands
1193 as unrenamable.
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,
1198 false);
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
1208 hard registers. */
1209 if (asm_noperands (PATTERN (insn)) > 0)
1210 for (i = 0; i < n_ops; i++)
1212 rtx *loc = recog_data.operand_loc[i];
1213 rtx op = *loc;
1215 if (REG_P (op)
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))
1237 continue;
1239 if (recog_op_alt[opn][alt].is_address)
1240 scan_rtx_address (insn, loc, cl, mark_read, VOIDmode);
1241 else
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,
1251 OP_INOUT);
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,
1261 OP_IN);
1264 /* Step 4B: If this is a call, any chain live at this point
1265 requires a caller-saved reg. */
1266 if (CALL_P (insn))
1268 struct du_head *p;
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,
1282 true);
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,
1289 false);
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,
1301 OP_INOUT);
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,
1312 OP_IN);
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))
1322 break;
1325 bitmap_clear (&open_chains_set);
1327 if (fail_current_block)
1328 return NULL;
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. */
1338 static void
1339 dump_def_use_chain (struct du_head *head)
1341 while (head)
1343 struct du_chain *this_du = head->first;
1344 fprintf (dump_file, "Register %s (%d):",
1345 reg_names[head->regno], head->nregs);
1346 while (this_du)
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;
1358 static bool
1359 gate_handle_regrename (void)
1361 return (optimize > 0 && (flag_rename_registers));
1364 struct rtl_opt_pass pass_regrename =
1367 RTL_PASS,
1368 "rnreg", /* name */
1369 gate_handle_regrename, /* gate */
1370 regrename_optimize, /* execute */
1371 NULL, /* sub */
1372 NULL, /* next */
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 */