regrename.c (scan_rtx_rtx): Skip to the next chain on encountering a terminated chain.
[gcc.git] / gcc / regrename.c
1 /* Register renaming for the GNU compiler.
2 Copyright (C) 2000 Free Software Foundation, Inc.
3
4 This file is part of GNU CC.
5
6 GNU CC is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
9 any later version.
10
11 GNU CC is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GNU CC; see the file COPYING. If not, write to
18 the Free Software Foundation, 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. */
20
21 #define REG_OK_STRICT
22
23 #include "config.h"
24 #include "system.h"
25 #include "rtl.h"
26 #include "tm_p.h"
27 #include "insn-config.h"
28 #include "regs.h"
29 #include "hard-reg-set.h"
30 #include "basic-block.h"
31 #include "reload.h"
32 #include "output.h"
33 #include "function.h"
34 #include "recog.h"
35 #include "flags.h"
36 #include "obstack.h"
37
38 #define obstack_chunk_alloc xmalloc
39 #define obstack_chunk_free free
40
41 #ifndef REGNO_MODE_OK_FOR_BASE_P
42 #define REGNO_MODE_OK_FOR_BASE_P(REGNO, MODE) REGNO_OK_FOR_BASE_P (REGNO)
43 #endif
44
45 #ifndef REG_MODE_OK_FOR_BASE_P
46 #define REG_MODE_OK_FOR_BASE_P(REGNO, MODE) REG_OK_FOR_BASE_P (REGNO)
47 #endif
48
49 static const char *const reg_class_names[] = REG_CLASS_NAMES;
50
51 struct du_chain
52 {
53 struct du_chain *next_chain;
54 struct du_chain *next_use;
55
56 rtx insn;
57 rtx *loc;
58 enum reg_class class;
59 unsigned int need_caller_save_reg:1;
60 };
61
62 enum scan_actions
63 {
64 note_reference,
65 terminate_all_read,
66 terminate_overlapping_read,
67 terminate_write,
68 terminate_dead,
69 mark_read,
70 mark_write
71 };
72
73 static const char * const scan_actions_name[] =
74 {
75 "note_reference",
76 "terminate_all_read",
77 "terminate_overlapping_read",
78 "terminate_write",
79 "terminate_dead",
80 "mark_read",
81 "mark_write"
82 };
83
84 static struct obstack rename_obstack;
85
86 static void do_replace PARAMS ((struct du_chain *, int));
87 static void scan_rtx_reg PARAMS ((rtx, rtx *, enum reg_class,
88 enum scan_actions, enum op_type));
89 static void scan_rtx_address PARAMS ((rtx, rtx *, enum reg_class,
90 enum scan_actions, enum machine_mode));
91 static void scan_rtx PARAMS ((rtx, rtx *, enum reg_class,
92 enum scan_actions, enum op_type));
93 static struct du_chain *build_def_use PARAMS ((basic_block, HARD_REG_SET *));
94 static void dump_def_use_chain PARAMS ((struct du_chain *));
95
96 void
97 regrename_optimize ()
98 {
99 int b;
100 char *first_obj;
101
102 gcc_obstack_init (&rename_obstack);
103 first_obj = (char *) obstack_alloc (&rename_obstack, 0);
104
105 for (b = 0; b < n_basic_blocks; b++)
106 {
107 basic_block bb = BASIC_BLOCK (b);
108 struct du_chain *all_chains = 0;
109 HARD_REG_SET regs_used;
110 HARD_REG_SET unavailable;
111 HARD_REG_SET regs_seen;
112
113 CLEAR_HARD_REG_SET (regs_used);
114 CLEAR_HARD_REG_SET (unavailable);
115
116 if (rtl_dump_file)
117 fprintf (rtl_dump_file, "\nBasic block %d:\n", b);
118
119 all_chains = build_def_use (bb, &regs_used);
120
121 if (rtl_dump_file)
122 dump_def_use_chain (all_chains);
123
124 /* Available registers are not: used in the block, live at the start
125 live at the end, a register we've renamed to. */
126 REG_SET_TO_HARD_REG_SET (unavailable, bb->global_live_at_start);
127 REG_SET_TO_HARD_REG_SET (regs_seen, bb->global_live_at_end);
128 IOR_HARD_REG_SET (unavailable, regs_seen);
129 IOR_HARD_REG_SET (unavailable, regs_used);
130
131 /* Don't clobber traceback for noreturn functions. */
132 if (frame_pointer_needed)
133 {
134 SET_HARD_REG_BIT (unavailable, FRAME_POINTER_REGNUM);
135 #if FRAME_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM
136 SET_HARD_REG_BIT (unavailable, HARD_FRAME_POINTER_REGNUM);
137 #endif
138 }
139
140 CLEAR_HARD_REG_SET (regs_seen);
141 while (all_chains)
142 {
143 int n_uses;
144 struct du_chain *this = all_chains;
145 struct du_chain *tmp, *last;
146 HARD_REG_SET this_unavailable;
147 int reg = REGNO (*this->loc), treg;
148 int nregs = HARD_REGNO_NREGS (reg, GET_MODE (*this->loc));
149 int i;
150
151 all_chains = this->next_chain;
152
153 /* Only rename once we've seen the reg more than once. */
154 if (! TEST_HARD_REG_BIT (regs_seen, reg))
155 {
156 SET_HARD_REG_BIT (regs_seen, reg);
157 continue;
158 }
159
160 if (fixed_regs[reg] || global_regs[reg])
161 continue;
162
163 COPY_HARD_REG_SET (this_unavailable, unavailable);
164
165 /* Find last entry on chain (which has the need_caller_save bit),
166 count number of uses, and narrow the set of registers we can
167 use for renaming. */
168 n_uses = 0;
169 for (last = this; last->next_use; last = last->next_use)
170 {
171 n_uses++;
172 IOR_COMPL_HARD_REG_SET (this_unavailable,
173 reg_class_contents[last->class]);
174 }
175 if (n_uses < 1)
176 continue;
177
178 IOR_COMPL_HARD_REG_SET (this_unavailable,
179 reg_class_contents[last->class]);
180
181 if (last->need_caller_save_reg)
182 IOR_HARD_REG_SET (this_unavailable, call_used_reg_set);
183
184 /* Now potential_regs is a reasonable approximation, let's
185 have a closer look at each register still in there. */
186 for (treg = 0; treg < FIRST_PSEUDO_REGISTER; treg++)
187 {
188 for (i = nregs - 1; i >= 0; --i)
189 if (TEST_HARD_REG_BIT (this_unavailable, treg+i)
190 || fixed_regs[treg+i]
191 || global_regs[treg+i]
192 /* Can't use regs which aren't saved by the prologue. */
193 || (! regs_ever_live[treg+i] && ! call_used_regs[treg+i])
194 #ifdef HARD_REGNO_RENAME_OK
195 || ! HARD_REGNO_RENAME_OK (reg+i, treg+i)
196 #endif
197 )
198 break;
199 if (i >= 0)
200 continue;
201
202 /* See whether it accepts all modes that occur in
203 definition and uses. */
204 for (tmp = this; tmp; tmp = tmp->next_use)
205 if (! HARD_REGNO_MODE_OK (treg, GET_MODE (*tmp->loc)))
206 break;
207 if (! tmp)
208 break;
209 }
210
211 if (rtl_dump_file)
212 {
213 fprintf (rtl_dump_file, "Register %s in insn %d",
214 reg_names[reg], INSN_UID (last->insn));
215 if (last->need_caller_save_reg)
216 fprintf (rtl_dump_file, " crosses a call");
217 }
218
219 if (treg == FIRST_PSEUDO_REGISTER)
220 {
221 if (rtl_dump_file)
222 fprintf (rtl_dump_file, "; no available registers\n");
223 continue;
224 }
225
226
227 for (i = nregs - 1; i >= 0; --i)
228 SET_HARD_REG_BIT (unavailable, treg+i);
229 do_replace (this, treg);
230
231 if (rtl_dump_file)
232 fprintf (rtl_dump_file, ", renamed as %s\n", reg_names[treg]);
233 }
234
235 obstack_free (&rename_obstack, first_obj);
236 }
237
238 obstack_free (&rename_obstack, NULL);
239
240 if (rtl_dump_file)
241 fputc ('\n', rtl_dump_file);
242
243 count_or_remove_death_notes (NULL, 1);
244 update_life_info (NULL, UPDATE_LIFE_LOCAL,
245 PROP_REG_INFO | PROP_DEATH_NOTES);
246 }
247
248 static void
249 do_replace (chain, reg)
250 struct du_chain *chain;
251 int reg;
252 {
253 while (chain)
254 {
255 *chain->loc = gen_rtx_REG (GET_MODE (*chain->loc), reg);
256 chain = chain->next_use;
257 }
258 }
259
260
261 static HARD_REG_SET *referenced_regs;
262 static struct du_chain *open_chains;
263 static struct du_chain *closed_chains;
264
265 static void
266 scan_rtx_reg (insn, loc, class, action, type)
267 rtx insn;
268 rtx *loc;
269 enum reg_class class;
270 enum scan_actions action;
271 enum op_type type;
272 {
273 struct du_chain **p;
274 rtx x = *loc;
275 enum machine_mode mode = GET_MODE (x);
276 int this_regno = REGNO (x);
277 int this_nregs = HARD_REGNO_NREGS (this_regno, mode);
278
279 if (action == note_reference)
280 {
281 while (this_nregs-- > 0)
282 SET_HARD_REG_BIT (*referenced_regs, this_regno + this_nregs);
283 return;
284 }
285
286 if (action == mark_write)
287 {
288 if (type == OP_OUT)
289 {
290 struct du_chain *this = (struct du_chain *)
291 obstack_alloc (&rename_obstack, sizeof (struct du_chain));
292 this->next_use = 0;
293 this->next_chain = open_chains;
294 this->loc = loc;
295 this->insn = insn;
296 this->class = class;
297 this->need_caller_save_reg = 0;
298 open_chains = this;
299 }
300 return;
301 }
302
303 if ((type == OP_OUT && action != terminate_write)
304 || (type != OP_OUT && action == terminate_write))
305 return;
306
307 for (p = &open_chains; *p;)
308 {
309 struct du_chain *this = *p;
310
311 /* Check if the chain has been terminated if it has then skip to
312 the next chain.
313
314 This can happen when we've already appended the location to
315 the chain in Step 3, but are trying to hide in-out operands
316 from terminate_write in Step 5. */
317
318 if (*this->loc == cc0_rtx)
319 p = &this->next_chain;
320 else
321 {
322 int regno = REGNO (*this->loc);
323 int nregs = HARD_REGNO_NREGS (regno, GET_MODE (*this->loc));
324 int exact_match = (regno == this_regno && nregs == this_nregs);
325
326 if (regno + nregs <= this_regno
327 || this_regno + this_nregs <= regno)
328 p = &this->next_chain;
329 else if (action == mark_read)
330 {
331 if (! exact_match)
332 abort ();
333 if (class == NO_REGS)
334 abort ();
335
336 this = (struct du_chain *)
337 obstack_alloc (&rename_obstack, sizeof (struct du_chain));
338 this->next_use = *p;
339 this->next_chain = (*p)->next_chain;
340 this->loc = loc;
341 this->insn = insn;
342 this->class = class;
343 this->need_caller_save_reg = 0;
344 *p = this;
345 return;
346 }
347 else if (action != terminate_overlapping_read || ! exact_match)
348 {
349 struct du_chain *next = this->next_chain;
350
351 /* Whether the terminated chain can be used for renaming
352 depends on the action and this being an exact match.
353 In either case, we remove this element from open_chains. */
354
355 if ((action == terminate_dead || action == terminate_write)
356 && exact_match)
357 {
358 this->next_chain = closed_chains;
359 closed_chains = this;
360 if (rtl_dump_file)
361 fprintf (rtl_dump_file,
362 "Closing chain %s at insn %d (%s)\n",
363 reg_names[REGNO (*this->loc)], INSN_UID (insn),
364 scan_actions_name[(int) action]);
365 }
366 else
367 {
368 if (rtl_dump_file)
369 fprintf (rtl_dump_file,
370 "Discarding chain %s at insn %d (%s)\n",
371 reg_names[REGNO (*this->loc)], INSN_UID (insn),
372 scan_actions_name[(int) action]);
373 }
374 *p = next;
375 }
376 else
377 p = &this->next_chain;
378 }
379 }
380 }
381
382 /* Adapted from find_reloads_address_1. CLASS is INDEX_REG_CLASS or
383 BASE_REG_CLASS depending on how the register is being considered. */
384
385 static void
386 scan_rtx_address (insn, loc, class, action, mode)
387 rtx insn;
388 rtx *loc;
389 enum reg_class class;
390 enum scan_actions action;
391 enum machine_mode mode;
392 {
393 rtx x = *loc;
394 RTX_CODE code = GET_CODE (x);
395 const char *fmt;
396 int i, j;
397
398 if (action == mark_write)
399 return;
400
401 switch (code)
402 {
403 case PLUS:
404 {
405 rtx orig_op0 = XEXP (x, 0);
406 rtx orig_op1 = XEXP (x, 1);
407 RTX_CODE code0 = GET_CODE (orig_op0);
408 RTX_CODE code1 = GET_CODE (orig_op1);
409 rtx op0 = orig_op0;
410 rtx op1 = orig_op1;
411 rtx *locI = NULL;
412 rtx *locB = NULL;
413
414 if (GET_CODE (op0) == SUBREG)
415 {
416 op0 = SUBREG_REG (op0);
417 code0 = GET_CODE (op0);
418 }
419
420 if (GET_CODE (op1) == SUBREG)
421 {
422 op1 = SUBREG_REG (op1);
423 code1 = GET_CODE (op1);
424 }
425
426 if (code0 == MULT || code0 == SIGN_EXTEND || code0 == TRUNCATE
427 || code0 == ZERO_EXTEND || code1 == MEM)
428 {
429 locI = &XEXP (x, 0);
430 locB = &XEXP (x, 1);
431 }
432 else if (code1 == MULT || code1 == SIGN_EXTEND || code1 == TRUNCATE
433 || code1 == ZERO_EXTEND || code0 == MEM)
434 {
435 locI = &XEXP (x, 1);
436 locB = &XEXP (x, 0);
437 }
438 else if (code0 == CONST_INT || code0 == CONST
439 || code0 == SYMBOL_REF || code0 == LABEL_REF)
440 locB = &XEXP (x, 1);
441 else if (code1 == CONST_INT || code1 == CONST
442 || code1 == SYMBOL_REF || code1 == LABEL_REF)
443 locB = &XEXP (x, 0);
444 else if (code0 == REG && code1 == REG)
445 {
446 int index_op;
447
448 if (REG_OK_FOR_INDEX_P (op0)
449 && REG_MODE_OK_FOR_BASE_P (op1, mode))
450 index_op = 0;
451 else if (REG_OK_FOR_INDEX_P (op1)
452 && REG_MODE_OK_FOR_BASE_P (op0, mode))
453 index_op = 1;
454 else if (REG_MODE_OK_FOR_BASE_P (op1, mode))
455 index_op = 0;
456 else if (REG_MODE_OK_FOR_BASE_P (op0, mode))
457 index_op = 1;
458 else if (REG_OK_FOR_INDEX_P (op1))
459 index_op = 1;
460 else
461 index_op = 0;
462
463 locI = &XEXP (x, index_op);
464 locB = &XEXP (x, !index_op);
465 }
466 else if (code0 == REG)
467 {
468 locI = &XEXP (x, 0);
469 locB = &XEXP (x, 1);
470 }
471 else if (code1 == REG)
472 {
473 locI = &XEXP (x, 1);
474 locB = &XEXP (x, 0);
475 }
476
477 if (locI)
478 scan_rtx_address (insn, locI, INDEX_REG_CLASS, action, mode);
479 if (locB)
480 scan_rtx_address (insn, locB, BASE_REG_CLASS, action, mode);
481 return;
482 }
483
484 case POST_INC:
485 case POST_DEC:
486 case POST_MODIFY:
487 case PRE_INC:
488 case PRE_DEC:
489 case PRE_MODIFY:
490 #ifndef AUTO_INC_DEC
491 /* If the target doesn't claim to handle autoinc, this must be
492 something special, like a stack push. Kill this chain. */
493 action = terminate_all_read;
494 #endif
495 break;
496
497 case MEM:
498 scan_rtx_address (insn, &XEXP (x, 0), BASE_REG_CLASS, action,
499 GET_MODE (x));
500 return;
501
502 case REG:
503 scan_rtx_reg (insn, loc, class, action, OP_IN);
504 return;
505
506 default:
507 break;
508 }
509
510 fmt = GET_RTX_FORMAT (code);
511 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
512 {
513 if (fmt[i] == 'e')
514 scan_rtx_address (insn, &XEXP (x, i), class, action, mode);
515 else if (fmt[i] == 'E')
516 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
517 scan_rtx_address (insn, &XVECEXP (x, i, j), class, action, mode);
518 }
519 }
520
521 static void
522 scan_rtx (insn, loc, class, action, type)
523 rtx insn;
524 rtx *loc;
525 enum reg_class class;
526 enum scan_actions action;
527 enum op_type type;
528 {
529 const char *fmt;
530 rtx x = *loc;
531 enum rtx_code code = GET_CODE (x);
532 int i, j;
533
534 code = GET_CODE (x);
535 switch (code)
536 {
537 case CONST:
538 case CONST_INT:
539 case CONST_DOUBLE:
540 case SYMBOL_REF:
541 case LABEL_REF:
542 case CC0:
543 case PC:
544 return;
545
546 case REG:
547 scan_rtx_reg (insn, loc, class, action, type);
548 return;
549
550 case MEM:
551 scan_rtx_address (insn, &XEXP (x, 0), BASE_REG_CLASS, action,
552 GET_MODE (x));
553 return;
554
555 case SET:
556 scan_rtx (insn, &SET_SRC (x), class, action, OP_IN);
557 scan_rtx (insn, &SET_DEST (x), class, action, OP_OUT);
558 return;
559
560 case STRICT_LOW_PART:
561 scan_rtx (insn, &XEXP (x, 0), class, action, OP_INOUT);
562 return;
563
564 case ZERO_EXTRACT:
565 case SIGN_EXTRACT:
566 scan_rtx (insn, &XEXP (x, 0), class, action,
567 type == OP_IN ? OP_IN : OP_INOUT);
568 scan_rtx (insn, &XEXP (x, 1), class, action, OP_IN);
569 scan_rtx (insn, &XEXP (x, 2), class, action, OP_IN);
570 return;
571
572 case POST_INC:
573 case PRE_INC:
574 case POST_DEC:
575 case PRE_DEC:
576 case POST_MODIFY:
577 case PRE_MODIFY:
578 /* Should only happen inside MEM. */
579 abort ();
580
581 case CLOBBER:
582 scan_rtx (insn, &SET_DEST (x), class, action, OP_OUT);
583 return;
584
585 case EXPR_LIST:
586 scan_rtx (insn, &XEXP (x, 0), class, action, type);
587 if (XEXP (x, 1))
588 scan_rtx (insn, &XEXP (x, 1), class, action, type);
589 return;
590
591 default:
592 break;
593 }
594
595 fmt = GET_RTX_FORMAT (code);
596 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
597 {
598 if (fmt[i] == 'e')
599 scan_rtx (insn, &XEXP (x, i), class, action, type);
600 else if (fmt[i] == 'E')
601 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
602 scan_rtx (insn, &XVECEXP (x, i, j), class, action, type);
603 }
604 }
605
606 /* Build def/use chain */
607
608 static struct du_chain *
609 build_def_use (bb, regs_used)
610 basic_block bb;
611 HARD_REG_SET *regs_used;
612 {
613 rtx insn;
614
615 open_chains = closed_chains = NULL;
616 referenced_regs = regs_used;
617
618 for (insn = bb->head; ; insn = NEXT_INSN (insn))
619 {
620 if (INSN_P (insn))
621 {
622 int n_ops;
623 rtx note;
624 rtx old_operands[MAX_RECOG_OPERANDS];
625 rtx old_dups[MAX_DUP_OPERANDS];
626 int i;
627 int alt;
628 int predicated;
629
630 /* Record all mentioned registers in regs_used. */
631 scan_rtx (insn, &PATTERN (insn), NO_REGS, note_reference, OP_IN);
632
633 /* Process the insn, determining its effect on the def-use
634 chains. We perform the following steps with the register
635 references in the insn:
636 (1) Any read that overlaps an open chain, but doesn't exactly
637 match, causes that chain to be closed. We can't deal
638 with overlaps yet.
639 (2) Any read outside an operand causes any chain it overlaps
640 with to be closed, since we can't replace it.
641 (3) Any read inside an operand is added if there's already
642 an open chain for it.
643 (4) For any REG_DEAD note we find, close open chains that
644 overlap it.
645 (5) For any write we find, close open chains that overlap it.
646 (6) For any write we find in an operand, make a new chain.
647 (7) For any REG_UNUSED, close any chains we just opened. */
648
649 extract_insn (insn);
650 constrain_operands (1);
651 preprocess_constraints ();
652 alt = which_alternative;
653 n_ops = recog_data.n_operands;
654
655 /* Simplify the code below by rewriting things to reflect
656 matching constraints. Also promote OP_OUT to OP_INOUT
657 in predicated instructions. */
658
659 predicated = GET_CODE (PATTERN (insn)) == COND_EXEC;
660 for (i = 0; i < n_ops; ++i)
661 {
662 int matches = recog_op_alt[i][alt].matches;
663 if (matches >= 0)
664 recog_op_alt[i][alt].class = recog_op_alt[matches][alt].class;
665 if (matches >= 0 || recog_op_alt[i][alt].matched >= 0
666 || (predicated && recog_data.operand_type[i] == OP_OUT))
667 recog_data.operand_type[i] = OP_INOUT;
668 }
669
670 /* Step 1: Close chains for which we have overlapping reads. */
671 for (i = 0; i < n_ops; i++)
672 scan_rtx (insn, recog_data.operand_loc[i],
673 NO_REGS, terminate_overlapping_read,
674 recog_data.operand_type[i]);
675
676 /* Step 2: Close chains for which we have reads outside operands.
677 We do this by munging all operands into CC0, and closing
678 everything remaining. */
679
680 for (i = 0; i < n_ops; i++)
681 {
682 old_operands[i] = recog_data.operand[i];
683 /* Don't squash match_operator or match_parallel here, since
684 we don't know that all of the contained registers are
685 reachable by proper operands. */
686 if (recog_data.constraints[i][0] == '\0')
687 continue;
688 *recog_data.operand_loc[i] = cc0_rtx;
689 }
690 for (i = 0; i < recog_data.n_dups; i++)
691 {
692 old_dups[i] = *recog_data.dup_loc[i];
693 *recog_data.dup_loc[i] = cc0_rtx;
694 }
695
696 scan_rtx (insn, &PATTERN (insn), NO_REGS, terminate_all_read, OP_IN);
697
698 for (i = 0; i < recog_data.n_dups; i++)
699 *recog_data.dup_loc[i] = old_dups[i];
700 for (i = 0; i < n_ops; i++)
701 *recog_data.operand_loc[i] = old_operands[i];
702
703 /* Step 2B: Can't rename function call argument registers. */
704 if (GET_CODE (insn) == CALL_INSN && CALL_INSN_FUNCTION_USAGE (insn))
705 scan_rtx (insn, &CALL_INSN_FUNCTION_USAGE (insn),
706 NO_REGS, terminate_all_read, OP_IN);
707
708 /* Step 3: Append to chains for reads inside operands. */
709 for (i = 0; i < n_ops + recog_data.n_dups; i++)
710 {
711 int opn = i < n_ops ? i : recog_data.dup_num[i - n_ops];
712 rtx *loc = (i < n_ops
713 ? recog_data.operand_loc[opn]
714 : recog_data.dup_loc[i - n_ops]);
715 enum reg_class class = recog_op_alt[opn][alt].class;
716 enum op_type type = recog_data.operand_type[opn];
717
718 /* Don't scan match_operand here, since we've no reg class
719 information to pass down. Any operands that we could
720 substitute in will be represented elsewhere. */
721 if (recog_data.constraints[opn][0] == '\0')
722 continue;
723
724 if (recog_op_alt[opn][alt].is_address)
725 scan_rtx_address (insn, loc, class, mark_read, VOIDmode);
726 else
727 scan_rtx (insn, loc, class, mark_read, type);
728 }
729
730 /* Step 4: Close chains for registers that die here.
731 Also record updates for REG_INC notes. */
732 for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
733 {
734 if (REG_NOTE_KIND (note) == REG_DEAD)
735 scan_rtx (insn, &XEXP (note, 0), NO_REGS, terminate_dead, OP_IN);
736 else if (REG_NOTE_KIND (note) == REG_INC)
737 scan_rtx (insn, &XEXP (note, 0), ALL_REGS, mark_read, OP_INOUT);
738 }
739
740 /* Step 4B: If this is a call, any chain live at this point
741 requires a caller-saved reg. */
742 if (GET_CODE (insn) == CALL_INSN)
743 {
744 struct du_chain *p;
745 for (p = open_chains; p; p = p->next_chain)
746 {
747 struct du_chain *p2;
748 for (p2 = p; p2->next_use; p2 = p2->next_use)
749 /* nothing */;
750 p2->need_caller_save_reg = 1;
751 }
752 }
753
754 /* Step 5: Close open chains that overlap writes. Similar to
755 step 2, we hide in-out operands, since we do not want to
756 close these chains. */
757
758 for (i = 0; i < n_ops; i++)
759 {
760 old_operands[i] = recog_data.operand[i];
761 if (recog_data.operand_type[i] == OP_INOUT)
762 *recog_data.operand_loc[i] = cc0_rtx;
763 }
764 for (i = 0; i < recog_data.n_dups; i++)
765 {
766 int opn = recog_data.dup_num[i];
767 old_dups[i] = *recog_data.dup_loc[i];
768 if (recog_data.operand_type[opn] == OP_INOUT)
769 *recog_data.dup_loc[i] = cc0_rtx;
770 }
771
772 scan_rtx (insn, &PATTERN (insn), NO_REGS, terminate_write, OP_IN);
773
774 for (i = 0; i < recog_data.n_dups; i++)
775 *recog_data.dup_loc[i] = old_dups[i];
776 for (i = 0; i < n_ops; i++)
777 *recog_data.operand_loc[i] = old_operands[i];
778
779 /* Step 6: Begin new chains for writes inside operands. */
780 /* ??? Many targets have output constraints on the SET_DEST
781 of a call insn, which is stupid, since these are certainly
782 ABI defined hard registers. Don't change calls at all. */
783 if (GET_CODE (insn) != CALL_INSN)
784 for (i = 0; i < n_ops + recog_data.n_dups; i++)
785 {
786 int opn = i < n_ops ? i : recog_data.dup_num[i - n_ops];
787 rtx *loc = (i < n_ops
788 ? recog_data.operand_loc[opn]
789 : recog_data.dup_loc[i - n_ops]);
790 enum reg_class class = recog_op_alt[opn][alt].class;
791
792 if (recog_data.operand_type[opn] == OP_OUT)
793 scan_rtx (insn, loc, class, mark_write, OP_OUT);
794 }
795
796 /* Step 7: Close chains for registers that were never
797 really used here. */
798 for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
799 if (REG_NOTE_KIND (note) == REG_UNUSED)
800 scan_rtx (insn, &XEXP (note, 0), NO_REGS, terminate_dead, OP_IN);
801 }
802 if (insn == bb->end)
803 break;
804 }
805
806 /* Since we close every chain when we find a REG_DEAD note, anything that
807 is still open lives past the basic block, so it can't be renamed. */
808 return closed_chains;
809 }
810
811 /* Dump all def/use chains in CHAINS to RTL_DUMP_FILE. They are
812 printed in reverse order as that's how we build them. */
813
814 static void
815 dump_def_use_chain (chains)
816 struct du_chain *chains;
817 {
818 while (chains)
819 {
820 struct du_chain *this = chains;
821 int r = REGNO (*this->loc);
822 int nregs = HARD_REGNO_NREGS (r, GET_MODE (*this->loc));
823 fprintf (rtl_dump_file, "Register %s (%d):", reg_names[r], nregs);
824 while (this)
825 {
826 fprintf (rtl_dump_file, " %d [%s]", INSN_UID (this->insn),
827 reg_class_names[this->class]);
828 this = this->next_use;
829 }
830 fprintf (rtl_dump_file, "\n");
831 chains = chains->next_chain;
832 }
833 }