]> git.ipfire.org Git - thirdparty/gcc.git/blob - gcc/regrename.c
matrix-reorg.c (analyze_matrix_allocation_site): Remove unused malloc_fname variable.
[thirdparty/gcc.git] / gcc / regrename.c
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.
4
5 This file is part of GCC.
6
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.
11
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.
16
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/>. */
20
21 #include "config.h"
22 #include "system.h"
23 #include "coretypes.h"
24 #include "tm.h"
25 #include "rtl.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 "toplev.h"
38 #include "obstack.h"
39 #include "timevar.h"
40 #include "tree-pass.h"
41 #include "df.h"
42
43 /* We keep linked lists of DU_HEAD structures, each of which describes
44 a chain of occurrences of a reg. */
45 struct du_head
46 {
47 /* The next chain. */
48 struct du_head *next_chain;
49 /* The first and last elements of this chain. */
50 struct du_chain *first, *last;
51 /* Describes the register being tracked. */
52 unsigned regno, nregs;
53
54 /* A unique id to be used as an index into the conflicts bitmaps. */
55 unsigned id;
56 /* A bitmap to record conflicts with other chains. */
57 bitmap_head conflicts;
58 /* Conflicts with untracked hard registers. */
59 HARD_REG_SET hard_conflicts;
60
61 /* Nonzero if the chain is finished; zero if it is still open. */
62 unsigned int terminated:1;
63 /* Nonzero if the chain crosses a call. */
64 unsigned int need_caller_save_reg:1;
65 /* Nonzero if the register is used in a way that prevents renaming,
66 such as the SET_DEST of a CALL_INSN or an asm operand that used
67 to be a hard register. */
68 unsigned int cannot_rename:1;
69 };
70
71 /* This struct describes a single occurrence of a register. */
72 struct du_chain
73 {
74 /* Links to the next occurrence of the register. */
75 struct du_chain *next_use;
76
77 /* The insn where the register appears. */
78 rtx insn;
79 /* The location inside the insn. */
80 rtx *loc;
81 /* The register class required by the insn at this location. */
82 ENUM_BITFIELD(reg_class) cl : 16;
83 };
84
85 enum scan_actions
86 {
87 terminate_write,
88 terminate_dead,
89 mark_all_read,
90 mark_read,
91 mark_write,
92 /* mark_access is for marking the destination regs in
93 REG_FRAME_RELATED_EXPR notes (as if they were read) so that the
94 note is updated properly. */
95 mark_access
96 };
97
98 static const char * const scan_actions_name[] =
99 {
100 "terminate_write",
101 "terminate_dead",
102 "mark_all_read",
103 "mark_read",
104 "mark_write",
105 "mark_access"
106 };
107
108 static struct obstack rename_obstack;
109
110 static void do_replace (struct du_head *, int);
111 static void scan_rtx_reg (rtx, rtx *, enum reg_class,
112 enum scan_actions, enum op_type);
113 static void scan_rtx_address (rtx, rtx *, enum reg_class,
114 enum scan_actions, enum machine_mode);
115 static void scan_rtx (rtx, rtx *, enum reg_class, enum scan_actions,
116 enum op_type);
117 static struct du_head *build_def_use (basic_block);
118 static void dump_def_use_chain (struct du_head *);
119
120 typedef struct du_head *du_head_p;
121 DEF_VEC_P (du_head_p);
122 DEF_VEC_ALLOC_P (du_head_p, heap);
123 static VEC(du_head_p, heap) *id_to_chain;
124
125 static void
126 free_chain_data (void)
127 {
128 int i;
129 du_head_p ptr;
130 for (i = 0; VEC_iterate(du_head_p, id_to_chain, i, ptr); i++)
131 bitmap_clear (&ptr->conflicts);
132
133 VEC_free (du_head_p, heap, id_to_chain);
134 }
135
136 /* For a def-use chain HEAD, find which registers overlap its lifetime and
137 set the corresponding bits in *PSET. */
138
139 static void
140 merge_overlapping_regs (HARD_REG_SET *pset, struct du_head *head)
141 {
142 bitmap_iterator bi;
143 unsigned i;
144 IOR_HARD_REG_SET (*pset, head->hard_conflicts);
145 EXECUTE_IF_SET_IN_BITMAP (&head->conflicts, 0, i, bi)
146 {
147 du_head_p other = VEC_index (du_head_p, id_to_chain, i);
148 unsigned j = other->nregs;
149 while (j-- > 0)
150 SET_HARD_REG_BIT (*pset, other->regno + j);
151 }
152 }
153
154 /* Perform register renaming on the current function. */
155
156 static unsigned int
157 regrename_optimize (void)
158 {
159 int tick[FIRST_PSEUDO_REGISTER];
160 int this_tick = 0;
161 basic_block bb;
162 char *first_obj;
163
164 df_set_flags (DF_LR_RUN_DCE);
165 df_note_add_problem ();
166 df_analyze ();
167 df_set_flags (DF_DEFER_INSN_RESCAN);
168
169 memset (tick, 0, sizeof tick);
170
171 gcc_obstack_init (&rename_obstack);
172 first_obj = XOBNEWVAR (&rename_obstack, char, 0);
173
174 FOR_EACH_BB (bb)
175 {
176 struct du_head *all_chains = 0;
177 HARD_REG_SET unavailable;
178 #if 0
179 HARD_REG_SET regs_seen;
180 CLEAR_HARD_REG_SET (regs_seen);
181 #endif
182
183 id_to_chain = VEC_alloc (du_head_p, heap, 0);
184
185 CLEAR_HARD_REG_SET (unavailable);
186
187 if (dump_file)
188 fprintf (dump_file, "\nBasic block %d:\n", bb->index);
189
190 all_chains = build_def_use (bb);
191
192 if (dump_file)
193 dump_def_use_chain (all_chains);
194
195 CLEAR_HARD_REG_SET (unavailable);
196 /* Don't clobber traceback for noreturn functions. */
197 if (frame_pointer_needed)
198 {
199 add_to_hard_reg_set (&unavailable, Pmode, FRAME_POINTER_REGNUM);
200 #if FRAME_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM
201 add_to_hard_reg_set (&unavailable, Pmode, HARD_FRAME_POINTER_REGNUM);
202 #endif
203 }
204
205 while (all_chains)
206 {
207 int new_reg, best_new_reg, best_nregs;
208 int n_uses;
209 struct du_head *this_head = all_chains;
210 struct du_chain *tmp;
211 HARD_REG_SET this_unavailable;
212 int reg = this_head->regno;
213 int i;
214
215 all_chains = this_head->next_chain;
216
217 if (this_head->cannot_rename)
218 continue;
219
220 best_new_reg = reg;
221 best_nregs = this_head->nregs;
222
223 #if 0 /* This just disables optimization opportunities. */
224 /* Only rename once we've seen the reg more than once. */
225 if (! TEST_HARD_REG_BIT (regs_seen, reg))
226 {
227 SET_HARD_REG_BIT (regs_seen, reg);
228 continue;
229 }
230 #endif
231
232 if (fixed_regs[reg] || global_regs[reg]
233 #if FRAME_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM
234 || (frame_pointer_needed && reg == HARD_FRAME_POINTER_REGNUM)
235 #else
236 || (frame_pointer_needed && reg == FRAME_POINTER_REGNUM)
237 #endif
238 )
239 continue;
240
241 COPY_HARD_REG_SET (this_unavailable, unavailable);
242
243 /* Count number of uses, and narrow the set of registers we can
244 use for renaming. */
245 n_uses = 0;
246 for (tmp = this_head->first; tmp; tmp = tmp->next_use)
247 {
248 if (DEBUG_INSN_P (tmp->insn))
249 continue;
250 n_uses++;
251 IOR_COMPL_HARD_REG_SET (this_unavailable,
252 reg_class_contents[tmp->cl]);
253 }
254
255 if (n_uses < 2)
256 continue;
257
258 if (this_head->need_caller_save_reg)
259 IOR_HARD_REG_SET (this_unavailable, call_used_reg_set);
260
261 merge_overlapping_regs (&this_unavailable, this_head);
262
263 /* Now potential_regs is a reasonable approximation, let's
264 have a closer look at each register still in there. */
265 for (new_reg = 0; new_reg < FIRST_PSEUDO_REGISTER; new_reg++)
266 {
267 enum machine_mode mode = GET_MODE (*this_head->first->loc);
268 int nregs = hard_regno_nregs[new_reg][mode];
269
270 for (i = nregs - 1; i >= 0; --i)
271 if (TEST_HARD_REG_BIT (this_unavailable, new_reg + i)
272 || fixed_regs[new_reg + i]
273 || global_regs[new_reg + i]
274 /* Can't use regs which aren't saved by the prologue. */
275 || (! df_regs_ever_live_p (new_reg + i)
276 && ! call_used_regs[new_reg + i])
277 #ifdef LEAF_REGISTERS
278 /* We can't use a non-leaf register if we're in a
279 leaf function. */
280 || (current_function_is_leaf
281 && !LEAF_REGISTERS[new_reg + i])
282 #endif
283 #ifdef HARD_REGNO_RENAME_OK
284 || ! HARD_REGNO_RENAME_OK (reg + i, new_reg + i)
285 #endif
286 )
287 break;
288 if (i >= 0)
289 continue;
290
291 /* See whether it accepts all modes that occur in
292 definition and uses. */
293 for (tmp = this_head->first; tmp; tmp = tmp->next_use)
294 if ((! HARD_REGNO_MODE_OK (new_reg, GET_MODE (*tmp->loc))
295 && ! DEBUG_INSN_P (tmp->insn))
296 || (this_head->need_caller_save_reg
297 && ! (HARD_REGNO_CALL_PART_CLOBBERED
298 (reg, GET_MODE (*tmp->loc)))
299 && (HARD_REGNO_CALL_PART_CLOBBERED
300 (new_reg, GET_MODE (*tmp->loc)))))
301 break;
302 if (! tmp)
303 {
304 if (tick[best_new_reg] > tick[new_reg])
305 {
306 best_new_reg = new_reg;
307 best_nregs = nregs;
308 }
309 }
310 }
311
312 if (dump_file)
313 {
314 fprintf (dump_file, "Register %s in insn %d",
315 reg_names[reg], INSN_UID (this_head->first->insn));
316 if (this_head->need_caller_save_reg)
317 fprintf (dump_file, " crosses a call");
318 }
319
320 if (best_new_reg == reg)
321 {
322 tick[reg] = ++this_tick;
323 if (dump_file)
324 fprintf (dump_file, "; no available better choice\n");
325 continue;
326 }
327
328 if (dump_file)
329 fprintf (dump_file, ", renamed as %s\n", reg_names[best_new_reg]);
330
331 do_replace (this_head, best_new_reg);
332 this_head->regno = best_new_reg;
333 this_head->nregs = best_nregs;
334 tick[best_new_reg] = ++this_tick;
335 df_set_regs_ever_live (best_new_reg, true);
336 }
337
338 free_chain_data ();
339 obstack_free (&rename_obstack, first_obj);
340 }
341
342 obstack_free (&rename_obstack, NULL);
343
344 if (dump_file)
345 fputc ('\n', dump_file);
346
347 return 0;
348 }
349
350 static void
351 do_replace (struct du_head *head, int reg)
352 {
353 struct du_chain *chain;
354 unsigned int base_regno = head->regno;
355 bool found_note = false;
356
357 gcc_assert (! DEBUG_INSN_P (head->first->insn));
358
359 for (chain = head->first; chain; chain = chain->next_use)
360 {
361 unsigned int regno = ORIGINAL_REGNO (*chain->loc);
362 struct reg_attrs *attr = REG_ATTRS (*chain->loc);
363 int reg_ptr = REG_POINTER (*chain->loc);
364
365 if (DEBUG_INSN_P (chain->insn) && REGNO (*chain->loc) != base_regno)
366 INSN_VAR_LOCATION_LOC (chain->insn) = gen_rtx_UNKNOWN_VAR_LOC ();
367 else
368 {
369 rtx note;
370
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
377 for (note = REG_NOTES (chain->insn); note; note = XEXP (note, 1))
378 {
379 enum reg_note kind = REG_NOTE_KIND (note);
380 if (kind == REG_DEAD || kind == REG_UNUSED)
381 {
382 rtx reg = XEXP (note, 0);
383 gcc_assert (HARD_REGISTER_P (reg));
384
385 if (REGNO (reg) == base_regno)
386 {
387 found_note = true;
388 if (kind == REG_DEAD
389 && reg_set_p (*chain->loc, chain->insn))
390 remove_note (chain->insn, note);
391 else
392 XEXP (note, 0) = *chain->loc;
393 break;
394 }
395 }
396 }
397 }
398
399 df_insn_rescan (chain->insn);
400 }
401 if (!found_note)
402 {
403 /* If the chain's first insn is the same as the last, we should have
404 found a REG_UNUSED note. */
405 gcc_assert (head->first->insn != head->last->insn);
406 if (!reg_set_p (*head->last->loc, head->last->insn))
407 add_reg_note (head->last->insn, REG_DEAD, *head->last->loc);
408 }
409 }
410
411
412 /* Walk all chains starting with CHAINS and record that they conflict with
413 another chain whose id is ID. */
414
415 static void
416 mark_conflict (struct du_head *chains, unsigned id)
417 {
418 while (chains)
419 {
420 bitmap_set_bit (&chains->conflicts, id);
421 chains = chains->next_chain;
422 }
423 }
424
425 /* True if we found a register with a size mismatch, which means that we
426 can't track its lifetime accurately. If so, we abort the current block
427 without renaming. */
428 static bool fail_current_block;
429
430 /* The id to be given to the next opened chain. */
431 static unsigned current_id;
432
433 /* List of currently open chains, and closed chains that can be renamed. */
434 static struct du_head *open_chains;
435 static struct du_head *closed_chains;
436
437 /* Conflict bitmaps, tracking the live chains and the live hard registers.
438 The bits set in open_chains_set always match the list found in
439 open_chains. */
440 static bitmap_head open_chains_set;
441 static HARD_REG_SET live_hard_regs;
442
443 /* Called through note_stores. DATA points to a rtx_code, either SET or
444 CLOBBER, which tells us which kind of rtx to look at. If we have a
445 match, record the set register in live_hard_regs and in the hard_conflicts
446 bitmap of open chains. */
447
448 static void
449 note_sets_clobbers (rtx x, const_rtx set, void *data)
450 {
451 enum rtx_code code = *(enum rtx_code *)data;
452 struct du_head *chain;
453
454 if (GET_CODE (x) == SUBREG)
455 x = SUBREG_REG (x);
456 if (!REG_P (x) || GET_CODE (set) != code)
457 return;
458 /* There must not be pseudos at this point. */
459 gcc_assert (HARD_REGISTER_P (x));
460 add_to_hard_reg_set (&live_hard_regs, GET_MODE (x), REGNO (x));
461 for (chain = open_chains; chain; chain = chain->next_chain)
462 add_to_hard_reg_set (&chain->hard_conflicts, GET_MODE (x), REGNO (x));
463 }
464
465 static void
466 scan_rtx_reg (rtx insn, rtx *loc, enum reg_class cl, enum scan_actions action,
467 enum op_type type)
468 {
469 struct du_head **p;
470 rtx x = *loc;
471 enum machine_mode mode = GET_MODE (x);
472 unsigned this_regno = REGNO (x);
473 unsigned this_nregs = hard_regno_nregs[this_regno][mode];
474
475 if (action == mark_write)
476 {
477 if (type == OP_OUT)
478 {
479 struct du_head *head = XOBNEW (&rename_obstack, struct du_head);
480 struct du_chain *this_du = XOBNEW (&rename_obstack, struct du_chain);
481 int nregs;
482
483 head->next_chain = open_chains;
484 open_chains = head;
485 head->first = head->last = this_du;
486 head->regno = this_regno;
487 head->nregs = this_nregs;
488 head->need_caller_save_reg = 0;
489 head->cannot_rename = 0;
490 head->terminated = 0;
491
492 VEC_safe_push (du_head_p, heap, id_to_chain, head);
493 head->id = current_id++;
494
495 bitmap_initialize (&head->conflicts, &bitmap_default_obstack);
496 bitmap_copy (&head->conflicts, &open_chains_set);
497 mark_conflict (open_chains, head->id);
498
499 /* Since we're tracking this as a chain now, remove it from the
500 list of conflicting live hard registers. */
501 nregs = head->nregs;
502 while (nregs-- > 0)
503 CLEAR_HARD_REG_BIT (live_hard_regs, head->regno + nregs);
504
505 COPY_HARD_REG_SET (head->hard_conflicts, live_hard_regs);
506 bitmap_set_bit (&open_chains_set, head->id);
507
508 open_chains = head;
509
510 this_du->next_use = 0;
511 this_du->loc = loc;
512 this_du->insn = insn;
513 this_du->cl = cl;
514
515 if (dump_file)
516 fprintf (dump_file,
517 "Creating chain %s (%d) at insn %d (%s)\n",
518 reg_names[head->regno], head->id, INSN_UID (insn),
519 scan_actions_name[(int) action]);
520 }
521 return;
522 }
523
524 if ((type == OP_OUT) != (action == terminate_write || action == mark_access))
525 return;
526
527 for (p = &open_chains; *p;)
528 {
529 struct du_head *head = *p;
530 struct du_head *next = head->next_chain;
531 int exact_match = (head->regno == this_regno
532 && head->nregs == this_nregs);
533 int superset = (this_regno <= head->regno
534 && this_regno + this_nregs >= head->regno + head->nregs);
535
536 if (head->terminated
537 || head->regno + head->nregs <= this_regno
538 || this_regno + this_nregs <= head->regno)
539 {
540 p = &head->next_chain;
541 continue;
542 }
543
544 if (action == mark_read || action == mark_access)
545 {
546 /* ??? Class NO_REGS can happen if the md file makes use of
547 EXTRA_CONSTRAINTS to match registers. Which is arguably
548 wrong, but there we are. */
549
550 if (cl == NO_REGS || (!exact_match && !DEBUG_INSN_P (insn)))
551 {
552 if (dump_file)
553 fprintf (dump_file,
554 "Cannot rename chain %s (%d) at insn %d (%s)\n",
555 reg_names[head->regno], head->id, INSN_UID (insn),
556 scan_actions_name[(int) action]);
557 head->cannot_rename = 1;
558 }
559 else
560 {
561 struct du_chain *this_du;
562 this_du = XOBNEW (&rename_obstack, struct du_chain);
563 this_du->next_use = 0;
564 this_du->loc = loc;
565 this_du->insn = insn;
566 this_du->cl = cl;
567 head->last->next_use = this_du;
568 head->last = this_du;
569
570 }
571 /* Avoid adding the same location in a DEBUG_INSN multiple times,
572 which could happen with non-exact overlap. */
573 if (DEBUG_INSN_P (insn))
574 return;
575 /* Otherwise, find any other chains that do not match exactly;
576 ensure they all get marked unrenamable. */
577 p = &head->next_chain;
578 continue;
579 }
580
581 /* Whether the terminated chain can be used for renaming
582 depends on the action and this being an exact match.
583 In either case, we remove this element from open_chains. */
584
585 if ((action == terminate_dead || action == terminate_write)
586 && superset)
587 {
588 head->terminated = 1;
589 head->next_chain = closed_chains;
590 closed_chains = head;
591 bitmap_clear_bit (&open_chains_set, head->id);
592 *p = next;
593 if (dump_file)
594 fprintf (dump_file,
595 "Closing chain %s (%d) at insn %d (%s)\n",
596 reg_names[head->regno], head->id, INSN_UID (insn),
597 scan_actions_name[(int) action]);
598 }
599 else if (action == terminate_dead || action == terminate_write)
600 {
601 /* In this case, tracking liveness gets too hard. Fail the
602 entire basic block. */
603 if (dump_file)
604 fprintf (dump_file,
605 "Failing basic block due to unhandled overlap\n");
606 fail_current_block = true;
607 return;
608 }
609 else
610 {
611 head->cannot_rename = 1;
612 if (dump_file)
613 fprintf (dump_file,
614 "Cannot rename chain %s (%d) at insn %d (%s)\n",
615 reg_names[head->regno], head->id, INSN_UID (insn),
616 scan_actions_name[(int) action]);
617 p = &head->next_chain;
618 }
619 }
620 }
621
622 /* Adapted from find_reloads_address_1. CL is INDEX_REG_CLASS or
623 BASE_REG_CLASS depending on how the register is being considered. */
624
625 static void
626 scan_rtx_address (rtx insn, rtx *loc, enum reg_class cl,
627 enum scan_actions action, enum machine_mode mode)
628 {
629 rtx x = *loc;
630 RTX_CODE code = GET_CODE (x);
631 const char *fmt;
632 int i, j;
633
634 if (action == mark_write || action == mark_access)
635 return;
636
637 switch (code)
638 {
639 case PLUS:
640 {
641 rtx orig_op0 = XEXP (x, 0);
642 rtx orig_op1 = XEXP (x, 1);
643 RTX_CODE code0 = GET_CODE (orig_op0);
644 RTX_CODE code1 = GET_CODE (orig_op1);
645 rtx op0 = orig_op0;
646 rtx op1 = orig_op1;
647 rtx *locI = NULL;
648 rtx *locB = NULL;
649 enum rtx_code index_code = SCRATCH;
650
651 if (GET_CODE (op0) == SUBREG)
652 {
653 op0 = SUBREG_REG (op0);
654 code0 = GET_CODE (op0);
655 }
656
657 if (GET_CODE (op1) == SUBREG)
658 {
659 op1 = SUBREG_REG (op1);
660 code1 = GET_CODE (op1);
661 }
662
663 if (code0 == MULT || code0 == SIGN_EXTEND || code0 == TRUNCATE
664 || code0 == ZERO_EXTEND || code1 == MEM)
665 {
666 locI = &XEXP (x, 0);
667 locB = &XEXP (x, 1);
668 index_code = GET_CODE (*locI);
669 }
670 else if (code1 == MULT || code1 == SIGN_EXTEND || code1 == TRUNCATE
671 || code1 == ZERO_EXTEND || code0 == MEM)
672 {
673 locI = &XEXP (x, 1);
674 locB = &XEXP (x, 0);
675 index_code = GET_CODE (*locI);
676 }
677 else if (code0 == CONST_INT || code0 == CONST
678 || code0 == SYMBOL_REF || code0 == LABEL_REF)
679 {
680 locB = &XEXP (x, 1);
681 index_code = GET_CODE (XEXP (x, 0));
682 }
683 else if (code1 == CONST_INT || code1 == CONST
684 || code1 == SYMBOL_REF || code1 == LABEL_REF)
685 {
686 locB = &XEXP (x, 0);
687 index_code = GET_CODE (XEXP (x, 1));
688 }
689 else if (code0 == REG && code1 == REG)
690 {
691 int index_op;
692 unsigned regno0 = REGNO (op0), regno1 = REGNO (op1);
693
694 if (REGNO_OK_FOR_INDEX_P (regno1)
695 && regno_ok_for_base_p (regno0, mode, PLUS, REG))
696 index_op = 1;
697 else if (REGNO_OK_FOR_INDEX_P (regno0)
698 && regno_ok_for_base_p (regno1, mode, PLUS, REG))
699 index_op = 0;
700 else if (regno_ok_for_base_p (regno0, mode, PLUS, REG)
701 || REGNO_OK_FOR_INDEX_P (regno1))
702 index_op = 1;
703 else if (regno_ok_for_base_p (regno1, mode, PLUS, REG))
704 index_op = 0;
705 else
706 index_op = 1;
707
708 locI = &XEXP (x, index_op);
709 locB = &XEXP (x, !index_op);
710 index_code = GET_CODE (*locI);
711 }
712 else if (code0 == REG)
713 {
714 locI = &XEXP (x, 0);
715 locB = &XEXP (x, 1);
716 index_code = GET_CODE (*locI);
717 }
718 else if (code1 == REG)
719 {
720 locI = &XEXP (x, 1);
721 locB = &XEXP (x, 0);
722 index_code = GET_CODE (*locI);
723 }
724
725 if (locI)
726 scan_rtx_address (insn, locI, INDEX_REG_CLASS, action, mode);
727 if (locB)
728 scan_rtx_address (insn, locB, base_reg_class (mode, PLUS, index_code),
729 action, mode);
730
731 return;
732 }
733
734 case POST_INC:
735 case POST_DEC:
736 case POST_MODIFY:
737 case PRE_INC:
738 case PRE_DEC:
739 case PRE_MODIFY:
740 #ifndef AUTO_INC_DEC
741 /* If the target doesn't claim to handle autoinc, this must be
742 something special, like a stack push. Kill this chain. */
743 action = mark_all_read;
744 #endif
745 break;
746
747 case MEM:
748 scan_rtx_address (insn, &XEXP (x, 0),
749 base_reg_class (GET_MODE (x), MEM, SCRATCH), action,
750 GET_MODE (x));
751 return;
752
753 case REG:
754 scan_rtx_reg (insn, loc, cl, action, OP_IN);
755 return;
756
757 default:
758 break;
759 }
760
761 fmt = GET_RTX_FORMAT (code);
762 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
763 {
764 if (fmt[i] == 'e')
765 scan_rtx_address (insn, &XEXP (x, i), cl, action, mode);
766 else if (fmt[i] == 'E')
767 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
768 scan_rtx_address (insn, &XVECEXP (x, i, j), cl, action, mode);
769 }
770 }
771
772 static void
773 scan_rtx (rtx insn, rtx *loc, enum reg_class cl, enum scan_actions action,
774 enum op_type type)
775 {
776 const char *fmt;
777 rtx x = *loc;
778 enum rtx_code code = GET_CODE (x);
779 int i, j;
780
781 code = GET_CODE (x);
782 switch (code)
783 {
784 case CONST:
785 case CONST_INT:
786 case CONST_DOUBLE:
787 case CONST_FIXED:
788 case CONST_VECTOR:
789 case SYMBOL_REF:
790 case LABEL_REF:
791 case CC0:
792 case PC:
793 return;
794
795 case REG:
796 scan_rtx_reg (insn, loc, cl, action, type);
797 return;
798
799 case MEM:
800 scan_rtx_address (insn, &XEXP (x, 0),
801 base_reg_class (GET_MODE (x), MEM, SCRATCH), action,
802 GET_MODE (x));
803 return;
804
805 case SET:
806 scan_rtx (insn, &SET_SRC (x), cl, action, OP_IN);
807 scan_rtx (insn, &SET_DEST (x), cl, action,
808 GET_CODE (PATTERN (insn)) == COND_EXEC ? OP_INOUT : OP_OUT);
809 return;
810
811 case STRICT_LOW_PART:
812 scan_rtx (insn, &XEXP (x, 0), cl, action, OP_INOUT);
813 return;
814
815 case ZERO_EXTRACT:
816 case SIGN_EXTRACT:
817 scan_rtx (insn, &XEXP (x, 0), cl, action,
818 type == OP_IN ? OP_IN : OP_INOUT);
819 scan_rtx (insn, &XEXP (x, 1), cl, action, OP_IN);
820 scan_rtx (insn, &XEXP (x, 2), cl, action, OP_IN);
821 return;
822
823 case POST_INC:
824 case PRE_INC:
825 case POST_DEC:
826 case PRE_DEC:
827 case POST_MODIFY:
828 case PRE_MODIFY:
829 /* Should only happen inside MEM. */
830 gcc_unreachable ();
831
832 case CLOBBER:
833 scan_rtx (insn, &SET_DEST (x), cl, action,
834 GET_CODE (PATTERN (insn)) == COND_EXEC ? OP_INOUT : OP_OUT);
835 return;
836
837 case EXPR_LIST:
838 scan_rtx (insn, &XEXP (x, 0), cl, action, type);
839 if (XEXP (x, 1))
840 scan_rtx (insn, &XEXP (x, 1), cl, action, type);
841 return;
842
843 default:
844 break;
845 }
846
847 fmt = GET_RTX_FORMAT (code);
848 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
849 {
850 if (fmt[i] == 'e')
851 scan_rtx (insn, &XEXP (x, i), cl, action, type);
852 else if (fmt[i] == 'E')
853 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
854 scan_rtx (insn, &XVECEXP (x, i, j), cl, action, type);
855 }
856 }
857
858 /* Hide operands of the current insn (of which there are N_OPS) by
859 substituting cc0 for them.
860 Previous values are stored in the OLD_OPERANDS and OLD_DUPS.
861 If INOUT_AND_EC_ONLY is set, we only do this for OP_INOUT type operands
862 and earlyclobbers. */
863
864 static void
865 hide_operands (int n_ops, rtx *old_operands, rtx *old_dups,
866 bool inout_and_ec_only)
867 {
868 int i;
869 int alt = which_alternative;
870 for (i = 0; i < n_ops; i++)
871 {
872 old_operands[i] = recog_data.operand[i];
873 /* Don't squash match_operator or match_parallel here, since
874 we don't know that all of the contained registers are
875 reachable by proper operands. */
876 if (recog_data.constraints[i][0] == '\0')
877 continue;
878 if (!inout_and_ec_only || recog_data.operand_type[i] == OP_INOUT
879 || recog_op_alt[i][alt].earlyclobber)
880 *recog_data.operand_loc[i] = cc0_rtx;
881 }
882 for (i = 0; i < recog_data.n_dups; i++)
883 {
884 int opn = recog_data.dup_num[i];
885 old_dups[i] = *recog_data.dup_loc[i];
886 if (!inout_and_ec_only || recog_data.operand_type[opn] == OP_INOUT
887 || recog_op_alt[opn][alt].earlyclobber)
888 *recog_data.dup_loc[i] = cc0_rtx;
889 }
890 }
891
892 /* Undo the substitution performed by hide_operands. INSN is the insn we
893 are processing; the arguments are the same as in hide_operands. */
894
895 static void
896 restore_operands (rtx insn, int n_ops, rtx *old_operands, rtx *old_dups)
897 {
898 int i;
899 for (i = 0; i < recog_data.n_dups; i++)
900 *recog_data.dup_loc[i] = old_dups[i];
901 for (i = 0; i < n_ops; i++)
902 *recog_data.operand_loc[i] = old_operands[i];
903 if (recog_data.n_dups)
904 df_insn_rescan (insn);
905 }
906
907 /* For each output operand of INSN, call scan_rtx to create a new
908 open chain. Do this only for normal or earlyclobber outputs,
909 depending on EARLYCLOBBER. */
910
911 static void
912 record_out_operands (rtx insn, bool earlyclobber)
913 {
914 int n_ops = recog_data.n_operands;
915 int alt = which_alternative;
916
917 int i;
918
919 for (i = 0; i < n_ops + recog_data.n_dups; i++)
920 {
921 int opn = i < n_ops ? i : recog_data.dup_num[i - n_ops];
922 rtx *loc = (i < n_ops
923 ? recog_data.operand_loc[opn]
924 : recog_data.dup_loc[i - n_ops]);
925 rtx op = *loc;
926 enum reg_class cl = recog_op_alt[opn][alt].cl;
927
928 struct du_head *prev_open;
929
930 if (recog_data.operand_type[opn] != OP_OUT
931 || recog_op_alt[opn][alt].earlyclobber != earlyclobber)
932 continue;
933
934 prev_open = open_chains;
935 scan_rtx (insn, loc, cl, mark_write, OP_OUT);
936
937 /* ??? Many targets have output constraints on the SET_DEST
938 of a call insn, which is stupid, since these are certainly
939 ABI defined hard registers. For these, and for asm operands
940 that originally referenced hard registers, we must record that
941 the chain cannot be renamed. */
942 if (CALL_P (insn)
943 || (asm_noperands (PATTERN (insn)) > 0
944 && REG_P (op)
945 && REGNO (op) == ORIGINAL_REGNO (op)))
946 {
947 if (prev_open != open_chains)
948 open_chains->cannot_rename = 1;
949 }
950 }
951 }
952
953 /* Build def/use chain. */
954
955 static struct du_head *
956 build_def_use (basic_block bb)
957 {
958 rtx insn;
959 df_ref *def_rec;
960
961 open_chains = closed_chains = NULL;
962
963 fail_current_block = false;
964
965 current_id = 0;
966 bitmap_initialize (&open_chains_set, &bitmap_default_obstack);
967 REG_SET_TO_HARD_REG_SET (live_hard_regs, df_get_live_in (bb));
968 for (def_rec = df_get_artificial_defs (bb->index); *def_rec; def_rec++)
969 {
970 df_ref def = *def_rec;
971 if (DF_REF_FLAGS (def) & DF_REF_AT_TOP)
972 SET_HARD_REG_BIT (live_hard_regs, DF_REF_REGNO (def));
973 }
974
975 for (insn = BB_HEAD (bb); ; insn = NEXT_INSN (insn))
976 {
977 if (NONDEBUG_INSN_P (insn))
978 {
979 int n_ops;
980 rtx note;
981 rtx old_operands[MAX_RECOG_OPERANDS];
982 rtx old_dups[MAX_DUP_OPERANDS];
983 int i;
984 int alt;
985 int predicated;
986 enum rtx_code set_code = SET;
987 enum rtx_code clobber_code = CLOBBER;
988
989 /* Process the insn, determining its effect on the def-use
990 chains and live hard registers. We perform the following
991 steps with the register references in the insn, simulating
992 its effect:
993 (1) Deal with earlyclobber operands and CLOBBERs of non-operands
994 by creating chains and marking hard regs live.
995 (2) Any read outside an operand causes any chain it overlaps
996 with to be marked unrenamable.
997 (3) Any read inside an operand is added if there's already
998 an open chain for it.
999 (4) For any REG_DEAD note we find, close open chains that
1000 overlap it.
1001 (5) For any non-earlyclobber write we find, close open chains
1002 that overlap it.
1003 (6) For any non-earlyclobber write we find in an operand, make
1004 a new chain or mark the hard register as live.
1005 (7) For any REG_UNUSED, close any chains we just opened.
1006
1007 We cannot deal with situations where we track a reg in one mode
1008 and see a reference in another mode; these will cause the chain
1009 to be marked unrenamable or even cause us to abort the entire
1010 basic block. */
1011
1012 extract_insn (insn);
1013 if (! constrain_operands (1))
1014 fatal_insn_not_found (insn);
1015 preprocess_constraints ();
1016 alt = which_alternative;
1017 n_ops = recog_data.n_operands;
1018
1019 /* Simplify the code below by rewriting things to reflect
1020 matching constraints. Also promote OP_OUT to OP_INOUT
1021 in predicated instructions. */
1022
1023 predicated = GET_CODE (PATTERN (insn)) == COND_EXEC;
1024 for (i = 0; i < n_ops; ++i)
1025 {
1026 int matches = recog_op_alt[i][alt].matches;
1027 if (matches >= 0)
1028 recog_op_alt[i][alt].cl = recog_op_alt[matches][alt].cl;
1029 if (matches >= 0 || recog_op_alt[i][alt].matched >= 0
1030 || (predicated && recog_data.operand_type[i] == OP_OUT))
1031 {
1032 recog_data.operand_type[i] = OP_INOUT;
1033 if (matches >= 0
1034 && (GET_MODE_SIZE (recog_data.operand_mode[i])
1035 != GET_MODE_SIZE (recog_data.operand_mode[matches])))
1036 fail_current_block = true;
1037 }
1038 }
1039
1040 if (fail_current_block)
1041 break;
1042
1043 /* Step 1a: Mark hard registers that are clobbered in this insn,
1044 outside an operand, as live. */
1045 hide_operands (n_ops, old_operands, old_dups, false);
1046 note_stores (PATTERN (insn), note_sets_clobbers, &clobber_code);
1047 restore_operands (insn, n_ops, old_operands, old_dups);
1048
1049 /* Step 1b: Begin new chains for earlyclobbered writes inside
1050 operands. */
1051 record_out_operands (insn, true);
1052
1053 /* Step 2: Mark chains for which we have reads outside operands
1054 as unrenamable.
1055 We do this by munging all operands into CC0, and closing
1056 everything remaining. */
1057
1058 hide_operands (n_ops, old_operands, old_dups, false);
1059 scan_rtx (insn, &PATTERN (insn), NO_REGS, mark_all_read, OP_IN);
1060 restore_operands (insn, n_ops, old_operands, old_dups);
1061
1062 /* Step 2B: Can't rename function call argument registers. */
1063 if (CALL_P (insn) && CALL_INSN_FUNCTION_USAGE (insn))
1064 scan_rtx (insn, &CALL_INSN_FUNCTION_USAGE (insn),
1065 NO_REGS, mark_all_read, OP_IN);
1066
1067 /* Step 2C: Can't rename asm operands that were originally
1068 hard registers. */
1069 if (asm_noperands (PATTERN (insn)) > 0)
1070 for (i = 0; i < n_ops; i++)
1071 {
1072 rtx *loc = recog_data.operand_loc[i];
1073 rtx op = *loc;
1074
1075 if (REG_P (op)
1076 && REGNO (op) == ORIGINAL_REGNO (op)
1077 && (recog_data.operand_type[i] == OP_IN
1078 || recog_data.operand_type[i] == OP_INOUT))
1079 scan_rtx (insn, loc, NO_REGS, mark_all_read, OP_IN);
1080 }
1081
1082 /* Step 3: Append to chains for reads inside operands. */
1083 for (i = 0; i < n_ops + recog_data.n_dups; i++)
1084 {
1085 int opn = i < n_ops ? i : recog_data.dup_num[i - n_ops];
1086 rtx *loc = (i < n_ops
1087 ? recog_data.operand_loc[opn]
1088 : recog_data.dup_loc[i - n_ops]);
1089 enum reg_class cl = recog_op_alt[opn][alt].cl;
1090 enum op_type type = recog_data.operand_type[opn];
1091
1092 /* Don't scan match_operand here, since we've no reg class
1093 information to pass down. Any operands that we could
1094 substitute in will be represented elsewhere. */
1095 if (recog_data.constraints[opn][0] == '\0')
1096 continue;
1097
1098 if (recog_op_alt[opn][alt].is_address)
1099 scan_rtx_address (insn, loc, cl, mark_read, VOIDmode);
1100 else
1101 scan_rtx (insn, loc, cl, mark_read, type);
1102 }
1103
1104 /* Step 3B: Record updates for regs in REG_INC notes, and
1105 source regs in REG_FRAME_RELATED_EXPR notes. */
1106 for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
1107 if (REG_NOTE_KIND (note) == REG_INC
1108 || REG_NOTE_KIND (note) == REG_FRAME_RELATED_EXPR)
1109 scan_rtx (insn, &XEXP (note, 0), ALL_REGS, mark_read,
1110 OP_INOUT);
1111
1112 /* Step 4: Close chains for registers that die here. */
1113 for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
1114 if (REG_NOTE_KIND (note) == REG_DEAD)
1115 {
1116 remove_from_hard_reg_set (&live_hard_regs,
1117 GET_MODE (XEXP (note, 0)),
1118 REGNO (XEXP (note, 0)));
1119 scan_rtx (insn, &XEXP (note, 0), NO_REGS, terminate_dead,
1120 OP_IN);
1121 }
1122
1123 /* Step 4B: If this is a call, any chain live at this point
1124 requires a caller-saved reg. */
1125 if (CALL_P (insn))
1126 {
1127 struct du_head *p;
1128 for (p = open_chains; p; p = p->next_chain)
1129 p->need_caller_save_reg = 1;
1130 }
1131
1132 /* Step 5: Close open chains that overlap writes. Similar to
1133 step 2, we hide in-out operands, since we do not want to
1134 close these chains. We also hide earlyclobber operands,
1135 since we've opened chains for them in step 1, and earlier
1136 chains they would overlap with must have been closed at
1137 the previous insn at the latest, as such operands cannot
1138 possibly overlap with any input operands. */
1139
1140 hide_operands (n_ops, old_operands, old_dups, true);
1141 scan_rtx (insn, &PATTERN (insn), NO_REGS, terminate_write, OP_IN);
1142 restore_operands (insn, n_ops, old_operands, old_dups);
1143
1144 /* Step 6a: Mark hard registers that are set in this insn,
1145 outside an operand, as live. */
1146 hide_operands (n_ops, old_operands, old_dups, false);
1147 note_stores (PATTERN (insn), note_sets_clobbers, &set_code);
1148 restore_operands (insn, n_ops, old_operands, old_dups);
1149
1150 /* Step 6b: Begin new chains for writes inside operands. */
1151 record_out_operands (insn, false);
1152
1153 /* Step 6c: Record destination regs in REG_FRAME_RELATED_EXPR
1154 notes for update. */
1155 for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
1156 if (REG_NOTE_KIND (note) == REG_FRAME_RELATED_EXPR)
1157 scan_rtx (insn, &XEXP (note, 0), ALL_REGS, mark_access,
1158 OP_INOUT);
1159
1160 /* Step 7: Close chains for registers that were never
1161 really used here. */
1162 for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
1163 if (REG_NOTE_KIND (note) == REG_UNUSED)
1164 {
1165 remove_from_hard_reg_set (&live_hard_regs,
1166 GET_MODE (XEXP (note, 0)),
1167 REGNO (XEXP (note, 0)));
1168 scan_rtx (insn, &XEXP (note, 0), NO_REGS, terminate_dead,
1169 OP_IN);
1170 }
1171 }
1172 else if (DEBUG_INSN_P (insn)
1173 && !VAR_LOC_UNKNOWN_P (INSN_VAR_LOCATION_LOC (insn)))
1174 {
1175 scan_rtx (insn, &INSN_VAR_LOCATION_LOC (insn),
1176 ALL_REGS, mark_read, OP_IN);
1177 }
1178 if (insn == BB_END (bb))
1179 break;
1180 }
1181
1182 bitmap_clear (&open_chains_set);
1183
1184 if (fail_current_block)
1185 return NULL;
1186
1187 /* Since we close every chain when we find a REG_DEAD note, anything that
1188 is still open lives past the basic block, so it can't be renamed. */
1189 return closed_chains;
1190 }
1191
1192 /* Dump all def/use chains in CHAINS to DUMP_FILE. They are
1193 printed in reverse order as that's how we build them. */
1194
1195 static void
1196 dump_def_use_chain (struct du_head *head)
1197 {
1198 while (head)
1199 {
1200 struct du_chain *this_du = head->first;
1201 fprintf (dump_file, "Register %s (%d):",
1202 reg_names[head->regno], head->nregs);
1203 while (this_du)
1204 {
1205 fprintf (dump_file, " %d [%s]", INSN_UID (this_du->insn),
1206 reg_class_names[this_du->cl]);
1207 this_du = this_du->next_use;
1208 }
1209 fprintf (dump_file, "\n");
1210 head = head->next_chain;
1211 }
1212 }
1213
1214 \f
1215 static bool
1216 gate_handle_regrename (void)
1217 {
1218 return (optimize > 0 && (flag_rename_registers));
1219 }
1220
1221 struct rtl_opt_pass pass_regrename =
1222 {
1223 {
1224 RTL_PASS,
1225 "rnreg", /* name */
1226 gate_handle_regrename, /* gate */
1227 regrename_optimize, /* execute */
1228 NULL, /* sub */
1229 NULL, /* next */
1230 0, /* static_pass_number */
1231 TV_RENAME_REGISTERS, /* tv_id */
1232 0, /* properties_required */
1233 0, /* properties_provided */
1234 0, /* properties_destroyed */
1235 0, /* todo_flags_start */
1236 TODO_df_finish | TODO_verify_rtl_sharing |
1237 TODO_dump_func /* todo_flags_finish */
1238 }
1239 };
1240