Tie chains for move instructions.
[gcc.git] / gcc / regrename.c
1 /* Register renaming for the GNU compiler.
2 Copyright (C) 2000-2015 Free Software Foundation, Inc.
3
4 This file is part of GCC.
5
6 GCC is free software; you can redistribute it and/or modify it
7 under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3, or (at your option)
9 any later version.
10
11 GCC is distributed in the hope that it will be useful, but WITHOUT
12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
14 License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3. If not see
18 <http://www.gnu.org/licenses/>. */
19
20 #include "config.h"
21 #include "system.h"
22 #include "coretypes.h"
23 #include "backend.h"
24 #include "target.h"
25 #include "rtl.h"
26 #include "df.h"
27 #include "tm_p.h"
28 #include "insn-config.h"
29 #include "regs.h"
30 #include "emit-rtl.h"
31 #include "recog.h"
32 #include "addresses.h"
33 #include "cfganal.h"
34 #include "tree-pass.h"
35 #include "regrename.h"
36
37 /* This file implements the RTL register renaming pass of the compiler. It is
38 a semi-local pass whose goal is to maximize the usage of the register file
39 of the processor by substituting registers for others in the solution given
40 by the register allocator. The algorithm is as follows:
41
42 1. Local def/use chains are built: within each basic block, chains are
43 opened and closed; if a chain isn't closed at the end of the block,
44 it is dropped. We pre-open chains if we have already examined a
45 predecessor block and found chains live at the end which match
46 live registers at the start of the new block.
47
48 2. We try to combine the local chains across basic block boundaries by
49 comparing chains that were open at the start or end of a block to
50 those in successor/predecessor blocks.
51
52 3. For each chain, the set of possible renaming registers is computed.
53 This takes into account the renaming of previously processed chains.
54 Optionally, a preferred class is computed for the renaming register.
55
56 4. The best renaming register is computed for the chain in the above set,
57 using a round-robin allocation. If a preferred class exists, then the
58 round-robin allocation is done within the class first, if possible.
59 The round-robin allocation of renaming registers itself is global.
60
61 5. If a renaming register has been found, it is substituted in the chain.
62
63 Targets can parameterize the pass by specifying a preferred class for the
64 renaming register for a given (super)class of registers to be renamed. */
65
66 #if HOST_BITS_PER_WIDE_INT <= MAX_RECOG_OPERANDS
67 #error "Use a different bitmap implementation for untracked_operands."
68 #endif
69
70 enum scan_actions
71 {
72 terminate_write,
73 terminate_dead,
74 mark_all_read,
75 mark_read,
76 mark_write,
77 /* mark_access is for marking the destination regs in
78 REG_FRAME_RELATED_EXPR notes (as if they were read) so that the
79 note is updated properly. */
80 mark_access
81 };
82
83 static const char * const scan_actions_name[] =
84 {
85 "terminate_write",
86 "terminate_dead",
87 "mark_all_read",
88 "mark_read",
89 "mark_write",
90 "mark_access"
91 };
92
93 /* TICK and THIS_TICK are used to record the last time we saw each
94 register. */
95 static int tick[FIRST_PSEUDO_REGISTER];
96 static int this_tick = 0;
97
98 static struct obstack rename_obstack;
99
100 /* If nonnull, the code calling into the register renamer requested
101 information about insn operands, and we store it here. */
102 vec<insn_rr_info> insn_rr;
103
104 static void scan_rtx (rtx_insn *, rtx *, enum reg_class, enum scan_actions,
105 enum op_type);
106 static bool build_def_use (basic_block);
107
108 /* The id to be given to the next opened chain. */
109 static unsigned current_id;
110
111 /* A mapping of unique id numbers to chains. */
112 static vec<du_head_p> id_to_chain;
113
114 /* List of currently open chains. */
115 static struct du_head *open_chains;
116
117 /* Bitmap of open chains. The bits set always match the list found in
118 open_chains. */
119 static bitmap_head open_chains_set;
120
121 /* Record the registers being tracked in open_chains. */
122 static HARD_REG_SET live_in_chains;
123
124 /* Record the registers that are live but not tracked. The intersection
125 between this and live_in_chains is empty. */
126 static HARD_REG_SET live_hard_regs;
127
128 /* Set while scanning RTL if INSN_RR is nonnull, i.e. if the current analysis
129 is for a caller that requires operand data. Used in
130 record_operand_use. */
131 static operand_rr_info *cur_operand;
132
133 /* Set while scanning RTL if a register dies. Used to tie chains. */
134 static struct du_head *terminated_this_insn;
135
136 /* Return the chain corresponding to id number ID. Take into account that
137 chains may have been merged. */
138 du_head_p
139 regrename_chain_from_id (unsigned int id)
140 {
141 du_head_p first_chain = id_to_chain[id];
142 du_head_p chain = first_chain;
143 while (chain->id != id)
144 {
145 id = chain->id;
146 chain = id_to_chain[id];
147 }
148 first_chain->id = id;
149 return chain;
150 }
151
152 /* Dump all def/use chains, starting at id FROM. */
153
154 static void
155 dump_def_use_chain (int from)
156 {
157 du_head_p head;
158 int i;
159 FOR_EACH_VEC_ELT_FROM (id_to_chain, i, head, from)
160 {
161 struct du_chain *this_du = head->first;
162
163 fprintf (dump_file, "Register %s (%d):",
164 reg_names[head->regno], head->nregs);
165 while (this_du)
166 {
167 fprintf (dump_file, " %d [%s]", INSN_UID (this_du->insn),
168 reg_class_names[this_du->cl]);
169 this_du = this_du->next_use;
170 }
171 fprintf (dump_file, "\n");
172 head = head->next_chain;
173 }
174 }
175
176 static void
177 free_chain_data (void)
178 {
179 int i;
180 du_head_p ptr;
181 for (i = 0; id_to_chain.iterate (i, &ptr); i++)
182 bitmap_clear (&ptr->conflicts);
183
184 id_to_chain.release ();
185 }
186
187 /* Walk all chains starting with CHAINS and record that they conflict with
188 another chain whose id is ID. */
189
190 static void
191 mark_conflict (struct du_head *chains, unsigned id)
192 {
193 while (chains)
194 {
195 bitmap_set_bit (&chains->conflicts, id);
196 chains = chains->next_chain;
197 }
198 }
199
200 /* Examine cur_operand, and if it is nonnull, record information about the
201 use THIS_DU which is part of the chain HEAD. */
202
203 static void
204 record_operand_use (struct du_head *head, struct du_chain *this_du)
205 {
206 if (cur_operand == NULL)
207 return;
208 gcc_assert (cur_operand->n_chains < MAX_REGS_PER_ADDRESS);
209 cur_operand->heads[cur_operand->n_chains] = head;
210 cur_operand->chains[cur_operand->n_chains++] = this_du;
211 }
212
213 /* Create a new chain for THIS_NREGS registers starting at THIS_REGNO,
214 and record its occurrence in *LOC, which is being written to in INSN.
215 This access requires a register of class CL. */
216
217 static du_head_p
218 create_new_chain (unsigned this_regno, unsigned this_nregs, rtx *loc,
219 rtx_insn *insn, enum reg_class cl)
220 {
221 struct du_head *head = XOBNEW (&rename_obstack, struct du_head);
222 struct du_chain *this_du;
223 int nregs;
224
225 head->next_chain = open_chains;
226 head->regno = this_regno;
227 head->nregs = this_nregs;
228 head->need_caller_save_reg = 0;
229 head->cannot_rename = 0;
230 head->renamed = 0;
231 head->tied_chain = NULL;
232
233 id_to_chain.safe_push (head);
234 head->id = current_id++;
235
236 bitmap_initialize (&head->conflicts, &bitmap_default_obstack);
237 bitmap_copy (&head->conflicts, &open_chains_set);
238 mark_conflict (open_chains, head->id);
239
240 /* Since we're tracking this as a chain now, remove it from the
241 list of conflicting live hard registers and track it in
242 live_in_chains instead. */
243 nregs = head->nregs;
244 while (nregs-- > 0)
245 {
246 SET_HARD_REG_BIT (live_in_chains, head->regno + nregs);
247 CLEAR_HARD_REG_BIT (live_hard_regs, head->regno + nregs);
248 }
249
250 COPY_HARD_REG_SET (head->hard_conflicts, live_hard_regs);
251 bitmap_set_bit (&open_chains_set, head->id);
252
253 open_chains = head;
254
255 if (dump_file)
256 {
257 fprintf (dump_file, "Creating chain %s (%d)",
258 reg_names[head->regno], head->id);
259 if (insn != NULL_RTX)
260 fprintf (dump_file, " at insn %d", INSN_UID (insn));
261 fprintf (dump_file, "\n");
262 }
263
264 if (insn == NULL_RTX)
265 {
266 head->first = head->last = NULL;
267 return head;
268 }
269
270 this_du = XOBNEW (&rename_obstack, struct du_chain);
271 head->first = head->last = this_du;
272
273 this_du->next_use = 0;
274 this_du->loc = loc;
275 this_du->insn = insn;
276 this_du->cl = cl;
277 record_operand_use (head, this_du);
278 return head;
279 }
280
281 /* For a def-use chain HEAD, find which registers overlap its lifetime and
282 set the corresponding bits in *PSET. */
283
284 static void
285 merge_overlapping_regs (HARD_REG_SET *pset, struct du_head *head)
286 {
287 bitmap_iterator bi;
288 unsigned i;
289 IOR_HARD_REG_SET (*pset, head->hard_conflicts);
290 EXECUTE_IF_SET_IN_BITMAP (&head->conflicts, 0, i, bi)
291 {
292 du_head_p other = regrename_chain_from_id (i);
293 unsigned j = other->nregs;
294 gcc_assert (other != head);
295 while (j-- > 0)
296 SET_HARD_REG_BIT (*pset, other->regno + j);
297 }
298 }
299
300 /* Check if NEW_REG can be the candidate register to rename for
301 REG in THIS_HEAD chain. THIS_UNAVAILABLE is a set of unavailable hard
302 registers. */
303
304 static bool
305 check_new_reg_p (int reg ATTRIBUTE_UNUSED, int new_reg,
306 struct du_head *this_head, HARD_REG_SET this_unavailable)
307 {
308 machine_mode mode = GET_MODE (*this_head->first->loc);
309 int nregs = hard_regno_nregs[new_reg][mode];
310 int i;
311 struct du_chain *tmp;
312
313 for (i = nregs - 1; i >= 0; --i)
314 if (TEST_HARD_REG_BIT (this_unavailable, new_reg + i)
315 || fixed_regs[new_reg + i]
316 || global_regs[new_reg + i]
317 /* Can't use regs which aren't saved by the prologue. */
318 || (! df_regs_ever_live_p (new_reg + i)
319 && ! call_used_regs[new_reg + i])
320 #ifdef LEAF_REGISTERS
321 /* We can't use a non-leaf register if we're in a
322 leaf function. */
323 || (crtl->is_leaf
324 && !LEAF_REGISTERS[new_reg + i])
325 #endif
326 || ! HARD_REGNO_RENAME_OK (reg + i, new_reg + i))
327 return false;
328
329 /* See whether it accepts all modes that occur in
330 definition and uses. */
331 for (tmp = this_head->first; tmp; tmp = tmp->next_use)
332 if ((! HARD_REGNO_MODE_OK (new_reg, GET_MODE (*tmp->loc))
333 && ! DEBUG_INSN_P (tmp->insn))
334 || (this_head->need_caller_save_reg
335 && ! (HARD_REGNO_CALL_PART_CLOBBERED
336 (reg, GET_MODE (*tmp->loc)))
337 && (HARD_REGNO_CALL_PART_CLOBBERED
338 (new_reg, GET_MODE (*tmp->loc)))))
339 return false;
340
341 return true;
342 }
343
344 /* For the chain THIS_HEAD, compute and return the best register to
345 rename to. SUPER_CLASS is the superunion of register classes in
346 the chain. UNAVAILABLE is a set of registers that cannot be used.
347 OLD_REG is the register currently used for the chain. BEST_RENAME
348 controls whether the register chosen must be better than the
349 current one or just respect the given constraint. */
350
351 int
352 find_rename_reg (du_head_p this_head, enum reg_class super_class,
353 HARD_REG_SET *unavailable, int old_reg, bool best_rename)
354 {
355 bool has_preferred_class;
356 enum reg_class preferred_class;
357 int pass;
358 int best_new_reg = old_reg;
359
360 /* Further narrow the set of registers we can use for renaming.
361 If the chain needs a call-saved register, mark the call-used
362 registers as unavailable. */
363 if (this_head->need_caller_save_reg)
364 IOR_HARD_REG_SET (*unavailable, call_used_reg_set);
365
366 /* Mark registers that overlap this chain's lifetime as unavailable. */
367 merge_overlapping_regs (unavailable, this_head);
368
369 /* Compute preferred rename class of super union of all the classes
370 in the chain. */
371 preferred_class
372 = (enum reg_class) targetm.preferred_rename_class (super_class);
373
374 /* Pick and check the register from the tied chain iff the tied chain
375 is not renamed. */
376 if (this_head->tied_chain && !this_head->tied_chain->renamed
377 && check_new_reg_p (old_reg, this_head->tied_chain->regno,
378 this_head, *unavailable))
379 return this_head->tied_chain->regno;
380
381 /* If PREFERRED_CLASS is not NO_REGS, we iterate in the first pass
382 over registers that belong to PREFERRED_CLASS and try to find the
383 best register within the class. If that failed, we iterate in
384 the second pass over registers that don't belong to the class.
385 If PREFERRED_CLASS is NO_REGS, we iterate over all registers in
386 ascending order without any preference. */
387 has_preferred_class = (preferred_class != NO_REGS);
388 for (pass = (has_preferred_class ? 0 : 1); pass < 2; pass++)
389 {
390 int new_reg;
391 for (new_reg = 0; new_reg < FIRST_PSEUDO_REGISTER; new_reg++)
392 {
393 if (has_preferred_class
394 && (pass == 0)
395 != TEST_HARD_REG_BIT (reg_class_contents[preferred_class],
396 new_reg))
397 continue;
398
399 if (!check_new_reg_p (old_reg, new_reg, this_head, *unavailable))
400 continue;
401
402 if (!best_rename)
403 return new_reg;
404
405 /* In the first pass, we force the renaming of registers that
406 don't belong to PREFERRED_CLASS to registers that do, even
407 though the latters were used not very long ago. */
408 if ((pass == 0
409 && !TEST_HARD_REG_BIT (reg_class_contents[preferred_class],
410 best_new_reg))
411 || tick[best_new_reg] > tick[new_reg])
412 best_new_reg = new_reg;
413 }
414 if (pass == 0 && best_new_reg != old_reg)
415 break;
416 }
417 return best_new_reg;
418 }
419
420 /* Perform register renaming on the current function. */
421 static void
422 rename_chains (void)
423 {
424 HARD_REG_SET unavailable;
425 du_head_p this_head;
426 int i;
427
428 memset (tick, 0, sizeof tick);
429
430 CLEAR_HARD_REG_SET (unavailable);
431 /* Don't clobber traceback for noreturn functions. */
432 if (frame_pointer_needed)
433 {
434 add_to_hard_reg_set (&unavailable, Pmode, FRAME_POINTER_REGNUM);
435 if (!HARD_FRAME_POINTER_IS_FRAME_POINTER)
436 add_to_hard_reg_set (&unavailable, Pmode, HARD_FRAME_POINTER_REGNUM);
437 }
438
439 FOR_EACH_VEC_ELT (id_to_chain, i, this_head)
440 {
441 int best_new_reg;
442 int n_uses;
443 struct du_chain *tmp;
444 HARD_REG_SET this_unavailable;
445 int reg = this_head->regno;
446 enum reg_class super_class = NO_REGS;
447
448 if (this_head->cannot_rename)
449 continue;
450
451 if (fixed_regs[reg] || global_regs[reg]
452 || (!HARD_FRAME_POINTER_IS_FRAME_POINTER && frame_pointer_needed
453 && reg == HARD_FRAME_POINTER_REGNUM)
454 || (HARD_FRAME_POINTER_REGNUM && frame_pointer_needed
455 && reg == FRAME_POINTER_REGNUM))
456 continue;
457
458 COPY_HARD_REG_SET (this_unavailable, unavailable);
459
460 /* Iterate over elements in the chain in order to:
461 1. Count number of uses, and narrow the set of registers we can
462 use for renaming.
463 2. Compute the superunion of register classes in this chain. */
464 n_uses = 0;
465 super_class = NO_REGS;
466 for (tmp = this_head->first; tmp; tmp = tmp->next_use)
467 {
468 if (DEBUG_INSN_P (tmp->insn))
469 continue;
470 n_uses++;
471 IOR_COMPL_HARD_REG_SET (this_unavailable,
472 reg_class_contents[tmp->cl]);
473 super_class
474 = reg_class_superunion[(int) super_class][(int) tmp->cl];
475 }
476
477 if (n_uses < 2)
478 continue;
479
480 best_new_reg = find_rename_reg (this_head, super_class,
481 &this_unavailable, reg, true);
482
483 if (dump_file)
484 {
485 fprintf (dump_file, "Register %s in insn %d",
486 reg_names[reg], INSN_UID (this_head->first->insn));
487 if (this_head->need_caller_save_reg)
488 fprintf (dump_file, " crosses a call");
489 }
490
491 if (best_new_reg == reg)
492 {
493 tick[reg] = ++this_tick;
494 if (dump_file)
495 fprintf (dump_file, "; no available better choice\n");
496 continue;
497 }
498
499 if (regrename_do_replace (this_head, best_new_reg))
500 {
501 if (dump_file)
502 fprintf (dump_file, ", renamed as %s\n", reg_names[best_new_reg]);
503 tick[best_new_reg] = ++this_tick;
504 df_set_regs_ever_live (best_new_reg, true);
505 }
506 else
507 {
508 if (dump_file)
509 fprintf (dump_file, ", renaming as %s failed\n",
510 reg_names[best_new_reg]);
511 tick[reg] = ++this_tick;
512 }
513 }
514 }
515
516 /* A structure to record information for each hard register at the start of
517 a basic block. */
518 struct incoming_reg_info {
519 /* Holds the number of registers used in the chain that gave us information
520 about this register. Zero means no information known yet, while a
521 negative value is used for something that is part of, but not the first
522 register in a multi-register value. */
523 int nregs;
524 /* Set to true if we have accesses that conflict in the number of registers
525 used. */
526 bool unusable;
527 };
528
529 /* A structure recording information about each basic block. It is saved
530 and restored around basic block boundaries.
531 A pointer to such a structure is stored in each basic block's aux field
532 during regrename_analyze, except for blocks we know can't be optimized
533 (such as entry and exit blocks). */
534 struct bb_rename_info
535 {
536 /* The basic block corresponding to this structure. */
537 basic_block bb;
538 /* Copies of the global information. */
539 bitmap_head open_chains_set;
540 bitmap_head incoming_open_chains_set;
541 struct incoming_reg_info incoming[FIRST_PSEUDO_REGISTER];
542 };
543
544 /* Initialize a rename_info structure P for basic block BB, which starts a new
545 scan. */
546 static void
547 init_rename_info (struct bb_rename_info *p, basic_block bb)
548 {
549 int i;
550 df_ref def;
551 HARD_REG_SET start_chains_set;
552
553 p->bb = bb;
554 bitmap_initialize (&p->open_chains_set, &bitmap_default_obstack);
555 bitmap_initialize (&p->incoming_open_chains_set, &bitmap_default_obstack);
556
557 open_chains = NULL;
558 bitmap_clear (&open_chains_set);
559
560 CLEAR_HARD_REG_SET (live_in_chains);
561 REG_SET_TO_HARD_REG_SET (live_hard_regs, df_get_live_in (bb));
562 FOR_EACH_ARTIFICIAL_DEF (def, bb->index)
563 if (DF_REF_FLAGS (def) & DF_REF_AT_TOP)
564 SET_HARD_REG_BIT (live_hard_regs, DF_REF_REGNO (def));
565
566 /* Open chains based on information from (at least one) predecessor
567 block. This gives us a chance later on to combine chains across
568 basic block boundaries. Inconsistencies (in access sizes) will
569 be caught normally and dealt with conservatively by disabling the
570 chain for renaming, and there is no risk of losing optimization
571 opportunities by opening chains either: if we did not open the
572 chains, we'd have to track the live register as a hard reg, and
573 we'd be unable to rename it in any case. */
574 CLEAR_HARD_REG_SET (start_chains_set);
575 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
576 {
577 struct incoming_reg_info *iri = p->incoming + i;
578 if (iri->nregs > 0 && !iri->unusable
579 && range_in_hard_reg_set_p (live_hard_regs, i, iri->nregs))
580 {
581 SET_HARD_REG_BIT (start_chains_set, i);
582 remove_range_from_hard_reg_set (&live_hard_regs, i, iri->nregs);
583 }
584 }
585 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
586 {
587 struct incoming_reg_info *iri = p->incoming + i;
588 if (TEST_HARD_REG_BIT (start_chains_set, i))
589 {
590 du_head_p chain;
591 if (dump_file)
592 fprintf (dump_file, "opening incoming chain\n");
593 chain = create_new_chain (i, iri->nregs, NULL, NULL, NO_REGS);
594 bitmap_set_bit (&p->incoming_open_chains_set, chain->id);
595 }
596 }
597 }
598
599 /* Record in RI that the block corresponding to it has an incoming
600 live value, described by CHAIN. */
601 static void
602 set_incoming_from_chain (struct bb_rename_info *ri, du_head_p chain)
603 {
604 int i;
605 int incoming_nregs = ri->incoming[chain->regno].nregs;
606 int nregs;
607
608 /* If we've recorded the same information before, everything is fine. */
609 if (incoming_nregs == chain->nregs)
610 {
611 if (dump_file)
612 fprintf (dump_file, "reg %d/%d already recorded\n",
613 chain->regno, chain->nregs);
614 return;
615 }
616
617 /* If we have no information for any of the involved registers, update
618 the incoming array. */
619 nregs = chain->nregs;
620 while (nregs-- > 0)
621 if (ri->incoming[chain->regno + nregs].nregs != 0
622 || ri->incoming[chain->regno + nregs].unusable)
623 break;
624 if (nregs < 0)
625 {
626 nregs = chain->nregs;
627 ri->incoming[chain->regno].nregs = nregs;
628 while (nregs-- > 1)
629 ri->incoming[chain->regno + nregs].nregs = -nregs;
630 if (dump_file)
631 fprintf (dump_file, "recorded reg %d/%d\n",
632 chain->regno, chain->nregs);
633 return;
634 }
635
636 /* There must be some kind of conflict. Prevent both the old and
637 new ranges from being used. */
638 if (incoming_nregs < 0)
639 ri->incoming[chain->regno + incoming_nregs].unusable = true;
640 for (i = 0; i < chain->nregs; i++)
641 ri->incoming[chain->regno + i].unusable = true;
642 }
643
644 /* Merge the two chains C1 and C2 so that all conflict information is
645 recorded and C1, and the id of C2 is changed to that of C1. */
646 static void
647 merge_chains (du_head_p c1, du_head_p c2)
648 {
649 if (c1 == c2)
650 return;
651
652 if (c2->first != NULL)
653 {
654 if (c1->first == NULL)
655 c1->first = c2->first;
656 else
657 c1->last->next_use = c2->first;
658 c1->last = c2->last;
659 }
660
661 c2->first = c2->last = NULL;
662 c2->id = c1->id;
663
664 IOR_HARD_REG_SET (c1->hard_conflicts, c2->hard_conflicts);
665 bitmap_ior_into (&c1->conflicts, &c2->conflicts);
666
667 c1->need_caller_save_reg |= c2->need_caller_save_reg;
668 c1->cannot_rename |= c2->cannot_rename;
669 }
670
671 /* Analyze the current function and build chains for renaming. */
672
673 void
674 regrename_analyze (bitmap bb_mask)
675 {
676 struct bb_rename_info *rename_info;
677 int i;
678 basic_block bb;
679 int n_bbs;
680 int *inverse_postorder;
681
682 inverse_postorder = XNEWVEC (int, last_basic_block_for_fn (cfun));
683 n_bbs = pre_and_rev_post_order_compute (NULL, inverse_postorder, false);
684
685 /* Gather some information about the blocks in this function. */
686 rename_info = XCNEWVEC (struct bb_rename_info, n_basic_blocks_for_fn (cfun));
687 i = 0;
688 FOR_EACH_BB_FN (bb, cfun)
689 {
690 struct bb_rename_info *ri = rename_info + i;
691 ri->bb = bb;
692 if (bb_mask != NULL && !bitmap_bit_p (bb_mask, bb->index))
693 bb->aux = NULL;
694 else
695 bb->aux = ri;
696 i++;
697 }
698
699 current_id = 0;
700 id_to_chain.create (0);
701 bitmap_initialize (&open_chains_set, &bitmap_default_obstack);
702
703 /* The order in which we visit blocks ensures that whenever
704 possible, we only process a block after at least one of its
705 predecessors, which provides a "seeding" effect to make the logic
706 in set_incoming_from_chain and init_rename_info useful. */
707
708 for (i = 0; i < n_bbs; i++)
709 {
710 basic_block bb1 = BASIC_BLOCK_FOR_FN (cfun, inverse_postorder[i]);
711 struct bb_rename_info *this_info;
712 bool success;
713 edge e;
714 edge_iterator ei;
715 int old_length = id_to_chain.length ();
716
717 this_info = (struct bb_rename_info *) bb1->aux;
718 if (this_info == NULL)
719 continue;
720
721 if (dump_file)
722 fprintf (dump_file, "\nprocessing block %d:\n", bb1->index);
723
724 init_rename_info (this_info, bb1);
725
726 success = build_def_use (bb1);
727 if (!success)
728 {
729 if (dump_file)
730 fprintf (dump_file, "failed\n");
731 bb1->aux = NULL;
732 id_to_chain.truncate (old_length);
733 current_id = old_length;
734 bitmap_clear (&this_info->incoming_open_chains_set);
735 open_chains = NULL;
736 if (insn_rr.exists ())
737 {
738 rtx_insn *insn;
739 FOR_BB_INSNS (bb1, insn)
740 {
741 insn_rr_info *p = &insn_rr[INSN_UID (insn)];
742 p->op_info = NULL;
743 }
744 }
745 continue;
746 }
747
748 if (dump_file)
749 dump_def_use_chain (old_length);
750 bitmap_copy (&this_info->open_chains_set, &open_chains_set);
751
752 /* Add successor blocks to the worklist if necessary, and record
753 data about our own open chains at the end of this block, which
754 will be used to pre-open chains when processing the successors. */
755 FOR_EACH_EDGE (e, ei, bb1->succs)
756 {
757 struct bb_rename_info *dest_ri;
758 struct du_head *chain;
759
760 if (dump_file)
761 fprintf (dump_file, "successor block %d\n", e->dest->index);
762
763 if (e->flags & (EDGE_EH | EDGE_ABNORMAL))
764 continue;
765 dest_ri = (struct bb_rename_info *)e->dest->aux;
766 if (dest_ri == NULL)
767 continue;
768 for (chain = open_chains; chain; chain = chain->next_chain)
769 set_incoming_from_chain (dest_ri, chain);
770 }
771 }
772
773 free (inverse_postorder);
774
775 /* Now, combine the chains data we have gathered across basic block
776 boundaries.
777
778 For every basic block, there may be chains open at the start, or at the
779 end. Rather than exclude them from renaming, we look for open chains
780 with matching registers at the other side of the CFG edge.
781
782 For a given chain using register R, open at the start of block B, we
783 must find an open chain using R on the other side of every edge leading
784 to B, if the register is live across this edge. In the code below,
785 N_PREDS_USED counts the number of edges where the register is live, and
786 N_PREDS_JOINED counts those where we found an appropriate chain for
787 joining.
788
789 We perform the analysis for both incoming and outgoing edges, but we
790 only need to merge once (in the second part, after verifying outgoing
791 edges). */
792 FOR_EACH_BB_FN (bb, cfun)
793 {
794 struct bb_rename_info *bb_ri = (struct bb_rename_info *) bb->aux;
795 unsigned j;
796 bitmap_iterator bi;
797
798 if (bb_ri == NULL)
799 continue;
800
801 if (dump_file)
802 fprintf (dump_file, "processing bb %d in edges\n", bb->index);
803
804 EXECUTE_IF_SET_IN_BITMAP (&bb_ri->incoming_open_chains_set, 0, j, bi)
805 {
806 edge e;
807 edge_iterator ei;
808 struct du_head *chain = regrename_chain_from_id (j);
809 int n_preds_used = 0, n_preds_joined = 0;
810
811 FOR_EACH_EDGE (e, ei, bb->preds)
812 {
813 struct bb_rename_info *src_ri;
814 unsigned k;
815 bitmap_iterator bi2;
816 HARD_REG_SET live;
817 bool success = false;
818
819 REG_SET_TO_HARD_REG_SET (live, df_get_live_out (e->src));
820 if (!range_overlaps_hard_reg_set_p (live, chain->regno,
821 chain->nregs))
822 continue;
823 n_preds_used++;
824
825 if (e->flags & (EDGE_EH | EDGE_ABNORMAL))
826 continue;
827
828 src_ri = (struct bb_rename_info *)e->src->aux;
829 if (src_ri == NULL)
830 continue;
831
832 EXECUTE_IF_SET_IN_BITMAP (&src_ri->open_chains_set,
833 0, k, bi2)
834 {
835 struct du_head *outgoing_chain = regrename_chain_from_id (k);
836
837 if (outgoing_chain->regno == chain->regno
838 && outgoing_chain->nregs == chain->nregs)
839 {
840 n_preds_joined++;
841 success = true;
842 break;
843 }
844 }
845 if (!success && dump_file)
846 fprintf (dump_file, "failure to match with pred block %d\n",
847 e->src->index);
848 }
849 if (n_preds_joined < n_preds_used)
850 {
851 if (dump_file)
852 fprintf (dump_file, "cannot rename chain %d\n", j);
853 chain->cannot_rename = 1;
854 }
855 }
856 }
857 FOR_EACH_BB_FN (bb, cfun)
858 {
859 struct bb_rename_info *bb_ri = (struct bb_rename_info *) bb->aux;
860 unsigned j;
861 bitmap_iterator bi;
862
863 if (bb_ri == NULL)
864 continue;
865
866 if (dump_file)
867 fprintf (dump_file, "processing bb %d out edges\n", bb->index);
868
869 EXECUTE_IF_SET_IN_BITMAP (&bb_ri->open_chains_set, 0, j, bi)
870 {
871 edge e;
872 edge_iterator ei;
873 struct du_head *chain = regrename_chain_from_id (j);
874 int n_succs_used = 0, n_succs_joined = 0;
875
876 FOR_EACH_EDGE (e, ei, bb->succs)
877 {
878 bool printed = false;
879 struct bb_rename_info *dest_ri;
880 unsigned k;
881 bitmap_iterator bi2;
882 HARD_REG_SET live;
883
884 REG_SET_TO_HARD_REG_SET (live, df_get_live_in (e->dest));
885 if (!range_overlaps_hard_reg_set_p (live, chain->regno,
886 chain->nregs))
887 continue;
888
889 n_succs_used++;
890
891 dest_ri = (struct bb_rename_info *)e->dest->aux;
892 if (dest_ri == NULL)
893 continue;
894
895 EXECUTE_IF_SET_IN_BITMAP (&dest_ri->incoming_open_chains_set,
896 0, k, bi2)
897 {
898 struct du_head *incoming_chain = regrename_chain_from_id (k);
899
900 if (incoming_chain->regno == chain->regno
901 && incoming_chain->nregs == chain->nregs)
902 {
903 if (dump_file)
904 {
905 if (!printed)
906 fprintf (dump_file,
907 "merging blocks for edge %d -> %d\n",
908 e->src->index, e->dest->index);
909 printed = true;
910 fprintf (dump_file,
911 " merging chains %d (->%d) and %d (->%d) [%s]\n",
912 k, incoming_chain->id, j, chain->id,
913 reg_names[incoming_chain->regno]);
914 }
915
916 merge_chains (chain, incoming_chain);
917 n_succs_joined++;
918 break;
919 }
920 }
921 }
922 if (n_succs_joined < n_succs_used)
923 {
924 if (dump_file)
925 fprintf (dump_file, "cannot rename chain %d\n",
926 j);
927 chain->cannot_rename = 1;
928 }
929 }
930 }
931
932 free (rename_info);
933
934 FOR_EACH_BB_FN (bb, cfun)
935 bb->aux = NULL;
936 }
937
938 /* Attempt to replace all uses of the register in the chain beginning with
939 HEAD with REG. Returns true on success and false if the replacement is
940 rejected because the insns would not validate. The latter can happen
941 e.g. if a match_parallel predicate enforces restrictions on register
942 numbering in its subpatterns. */
943
944 bool
945 regrename_do_replace (struct du_head *head, int reg)
946 {
947 struct du_chain *chain;
948 unsigned int base_regno = head->regno;
949 machine_mode mode;
950
951 for (chain = head->first; chain; chain = chain->next_use)
952 {
953 unsigned int regno = ORIGINAL_REGNO (*chain->loc);
954 struct reg_attrs *attr = REG_ATTRS (*chain->loc);
955 int reg_ptr = REG_POINTER (*chain->loc);
956
957 if (DEBUG_INSN_P (chain->insn) && REGNO (*chain->loc) != base_regno)
958 validate_change (chain->insn, &(INSN_VAR_LOCATION_LOC (chain->insn)),
959 gen_rtx_UNKNOWN_VAR_LOC (), true);
960 else
961 {
962 validate_change (chain->insn, chain->loc,
963 gen_raw_REG (GET_MODE (*chain->loc), reg), true);
964 if (regno >= FIRST_PSEUDO_REGISTER)
965 ORIGINAL_REGNO (*chain->loc) = regno;
966 REG_ATTRS (*chain->loc) = attr;
967 REG_POINTER (*chain->loc) = reg_ptr;
968 }
969 }
970
971 if (!apply_change_group ())
972 return false;
973
974 mode = GET_MODE (*head->first->loc);
975 head->renamed = 1;
976 head->regno = reg;
977 head->nregs = hard_regno_nregs[reg][mode];
978 return true;
979 }
980
981
982 /* True if we found a register with a size mismatch, which means that we
983 can't track its lifetime accurately. If so, we abort the current block
984 without renaming. */
985 static bool fail_current_block;
986
987 /* Return true if OP is a reg for which all bits are set in PSET, false
988 if all bits are clear.
989 In other cases, set fail_current_block and return false. */
990
991 static bool
992 verify_reg_in_set (rtx op, HARD_REG_SET *pset)
993 {
994 unsigned regno, nregs;
995 bool all_live, all_dead;
996 if (!REG_P (op))
997 return false;
998
999 regno = REGNO (op);
1000 nregs = REG_NREGS (op);
1001 all_live = all_dead = true;
1002 while (nregs-- > 0)
1003 if (TEST_HARD_REG_BIT (*pset, regno + nregs))
1004 all_dead = false;
1005 else
1006 all_live = false;
1007 if (!all_dead && !all_live)
1008 {
1009 fail_current_block = true;
1010 return false;
1011 }
1012 return all_live;
1013 }
1014
1015 /* Return true if OP is a reg that is being tracked already in some form.
1016 May set fail_current_block if it sees an unhandled case of overlap. */
1017
1018 static bool
1019 verify_reg_tracked (rtx op)
1020 {
1021 return (verify_reg_in_set (op, &live_hard_regs)
1022 || verify_reg_in_set (op, &live_in_chains));
1023 }
1024
1025 /* Called through note_stores. DATA points to a rtx_code, either SET or
1026 CLOBBER, which tells us which kind of rtx to look at. If we have a
1027 match, record the set register in live_hard_regs and in the hard_conflicts
1028 bitmap of open chains. */
1029
1030 static void
1031 note_sets_clobbers (rtx x, const_rtx set, void *data)
1032 {
1033 enum rtx_code code = *(enum rtx_code *)data;
1034 struct du_head *chain;
1035
1036 if (GET_CODE (x) == SUBREG)
1037 x = SUBREG_REG (x);
1038 if (!REG_P (x) || GET_CODE (set) != code)
1039 return;
1040 /* There must not be pseudos at this point. */
1041 gcc_assert (HARD_REGISTER_P (x));
1042 add_to_hard_reg_set (&live_hard_regs, GET_MODE (x), REGNO (x));
1043 for (chain = open_chains; chain; chain = chain->next_chain)
1044 add_to_hard_reg_set (&chain->hard_conflicts, GET_MODE (x), REGNO (x));
1045 }
1046
1047 static void
1048 scan_rtx_reg (rtx_insn *insn, rtx *loc, enum reg_class cl, enum scan_actions action,
1049 enum op_type type)
1050 {
1051 struct du_head **p;
1052 rtx x = *loc;
1053 unsigned this_regno = REGNO (x);
1054 int this_nregs = REG_NREGS (x);
1055
1056 if (action == mark_write)
1057 {
1058 if (type == OP_OUT)
1059 {
1060 du_head_p c;
1061 rtx pat = PATTERN (insn);
1062
1063 c = create_new_chain (this_regno, this_nregs, loc, insn, cl);
1064
1065 /* We try to tie chains in a move instruction for
1066 a single output. */
1067 if (recog_data.n_operands == 2
1068 && GET_CODE (pat) == SET
1069 && GET_CODE (SET_DEST (pat)) == REG
1070 && GET_CODE (SET_SRC (pat)) == REG
1071 && terminated_this_insn)
1072 {
1073 gcc_assert (terminated_this_insn->regno
1074 == REGNO (recog_data.operand[1]));
1075
1076 c->tied_chain = terminated_this_insn;
1077 terminated_this_insn->tied_chain = c;
1078
1079 if (dump_file)
1080 fprintf (dump_file, "Tying chain %s (%d) with %s (%d)\n",
1081 reg_names[c->regno], c->id,
1082 reg_names[terminated_this_insn->regno],
1083 terminated_this_insn->id);
1084 }
1085 }
1086
1087 return;
1088 }
1089
1090 if ((type == OP_OUT) != (action == terminate_write || action == mark_access))
1091 return;
1092
1093 for (p = &open_chains; *p;)
1094 {
1095 struct du_head *head = *p;
1096 struct du_head *next = head->next_chain;
1097 int exact_match = (head->regno == this_regno
1098 && head->nregs == this_nregs);
1099 int superset = (this_regno <= head->regno
1100 && this_regno + this_nregs >= head->regno + head->nregs);
1101 int subset = (this_regno >= head->regno
1102 && this_regno + this_nregs <= head->regno + head->nregs);
1103
1104 if (!bitmap_bit_p (&open_chains_set, head->id)
1105 || head->regno + head->nregs <= this_regno
1106 || this_regno + this_nregs <= head->regno)
1107 {
1108 p = &head->next_chain;
1109 continue;
1110 }
1111
1112 if (action == mark_read || action == mark_access)
1113 {
1114 /* ??? Class NO_REGS can happen if the md file makes use of
1115 EXTRA_CONSTRAINTS to match registers. Which is arguably
1116 wrong, but there we are. */
1117
1118 if (cl == NO_REGS || (!exact_match && !DEBUG_INSN_P (insn)))
1119 {
1120 if (dump_file)
1121 fprintf (dump_file,
1122 "Cannot rename chain %s (%d) at insn %d (%s)\n",
1123 reg_names[head->regno], head->id, INSN_UID (insn),
1124 scan_actions_name[(int) action]);
1125 head->cannot_rename = 1;
1126 if (superset)
1127 {
1128 unsigned nregs = this_nregs;
1129 head->regno = this_regno;
1130 head->nregs = this_nregs;
1131 while (nregs-- > 0)
1132 SET_HARD_REG_BIT (live_in_chains, head->regno + nregs);
1133 if (dump_file)
1134 fprintf (dump_file,
1135 "Widening register in chain %s (%d) at insn %d\n",
1136 reg_names[head->regno], head->id, INSN_UID (insn));
1137 }
1138 else if (!subset)
1139 {
1140 fail_current_block = true;
1141 if (dump_file)
1142 fprintf (dump_file,
1143 "Failing basic block due to unhandled overlap\n");
1144 }
1145 }
1146 else
1147 {
1148 struct du_chain *this_du;
1149 this_du = XOBNEW (&rename_obstack, struct du_chain);
1150 this_du->next_use = 0;
1151 this_du->loc = loc;
1152 this_du->insn = insn;
1153 this_du->cl = cl;
1154 if (head->first == NULL)
1155 head->first = this_du;
1156 else
1157 head->last->next_use = this_du;
1158 record_operand_use (head, this_du);
1159 head->last = this_du;
1160 }
1161 /* Avoid adding the same location in a DEBUG_INSN multiple times,
1162 which could happen with non-exact overlap. */
1163 if (DEBUG_INSN_P (insn))
1164 return;
1165 /* Otherwise, find any other chains that do not match exactly;
1166 ensure they all get marked unrenamable. */
1167 p = &head->next_chain;
1168 continue;
1169 }
1170
1171 /* Whether the terminated chain can be used for renaming
1172 depends on the action and this being an exact match.
1173 In either case, we remove this element from open_chains. */
1174
1175 if ((action == terminate_dead || action == terminate_write)
1176 && (superset || subset))
1177 {
1178 unsigned nregs;
1179
1180 if (subset && !superset)
1181 head->cannot_rename = 1;
1182 bitmap_clear_bit (&open_chains_set, head->id);
1183
1184 nregs = head->nregs;
1185 while (nregs-- > 0)
1186 {
1187 CLEAR_HARD_REG_BIT (live_in_chains, head->regno + nregs);
1188 if (subset && !superset
1189 && (head->regno + nregs < this_regno
1190 || head->regno + nregs >= this_regno + this_nregs))
1191 SET_HARD_REG_BIT (live_hard_regs, head->regno + nregs);
1192 }
1193
1194 if (action == terminate_dead)
1195 terminated_this_insn = *p;
1196 *p = next;
1197 if (dump_file)
1198 fprintf (dump_file,
1199 "Closing chain %s (%d) at insn %d (%s%s)\n",
1200 reg_names[head->regno], head->id, INSN_UID (insn),
1201 scan_actions_name[(int) action],
1202 superset ? ", superset" : subset ? ", subset" : "");
1203 }
1204 else if (action == terminate_dead || action == terminate_write)
1205 {
1206 /* In this case, tracking liveness gets too hard. Fail the
1207 entire basic block. */
1208 if (dump_file)
1209 fprintf (dump_file,
1210 "Failing basic block due to unhandled overlap\n");
1211 fail_current_block = true;
1212 return;
1213 }
1214 else
1215 {
1216 head->cannot_rename = 1;
1217 if (dump_file)
1218 fprintf (dump_file,
1219 "Cannot rename chain %s (%d) at insn %d (%s)\n",
1220 reg_names[head->regno], head->id, INSN_UID (insn),
1221 scan_actions_name[(int) action]);
1222 p = &head->next_chain;
1223 }
1224 }
1225 }
1226
1227 /* Adapted from find_reloads_address_1. CL is INDEX_REG_CLASS or
1228 BASE_REG_CLASS depending on how the register is being considered. */
1229
1230 static void
1231 scan_rtx_address (rtx_insn *insn, rtx *loc, enum reg_class cl,
1232 enum scan_actions action, machine_mode mode,
1233 addr_space_t as)
1234 {
1235 rtx x = *loc;
1236 RTX_CODE code = GET_CODE (x);
1237 const char *fmt;
1238 int i, j;
1239
1240 if (action == mark_write || action == mark_access)
1241 return;
1242
1243 switch (code)
1244 {
1245 case PLUS:
1246 {
1247 rtx orig_op0 = XEXP (x, 0);
1248 rtx orig_op1 = XEXP (x, 1);
1249 RTX_CODE code0 = GET_CODE (orig_op0);
1250 RTX_CODE code1 = GET_CODE (orig_op1);
1251 rtx op0 = orig_op0;
1252 rtx op1 = orig_op1;
1253 rtx *locI = NULL;
1254 rtx *locB = NULL;
1255 enum rtx_code index_code = SCRATCH;
1256
1257 if (GET_CODE (op0) == SUBREG)
1258 {
1259 op0 = SUBREG_REG (op0);
1260 code0 = GET_CODE (op0);
1261 }
1262
1263 if (GET_CODE (op1) == SUBREG)
1264 {
1265 op1 = SUBREG_REG (op1);
1266 code1 = GET_CODE (op1);
1267 }
1268
1269 if (code0 == MULT || code0 == SIGN_EXTEND || code0 == TRUNCATE
1270 || code0 == ZERO_EXTEND || code1 == MEM)
1271 {
1272 locI = &XEXP (x, 0);
1273 locB = &XEXP (x, 1);
1274 index_code = GET_CODE (*locI);
1275 }
1276 else if (code1 == MULT || code1 == SIGN_EXTEND || code1 == TRUNCATE
1277 || code1 == ZERO_EXTEND || code0 == MEM)
1278 {
1279 locI = &XEXP (x, 1);
1280 locB = &XEXP (x, 0);
1281 index_code = GET_CODE (*locI);
1282 }
1283 else if (code0 == CONST_INT || code0 == CONST
1284 || code0 == SYMBOL_REF || code0 == LABEL_REF)
1285 {
1286 locB = &XEXP (x, 1);
1287 index_code = GET_CODE (XEXP (x, 0));
1288 }
1289 else if (code1 == CONST_INT || code1 == CONST
1290 || code1 == SYMBOL_REF || code1 == LABEL_REF)
1291 {
1292 locB = &XEXP (x, 0);
1293 index_code = GET_CODE (XEXP (x, 1));
1294 }
1295 else if (code0 == REG && code1 == REG)
1296 {
1297 int index_op;
1298 unsigned regno0 = REGNO (op0), regno1 = REGNO (op1);
1299
1300 if (REGNO_OK_FOR_INDEX_P (regno1)
1301 && regno_ok_for_base_p (regno0, mode, as, PLUS, REG))
1302 index_op = 1;
1303 else if (REGNO_OK_FOR_INDEX_P (regno0)
1304 && regno_ok_for_base_p (regno1, mode, as, PLUS, REG))
1305 index_op = 0;
1306 else if (regno_ok_for_base_p (regno0, mode, as, PLUS, REG)
1307 || REGNO_OK_FOR_INDEX_P (regno1))
1308 index_op = 1;
1309 else if (regno_ok_for_base_p (regno1, mode, as, PLUS, REG))
1310 index_op = 0;
1311 else
1312 index_op = 1;
1313
1314 locI = &XEXP (x, index_op);
1315 locB = &XEXP (x, !index_op);
1316 index_code = GET_CODE (*locI);
1317 }
1318 else if (code0 == REG)
1319 {
1320 locI = &XEXP (x, 0);
1321 locB = &XEXP (x, 1);
1322 index_code = GET_CODE (*locI);
1323 }
1324 else if (code1 == REG)
1325 {
1326 locI = &XEXP (x, 1);
1327 locB = &XEXP (x, 0);
1328 index_code = GET_CODE (*locI);
1329 }
1330
1331 if (locI)
1332 scan_rtx_address (insn, locI, INDEX_REG_CLASS, action, mode, as);
1333 if (locB)
1334 scan_rtx_address (insn, locB,
1335 base_reg_class (mode, as, PLUS, index_code),
1336 action, mode, as);
1337
1338 return;
1339 }
1340
1341 case POST_INC:
1342 case POST_DEC:
1343 case POST_MODIFY:
1344 case PRE_INC:
1345 case PRE_DEC:
1346 case PRE_MODIFY:
1347 /* If the target doesn't claim to handle autoinc, this must be
1348 something special, like a stack push. Kill this chain. */
1349 if (!AUTO_INC_DEC)
1350 action = mark_all_read;
1351
1352 break;
1353
1354 case MEM:
1355 scan_rtx_address (insn, &XEXP (x, 0),
1356 base_reg_class (GET_MODE (x), MEM_ADDR_SPACE (x),
1357 MEM, SCRATCH),
1358 action, GET_MODE (x), MEM_ADDR_SPACE (x));
1359 return;
1360
1361 case REG:
1362 scan_rtx_reg (insn, loc, cl, action, OP_IN);
1363 return;
1364
1365 default:
1366 break;
1367 }
1368
1369 fmt = GET_RTX_FORMAT (code);
1370 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1371 {
1372 if (fmt[i] == 'e')
1373 scan_rtx_address (insn, &XEXP (x, i), cl, action, mode, as);
1374 else if (fmt[i] == 'E')
1375 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
1376 scan_rtx_address (insn, &XVECEXP (x, i, j), cl, action, mode, as);
1377 }
1378 }
1379
1380 static void
1381 scan_rtx (rtx_insn *insn, rtx *loc, enum reg_class cl, enum scan_actions action,
1382 enum op_type type)
1383 {
1384 const char *fmt;
1385 rtx x = *loc;
1386 enum rtx_code code = GET_CODE (x);
1387 int i, j;
1388
1389 code = GET_CODE (x);
1390 switch (code)
1391 {
1392 case CONST:
1393 CASE_CONST_ANY:
1394 case SYMBOL_REF:
1395 case LABEL_REF:
1396 case CC0:
1397 case PC:
1398 return;
1399
1400 case REG:
1401 scan_rtx_reg (insn, loc, cl, action, type);
1402 return;
1403
1404 case MEM:
1405 scan_rtx_address (insn, &XEXP (x, 0),
1406 base_reg_class (GET_MODE (x), MEM_ADDR_SPACE (x),
1407 MEM, SCRATCH),
1408 action, GET_MODE (x), MEM_ADDR_SPACE (x));
1409 return;
1410
1411 case SET:
1412 scan_rtx (insn, &SET_SRC (x), cl, action, OP_IN);
1413 scan_rtx (insn, &SET_DEST (x), cl, action,
1414 (GET_CODE (PATTERN (insn)) == COND_EXEC
1415 && verify_reg_tracked (SET_DEST (x))) ? OP_INOUT : OP_OUT);
1416 return;
1417
1418 case STRICT_LOW_PART:
1419 scan_rtx (insn, &XEXP (x, 0), cl, action,
1420 verify_reg_tracked (XEXP (x, 0)) ? OP_INOUT : OP_OUT);
1421 return;
1422
1423 case ZERO_EXTRACT:
1424 case SIGN_EXTRACT:
1425 scan_rtx (insn, &XEXP (x, 0), cl, action,
1426 (type == OP_IN ? OP_IN :
1427 verify_reg_tracked (XEXP (x, 0)) ? OP_INOUT : OP_OUT));
1428 scan_rtx (insn, &XEXP (x, 1), cl, action, OP_IN);
1429 scan_rtx (insn, &XEXP (x, 2), cl, action, OP_IN);
1430 return;
1431
1432 case POST_INC:
1433 case PRE_INC:
1434 case POST_DEC:
1435 case PRE_DEC:
1436 case POST_MODIFY:
1437 case PRE_MODIFY:
1438 /* Should only happen inside MEM. */
1439 gcc_unreachable ();
1440
1441 case CLOBBER:
1442 scan_rtx (insn, &SET_DEST (x), cl, action,
1443 (GET_CODE (PATTERN (insn)) == COND_EXEC
1444 && verify_reg_tracked (SET_DEST (x))) ? OP_INOUT : OP_OUT);
1445 return;
1446
1447 case EXPR_LIST:
1448 scan_rtx (insn, &XEXP (x, 0), cl, action, type);
1449 if (XEXP (x, 1))
1450 scan_rtx (insn, &XEXP (x, 1), cl, action, type);
1451 return;
1452
1453 default:
1454 break;
1455 }
1456
1457 fmt = GET_RTX_FORMAT (code);
1458 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1459 {
1460 if (fmt[i] == 'e')
1461 scan_rtx (insn, &XEXP (x, i), cl, action, type);
1462 else if (fmt[i] == 'E')
1463 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
1464 scan_rtx (insn, &XVECEXP (x, i, j), cl, action, type);
1465 }
1466 }
1467
1468 /* Hide operands of the current insn (of which there are N_OPS) by
1469 substituting cc0 for them.
1470 Previous values are stored in the OLD_OPERANDS and OLD_DUPS.
1471 For every bit set in DO_NOT_HIDE, we leave the operand alone.
1472 If INOUT_AND_EC_ONLY is set, we only do this for OP_INOUT type operands
1473 and earlyclobbers. */
1474
1475 static void
1476 hide_operands (int n_ops, rtx *old_operands, rtx *old_dups,
1477 unsigned HOST_WIDE_INT do_not_hide, bool inout_and_ec_only)
1478 {
1479 int i;
1480 const operand_alternative *op_alt = which_op_alt ();
1481 for (i = 0; i < n_ops; i++)
1482 {
1483 old_operands[i] = recog_data.operand[i];
1484 /* Don't squash match_operator or match_parallel here, since
1485 we don't know that all of the contained registers are
1486 reachable by proper operands. */
1487 if (recog_data.constraints[i][0] == '\0')
1488 continue;
1489 if (do_not_hide & (1 << i))
1490 continue;
1491 if (!inout_and_ec_only || recog_data.operand_type[i] == OP_INOUT
1492 || op_alt[i].earlyclobber)
1493 *recog_data.operand_loc[i] = cc0_rtx;
1494 }
1495 for (i = 0; i < recog_data.n_dups; i++)
1496 {
1497 int opn = recog_data.dup_num[i];
1498 old_dups[i] = *recog_data.dup_loc[i];
1499 if (do_not_hide & (1 << opn))
1500 continue;
1501 if (!inout_and_ec_only || recog_data.operand_type[opn] == OP_INOUT
1502 || op_alt[opn].earlyclobber)
1503 *recog_data.dup_loc[i] = cc0_rtx;
1504 }
1505 }
1506
1507 /* Undo the substitution performed by hide_operands. INSN is the insn we
1508 are processing; the arguments are the same as in hide_operands. */
1509
1510 static void
1511 restore_operands (rtx_insn *insn, int n_ops, rtx *old_operands, rtx *old_dups)
1512 {
1513 int i;
1514 for (i = 0; i < recog_data.n_dups; i++)
1515 *recog_data.dup_loc[i] = old_dups[i];
1516 for (i = 0; i < n_ops; i++)
1517 *recog_data.operand_loc[i] = old_operands[i];
1518 if (recog_data.n_dups)
1519 df_insn_rescan (insn);
1520 }
1521
1522 /* For each output operand of INSN, call scan_rtx to create a new
1523 open chain. Do this only for normal or earlyclobber outputs,
1524 depending on EARLYCLOBBER. If INSN_INFO is nonnull, use it to
1525 record information about the operands in the insn. */
1526
1527 static void
1528 record_out_operands (rtx_insn *insn, bool earlyclobber, insn_rr_info *insn_info)
1529 {
1530 int n_ops = recog_data.n_operands;
1531 const operand_alternative *op_alt = which_op_alt ();
1532
1533 int i;
1534
1535 for (i = 0; i < n_ops + recog_data.n_dups; i++)
1536 {
1537 int opn = i < n_ops ? i : recog_data.dup_num[i - n_ops];
1538 rtx *loc = (i < n_ops
1539 ? recog_data.operand_loc[opn]
1540 : recog_data.dup_loc[i - n_ops]);
1541 rtx op = *loc;
1542 enum reg_class cl = alternative_class (op_alt, opn);
1543
1544 struct du_head *prev_open;
1545
1546 if (recog_data.operand_type[opn] != OP_OUT
1547 || op_alt[opn].earlyclobber != earlyclobber)
1548 continue;
1549
1550 if (insn_info)
1551 cur_operand = insn_info->op_info + i;
1552
1553 prev_open = open_chains;
1554 scan_rtx (insn, loc, cl, mark_write, OP_OUT);
1555
1556 /* ??? Many targets have output constraints on the SET_DEST
1557 of a call insn, which is stupid, since these are certainly
1558 ABI defined hard registers. For these, and for asm operands
1559 that originally referenced hard registers, we must record that
1560 the chain cannot be renamed. */
1561 if (CALL_P (insn)
1562 || (asm_noperands (PATTERN (insn)) > 0
1563 && REG_P (op)
1564 && REGNO (op) == ORIGINAL_REGNO (op)))
1565 {
1566 if (prev_open != open_chains)
1567 open_chains->cannot_rename = 1;
1568 }
1569 }
1570 cur_operand = NULL;
1571 }
1572
1573 /* Build def/use chain. */
1574
1575 static bool
1576 build_def_use (basic_block bb)
1577 {
1578 rtx_insn *insn;
1579 unsigned HOST_WIDE_INT untracked_operands;
1580
1581 fail_current_block = false;
1582
1583 for (insn = BB_HEAD (bb); ; insn = NEXT_INSN (insn))
1584 {
1585 if (NONDEBUG_INSN_P (insn))
1586 {
1587 int n_ops;
1588 rtx note;
1589 rtx old_operands[MAX_RECOG_OPERANDS];
1590 rtx old_dups[MAX_DUP_OPERANDS];
1591 int i;
1592 int predicated;
1593 enum rtx_code set_code = SET;
1594 enum rtx_code clobber_code = CLOBBER;
1595 insn_rr_info *insn_info = NULL;
1596
1597 /* Process the insn, determining its effect on the def-use
1598 chains and live hard registers. We perform the following
1599 steps with the register references in the insn, simulating
1600 its effect:
1601 (1) Deal with earlyclobber operands and CLOBBERs of non-operands
1602 by creating chains and marking hard regs live.
1603 (2) Any read outside an operand causes any chain it overlaps
1604 with to be marked unrenamable.
1605 (3) Any read inside an operand is added if there's already
1606 an open chain for it.
1607 (4) For any REG_DEAD note we find, close open chains that
1608 overlap it.
1609 (5) For any non-earlyclobber write we find, close open chains
1610 that overlap it.
1611 (6) For any non-earlyclobber write we find in an operand, make
1612 a new chain or mark the hard register as live.
1613 (7) For any REG_UNUSED, close any chains we just opened.
1614
1615 We cannot deal with situations where we track a reg in one mode
1616 and see a reference in another mode; these will cause the chain
1617 to be marked unrenamable or even cause us to abort the entire
1618 basic block. */
1619
1620 extract_constrain_insn (insn);
1621 preprocess_constraints (insn);
1622 const operand_alternative *op_alt = which_op_alt ();
1623 n_ops = recog_data.n_operands;
1624 untracked_operands = 0;
1625
1626 if (insn_rr.exists ())
1627 {
1628 insn_info = &insn_rr[INSN_UID (insn)];
1629 insn_info->op_info = XOBNEWVEC (&rename_obstack, operand_rr_info,
1630 recog_data.n_operands);
1631 memset (insn_info->op_info, 0,
1632 sizeof (operand_rr_info) * recog_data.n_operands);
1633 }
1634
1635 /* Simplify the code below by promoting OP_OUT to OP_INOUT in
1636 predicated instructions, but only for register operands
1637 that are already tracked, so that we can create a chain
1638 when the first SET makes a register live. */
1639
1640 predicated = GET_CODE (PATTERN (insn)) == COND_EXEC;
1641 for (i = 0; i < n_ops; ++i)
1642 {
1643 rtx op = recog_data.operand[i];
1644 int matches = op_alt[i].matches;
1645 if (matches >= 0 || op_alt[i].matched >= 0
1646 || (predicated && recog_data.operand_type[i] == OP_OUT))
1647 {
1648 recog_data.operand_type[i] = OP_INOUT;
1649 /* A special case to deal with instruction patterns that
1650 have matching operands with different modes. If we're
1651 not already tracking such a reg, we won't start here,
1652 and we must instead make sure to make the operand visible
1653 to the machinery that tracks hard registers. */
1654 if (matches >= 0
1655 && (GET_MODE_SIZE (recog_data.operand_mode[i])
1656 != GET_MODE_SIZE (recog_data.operand_mode[matches]))
1657 && !verify_reg_in_set (op, &live_in_chains))
1658 {
1659 untracked_operands |= 1 << i;
1660 untracked_operands |= 1 << matches;
1661 }
1662 }
1663 /* If there's an in-out operand with a register that is not
1664 being tracked at all yet, open a chain. */
1665 if (recog_data.operand_type[i] == OP_INOUT
1666 && !(untracked_operands & (1 << i))
1667 && REG_P (op)
1668 && !verify_reg_tracked (op))
1669 create_new_chain (REGNO (op), REG_NREGS (op), NULL, NULL,
1670 NO_REGS);
1671 }
1672
1673 if (fail_current_block)
1674 break;
1675
1676 /* Step 1a: Mark hard registers that are clobbered in this insn,
1677 outside an operand, as live. */
1678 hide_operands (n_ops, old_operands, old_dups, untracked_operands,
1679 false);
1680 note_stores (PATTERN (insn), note_sets_clobbers, &clobber_code);
1681 restore_operands (insn, n_ops, old_operands, old_dups);
1682
1683 /* Step 1b: Begin new chains for earlyclobbered writes inside
1684 operands. */
1685 record_out_operands (insn, true, insn_info);
1686
1687 /* Step 2: Mark chains for which we have reads outside operands
1688 as unrenamable.
1689 We do this by munging all operands into CC0, and closing
1690 everything remaining. */
1691
1692 hide_operands (n_ops, old_operands, old_dups, untracked_operands,
1693 false);
1694 scan_rtx (insn, &PATTERN (insn), NO_REGS, mark_all_read, OP_IN);
1695 restore_operands (insn, n_ops, old_operands, old_dups);
1696
1697 /* Step 2B: Can't rename function call argument registers. */
1698 if (CALL_P (insn) && CALL_INSN_FUNCTION_USAGE (insn))
1699 scan_rtx (insn, &CALL_INSN_FUNCTION_USAGE (insn),
1700 NO_REGS, mark_all_read, OP_IN);
1701
1702 /* Step 2C: Can't rename asm operands that were originally
1703 hard registers. */
1704 if (asm_noperands (PATTERN (insn)) > 0)
1705 for (i = 0; i < n_ops; i++)
1706 {
1707 rtx *loc = recog_data.operand_loc[i];
1708 rtx op = *loc;
1709
1710 if (REG_P (op)
1711 && REGNO (op) == ORIGINAL_REGNO (op)
1712 && (recog_data.operand_type[i] == OP_IN
1713 || recog_data.operand_type[i] == OP_INOUT))
1714 scan_rtx (insn, loc, NO_REGS, mark_all_read, OP_IN);
1715 }
1716
1717 /* Step 3: Append to chains for reads inside operands. */
1718 for (i = 0; i < n_ops + recog_data.n_dups; i++)
1719 {
1720 int opn = i < n_ops ? i : recog_data.dup_num[i - n_ops];
1721 rtx *loc = (i < n_ops
1722 ? recog_data.operand_loc[opn]
1723 : recog_data.dup_loc[i - n_ops]);
1724 enum reg_class cl = alternative_class (op_alt, opn);
1725 enum op_type type = recog_data.operand_type[opn];
1726
1727 /* Don't scan match_operand here, since we've no reg class
1728 information to pass down. Any operands that we could
1729 substitute in will be represented elsewhere. */
1730 if (recog_data.constraints[opn][0] == '\0'
1731 || untracked_operands & (1 << opn))
1732 continue;
1733
1734 if (insn_info)
1735 cur_operand = i == opn ? insn_info->op_info + i : NULL;
1736 if (op_alt[opn].is_address)
1737 scan_rtx_address (insn, loc, cl, mark_read,
1738 VOIDmode, ADDR_SPACE_GENERIC);
1739 else
1740 scan_rtx (insn, loc, cl, mark_read, type);
1741 }
1742 cur_operand = NULL;
1743
1744 /* Step 3B: Record updates for regs in REG_INC notes, and
1745 source regs in REG_FRAME_RELATED_EXPR notes. */
1746 for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
1747 if (REG_NOTE_KIND (note) == REG_INC
1748 || REG_NOTE_KIND (note) == REG_FRAME_RELATED_EXPR)
1749 scan_rtx (insn, &XEXP (note, 0), ALL_REGS, mark_read,
1750 OP_INOUT);
1751
1752 terminated_this_insn = NULL;
1753
1754 /* Step 4: Close chains for registers that die here, unless
1755 the register is mentioned in a REG_UNUSED note. In that
1756 case we keep the chain open until step #7 below to ensure
1757 it conflicts with other output operands of this insn.
1758 See PR 52573. Arguably the insn should not have both
1759 notes; it has proven difficult to fix that without
1760 other undesirable side effects. */
1761 for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
1762 if (REG_NOTE_KIND (note) == REG_DEAD
1763 && !find_regno_note (insn, REG_UNUSED, REGNO (XEXP (note, 0))))
1764 {
1765 remove_from_hard_reg_set (&live_hard_regs,
1766 GET_MODE (XEXP (note, 0)),
1767 REGNO (XEXP (note, 0)));
1768 scan_rtx (insn, &XEXP (note, 0), NO_REGS, terminate_dead,
1769 OP_IN);
1770 }
1771
1772 /* Step 4B: If this is a call, any chain live at this point
1773 requires a caller-saved reg. */
1774 if (CALL_P (insn))
1775 {
1776 struct du_head *p;
1777 for (p = open_chains; p; p = p->next_chain)
1778 p->need_caller_save_reg = 1;
1779 }
1780
1781 /* Step 5: Close open chains that overlap writes. Similar to
1782 step 2, we hide in-out operands, since we do not want to
1783 close these chains. We also hide earlyclobber operands,
1784 since we've opened chains for them in step 1, and earlier
1785 chains they would overlap with must have been closed at
1786 the previous insn at the latest, as such operands cannot
1787 possibly overlap with any input operands. */
1788
1789 hide_operands (n_ops, old_operands, old_dups, untracked_operands,
1790 true);
1791 scan_rtx (insn, &PATTERN (insn), NO_REGS, terminate_write, OP_IN);
1792 restore_operands (insn, n_ops, old_operands, old_dups);
1793
1794 /* Step 6a: Mark hard registers that are set in this insn,
1795 outside an operand, as live. */
1796 hide_operands (n_ops, old_operands, old_dups, untracked_operands,
1797 false);
1798 note_stores (PATTERN (insn), note_sets_clobbers, &set_code);
1799 restore_operands (insn, n_ops, old_operands, old_dups);
1800
1801 /* Step 6b: Begin new chains for writes inside operands. */
1802 record_out_operands (insn, false, insn_info);
1803
1804 /* Step 6c: Record destination regs in REG_FRAME_RELATED_EXPR
1805 notes for update. */
1806 for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
1807 if (REG_NOTE_KIND (note) == REG_FRAME_RELATED_EXPR)
1808 scan_rtx (insn, &XEXP (note, 0), ALL_REGS, mark_access,
1809 OP_INOUT);
1810
1811 /* Step 7: Close chains for registers that were never
1812 really used here. */
1813 for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
1814 if (REG_NOTE_KIND (note) == REG_UNUSED)
1815 {
1816 remove_from_hard_reg_set (&live_hard_regs,
1817 GET_MODE (XEXP (note, 0)),
1818 REGNO (XEXP (note, 0)));
1819 scan_rtx (insn, &XEXP (note, 0), NO_REGS, terminate_dead,
1820 OP_IN);
1821 }
1822 }
1823 else if (DEBUG_INSN_P (insn)
1824 && !VAR_LOC_UNKNOWN_P (INSN_VAR_LOCATION_LOC (insn)))
1825 {
1826 scan_rtx (insn, &INSN_VAR_LOCATION_LOC (insn),
1827 ALL_REGS, mark_read, OP_IN);
1828 }
1829 if (insn == BB_END (bb))
1830 break;
1831 }
1832
1833 if (fail_current_block)
1834 return false;
1835
1836 return true;
1837 }
1838 \f
1839 /* Initialize the register renamer. If INSN_INFO is true, ensure that
1840 insn_rr is nonnull. */
1841 void
1842 regrename_init (bool insn_info)
1843 {
1844 gcc_obstack_init (&rename_obstack);
1845 insn_rr.create (0);
1846 if (insn_info)
1847 insn_rr.safe_grow_cleared (get_max_uid ());
1848 }
1849
1850 /* Free all global data used by the register renamer. */
1851 void
1852 regrename_finish (void)
1853 {
1854 insn_rr.release ();
1855 free_chain_data ();
1856 obstack_free (&rename_obstack, NULL);
1857 }
1858
1859 /* Perform register renaming on the current function. */
1860
1861 static unsigned int
1862 regrename_optimize (void)
1863 {
1864 df_set_flags (DF_LR_RUN_DCE);
1865 df_note_add_problem ();
1866 df_analyze ();
1867 df_set_flags (DF_DEFER_INSN_RESCAN);
1868
1869 regrename_init (false);
1870
1871 regrename_analyze (NULL);
1872
1873 rename_chains ();
1874
1875 regrename_finish ();
1876
1877 return 0;
1878 }
1879 \f
1880 namespace {
1881
1882 const pass_data pass_data_regrename =
1883 {
1884 RTL_PASS, /* type */
1885 "rnreg", /* name */
1886 OPTGROUP_NONE, /* optinfo_flags */
1887 TV_RENAME_REGISTERS, /* tv_id */
1888 0, /* properties_required */
1889 0, /* properties_provided */
1890 0, /* properties_destroyed */
1891 0, /* todo_flags_start */
1892 TODO_df_finish, /* todo_flags_finish */
1893 };
1894
1895 class pass_regrename : public rtl_opt_pass
1896 {
1897 public:
1898 pass_regrename (gcc::context *ctxt)
1899 : rtl_opt_pass (pass_data_regrename, ctxt)
1900 {}
1901
1902 /* opt_pass methods: */
1903 virtual bool gate (function *)
1904 {
1905 return (optimize > 0 && (flag_rename_registers));
1906 }
1907
1908 virtual unsigned int execute (function *) { return regrename_optimize (); }
1909
1910 }; // class pass_regrename
1911
1912 } // anon namespace
1913
1914 rtl_opt_pass *
1915 make_pass_regrename (gcc::context *ctxt)
1916 {
1917 return new pass_regrename (ctxt);
1918 }