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